diff --git a/src/Basecamp/Settings/AppsInspectorView.qml b/src/Basecamp/Settings/AppsInspectorView.qml index a62bee5..1bca615 100644 --- a/src/Basecamp/Settings/AppsInspectorView.qml +++ b/src/Basecamp/Settings/AppsInspectorView.qml @@ -10,7 +10,9 @@ import Basecamp.Backend import Basecamp.Common // Settings → Apps Inspector. Lists the UI plugins discovered in the plugins -// directory with their load state, and load / unload / uninstall actions. +// directory with their load state and a Load/Unload toggle per row. Uninstall +// is deliberately absent — module management lives in the Package Manager; +// this view is read-only apart from the load toggle. // // Formerly the "UI Modules" tab of ModulesView. Split out into its own Settings // section so it stands alongside Module Inspector instead of hiding behind a diff --git a/src/Basecamp/Settings/ModuleInspectorView.qml b/src/Basecamp/Settings/ModuleInspectorView.qml index 0c8a903..8161f2a 100644 --- a/src/Basecamp/Settings/ModuleInspectorView.qml +++ b/src/Basecamp/Settings/ModuleInspectorView.qml @@ -10,8 +10,10 @@ import Basecamp.Backend import Basecamp.Common // Settings → Module Inspector. Lists every core module liblogos knows about -// with its load state and live CPU / memory stats, plus load / unload / -// uninstall actions and the per-module Interface drill-down. +// with its load state and live CPU / memory stats, a Load/Unload toggle per +// row, and the per-module Interface drill-down. Uninstall is deliberately +// absent — module management lives in the Package Manager; this view is +// read-only apart from the load toggle. // // Formerly the "Core Modules" tab of ModulesView. Split out into its own // Settings section alongside Apps Inspector, restyled onto LogosTable + diff --git a/src/Basecamp/Settings/ModuleStatusBadge.qml b/src/Basecamp/Settings/ModuleStatusBadge.qml index 20923a2..d7cece0 100644 --- a/src/Basecamp/Settings/ModuleStatusBadge.qml +++ b/src/Basecamp/Settings/ModuleStatusBadge.qml @@ -3,9 +3,11 @@ import QtQuick import Logos.Controls import Logos.Theme -// Load-state badge for the inspector tables. `row` is a ModuleTableModel row — -// the normalised flags on it (isMainUi / hasMissingDeps / isLoaded) pick the -// colour, `statusText` supplies the label so the wording lives in one place. +// Load-state badge for the inspector tables. `row` is a LogosTable rowItem +// backed by ModuleInstanceModel (via ModulesFilterProxy) — the normalised +// flags on it (isMainUi / hasMissingDeps / isLoaded) pick the colour, and +// the `statusText` role supplies the label so the wording lives in one +// place (see ModuleInstanceModel::Row::statusText()). LogosBadge { id: root diff --git a/src/ShortcutBridge.cpp b/src/ShortcutBridge.cpp index 0895236..e76da26 100644 --- a/src/ShortcutBridge.cpp +++ b/src/ShortcutBridge.cpp @@ -131,8 +131,18 @@ void ShortcutBridge::mirrorOneShortcut(QObject* obj) auto* mirror = new QShortcut(seq, m_host); mirror->setContext(Qt::ApplicationShortcut); mirror->setEnabled(obj->property("enabled").toBool()); + // UniqueConnection makes this loop safe on two axes: + // * a QML Shortcut can declare multiple sequences (each mirrored) + // — the enabledChanged→slot wire should still be one connection + // per QML shortcut, not one per sequence. + // * rebind() clears the C++ mirrors but leaves the QML shortcuts + // alive (they belong to the pane's QML tree). The next scan + // would re-connect the same signal, and without this flag + // onQmlShortcutEnabledChanged() would fire N times per change + // after N pane switches. connect(obj, SIGNAL(enabledChanged()), - this, SLOT(onQmlShortcutEnabledChanged())); + this, SLOT(onQmlShortcutEnabledChanged()), + Qt::UniqueConnection); m_mirrorToQml.insert(mirror, obj); m_qmlToMirrors.insert(obj, QPointer(mirror));