Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_control_frame.cpp
Go to the documentation of this file.
1/*
2 * kis_control_frame.cc - part of Krita
3 *
4 * SPDX-FileCopyrightText: 1999 Matthias Elter <elter@kde.org>
5 * SPDX-FileCopyrightText: 2003 Patrick Julien <freak@codepimps.org>
6 * SPDX-FileCopyrightText: 2004 Sven Langkamp <sven.langkamp@gmail.com>
7 * SPDX-FileCopyrightText: 2006 Boudewijn Rempt <boud@valdyas.org>
8 *
9 * SPDX-License-Identifier: GPL-2.0-or-later
10 */
11
12#include "kis_control_frame.h"
13
14#include <stdlib.h>
15
16#include <QApplication>
17#include <QLayout>
18#include <QTabWidget>
19#include <QWidget>
20#include <QEvent>
21#include <QHBoxLayout>
22#include <QWidgetAction>
23
24#include <klocalizedstring.h>
25#include <QAction>
26#include <kactioncollection.h>
27
28#include <KoDualColorButton.h>
29#include <KoForegroundColour.h>
30#include <KoBackgroundColour.h>
31#include <KoSwapBgFgColours.h>
32#include <KoResetBgFgColours.h>
33
35#include <KoResourceServer.h>
38#include <kis_image.h>
39
40#include <resources/KoPattern.h>
43
45
47#include "KisViewManager.h"
48#include "kis_config.h"
49#include "kis_paintop_box.h"
50#include "KisDockerHud.h"
51#include "kis_custom_pattern.h"
55#include <kis_canvas2.h>
56#include "kis_action_registry.h"
57
58
59KisControlFrame::KisControlFrame(KisViewManager *view, QWidget *parent, const char* name)
60 : QObject(view)
61 , m_viewManager(view)
62 , m_checkersPainter(4)
63{
64 setObjectName(name);
65
67 m_patternWidget->setToolTip(i18n("Fill Patterns"));
68 m_patternWidget->setFixedSize(32, 32);
69
71 m_gradientWidget->setToolTip(i18n("Fill Gradients"));
72 m_gradientWidget->setFixedSize(32, 32);
73}
74
75void KisControlFrame::setup(QWidget *parent)
76{
79
80 QWidgetAction *action = new QWidgetAction(this);
81 action->setText(i18n("&Patterns"));
83 action->setDefaultWidget(m_patternWidget);
84 connect(action, SIGNAL(triggered()), m_patternWidget, SLOT(showPopupWidget()));
85 m_patternChooserPopup->addAction(action);
86
87 action = new QWidgetAction(this);
88 action->setText(i18n("&Gradients"));
90 action->setDefaultWidget(m_gradientWidget);
91 connect(action, SIGNAL(triggered()), m_gradientWidget, SLOT(showPopupWidget()));
92 connect(m_viewManager->canvasResourceProvider(), SIGNAL(sigFGColorChanged(KoColor)), m_gradientWidget, SLOT(update()));
93 connect(m_viewManager->canvasResourceProvider(), SIGNAL(sigBGColorChanged(KoColor)), m_gradientWidget, SLOT(update()));
94 m_gradientChooserPopup->addAction(action);
95
96
97 // XXX: KOMVC we don't have a canvas here yet, needs a setImageView
98 const KoColorDisplayRendererInterface *displayRenderer = \
99 KisDisplayColorConverter::dumbConverterInstance()->displayRendererInterface();
102 m_dual->setPopDialog(true);
103 action = new QWidgetAction(this);
104 action->setText(i18n("&Choose foreground and background colors"));
105 action->setIcon(KisIconUtils::loadIcon("dual_colour"));
106 m_viewManager->actionCollection()->addAction("dual", action);
107 action->setDefaultWidget(m_dual);
108 connect(m_dual, SIGNAL(foregroundColorChanged(KoColor)), m_viewManager->canvasResourceProvider(), SLOT(slotSetFGColor(KoColor)));
109 connect(m_dual, SIGNAL(backgroundColorChanged(KoColor)), m_viewManager->canvasResourceProvider(), SLOT(slotSetBGColor(KoColor)));
110 connect(m_viewManager->canvasResourceProvider(), SIGNAL(sigBGColorChanged(KoColor)), m_dual, SLOT(setBackgroundColor(KoColor)));
111 connect(m_viewManager->canvasResourceProvider(), SIGNAL(sigFGColorChanged(KoColor)), m_dual, SLOT(setForegroundColor(KoColor)));
112 m_dual->setFixedSize(28, 28);
113 connect(m_viewManager, &KisViewManager::viewChanged, [this]() {
115 });
116
117
121 action = new QWidgetAction(this);
122 action->setText(i18n("&Choose foreground colour"));
123 action->setIcon(KisIconUtils::loadIcon("forgound_colour"));
124 m_viewManager->actionCollection()->addAction("chooseForegroundColor", action);
125 action->setDefaultWidget(m_foreground);
126 connect(m_foreground, SIGNAL(foregroundColorChanged(KoColor)), m_viewManager->canvasResourceProvider(), SLOT(slotSetFGColor(KoColor)));
127 connect(m_foreground, SIGNAL(backgroundColorChanged(KoColor)), m_viewManager->canvasResourceProvider(), SLOT(slotSetBGColor(KoColor)));
128 connect(m_viewManager->canvasResourceProvider(), SIGNAL(sigBGColorChanged(KoColor)), m_foreground, SLOT(setBackgroundColor(KoColor)));
129 connect(m_viewManager->canvasResourceProvider(), SIGNAL(sigFGColorChanged(KoColor)), m_foreground, SLOT(setForegroundColor(KoColor)));
130 m_foreground->setFixedSize(28, 28);
131 connect(action, SIGNAL(triggered()), m_foreground, SLOT(openForegroundDialog()));
132 connect(m_viewManager, &KisViewManager::viewChanged, [this](){
134 });
135
136
140 action = new QWidgetAction(this);
141 action->setText(i18n("&Choose background colour"));
142 action->setIcon(KisIconUtils::loadIcon("background_colour"));
143 m_viewManager->actionCollection()->addAction("chooseBackgroundColor", action);
144 action->setDefaultWidget(m_background);
145 connect(m_background, SIGNAL(foregroundColorChanged(KoColor)), m_viewManager->canvasResourceProvider(), SLOT(slotSetFGColor(KoColor)));
146 connect(m_background, SIGNAL(backgroundColorChanged(KoColor)), m_viewManager->canvasResourceProvider(), SLOT(slotSetBGColor(KoColor)));
147 connect(m_viewManager->canvasResourceProvider(), SIGNAL(sigBGColorChanged(KoColor)), m_background, SLOT(setBackgroundColor(KoColor)));
148 connect(m_viewManager->canvasResourceProvider(), SIGNAL(sigFGColorChanged(KoColor)), m_background, SLOT(setForegroundColor(KoColor)));
149 m_background->setFixedSize(28, 28);
150 connect(action, SIGNAL(triggered()), m_background, SLOT(openBackgroundDialog()));
151 connect(m_viewManager, &KisViewManager::viewChanged, [this]() {
153 });
154
155
158 m_swap->setPopDialog(true);
159 action = new QWidgetAction(this);
160 action->setText(i18n("&Swap Foreground and Background Colors"));
161 action->setIcon(KisIconUtils::loadIcon("swap_colour"));
162 m_viewManager->actionCollection()->addAction("toggle_fg_bg", action);
163 action->setDefaultWidget(m_swap);
164 connect(m_swap, SIGNAL(foregroundColorChanged(KoColor)), m_viewManager->canvasResourceProvider(), SLOT(slotSetFGColor(KoColor)));
165 connect(m_swap, SIGNAL(backgroundColorChanged(KoColor)), m_viewManager->canvasResourceProvider(), SLOT(slotSetBGColor(KoColor)));
166 connect(m_viewManager->canvasResourceProvider(), SIGNAL(sigBGColorChanged(KoColor)), m_swap, SLOT(setBackgroundColor(KoColor)));
167 connect(m_viewManager->canvasResourceProvider(), SIGNAL(sigFGColorChanged(KoColor)), m_swap, SLOT(setForegroundColor(KoColor)));
168 m_swap->setFixedSize(28, 28);
169 connect(action, SIGNAL(triggered()), m_swap, SLOT(swapColours()));
170 connect(m_viewManager, &KisViewManager::viewChanged, [this]() {
172 });
173
174
177 m_reset->setPopDialog(true);
178 action = new QWidgetAction(this);
179 action->setText(i18n("&reset Foreground and Background Colors"));
180 action->setIcon(KisIconUtils::loadIcon("reset_colour"));
181 m_viewManager->actionCollection()->addAction("reset_fg_bg", action);
182 action->setDefaultWidget(m_reset);
183 connect(m_reset, SIGNAL(foregroundColorChanged(KoColor)), m_viewManager->canvasResourceProvider(), SLOT(slotSetFGColor(KoColor)));
184 connect(m_reset, SIGNAL(backgroundColorChanged(KoColor)), m_viewManager->canvasResourceProvider(), SLOT(slotSetBGColor(KoColor)));
185 m_reset->setFixedSize(28, 28);
186 connect(action, SIGNAL(triggered()), m_reset, SLOT(ResetColours()));
187 connect(m_viewManager, &KisViewManager::viewChanged, [this]() {
189 });
190
191
192 m_paintopBox = new KisPaintopBox(m_viewManager, parent, "paintopbox");
193
194 action = new QWidgetAction(this);
195 action->setText(i18n("&Painter's Tools"));
196 m_viewManager->actionCollection()->addAction("paintops", action);
197 action->setDefaultWidget(m_paintopBox);
198
199
201
202 action = new QWidgetAction(this);
203 action->setText(i18n("&Docker Box"));
204 m_viewManager->actionCollection()->addAction("dockerBox", action);
205 action->setDefaultWidget(m_dockerPopupButton);
206}
207
209{
212 colourSelector->updateColorSpace();
213 m_viewManager->canvasBase()->image()->disconnect(colourSelector);
214 connect(m_viewManager->canvasBase()->image(), SIGNAL(sigColorSpaceChanged(const KoColorSpace*)), colourSelector, SLOT(updateColorSpace()), Qt::UniqueConnection);
215 } else if (m_viewManager->viewCount()==0) {
216 colourSelector->setDisplayRenderer();
217 }
218}
219
220
232
234{
236
237 QImage icon(iconSize, QImage::Format_ARGB32);
238
239 {
240 QPainter gc(&icon);
241 m_checkersPainter.paint(gc, QRect(QPoint(), iconSize));
242 gc.drawImage(QPoint(),
243 gradient->generatePreview(iconSize.width(), iconSize.height(),
245 resourceManager()->canvasResourcesInterface()));
246 }
247
248
250}
251
253{
256 m_patternChooserPopup->setMinimumSize(450, 400);
257 m_patternChooserPopup->setObjectName("pattern_chooser_popup");
258 QHBoxLayout * l2 = new QHBoxLayout(m_patternChooserPopup);
259 l2->setObjectName("patternpopuplayout");
260
261 m_patternsTab = new QTabWidget(m_patternChooserPopup);
262 m_patternsTab->setObjectName("patternstab");
263 m_patternsTab->setFocusPolicy(Qt::NoFocus);
264 l2->addWidget(m_patternsTab);
265
267 m_patternChooser->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
268 QWidget *patternChooserPage = new QWidget(m_patternChooserPopup);
269 QHBoxLayout *patternChooserPageLayout = new QHBoxLayout(patternChooserPage);
270 patternChooserPageLayout->addWidget(m_patternChooser);
271 m_patternsTab->addTab(patternChooserPage, i18n("Patterns"));
272
273 KisCustomPattern *customPatterns = new KisCustomPattern(0, "custompatterns",
274 i18n("Custom Pattern"), m_viewManager);
275 m_patternsTab->addTab(customPatterns, i18n("Custom Pattern"));
276
277 connect(m_patternChooser, SIGNAL(resourceSelected(KoResourceSP )),
278 view->canvasResourceProvider(), SLOT(slotPatternActivated(KoResourceSP )));
279
280 connect(customPatterns, SIGNAL(activatedResource(KoResourceSP )),
281 view->canvasResourceProvider(), SLOT(slotPatternActivated(KoResourceSP )));
282
283 connect(customPatterns, SIGNAL(patternAdded(KoResourceSP)), m_patternChooser, SLOT(setCurrentPattern(KoResourceSP)));
284 connect(customPatterns, SIGNAL(patternUpdated(KoResourceSP)), m_patternChooser, SLOT(setCurrentPattern(KoResourceSP)));
285
286 connect(view->canvasResourceProvider(),
288 this,
290
294 }
295
297
298
299}
300
302{
306 }
307
309 m_gradientChooserPopup->setObjectName("gradient_chooser_popup");
310 QHBoxLayout * l2 = new QHBoxLayout(m_gradientChooserPopup);
311 l2->setObjectName("gradientpopuplayout");
312
313 m_gradientTab = new QTabWidget(m_gradientChooserPopup);
314 m_gradientTab->setObjectName("gradientstab");
315 m_gradientTab->setFocusPolicy(Qt::NoFocus);
316 l2->addWidget(m_gradientTab);
317
320 QWidget *gradientChooserPage = new QWidget(m_gradientChooserPopup);
321 QHBoxLayout *gradientChooserPageLayout = new QHBoxLayout(gradientChooserPage);
322 gradientChooserPageLayout->addWidget(m_gradientChooser);
323 m_gradientTab->addTab(gradientChooserPage, i18n("Gradients"));
324
325 connect(m_gradientChooser, SIGNAL(resourceSelected(KoResourceSP)),
326 view->canvasResourceProvider(), SLOT(slotGradientActivated(KoResourceSP)));
327 connect (view->mainWindowAsQWidget(), SIGNAL(themeChanged()), m_gradientChooser, SLOT(slotUpdateIcons()));
328 connect(view->canvasResourceProvider(), SIGNAL(sigGradientChanged(KoAbstractGradientSP)),
330 connect(m_gradientChooser, SIGNAL(gradientEdited(KoAbstractGradientSP)),
332
333
334 // set the Foreground to Transparent gradient as default on startup
336 QVector<KoResourceSP> resources = resModel.resourcesForFilename("Foreground to Transparent.svg");
337
338 if (resources.size() > 0) {
339 m_gradientChooser->setCurrentResource(resources.first());
340 if (view->canvasResourceProvider()) {
341 view->canvasResourceProvider()->slotGradientActivated(resources.first());
342 }
343 }
344
346}
347
348
350{
351 KConfigGroup grp = KSharedConfig::openConfig()->group("krita").group("Toolbar BrushesAndStuff");
352 int iconsize = grp.readEntry("IconSize", 22);
353 // NOTE: buttonsize should be the same value as the one used in ktoolbar for all QToolButton
354 int buttonsize = grp.readEntry("ButtonSize", 32);
355
357 m_dockerPopupButton->setIcon(KisIconUtils::loadIcon("view-list-details"));
358 m_dockerPopupButton->setToolTip(i18n("Docker box"));
359 m_dockerPopupButton->setFixedSize(buttonsize, buttonsize);
360 m_dockerPopupButton->setIconSize(QSize(iconsize, iconsize));
361 m_dockerPopupButton->setAutoRaise(true);
363
364 m_dockerPopup = new KisDockerHud(i18n("Toolbar Docker Box"), "toolbar");
365 // Set a reasonable minimum size so that dockers capable of being tiny are not,
366 // but are not too big either
367 m_dockerPopup->setMinimumHeight(300);
368 m_dockerPopup->setMinimumWidth(300);
370
371 QWidgetAction* action = new QWidgetAction(this);
372 KisActionRegistry::instance()->propertizeAction("docker_box", action);
373 view->actionCollection()->addAction("docker_box", action);
374 connect(action, SIGNAL(triggered()), m_dockerPopupButton, SLOT(showPopupWidget()));
375 m_dockerPopup->addAction(action);
376}
int iconSize(qreal width, qreal height)
bool propertizeAction(const QString &name, QAction *a)
static KisActionRegistry * instance()
KisDisplayColorConverter displayColorConverter
KisImageWSP image() const
KoCanvasResourceProvider * resourceManager()
void slotPatternActivated(KoResourceSP pattern)
void sigPatternChanged(KoPatternSP)
void slotGradientActivated(KoResourceSP gradient)
KisIconWidget * m_patternWidget
KoResetBgFgColours * m_reset
QWidget * m_gradientChooserPopup
void createGradientsChooser(KisViewManager *view)
KoCheckerBoardPainter m_checkersPainter
void createDockerBox(KisViewManager *view)
KisDockerHud * m_dockerPopup
void createPatternsChooser(KisViewManager *view)
KisPaintopBox * m_paintopBox
void slotUpdateDisplayRenderer(KoDualColorButton *colourSelector)
KisGradientChooser * m_gradientChooser
void slotSetPattern(KoPatternSP pattern)
KisControlFrame(KisViewManager *view, QWidget *parent=0, const char *name=0)
KisViewManager * m_viewManager
void slotSetGradient(KoAbstractGradientSP gradient)
KisPatternChooser * m_patternChooser
QWidget * m_patternChooserPopup
QTabWidget * m_patternsTab
void updateGradientPreviewOnPopupButton(KoAbstractGradientSP gradient)
KoDualColorButton * m_dual
QTabWidget * m_gradientTab
KisIconWidget * m_gradientWidget
KisIconWidget * m_dockerPopupButton
KoSwapBgFgColours * m_swap
KoBackgroundColour * m_background
KoForegroundColour * m_foreground
void setup(QWidget *parent)
KoColorDisplayRendererInterface * displayRendererInterface() const
void setCanvasResourcesInterface(KoCanvasResourcesInterfaceSP canvasResourcesInterface)
void setCurrentResource(KoResourceSP resource)
QSize preferredIconSize() const
void setThumbnail(const QImage &thumbnail)
Q_INVOKABLE QAction * addAction(const QString &name, QAction *action)
void setCurrentItem(int row)
void setCurrentPattern(KoResourceSP resource)
KoResourceSP currentResource(bool includeHidden=false)
void setPopupWidget(QWidget *widget)
void setArrowVisible(bool v)
The KisResourceModel class provides the main access to resources. It is possible to filter the resour...
QVector< KoResourceSP > resourcesForFilename(QString fileName) const
int viewCount() const
KisCanvas2 * canvasBase() const
Return the canvas base class.
void viewChanged()
viewChanged sent out when the view has changed.
virtual KisKActionCollection * actionCollection() const
QWidget * mainWindowAsQWidget() const
KisCanvasResourceProvider * canvasResourceProvider()
KoCanvasResourcesInterfaceSP canvasResourcesInterface() const
void paint(QPainter &painter, const QRectF &rect, const QPointF &patternOrigin) const
A widget for selecting two related colors.
void setPopDialog(bool popDialog)
void updateColorSpace()
setColorSpace set ColorSpace so we can lock the selector. Right now this'll be changed per view-chang...
void setDisplayRenderer(const KoColorDisplayRendererInterface *displayRenderer=KoDumbColorDisplayRenderer::instance())
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
QIcon loadIcon(const QString &name)
const QString Patterns
const QString Gradients