summaryrefslogtreecommitdiffstats
path: root/experimental/tqtinterface/qt4/src/dialogs/tqcolordialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'experimental/tqtinterface/qt4/src/dialogs/tqcolordialog.cpp')
-rw-r--r--experimental/tqtinterface/qt4/src/dialogs/tqcolordialog.cpp1665
1 files changed, 1665 insertions, 0 deletions
diff --git a/experimental/tqtinterface/qt4/src/dialogs/tqcolordialog.cpp b/experimental/tqtinterface/qt4/src/dialogs/tqcolordialog.cpp
new file mode 100644
index 000000000..cd1347694
--- /dev/null
+++ b/experimental/tqtinterface/qt4/src/dialogs/tqcolordialog.cpp
@@ -0,0 +1,1665 @@
+/****************************************************************************
+**
+** Implementation of TQColorDialog class
+**
+** Created : 990222
+**
+** Copyright (C) 1999-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of the dialogs module of the TQt GUI Toolkit.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free TQt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** This file may be used under the terms of the Q Public License as
+** defined by Trolltech ASA and appearing in the file LICENSE.TQPL
+** included in the packaging of this file. Licensees holding valid TQt
+** Commercial licenses may use this file in accordance with the TQt
+** Commercial License Agreement provided with the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "tqcolordialog.h"
+
+#ifndef TQT_NO_COLORDIALOG
+
+#include "tqpainter.h"
+#include "tqlayout.h"
+#include "tqlabel.h"
+#include "tqpushbutton.h"
+#include "tqlineedit.h"
+#include "tqimage.h"
+#include "tqpixmap.h"
+#include "tqdrawutil.h"
+#include "tqvalidator.h"
+#include "tqdragobject.h"
+#include "tqgridview.h"
+#include "tqapplication.h"
+#include "tqstyle.h"
+#include "tqsettings.h"
+#include "tqpopupmenu.h"
+
+#ifdef TQ_WS_MAC
+TQRgb macGetRgba( TQRgb initial, bool *ok, TQWidget *tqparent, const char* name );
+TQColor macGetColor( const TQColor& initial, TQWidget *tqparent, const char *name );
+#endif
+
+//////////// TQWellArray BEGIN
+
+struct TQWellArrayData;
+
+class TQWellArray : public TQGridView
+{
+ Q_OBJECT
+ TQ_OBJECT
+ Q_PROPERTY( int selectedColumn READ selectedColumn )
+ Q_PROPERTY( int selectedRow READ selectedRow )
+
+public:
+ TQWellArray( TQWidget* tqparent=0, const char* name=0, bool popup = FALSE );
+
+ ~TQWellArray() {}
+ TQString cellContent( int row, int col ) const;
+ // ### Paul !!! virtual void setCellContent( int row, int col, const TQString &);
+
+ int selectedColumn() const { return selCol; }
+ int selectedRow() const { return selRow; }
+
+ virtual void setCurrent( int row, int col );
+ virtual void setSelected( int row, int col );
+
+ TQSize tqsizeHint() const;
+
+ virtual void setCellBrush( int row, int col, const TQBrush & );
+ TQBrush cellBrush( int row, int col );
+
+Q_SIGNALS:
+ void selected( int row, int col );
+
+protected:
+ void dimensionChange( int oldRows, int oldCols );
+
+ virtual void paintCell( TQPainter *, int row, int col );
+ virtual void paintCellContents( TQPainter *, int row, int col, const TQRect& );
+
+ void mousePressEvent( TQMouseEvent* );
+ void mouseReleaseEvent( TQMouseEvent* );
+ void mouseMoveEvent( TQMouseEvent* );
+ void keyPressEvent( TQKeyEvent* );
+ void focusInEvent( TQFocusEvent* );
+ void focusOutEvent( TQFocusEvent* );
+
+private:
+ int curRow;
+ int curCol;
+ int selRow;
+ int selCol;
+ bool smallStyle;
+ TQWellArrayData *d;
+
+private: // Disabled copy constructor and operator=
+#if defined(TQ_DISABLE_COPY)
+ TQWellArray( const TQWellArray & );
+ TQWellArray& operator=( const TQWellArray & );
+#endif
+};
+
+
+
+// non-interface ...
+
+
+
+struct TQWellArrayData {
+ TQBrush *brush;
+};
+
+/*!
+ \internal
+ \class TQWellArray qwellarray_p.h
+ \brief The TQWellArray class provides a well array.
+
+
+ \ingroup advanced
+*/
+
+TQWellArray::TQWellArray( TQWidget *tqparent, const char * name, bool popup )
+ : TQGridView( tqparent, name,
+ (popup ? (WFlags)(WStyle_Customize|TQt::WStyle_Tool|TQt::WStyle_NoBorder) : (WFlags)0 ) )
+{
+ d = 0;
+ setFocusPolicy( Qt::StrongFocus );
+ setVScrollBarMode(AlwaysOff);
+ setHScrollBarMode(AlwaysOff);
+ viewport()->setBackgroundMode( TQt::PaletteBackground );
+ setNumCols( 7 );
+ setNumRows( 7 );
+ setCellWidth( 24 );
+ setCellHeight( 21 );
+ smallStyle = popup;
+
+ if ( popup ) {
+ setCellWidth( 18 );
+ setCellHeight( 18 );
+ setFrameStyle(TQFrame::StyledPanel | TQFrame::Raised);
+ setMargin( 1 );
+ setLineWidth( 2 );
+ } else {
+ setFrameStyle( TQFrame::NoFrame );
+ }
+ curCol = 0;
+ curRow = 0;
+ selCol = -1;
+ selRow = -1;
+
+ if ( smallStyle )
+ setMouseTracking( TRUE );
+}
+
+
+TQSize TQWellArray::tqsizeHint() const
+{
+ constPolish();
+ TQSize s = gridSize().boundedTo( TQSize(640, 480 ) );
+ return TQSize( s.width() + 2*frameWidth(), s.height() + 2*frameWidth() );
+}
+
+
+void TQWellArray::paintCell( TQPainter* p, int row, int col )
+{
+ int w = cellWidth(); // width of cell in pixels
+ int h = cellHeight(); // height of cell in pixels
+ int b = 1;
+
+ if ( !smallStyle )
+ b = 3;
+
+ const TQColorGroup & g = tqcolorGroup();
+ p->setPen( TQPen( Qt::black, 0, Qt::SolidLine ) );
+ if ( !smallStyle && row ==selRow && col == selCol &&
+ tqstyle().tqstyleHint(TQStyle::SH_GUIStyle) != TQt::MotifStyle) {
+ int n = 2;
+ p->drawRect( n, n, w-2*n, h-2*n );
+ }
+
+ tqstyle().tqdrawPrimitive(TQStyle::PE_Panel, p, TQRect(b, b, w-2*b, h-2*b), g,
+ TQStyle::Style_Enabled | TQStyle::Style_Sunken);
+
+ int t = 0;
+ if (tqstyle().tqstyleHint(TQStyle::SH_GUIStyle) == TQt::MotifStyle)
+ t = ( row == selRow && col == selCol ) ? 2 : 0;
+ b += 2 + t;
+
+ if ( (row == curRow) && (col == curCol) ) {
+ if ( smallStyle ) {
+ p->setPen ( Qt::white );
+ p->drawRect( 1, 1, w-2, h-2 );
+ p->setPen ( Qt::black );
+ p->drawRect( 0, 0, w, h );
+ p->drawRect( 2, 2, w-4, h-4 );
+ b = 3;
+ } else if ( hasFocus() ) {
+ tqstyle().tqdrawPrimitive(TQStyle::PE_FocusRect, p, TQRect(0, 0, w, h), g);
+ }
+ }
+ paintCellContents( p, row, col, TQRect(b, b, w - 2*b, h - 2*b) );
+}
+
+/*!
+ Reimplement this function to change the contents of the well array.
+ */
+void TQWellArray::paintCellContents( TQPainter *p, int row, int col, const TQRect &r )
+{
+
+ if ( d ) {
+ p->fillRect( r, d->brush[row*numCols()+col] );
+ } else {
+ p->fillRect( r, Qt::white );
+ p->setPen( Qt::black );
+ p->drawLine( r.topLeft(), r.bottomRight() );
+ p->drawLine( r.topRight(), r.bottomLeft() );
+ }
+}
+
+
+/*\reimp
+*/
+void TQWellArray::mousePressEvent( TQMouseEvent* e )
+{
+ // The current cell marker is set to the cell the mouse is pressed
+ // in.
+ TQPoint pos = e->pos();
+ setCurrent( rowAt( pos.y() ), columnAt( pos.x() ) );
+}
+
+/*\reimp
+*/
+void TQWellArray::mouseReleaseEvent( TQMouseEvent* )
+{
+ // The current cell marker is set to the cell the mouse is clicked
+ // in.
+ setSelected( curRow, curCol );
+}
+
+
+/*\reimp
+*/
+void TQWellArray::mouseMoveEvent( TQMouseEvent* e )
+{
+ // The current cell marker is set to the cell the mouse is
+ // clicked in.
+ if ( smallStyle ) {
+ TQPoint pos = e->pos();
+ setCurrent( rowAt( pos.y() ), columnAt( pos.x() ) );
+ }
+}
+
+/*
+ Sets the cell currently having the focus. This is not necessarily
+ the same as the currently selected cell.
+*/
+
+void TQWellArray::setCurrent( int row, int col )
+{
+
+ if ( (curRow == row) && (curCol == col) )
+ return;
+
+ if ( row < 0 || col < 0 )
+ row = col = -1;
+
+ int oldRow = curRow;
+ int oldCol = curCol;
+
+ curRow = row;
+ curCol = col;
+
+ updateCell( oldRow, oldCol );
+ updateCell( curRow, curCol );
+}
+
+
+/*!
+ Sets the currently selected cell to \a row, \a col. If \a row or \a
+ col are less than zero, the current cell is unselected.
+
+ Does not set the position of the focus indicator.
+*/
+
+void TQWellArray::setSelected( int row, int col )
+{
+ if ( (selRow == row) && (selCol == col) )
+ return;
+
+ int oldRow = selRow;
+ int oldCol = selCol;
+
+ if ( row < 0 || col < 0 )
+ row = col = -1;
+
+ selCol = col;
+ selRow = row;
+
+ updateCell( oldRow, oldCol );
+ updateCell( selRow, selCol );
+ if ( row >= 0 )
+ emit selected( row, col );
+
+ if ( isVisible() && ::tqqt_cast<TQPopupMenu*>(parentWidget()) )
+ parentWidget()->close();
+}
+
+
+
+/*!\reimp
+*/
+void TQWellArray::focusInEvent( TQFocusEvent* )
+{
+ updateCell( curRow, curCol );
+}
+
+
+/*!
+ Sets the size of the well array to be \a rows cells by \a cols.
+ Resets any brush information set by setCellBrush().
+ */
+void TQWellArray::dimensionChange( int, int )
+{
+ if ( d ) {
+ if ( d->brush )
+ delete[] d->brush;
+ delete d;
+ d = 0;
+ }
+}
+
+void TQWellArray::setCellBrush( int row, int col, const TQBrush &b )
+{
+ if ( !d ) {
+ d = new TQWellArrayData;
+ int i = numRows()*numCols();
+ d->brush = new TQBrush[i];
+ }
+ if ( row >= 0 && row < numRows() && col >= 0 && col < numCols() )
+ d->brush[row*numCols()+col] = b;
+#ifdef TQT_CHECK_RANGE
+ else
+ qWarning( "TQWellArray::setCellBrush( %d, %d ) out of range", row, col );
+#endif
+}
+
+
+
+/*!
+ Returns the brush set for the cell at \a row, \a col. If no brush is set,
+ \c NoBrush is returned.
+*/
+
+TQBrush TQWellArray::cellBrush( int row, int col )
+{
+ if ( d && row >= 0 && row < numRows() && col >= 0 && col < numCols() )
+ return d->brush[row*numCols()+col];
+ return TQBrush(TQt::NoBrush);
+}
+
+
+
+/*!\reimp
+*/
+
+void TQWellArray::focusOutEvent( TQFocusEvent* )
+{
+ updateCell( curRow, curCol );
+}
+
+/*\reimp
+*/
+void TQWellArray::keyPressEvent( TQKeyEvent* e )
+{
+ switch( e->key() ) { // Look at the key code
+ case Qt::Key_Left: // If 'left arrow'-key,
+ if( curCol > 0 ) // and cr't not in leftmost col
+ setCurrent( curRow, curCol - 1); // set cr't to next left column
+ break;
+ case Qt::Key_Right: // Correspondingly...
+ if( curCol < numCols()-1 )
+ setCurrent( curRow, curCol + 1);
+ break;
+ case Qt::Key_Up:
+ if( curRow > 0 )
+ setCurrent( curRow - 1, curCol);
+ else if ( smallStyle )
+ focusNextPrevChild( FALSE );
+ break;
+ case Qt::Key_Down:
+ if( curRow < numRows()-1 )
+ setCurrent( curRow + 1, curCol);
+ else if ( smallStyle )
+ focusNextPrevChild( TRUE );
+ break;
+ case Qt::Key_Space:
+ case Qt::Key_Return:
+ case Qt::Key_Enter:
+ setSelected( curRow, curCol );
+ break;
+ default: // If not an interesting key,
+ e->ignore(); // we don't accept the event
+ return;
+ }
+
+}
+
+//////////// TQWellArray END
+
+static bool initrgb = FALSE;
+static TQRgb stdrgb[6*8];
+static TQRgb cusrgb[2*8];
+static bool customSet = FALSE;
+
+
+static void initRGB()
+{
+ if ( initrgb )
+ return;
+ initrgb = TRUE;
+ int i = 0;
+ for ( int g = 0; g < 4; g++ )
+ for ( int r = 0; r < 4; r++ )
+ for ( int b = 0; b < 3; b++ )
+ stdrgb[i++] = tqRgb( r*255/3, g*255/3, b*255/2 );
+
+ for ( i = 0; i < 2*8; i++ )
+ cusrgb[i] = tqRgb(0xff,0xff,0xff);
+}
+
+/*!
+ Returns the number of custom colors supported by TQColorDialog. All
+ color dialogs share the same custom colors.
+*/
+int TQColorDialog::customCount()
+{
+ return 2*8;
+}
+
+/*!
+ Returns custom color number \a i as a TQRgb.
+*/
+TQRgb TQColorDialog::customColor( int i )
+{
+ initRGB();
+ if ( i < 0 || i >= customCount() ) {
+#ifdef TQT_CHECK_RANGE
+ qWarning( "TQColorDialog::customColor() index %d out of range", i );
+#endif
+ i = 0;
+ }
+ return cusrgb[i];
+}
+
+/*!
+ Sets custom color number \a i to the TQRgb value \a c.
+*/
+void TQColorDialog::setCustomColor( int i, TQRgb c )
+{
+ initRGB();
+ if ( i < 0 || i >= customCount() ) {
+#ifdef TQT_CHECK_RANGE
+ qWarning( "TQColorDialog::setCustomColor() index %d out of range", i );
+#endif
+ return;
+ }
+ customSet = TRUE;
+ cusrgb[i] = c;
+}
+
+/*!
+ Sets standard color number \a i to the TQRgb value \a c.
+*/
+
+void TQColorDialog::setStandardColor( int i, TQRgb c )
+{
+ initRGB();
+ if ( i < 0 || i >= 6*8 ) {
+#ifdef TQT_CHECK_RANGE
+ qWarning( "TQColorDialog::setStandardColor() index %d out of range", i );
+#endif
+ return;
+ }
+ stdrgb[i] = c;
+}
+
+static inline void rgb2hsv( TQRgb rgb, int&h, int&s, int&v )
+{
+ TQColor c;
+ c.setRgb( rgb );
+ c.tqgetHsv(h,s,v);
+}
+
+class TQColorWell : public TQWellArray
+{
+public:
+ TQColorWell( TQWidget *tqparent, int r, int c, TQRgb *vals )
+ :TQWellArray( tqparent, "" ), values( vals ), mousePressed( FALSE ), oldCurrent( -1, -1 )
+ { setNumRows(r), setNumCols(c); tqsetSizePolicy( TQSizePolicy( TQSizePolicy::Minimum, TQSizePolicy::Minimum) ); }
+
+protected:
+ void paintCellContents( TQPainter *, int row, int col, const TQRect& );
+ void mousePressEvent( TQMouseEvent *e );
+ void mouseMoveEvent( TQMouseEvent *e );
+ void mouseReleaseEvent( TQMouseEvent *e );
+#ifndef TQT_NO_DRAGANDDROP
+ void dragEnterEvent( TQDragEnterEvent *e );
+ void dragLeaveEvent( TQDragLeaveEvent *e );
+ void dragMoveEvent( TQDragMoveEvent *e );
+ void dropEvent( TQDropEvent *e );
+#endif
+
+private:
+ TQRgb *values;
+ bool mousePressed;
+ TQPoint pressPos;
+ TQPoint oldCurrent;
+
+};
+
+void TQColorWell::paintCellContents( TQPainter *p, int row, int col, const TQRect &r )
+{
+ int i = row + col*numRows();
+ p->fillRect( r, TQColor( values[i] ) );
+}
+
+void TQColorWell::mousePressEvent( TQMouseEvent *e )
+{
+ oldCurrent = TQPoint( selectedRow(), selectedColumn() );
+ TQWellArray::mousePressEvent( e );
+ mousePressed = TRUE;
+ pressPos = e->pos();
+}
+
+void TQColorWell::mouseMoveEvent( TQMouseEvent *e )
+{
+ TQWellArray::mouseMoveEvent( e );
+#ifndef TQT_NO_DRAGANDDROP
+ if ( !mousePressed )
+ return;
+ if ( ( pressPos - e->pos() ).manhattanLength() > TQApplication::startDragDistance() ) {
+ setCurrent( oldCurrent.x(), oldCurrent.y() );
+ int i = rowAt(pressPos.y()) + columnAt(pressPos.x()) * numRows();
+ TQColor col( values[ i ] );
+ TQColorDrag *drg = new TQColorDrag( col, this );
+ TQPixmap pix( cellWidth(), cellHeight() );
+ pix.fill( col );
+ TQPainter p( &pix );
+ p.drawRect( 0, 0, pix.width(), pix.height() );
+ p.end();
+ drg->setPixmap( pix );
+ mousePressed = FALSE;
+ drg->dragCopy();
+ }
+#endif
+}
+
+#ifndef TQT_NO_DRAGANDDROP
+void TQColorWell::dragEnterEvent( TQDragEnterEvent *e )
+{
+ setFocus();
+ if ( TQColorDrag::canDecode( e ) )
+ e->accept();
+ else
+ e->ignore();
+}
+
+void TQColorWell::dragLeaveEvent( TQDragLeaveEvent * )
+{
+ if ( hasFocus() )
+ parentWidget()->setFocus();
+}
+
+void TQColorWell::dragMoveEvent( TQDragMoveEvent *e )
+{
+ if ( TQColorDrag::canDecode( e ) ) {
+ setCurrent( rowAt( e->pos().y() ), columnAt( e->pos().x() ) );
+ e->accept();
+ } else
+ e->ignore();
+}
+
+void TQColorWell::dropEvent( TQDropEvent *e )
+{
+ if ( TQColorDrag::canDecode( e ) ) {
+ int i = rowAt( e->pos().y() ) + columnAt( e->pos().x() ) * numRows();
+ TQColor col;
+ TQColorDrag::decode( e, col );
+ values[ i ] = col.rgb();
+ repaintContents( FALSE );
+ e->accept();
+ } else {
+ e->ignore();
+ }
+}
+
+#endif // TQT_NO_DRAGANDDROP
+
+void TQColorWell::mouseReleaseEvent( TQMouseEvent *e )
+{
+ if ( !mousePressed )
+ return;
+ TQWellArray::mouseReleaseEvent( e );
+ mousePressed = FALSE;
+}
+
+class TQColorPicker : public TQFrame
+{
+ Q_OBJECT
+ TQ_OBJECT
+public:
+ TQColorPicker(TQWidget* tqparent=0, const char* name=0);
+ ~TQColorPicker();
+
+public Q_SLOTS:
+ void setCol( int h, int s );
+
+Q_SIGNALS:
+ void newCol( int h, int s );
+
+protected:
+ TQSize tqsizeHint() const;
+ void drawContents(TQPainter* p);
+ void mouseMoveEvent( TQMouseEvent * );
+ void mousePressEvent( TQMouseEvent * );
+
+private:
+ int hue;
+ int sat;
+
+ TQPoint colPt();
+ int huePt( const TQPoint &pt );
+ int satPt( const TQPoint &pt );
+ void setCol( const TQPoint &pt );
+
+ TQPixmap *pix;
+};
+
+static int pWidth = 200;
+static int pHeight = 200;
+
+class TQColorLuminancePicker : public TQWidget
+{
+ Q_OBJECT
+ TQ_OBJECT
+public:
+ TQColorLuminancePicker(TQWidget* tqparent=0, const char* name=0);
+ ~TQColorLuminancePicker();
+
+public Q_SLOTS:
+ void setCol( int h, int s, int v );
+ void setCol( int h, int s );
+
+Q_SIGNALS:
+ void newHsv( int h, int s, int v );
+
+protected:
+ void paintEvent( TQPaintEvent*);
+ void mouseMoveEvent( TQMouseEvent * );
+ void mousePressEvent( TQMouseEvent * );
+
+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 );
+
+ TQPixmap *pix;
+};
+
+
+int TQColorLuminancePicker::y2val( int y )
+{
+ int d = height() - 2*coff - 1;
+ return 255 - (y - coff)*255/d;
+}
+
+int TQColorLuminancePicker::val2y( int v )
+{
+ int d = height() - 2*coff - 1;
+ return coff + (255-v)*d/255;
+}
+
+TQColorLuminancePicker::TQColorLuminancePicker(TQWidget* tqparent,
+ const char* name)
+ :TQWidget( tqparent, name )
+{
+ hue = 100; val = 100; sat = 100;
+ pix = 0;
+ // setBackgroundMode( NoBackground );
+}
+
+TQColorLuminancePicker::~TQColorLuminancePicker()
+{
+ delete pix;
+}
+
+void TQColorLuminancePicker::mouseMoveEvent( TQMouseEvent *m )
+{
+ setVal( y2val(m->y()) );
+}
+void TQColorLuminancePicker::mousePressEvent( TQMouseEvent *m )
+{
+ setVal( y2val(m->y()) );
+}
+
+void TQColorLuminancePicker::setVal( int v )
+{
+ if ( val == v )
+ return;
+ val = TQMAX( 0, TQMIN(v,255));
+ delete pix; pix=0;
+ tqrepaint( FALSE ); //###
+ emit newHsv( hue, sat, val );
+}
+
+//receives from a hue,sat chooser and relays.
+void TQColorLuminancePicker::setCol( int h, int s )
+{
+ setCol( h, s, val );
+ emit newHsv( h, s, val );
+}
+
+void TQColorLuminancePicker::paintEvent( TQPaintEvent * )
+{
+ int w = width() - 5;
+
+ TQRect r( 0, foff, w, height() - 2*foff );
+ int wi = r.width() - 2;
+ int hi = r.height() - 2;
+ if ( !pix || pix->height() != hi || pix->width() != wi ) {
+ delete pix;
+ TQImage img( wi, hi, 32 );
+ int y;
+ for ( y = 0; y < hi; y++ ) {
+ TQColor c( hue, sat, y2val(y+coff), TQColor::Hsv );
+ TQRgb r = c.rgb();
+ int x;
+ for ( x = 0; x < wi; x++ )
+ img.setPixel( x, y, r );
+ }
+ pix = new TQPixmap;
+ pix->convertFromImage(img);
+ }
+ TQPainter p(this);
+ p.drawPixmap( 1, coff, *pix );
+ const TQColorGroup &g = tqcolorGroup();
+ qDrawShadePanel( &p, r, g, TRUE );
+ p.setPen( g.foreground() );
+ p.setBrush( g.foreground() );
+ TQPointArray a;
+ int y = val2y(val);
+ a.setPoints( 3, w, y, w+5, y+5, w+5, y-5 );
+ erase( w, 0, 5, height() );
+ p.drawPolygon( a );
+}
+
+void TQColorLuminancePicker::setCol( int h, int s , int v )
+{
+ val = v;
+ hue = h;
+ sat = s;
+ delete pix; pix=0;
+ tqrepaint( FALSE );//####
+}
+
+TQPoint TQColorPicker::colPt()
+{ return TQPoint( (360-hue)*(pWidth-1)/360, (255-sat)*(pHeight-1)/255 ); }
+int TQColorPicker::huePt( const TQPoint &pt )
+{ return 360 - pt.x()*360/(pWidth-1); }
+int TQColorPicker::satPt( const TQPoint &pt )
+{ return 255 - pt.y()*255/(pHeight-1) ; }
+void TQColorPicker::setCol( const TQPoint &pt )
+{ setCol( huePt(pt), satPt(pt) ); }
+
+TQColorPicker::TQColorPicker(TQWidget* tqparent, const char* name )
+ : TQFrame( tqparent, name )
+{
+ hue = 0; sat = 0;
+ setCol( 150, 255 );
+
+ TQImage img( pWidth, pHeight, 32 );
+ int x,y;
+ for ( y = 0; y < pHeight; y++ )
+ for ( x = 0; x < pWidth; x++ ) {
+ TQPoint p( x, y );
+ img.setPixel( x, y, TQColor(huePt(p), satPt(p),
+ 200, TQColor::Hsv).rgb() );
+ }
+ pix = new TQPixmap;
+ pix->convertFromImage(img);
+ setBackgroundMode( TQt::NoBackground );
+ tqsetSizePolicy( TQSizePolicy( TQSizePolicy::Fixed, TQSizePolicy::Fixed ) );
+}
+
+TQColorPicker::~TQColorPicker()
+{
+ delete pix;
+}
+
+TQSize TQColorPicker::tqsizeHint() const
+{
+ return TQSize( pWidth + 2*frameWidth(), pHeight + 2*frameWidth() );
+}
+
+void TQColorPicker::setCol( int h, int s )
+{
+ int nhue = TQMIN( TQMAX(0,h), 360 );
+ int nsat = TQMIN( TQMAX(0,s), 255);
+ if ( nhue == hue && nsat == sat )
+ return;
+ TQRect r( colPt(), TQSize(20,20) );
+ hue = nhue; sat = nsat;
+ r = r.unite( TQRect( colPt(), TQSize(20,20) ) );
+ r.moveBy( contentsRect().x()-9, contentsRect().y()-9 );
+ // update( r );
+ tqrepaint( r, FALSE );
+}
+
+void TQColorPicker::mouseMoveEvent( TQMouseEvent *m )
+{
+ TQPoint p = m->pos() - contentsRect().topLeft();
+ setCol( p );
+ emit newCol( hue, sat );
+}
+
+void TQColorPicker::mousePressEvent( TQMouseEvent *m )
+{
+ TQPoint p = m->pos() - contentsRect().topLeft();
+ setCol( p );
+ emit newCol( hue, sat );
+}
+
+void TQColorPicker::drawContents(TQPainter* p)
+{
+ TQRect r = contentsRect();
+
+ p->drawPixmap( r.topLeft(), *pix );
+ TQPoint pt = colPt() + r.topLeft();
+ p->setPen( TQPen(Qt::black) );
+
+ p->fillRect( pt.x()-9, pt.y(), 20, 2, Qt::black );
+ p->fillRect( pt.x(), pt.y()-9, 2, 20, Qt::black );
+
+}
+
+class TQColorShowLabel;
+
+
+
+class TQColIntValidator: public TQIntValidator
+{
+public:
+ TQColIntValidator( int bottom, int top,
+ TQWidget * tqparent, const char *name = 0 )
+ :TQIntValidator( bottom, top, TQT_TQOBJECT(tqparent), name ) {}
+
+ TQValidator::State validate( TQString &, int & ) const;
+};
+
+TQValidator::State TQColIntValidator::validate( TQString &s, int &pos ) const
+{
+ State state = TQIntValidator::validate(s,pos);
+ if ( state == Valid ) {
+ long int val = s.toLong();
+ // This is not a general solution, assumes that top() > 0 and
+ // bottom >= 0
+ if ( val < 0 ) {
+ s = "0";
+ pos = 1;
+ } else if ( val > top() ) {
+ s.setNum( top() );
+ pos = s.length();
+ }
+ }
+ return state;
+}
+
+
+
+class TQColNumLineEdit : public TQLineEdit
+{
+public:
+ TQColNumLineEdit( TQWidget *tqparent, const char* name=0 )
+ : TQLineEdit( tqparent, name ) { setMaxLength( 3 );}
+ TQSize tqsizeHint() const {
+ return TQSize( fontMetrics().width( "999" ) + 2 * ( margin() + frameWidth() ),
+ TQLineEdit::tqsizeHint().height() ); }
+ void setNum( int i ) {
+ TQString s;
+ s.setNum(i);
+ bool block = tqsignalsBlocked();
+ blockSignals(TRUE);
+ setText( s );
+ blockSignals(block);
+ }
+ int val() const { return text().toInt(); }
+};
+
+
+class TQColorShower : public TQWidget
+{
+ Q_OBJECT
+ TQ_OBJECT
+public:
+ TQColorShower( TQWidget *tqparent, const char *name=0 );
+
+ //things that don't emit Q_SIGNALS
+ void setHsv( int h, int s, int v );
+
+ int currentAlpha() const { return alphaEd->val(); }
+ void setCurrentAlpha( int a ) { alphaEd->setNum( a ); }
+ void showAlpha( bool b );
+
+
+ TQRgb currentColor() const { return curCol; }
+
+public Q_SLOTS:
+ void setRgb( TQRgb rgb );
+
+Q_SIGNALS:
+ void newCol( TQRgb rgb );
+private Q_SLOTS:
+ void rgbEd();
+ void hsvEd();
+private:
+ void showCurrentColor();
+ int hue, sat, val;
+ TQRgb curCol;
+ TQColNumLineEdit *hEd;
+ TQColNumLineEdit *sEd;
+ TQColNumLineEdit *vEd;
+ TQColNumLineEdit *rEd;
+ TQColNumLineEdit *gEd;
+ TQColNumLineEdit *bEd;
+ TQColNumLineEdit *alphaEd;
+ TQLabel *alphaLab;
+ TQColorShowLabel *lab;
+ bool rgbOriginal;
+};
+
+class TQColorShowLabel : public TQFrame
+{
+ Q_OBJECT
+ TQ_OBJECT
+
+public:
+ TQColorShowLabel( TQWidget *tqparent ) : TQFrame( tqparent, "qt_colorshow_lbl" ) {
+ setFrameStyle( TQFrame::Panel|TQFrame::Sunken );
+ setBackgroundMode( TQt::PaletteBackground );
+ setAcceptDrops( TRUE );
+ mousePressed = FALSE;
+ }
+ void setColor( TQColor c ) { col = c; }
+
+Q_SIGNALS:
+ void colorDropped( TQRgb );
+
+protected:
+ void drawContents( TQPainter *p );
+ void mousePressEvent( TQMouseEvent *e );
+ void mouseMoveEvent( TQMouseEvent *e );
+ void mouseReleaseEvent( TQMouseEvent *e );
+#ifndef TQT_NO_DRAGANDDROP
+ void dragEnterEvent( TQDragEnterEvent *e );
+ void dragLeaveEvent( TQDragLeaveEvent *e );
+ void dropEvent( TQDropEvent *e );
+#endif
+
+private:
+ TQColor col;
+ bool mousePressed;
+ TQPoint pressPos;
+
+};
+
+void TQColorShowLabel::drawContents( TQPainter *p )
+{
+ p->fillRect( contentsRect(), col );
+}
+
+void TQColorShower::showAlpha( bool b )
+{
+ if ( b ) {
+ alphaLab->show();
+ alphaEd->show();
+ } else {
+ alphaLab->hide();
+ alphaEd->hide();
+ }
+}
+
+void TQColorShowLabel::mousePressEvent( TQMouseEvent *e )
+{
+ mousePressed = TRUE;
+ pressPos = e->pos();
+}
+
+void TQColorShowLabel::mouseMoveEvent( TQMouseEvent *e )
+{
+#ifndef TQT_NO_DRAGANDDROP
+ if ( !mousePressed )
+ return;
+ if ( ( pressPos - e->pos() ).manhattanLength() > TQApplication::startDragDistance() ) {
+ TQColorDrag *drg = new TQColorDrag( col, this );
+ TQPixmap pix( 30, 20 );
+ pix.fill( col );
+ TQPainter p( &pix );
+ p.drawRect( 0, 0, pix.width(), pix.height() );
+ p.end();
+ drg->setPixmap( pix );
+ mousePressed = FALSE;
+ drg->dragCopy();
+ }
+#endif
+}
+
+#ifndef TQT_NO_DRAGANDDROP
+void TQColorShowLabel::dragEnterEvent( TQDragEnterEvent *e )
+{
+ if ( TQColorDrag::canDecode( e ) )
+ e->accept();
+ else
+ e->ignore();
+}
+
+void TQColorShowLabel::dragLeaveEvent( TQDragLeaveEvent * )
+{
+}
+
+void TQColorShowLabel::dropEvent( TQDropEvent *e )
+{
+ if ( TQColorDrag::canDecode( e ) ) {
+ TQColorDrag::decode( e, col );
+ tqrepaint( FALSE );
+ emit colorDropped( col.rgb() );
+ e->accept();
+ } else {
+ e->ignore();
+ }
+}
+#endif // TQT_NO_DRAGANDDROP
+
+void TQColorShowLabel::mouseReleaseEvent( TQMouseEvent * )
+{
+ if ( !mousePressed )
+ return;
+ mousePressed = FALSE;
+}
+
+TQColorShower::TQColorShower( TQWidget *tqparent, const char *name )
+ :TQWidget( tqparent, name)
+{
+ curCol = tqRgb( -1, -1, -1 );
+ TQColIntValidator *val256 = new TQColIntValidator( 0, 255, this );
+ TQColIntValidator *val360 = new TQColIntValidator( 0, 360, this );
+
+ TQGridLayout *gl = new TQGridLayout( this, 1, 1, 6 );
+ lab = new TQColorShowLabel( this );
+ lab->setMinimumWidth( 60 ); //###
+ gl->addMultiCellWidget(lab, 0,-1,0,0);
+ connect( lab, TQT_SIGNAL( colorDropped(TQRgb) ),
+ this, TQT_SIGNAL( newCol(TQRgb) ) );
+ connect( lab, TQT_SIGNAL( colorDropped(TQRgb) ),
+ this, TQT_SLOT( setRgb(TQRgb) ) );
+
+ hEd = new TQColNumLineEdit( this, "qt_hue_edit" );
+ hEd->setValidator( val360 );
+ TQLabel *l = new TQLabel( hEd, TQColorDialog::tr("Hu&e:"), this, "qt_hue_lbl" );
+ l->tqsetAlignment( Qt::AlignRight|Qt::AlignVCenter );
+ gl->addWidget( l, 0, 1 );
+ gl->addWidget( hEd, 0, 2 );
+
+ sEd = new TQColNumLineEdit( this, "qt_sat_edit" );
+ sEd->setValidator( val256 );
+ l = new TQLabel( sEd, TQColorDialog::tr("&Sat:"), this, "qt_sat_lbl" );
+ l->tqsetAlignment( Qt::AlignRight|Qt::AlignVCenter );
+ gl->addWidget( l, 1, 1 );
+ gl->addWidget( sEd, 1, 2 );
+
+ vEd = new TQColNumLineEdit( this, "qt_val_edit" );
+ vEd->setValidator( val256 );
+ l = new TQLabel( vEd, TQColorDialog::tr("&Val:"), this, "qt_val_lbl" );
+ l->tqsetAlignment( Qt::AlignRight|Qt::AlignVCenter );
+ gl->addWidget( l, 2, 1 );
+ gl->addWidget( vEd, 2, 2 );
+
+ rEd = new TQColNumLineEdit( this, "qt_red_edit" );
+ rEd->setValidator( val256 );
+ l = new TQLabel( rEd, TQColorDialog::tr("&Red:"), this, "qt_red_lbl" );
+ l->tqsetAlignment( Qt::AlignRight|Qt::AlignVCenter );
+ gl->addWidget( l, 0, 3 );
+ gl->addWidget( rEd, 0, 4 );
+
+ gEd = new TQColNumLineEdit( this, "qt_grn_edit" );
+ gEd->setValidator( val256 );
+ l = new TQLabel( gEd, TQColorDialog::tr("&Green:"), this, "qt_grn_lbl" );
+ l->tqsetAlignment( Qt::AlignRight|Qt::AlignVCenter );
+ gl->addWidget( l, 1, 3 );
+ gl->addWidget( gEd, 1, 4 );
+
+ bEd = new TQColNumLineEdit( this, "qt_blue_edit" );
+ bEd->setValidator( val256 );
+ l = new TQLabel( bEd, TQColorDialog::tr("Bl&ue:"), this, "qt_blue_lbl" );
+ l->tqsetAlignment( Qt::AlignRight|Qt::AlignVCenter );
+ gl->addWidget( l, 2, 3 );
+ gl->addWidget( bEd, 2, 4 );
+
+ alphaEd = new TQColNumLineEdit( this, "qt_aplha_edit" );
+ alphaEd->setValidator( val256 );
+ alphaLab = new TQLabel( alphaEd, TQColorDialog::tr("A&lpha channel:"), this, "qt_alpha_lbl" );
+ alphaLab->tqsetAlignment( Qt::AlignRight|Qt::AlignVCenter );
+ gl->addMultiCellWidget( alphaLab, 3, 3, 1, 3 );
+ gl->addWidget( alphaEd, 3, 4 );
+ alphaEd->hide();
+ alphaLab->hide();
+
+ connect( hEd, TQT_SIGNAL(textChanged(const TQString&)), this, TQT_SLOT(hsvEd()) );
+ connect( sEd, TQT_SIGNAL(textChanged(const TQString&)), this, TQT_SLOT(hsvEd()) );
+ connect( vEd, TQT_SIGNAL(textChanged(const TQString&)), this, TQT_SLOT(hsvEd()) );
+
+ connect( rEd, TQT_SIGNAL(textChanged(const TQString&)), this, TQT_SLOT(rgbEd()) );
+ connect( gEd, TQT_SIGNAL(textChanged(const TQString&)), this, TQT_SLOT(rgbEd()) );
+ connect( bEd, TQT_SIGNAL(textChanged(const TQString&)), this, TQT_SLOT(rgbEd()) );
+ connect( alphaEd, TQT_SIGNAL(textChanged(const TQString&)), this, TQT_SLOT(rgbEd()) );
+}
+
+void TQColorShower::showCurrentColor()
+{
+ lab->setColor( currentColor() );
+ lab->tqrepaint(FALSE); //###
+}
+
+void TQColorShower::rgbEd()
+{
+ rgbOriginal = TRUE;
+ if ( alphaEd->isVisible() )
+ curCol = tqRgba( rEd->val(), gEd->val(), bEd->val(), currentAlpha() );
+ else
+ curCol = tqRgb( rEd->val(), gEd->val(), bEd->val() );
+
+ rgb2hsv(currentColor(), hue, sat, val );
+
+ hEd->setNum( hue );
+ sEd->setNum( sat );
+ vEd->setNum( val );
+
+ showCurrentColor();
+ emit newCol( currentColor() );
+}
+
+void TQColorShower::hsvEd()
+{
+ rgbOriginal = FALSE;
+ hue = hEd->val();
+ sat = sEd->val();
+ val = vEd->val();
+
+ curCol = TQColor( hue, sat, val, TQColor::Hsv ).rgb();
+
+ rEd->setNum( tqRed(currentColor()) );
+ gEd->setNum( tqGreen(currentColor()) );
+ bEd->setNum( tqBlue(currentColor()) );
+
+ showCurrentColor();
+ emit newCol( currentColor() );
+}
+
+void TQColorShower::setRgb( TQRgb rgb )
+{
+ rgbOriginal = TRUE;
+ curCol = rgb;
+
+ rgb2hsv( currentColor(), hue, sat, val );
+
+ hEd->setNum( hue );
+ sEd->setNum( sat );
+ vEd->setNum( val );
+
+ rEd->setNum( tqRed(currentColor()) );
+ gEd->setNum( tqGreen(currentColor()) );
+ bEd->setNum( tqBlue(currentColor()) );
+
+ showCurrentColor();
+}
+
+void TQColorShower::setHsv( int h, int s, int v )
+{
+ rgbOriginal = FALSE;
+ hue = h; val = v; sat = s; //Range check###
+ curCol = TQColor( hue, sat, val, TQColor::Hsv ).rgb();
+
+ hEd->setNum( hue );
+ sEd->setNum( sat );
+ vEd->setNum( val );
+
+ rEd->setNum( tqRed(currentColor()) );
+ gEd->setNum( tqGreen(currentColor()) );
+ bEd->setNum( tqBlue(currentColor()) );
+
+ showCurrentColor();
+}
+
+class TQColorDialogPrivate : public TQObject
+{
+ Q_OBJECT
+ TQ_OBJECT
+public:
+ TQColorDialogPrivate( TQColorDialog *p );
+ TQRgb currentColor() const { return cs->currentColor(); }
+ void setCurrentColor( TQRgb rgb );
+
+ int currentAlpha() const { return cs->currentAlpha(); }
+ void setCurrentAlpha( int a ) { cs->setCurrentAlpha( a ); }
+ void showAlpha( bool b ) { cs->showAlpha( b ); }
+
+public Q_SLOTS:
+ void addCustom();
+
+ void newHsv( int h, int s, int v );
+ void newColorTypedIn( TQRgb rgb );
+ void newCustom( int, int );
+ void newStandard( int, int );
+public:
+ TQWellArray *custom;
+ TQWellArray *standard;
+
+ TQColorPicker *cp;
+ TQColorLuminancePicker *lp;
+ TQColorShower *cs;
+ int nextCust;
+ bool compact;
+};
+
+//sets all widgets to display h,s,v
+void TQColorDialogPrivate::newHsv( int h, int s, int v )
+{
+ cs->setHsv( h, s, v );
+ cp->setCol( h, s );
+ lp->setCol( h, s, v );
+}
+
+//sets all widgets to display rgb
+void TQColorDialogPrivate::setCurrentColor( TQRgb rgb )
+{
+ cs->setRgb( rgb );
+ newColorTypedIn( rgb );
+}
+
+//sets all widgets exept cs to display rgb
+void TQColorDialogPrivate::newColorTypedIn( TQRgb rgb )
+{
+ int h, s, v;
+ rgb2hsv(rgb, h, s, v );
+ cp->setCol( h, s );
+ lp->setCol( h, s, v);
+}
+
+void TQColorDialogPrivate::newCustom( int r, int c )
+{
+ int i = r+2*c;
+ setCurrentColor( cusrgb[i] );
+ nextCust = i;
+ if (standard)
+ standard->setSelected(-1,-1);
+}
+
+void TQColorDialogPrivate::newStandard( int r, int c )
+{
+ setCurrentColor( stdrgb[r+c*6] );
+ if (custom)
+ custom->setSelected(-1,-1);
+}
+
+TQColorDialogPrivate::TQColorDialogPrivate( TQColorDialog *dialog ) :
+ TQObject(dialog)
+{
+ compact = FALSE;
+ // small displays (e.g. PDAs cannot fit the full color dialog,
+ // so just use the color picker.
+ if ( tqApp->desktop()->width() < 480 || tqApp->desktop()->height() < 350 )
+ compact = TRUE;
+
+ nextCust = 0;
+ const int lumSpace = 3;
+ int border = 12;
+ if ( compact )
+ border = 6;
+ TQHBoxLayout *topLay = new TQHBoxLayout( dialog, border, 6 );
+ TQVBoxLayout *leftLay = 0;
+
+ if ( !compact )
+ leftLay = new TQVBoxLayout( topLay );
+
+ initRGB();
+
+ if ( !compact ) {
+ standard = new TQColorWell( dialog, 6, 8, stdrgb );
+ standard->setCellWidth( 28 );
+ standard->setCellHeight( 24 );
+ TQLabel * lab = new TQLabel( standard,
+ TQColorDialog::tr( "&Basic colors"), dialog, "qt_basiccolors_lbl" );
+ connect( standard, TQT_SIGNAL(selected(int,int)), TQT_SLOT(newStandard(int,int)));
+ leftLay->addWidget( lab );
+ leftLay->addWidget( standard );
+
+
+ leftLay->addStretch();
+
+ custom = new TQColorWell( dialog, 2, 8, cusrgb );
+ custom->setCellWidth( 28 );
+ custom->setCellHeight( 24 );
+ custom->setAcceptDrops( TRUE );
+
+ connect( custom, TQT_SIGNAL(selected(int,int)), TQT_SLOT(newCustom(int,int)));
+ lab = new TQLabel( custom, TQColorDialog::tr( "&Custom colors") , dialog, "qt_custcolors_lbl" );
+ leftLay->addWidget( lab );
+ leftLay->addWidget( custom );
+
+ TQPushButton *custbut =
+ new TQPushButton( TQColorDialog::tr("&Define Custom Colors >>"),
+ dialog, "qt_def_custcolors_lbl" );
+ custbut->setEnabled( FALSE );
+ leftLay->addWidget( custbut );
+ } else {
+ // better color picker size for small displays
+ pWidth = 150;
+ pHeight = 100;
+
+ custom = 0;
+ standard = 0;
+ }
+
+ TQVBoxLayout *rightLay = new TQVBoxLayout( topLay );
+
+ TQHBoxLayout *pickLay = new TQHBoxLayout( rightLay );
+
+
+ TQVBoxLayout *cLay = new TQVBoxLayout( pickLay );
+ cp = new TQColorPicker( dialog, "qt_colorpicker" );
+ cp->setFrameStyle( TQFrame::Panel + TQFrame::Sunken );
+ cLay->addSpacing( lumSpace );
+ cLay->addWidget( cp );
+ cLay->addSpacing( lumSpace );
+
+ lp = new TQColorLuminancePicker( dialog, "qt_luminance_picker" );
+ lp->setFixedWidth( 20 ); //###
+ pickLay->addWidget( lp );
+
+ connect( cp, TQT_SIGNAL(newCol(int,int)), lp, TQT_SLOT(setCol(int,int)) );
+ connect( lp, TQT_SIGNAL(newHsv(int,int,int)), this, TQT_SLOT(newHsv(int,int,int)) );
+
+ rightLay->addStretch();
+
+ cs = new TQColorShower( dialog, "qt_colorshower" );
+ connect( cs, TQT_SIGNAL(newCol(TQRgb)), this, TQT_SLOT(newColorTypedIn(TQRgb)));
+ rightLay->addWidget( cs );
+
+ TQHBoxLayout *buttons;
+ if ( compact )
+ buttons = new TQHBoxLayout( rightLay );
+ else
+ buttons = new TQHBoxLayout( leftLay );
+
+ TQPushButton *ok, *cancel;
+ ok = new TQPushButton( TQColorDialog::tr("OK"), dialog, "qt_ok_btn" );
+ connect( ok, TQT_SIGNAL(clicked()), dialog, TQT_SLOT(accept()) );
+ ok->setDefault(TRUE);
+ cancel = new TQPushButton( TQColorDialog::tr("Cancel"), dialog, "qt_cancel_btn" );
+ connect( cancel, TQT_SIGNAL(clicked()), dialog, TQT_SLOT(reject()) );
+ buttons->addWidget( ok );
+ buttons->addWidget( cancel );
+ buttons->addStretch();
+
+ if ( !compact ) {
+ TQPushButton *addCusBt = new TQPushButton(
+ TQColorDialog::tr("&Add to Custom Colors"),
+ dialog, "qt_add_btn" );
+ rightLay->addWidget( addCusBt );
+ connect( addCusBt, TQT_SIGNAL(clicked()), this, TQT_SLOT(addCustom()) );
+ }
+}
+
+void TQColorDialogPrivate::addCustom()
+{
+ cusrgb[nextCust] = cs->currentColor();
+ if (custom)
+ custom->repaintContents( FALSE );
+ nextCust = (nextCust+1) % 16;
+}
+
+
+/*!
+ \class TQColorDialog tqcolordialog.h
+ \brief The TQColorDialog class provides a dialog widget for specifying colors.
+ \mainclass
+ \ingroup dialogs
+ \ingroup graphics
+
+ The color dialog's function is to allow users to choose colors.
+ For example, you might use this in a drawing program to allow the
+ user to set the brush color.
+
+ The static functions provide modal color dialogs.
+ \omit
+ If you require a modeless dialog, use the TQColorDialog constructor.
+ \endomit
+
+ The static getColor() function shows the dialog and allows the
+ user to specify a color. The getRgba() function does the same but
+ also allows the user to specify a color with an alpha channel
+ (transparency) value.
+
+ The user can store customCount() different custom colors. The
+ custom colors are shared by all color dialogs, and remembered
+ during the execution of the program. Use setCustomColor() to set
+ the custom colors, and use customColor() to get them.
+
+ \img qcolordlg-w.png
+*/
+
+/*!
+ Constructs a default color dialog with tqparent \a tqparent and called
+ \a name. If \a modal is TRUE the dialog will be modal. Use
+ setColor() to set an initial value.
+
+ \sa getColor()
+*/
+
+TQColorDialog::TQColorDialog(TQWidget* tqparent, const char* name, bool modal) :
+ TQDialog(tqparent, name, modal, (WFlags)( TQt::WType_Dialog | WStyle_Customize | TQt::WStyle_Title |
+ TQt::WStyle_DialogBorder | TQt::WStyle_SysMenu ) )
+{
+ setSizeGripEnabled( FALSE );
+ d = new TQColorDialogPrivate( this );
+
+#ifndef TQT_NO_SETTINGS
+ if ( !customSet ) {
+ TQSettings settings;
+ settings.insertSearchPath( TQSettings::Windows, "/Trolltech" );
+ for ( int i = 0; i < 2*8; ++i ) {
+ bool ok = FALSE;
+ TQRgb rgb = (TQRgb)settings.readNumEntry( "/TQt/customColors/" + TQString::number( i ), 0, &ok );
+ if ( ok )
+ cusrgb[i] = rgb;
+ }
+ }
+#endif
+}
+
+/*!
+ Pops up a modal color dialog, lets the user choose a color, and
+ returns that color. The color is initially set to \a initial. The
+ dialog is a child of \a tqparent and is called \a name. It returns
+ an invalid (see TQColor::isValid()) color if the user cancels the
+ dialog. All colors allocated by the dialog will be deallocated
+ before this function returns.
+*/
+
+TQColor TQColorDialog::getColor( const TQColor& initial, TQWidget *tqparent,
+ const char *name )
+{
+#if defined(TQ_WS_MAC)
+ return macGetColor(initial, tqparent, name);
+#endif
+
+ int allocContext = TQColor::enterAllocContext();
+ TQColorDialog *dlg = new TQColorDialog( tqparent, name, TRUE ); //modal
+#ifndef TQT_NO_WIDGET_TOPEXTRA
+ dlg->setCaption( TQColorDialog::tr( "Select color" ) );
+#endif
+ dlg->setColor( initial );
+ dlg->selectColor( initial );
+ int resultCode = dlg->exec();
+ TQColor::leaveAllocContext();
+ TQColor result;
+ if ( resultCode == TQDialog::Accepted )
+ result = dlg->color();
+ TQColor::destroyAllocContext(allocContext);
+ delete dlg;
+ return result;
+}
+
+
+/*!
+ Pops up a modal color dialog to allow the user to choose a color
+ and an alpha channel (transparency) value. The color+alpha is
+ initially set to \a initial. The dialog is a child of \a tqparent
+ and called \a name.
+
+ If \a ok is non-null, \e *\a ok is set to TRUE if the user clicked
+ OK, and to FALSE if the user clicked Cancel.
+
+ If the user clicks Cancel, the \a initial value is returned.
+*/
+
+TQRgb TQColorDialog::getRgba( TQRgb initial, bool *ok,
+ TQWidget *tqparent, const char* name )
+{
+#if defined(TQ_WS_MAC)
+ return macGetRgba(initial, ok, tqparent, name);
+#endif
+
+ int allocContext = TQColor::enterAllocContext();
+ TQColorDialog *dlg = new TQColorDialog( tqparent, name, TRUE ); //modal
+
+ TQ_CHECK_PTR( dlg );
+#ifndef TQT_NO_WIDGET_TOPEXTRA
+ dlg->setCaption( TQColorDialog::tr( "Select color" ) );
+#endif
+ dlg->setColor( initial );
+ dlg->selectColor( initial );
+ dlg->setSelectedAlpha( tqAlpha(initial) );
+ int resultCode = dlg->exec();
+ TQColor::leaveAllocContext();
+ TQRgb result = initial;
+ if ( resultCode == TQDialog::Accepted ) {
+ TQRgb c = dlg->color().rgb();
+ int alpha = dlg->selectedAlpha();
+ result = tqRgba( tqRed(c), tqGreen(c), tqBlue(c), alpha );
+ }
+ if ( ok )
+ *ok = resultCode == TQDialog::Accepted;
+
+ TQColor::destroyAllocContext(allocContext);
+ delete dlg;
+ return result;
+}
+
+
+
+
+
+/*!
+ Returns the color currently selected in the dialog.
+
+ \sa setColor()
+*/
+
+TQColor TQColorDialog::color() const
+{
+ return TQColor(d->currentColor());
+}
+
+
+/*!
+ Destroys the dialog and frees any memory it allocated.
+*/
+
+TQColorDialog::~TQColorDialog()
+{
+#ifndef TQT_NO_SETTINGS
+ if ( !customSet ) {
+ TQSettings settings;
+ settings.insertSearchPath( TQSettings::Windows, "/Trolltech" );
+ for ( int i = 0; i < 2*8; ++i )
+ settings.writeEntry( "/TQt/customColors/" + TQString::number( i ), (int)cusrgb[i] );
+ }
+#endif
+}
+
+
+/*!
+ Sets the color shown in the dialog to \a c.
+
+ \sa color()
+*/
+
+void TQColorDialog::setColor( const TQColor& c )
+{
+ d->setCurrentColor( c.rgb() );
+}
+
+
+
+
+/*!
+ Sets the initial alpha channel value to \a a, and shows the alpha
+ channel entry box.
+*/
+
+void TQColorDialog::setSelectedAlpha( int a )
+{
+ d->showAlpha( TRUE );
+ d->setCurrentAlpha( a );
+}
+
+
+/*!
+ Returns the value selected for the alpha channel.
+*/
+
+int TQColorDialog::selectedAlpha() const
+{
+ return d->currentAlpha();
+}
+
+/*!
+ Sets focus to the corresponding button, if any.
+*/
+bool TQColorDialog::selectColor( const TQColor& col )
+{
+ TQRgb color = col.rgb();
+ int i = 0, j = 0;
+ // Check standard colors
+ if (d->standard) {
+ for ( i = 0; i < 6; i++ ) {
+ for ( j = 0; j < 8; j++ ) {
+ if ( color == stdrgb[i + j*6] ) {
+ d->newStandard( i, j );
+ d->standard->setCurrent( i, j );
+ d->standard->setSelected( i, j );
+ d->standard->setFocus();
+ return TRUE;
+ }
+ }
+ }
+ }
+ // Check custom colors
+ if (d->custom) {
+ for ( i = 0; i < 2; i++ ) {
+ for ( j = 0; j < 8; j++ ) {
+ if ( color == cusrgb[i + j*2] ) {
+ d->newCustom( i, j );
+ d->custom->setCurrent( i, j );
+ d->custom->setSelected( i, j );
+ d->custom->setFocus();
+ return TRUE;
+ }
+ }
+ }
+ }
+ return FALSE;
+}
+
+#include "tqcolordialog.tqmoc"
+
+#endif