Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_input_configuration_page.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the KDE project
3 * SPDX-FileCopyrightText: 2013 Arjen Hiemstra <ahiemstra@heimr.nl>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
9#include "ui_kis_input_configuration_page.h"
10
11#include <QDebug>
12#include <QDir>
13#include <QMap>
14
22#include <KoResourcePaths.h>
23#include <kis_config.h>
24#include <kis_signals_blocker.h>
25
26
27#include "kis_icon_utils.h"
28
30 QMap<KisAbstractInputAction *, KisInputConfigurationPageItem*> actionInputConfigurationMap;
31};
32
34 : QWidget(parent, f)
35 , m_d(new Private)
36{
37 ui = new Ui::KisInputConfigurationPage;
38 ui->setupUi(this);
39
40 ui->profileComboBox->setModel(new KisInputProfileModel(ui->profileComboBox));
42 connect(ui->profileComboBox, SIGNAL(currentTextChanged(QString)), SLOT(changeCurrentProfile(QString)));
43
44 ui->editProfilesButton->setIcon(KisIconUtils::loadIcon("document-edit"));
45
46 connect(ui->editProfilesButton, SIGNAL(clicked(bool)), SLOT(editProfilesButtonClicked()));
47 connect(KisInputProfileManager::instance(), SIGNAL(profilesChanged()), SLOT(updateSelectedProfile()));
50 this,
52
54 Q_FOREACH(KisAbstractInputAction * action, actions) {
56 item->setAction(action);
57 ui->configurationItemsArea->addWidget(item);
58 m_d->actionInputConfigurationMap.insert(action, item);
59 connect(item,
61 this,
63 Qt::UniqueConnection);
64 }
66 ui->configurationItemsArea->addStretch(20); // ensures listed input are on top
67
68 QScroller *scroller = KisKineticScroller::createPreconfiguredScroller(ui->scrollArea);
69 if (scroller) {
70 connect(scroller, SIGNAL(stateChanged(QScroller::State)),
71 this, SLOT(slotScrollerStateChanged(QScroller::State)));
72 }
73}
74
76
81
86
88{
89 // reset all of them first.
90 Q_FOREACH (KisInputConfigurationPageItem *pageItem, m_d->actionInputConfigurationMap.values()) {
91 pageItem->setWarningEnabled(false);
92 }
93 const QList<KisShortcutConfiguration *> conflictingShortcuts =
95 KisInputProfileManager::instance()->currentProfile());
96
97 if (conflictingShortcuts.isEmpty()) {
98 return;
99 }
100
101 struct ShortcutInfo {
103 QStringList actionTexts;
104 };
105 QMap<QString, ShortcutInfo> conflictingShortcutsMap;
106
107 Q_FOREACH (KisShortcutConfiguration *shortcut, conflictingShortcuts) {
108 if (shortcut->action()) {
109 if (m_d->actionInputConfigurationMap.contains(shortcut->action())) {
110 ShortcutInfo &shortcutInfo = conflictingShortcutsMap[shortcut->getInputText()];
111 shortcutInfo.shortcutObjects.append(shortcut);
112 const QString subActionName = shortcut->action()->shortcutIndexes().key(shortcut->mode());
113 shortcutInfo.actionTexts.append(shortcut->action()->name() + " → " + subActionName);
114 } else {
115 qWarning() << "KisInputConfigurationPageItem does not exist for the specified action:"
116 << shortcut->action()->name();
117 }
118 } else {
119 qWarning() << "Action not set for the given shortcut.";
120 }
121 }
122
123 QMap<KisAbstractInputAction *, QSet<QString>> infoTexts;
124 Q_FOREACH (const ShortcutInfo &shortcutInfo, conflictingShortcutsMap) {
125 const QString text = "<b>" + shortcutInfo.shortcutObjects.first()->getInputText() + "</b>" + "<br>&nbsp;&nbsp;"
126 + shortcutInfo.actionTexts.join("<br>&nbsp;&nbsp;");
127 Q_FOREACH (KisShortcutConfiguration *shortcut, shortcutInfo.shortcutObjects) {
128 infoTexts[shortcut->action()] << text;
129 }
130 }
131
132 QMapIterator<KisAbstractInputAction *, QSet<QString>> it(infoTexts);
133 while (it.hasNext()) {
134 it.next();
135 QSetIterator<QString> it2(it.value());
136 if (!it2.hasNext()) {
137 continue;
138 }
139 QString text = "<ul> <li>" + it2.next() + "</li>";
140 while (it2.hasNext()) {
141 text += "<li>" + it2.next() + "</li>";
142 }
143 text += "</ul>";
144 m_d->actionInputConfigurationMap[it.key()]->setWarningEnabled(true, text);
145 }
146}
147
149{
151
152 QDir profileDir(KoResourcePaths::saveLocation("data", "input/", false));
153 KisConfig(false).setCurrentInputProfile("Krita Default");
154
155 if (profileDir.exists()) {
156 QStringList entries = profileDir.entryList(QStringList() << "*.profile", QDir::Files | QDir::NoDotAndDotDot);
157 Q_FOREACH(const QString & file, entries) {
158 profileDir.remove(file);
159 }
160
162 changeCurrentProfile("Krita Default");
164 }
165 ui->profileComboBox->setCurrentItem("Krita Default");
166}
167
173
175{
176 if (KisInputProfileManager::instance()->currentProfile()) {
177 ui->profileComboBox->setCurrentItem(KisInputProfileManager::instance()->currentProfile()->name());
178 }
179}
180
QList< QString > QStringList
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
Abstract base class for input actions.
virtual QHash< QString, int > shortcutIndexes() const
void setCurrentInputProfile(const QString &name)
A dialog that provides facilities to edit all the available profiles.
A collapsible widget displaying an action, its description and associated shortcuts.
void setWarningEnabled(bool enabled, QString additionalToolTipText=QString())
void setAction(KisAbstractInputAction *action)
void slotScrollerStateChanged(QScroller::State state)
Ui::KisInputConfigurationPage * ui
KisInputConfigurationPage(QWidget *parent=0, Qt::WindowFlags f=Qt::WindowFlags())
void changeCurrentProfile(const QString &newProfile)
QList< KisAbstractInputAction * > actions
QList< KisShortcutConfiguration * > getConflictingShortcuts(KisInputProfile *profile)
static KisInputProfileManager * instance()
void setCurrentProfile(KisInputProfile *profile)
A model providing a list of profiles available.
A class encapsulating all settings for a single shortcut.
KisAbstractInputAction * action() const
static QString saveLocation(const QString &type, const QString &suffix=QString(), bool create=true)
QIcon loadIcon(const QString &name)
KRITAWIDGETUTILS_EXPORT QScroller * createPreconfiguredScroller(QAbstractScrollArea *target)
QMap< KisAbstractInputAction *, KisInputConfigurationPageItem * > actionInputConfigurationMap