From b9be64a85395bb22a9e1623fc87f73c3d916323f Mon Sep 17 00:00:00 2001 From: WarmUpTill <19472752+WarmUpTill@users.noreply.github.com> Date: Sun, 11 Oct 2026 12:05:42 +0200 Subject: [PATCH] Add ValueInputWidget --- CMakeLists.txt | 2 + data/locale/en-US.ini | 7 ++ lib/utils/value-input.cpp | 152 ++++++++++++++++++++++++++++++++++++++ lib/utils/value-input.hpp | 38 ++++++++++ 4 files changed, 199 insertions(+) create mode 100644 lib/utils/value-input.cpp create mode 100644 lib/utils/value-input.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index b9c05e93..86378a8a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -301,6 +301,8 @@ target_sources( lib/utils/ui-helpers.hpp lib/utils/utility.cpp lib/utils/utility.hpp + lib/utils/value-input.cpp + lib/utils/value-input.hpp lib/utils/volume-control.cpp lib/utils/volume-control.hpp lib/utils/websocket-api.cpp diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 94ff2a47..9ffc42f0 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -2684,6 +2684,13 @@ AdvSceneSwitcher.selectProfile="--select profile--" AdvSceneSwitcher.selectSceneCollection="--select scene collection--" AdvSceneSwitcher.enterPath="--enter path--" AdvSceneSwitcher.enterText="--enter text--" +AdvSceneSwitcher.valueInputType.file="File" +AdvSceneSwitcher.valueInputType.folder="Folder" +AdvSceneSwitcher.valueInputType.scene="Scene" +AdvSceneSwitcher.valueInputType.source="Source" +AdvSceneSwitcher.valueInputType.string="Plain text" +AdvSceneSwitcher.valueInputType.variable="Variable" +AdvSceneSwitcher.valueInputType.selection="Selection from list" AdvSceneSwitcher.enterURL="--enter URL--" AdvSceneSwitcher.selectHotkey="--select hotkey--" AdvSceneSwitcher.selectDisplay="--select display--" diff --git a/lib/utils/value-input.cpp b/lib/utils/value-input.cpp new file mode 100644 index 00000000..5a0cc3f8 --- /dev/null +++ b/lib/utils/value-input.cpp @@ -0,0 +1,152 @@ +#include "value-input.hpp" +#include "file-selection.hpp" +#include "obs-module-helper.hpp" +#include "scene-selection.hpp" +#include "selection-helpers.hpp" +#include "source-helpers.hpp" +#include "source-selection.hpp" +#include "variable.hpp" + +#include +#include +#include +#include + +namespace advss { + +void PopulateValueInputTypeSelection(QComboBox *list) +{ + static const std::vector> + types = { + {ValueInputType::File, + "AdvSceneSwitcher.valueInputType.file"}, + {ValueInputType::Folder, + "AdvSceneSwitcher.valueInputType.folder"}, + {ValueInputType::Scene, + "AdvSceneSwitcher.valueInputType.scene"}, + {ValueInputType::Source, + "AdvSceneSwitcher.valueInputType.source"}, + {ValueInputType::String, + "AdvSceneSwitcher.valueInputType.string"}, + {ValueInputType::Variable, + "AdvSceneSwitcher.valueInputType.variable"}, + {ValueInputType::Selection, + "AdvSceneSwitcher.valueInputType.selection"}, + }; + for (const auto &[type, name] : types) { + list->addItem(obs_module_text(name), static_cast(type)); + } +} + +static QStringList populateSources() +{ + auto sources = GetSourceNames(); + sources.sort(); + return sources; +} + +ValueInputWidget::ValueInputWidget(ValueInputType type, + const std::string &defaultValue, + const QStringList &options, QWidget *parent) + : QWidget(parent) +{ + auto layout = new QHBoxLayout(this); + layout->setContentsMargins(0, 0, 0, 0); + + switch (type) { + case ValueInputType::File: + case ValueInputType::Folder: { + auto widget = + new FileSelection(type == ValueInputType::Folder + ? FileSelection::Type::FOLDER + : FileSelection::Type::READ, + this); + widget->SetPath(QString::fromStdString(defaultValue)); + layout->addWidget(widget); + _getValue = [widget]() { + return widget->GetPath().toStdString(); + }; + break; + } + case ValueInputType::Scene: { + auto widget = new SceneSelectionWidget(this); + auto current = std::make_shared(); + auto scene = GetWeakSourceByName(defaultValue.c_str()); + OBSSourceAutoRelease source = obs_weak_source_get_source(scene); + if (source && obs_source_is_scene(source)) { + SceneSelection selection; + selection.SetScene(scene); + widget->SetScene(selection); + *current = defaultValue; + } + connect(widget, &SceneSelectionWidget::SceneChanged, this, + [current](const SceneSelection &s) { + *current = s.ToString(); + }); + layout->addWidget(widget); + _getValue = [current]() { + return *current; + }; + break; + } + case ValueInputType::Source: { + auto widget = + new SourceSelectionWidget(this, populateSources, false); + auto current = std::make_shared(); + auto source = GetWeakSourceByName(defaultValue.c_str()); + if (source) { + SourceSelection selection; + selection.SetSource(source); + widget->SetSource(selection); + *current = defaultValue; + } + connect(widget, &SourceSelectionWidget::SourceChanged, this, + [current](const SourceSelection &s) { + *current = s.ToString(); + }); + layout->addWidget(widget); + _getValue = [current]() { + return *current; + }; + break; + } + case ValueInputType::Selection: { + auto widget = new QComboBox(this); + widget->addItems(options); + widget->setCurrentIndex( + widget->findText(QString::fromStdString(defaultValue))); + layout->addWidget(widget); + _getValue = [widget]() { + return widget->currentText().toStdString(); + }; + break; + } + case ValueInputType::Variable: { + auto widget = new VariableSelection(this); + widget->SetVariable(defaultValue); + layout->addWidget(widget); + _getValue = [widget]() { + auto item = widget->GetCurrentItem(); + return item ? item->Name() : ""; + }; + break; + } + default: // ValueInputType::String + { + auto widget = new QLineEdit( + QString::fromStdString(defaultValue), this); + layout->addWidget(widget); + _getValue = [widget]() { + return widget->text().toStdString(); + }; + break; + } + } +} + +std::string ValueInputWidget::Value() const +{ + return _getValue(); +} + +} // namespace advss diff --git a/lib/utils/value-input.hpp b/lib/utils/value-input.hpp new file mode 100644 index 00000000..5bd56325 --- /dev/null +++ b/lib/utils/value-input.hpp @@ -0,0 +1,38 @@ +#pragma once +#include "export-symbol-helper.hpp" + +#include +#include +#include +#include + +class QComboBox; + +namespace advss { + +enum class ValueInputType { + File, + Folder, + Scene, + Source, + String, + Variable, + Selection, +}; + +void PopulateValueInputTypeSelection(QComboBox *list); + +class ValueInputWidget : public QWidget { + Q_OBJECT + +public: + ValueInputWidget(ValueInputType type, const std::string &defaultValue, + const QStringList &options = {}, + QWidget *parent = nullptr); + std::string Value() const; + +private: + std::function _getValue; +}; + +} // namespace advss