You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdelibs/kdeui/kdualcolorbutton.cpp

284 lines
7.8 KiB

/* This file is part of the KDE libraries
Copyright (C) 1999 Daniel M. Duley <mosfet@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 version 2 as published by the Free Software Foundation.
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 "kdualcolorbutton.h"
#include "kcolordialog.h"
#include "kcolordrag.h"
#include "dcolorarrow.xbm"
#include "dcolorreset.xpm"
#include <kglobalsettings.h>
#include <tqpainter.h>
#include <tqbitmap.h>
#include <tqdrawutil.h>
class KDualColorButton::KDualColorPrivate
{
public:
TQWidget* dialogParent;
};
KDualColorButton::KDualColorButton(TQWidget *parent, const char *name, TQWidget* dialogParent)
: TQWidget(parent, name),
d (new KDualColorPrivate)
{
if (!dialogParent && parent) {
d->dialogParent = parent;
} else {
d->dialogParent = dialogParent;
}
arrowBitmap = new TQBitmap(dcolorarrow_width, dcolorarrow_height,
(const unsigned char *)dcolorarrow_bits, true);
arrowBitmap->setMask(*arrowBitmap); // heh
resetPixmap = new TQPixmap((const char **)dcolorreset_xpm);
fg = TQBrush(Qt::black, SolidPattern);
bg = TQBrush(Qt::white, SolidPattern);
curColor = Foreground;
dragFlag = false;
miniCtlFlag = false;
if(sizeHint().isValid())
setMinimumSize(sizeHint());
setAcceptDrops(true);
}
KDualColorButton::KDualColorButton(const TQColor &fgColor, const TQColor &bgColor,
TQWidget *parent, const char *name, TQWidget* dialogParent)
: TQWidget(parent, name),
d (new KDualColorPrivate)
{
d->dialogParent = dialogParent;
arrowBitmap = new TQBitmap(dcolorarrow_width, dcolorarrow_height,
(const unsigned char *)dcolorarrow_bits, true);
arrowBitmap->setMask(*arrowBitmap);
resetPixmap = new TQPixmap((const char **)dcolorreset_xpm);
fg = TQBrush(fgColor, SolidPattern);
bg = TQBrush(bgColor, SolidPattern);
curColor = Foreground;
dragFlag = false;
miniCtlFlag = false;
if(sizeHint().isValid())
setMinimumSize(sizeHint());
setAcceptDrops(true);
}
KDualColorButton::~KDualColorButton()
{
delete d;
delete arrowBitmap;
delete resetPixmap;
}
TQColor KDualColorButton::foreground() const
{
return fg.color();
}
TQColor KDualColorButton::background() const
{
return bg.color();
}
KDualColorButton::DualColor KDualColorButton::current() const
{
return curColor;
}
TQColor KDualColorButton::currentColor() const
{
return (curColor == Background ? bg.color() : fg.color());
}
TQSize KDualColorButton::sizeHint() const
{
return TQSize(34, 34);
}
void KDualColorButton::setForeground(const TQColor &c)
{
fg = TQBrush(c, SolidPattern);
repaint(false);
emit fgChanged(fg.color());
}
void KDualColorButton::setBackground(const TQColor &c)
{
bg = TQBrush(c, SolidPattern);
repaint(false);
emit bgChanged(bg.color());
}
void KDualColorButton::setCurrentColor(const TQColor &c)
{
if(curColor == Background)
bg = TQBrush(c, SolidPattern);
else
fg = TQBrush(c, SolidPattern);
repaint(false);
}
void KDualColorButton::setCurrent(DualColor s)
{
curColor = s;
repaint(false);
}
void KDualColorButton::metrics(TQRect &fgRect, TQRect &bgRect)
{
fgRect = TQRect(0, 0, width()-14, height()-14);
bgRect = TQRect(14, 14, width()-14, height()-14);
}
void KDualColorButton::paintEvent(TQPaintEvent *)
{
TQRect fgRect, bgRect;
TQPainter p(this);
metrics(fgRect, bgRect);
TQBrush defBrush = colorGroup().brush(TQColorGroup::Button);
qDrawShadeRect(&p, bgRect, colorGroup(), curColor == Background, 2, 0,
isEnabled() ? &bg : &defBrush);
qDrawShadeRect(&p, fgRect, colorGroup(), curColor == Foreground, 2, 0,
isEnabled() ? &fg : &defBrush);
p.setPen(colorGroup().shadow());
p.drawPixmap(fgRect.right()+2, 0, *arrowBitmap);
p.drawPixmap(0, fgRect.bottom()+2, *resetPixmap);
}
void KDualColorButton::dragEnterEvent(TQDragEnterEvent *ev)
{
ev->accept(isEnabled() && KColorDrag::canDecode(ev));
}
void KDualColorButton::dropEvent(TQDropEvent *ev)
{
TQColor c;
if(KColorDrag::decode(ev, c)){
if(curColor == Foreground){
fg.setColor(c);
emit fgChanged(c);
}
else{
bg.setColor(c);
emit(bgChanged(c));
}
repaint(false);
}
}
void KDualColorButton::mousePressEvent(TQMouseEvent *ev)
{
TQRect fgRect, bgRect;
metrics(fgRect, bgRect);
mPos = ev->pos();
tmpColor = curColor;
dragFlag = false;
if(fgRect.contains(mPos)){
curColor = Foreground;
miniCtlFlag = false;
}
else if(bgRect.contains(mPos)){
curColor = Background;
miniCtlFlag = false;
}
else if(ev->pos().x() > fgRect.width()){
// We handle the swap and reset controls as soon as the mouse is
// is pressed and ignore further events on this click (mosfet).
TQBrush c = fg;
fg = bg;
bg = c;
emit fgChanged(fg.color());
emit bgChanged(bg.color());
miniCtlFlag = true;
}
else if(ev->pos().x() < bgRect.x()){
fg.setColor(Qt::black);
bg.setColor(Qt::white);
emit fgChanged(fg.color());
emit bgChanged(bg.color());
miniCtlFlag = true;
}
repaint(false);
}
void KDualColorButton::mouseMoveEvent(TQMouseEvent *ev)
{
if(!miniCtlFlag){
int delay = KGlobalSettings::dndEventDelay();
if(ev->x() >= mPos.x()+delay || ev->x() <= mPos.x()-delay ||
ev->y() >= mPos.y()+delay || ev->y() <= mPos.y()-delay) {
KColorDrag *d = new KColorDrag( curColor == Foreground ?
fg.color() : bg.color(),
this);
d->dragCopy();
dragFlag = true;
}
}
}
void KDualColorButton::mouseReleaseEvent(TQMouseEvent *ev)
{
if(!miniCtlFlag){
TQRect fgRect, bgRect;
metrics(fgRect, bgRect);
if(dragFlag)
curColor = tmpColor;
else if(fgRect.contains(ev->pos()) && curColor == Foreground){
if(tmpColor == Background){
curColor = Foreground;
emit currentChanged(Foreground);
}
else{
TQColor newColor = fg.color();
if(KColorDialog::getColor(newColor, d->dialogParent) != TQDialog::Rejected){
fg.setColor(newColor);
emit fgChanged(newColor);
}
}
}
else if(bgRect.contains(ev->pos()) && curColor == Background){
if(tmpColor == Foreground){
curColor = Background;
emit currentChanged(Background);
}
else{
TQColor newColor = bg.color();
if(KColorDialog::getColor(newColor, d->dialogParent) != TQDialog::Rejected){
bg.setColor(newColor);
emit bgChanged(newColor);
}
}
}
repaint(false);
dragFlag = false;
}
else
miniCtlFlag = false;
}
void KDualColorButton::virtual_hook( int, void* )
{ /*BASE::virtual_hook( id, data );*/ }
#include "kdualcolorbutton.moc"