/* 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 #include #include #include #include #include #include #include #include #include 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(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(v)); mVSlider->slotSetValue(static_cast(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"