diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index c6d962ffb..54e61ed77 100644 --- a/cockatrice/CMakeLists.txt +++ b/cockatrice/CMakeLists.txt @@ -227,6 +227,8 @@ set(cockatrice_SOURCES src/interface/widgets/utility/custom_line_edit.cpp src/interface/widgets/utility/get_text_with_max.cpp src/interface/widgets/utility/sequence_edit.cpp + src/interface/widgets/utility/visibility_change_listener.cpp + src/interface/widgets/utility/visibility_change_listener.h src/interface/widgets/visual_database_display/visual_database_display_color_filter_widget.cpp src/interface/widgets/visual_database_display/visual_database_display_filter_save_load_widget.cpp src/interface/widgets/visual_database_display/visual_database_display_filter_toolbar_widget.cpp 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 5e6db71f3..c20eb650d 100644 --- a/cockatrice/src/interface/widgets/tabs/abstract_tab_deck_editor.cpp +++ b/cockatrice/src/interface/widgets/tabs/abstract_tab_deck_editor.cpp @@ -18,6 +18,7 @@ #include "../interface/widgets/dialogs/dlg_load_deck.h" #include "../interface/widgets/dialogs/dlg_load_deck_from_clipboard.h" #include "../interface/widgets/dialogs/dlg_load_deck_from_website.h" +#include "../utility/visibility_change_listener.h" #include "tab_supervisor.h" #include @@ -100,7 +101,9 @@ void AbstractTabDeckEditor::registerDockWidget(QMenu *_viewMenu, QDockWidget *wi [aFloating](bool topLevel) { aFloating->setChecked(topLevel); }); // sync aVisible with dockWidget's visible state - widget->installEventFilter(new DockWidgetVisibilityFilter(widget, aVisible)); + auto filter = new VisibilityChangeListener(widget); + connect(filter, &VisibilityChangeListener::visibilityChanged, aVisible, + [aVisible](bool visible) { aVisible->setChecked(visible); }); dockToActions.insert(widget, {menu, aVisible, aFloating}); } @@ -608,22 +611,3 @@ bool AbstractTabDeckEditor::closeRequest() return false; return close(); } - -DockWidgetVisibilityFilter::DockWidgetVisibilityFilter(QDockWidget *dockWidget, QAction *aVisible) - : QObject(dockWidget), dockWidget(dockWidget), aVisible(aVisible) -{ -} - -bool DockWidgetVisibilityFilter::eventFilter(QObject *o, QEvent *e) -{ - if (o == dockWidget && !e->spontaneous()) { - if (e->type() == QEvent::Show) { - aVisible->setChecked(true); - } - - if (e->type() == QEvent::Hide) { - aVisible->setChecked(false); - } - } - return false; -} \ No newline at end of file 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 eb0b3755c..9c62a5c93 100644 --- a/cockatrice/src/interface/widgets/tabs/abstract_tab_deck_editor.h +++ b/cockatrice/src/interface/widgets/tabs/abstract_tab_deck_editor.h @@ -307,19 +307,4 @@ protected: QMap dockToActions; }; -/** - * This filter syncs the dock widget's visibility with the viewMenu visibility action's check state. - */ -class DockWidgetVisibilityFilter : public QObject -{ - Q_OBJECT - - QDockWidget *dockWidget; - QAction *aVisible; - -public: - explicit DockWidgetVisibilityFilter(QDockWidget *dockWidget, QAction *aVisible); - bool eventFilter(QObject *o, QEvent *e) override; -}; - #endif // TAB_GENERIC_DECK_EDITOR_H diff --git a/cockatrice/src/interface/widgets/utility/visibility_change_listener.cpp b/cockatrice/src/interface/widgets/utility/visibility_change_listener.cpp new file mode 100644 index 000000000..38696f775 --- /dev/null +++ b/cockatrice/src/interface/widgets/utility/visibility_change_listener.cpp @@ -0,0 +1,26 @@ +#include "visibility_change_listener.h" + +#include +#include + +VisibilityChangeListener::VisibilityChangeListener(QWidget *targetWidget) + : QObject(targetWidget), targetWidget(targetWidget) +{ + if (targetWidget) { + targetWidget->installEventFilter(this); + } +} + +bool VisibilityChangeListener::eventFilter(QObject *o, QEvent *e) +{ + if (o == targetWidget && !e->spontaneous()) { + if (e->type() == QEvent::Show) { + emit visibilityChanged(true); + } + + if (e->type() == QEvent::Hide) { + emit visibilityChanged(false); + } + } + return false; +} \ No newline at end of file diff --git a/cockatrice/src/interface/widgets/utility/visibility_change_listener.h b/cockatrice/src/interface/widgets/utility/visibility_change_listener.h new file mode 100644 index 000000000..10928caf6 --- /dev/null +++ b/cockatrice/src/interface/widgets/utility/visibility_change_listener.h @@ -0,0 +1,35 @@ +#ifndef COCKATRICE_VISIBILITY_LISTENER_H +#define COCKATRICE_VISIBILITY_LISTENER_H + +#include + +/** + * @brief This filter listens to the visibility changes of a target widget, emitting signals whenever the visibility of + * that widget changes. + */ +class VisibilityChangeListener : public QObject +{ + Q_OBJECT + + QWidget *targetWidget; + +public: + /** + * Creates a new instance of this class, watching the targetWidget. + * This class automatically installs itself as an eventFilter to the targetWidget. + * + * @param targetWidget The widget to watch. Sets that widget as this object's parent. + */ + explicit VisibilityChangeListener(QWidget *targetWidget); + + bool eventFilter(QObject *o, QEvent *e) override; + +signals: + /** + * Emitted whenever the target widget's visibility changes + * @param visible The widget's new visibility + */ + void visibilityChanged(bool visible); +}; + +#endif // COCKATRICE_VISIBILITY_LISTENER_H