Add option to set custom labels on macro segments

This commit is contained in:
WarmUpTill 2024-04-19 23:44:37 +02:00 committed by WarmUpTill
parent ca1262aeb7
commit e080d2de9b
6 changed files with 87 additions and 17 deletions

View File

@ -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"

View File

@ -246,6 +246,11 @@ MacroSegmentEdit *MacroSegmentList::WidgetAt(int idx)
return static_cast<MacroSegmentEdit *>(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;
}

View File

@ -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 &);

View File

@ -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<int>(_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);
}

View File

@ -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<MacroSegment> Data() const = 0;
protected slots:
public slots:
void HeaderInfoChanged(const QString &);
protected slots:
void Collapsed(bool);
void Highlight();
void EnableHighlight(bool);

View File

@ -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<void(AdvSceneSwitcher *)> expand,
std::function<void(AdvSceneSwitcher *)> collapse,
std::function<void(AdvSceneSwitcher *)> maximize,
std::function<void(AdvSceneSwitcher *)> minimize)
std::function<void(AdvSceneSwitcher *)> 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()