diff --git a/desktop-widgets/CMakeLists.txt b/desktop-widgets/CMakeLists.txt
index a9a6a59a7..4a3259318 100644
--- a/desktop-widgets/CMakeLists.txt
+++ b/desktop-widgets/CMakeLists.txt
@@ -16,6 +16,7 @@ add_subdirectory(preferences)
set (SUBSURFACE_UI
about.ui
+ addfilterpreset.ui
btdeviceselectiondialog.ui
configuredivecomputerdialog.ui
divecomponentselection.ui
diff --git a/desktop-widgets/addfilterpreset.ui b/desktop-widgets/addfilterpreset.ui
new file mode 100644
index 000000000..120c5e547
--- /dev/null
+++ b/desktop-widgets/addfilterpreset.ui
@@ -0,0 +1,87 @@
+
+
+ AddFilterPresetDialog
+
+
+ Qt::WindowModal
+
+
+
+ 0
+ 0
+ 211
+ 127
+
+
+
+ Save filter set
+
+
+
+ :subsurface-icon
+
+
+
+
+ 1
+
+
+ 3
+
+
+ 3
+
+
+ 3
+
+
+ 3
+
+ -
+
+
+ Save filter set
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ -
+
+
+ Warning: this will overwrite an existing filter set.
+
+
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+ QDialogButtonBox::Cancel|QDialogButtonBox::Ok
+
+
+
+
+
+
+
+
+
+
diff --git a/desktop-widgets/filterwidget2.cpp b/desktop-widgets/filterwidget2.cpp
index f1cd3263d..490892cc1 100644
--- a/desktop-widgets/filterwidget2.cpp
+++ b/desktop-widgets/filterwidget2.cpp
@@ -2,9 +2,11 @@
#include "desktop-widgets/filterconstraintwidget.h"
#include "desktop-widgets/simplewidgets.h"
#include "desktop-widgets/mainwindow.h"
+#include "commands/command.h"
#include "core/qthelper.h"
#include "core/divelist.h"
#include "core/settings/qPrefUnit.h"
+#include "core/filterpreset.h"
#include
@@ -100,19 +102,38 @@ void FilterWidget2::closeFilter()
MainWindow::instance()->setApplicationState(ApplicationState::Default);
}
+FilterData FilterWidget2::createFilterData() const
+{
+ FilterData filterData;
+ filterData.fulltextStringMode = (StringFilterMode)ui.fulltextStringMode->currentIndex();
+ filterData.fullText = ui.fullText->text();
+ filterData.constraints = constraintModel.getConstraints();
+ return filterData;
+}
+
void FilterWidget2::updateFilter()
{
if (ignoreSignal)
return;
- FilterData filterData;
- filterData.fulltextStringMode = (StringFilterMode)ui.fulltextStringMode->currentIndex();
- filterData.fullText = ui.fullText->text();
- filterData.constraints = constraintModel.getConstraints();
+ FilterData filterData = createFilterData();
validFilter = filterData.validFilter();
DiveFilter::instance()->setFilter(filterData);
}
+void FilterWidget2::on_addSetButton_clicked()
+{
+ AddFilterPresetDialog dialog(this);
+ QString name = dialog.doit();
+ if (name.isEmpty())
+ return;
+ int idx = filter_preset_id(name);
+ if (idx >= 0)
+ Command::editFilterPreset(idx, createFilterData());
+ else
+ Command::createFilterPreset(name, createFilterData());
+}
+
void FilterWidget2::showEvent(QShowEvent *event)
{
QWidget::showEvent(event);
diff --git a/desktop-widgets/filterwidget2.h b/desktop-widgets/filterwidget2.h
index 462200bf8..334b9737c 100644
--- a/desktop-widgets/filterwidget2.h
+++ b/desktop-widgets/filterwidget2.h
@@ -33,6 +33,7 @@ private slots:
void constraintRemoved(const QModelIndex &parent, int first, int last);
void constraintChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles);
void constraintsReset();
+ void on_addSetButton_clicked();
private:
bool ignoreSignal;
@@ -41,6 +42,7 @@ private:
bool validFilter;
void addConstraint(filter_constraint_type type);
std::vector> constraintWidgets;
+ FilterData createFilterData() const;
};
#endif
diff --git a/desktop-widgets/filterwidget2.ui b/desktop-widgets/filterwidget2.ui
index f6b3d65f6..ca5d7693a 100644
--- a/desktop-widgets/filterwidget2.ui
+++ b/desktop-widgets/filterwidget2.ui
@@ -57,6 +57,46 @@
-
+
-
+
+
+
+ 0
+ 0
+
+
+
+ Add constraint
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Save set
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
-
@@ -97,26 +137,6 @@
- -
-
-
-
- 0
- 0
-
-
-
- Add constraint
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
-
diff --git a/desktop-widgets/simplewidgets.cpp b/desktop-widgets/simplewidgets.cpp
index b18c43bf5..153d3239e 100644
--- a/desktop-widgets/simplewidgets.cpp
+++ b/desktop-widgets/simplewidgets.cpp
@@ -12,6 +12,7 @@
#include
#include "core/file.h"
+#include "core/filterpreset.h"
#include "core/divesite.h"
#include "desktop-widgets/mainwindow.h"
#include "core/qthelper.h"
@@ -478,6 +479,31 @@ void DiveComponentSelection::buttonClicked(QAbstractButton *button)
}
}
+AddFilterPresetDialog::AddFilterPresetDialog(QWidget *parent)
+{
+ ui.setupUi(this);
+ connect(ui.name, &QLineEdit::textChanged, this, &AddFilterPresetDialog::nameChanged);
+ connect(ui.buttonBox, &QDialogButtonBox::accepted, this, &AddFilterPresetDialog::accept);
+ connect(ui.buttonBox, &QDialogButtonBox::rejected, this, &AddFilterPresetDialog::reject);
+ nameChanged(ui.name->text());
+}
+
+void AddFilterPresetDialog::nameChanged(const QString &text)
+{
+ QString trimmed = text.trimmed();
+ bool isEmpty = trimmed.isEmpty();
+ bool exists = !isEmpty && filter_preset_id(trimmed) >= 0;
+ ui.duplicateWarning->setVisible(exists);
+ ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!isEmpty);
+}
+
+QString AddFilterPresetDialog::doit()
+{
+ if (exec() == QDialog::Accepted)
+ return ui.name->text().trimmed();
+ return QString();
+}
+
TextHyperlinkEventFilter::TextHyperlinkEventFilter(QTextEdit *txtEdit) : QObject(txtEdit),
textEdit(txtEdit),
scrollView(textEdit->viewport())
diff --git a/desktop-widgets/simplewidgets.h b/desktop-widgets/simplewidgets.h
index 6075aa660..d68c14bd4 100644
--- a/desktop-widgets/simplewidgets.h
+++ b/desktop-widgets/simplewidgets.h
@@ -20,6 +20,7 @@ class FilterModelBase;
#include "ui_urldialog.h"
#include "ui_divecomponentselection.h"
#include "ui_listfilter.h"
+#include "ui_addfilterpreset.h"
#include "core/exif.h"
#include "core/dive.h"
@@ -138,6 +139,18 @@ private:
struct dive_components *what;
};
+class AddFilterPresetDialog : public QDialog {
+ Q_OBJECT
+public:
+ explicit AddFilterPresetDialog(QWidget *parent);
+ QString doit(); // returns name of filter preset or empty string if user cancelled the dialog
+private
+slots:
+ void nameChanged(const QString &text);
+private:
+ Ui::AddFilterPresetDialog ui;
+};
+
class TextHyperlinkEventFilter : public QObject {
Q_OBJECT
public: