diff --git a/src/advanced-scene-switcher.cpp b/src/advanced-scene-switcher.cpp index 6c396b2e..794d2ce6 100644 --- a/src/advanced-scene-switcher.cpp +++ b/src/advanced-scene-switcher.cpp @@ -699,6 +699,21 @@ void LoadPlugins() } } +void OpenSettingsWindow() +{ + if (switcher->settingsWindowOpened) { + AdvSceneSwitcher::window->show(); + AdvSceneSwitcher::window->raise(); + AdvSceneSwitcher::window->activateWindow(); + } else { + AdvSceneSwitcher::window = + new AdvSceneSwitcher(static_cast( + obs_frontend_get_main_window())); + AdvSceneSwitcher::window->setAttribute(Qt::WA_DeleteOnClose); + AdvSceneSwitcher::window->show(); + } +} + extern "C" void InitSceneSwitcher(obs_module_t *m, translateFunc t) { blog(LOG_INFO, "version: %s", g_GIT_TAG); @@ -712,25 +727,10 @@ extern "C" void InitSceneSwitcher(obs_module_t *m, translateFunc t) LoadPlugins(); SetupDock(); - auto cb = []() { - if (switcher->settingsWindowOpened) { - AdvSceneSwitcher::window->show(); - AdvSceneSwitcher::window->raise(); - AdvSceneSwitcher::window->activateWindow(); - } else { - AdvSceneSwitcher::window = - new AdvSceneSwitcher(static_cast( - obs_frontend_get_main_window())); - AdvSceneSwitcher::window->setAttribute( - Qt::WA_DeleteOnClose); - AdvSceneSwitcher::window->show(); - } - }; - obs_frontend_add_save_callback(SaveSceneSwitcher, nullptr); obs_frontend_add_event_callback(OBSEvent, switcher); QAction *action = (QAction *)obs_frontend_add_tools_menu_qaction( obs_module_text("AdvSceneSwitcher.pluginName")); - action->connect(action, &QAction::triggered, cb); + action->connect(action, &QAction::triggered, OpenSettingsWindow); } diff --git a/src/advanced-scene-switcher.hpp b/src/advanced-scene-switcher.hpp index a5869540..3b9395cc 100644 --- a/src/advanced-scene-switcher.hpp +++ b/src/advanced-scene-switcher.hpp @@ -314,10 +314,11 @@ private: int currentActionIdx = -1; }; +void OpenSettingsWindow(); + /****************************************************************************** * Sceneswitch helper ******************************************************************************/ - void setNextTransition(const sceneSwitchInfo &ssi, obs_source_t *currentSource, transitionData &td); void overwriteTransitionOverride(const sceneSwitchInfo &ssi, diff --git a/src/status-control.cpp b/src/status-control.cpp index 55373a67..dbfa7b87 100644 --- a/src/status-control.cpp +++ b/src/status-control.cpp @@ -98,21 +98,46 @@ void StatusControl::SetStopped() _setToStopped = true; } -StatusDock::StatusDock(QWidget *parent) - : QDockWidget(obs_module_text("AdvSceneSwitcher.windowTitle"), parent) +#include + +StatusDock::StatusDock(QWidget *parent) : OBSDock(parent) { - setFloating(true); + setWindowTitle(obs_module_text("AdvSceneSwitcher.windowTitle")); + setFeatures(DockWidgetClosable | DockWidgetMovable | + DockWidgetFloatable); // Setting a fixed object name is crucial for OBS to be able to restore // the docks position, if the dock is not floating setObjectName("Adv-ss-dock"); - // Not sure why an extra QWidget wrapper is necessary... - // without it the dock widget seems to be partially transparent. - QWidget *tmp = new QWidget; - QHBoxLayout *layout = new QHBoxLayout; + QAction *action = new QAction; + action->setProperty("themeID", QVariant(QString::fromUtf8("cogsIcon"))); + action->connect(action, &QAction::triggered, OpenSettingsWindow); + QIcon icon; + icon.addFile( + QString::fromUtf8(":/settings/images/settings/advanced.svg"), + QSize(), QIcon::Normal, QIcon::Off); + action->setIcon(icon); + + auto toolLayout = new QBoxLayout(QBoxLayout::TopToBottom, this); + toolLayout->setContentsMargins(0, 0, 0, 0); + auto toolbar = new QToolBar; + toolbar->setIconSize({16, 16}); + toolbar->setFloatable(false); + toolbar->addAction(action); + toolLayout->addWidget(toolbar); + + QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(new StatusControl(this)); - tmp->setLayout(layout); - setWidget(tmp); + layout->setContentsMargins(0, 0, 0, 0); + layout->addLayout(toolLayout); + + // QFrame wrapper is necessary to avoid dock being partially + // transparent + QFrame *wrapper = new QFrame; + wrapper->setFrameShape(QFrame::StyledPanel); + wrapper->setFrameShadow(QFrame::Sunken); + wrapper->setLayout(layout); + setWidget(wrapper); } void SetupDock() diff --git a/src/status-control.hpp b/src/status-control.hpp index a2487fd9..191420b7 100644 --- a/src/status-control.hpp +++ b/src/status-control.hpp @@ -31,7 +31,15 @@ private: bool _setToStopped = true; }; -class StatusDock : public QDockWidget { +// Only used to enable applying "OBSDock" stylesheet +class OBSDock : public QDockWidget { + Q_OBJECT + +public: + inline OBSDock(QWidget *parent = nullptr) : QDockWidget(parent) {} +}; + +class StatusDock : public OBSDock { Q_OBJECT public: