karbon

vcolordocker.cpp
1/* This file is part of the KDE project
2 Made by Tomislav Lukman (tomislav.lukman@ck.tel.hr)
3 Copyright (C) 2002 - 2005, The Karbon Developers
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301, USA.
19*/
20
21#include <tqlabel.h>
22#include <tqlayout.h>
23#include <tqtabwidget.h>
24#include <tqwidget.h>
25#include <tqcolor.h>
26#include <tqtooltip.h>
27#include <tqevent.h>
28#include <tqptrlist.h>
29
30#include <tdelocale.h>
31#include <KoMainWindow.h>
32
33#include "karbon_part.h"
34#include "karbon_view.h"
35#include "karbon_factory.h"
36#include "karbon_resourceserver.h"
37#include "vcolor.h"
38#include "vcolorslider.h"
39#include "vselection.h"
40#include "vfillcmd.h"
41#include "vstrokecmd.h"
42#include "vcommand.h"
43#include "vobject.h"
44
45#include "vcolordocker.h"
46
47#include <ko_hsv_widget.h>
48#include <ko_cmyk_widget.h>
49#include <ko_rgb_widget.h>
50#include <koColor.h>
51
52#include <kdebug.h>
53
54VColorDocker::VColorDocker( KarbonPart* part, KarbonView* parent, const char* /*name*/ )
55 : TQWidget(), m_part ( part ), m_view( parent )
56{
57 m_isStrokeDocker = false;
58 setCaption( i18n( "Color Chooser" ) );
59
60 m_opacity = 1;
61
62 m_fillCmd = 0;
63 m_strokeCmd = 0;
64
65 mTabWidget = new TQTabWidget( this );
66
67 /* ##### HSV WIDGET ##### */
68 mHSVWidget = new KoHSVWidget( mTabWidget );
69 connect( mHSVWidget, TQ_SIGNAL( sigFgColorChanged( const TQColor &) ), this, TQ_SLOT( updateFgColor( const TQColor &) ) );
70 connect( mHSVWidget, TQ_SIGNAL( sigBgColorChanged( const TQColor &) ), this, TQ_SLOT( updateBgColor( const TQColor &) ) );
71 connect(this, TQ_SIGNAL(fgColorChanged(const TQColor &)), mHSVWidget, TQ_SLOT(setFgColor(const TQColor &)));
72 connect(this, TQ_SIGNAL(bgColorChanged(const TQColor &)), mHSVWidget, TQ_SLOT(setBgColor(const TQColor &)));
73 connect( mHSVWidget, TQ_SIGNAL( sigModeChanged(KDualColorButton::DualColor) ), this, TQ_SLOT( updateMode( KDualColorButton::DualColor ) ) );
74 mTabWidget->addTab( mHSVWidget, i18n( "HSV" ) );
75
76 /* ##### RGB WIDGET ##### */
77 mRGBWidget = new KoRGBWidget( mTabWidget );
78 connect( mRGBWidget, TQ_SIGNAL( sigFgColorChanged( const TQColor &) ), this, TQ_SLOT( updateFgColor( const TQColor &) ) );
79 connect( mRGBWidget, TQ_SIGNAL( sigBgColorChanged( const TQColor &) ), this, TQ_SLOT( updateBgColor( const TQColor &) ) );
80 connect(this, TQ_SIGNAL(fgColorChanged(const TQColor &)), mRGBWidget, TQ_SLOT(setFgColor(const TQColor &)));
81 connect(this, TQ_SIGNAL(bgColorChanged(const TQColor &)), mRGBWidget, TQ_SLOT(setBgColor(const TQColor &)));
82 connect( mRGBWidget, TQ_SIGNAL( sigModeChanged(KDualColorButton::DualColor) ), this, TQ_SLOT( updateMode( KDualColorButton::DualColor ) ) );
83 mTabWidget->addTab( mRGBWidget, i18n( "RGB" ) );
84
85 /* ##### CMYK WIDGET ##### */
86 /*mCMYKWidget = new KoCMYKWidget( mTabWidget );
87 connect( mCMYKWidget, TQ_SIGNAL( sigFgColorChanged( const TQColor &) ), this, TQ_SLOT( updateFgColor( const TQColor &) ) );
88 connect( mCMYKWidget, TQ_SIGNAL( sigBgColorChanged( const TQColor &) ), this, TQ_SLOT( updateBgColor( const TQColor &) ) );
89 mTabWidget->addTab( mCMYKWidget, i18n( "CMYK" ) );*/
90
91 //Opacity
92 mOpacity = new VColorSlider( i18n( "Opacity:" ), TQColor( "white" ), TQColor( "black" ), 0, 100, 100, this );
93 //TODO: Make "white" a transparent color
94 connect( mOpacity, TQ_SIGNAL( valueChanged ( int ) ), this, TQ_SLOT( updateOpacity() ) );
95 TQToolTip::add( mOpacity, i18n( "Alpha (opacity)" ) );
96
97 TQVBoxLayout *mainWidgetLayout = new TQVBoxLayout( this, 3 );
98 mainWidgetLayout->addWidget( mTabWidget );
99 mainWidgetLayout->addWidget( mOpacity );
100 mainWidgetLayout->activate();
101 setMaximumHeight( 174 );
102 setMinimumWidth( 194 );
103
104}
105
106VColorDocker::~VColorDocker()
107{
108}
109
110void VColorDocker::updateFgColor(const TQColor &c)
111{
112 m_color = c;
113
114 VColor v = VColor(c);
115 v.setOpacity( m_opacity );
116
117 // check if we have objects selected
118 TQPtrList<VObject> VNewObjectList = m_part->document().selection()->objects();
119 if( ! VNewObjectList.count() )
120 return;
121
122 mHSVWidget->blockSignals(true);
123 mRGBWidget->blockSignals(true);
124 //mCMYKWidget->blockSignals(true);
125
126 VCommandHistory* history = m_part->commandHistory();
127 const TQPtrList<VCommand>* commandList = history->commands();
128 VStrokeCmd* command = dynamic_cast<VStrokeCmd*>(commandList->getLast());
129
130 if(command == 0 || m_strokeCmd == 0)
131 {
132 m_strokeCmd = new VStrokeCmd( &m_part->document(), v );
133 m_part->addCommand( m_strokeCmd, true );
134 }
135 else
136 {
137 TQPtrList<VObject> VOldObjectList = command->getSelection()->objects();
138
139 if( VOldObjectList == VNewObjectList )
140 {
141 m_strokeCmd->changeStroke(v);
142 m_part->repaintAllViews();
143 }
144 else
145 {
146 m_strokeCmd = new VStrokeCmd( &m_part->document(), v );
147 m_part->addCommand( m_strokeCmd, true );
148 }
149 }
150
151 emit fgColorChanged( c );
152
153 mHSVWidget->blockSignals(false);
154 mRGBWidget->blockSignals(false);
155 //mCMYKWidget->blockSignals(false);
156}
157
158void VColorDocker::updateBgColor(const TQColor &c)
159{
160 m_color = c;
161
162 VColor v = VColor(c);
163 v.setOpacity( m_opacity );
164
165 // check if we have objects selected
166 TQPtrList<VObject> VNewObjectList = m_part->document().selection()->objects();
167 if( ! VNewObjectList.count() )
168 return;
169
170 mHSVWidget->blockSignals(true);
171 mRGBWidget->blockSignals(true);
172 //mCMYKWidget->blockSignals(true);
173
174 VCommandHistory* history = m_part->commandHistory();
175 const TQPtrList<VCommand>* commandList = history->commands();
176 VFillCmd* command = dynamic_cast<VFillCmd*>(commandList->getLast());
177
178 if(command == 0 || m_fillCmd == 0)
179 {
180 m_fillCmd = new VFillCmd( &m_part->document(), VFill(v) );
181 m_part->addCommand( m_fillCmd, true );
182 }
183 else
184 {
185 TQPtrList<VObject> VOldObjectList = command->getSelection()->objects();
186
187 if( VOldObjectList == VNewObjectList )
188 {
189 m_fillCmd->changeFill(VFill(v));
190 m_part->repaintAllViews();
191 }
192 else
193 {
194 m_fillCmd = new VFillCmd( &m_part->document(), VFill(v) );
195 m_part->addCommand( m_fillCmd, true );
196 }
197 }
198
199 emit bgColorChanged( c );
200
201 mHSVWidget->blockSignals(false);
202 mRGBWidget->blockSignals(false);
203 //mCMYKWidget->blockSignals(false);
204}
205
206void VColorDocker::updateOpacity()
207{
208 m_opacity = mOpacity->value() / 100.0;
209
210 VColor c = VColor(m_color);
211 c.setOpacity( m_opacity );
212
213 if ( isStrokeDocker() )
214 m_part->addCommand( new VStrokeCmd( &m_part->document(), c ), true );
215 else
216 m_part->addCommand( new VFillCmd( &m_part->document(), VFill( c ) ), true );
217}
218
219void
220VColorDocker::mouseReleaseEvent( TQMouseEvent * )
221{
222 //changeColor();
223}
224
225void VColorDocker::setFillDocker()
226{
227 m_isStrokeDocker = false;
228 mHSVWidget->setMode( KDualColorButton::Background );
229 mRGBWidget->setMode( KDualColorButton::Background );
230 update();
231}
232
233void VColorDocker::setStrokeDocker()
234{
235 m_isStrokeDocker = true;
236 mHSVWidget->setMode( KDualColorButton::Foreground );
237 mRGBWidget->setMode( KDualColorButton::Foreground );
238 update();
239}
240
241void VColorDocker::update()
242{
243 mHSVWidget->blockSignals(true);
244 mRGBWidget->blockSignals(true);
245 //mCMYKWidget->blockSignals(true);
246
247 int objCnt = m_part->document().selection()->objects().count();
248
249 if( objCnt > 0 )
250 {
251 VObject *obj = m_part->document().selection()->objects().getFirst();
252
253 TQColor fgColor = TQColor(obj->stroke() ? obj->stroke()->color() : VColor() );
254 TQColor bgColor = TQColor(obj->fill() ? obj->fill()->color() : VColor() );
255
256 mHSVWidget->setFgColor(fgColor);
257 mRGBWidget->setFgColor(fgColor);
258 //mCMYKWidget->setFgColor(fgColor);
259
260 mHSVWidget->setBgColor(bgColor);
261 mRGBWidget->setBgColor(bgColor);
262 //mCMYKWidget->setBgColor(bgColor);
263
264 if( m_isStrokeDocker )
265 m_color = fgColor;
266 else
267 m_color = bgColor;
268 }
269
270 mHSVWidget->blockSignals(false);
271 mRGBWidget->blockSignals(false);
272 //mCMYKWidget->blockSignals(false);
273}
274
275void VColorDocker::updateMode( KDualColorButton::DualColor s )
276{
277 m_isStrokeDocker = (s == KDualColorButton::Foreground);
278 update();
279 emit modeChanged( s );
280}
281
282#include "vcolordocker.moc"
283
Keeps track of visual per document properties.
Definition karbon_part.h:46
This is the color slider widget that is used to select color or color components.
This class keeps track of color properties.
Definition vcolor.h:41
void setOpacity(float opacity)
Sets the color opacity.
Definition vcolor.h:138
Manages a set of commands.
Definition vcommand.h:144
const TQPtrList< VCommand > * commands() const
Read only access to the command history list.
Definition vcommand.h:223
VSelection * selection() const
Returns a pointer to the selection.
Definition vdocument.h:238
Manages the fill of shapes.
Definition vfill.h:45
The base class for all karbon objects.
Definition vobject.h:50
virtual VFill * fill() const
Gets the object's actual fill.
Definition vobject.h:177
virtual VStroke * stroke() const
Gets the object's actual stroke.
Definition vobject.h:170
VDocument * document() const
Return document the object belongs to.
Definition vobject.cpp:216
const VObjectList & objects() const
Read only access to the selected objects.
Definition vselection.h:136