UI: ProgramsWindow: Add/edit end time of apps.

This commit is contained in:
Nodir Temirkhodjaev 2020-01-05 19:01:18 +05:00
parent af8d9fbc87
commit 4e4ca1a6d5
8 changed files with 106 additions and 45 deletions

View File

@ -164,7 +164,7 @@ const char * const sqlDeleteAppAlert =
const char * const sqlUpdateApp = const char * const sqlUpdateApp =
"UPDATE app" "UPDATE app"
" SET app_group_id = ?2, blocked = ?3" " SET app_group_id = ?2, blocked = ?3, end_time = ?4"
" WHERE app_id = ?1;" " WHERE app_id = ?1;"
; ;
@ -420,7 +420,8 @@ end:
return ok; return ok;
} }
bool ConfManager::updateApp(qint64 appId, int groupIndex, bool blocked) bool ConfManager::updateApp(qint64 appId, const QDateTime &endTime,
int groupIndex, bool blocked)
{ {
bool ok = false; bool ok = false;
@ -429,7 +430,9 @@ bool ConfManager::updateApp(qint64 appId, int groupIndex, bool blocked)
const QVariantList vars = QVariantList() const QVariantList vars = QVariantList()
<< appId << appId
<< appGroupIdByIndex(groupIndex) << appGroupIdByIndex(groupIndex)
<< blocked; << blocked
<< endTime
;
m_sqliteDb->executeEx(sqlUpdateApp, vars, 0, &ok); m_sqliteDb->executeEx(sqlUpdateApp, vars, 0, &ok);
if (!ok) goto end; if (!ok) goto end;

View File

@ -52,7 +52,8 @@ public:
bool addApp(const QString &appPath, const QDateTime &endTime, bool addApp(const QString &appPath, const QDateTime &endTime,
int groupIndex, bool blocked, bool alerted); int groupIndex, bool blocked, bool alerted);
bool deleteApp(qint64 appId); bool deleteApp(qint64 appId);
bool updateApp(qint64 appId, int groupIndex, bool blocked); bool updateApp(qint64 appId, const QDateTime &endTime,
int groupIndex, bool blocked);
bool walkApps(std::function<walkAppsCallback> func); bool walkApps(std::function<walkAppsCallback> func);
bool updateDriverConf(const FirewallConf &conf, bool onlyFlags = false); bool updateDriverConf(const FirewallConf &conf, bool onlyFlags = false);

View File

@ -77,8 +77,8 @@ void SchedulePage::retranslateTaskDetails()
tr("Each 12 hours"), tr("Daily"), tr("Weekly"), tr("Monthly") tr("Each 12 hours"), tr("Daily"), tr("Weekly"), tr("Monthly")
}; };
m_lscTaskInterval->setNames(list); m_cscTaskInterval->setNames(list);
m_lscTaskInterval->spinBox()->setSuffix(tr(" hours")); m_cscTaskInterval->spinBox()->setSuffix(tr(" hours"));
} }
void SchedulePage::setupTaskListModel() void SchedulePage::setupTaskListModel()
@ -152,25 +152,25 @@ void SchedulePage::setupTaskDetails()
currentTaskInfo()->abort(); currentTaskInfo()->abort();
}); });
layout->addWidget(m_lscTaskInterval, 1); layout->addWidget(m_cscTaskInterval, 1);
layout->addWidget(m_btTaskRun); layout->addWidget(m_btTaskRun);
layout->addWidget(m_btTaskAbort); layout->addWidget(m_btTaskAbort);
} }
void SchedulePage::setupTaskInterval() void SchedulePage::setupTaskInterval()
{ {
m_lscTaskInterval = new CheckSpinCombo(); m_cscTaskInterval = new CheckSpinCombo();
m_lscTaskInterval->checkBox()->setFont(ControlUtil::fontDemiBold()); m_cscTaskInterval->checkBox()->setFont(ControlUtil::fontDemiBold());
m_lscTaskInterval->spinBox()->setRange(1, 24 * 30 * 12); // ~Year m_cscTaskInterval->spinBox()->setRange(1, 24 * 30 * 12); // ~Year
m_lscTaskInterval->setValues(taskIntervalHourValues); m_cscTaskInterval->setValues(taskIntervalHourValues);
connect(m_lscTaskInterval->checkBox(), &QCheckBox::toggled, [&](bool checked) { connect(m_cscTaskInterval->checkBox(), &QCheckBox::toggled, [&](bool checked) {
const int taskIndex = currentTaskIndex(); const int taskIndex = currentTaskIndex();
const auto index = taskListModel()->index(taskIndex, 0); const auto index = taskListModel()->index(taskIndex, 0);
taskListModel()->setData(index, checked, TaskListModel::RoleEnabled); taskListModel()->setData(index, checked, TaskListModel::RoleEnabled);
}); });
connect(m_lscTaskInterval->spinBox(), QOverload<int>::of(&QSpinBox::valueChanged), [&](int value) { connect(m_cscTaskInterval->spinBox(), QOverload<int>::of(&QSpinBox::valueChanged), [&](int value) {
const int taskIndex = currentTaskIndex(); const int taskIndex = currentTaskIndex();
const auto index = taskListModel()->index(taskIndex, 1); const auto index = taskListModel()->index(taskIndex, 1);
@ -192,11 +192,11 @@ void SchedulePage::setupTableTasksChanged()
if (taskSelected) { if (taskSelected) {
const auto index = taskListModel()->index(taskIndex, 0); const auto index = taskListModel()->index(taskIndex, 0);
m_lscTaskInterval->checkBox()->setChecked( m_cscTaskInterval->checkBox()->setChecked(
taskListModel()->data(index, TaskListModel::RoleEnabled).toBool()); taskListModel()->data(index, TaskListModel::RoleEnabled).toBool());
m_lscTaskInterval->checkBox()->setText( m_cscTaskInterval->checkBox()->setText(
taskListModel()->data(index).toString()); taskListModel()->data(index).toString());
m_lscTaskInterval->spinBox()->setValue( m_cscTaskInterval->spinBox()->setValue(
taskListModel()->data(index, TaskListModel::RoleIntervalHours).toInt()); taskListModel()->data(index, TaskListModel::RoleIntervalHours).toInt());
const bool running = currentTaskInfo()->running(); const bool running = currentTaskInfo()->running();

View File

@ -54,7 +54,7 @@ private:
TableView *m_tableTasks = nullptr; TableView *m_tableTasks = nullptr;
QWidget *m_taskDetailsRow = nullptr; QWidget *m_taskDetailsRow = nullptr;
CheckSpinCombo *m_lscTaskInterval = nullptr; CheckSpinCombo *m_cscTaskInterval = nullptr;
QPushButton *m_btTaskRun = nullptr; QPushButton *m_btTaskRun = nullptr;
QPushButton *m_btTaskAbort = nullptr; QPushButton *m_btTaskAbort = nullptr;
}; };

View File

@ -11,6 +11,7 @@
#include <QLineEdit> #include <QLineEdit>
#include <QPushButton> #include <QPushButton>
#include <QRadioButton> #include <QRadioButton>
#include <QSpinBox>
#include <QVBoxLayout> #include <QVBoxLayout>
#include "../../conf/appgroup.h" #include "../../conf/appgroup.h"
@ -22,10 +23,19 @@
#include "../../util/app/appinfocache.h" #include "../../util/app/appinfocache.h"
#include "../../util/guiutil.h" #include "../../util/guiutil.h"
#include "../../util/osutil.h" #include "../../util/osutil.h"
#include "../controls/checkspincombo.h"
#include "../controls/controlutil.h" #include "../controls/controlutil.h"
#include "../controls/tableview.h" #include "../controls/tableview.h"
#include "programscontroller.h" #include "programscontroller.h"
namespace {
const ValuesList appBlockInHourValues = {
3, 1, 6, 12, 24, 24 * 7, 24 * 30
};
}
ProgramsWindow::ProgramsWindow(FortManager *fortManager, ProgramsWindow::ProgramsWindow(FortManager *fortManager,
QWidget *parent) : QWidget *parent) :
WidgetWindow(parent), WidgetWindow(parent),
@ -33,7 +43,6 @@ ProgramsWindow::ProgramsWindow(FortManager *fortManager,
m_appListModel(ctrl()->appListModel()) m_appListModel(ctrl()->appListModel())
{ {
setupController(); setupController();
setupAppListModel();
setupUi(); setupUi();
@ -50,10 +59,6 @@ void ProgramsWindow::setupController()
this, &ProgramsWindow::onRestoreWindowState); this, &ProgramsWindow::onRestoreWindowState);
} }
void ProgramsWindow::setupAppListModel()
{
}
void ProgramsWindow::closeEvent(QCloseEvent *event) void ProgramsWindow::closeEvent(QCloseEvent *event)
{ {
if (isVisible()) { if (isVisible()) {
@ -96,6 +101,8 @@ void ProgramsWindow::onRetranslateUi()
m_labelAppGroup->setText(tr("Application Group:")); m_labelAppGroup->setText(tr("Application Group:"));
m_rbAllowApp->setText(tr("Allow")); m_rbAllowApp->setText(tr("Allow"));
m_rbBlockApp->setText(tr("Block")); m_rbBlockApp->setText(tr("Block"));
m_cscBlockApp->checkBox()->setText(tr("Block In"));
retranslateAppBlockInHours();
m_btEditOk->setText(tr("OK")); m_btEditOk->setText(tr("OK"));
m_btEditCancel->setText(tr("Cancel")); m_btEditCancel->setText(tr("Cancel"));
@ -107,6 +114,17 @@ void ProgramsWindow::onRetranslateUi()
m_btAppOpenFolder->setToolTip(tr("Open Folder")); m_btAppOpenFolder->setToolTip(tr("Open Folder"));
} }
void ProgramsWindow::retranslateAppBlockInHours()
{
const QStringList list = {
tr("Custom"), tr("1 hour"), tr("6 hours"),
tr("12 hours"), tr("Day"), tr("Week"), tr("Month")
};
m_cscBlockApp->setNames(list);
m_cscBlockApp->spinBox()->setSuffix(tr(" hours"));
}
void ProgramsWindow::setupUi() void ProgramsWindow::setupUi()
{ {
auto layout = new QVBoxLayout(); auto layout = new QVBoxLayout();
@ -157,24 +175,15 @@ QLayout *ProgramsWindow::setupHeader()
m_btBlockApp = ControlUtil::createLinkButton(":/images/stop.png"); m_btBlockApp = ControlUtil::createLinkButton(":/images/stop.png");
connect(m_btAddApp, &QAbstractButton::clicked, [&] { connect(m_btAddApp, &QAbstractButton::clicked, [&] {
m_editPath->setText(QString()); const AppRow appRow;
m_editPath->setReadOnly(false); updateAppEditForm(appRow);
m_btSelectFile->setEnabled(true);
m_formAppEdit->show();
}); });
connect(m_btEditApp, &QAbstractButton::clicked, [&] { connect(m_btEditApp, &QAbstractButton::clicked, [&] {
const auto appIndex = appListCurrentIndex(); const auto appIndex = appListCurrentIndex();
if (appIndex < 0) if (appIndex >= 0) {
return;
const auto appRow = appListModel()->appRow(appIndex); const auto appRow = appListModel()->appRow(appIndex);
updateAppEditForm(appRow);
m_editPath->setText(appRow.appPath); }
m_editPath->setReadOnly(true);
m_btSelectFile->setEnabled(false);
m_comboAppGroup->setCurrentIndex(appRow.groupIndex);
m_rbBlockApp->setChecked(appRow.blocked());
m_formAppEdit->show();
}); });
connect(m_btDeleteApp, &QAbstractButton::clicked, [&] { connect(m_btDeleteApp, &QAbstractButton::clicked, [&] {
if (!fortManager()->showQuestionBox(tr("Are you sure to remove the selected program?"))) if (!fortManager()->showQuestionBox(tr("Are you sure to remove the selected program?")))
@ -244,6 +253,12 @@ void ProgramsWindow::setupAppEditForm()
allowLayout->addWidget(m_rbAllowApp, 1, Qt::AlignRight); allowLayout->addWidget(m_rbAllowApp, 1, Qt::AlignRight);
allowLayout->addWidget(m_rbBlockApp, 1, Qt::AlignLeft); allowLayout->addWidget(m_rbBlockApp, 1, Qt::AlignLeft);
// Block after N hours
m_cscBlockApp = new CheckSpinCombo();
m_cscBlockApp->spinBox()->setRange(1, 24 * 30 * 12); // ~Year
m_cscBlockApp->setValues(appBlockInHourValues);
m_cscBlockApp->setNamesByValues();
// OK/Cancel // OK/Cancel
auto buttonsLayout = new QHBoxLayout(); auto buttonsLayout = new QHBoxLayout();
@ -257,10 +272,12 @@ void ProgramsWindow::setupAppEditForm()
auto layout = new QVBoxLayout(); auto layout = new QVBoxLayout();
layout->addLayout(formLayout); layout->addLayout(formLayout);
layout->addLayout(allowLayout); layout->addLayout(allowLayout);
layout->addWidget(m_cscBlockApp);
layout->addWidget(ControlUtil::createSeparator()); layout->addWidget(ControlUtil::createSeparator());
layout->addLayout(buttonsLayout); layout->addLayout(buttonsLayout);
m_formAppEdit = new QDialog(this); m_formAppEdit = new QDialog(this);
m_formAppEdit->setWindowModality(Qt::WindowModal);
m_formAppEdit->setSizeGripEnabled(true); m_formAppEdit->setSizeGripEnabled(true);
m_formAppEdit->setLayout(layout); m_formAppEdit->setLayout(layout);
m_formAppEdit->setMinimumWidth(500); m_formAppEdit->setMinimumWidth(500);
@ -275,6 +292,8 @@ void ProgramsWindow::setupAppEditForm()
} }
}); });
connect(m_rbAllowApp, &QRadioButton::toggled, m_cscBlockApp, &CheckSpinCombo::setEnabled);
connect(m_btEditOk, &QAbstractButton::clicked, [&] { connect(m_btEditOk, &QAbstractButton::clicked, [&] {
const QString appPath = m_editPath->text(); const QString appPath = m_editPath->text();
if (appPath.isEmpty()) if (appPath.isEmpty())
@ -283,7 +302,18 @@ void ProgramsWindow::setupAppEditForm()
const int groupIndex = m_comboAppGroup->currentIndex(); const int groupIndex = m_comboAppGroup->currentIndex();
const bool blocked = m_rbBlockApp->isChecked(); const bool blocked = m_rbBlockApp->isChecked();
if (appListModel()->updateApp(appListCurrentIndex(), groupIndex, blocked)) { QDateTime endTime;
if (!blocked && m_cscBlockApp->checkBox()->isChecked()) {
const int hours = m_cscBlockApp->spinBox()->value();
endTime = QDateTime::currentDateTime()
.addSecs(hours * 60 * 60);
}
if (m_formAppIsEditing
? appListModel()->updateApp(appListCurrentIndex(),
groupIndex, blocked, endTime)
: appListModel()->addApp(appPath, groupIndex, blocked, endTime)) {
m_formAppEdit->close(); m_formAppEdit->close();
} }
}); });
@ -419,6 +449,21 @@ void ProgramsWindow::setupTableAppsChanged()
connect(m_appListView, &TableView::currentIndexChanged, this, refreshTableAppsChanged); connect(m_appListView, &TableView::currentIndexChanged, this, refreshTableAppsChanged);
} }
void ProgramsWindow::updateAppEditForm(const AppRow &appRow)
{
m_formAppIsEditing = !appRow.appPath.isEmpty();
m_editPath->setText(appRow.appPath);
m_editPath->setReadOnly(m_formAppIsEditing);
m_btSelectFile->setEnabled(!m_formAppIsEditing);
m_comboAppGroup->setCurrentIndex(appRow.groupIndex);
m_rbAllowApp->setChecked(!appRow.blocked());
m_rbBlockApp->setChecked(appRow.blocked());
m_cscBlockApp->setEnabled(!appRow.blocked());
m_cscBlockApp->checkBox()->setChecked(false);
m_formAppEdit->show();
}
int ProgramsWindow::appListCurrentIndex() const int ProgramsWindow::appListCurrentIndex() const
{ {
return m_appListView->currentIndex().row(); return m_appListView->currentIndex().row();

View File

@ -13,12 +13,15 @@ QT_FORWARD_DECLARE_CLASS(QRadioButton)
QT_FORWARD_DECLARE_CLASS(AppInfoCache) QT_FORWARD_DECLARE_CLASS(AppInfoCache)
QT_FORWARD_DECLARE_CLASS(AppListModel) QT_FORWARD_DECLARE_CLASS(AppListModel)
QT_FORWARD_DECLARE_CLASS(CheckSpinCombo)
QT_FORWARD_DECLARE_CLASS(FirewallConf) QT_FORWARD_DECLARE_CLASS(FirewallConf)
QT_FORWARD_DECLARE_CLASS(FortManager) QT_FORWARD_DECLARE_CLASS(FortManager)
QT_FORWARD_DECLARE_CLASS(FortSettings) QT_FORWARD_DECLARE_CLASS(FortSettings)
QT_FORWARD_DECLARE_CLASS(ProgramsController) QT_FORWARD_DECLARE_CLASS(ProgramsController)
QT_FORWARD_DECLARE_CLASS(TableView) QT_FORWARD_DECLARE_CLASS(TableView)
QT_FORWARD_DECLARE_STRUCT(AppRow)
class ProgramsWindow : public WidgetWindow class ProgramsWindow : public WidgetWindow
{ {
Q_OBJECT Q_OBJECT
@ -39,7 +42,8 @@ protected:
private: private:
void setupController(); void setupController();
void setupAppListModel();
void retranslateAppBlockInHours();
void setupUi(); void setupUi();
void setupAppEditForm(); void setupAppEditForm();
@ -51,6 +55,7 @@ private:
void setupAppInfoRow(); void setupAppInfoRow();
void setupAppInfoVersion(); void setupAppInfoVersion();
void setupTableAppsChanged(); void setupTableAppsChanged();
void updateAppEditForm(const AppRow &appRow);
int appListCurrentIndex() const; int appListCurrentIndex() const;
QString appListCurrentPath() const; QString appListCurrentPath() const;
@ -63,6 +68,8 @@ private:
AppInfoCache *appInfoCache() const; AppInfoCache *appInfoCache() const;
private: private:
bool m_formAppIsEditing = false;
ProgramsController *m_ctrl = nullptr; ProgramsController *m_ctrl = nullptr;
AppListModel *m_appListModel = nullptr; AppListModel *m_appListModel = nullptr;
@ -79,6 +86,7 @@ private:
QComboBox *m_comboAppGroup = nullptr; QComboBox *m_comboAppGroup = nullptr;
QRadioButton *m_rbAllowApp = nullptr; QRadioButton *m_rbAllowApp = nullptr;
QRadioButton *m_rbBlockApp = nullptr; QRadioButton *m_rbBlockApp = nullptr;
CheckSpinCombo *m_cscBlockApp = nullptr;
QPushButton *m_btEditOk = nullptr; QPushButton *m_btEditOk = nullptr;
QPushButton *m_btEditCancel = nullptr; QPushButton *m_btEditCancel = nullptr;
QDialog *m_formAppEdit = nullptr; QDialog *m_formAppEdit = nullptr;

View File

@ -159,17 +159,19 @@ AppRow AppListModel::appRow(int row) const
return m_rowCache; return m_rowCache;
} }
bool AppListModel::addApp(const QString &appPath, int groupIndex, bool blocked) bool AppListModel::addApp(const QString &appPath, int groupIndex, bool blocked,
const QDateTime &endTime)
{ {
if (confManager()->updateDriverUpdateApp(appPath, groupIndex, false, blocked, false) if (confManager()->updateDriverUpdateApp(appPath, groupIndex, false, blocked, false)
&& confManager()->addApp(appPath, QDateTime(), groupIndex, blocked, false)) { && confManager()->addApp(appPath, endTime, groupIndex, blocked, false)) {
reset(); reset();
return true; return true;
} }
return false; return false;
} }
bool AppListModel::updateApp(int row, int groupIndex, bool blocked) bool AppListModel::updateApp(int row, int groupIndex, bool blocked,
const QDateTime &endTime)
{ {
updateRowCache(row); updateRowCache(row);
@ -177,7 +179,7 @@ bool AppListModel::updateApp(int row, int groupIndex, bool blocked)
const QString appPath = m_rowCache.appPath; const QString appPath = m_rowCache.appPath;
if (confManager()->updateDriverUpdateApp(appPath, groupIndex, false, blocked, false) if (confManager()->updateDriverUpdateApp(appPath, groupIndex, false, blocked, false)
&& confManager()->updateApp(appId, groupIndex, blocked)) { && confManager()->updateApp(appId, endTime, groupIndex, blocked)) {
const auto itemIndex = index(row, 3); const auto itemIndex = index(row, 3);
invalidateRowCache(); invalidateRowCache();
emit dataChanged(itemIndex, itemIndex); emit dataChanged(itemIndex, itemIndex);

View File

@ -61,8 +61,10 @@ public:
QString appPathByRow(int row) const; QString appPathByRow(int row) const;
AppRow appRow(int row) const; AppRow appRow(int row) const;
bool addApp(const QString &appPath, int groupIndex, bool blocked); bool addApp(const QString &appPath, int groupIndex, bool blocked,
bool updateApp(int row, int groupIndex, bool blocked); const QDateTime &endTime = QDateTime());
bool updateApp(int row, int groupIndex, bool blocked,
const QDateTime &endTime = QDateTime());
void deleteApp(int row); void deleteApp(int row);
public slots: public slots: