summaryrefslogtreecommitdiffstats
path: root/kcoloredit/gradientselection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kcoloredit/gradientselection.cpp')
-rw-r--r--kcoloredit/gradientselection.cpp252
1 files changed, 252 insertions, 0 deletions
diff --git a/kcoloredit/gradientselection.cpp b/kcoloredit/gradientselection.cpp
new file mode 100644
index 00000000..a8927c7d
--- /dev/null
+++ b/kcoloredit/gradientselection.cpp
@@ -0,0 +1,252 @@
+/***************************************************************************
+ gradientselection.cpp - description
+ -------------------
+ begin : Wed Jul 12 2000
+ copyright : (C) 2000 by Artur Rataj
+ email : art@zeus.polsl.gliwice.pl
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <qlayout.h>
+#include <qframe.h>
+#include <qradiobutton.h>
+#include <qcolor.h>
+#include <klocale.h>
+
+#include "main.h"
+#include "gradientselection.h"
+
+GradientSelection::GradientSelection(QWidget *parent, const char *name ) : QWidget(parent,name) {
+ QGridLayout* topLayout = new QGridLayout(this, 2, 2, 0);
+ QHBoxLayout* layout = new QHBoxLayout(0);
+ layout->setMargin(3);
+ xyColorSelector = new KXYColorSelector(this);
+ connect(xyColorSelector, SIGNAL( valueChanged(int, int) ),
+ SLOT( slotXyColorSelectorPosChanged(int, int) ));
+ layout->addWidget(xyColorSelector);
+ topLayout->addLayout(layout, 0, 0);
+ topLayout->setRowStretch(0, 10);
+ topLayout->setRowStretch(1, 0);
+ QVBoxLayout* xyColorSelectorLayout = new QVBoxLayout();
+ QHBoxLayout* checkBoxLayout = new QHBoxLayout();
+ checkBoxLayout->setMargin(0);
+ variableCheckBox = new QCheckBox(i18n( "Variable" ), this);
+ variableGlobalComponent = false;
+ connect(variableCheckBox, SIGNAL( toggled(bool) ), SLOT( slotSetVariableGlobalComponent(bool) ));
+ checkBoxLayout->addSpacing(2);
+ checkBoxLayout->addWidget(variableCheckBox);
+ xyColorSelectorLayout->addLayout(checkBoxLayout);
+ xyColorSelectorLayout->addStretch(10);
+ QHBoxLayout* buttonsLayout = new QHBoxLayout();
+ synchronizeColorButton = new QPushButton(i18n( "Synchronize" ), this);
+ connect(synchronizeColorButton, SIGNAL( clicked() ), SLOT( slotSynchronizeColor() ));
+ buttonsLayout->addSpacing(2);
+ buttonsLayout->addWidget(synchronizeColorButton);
+ buttonsLayout->addStretch(10);
+ xyColorSelectorLayout->addLayout(buttonsLayout);
+ xyColorSelectorLayout->addSpacing(2);
+ topLayout->addLayout(xyColorSelectorLayout, 1, 0);
+ zColorSelector = new KZColorSelector(KZColorSelector::Vertical, this);
+ connect(zColorSelector, SIGNAL( valueChanged(int) ),
+ SLOT( slotZColorSelectorPosChanged(int) ));
+ zColorSelector->setFixedWidth(36);
+ topLayout->addWidget(zColorSelector, 0, 1);
+ QVBoxLayout* zColorSelectorLayout = new QVBoxLayout(0);
+ connect(&hsvButtons, SIGNAL( clicked(int) ), SLOT( slotSetColorSelectionMode(int) ));
+ QRadioButton* hRadioButton = new QRadioButton("H", this);
+ hsvButtons.insert(hRadioButton, H_COMPONENT);
+ zColorSelectorLayout->addWidget(hRadioButton);
+ QRadioButton* sRadioButton = new QRadioButton("S", this);
+ hsvButtons.insert(sRadioButton, S_COMPONENT);
+ zColorSelectorLayout->addWidget(sRadioButton);
+ QRadioButton* vRadioButton = new QRadioButton("V", this);
+ hsvButtons.insert(vRadioButton, V_COMPONENT);
+ vRadioButton->toggle();
+ zColorSelectorLayout->addWidget(vRadioButton);
+ topLayout->addLayout(zColorSelectorLayout, 1, 1);
+ color.setComponents(RGB_MAX_COMPONENT_VALUE, RGB_MAX_COMPONENT_VALUE, RGB_MAX_COMPONENT_VALUE);
+ hComponent = -1;
+ sComponent = 0;
+ vComponent = HSV_MAX_V_VALUE;
+ slotIgnoreSetValue(false);
+ slotSetColorSelectionMode(V_COMPONENT);
+}
+GradientSelection::~GradientSelection(){
+}
+
+void GradientSelection::slotSetValue(Color* color) {
+ if(!ignoreSetValue && !color->equals( this->color )) {
+ this->color = *color;
+ int newHComponent;
+ int newSComponent;
+ int newVComponent;
+ QColor hsvColor(this->color.component(Color::RED_INDEX),
+ this->color.component(Color::GREEN_INDEX),
+ this->color.component(Color::BLUE_INDEX));
+ hsvColor.hsv(&newHComponent, &newSComponent, &newVComponent);
+ hComponent = newHComponent;
+ sComponent = newSComponent;
+ vComponent = newVComponent;
+ updateXyColorSelector(false);
+ updateZColorSelector();
+ }
+}
+
+void GradientSelection::slotIgnoreSetValue(bool ignore) {
+ ignoreSetValue = ignore;
+}
+
+void GradientSelection::updateXyColorSelector(const bool modeChanged) {
+ int xPos;
+ int yPos;
+ int component;
+ switch(zColorSelectorComponentIndex) {
+ case H_COMPONENT:
+ xPos = (int)(vComponent*( KXYColorSelector::COMPONENT_SELECTION_RESOLUTION - 1 )/
+ HSV_MAX_V_VALUE + 0.5);
+ yPos = (int)(sComponent*( KXYColorSelector::COMPONENT_SELECTION_RESOLUTION - 1 )/
+ HSV_MAX_S_VALUE + 0.5);
+ component = hComponent;
+ break;
+
+ case S_COMPONENT:
+ xPos = (int)(hComponent*( KXYColorSelector::COMPONENT_SELECTION_RESOLUTION - 1 )/
+ HSV_MAX_H_VALUE + 0.5);
+ yPos = (int)(vComponent*( KXYColorSelector::COMPONENT_SELECTION_RESOLUTION - 1 )/
+ HSV_MAX_V_VALUE + 0.5);
+ if(variableGlobalComponent)
+ component = sComponent;
+ else
+ component = 240;
+ break;
+
+ case V_COMPONENT:
+ xPos = (int)(hComponent*( KXYColorSelector::COMPONENT_SELECTION_RESOLUTION - 1 )/
+ HSV_MAX_H_VALUE + 0.5);
+ yPos = (int)(sComponent*( KXYColorSelector::COMPONENT_SELECTION_RESOLUTION - 1 )/
+ HSV_MAX_S_VALUE + 0.5);
+ if(variableGlobalComponent)
+ component = vComponent;
+ else
+ component = 192;
+ break;
+
+ default:
+ xPos = 0;
+ yPos = 0;
+ component = 0;
+ break;
+
+ }
+ if(xPos < 0)
+ xPos = 0;
+ if(yPos < 0)
+ yPos = 0;
+ if(modeChanged || xyColorSelector->globalComponent() != component) {
+ xyColorSelector->setGlobalComponent(component);
+ xyColorSelector->updateContents();
+ }
+ xyColorSelector->setValues(xPos, yPos);
+}
+
+void GradientSelection::updateZColorSelector() {
+ zColorSelector->setBaseColorHsv(hComponent, sComponent, vComponent);
+ zColorSelector->updatePointerPos();
+ zColorSelector->updateContents();
+}
+
+void GradientSelection::slotSetColorSelectionMode(int mode) {
+ zColorSelectorComponentIndex = mode;
+ xyColorSelector->setType(zColorSelectorComponentIndex);
+ updateXyColorSelector(true);
+ switch(zColorSelectorComponentIndex) {
+ case H_COMPONENT:
+ zColorSelector->setType(KZColorSelector::TYPE_H);
+ variableCheckBox->setEnabled(false);
+ break;
+
+ case S_COMPONENT:
+ zColorSelector->setType(KZColorSelector::TYPE_S);
+ variableCheckBox->setEnabled(true);
+ break;
+
+ case V_COMPONENT:
+ zColorSelector->setType(KZColorSelector::TYPE_V);
+ variableCheckBox->setEnabled(true);
+ break;
+
+ }
+ updateZColorSelector();
+}
+
+void GradientSelection::slotSetVariableGlobalComponent(bool variable) {
+ variableGlobalComponent = variable;
+ updateXyColorSelector(false);
+}
+
+void GradientSelection::slotXyColorSelectorPosChanged(int x, int y) {
+ switch(zColorSelectorComponentIndex) {
+ case H_COMPONENT:
+ vComponent = (int)(x*1.0*HSV_MAX_V_VALUE/( KXYColorSelector::COMPONENT_SELECTION_RESOLUTION - 1 ) + 0.5);
+ sComponent = (int)(y*1.0*HSV_MAX_S_VALUE/( KXYColorSelector::COMPONENT_SELECTION_RESOLUTION - 1 ) + 0.5);
+ break;
+
+ case S_COMPONENT:
+ hComponent = (int)(x*1.0*HSV_MAX_H_VALUE/( KXYColorSelector::COMPONENT_SELECTION_RESOLUTION - 1 ) + 0.5);
+ vComponent = (int)(y*1.0*HSV_MAX_V_VALUE/( KXYColorSelector::COMPONENT_SELECTION_RESOLUTION - 1 ) + 0.5);
+ break;
+
+ case V_COMPONENT:
+ hComponent = (int)(x*1.0*HSV_MAX_H_VALUE/( KXYColorSelector::COMPONENT_SELECTION_RESOLUTION - 1 ) + 0.5);
+ sComponent = (int)(y*1.0*HSV_MAX_S_VALUE/( KXYColorSelector::COMPONENT_SELECTION_RESOLUTION - 1 ) + 0.5);
+ break;
+
+ }
+ QColor rgbColor;
+ rgbColor.setHsv(hComponent, sComponent, vComponent);
+ color.setComponents(rgbColor.red(), rgbColor.green(), rgbColor.blue());
+ updateZColorSelector();
+ emit valueChanged(&color);
+}
+
+void GradientSelection::slotZColorSelectorPosChanged(int y) {
+ bool repaintZColorSelector = false;
+ switch(zColorSelectorComponentIndex) {
+ case H_COMPONENT:
+ hComponent = y;
+ break;
+
+ case S_COMPONENT:
+ sComponent = y;
+ break;
+
+ case V_COMPONENT:
+ vComponent = y;
+ break;
+
+ }
+ QColor rgbColor;
+ rgbColor.setHsv(hComponent, sComponent, vComponent);
+ color.setComponents(rgbColor.red(), rgbColor.green(), rgbColor.blue());
+ updateXyColorSelector(false);
+ if(repaintZColorSelector)
+ updateZColorSelector();
+ emit valueChanged(&color);
+}
+
+void GradientSelection::slotSynchronizeColor() {
+ emit synchronizeColor();
+}
+
+void GradientSelection::enableSynchronizeColorButton(bool enable) {
+ synchronizeColorButton->setEnabled(enable);
+}
+#include "gradientselection.moc"