From e080d2de9bb9dd45853992906389dd30cee0e255 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Fri, 19 Apr 2024 23:44:37 +0200 Subject: [PATCH] Add option to set custom labels on macro segments --- data/locale/en-US.ini | 3 ++ lib/macro/macro-segment-list.cpp | 11 ++++-- lib/macro/macro-segment-list.hpp | 3 +- lib/macro/macro-segment.cpp | 12 ++++++- lib/macro/macro-segment.hpp | 13 ++++++- lib/macro/macro-tab.cpp | 62 ++++++++++++++++++++++++++------ 6 files changed, 87 insertions(+), 17 deletions(-) diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index e21df3d5..b3a39b1f 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -133,6 +133,9 @@ AdvSceneSwitcher.macroTab.expandAll="Expand all" AdvSceneSwitcher.macroTab.collapseAll="Collapse all" AdvSceneSwitcher.macroTab.maximize="Maximize" AdvSceneSwitcher.macroTab.minimize="Minimize" +AdvSceneSwitcher.macroTab.segment.useCustomLabel="Use custom label" +AdvSceneSwitcher.macroTab.segment.defaultCustomLabel="My label" +AdvSceneSwitcher.macroTab.segment.setCustomLabel="Set label ..." AdvSceneSwitcher.macroTab.highlightSettings="Visual settings" AdvSceneSwitcher.macroTab.hotkeySettings="Hotkey settings" AdvSceneSwitcher.macroTab.generalSettings="General settings" diff --git a/lib/macro/macro-segment-list.cpp b/lib/macro/macro-segment-list.cpp index 477563f3..17c0166e 100644 --- a/lib/macro/macro-segment-list.cpp +++ b/lib/macro/macro-segment-list.cpp @@ -246,6 +246,11 @@ MacroSegmentEdit *MacroSegmentList::WidgetAt(int idx) return static_cast(item->widget()); } +MacroSegmentEdit *MacroSegmentList::WidgetAt(const QPoint &pos) +{ + return WidgetAt(GetSegmentIndexFromPos(mapToGlobal(pos))); +} + void MacroSegmentList::HideLastDropLine() { if (_dropLineIdx >= 0 && _dropLineIdx < _contentLayout->count()) { @@ -319,7 +324,7 @@ QRect MacroSegmentList::GetContentItemRectWithPadding(int idx) return rect; } -int MacroSegmentList::GetWidgetIdx(const QPoint &pos) +int MacroSegmentList::GetSegmentIndexFromPos(const QPoint &pos) { int idx = -1; for (int i = 0; i < _contentLayout->count(); ++i) { @@ -359,7 +364,7 @@ void MacroSegmentList::CheckScroll() void MacroSegmentList::CheckDropLine(const QPoint &pos) { - int idx = GetWidgetIdx(pos); + int idx = GetSegmentIndexFromPos(pos); if (idx == _dragPosition) { return; } @@ -410,7 +415,7 @@ bool MacroSegmentList::IsInListArea(const QPoint &pos) int MacroSegmentList::GetDropIndex(const QPoint &pos) { - int idx = GetWidgetIdx(pos); + int idx = GetSegmentIndexFromPos(pos); if (idx == _dragPosition) { return -1; } diff --git a/lib/macro/macro-segment-list.hpp b/lib/macro/macro-segment-list.hpp index e2bbaa5e..9512a153 100644 --- a/lib/macro/macro-segment-list.hpp +++ b/lib/macro/macro-segment-list.hpp @@ -18,6 +18,7 @@ public: void SetHelpMsg(const QString &msg); void SetHelpMsgVisible(bool visible); MacroSegmentEdit *WidgetAt(int idx); + MacroSegmentEdit *WidgetAt(const QPoint &); void Insert(int idx, MacroSegmentEdit *widget); void Add(QWidget *widget); void Remove(int idx); @@ -44,7 +45,7 @@ protected: private: int GetDragIndex(const QPoint &); int GetDropIndex(const QPoint &); - int GetWidgetIdx(const QPoint &); + int GetSegmentIndexFromPos(const QPoint &); void CheckScroll(); void CheckDropLine(const QPoint &); bool IsInListArea(const QPoint &); diff --git a/lib/macro/macro-segment.cpp b/lib/macro/macro-segment.cpp index 5510c1de..551314d7 100644 --- a/lib/macro/macro-segment.cpp +++ b/lib/macro/macro-segment.cpp @@ -20,13 +20,17 @@ MacroSegment::MacroSegment(Macro *m, bool supportsVariableValue) bool MacroSegment::Save(obs_data_t *obj) const { - obs_data_set_bool(obj, "collapsed", static_cast(_collapsed)); + obs_data_set_bool(obj, "collapsed", _collapsed); + obs_data_set_bool(obj, "useCustomLabel", _useCustomLabel); + obs_data_set_string(obj, "customLabel", _customLabel.c_str()); return true; } bool MacroSegment::Load(obs_data_t *obj) { _collapsed = obs_data_get_bool(obj, "collapsed"); + _useCustomLabel = obs_data_get_bool(obj, "useCustomLabel"); + _customLabel = obs_data_get_string(obj, "customLabel"); ClearAvailableTempvars(); return true; } @@ -296,6 +300,12 @@ bool MacroSegmentEdit::eventFilter(QObject *obj, QEvent *ev) void MacroSegmentEdit::HeaderInfoChanged(const QString &text) { + if (Data() && Data()->GetUseCustomLabel()) { + _headerInfo->show(); + _headerInfo->setText( + QString::fromStdString(Data()->GetCustomLabel())); + return; + } _headerInfo->setVisible(!text.isEmpty()); _headerInfo->setText(text); } diff --git a/lib/macro/macro-segment.hpp b/lib/macro/macro-segment.hpp index d54a877f..c16e7133 100644 --- a/lib/macro/macro-segment.hpp +++ b/lib/macro/macro-segment.hpp @@ -28,6 +28,10 @@ public: int GetIndex() const { return _idx; } void SetCollapsed(bool collapsed) { _collapsed = collapsed; } bool GetCollapsed() const { return _collapsed; } + void SetUseCustomLabel(bool enable) { _useCustomLabel = enable; } + bool GetUseCustomLabel() const { return _useCustomLabel; } + void SetCustomLabel(const std::string &label) { _customLabel = label; } + std::string GetCustomLabel() const { return _customLabel; } virtual bool Save(obs_data_t *obj) const = 0; virtual bool Load(obs_data_t *obj) = 0; virtual bool PostLoad(); @@ -63,6 +67,11 @@ private: bool _highlight = false; bool _collapsed = false; + // Custom header labels + bool _useCustomLabel = false; + std::string _customLabel = obs_module_text( + "AdvSceneSwitcher.macroTab.segment.defaultCustomLabel"); + // Variable helpers const bool _supportsVariableValue = false; int _variableRefs = 0; @@ -86,8 +95,10 @@ public: void SetSelected(bool); virtual std::shared_ptr Data() const = 0; -protected slots: +public slots: void HeaderInfoChanged(const QString &); + +protected slots: void Collapsed(bool); void Highlight(); void EnableHighlight(bool); diff --git a/lib/macro/macro-tab.cpp b/lib/macro/macro-tab.cpp index a3b50fee..5e193987 100644 --- a/lib/macro/macro-tab.cpp +++ b/lib/macro/macro-tab.cpp @@ -943,11 +943,39 @@ void AdvSceneSwitcher::ShowMacroContextMenu(const QPoint &pos) menu.exec(globalPos); } +static void handleCustomLabelChange(MacroSegmentEdit *segmentEdit, + QAction *contextMenuOption) +{ + bool enable = contextMenuOption->isChecked(); + auto segment = segmentEdit->Data(); + segment->SetUseCustomLabel(enable); + if (!enable) { + segmentEdit->HeaderInfoChanged( + QString::fromStdString(segment->GetShortDesc())); + return; + } + + std::string label; + bool accepted = AdvSSNameDialog::AskForName( + GetSettingsWindow(), + obs_module_text( + "AdvSceneSwitcher.macroTab.segment.setCustomLabel"), + "", label, QString::fromStdString(segment->GetCustomLabel())); + if (!accepted) { + segment->SetUseCustomLabel(false); + return; + } + + segment->SetCustomLabel(label); + segmentEdit->HeaderInfoChanged(""); +} + static void setupConextMenu(AdvSceneSwitcher *ss, const QPoint &pos, std::function expand, std::function collapse, std::function maximize, - std::function minimize) + std::function minimize, + MacroSegmentList *list) { QMenu menu; menu.addAction(obs_module_text("AdvSceneSwitcher.macroTab.expandAll"), @@ -958,34 +986,46 @@ static void setupConextMenu(AdvSceneSwitcher *ss, const QPoint &pos, ss, [ss, maximize]() { maximize(ss); }); menu.addAction(obs_module_text("AdvSceneSwitcher.macroTab.minimize"), ss, [ss, minimize]() { minimize(ss); }); - menu.exec(pos); + + auto segmentEdit = list->WidgetAt(pos); + if (segmentEdit) { + auto customLabel = menu.addAction(obs_module_text( + "AdvSceneSwitcher.macroTab.segment.useCustomLabel")); + customLabel->setCheckable(true); + auto segment = segmentEdit ? segmentEdit->Data() : nullptr; + customLabel->setChecked(segment && + segment->GetUseCustomLabel()); + QWidget::connect(customLabel, &QAction::triggered, + std::bind(handleCustomLabelChange, segmentEdit, + customLabel)); + } + menu.exec(list->mapToGlobal(pos)); } void AdvSceneSwitcher::ShowMacroActionsContextMenu(const QPoint &pos) { - setupConextMenu(this, ui->actionsList->mapToGlobal(pos), - &AdvSceneSwitcher::ExpandAllActions, + setupConextMenu(this, pos, &AdvSceneSwitcher::ExpandAllActions, &AdvSceneSwitcher::CollapseAllActions, &AdvSceneSwitcher::MaximizeActions, - &AdvSceneSwitcher::MinimizeActions); + &AdvSceneSwitcher::MinimizeActions, ui->actionsList); } void AdvSceneSwitcher::ShowMacroElseActionsContextMenu(const QPoint &pos) { - setupConextMenu(this, ui->elseActionsList->mapToGlobal(pos), - &AdvSceneSwitcher::ExpandAllElseActions, + setupConextMenu(this, pos, &AdvSceneSwitcher::ExpandAllElseActions, &AdvSceneSwitcher::CollapseAllElseActions, &AdvSceneSwitcher::MaximizeElseActions, - &AdvSceneSwitcher::MinimizeElseActions); + &AdvSceneSwitcher::MinimizeElseActions, + ui->elseActionsList); } void AdvSceneSwitcher::ShowMacroConditionsContextMenu(const QPoint &pos) { - setupConextMenu(this, ui->conditionsList->mapToGlobal(pos), - &AdvSceneSwitcher::ExpandAllConditions, + setupConextMenu(this, pos, &AdvSceneSwitcher::ExpandAllConditions, &AdvSceneSwitcher::CollapseAllConditions, &AdvSceneSwitcher::MaximizeConditions, - &AdvSceneSwitcher::MinimizeConditions); + &AdvSceneSwitcher::MinimizeConditions, + ui->conditionsList); } void AdvSceneSwitcher::CopyMacro()