diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index 130f9149c..324eab6f6 100644 --- a/cockatrice/CMakeLists.txt +++ b/cockatrice/CMakeLists.txt @@ -56,6 +56,7 @@ set(cockatrice_SOURCES src/dialogs/dlg_tip_of_the_day.cpp src/dialogs/dlg_update.cpp src/dialogs/dlg_view_log.cpp + src/dialogs/dlg_load_deck.cpp src/game/filters/filter_string.cpp src/game/filters/filter_builder.cpp src/game/filters/filter_tree.cpp diff --git a/cockatrice/src/client/tabs/tab_deck_editor.cpp b/cockatrice/src/client/tabs/tab_deck_editor.cpp index a10dc91f3..12188dca1 100644 --- a/cockatrice/src/client/tabs/tab_deck_editor.cpp +++ b/cockatrice/src/client/tabs/tab_deck_editor.cpp @@ -5,6 +5,7 @@ #include "../../client/ui/widgets/cards/card_info_frame_widget.h" #include "../../deck/deck_list_model.h" #include "../../deck/deck_stats_interface.h" +#include "../../dialogs/dlg_load_deck.h" #include "../../dialogs/dlg_load_deck_from_clipboard.h" #include "../../game/cards/card_database_manager.h" #include "../../game/cards/card_database_model.h" @@ -927,9 +928,7 @@ void TabDeckEditor::actLoadDeck() return; } - QFileDialog dialog(this, tr("Load deck")); - dialog.setDirectory(SettingsCache::instance().getDeckPath()); - dialog.setNameFilters(DeckLoader::fileNameFilters); + DlgLoadDeck dialog(this); if (!dialog.exec()) return; diff --git a/cockatrice/src/client/tabs/tab_game.cpp b/cockatrice/src/client/tabs/tab_game.cpp index 7eead5aa0..4b2410cce 100644 --- a/cockatrice/src/client/tabs/tab_game.cpp +++ b/cockatrice/src/client/tabs/tab_game.cpp @@ -4,6 +4,7 @@ #include "../../deck/deck_loader.h" #include "../../deck/deck_view.h" #include "../../dialogs/dlg_create_game.h" +#include "../../dialogs/dlg_load_deck.h" #include "../../dialogs/dlg_load_remote_deck.h" #include "../../dialogs/dlg_manage_sets.h" #include "../../game/board/arrow_item.h" @@ -288,9 +289,7 @@ void TabGame::refreshShortcuts() void DeckViewContainer::loadLocalDeck() { - QFileDialog dialog(this, tr("Load deck")); - dialog.setDirectory(SettingsCache::instance().getDeckPath()); - dialog.setNameFilters(DeckLoader::fileNameFilters); + DlgLoadDeck dialog(this); if (!dialog.exec()) return; diff --git a/cockatrice/src/dialogs/dlg_load_deck.cpp b/cockatrice/src/dialogs/dlg_load_deck.cpp new file mode 100644 index 000000000..0fabdaaa3 --- /dev/null +++ b/cockatrice/src/dialogs/dlg_load_deck.cpp @@ -0,0 +1,22 @@ +#include "dlg_load_deck.h" + +#include "../deck/deck_loader.h" +#include "../settings/cache_settings.h" + +DlgLoadDeck::DlgLoadDeck(QWidget *parent) : QFileDialog(parent, tr("Load Deck")) +{ + QString startingDir = SettingsCache::instance().recents().getLatestDeckDirPath(); + if (startingDir.isEmpty()) { + startingDir = SettingsCache::instance().getDeckPath(); + } + + setDirectory(startingDir); + setNameFilters(DeckLoader::fileNameFilters); + + connect(this, &DlgLoadDeck::accepted, this, &DlgLoadDeck::actAccepted); +} + +void DlgLoadDeck::actAccepted() +{ + SettingsCache::instance().recents().setLatestDeckDirPath(directory().absolutePath()); +} \ No newline at end of file diff --git a/cockatrice/src/dialogs/dlg_load_deck.h b/cockatrice/src/dialogs/dlg_load_deck.h new file mode 100644 index 000000000..13df97995 --- /dev/null +++ b/cockatrice/src/dialogs/dlg_load_deck.h @@ -0,0 +1,21 @@ + +#ifndef DLG_LOAD_DECK_H +#define DLG_LOAD_DECK_H + +#include + +/** + * The file dialog for "Load Deck" operations. + * Handles remembering the most recently used deck loading directory. + */ +class DlgLoadDeck : public QFileDialog +{ + Q_OBJECT + + void actAccepted(); + +public: + explicit DlgLoadDeck(QWidget *parent = nullptr); +}; + +#endif // DLG_LOAD_DECK_H diff --git a/cockatrice/src/settings/recents_settings.cpp b/cockatrice/src/settings/recents_settings.cpp index da3c5313e..5bbec3c8c 100644 --- a/cockatrice/src/settings/recents_settings.cpp +++ b/cockatrice/src/settings/recents_settings.cpp @@ -29,4 +29,14 @@ void RecentsSettings::updateRecentlyOpenedDeckPaths(const QString &deckPath) setValue(deckPaths, "deckpaths", "deckbuilder"); emit recentlyOpenedDeckPathsChanged(); +} + +QString RecentsSettings::getLatestDeckDirPath() +{ + return getValue("latestDeckDir", "dirs").toString(); +} + +void RecentsSettings::setLatestDeckDirPath(const QString &dirPath) +{ + setValue(dirPath, "latestDeckDir", "dirs"); } \ No newline at end of file diff --git a/cockatrice/src/settings/recents_settings.h b/cockatrice/src/settings/recents_settings.h index c240b100d..6e91cd2f0 100644 --- a/cockatrice/src/settings/recents_settings.h +++ b/cockatrice/src/settings/recents_settings.h @@ -16,6 +16,9 @@ public: void clearRecentlyOpenedDeckPaths(); void updateRecentlyOpenedDeckPaths(const QString &deckPath); + QString getLatestDeckDirPath(); + void setLatestDeckDirPath(const QString &dirPath); + signals: void recentlyOpenedDeckPathsChanged(); };