From 2ca0005bfda1c2eb1bb4bcd6b0abe5382f0979f1 Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Tue, 28 Jul 2009 01:34:59 +0200 Subject: [PATCH] Revamp ColorButton Rather than requiring parent widgets using this to connect all sorts of signals and show the color selection dialog themselves, move this into ColorButton itself, making it a self-sufficient widget. Also, we're now using the Qt property system, and emit a colorChanged() signal. Oh, and we inherit from QToolButton now, which seems to be a saner choice on MacOSX and also allows for nicer layouts on all platforms. Yes, we'll try and improve the looks later on, right now it's just a crude QPixmap overlaying the button. --- src/uisupport/colorbutton.cpp | 53 +++++++++++++++-------------------- src/uisupport/colorbutton.h | 28 ++++++++++-------- 2 files changed, 40 insertions(+), 41 deletions(-) diff --git a/src/uisupport/colorbutton.cpp b/src/uisupport/colorbutton.cpp index 3b521339..15e9de47 100644 --- a/src/uisupport/colorbutton.cpp +++ b/src/uisupport/colorbutton.cpp @@ -24,46 +24,39 @@ #include #include -ColorButton::ColorButton(QWidget *parent) : QPushButton(parent) { - +#ifdef HAVE_KDE +# include +#else +# include +#endif + +ColorButton::ColorButton(QWidget *parent) : QToolButton(parent) { + setText(""); + connect(this, SIGNAL(clicked()), SLOT(chooseColor())); } void ColorButton::setColor(const QColor &color) { _color = color; - update(); + QPixmap pixmap(QSize(32,32)); + pixmap.fill(color); + setIcon(pixmap); + + emit colorChanged(color); } QColor ColorButton::color() const { return _color; } -/* This has been heavily inspired by KDE's KColorButton, thanks! */ -void ColorButton::paintEvent(QPaintEvent *) { - QPainter painter(this); - - QStyleOptionButton opt; - initStyleOption(&opt); - opt.state |= isDown() ? QStyle::State_Sunken : QStyle::State_Raised; - opt.features = QStyleOptionButton::None; - if(isDefault()) - opt.features |= QStyleOptionButton::DefaultButton; +void ColorButton::chooseColor() { +#ifdef HAVE_KDE + QColor c; + KColorDialog::getColor(c, this); +#else + QColor c = QColorDialog::getColor(color(), this); +#endif - // Draw bevel - style()->drawControl(QStyle::CE_PushButtonBevel, &opt, &painter, this); - - // Calc geometry - QRect labelRect = style()->subElementRect(QStyle::SE_PushButtonContents, &opt, this); - int shift = style()->pixelMetric(QStyle::PM_ButtonMargin); - labelRect.adjust(shift, shift, -shift, -shift); - int x, y, w, h; - labelRect.getRect(&x, &y, &w, &h); - - if(isChecked() || isDown()) { - x += style()->pixelMetric(QStyle::PM_ButtonShiftHorizontal); - y += style()->pixelMetric(QStyle::PM_ButtonShiftVertical); + if(c.isValid()) { + setColor(c); } - - // Draw color rect - QBrush brush = isEnabled() ? color() : palette().color(backgroundRole()); - qDrawShadePanel(&painter, x, y, w, h, palette(), true, 1, &brush); } diff --git a/src/uisupport/colorbutton.h b/src/uisupport/colorbutton.h index 9b941c50..0c9309fc 100644 --- a/src/uisupport/colorbutton.h +++ b/src/uisupport/colorbutton.h @@ -21,24 +21,30 @@ #ifndef COLORBUTTON_H_ #define COLORBUTTON_H_ -#include +#include -class ColorButton : public QPushButton { +class ColorButton : public QToolButton { Q_OBJECT Q_PROPERTY(QColor color READ color WRITE setColor USER true) - public: - explicit ColorButton(QWidget *parent = 0); - explicit ColorButton(const QColor &c, QWidget *parent = 0); +public: + explicit ColorButton(QWidget *parent = 0); + explicit ColorButton(const QColor &c, QWidget *parent = 0); - void setColor(const QColor &color); - QColor color() const; + void setColor(const QColor &color); + QColor color() const; - protected: - void paintEvent(QPaintEvent *event); +signals: + void colorChanged(const QColor &); - private: - QColor _color; +protected: + //void paintEvent(QPaintEvent *event); + +private slots: + void chooseColor(); + +private: + QColor _color; }; #endif -- 2.20.1