diff --git a/.github/workflows/documentation-build.yml b/.github/workflows/documentation-build.yml index 9837ce164..ce331d113 100644 --- a/.github/workflows/documentation-build.yml +++ b/.github/workflows/documentation-build.yml @@ -31,7 +31,7 @@ jobs: dot -V - name: Install Doxygen - uses: ssciwr/doxygen-install@v1 + uses: ssciwr/doxygen-install@v2 with: version: "1.14.0" diff --git a/cockatrice/src/client/settings/cache_settings.cpp b/cockatrice/src/client/settings/cache_settings.cpp index 8a981ce14..30093fd52 100644 --- a/cockatrice/src/client/settings/cache_settings.cpp +++ b/cockatrice/src/client/settings/cache_settings.cpp @@ -268,9 +268,6 @@ SettingsCache::SettingsCache() picDownload = settings->value("personal/picturedownload", true).toBool(); showStatusBar = settings->value("personal/showStatusBar", false).toBool(); - mainWindowGeometry = settings->value("interface/main_window_geometry").toByteArray(); - tokenDialogGeometry = settings->value("interface/token_dialog_geometry").toByteArray(); - setsDialogGeometry = settings->value("interface/sets_dialog_geometry").toByteArray(); notificationsEnabled = settings->value("interface/notificationsenabled", true).toBool(); spectatorNotificationsEnabled = settings->value("interface/specnotificationsenabled", false).toBool(); buddyConnectNotificationsEnabled = settings->value("interface/buddyconnectnotificationsenabled", true).toBool(); @@ -280,7 +277,6 @@ SettingsCache::SettingsCache() doNotDeleteArrowsInSubPhases = settings->value("interface/doNotDeleteArrowsInSubPhases", true).toBool(); startingHandSize = settings->value("interface/startinghandsize", 7).toInt(); annotateTokens = settings->value("interface/annotatetokens", false).toBool(); - tabGameSplitterSizes = settings->value("interface/tabgame_splittersizes").toByteArray(); knownMissingFeatures = settings->value("interface/knownmissingfeatures", "").toString(); useTearOffMenus = settings->value("interface/usetearoffmenus", true).toBool(); cardViewInitialRowsMax = settings->value("interface/cardViewInitialRowsMax", 14).toInt(); @@ -713,12 +709,6 @@ void SettingsCache::setAnnotateTokens(QT_STATE_CHANGED_T _annotateTokens) settings->setValue("interface/annotatetokens", annotateTokens); } -void SettingsCache::setTabGameSplitterSizes(const QByteArray &_tabGameSplitterSizes) -{ - tabGameSplitterSizes = _tabGameSplitterSizes; - settings->setValue("interface/tabgame_splittersizes", tabGameSplitterSizes); -} - void SettingsCache::setShowShortcuts(QT_STATE_CHANGED_T _showShortcuts) { showShortcuts = static_cast(_showShortcuts); @@ -1090,24 +1080,6 @@ void SettingsCache::setIgnoreUnregisteredUserMessages(QT_STATE_CHANGED_T _ignore settings->setValue("chat/ignore_unregistered_messages", ignoreUnregisteredUserMessages); } -void SettingsCache::setMainWindowGeometry(const QByteArray &_mainWindowGeometry) -{ - mainWindowGeometry = _mainWindowGeometry; - settings->setValue("interface/main_window_geometry", mainWindowGeometry); -} - -void SettingsCache::setTokenDialogGeometry(const QByteArray &_tokenDialogGeometry) -{ - tokenDialogGeometry = _tokenDialogGeometry; - settings->setValue("interface/token_dialog_geometry", tokenDialogGeometry); -} - -void SettingsCache::setSetsDialogGeometry(const QByteArray &_setsDialogGeometry) -{ - setsDialogGeometry = _setsDialogGeometry; - settings->setValue("interface/sets_dialog_geometry", setsDialogGeometry); -} - void SettingsCache::setPixmapCacheSize(const int _pixmapCacheSize) { pixmapCacheSize = _pixmapCacheSize; diff --git a/cockatrice/src/client/settings/cache_settings.h b/cockatrice/src/client/settings/cache_settings.h index 57adb394a..5c5054105 100644 --- a/cockatrice/src/client/settings/cache_settings.h +++ b/cockatrice/src/client/settings/cache_settings.h @@ -205,9 +205,6 @@ private: DebugSettings *debugSettings; CardCounterSettings *cardCounterSettings; - QByteArray mainWindowGeometry; - QByteArray tokenDialogGeometry; - QByteArray setsDialogGeometry; QString lang; QString deckPath, filtersPath, replaysPath, picsPath, redirectCachePath, customPicsPath, cardDatabasePath, customCardDatabasePath, themesPath, spoilerDatabasePath, tokenDatabasePath, themeName, homeTabBackgroundSource; @@ -238,7 +235,6 @@ private: bool doNotDeleteArrowsInSubPhases; int startingHandSize; bool annotateTokens; - QByteArray tabGameSplitterSizes; bool showShortcuts; bool showGameSelectorFilterToolbar; bool displayCardNames; @@ -345,18 +341,6 @@ public: QString getSettingsPath(); [[nodiscard]] QString getCachePath() const; [[nodiscard]] QString getNetworkCachePath() const; - [[nodiscard]] const QByteArray &getMainWindowGeometry() const - { - return mainWindowGeometry; - } - [[nodiscard]] const QByteArray &getTokenDialogGeometry() const - { - return tokenDialogGeometry; - } - [[nodiscard]] const QByteArray &getSetsDialogGeometry() const - { - return setsDialogGeometry; - } [[nodiscard]] QString getLang() const { return lang; @@ -555,10 +539,6 @@ public: { return annotateTokens; } - [[nodiscard]] QByteArray getTabGameSplitterSizes() const - { - return tabGameSplitterSizes; - } [[nodiscard]] bool getShowShortcuts() const { return showShortcuts; @@ -995,9 +975,6 @@ public: public slots: void setDownloadSpoilerStatus(bool _spoilerStatus); - void setMainWindowGeometry(const QByteArray &_mainWindowGeometry); - void setTokenDialogGeometry(const QByteArray &_tokenDialog); - void setSetsDialogGeometry(const QByteArray &_setsDialog); void setLang(const QString &_lang); void setShowTipsOnStartup(bool _showTipsOnStartup); void setSeenTips(const QList &_seenTips); @@ -1034,7 +1011,6 @@ public slots: void setDoNotDeleteArrowsInSubPhases(QT_STATE_CHANGED_T _doNotDeleteArrowsInSubPhases); void setStartingHandSize(int _startingHandSize); void setAnnotateTokens(QT_STATE_CHANGED_T _annotateTokens); - void setTabGameSplitterSizes(const QByteArray &_tabGameSplitterSizes); void setShowShortcuts(QT_STATE_CHANGED_T _showShortcuts); void setShowGameSelectorFilterToolbar(QT_STATE_CHANGED_T _showGameSelectorFilterToolbar); void setDisplayCardNames(QT_STATE_CHANGED_T _displayCardNames); diff --git a/cockatrice/src/game/dialogs/dlg_create_token.cpp b/cockatrice/src/game/dialogs/dlg_create_token.cpp index 836c0c16a..df264f065 100644 --- a/cockatrice/src/game/dialogs/dlg_create_token.cpp +++ b/cockatrice/src/game/dialogs/dlg_create_token.cpp @@ -146,13 +146,13 @@ DlgCreateToken::DlgCreateToken(const QStringList &_predefinedTokens, QWidget *pa setWindowTitle(tr("Create token")); resize(600, 500); - restoreGeometry(SettingsCache::instance().getTokenDialogGeometry()); + restoreGeometry(SettingsCache::instance().layouts().getTokenDialogGeometry()); } void DlgCreateToken::closeEvent(QCloseEvent *event) { event->accept(); - SettingsCache::instance().setTokenDialogGeometry(saveGeometry()); + SettingsCache::instance().layouts().setTokenDialogGeometry(saveGeometry()); } void DlgCreateToken::faceDownCheckBoxToggled(bool checked) @@ -225,13 +225,13 @@ void DlgCreateToken::actChooseTokenFromDeck(bool checked) void DlgCreateToken::actOk() { - SettingsCache::instance().setTokenDialogGeometry(saveGeometry()); + SettingsCache::instance().layouts().setTokenDialogGeometry(saveGeometry()); accept(); } void DlgCreateToken::actReject() { - SettingsCache::instance().setTokenDialogGeometry(saveGeometry()); + SettingsCache::instance().layouts().setTokenDialogGeometry(saveGeometry()); reject(); } diff --git a/cockatrice/src/interface/widgets/dialogs/dlg_manage_sets.cpp b/cockatrice/src/interface/widgets/dialogs/dlg_manage_sets.cpp index 2cda51f2a..5e6a6a62d 100644 --- a/cockatrice/src/interface/widgets/dialogs/dlg_manage_sets.cpp +++ b/cockatrice/src/interface/widgets/dialogs/dlg_manage_sets.cpp @@ -189,11 +189,11 @@ WndSets::WndSets(QWidget *parent) : QMainWindow(parent) setWindowTitle(tr("Manage sets")); setMinimumSize(800, 500); - auto &geometry = SettingsCache::instance().getSetsDialogGeometry(); + auto geometry = SettingsCache::instance().layouts().getSetsDialogGeometry(); if (!geometry.isEmpty()) { restoreGeometry(geometry); } - auto &headerState = SettingsCache::instance().layouts().getSetsDialogHeaderState(); + auto headerState = SettingsCache::instance().layouts().getSetsDialogHeaderState(); if (!headerState.isEmpty()) { view->header()->restoreState(headerState); view->header()->setSortIndicator(SORT_RESET, Qt::DescendingOrder); @@ -209,7 +209,7 @@ WndSets::~WndSets() void WndSets::closeEvent(QCloseEvent * /*ev*/) { - SettingsCache::instance().setSetsDialogGeometry(saveGeometry()); + SettingsCache::instance().layouts().setSetsDialogGeometry(saveGeometry()); } void WndSets::saveHeaderState() diff --git a/cockatrice/src/interface/widgets/tabs/abstract_tab_deck_editor.cpp b/cockatrice/src/interface/widgets/tabs/abstract_tab_deck_editor.cpp index 44fa46bb1..afc834e10 100644 --- a/cockatrice/src/interface/widgets/tabs/abstract_tab_deck_editor.cpp +++ b/cockatrice/src/interface/widgets/tabs/abstract_tab_deck_editor.cpp @@ -75,7 +75,7 @@ AbstractTabDeckEditor::AbstractTabDeckEditor(TabSupervisor *_tabSupervisor) : Ta &AbstractTabDeckEditor::refreshShortcuts); } -void AbstractTabDeckEditor::registerDockWidget(QMenu *_viewMenu, QDockWidget *widget) +void AbstractTabDeckEditor::registerDockWidget(QMenu *_viewMenu, QDockWidget *widget, const QSize &defaultSize) { QMenu *menu = _viewMenu->addMenu(QString()); @@ -102,7 +102,7 @@ void AbstractTabDeckEditor::registerDockWidget(QMenu *_viewMenu, QDockWidget *wi connect(filter, &VisibilityChangeListener::visibilityChanged, aVisible, [aVisible](bool visible) { aVisible->setChecked(visible); }); - dockToActions.insert(widget, {menu, aVisible, aFloating}); + dockToActions.insert(widget, {menu, aVisible, aFloating, defaultSize}); } /** diff --git a/cockatrice/src/interface/widgets/tabs/abstract_tab_deck_editor.h b/cockatrice/src/interface/widgets/tabs/abstract_tab_deck_editor.h index 9c62a5c93..3730a7cdd 100644 --- a/cockatrice/src/interface/widgets/tabs/abstract_tab_deck_editor.h +++ b/cockatrice/src/interface/widgets/tabs/abstract_tab_deck_editor.h @@ -274,13 +274,14 @@ protected: QMenu *menu; ///< The menu containing the actions QAction *aVisible; ///< The menu action that toggles visibility QAction *aFloating; ///< The menu action that toggles floating + QSize defaultSize; ///< The default size of the dock }; /** * @brief registers a QDockWidget as a managed dock widget. Creates the associated actions and menu, adds them to * the viewMenu, and connects those actions to the tab's slots. */ - void registerDockWidget(QMenu *_viewMenu, QDockWidget *widget); + void registerDockWidget(QMenu *_viewMenu, QDockWidget *widget, const QSize &defaultSize); /** @brief Confirms deck open action based on settings and modified state. * @param openInSameTabIfBlank Whether to reuse same tab if blank. diff --git a/cockatrice/src/interface/widgets/tabs/tab_deck_editor.cpp b/cockatrice/src/interface/widgets/tabs/tab_deck_editor.cpp index 1d667640d..cf258d454 100644 --- a/cockatrice/src/interface/widgets/tabs/tab_deck_editor.cpp +++ b/cockatrice/src/interface/widgets/tabs/tab_deck_editor.cpp @@ -54,11 +54,11 @@ void TabDeckEditor::createMenus() viewMenu = new QMenu(this); - registerDockWidget(viewMenu, cardDatabaseDockWidget); - registerDockWidget(viewMenu, cardInfoDockWidget); - registerDockWidget(viewMenu, deckDockWidget); - registerDockWidget(viewMenu, filterDockWidget); - registerDockWidget(viewMenu, printingSelectorDockWidget); + registerDockWidget(viewMenu, cardDatabaseDockWidget, {500, 500}); + registerDockWidget(viewMenu, cardInfoDockWidget, {250, 500}); + registerDockWidget(viewMenu, deckDockWidget, {250, 360}); + registerDockWidget(viewMenu, filterDockWidget, {250, 250}); + registerDockWidget(viewMenu, printingSelectorDockWidget, {525, 250}); connect(&SettingsCache::instance(), &SettingsCache::overrideAllCardArtWithPersonalPreferenceChanged, this, [this](bool enabled) { dockToActions[printingSelectorDockWidget].menu->setEnabled(!enabled); }); @@ -136,7 +136,7 @@ void TabDeckEditor::loadLayout() { LayoutsSettings &layouts = SettingsCache::instance().layouts(); - auto &layoutState = layouts.getDeckEditorLayoutState(); + auto layoutState = layouts.getDeckEditorLayoutState(); if (layoutState.isNull()) restartLayout(); else { @@ -144,20 +144,14 @@ void TabDeckEditor::loadLayout() restoreGeometry(layouts.getDeckEditorGeometry()); } - cardDatabaseDockWidget->setMinimumSize(layouts.getDeckEditorCardDatabaseSize()); - cardDatabaseDockWidget->setMaximumSize(layouts.getDeckEditorCardDatabaseSize()); + for (auto it = dockToActions.constKeyValueBegin(); it != dockToActions.constKeyValueEnd(); ++it) { + auto dockWidget = it->first; + auto actions = it->second; - cardInfoDockWidget->setMinimumSize(layouts.getDeckEditorCardSize()); - cardInfoDockWidget->setMaximumSize(layouts.getDeckEditorCardSize()); - - filterDockWidget->setMinimumSize(layouts.getDeckEditorFilterSize()); - filterDockWidget->setMaximumSize(layouts.getDeckEditorFilterSize()); - - deckDockWidget->setMinimumSize(layouts.getDeckEditorDeckSize()); - deckDockWidget->setMaximumSize(layouts.getDeckEditorDeckSize()); - - printingSelectorDockWidget->setMinimumSize(layouts.getDeckEditorPrintingSelectorSize()); - printingSelectorDockWidget->setMaximumSize(layouts.getDeckEditorPrintingSelectorSize()); + QSize size = layouts.getDeckEditorWidgetSize(dockWidget->objectName(), actions.defaultSize); + dockWidget->setMinimumSize(size); + dockWidget->setMaximumSize(size); + } QTimer::singleShot(100, this, &TabDeckEditor::freeDocksSize); } @@ -190,12 +184,9 @@ void TabDeckEditor::restartLayout() /** @brief Frees dock sizes to allow flexible resizing. */ void TabDeckEditor::freeDocksSize() { - const QSize minSize(100, 100); - const QSize maxSize(5000, 5000); - for (auto dockWidget : dockToActions.keys()) { - dockWidget->setMinimumSize(minSize); - dockWidget->setMaximumSize(maxSize); + dockWidget->setMinimumSize(100, 100); + dockWidget->setMaximumSize(5000, 5000); } } @@ -211,11 +202,10 @@ bool TabDeckEditor::eventFilter(QObject *o, QEvent *e) LayoutsSettings &layouts = SettingsCache::instance().layouts(); layouts.setDeckEditorLayoutState(saveState()); layouts.setDeckEditorGeometry(saveGeometry()); - layouts.setDeckEditorCardDatabaseSize(cardDatabaseDockWidget->size()); - layouts.setDeckEditorCardSize(cardInfoDockWidget->size()); - layouts.setDeckEditorFilterSize(filterDockWidget->size()); - layouts.setDeckEditorDeckSize(deckDockWidget->size()); - layouts.setDeckEditorPrintingSelectorSize(printingSelectorDockWidget->size()); + + for (auto dockWidget : dockToActions.keys()) { + layouts.setDeckEditorWidgetSize(dockWidget->objectName(), dockWidget->size()); + } } return false; } diff --git a/cockatrice/src/interface/widgets/tabs/tab_game.cpp b/cockatrice/src/interface/widgets/tabs/tab_game.cpp index 2df6e5ac5..e4a11f979 100644 --- a/cockatrice/src/interface/widgets/tabs/tab_game.cpp +++ b/cockatrice/src/interface/widgets/tabs/tab_game.cpp @@ -1034,12 +1034,12 @@ void TabGame::createViewMenuItems() { viewMenu = new QMenu(this); - registerDockWidget(viewMenu, cardInfoDock); - registerDockWidget(viewMenu, messageLayoutDock); - registerDockWidget(viewMenu, playerListDock); + registerDockWidget(viewMenu, cardInfoDock, {250, 360}); + registerDockWidget(viewMenu, messageLayoutDock, {250, 200}); + registerDockWidget(viewMenu, playerListDock, {250, 50}); if (replayDock) { - registerDockWidget(viewMenu, replayDock); + registerDockWidget(viewMenu, replayDock, {900, 100}); } viewMenu->addSeparator(); @@ -1051,7 +1051,7 @@ void TabGame::createViewMenuItems() addTabMenu(viewMenu); } -void TabGame::registerDockWidget(QMenu *_viewMenu, QDockWidget *widget) +void TabGame::registerDockWidget(QMenu *_viewMenu, QDockWidget *widget, const QSize &defaultSize) { QMenu *menu = _viewMenu->addMenu(QString()); @@ -1078,7 +1078,7 @@ void TabGame::registerDockWidget(QMenu *_viewMenu, QDockWidget *widget) connect(filter, &VisibilityChangeListener::visibilityChanged, aVisible, [aVisible](bool visible) { aVisible->setChecked(visible); }); - dockToActions.insert(widget, {menu, aVisible, aFloating}); + dockToActions.insert(widget, {menu, aVisible, aFloating, defaultSize}); } void TabGame::loadLayout() @@ -1088,24 +1088,27 @@ void TabGame::loadLayout() restoreGeometry(layouts.getReplayPlayAreaGeometry()); restoreState(layouts.getReplayPlayAreaLayoutState()); - cardInfoDock->setMinimumSize(layouts.getReplayCardInfoSize()); - cardInfoDock->setMaximumSize(layouts.getReplayCardInfoSize()); - messageLayoutDock->setMinimumSize(layouts.getReplayMessageLayoutSize()); - messageLayoutDock->setMaximumSize(layouts.getReplayMessageLayoutSize()); - playerListDock->setMinimumSize(layouts.getReplayPlayerListSize()); - playerListDock->setMaximumSize(layouts.getReplayPlayerListSize()); - replayDock->setMinimumSize(layouts.getReplayReplaySize()); - replayDock->setMaximumSize(layouts.getReplayReplaySize()); + for (auto it = dockToActions.constKeyValueBegin(); it != dockToActions.constKeyValueEnd(); ++it) { + auto dockWidget = it->first; + auto actions = it->second; + + QSize size = layouts.getReplayPlayAreaWidgetSize(dockWidget->objectName(), actions.defaultSize); + dockWidget->setMinimumSize(size); + dockWidget->setMaximumSize(size); + } + } else { restoreGeometry(layouts.getGamePlayAreaGeometry()); restoreState(layouts.getGamePlayAreaLayoutState()); - cardInfoDock->setMinimumSize(layouts.getGameCardInfoSize()); - cardInfoDock->setMaximumSize(layouts.getGameCardInfoSize()); - messageLayoutDock->setMinimumSize(layouts.getGameMessageLayoutSize()); - messageLayoutDock->setMaximumSize(layouts.getGameMessageLayoutSize()); - playerListDock->setMinimumSize(layouts.getGamePlayerListSize()); - playerListDock->setMaximumSize(layouts.getGamePlayerListSize()); + for (auto it = dockToActions.constKeyValueBegin(); it != dockToActions.constKeyValueEnd(); ++it) { + auto dockWidget = it->first; + auto actions = it->second; + + QSize size = layouts.getGamePlayAreaWidgetSize(dockWidget->objectName(), actions.defaultSize); + dockWidget->setMinimumSize(size); + dockWidget->setMaximumSize(size); + } } QTimer::singleShot(100, this, &TabGame::freeDocksSize); @@ -1113,18 +1116,9 @@ void TabGame::loadLayout() void TabGame::freeDocksSize() { - cardInfoDock->setMinimumSize(100, 100); - cardInfoDock->setMaximumSize(5000, 5000); - - messageLayoutDock->setMinimumSize(100, 100); - messageLayoutDock->setMaximumSize(5000, 5000); - - playerListDock->setMinimumSize(100, 100); - playerListDock->setMaximumSize(5000, 5000); - - if (replayDock) { - replayDock->setMinimumSize(100, 100); - replayDock->setMaximumSize(5000, 5000); + for (auto dockWidget : dockToActions.keys()) { + dockWidget->setMinimumSize(100, 100); + dockWidget->setMaximumSize(5000, 5000); } } @@ -1342,16 +1336,17 @@ void TabGame::hideEvent(QHideEvent *event) if (replayDock) { layouts.setReplayPlayAreaState(saveState()); layouts.setReplayPlayAreaGeometry(saveGeometry()); - layouts.setReplayCardInfoSize(cardInfoDock->size()); - layouts.setReplayMessageLayoutSize(messageLayoutDock->size()); - layouts.setReplayPlayerListSize(playerListDock->size()); - layouts.setReplayReplaySize(replayDock->size()); + + for (auto dockWidget : dockToActions.keys()) { + layouts.setReplayPlayAreaWidgetSize(dockWidget->objectName(), dockWidget->size()); + } } else { layouts.setGamePlayAreaState(saveState()); layouts.setGamePlayAreaGeometry(saveGeometry()); - layouts.setGameCardInfoSize(cardInfoDock->size()); - layouts.setGameMessageLayoutSize(messageLayoutDock->size()); - layouts.setGamePlayerListSize(playerListDock->size()); + + for (auto dockWidget : dockToActions.keys()) { + layouts.setGamePlayAreaWidgetSize(dockWidget->objectName(), dockWidget->size()); + } } Tab::hideEvent(event); diff --git a/cockatrice/src/interface/widgets/tabs/tab_game.h b/cockatrice/src/interface/widgets/tabs/tab_game.h index 4f944bf87..c35557743 100644 --- a/cockatrice/src/interface/widgets/tabs/tab_game.h +++ b/cockatrice/src/interface/widgets/tabs/tab_game.h @@ -94,6 +94,7 @@ private: QMenu *menu; QAction *aVisible; QAction *aFloating; + QSize defaultSize; }; QMap dockToActions; @@ -117,7 +118,7 @@ private: void createMenuItems(); void createReplayMenuItems(); void createViewMenuItems(); - void registerDockWidget(QMenu *_viewMenu, QDockWidget *widget); + void registerDockWidget(QMenu *_viewMenu, QDockWidget *widget, const QSize &defaultSize); void createCardInfoDock(bool bReplay = false); void createPlayerListDock(bool bReplay = false); void createMessageDock(bool bReplay = false); diff --git a/cockatrice/src/interface/widgets/tabs/visual_deck_editor/tab_deck_editor_visual.cpp b/cockatrice/src/interface/widgets/tabs/visual_deck_editor/tab_deck_editor_visual.cpp index 74c1021fb..29f871823 100644 --- a/cockatrice/src/interface/widgets/tabs/visual_deck_editor/tab_deck_editor_visual.cpp +++ b/cockatrice/src/interface/widgets/tabs/visual_deck_editor/tab_deck_editor_visual.cpp @@ -97,10 +97,10 @@ void TabDeckEditorVisual::createMenus() viewMenu = new QMenu(this); - registerDockWidget(viewMenu, cardInfoDockWidget); - registerDockWidget(viewMenu, deckDockWidget); - registerDockWidget(viewMenu, filterDockWidget); - registerDockWidget(viewMenu, printingSelectorDockWidget); + registerDockWidget(viewMenu, cardInfoDockWidget, {250, 500}); + registerDockWidget(viewMenu, deckDockWidget, {250, 360}); + registerDockWidget(viewMenu, filterDockWidget, {250, 250}); + registerDockWidget(viewMenu, printingSelectorDockWidget, {525, 250}); viewMenu->addSeparator(); @@ -249,17 +249,10 @@ void TabDeckEditorVisual::showPrintingSelector() /** @brief Set size restrictions for free floating dock widgets. */ void TabDeckEditorVisual::freeDocksSize() { - deckDockWidget->setMinimumSize(100, 100); - deckDockWidget->setMaximumSize(5000, 5000); - - cardInfoDockWidget->setMinimumSize(100, 100); - cardInfoDockWidget->setMaximumSize(5000, 5000); - - filterDockWidget->setMinimumSize(100, 100); - filterDockWidget->setMaximumSize(5000, 5000); - - printingSelectorDockWidget->setMinimumSize(100, 100); - printingSelectorDockWidget->setMaximumSize(5000, 5000); + for (auto dockWidget : dockToActions.keys()) { + dockWidget->setMinimumSize(100, 100); + dockWidget->setMaximumSize(5000, 5000); + } } /** @brief Refreshes keyboard shortcuts for this tab from settings. */ @@ -273,25 +266,22 @@ void TabDeckEditorVisual::refreshShortcuts() void TabDeckEditorVisual::loadLayout() { LayoutsSettings &layouts = SettingsCache::instance().layouts(); - auto &layoutState = layouts.getDeckEditorLayoutState(); + auto layoutState = layouts.getVisualDeckEditorLayoutState(); if (layoutState.isNull()) { restartLayout(); } else { restoreState(layoutState); - restoreGeometry(layouts.getDeckEditorGeometry()); + restoreGeometry(layouts.getVisualDeckEditorGeometry()); } - cardInfoDockWidget->setMinimumSize(layouts.getDeckEditorCardSize()); - cardInfoDockWidget->setMaximumSize(layouts.getDeckEditorCardSize()); + for (auto it = dockToActions.constKeyValueBegin(); it != dockToActions.constKeyValueEnd(); ++it) { + auto dockWidget = it->first; + auto actions = it->second; - filterDockWidget->setMinimumSize(layouts.getDeckEditorFilterSize()); - filterDockWidget->setMaximumSize(layouts.getDeckEditorFilterSize()); - - deckDockWidget->setMinimumSize(layouts.getDeckEditorDeckSize()); - deckDockWidget->setMaximumSize(layouts.getDeckEditorDeckSize()); - - printingSelectorDockWidget->setMinimumSize(layouts.getDeckEditorPrintingSelectorSize()); - printingSelectorDockWidget->setMaximumSize(layouts.getDeckEditorPrintingSelectorSize()); + QSize size = layouts.getVisualDeckEditorWidgetSize(dockWidget->objectName(), actions.defaultSize); + dockWidget->setMinimumSize(size); + dockWidget->setMaximumSize(size); + } QTimer::singleShot(100, this, &TabDeckEditorVisual::freeDocksSize); } @@ -354,12 +344,12 @@ bool TabDeckEditorVisual::eventFilter(QObject *o, QEvent *e) { if (o == this && e->type() == QEvent::Hide) { LayoutsSettings &layouts = SettingsCache::instance().layouts(); - layouts.setDeckEditorLayoutState(saveState()); - layouts.setDeckEditorGeometry(saveGeometry()); - layouts.setDeckEditorCardSize(cardInfoDockWidget->size()); - layouts.setDeckEditorFilterSize(filterDockWidget->size()); - layouts.setDeckEditorDeckSize(deckDockWidget->size()); - layouts.setDeckEditorPrintingSelectorSize(printingSelectorDockWidget->size()); + layouts.setVisualDeckEditorLayoutState(saveState()); + layouts.setVisualDeckEditorGeometry(saveGeometry()); + + for (auto dockWidget : dockToActions.keys()) { + layouts.setVisualDeckEditorWidgetSize(dockWidget->objectName(), dockWidget->size()); + } } return false; } diff --git a/cockatrice/src/interface/widgets/visual_deck_editor/visual_deck_display_options_widget.cpp b/cockatrice/src/interface/widgets/visual_deck_editor/visual_deck_display_options_widget.cpp index f0bee5d7d..79a98fda6 100644 --- a/cockatrice/src/interface/widgets/visual_deck_editor/visual_deck_display_options_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_deck_editor/visual_deck_display_options_widget.cpp @@ -7,6 +7,8 @@ VisualDeckDisplayOptionsWidget::VisualDeckDisplayOptionsWidget(QWidget *parent) : QWidget(parent) { groupAndSortLayout = new QHBoxLayout(this); + groupAndSortLayout->setContentsMargins(0, 0, 0, 0); + groupAndSortLayout->setSpacing(3); groupAndSortLayout->setAlignment(Qt::AlignLeft); this->setLayout(groupAndSortLayout); diff --git a/cockatrice/src/interface/widgets/visual_deck_editor/visual_deck_editor_widget.cpp b/cockatrice/src/interface/widgets/visual_deck_editor/visual_deck_editor_widget.cpp index d6afb5f22..e957eb304 100644 --- a/cockatrice/src/interface/widgets/visual_deck_editor/visual_deck_editor_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_deck_editor/visual_deck_editor_widget.cpp @@ -161,6 +161,7 @@ void VisualDeckEditorWidget::initializeDisplayOptionsAndSearchWidget() displayOptionsAndSearch = new QWidget(this); displayOptionsAndSearchLayout = new QHBoxLayout(displayOptionsAndSearch); + displayOptionsAndSearchLayout->setContentsMargins(0, 0, 0, 0); displayOptionsAndSearchLayout->setAlignment(Qt::AlignLeft); displayOptionsAndSearch->setLayout(displayOptionsAndSearchLayout); diff --git a/cockatrice/src/interface/window_main.cpp b/cockatrice/src/interface/window_main.cpp index 2e135d170..3724ff29d 100644 --- a/cockatrice/src/interface/window_main.cpp +++ b/cockatrice/src/interface/window_main.cpp @@ -879,7 +879,7 @@ MainWindow::MainWindow(QWidget *parent) retranslateUi(); - if (!restoreGeometry(SettingsCache::instance().getMainWindowGeometry())) { + if (!restoreGeometry(SettingsCache::instance().layouts().getMainWindowGeometry())) { setWindowState(Qt::WindowMaximized); } aFullScreen->setChecked(static_cast(windowState() & Qt::WindowFullScreen)); @@ -1098,7 +1098,7 @@ void MainWindow::closeEvent(QCloseEvent *event) tip->close(); event->accept(); - SettingsCache::instance().setMainWindowGeometry(saveGeometry()); + SettingsCache::instance().layouts().setMainWindowGeometry(saveGeometry()); tabSupervisor->deleteLater(); } diff --git a/libcockatrice_models/libcockatrice/models/deck_list/deck_list_model.cpp b/libcockatrice_models/libcockatrice/models/deck_list/deck_list_model.cpp index a0624f858..8cbf23be4 100644 --- a/libcockatrice_models/libcockatrice/models/deck_list/deck_list_model.cpp +++ b/libcockatrice_models/libcockatrice/models/deck_list/deck_list_model.cpp @@ -340,6 +340,9 @@ bool DeckListModel::removeRows(int row, int count, const QModelIndex &parent) emitRecursiveUpdates(parent); } + deckList->refreshDeckHash(); + emit deckHashChanged(); + return true; } @@ -448,8 +451,6 @@ QModelIndex DeckListModel::addCard(const ExactCard &card, const QString &zoneNam cardNode->setCardSetShortName(cardSetName); cardNode->setCardCollectorNumber(printingInfo.getProperty("num")); cardNode->setCardProviderId(printingInfo.getProperty("uuid")); - deckList->refreshDeckHash(); - emit deckHashChanged(); // Emit dataChanged for the amount column since we modified it QModelIndex cardIndex = nodeToIndex(cardNode); QModelIndex amountIndex = cardIndex.sibling(cardIndex.row(), DeckListModelColumns::CARD_AMOUNT); @@ -458,6 +459,10 @@ QModelIndex DeckListModel::addCard(const ExactCard &card, const QString &zoneNam sort(lastKnownColumn, lastKnownOrder); refreshCardFormatLegalities(); emitRecursiveUpdates(parentIndex); + + deckList->refreshDeckHash(); + emit deckHashChanged(); + auto index = nodeToIndex(cardNode); if (cardNodeAdded) { diff --git a/libcockatrice_settings/libcockatrice/settings/layouts_settings.cpp b/libcockatrice_settings/libcockatrice/settings/layouts_settings.cpp index 97629d385..0ec03ba07 100644 --- a/libcockatrice_settings/libcockatrice/settings/layouts_settings.cpp +++ b/libcockatrice_settings/libcockatrice/settings/layouts_settings.cpp @@ -1,218 +1,193 @@ #include "layouts_settings.h" +const static QString STATE_PROP = "state"; +const static QString GEOMETRY_PROP = "geometry"; +const static QString SIZE_PROP = "widgetSize"; + +const static QString GROUP_MAIN_WINDOW = "mainWindow"; +const static QString GROUP_DECK_EDITOR = "deckEditor"; +const static QString GROUP_VISUAL_DECK_EDITOR = "visualDeckEditor"; +const static QString GROUP_DECK_EDITOR_DB = "deckEditorDb"; +const static QString GROUP_SETS_DIALOG = "setsDialog"; +const static QString GROUP_TOKEN_DIALOG = "tokenDialog"; +const static QString GROUP_GAME_PLAY_AREA = "gamePlayArea"; +const static QString GROUP_REPLAY_PLAY_AREA = "replayPlayArea"; + LayoutsSettings::LayoutsSettings(const QString &settingPath, QObject *parent) - : SettingsManager(settingPath + "layouts.ini", "layouts", QString(), parent) + : SettingsManager(settingPath + "layouts.ini", QString(), QString(), parent) { } -const QByteArray LayoutsSettings::getDeckEditorLayoutState() +void LayoutsSettings::setMainWindowGeometry(const QByteArray &value) { - return getValue("layouts/deckEditor_state").toByteArray(); + setValue(value, GEOMETRY_PROP, GROUP_MAIN_WINDOW); +} + +QByteArray LayoutsSettings::getMainWindowGeometry() +{ + return getValue(GEOMETRY_PROP, GROUP_MAIN_WINDOW).toByteArray(); +} + +QByteArray LayoutsSettings::getDeckEditorLayoutState() +{ + return getValue(STATE_PROP, GROUP_DECK_EDITOR).toByteArray(); } void LayoutsSettings::setDeckEditorLayoutState(const QByteArray &value) { - setValue(value, "layouts/deckEditor_state"); + setValue(value, STATE_PROP, GROUP_DECK_EDITOR); } -const QByteArray LayoutsSettings::getDeckEditorGeometry() +QByteArray LayoutsSettings::getDeckEditorGeometry() { - return getValue("layouts/deckEditor_geometry").toByteArray(); + return getValue(GEOMETRY_PROP, GROUP_DECK_EDITOR).toByteArray(); } void LayoutsSettings::setDeckEditorGeometry(const QByteArray &value) { - setValue(value, "layouts/deckEditor_geometry"); + setValue(value, GEOMETRY_PROP, GROUP_DECK_EDITOR); } -QSize LayoutsSettings::getDeckEditorCardDatabaseSize() +void LayoutsSettings::setDeckEditorWidgetSize(const QString &widgetName, const QSize &value) { - QVariant previous = getValue("layouts/deckEditor_CardDatabaseSize"); - return previous == QVariant() ? QSize(500, 500) : previous.toSize(); + setValue(value, widgetName, GROUP_DECK_EDITOR, SIZE_PROP); } -void LayoutsSettings::setDeckEditorCardDatabaseSize(const QSize &value) +QSize LayoutsSettings::getDeckEditorWidgetSize(const QString &widgetName, const QSize &defaultValue) { - setValue(value, "layouts/deckEditor_CardDatabaseSize"); + QVariant previous = getValue(widgetName, GROUP_DECK_EDITOR, SIZE_PROP); + return previous == QVariant() ? defaultValue : previous.toSize(); } -QSize LayoutsSettings::getDeckEditorCardSize() +QByteArray LayoutsSettings::getVisualDeckEditorLayoutState() { - QVariant previous = getValue("layouts/deckEditor_CardSize"); - return previous == QVariant() ? QSize(250, 500) : previous.toSize(); + return getValue(STATE_PROP, GROUP_VISUAL_DECK_EDITOR).toByteArray(); } -void LayoutsSettings::setDeckEditorCardSize(const QSize &value) +void LayoutsSettings::setVisualDeckEditorLayoutState(const QByteArray &value) { - setValue(value, "layouts/deckEditor_CardSize"); + setValue(value, STATE_PROP, GROUP_VISUAL_DECK_EDITOR); } -QSize LayoutsSettings::getDeckEditorDeckSize() +QByteArray LayoutsSettings::getVisualDeckEditorGeometry() { - QVariant previous = getValue("layouts/deckEditor_DeckSize"); - return previous == QVariant() ? QSize(250, 360) : previous.toSize(); + return getValue(GEOMETRY_PROP, GROUP_VISUAL_DECK_EDITOR).toByteArray(); } -void LayoutsSettings::setDeckEditorDeckSize(const QSize &value) +void LayoutsSettings::setVisualDeckEditorGeometry(const QByteArray &value) { - setValue(value, "layouts/deckEditor_DeckSize"); + setValue(value, GEOMETRY_PROP, GROUP_VISUAL_DECK_EDITOR); } -QSize LayoutsSettings::getDeckEditorPrintingSelectorSize() +void LayoutsSettings::setVisualDeckEditorWidgetSize(const QString &widgetName, const QSize &value) { - QVariant previous = getValue("layouts/deckEditor_PrintingSelectorSize"); - return previous == QVariant() ? QSize(525, 250) : previous.toSize(); + setValue(value, widgetName, GROUP_VISUAL_DECK_EDITOR, SIZE_PROP); } -void LayoutsSettings::setDeckEditorPrintingSelectorSize(const QSize &value) +QSize LayoutsSettings::getVisualDeckEditorWidgetSize(const QString &widgetName, const QSize &defaultValue) { - setValue(value, "layouts/deckEditor_PrintingSelectorSize"); + QVariant previous = getValue(widgetName, GROUP_VISUAL_DECK_EDITOR, SIZE_PROP); + return previous == QVariant() ? defaultValue : previous.toSize(); } -QSize LayoutsSettings::getDeckEditorFilterSize() +QByteArray LayoutsSettings::getDeckEditorDbHeaderState() { - QVariant previous = getValue("layouts/deckEditor_FilterSize"); - return previous == QVariant() ? QSize(250, 250) : previous.toSize(); -} - -void LayoutsSettings::setDeckEditorFilterSize(const QSize &value) -{ - setValue(value, "layouts/deckEditor_FilterSize"); -} - -const QByteArray LayoutsSettings::getDeckEditorDbHeaderState() -{ - return getValue("layouts/deckEditorDbHeader_state").toByteArray(); + return getValue(STATE_PROP, GROUP_DECK_EDITOR_DB, "header").toByteArray(); } void LayoutsSettings::setDeckEditorDbHeaderState(const QByteArray &value) { - setValue(value, "layouts/deckEditorDbHeader_state"); + setValue(value, STATE_PROP, GROUP_DECK_EDITOR_DB, "header"); } -const QByteArray LayoutsSettings::getSetsDialogHeaderState() +QByteArray LayoutsSettings::getSetsDialogHeaderState() { - return getValue("layouts/setsDialogHeader_state").toByteArray(); + return getValue(STATE_PROP, GROUP_SETS_DIALOG, "header").toByteArray(); } void LayoutsSettings::setSetsDialogHeaderState(const QByteArray &value) { - setValue(value, "layouts/setsDialogHeader_state"); + setValue(value, STATE_PROP, GROUP_SETS_DIALOG, "header"); +} + +void LayoutsSettings::setSetsDialogGeometry(const QByteArray &value) +{ + setValue(value, GEOMETRY_PROP, GROUP_SETS_DIALOG); +} + +QByteArray LayoutsSettings::getSetsDialogGeometry() +{ + return getValue(GEOMETRY_PROP, GROUP_SETS_DIALOG).toByteArray(); +} + +void LayoutsSettings::setTokenDialogGeometry(const QByteArray &value) +{ + setValue(value, GEOMETRY_PROP, GROUP_TOKEN_DIALOG); +} + +QByteArray LayoutsSettings::getTokenDialogGeometry() +{ + return getValue(GEOMETRY_PROP, GROUP_TOKEN_DIALOG).toByteArray(); } void LayoutsSettings::setGamePlayAreaGeometry(const QByteArray &value) { - setValue(value, "layouts/gameplayarea_geometry"); + setValue(value, GEOMETRY_PROP, GROUP_GAME_PLAY_AREA); } void LayoutsSettings::setGamePlayAreaState(const QByteArray &value) { - setValue(value, "layouts/gameplayarea_state"); + setValue(value, STATE_PROP, GROUP_GAME_PLAY_AREA); } -const QByteArray LayoutsSettings::getGamePlayAreaLayoutState() +QByteArray LayoutsSettings::getGamePlayAreaLayoutState() { - return getValue("layouts/gameplayarea_state").toByteArray(); + return getValue(STATE_PROP, GROUP_GAME_PLAY_AREA).toByteArray(); } -const QByteArray LayoutsSettings::getGamePlayAreaGeometry() +QByteArray LayoutsSettings::getGamePlayAreaGeometry() { - return getValue("layouts/gameplayarea_geometry").toByteArray(); + return getValue(GEOMETRY_PROP, GROUP_GAME_PLAY_AREA).toByteArray(); } -const QSize LayoutsSettings::getGameCardInfoSize() +void LayoutsSettings::setGamePlayAreaWidgetSize(const QString &widgetName, const QSize &value) { - QVariant previous = getValue("layouts/gameplayarea_CardInfoSize"); - return previous == QVariant() ? QSize(250, 360) : previous.toSize(); + setValue(value, widgetName, GROUP_GAME_PLAY_AREA, SIZE_PROP); } -void LayoutsSettings::setGameCardInfoSize(const QSize &value) +QSize LayoutsSettings::getGamePlayAreaWidgetSize(const QString &widgetName, const QSize &defaultValue) { - setValue(value, "layouts/gameplayarea_CardInfoSize"); -} - -const QSize LayoutsSettings::getGameMessageLayoutSize() -{ - QVariant previous = getValue("layouts/gameplayarea_MessageLayoutSize"); - return previous == QVariant() ? QSize(250, 250) : previous.toSize(); -} - -void LayoutsSettings::setGameMessageLayoutSize(const QSize &value) -{ - setValue(value, "layouts/gameplayarea_MessageLayoutSize"); -} - -const QSize LayoutsSettings::getGamePlayerListSize() -{ - QVariant previous = getValue("layouts/gameplayarea_PlayerListSize"); - return previous == QVariant() ? QSize(250, 50) : previous.toSize(); -} - -void LayoutsSettings::setGamePlayerListSize(const QSize &value) -{ - setValue(value, "layouts/gameplayarea_PlayerListSize"); + QVariant previous = getValue(widgetName, GROUP_GAME_PLAY_AREA, SIZE_PROP); + return previous == QVariant() ? defaultValue : previous.toSize(); } void LayoutsSettings::setReplayPlayAreaGeometry(const QByteArray &value) { - setValue(value, "layouts/replayplayarea_geometry"); + setValue(value, GEOMETRY_PROP, GROUP_REPLAY_PLAY_AREA); } void LayoutsSettings::setReplayPlayAreaState(const QByteArray &value) { - setValue(value, "layouts/replayplayarea_state"); + setValue(value, STATE_PROP, GROUP_REPLAY_PLAY_AREA); } -const QByteArray LayoutsSettings::getReplayPlayAreaLayoutState() +QByteArray LayoutsSettings::getReplayPlayAreaLayoutState() { - return getValue("layouts/replayplayarea_state").toByteArray(); + return getValue(STATE_PROP, GROUP_REPLAY_PLAY_AREA).toByteArray(); } -const QByteArray LayoutsSettings::getReplayPlayAreaGeometry() +QByteArray LayoutsSettings::getReplayPlayAreaGeometry() { - return getValue("layouts/replayplayarea_geometry").toByteArray(); + return getValue(GEOMETRY_PROP, GROUP_REPLAY_PLAY_AREA).toByteArray(); } -const QSize LayoutsSettings::getReplayCardInfoSize() +void LayoutsSettings::setReplayPlayAreaWidgetSize(const QString &widgetName, const QSize &value) { - QVariant previous = getValue("layouts/replayplayarea_CardInfoSize"); - return previous == QVariant() ? QSize(250, 360) : previous.toSize(); + setValue(value, widgetName, GROUP_REPLAY_PLAY_AREA, SIZE_PROP); } -void LayoutsSettings::setReplayCardInfoSize(const QSize &value) +QSize LayoutsSettings::getReplayPlayAreaWidgetSize(const QString &widgetName, const QSize &defaultValue) { - setValue(value, "layouts/replayplayarea_CardInfoSize"); -} - -const QSize LayoutsSettings::getReplayMessageLayoutSize() -{ - QVariant previous = getValue("layouts/replayplayarea_MessageLayoutSize"); - return previous == QVariant() ? QSize(250, 200) : previous.toSize(); -} - -void LayoutsSettings::setReplayMessageLayoutSize(const QSize &value) -{ - setValue(value, "layouts/replayplayarea_MessageLayoutSize"); -} - -const QSize LayoutsSettings::getReplayPlayerListSize() -{ - QVariant previous = getValue("layouts/replayplayarea_PlayerListSize"); - return previous == QVariant() ? QSize(250, 50) : previous.toSize(); -} - -void LayoutsSettings::setReplayPlayerListSize(const QSize &value) -{ - setValue(value, "layouts/replayplayarea_PlayerListSize"); -} - -const QSize LayoutsSettings::getReplayReplaySize() -{ - QVariant previous = getValue("layouts/replayplayarea_ReplaySize"); - return previous == QVariant() ? QSize(900, 100) : previous.toSize(); -} - -void LayoutsSettings::setReplayReplaySize(const QSize &value) -{ - setValue(value, "layouts/replayplayarea_ReplaySize"); -} + QVariant previous = getValue(widgetName, GROUP_REPLAY_PLAY_AREA, SIZE_PROP); + return previous == QVariant() ? defaultValue : previous.toSize(); +} \ No newline at end of file diff --git a/libcockatrice_settings/libcockatrice/settings/layouts_settings.h b/libcockatrice_settings/libcockatrice/settings/layouts_settings.h index 9c4df77df..620753815 100644 --- a/libcockatrice_settings/libcockatrice/settings/layouts_settings.h +++ b/libcockatrice_settings/libcockatrice/settings/layouts_settings.h @@ -17,51 +17,51 @@ class LayoutsSettings : public SettingsManager friend class SettingsCache; public: + void setMainWindowGeometry(const QByteArray &value); + void setDeckEditorLayoutState(const QByteArray &value); void setDeckEditorGeometry(const QByteArray &value); - void setDeckEditorCardDatabaseSize(const QSize &value); - void setDeckEditorCardSize(const QSize &value); - void setDeckEditorDeckSize(const QSize &value); - void setDeckEditorPrintingSelectorSize(const QSize &value); - void setDeckEditorFilterSize(const QSize &value); + void setDeckEditorWidgetSize(const QString &widgetName, const QSize &value); + + void setVisualDeckEditorLayoutState(const QByteArray &value); + void setVisualDeckEditorGeometry(const QByteArray &value); + void setVisualDeckEditorWidgetSize(const QString &widgetName, const QSize &value); + void setDeckEditorDbHeaderState(const QByteArray &value); void setSetsDialogHeaderState(const QByteArray &value); + void setSetsDialogGeometry(const QByteArray &value); + void setTokenDialogGeometry(const QByteArray &value); void setGamePlayAreaGeometry(const QByteArray &value); void setGamePlayAreaState(const QByteArray &value); - void setGameCardInfoSize(const QSize &value); - void setGameMessageLayoutSize(const QSize &value); - void setGamePlayerListSize(const QSize &value); + void setGamePlayAreaWidgetSize(const QString &widgetName, const QSize &value); void setReplayPlayAreaGeometry(const QByteArray &value); void setReplayPlayAreaState(const QByteArray &value); - void setReplayCardInfoSize(const QSize &value); - void setReplayMessageLayoutSize(const QSize &value); - void setReplayPlayerListSize(const QSize &value); - void setReplayReplaySize(const QSize &value); + void setReplayPlayAreaWidgetSize(const QString &widgetName, const QSize &value); - const QByteArray getDeckEditorLayoutState(); - const QByteArray getDeckEditorGeometry(); - QSize getDeckEditorCardDatabaseSize(); - QSize getDeckEditorCardSize(); - QSize getDeckEditorDeckSize(); - QSize getDeckEditorPrintingSelectorSize(); - QSize getDeckEditorFilterSize(); - const QByteArray getDeckEditorDbHeaderState(); - const QByteArray getSetsDialogHeaderState(); + QByteArray getMainWindowGeometry(); - const QByteArray getGamePlayAreaLayoutState(); - const QByteArray getGamePlayAreaGeometry(); - const QSize getGameCardInfoSize(); - const QSize getGameMessageLayoutSize(); - const QSize getGamePlayerListSize(); + QByteArray getDeckEditorLayoutState(); + QByteArray getDeckEditorGeometry(); + QSize getDeckEditorWidgetSize(const QString &widgetName, const QSize &defaultValue = {}); - const QByteArray getReplayPlayAreaLayoutState(); - const QByteArray getReplayPlayAreaGeometry(); - const QSize getReplayCardInfoSize(); - const QSize getReplayMessageLayoutSize(); - const QSize getReplayPlayerListSize(); - const QSize getReplayReplaySize(); + QByteArray getVisualDeckEditorLayoutState(); + QByteArray getVisualDeckEditorGeometry(); + QSize getVisualDeckEditorWidgetSize(const QString &widgetName, const QSize &defaultValue = {}); + + QByteArray getDeckEditorDbHeaderState(); + QByteArray getSetsDialogHeaderState(); + QByteArray getSetsDialogGeometry(); + QByteArray getTokenDialogGeometry(); + + QByteArray getGamePlayAreaLayoutState(); + QByteArray getGamePlayAreaGeometry(); + QSize getGamePlayAreaWidgetSize(const QString &widgetName, const QSize &defaultValue = {}); + + QByteArray getReplayPlayAreaLayoutState(); + QByteArray getReplayPlayAreaGeometry(); + QSize getReplayPlayAreaWidgetSize(const QString &widgetName, const QSize &defaultValue = {}); signals: public slots: diff --git a/oracle/src/oracleimporter.cpp b/oracle/src/oracleimporter.cpp index 4b089846f..d585842f6 100644 --- a/oracle/src/oracleimporter.cpp +++ b/oracle/src/oracleimporter.cpp @@ -1,6 +1,5 @@ #include "oracleimporter.h" -#include "client/settings/cache_settings.h" #include "libcockatrice/interfaces/noop_card_preference_provider.h" #include "libcockatrice/interfaces/noop_card_set_priority_controller.h" #include "parsehelpers.h" diff --git a/oracle/src/oraclewizard.cpp b/oracle/src/oraclewizard.cpp index 46e4722c6..9d32a993b 100644 --- a/oracle/src/oraclewizard.cpp +++ b/oracle/src/oraclewizard.cpp @@ -21,7 +21,14 @@ OracleWizard::OracleWizard(QWidget *parent) : QWizard(parent) // define a dummy context that will be used where needed QString dummy = QT_TRANSLATE_NOOP("i18n", "English"); - settings = new QSettings(SettingsCache::instance().getSettingsPath() + "global.ini", QSettings::IniFormat, this); + QString oracleSettingsFile = SettingsCache::instance().getSettingsPath() + "oracle.ini"; + settings = new QSettings(oracleSettingsFile, QSettings::IniFormat, this); + + // We moved the oracle-specific settings from global.ini to a separate oracle.ini after 2.10 + if (!QFile::exists(oracleSettingsFile)) { + migrateOracleSettings(); + } + connect(&SettingsCache::instance(), &SettingsCache::langChanged, this, &OracleWizard::updateLanguage); importer = new OracleImporter(this); @@ -50,6 +57,26 @@ OracleWizard::OracleWizard(QWidget *parent) : QWizard(parent) retranslateUi(); } +/** + * Migrates the oracle-specific settings from global.ini to oracle.ini + */ +void OracleWizard::migrateOracleSettings() +{ + QString filePath = SettingsCache::instance().getSettingsPath() + "global.ini"; + auto globalSettings = QSettings(filePath, QSettings::IniFormat, this); + + auto tryMigrateValue = [this, &globalSettings](const QString &name) { + QVariant variant = globalSettings.value(name); + if (variant.isValid()) { + settings->setValue(name, variant.toString()); + } + }; + + tryMigrateValue("allsetsurl"); + tryMigrateValue("tokensurl"); + tryMigrateValue("spoilersurl"); +} + void OracleWizard::updateLanguage() { qApp->removeTranslator(translator); diff --git a/oracle/src/oraclewizard.h b/oracle/src/oraclewizard.h index c913094e3..78427175c 100644 --- a/oracle/src/oraclewizard.h +++ b/oracle/src/oraclewizard.h @@ -75,6 +75,8 @@ private: QString cardSourceUrl; QString cardSourceVersion; + void migrateOracleSettings(); + protected: void changeEvent(QEvent *event) override; }; diff --git a/oracle/translations/oracle_fr.ts b/oracle/translations/oracle_fr.ts index 7f43ad140..d43dfa9f3 100644 --- a/oracle/translations/oracle_fr.ts +++ b/oracle/translations/oracle_fr.ts @@ -172,7 +172,7 @@ spoiler - + spoiler @@ -192,7 +192,7 @@ Local file: - + Fichier local: @@ -202,7 +202,7 @@ Choose file... - + Choisissez un fichier... @@ -230,7 +230,7 @@ tokens - + jetons @@ -250,7 +250,7 @@ Local file: - + Ficher local: @@ -260,7 +260,7 @@ Choose file... - + Choisissez un ficher... @@ -391,12 +391,12 @@ Load %1 file - + Chargez le fichier %1 %1 file (%1) - + fichier %1 (%1) @@ -420,12 +420,12 @@ Please choose a file. - + Merci de choisir un fichier. Cannot open file '%1'. - + Le fichier '%1' ne peut pas ĂȘtre ouvert. diff --git a/webclient/package-lock.json b/webclient/package-lock.json index b5d961a75..6b12b4ad6 100644 --- a/webclient/package-lock.json +++ b/webclient/package-lock.json @@ -4866,9 +4866,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==" + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" }, "node_modules/@types/express": { "version": "4.17.14", @@ -5641,9 +5641,9 @@ } }, "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "bin": { "acorn": "bin/acorn" }, @@ -5671,6 +5671,17 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -6344,6 +6355,14 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -6481,9 +6500,9 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "node_modules/browserslist": { - "version": "4.24.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", - "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "funding": [ { "type": "opencollective", @@ -6499,10 +6518,11 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001716", - "electron-to-chromium": "^1.5.149", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -6609,9 +6629,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001718", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", - "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", + "version": "1.0.30001769", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", + "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", "funding": [ { "type": "opencollective", @@ -7849,9 +7869,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.155", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.155.tgz", - "integrity": "sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==" + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==" }, "node_modules/emittery": { "version": "0.8.1", @@ -7886,12 +7906,12 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "tapable": "^2.3.0" }, "engines": { "node": ">=10.13.0" @@ -8002,9 +8022,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==" }, "node_modules/es-shim-unscopables": { "version": "1.0.0", @@ -14383,11 +14403,15 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "engines": { "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/loader-utils": { @@ -14815,9 +14839,9 @@ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -18747,11 +18771,15 @@ } }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/temp-dir": { @@ -18823,9 +18851,9 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", + "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", @@ -19208,9 +19236,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -19367,9 +19395,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -19395,34 +19423,35 @@ } }, "node_modules/webpack": { - "version": "5.99.9", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz", - "integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==", + "version": "5.105.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz", + "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", "dependencies": { "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", + "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.19.0", + "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", + "loader-runner": "^4.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^4.3.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" @@ -19670,9 +19699,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "engines": { "node": ">=10.13.0" } @@ -19709,9 +19738,9 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/webpack/node_modules/schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -23591,9 +23620,9 @@ } }, "@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==" + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" }, "@types/express": { "version": "4.17.14", @@ -24245,9 +24274,9 @@ } }, "acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==" + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==" }, "acorn-globals": { "version": "6.0.0", @@ -24265,6 +24294,11 @@ } } }, + "acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==" + }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -24752,6 +24786,11 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==" + }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -24869,14 +24908,15 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "browserslist": { - "version": "4.24.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", - "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "requires": { - "caniuse-lite": "^1.0.30001716", - "electron-to-chromium": "^1.5.149", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" } }, "bser": { @@ -24950,9 +24990,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001718", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", - "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==" + "version": "1.0.30001769", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", + "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==" }, "case-sensitive-paths-webpack-plugin": { "version": "2.4.0", @@ -25843,9 +25883,9 @@ } }, "electron-to-chromium": { - "version": "1.5.155", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.155.tgz", - "integrity": "sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==" + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==" }, "emittery": { "version": "0.8.1", @@ -25868,12 +25908,12 @@ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" }, "enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", "requires": { "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "tapable": "^2.3.0" } }, "entities": { @@ -25963,9 +26003,9 @@ } }, "es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==" }, "es-shim-unscopables": { "version": "1.0.0", @@ -30636,9 +30676,9 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==" }, "loader-utils": { "version": "2.0.4", @@ -30953,9 +30993,9 @@ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, "node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==" }, "normalize-path": { "version": "3.0.0", @@ -33582,9 +33622,9 @@ } }, "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==" }, "temp-dir": { "version": "2.0.0", @@ -33637,9 +33677,9 @@ } }, "terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", + "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", "requires": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", @@ -33910,9 +33950,9 @@ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" }, "update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "requires": { "escalade": "^3.2.0", "picocolors": "^1.1.1" @@ -34023,9 +34063,9 @@ } }, "watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", "requires": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -34045,34 +34085,35 @@ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" }, "webpack": { - "version": "5.99.9", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz", - "integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==", + "version": "5.105.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz", + "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", "requires": { "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", + "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.19.0", + "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", + "loader-runner": "^4.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^4.3.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.3" }, "dependencies": { "ajv": { @@ -34100,9 +34141,9 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "requires": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -34265,9 +34306,9 @@ } }, "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==" }, "websocket-driver": { "version": "0.7.4",