From cf5f3389027cd04c51d739a9b581e36d42db0020 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sun, 21 Jan 2024 00:08:06 +0100 Subject: [PATCH] Split utility headers --- CMakeLists.txt | 10 + lib/advanced-scene-switcher.cpp | 23 +- lib/general.cpp | 6 + lib/legacy/scene-group.cpp | 15 +- lib/legacy/scene-trigger.cpp | 5 + lib/legacy/switch-audio.cpp | 6 +- lib/legacy/switch-executable.cpp | 5 +- lib/legacy/switch-file.cpp | 6 +- lib/legacy/switch-generic.cpp | 3 +- lib/legacy/switch-idle.cpp | 6 +- lib/legacy/switch-media.cpp | 4 + lib/legacy/switch-network.cpp | 13 +- lib/legacy/switch-pause.cpp | 4 + lib/legacy/switch-random.cpp | 2 + lib/legacy/switch-screen-region.cpp | 4 + lib/legacy/switch-sequence.cpp | 5 + lib/legacy/switch-time.cpp | 2 + lib/legacy/switch-transitions.cpp | 5 + lib/legacy/switch-video.cpp | 6 +- lib/legacy/switch-window.cpp | 5 +- lib/macro/macro-action-edit.cpp | 7 +- lib/macro/macro-action-macro.cpp | 2 +- lib/macro/macro-action-queue.cpp | 2 +- lib/macro/macro-action-variable.cpp | 6 +- lib/macro/macro-condition-edit.cpp | 5 +- lib/macro/macro-condition-macro.cpp | 4 +- lib/macro/macro-condition-queue.cpp | 2 +- lib/macro/macro-condition-tempvar.cpp | 2 +- lib/macro/macro-condition-variable.cpp | 2 +- lib/macro/macro-dock.cpp | 2 +- lib/macro/macro-helpers.cpp | 17 + lib/macro/macro-helpers.hpp | 2 + lib/macro/macro-list.cpp | 2 +- lib/macro/macro-properties.cpp | 6 +- lib/macro/macro-run-button.cpp | 4 +- lib/macro/macro-segment-list.cpp | 9 +- lib/macro/macro-segment-selection.cpp | 43 +- lib/macro/macro-segment.cpp | 12 +- lib/macro/macro-selection.cpp | 6 +- lib/macro/macro-tab.cpp | 15 +- lib/macro/macro-tree.cpp | 1 + lib/macro/macro.cpp | 7 +- lib/switcher-data.cpp | 2 +- lib/utils/duration-control.cpp | 1 - lib/utils/duration.cpp | 1 - lib/utils/filter-combo-box.cpp | 2 +- lib/utils/item-selection-helpers.cpp | 2 +- lib/utils/layout-helpers.cpp | 185 +++ lib/utils/layout-helpers.hpp | 23 + lib/utils/regex-config.cpp | 1 + lib/utils/resizing-text-edit.cpp | 4 +- lib/utils/scene-selection.cpp | 6 + lib/utils/scene-selection.hpp | 8 +- lib/utils/scene-switch-helpers.cpp | 5 +- lib/utils/section.cpp | 2 +- lib/utils/selection-helpers.cpp | 334 ++++++ lib/utils/selection-helpers.hpp | 42 + lib/utils/source-helpers.cpp | 136 +++ lib/utils/source-helpers.hpp | 23 + lib/utils/source-selection.cpp | 4 +- lib/utils/splitter-helpers.cpp | 33 + lib/utils/splitter-helpers.hpp | 15 + lib/utils/status-control.cpp | 4 +- lib/utils/temp-variable.cpp | 1 + lib/utils/ui-helpers.cpp | 170 +++ lib/utils/ui-helpers.hpp | 32 + lib/utils/utility.cpp | 1038 +---------------- lib/utils/utility.hpp | 127 +- lib/utils/variable-line-edit.cpp | 3 +- lib/utils/variable-spinbox.cpp | 2 +- lib/utils/variable.cpp | 3 +- plugins/base/macro-action-audio.cpp | 3 +- plugins/base/macro-action-file.cpp | 4 +- plugins/base/macro-action-filter.cpp | 3 +- plugins/base/macro-action-hotkey.cpp | 5 +- plugins/base/macro-action-http.cpp | 2 +- plugins/base/macro-action-media.cpp | 3 +- plugins/base/macro-action-osc.cpp | 3 +- plugins/base/macro-action-plugin-state.cpp | 8 +- plugins/base/macro-action-profile.cpp | 4 +- plugins/base/macro-action-projector.cpp | 6 +- plugins/base/macro-action-random.cpp | 2 +- plugins/base/macro-action-recording.cpp | 3 +- plugins/base/macro-action-replay-buffer.cpp | 6 +- plugins/base/macro-action-run.cpp | 2 +- .../base/macro-action-scene-collection.cpp | 5 +- plugins/base/macro-action-scene-lock.cpp | 2 +- plugins/base/macro-action-scene-order.cpp | 2 +- plugins/base/macro-action-scene-switch.cpp | 5 +- plugins/base/macro-action-scene-transform.cpp | 2 +- .../base/macro-action-scene-visibility.cpp | 2 +- plugins/base/macro-action-screenshot.cpp | 5 +- plugins/base/macro-action-sequence.cpp | 2 +- plugins/base/macro-action-source.cpp | 7 +- plugins/base/macro-action-streaming.cpp | 4 +- plugins/base/macro-action-studio-mode.cpp | 4 +- plugins/base/macro-action-systray.cpp | 3 +- plugins/base/macro-action-timer.cpp | 2 +- plugins/base/macro-action-transition.cpp | 4 +- plugins/base/macro-action-virtual-cam.cpp | 4 +- plugins/base/macro-action-wait.cpp | 2 +- plugins/base/macro-action-websocket.cpp | 2 +- plugins/base/macro-condition-audio.cpp | 3 +- plugins/base/macro-condition-cursor.cpp | 3 +- plugins/base/macro-condition-date.cpp | 2 +- plugins/base/macro-condition-display.cpp | 2 +- plugins/base/macro-condition-file.cpp | 5 +- plugins/base/macro-condition-filter.cpp | 5 +- plugins/base/macro-condition-hotkey.cpp | 2 +- plugins/base/macro-condition-idle.cpp | 2 +- plugins/base/macro-condition-media.cpp | 4 +- plugins/base/macro-condition-obs-stats.cpp | 3 + plugins/base/macro-condition-plugin-state.cpp | 2 +- plugins/base/macro-condition-process.cpp | 3 +- plugins/base/macro-condition-profile.cpp | 4 +- plugins/base/macro-condition-recording.cpp | 3 +- .../base/macro-condition-replay-buffer.cpp | 4 +- plugins/base/macro-condition-run.cpp | 2 +- plugins/base/macro-condition-scene-order.cpp | 2 +- .../base/macro-condition-scene-transform.cpp | 4 +- .../base/macro-condition-scene-visibility.cpp | 2 +- plugins/base/macro-condition-scene.cpp | 5 +- plugins/base/macro-condition-slideshow.cpp | 2 +- plugins/base/macro-condition-source.cpp | 5 +- plugins/base/macro-condition-streaming.cpp | 4 +- plugins/base/macro-condition-studio-mode.cpp | 5 +- plugins/base/macro-condition-timer.cpp | 2 +- plugins/base/macro-condition-transition.cpp | 4 +- plugins/base/macro-condition-virtual-cam.cpp | 4 +- plugins/base/macro-condition-websocket.cpp | 2 +- plugins/base/macro-condition-window.cpp | 3 +- plugins/base/utils/connection-manager.cpp | 5 +- plugins/base/utils/filter-selection.cpp | 25 +- plugins/base/utils/osc-helpers.cpp | 5 +- plugins/base/utils/process-config.cpp | 4 +- plugins/base/utils/profile-helpers.cpp | 2 +- plugins/base/utils/scene-item-selection.cpp | 4 + plugins/base/utils/scene-item-selection.hpp | 2 +- plugins/base/utils/source-setting.cpp | 2 + plugins/base/utils/string-list.cpp | 2 +- plugins/base/utils/transition-selection.cpp | 5 +- plugins/midi/macro-action-midi.cpp | 3 +- plugins/midi/macro-condition-midi.cpp | 3 +- plugins/midi/midi-helpers.cpp | 5 +- plugins/openvr/macro-condition-openvr.cpp | 2 +- plugins/twitch/category-selection.cpp | 3 +- plugins/twitch/macro-action-twitch.cpp | 2 +- plugins/twitch/macro-condition-twitch.cpp | 2 +- plugins/twitch/points-reward-selection.cpp | 2 +- plugins/twitch/token.cpp | 7 +- plugins/video/macro-condition-video.cpp | 11 +- plugins/video/paramerter-wrappers.cpp | 1 + plugins/video/preview-dialog.cpp | 4 +- 153 files changed, 1513 insertions(+), 1294 deletions(-) create mode 100644 lib/utils/layout-helpers.cpp create mode 100644 lib/utils/layout-helpers.hpp create mode 100644 lib/utils/selection-helpers.cpp create mode 100644 lib/utils/selection-helpers.hpp create mode 100644 lib/utils/source-helpers.cpp create mode 100644 lib/utils/source-helpers.hpp create mode 100644 lib/utils/splitter-helpers.cpp create mode 100644 lib/utils/splitter-helpers.hpp create mode 100644 lib/utils/ui-helpers.cpp create mode 100644 lib/utils/ui-helpers.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 489901c7..a87510a2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -159,6 +159,8 @@ target_sources( lib/utils/filter-combo-box.hpp lib/utils/item-selection-helpers.cpp lib/utils/item-selection-helpers.hpp + lib/utils/layout-helpers.cpp + lib/utils/layout-helpers.hpp lib/utils/log-helper.cpp lib/utils/log-helper.hpp lib/utils/math-helpers.cpp @@ -188,10 +190,16 @@ target_sources( lib/utils/screenshot-helper.hpp lib/utils/section.cpp lib/utils/section.hpp + lib/utils/selection-helpers.cpp + lib/utils/selection-helpers.hpp lib/utils/slider-spinbox.cpp lib/utils/slider-spinbox.hpp + lib/utils/source-helpers.cpp + lib/utils/source-helpers.hpp lib/utils/source-selection.cpp lib/utils/source-selection.hpp + lib/utils/splitter-helpers.cpp + lib/utils/splitter-helpers.hpp lib/utils/status-control.cpp lib/utils/status-control.hpp lib/utils/switch-button.cpp @@ -200,6 +208,8 @@ target_sources( lib/utils/sync-helpers.hpp lib/utils/temp-variable.cpp lib/utils/temp-variable.hpp + lib/utils/ui-helpers.cpp + lib/utils/ui-helpers.hpp lib/utils/utility.cpp lib/utils/utility.hpp lib/utils/variable-line-edit.cpp diff --git a/lib/advanced-scene-switcher.cpp b/lib/advanced-scene-switcher.cpp index 4fff7d8e..42f7aee7 100644 --- a/lib/advanced-scene-switcher.cpp +++ b/lib/advanced-scene-switcher.cpp @@ -1,22 +1,25 @@ #include "advanced-scene-switcher.hpp" -#include "switcher-data.hpp" +#include "curl-helper.hpp" +#include "log-helper.hpp" #include "macro-helpers.hpp" #include "obs-module-helper.hpp" -#include "status-control.hpp" -#include "scene-switch-helpers.hpp" -#include "curl-helper.hpp" #include "platform-funcs.hpp" +#include "scene-switch-helpers.hpp" +#include "source-helpers.hpp" +#include "status-control.hpp" +#include "switcher-data.hpp" +#include "ui-helpers.hpp" #include "utility.hpp" #include "version.h" -#include -#include -#include -#include -#include -#include #include #include +#include +#include +#include +#include +#include +#include namespace advss { diff --git a/lib/general.cpp b/lib/general.cpp index e427045e..52427ce7 100644 --- a/lib/general.cpp +++ b/lib/general.cpp @@ -1,13 +1,19 @@ #include "advanced-scene-switcher.hpp" #include "file-selection.hpp" #include "filter-combo-box.hpp" +#include "layout-helpers.hpp" #include "macro.hpp" +#include "selection-helpers.hpp" +#include "source-helpers.hpp" +#include "splitter-helpers.hpp" #include "status-control.hpp" #include "switcher-data.hpp" +#include "ui-helpers.hpp" #include "utility.hpp" #include "variable.hpp" #include "version.h" +#include #include namespace advss { diff --git a/lib/legacy/scene-group.cpp b/lib/legacy/scene-group.cpp index 8208b544..4004e4f7 100644 --- a/lib/legacy/scene-group.cpp +++ b/lib/legacy/scene-group.cpp @@ -1,11 +1,14 @@ -#include -#include -#include - #include "advanced-scene-switcher.hpp" -#include "switcher-data.hpp" +#include "layout-helpers.hpp" #include "name-dialog.hpp" -#include "utility.hpp" +#include "selection-helpers.hpp" +#include "source-helpers.hpp" +#include "switcher-data.hpp" +#include "ui-helpers.hpp" + +#include +#include +#include namespace advss { diff --git a/lib/legacy/scene-trigger.cpp b/lib/legacy/scene-trigger.cpp index a7a719ec..b27f0085 100644 --- a/lib/legacy/scene-trigger.cpp +++ b/lib/legacy/scene-trigger.cpp @@ -1,7 +1,12 @@ #include "advanced-scene-switcher.hpp" +#include "layout-helpers.hpp" +#include "selection-helpers.hpp" +#include "source-helpers.hpp" #include "switcher-data.hpp" +#include "ui-helpers.hpp" #include "utility.hpp" +#include #include namespace advss { diff --git a/lib/legacy/switch-audio.cpp b/lib/legacy/switch-audio.cpp index f3c10133..88d1fdba 100644 --- a/lib/legacy/switch-audio.cpp +++ b/lib/legacy/switch-audio.cpp @@ -1,7 +1,11 @@ #include "advanced-scene-switcher.hpp" +#include "layout-helpers.hpp" +#include "selection-helpers.hpp" +#include "source-helpers.hpp" #include "switcher-data.hpp" -#include "volume-control.hpp" +#include "ui-helpers.hpp" #include "utility.hpp" +#include "volume-control.hpp" #include diff --git a/lib/legacy/switch-executable.cpp b/lib/legacy/switch-executable.cpp index a5c057a5..09185f16 100644 --- a/lib/legacy/switch-executable.cpp +++ b/lib/legacy/switch-executable.cpp @@ -1,6 +1,9 @@ #include "advanced-scene-switcher.hpp" -#include "switcher-data.hpp" +#include "layout-helpers.hpp" #include "platform-funcs.hpp" +#include "selection-helpers.hpp" +#include "switcher-data.hpp" +#include "ui-helpers.hpp" #include "utility.hpp" namespace advss { diff --git a/lib/legacy/switch-file.cpp b/lib/legacy/switch-file.cpp index ddd2c64c..b3b32180 100644 --- a/lib/legacy/switch-file.cpp +++ b/lib/legacy/switch-file.cpp @@ -1,8 +1,12 @@ #include "advanced-scene-switcher.hpp" -#include "switcher-data.hpp" #include "curl-helper.hpp" +#include "layout-helpers.hpp" +#include "source-helpers.hpp" +#include "switcher-data.hpp" +#include "ui-helpers.hpp" #include "utility.hpp" +#include #include #include #include diff --git a/lib/legacy/switch-generic.cpp b/lib/legacy/switch-generic.cpp index d30a2ade..24686f91 100644 --- a/lib/legacy/switch-generic.cpp +++ b/lib/legacy/switch-generic.cpp @@ -1,6 +1,7 @@ #include "advanced-scene-switcher.hpp" +#include "selection-helpers.hpp" +#include "source-helpers.hpp" #include "switcher-data.hpp" -#include "utility.hpp" constexpr auto previous_scene_name = "Previous Scene"; constexpr auto current_transition_name = "Current Transition"; diff --git a/lib/legacy/switch-idle.cpp b/lib/legacy/switch-idle.cpp index c3c4e39b..8801d920 100644 --- a/lib/legacy/switch-idle.cpp +++ b/lib/legacy/switch-idle.cpp @@ -1,7 +1,9 @@ #include "advanced-scene-switcher.hpp" -#include "switcher-data.hpp" +#include "layout-helpers.hpp" #include "platform-funcs.hpp" -#include "utility.hpp" +#include "selection-helpers.hpp" +#include "source-helpers.hpp" +#include "switcher-data.hpp" #include diff --git a/lib/legacy/switch-media.cpp b/lib/legacy/switch-media.cpp index ee0550e9..4b08e7ed 100644 --- a/lib/legacy/switch-media.cpp +++ b/lib/legacy/switch-media.cpp @@ -1,5 +1,9 @@ #include "advanced-scene-switcher.hpp" +#include "layout-helpers.hpp" +#include "selection-helpers.hpp" +#include "source-helpers.hpp" #include "switcher-data.hpp" +#include "ui-helpers.hpp" #include "utility.hpp" namespace advss { diff --git a/lib/legacy/switch-network.cpp b/lib/legacy/switch-network.cpp index f02252f1..5633b956 100644 --- a/lib/legacy/switch-network.cpp +++ b/lib/legacy/switch-network.cpp @@ -2,15 +2,16 @@ Most of this code is based on https://github.com/Palakis/obs-websocket */ -#include -#include -#include - #include "advanced-scene-switcher.hpp" #include "obs-module-helper.hpp" -#include "switcher-data.hpp" #include "scene-switch-helpers.hpp" -#include "utility.hpp" +#include "source-helpers.hpp" +#include "switcher-data.hpp" + +#include +#include +#include +#include namespace advss { diff --git a/lib/legacy/switch-pause.cpp b/lib/legacy/switch-pause.cpp index 7b882edb..d37d87b8 100644 --- a/lib/legacy/switch-pause.cpp +++ b/lib/legacy/switch-pause.cpp @@ -1,5 +1,9 @@ #include "advanced-scene-switcher.hpp" +#include "layout-helpers.hpp" +#include "selection-helpers.hpp" +#include "source-helpers.hpp" #include "switcher-data.hpp" +#include "ui-helpers.hpp" #include "utility.hpp" #include diff --git a/lib/legacy/switch-random.cpp b/lib/legacy/switch-random.cpp index f210d315..7b916041 100644 --- a/lib/legacy/switch-random.cpp +++ b/lib/legacy/switch-random.cpp @@ -1,6 +1,8 @@ #include "advanced-scene-switcher.hpp" +#include "layout-helpers.hpp" #include "switcher-data.hpp" #include "utility.hpp" +#include "ui-helpers.hpp" #include diff --git a/lib/legacy/switch-screen-region.cpp b/lib/legacy/switch-screen-region.cpp index ff66b5f2..9eba3c26 100644 --- a/lib/legacy/switch-screen-region.cpp +++ b/lib/legacy/switch-screen-region.cpp @@ -1,5 +1,9 @@ #include "advanced-scene-switcher.hpp" +#include "layout-helpers.hpp" +#include "selection-helpers.hpp" +#include "source-helpers.hpp" #include "switcher-data.hpp" +#include "ui-helpers.hpp" #include "utility.hpp" #include diff --git a/lib/legacy/switch-sequence.cpp b/lib/legacy/switch-sequence.cpp index fcc94530..fad0ef81 100644 --- a/lib/legacy/switch-sequence.cpp +++ b/lib/legacy/switch-sequence.cpp @@ -1,5 +1,10 @@ #include "advanced-scene-switcher.hpp" +#include "layout-helpers.hpp" +#include "obs-frontend-api.h" +#include "selection-helpers.hpp" +#include "source-helpers.hpp" #include "switcher-data.hpp" +#include "ui-helpers.hpp" #include "utility.hpp" #include diff --git a/lib/legacy/switch-time.cpp b/lib/legacy/switch-time.cpp index de672372..b89054f7 100644 --- a/lib/legacy/switch-time.cpp +++ b/lib/legacy/switch-time.cpp @@ -1,5 +1,7 @@ #include "advanced-scene-switcher.hpp" +#include "layout-helpers.hpp" #include "switcher-data.hpp" +#include "ui-helpers.hpp" #include "utility.hpp" namespace advss { diff --git a/lib/legacy/switch-transitions.cpp b/lib/legacy/switch-transitions.cpp index c64ce633..320d8f4b 100644 --- a/lib/legacy/switch-transitions.cpp +++ b/lib/legacy/switch-transitions.cpp @@ -1,7 +1,12 @@ #include "advanced-scene-switcher.hpp" +#include "layout-helpers.hpp" +#include "selection-helpers.hpp" +#include "source-helpers.hpp" #include "switcher-data.hpp" +#include "ui-helpers.hpp" #include "utility.hpp" +#include #include namespace advss { diff --git a/lib/legacy/switch-video.cpp b/lib/legacy/switch-video.cpp index 743b24d8..237c34bd 100644 --- a/lib/legacy/switch-video.cpp +++ b/lib/legacy/switch-video.cpp @@ -1,5 +1,9 @@ #include "advanced-scene-switcher.hpp" +#include "layout-helpers.hpp" +#include "source-helpers.hpp" +#include "selection-helpers.hpp" #include "switcher-data.hpp" +#include "ui-helpers.hpp" #include "utility.hpp" #include @@ -404,7 +408,7 @@ VideoSwitchWidget::VideoSwitchWidget(QWidget *parent, VideoSwitch *s) QWidget::connect(ignoreInactiveSource, SIGNAL(stateChanged(int)), this, SLOT(IgnoreInactiveChanged(int))); - populateVideoSelection(videoSources); + PopulateVideoSelection(videoSources); populateConditionSelection(condition); if (s) { diff --git a/lib/legacy/switch-window.cpp b/lib/legacy/switch-window.cpp index 6f39bc9f..57a2b70f 100644 --- a/lib/legacy/switch-window.cpp +++ b/lib/legacy/switch-window.cpp @@ -1,6 +1,9 @@ #include "advanced-scene-switcher.hpp" -#include "switcher-data.hpp" +#include "layout-helpers.hpp" #include "platform-funcs.hpp" +#include "selection-helpers.hpp" +#include "switcher-data.hpp" +#include "ui-helpers.hpp" #include "utility.hpp" #include diff --git a/lib/macro/macro-action-edit.cpp b/lib/macro/macro-action-edit.cpp index 5758961b..59d61ab8 100644 --- a/lib/macro/macro-action-edit.cpp +++ b/lib/macro/macro-action-edit.cpp @@ -1,11 +1,10 @@ #include "macro-action-edit.hpp" -#include "macro-helpers.hpp" -#include "macro.hpp" -#include "macro-properties.hpp" #include "advanced-scene-switcher.hpp" +#include "macro-helpers.hpp" +#include "macro-properties.hpp" +#include "macro.hpp" #include "section.hpp" #include "switch-button.hpp" -#include "utility.hpp" #include diff --git a/lib/macro/macro-action-macro.cpp b/lib/macro/macro-action-macro.cpp index 5c829d59..4851b100 100644 --- a/lib/macro/macro-action-macro.cpp +++ b/lib/macro/macro-action-macro.cpp @@ -1,6 +1,6 @@ #include "macro-action-macro.hpp" +#include "layout-helpers.hpp" #include "macro.hpp" -#include "utility.hpp" namespace advss { diff --git a/lib/macro/macro-action-queue.cpp b/lib/macro/macro-action-queue.cpp index 8f7ab0b7..ef13c17f 100644 --- a/lib/macro/macro-action-queue.cpp +++ b/lib/macro/macro-action-queue.cpp @@ -1,6 +1,6 @@ #include "macro-action-queue.hpp" +#include "layout-helpers.hpp" #include "macro-helpers.hpp" -#include "utility.hpp" namespace advss { diff --git a/lib/macro/macro-action-variable.cpp b/lib/macro/macro-action-variable.cpp index b8929135..fe138d1c 100644 --- a/lib/macro/macro-action-variable.cpp +++ b/lib/macro/macro-action-variable.cpp @@ -1,9 +1,11 @@ #include "macro-action-variable.hpp" -#include "macro-condition-edit.hpp" #include "advanced-scene-switcher.hpp" -#include "macro.hpp" +#include "layout-helpers.hpp" #include "math-helpers.hpp" +#include "macro-condition-edit.hpp" +#include "macro.hpp" #include "non-modal-dialog.hpp" +#include "source-helpers.hpp" #include "utility.hpp" namespace advss { diff --git a/lib/macro/macro-condition-edit.cpp b/lib/macro/macro-condition-edit.cpp index d6d8498e..93aae46f 100644 --- a/lib/macro/macro-condition-edit.cpp +++ b/lib/macro/macro-condition-edit.cpp @@ -1,8 +1,9 @@ #include "macro-condition-edit.hpp" -#include "macro.hpp" -#include "macro-properties.hpp" #include "advanced-scene-switcher.hpp" +#include "macro-properties.hpp" +#include "macro.hpp" #include "section.hpp" +#include "ui-helpers.hpp" #include "utility.hpp" namespace advss { diff --git a/lib/macro/macro-condition-macro.cpp b/lib/macro/macro-condition-macro.cpp index 8c161a0a..4fca3b69 100644 --- a/lib/macro/macro-condition-macro.cpp +++ b/lib/macro/macro-condition-macro.cpp @@ -1,7 +1,7 @@ #include "macro-condition-macro.hpp" -#include "macro.hpp" +#include "layout-helpers.hpp" #include "macro-action-edit.hpp" -#include "utility.hpp" +#include "macro.hpp" namespace advss { diff --git a/lib/macro/macro-condition-queue.cpp b/lib/macro/macro-condition-queue.cpp index 2fd86457..942f8477 100644 --- a/lib/macro/macro-condition-queue.cpp +++ b/lib/macro/macro-condition-queue.cpp @@ -1,5 +1,5 @@ #include "macro-condition-queue.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" namespace advss { diff --git a/lib/macro/macro-condition-tempvar.cpp b/lib/macro/macro-condition-tempvar.cpp index 9c88d7df..14435fa1 100644 --- a/lib/macro/macro-condition-tempvar.cpp +++ b/lib/macro/macro-condition-tempvar.cpp @@ -1,6 +1,6 @@ #include "macro-condition-tempvar.hpp" +#include "layout-helpers.hpp" #include "math-helpers.hpp" -#include "utility.hpp" namespace advss { diff --git a/lib/macro/macro-condition-variable.cpp b/lib/macro/macro-condition-variable.cpp index 22085a9d..0f1ea5bd 100644 --- a/lib/macro/macro-condition-variable.cpp +++ b/lib/macro/macro-condition-variable.cpp @@ -1,5 +1,5 @@ #include "macro-condition-variable.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" namespace advss { diff --git a/lib/macro/macro-dock.cpp b/lib/macro/macro-dock.cpp index 7139c1a1..d8209f34 100644 --- a/lib/macro/macro-dock.cpp +++ b/lib/macro/macro-dock.cpp @@ -1,6 +1,6 @@ #include "macro-dock.hpp" #include "macro.hpp" -#include "utility.hpp" +#include "ui-helpers.hpp" #include diff --git a/lib/macro/macro-helpers.cpp b/lib/macro/macro-helpers.cpp index 25a135e6..e8e0760f 100644 --- a/lib/macro/macro-helpers.cpp +++ b/lib/macro/macro-helpers.cpp @@ -129,4 +129,21 @@ void ResetMacroRunCount(Macro *macro) macro->ResetRunCount(); } +bool IsValidMacroSegmentIndex(Macro *m, const int idx, bool isCondition) +{ + if (!m || idx < 0) { + return false; + } + if (isCondition) { + if (idx >= (int)m->Conditions().size()) { + return false; + } + } else { + if (idx >= (int)m->Actions().size()) { + return false; + } + } + return true; +} + } // namespace advss diff --git a/lib/macro/macro-helpers.hpp b/lib/macro/macro-helpers.hpp index 3b195557..bb1c692d 100644 --- a/lib/macro/macro-helpers.hpp +++ b/lib/macro/macro-helpers.hpp @@ -61,4 +61,6 @@ EXPORT void InvalidateMacroTempVarValues(); EXPORT void ResetMacroConditionTimers(Macro *); EXPORT void ResetMacroRunCount(Macro *); +bool IsValidMacroSegmentIndex(Macro *m, const int idx, bool isCondition); + } // namespace advss diff --git a/lib/macro/macro-list.cpp b/lib/macro/macro-list.cpp index d38e422c..ee894fb6 100644 --- a/lib/macro/macro-list.cpp +++ b/lib/macro/macro-list.cpp @@ -2,7 +2,7 @@ #include "macro-helpers.hpp" #include "macro-selection.hpp" #include "obs-module-helper.hpp" -#include "utility.hpp" +#include "ui-helpers.hpp" namespace advss { diff --git a/lib/macro/macro-properties.cpp b/lib/macro/macro-properties.cpp index b93236ca..da221d9a 100644 --- a/lib/macro/macro-properties.cpp +++ b/lib/macro/macro-properties.cpp @@ -1,12 +1,12 @@ #include "macro-properties.hpp" -#include "macro.hpp" +#include "layout-helpers.hpp" #include "obs-module-helper.hpp" -#include "utility.hpp" +#include "macro.hpp" -#include #include #include #include +#include namespace advss { diff --git a/lib/macro/macro-run-button.cpp b/lib/macro/macro-run-button.cpp index ac60e283..ef9e82e5 100644 --- a/lib/macro/macro-run-button.cpp +++ b/lib/macro/macro-run-button.cpp @@ -1,8 +1,8 @@ #include "macro-run-button.hpp" +#include "obs-module-helper.hpp" #include "macro-tree.hpp" #include "macro.hpp" -#include "obs-module-helper.hpp" -#include "utility.hpp" +#include "ui-helpers.hpp" #include diff --git a/lib/macro/macro-segment-list.cpp b/lib/macro/macro-segment-list.cpp index 090974f2..477563f3 100644 --- a/lib/macro/macro-segment-list.cpp +++ b/lib/macro/macro-segment-list.cpp @@ -1,13 +1,14 @@ #include "macro-segment-list.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" +#include "ui-helpers.hpp" -#include -#include #include -#include #include +#include #include +#include #include +#include #include namespace advss { diff --git a/lib/macro/macro-segment-selection.cpp b/lib/macro/macro-segment-selection.cpp index 70c27125..14340644 100644 --- a/lib/macro/macro-segment-selection.cpp +++ b/lib/macro/macro-segment-selection.cpp @@ -1,8 +1,14 @@ #include "macro-segment-selection.hpp" #include "advanced-scene-switcher.hpp" +#include "macro-action-factory.hpp" +#include "macro-condition-factory.hpp" +#include "macro-helpers.hpp" +#include "macro-segment.hpp" #include "obs-module-helper.hpp" #include "plugin-state-helpers.hpp" -#include "utility.hpp" +#include "ui-helpers.hpp" + +#include namespace advss { @@ -64,6 +70,41 @@ void MacroSegmentSelection::MacroSegmentOrderChanged() SetupDescription(); } +QString GetMacroSegmentDescription(Macro *macro, int idx, bool isCondition) +{ + if (!macro) { + return ""; + } + if (!IsValidMacroSegmentIndex(macro, idx, isCondition)) { + return ""; + } + + MacroSegment *segment; + if (isCondition) { + segment = GetMacroConditions(macro)->at(idx).get(); + } else { + segment = GetMacroActions(macro)->at(idx).get(); + } + + QString description = QString::fromStdString(segment->GetShortDesc()); + QString type; + if (isCondition) { + type = obs_module_text(MacroConditionFactory::GetConditionName( + segment->GetId()) + .c_str()); + } else { + type = obs_module_text( + MacroActionFactory::GetActionName(segment->GetId()) + .c_str()); + } + + QString result = type; + if (!description.isEmpty()) { + result += ": " + description; + } + return result; +} + void MacroSegmentSelection::SetupDescription() const { if (!_macro) { diff --git a/lib/macro/macro-segment.cpp b/lib/macro/macro-segment.cpp index a73276ad..bd612c61 100644 --- a/lib/macro/macro-segment.cpp +++ b/lib/macro/macro-segment.cpp @@ -1,15 +1,15 @@ #include "macro-segment.hpp" #include "macro.hpp" -#include "section.hpp" -#include "utility.hpp" #include "mouse-wheel-guard.hpp" +#include "section.hpp" +#include "ui-helpers.hpp" #include -#include -#include -#include -#include #include +#include +#include +#include +#include namespace advss { diff --git a/lib/macro/macro-selection.cpp b/lib/macro/macro-selection.cpp index aa39d065..a1a64a43 100644 --- a/lib/macro/macro-selection.cpp +++ b/lib/macro/macro-selection.cpp @@ -1,10 +1,10 @@ #include "macro-selection.hpp" -#include "macro.hpp" #include "advanced-scene-switcher.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" +#include "macro.hpp" -#include #include +#include namespace advss { diff --git a/lib/macro/macro-tab.cpp b/lib/macro/macro-tab.cpp index 6a882251..b6b58544 100644 --- a/lib/macro/macro-tab.cpp +++ b/lib/macro/macro-tab.cpp @@ -1,18 +1,19 @@ -#include "macro.hpp" -#include "macro-tree.hpp" +#include "advanced-scene-switcher.hpp" #include "macro-action-edit.hpp" #include "macro-condition-edit.hpp" -#include "advanced-scene-switcher.hpp" -#include "switcher-data.hpp" -#include "name-dialog.hpp" -#include "macro-properties.hpp" #include "macro-export-import-dialog.hpp" +#include "macro-properties.hpp" +#include "macro-tree.hpp" +#include "macro.hpp" +#include "name-dialog.hpp" +#include "switcher-data.hpp" +#include "ui-helpers.hpp" #include "utility.hpp" #include "version.h" #include -#include #include +#include #include namespace advss { diff --git a/lib/macro/macro-tree.cpp b/lib/macro/macro-tree.cpp index 67a758de..2dc2895c 100644 --- a/lib/macro/macro-tree.cpp +++ b/lib/macro/macro-tree.cpp @@ -1,6 +1,7 @@ #include "macro-tree.hpp" #include "macro.hpp" #include "sync-helpers.hpp" +#include "ui-helpers.hpp" #include "utility.hpp" #include diff --git a/lib/macro/macro.cpp b/lib/macro/macro.cpp index 17584b77..f210c066 100644 --- a/lib/macro/macro.cpp +++ b/lib/macro/macro.cpp @@ -4,15 +4,16 @@ #include "macro-dock.hpp" #include "macro-helpers.hpp" #include "plugin-state-helpers.hpp" +#include "splitter-helpers.hpp" #include "sync-helpers.hpp" -#include "utility.hpp" +#include #include #undef max -#include -#include +#include #include #include +#include namespace advss { diff --git a/lib/switcher-data.cpp b/lib/switcher-data.cpp index 77cd93fb..d9b97410 100644 --- a/lib/switcher-data.cpp +++ b/lib/switcher-data.cpp @@ -1,5 +1,5 @@ #include "switcher-data.hpp" -#include "utility.hpp" +#include "source-helpers.hpp" namespace advss { diff --git a/lib/utils/duration-control.cpp b/lib/utils/duration-control.cpp index 62918374..d79a74c8 100644 --- a/lib/utils/duration-control.cpp +++ b/lib/utils/duration-control.cpp @@ -1,7 +1,6 @@ #include "duration-control.hpp" #include "mouse-wheel-guard.hpp" #include "obs-module-helper.hpp" -#include "utility.hpp" #include diff --git a/lib/utils/duration.cpp b/lib/utils/duration.cpp index e2529968..eb1851dc 100644 --- a/lib/utils/duration.cpp +++ b/lib/utils/duration.cpp @@ -1,6 +1,5 @@ #include "duration.hpp" #include "obs-module-helper.hpp" -#include "utility.hpp" #include #include diff --git a/lib/utils/filter-combo-box.cpp b/lib/utils/filter-combo-box.cpp index ce688dca..ec8aee14 100644 --- a/lib/utils/filter-combo-box.cpp +++ b/lib/utils/filter-combo-box.cpp @@ -1,5 +1,5 @@ #include "filter-combo-box.hpp" -#include "utility.hpp" +#include "ui-helpers.hpp" #include #include diff --git a/lib/utils/item-selection-helpers.cpp b/lib/utils/item-selection-helpers.cpp index b73926b8..47358674 100644 --- a/lib/utils/item-selection-helpers.cpp +++ b/lib/utils/item-selection-helpers.cpp @@ -1,7 +1,7 @@ #include "item-selection-helpers.hpp" #include "name-dialog.hpp" #include "obs-module-helper.hpp" -#include "utility.hpp" +#include "ui-helpers.hpp" #include #include diff --git a/lib/utils/layout-helpers.cpp b/lib/utils/layout-helpers.cpp new file mode 100644 index 00000000..b34a0979 --- /dev/null +++ b/lib/utils/layout-helpers.cpp @@ -0,0 +1,185 @@ +#include "layout-helpers.hpp" + +#include + +namespace advss { + +static std::string +getNextDelim(const std::string &text, + const std::unordered_map &placeholders) +{ + size_t pos = std::string::npos; + std::string res = ""; + + for (const auto &ph : placeholders) { + size_t newPos = text.find(ph.first); + if (newPos <= pos) { + pos = newPos; + res = ph.first; + } + } + + if (pos == std::string::npos) { + return ""; + } + + return res; +} + +void PlaceWidgets(std::string text, QBoxLayout *layout, + const std::unordered_map &placeholders, + bool addStretch) +{ + std::vector> labelsWidgetsPairs; + + std::string delim = getNextDelim(text, placeholders); + while (delim != "") { + size_t pos = text.find(delim); + if (pos != std::string::npos) { + labelsWidgetsPairs.emplace_back(text.substr(0, pos), + placeholders.at(delim)); + text.erase(0, pos + delim.length()); + } + delim = getNextDelim(text, placeholders); + } + + if (text != "") { + labelsWidgetsPairs.emplace_back(text, nullptr); + } + + for (auto &lw : labelsWidgetsPairs) { + if (lw.first != "") { + layout->addWidget(new QLabel(lw.first.c_str())); + } + if (lw.second) { + layout->addWidget(lw.second); + } + } + if (addStretch) { + layout->addStretch(); + } +} + +void DeleteLayoutItemWidget(QLayoutItem *item) +{ + if (item) { + auto widget = item->widget(); + if (widget) { + widget->setVisible(false); + widget->deleteLater(); + } + delete item; + } +} + +void ClearLayout(QLayout *layout, int afterIdx) +{ + QLayoutItem *item; + while ((item = layout->takeAt(afterIdx))) { + if (item->layout()) { + ClearLayout(item->layout()); + delete item->layout(); + } + DeleteLayoutItemWidget(item); + } +} + +void SetLayoutVisible(QLayout *layout, bool visible) +{ + if (!layout) { + return; + } + for (int i = 0; i < layout->count(); ++i) { + QWidget *widget = layout->itemAt(i)->widget(); + QLayout *nestedLayout = layout->itemAt(i)->layout(); + if (widget) { + widget->setVisible(visible); + } + if (nestedLayout) { + SetLayoutVisible(nestedLayout, visible); + } + } +} + +void SetGridLayoutRowVisible(QGridLayout *layout, int row, bool visible) +{ + for (int col = 0; col < layout->columnCount(); col++) { + auto item = layout->itemAtPosition(row, col); + if (!item) { + continue; + } + + auto rowLayout = item->layout(); + if (rowLayout) { + SetLayoutVisible(rowLayout, visible); + } + + auto widget = item->widget(); + if (widget) { + widget->setVisible(visible); + } + } + + if (!visible) { + layout->setRowMinimumHeight(row, 0); + } +} + +void AddStretchIfNecessary(QBoxLayout *layout) +{ + int itemCount = layout->count(); + if (itemCount > 0) { + auto lastItem = layout->itemAt(itemCount - 1); + auto lastSpacer = dynamic_cast(lastItem); + if (!lastSpacer) { + layout->addStretch(); + } + } else { + layout->addStretch(); + } +} + +void RemoveStretchIfPresent(QBoxLayout *layout) +{ + int itemCount = layout->count(); + if (itemCount > 0) { + auto lastItem = layout->itemAt(itemCount - 1); + auto lastSpacer = dynamic_cast(lastItem); + if (lastSpacer) { + layout->removeItem(lastItem); + delete lastItem; + } + } +} + +void MinimizeSizeOfColumn(QGridLayout *layout, int idx) +{ + if (idx >= layout->columnCount()) { + return; + } + + for (int i = 0; i < layout->columnCount(); i++) { + if (i == idx) { + layout->setColumnStretch(i, 0); + } else { + layout->setColumnStretch(i, 1); + } + } + + int columnWidth = 0; + for (int row = 0; row < layout->rowCount(); row++) { + auto item = layout->itemAtPosition(row, idx); + if (!item) { + continue; + } + auto widget = item->widget(); + if (!widget) { + continue; + } + columnWidth = std::max(columnWidth, + widget->minimumSizeHint().width()); + } + layout->setColumnMinimumWidth(idx, columnWidth); +} + +} // namespace advss diff --git a/lib/utils/layout-helpers.hpp b/lib/utils/layout-helpers.hpp new file mode 100644 index 00000000..9993ed2a --- /dev/null +++ b/lib/utils/layout-helpers.hpp @@ -0,0 +1,23 @@ +#pragma once +#include "export-symbol-helper.hpp" + +#include +#include +#include +#include + +namespace advss { + +EXPORT void +PlaceWidgets(std::string text, QBoxLayout *layout, + const std::unordered_map &placeholders, + bool addStretch = true); +void DeleteLayoutItemWidget(QLayoutItem *item); +EXPORT void ClearLayout(QLayout *layout, int afterIdx = 0); +EXPORT void SetLayoutVisible(QLayout *layout, bool visible); +EXPORT void SetGridLayoutRowVisible(QGridLayout *layout, int row, bool visible); +EXPORT void AddStretchIfNecessary(QBoxLayout *layout); +EXPORT void RemoveStretchIfPresent(QBoxLayout *layout); +EXPORT void MinimizeSizeOfColumn(QGridLayout *layout, int idx); + +} // namespace advss diff --git a/lib/utils/regex-config.cpp b/lib/utils/regex-config.cpp index d1ede88d..109e7ccf 100644 --- a/lib/utils/regex-config.cpp +++ b/lib/utils/regex-config.cpp @@ -1,5 +1,6 @@ #include "regex-config.hpp" #include "obs-module-helper.hpp" +#include "ui-helpers.hpp" #include "utility.hpp" #include diff --git a/lib/utils/resizing-text-edit.cpp b/lib/utils/resizing-text-edit.cpp index 96f3e267..f347da4d 100644 --- a/lib/utils/resizing-text-edit.cpp +++ b/lib/utils/resizing-text-edit.cpp @@ -1,8 +1,8 @@ #include "resizing-text-edit.hpp" +#include "obs-module-helper.hpp" +#include "ui-helpers.hpp" -#include #include -#include namespace advss { diff --git a/lib/utils/scene-selection.cpp b/lib/utils/scene-selection.cpp index f1e08ab1..4a8df23b 100644 --- a/lib/utils/scene-selection.cpp +++ b/lib/utils/scene-selection.cpp @@ -2,7 +2,13 @@ #include "obs-module-helper.hpp" #include "scene-group.hpp" #include "scene-switch-helpers.hpp" +#include "selection-helpers.hpp" +#include "source-helpers.hpp" +#include "ui-helpers.hpp" #include "utility.hpp" +#include "variable.hpp" + +#include namespace advss { diff --git a/lib/utils/scene-selection.hpp b/lib/utils/scene-selection.hpp index b1df49ec..6fa6201a 100644 --- a/lib/utils/scene-selection.hpp +++ b/lib/utils/scene-selection.hpp @@ -1,11 +1,13 @@ #pragma once -#include "scene-group.hpp" -#include "variable.hpp" #include "filter-combo-box.hpp" -#include "utility.hpp" + +#include namespace advss { +struct SceneGroup; +class Variable; + class SceneSelection { public: EXPORT void Save(obs_data_t *obj) const; diff --git a/lib/utils/scene-switch-helpers.cpp b/lib/utils/scene-switch-helpers.cpp index ba0bb44b..c101be15 100644 --- a/lib/utils/scene-switch-helpers.cpp +++ b/lib/utils/scene-switch-helpers.cpp @@ -1,8 +1,9 @@ #include "scene-switch-helpers.hpp" #include "log-helper.hpp" -#include "obs-frontend-api.h" +#include "source-helpers.hpp" #include "switcher-data.hpp" -#include "utility.hpp" + +#include namespace advss { diff --git a/lib/utils/section.cpp b/lib/utils/section.cpp index 1beb3dda..993da25b 100644 --- a/lib/utils/section.cpp +++ b/lib/utils/section.cpp @@ -1,5 +1,5 @@ #include "section.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" #include #include diff --git a/lib/utils/selection-helpers.cpp b/lib/utils/selection-helpers.cpp new file mode 100644 index 00000000..9016b833 --- /dev/null +++ b/lib/utils/selection-helpers.cpp @@ -0,0 +1,334 @@ +#include "selection-helpers.hpp" +#include "obs-module-helper.hpp" +#include "platform-funcs.hpp" +#include "source-helpers.hpp" +#include "scene-group.hpp" + +#include +#include + +namespace advss { + +QStringList GetAudioSourceNames() +{ + auto sourceEnum = [](void *param, obs_source_t *source) -> bool /* -- */ + { + QStringList *list = reinterpret_cast(param); + uint32_t flags = obs_source_get_output_flags(source); + + if ((flags & OBS_SOURCE_AUDIO) != 0) { + *list << obs_source_get_name(source); + } + return true; + }; + + QStringList list; + obs_enum_sources(sourceEnum, &list); + return list; +} + +static void hasFilterEnum(obs_source_t *, obs_source_t *filter, void *ptr) +{ + if (!filter) { + return; + } + bool *hasFilter = reinterpret_cast(ptr); + *hasFilter = true; +} + +QStringList GetSourcesWithFilterNames() +{ + auto enumSourcesWithFilters = [](void *param, obs_source_t *source) { + if (!source) { + return true; + } + QStringList *list = reinterpret_cast(param); + bool hasFilter = false; + obs_source_enum_filters(source, hasFilterEnum, &hasFilter); + if (hasFilter) { + *list << obs_source_get_name(source); + } + return true; + }; + + QStringList list; + obs_enum_sources(enumSourcesWithFilters, &list); + obs_enum_scenes(enumSourcesWithFilters, &list); + return list; +} + +QStringList GetMediaSourceNames() +{ + auto sourceEnum = [](void *param, obs_source_t *source) -> bool /* -- */ + { + QStringList *list = reinterpret_cast(param); + if (IsMediaSource(source)) { + *list << obs_source_get_name(source); + } + return true; + }; + + QStringList list; + obs_enum_sources(sourceEnum, &list); + return list; +} + +QStringList GetVideoSourceNames() +{ + auto sourceEnum = [](void *param, obs_source_t *source) -> bool /* -- */ + { + QStringList *list = reinterpret_cast(param); + uint32_t flags = obs_source_get_output_flags(source); + std::string test = obs_source_get_name(source); + if ((flags & (OBS_SOURCE_VIDEO | OBS_SOURCE_ASYNC)) != 0) { + *list << obs_source_get_name(source); + } + return true; + }; + + QStringList list; + obs_enum_sources(sourceEnum, &list); + return list; +} + +QStringList GetSceneNames() +{ + QStringList list; + char **scenes = obs_frontend_get_scene_names(); + char **temp = scenes; + while (*temp) { + const char *name = *temp; + list << name; + temp++; + } + bfree(scenes); + return list; +} + +QStringList GetSourceNames() +{ + auto sourceEnum = [](void *param, obs_source_t *source) -> bool /* -- */ + { + QStringList *list = reinterpret_cast(param); + *list << obs_source_get_name(source); + return true; + }; + + QStringList list; + obs_enum_sources(sourceEnum, &list); + return list; +} + +void PopulateTransitionSelection(QComboBox *sel, bool addCurrent, bool addAny, + bool addSelect) +{ + + obs_frontend_source_list *transitions = new obs_frontend_source_list(); + obs_frontend_get_transitions(transitions); + + for (size_t i = 0; i < transitions->sources.num; i++) { + const char *name = + obs_source_get_name(transitions->sources.array[i]); + sel->addItem(name); + } + + obs_frontend_source_list_free(transitions); + + sel->model()->sort(0); + + if (addSelect) { + AddSelectionEntry( + sel, + obs_module_text("AdvSceneSwitcher.selectTransition")); + } + sel->setCurrentIndex(0); + + if (addCurrent) { + sel->insertItem( + addSelect ? 1 : 0, + obs_module_text("AdvSceneSwitcher.currentTransition")); + } + if (addAny) { + sel->insertItem( + addSelect ? 1 : 0, + obs_module_text("AdvSceneSwitcher.anyTransition")); + } +} + +void PopulateWindowSelection(QComboBox *sel, bool addSelect) +{ + + std::vector windows; + GetWindowList(windows); + + for (std::string &window : windows) { + sel->addItem(window.c_str()); + } + + sel->model()->sort(0); + if (addSelect) { + AddSelectionEntry( + sel, obs_module_text("AdvSceneSwitcher.selectWindow")); + } + sel->setCurrentIndex(0); +#ifdef WIN32 + sel->setItemData(0, obs_module_text("AdvSceneSwitcher.selectWindowTip"), + Qt::ToolTipRole); +#endif +} + +void PopulateAudioSelection(QComboBox *sel, bool addSelect) +{ + auto sources = GetAudioSourceNames(); + sources.sort(); + sel->addItems(sources); + + if (addSelect) { + AddSelectionEntry( + sel, + obs_module_text("AdvSceneSwitcher.selectAudioSource"), + false, + obs_module_text( + "AdvSceneSwitcher.invaildEntriesWillNotBeSaved")); + } + sel->setCurrentIndex(0); +} + +void PopulateVideoSelection(QComboBox *sel, bool addMainOutput, bool addScenes, + bool addSelect) +{ + + auto sources = GetVideoSourceNames(); + sources.sort(); + sel->addItems(sources); + if (addScenes) { + auto scenes = GetSceneNames(); + scenes.sort(); + sel->addItems(scenes); + } + + sel->model()->sort(0); + if (addMainOutput) { + sel->insertItem( + 0, obs_module_text("AdvSceneSwitcher.OBSVideoOutput")); + } + if (addSelect) { + AddSelectionEntry( + sel, + obs_module_text("AdvSceneSwitcher.selectVideoSource"), + false, + obs_module_text( + "AdvSceneSwitcher.invaildEntriesWillNotBeSaved")); + } + sel->setCurrentIndex(0); +} + +void PopulateMediaSelection(QComboBox *sel, bool addSelect) +{ + auto sources = GetMediaSourceNames(); + sources.sort(); + sel->addItems(sources); + + if (addSelect) { + AddSelectionEntry( + sel, + obs_module_text("AdvSceneSwitcher.selectMediaSource"), + false, + obs_module_text( + "AdvSceneSwitcher.invaildEntriesWillNotBeSaved")); + } + sel->setCurrentIndex(0); +} + +void PopulateProcessSelection(QComboBox *sel, bool addSelect) +{ + QStringList processes; + GetProcessList(processes); + processes.sort(); + for (QString &process : processes) { + sel->addItem(process); + } + + sel->model()->sort(0); + if (addSelect) { + AddSelectionEntry( + sel, obs_module_text("AdvSceneSwitcher.selectProcess")); + } + sel->setCurrentIndex(0); +} + +void PopulateSceneSelection(QComboBox *sel, bool addPrevious, bool addCurrent, + bool addAny, bool addSceneGroup, + std::deque *sceneGroups, bool addSelect, + std::string selectText, bool selectable) +{ + auto sceneNames = GetSceneNames(); + sel->addItems(sceneNames); + + if (addSceneGroup && sceneGroups) { + for (auto &sg : *sceneGroups) { + sel->addItem(QString::fromStdString(sg.name)); + } + } + + sel->model()->sort(0); + if (addSelect) { + if (selectText.empty()) { + AddSelectionEntry( + sel, + obs_module_text("AdvSceneSwitcher.selectScene"), + selectable, + obs_module_text( + "AdvSceneSwitcher.invaildEntriesWillNotBeSaved")); + } else { + AddSelectionEntry(sel, selectText.c_str(), selectable); + } + } + sel->setCurrentIndex(0); + + if (addPrevious) { + sel->insertItem( + 1, obs_module_text( + "AdvSceneSwitcher.selectPreviousScene")); + } + if (addCurrent) { + sel->insertItem( + 1, + obs_module_text("AdvSceneSwitcher.selectCurrentScene")); + } + if (addAny) { + sel->insertItem( + 1, obs_module_text("AdvSceneSwitcher.selectAnyScene")); + } +} + +void AddSelectionEntry(QComboBox *sel, const char *description, bool selectable, + const char *tooltip) +{ + sel->insertItem(0, description); + + if (strcmp(tooltip, "") != 0) { + sel->setItemData(0, tooltip, Qt::ToolTipRole); + } + + QStandardItemModel *model = + qobject_cast(sel->model()); + QModelIndex firstIndex = + model->index(0, sel->modelColumn(), sel->rootModelIndex()); + QStandardItem *firstItem = model->itemFromIndex(firstIndex); + if (!selectable) { + firstItem->setSelectable(false); + firstItem->setEnabled(false); + } +} + +void AddSelectionGroup(QComboBox *selection, const QStringList &group, + bool addSeparator) +{ + selection->addItems(group); + if (addSeparator) { + selection->insertSeparator(selection->count()); + } +} + +} // namespace advss diff --git a/lib/utils/selection-helpers.hpp b/lib/utils/selection-helpers.hpp new file mode 100644 index 00000000..c0c411ec --- /dev/null +++ b/lib/utils/selection-helpers.hpp @@ -0,0 +1,42 @@ +#pragma once +#include "export-symbol-helper.hpp" + +#include +#include +#include +#include +#include + +namespace advss { + +struct SceneGroup; + +EXPORT QStringList GetAudioSourceNames(); +EXPORT QStringList GetSourcesWithFilterNames(); +EXPORT QStringList GetMediaSourceNames(); +EXPORT QStringList GetVideoSourceNames(); +EXPORT QStringList GetSceneNames(); +EXPORT QStringList GetSourceNames(); + +EXPORT void PopulateTransitionSelection(QComboBox *sel, bool addCurrent = true, + bool addAny = false, + bool addSelect = true); +EXPORT void PopulateWindowSelection(QComboBox *sel, bool addSelect = true); +void PopulateAudioSelection(QComboBox *sel, bool addSelect = true); +void PopulateVideoSelection(QComboBox *sel, bool addMainOutput = false, + bool addScenes = false, bool addSelect = true); +void PopulateMediaSelection(QComboBox *sel, bool addSelect = true); +EXPORT void PopulateProcessSelection(QComboBox *sel, bool addSelect = true); +EXPORT void PopulateSceneSelection( + QComboBox *sel, bool addPrevious = false, bool addCurrent = false, + bool addAny = false, bool addSceneGroup = false, + std::deque *sceneGroups = nullptr, bool addSelect = true, + std::string selectText = "", bool selectable = false); + +EXPORT void AddSelectionEntry(QComboBox *sel, const char *description, + bool selectable = false, + const char *tooltip = ""); +EXPORT void AddSelectionGroup(QComboBox *selection, const QStringList &group, + bool addSeparator = true); + +} // namespace advss diff --git a/lib/utils/source-helpers.cpp b/lib/utils/source-helpers.cpp new file mode 100644 index 00000000..e87c21d6 --- /dev/null +++ b/lib/utils/source-helpers.cpp @@ -0,0 +1,136 @@ +#include "source-helpers.hpp" + +#include + +namespace advss { + +bool WeakSourceValid(obs_weak_source_t *ws) +{ + obs_source_t *source = obs_weak_source_get_source(ws); + if (source) { + obs_source_release(source); + } + return !!source; +} + +std::string GetWeakSourceName(obs_weak_source_t *weak_source) +{ + std::string name; + + obs_source_t *source = obs_weak_source_get_source(weak_source); + if (source) { + name = obs_source_get_name(source); + obs_source_release(source); + } + + return name; +} + +OBSWeakSource GetWeakSourceByName(const char *name) +{ + OBSWeakSource weak; + obs_source_t *source = obs_get_source_by_name(name); + if (source) { + weak = obs_source_get_weak_source(source); + obs_weak_source_release(weak); + obs_source_release(source); + } + + return weak; +} + +OBSWeakSource GetWeakSourceByQString(const QString &name) +{ + return GetWeakSourceByName(name.toUtf8().constData()); +} + +OBSWeakSource GetWeakTransitionByName(const char *transitionName) +{ + OBSWeakSource weak; + obs_source_t *source = nullptr; + + if (strcmp(transitionName, "Default") == 0) { + source = obs_frontend_get_current_transition(); + weak = obs_source_get_weak_source(source); + obs_source_release(source); + obs_weak_source_release(weak); + return weak; + } + + obs_frontend_source_list *transitions = new obs_frontend_source_list(); + obs_frontend_get_transitions(transitions); + bool match = false; + + for (size_t i = 0; i < transitions->sources.num; i++) { + const char *name = + obs_source_get_name(transitions->sources.array[i]); + if (strcmp(transitionName, name) == 0) { + match = true; + source = transitions->sources.array[i]; + break; + } + } + + if (match) { + weak = obs_source_get_weak_source(source); + obs_weak_source_release(weak); + } + obs_frontend_source_list_free(transitions); + + return weak; +} + +OBSWeakSource GetWeakTransitionByQString(const QString &name) +{ + return GetWeakTransitionByName(name.toUtf8().constData()); +} + +OBSWeakSource GetWeakFilterByName(OBSWeakSource source, const char *name) +{ + OBSWeakSource weak; + auto s = obs_weak_source_get_source(source); + if (s) { + auto filterSource = obs_source_get_filter_by_name(s, name); + weak = obs_source_get_weak_source(filterSource); + obs_weak_source_release(weak); + obs_source_release(filterSource); + obs_source_release(s); + } + return weak; +} + +OBSWeakSource GetWeakFilterByQString(OBSWeakSource source, const QString &name) +{ + return GetWeakFilterByName(source, name.toUtf8().constData()); +} + +static bool getTotalSceneItemCountHelper(obs_scene_t *, obs_sceneitem_t *item, + void *ptr) +{ + auto count = reinterpret_cast(ptr); + + if (obs_sceneitem_is_group(item)) { + obs_scene_t *scene = obs_sceneitem_group_get_scene(item); + obs_scene_enum_items(scene, getTotalSceneItemCountHelper, ptr); + } + *count = *count + 1; + return true; +} + +int GetSceneItemCount(const OBSWeakSource &sceneWeakSource) +{ + auto s = obs_weak_source_get_source(sceneWeakSource); + auto scene = obs_scene_from_source(s); + int count = 0; + obs_scene_enum_items(scene, getTotalSceneItemCountHelper, &count); + obs_source_release(s); + return count; +} + +bool IsMediaSource(obs_source_t *source) +{ + uint32_t flags = obs_source_get_output_flags(source); + return (flags & OBS_SOURCE_CONTROLLABLE_MEDIA) != 0; +} + +} // namespace advss diff --git a/lib/utils/source-helpers.hpp b/lib/utils/source-helpers.hpp new file mode 100644 index 00000000..f43cd23d --- /dev/null +++ b/lib/utils/source-helpers.hpp @@ -0,0 +1,23 @@ +#pragma once +#include "export-symbol-helper.hpp" + +#include +#include +#include + +namespace advss { + +EXPORT bool WeakSourceValid(obs_weak_source_t *ws); +EXPORT std::string GetWeakSourceName(obs_weak_source_t *weak_source); +EXPORT OBSWeakSource GetWeakSourceByName(const char *name); +EXPORT OBSWeakSource GetWeakSourceByQString(const QString &name); +EXPORT OBSWeakSource GetWeakTransitionByName(const char *transitionName); +EXPORT OBSWeakSource GetWeakTransitionByQString(const QString &name); +EXPORT OBSWeakSource GetWeakFilterByName(OBSWeakSource source, + const char *name); +EXPORT OBSWeakSource GetWeakFilterByQString(OBSWeakSource source, + const QString &name); +EXPORT int GetSceneItemCount(const OBSWeakSource &); +EXPORT bool IsMediaSource(obs_source_t *source); + +} // namespace advss diff --git a/lib/utils/source-selection.cpp b/lib/utils/source-selection.cpp index 81698243..ac157fce 100644 --- a/lib/utils/source-selection.cpp +++ b/lib/utils/source-selection.cpp @@ -1,6 +1,8 @@ #include "source-selection.hpp" #include "obs-module-helper.hpp" -#include "utility.hpp" +#include "selection-helpers.hpp" +#include "source-helpers.hpp" +#include "ui-helpers.hpp" #include "variable.hpp" namespace advss { diff --git a/lib/utils/splitter-helpers.cpp b/lib/utils/splitter-helpers.cpp new file mode 100644 index 00000000..6cb5b2b4 --- /dev/null +++ b/lib/utils/splitter-helpers.cpp @@ -0,0 +1,33 @@ +#include "splitter-helpers.hpp" + +namespace advss { + +void SaveSplitterPos(const QList &sizes, obs_data_t *obj, + const std::string &name) +{ + auto array = obs_data_array_create(); + for (int i = 0; i < sizes.count(); ++i) { + obs_data_t *array_obj = obs_data_create(); + obs_data_set_int(array_obj, "pos", sizes[i]); + obs_data_array_push_back(array, array_obj); + obs_data_release(array_obj); + } + obs_data_set_array(obj, name.c_str(), array); + obs_data_array_release(array); +} + +void LoadSplitterPos(QList &sizes, obs_data_t *obj, + const std::string &name) +{ + sizes.clear(); + obs_data_array_t *array = obs_data_get_array(obj, name.c_str()); + size_t count = obs_data_array_count(array); + for (size_t i = 0; i < count; i++) { + obs_data_t *item = obs_data_array_item(array, i); + sizes << obs_data_get_int(item, "pos"); + obs_data_release(item); + } + obs_data_array_release(array); +} + +} // namespace advss diff --git a/lib/utils/splitter-helpers.hpp b/lib/utils/splitter-helpers.hpp new file mode 100644 index 00000000..1c77115a --- /dev/null +++ b/lib/utils/splitter-helpers.hpp @@ -0,0 +1,15 @@ +#pragma once +#include "export-symbol-helper.hpp" + +#include +#include +#include + +namespace advss { + +void SaveSplitterPos(const QList &sizes, obs_data_t *obj, + const std::string &name); +void LoadSplitterPos(QList &sizes, obs_data_t *obj, + const std::string &name); + +} // namespace advss diff --git a/lib/utils/status-control.cpp b/lib/utils/status-control.cpp index d14c6f33..bccea431 100644 --- a/lib/utils/status-control.cpp +++ b/lib/utils/status-control.cpp @@ -1,10 +1,12 @@ #include "status-control.hpp" #include "obs-module-helper.hpp" #include "plugin-state-helpers.hpp" +#include "ui-helpers.hpp" #include "utility.hpp" -#include +#include #include +#include #include namespace advss { diff --git a/lib/utils/temp-variable.cpp b/lib/utils/temp-variable.cpp index d2fdfea3..56084521 100644 --- a/lib/utils/temp-variable.cpp +++ b/lib/utils/temp-variable.cpp @@ -4,6 +4,7 @@ #include "macro.hpp" #include "macro-segment.hpp" #include "plugin-state-helpers.hpp" +#include "ui-helpers.hpp" #include "utility.hpp" #include diff --git a/lib/utils/ui-helpers.cpp b/lib/utils/ui-helpers.cpp new file mode 100644 index 00000000..05e512b2 --- /dev/null +++ b/lib/utils/ui-helpers.cpp @@ -0,0 +1,170 @@ +#include "ui-helpers.hpp" +#include "non-modal-dialog.hpp" +#include "obs-module-helper.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace advss { + +QMetaObject::Connection PulseWidget(QWidget *widget, QColor startColor, + QColor endColor, bool once) +{ + QGraphicsColorizeEffect *effect = new QGraphicsColorizeEffect(widget); + widget->setGraphicsEffect(effect); + QPropertyAnimation *animation = + new QPropertyAnimation(effect, "color", widget); + animation->setStartValue(startColor); + animation->setEndValue(endColor); + animation->setDuration(1000); + + QMetaObject::Connection con; + if (once) { + auto widgetPtr = widget; + con = QWidget::connect( + animation, &QPropertyAnimation::finished, + [widgetPtr]() { + if (widgetPtr) { + widgetPtr->setGraphicsEffect(nullptr); + } + }); + animation->start(QPropertyAnimation::DeleteWhenStopped); + } else { + auto widgetPtr = widget; + con = QWidget::connect( + animation, &QPropertyAnimation::finished, + [animation, widgetPtr]() { + QTimer *timer = new QTimer(widgetPtr); + QWidget::connect(timer, &QTimer::timeout, + [animation] { + animation->start(); + }); + timer->setSingleShot(true); + timer->start(1000); + }); + animation->start(); + } + return con; +} + +static int getHorizontalScrollBarHeight(QListWidget *list) +{ + if (!list) { + return 0; + } + auto horizontalScrollBar = list->horizontalScrollBar(); + if (!horizontalScrollBar || !horizontalScrollBar->isVisible()) { + return 0; + } + return horizontalScrollBar->height(); +} + +void SetHeightToContentHeight(QListWidget *list) +{ + auto nrItems = list->count(); + if (nrItems == 0) { + list->setMaximumHeight(0); + list->setMinimumHeight(0); + return; + } + + int scrollBarHeight = getHorizontalScrollBarHeight(list); + int height = (list->sizeHintForRow(0) + list->spacing()) * nrItems + + 2 * list->frameWidth() + scrollBarHeight; + list->setMinimumHeight(height); + list->setMaximumHeight(height); +} + +void SetButtonIcon(QPushButton *button, const char *path) +{ + QIcon icon; + icon.addFile(QString::fromUtf8(path), QSize(), QIcon::Normal, + QIcon::Off); + button->setIcon(icon); +} + +int FindIdxInRagne(QComboBox *list, int start, int stop, + const std::string &value, Qt::MatchFlags flags) +{ + if (value.empty()) { + return -1; + } + auto model = list->model(); + auto startIdx = model->index(start, 0); + auto match = model->match(startIdx, Qt::DisplayRole, + QString::fromStdString(value), 1, flags); + if (match.isEmpty()) { + return -1; + } + int foundIdx = match.first().row(); + if (foundIdx > stop) { + return -1; + } + return foundIdx; +} + +QWidget *GetSettingsWindow(); + +bool DisplayMessage(const QString &msg, bool question, bool modal) +{ + if (!modal) { + auto dialog = new NonModalMessageDialog(msg, question); + QMessageBox::StandardButton answer = dialog->ShowMessage(); + return (answer == QMessageBox::Yes); + } else if (question && modal) { + auto answer = QMessageBox::question( + GetSettingsWindow() + ? GetSettingsWindow() + : static_cast( + obs_frontend_get_main_window()), + obs_module_text("AdvSceneSwitcher.windowTitle"), msg, + QMessageBox::Yes | QMessageBox::No); + return answer == QMessageBox::Yes; + } + + QMessageBox Msgbox; + Msgbox.setWindowTitle(obs_module_text("AdvSceneSwitcher.windowTitle")); + Msgbox.setText(msg); + Msgbox.exec(); + return false; +} + +void DisplayTrayMessage(const QString &title, const QString &msg, + const QIcon &icon) +{ + auto tray = reinterpret_cast( + obs_frontend_get_system_tray()); + if (!tray) { + return; + } + if (icon.isNull()) { + tray->showMessage(title, msg); + } else { + tray->showMessage(title, msg, icon); + } +} + +std::string GetThemeTypeName() +{ +#if LIBOBS_API_VER >= MAKE_SEMANTIC_VERSION(29, 0, 0) + return obs_frontend_is_theme_dark() ? "Dark" : "Light"; +#else + auto mainWindow = + static_cast(obs_frontend_get_main_window()); + if (!mainWindow) { + return "Dark"; + } + QColor color = mainWindow->palette().text().color(); + const bool themeDarkMode = !(color.redF() < 0.5); + return themeDarkMode ? "Dark" : "Light"; +#endif +} + +} // namespace advss diff --git a/lib/utils/ui-helpers.hpp b/lib/utils/ui-helpers.hpp new file mode 100644 index 00000000..41407373 --- /dev/null +++ b/lib/utils/ui-helpers.hpp @@ -0,0 +1,32 @@ +#pragma once +#include "export-symbol-helper.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace advss { + +EXPORT QMetaObject::Connection PulseWidget(QWidget *widget, QColor startColor, + QColor endColor = QColor(0, 0, 0, 0), + bool once = false); + +EXPORT void SetHeightToContentHeight(QListWidget *list); +EXPORT void SetButtonIcon(QPushButton *button, const char *path); +EXPORT int +FindIdxInRagne(QComboBox *list, int start, int stop, const std::string &value, + Qt::MatchFlags = Qt::MatchExactly | Qt::MatchCaseSensitive); + +EXPORT bool DisplayMessage(const QString &msg, bool question = false, + bool modal = true); +EXPORT void DisplayTrayMessage(const QString &title, const QString &msg, + const QIcon &icon = QIcon()); + +EXPORT std::string GetThemeTypeName(); + +} // namespace advss diff --git a/lib/utils/utility.cpp b/lib/utils/utility.cpp index 037d0988..cd890de8 100644 --- a/lib/utils/utility.cpp +++ b/lib/utils/utility.cpp @@ -1,316 +1,56 @@ #include "utility.hpp" -#include "platform-funcs.hpp" -#include "scene-selection.hpp" -#include "regex-config.hpp" -#include "scene-group.hpp" -#include "non-modal-dialog.hpp" #include "obs-module-helper.hpp" -#include "macro.hpp" -#include "macro-action-edit.hpp" -#include "macro-condition-edit.hpp" +#include "obs.hpp" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include +#include +#include +#include +#include namespace advss { -bool WeakSourceValid(obs_weak_source_t *ws) +std::pair GetCursorPos() { - obs_source_t *source = obs_weak_source_get_source(ws); - if (source) { - obs_source_release(source); - } - return !!source; + auto cursorPos = QCursor::pos(); + return {cursorPos.x(), cursorPos.y()}; } -std::string GetWeakSourceName(obs_weak_source_t *weak_source) +bool DoubleEquals(double left, double right, double epsilon) { - std::string name; - - obs_source_t *source = obs_weak_source_get_source(weak_source); - if (source) { - name = obs_source_get_name(source); - obs_source_release(source); - } - - return name; + return (fabs(left - right) < epsilon); } -OBSWeakSource GetWeakSourceByName(const char *name) +void ReplaceAll(std::string &str, const std::string &from, + const std::string &to) { - OBSWeakSource weak; - obs_source_t *source = obs_get_source_by_name(name); - if (source) { - weak = obs_source_get_weak_source(source); - obs_weak_source_release(weak); - obs_source_release(source); - } - - return weak; -} - -OBSWeakSource GetWeakSourceByQString(const QString &name) -{ - return GetWeakSourceByName(name.toUtf8().constData()); -} - -OBSWeakSource GetWeakTransitionByName(const char *transitionName) -{ - OBSWeakSource weak; - obs_source_t *source = nullptr; - - if (strcmp(transitionName, "Default") == 0) { - source = obs_frontend_get_current_transition(); - weak = obs_source_get_weak_source(source); - obs_source_release(source); - obs_weak_source_release(weak); - return weak; - } - - obs_frontend_source_list *transitions = new obs_frontend_source_list(); - obs_frontend_get_transitions(transitions); - bool match = false; - - for (size_t i = 0; i < transitions->sources.num; i++) { - const char *name = - obs_source_get_name(transitions->sources.array[i]); - if (strcmp(transitionName, name) == 0) { - match = true; - source = transitions->sources.array[i]; - break; - } - } - - if (match) { - weak = obs_source_get_weak_source(source); - obs_weak_source_release(weak); - } - obs_frontend_source_list_free(transitions); - - return weak; -} - -OBSWeakSource GetWeakTransitionByQString(const QString &name) -{ - return GetWeakTransitionByName(name.toUtf8().constData()); -} - -OBSWeakSource GetWeakFilterByName(OBSWeakSource source, const char *name) -{ - OBSWeakSource weak; - auto s = obs_weak_source_get_source(source); - if (s) { - auto filterSource = obs_source_get_filter_by_name(s, name); - weak = obs_source_get_weak_source(filterSource); - obs_weak_source_release(weak); - obs_source_release(filterSource); - obs_source_release(s); - } - return weak; -} - -OBSWeakSource GetWeakFilterByQString(OBSWeakSource source, const QString &name) -{ - return GetWeakFilterByName(source, name.toUtf8().constData()); -} - -std::string -getNextDelim(const std::string &text, - std::unordered_map placeholders) -{ - size_t pos = std::string::npos; - std::string res = ""; - - for (const auto &ph : placeholders) { - size_t newPos = text.find(ph.first); - if (newPos <= pos) { - pos = newPos; - res = ph.first; - } - } - - if (pos == std::string::npos) { - return ""; - } - - return res; -} - -void PlaceWidgets(std::string text, QBoxLayout *layout, - std::unordered_map placeholders, - bool addStretch) -{ - std::vector> labelsWidgetsPairs; - - std::string delim = getNextDelim(text, placeholders); - while (delim != "") { - size_t pos = text.find(delim); - if (pos != std::string::npos) { - labelsWidgetsPairs.emplace_back(text.substr(0, pos), - placeholders[delim]); - text.erase(0, pos + delim.length()); - } - delim = getNextDelim(text, placeholders); - } - - if (text != "") { - labelsWidgetsPairs.emplace_back(text, nullptr); - } - - for (auto &lw : labelsWidgetsPairs) { - if (lw.first != "") { - layout->addWidget(new QLabel(lw.first.c_str())); - } - if (lw.second) { - layout->addWidget(lw.second); - } - } - if (addStretch) { - layout->addStretch(); - } -} - -void DeleteLayoutItemWidget(QLayoutItem *item) -{ - if (item) { - auto widget = item->widget(); - if (widget) { - widget->setVisible(false); - widget->deleteLater(); - } - delete item; - } -} - -void ClearLayout(QLayout *layout, int afterIdx) -{ - QLayoutItem *item; - while ((item = layout->takeAt(afterIdx))) { - if (item->layout()) { - ClearLayout(item->layout()); - delete item->layout(); - } - DeleteLayoutItemWidget(item); - } -} - -void SetLayoutVisible(QLayout *layout, bool visible) -{ - if (!layout) { + if (from.empty()) { return; } - for (int i = 0; i < layout->count(); ++i) { - QWidget *widget = layout->itemAt(i)->widget(); - QLayout *nestedLayout = layout->itemAt(i)->layout(); - if (widget) { - widget->setVisible(visible); - } - if (nestedLayout) { - SetLayoutVisible(nestedLayout, visible); - } + size_t start_pos = 0; + while ((start_pos = str.find(from, start_pos)) != std::string::npos) { + str.replace(start_pos, from.length(), to); + start_pos += to.length(); } } -void SetGridLayoutRowVisible(QGridLayout *layout, int row, bool visible) +std::optional GetJsonField(const std::string &jsonStr, + const std::string &fieldToExtract) { - for (int col = 0; col < layout->columnCount(); col++) { - auto item = layout->itemAtPosition(row, col); - if (!item) { - continue; + try { + nlohmann::json json = nlohmann::json::parse(jsonStr); + auto it = json.find(fieldToExtract); + if (it == json.end()) { + return {}; } - - auto rowLayout = item->layout(); - if (rowLayout) { - SetLayoutVisible(rowLayout, visible); - } - - auto widget = item->widget(); - if (widget) { - widget->setVisible(visible); + if (it->is_string()) { + return it->get(); } + return it->dump(); + } catch (const nlohmann::json::exception &) { + return {}; } - - if (!visible) { - layout->setRowMinimumHeight(row, 0); - } -} - -void AddStretchIfNecessary(QBoxLayout *layout) -{ - int itemCount = layout->count(); - if (itemCount > 0) { - auto lastItem = layout->itemAt(itemCount - 1); - auto lastSpacer = dynamic_cast(lastItem); - if (!lastSpacer) { - layout->addStretch(); - } - } else { - layout->addStretch(); - } -} - -void RemoveStretchIfPresent(QBoxLayout *layout) -{ - int itemCount = layout->count(); - if (itemCount > 0) { - auto lastItem = layout->itemAt(itemCount - 1); - auto lastSpacer = dynamic_cast(lastItem); - if (lastSpacer) { - layout->removeItem(lastItem); - delete lastItem; - } - } -} - -void MinimizeSizeOfColumn(QGridLayout *layout, int idx) -{ - if (idx >= layout->columnCount()) { - return; - } - - for (int i = 0; i < layout->columnCount(); i++) { - if (i == idx) { - layout->setColumnStretch(i, 0); - } else { - layout->setColumnStretch(i, 1); - } - } - - int columnWidth = 0; - for (int row = 0; row < layout->rowCount(); row++) { - auto item = layout->itemAtPosition(row, idx); - if (!item) { - continue; - } - auto widget = item->widget(); - if (!widget) { - continue; - } - columnWidth = std::max(columnWidth, - widget->minimumSizeHint().width()); - } - layout->setColumnMinimumWidth(idx, columnWidth); + return {}; } bool CompareIgnoringLineEnding(QString &s1, QString &s2) @@ -343,595 +83,33 @@ std::string GetDataFilePath(const std::string &file) return ""; } -static bool getTotalSceneItemCountHelper(obs_scene_t *, obs_sceneitem_t *item, - void *ptr) +QString GetDefaultSettingsSaveLocation() { - auto count = reinterpret_cast(ptr); + QString desktopPath = QStandardPaths::writableLocation( + QStandardPaths::DesktopLocation); - if (obs_sceneitem_is_group(item)) { - obs_scene_t *scene = obs_sceneitem_group_get_scene(item); - obs_scene_enum_items(scene, getTotalSceneItemCountHelper, ptr); - } - *count = *count + 1; - return true; -} + auto scName = obs_frontend_get_current_scene_collection(); + QString sceneCollectionName(scName); + bfree(scName); -int GetSceneItemCount(const OBSWeakSource &sceneWeakSource) -{ - auto s = obs_weak_source_get_source(sceneWeakSource); - auto scene = obs_scene_from_source(s); - int count = 0; - obs_scene_enum_items(scene, getTotalSceneItemCountHelper, &count); - obs_source_release(s); - return count; -} + auto timestamp = QDateTime::currentDateTime(); + auto path = desktopPath + "/adv-ss-" + sceneCollectionName + "-" + + timestamp.toString("yyyy.MM.dd.hh.mm.ss"); -QWidget *GetSettingsWindow(); - -bool DisplayMessage(const QString &msg, bool question, bool modal) -{ - if (!modal) { - auto dialog = new NonModalMessageDialog(msg, question); - QMessageBox::StandardButton answer = dialog->ShowMessage(); - return (answer == QMessageBox::Yes); - } else if (question && modal) { - auto answer = QMessageBox::question( - GetSettingsWindow() - ? GetSettingsWindow() - : static_cast( - obs_frontend_get_main_window()), - obs_module_text("AdvSceneSwitcher.windowTitle"), msg, - QMessageBox::Yes | QMessageBox::No); - return answer == QMessageBox::Yes; + // Check if scene collection name contains invalid path characters + QFile file(path); + if (file.exists()) { + return path; } - QMessageBox Msgbox; - Msgbox.setWindowTitle(obs_module_text("AdvSceneSwitcher.windowTitle")); - Msgbox.setText(msg); - Msgbox.exec(); - return false; -} - -void DisplayTrayMessage(const QString &title, const QString &msg, - const QIcon &icon) -{ - auto tray = reinterpret_cast( - obs_frontend_get_system_tray()); - if (!tray) { - return; - } - if (icon.isNull()) { - tray->showMessage(title, msg); - } else { - tray->showMessage(title, msg, icon); - } -} - -void AddSelectionEntry(QComboBox *sel, const char *description, bool selectable, - const char *tooltip) -{ - sel->insertItem(0, description); - - if (strcmp(tooltip, "") != 0) { - sel->setItemData(0, tooltip, Qt::ToolTipRole); + bool validPath = file.open(QIODevice::WriteOnly); + if (validPath) { + file.remove(); + return path; } - QStandardItemModel *model = - qobject_cast(sel->model()); - QModelIndex firstIndex = - model->index(0, sel->modelColumn(), sel->rootModelIndex()); - QStandardItem *firstItem = model->itemFromIndex(firstIndex); - if (!selectable) { - firstItem->setSelectable(false); - firstItem->setEnabled(false); - } -} - -bool IsValidMacroSegmentIndex(Macro *m, const int idx, bool isCondition) -{ - if (!m || idx < 0) { - return false; - } - if (isCondition) { - if (idx >= (int)m->Conditions().size()) { - return false; - } - } else { - if (idx >= (int)m->Actions().size()) { - return false; - } - } - return true; -} - -QString GetMacroSegmentDescription(Macro *macro, int idx, bool isCondition) -{ - if (!macro) { - return ""; - } - if (!IsValidMacroSegmentIndex(macro, idx, isCondition)) { - return ""; - } - - MacroSegment *segment; - if (isCondition) { - segment = macro->Conditions().at(idx).get(); - } else { - segment = macro->Actions().at(idx).get(); - } - - QString description = QString::fromStdString(segment->GetShortDesc()); - QString type; - if (isCondition) { - type = obs_module_text(MacroConditionFactory::GetConditionName( - segment->GetId()) - .c_str()); - } else { - type = obs_module_text( - MacroActionFactory::GetActionName(segment->GetId()) - .c_str()); - } - - QString result = type; - if (!description.isEmpty()) { - result += ": " + description; - } - return result; -} - -void SaveSplitterPos(const QList &sizes, obs_data_t *obj, - const std::string name) -{ - auto array = obs_data_array_create(); - for (int i = 0; i < sizes.count(); ++i) { - obs_data_t *array_obj = obs_data_create(); - obs_data_set_int(array_obj, "pos", sizes[i]); - obs_data_array_push_back(array, array_obj); - obs_data_release(array_obj); - } - obs_data_set_array(obj, name.c_str(), array); - obs_data_array_release(array); -} - -void LoadSplitterPos(QList &sizes, obs_data_t *obj, const std::string name) -{ - sizes.clear(); - obs_data_array_t *array = obs_data_get_array(obj, name.c_str()); - size_t count = obs_data_array_count(array); - for (size_t i = 0; i < count; i++) { - obs_data_t *item = obs_data_array_item(array, i); - sizes << obs_data_get_int(item, "pos"); - obs_data_release(item); - } - obs_data_array_release(array); -} - -std::optional GetJsonField(const std::string &jsonStr, - const std::string &fieldToExtract) -{ - try { - nlohmann::json json = nlohmann::json::parse(jsonStr); - auto it = json.find(fieldToExtract); - if (it == json.end()) { - return {}; - } - if (it->is_string()) { - return it->get(); - } - return it->dump(); - } catch (const nlohmann::json::exception &) { - return {}; - } - return {}; -} - -QStringList GetSourceNames() -{ - auto sourceEnum = [](void *param, obs_source_t *source) -> bool /* -- */ - { - QStringList *list = reinterpret_cast(param); - *list << obs_source_get_name(source); - return true; - }; - - QStringList list; - obs_enum_sources(sourceEnum, &list); - return list; -} - -QStringList GetFilterNames(OBSWeakSource weakSource) -{ - if (!weakSource) { - return {}; - } - - QStringList list; - auto enumFilters = [](obs_source_t *, obs_source_t *filter, void *ptr) { - auto name = obs_source_get_name(filter); - QStringList *list = reinterpret_cast(ptr); - *list << QString(name); - }; - - auto s = obs_weak_source_get_source(weakSource); - obs_source_enum_filters(s, enumFilters, &list); - obs_source_release(s); - return list; -} - -void PopulateSourceSelection(QComboBox *list, bool addSelect) -{ - auto sources = GetSourceNames(); - sources.sort(); - list->addItems(sources); - - if (addSelect) { - AddSelectionEntry( - list, obs_module_text("AdvSceneSwitcher.selectSource"), - false); - } - list->setCurrentIndex(0); -} - -void PopulateTransitionSelection(QComboBox *sel, bool addCurrent, bool addAny, - bool addSelect) -{ - - obs_frontend_source_list *transitions = new obs_frontend_source_list(); - obs_frontend_get_transitions(transitions); - - for (size_t i = 0; i < transitions->sources.num; i++) { - const char *name = - obs_source_get_name(transitions->sources.array[i]); - sel->addItem(name); - } - - obs_frontend_source_list_free(transitions); - - sel->model()->sort(0); - - if (addSelect) { - AddSelectionEntry( - sel, - obs_module_text("AdvSceneSwitcher.selectTransition")); - } - sel->setCurrentIndex(0); - - if (addCurrent) { - sel->insertItem( - addSelect ? 1 : 0, - obs_module_text("AdvSceneSwitcher.currentTransition")); - } - if (addAny) { - sel->insertItem( - addSelect ? 1 : 0, - obs_module_text("AdvSceneSwitcher.anyTransition")); - } -} - -void PopulateWindowSelection(QComboBox *sel, bool addSelect) -{ - - std::vector windows; - GetWindowList(windows); - - for (std::string &window : windows) { - sel->addItem(window.c_str()); - } - - sel->model()->sort(0); - if (addSelect) { - AddSelectionEntry( - sel, obs_module_text("AdvSceneSwitcher.selectWindow")); - } - sel->setCurrentIndex(0); -#ifdef WIN32 - sel->setItemData(0, obs_module_text("AdvSceneSwitcher.selectWindowTip"), - Qt::ToolTipRole); -#endif -} - -QStringList GetAudioSourceNames() -{ - auto sourceEnum = [](void *param, obs_source_t *source) -> bool /* -- */ - { - QStringList *list = reinterpret_cast(param); - uint32_t flags = obs_source_get_output_flags(source); - - if ((flags & OBS_SOURCE_AUDIO) != 0) { - *list << obs_source_get_name(source); - } - return true; - }; - - QStringList list; - obs_enum_sources(sourceEnum, &list); - return list; -} - -void PopulateAudioSelection(QComboBox *sel, bool addSelect) -{ - auto sources = GetAudioSourceNames(); - sources.sort(); - sel->addItems(sources); - - if (addSelect) { - AddSelectionEntry( - sel, - obs_module_text("AdvSceneSwitcher.selectAudioSource"), - false, - obs_module_text( - "AdvSceneSwitcher.invaildEntriesWillNotBeSaved")); - } - sel->setCurrentIndex(0); -} - -QStringList GetVideoSourceNames() -{ - auto sourceEnum = [](void *param, obs_source_t *source) -> bool /* -- */ - { - QStringList *list = reinterpret_cast(param); - uint32_t flags = obs_source_get_output_flags(source); - std::string test = obs_source_get_name(source); - if ((flags & (OBS_SOURCE_VIDEO | OBS_SOURCE_ASYNC)) != 0) { - *list << obs_source_get_name(source); - } - return true; - }; - - QStringList list; - obs_enum_sources(sourceEnum, &list); - return list; -} - -void populateVideoSelection(QComboBox *sel, bool addMainOutput, bool addScenes, - bool addSelect) -{ - - auto sources = GetVideoSourceNames(); - sources.sort(); - sel->addItems(sources); - if (addScenes) { - auto scenes = GetSceneNames(); - scenes.sort(); - sel->addItems(scenes); - } - - sel->model()->sort(0); - if (addMainOutput) { - sel->insertItem( - 0, obs_module_text("AdvSceneSwitcher.OBSVideoOutput")); - } - if (addSelect) { - AddSelectionEntry( - sel, - obs_module_text("AdvSceneSwitcher.selectVideoSource"), - false, - obs_module_text( - "AdvSceneSwitcher.invaildEntriesWillNotBeSaved")); - } - sel->setCurrentIndex(0); -} - -bool IsMediaSource(obs_source_t *source) -{ - uint32_t flags = obs_source_get_output_flags(source); - return (flags & OBS_SOURCE_CONTROLLABLE_MEDIA) != 0; -} - -QStringList GetMediaSourceNames() -{ - auto sourceEnum = [](void *param, obs_source_t *source) -> bool /* -- */ - { - QStringList *list = reinterpret_cast(param); - if (IsMediaSource(source)) { - *list << obs_source_get_name(source); - } - return true; - }; - - QStringList list; - obs_enum_sources(sourceEnum, &list); - return list; -} - -void PopulateMediaSelection(QComboBox *sel, bool addSelect) -{ - auto sources = GetMediaSourceNames(); - sources.sort(); - sel->addItems(sources); - - if (addSelect) { - AddSelectionEntry( - sel, - obs_module_text("AdvSceneSwitcher.selectMediaSource"), - false, - obs_module_text( - "AdvSceneSwitcher.invaildEntriesWillNotBeSaved")); - } - sel->setCurrentIndex(0); -} - -void PopulateProcessSelection(QComboBox *sel, bool addSelect) -{ - QStringList processes; - GetProcessList(processes); - processes.sort(); - for (QString &process : processes) { - sel->addItem(process); - } - - sel->model()->sort(0); - if (addSelect) { - AddSelectionEntry( - sel, obs_module_text("AdvSceneSwitcher.selectProcess")); - } - sel->setCurrentIndex(0); -} - -QStringList GetSceneNames() -{ - QStringList list; - char **scenes = obs_frontend_get_scene_names(); - char **temp = scenes; - while (*temp) { - const char *name = *temp; - list << name; - temp++; - } - bfree(scenes); - return list; -} - -void PopulateSceneSelection(QComboBox *sel, bool addPrevious, bool addCurrent, - bool addAny, bool addSceneGroup, - std::deque *sceneGroups, bool addSelect, - std::string selectText, bool selectable) -{ - auto sceneNames = GetSceneNames(); - sel->addItems(sceneNames); - - if (addSceneGroup && sceneGroups) { - for (auto &sg : *sceneGroups) { - sel->addItem(QString::fromStdString(sg.name)); - } - } - - sel->model()->sort(0); - if (addSelect) { - if (selectText.empty()) { - AddSelectionEntry( - sel, - obs_module_text("AdvSceneSwitcher.selectScene"), - selectable, - obs_module_text( - "AdvSceneSwitcher.invaildEntriesWillNotBeSaved")); - } else { - AddSelectionEntry(sel, selectText.c_str(), selectable); - } - } - sel->setCurrentIndex(0); - - if (addPrevious) { - sel->insertItem( - 1, obs_module_text( - "AdvSceneSwitcher.selectPreviousScene")); - } - if (addCurrent) { - sel->insertItem( - 1, - obs_module_text("AdvSceneSwitcher.selectCurrentScene")); - } - if (addAny) { - sel->insertItem( - 1, obs_module_text("AdvSceneSwitcher.selectAnyScene")); - } -} - -static inline void hasFilterEnum(obs_source_t *, obs_source_t *filter, - void *ptr) -{ - if (!filter) { - return; - } - bool *hasFilter = reinterpret_cast(ptr); - *hasFilter = true; -} - -QStringList GetSourcesWithFilterNames() -{ - auto enumSourcesWithFilters = [](void *param, obs_source_t *source) { - if (!source) { - return true; - } - QStringList *list = reinterpret_cast(param); - bool hasFilter = false; - obs_source_enum_filters(source, hasFilterEnum, &hasFilter); - if (hasFilter) { - *list << obs_source_get_name(source); - } - return true; - }; - - QStringList list; - obs_enum_sources(enumSourcesWithFilters, &list); - obs_enum_scenes(enumSourcesWithFilters, &list); - return list; -} - -void PopulateSourcesWithFilterSelection(QComboBox *list) -{ - auto sources = GetSourcesWithFilterNames(); - sources.sort(); - list->addItems(sources); - AddSelectionEntry(list, - obs_module_text("AdvSceneSwitcher.selectSource")); - list->setCurrentIndex(0); -} - -void PopulateFilterSelection(QComboBox *list, OBSWeakSource weakSource) -{ - auto filters = GetFilterNames(weakSource); - filters.sort(); - list->addItems(filters); - AddSelectionEntry(list, - obs_module_text("AdvSceneSwitcher.selectFilter")); - list->setCurrentIndex(0); -} - -std::string GetThemeTypeName() -{ -#if LIBOBS_API_VER >= MAKE_SEMANTIC_VERSION(29, 0, 0) - return obs_frontend_is_theme_dark() ? "Dark" : "Light"; -#else - auto mainWindow = - static_cast(obs_frontend_get_main_window()); - if (!mainWindow) { - return "Dark"; - } - QColor color = mainWindow->palette().text().color(); - const bool themeDarkMode = !(color.redF() < 0.5); - return themeDarkMode ? "Dark" : "Light"; -#endif -} - -QMetaObject::Connection PulseWidget(QWidget *widget, QColor startColor, - QColor endColor, bool once) -{ - QGraphicsColorizeEffect *effect = new QGraphicsColorizeEffect(widget); - widget->setGraphicsEffect(effect); - QPropertyAnimation *animation = - new QPropertyAnimation(effect, "color", widget); - animation->setStartValue(startColor); - animation->setEndValue(endColor); - animation->setDuration(1000); - - QMetaObject::Connection con; - if (once) { - auto widgetPtr = widget; - con = QWidget::connect( - animation, &QPropertyAnimation::finished, - [widgetPtr]() { - if (widgetPtr) { - widgetPtr->setGraphicsEffect(nullptr); - } - }); - animation->start(QPropertyAnimation::DeleteWhenStopped); - } else { - auto widgetPtr = widget; - con = QWidget::connect( - animation, &QPropertyAnimation::finished, - [animation, widgetPtr]() { - QTimer *timer = new QTimer(widgetPtr); - QWidget::connect(timer, &QTimer::timeout, - [animation] { - animation->start(); - }); - timer->setSingleShot(true); - timer->start(1000); - }); - animation->start(); - } - return con; + return desktopPath + "/adv-ss-" + + timestamp.toString("yyyy.MM.dd.hh.mm.ss"); } void listAddClicked(QListWidget *list, QWidget *newWidget, @@ -993,122 +171,4 @@ bool listMoveDown(QListWidget *list) return true; } -static int getHorizontalScrollBarHeight(QListWidget *list) -{ - if (!list) { - return 0; - } - auto horizontalScrollBar = list->horizontalScrollBar(); - if (!horizontalScrollBar || !horizontalScrollBar->isVisible()) { - return 0; - } - return horizontalScrollBar->height(); -} - -void SetHeightToContentHeight(QListWidget *list) -{ - auto nrItems = list->count(); - if (nrItems == 0) { - list->setMaximumHeight(0); - list->setMinimumHeight(0); - return; - } - - int scrollBarHeight = getHorizontalScrollBarHeight(list); - int height = (list->sizeHintForRow(0) + list->spacing()) * nrItems + - 2 * list->frameWidth() + scrollBarHeight; - list->setMinimumHeight(height); - list->setMaximumHeight(height); -} - -bool DoubleEquals(double left, double right, double epsilon) -{ - return (fabs(left - right) < epsilon); -} - -void SetButtonIcon(QPushButton *button, const char *path) -{ - QIcon icon; - icon.addFile(QString::fromUtf8(path), QSize(), QIcon::Normal, - QIcon::Off); - button->setIcon(icon); -} - -void AddSelectionGroup(QComboBox *selection, const QStringList &group, - bool addSeparator) -{ - selection->addItems(group); - if (addSeparator) { - selection->insertSeparator(selection->count()); - } -} - -int FindIdxInRagne(QComboBox *list, int start, int stop, - const std::string &value, Qt::MatchFlags flags) -{ - if (value.empty()) { - return -1; - } - auto model = list->model(); - auto startIdx = model->index(start, 0); - auto match = model->match(startIdx, Qt::DisplayRole, - QString::fromStdString(value), 1, flags); - if (match.isEmpty()) { - return -1; - } - int foundIdx = match.first().row(); - if (foundIdx > stop) { - return -1; - } - return foundIdx; -} - -std::pair GetCursorPos() -{ - auto cursorPos = QCursor::pos(); - return {cursorPos.x(), cursorPos.y()}; -} - -void ReplaceAll(std::string &str, const std::string &from, - const std::string &to) -{ - if (from.empty()) { - return; - } - size_t start_pos = 0; - while ((start_pos = str.find(from, start_pos)) != std::string::npos) { - str.replace(start_pos, from.length(), to); - start_pos += to.length(); - } -} - -QString GetDefaultSettingsSaveLocation() -{ - QString desktopPath = QStandardPaths::writableLocation( - QStandardPaths::DesktopLocation); - - auto scName = obs_frontend_get_current_scene_collection(); - QString sceneCollectionName(scName); - bfree(scName); - - auto timestamp = QDateTime::currentDateTime(); - auto path = desktopPath + "/adv-ss-" + sceneCollectionName + "-" + - timestamp.toString("yyyy.MM.dd.hh.mm.ss"); - - // Check if scene collection name contains invalid path characters - QFile file(path); - if (file.exists()) { - return path; - } - - bool validPath = file.open(QIODevice::WriteOnly); - if (validPath) { - file.remove(); - return path; - } - - return desktopPath + "/adv-ss-" + - timestamp.toString("yyyy.MM.dd.hh.mm.ss"); -} - } // namespace advss diff --git a/lib/utils/utility.hpp b/lib/utils/utility.hpp index c4d75795..bb28558f 100644 --- a/lib/utils/utility.hpp +++ b/lib/utils/utility.hpp @@ -1,124 +1,29 @@ #pragma once -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "export-symbol-helper.hpp" + #include +#include +#include +#include +#include +#include +#include +#include namespace advss { -class SceneSelection; -class RegexConfig; -struct SceneGroup; -class Macro; - -/* Source helpers */ - -EXPORT bool WeakSourceValid(obs_weak_source_t *ws); -EXPORT std::string GetWeakSourceName(obs_weak_source_t *weak_source); -EXPORT OBSWeakSource GetWeakSourceByName(const char *name); -EXPORT OBSWeakSource GetWeakSourceByQString(const QString &name); -EXPORT OBSWeakSource GetWeakTransitionByName(const char *transitionName); -EXPORT OBSWeakSource GetWeakTransitionByQString(const QString &name); -EXPORT OBSWeakSource GetWeakFilterByName(OBSWeakSource source, - const char *name); -EXPORT OBSWeakSource GetWeakFilterByQString(OBSWeakSource source, - const QString &name); -EXPORT int GetSceneItemCount(const OBSWeakSource &); - -/* Selection helpers */ - -EXPORT bool IsMediaSource(obs_source_t *source); - -EXPORT QStringList GetAudioSourceNames(); -EXPORT QStringList GetSourcesWithFilterNames(); -EXPORT QStringList GetMediaSourceNames(); -EXPORT QStringList GetVideoSourceNames(); -EXPORT QStringList GetSceneNames(); -EXPORT QStringList GetSourceNames(); -EXPORT QStringList GetFilterNames(OBSWeakSource weakSource); - -/* Populate list helpers */ - -EXPORT void AddSelectionEntry(QComboBox *sel, const char *description, - bool selectable = false, - const char *tooltip = ""); -EXPORT void AddSelectionGroup(QComboBox *selection, const QStringList &group, - bool addSeparator = true); -EXPORT void PopulateTransitionSelection(QComboBox *sel, bool addCurrent = true, - bool addAny = false, - bool addSelect = true); -EXPORT void PopulateWindowSelection(QComboBox *sel, bool addSelect = true); -void PopulateAudioSelection(QComboBox *sel, bool addSelect = true); -void populateVideoSelection(QComboBox *sel, bool addMainOutput = false, - bool addScenes = false, bool addSelect = true); -void PopulateMediaSelection(QComboBox *sel, bool addSelect = true); -EXPORT void PopulateProcessSelection(QComboBox *sel, bool addSelect = true); -void PopulateSourceSelection(QComboBox *list, bool addSelect = true); -EXPORT void PopulateSceneSelection( - QComboBox *sel, bool addPrevious = false, bool addCurrent = false, - bool addAny = false, bool addSceneGroup = false, - std::deque *sceneGroups = nullptr, bool addSelect = true, - std::string selectText = "", bool selectable = false); -void PopulateSourcesWithFilterSelection(QComboBox *list); -void PopulateFilterSelection(QComboBox *list, - OBSWeakSource weakSource = nullptr); - -/* Widget helpers */ - -EXPORT void -PlaceWidgets(std::string text, QBoxLayout *layout, - std::unordered_map placeholders, - bool addStretch = true); -void DeleteLayoutItemWidget(QLayoutItem *item); -EXPORT void ClearLayout(QLayout *layout, int afterIdx = 0); -EXPORT void SetLayoutVisible(QLayout *layout, bool visible); -EXPORT void SetGridLayoutRowVisible(QGridLayout *layout, int row, bool visible); -EXPORT void AddStretchIfNecessary(QBoxLayout *layout); -EXPORT void RemoveStretchIfPresent(QBoxLayout *layout); -EXPORT void MinimizeSizeOfColumn(QGridLayout *layout, int idx); -EXPORT QMetaObject::Connection PulseWidget(QWidget *widget, QColor startColor, - QColor endColor = QColor(0, 0, 0, 0), - bool once = false); -EXPORT void SetHeightToContentHeight(QListWidget *list); -EXPORT void SetButtonIcon(QPushButton *button, const char *path); -EXPORT int -FindIdxInRagne(QComboBox *list, int start, int stop, const std::string &value, - Qt::MatchFlags = Qt::MatchExactly | Qt::MatchCaseSensitive); - -/* UI helpers */ - -EXPORT bool DisplayMessage(const QString &msg, bool question = false, - bool modal = true); -EXPORT void DisplayTrayMessage(const QString &title, const QString &msg, - const QIcon &icon = QIcon()); -EXPORT std::string GetThemeTypeName(); - -/* Generic helpers */ - -EXPORT bool CompareIgnoringLineEnding(QString &s1, QString &s2); -EXPORT std::string GetDataFilePath(const std::string &file); -EXPORT bool DoubleEquals(double left, double right, double epsilon); EXPORT std::pair GetCursorPos(); + +EXPORT bool DoubleEquals(double left, double right, double epsilon); + void ReplaceAll(std::string &str, const std::string &from, const std::string &to); -QString GetDefaultSettingsSaveLocation(); -bool IsValidMacroSegmentIndex(Macro *m, const int idx, bool isCondition); -QString GetMacroSegmentDescription(Macro *, int idx, bool isCondition); -void SaveSplitterPos(const QList &sizes, obs_data_t *obj, - const std::string name); -void LoadSplitterPos(QList &sizes, obs_data_t *obj, - const std::string name); EXPORT std::optional GetJsonField(const std::string &json, const std::string &id); +EXPORT bool CompareIgnoringLineEnding(QString &s1, QString &s2); + +EXPORT std::string GetDataFilePath(const std::string &file); +QString GetDefaultSettingsSaveLocation(); /* Legacy helpers */ diff --git a/lib/utils/variable-line-edit.cpp b/lib/utils/variable-line-edit.cpp index 3c9c4603..ea34ab81 100644 --- a/lib/utils/variable-line-edit.cpp +++ b/lib/utils/variable-line-edit.cpp @@ -1,7 +1,6 @@ #include "variable-line-edit.hpp" #include "obs-module-helper.hpp" - -#include +#include "ui-helpers.hpp" namespace advss { diff --git a/lib/utils/variable-spinbox.cpp b/lib/utils/variable-spinbox.cpp index bcd76573..b3120b0c 100644 --- a/lib/utils/variable-spinbox.cpp +++ b/lib/utils/variable-spinbox.cpp @@ -1,5 +1,5 @@ #include "variable-spinbox.hpp" -#include "utility.hpp" +#include "ui-helpers.hpp" #include diff --git a/lib/utils/variable.cpp b/lib/utils/variable.cpp index ed9a2b72..bdead931 100644 --- a/lib/utils/variable.cpp +++ b/lib/utils/variable.cpp @@ -1,7 +1,8 @@ #include "variable.hpp" #include "math-helpers.hpp" #include "obs-module-helper.hpp" -#include "utility.hpp" + +#include namespace advss { diff --git a/plugins/base/macro-action-audio.cpp b/plugins/base/macro-action-audio.cpp index c8c91dca..581b5c63 100644 --- a/plugins/base/macro-action-audio.cpp +++ b/plugins/base/macro-action-audio.cpp @@ -1,7 +1,8 @@ #include "macro-action-audio.hpp" #include "audio-helpers.hpp" +#include "layout-helpers.hpp" #include "macro-helpers.hpp" -#include "utility.hpp" +#include "selection-helpers.hpp" #include diff --git a/plugins/base/macro-action-file.cpp b/plugins/base/macro-action-file.cpp index 8023a4e2..b566b7d7 100644 --- a/plugins/base/macro-action-file.cpp +++ b/plugins/base/macro-action-file.cpp @@ -1,9 +1,9 @@ #include "macro-action-file.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" +#include #include #include -#include namespace advss { diff --git a/plugins/base/macro-action-filter.cpp b/plugins/base/macro-action-filter.cpp index da255667..8e1c4b60 100644 --- a/plugins/base/macro-action-filter.cpp +++ b/plugins/base/macro-action-filter.cpp @@ -1,7 +1,8 @@ #include "macro-action-filter.hpp" +#include "layout-helpers.hpp" #include "json-helpers.hpp" #include "source-settings-helpers.hpp" -#include "utility.hpp" +#include "selection-helpers.hpp" namespace advss { diff --git a/plugins/base/macro-action-hotkey.cpp b/plugins/base/macro-action-hotkey.cpp index 615f02b3..f274d312 100644 --- a/plugins/base/macro-action-hotkey.cpp +++ b/plugins/base/macro-action-hotkey.cpp @@ -1,6 +1,7 @@ #include "macro-action-hotkey.hpp" -#include "platform-funcs.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" +#include "selection-helpers.hpp" +#include "source-helpers.hpp" #include #include diff --git a/plugins/base/macro-action-http.cpp b/plugins/base/macro-action-http.cpp index 4556ea96..73ff3c6c 100644 --- a/plugins/base/macro-action-http.cpp +++ b/plugins/base/macro-action-http.cpp @@ -1,6 +1,6 @@ #include "macro-action-http.hpp" -#include "utility.hpp" #include "curl-helper.hpp" +#include "layout-helpers.hpp" namespace advss { diff --git a/plugins/base/macro-action-media.cpp b/plugins/base/macro-action-media.cpp index ef43a7c1..e4e3e28c 100644 --- a/plugins/base/macro-action-media.cpp +++ b/plugins/base/macro-action-media.cpp @@ -1,5 +1,6 @@ #include "macro-action-media.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" +#include "selection-helpers.hpp" namespace advss { diff --git a/plugins/base/macro-action-osc.cpp b/plugins/base/macro-action-osc.cpp index 17b369b9..552664eb 100644 --- a/plugins/base/macro-action-osc.cpp +++ b/plugins/base/macro-action-osc.cpp @@ -1,8 +1,7 @@ #include "macro-action-osc.hpp" -#include "utility.hpp" -#include #include +#include namespace advss { diff --git a/plugins/base/macro-action-plugin-state.cpp b/plugins/base/macro-action-plugin-state.cpp index 68b9e095..2eb8d2cf 100644 --- a/plugins/base/macro-action-plugin-state.cpp +++ b/plugins/base/macro-action-plugin-state.cpp @@ -1,10 +1,14 @@ #include "macro-action-plugin-state.hpp" +#include "layout-helpers.hpp" #include "plugin-state-helpers.hpp" -#include "utility.hpp" +#include "selection-helpers.hpp" +#include "source-helpers.hpp" +#include "ui-helpers.hpp" -#include #include +#include #include +#include using namespace std::chrono_literals; diff --git a/plugins/base/macro-action-profile.cpp b/plugins/base/macro-action-profile.cpp index 87188beb..ea7d92ac 100644 --- a/plugins/base/macro-action-profile.cpp +++ b/plugins/base/macro-action-profile.cpp @@ -1,6 +1,8 @@ #include "macro-action-profile.hpp" +#include "layout-helpers.hpp" #include "profile-helpers.hpp" -#include "utility.hpp" + +#include namespace advss { diff --git a/plugins/base/macro-action-projector.cpp b/plugins/base/macro-action-projector.cpp index bf224cac..097eb11b 100644 --- a/plugins/base/macro-action-projector.cpp +++ b/plugins/base/macro-action-projector.cpp @@ -1,6 +1,10 @@ #include "macro-action-projector.hpp" +#include "layout-helpers.hpp" #include "monitor-helpers.hpp" -#include "utility.hpp" +#include "selection-helpers.hpp" +#include "source-helpers.hpp" + +#include namespace advss { diff --git a/plugins/base/macro-action-random.cpp b/plugins/base/macro-action-random.cpp index 72fb4d24..6180a8d8 100644 --- a/plugins/base/macro-action-random.cpp +++ b/plugins/base/macro-action-random.cpp @@ -1,6 +1,6 @@ #include "macro-action-random.hpp" +#include "layout-helpers.hpp" #include "macro-helpers.hpp" -#include "utility.hpp" #include diff --git a/plugins/base/macro-action-recording.cpp b/plugins/base/macro-action-recording.cpp index 370b51f8..2054c836 100644 --- a/plugins/base/macro-action-recording.cpp +++ b/plugins/base/macro-action-recording.cpp @@ -1,6 +1,7 @@ #include "macro-action-recording.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" +#include #include namespace advss { diff --git a/plugins/base/macro-action-replay-buffer.cpp b/plugins/base/macro-action-replay-buffer.cpp index f28ffffc..7f6de1cc 100644 --- a/plugins/base/macro-action-replay-buffer.cpp +++ b/plugins/base/macro-action-replay-buffer.cpp @@ -1,5 +1,7 @@ #include "macro-action-replay-buffer.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" + +#include namespace advss { @@ -10,7 +12,7 @@ bool MacroActionReplayBuffer::_registered = MacroActionFactory::Register( {MacroActionReplayBuffer::Create, MacroActionReplayBufferEdit::Create, "AdvSceneSwitcher.action.replay"}); -const static std::map actionTypes = { +static const std::map actionTypes = { {ReplayBufferAction::STOP, "AdvSceneSwitcher.action.replay.type.stop"}, {ReplayBufferAction::START, "AdvSceneSwitcher.action.replay.type.start"}, diff --git a/plugins/base/macro-action-run.cpp b/plugins/base/macro-action-run.cpp index be9e979f..c53da0af 100644 --- a/plugins/base/macro-action-run.cpp +++ b/plugins/base/macro-action-run.cpp @@ -1,5 +1,5 @@ #include "macro-action-run.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" #include #include diff --git a/plugins/base/macro-action-scene-collection.cpp b/plugins/base/macro-action-scene-collection.cpp index 5f261204..29ec56c2 100644 --- a/plugins/base/macro-action-scene-collection.cpp +++ b/plugins/base/macro-action-scene-collection.cpp @@ -1,6 +1,9 @@ #include "macro-action-scene-collection.hpp" +#include "layout-helpers.hpp" #include "plugin-state-helpers.hpp" -#include "utility.hpp" +#include "selection-helpers.hpp" + +#include namespace advss { diff --git a/plugins/base/macro-action-scene-lock.cpp b/plugins/base/macro-action-scene-lock.cpp index 9d9877ee..53cd871b 100644 --- a/plugins/base/macro-action-scene-lock.cpp +++ b/plugins/base/macro-action-scene-lock.cpp @@ -1,5 +1,5 @@ #include "macro-action-scene-lock.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" namespace advss { diff --git a/plugins/base/macro-action-scene-order.cpp b/plugins/base/macro-action-scene-order.cpp index 48b0d686..f3adb58c 100644 --- a/plugins/base/macro-action-scene-order.cpp +++ b/plugins/base/macro-action-scene-order.cpp @@ -1,5 +1,5 @@ #include "macro-action-scene-order.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" namespace advss { diff --git a/plugins/base/macro-action-scene-switch.cpp b/plugins/base/macro-action-scene-switch.cpp index 2f8a6c0b..536fe493 100644 --- a/plugins/base/macro-action-scene-switch.cpp +++ b/plugins/base/macro-action-scene-switch.cpp @@ -1,8 +1,11 @@ #include "macro-action-scene-switch.hpp" +#include "layout-helpers.hpp" #include "macro-helpers.hpp" #include "plugin-state-helpers.hpp" #include "scene-switch-helpers.hpp" -#include "utility.hpp" +#include "source-helpers.hpp" + +#include namespace advss { diff --git a/plugins/base/macro-action-scene-transform.cpp b/plugins/base/macro-action-scene-transform.cpp index 866be3b1..22d8d235 100644 --- a/plugins/base/macro-action-scene-transform.cpp +++ b/plugins/base/macro-action-scene-transform.cpp @@ -1,7 +1,7 @@ #include "macro-action-scene-transform.hpp" #include "json-helpers.hpp" #include "scene-item-transform-helpers.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" #include diff --git a/plugins/base/macro-action-scene-visibility.cpp b/plugins/base/macro-action-scene-visibility.cpp index 0dd44152..d7ce252f 100644 --- a/plugins/base/macro-action-scene-visibility.cpp +++ b/plugins/base/macro-action-scene-visibility.cpp @@ -1,5 +1,5 @@ #include "macro-action-scene-visibility.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" namespace advss { diff --git a/plugins/base/macro-action-screenshot.cpp b/plugins/base/macro-action-screenshot.cpp index b6e5f5d4..1139705f 100644 --- a/plugins/base/macro-action-screenshot.cpp +++ b/plugins/base/macro-action-screenshot.cpp @@ -1,5 +1,8 @@ #include "macro-action-screenshot.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" +#include "selection-helpers.hpp" + +#include namespace advss { diff --git a/plugins/base/macro-action-sequence.cpp b/plugins/base/macro-action-sequence.cpp index 00a0b0ad..a05be7ef 100644 --- a/plugins/base/macro-action-sequence.cpp +++ b/plugins/base/macro-action-sequence.cpp @@ -1,6 +1,6 @@ #include "macro-action-sequence.hpp" +#include "layout-helpers.hpp" #include "macro-helpers.hpp" -#include "utility.hpp" namespace advss { diff --git a/plugins/base/macro-action-source.cpp b/plugins/base/macro-action-source.cpp index d8b05315..b1b859b5 100644 --- a/plugins/base/macro-action-source.cpp +++ b/plugins/base/macro-action-source.cpp @@ -1,7 +1,10 @@ #include "macro-action-source.hpp" -#include "source-settings-helpers.hpp" +#include "layout-helpers.hpp" #include "json-helpers.hpp" -#include "utility.hpp" +#include "selection-helpers.hpp" +#include "source-settings-helpers.hpp" + +#include Q_DECLARE_METATYPE(advss::SourceSettingButton); diff --git a/plugins/base/macro-action-streaming.cpp b/plugins/base/macro-action-streaming.cpp index 674a114f..f00bdd76 100644 --- a/plugins/base/macro-action-streaming.cpp +++ b/plugins/base/macro-action-streaming.cpp @@ -1,7 +1,9 @@ #include "macro-action-streaming.hpp" +#include "layout-helpers.hpp" #include "profile-helpers.hpp" -#include "utility.hpp" +#include "ui-helpers.hpp" +#include #include namespace advss { diff --git a/plugins/base/macro-action-studio-mode.cpp b/plugins/base/macro-action-studio-mode.cpp index 9c384171..567f1957 100644 --- a/plugins/base/macro-action-studio-mode.cpp +++ b/plugins/base/macro-action-studio-mode.cpp @@ -1,5 +1,7 @@ #include "macro-action-studio-mode.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" + +#include namespace advss { diff --git a/plugins/base/macro-action-systray.cpp b/plugins/base/macro-action-systray.cpp index 1c8be003..99c8400b 100644 --- a/plugins/base/macro-action-systray.cpp +++ b/plugins/base/macro-action-systray.cpp @@ -1,5 +1,6 @@ #include "macro-action-systray.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" +#include "ui-helpers.hpp" namespace advss { diff --git a/plugins/base/macro-action-timer.cpp b/plugins/base/macro-action-timer.cpp index e1f3ec40..456a8912 100644 --- a/plugins/base/macro-action-timer.cpp +++ b/plugins/base/macro-action-timer.cpp @@ -1,7 +1,7 @@ #include "macro-action-timer.hpp" +#include "layout-helpers.hpp" #include "macro-condition-timer.hpp" #include "macro-helpers.hpp" -#include "utility.hpp" #include diff --git a/plugins/base/macro-action-transition.cpp b/plugins/base/macro-action-transition.cpp index b571d429..413b6d50 100644 --- a/plugins/base/macro-action-transition.cpp +++ b/plugins/base/macro-action-transition.cpp @@ -1,5 +1,7 @@ #include "macro-action-transition.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" + +#include namespace advss { diff --git a/plugins/base/macro-action-virtual-cam.cpp b/plugins/base/macro-action-virtual-cam.cpp index d913ec2b..25efe7e9 100644 --- a/plugins/base/macro-action-virtual-cam.cpp +++ b/plugins/base/macro-action-virtual-cam.cpp @@ -1,5 +1,7 @@ #include "macro-action-virtual-cam.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" + +#include namespace advss { diff --git a/plugins/base/macro-action-wait.cpp b/plugins/base/macro-action-wait.cpp index e7678563..61ede409 100644 --- a/plugins/base/macro-action-wait.cpp +++ b/plugins/base/macro-action-wait.cpp @@ -1,7 +1,7 @@ #include "macro-action-wait.hpp" +#include "layout-helpers.hpp" #include "macro-helpers.hpp" #include "sync-helpers.hpp" -#include "utility.hpp" #include diff --git a/plugins/base/macro-action-websocket.cpp b/plugins/base/macro-action-websocket.cpp index 8699b1d3..3ab470fd 100644 --- a/plugins/base/macro-action-websocket.cpp +++ b/plugins/base/macro-action-websocket.cpp @@ -1,5 +1,5 @@ #include "macro-action-websocket.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" namespace advss { diff --git a/plugins/base/macro-condition-audio.cpp b/plugins/base/macro-condition-audio.cpp index 69b25cf2..511321c1 100644 --- a/plugins/base/macro-condition-audio.cpp +++ b/plugins/base/macro-condition-audio.cpp @@ -1,7 +1,8 @@ #include "macro-condition-audio.hpp" #include "audio-helpers.hpp" +#include "layout-helpers.hpp" #include "macro-helpers.hpp" -#include "utility.hpp" +#include "selection-helpers.hpp" namespace advss { diff --git a/plugins/base/macro-condition-cursor.cpp b/plugins/base/macro-condition-cursor.cpp index ad2041fb..f925d3f9 100644 --- a/plugins/base/macro-condition-cursor.cpp +++ b/plugins/base/macro-condition-cursor.cpp @@ -1,9 +1,10 @@ #include "macro-condition-cursor.hpp" #include "cursor-helpers.hpp" +#include "layout-helpers.hpp" #include "utility.hpp" -#include #include +#include namespace advss { diff --git a/plugins/base/macro-condition-date.cpp b/plugins/base/macro-condition-date.cpp index 964cfbce..e65e3ce2 100644 --- a/plugins/base/macro-condition-date.cpp +++ b/plugins/base/macro-condition-date.cpp @@ -1,6 +1,6 @@ #include "macro-condition-date.hpp" +#include "layout-helpers.hpp" #include "macro-helpers.hpp" -#include "utility.hpp" #include diff --git a/plugins/base/macro-condition-display.cpp b/plugins/base/macro-condition-display.cpp index 8c368ad8..5d5a4aeb 100644 --- a/plugins/base/macro-condition-display.cpp +++ b/plugins/base/macro-condition-display.cpp @@ -1,6 +1,6 @@ #include "macro-condition-display.hpp" +#include "layout-helpers.hpp" #include "monitor-helpers.hpp" -#include "utility.hpp" #include diff --git a/plugins/base/macro-condition-file.cpp b/plugins/base/macro-condition-file.cpp index e3617a13..dede0e5c 100644 --- a/plugins/base/macro-condition-file.cpp +++ b/plugins/base/macro-condition-file.cpp @@ -1,10 +1,11 @@ #include "macro-condition-file.hpp" -#include "utility.hpp" #include "curl-helper.hpp" +#include "layout-helpers.hpp" #include "plugin-state-helpers.hpp" +#include "utility.hpp" -#include #include +#include #include namespace advss { diff --git a/plugins/base/macro-condition-filter.cpp b/plugins/base/macro-condition-filter.cpp index 1cd89103..996c645a 100644 --- a/plugins/base/macro-condition-filter.cpp +++ b/plugins/base/macro-condition-filter.cpp @@ -1,8 +1,9 @@ #include "macro-condition-filter.hpp" -#include "source-settings-helpers.hpp" +#include "layout-helpers.hpp" #include "json-helpers.hpp" #include "text-helpers.hpp" -#include "utility.hpp" +#include "source-settings-helpers.hpp" +#include "selection-helpers.hpp" #include diff --git a/plugins/base/macro-condition-hotkey.cpp b/plugins/base/macro-condition-hotkey.cpp index 5ae4be38..76a5ebc1 100644 --- a/plugins/base/macro-condition-hotkey.cpp +++ b/plugins/base/macro-condition-hotkey.cpp @@ -1,5 +1,5 @@ #include "macro-condition-hotkey.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" namespace advss { diff --git a/plugins/base/macro-condition-idle.cpp b/plugins/base/macro-condition-idle.cpp index a670e96b..ce7c20b6 100644 --- a/plugins/base/macro-condition-idle.cpp +++ b/plugins/base/macro-condition-idle.cpp @@ -1,6 +1,6 @@ #include "macro-condition-idle.hpp" #include "platform-funcs.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" namespace advss { diff --git a/plugins/base/macro-condition-media.cpp b/plugins/base/macro-condition-media.cpp index 193e5e09..0e5a1124 100644 --- a/plugins/base/macro-condition-media.cpp +++ b/plugins/base/macro-condition-media.cpp @@ -1,8 +1,10 @@ #include "macro-condition-media.hpp" +#include "layout-helpers.hpp" #include "macro-helpers.hpp" #include "plugin-state-helpers.hpp" #include "scene-switch-helpers.hpp" -#include "utility.hpp" +#include "selection-helpers.hpp" +#include "source-helpers.hpp" namespace advss { diff --git a/plugins/base/macro-condition-obs-stats.cpp b/plugins/base/macro-condition-obs-stats.cpp index e59ffee4..88eafcd2 100644 --- a/plugins/base/macro-condition-obs-stats.cpp +++ b/plugins/base/macro-condition-obs-stats.cpp @@ -1,6 +1,9 @@ #include "macro-condition-obs-stats.hpp" +#include "layout-helpers.hpp" #include "utility.hpp" +#include + namespace advss { const std::string MacroConditionStats::id = "obs_stats"; diff --git a/plugins/base/macro-condition-plugin-state.cpp b/plugins/base/macro-condition-plugin-state.cpp index 02ab098a..edf055a8 100644 --- a/plugins/base/macro-condition-plugin-state.cpp +++ b/plugins/base/macro-condition-plugin-state.cpp @@ -1,7 +1,7 @@ #include "macro-condition-plugin-state.hpp" +#include "layout-helpers.hpp" #include "macro-helpers.hpp" #include "plugin-state-helpers.hpp" -#include "utility.hpp" namespace advss { diff --git a/plugins/base/macro-condition-process.cpp b/plugins/base/macro-condition-process.cpp index d4e29e46..785372c4 100644 --- a/plugins/base/macro-condition-process.cpp +++ b/plugins/base/macro-condition-process.cpp @@ -1,6 +1,7 @@ #include "macro-condition-process.hpp" +#include "layout-helpers.hpp" #include "platform-funcs.hpp" -#include "utility.hpp" +#include "selection-helpers.hpp" #include diff --git a/plugins/base/macro-condition-profile.cpp b/plugins/base/macro-condition-profile.cpp index aa5c72c6..7a096e6d 100644 --- a/plugins/base/macro-condition-profile.cpp +++ b/plugins/base/macro-condition-profile.cpp @@ -1,6 +1,8 @@ #include "macro-condition-profile.hpp" +#include "layout-helpers.hpp" #include "profile-helpers.hpp" -#include "utility.hpp" + +#include namespace advss { diff --git a/plugins/base/macro-condition-recording.cpp b/plugins/base/macro-condition-recording.cpp index c6378f82..7e4a09ae 100644 --- a/plugins/base/macro-condition-recording.cpp +++ b/plugins/base/macro-condition-recording.cpp @@ -1,6 +1,7 @@ #include "macro-condition-recording.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" +#include #include namespace advss { diff --git a/plugins/base/macro-condition-replay-buffer.cpp b/plugins/base/macro-condition-replay-buffer.cpp index 6eb28295..0b92ab1d 100644 --- a/plugins/base/macro-condition-replay-buffer.cpp +++ b/plugins/base/macro-condition-replay-buffer.cpp @@ -1,5 +1,7 @@ #include "macro-condition-replay-buffer.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" + +#include namespace advss { diff --git a/plugins/base/macro-condition-run.cpp b/plugins/base/macro-condition-run.cpp index 68083bb6..c635a7c0 100644 --- a/plugins/base/macro-condition-run.cpp +++ b/plugins/base/macro-condition-run.cpp @@ -1,5 +1,5 @@ #include "macro-condition-run.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" #include diff --git a/plugins/base/macro-condition-scene-order.cpp b/plugins/base/macro-condition-scene-order.cpp index 723b49f5..c12a9317 100644 --- a/plugins/base/macro-condition-scene-order.cpp +++ b/plugins/base/macro-condition-scene-order.cpp @@ -1,5 +1,5 @@ #include "macro-condition-scene-order.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" namespace advss { diff --git a/plugins/base/macro-condition-scene-transform.cpp b/plugins/base/macro-condition-scene-transform.cpp index fa8c9181..291a2a0b 100644 --- a/plugins/base/macro-condition-scene-transform.cpp +++ b/plugins/base/macro-condition-scene-transform.cpp @@ -1,8 +1,8 @@ #include "macro-condition-scene-transform.hpp" -#include "scene-item-transform-helpers.hpp" +#include "layout-helpers.hpp" #include "json-helpers.hpp" #include "text-helpers.hpp" -#include "utility.hpp" +#include "scene-item-transform-helpers.hpp" namespace advss { diff --git a/plugins/base/macro-condition-scene-visibility.cpp b/plugins/base/macro-condition-scene-visibility.cpp index 93af62da..248fc8a4 100644 --- a/plugins/base/macro-condition-scene-visibility.cpp +++ b/plugins/base/macro-condition-scene-visibility.cpp @@ -1,6 +1,6 @@ #include "macro-condition-scene-visibility.hpp" +#include "layout-helpers.hpp" #include "obs-module-helper.hpp" -#include "utility.hpp" #include diff --git a/plugins/base/macro-condition-scene.cpp b/plugins/base/macro-condition-scene.cpp index 4eb6e496..a1e50517 100644 --- a/plugins/base/macro-condition-scene.cpp +++ b/plugins/base/macro-condition-scene.cpp @@ -1,6 +1,9 @@ #include "macro-condition-scene.hpp" +#include "layout-helpers.hpp" #include "scene-switch-helpers.hpp" -#include "utility.hpp" +#include "source-helpers.hpp" + +#include namespace advss { diff --git a/plugins/base/macro-condition-slideshow.cpp b/plugins/base/macro-condition-slideshow.cpp index d67ca999..99e7f531 100644 --- a/plugins/base/macro-condition-slideshow.cpp +++ b/plugins/base/macro-condition-slideshow.cpp @@ -1,6 +1,6 @@ #include "macro-condition-slideshow.hpp" #include "macro-helpers.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" namespace advss { diff --git a/plugins/base/macro-condition-source.cpp b/plugins/base/macro-condition-source.cpp index 36b6cdba..96506e08 100644 --- a/plugins/base/macro-condition-source.cpp +++ b/plugins/base/macro-condition-source.cpp @@ -1,8 +1,9 @@ #include "macro-condition-source.hpp" -#include "source-settings-helpers.hpp" +#include "layout-helpers.hpp" #include "json-helpers.hpp" #include "text-helpers.hpp" -#include "utility.hpp" +#include "selection-helpers.hpp" +#include "source-settings-helpers.hpp" namespace advss { diff --git a/plugins/base/macro-condition-streaming.cpp b/plugins/base/macro-condition-streaming.cpp index e00b619d..ea1a8b64 100644 --- a/plugins/base/macro-condition-streaming.cpp +++ b/plugins/base/macro-condition-streaming.cpp @@ -1,6 +1,8 @@ #include "macro-condition-streaming.hpp" #include "profile-helpers.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" + +#include namespace advss { diff --git a/plugins/base/macro-condition-studio-mode.cpp b/plugins/base/macro-condition-studio-mode.cpp index a7a450a8..dec28aa1 100644 --- a/plugins/base/macro-condition-studio-mode.cpp +++ b/plugins/base/macro-condition-studio-mode.cpp @@ -1,5 +1,8 @@ #include "macro-condition-studio-mode.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" +#include "source-helpers.hpp" + +#include namespace advss { diff --git a/plugins/base/macro-condition-timer.cpp b/plugins/base/macro-condition-timer.cpp index f22a1927..5a253930 100644 --- a/plugins/base/macro-condition-timer.cpp +++ b/plugins/base/macro-condition-timer.cpp @@ -1,5 +1,5 @@ #include "macro-condition-timer.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" namespace advss { diff --git a/plugins/base/macro-condition-transition.cpp b/plugins/base/macro-condition-transition.cpp index 02241d80..77f7d4bf 100644 --- a/plugins/base/macro-condition-transition.cpp +++ b/plugins/base/macro-condition-transition.cpp @@ -1,6 +1,8 @@ #include "macro-condition-transition.hpp" +#include "layout-helpers.hpp" #include "scene-switch-helpers.hpp" -#include "utility.hpp" + +#include namespace advss { diff --git a/plugins/base/macro-condition-virtual-cam.cpp b/plugins/base/macro-condition-virtual-cam.cpp index b8ca3c40..5afe60dd 100644 --- a/plugins/base/macro-condition-virtual-cam.cpp +++ b/plugins/base/macro-condition-virtual-cam.cpp @@ -1,5 +1,7 @@ #include "macro-condition-virtual-cam.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" + +#include namespace advss { diff --git a/plugins/base/macro-condition-websocket.cpp b/plugins/base/macro-condition-websocket.cpp index 80d7204d..b4d92174 100644 --- a/plugins/base/macro-condition-websocket.cpp +++ b/plugins/base/macro-condition-websocket.cpp @@ -1,5 +1,5 @@ #include "macro-condition-websocket.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" #include diff --git a/plugins/base/macro-condition-window.cpp b/plugins/base/macro-condition-window.cpp index 3be797a9..5335085e 100644 --- a/plugins/base/macro-condition-window.cpp +++ b/plugins/base/macro-condition-window.cpp @@ -1,7 +1,8 @@ #include "macro-condition-window.hpp" +#include "layout-helpers.hpp" #include "plugin-state-helpers.hpp" #include "platform-funcs.hpp" -#include "utility.hpp" +#include "selection-helpers.hpp" #include diff --git a/plugins/base/utils/connection-manager.cpp b/plugins/base/utils/connection-manager.cpp index 58959271..659546df 100644 --- a/plugins/base/utils/connection-manager.cpp +++ b/plugins/base/utils/connection-manager.cpp @@ -1,8 +1,9 @@ #include "connection-manager.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" +#include "name-dialog.hpp" #include "obs-module-helper.hpp" #include "plugin-state-helpers.hpp" -#include "name-dialog.hpp" +#include "ui-helpers.hpp" #include #include diff --git a/plugins/base/utils/filter-selection.cpp b/plugins/base/utils/filter-selection.cpp index fbdcbde8..828431ea 100644 --- a/plugins/base/utils/filter-selection.cpp +++ b/plugins/base/utils/filter-selection.cpp @@ -1,6 +1,8 @@ #include "filter-selection.hpp" #include "obs-module-helper.hpp" -#include "utility.hpp" +#include "selection-helpers.hpp" +#include "source-helpers.hpp" +#include "ui-helpers.hpp" #include "variable.hpp" namespace advss { @@ -164,6 +166,25 @@ void FilterSelectionWidget::Reset() SetFilter(_source, previousSelection); } +static QStringList getFilterNames(OBSWeakSource weakSource) +{ + if (!weakSource) { + return {}; + } + + QStringList list; + auto enumFilters = [](obs_source_t *, obs_source_t *filter, void *ptr) { + auto name = obs_source_get_name(filter); + QStringList *list = reinterpret_cast(ptr); + *list << QString(name); + }; + + auto s = obs_weak_source_get_source(weakSource); + obs_source_enum_filters(s, enumFilters, &list); + obs_source_release(s); + return list; +} + void FilterSelectionWidget::PopulateSelection() { const QSignalBlocker b(this); @@ -180,7 +201,7 @@ void FilterSelectionWidget::PopulateSelection() } _variablesEndIdx = count(); - AddSelectionGroup(this, GetFilterNames(_source.GetSource())); + AddSelectionGroup(this, getFilterNames(_source.GetSource())); _filterEndIdx = count(); // Remove last separator diff --git a/plugins/base/utils/osc-helpers.cpp b/plugins/base/utils/osc-helpers.cpp index 19ade579..266614c6 100644 --- a/plugins/base/utils/osc-helpers.cpp +++ b/plugins/base/utils/osc-helpers.cpp @@ -1,9 +1,10 @@ #include "osc-helpers.hpp" #include "obs-module-helper.hpp" -#include "utility.hpp" +#include "ui-helpers.hpp" -#include #include +#include +#include #ifdef WIN32 #include diff --git a/plugins/base/utils/process-config.cpp b/plugins/base/utils/process-config.cpp index 809e6d7b..4ccce5fc 100644 --- a/plugins/base/utils/process-config.cpp +++ b/plugins/base/utils/process-config.cpp @@ -1,10 +1,10 @@ #include "process-config.hpp" +#include "layout-helpers.hpp" #include "log-helper.hpp" #include "name-dialog.hpp" -#include "utility.hpp" -#include #include +#include namespace advss { diff --git a/plugins/base/utils/profile-helpers.cpp b/plugins/base/utils/profile-helpers.cpp index f17ca8ac..73762c1b 100644 --- a/plugins/base/utils/profile-helpers.cpp +++ b/plugins/base/utils/profile-helpers.cpp @@ -1,6 +1,6 @@ #include "profile-helpers.hpp" #include "obs-module-helper.hpp" -#include "utility.hpp" +#include "selection-helpers.hpp" #include diff --git a/plugins/base/utils/scene-item-selection.cpp b/plugins/base/utils/scene-item-selection.cpp index c6b8914d..4dd9d088 100644 --- a/plugins/base/utils/scene-item-selection.cpp +++ b/plugins/base/utils/scene-item-selection.cpp @@ -1,5 +1,9 @@ #include "scene-item-selection.hpp" +#include "layout-helpers.hpp" #include "obs-module-helper.hpp" +#include "selection-helpers.hpp" +#include "source-helpers.hpp" +#include "ui-helpers.hpp" #include diff --git a/plugins/base/utils/scene-item-selection.hpp b/plugins/base/utils/scene-item-selection.hpp index 4d314d0e..9204bde5 100644 --- a/plugins/base/utils/scene-item-selection.hpp +++ b/plugins/base/utils/scene-item-selection.hpp @@ -5,9 +5,9 @@ #include "variable-line-edit.hpp" #include "variable-string.hpp" #include "regex-config.hpp" -#include "utility.hpp" #include +#include namespace advss { diff --git a/plugins/base/utils/source-setting.cpp b/plugins/base/utils/source-setting.cpp index 5415f86f..01f789ff 100644 --- a/plugins/base/utils/source-setting.cpp +++ b/plugins/base/utils/source-setting.cpp @@ -1,9 +1,11 @@ #include "source-setting.hpp" #include "obs-module-helper.hpp" #include "math-helpers.hpp" +#include "ui-helpers.hpp" #include "utility.hpp" #include +#include Q_DECLARE_METATYPE(advss::SourceSetting); diff --git a/plugins/base/utils/string-list.cpp b/plugins/base/utils/string-list.cpp index 71a9fdb8..6bdcbb97 100644 --- a/plugins/base/utils/string-list.cpp +++ b/plugins/base/utils/string-list.cpp @@ -1,6 +1,6 @@ #include "string-list.hpp" #include "name-dialog.hpp" -#include "utility.hpp" +#include "ui-helpers.hpp" #include #include diff --git a/plugins/base/utils/transition-selection.cpp b/plugins/base/utils/transition-selection.cpp index 3ab2bf82..7713a003 100644 --- a/plugins/base/utils/transition-selection.cpp +++ b/plugins/base/utils/transition-selection.cpp @@ -1,6 +1,9 @@ #include "transition-selection.hpp" #include "obs-module-helper.hpp" -#include "utility.hpp" +#include "selection-helpers.hpp" +#include "source-helpers.hpp" + +#include namespace advss { diff --git a/plugins/midi/macro-action-midi.cpp b/plugins/midi/macro-action-midi.cpp index 7910daac..ab118e9c 100644 --- a/plugins/midi/macro-action-midi.cpp +++ b/plugins/midi/macro-action-midi.cpp @@ -1,5 +1,6 @@ #include "macro-action-midi.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" +#include "ui-helpers.hpp" namespace advss { diff --git a/plugins/midi/macro-condition-midi.cpp b/plugins/midi/macro-condition-midi.cpp index 290eddce..f8395ad5 100644 --- a/plugins/midi/macro-condition-midi.cpp +++ b/plugins/midi/macro-condition-midi.cpp @@ -1,5 +1,6 @@ #include "macro-condition-midi.hpp" -#include "utility.hpp" +#include "layout-helpers.hpp" +#include "ui-helpers.hpp" namespace advss { diff --git a/plugins/midi/midi-helpers.cpp b/plugins/midi/midi-helpers.cpp index 90887bc4..5c61caf9 100644 --- a/plugins/midi/midi-helpers.cpp +++ b/plugins/midi/midi-helpers.cpp @@ -1,10 +1,13 @@ #include "midi-helpers.hpp" -#include +#include #include #include #include +#include #include +#include +#include namespace advss { diff --git a/plugins/openvr/macro-condition-openvr.cpp b/plugins/openvr/macro-condition-openvr.cpp index ced75565..768888d2 100644 --- a/plugins/openvr/macro-condition-openvr.cpp +++ b/plugins/openvr/macro-condition-openvr.cpp @@ -1,7 +1,7 @@ #include "macro-condition-openvr.hpp" +#include #include -#include #include namespace advss { diff --git a/plugins/twitch/category-selection.cpp b/plugins/twitch/category-selection.cpp index 41fd78d0..5e6e5beb 100644 --- a/plugins/twitch/category-selection.cpp +++ b/plugins/twitch/category-selection.cpp @@ -2,11 +2,12 @@ #include "token.hpp" #include "twitch-helpers.hpp" -#include #include #include #include #include +#include +#include namespace advss { diff --git a/plugins/twitch/macro-action-twitch.cpp b/plugins/twitch/macro-action-twitch.cpp index 8dd6c87c..95ebba61 100644 --- a/plugins/twitch/macro-action-twitch.cpp +++ b/plugins/twitch/macro-action-twitch.cpp @@ -2,7 +2,7 @@ #include "twitch-helpers.hpp" #include -#include +#include namespace advss { diff --git a/plugins/twitch/macro-condition-twitch.cpp b/plugins/twitch/macro-condition-twitch.cpp index 408f529f..12d3b2d4 100644 --- a/plugins/twitch/macro-condition-twitch.cpp +++ b/plugins/twitch/macro-condition-twitch.cpp @@ -1,8 +1,8 @@ #include "macro-condition-twitch.hpp" #include "twitch-helpers.hpp" +#include #include -#include #include namespace advss { diff --git a/plugins/twitch/points-reward-selection.cpp b/plugins/twitch/points-reward-selection.cpp index 1a753190..68aed060 100644 --- a/plugins/twitch/points-reward-selection.cpp +++ b/plugins/twitch/points-reward-selection.cpp @@ -2,7 +2,7 @@ #include "twitch-helpers.hpp" #include -#include +#include namespace advss { diff --git a/plugins/twitch/token.cpp b/plugins/twitch/token.cpp index 333435ba..5dbbaa39 100644 --- a/plugins/twitch/token.cpp +++ b/plugins/twitch/token.cpp @@ -1,14 +1,15 @@ #include "token.hpp" #include "twitch-helpers.hpp" -#include +#include #include #include -#include -#include +#include #include #include +#include #include +#include namespace advss { diff --git a/plugins/video/macro-condition-video.cpp b/plugins/video/macro-condition-video.cpp index ad13103d..a9b74b4d 100644 --- a/plugins/video/macro-condition-video.cpp +++ b/plugins/video/macro-condition-video.cpp @@ -1,15 +1,16 @@ #include "macro-condition-video.hpp" +#include #include #include -#include - -#include #include -#include +#include +#include #include #include -#include +#include +#include +#include namespace advss { diff --git a/plugins/video/paramerter-wrappers.cpp b/plugins/video/paramerter-wrappers.cpp index df15517b..d99fb9d4 100644 --- a/plugins/video/paramerter-wrappers.cpp +++ b/plugins/video/paramerter-wrappers.cpp @@ -1,6 +1,7 @@ #include "paramerter-wrappers.hpp" #include +#include namespace advss { diff --git a/plugins/video/preview-dialog.cpp b/plugins/video/preview-dialog.cpp index f97d199b..47e8ec07 100644 --- a/plugins/video/preview-dialog.cpp +++ b/plugins/video/preview-dialog.cpp @@ -1,8 +1,8 @@ #include "preview-dialog.hpp" - #include "opencv-helpers.hpp" -#include "utility.hpp" +#include "ui-helpers.hpp" +#include #include namespace advss {