| 1 | /* |
| 2 | SPDX-FileCopyrightText: 2013 Martin Gräßlin <mgraesslin@kde.org> |
| 3 | SPDX-FileCopyrightText: 2023 David Redondo <kde@david-redondo.de> |
| 4 | |
| 5 | SPDX-License-Identifier: LGPL-2.0-or-later |
| 6 | */ |
| 7 | |
| 8 | #include "kcolorschememenu.h" |
| 9 | |
| 10 | #include <KActionMenu> |
| 11 | #include <KColorSchemeManager> |
| 12 | #include <KColorSchemeModel> |
| 13 | #include <KLocalizedString> |
| 14 | |
| 15 | #include <QActionGroup> |
| 16 | #include <QIcon> |
| 17 | #include <QMenu> |
| 18 | |
| 19 | constexpr int defaultSchemeRow = 0; |
| 20 | |
| 21 | KActionMenu *KColorSchemeMenu::(KColorSchemeManager *manager, QObject *parent) |
| 22 | { |
| 23 | // Be careful here when connecting to signals. The menu can outlive the manager |
| 24 | KActionMenu * = new KActionMenu(QIcon::fromTheme(QStringLiteral("preferences-desktop-color" )), i18n("Color Scheme" ), parent); |
| 25 | QActionGroup *group = new QActionGroup(menu); |
| 26 | QObject::connect(sender: group, signal: &QActionGroup::triggered, context: manager, slot: [manager](QAction *action) { |
| 27 | const QString schemePath = action->data().toString(); |
| 28 | if (schemePath.isEmpty()) { |
| 29 | // Reset to default |
| 30 | manager->activateScheme(index: QModelIndex()); |
| 31 | } else { |
| 32 | // Software linking KXmlGui gets its static KCheckAccelerators object deploy |
| 33 | // KAcceleratorManager on the whole UI automatically, which adds accelerators |
| 34 | // also to the texts of this menu's actions. |
| 35 | // So they have to be remove here in case |
| 36 | // (hoping that no original names have them also in case no accelerators were added) |
| 37 | // See also KColorSchemeManager::saveSchemeToConfigFile(const QString &schemeName) const. |
| 38 | const QString schemeName = KLocalizedString::removeAcceleratorMarker(label: action->text()); |
| 39 | manager->activateScheme(index: manager->indexForScheme(name: schemeName)); |
| 40 | } |
| 41 | }); |
| 42 | const auto model = manager->model(); |
| 43 | for (int i = 0; i < model->rowCount(); ++i) { |
| 44 | QModelIndex index = model->index(row: i, column: 0); |
| 45 | QAction *action = new QAction(index.data(arole: KColorSchemeModel::NameRole).toString(), menu); |
| 46 | action->setData(index.data(arole: KColorSchemeModel::PathRole)); |
| 47 | action->setActionGroup(group); |
| 48 | action->setCheckable(true); |
| 49 | if (index.data(arole: KColorSchemeModel::IdRole).toString() == manager->activeSchemeId()) { |
| 50 | action->setChecked(true); |
| 51 | } |
| 52 | menu->addAction(action); |
| 53 | QObject::connect(sender: menu->menu(), signal: &QMenu::aboutToShow, context: model, slot: [action, index] { |
| 54 | if (action->icon().isNull()) { |
| 55 | action->setIcon(index.data(arole: KColorSchemeModel::IconRole).value<QIcon>()); |
| 56 | } |
| 57 | }); |
| 58 | } |
| 59 | const auto groupActions = group->actions(); |
| 60 | if (!group->checkedAction()) { |
| 61 | // If no (valid) color scheme has been selected we select the default one |
| 62 | groupActions[defaultSchemeRow]->setChecked(true); |
| 63 | } |
| 64 | |
| 65 | return menu; |
| 66 | } |
| 67 | |