diff --git a/src/macro-core/macro-action-scene-order.cpp b/src/macro-core/macro-action-scene-order.cpp index 4a73b8be..6eedeb1a 100644 --- a/src/macro-core/macro-action-scene-order.cpp +++ b/src/macro-core/macro-action-scene-order.cpp @@ -157,7 +157,7 @@ MacroActionSceneOrderEdit::MacroActionSceneOrderEdit( QWidget *parent, std::shared_ptr entryData) : QWidget(parent) { - _scenes = new SceneSelectionWidget(window(), false, false, true); + _scenes = new SceneSelectionWidget(window(), true, false, false, true); _sources = new SceneItemSelectionWidget(parent); _actions = new QComboBox(); _position = new QSpinBox(); diff --git a/src/macro-core/macro-action-scene-switch.cpp b/src/macro-core/macro-action-scene-switch.cpp index c172e873..dcfc1ea7 100644 --- a/src/macro-core/macro-action-scene-switch.cpp +++ b/src/macro-core/macro-action-scene-switch.cpp @@ -171,7 +171,7 @@ MacroActionSwitchSceneEdit::MacroActionSwitchSceneEdit( QWidget *parent, std::shared_ptr entryData) : QWidget(parent) { - _scenes = new SceneSelectionWidget(window(), true, true); + _scenes = new SceneSelectionWidget(window(), true, true, true); _transitions = new TransitionSelectionWidget(this); _duration = new DurationSelection(parent, false); _blockUntilTransitionDone = new QCheckBox(obs_module_text( diff --git a/src/macro-core/macro-action-scene-transform.cpp b/src/macro-core/macro-action-scene-transform.cpp index 5f82cddf..048c42f1 100644 --- a/src/macro-core/macro-action-scene-transform.cpp +++ b/src/macro-core/macro-action-scene-transform.cpp @@ -107,7 +107,7 @@ MacroActionSceneTransformEdit::MacroActionSceneTransformEdit( QWidget *parent, std::shared_ptr entryData) : QWidget(parent) { - _scenes = new SceneSelectionWidget(window(), false, false, true); + _scenes = new SceneSelectionWidget(window(), true, false, false, true); _sources = new SceneItemSelectionWidget(parent); _getSettings = new QPushButton(obs_module_text( "AdvSceneSwitcher.action.sceneTransform.getTransform")); diff --git a/src/macro-core/macro-action-scene-visibility.cpp b/src/macro-core/macro-action-scene-visibility.cpp index c87450d1..ae45de2e 100644 --- a/src/macro-core/macro-action-scene-visibility.cpp +++ b/src/macro-core/macro-action-scene-visibility.cpp @@ -166,7 +166,7 @@ MacroActionSceneVisibilityEdit::MacroActionSceneVisibilityEdit( QWidget *parent, std::shared_ptr entryData) : QWidget(parent) { - _scenes = new SceneSelectionWidget(window(), false, true, true); + _scenes = new SceneSelectionWidget(window(), true, false, true, true); _sourceTypes = new QComboBox(); _sources = new SceneItemSelectionWidget(parent); _sourceGroups = new QComboBox(); diff --git a/src/macro-core/macro-action-studio-mode.cpp b/src/macro-core/macro-action-studio-mode.cpp index e4db3fe1..4d09f4ca 100644 --- a/src/macro-core/macro-action-studio-mode.cpp +++ b/src/macro-core/macro-action-studio-mode.cpp @@ -124,7 +124,7 @@ MacroActionSudioModeEdit::MacroActionSudioModeEdit( QWidget *parent, std::shared_ptr entryData) : QWidget(parent), _actions(new QComboBox()), - _scenes(new SceneSelectionWidget(window(), true, true, true)) + _scenes(new SceneSelectionWidget(window(), true, true, true, true)) { populateActionSelection(_actions); QWidget::connect(_actions, SIGNAL(currentIndexChanged(int)), this, diff --git a/src/macro-core/macro-action-transition.cpp b/src/macro-core/macro-action-transition.cpp index c74dfd62..a08df609 100644 --- a/src/macro-core/macro-action-transition.cpp +++ b/src/macro-core/macro-action-transition.cpp @@ -207,7 +207,7 @@ MacroActionTransitionEdit::MacroActionTransitionEdit( : QWidget(parent), _actions(new QComboBox), _sources(new SceneItemSelectionWidget(parent, false)), - _scenes(new SceneSelectionWidget(this, false, false, true)), + _scenes(new SceneSelectionWidget(this, true, false, false, true)), _setTransition(new QCheckBox), _setDuration(new QCheckBox), _transitions(new TransitionSelectionWidget(this, false)), diff --git a/src/macro-core/macro-condition-scene-order.cpp b/src/macro-core/macro-condition-scene-order.cpp index 59494239..3104edfa 100644 --- a/src/macro-core/macro-condition-scene-order.cpp +++ b/src/macro-core/macro-condition-scene-order.cpp @@ -191,7 +191,7 @@ MacroConditionSceneOrderEdit::MacroConditionSceneOrderEdit( QWidget *parent, std::shared_ptr entryData) : QWidget(parent) { - _scenes = new SceneSelectionWidget(window(), false, false, true); + _scenes = new SceneSelectionWidget(window(), true, false, false, true); _sources = new SceneItemSelectionWidget(parent); _sources2 = new SceneItemSelectionWidget(parent); _conditions = new QComboBox(); diff --git a/src/macro-core/macro-condition-scene-transform.cpp b/src/macro-core/macro-condition-scene-transform.cpp index 26ffd968..ab128c0a 100644 --- a/src/macro-core/macro-condition-scene-transform.cpp +++ b/src/macro-core/macro-condition-scene-transform.cpp @@ -72,7 +72,7 @@ MacroConditionSceneTransformEdit::MacroConditionSceneTransformEdit( QWidget *parent, std::shared_ptr entryData) : QWidget(parent), - _scenes(new SceneSelectionWidget(window(), false, false, true)), + _scenes(new SceneSelectionWidget(window(), true, false, false, true)), _sources(new SceneItemSelectionWidget( parent, true, SceneItemSelectionWidget::AllSelectionType::ANY)), diff --git a/src/macro-core/macro-condition-scene-visibility.cpp b/src/macro-core/macro-condition-scene-visibility.cpp index 81014efc..e7ccf05c 100644 --- a/src/macro-core/macro-condition-scene-visibility.cpp +++ b/src/macro-core/macro-condition-scene-visibility.cpp @@ -113,7 +113,7 @@ MacroConditionSceneVisibilityEdit::MacroConditionSceneVisibilityEdit( std::shared_ptr entryData) : QWidget(parent) { - _scenes = new SceneSelectionWidget(window(), false, true, true); + _scenes = new SceneSelectionWidget(window(), true, false, true, true); _sources = new SceneItemSelectionWidget(parent); _conditions = new QComboBox(); diff --git a/src/macro-core/macro-condition-scene.cpp b/src/macro-core/macro-condition-scene.cpp index 35a7ad56..27f98ad6 100644 --- a/src/macro-core/macro-condition-scene.cpp +++ b/src/macro-core/macro-condition-scene.cpp @@ -95,7 +95,7 @@ MacroConditionSceneEdit::MacroConditionSceneEdit( QWidget *parent, std::shared_ptr entryData) : QWidget(parent) { - _scenes = new SceneSelectionWidget(window(), false, false, false); + _scenes = new SceneSelectionWidget(window(), true, false, false, false); _sceneType = new QComboBox(); _useTransitionTargetScene = new QCheckBox(obs_module_text( "AdvSceneSwitcher.condition.scene.currentSceneTransitionBehaviour")); diff --git a/src/macro-core/macro-condition-studio-mode.cpp b/src/macro-core/macro-condition-studio-mode.cpp index 993539ab..e8c8cfa4 100644 --- a/src/macro-core/macro-condition-studio-mode.cpp +++ b/src/macro-core/macro-condition-studio-mode.cpp @@ -80,7 +80,7 @@ MacroConditionStudioModeEdit::MacroConditionStudioModeEdit( : QWidget(parent) { _condition = new QComboBox(); - _scenes = new SceneSelectionWidget(window()); + _scenes = new SceneSelectionWidget(window(), true, false, true, true); populateConditionSelection(_condition); diff --git a/src/macro-core/macro-condition-transition.cpp b/src/macro-core/macro-condition-transition.cpp index 3e67f456..ed25ca52 100644 --- a/src/macro-core/macro-condition-transition.cpp +++ b/src/macro-core/macro-condition-transition.cpp @@ -183,7 +183,7 @@ MacroConditionTransitionEdit::MacroConditionTransitionEdit( { _conditions = new QComboBox(); _transitions = new TransitionSelectionWidget(this, true, true); - _scenes = new SceneSelectionWidget(this, false, true, true); + _scenes = new SceneSelectionWidget(this, true, false, true, true); _duration = new DurationSelection(this, false); _durationSuffix = new QLabel(obs_module_text( "AdvSceneSwitcher.condition.transition.durationSuffix")); diff --git a/src/utils/scene-selection.cpp b/src/utils/scene-selection.cpp index 4238d54a..1c44cde0 100644 --- a/src/utils/scene-selection.cpp +++ b/src/utils/scene-selection.cpp @@ -1,11 +1,12 @@ #include "scene-selection.hpp" #include "advanced-scene-switcher.hpp" +#include "utility.hpp" constexpr std::string_view typeSaveName = "type"; constexpr std::string_view nameSaveName = "name"; constexpr std::string_view selectionSaveName = "sceneSelection"; -void SceneSelection::Save(obs_data_t *obj) +void SceneSelection::Save(obs_data_t *obj) const { auto data = obs_data_create(); obs_data_set_int(data, typeSaveName.data(), static_cast(_type)); @@ -18,6 +19,15 @@ void SceneSelection::Save(obs_data_t *obj) obs_data_set_string(data, nameSaveName.data(), _group->name.c_str()); break; + case Type::VARIABLE: { + auto var = _variable.lock(); + if (!var) { + break; + } + obs_data_set_string(data, nameSaveName.data(), + var->Name().c_str()); + break; + } default: break; } @@ -63,13 +73,16 @@ void SceneSelection::Load(obs_data_t *obj, const char *name, break; case Type::CURRENT: break; + case Type::VARIABLE: + _variable = GetWeakVariableByName(targetName); + break; default: break; } obs_data_release(data); } -OBSWeakSource SceneSelection::GetScene(bool advance) +OBSWeakSource SceneSelection::GetScene(bool advance) const { switch (_type) { case Type::SCENE: @@ -86,13 +99,20 @@ OBSWeakSource SceneSelection::GetScene(bool advance) return switcher->previousScene; case Type::CURRENT: return switcher->currentScene; + case Type::VARIABLE: { + auto var = _variable.lock(); + if (!var) { + return nullptr; + } + return GetWeakSourceByName(var->Value().c_str()); + } default: break; } return nullptr; } -std::string SceneSelection::ToString() +std::string SceneSelection::ToString() const { switch (_type) { case Type::SCENE: @@ -106,175 +126,275 @@ std::string SceneSelection::ToString() return obs_module_text("AdvSceneSwitcher.selectPreviousScene"); case Type::CURRENT: return obs_module_text("AdvSceneSwitcher.selectCurrentScene"); + case Type::VARIABLE: { + auto var = _variable.lock(); + if (!var) { + return ""; + } + return var->Name(); + } default: break; } return ""; } -SceneSelectionWidget::SceneSelectionWidget(QWidget *parent, bool sceneGroups, - bool previous, bool current) - : QComboBox(parent) -{ - // For the rare occasion of a name conflict with current / previous - setDuplicatesEnabled(true); - populateSceneSelection(this, previous, current, false, sceneGroups, - &switcher->sceneGroups); - - QWidget::connect(this, SIGNAL(currentTextChanged(const QString &)), - this, SLOT(SelectionChanged(const QString &))); - QWidget::connect(parent, SIGNAL(SceneGroupAdded(const QString &)), this, - SLOT(SceneGroupAdd(const QString &))); - QWidget::connect(parent, SIGNAL(SceneGroupRemoved(const QString &)), - this, SLOT(SceneGroupRemove(const QString &))); - QWidget::connect( - parent, - SIGNAL(SceneGroupRenamed(const QString &, const QString &)), - this, SLOT(SceneGroupRename(const QString &, const QString &))); -} - -void SceneSelectionWidget::SetScene(SceneSelection &s) -{ - // Order of entries - // 1. Any Scene (current not used) - // 2. Current Scene - // 3. Previous Scene - // 4. Scenes / Scene Groups - - int idx; - - switch (s.GetType()) { - case SceneSelection::Type::SCENE: - case SceneSelection::Type::GROUP: - setCurrentText(QString::fromStdString(s.ToString())); - break; - case SceneSelection::Type::PREVIOUS: - idx = findText(QString::fromStdString(obs_module_text( - "AdvSceneSwitcher.selectPreviousScene"))); - if (idx != -1) { - setCurrentIndex(idx); - } - break; - case SceneSelection::Type::CURRENT: - idx = findText(QString::fromStdString(obs_module_text( - "AdvSceneSwitcher.selectCurrentScene"))); - if (idx != -1) { - setCurrentIndex(idx); - } - break; - default: - setCurrentIndex(0); - break; - } -} - -static bool isFirstEntry(QComboBox *l, QString name, int idx) -{ - for (auto i = l->count() - 1; i >= 0; i--) { - if (l->itemText(i) == name) { - return idx == i; - } - } - - // If entry cannot be found we dont want the selection to be empty - return false; -} - -bool SceneSelectionWidget::IsCurrentSceneSelected(const QString &name) -{ - if (name == QString::fromStdString((obs_module_text( - "AdvSceneSwitcher.selectCurrentScene")))) { - return isFirstEntry(this, name, currentIndex()); - } - return false; -} - -bool SceneSelectionWidget::IsPreviousSceneSelected(const QString &name) -{ - if (name == QString::fromStdString((obs_module_text( - "AdvSceneSwitcher.selectPreviousScene")))) { - return isFirstEntry(this, name, currentIndex()); - } - return false; -} - -void SceneSelectionWidget::SelectionChanged(const QString &name) +SceneSelection SceneSelectionWidget::CurrentSelection() { SceneSelection s; - auto scene = GetWeakSourceByQString(name); - if (scene) { - s._type = SceneSelection::Type::SCENE; - s._scene = scene; - } + const int idx = currentIndex(); + const auto name = currentText(); - auto group = GetSceneGroupByQString(name); - if (group) { - s._type = SceneSelection::Type::GROUP; - s._scene = nullptr; - s._group = group; - } - - if (!scene && !group) { + if (idx < _orderEndIdx) { if (IsCurrentSceneSelected(name)) { s._type = SceneSelection::Type::CURRENT; } if (IsPreviousSceneSelected(name)) { s._type = SceneSelection::Type::PREVIOUS; } + } else if (idx < _variablesEndIdx) { + s._type = SceneSelection::Type::VARIABLE; + s._variable = GetWeakVariableByQString(name); + } else if (idx < _groupsEndIdx) { + s._type = SceneSelection::Type::GROUP; + s._group = GetSceneGroupByQString(name); + } else if (idx < _scenesEndIdx) { + s._type = SceneSelection::Type::SCENE; + s._scene = GetWeakSourceByQString(name); } - - emit SceneChanged(s); + return s; } -void SceneSelectionWidget::SceneGroupAdd(const QString &name) +static QStringList getOrderList(bool current, bool previous) { - addItem(name); + QStringList list; + if (current) { + list << obs_module_text("AdvSceneSwitcher.selectCurrentScene"); + } + if (previous) { + list << obs_module_text("AdvSceneSwitcher.selectPreviousScene"); + } + return list; } -void SceneSelectionWidget::SceneGroupRemove(const QString &name) +static QStringList getScenesList() { - int idx = findText(name); - - if (idx == -1) { - return; + 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; +} - int curIdx = currentIndex(); - removeItem(idx); - - if (curIdx == idx) { - SceneSelection s; - emit SceneChanged(s); +static QStringList getSceneGroupsList() +{ + QStringList list; + for (const auto &sg : switcher->sceneGroups) { + list << QString::fromStdString(sg.name); } + list.sort(); + return list; +} +void SceneSelectionWidget::Reset() +{ + auto previousSel = _currentSelection; + PopulateSelection(); + SetScene(previousSel); +} + +void SceneSelectionWidget::PopulateSelection() +{ + clear(); + addSelectionEntry(this, + obs_module_text("AdvSceneSwitcher.selectScene")); + insertSeparator(count()); + + if (_current || _previous) { + const QStringList order = getOrderList(_current, _previous); + addSelectionGroup(this, order); + } + _orderEndIdx = count(); + + if (_variables) { + const QStringList variables = GetVariablesNameList(); + addSelectionGroup(this, variables); + } + _variablesEndIdx = count(); + + if (_sceneGroups) { + const QStringList sceneGroups = getSceneGroupsList(); + addSelectionGroup(this, sceneGroups); + } + _groupsEndIdx = count(); + + const QStringList scenes = getScenesList(); + addSelectionGroup(this, scenes); + _scenesEndIdx = count(); + + // Remove last separator + removeItem(count() - 1); setCurrentIndex(0); } -static int findLastOf(QComboBox *l, QString name) +SceneSelectionWidget::SceneSelectionWidget(QWidget *parent, bool variables, + bool sceneGroups, bool previous, + bool current) + : QComboBox(parent), + _current(current), + _previous(previous), + _variables(variables), + _sceneGroups(sceneGroups) +{ + setDuplicatesEnabled(true); + PopulateSelection(); + + QWidget::connect(this, SIGNAL(currentTextChanged(const QString &)), + this, SLOT(SelectionChanged(const QString &))); + + // Scene groups + QWidget::connect(window(), SIGNAL(SceneGroupAdded(const QString &)), + this, SLOT(ItemAdd(const QString &))); + QWidget::connect(window(), SIGNAL(SceneGroupRemoved(const QString &)), + this, SLOT(ItemRemove(const QString &))); + QWidget::connect( + window(), + SIGNAL(SceneGroupRenamed(const QString &, const QString &)), + this, SLOT(ItemRename(const QString &, const QString &))); + + // Variables + QWidget::connect(window(), SIGNAL(VariableAdded(const QString &)), this, + SLOT(ItemAdd(const QString &))); + QWidget::connect(window(), SIGNAL(VariableRemoved(const QString &)), + this, SLOT(ItemRemove(const QString &))); + QWidget::connect( + window(), + SIGNAL(VariableRenamed(const QString &, const QString &)), this, + SLOT(ItemRename(const QString &, const QString &))); +} + +void SceneSelectionWidget::SetScene(const SceneSelection &s) { int idx = 0; - for (auto i = l->count() - 1; i >= 0; i--) { - if (l->itemText(i) == name) { - return idx; + + switch (s.GetType()) { + case SceneSelection::Type::SCENE: { + if (_scenesEndIdx == -1) { + idx = 0; + break; + } + idx = findIdxInRagne(this, _groupsEndIdx, _scenesEndIdx, + s.ToString()); + break; + } + case SceneSelection::Type::GROUP: { + if (_groupsEndIdx == -1) { + idx = 0; + break; + } + idx = findIdxInRagne(this, _variablesEndIdx, _groupsEndIdx, + s.ToString()); + break; + } + case SceneSelection::Type::PREVIOUS: { + if (_orderEndIdx == -1) { + idx = 0; + break; + } + + idx = findIdxInRagne( + this, _selectIdx, _orderEndIdx, + obs_module_text( + "AdvSceneSwitcher.selectPreviousScene")); + break; + } + case SceneSelection::Type::CURRENT: { + if (_orderEndIdx == -1) { + idx = 0; + break; + } + + idx = findIdxInRagne( + this, _selectIdx, _orderEndIdx, + obs_module_text("AdvSceneSwitcher.selectCurrentScene")); + break; + } + case SceneSelection::Type::VARIABLE: { + if (_variablesEndIdx == -1) { + idx = 0; + break; + } + idx = findIdxInRagne(this, _orderEndIdx, _variablesEndIdx, + s.ToString()); + break; + default: + idx = 0; + break; + } + } + setCurrentIndex(idx); + _currentSelection = s; +} + +bool SceneSelectionWidget::IsCurrentSceneSelected(const QString &name) +{ + return name == QString::fromStdString((obs_module_text( + "AdvSceneSwitcher.selectCurrentScene"))); +} + +bool SceneSelectionWidget::IsPreviousSceneSelected(const QString &name) +{ + return name == QString::fromStdString((obs_module_text( + "AdvSceneSwitcher.selectPreviousScene"))); +} + +void SceneSelectionWidget::SelectionChanged(const QString &name) +{ + _currentSelection = CurrentSelection(); + emit SceneChanged(_currentSelection); +} + +void SceneSelectionWidget::ItemAdd(const QString &name) +{ + blockSignals(true); + Reset(); + blockSignals(false); +} + +bool SceneSelectionWidget::NameUsed(const QString &name) +{ + if (_currentSelection._type == SceneSelection::Type::GROUP && + _currentSelection._group && + _currentSelection._group->name == name.toStdString()) { + return true; + } + if (_currentSelection._type == SceneSelection::Type::VARIABLE) { + auto var = _currentSelection._variable.lock(); + if (var && var->Name() == name.toStdString()) { + return true; } } - return idx; + return false; } -void SceneSelectionWidget::SceneGroupRename(const QString &oldName, - const QString &newName) +void SceneSelectionWidget::ItemRemove(const QString &name) { - bool renameSelected = currentText() == oldName; - int idx = findText(oldName); - - if (idx == -1) { - return; - } - - removeItem(idx); - insertItem(idx, newName); - - if (renameSelected) { - setCurrentIndex(findLastOf(this, newName)); + if (!NameUsed(name)) { + blockSignals(true); } + Reset(); + blockSignals(false); +} + +void SceneSelectionWidget::ItemRename(const QString &oldName, + const QString &newName) +{ + blockSignals(true); + Reset(); + blockSignals(false); } diff --git a/src/utils/scene-selection.hpp b/src/utils/scene-selection.hpp index bf14fcb9..846b86bd 100644 --- a/src/utils/scene-selection.hpp +++ b/src/utils/scene-selection.hpp @@ -1,13 +1,13 @@ #pragma once #include "scene-group.hpp" +#include "variable.hpp" #include "utility.hpp" #include class SceneSelection { public: - void Save(obs_data_t *obj, const char *name = "scene", - const char *typeName = "sceneType"); + void Save(obs_data_t *obj) const; void Load(obs_data_t *obj, const char *name = "scene", const char *typeName = "sceneType"); @@ -16,15 +16,17 @@ public: GROUP, PREVIOUS, CURRENT, + VARIABLE, }; - Type GetType() { return _type; } - OBSWeakSource GetScene(bool advance = true); - std::string ToString(); + Type GetType() const { return _type; } + OBSWeakSource GetScene(bool advance = true) const; + std::string ToString() const; private: OBSWeakSource _scene; SceneGroup *_group = nullptr; + std::weak_ptr _variable; Type _type = Type::SCENE; friend class SceneSelectionWidget; }; @@ -33,19 +35,43 @@ class SceneSelectionWidget : public QComboBox { Q_OBJECT public: - SceneSelectionWidget(QWidget *parent, bool sceneGroups = false, - bool previous = false, bool current = false); - void SetScene(SceneSelection &); + SceneSelectionWidget(QWidget *parent, bool variables = false, + bool sceneGroups = false, bool previous = false, + bool current = false); + void SetScene(const SceneSelection &); signals: void SceneChanged(const SceneSelection &); private slots: void SelectionChanged(const QString &name); - void SceneGroupAdd(const QString &name); - void SceneGroupRemove(const QString &name); - void SceneGroupRename(const QString &oldName, const QString &newName); + void ItemAdd(const QString &name); + void ItemRemove(const QString &name); + void ItemRename(const QString &oldName, const QString &newName); private: + void Reset(); + SceneSelection CurrentSelection(); + void PopulateSelection(); bool IsCurrentSceneSelected(const QString &name); bool IsPreviousSceneSelected(const QString &name); + bool NameUsed(const QString &name); + + bool _current; + bool _previous; + bool _variables; + bool _sceneGroups; + + SceneSelection _currentSelection; + + // Order of entries + // 1. "select entry" entry + // 2. Current / previous scene + // 3. Variables + // 4. Scene groups + // 5. Regular scenes + const int _selectIdx = 0; + int _orderEndIdx = -1; + int _variablesEndIdx = -1; + int _groupsEndIdx = -1; + int _scenesEndIdx = -1; }; diff --git a/src/utils/utility.cpp b/src/utils/utility.cpp index 3d1948c2..28499d2f 100644 --- a/src/utils/utility.cpp +++ b/src/utils/utility.cpp @@ -1027,3 +1027,33 @@ void setButtonIcon(QPushButton *button, const char *path) 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) +{ + if (value.empty()) { + return 0; + } + auto model = list->model(); + auto startIdx = model->index(start, 0); + auto match = model->match(startIdx, Qt::DisplayRole, + QString::fromStdString(value), 1, + Qt::MatchExactly | Qt::MatchCaseSensitive); + if (match.isEmpty()) { + return 0; + } + int foundIdx = match.first().row(); + if (foundIdx > stop) { + return 0; + } + return foundIdx; +} diff --git a/src/utils/utility.hpp b/src/utils/utility.hpp index 905ec803..74589bb0 100644 --- a/src/utils/utility.hpp +++ b/src/utils/utility.hpp @@ -87,3 +87,7 @@ void populateProfileSelection(QComboBox *list); bool windowPosValid(QPoint pos); bool doubleEquals(double left, double right, double epsilon); void setButtonIcon(QPushButton *button, const char *path); +void addSelectionGroup(QComboBox *selection, const QStringList &group, + bool addSeparator = true); +int findIdxInRagne(QComboBox *list, int start, int stop, + const std::string &value);