Krita Source Code Documentation
Loading...
Searching...
No Matches
tasksetdocker_dock.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2011 Sven Langkamp <sven.langkamp@gmail.com>
3 *
4 * SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6
8
9#include <QGridLayout>
10#include <QHeaderView>
11#include <QStyledItemDelegate>
12#include <QPainter>
13#include <QInputDialog>
14#include <QAction>
15#include <QMessageBox>
16
17#include <klocalizedstring.h>
18#include <kactioncollection.h>
19
20#include <kis_icon.h>
21
22#include <KoCanvasBase.h>
24#include <KisResourceLoader.h>
27#include <KisViewManager.h>
28#include <kis_canvas2.h>
29#include <KisMainWindow.h>
31
32#include "tasksetmodel.h"
33
34
35class KisTasksetDelegate : public QStyledItemDelegate
36{
37public:
38 KisTasksetDelegate(QObject * parent = 0) : QStyledItemDelegate(parent) {}
39 ~KisTasksetDelegate() override {}
41 QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const override {
42 return QSize(QStyledItemDelegate::sizeHint(option, index).width(),
43 qMin(QStyledItemDelegate::sizeHint(option, index).width(), 25));
44 }
45};
46
47class KisTasksetResourceDelegate : public QStyledItemDelegate
48{
49public:
50 KisTasksetResourceDelegate(QObject * parent = 0) : QStyledItemDelegate(parent) {}
53 void paint(QPainter *, const QStyleOptionViewItem &, const QModelIndex &) const override;
54};
55
56void KisTasksetResourceDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
57{
58 if (! index.isValid())
59 return;
60
61 QString name = index.data(Qt::UserRole + KisAbstractResourceModel::Name).toString();
62
63 if (option.state & QStyle::State_Selected) {
64 painter->setPen(QPen(option.palette.highlight(), 2.0));
65 painter->fillRect(option.rect, option.palette.highlight());
66 painter->setPen(option.palette.highlightedText().color());
67 }
68 else {
69 painter->setPen(option.palette.text().color());
70 }
71 int margin = option.rect.height() - painter->fontMetrics().height();
72 margin = floor(margin/2);
73 painter->drawText(option.rect.x() + 5, option.rect.y() + painter->fontMetrics().ascent() + margin, name);
74}
75
77 : QDockWidget(i18n("Task Sets"))
78 , m_canvas(0)
79 , m_blocked(false)
80{
81 QWidget* widget = new QWidget(this);
82 setupUi(widget);
83 m_model = new TasksetModel(this);
84 tasksetView->setModel(m_model);
85 tasksetView->setItemDelegate(new KisTasksetDelegate(this));
86 recordButton->setIcon(KisIconUtils::loadIcon("media-record"));
87 recordButton->setCheckable(true);
88
89 clearButton->setIcon(KisIconUtils::loadIcon("edit-delete"));
90
91 saveButton->setIcon(KisIconUtils::loadIcon("document-save-16"));
92 saveButton->setEnabled(false);
93
94 chooserButton->setIcon(KisIconUtils::loadIcon("folder"));
95 chooserButton->setAutoRaise(true);
96
99 itemChooser->setItemDelegate(new KisTasksetResourceDelegate(this));
100 itemChooser->setFixedSize(500, 250);
101 itemChooser->setRowHeight(30);
103 itemChooser->showTaggingBar(true);
104 chooserButton->setPopupWidget(itemChooser);
105
106 connect(itemChooser, SIGNAL(resourceSelected(KoResourceSP )), this, SLOT(resourceSelected(KoResourceSP )));
107
108 setWidget(widget);
109 setEnabled(false);
110
111 connect( tasksetView, SIGNAL(clicked(QModelIndex)),
112 this, SLOT(activated(QModelIndex)) );
113
114 connect( recordButton, SIGNAL(toggled(bool)), this, SLOT(recordClicked()));
115 connect( clearButton, SIGNAL(clicked(bool)), this, SLOT(clearClicked()));
116 connect( saveButton, SIGNAL(clicked(bool)), this, SLOT(saveClicked()));
117}
118
123
125{
126 if (m_canvas && m_canvas->viewManager()) {
127 m_canvas->viewManager()->actionCollection()->disconnect(this);
128 Q_FOREACH (KisKXMLGUIClient* client, m_canvas->viewManager()->mainWindow()->childClients()) {
129 client->actionCollection()->disconnect(this);
130 }
131 }
132 m_canvas = dynamic_cast<KisCanvas2*>(canvas);
133 setEnabled(canvas != 0);
134}
135
137{
138 m_canvas = 0;
139 m_model->clear();
140 setCanvas(0);
141}
142
144{
145 if(action && !action->objectName().isEmpty() &&
146 !m_blocked && recordButton->isChecked()) {
147 m_model->addAction(action);
148 saveButton->setEnabled(true);
149 }
150}
151
152void TasksetDockerDock::activated(const QModelIndex& index)
153{
154 QAction* action = m_model->actionFromIndex(index);
155 m_blocked = true;
156 if (action && action->isEnabled()) {
157 action->trigger();
158 }
159 m_blocked = false;
160}
161
163{
164 if(m_canvas) {
165 KisViewManager* view = m_canvas->viewManager();
166 connect(view->actionCollection(), SIGNAL(actionTriggered(QAction*)),
167 this, SLOT(actionTriggered(QAction*)), Qt::UniqueConnection);
168 Q_FOREACH (KisKXMLGUIClient* client, view->mainWindow()->childClients()) {
169 connect(client->actionCollection(), SIGNAL(actionTriggered(QAction*)),
170 this, SLOT(actionTriggered(QAction*)), Qt::UniqueConnection);
171 }
172 }
173}
174
176{
177 QString name;
178
179 TasksetResourceSP taskset(new TasksetResource(QString()));
180
181 QStringList actionNames;
182 Q_FOREACH (QAction* action, m_model->actions()) {
183 actionNames.append(action->objectName());
184 }
185 taskset->setActionList(actionNames);
186 taskset->setValid(true);
187 QString saveLocation = m_rserver->saveLocation();
188
189 if (name.isEmpty()) {
190 name = i18n("Taskset");
191 }
192 QFileInfo fileInfo(saveLocation + name + taskset->defaultFileExtension());
193
194 bool fileOverwriteAccepted = false;
195 bool ok = false;
196
197 while(!fileOverwriteAccepted) {
198 name = QInputDialog::getText(this, i18n("Taskset Name"),
199 i18n("Name:"), QLineEdit::Normal,
200 QString(), &ok);
201 if (name.isNull() || name.isEmpty()) {
202 return;
203 } else {
204 fileInfo = QFileInfo(saveLocation + name.split(" ").join("_") + taskset->defaultFileExtension());
205 if (fileInfo.exists()) {
206 int res = QMessageBox::warning(this, i18nc("@title:window", "Name Already Exists")
207 , i18n("The name '%1' already exists, do you wish to overwrite it?", name)
208 , QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
209 if (res == QMessageBox::Yes) fileOverwriteAccepted = true;
210 } else {
211 fileOverwriteAccepted = true;
212 }
213 }
214 }
215
216 taskset->setName(name);
217 taskset->setFilename(fileInfo.fileName());
219}
220
222{
223 saveButton->setEnabled(false);
224 m_model->clear();
225}
226
228{
229 if(!m_canvas) {
230 return;
231 }
232 m_model->clear();
233 saveButton->setEnabled(true);
234 Q_FOREACH (const QString& actionName, resource.staticCast<TasksetResource>()->actionList()) {
235 QAction* action = m_canvas->viewManager()->actionCollection()->action(actionName);
236 if(action) {
237 m_model->addAction(action);
238 }
239 }
240}
241
246
247Q_COREAPP_STARTUP_FUNCTION(addResourceLoader)
QList< QString > QStringList
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
QList< KisKXMLGUIClient * > childClients()
virtual KisKActionCollection * actionCollection() const
void setListViewMode(ListViewMode viewMode)
void setRowHeight(int rowHeight)
Sets the height of the view rows.
void setItemDelegate(QAbstractItemDelegate *delegate)
Sets a custom delegate for the view.
static KisResourceLoaderRegistry * instance()
void registerLoader(KisResourceLoaderBase *loader)
static bool addResourceWithUserInput(QWidget *widgetParent, KoResourceSP resource, QString storageLocation="")
KisTasksetDelegate(QObject *parent=0)
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
reimplemented
KisTasksetResourceDelegate(QObject *parent=0)
void paint(QPainter *, const QStyleOptionViewItem &, const QModelIndex &) const override
reimplemented
KisMainWindow * mainWindow() const
virtual KisKActionCollection * actionCollection() const
QString saveLocation()
Returns path where to save user defined and imported resources to.
void actionTriggered(QAction *action)
KoResourceServer< TasksetResource > * m_rserver
TasksetModel * m_model
void resourceSelected(KoResourceSP resource)
QPointer< KisCanvas2 > m_canvas
void setCanvas(KoCanvasBase *canvas) override
void activated(const QModelIndex &index)
void unsetCanvas() override
void addAction(QAction *action)
QAction * actionFromIndex(const QModelIndex &index)
QVector< QAction * > actions()
QStringList actionList()
QIcon loadIcon(const QString &name)
const QString TaskSets
static void addResourceLoader()