chalk

kis_tool_paint.cpp
1/*
2 * Copyright (c) 2003 Boudewijn Rempt
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 */
18
19#include <tqwidget.h>
20#include <tqrect.h>
21#include <tqlayout.h>
22#include <tqlabel.h>
23#include <tqpushbutton.h>
24#include <tqwhatsthis.h>
25#include <tqcheckbox.h>
26
27#include <kdebug.h>
28#include <tdelocale.h>
29#include <knuminput.h>
30#include <kiconloader.h>
31
32#include "kis_button_release_event.h"
33#include "kis_canvas_subject.h"
34#include "kis_cmb_composite.h"
35#include "kis_colorspace.h"
36#include "kis_config.h"
37#include "kis_cursor.h"
38#include "kis_global.h"
39#include "kis_image.h"
40#include "kis_int_spinbox.h"
41#include "kis_paint_device.h"
42#include "kis_tool_controller.h"
43#include "kis_tool_paint.h"
44
45KisToolPaint::KisToolPaint(const TQString& UIName)
46 : super(UIName)
47{
48 m_subject = 0;
49
50 m_UIName = UIName;
51
52 m_optionWidget = 0;
53 m_optionWidgetLayout = 0;
54
55 m_lbOpacity = 0;
56 m_slOpacity = 0;
57 m_lbComposite= 0;
58 m_cmbComposite = 0;
59
60 m_opacity = OPACITY_OPAQUE;
61 m_compositeOp = COMPOSITE_OVER;
62}
63
64KisToolPaint::~KisToolPaint()
65{
66}
67
68void KisToolPaint::update(KisCanvasSubject *subject)
69{
70 m_subject = subject;
71 updateCompositeOpComboBox();
72}
73
74void KisToolPaint::paint(KisCanvasPainter&)
75{
76}
77
78void KisToolPaint::paint(KisCanvasPainter&, const TQRect&)
79{
80}
81
82void KisToolPaint::deactivate()
83{
84}
85
86void KisToolPaint::buttonPress(KisButtonPressEvent *)
87{
88}
89
90void KisToolPaint::move(KisMoveEvent *)
91{
92}
93
94void KisToolPaint::buttonRelease(KisButtonReleaseEvent * e)
95{
96 kdDebug() << "buttonRelease" << endl;
97 if(e->button() == TQt::MidButton)
98 {
99 kdDebug() << "switch" << endl;
100 KisColor bg = m_subject->bgColor();
101 m_subject->setBGColor(m_subject->fgColor());
102 m_subject->setFGColor(bg);
103 }
104}
105
106void KisToolPaint::doubleClick(KisDoubleClickEvent *)
107{
108}
109
110void KisToolPaint::keyPress(TQKeyEvent *)
111{
112}
113
114void KisToolPaint::keyRelease(TQKeyEvent *)
115{
116}
117
118TQWidget* KisToolPaint::createOptionWidget(TQWidget* parent)
119{
120 m_optionWidget = new TQWidget(parent);
121 m_optionWidget->setCaption(m_UIName);
122
123 m_lbOpacity = new TQLabel(i18n("Opacity:"), m_optionWidget);
124 m_slOpacity = new KisIntSpinbox( m_optionWidget, "int_m_optionwidget");
125 m_slOpacity->setRange( 0, 100);
126 m_slOpacity->setValue(m_opacity / OPACITY_OPAQUE * 100);
127 connect(m_slOpacity, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotSetOpacity(int)));
128
129 m_lbComposite = new TQLabel(i18n("Mode:"), m_optionWidget);
130 m_cmbComposite = new KisCmbComposite(m_optionWidget);
131 connect(m_cmbComposite, TQ_SIGNAL(activated(const KisCompositeOp&)), this, TQ_SLOT(slotSetCompositeMode(const KisCompositeOp&)));
132
133 TQVBoxLayout* verticalLayout = new TQVBoxLayout(m_optionWidget);
134 verticalLayout->setMargin(0);
135 verticalLayout->setSpacing(3);
136
137 m_optionWidgetLayout = new TQGridLayout(verticalLayout, 2, 3, 6);
138
139 m_optionWidgetLayout->addWidget(m_lbOpacity, 0, 0);
140 m_optionWidgetLayout->addWidget(m_slOpacity, 0, 1);
141
142 m_optionWidgetLayout->addWidget(m_lbComposite, 1, 0);
143 m_optionWidgetLayout->addWidget(m_cmbComposite, 1, 1);
144
145 verticalLayout->addItem(new TQSpacerItem(0,0,TQSizePolicy::Fixed,TQSizePolicy::Expanding));
146
147 if (!quickHelp().isEmpty()) {
148 TQPushButton* push = new TQPushButton(SmallIconSet( "help" ), "", m_optionWidget);
149 connect(push, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotPopupQuickHelp()));
150
151 TQHBoxLayout* hLayout = new TQHBoxLayout(m_optionWidget);
152 hLayout->addWidget(push);
153 hLayout->addItem(new TQSpacerItem(0,0,TQSizePolicy::Expanding,TQSizePolicy::Fixed));
154 verticalLayout->addLayout(hLayout);
155 }
156 return m_optionWidget;
157}
158
159TQWidget* KisToolPaint::optionWidget()
160{
161 return m_optionWidget;
162}
163
164void KisToolPaint::addOptionWidgetLayout(TQLayout *layout)
165{
166 Q_ASSERT(m_optionWidget != 0);
167 Q_ASSERT(m_optionWidgetLayout != 0);
168 int rowCount = m_optionWidgetLayout->numRows();
169 m_optionWidgetLayout->addMultiCellLayout(layout, rowCount, rowCount, 0, 1);
170}
171
172void KisToolPaint::addOptionWidgetOption(TQWidget *control, TQWidget *label)
173{
174 Q_ASSERT(m_optionWidget != 0);
175 Q_ASSERT(m_optionWidgetLayout != 0);
176 if(label)
177 {
178 m_optionWidgetLayout->addWidget(label, m_optionWidgetLayout->numRows(), 0);
179 m_optionWidgetLayout->addWidget(control, m_optionWidgetLayout->numRows()-1, 1);
180 }
181 else
182 m_optionWidgetLayout->addMultiCellWidget(control, m_optionWidgetLayout->numRows(), m_optionWidgetLayout->numRows(), 0, 1);
183}
184
185void KisToolPaint::slotSetOpacity(int opacityPerCent)
186{
187 m_opacity = opacityPerCent * OPACITY_OPAQUE / 100;
188}
189
190void KisToolPaint::slotSetCompositeMode(const KisCompositeOp& compositeOp)
191{
192 m_compositeOp = compositeOp;
193}
194
195TQCursor KisToolPaint::cursor()
196{
197 return m_cursor;
198}
199
200void KisToolPaint::setCursor(const TQCursor& cursor)
201{
202 m_cursor = cursor;
203
204 if (m_subject) {
205 KisToolControllerInterface *controller = m_subject->toolController();
206
207 if (controller && controller->currentTool() == this) {
208 m_subject->canvasController()->setCanvasCursor(m_cursor);
209 }
210 }
211}
212
213void KisToolPaint::activate()
214{
215 if (m_subject) {
216 KisToolControllerInterface *controller = m_subject->toolController();
217
218 if (controller)
219 controller->setCurrentTool(this);
220
221 updateCompositeOpComboBox();
222
223 KisConfig cfg;
224 m_paintOutline = (cfg.cursorStyle() == CURSOR_STYLE_OUTLINE);
225 }
226}
227
228void KisToolPaint::notifyModified() const
229{
230 if (m_subject && m_subject->currentImg()) {
231 m_subject->currentImg()->setModified();
232 }
233}
234
235void KisToolPaint::updateCompositeOpComboBox()
236{
237 if (m_optionWidget && m_subject) {
238 KisImageSP img = m_subject->currentImg();
239
240 if (img) {
241 KisPaintDeviceSP device = img->activeDevice();
242
243 if (device) {
244 KisCompositeOpList compositeOps = device->colorSpace()->userVisiblecompositeOps();
245 m_cmbComposite->setCompositeOpList(compositeOps);
246
247 if (compositeOps.find(m_compositeOp) == compositeOps.end()) {
248 m_compositeOp = COMPOSITE_OVER;
249 }
250 m_cmbComposite->setCurrentItem(m_compositeOp);
251 }
252 }
253 }
254}
255
256void KisToolPaint::slotPopupQuickHelp() {
257 TQWhatsThis::display(quickHelp());
258}
259
260#include "kis_tool_paint.moc"
KisCanvasSubject is part of the Observer pattern.
A combobox filled with the various composition strategies defined in kis_global.
A KisColor describes a color in a certain colorspace.
Definition kis_color.h:33
An input widget for integer numbers, consisting of a spinbox and a dropdown slider.