00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
#include "kdualcolorbutton.h"
00020
#include "kcolordialog.h"
00021
#include "kcolordrag.h"
00022
#include "dcolorarrow.xbm"
00023
#include "dcolorreset.xpm"
00024
#include <kglobalsettings.h>
00025
#include <qpainter.h>
00026
#include <qbitmap.h>
00027
#include <qdrawutil.h>
00028
00029
class KDualColorButton::KDualColorPrivate
00030 {
00031
public:
00032
QWidget* dialogParent;
00033 };
00034
00035 KDualColorButton::KDualColorButton(
QWidget *parent,
const char *name,
QWidget* dialogParent)
00036 :
QWidget(parent, name),
00037 d (new KDualColorPrivate)
00038 {
00039 d->dialogParent = dialogParent;
00040
00041 arrowBitmap =
new QBitmap(dcolorarrow_width, dcolorarrow_height,
00042 (
const unsigned char *)dcolorarrow_bits,
true);
00043 arrowBitmap->setMask(*arrowBitmap);
00044 resetPixmap =
new QPixmap((
const char **)dcolorreset_xpm);
00045 fg =
QBrush(Qt::black, SolidPattern);
00046 bg = QBrush(Qt::white, SolidPattern);
00047 curColor = Foreground;
00048 dragFlag =
false;
00049 miniCtlFlag =
false;
00050
if(
sizeHint().
isValid())
00051 setMinimumSize(
sizeHint());
00052 setAcceptDrops(
true);
00053 }
00054
00055 KDualColorButton::KDualColorButton(
const QColor &fgColor,
const QColor &bgColor,
00056
QWidget *parent,
const char *name,
QWidget* dialogParent)
00057 :
QWidget(parent, name),
00058 d (new KDualColorPrivate)
00059 {
00060 d->dialogParent = dialogParent;
00061
00062 arrowBitmap =
new QBitmap(dcolorarrow_width, dcolorarrow_height,
00063 (
const unsigned char *)dcolorarrow_bits,
true);
00064 arrowBitmap->setMask(*arrowBitmap);
00065 resetPixmap =
new QPixmap((
const char **)dcolorreset_xpm);
00066 fg =
QBrush(fgColor, SolidPattern);
00067 bg = QBrush(bgColor, SolidPattern);
00068 curColor = Foreground;
00069 dragFlag =
false;
00070 miniCtlFlag =
false;
00071
if(
sizeHint().
isValid())
00072 setMinimumSize(
sizeHint());
00073 setAcceptDrops(
true);
00074 }
00075
00076 KDualColorButton::~KDualColorButton()
00077 {
00078
delete d;
00079
delete arrowBitmap;
00080
delete resetPixmap;
00081 }
00082
00083
QColor KDualColorButton::foreground()
const
00084
{
00085
return(fg.
color());
00086 }
00087
00088
QColor KDualColorButton::background()
const
00089
{
00090
return(bg.
color());
00091 }
00092
00093 KDualColorButton::DualColor
KDualColorButton::current()
const
00094
{
00095
return(curColor);
00096 }
00097
00098
QColor KDualColorButton::currentColor()
const
00099
{
00100
return(curColor == Background ? bg.
color() : fg.color());
00101 }
00102
00103 QSize KDualColorButton::sizeHint()
const
00104
{
00105
return(
QSize(34, 34));
00106 }
00107
00108 void KDualColorButton::setForeground(
const QColor &c)
00109 {
00110 fg =
QBrush(c, SolidPattern);
00111
repaint(
false);
00112
00113 emit
fgChanged(fg.
color());
00114 }
00115
00116 void KDualColorButton::setBackground(
const QColor &c)
00117 {
00118 bg =
QBrush(c, SolidPattern);
00119
repaint(
false);
00120
00121 emit
bgChanged(bg.
color());
00122 }
00123
00124 void KDualColorButton::setCurrentColor(
const QColor &c)
00125 {
00126
if(curColor == Background)
00127 bg =
QBrush(c, SolidPattern);
00128
else
00129 fg = QBrush(c, SolidPattern);
00130
repaint(
false);
00131 }
00132
00133 void KDualColorButton::setCurrent(DualColor s)
00134 {
00135 curColor = s;
00136
repaint(
false);
00137 }
00138
00139 void KDualColorButton::metrics(
QRect &fgRect,
QRect &bgRect)
00140 {
00141 fgRect =
QRect(0, 0,
width()-14,
height()-14);
00142 bgRect = QRect(14, 14,
width()-14,
height()-14);
00143 }
00144
00145
void KDualColorButton::paintEvent(
QPaintEvent *)
00146 {
00147
QRect fgRect, bgRect;
00148
QPainter p(
this);
00149
00150 metrics(fgRect, bgRect);
00151
QBrush defBrush =
colorGroup().brush(QColorGroup::Button);
00152
00153 qDrawShadeRect(&p, bgRect,
colorGroup(), curColor == Background, 2, 0,
00154
isEnabled() ? &bg : &defBrush);
00155 qDrawShadeRect(&p, fgRect,
colorGroup(), curColor == Foreground, 2, 0,
00156
isEnabled() ? &fg : &defBrush);
00157 p.
setPen(
colorGroup().shadow());
00158 p.
drawPixmap(fgRect.
right()+2, 0, *arrowBitmap);
00159 p.
drawPixmap(0, fgRect.
bottom()+2, *resetPixmap);
00160
00161 }
00162
00163
void KDualColorButton::dragEnterEvent(
QDragEnterEvent *ev)
00164 {
00165 ev->accept(
isEnabled() && KColorDrag::canDecode(ev));
00166 }
00167
00168
void KDualColorButton::dropEvent(
QDropEvent *ev)
00169 {
00170
QColor c;
00171
if(
KColorDrag::decode(ev, c)){
00172
if(curColor == Foreground){
00173 fg.
setColor(c);
00174 emit
fgChanged(c);
00175 }
00176
else{
00177 bg.
setColor(c);
00178 emit(
bgChanged(c));
00179 }
00180
repaint(
false);
00181 }
00182 }
00183
00184
void KDualColorButton::mousePressEvent(
QMouseEvent *ev)
00185 {
00186
QRect fgRect, bgRect;
00187
metrics(fgRect, bgRect);
00188 mPos = ev->
pos();
00189 tmpColor = curColor;
00190 dragFlag =
false;
00191
if(fgRect.
contains(mPos)){
00192 curColor = Foreground;
00193 miniCtlFlag =
false;
00194 }
00195
else if(bgRect.
contains(mPos)){
00196 curColor = Background;
00197 miniCtlFlag =
false;
00198 }
00199
else if(ev->
pos().x() > fgRect.
width()){
00200
00201
00202
QBrush c = fg;
00203 fg = bg;
00204 bg = c;
00205 emit
fgChanged(fg.
color());
00206 emit
bgChanged(bg.color());
00207 miniCtlFlag =
true;
00208 }
00209
else if(ev->
pos().x() < bgRect.
x()){
00210 fg.
setColor(Qt::black);
00211 bg.
setColor(Qt::white);
00212 emit
fgChanged(fg.
color());
00213 emit
bgChanged(bg.
color());
00214 miniCtlFlag =
true;
00215 }
00216
repaint(
false);
00217 }
00218
00219
00220
void KDualColorButton::mouseMoveEvent(
QMouseEvent *ev)
00221 {
00222
if(!miniCtlFlag){
00223
int delay =
KGlobalSettings::dndEventDelay();
00224
if(ev->
x() >= mPos.
x()+delay || ev->
x() <= mPos.
x()-delay ||
00225 ev->
y() >= mPos.
y()+delay || ev->
y() <= mPos.
y()-delay) {
00226
KColorDrag *d =
new KColorDrag( curColor == Foreground ?
00227 fg.
color() : bg.color(),
00228 this);
00229 d->dragCopy();
00230 dragFlag =
true;
00231 }
00232 }
00233 }
00234
00235
void KDualColorButton::mouseReleaseEvent(
QMouseEvent *ev)
00236 {
00237
if(!miniCtlFlag){
00238
QRect fgRect, bgRect;
00239
00240
metrics(fgRect, bgRect);
00241
if(dragFlag)
00242 curColor = tmpColor;
00243
else if(fgRect.
contains(ev->
pos()) && curColor == Foreground){
00244
if(tmpColor == Background){
00245 curColor = Foreground;
00246 emit
currentChanged(Foreground);
00247 }
00248
else{
00249
QColor newColor = fg.
color();
00250
if(
KColorDialog::getColor(newColor, d->dialogParent) != QDialog::Rejected){
00251 fg.
setColor(newColor);
00252 emit
fgChanged(newColor);
00253 }
00254 }
00255 }
00256
else if(bgRect.
contains(ev->
pos()) && curColor == Background){
00257
if(tmpColor == Foreground){
00258 curColor = Background;
00259 emit
currentChanged(Background);
00260 }
00261
else{
00262
QColor newColor = bg.
color();
00263
if(
KColorDialog::getColor(newColor, d->dialogParent) != QDialog::Rejected){
00264 bg.
setColor(newColor);
00265 emit
bgChanged(newColor);
00266 }
00267 }
00268 }
00269
repaint(
false);
00270 dragFlag =
false;
00271 }
00272
else
00273 miniCtlFlag =
false;
00274 }
00275
00276
void KDualColorButton::virtual_hook(
int,
void* )
00277 { }
00278
00279
#include "kdualcolorbutton.moc"