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#include <KoDualColorButton.h>
29#include <KoResourceServer.h>
32#include <kis_image.h>
33
34#include <resources/KoPattern.h>
37
39
41#include "KisViewManager.h"
42#include "kis_config.h"
43#include "kis_paintop_box.h"
44#include "KisDockerHud.h"
45#include "kis_custom_pattern.h"
49#include <kis_canvas2.h>
50#include "kis_action_registry.h"
51
52
53KisControlFrame::KisControlFrame(KisViewManager *view, QWidget *parent, const char* name)
54 : QObject(view)
55 , m_viewManager(view)
56 , m_checkersPainter(4)
57{
58 setObjectName(name);
59
61 m_patternWidget->setToolTip(i18n("Fill Patterns"));
62 m_patternWidget->setFixedSize(32, 32);
63
65 m_gradientWidget->setToolTip(i18n("Fill Gradients"));
66 m_gradientWidget->setFixedSize(32, 32);
67}
68
69void KisControlFrame::setup(QWidget *parent)
70{
73
74 QWidgetAction *action = new QWidgetAction(this);
75 action->setText(i18n("&Patterns"));
77 action->setDefaultWidget(m_patternWidget);
78 connect(action, SIGNAL(triggered()), m_patternWidget, SLOT(showPopupWidget()));
79 m_patternChooserPopup->addAction(action);
80
81 action = new QWidgetAction(this);
82 action->setText(i18n("&Gradients"));
84 action->setDefaultWidget(m_gradientWidget);
85 connect(action, SIGNAL(triggered()), m_gradientWidget, SLOT(showPopupWidget()));
86 m_gradientChooserPopup->addAction(action);
87
88
89 // XXX: KOMVC we don't have a canvas here yet, needs a setImageView
90 const KoColorDisplayRendererInterface *displayRenderer = \
91 KisDisplayColorConverter::dumbConverterInstance()->displayRendererInterface();
93 m_viewManager->canvasResourceProvider()->bgColor(), displayRenderer,
95 m_dual->setPopDialog(true);
96 action = new QWidgetAction(this);
97 action->setText(i18n("&Choose foreground and background colors"));
98 m_viewManager->actionCollection()->addAction("dual", action);
99 action->setDefaultWidget(m_dual);
100 connect(m_dual, SIGNAL(foregroundColorChanged(KoColor)), m_viewManager->canvasResourceProvider(), SLOT(slotSetFGColor(KoColor)));
101 connect(m_dual, SIGNAL(backgroundColorChanged(KoColor)), m_viewManager->canvasResourceProvider(), SLOT(slotSetBGColor(KoColor)));
102 connect(m_viewManager->canvasResourceProvider(), SIGNAL(sigBGColorChanged(KoColor)), m_dual, SLOT(setBackgroundColor(KoColor)));
103 connect(m_viewManager->canvasResourceProvider(), SIGNAL(sigFGColorChanged(KoColor)), m_dual, SLOT(setForegroundColor(KoColor)));
104 connect(m_viewManager->canvasResourceProvider(), SIGNAL(sigFGColorChanged(KoColor)), m_gradientWidget, SLOT(update()));
105 connect(m_viewManager->canvasResourceProvider(), SIGNAL(sigBGColorChanged(KoColor)), m_gradientWidget, SLOT(update()));
106 m_dual->setFixedSize(28, 28);
107 connect(m_viewManager, SIGNAL(viewChanged()), SLOT(slotUpdateDisplayRenderer()));
108
109 m_paintopBox = new KisPaintopBox(m_viewManager, parent, "paintopbox");
110
111 action = new QWidgetAction(this);
112 action->setText(i18n("&Painter's Tools"));
113 m_viewManager->actionCollection()->addAction("paintops", action);
114 action->setDefaultWidget(m_paintopBox);
115
116 action = new QWidgetAction(this);
117 action->setText(i18n("&Open Foreground color selector"));
118 m_viewManager->actionCollection()->addAction("chooseForegroundColor", action);
119 connect(action, SIGNAL(triggered()), m_dual, SLOT(openForegroundDialog()));
120
121 action = new QWidgetAction(this);
122 action->setText(i18n("&Open Background color selector"));
123 m_viewManager->actionCollection()->addAction("chooseBackgroundColor", action);
124 connect(action, SIGNAL(triggered()), m_dual, SLOT(openBackgroundDialog()));
125
127
128 action = new QWidgetAction(this);
129 action->setText(i18n("&Docker Box"));
130 m_viewManager->actionCollection()->addAction("dockerBox", action);
131 action->setDefaultWidget(m_dockerPopupButton);
132}
133
135{
139 m_viewManager->canvasBase()->image()->disconnect(m_dual);
140 connect(m_viewManager->canvasBase()->image(), SIGNAL(sigColorSpaceChanged(const KoColorSpace*)), m_dual, SLOT(setColorSpace(const KoColorSpace*)), Qt::UniqueConnection);
141 } else if (m_viewManager->viewCount()==0) {
143 }
144}
145
157
159{
161
162 QImage icon(iconSize, QImage::Format_ARGB32);
163
164 {
165 QPainter gc(&icon);
166 m_checkersPainter.paint(gc, QRect(QPoint(), iconSize));
167 gc.drawImage(QPoint(),
168 gradient->generatePreview(iconSize.width(), iconSize.height(),
170 resourceManager()->canvasResourcesInterface()));
171 }
172
173
175}
176
178{
181 m_patternChooserPopup->setMinimumSize(450, 400);
182 m_patternChooserPopup->setObjectName("pattern_chooser_popup");
183 QHBoxLayout * l2 = new QHBoxLayout(m_patternChooserPopup);
184 l2->setObjectName("patternpopuplayout");
185
186 m_patternsTab = new QTabWidget(m_patternChooserPopup);
187 m_patternsTab->setObjectName("patternstab");
188 m_patternsTab->setFocusPolicy(Qt::NoFocus);
189 l2->addWidget(m_patternsTab);
190
192 m_patternChooser->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
193 QWidget *patternChooserPage = new QWidget(m_patternChooserPopup);
194 QHBoxLayout *patternChooserPageLayout = new QHBoxLayout(patternChooserPage);
195 patternChooserPageLayout->addWidget(m_patternChooser);
196 m_patternsTab->addTab(patternChooserPage, i18n("Patterns"));
197
198 KisCustomPattern *customPatterns = new KisCustomPattern(0, "custompatterns",
199 i18n("Custom Pattern"), m_viewManager);
200 m_patternsTab->addTab(customPatterns, i18n("Custom Pattern"));
201
202 connect(m_patternChooser, SIGNAL(resourceSelected(KoResourceSP )),
203 view->canvasResourceProvider(), SLOT(slotPatternActivated(KoResourceSP )));
204
205 connect(customPatterns, SIGNAL(activatedResource(KoResourceSP )),
206 view->canvasResourceProvider(), SLOT(slotPatternActivated(KoResourceSP )));
207
208 connect(customPatterns, SIGNAL(patternAdded(KoResourceSP)), m_patternChooser, SLOT(setCurrentPattern(KoResourceSP)));
209 connect(customPatterns, SIGNAL(patternUpdated(KoResourceSP)), m_patternChooser, SLOT(setCurrentPattern(KoResourceSP)));
210
211 connect(view->canvasResourceProvider(),
213 this,
215
219 }
220
222
223
224}
225
227{
231 }
232
234 m_gradientChooserPopup->setObjectName("gradient_chooser_popup");
235 QHBoxLayout * l2 = new QHBoxLayout(m_gradientChooserPopup);
236 l2->setObjectName("gradientpopuplayout");
237
238 m_gradientTab = new QTabWidget(m_gradientChooserPopup);
239 m_gradientTab->setObjectName("gradientstab");
240 m_gradientTab->setFocusPolicy(Qt::NoFocus);
241 l2->addWidget(m_gradientTab);
242
245 QWidget *gradientChooserPage = new QWidget(m_gradientChooserPopup);
246 QHBoxLayout *gradientChooserPageLayout = new QHBoxLayout(gradientChooserPage);
247 gradientChooserPageLayout->addWidget(m_gradientChooser);
248 m_gradientTab->addTab(gradientChooserPage, i18n("Gradients"));
249
250 connect(m_gradientChooser, SIGNAL(resourceSelected(KoResourceSP)),
251 view->canvasResourceProvider(), SLOT(slotGradientActivated(KoResourceSP)));
252 connect (view->mainWindowAsQWidget(), SIGNAL(themeChanged()), m_gradientChooser, SLOT(slotUpdateIcons()));
253 connect(view->canvasResourceProvider(), SIGNAL(sigGradientChanged(KoAbstractGradientSP)),
255 connect(m_gradientChooser, SIGNAL(gradientEdited(KoAbstractGradientSP)),
257
258
259 // set the Foreground to Transparent gradient as default on startup
261 QVector<KoResourceSP> resources = resModel.resourcesForFilename("Foreground to Transparent.svg");
262
263 if (resources.size() > 0) {
264 m_gradientChooser->setCurrentResource(resources.first());
265 if (view->canvasResourceProvider()) {
266 view->canvasResourceProvider()->slotGradientActivated(resources.first());
267 }
268 }
269
271}
272
273
275{
276 KConfigGroup grp = KSharedConfig::openConfig()->group("krita").group("Toolbar BrushesAndStuff");
277 int iconsize = grp.readEntry("IconSize", 22);
278 // NOTE: buttonsize should be the same value as the one used in ktoolbar for all QToolButton
279 int buttonsize = grp.readEntry("ButtonSize", 32);
280
282 m_dockerPopupButton->setIcon(KisIconUtils::loadIcon("view-list-details"));
283 m_dockerPopupButton->setToolTip(i18n("Docker box"));
284 m_dockerPopupButton->setFixedSize(buttonsize, buttonsize);
285 m_dockerPopupButton->setIconSize(QSize(iconsize, iconsize));
286 m_dockerPopupButton->setAutoRaise(true);
288
289 m_dockerPopup = new KisDockerHud(i18n("Toolbar Docker Box"), "toolbar");
290 // Set a reasonable minimum size so that dockers capable of being tiny are not,
291 // but are not too big either
292 m_dockerPopup->setMinimumHeight(300);
293 m_dockerPopup->setMinimumWidth(300);
295
296 QWidgetAction* action = new QWidgetAction(this);
297 KisActionRegistry::instance()->propertizeAction("docker_box", action);
298 view->actionCollection()->addAction("docker_box", action);
299 connect(action, SIGNAL(triggered()), m_dockerPopupButton, SLOT(showPopupWidget()));
300 m_dockerPopup->addAction(action);
301}
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
QWidget * m_gradientChooserPopup
void createGradientsChooser(KisViewManager *view)
KoCheckerBoardPainter m_checkersPainter
void createDockerBox(KisViewManager *view)
KisDockerHud * m_dockerPopup
void createPatternsChooser(KisViewManager *view)
KisPaintopBox * m_paintopBox
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
void setup(QWidget *parent)
KoColorDisplayRendererInterface * displayRendererInterface() const
void setCanvasResourcesInterface(KoCanvasResourcesInterfaceSP canvasResourcesInterface)
void setCurrentResource(KoResourceSP resource)
QSize preferredIconSize() const
void setThumbnail(const QImage &thumbnail)
const KoColorSpace * colorSpace() const
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.
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 setColorSpace(const KoColorSpace *cs)
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