From a44fc737abea3affba45f4e7232b4143e396b2d0 Mon Sep 17 00:00:00 2001 From: Matthias Kuehlewein Date: Tue, 8 Apr 2025 18:02:45 +0200 Subject: [PATCH 1/2] SymbolReplacementDialog: Show active symbol replacement criteria Add checkmark to show the active symbol replacement criteria (either name or number) in the 'Symbol mapping' drop-down menu. --- src/gui/symbols/symbol_replacement_dialog.cpp | 36 ++++++++++++------- src/gui/symbols/symbol_replacement_dialog.h | 18 ++++++---- 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/gui/symbols/symbol_replacement_dialog.cpp b/src/gui/symbols/symbol_replacement_dialog.cpp index 9b1a7b5bd..d1aa784d8 100644 --- a/src/gui/symbols/symbol_replacement_dialog.cpp +++ b/src/gui/symbols/symbol_replacement_dialog.cpp @@ -1,6 +1,6 @@ /* * Copyright 2012, 2013 Thomas Schöps - * Copyright 2017-2020, 2024 Kai Pastor + * Copyright 2017-2020, 2024, 2025 Kai Pastor * * This file is part of OpenOrienteering. * @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -51,7 +52,6 @@ #include #include #include -#include #include #include #include @@ -103,7 +103,7 @@ SymbolReplacementDialog::SymbolReplacementDialog(QWidget* parent, Map& object_ma { setWindowTitle(tr("Replace symbol set")); form_layout = new QFormLayout(); - QLabel* desc_label = new QLabel(tr("Configure how the symbols should be replaced, and which.")); + auto* desc_label = new QLabel(tr("Configure how the symbols should be replaced, and which.")); form_layout->addRow(desc_label); form_layout->addItem(Util::SpacerItem::create(this)); import_all_check = new QCheckBox(tr("Import all new symbols, even if not used as replacement")); @@ -132,10 +132,16 @@ SymbolReplacementDialog::SymbolReplacementDialog(QWidget* parent, Map& object_ma horizontal_headers << tr("Original") << tr("Replacement"); - auto action = mapping_menu->addAction(tr("Match replacement symbols by symbol number")); - connect(action, &QAction::triggered, this, &SymbolReplacementDialog::matchByNumber); - action = mapping_menu->addAction(tr("Match by symbol name")); - connect(action, &QAction::triggered, this, &SymbolReplacementDialog::matchByName); + match_by_number_action = mapping_menu->addAction(tr("Match replacement symbols by symbol number")); + match_by_number_action->setCheckable(true); + connect(match_by_number_action, &QAction::triggered, this, &SymbolReplacementDialog::matchByNumber); + match_by_name_action = mapping_menu->addAction(tr("Match by symbol name")); + match_by_name_action->setCheckable(true); + match_by_name_action->setChecked(true); + connect(match_by_name_action, &QAction::triggered, this, &SymbolReplacementDialog::matchByName); + auto* match_by_group = new QActionGroup(this); + match_by_group->addAction(match_by_number_action); + match_by_group->addAction(match_by_name_action); } else { @@ -184,28 +190,28 @@ SymbolReplacementDialog::SymbolReplacementDialog(QWidget* parent, Map& object_ma SymbolReplacementDialog::~SymbolReplacementDialog() = default; - +// slot void SymbolReplacementDialog::showHelp() { Util::showHelp(this, "symbol_replace_dialog.html"); } - +// slot void SymbolReplacementDialog::matchByName() { symbol_rules.matchQuerySymbolName(symbol_set); updateMappingTable(); } - +// slot void SymbolReplacementDialog::matchByNumber() { symbol_rules.matchQuerySymbolNumber(symbol_set); updateMappingTable(); } - +// slot void SymbolReplacementDialog::resetReplacements() { for (auto& item : symbol_rules) @@ -213,11 +219,15 @@ void SymbolReplacementDialog::resetReplacements() item.symbol = nullptr; item.type = SymbolRule::NoAssignment; } + if (match_by_number_action) + match_by_number_action->setChecked(false); + if (match_by_name_action) + match_by_name_action->setChecked(false); updateMappingTable(); } - +// slot void SymbolReplacementDialog::openCrtFile() { auto const dir = QLatin1String{"data:/symbol sets"}; @@ -231,7 +241,7 @@ void SymbolReplacementDialog::openCrtFile() } } - +// slot bool SymbolReplacementDialog::saveCrtFile() { /// \todo Choose user-writable directory. diff --git a/src/gui/symbols/symbol_replacement_dialog.h b/src/gui/symbols/symbol_replacement_dialog.h index 48010e8a0..cda51232a 100644 --- a/src/gui/symbols/symbol_replacement_dialog.h +++ b/src/gui/symbols/symbol_replacement_dialog.h @@ -1,6 +1,6 @@ /* * Copyright 2012, 2013 Thomas Schöps - * Copyright 2017-2019 Kai Pastor + * Copyright 2017-2019, 2025 Kai Pastor * * This file is part of OpenOrienteering. * @@ -31,6 +31,7 @@ #include "core/objects/symbol_rule_set.h" +class QAction; class QCheckBox; class QComboBox; class QTableWidget; @@ -69,6 +70,12 @@ class SymbolReplacementDialog : public QDialog QString replacementId() const; protected: + void done(int r) override; + + void updateMappingTable(); + void updateMappingFromTable(); + +private slots: void showHelp(); void matchByName(); @@ -78,16 +85,13 @@ class SymbolReplacementDialog : public QDialog void openCrtFile(); bool saveCrtFile(); - void done(int r) override; - - void updateMappingTable(); - void updateMappingFromTable(); - private: Map& object_map; const Map& symbol_set; SymbolRuleSet& symbol_rules; + QAction* match_by_name_action = nullptr; + QAction* match_by_number_action = nullptr; QCheckBox* import_all_check = nullptr; QCheckBox* delete_unused_symbols_check = nullptr; QCheckBox* delete_unused_colors_check = nullptr; @@ -102,4 +106,4 @@ class SymbolReplacementDialog : public QDialog } // namespace OpenOrienteering -#endif +#endif // OPENORIENTEERING_SYMBOL_REPLACEMENT_DIALOG_H From 498089bd6d361d2094ffc4075a88c8ce18f61f53 Mon Sep 17 00:00:00 2001 From: Matthias Kuehlewein Date: Tue, 8 Apr 2025 20:23:52 +0200 Subject: [PATCH 2/2] SymbolReplacementDialog: Clear checkmarks after user editing --- src/gui/symbols/symbol_replacement_dialog.cpp | 20 +++++++++++++++---- src/gui/symbols/symbol_replacement_dialog.h | 2 ++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/gui/symbols/symbol_replacement_dialog.cpp b/src/gui/symbols/symbol_replacement_dialog.cpp index d1aa784d8..bc7d16f10 100644 --- a/src/gui/symbols/symbol_replacement_dialog.cpp +++ b/src/gui/symbols/symbol_replacement_dialog.cpp @@ -157,6 +157,7 @@ SymbolReplacementDialog::SymbolReplacementDialog(QWidget* parent, Map& object_ma mapping_table->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); mapping_table->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch); mapping_table->setEditTriggers(QAbstractItemView::AllEditTriggers); + connect(mapping_table, &QTableWidget::cellChanged, this, &SymbolReplacementDialog::clearMatchCheckmarks); auto action = mapping_menu->addAction(tr("Clear replacements")); connect(action, &QAction::triggered, this, &SymbolReplacementDialog::resetReplacements); @@ -219,13 +220,22 @@ void SymbolReplacementDialog::resetReplacements() item.symbol = nullptr; item.type = SymbolRule::NoAssignment; } - if (match_by_number_action) - match_by_number_action->setChecked(false); - if (match_by_name_action) - match_by_name_action->setChecked(false); + clearMatchCheckmarks(); updateMappingTable(); } +// slot +void SymbolReplacementDialog::clearMatchCheckmarks() +{ + if (react_to_changes) + { + if (match_by_number_action) + match_by_number_action->setChecked(false); + if (match_by_name_action) + match_by_name_action->setChecked(false); + } +} + // slot void SymbolReplacementDialog::openCrtFile() @@ -308,6 +318,7 @@ void SymbolReplacementDialog::updateMappingTable() if (!mapping_table) return; + react_to_changes = false; mapping_table->setUpdatesEnabled(false); mapping_table->clearContents(); @@ -454,6 +465,7 @@ void SymbolReplacementDialog::updateMappingTable() } mapping_table->setUpdatesEnabled(true); + react_to_changes = true; } diff --git a/src/gui/symbols/symbol_replacement_dialog.h b/src/gui/symbols/symbol_replacement_dialog.h index cda51232a..0ea94835c 100644 --- a/src/gui/symbols/symbol_replacement_dialog.h +++ b/src/gui/symbols/symbol_replacement_dialog.h @@ -81,6 +81,7 @@ private slots: void matchByName(); void matchByNumber(); void resetReplacements(); + void clearMatchCheckmarks(); void openCrtFile(); bool saveCrtFile(); @@ -101,6 +102,7 @@ private slots: std::vector> symbol_widget_delegates; Mode mode; + bool react_to_changes = false; };