Source Code (Use browser search to find items of interest.)

Class Index

kdelibs'KDualColorButton (./kdelibs/kdeui/kdualcolorbtn.h:43)

class KDualColorButton : public QWidget
{
    Q_OBJECT
public:
    enum DualColor{Foreground, Background};
    /**
     * Constructs a new KDualColorButton using the default black and white
     * colors.
     *
     */
    KDualColorButton(QWidget *parent=0, const char *name=0);
    /**
     * Constructs a new KDualColorButton with the supplied foreground and
     * background colors.
     */
    KDualColorButton(const QColor &fgColor, const QColor &bgColor,
                     QWidget *parent=0, const char *name=0);
    ~KDualColorButton();
    /**
     * Returns the current foreground color.
     */
    QColor foreground();
    /**
     * Returns the current background color.
     */
    QColor background();
    /**
     * Returns the current color item selected by the user.
     */
    KDualColorButton::DualColor current();
    /**
     * Returns the color of the selected item.
     */
    QColor currentColor();
    /**
     * Returns the minimum size needed to display the widget and all it's
     * controls.
     */
    virtual QSize sizeHint() const;
public slots:
    /**
     * Sets the foreground color.
     */
    void slotSetForeground(const QColor &c);
    /**
     * Sets the background color.
     */
    void slotSetBackground(const QColor &c);
    /**
     * Sets the current selected color item.
     */
    void slotSetCurrent(KDualColorButton::DualColor s);
    /**
     * Sets the color of the selected item.
     */
    void slotSetCurrentColor(const QColor &c);
signals:
    /**
     * Emitted when the foreground color is changed.
     */
    void fgChanged(const QColor &c);
    /**
     * Emitted when the background color is changed.
     */
    void bgChanged(const QColor &c);
    /**
     * Emitted when the user changes the current color selection.
     */
    void currentChanged(KDualColorButton::DualColor s);
protected:
    /**
     * Sets the supplied rectangles to the proper size and position for the
     * current widget size. You can reimplement this to change the layout
     * of the widget. Restrictions are that the swap control will always
     * be at the top right, the reset control will always be at the bottom
     * left, and you must leave at least a 14x14 space in those corners.
     */
    virtual void metrics(QRect &fgRect, QRect &bgRect);
    virtual void paintEvent(QPaintEvent *ev);
    virtual void mousePressEvent(QMouseEvent *ev);
    virtual void mouseMoveEvent(QMouseEvent *ev);
    virtual void mouseReleaseEvent(QMouseEvent *ev);
    // Dnd
    virtual void dragEnterEvent(QDragEnterEvent *ev);
    virtual void dropEvent(QDropEvent *ev);
private:
    QBitmap *arrowBitmap;
    QPixmap *resetPixmap;
    QBrush fg, bg;
    QPoint mPos;
    bool dragFlag, miniCtlFlag;
    DualColor curColor, tmpColor;

    class KDualColorPrivate;
    KDualColorPrivate *d;
};

kdelibs'KDualColorButton::KDualColorButton() (./kdelibs/kdeui/kdualcolorbtn.cpp:28)

KDualColorButton::KDualColorButton(QWidget *parent, const char *name)
    : QWidget(parent, name)
{
    arrowBitmap = new QBitmap(dcolorarrow_width, dcolorarrow_height,
                              (const unsigned char *)dcolorarrow_bits, true);
    arrowBitmap->setMask(*arrowBitmap); // heh
    resetPixmap = new QPixmap((const char **)dcolorreset_xpm);
    fg = QBrush(Qt::black, SolidPattern);
    bg = QBrush(Qt::white, SolidPattern);
    curColor = Foreground;
    dragFlag = false;
    miniCtlFlag = false;
    if(sizeHint().isValid())
        setMinimumSize(sizeHint());
    setAcceptDrops(true);
}


kdelibs'KDualColorButton::KDualColorButton() (./kdelibs/kdeui/kdualcolorbtn.cpp:45)

KDualColorButton::KDualColorButton(const QColor &fgColor, const QColor &bgColor,
                                   QWidget *parent, const char *name)
    : QWidget(parent, name)
{
    arrowBitmap = new QBitmap(dcolorarrow_width, dcolorarrow_height,
                              (const unsigned char *)dcolorarrow_bits, true);
    arrowBitmap->setMask(*arrowBitmap);
    resetPixmap = new QPixmap((const char **)dcolorreset_xpm);
    fg = QBrush(fgColor, SolidPattern);
    bg = QBrush(bgColor, SolidPattern);
    curColor = Foreground;
    dragFlag = false;
    miniCtlFlag = false;
    if(sizeHint().isValid())
        setMinimumSize(sizeHint());
    setAcceptDrops(true);
}


kdelibs'KDualColorButton::~KDualColorButton() (./kdelibs/kdeui/kdualcolorbtn.cpp:63)

KDualColorButton::~KDualColorButton()
{
    delete arrowBitmap;
    delete resetPixmap;
}


kdelibs'KDualColorButton::foreground() (./kdelibs/kdeui/kdualcolorbtn.cpp:69)

QColor KDualColorButton::foreground()
{
    return(fg.color());
}


kdelibs'KDualColorButton::background() (./kdelibs/kdeui/kdualcolorbtn.cpp:74)

QColor KDualColorButton::background()
{
    return(bg.color());
}

KDualColorButton::DualColor KDualColorButton::current()
{
    return(curColor);
}


kdelibs'KDualColorButton::currentColor() (./kdelibs/kdeui/kdualcolorbtn.cpp:84)

QColor KDualColorButton::currentColor()
{
    return(curColor == Background ? bg.color() : fg.color());
}


kdelibs'KDualColorButton::sizeHint() (./kdelibs/kdeui/kdualcolorbtn.cpp:89)

QSize KDualColorButton::sizeHint() const
{
    return(QSize(34, 34));
}


kdelibs'KDualColorButton::slotSetForeground() (./kdelibs/kdeui/kdualcolorbtn.cpp:94)

void KDualColorButton::slotSetForeground(const QColor &c)
{
    fg = QBrush(c, SolidPattern);
    repaint(false);
}


kdelibs'KDualColorButton::slotSetBackground() (./kdelibs/kdeui/kdualcolorbtn.cpp:100)

void KDualColorButton::slotSetBackground(const QColor &c)
{
    bg = QBrush(c, SolidPattern);
    repaint(false);
}


kdelibs'KDualColorButton::slotSetCurrentColor() (./kdelibs/kdeui/kdualcolorbtn.cpp:106)

void KDualColorButton::slotSetCurrentColor(const QColor &c)
{
    if(curColor == Background)
        bg = QBrush(c, SolidPattern);
    else
        fg = QBrush(c, SolidPattern);
    repaint(false);
}


kdelibs'KDualColorButton::slotSetCurrent() (./kdelibs/kdeui/kdualcolorbtn.cpp:115)

void KDualColorButton::slotSetCurrent(DualColor s)
{
    curColor = s;
    repaint(false);
}


kdelibs'KDualColorButton::metrics() (./kdelibs/kdeui/kdualcolorbtn.cpp:121)

void KDualColorButton::metrics(QRect &fgRect, QRect &bgRect)
{
    fgRect = QRect(0, 0, width()-14, height()-14);
    bgRect = QRect(14, 14, width()-14, height()-14);
}


kdelibs'KDualColorButton::paintEvent() (./kdelibs/kdeui/kdualcolorbtn.cpp:127)

void KDualColorButton::paintEvent(QPaintEvent *)
{
    QRect fgRect, bgRect;
    QPainter p(this);

    metrics(fgRect, bgRect);
    QBrush defBrush = colorGroup().brush(QColorGroup::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);

}


kdelibs'KDualColorButton::dragEnterEvent() (./kdelibs/kdeui/kdualcolorbtn.cpp:145)

void KDualColorButton::dragEnterEvent(QDragEnterEvent *ev)
{
    ev->accept(isEnabled() && KColorDrag::canDecode(ev));
}


kdelibs'KDualColorButton::dropEvent() (./kdelibs/kdeui/kdualcolorbtn.cpp:150)

void KDualColorButton::dropEvent(QDropEvent *ev)
{
    QColor c;
    if(KColorDrag::decode(ev, c)){
        if(curColor == Foreground){
            fg.setColor(c);
            emit fgChanged(c);
        }
        else{
            bg.setColor(c);
            emit(bgChanged(c));
        }
    }
}


kdelibs'KDualColorButton::mousePressEvent() (./kdelibs/kdeui/kdualcolorbtn.cpp:165)

void KDualColorButton::mousePressEvent(QMouseEvent *ev)
{
    QRect 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).
        QBrush 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);
}



kdelibs'KDualColorButton::mouseMoveEvent() (./kdelibs/kdeui/kdualcolorbtn.cpp:201)

void KDualColorButton::mouseMoveEvent(QMouseEvent *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 = KColorDrag::makeDrag( curColor == Foreground ?
                                                  fg.color() : bg.color(),
                                                  this);
            d->dragCopy();
            dragFlag = true;
        }
    }
}


kdelibs'KDualColorButton::mouseReleaseEvent() (./kdelibs/kdeui/kdualcolorbtn.cpp:216)

void KDualColorButton::mouseReleaseEvent(QMouseEvent *ev)
{
    if(!miniCtlFlag){
        QRect 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{
                QColor newColor = fg.color();
                if(KColorDialog::getColor(newColor) != QDialog::Rejected){
                    fg.setColor(newColor);
                    emit fgChanged(newColor);
                }
            }
        }
        else if(bgRect.contains(ev->pos()) && curColor == Background){
            if(tmpColor == Foreground){
                curColor = Background;
                emit currentChanged(Background);
            }
            else{
                QColor newColor = bg.color();
                if(KColorDialog::getColor(newColor) != QDialog::Rejected){
                    bg.setColor(newColor);
                    emit bgChanged(newColor);
                }
            }
        }
        repaint(false);
        dragFlag = false;
    }
    else
        miniCtlFlag = false;
}