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: