From 0a17a67ce0df20b53fdb7aeb13010b020e6e67c0 Mon Sep 17 00:00:00 2001 From: WarmUpTill <19472752+WarmUpTill@users.noreply.github.com> Date: Tue, 20 Oct 2026 19:04:00 +0200 Subject: [PATCH] Sync main checkbox in export dialog when subitem selection changes --- lib/macro/macro-export-import-dialog.cpp | 44 ++++++++++++++++-------- lib/macro/macro-export-import-dialog.hpp | 1 + 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/lib/macro/macro-export-import-dialog.cpp b/lib/macro/macro-export-import-dialog.cpp index 2aa60158..a4faa945 100644 --- a/lib/macro/macro-export-import-dialog.cpp +++ b/lib/macro/macro-export-import-dialog.cpp @@ -123,19 +123,24 @@ static QString getItemLabel(const QString &displayName, bool isDefault) obs_module_text("AdvSceneSwitcher.macroTab.export.used"); } -static void setInitialMainCheckState(QCheckBox *mainCheck, int checkedCount, - int itemCount) +static void +syncMainCheckState(QCheckBox *mainCheck, + const QList> &itemChecks) { + const auto checkedCount = + std::count_if(itemChecks.begin(), itemChecks.end(), + [](const QPair &item) { + return item.second->isChecked(); + }); + + const QSignalBlocker blocker(mainCheck); if (checkedCount == 0) { - return; + mainCheck->setCheckState(Qt::Unchecked); + } else if (checkedCount == itemChecks.size()) { + mainCheck->setCheckState(Qt::Checked); + } else { + mainCheck->setCheckState(Qt::PartiallyChecked); } - - if (checkedCount == itemCount) { - mainCheck->setChecked(true); - return; - } - - mainCheck->setCheckState(Qt::PartiallyChecked); mainCheck->setTristate(false); } @@ -171,24 +176,22 @@ void MacroExportImportDialog::AddExtensionSection( itemsLayout->setContentsMargins(4, 2, 4, 2); itemsLayout->setSpacing(2); + const int uiIdx = _extensionUIs.size(); const auto defaultIds = ext.getDefaultSelectedIds ? ext.getDefaultSelectedIds(_macros) : QStringList(); - int checkedCount = 0; for (const auto &[id, displayName] : items) { const bool isDefault = defaultIds.contains(id); auto checkBox = new QCheckBox( getItemLabel(displayName, isDefault), itemsWidget); checkBox->setChecked(isDefault); - checkedCount += isDefault ? 1 : 0; connect(checkBox, &QCheckBox::stateChanged, this, - &MacroExportImportDialog::UpdateExportString); + [this, uiIdx]() { ExtensionItemChanged(uiIdx); }); itemsLayout->addWidget(checkBox); ui.itemChecks.append({id, checkBox}); } - setInitialMainCheckState(ui.mainCheck, checkedCount, items.size()); + syncMainCheckState(ui.mainCheck, ui.itemChecks); - const int uiIdx = _extensionUIs.size(); connect(ui.mainCheck, &QCheckBox::stateChanged, this, [this, uiIdx](int state) { SetExtensionItemsChecked(uiIdx, state); @@ -219,6 +222,17 @@ void MacroExportImportDialog::SetExtensionItemsChecked(int uiIdx, int state) UpdateExportString(); } +void MacroExportImportDialog::ExtensionItemChanged(int uiIdx) +{ + if (uiIdx >= _extensionUIs.size()) { + return; + } + + const auto &ui = _extensionUIs[uiIdx]; + syncMainCheckState(ui.mainCheck, ui.itemChecks); + UpdateExportString(); +} + QWidget *MacroExportImportDialog::BuildExtensionWidget() { auto wrapper = new QWidget(this); diff --git a/lib/macro/macro-export-import-dialog.hpp b/lib/macro/macro-export-import-dialog.hpp index bc71152e..29055f99 100644 --- a/lib/macro/macro-export-import-dialog.hpp +++ b/lib/macro/macro-export-import-dialog.hpp @@ -54,6 +54,7 @@ private: void AddExtensionSection(const MacroExportExtension &ext, int extIdx, QWidget *parent, QLayout *layout); void SetExtensionItemsChecked(int uiIdx, int state); + void ExtensionItemChanged(int uiIdx); QWidget *BuildExtensionWidget(); QString BuildExportJson() const; void RefreshExportText();