File indexing completed on 2024-06-02 04:32:30

0001 /*
0002  *  SPDX-FileCopyrightText: 2020 Anna Medonosová <anna.medonosova@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "KisSPenSettings.h"
0008 
0009 #include <QAction>
0010 #include <QStandardItem>
0011 #include <QStandardItemModel>
0012 #include <QList>
0013 #include <QMap>
0014 #include <QModelIndex>
0015 
0016 #include <KisMainWindow.h>
0017 #include <kactioncollection.h>
0018 #include <KisPart.h>
0019 #include <kactioncategory.h>
0020 #include <kconfiggroup.h>
0021 #include <ksharedconfig.h>
0022 #include <klocalizedstring.h>
0023 #include <KisActionsSnapshot.h>
0024 #include <kis_icon_utils.h>
0025 
0026 KisSPenSettings::KisSPenSettings(QWidget *parent)
0027     : KisPreferenceSet(parent)
0028     , m_model(new QStandardItemModel())
0029 {
0030     mUi = new WdgSPenSettings(this);
0031 
0032     m_model->setColumnCount(2);
0033 
0034     // TODO - popup palette is different action mechanism, thus is missing in this list; maybe we could create a fake KisAction for it
0035     // Thanks to the KisActionSnapshot, we can list all actions even when no document is open
0036     QScopedPointer<KisActionsSnapshot> actionsSnapshot(new KisActionsSnapshot());
0037 
0038     KisKActionCollection *actionCollection = KisPart::instance()->currentMainwindow()->actionCollection();
0039     for (QAction *action: actionCollection->actions()) {
0040         actionsSnapshot->addAction(action->objectName(), action);
0041     }
0042 
0043     QMap<QString, KisKActionCollection*> sortedCollections = actionsSnapshot->actionCollections();
0044     for (KisKActionCollection* collection: sortedCollections) {
0045         for (QAction* action: collection->actions()) {
0046             QString actionName = KLocalizedString::removeAcceleratorMarker(action->text());
0047             QStandardItem* item = new QStandardItem(action->icon(), actionName);
0048             QStandardItem* actionNameItem = new QStandardItem(action->objectName());
0049             m_model->appendRow(QList<QStandardItem*>() << item << actionNameItem);
0050         }
0051     }
0052 
0053     m_model->sort(m_ACTION_TEXT_COLUMN);
0054     m_model->insertRow(0, new QStandardItem(i18n("Do nothing")));
0055 
0056     mUi->cmbClickAction->setModel(m_model);
0057     mUi->cmbDoubleClickAction->setModel(m_model);
0058     mUi->cmbGestureSwipeUp->setModel(m_model);
0059     mUi->cmbGestureSwipeDown->setModel(m_model);
0060     mUi->cmbGestureSwipeLeft->setModel(m_model);
0061     mUi->cmbGestureSwipeRight->setModel(m_model);
0062     mUi->cmbGestureCircleCW->setModel(m_model);
0063     mUi->cmbGestureCircleCCW->setModel(m_model);
0064 
0065     loadPreferences();
0066 }
0067 
0068 KisSPenSettings::~KisSPenSettings()
0069 {
0070     delete mUi;
0071     delete m_model;
0072 }
0073 
0074 QString KisSPenSettings::id()
0075 {
0076     return QString("SPenSettings");
0077 }
0078 
0079 QString KisSPenSettings::name()
0080 {
0081     return header();
0082 }
0083 
0084 QString KisSPenSettings::header()
0085 {
0086     return QString(i18n("S-Pen Actions"));
0087 }
0088 
0089 QIcon KisSPenSettings::icon()
0090 {
0091     return KisIconUtils::loadIcon("spen-remote");
0092 }
0093 
0094 void KisSPenSettings::savePreferences() const
0095 {
0096     KConfigGroup cfg = KSharedConfig::openConfig()->group("SPenSettings");
0097 
0098     cfg.writeEntry("actionButtonClick", actionNameForIndex(mUi->cmbClickAction->currentIndex()));
0099     cfg.writeEntry("actionButtonDoubleClick", actionNameForIndex(mUi->cmbDoubleClickAction->currentIndex()));
0100     cfg.writeEntry("actionGestureSwipeUp", actionNameForIndex(mUi->cmbGestureSwipeUp->currentIndex()));
0101     cfg.writeEntry("actionGestureSwipeDown", actionNameForIndex(mUi->cmbGestureSwipeDown->currentIndex()));
0102     cfg.writeEntry("actionGestureSwipeLeft", actionNameForIndex(mUi->cmbGestureSwipeLeft->currentIndex()));
0103     cfg.writeEntry("actionGestureSwipeRight", actionNameForIndex(mUi->cmbGestureSwipeRight->currentIndex()));
0104     cfg.writeEntry("actionGestureCircleCW", actionNameForIndex(mUi->cmbGestureCircleCW->currentIndex()));
0105     cfg.writeEntry("actionGestureCircleCCW", actionNameForIndex(mUi->cmbGestureCircleCCW->currentIndex()));
0106 
0107     emit settingsChanged();
0108 }
0109 
0110 void KisSPenSettings::loadPreferences()
0111 {
0112     KConfigGroup cfg = KSharedConfig::openConfig()->group("SPenSettings");
0113 
0114     mUi->cmbClickAction->setCurrentIndex(indexFromActionName(cfg.readEntry("actionButtonClick", QString())));
0115     mUi->cmbDoubleClickAction->setCurrentIndex(indexFromActionName(cfg.readEntry("actionButtonDoubleClick", QString())));
0116     mUi->cmbGestureSwipeUp->setCurrentIndex(indexFromActionName(cfg.readEntry("actionGestureSwipeUp", QString())));
0117     mUi->cmbGestureSwipeDown->setCurrentIndex(indexFromActionName(cfg.readEntry("actionGestureSwipeDown", QString())));
0118     mUi->cmbGestureSwipeLeft->setCurrentIndex(indexFromActionName(cfg.readEntry("actionGestureSwipeLeft", QString())));
0119     mUi->cmbGestureSwipeRight->setCurrentIndex(indexFromActionName(cfg.readEntry("actionGestureSwipeRight", QString())));
0120     mUi->cmbGestureCircleCW->setCurrentIndex(indexFromActionName(cfg.readEntry("actionGestureCircleCW", QString())));
0121     mUi->cmbGestureCircleCCW->setCurrentIndex(indexFromActionName(cfg.readEntry("actionGestureCircleCCW", QString())));
0122 
0123 }
0124 
0125 void KisSPenSettings::loadDefaultPreferences()
0126 {
0127     mUi->cmbClickAction->setCurrentIndex(indexFromActionName(QString("fake_show_popup_palette")));
0128     mUi->cmbDoubleClickAction->setCurrentIndex(indexFromActionName(QString("erase_action")));
0129     mUi->cmbGestureSwipeUp->setCurrentIndex(indexFromActionName(QString("make_brush_color_lighter")));
0130     mUi->cmbGestureSwipeDown->setCurrentIndex(indexFromActionName(QString("make_brush_color_darker")));
0131     mUi->cmbGestureSwipeLeft->setCurrentIndex(indexFromActionName(QString("KritaShape/KisToolBrush")));
0132     mUi->cmbGestureSwipeRight->setCurrentIndex(indexFromActionName(QString("KritaSelected/KisToolColorSampler")));
0133     mUi->cmbGestureCircleCW->setCurrentIndex(indexFromActionName(QString("shift_brush_color_clockwise")));
0134     mUi->cmbGestureCircleCCW->setCurrentIndex(indexFromActionName(QString("shift_brush_color_counter_clockwise")));
0135 }
0136 
0137 QString KisSPenSettings::actionNameForIndex(int index) const
0138 {
0139     QModelIndex modelIndex = m_model->index(index, m_ACTION_NAME_COLUMN);
0140     QString actionName = m_model->itemFromIndex(modelIndex)->data(Qt::DisplayRole).toString();
0141     return actionName;
0142 }
0143 
0144 int KisSPenSettings::indexFromActionName(QString actionName) const
0145 {
0146     if (actionName.isEmpty()) {
0147         return 0;
0148     } else {
0149         QList<QStandardItem*> itemsFound = m_model->findItems(actionName, Qt::MatchExactly, m_ACTION_NAME_COLUMN);
0150         if (itemsFound.size() == 0) {
0151             return 1;
0152         } else {
0153             return itemsFound[0]->index().row();
0154         }
0155     }
0156 }