summaryrefslogtreecommitdiffstats
path: root/config/colordialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'config/colordialog.cpp')
-rw-r--r--config/colordialog.cpp300
1 files changed, 300 insertions, 0 deletions
diff --git a/config/colordialog.cpp b/config/colordialog.cpp
new file mode 100644
index 0000000..3466082
--- /dev/null
+++ b/config/colordialog.cpp
@@ -0,0 +1,300 @@
+#include "colordialog.h"
+#include <qlabel.h>
+#include <qdir.h>
+#include <qcombobox.h>
+#include <qlayout.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qpushbutton.h>
+#include <qstyle.h>
+#include <kglobal.h>
+#include <kglobalsettings.h>
+#include <kcolordialog.h>
+#include <kiconloader.h>
+#include "colorpicker.h"
+#include "pixmaps.h"
+
+#include "config.h"
+
+#ifndef CLAMP
+#define CLAMP(x,l,u) x < l ? l :\
+x > u ? u :\
+x
+#endif
+
+#define SATURATION_COLOR2(S,R,G,B) \
+int max = (int)(255+0.65*(100-S)); \
+destR = CLAMP((srcR + R - 128), 0, max); \
+destG = CLAMP((srcG + G - 128), 0, max); \
+destB = CLAMP((srcB + B - 128), 0, max); \
+destR = (S*destR + (100-S)*R)/100; \
+destG = (S*destG + (100-S)*G)/100; \
+destB = (S*destB + (100-S)*B)/100;
+
+#define COLOR_SPACE(R,G,B) \
+if ( R < 0 ) R = 0; else if ( R > 255 ) R = 255; \
+if ( G < 0 ) G = 0; else if ( G > 255 ) G = 255; \
+if ( B < 0 ) B = 0; else if ( B > 255 ) B = 255;
+
+ColorDialog::ColorDialog(QWidget* parent, const char* name) : QDialog( parent, name)
+{
+ QVBoxLayout *vertical = new QVBoxLayout(this);
+ QHBoxLayout *top = new QHBoxLayout(vertical);
+ demo = new DemoWindow(this);
+ top->addWidget(demo);
+ QVBoxLayout *topRight = new QVBoxLayout(top);
+ QLabel *info = new QLabel("<qt>Select custom colors or grab directly from screen.<br>Click image left to switch between items.</qt>",this);
+ topRight->addWidget(info);
+ QIconSet icon = KGlobal::iconLoader()->loadIconSet("colorpicker", KIcon::Small);
+ buttonCP = new QPushButton(icon, QString::null, this);
+ topRight->addWidget(buttonCP);
+ QLabel *lb = new QLabel("From other app:",this);
+ topRight->addWidget(lb);
+ other = new QComboBox(this);
+ topRight->addWidget(other);
+ topRight->addStretch();
+ buttonOk = new QPushButton("&Ok", this);
+ topRight->addWidget(buttonOk);
+ buttonCancel = new QPushButton("&Cancel", this);
+ topRight->addWidget(buttonCancel);
+ const char *title[NUMCOLORS] = {"Background", "Button", "Base", "Text", "Highlight", "Highlighted Text", "Button Text", "Alternate Background"};
+ for (int i = 0; i < NUMCOLORS; i++)
+ {
+ picker[i] = new ColorPicker(this, title[i]);
+ vertical->addWidget(picker[i]);
+ connect (picker[i], SIGNAL(colorChanged(QColor)), demo, SLOT(smartRepaint()));
+ picker[i]->hide();
+ }
+ for (int i = 0; i < NUMCOLORS; i++)
+ picker[i]->blockSignals(true);
+ picker[Back]->setColor(colorGroup().background());
+ picker[Button]->setColor(colorGroup().button());
+ picker[Base]->setColor(colorGroup().base());
+ picker[Text]->setColor(colorGroup().text());
+ picker[High]->setColor(colorGroup().highlight());
+ picker[HighText]->setColor(colorGroup().highlightedText());
+ picker[ButText]->setColor(colorGroup().buttonText ());
+ picker[Alternate]->setColor(KGlobalSettings::alternateBackgroundColor());
+ for (int i = 0; i < NUMCOLORS; i++)
+ picker[i]->blockSignals(false);
+// demo->repaint(false);
+
+ picker[Button]->show();
+ connect (buttonOk, SIGNAL(clicked()), this, SLOT(close()));
+ connect (buttonCP, SIGNAL(clicked()), this, SLOT(grabColor()));
+ connect (buttonCancel, SIGNAL(clicked()), this, SLOT(close()));
+ connect (other, SIGNAL(activated (const QString &)), this, SLOT(getFromOther(const QString &)));
+}
+
+ColorDialog::~ColorDialog()
+{
+}
+
+void ColorDialog::show()
+{
+ other->clear();
+ QDir d( QDir::homeDirPath() + "/.baghira", 0L, QDir::Name | QDir::IgnoreCase, QDir::Files | QDir::Readable | QDir::Writable );
+ if (d.exists())
+ {
+ for ( uint i = 0; i < d.count(); i++ )
+ other->insertItem(d[i]);
+ }
+ QDialog::show();
+ demo->show();
+// demo->repaint(false);
+}
+
+void ColorDialog::getFromOther( const QString & string )
+{
+ FILE *file = NULL;
+ QString tmpString = QDir::homeDirPath() + "/.baghira/" + string;
+ if( (file = fopen(tmpString.latin1(), "r")) != NULL )
+ {
+ uint k;
+ int colors[NUMCOLORS];
+ for (int i = 0; i < NUMCOLORS; i++)
+ colors[i] = -1;
+ fscanf(file,"%u\n%u\n%u\n%u\n%u\n%u\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n",&k,&k,&k,&k,&k,&k,&colors[0],&colors[1],&colors[2],&colors[3],&colors[4],&colors[5],&colors[6],&colors[7]);
+ fclose(file);
+ for (int i = 0; i < NUMCOLORS; i++)
+ {
+ picker[i]->blockSignals(true);
+ if (colors[i] != -1) picker[i]->setColor(QColor(colors[i]));
+ picker[i]->blockSignals(false);
+ }
+ demo->repaint(false);
+ }
+}
+
+void ColorDialog::grabColor()
+{
+ gettingColorFromScreen = true;
+ grabMouse(crossCursor);
+ grabKeyboard();
+}
+
+void ColorDialog::mouseReleaseEvent(QMouseEvent* me)
+{
+ if (gettingColorFromScreen)
+ {
+ gettingColorFromScreen = false;
+ releaseMouse();
+ releaseKeyboard();
+ for (int i = 0; i < NUMCOLORS; i++)
+ {
+ if (picker[i]->isShown())
+ {
+ picker[i]->setColor(KColorDialog::grabColor(me->globalPos()));
+ break;
+ }
+ }
+ }
+ else
+ QDialog::mouseReleaseEvent(me);
+}
+
+//extern QImage uic_findiImage(const QString& name);
+//extern void qInitImages_baghira();
+//extern void qCleanupImages_baghira();
+
+
+DemoWindow::DemoWindow( ColorDialog* parent, const char* name) : QWidget(parent, name)
+{
+ setBackgroundMode ( Qt::NoBackground );
+ colorDialog_ = parent;
+ setFixedSize(320,120);
+ pm = new QPixmap(320,120);
+ pp = new QPainter();
+ p = new QPainter();
+ (const_cast<QFont*>(&p->font()))->setPixelSize(16);
+ baseRect = QRect(20, 10, 200, 100);
+ buttonRect = QRect(230, 90, 37, 21);
+ buttonTextRect = QRect(236, 91, 20, 18);
+ highlightRect = QRect(21, 42, 198, 22);
+ textRect = QRect(25, 21, 100, 18);
+ highTextRect = QRect(25, 42, 120, 22);
+ alternateRect = QRect(21, 86, 198, 22);
+ baseImage = uic_findImage("button-base");
+ dest = QImage( baseImage.width(), baseImage.height(), 32 );
+ dest.setAlphaBuffer( true );
+}
+
+DemoWindow::~DemoWindow(){}
+
+void DemoWindow::mousePressEvent ( QMouseEvent * me )
+{
+ for (int i = 0; i < NUMCOLORS; i++)
+ colorDialog_->picker[i]->hide();
+
+ if (buttonTextRect.contains(me->pos()))
+ colorDialog_->picker[ButText]->show();
+ else if (buttonRect.contains(me->pos()))
+ colorDialog_->picker[Button]->show();
+ else if (textRect.contains(me->pos()))
+ colorDialog_->picker[Text]->show();
+ else if (highTextRect.contains(me->pos()))
+ colorDialog_->picker[HighText]->show();
+ else if (highlightRect.contains(me->pos()))
+ colorDialog_->picker[High]->show();
+ else if (alternateRect.contains(me->pos()))
+ colorDialog_->picker[Alternate]->show();
+ else if (baseRect.contains(me->pos()))
+ colorDialog_->picker[Base]->show();
+ else
+ colorDialog_->picker[Back]->show();
+}
+
+void DemoWindow::paintEvent ( QPaintEvent * )
+{
+ pp->begin(pm);
+ pp->fillRect(0,0,pm->width(),pm->height(), colorDialog_->picker[Back]->color());
+ style().drawPrimitive( QStyle::PE_PanelLineEdit, pp, rect(), colorGroup() );
+ pp->fillRect(baseRect, colorDialog_->picker[Base]->color());
+ pp->fillRect(highlightRect, colorDialog_->picker[High]->color());
+ pp->fillRect(alternateRect, colorDialog_->picker[Alternate]->color());
+ pp->setPen ( colorDialog_->picker[Text]->color() );
+ pp->drawText ( textRect, Qt::AlignAuto | Qt::AlignVCenter, "Common Text");
+ pp->drawText ( alternateRect, Qt::AlignAuto | Qt::AlignVCenter, "Alt. Background");
+ pp->setPen ( colorDialog_->picker[HighText]->color() );
+ pp->drawText ( highTextRect, Qt::AlignAuto | Qt::AlignVCenter, "Highlighted Text");
+ pp->drawPixmap(buttonRect, tintButton(baseImage, colorDialog_->picker[Button]->color()));
+ pp->setPen ( colorDialog_->picker[ButText]->color() );
+ pp->drawText ( buttonTextRect, Qt::AlignCenter, "B");
+ style().drawPrimitive( QStyle::PE_PanelLineEdit, pp, baseRect, colorGroup());
+ pp->end();
+ p->begin(this);
+ p->drawPixmap(0,0, *pm);
+ p->end();
+}
+
+void DemoWindow::smartRepaint()
+{
+ if (colorDialog_->picker[Back]->isShown())
+ {
+ QWidget::repaint(false);
+ return;
+ }
+ if (colorDialog_->picker[Button]->isShown())
+ {
+ QWidget::repaint(buttonRect, false);
+ return;
+ }
+ if (colorDialog_->picker[Base]->isShown())
+ {
+ QWidget::repaint(false);
+ return;
+ }
+ if (colorDialog_->picker[Text]->isShown())
+ {
+ QWidget::repaint(textRect, false);
+ return;
+ }
+ if (colorDialog_->picker[High]->isShown())
+ {
+ QWidget::repaint(highlightRect, false);
+ return;
+ }
+ if (colorDialog_->picker[HighText]->isShown())
+ {
+ QWidget::repaint(highTextRect, false);
+ return;
+ }
+ if (colorDialog_->picker[Alternate]->isShown())
+ {
+ QWidget::repaint(alternateRect, false);
+ return;
+ }
+ if (colorDialog_->picker[ButText]->isShown())
+ {
+ QWidget::repaint(buttonTextRect, false);
+ return;
+ }
+}
+
+QImage & DemoWindow::tintButton(QImage &src, QColor & c)
+{
+// dest = QImage( src.width(), src.height(), 32, 0, _ENDIAN_ );
+ unsigned int *data = ( unsigned int * ) src.bits();
+ unsigned int *destData = ( unsigned int* ) dest.bits();
+ int total = src.width() * src.height();
+ int red, green, blue;
+ int destR, destG, destB, alpha;
+ int srcR = c.red();
+ int srcG = c.green();
+ int srcB = c.blue();
+ int hue, s, v;
+ c.getHsv( &hue, &s, &v );
+ int sq = CLAMP((int)((45.0/128.0)*s+55),0,100);
+ // float srcPercent, destPercent;
+ for ( int current = 0 ; current < total ; ++current ) {
+ alpha = qAlpha( data[ current ] );
+ blue = qBlue( data[ current ] );
+ red = qRed( data[ current ] );
+ green = qGreen( data[ current ] );
+ SATURATION_COLOR2(sq, red, green, blue);
+ // force back to valid colorspace !
+ COLOR_SPACE(destR, destG, destB);
+ destData[ current ] = qRgba( destR, destG, destB, alpha );
+ }
+ return ( dest );
+}