From 3417fc54071ef8a150246a772766e70038ea8203 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sun, 2 Jan 2022 04:08:02 +0100 Subject: [PATCH] Add status dock --- CMakeLists.txt | 2 + src/advanced-scene-switcher.cpp | 10 +++- src/general.cpp | 9 ++-- src/headers/status-dock.hpp | 30 +++++++++++ src/headers/utility.hpp | 1 + src/status-dock.cpp | 91 +++++++++++++++++++++++++++++++++ src/utility.cpp | 6 +++ 7 files changed, 141 insertions(+), 8 deletions(-) create mode 100644 src/headers/status-dock.hpp create mode 100644 src/status-dock.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 74e70d80..383877d5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -256,6 +256,7 @@ set(advanced-scene-switcher_HEADERS src/headers/duration-control.hpp src/headers/file-selection.hpp src/headers/section.hpp + src/headers/status-dock.hpp src/headers/platform-funcs.hpp src/headers/utility.hpp src/headers/volume-control.hpp @@ -353,6 +354,7 @@ set(advanced-scene-switcher_SOURCES src/transition-selection.cpp src/name-dialog.cpp src/duration-control.cpp + src/status-dock.cpp src/section.cpp src/utility.cpp src/volume-control.cpp diff --git a/src/advanced-scene-switcher.cpp b/src/advanced-scene-switcher.cpp index 4ed7603d..fcf5c403 100644 --- a/src/advanced-scene-switcher.cpp +++ b/src/advanced-scene-switcher.cpp @@ -8,6 +8,7 @@ #include #include "headers/advanced-scene-switcher.hpp" +#include "headers/status-dock.hpp" #include "headers/curl-helper.hpp" #include "headers/utility.hpp" #include "headers/version.h" @@ -635,14 +636,19 @@ extern "C" void InitSceneSwitcher() PlatformInit(); + dock = new StatusDock( + static_cast(obs_frontend_get_main_window())); + obs_frontend_add_dock(dock); + auto cb = []() { if (switcher->settingsWindowOpened) { ssWindow->show(); ssWindow->raise(); ssWindow->activateWindow(); } else { - ssWindow = new AdvSceneSwitcher( - (QMainWindow *)obs_frontend_get_main_window()); + ssWindow = + new AdvSceneSwitcher(static_cast( + obs_frontend_get_main_window())); ssWindow->setAttribute(Qt::WA_DeleteOnClose); ssWindow->show(); } diff --git a/src/general.cpp b/src/general.cpp index 9d9c2ae2..4e5be840 100644 --- a/src/general.cpp +++ b/src/general.cpp @@ -1,9 +1,9 @@ #include "headers/advanced-scene-switcher.hpp" +#include "headers/status-dock.hpp" #include "headers/utility.hpp" #include "headers/version.h" #include -#include #include QMetaObject::Connection inactivePluse; @@ -436,11 +436,6 @@ void AdvSceneSwitcher::setTabOrder() connect(bar, &QTabBar::tabMoved, this, &AdvSceneSwitcher::on_tabMoved); } -bool windowPosValid(QPoint pos) -{ - return !!QGuiApplication::screenAt(pos); -} - void AdvSceneSwitcher::restoreWindowGeo() { if (switcher->saveWindowGeo && windowPosValid(switcher->windowPos)) { @@ -492,6 +487,7 @@ void SwitcherData::loadSettings(obs_data_t *obj) loadSceneTriggers(obj); loadGeneralSettings(obj); loadHotkeys(obj); + loadDock(obj); } void SwitcherData::saveSettings(obs_data_t *obj) @@ -522,6 +518,7 @@ void SwitcherData::saveSettings(obs_data_t *obj) saveSceneTriggers(obj); saveGeneralSettings(obj); saveHotkeys(obj); + saveDock(obj); saveVersion(obj, g_GIT_SHA1); } diff --git a/src/headers/status-dock.hpp b/src/headers/status-dock.hpp new file mode 100644 index 00000000..dca96d8f --- /dev/null +++ b/src/headers/status-dock.hpp @@ -0,0 +1,30 @@ +#pragma once +#include +#include +#include +#include +#include + +class StatusDock : public QDockWidget { + Q_OBJECT + +public: + StatusDock(QWidget *parent = 0); + +private slots: + void ButtonClicked(); + void UpdateStatus(); + +private: + void SetStopped(); + void SetStarted(); + + QPushButton *_button; + QLabel *_status; + QTimer _timer; +}; + +extern StatusDock *dock; + +void saveDock(obs_data_t *obj); +void loadDock(obs_data_t *obj); diff --git a/src/headers/utility.hpp b/src/headers/utility.hpp index bb52ab24..2c7d6d32 100644 --- a/src/headers/utility.hpp +++ b/src/headers/utility.hpp @@ -82,3 +82,4 @@ void populateSceneItemSelection(QComboBox *list, OBSWeakSource sceneWeakSource = nullptr); void populateSceneItemSelection(QComboBox *list, SceneSelection &s); void populateSourceGroupSelection(QComboBox *list); +bool windowPosValid(QPoint pos); diff --git a/src/status-dock.cpp b/src/status-dock.cpp new file mode 100644 index 00000000..9f2086b1 --- /dev/null +++ b/src/status-dock.cpp @@ -0,0 +1,91 @@ +#include "headers/status-dock.hpp" +#include "headers/advanced-scene-switcher.hpp" +#include "headers/utility.hpp" + +#include +#include +#include + +StatusDock *dock = nullptr; + +StatusDock::StatusDock(QWidget *parent) + : QDockWidget(obs_module_text("AdvSceneSwitcher.windowTitle"), parent) +{ + _button = new QPushButton( + obs_module_text("AdvSceneSwitcher.generalTab.status.start")); + _status = + new QLabel(obs_module_text("AdvSceneSwitcher.status.inactive")); + QWidget::connect(_button, SIGNAL(clicked()), this, + SLOT(ButtonClicked())); + QHBoxLayout *statusLayout = new QHBoxLayout; + statusLayout->addWidget(new QLabel(obs_module_text( + "AdvSceneSwitcher.generalTab.status.currentStatus"))); + statusLayout->addWidget(_status); + QVBoxLayout *layout = new QVBoxLayout; + layout->addLayout(statusLayout); + layout->addWidget(_button); + layout->addStretch(); + QWidget *tmp = new QWidget; + tmp->setLayout(layout); + setWidget(tmp); + connect(&_timer, SIGNAL(timeout()), this, SLOT(UpdateStatus())); + _timer.start(1000); +} + +void StatusDock::ButtonClicked() +{ + if (switcher->th && switcher->th->isRunning()) { + switcher->Stop(); + SetStopped(); + } else { + switcher->Start(); + SetStarted(); + } +} + +void StatusDock::UpdateStatus() +{ + if (switcher->th && switcher->th->isRunning()) { + SetStopped(); + } else { + SetStarted(); + } +} + +void StatusDock::SetStopped() +{ + _button->setText( + obs_module_text("AdvSceneSwitcher.generalTab.status.stop")); + _status->setText(obs_module_text("AdvSceneSwitcher.status.active")); +} + +void StatusDock::SetStarted() +{ + _button->setText( + obs_module_text("AdvSceneSwitcher.generalTab.status.start")); + _status->setText(obs_module_text("AdvSceneSwitcher.status.inactive")); +} + +void saveDock(obs_data_t *obj) +{ + obs_data_set_bool(obj, "statusDockVisible", dock->isVisible()); + obs_data_set_bool(obj, "statusDockFloating", dock->isFloating()); + obs_data_set_int(obj, "statusDockPosX", dock->pos().x()); + obs_data_set_int(obj, "statusDockPosY", dock->pos().y()); + obs_data_set_int(obj, "statusDockPosWidth", dock->width()); + obs_data_set_int(obj, "statusDockPosHeight", dock->height()); +} + +void loadDock(obs_data_t *obj) +{ + dock->setVisible(obs_data_get_bool(obj, "statusDockVisible")); + dock->setFloating(obs_data_get_bool(obj, "statusDockFloating")); + QPoint pos = { + static_cast(obs_data_get_int(obj, "statusDockPosX")), + static_cast(obs_data_get_int(obj, "statusDockPosY"))}; + if (windowPosValid(pos)) { + dock->resize(obs_data_get_int(obj, "statusDockPosWidth"), + obs_data_get_int(obj, "statusDockPosHeight")); + dock->move(pos); + } +} diff --git a/src/utility.cpp b/src/utility.cpp index 88608677..d324b4c4 100644 --- a/src/utility.cpp +++ b/src/utility.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -874,6 +875,11 @@ void populateSourceGroupSelection(QComboBox *list) list->setCurrentIndex(0); } +bool windowPosValid(QPoint pos) +{ + return !!QGuiApplication::screenAt(pos); +} + QMetaObject::Connection PulseWidget(QWidget *widget, QColor startColor, QColor endColor, QString specifier, bool once)