You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koffice/lib/kopainter/koColorChooser.cpp

676 lines
18 KiB

/* This file is part of the KDE project
Copyright (c) 1999 Matthias Elter (me@kde.org)
Copyright (c) 2001-2002 Igor Jansen (rm@kde.org)
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "koColorChooser.h"
#include <tqcolor.h>
#include <tqlayout.h>
#include <tqspinbox.h>
#include <tqtabwidget.h>
#include <tdelocale.h>
#include <kiconloader.h>
#include <kcolordialog.h>
#include <ktabctl.h>
#include <koFrameButton.h>
#include <koColorSlider.h>
KoColorChooser::KoColorChooser(TQWidget *parent, const char *name) : TQWidget(parent, name)
{
m_current = 0;
m_tab = new TQTabWidget(this, "KoColorChooser tab");
mGrid = new TQGridLayout(this, 3, 5);
mRGBWidget = new RGBWidget(m_tab);
m_current = mRGBWidget;
m_tab -> addTab(mRGBWidget, "RGB");
mHSVWidget = new HSVWidget(m_tab);
m_tab -> addTab(mHSVWidget, "HSV");
#if 0
mCMYKWidget = new TQWidget(m_tab);
m_tab -> addTab(mCMYKWidget, "CMYK");
mLABWidget = new LABWidget(m_tab);
m_tab -> addTab(mLABWidget, "LAB");
#endif
mGreyWidget = new GreyWidget(m_tab);
m_tab -> addTab(mGreyWidget, i18n("Gray"));
mColorSelector = new KHSSelector(this);
mColorSelector->setFixedHeight(20);
mGrid->addMultiCellWidget(m_tab, 0, 1, 0, 4);
mGrid->addMultiCellWidget(mColorSelector, 2, 2, 0, 4);
connect(mRGBWidget, TQ_SIGNAL(colorChanged(const KoColor &)), this, TQ_SLOT(childColorChanged(const KoColor &)));
connect(mHSVWidget, TQ_SIGNAL(colorChanged(const KoColor &)), this, TQ_SLOT(childColorChanged(const KoColor &)));
// connect(mLABWidget, TQ_SIGNAL(colorChanged(const KoColor &)), this, TQ_SLOT(childColorChanged(const KoColor &)));
connect(mGreyWidget, TQ_SIGNAL(colorChanged(const KoColor &)), this, TQ_SLOT(childColorChanged(const KoColor &)));
connect(mColorSelector, TQ_SIGNAL(valueChanged(int, int)), this, TQ_SLOT(slotChangeXY(int, int)));
connect(m_tab, TQ_SIGNAL(currentChanged(TQWidget*)), this, TQ_SLOT(slotCurrentChanged(TQWidget*)));
slotChangeColor(KoColor::black());
}
void KoColorChooser::slotCurrentChanged(TQWidget *current)
{
m_current = static_cast<ColorWidget*>(current);
m_current -> slotChangeColor(mColor);
}
void KoColorChooser::slotChangeXY(int h, int s)
{
KoColor c(h, s, 192, KoColor::csHSV);
m_current -> slotChangeColor(c);
}
void KoColorChooser::slotChangeColor(const TQColor &c)
{
slotChangeColor(KoColor(c));
}
void KoColorChooser::childColorChanged(const KoColor& c)
{
mColor.setRGB(c.R(), c.G(), c.B());
emit colorChanged(mColor);
}
void KoColorChooser::slotChangeColor(const KoColor &c)
{
mColor = c;
m_current -> slotChangeColor(mColor);
mColorSelector->setValues(c.H(), c.S());
}
/* RGBWidget */
RGBWidget::RGBWidget(TQWidget *parent) : ColorWidget(parent)
{
TQGridLayout *mGrid = new TQGridLayout(this, 4, 5);
mColorPatch = new KColorPatch(this);
/* setup color sliders */
mRSlider = new KoColorSlider(this);
mRSlider->setMaximumHeight(20);
mRSlider->slotSetRange(0, 255);
mGSlider = new KoColorSlider(this);
mGSlider->setMaximumHeight(20);
mGSlider->slotSetRange(0, 255);
mBSlider = new KoColorSlider(this);
mBSlider->setMaximumHeight(20);
mBSlider->slotSetRange(0, 255);
/* setup slider labels */
mRLabel = new TQLabel("R", this);
mRLabel->setFixedWidth(16);
mRLabel->setFixedHeight(20);
mGLabel = new TQLabel("G", this);
mGLabel->setFixedWidth(16);
mGLabel->setFixedHeight(20);
mBLabel = new TQLabel("B", this);
mBLabel->setFixedWidth(16);
mBLabel->setFixedHeight(20);
/* setup spin box */
mRIn = new TQSpinBox(0, 255, 1, this);
mRIn->setFixedWidth(42);
mRIn->setFixedHeight(20);
mGIn = new TQSpinBox(0, 255, 1, this);
mGIn->setFixedWidth(42);
mGIn->setFixedHeight(20);
mBIn = new TQSpinBox(0, 255, 1, this);
mBIn->setFixedWidth(42);
mBIn->setFixedHeight(20);
mGrid->addMultiCellWidget(mColorPatch, 0, 4, 0, 0);
mGrid->addWidget(mRLabel, 1, 1);
mGrid->addWidget(mGLabel, 2, 1);
mGrid->addWidget(mBLabel, 3, 1);
mGrid->addMultiCellWidget(mRSlider, 1, 1, 2, 3);
mGrid->addMultiCellWidget(mGSlider, 2, 2, 2, 3);
mGrid->addMultiCellWidget(mBSlider, 3, 3, 2, 3);
mGrid->addWidget(mRIn, 1, 4);
mGrid->addWidget(mGIn, 2, 4);
mGrid->addWidget(mBIn, 3, 4);
connect(mColorPatch, TQ_SIGNAL(colorChanged(const TQColor &)), this, TQ_SLOT(slotPatchChanged(const TQColor &)));
/* connect color sliders */
connect(mRSlider, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotRSliderChanged(int)));
connect(mGSlider, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotGSliderChanged(int)));
connect(mBSlider, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotBSliderChanged(int)));
/* connect spin box */
connect(mRIn, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotRInChanged(int)));
connect(mGIn, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotGInChanged(int)));
connect(mBIn, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotBInChanged(int)));
}
ColorWidget::ColorWidget(TQWidget *parent) : TQWidget(parent)
{
}
ColorWidget::~ColorWidget()
{
}
void ColorWidget::slotChangeColor(const KoColor& c)
{
mColor.setRGB(c.R(), c.G(), c.B());
slotRefreshColor();
}
void ColorWidget::slotChangeColor(const TQColor& c)
{
mColor.setColor(c);
slotRefreshColor();
}
void RGBWidget::slotRefreshColor()
{
int r = mColor.R();
int g = mColor.G();
int b = mColor.B();
mRSlider->slotSetColor1(TQColor(0, g, b));
mRSlider->slotSetColor2(TQColor(255, g, b));
mRSlider->slotSetValue(r);
mRIn->setValue(r);
mGSlider->slotSetColor1(TQColor(r, 0, b));
mGSlider->slotSetColor2(TQColor(r, 255, b));
mGSlider->slotSetValue(g);
mGIn->setValue(g);
mBSlider->slotSetColor1(TQColor(r, g, 0));
mBSlider->slotSetColor2(TQColor(r, g, 255));
mBSlider->slotSetValue(b);
mBIn->setValue(b);
mColorPatch -> setColor(mColor.color());
}
void RGBWidget::slotRSliderChanged(int r)
{
int g = mColor.G();
int b = mColor.B();
mColor.setRGB(r, g, b);
slotRefreshColor();
emit colorChanged(KoColor(r, g, b, KoColor::csRGB));
}
void RGBWidget::slotGSliderChanged(int g)
{
int r = mColor.R();
int b = mColor.B();
mColor.setRGB(r, g, b);
slotRefreshColor();
emit colorChanged(KoColor( r, g, b, KoColor::csRGB));
}
void RGBWidget::slotBSliderChanged(int b)
{
int r = mColor.R();
int g = mColor.G();
mColor.setRGB(r, g, b);
slotRefreshColor();
emit colorChanged(KoColor(r, g, b, KoColor::csRGB));
}
void RGBWidget::slotRInChanged(int r)
{
int g = mColor.G();
int b = mColor.B();
mColor.setRGB(r, g, b);
slotRefreshColor();
emit colorChanged(KoColor(r, g, b, KoColor::csRGB));
}
void RGBWidget::slotGInChanged(int g)
{
int r = mColor.R();
int b = mColor.B();
mColor.setRGB(r, g, b);
slotRefreshColor();
emit colorChanged(KoColor(r, g, b, KoColor::csRGB));
}
void RGBWidget::slotBInChanged(int b)
{
int r = mColor.R();
int g = mColor.G();
mColor.setRGB(r, g, b);
slotRefreshColor();
emit colorChanged(KoColor(r, g, b, KoColor::csRGB));
}
void RGBWidget::slotPatchChanged(const TQColor& clr)
{
int r = clr.red();
int g = clr.green();
int b = clr.blue();
mColor.setRGB(r, g, b);
slotRefreshColor();
emit colorChanged(KoColor(r, g, b, KoColor::csRGB));
}
/* HSVWidget */
HSVWidget::HSVWidget(TQWidget *parent): ColorWidget(parent)
{
TQGridLayout *mGrid = new TQGridLayout(this, 3, 3);
mColorPatch = new KColorPatch(this);
/* setup color sliders */
mHSlider = new KoColorSlider(this);
mHSlider->setMaximumHeight(20);
mHSlider->slotSetRange(0, 359);
mSSlider = new KoColorSlider(this);
mSSlider->setMaximumHeight(20);
mSSlider->slotSetRange(0, 255);
mVSlider = new KoColorSlider(this);
mVSlider->setMaximumHeight(20);
mVSlider->slotSetRange(0, 255);
/* setup slider labels */
mHLabel = new TQLabel("H", this);
mHLabel->setFixedWidth(16);
mHLabel->setFixedHeight(20);
mSLabel = new TQLabel("S", this);
mSLabel->setFixedWidth(16);
mSLabel->setFixedHeight(20);
mVLabel = new TQLabel("V", this);
mVLabel->setFixedWidth(16);
mVLabel->setFixedHeight(20);
/* setup spin box */
mHIn = new TQSpinBox(0, 359, 1, this);
mHIn->setFixedWidth(42);
mHIn->setFixedHeight(20);
mSIn = new TQSpinBox(0, 255, 1, this);
mSIn->setFixedWidth(42);
mSIn->setFixedHeight(20);
mVIn = new TQSpinBox(0, 255, 1, this);
mVIn->setFixedWidth(42);
mVIn->setFixedHeight(20);
mGrid->addMultiCellWidget(mColorPatch, 0, 4, 0, 0);
mGrid->addWidget(mHLabel, 1, 1);
mGrid->addWidget(mSLabel, 2, 1);
mGrid->addWidget(mVLabel, 3, 1);
mGrid->addMultiCellWidget(mHSlider, 1, 1, 2, 3);
mGrid->addMultiCellWidget(mSSlider, 2, 2, 2, 3);
mGrid->addMultiCellWidget(mVSlider, 3, 3, 2, 3);
mGrid->addWidget(mHIn, 1, 4);
mGrid->addWidget(mSIn, 2, 4);
mGrid->addWidget(mVIn, 3, 4);
connect(mColorPatch, TQ_SIGNAL(colorChanged(const TQColor &)), this, TQ_SLOT(slotPatchChanged(const TQColor &)));
/* connect color sliders */
connect(mHSlider, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotHSliderChanged(int)));
connect(mSSlider, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotSSliderChanged(int)));
connect(mVSlider, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotVSliderChanged(int)));
/* connect spin box */
connect(mHIn, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotHInChanged(int)));
connect(mSIn, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotSInChanged(int)));
connect(mVIn, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotVInChanged(int)));
}
void HSVWidget::slotRefreshColor()
{
int h = mColor.H();
int s = mColor.S();
int v = mColor.V();
mHSlider->slotSetColor1(KoColor(0, s, v, KoColor::csHSV).color());
mHSlider->slotSetColor2(KoColor(359, s, v, KoColor::csHSV).color());
mHSlider->slotSetValue(h);
mHIn->setValue(h);
mSSlider->slotSetColor1(KoColor(h, 0, v, KoColor::csHSV).color());
mSSlider->slotSetColor2(KoColor(h, 255, v, KoColor::csHSV).color());
mSSlider->slotSetValue(s);
mSIn->setValue(s);
mVSlider->slotSetColor1(KoColor(h, s, 0, KoColor::csHSV).color());
mVSlider->slotSetColor2(KoColor(h, s, 255, KoColor::csHSV).color());
mVSlider->slotSetValue(v);
mVIn->setValue(v);
mColorPatch -> setColor(mColor.color());
}
void HSVWidget::slotHSliderChanged(int h)
{
int v = mColor.V();
int s = mColor.S();
mColor.setHSV(h, s, v);
slotRefreshColor();
emit colorChanged(mColor);
}
void HSVWidget::slotSSliderChanged(int s)
{
int h = mColor.H();
int v = mColor.V();
mColor.setHSV(h, s, v);
slotRefreshColor();
emit colorChanged(mColor);
}
void HSVWidget::slotVSliderChanged(int v)
{
int h = mColor.H();
int s = mColor.S();
mColor.setHSV(h, s, v);
slotRefreshColor();
emit colorChanged(mColor);
}
void HSVWidget::slotHInChanged(int h)
{
int s = mColor.S();
int v = mColor.V();
mColor.setHSV(h, s, v);
slotRefreshColor();
emit colorChanged(mColor);
}
void HSVWidget::slotSInChanged(int s)
{
int h = mColor.H();
int v = mColor.V();
mColor.setHSV(h, s, v);
slotRefreshColor();
emit colorChanged(mColor);
}
void HSVWidget::slotVInChanged(int v)
{
int h = mColor.H();
int s = mColor.S();
mColor.setHSV(h, s, v);
slotRefreshColor();
emit colorChanged(mColor);
}
void HSVWidget::slotPatchChanged(const TQColor& clr)
{
int r = clr.red();
int g = clr.green();
int b = clr.blue();
mColor.setRGB(r, g, b);
slotRefreshColor();
emit colorChanged(mColor);
}
/* GreyWidget */
GreyWidget::GreyWidget(TQWidget *parent): ColorWidget(parent)
{
TQGridLayout *mGrid = new TQGridLayout(this, 3, 3);
mColorPatch = new KColorPatch(this);
/* setup slider */
mVSlider = new KoColorSlider(this);
mVSlider->setMaximumHeight(20);
mVSlider->slotSetRange(0, 255);
mVSlider->slotSetColor1(TQColor(255, 255, 255));
mVSlider->slotSetColor2(TQColor(0, 0, 0));
/* setup slider label */
mVLabel = new TQLabel("K", this);
mVLabel->setFixedWidth(18);
mVLabel->setFixedHeight(20);
/* setup spin box */
mVIn = new TQSpinBox(0, 255, 1, this);
mVIn->setFixedWidth(42);
mVIn->setFixedHeight(20);
mGrid->addMultiCellWidget(mColorPatch, 0, 4, 0, 0);
mGrid->addWidget(mVLabel, 1, 1);
mGrid->addMultiCellWidget(mVSlider, 1, 1, 2, 3);
mGrid->addWidget(mVIn, 1, 4);
connect(mColorPatch, TQ_SIGNAL(colorChanged(const TQColor &)), this, TQ_SLOT(slotPatchChanged(const TQColor &)));
/* connect color slider */
connect(mVSlider, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotVSliderChanged(int)));
/* connect spin box */
connect(mVIn, TQ_SIGNAL(valueChanged(int)), mVSlider, TQ_SLOT(slotSetValue(int)));
}
void GreyWidget::slotRefreshColor()
{
double v = mColor.R() + mColor.G() + mColor.B();
v /= 3.0;
v = 255.0 - v;
mVIn->setValue(static_cast<int>(v));
mVSlider->slotSetValue(static_cast<int>(v));
mColorPatch -> setColor(mColor.color());
}
void GreyWidget::slotVSliderChanged(int v)
{
v = 255 - v;
mColor.setRGB(v, v, v);
slotRefreshColor();
emit colorChanged(mColor);
}
void GreyWidget::slotVInChanged(int v)
{
v = 255 - v;
mColor.setRGB(v, v, v);
slotRefreshColor();
emit colorChanged(mColor);
}
void GreyWidget::slotPatchChanged(const TQColor& clr)
{
int gray = tqGray(clr.red(), clr.green(), clr.blue());
mColor.setRGB(gray, gray, gray);
slotRefreshColor();
emit colorChanged(mColor);
}
LABWidget::LABWidget(TQWidget *parent) : ColorWidget(parent)
{
TQGridLayout *mGrid = new TQGridLayout(this, 4, 5);
mColorPatch = new KColorPatch(this);
/* setup color sliders */
mLSlider = new KoColorSlider(this);
mLSlider->setMaximumHeight(20);
mLSlider->slotSetRange(0, 255);
mASlider = new KoColorSlider(this);
mASlider->setMaximumHeight(20);
mASlider->slotSetRange(0, 255);
mBSlider = new KoColorSlider(this);
mBSlider->setMaximumHeight(20);
mBSlider->slotSetRange(0, 255);
/* setup slider labels */
mLLabel = new TQLabel("L", this);
mLLabel->setFixedWidth(16);
mLLabel->setFixedHeight(20);
mALabel = new TQLabel("A", this);
mALabel->setFixedWidth(16);
mALabel->setFixedHeight(20);
mBLabel = new TQLabel("B", this);
mBLabel->setFixedWidth(16);
mBLabel->setFixedHeight(20);
/* setup spin box */
mLIn = new TQSpinBox(0, 255, 1, this);
mLIn->setFixedWidth(42);
mLIn->setFixedHeight(20);
mAIn = new TQSpinBox(0, 255, 1, this);
mAIn->setFixedWidth(42);
mAIn->setFixedHeight(20);
mBIn = new TQSpinBox(0, 255, 1, this);
mBIn->setFixedWidth(42);
mBIn->setFixedHeight(20);
mGrid->addMultiCellWidget(mColorPatch, 0, 4, 0, 0);
mGrid->addWidget(mLLabel, 1, 1);
mGrid->addWidget(mALabel, 2, 1);
mGrid->addWidget(mBLabel, 3, 1);
mGrid->addMultiCellWidget(mLSlider, 1, 1, 2, 3);
mGrid->addMultiCellWidget(mASlider, 2, 2, 2, 3);
mGrid->addMultiCellWidget(mBSlider, 3, 3, 2, 3);
mGrid->addWidget(mLIn, 1, 4);
mGrid->addWidget(mAIn, 2, 4);
mGrid->addWidget(mBIn, 3, 4);
connect(mColorPatch, TQ_SIGNAL(colorChanged(const TQColor &)), this, TQ_SLOT(slotPatchChanged(const TQColor &)));
/* connect color sliders */
connect(mLSlider, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotLSliderChanged(int)));
connect(mASlider, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotASliderChanged(int)));
connect(mBSlider, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotBSliderChanged(int)));
/* connect spin box */
connect(mLIn, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotLInChanged(int)));
connect(mAIn, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotAInChanged(int)));
connect(mBIn, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotBInChanged(int)));
}
void LABWidget::slotRefreshColor()
{
int l = mColor.L();
int a = mColor.a();
int b = mColor.b();
mLSlider->slotSetColor1(KoColor(0, a, b, KoColor::csLab).color());
mLSlider->slotSetColor2(KoColor(255, a, b, KoColor::csLab).color());
mLSlider->slotSetValue(l);
mLIn->setValue(l);
mASlider->slotSetColor1(KoColor(l, 0, b, KoColor::csLab).color());
mASlider->slotSetColor2(KoColor(l, 255, b, KoColor::csLab).color());
mASlider->slotSetValue(a);
mAIn->setValue(a);
mBSlider->slotSetColor1(KoColor(l, a, 0, KoColor::csLab).color());
mBSlider->slotSetColor2(KoColor(l, a, 255, KoColor::csLab).color());
mBSlider->slotSetValue(b);
mBIn->setValue(b);
mColorPatch -> setColor(mColor.color());
}
void LABWidget::slotLSliderChanged(int l)
{
int a = mColor.a();
int b = mColor.b();
mColor.setLab(l, a, b);
slotRefreshColor();
emit colorChanged(mColor);
}
void LABWidget::slotASliderChanged(int a)
{
int l = mColor.L();
int b = mColor.b();
mColor.setLab(l, a, b);
slotRefreshColor();
emit colorChanged(mColor);
}
void LABWidget::slotBSliderChanged(int b)
{
int l = mColor.L();
int a = mColor.a();
mColor.setLab(l, a, b);
slotRefreshColor();
emit colorChanged(mColor);
}
void LABWidget::slotLInChanged(int l)
{
int a = mColor.a();
int b = mColor.b();
mColor.setLab(l, a, b);
slotRefreshColor();
emit colorChanged(mColor);
}
void LABWidget::slotAInChanged(int a)
{
int l = mColor.L();
int b = mColor.b();
mColor.setLab(l, a, b);
slotRefreshColor();
emit colorChanged(mColor);
}
void LABWidget::slotBInChanged(int b)
{
int l = mColor.L();
int a = mColor.a();
mColor.setLab(l, a, b);
slotRefreshColor();
emit colorChanged(mColor);
}
void LABWidget::slotPatchChanged(const TQColor& clr)
{
int r = clr.red();
int g = clr.green();
int b = clr.blue();
mColor.setRGB(r, g, b);
slotRefreshColor();
emit colorChanged(mColor);
}
#include "koColorChooser.moc"