From 854880f9f802d732949a54287cee25856bd6e8c6 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Sun, 16 Mar 2025 17:53:09 -0400 Subject: [PATCH] Save map list settings in config --- include/config.h | 4 +++ include/mainwindow.h | 1 + include/ui/maplisttoolbar.h | 2 ++ src/config.cpp | 20 +++++++++++-- src/mainwindow.cpp | 37 +++++++++++++++++++++--- src/ui/maplisttoolbar.cpp | 56 ++++++++++++++++++------------------- 6 files changed, 85 insertions(+), 35 deletions(-) diff --git a/include/config.h b/include/config.h index 1df1b4ef..c10c6545 100644 --- a/include/config.h +++ b/include/config.h @@ -52,6 +52,8 @@ public: this->projectManuallyClosed = false; this->reopenOnLaunch = true; this->mapListTab = 0; + this->mapListEditGroupsEnabled = false; + this->mapListHideEmptyEnabled.clear(); this->prettyCursors = true; this->mirrorConnectingMaps = true; this->showDiveEmergeMaps = false; @@ -110,6 +112,8 @@ public: bool reopenOnLaunch; bool projectManuallyClosed; int mapListTab; + bool mapListEditGroupsEnabled; + QMap mapListHideEmptyEnabled; bool prettyCursors; bool mirrorConnectingMaps; bool showDiveEmergeMaps; diff --git a/include/mainwindow.h b/include/mainwindow.h index 1320f649..d8fe18a3 100644 --- a/include/mainwindow.h +++ b/include/mainwindow.h @@ -423,6 +423,7 @@ private: double getMetatilesZoomScale(); void redrawMetatileSelection(); void scrollMetatileSelectorToSelection(); + MapListToolBar* getMapListToolBar(int tab); MapListToolBar* getCurrentMapListToolBar(); MapTree* getCurrentMapList(); void setLocationComboBoxes(const QStringList &locations); diff --git a/include/ui/maplisttoolbar.h b/include/ui/maplisttoolbar.h index 9890b584..655ce414 100644 --- a/include/ui/maplisttoolbar.h +++ b/include/ui/maplisttoolbar.h @@ -42,6 +42,8 @@ public: signals: void filterCleared(MapTree*); void addFolderClicked(); + void editsAllowedChanged(bool allowed); + void emptyFoldersVisibleChanged(bool visible); private: Ui::MapListToolBar *ui; diff --git a/src/config.cpp b/src/config.cpp index 1847cfcf..dc217117 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -304,6 +304,16 @@ void PorymapConfig::parseConfigKeyValue(QString key, QString value) { this->prettyCursors = getConfigBool(key, value); } else if (key == "map_list_tab") { this->mapListTab = getConfigInteger(key, value, 0, 2, 0); + } else if (key == "map_list_edit_groups_enabled") { + this->mapListEditGroupsEnabled = getConfigBool(key, value); + } else if (key.startsWith("map_list_hide_empty_enabled/")) { + bool ok; + int tab = key.mid(QStringLiteral("map_list_hide_empty_enabled/").length()).toInt(&ok, 0); + if (!ok) { + logWarn(QString("Invalid config key found in config file %1: '%2'").arg(this->getConfigFilepath()).arg(key)); + return; + } + this->mapListHideEmptyEnabled.insert(tab, getConfigBool(key, value)); } else if (key == "main_window_geometry") { this->mainWindowGeometry = bytesFromString(value); } else if (key == "main_window_state") { @@ -445,6 +455,10 @@ QMap PorymapConfig::getKeyValueMap() { map.insert("reopen_on_launch", this->reopenOnLaunch ? "1" : "0"); map.insert("pretty_cursors", this->prettyCursors ? "1" : "0"); map.insert("map_list_tab", QString::number(this->mapListTab)); + map.insert("map_list_edit_groups_enabled", this->mapListEditGroupsEnabled ? "1" : "0"); + for (auto i = this->mapListHideEmptyEnabled.constBegin(); i != this->mapListHideEmptyEnabled.constEnd(); i++) { + map.insert(QStringLiteral("map_list_hide_empty_enabled/") + QString::number(i.key()), i.value() ? "1" : "0"); + } map.insert("main_window_geometry", stringFromByteArray(this->mainWindowGeometry)); map.insert("main_window_state", stringFromByteArray(this->mainWindowState)); map.insert("map_splitter_state", stringFromByteArray(this->mapSplitterState)); @@ -769,14 +783,14 @@ void ProjectConfig::parseConfigKeyValue(QString key, QString value) { userConfig.parseCustomScripts(value); #endif } else if (key.startsWith("path/")) { - auto k = reverseDefaultPaths(key.mid(5)); + auto k = reverseDefaultPaths(key.mid(QStringLiteral("path/").length())); if (k != static_cast(-1)) { this->setFilePath(k, value); } else { logWarn(QString("Invalid config key found in config file %1: '%2'").arg(this->getConfigFilepath()).arg(key)); } } else if (key.startsWith("ident/")) { - auto identifierId = reverseDefaultIdentifier(key.mid(6)); + auto identifierId = reverseDefaultIdentifier(key.mid(QStringLiteral("ident/").length())); if (identifierId != static_cast(-1)) { this->setIdentifier(identifierId, value); } else { @@ -803,7 +817,7 @@ void ProjectConfig::parseConfigKeyValue(QString key, QString value) { } else if (key == "event_icon_path_heal") { this->eventIconPaths[Event::Group::Heal] = value; } else if (key.startsWith("pokemon_icon_path/")) { - this->pokemonIconPaths.insert(key.mid(18).toUpper(), value); + this->pokemonIconPaths.insert(key.mid(QStringLiteral("pokemon_icon_path/").length()).toUpper(), value); } else if (key == "collision_sheet_path") { this->collisionSheetPath = value; } else if (key == "collision_sheet_width") { diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 85e0df3e..7aaa9ae0 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -449,6 +449,27 @@ void MainWindow::initMapList() { ui->mapListToolBar_Locations->setEditsAllowedButtonVisible(false); ui->mapListToolBar_Layouts->setEditsAllowedButtonVisible(false); + // Initialize settings from config + ui->mapListToolBar_Groups->setEditsAllowed(porymapConfig.mapListEditGroupsEnabled); + for (auto i = porymapConfig.mapListHideEmptyEnabled.constBegin(); i != porymapConfig.mapListHideEmptyEnabled.constEnd(); i++) { + auto toolbar = getMapListToolBar(i.key()); + if (toolbar) toolbar->setEmptyFoldersVisible(!i.value()); + } + + // Update config if map list settings change + connect(ui->mapListToolBar_Groups, &MapListToolBar::editsAllowedChanged, [](bool allowed) { + porymapConfig.mapListEditGroupsEnabled = allowed; + }); + connect(ui->mapListToolBar_Groups, &MapListToolBar::emptyFoldersVisibleChanged, [](bool visible) { + porymapConfig.mapListHideEmptyEnabled[MapListTab::Groups] = !visible; + }); + connect(ui->mapListToolBar_Locations, &MapListToolBar::emptyFoldersVisibleChanged, [](bool visible) { + porymapConfig.mapListHideEmptyEnabled[MapListTab::Locations] = !visible; + }); + connect(ui->mapListToolBar_Layouts, &MapListToolBar::emptyFoldersVisibleChanged, [](bool visible) { + porymapConfig.mapListHideEmptyEnabled[MapListTab::Layouts] = !visible; + }); + // When map list search filter is cleared we want the current map/layout in the editor to be visible in the list. connect(ui->mapListToolBar_Groups, &MapListToolBar::filterCleared, this, &MainWindow::scrollMapListToCurrentMap); connect(ui->mapListToolBar_Locations, &MapListToolBar::filterCleared, this, &MainWindow::scrollMapListToCurrentMap); @@ -1149,7 +1170,8 @@ bool MainWindow::setProjectUI() { // map models this->mapGroupModel = new MapGroupModel(editor->project); this->groupListProxyModel = new FilterChildrenProxyModel(); - groupListProxyModel->setSourceModel(this->mapGroupModel); + this->groupListProxyModel->setSourceModel(this->mapGroupModel); + this->groupListProxyModel->setHideEmpty(porymapConfig.mapListHideEmptyEnabled[MapListTab::Groups]); ui->mapList->setModel(groupListProxyModel); this->ui->mapList->setItemDelegateForColumn(0, new GroupNameDelegate(this->editor->project, this)); @@ -1157,13 +1179,16 @@ bool MainWindow::setProjectUI() { this->mapLocationModel = new MapLocationModel(editor->project); this->locationListProxyModel = new FilterChildrenProxyModel(); - locationListProxyModel->setSourceModel(this->mapLocationModel); + this->locationListProxyModel->setSourceModel(this->mapLocationModel); + this->locationListProxyModel->setHideEmpty(porymapConfig.mapListHideEmptyEnabled[MapListTab::Locations]); + ui->locationList->setModel(locationListProxyModel); ui->locationList->sortByColumn(0, Qt::SortOrder::AscendingOrder); this->layoutTreeModel = new LayoutTreeModel(editor->project); this->layoutListProxyModel = new FilterChildrenProxyModel(); this->layoutListProxyModel->setSourceModel(this->layoutTreeModel); + this->layoutListProxyModel->setHideEmpty(porymapConfig.mapListHideEmptyEnabled[MapListTab::Layouts]); ui->layoutList->setModel(layoutListProxyModel); ui->layoutList->sortByColumn(0, Qt::SortOrder::AscendingOrder); @@ -2708,8 +2733,8 @@ void MainWindow::initTilesetEditor() { connect(this->tilesetEditor, &TilesetEditor::tilesetsSaved, this, &MainWindow::onTilesetsSaved); } -MapListToolBar* MainWindow::getCurrentMapListToolBar() { - switch (ui->mapListContainer->currentIndex()) { +MapListToolBar* MainWindow::getMapListToolBar(int tab) { + switch (tab) { case MapListTab::Groups: return ui->mapListToolBar_Groups; case MapListTab::Locations: return ui->mapListToolBar_Locations; case MapListTab::Layouts: return ui->mapListToolBar_Layouts; @@ -2717,6 +2742,10 @@ MapListToolBar* MainWindow::getCurrentMapListToolBar() { } } +MapListToolBar* MainWindow::getCurrentMapListToolBar() { + return getMapListToolBar(ui->mapListContainer->currentIndex()); +} + MapTree* MainWindow::getCurrentMapList() { auto toolbar = getCurrentMapListToolBar(); if (toolbar) diff --git a/src/ui/maplisttoolbar.cpp b/src/ui/maplisttoolbar.cpp index d35e4656..2584c4fd 100644 --- a/src/ui/maplisttoolbar.cpp +++ b/src/ui/maplisttoolbar.cpp @@ -4,11 +4,6 @@ #include -/* - TODO: The button states for each tool bar (just the two toggleable buttons, hide empty folders and allow editing) - should be saved in the config. This will be cleaner/easier once the config is JSON, so holding off on that for now. -*/ - MapListToolBar::MapListToolBar(QWidget *parent) : QFrame(parent) , ui(new Ui::MapListToolBar) @@ -18,7 +13,7 @@ MapListToolBar::MapListToolBar(QWidget *parent) ui->button_ToggleEmptyFolders->setChecked(!m_emptyFoldersVisible); ui->button_ToggleEdit->setChecked(m_editsAllowed); - connect(ui->button_AddFolder, &QAbstractButton::clicked, this, &MapListToolBar::addFolderClicked); // TODO: Tool tip + connect(ui->button_AddFolder, &QAbstractButton::clicked, this, &MapListToolBar::addFolderClicked); connect(ui->button_ExpandAll, &QAbstractButton::clicked, this, &MapListToolBar::expandList); connect(ui->button_CollapseAll, &QAbstractButton::clicked, this, &MapListToolBar::collapseList); connect(ui->button_ToggleEdit, &QAbstractButton::clicked, this, &MapListToolBar::toggleEditsAllowed); @@ -57,28 +52,30 @@ void MapListToolBar::toggleEditsAllowed() { } void MapListToolBar::setEditsAllowed(bool allowed) { - m_editsAllowed = allowed; + if (m_list) { + if (allowed) { + m_list->setSelectionMode(QAbstractItemView::ExtendedSelection); + m_list->setDragEnabled(true); + m_list->setAcceptDrops(true); + m_list->setDropIndicatorShown(true); + m_list->setDragDropMode(QAbstractItemView::InternalMove); + m_list->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed); + } else { + m_list->setSelectionMode(QAbstractItemView::NoSelection); + m_list->setDragEnabled(false); + m_list->setAcceptDrops(false); + m_list->setDropIndicatorShown(false); + m_list->setDragDropMode(QAbstractItemView::NoDragDrop); + m_list->setEditTriggers(QAbstractItemView::NoEditTriggers); + } + } - const QSignalBlocker b(ui->button_ToggleEdit); - ui->button_ToggleEdit->setChecked(allowed); + const QSignalBlocker b(ui->button_ToggleEdit); + ui->button_ToggleEdit->setChecked(allowed); - if (!m_list) - return; - - if (allowed) { - m_list->setSelectionMode(QAbstractItemView::ExtendedSelection); - m_list->setDragEnabled(true); - m_list->setAcceptDrops(true); - m_list->setDropIndicatorShown(true); - m_list->setDragDropMode(QAbstractItemView::InternalMove); - m_list->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed); - } else { - m_list->setSelectionMode(QAbstractItemView::NoSelection); - m_list->setDragEnabled(false); - m_list->setAcceptDrops(false); - m_list->setDropIndicatorShown(false); - m_list->setDragDropMode(QAbstractItemView::NoDragDrop); - m_list->setEditTriggers(QAbstractItemView::NoEditTriggers); + if (m_editsAllowed != allowed) { + m_editsAllowed = allowed; + emit editsAllowedChanged(allowed); } } @@ -87,8 +84,6 @@ void MapListToolBar::toggleEmptyFolders() { } void MapListToolBar::setEmptyFoldersVisible(bool visible) { - m_emptyFoldersVisible = visible; - if (m_list) { auto model = static_cast(m_list->model()); if (model) { @@ -103,6 +98,11 @@ void MapListToolBar::setEmptyFoldersVisible(bool visible) { const QSignalBlocker b(ui->button_ToggleEmptyFolders); ui->button_ToggleEmptyFolders->setChecked(!visible); + + if (m_emptyFoldersVisible != visible) { + m_emptyFoldersVisible = visible; + emit emptyFoldersVisibleChanged(visible); + } } void MapListToolBar::expandList() {