From c281c6db837b3c2c7eff15d195cf43cdee9030c3 Mon Sep 17 00:00:00 2001 From: WarmUpTill <19472752+WarmUpTill@users.noreply.github.com> Date: Wed, 21 May 2025 13:05:31 +0200 Subject: [PATCH] Add WindowSelectionWidget Refreshes list of windows when widget becomes visible to support widget caching --- plugins/base/CMakeLists.txt | 4 +++- plugins/base/macro-action-window.cpp | 6 +----- plugins/base/macro-action-window.hpp | 3 ++- plugins/base/macro-condition-window.cpp | 8 +------- plugins/base/macro-condition-window.hpp | 3 ++- plugins/base/utils/window-selection.cpp | 25 +++++++++++++++++++++++++ plugins/base/utils/window-selection.hpp | 16 ++++++++++++++++ 7 files changed, 50 insertions(+), 15 deletions(-) create mode 100644 plugins/base/utils/window-selection.cpp create mode 100644 plugins/base/utils/window-selection.hpp diff --git a/plugins/base/CMakeLists.txt b/plugins/base/CMakeLists.txt index 47216a46..5589458d 100644 --- a/plugins/base/CMakeLists.txt +++ b/plugins/base/CMakeLists.txt @@ -181,7 +181,9 @@ target_sources( utils/websocket-helpers.cpp utils/websocket-helpers.hpp utils/websocket-tab.cpp - utils/websocket-tab.hpp) + utils/websocket-tab.hpp + utils/window-selection.cpp + utils/window-selection.hpp) if(OS_WINDOWS) target_sources(${PROJECT_NAME} PRIVATE utils/windows/windows.cpp) diff --git a/plugins/base/macro-action-window.cpp b/plugins/base/macro-action-window.cpp index 178fa2f3..a598dfc2 100644 --- a/plugins/base/macro-action-window.cpp +++ b/plugins/base/macro-action-window.cpp @@ -163,16 +163,12 @@ MacroActionWindowEdit::MacroActionWindowEdit( QWidget *parent, std::shared_ptr entryData) : QWidget(parent), _actions(new QComboBox()), - _windows(new QComboBox()), + _windows(new WindowSelectionWidget(this)), _regex(new RegexConfigWidget(this)), _infoLayout(new QHBoxLayout()) { populateActionSelection(_actions); - _windows->setEditable(true); - _windows->setMaxVisibleItems(20); - PopulateWindowSelection(_windows); - auto focusLimitation = new QLabel(obs_module_text( "AdvSceneSwitcher.action.window.type.setFocusWindow.limitation")); _infoLayout->addWidget(focusLimitation); diff --git a/plugins/base/macro-action-window.hpp b/plugins/base/macro-action-window.hpp index cfacb2a4..c0442306 100644 --- a/plugins/base/macro-action-window.hpp +++ b/plugins/base/macro-action-window.hpp @@ -2,6 +2,7 @@ #include "macro-action-edit.hpp" #include "regex-config.hpp" #include "variable-string.hpp" +#include "window-selection.hpp" namespace advss { @@ -62,7 +63,7 @@ private: void SetWidgetVisibility(); QComboBox *_actions; - QComboBox *_windows; + WindowSelectionWidget *_windows; RegexConfigWidget *_regex; QHBoxLayout *_infoLayout; diff --git a/plugins/base/macro-condition-window.cpp b/plugins/base/macro-condition-window.cpp index 5fe84d07..ac9f198d 100644 --- a/plugins/base/macro-condition-window.cpp +++ b/plugins/base/macro-condition-window.cpp @@ -2,7 +2,6 @@ #include "layout-helpers.hpp" #include "plugin-state-helpers.hpp" #include "platform-funcs.hpp" -#include "selection-helpers.hpp" #include @@ -193,7 +192,7 @@ void MacroConditionWindow::SetupTempVars() MacroConditionWindowEdit::MacroConditionWindowEdit( QWidget *parent, std::shared_ptr entryData) : QWidget(parent), - _windowSelection(new QComboBox()), + _windowSelection(new WindowSelectionWidget(this)), _windowRegex(new RegexConfigWidget(this)), _checkTitle(new QCheckBox()), _fullscreen(new QCheckBox()), @@ -206,9 +205,6 @@ MacroConditionWindowEdit::MacroConditionWindowEdit( _focusWindow(new QLabel()), _currentFocusLayout(new QHBoxLayout()) { - _windowSelection->setEditable(true); - _windowSelection->setMaxVisibleItems(20); - _checkText->setToolTip(obs_module_text( "AdvSceneSwitcher.condition.window.entry.text.note")); _text->setToolTip(obs_module_text( @@ -240,8 +236,6 @@ MacroConditionWindowEdit::MacroConditionWindowEdit( QWidget::connect(&_timer, SIGNAL(timeout()), this, SLOT(UpdateFocusWindow())); - PopulateWindowSelection(_windowSelection); - const std::unordered_map widgetPlaceholders = { {"{{windows}}", _windowSelection}, {"{{windowRegex}}", _windowRegex}, diff --git a/plugins/base/macro-condition-window.hpp b/plugins/base/macro-condition-window.hpp index 1e2e0b24..704e3695 100644 --- a/plugins/base/macro-condition-window.hpp +++ b/plugins/base/macro-condition-window.hpp @@ -2,6 +2,7 @@ #include "macro-condition-edit.hpp" #include "variable-text-edit.hpp" #include "regex-config.hpp" +#include "window-selection.hpp" #include #include @@ -77,7 +78,7 @@ signals: void HeaderInfoChanged(const QString &); protected: - QComboBox *_windowSelection; + WindowSelectionWidget *_windowSelection; RegexConfigWidget *_windowRegex; QCheckBox *_checkTitle; QCheckBox *_fullscreen; diff --git a/plugins/base/utils/window-selection.cpp b/plugins/base/utils/window-selection.cpp new file mode 100644 index 00000000..0ea1916a --- /dev/null +++ b/plugins/base/utils/window-selection.cpp @@ -0,0 +1,25 @@ +#include "window-selection.hpp" +#include "selection-helpers.hpp" + +namespace advss { + +WindowSelectionWidget::WindowSelectionWidget(QWidget *parent) + : FilterComboBox(parent) +{ + setEditable(true); + SetAllowUnmatchedSelection(true); + setMaxVisibleItems(20); + PopulateWindowSelection(this); +} + +void WindowSelectionWidget::showEvent(QShowEvent *event) +{ + FilterComboBox::showEvent(event); + const QSignalBlocker b(this); + const auto text = currentText(); + clear(); + PopulateWindowSelection(this); + setCurrentText(text); +} + +} // namespace advss diff --git a/plugins/base/utils/window-selection.hpp b/plugins/base/utils/window-selection.hpp new file mode 100644 index 00000000..ee6fda43 --- /dev/null +++ b/plugins/base/utils/window-selection.hpp @@ -0,0 +1,16 @@ +#pragma once +#include "filter-combo-box.hpp" + +namespace advss { + +class WindowSelectionWidget : public FilterComboBox { + Q_OBJECT + +public: + WindowSelectionWidget(QWidget *parent); + +protected: + void showEvent(QShowEvent *event) override; +}; + +} // namespace advss