From qtnode
/****************************************************************************
**
** Copyright (C) 1992-2006 Trolltech AS. All rights reserved.
**
** This file is part of the QtGui module of the Qt Toolkit.
**
** This file may be used under the terms of the GNU General Public
** License version 2.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of
** this file. Please review the following information to ensure GNU
** General Public Licensing requirements will be met:
** http://www.trolltech.com/products/qt/opensource.html
**
** If you are unsure which license is appropriate for your use, please
** review the following information:
** http://www.trolltech.com/products/qt/licensing.html or contact the
** sales department at sales@trolltech.com.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
****************************************************************************/
#include <QColorDialog>
#include "qapplication.h"
#include "qdesktopwidget.h"
#include "qdrawutil.h"
#include "qevent.h"
#include "qimage.h"
#include "qlabel.h"
#include "qlayout.h"
#include "qlineedit.h"
#include "qmenu.h"
#include "qpainter.h"
#include "qpixmap.h"
#include "qpushbutton.h"
#include "qsettings.h"
#include "qstyle.h"
#include "qstyleoption.h"
#include "qvalidator.h"
#include "qmime.h"
#include "qspinbox.h"
#ifdef Q_WS_MAC
QRgb macGetRgba(QRgb initial, bool *ok, QWidget *parent);
QColor macGetColor(const QColor& initial, QWidget *parent);
#endif
struct QWellArrayData;
class QWellArray : public QWidget
{
Q_OBJECT
Q_PROPERTY(int selectedColumn READ selectedColumn)
Q_PROPERTY(int selectedRow READ selectedRow)
public:
QWellArray(int rows, int cols, QWidget* parent=0);
~QWellArray() {}
QString cellContent(int row, int col) const;
int selectedColumn() const { return selCol; }
int selectedRow() const { return selRow; }
virtual void setCurrent(int row, int col);
virtual void setSelected(int row, int col);
QSize sizeHint() const;
virtual void setCellBrush(int row, int col, const QBrush &);
QBrush cellBrush(int row, int col);
inline int cellWidth() const
{ return cellw; }
inline int cellHeight() const
{ return cellh; }
inline int rowAt(int y) const
{ return y / cellh; }
inline int columnAt(int x) const
{ if (isRightToLeft()) return ncols - (x / cellw) - 1; return x / cellw; }
inline int rowY(int row) const
{ return cellh * row; }
inline int columnX(int column) const
{ if (isRightToLeft()) return cellw * (ncols - column - 1); return cellw * column; }
inline int numRows() const
{ return nrows; }
inline int numCols() const
{return ncols; }
inline QRect cellRect() const
{ return QRect(0, 0, cellw, cellh); }
inline QSize gridSize() const
{ return QSize(ncols * cellw, nrows * cellh); }
QRect cellGeometry(int row, int column)
{
QRect r;
if (row >= 0 && row < nrows && column >= 0 && column < ncols)
r.setRect(columnX(column), rowY(row), cellw, cellh);
return r;
}
inline void updateCell(int row, int column) { update(cellGeometry(row, column)); }
signals:
void selected(int row, int col);
protected:
virtual void paintCell(QPainter *, int row, int col, const QRect&);
virtual void paintCellContents(QPainter *, int row, int col, const QRect&);
void mousePressEvent(QMouseEvent*);
void mouseReleaseEvent(QMouseEvent*);
void keyPressEvent(QKeyEvent*);
void focusInEvent(QFocusEvent*);
void focusOutEvent(QFocusEvent*);
void paintEvent(QPaintEvent *);
private:
Q_DISABLE_COPY(QWellArray)
int nrows;
int ncols;
int cellw;
int cellh;
int curRow;
int curCol;
int selRow;
int selCol;
QWellArrayData *d;
};
class QColorWell : public QWellArray
{
public:
QColorWell(QWidget *parent, int r, int c, QRgb *vals)
:QWellArray(r, c, parent), values(vals), mousePressed(false), oldCurrent(-1, -1)
{ setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum)); }
protected:
void paintCellContents(QPainter *, int row, int col, const QRect&);
void mousePressEvent(QMouseEvent *e);
void mouseMoveEvent(QMouseEvent *e);
void mouseReleaseEvent(QMouseEvent *e);
#ifndef QT_NO_DRAGANDDROP
void dragEnterEvent(QDragEnterEvent *e);
void dragLeaveEvent(QDragLeaveEvent *e);
void dragMoveEvent(QDragMoveEvent *e);
void dropEvent(QDropEvent *e);
#endif
private:
QRgb *values;
bool mousePressed;
QPoint pressPos;
QPoint oldCurrent;
};
class QColorPicker : public QFrame
{
Q_OBJECT
public:
QColorPicker(QWidget* parent);
~QColorPicker();
public slots:
void setCol(int h, int s);
signals:
void newCol(int h, int s);
protected:
QSize sizeHint() const;
void paintEvent(QPaintEvent*);
void mouseMoveEvent(QMouseEvent *);
void mousePressEvent(QMouseEvent *);
private:
int hue;
int sat;
QPoint colPt();
int huePt(const QPoint &pt);
int satPt(const QPoint &pt);
void setCol(const QPoint &pt);
QPixmap *pix;
};
class QColorLuminancePicker : public QWidget
{
Q_OBJECT
public:
QColorLuminancePicker(QWidget* parent=0);
~QColorLuminancePicker();
public slots:
void setCol(int h, int s, int v);
void setCol(int h, int s);
signals:
void newHsv(int h, int s, int v);
protected:
void paintEvent(QPaintEvent*);
void mouseMoveEvent(QMouseEvent *);
void mousePressEvent(QMouseEvent *);
private:
enum { foff = 3, coff = 4 }; //frame and contents offset
int val;
int hue;
int sat;
int y2val(int y);
int val2y(int val);
void setVal(int v);
QPixmap *pix;
};
class QColSpinBox : public QSpinBox
{
public:
QColSpinBox(QWidget *parent)
: QSpinBox(parent) { setRange(0, 255); }
void setValue(int i) {
bool block = signalsBlocked();
blockSignals(true);
QSpinBox::setValue(i);
blockSignals(block);
}
};
class QColorShowLabel;
class QColorShower : public QWidget
{
Q_OBJECT
public:
QColorShower(QWidget *parent);
//things that don't emit signals
void setHsv(int h, int s, int v);
int currentAlpha() const { return alphaEd->value(); }
void setCurrentAlpha(int a) { alphaEd->setValue(a); }
void showAlpha(bool b);
QRgb currentColor() const { return curCol; }
public slots:
void setRgb(QRgb rgb);
signals:
void newCol(QRgb rgb);
private slots:
void rgbEd();
void hsvEd();
private:
void showCurrentColor();
int hue, sat, val;
QRgb curCol;
QColSpinBox *hEd;
QColSpinBox *sEd;
QColSpinBox *vEd;
QColSpinBox *rEd;
QColSpinBox *gEd;
QColSpinBox *bEd;
QColSpinBox *alphaEd;
QLabel *alphaLab;
QColorShowLabel *lab;
bool rgbOriginal;
};
class QColorShowLabel : public QFrame
{
Q_OBJECT
public:
QColorShowLabel(QWidget *parent) : QFrame(parent) {
setFrameStyle(QFrame::Panel|QFrame::Sunken);
setAcceptDrops(true);
mousePressed = false;
}
void setColor(QColor c) { col = c; }
signals:
void colorDropped(QRgb);
protected:
void paintEvent(QPaintEvent *);
void mousePressEvent(QMouseEvent *e);
void mouseMoveEvent(QMouseEvent *e);
void mouseReleaseEvent(QMouseEvent *e);
#ifndef QT_NO_DRAGANDDROP
void dragEnterEvent(QDragEnterEvent *e);
void dragLeaveEvent(QDragLeaveEvent *e);
void dropEvent(QDropEvent *e);
#endif
private:
QColor col;
bool mousePressed;
QPoint pressPos;
};