ko_rgb_widget.cpp
1/*
2 * This file is part of Chalk
3 *
4 * Copyright (c) 1999 Matthias Elter (me@kde.org)
5 * Copyright (c) 2001-2002 Igor Jansen (rm@kde.org)
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20*/
21
22#include "ko_rgb_widget.h"
23
24#include <tqlayout.h>
25#include <tqhbox.h>
26#include <tqlabel.h>
27#include <tqspinbox.h>
28#include <tqtooltip.h>
29#include <tqcolor.h>
30
31#include <kdebug.h>
32#include <tdelocale.h>
33
34#include <koFrameButton.h>
35#include <koColorSlider.h>
36#include <kcolordialog.h>
37
38KoRGBWidget::KoRGBWidget(TQWidget *parent, const char *name) : super(parent, name)
39{
40 m_ColorButton = new KDualColorButton(this);
41 m_ColorButton -> setFixedSize(m_ColorButton->sizeHint());
42 TQGridLayout *mGrid = new TQGridLayout(this, 3, 5, 5, 2);
43
44 /* setup color sliders */
45 mRSlider = new KoColorSlider(this);
46 mRSlider->setMaximumHeight(20);
47 mRSlider->slotSetRange(0, 255);
48 mRSlider->setFocusPolicy( TQWidget::ClickFocus );
49
50 mGSlider = new KoColorSlider(this);
51 mGSlider->setMaximumHeight(20);
52 mGSlider->slotSetRange(0, 255);
53 mGSlider->setFocusPolicy( TQWidget::ClickFocus );
54
55 mBSlider = new KoColorSlider(this);
56 mBSlider->setMaximumHeight(20);
57 mBSlider->slotSetRange(0, 255);
58 mBSlider->setFocusPolicy( TQWidget::ClickFocus );
59
60 /* setup slider labels */
61 mRLabel = new TQLabel("R:", this);
62 mRLabel->setFixedWidth(12);
63 mRLabel->setFixedHeight(20);
64 mGLabel = new TQLabel("G:", this);
65 mGLabel->setFixedWidth(12);
66 mGLabel->setFixedHeight(20);
67 mBLabel = new TQLabel("B:", this);
68 mBLabel->setFixedWidth(12);
69 mBLabel->setFixedHeight(20);
70
71 /* setup spin box */
72 mRIn = new TQSpinBox(0, 255, 1, this);
73 mRIn->setFixedWidth(50);
74 mRIn->setFixedHeight(20);
75 mRIn->setFocusPolicy( TQWidget::ClickFocus );
76 TQToolTip::add( mRIn, i18n( "Red" ) );
77
78 mGIn = new TQSpinBox(0, 255, 1, this);
79 mGIn->setFixedWidth(50);
80 mGIn->setFixedHeight(20);
81 mGIn->setFocusPolicy( TQWidget::ClickFocus );
82 TQToolTip::add( mGIn, i18n( "Green" ) );
83
84 mBIn = new TQSpinBox(0, 255, 1, this);
85 mBIn->setFixedWidth(50);
86 mBIn->setFixedHeight(20);
87 mBIn->setFocusPolicy( TQWidget::ClickFocus );
88 TQToolTip::add( mBIn, i18n( "Blue" ) );
89
90 mGrid->addMultiCellWidget(m_ColorButton, 0, 3, 0, 0, TQt::AlignTop);
91 mGrid->addWidget(mRLabel, 0, 1);
92 mGrid->addWidget(mGLabel, 1, 1);
93 mGrid->addWidget(mBLabel, 2, 1);
94 mGrid->addMultiCellWidget(mRSlider, 0, 0, 2, 3);
95 mGrid->addMultiCellWidget(mGSlider, 1, 1, 2, 3);
96 mGrid->addMultiCellWidget(mBSlider, 2, 2, 2, 3);
97 mGrid->addWidget(mRIn, 0, 4);
98 mGrid->addWidget(mGIn, 1, 4);
99 mGrid->addWidget(mBIn, 2, 4);
100
101 connect(m_ColorButton, TQ_SIGNAL(fgChanged(const TQColor &)), this, TQ_SLOT(slotFGColorSelected(const TQColor &)));
102 connect(m_ColorButton, TQ_SIGNAL(bgChanged(const TQColor &)), this, TQ_SLOT(slotBGColorSelected(const TQColor &)));
103 connect(m_ColorButton, TQ_SIGNAL(currentChanged(KDualColorButton::DualColor)), this, TQ_SLOT(currentChanged(KDualColorButton::DualColor)));
104
105 /* connect color sliders */
106 connect(mRSlider, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotRChanged(int)));
107 connect(mGSlider, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotGChanged(int)));
108 connect(mBSlider, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotBChanged(int)));
109
110 /* connect spin box */
111 connect(mRIn, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotRChanged(int)));
112 connect(mGIn, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotGChanged(int)));
113 connect(mBIn, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotBChanged(int)));
114
115 update(TQt::black, TQt::white);
116}
117
118void KoRGBWidget::slotRChanged(int r)
119{
120 if (m_ColorButton->current() == KDualColorButton::Foreground)
121 slotFGColorSelected( TQColor(r, m_fgColor.green(), m_fgColor.blue()));
122 else
123 slotBGColorSelected( TQColor(r, m_bgColor.green(), m_bgColor.blue()));
124}
125
126void KoRGBWidget::slotGChanged(int g)
127{
128 if (m_ColorButton->current() == KDualColorButton::Foreground)
129 slotFGColorSelected( TQColor( m_fgColor.red(), g, m_fgColor.blue()));
130 else
131 slotBGColorSelected( TQColor( m_bgColor.red(), g, m_bgColor.blue()));;
132}
133
134void KoRGBWidget::slotBChanged(int b)
135{
136 if (m_ColorButton->current() == KDualColorButton::Foreground)
137 slotFGColorSelected( TQColor( m_fgColor.red(), m_fgColor.green(), b));
138 else
139 slotBGColorSelected( TQColor( m_bgColor.red(), m_bgColor.green(), b));
140}
141
142void KoRGBWidget::setFgColor(const TQColor & c)
143{
144 blockSignals(true);
145 slotFGColorSelected(c);
146 blockSignals(false);
147}
148
149void KoRGBWidget::setBgColor(const TQColor & c)
150{
151 blockSignals(true);
152 slotBGColorSelected(c);
153 blockSignals(false);
154}
155
156void KoRGBWidget::update(const TQColor fgColor, const TQColor bgColor)
157{
158
159 m_fgColor = fgColor;
160 m_bgColor = bgColor;
161
162 TQColor color = (m_ColorButton->current() == KDualColorButton::Foreground)? m_fgColor : m_bgColor;
163
164 int r = color.red();
165 int g = color.green();
166 int b = color.blue();
167
168 mRSlider->blockSignals(true);
169 mRIn->blockSignals(true);
170 mGSlider->blockSignals(true);
171 mGIn->blockSignals(true);
172 mBSlider->blockSignals(true);
173 mBIn->blockSignals(true);
174
175 mRSlider->slotSetColor1(TQColor(0, g, b));
176 mRSlider->slotSetColor2(TQColor(255, g, b));
177 mRSlider->slotSetValue(r);
178 mRIn->setValue(r);
179
180 mGSlider->slotSetColor1(TQColor(r, 0, b));
181 mGSlider->slotSetColor2(TQColor(r, 255, b));
182 mGSlider->slotSetValue(g);
183 mGIn->setValue(g);
184
185 mBSlider->slotSetColor1(TQColor(r, g, 0));
186 mBSlider->slotSetColor2(TQColor(r, g, 255));
187 mBSlider->slotSetValue(b);
188 mBIn->setValue(b);
189
190 mRSlider->blockSignals(false);
191 mRIn->blockSignals(false);
192 mGSlider->blockSignals(false);
193 mGIn->blockSignals(false);
194 mBSlider->blockSignals(false);
195 mBIn->blockSignals(false);
196}
197
198void KoRGBWidget::slotFGColorSelected(const TQColor& c)
199{
200 m_fgColor = c;
201 disconnect(m_ColorButton, TQ_SIGNAL(fgChanged(const TQColor &)), this, TQ_SLOT(slotFGColorSelected(const TQColor &)));
202 m_ColorButton->setForeground( m_fgColor );
203 connect(m_ColorButton, TQ_SIGNAL(fgChanged(const TQColor &)), this, TQ_SLOT(slotFGColorSelected(const TQColor &)));
204
205 update( m_fgColor, m_bgColor);
206 emit sigFgColorChanged(m_fgColor);
207}
208
209void KoRGBWidget::slotBGColorSelected(const TQColor& c)
210{
211 m_bgColor = c;
212
213 disconnect(m_ColorButton, TQ_SIGNAL(bgChanged(const TQColor &)), this, TQ_SLOT(slotBGColorSelected(const TQColor &)));
214 m_ColorButton->setBackground( m_bgColor );
215 connect(m_ColorButton, TQ_SIGNAL(bgChanged(const TQColor &)), this, TQ_SLOT(slotBGColorSelected(const TQColor &)));
216
217 update(m_fgColor, m_bgColor);
218 emit sigBgColorChanged(m_bgColor);
219}
220
221void KoRGBWidget::currentChanged(KDualColorButton::DualColor s)
222{
223 if(s == KDualColorButton::Foreground)
224 slotFGColorSelected(m_ColorButton->currentColor());
225 else
226 slotBGColorSelected(m_ColorButton->currentColor());
227 emit sigModeChanged( s );
228}
229
230void KoRGBWidget::setMode(KDualColorButton::DualColor s)
231{
232 m_ColorButton->setCurrent( s );
233}
234
235#include "ko_rgb_widget.moc"
const char * name(StdAction id)