author | Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> |
Mon, 03 May 2010 13:17:34 +0300 | |
changeset 19 | fcece45ef507 |
parent 18 | 2f34d5167611 |
permissions | -rw-r--r-- |
0 | 1 |
/**************************************************************************** |
2 |
** |
|
18
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
3 |
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). |
0 | 4 |
** All rights reserved. |
5 |
** Contact: Nokia Corporation (qt-info@nokia.com) |
|
6 |
** |
|
7 |
** This file is part of the QtGui module of the Qt Toolkit. |
|
8 |
** |
|
9 |
** $QT_BEGIN_LICENSE:LGPL$ |
|
10 |
** No Commercial Usage |
|
11 |
** This file contains pre-release code and may not be distributed. |
|
12 |
** You may use this file in accordance with the terms and conditions |
|
13 |
** contained in the Technology Preview License Agreement accompanying |
|
14 |
** this package. |
|
15 |
** |
|
16 |
** GNU Lesser General Public License Usage |
|
17 |
** Alternatively, this file may be used under the terms of the GNU Lesser |
|
18 |
** General Public License version 2.1 as published by the Free Software |
|
19 |
** Foundation and appearing in the file LICENSE.LGPL included in the |
|
20 |
** packaging of this file. Please review the following information to |
|
21 |
** ensure the GNU Lesser General Public License version 2.1 requirements |
|
22 |
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. |
|
23 |
** |
|
24 |
** In addition, as a special exception, Nokia gives you certain additional |
|
25 |
** rights. These rights are described in the Nokia Qt LGPL Exception |
|
26 |
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. |
|
27 |
** |
|
28 |
** If you have questions regarding the use of this file, please contact |
|
29 |
** Nokia at qt-info@nokia.com. |
|
30 |
** |
|
31 |
** |
|
32 |
** |
|
33 |
** |
|
34 |
** |
|
35 |
** |
|
36 |
** |
|
37 |
** |
|
38 |
** $QT_END_LICENSE$ |
|
39 |
** |
|
40 |
****************************************************************************/ |
|
41 |
||
42 |
#include "qcolordialog_p.h" |
|
43 |
||
44 |
#ifndef QT_NO_COLORDIALOG |
|
45 |
||
46 |
#include "qapplication.h" |
|
47 |
#include "qdesktopwidget.h" |
|
48 |
#include "qdrawutil.h" |
|
49 |
#include "qevent.h" |
|
50 |
#include "qimage.h" |
|
51 |
#include "qlabel.h" |
|
52 |
#include "qlayout.h" |
|
53 |
#include "qlineedit.h" |
|
54 |
#include "qmenu.h" |
|
55 |
#include "qpainter.h" |
|
56 |
#include "qpixmap.h" |
|
57 |
#include "qpushbutton.h" |
|
58 |
#include "qsettings.h" |
|
59 |
#include "qstyle.h" |
|
60 |
#include "qstyleoption.h" |
|
61 |
#include "qvalidator.h" |
|
62 |
#include "qmime.h" |
|
63 |
#include "qspinbox.h" |
|
64 |
#include "qdialogbuttonbox.h" |
|
65 |
#include "private/qguiplatformplugin_p.h" |
|
66 |
||
67 |
#ifdef Q_WS_S60 |
|
68 |
#include "private/qt_s60_p.h" |
|
69 |
#endif |
|
70 |
||
18
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
71 |
#if defined(Q_WS_S60) || defined(Q_WS_MAEMO_5) |
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
72 |
# define QT_SMALL_COLORDIALOG |
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
73 |
#endif |
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
74 |
|
0 | 75 |
QT_BEGIN_NAMESPACE |
76 |
||
77 |
//////////// QWellArray BEGIN |
|
78 |
||
79 |
struct QWellArrayData; |
|
80 |
||
81 |
class QWellArray : public QWidget |
|
82 |
{ |
|
83 |
Q_OBJECT |
|
84 |
Q_PROPERTY(int selectedColumn READ selectedColumn) |
|
85 |
Q_PROPERTY(int selectedRow READ selectedRow) |
|
86 |
||
87 |
public: |
|
88 |
QWellArray(int rows, int cols, QWidget* parent=0); |
|
89 |
~QWellArray() {} |
|
90 |
QString cellContent(int row, int col) const; |
|
91 |
||
92 |
int selectedColumn() const { return selCol; } |
|
93 |
int selectedRow() const { return selRow; } |
|
94 |
||
95 |
virtual void setCurrent(int row, int col); |
|
96 |
virtual void setSelected(int row, int col); |
|
97 |
||
98 |
QSize sizeHint() const; |
|
99 |
||
100 |
virtual void setCellBrush(int row, int col, const QBrush &); |
|
101 |
QBrush cellBrush(int row, int col); |
|
102 |
||
103 |
inline int cellWidth() const |
|
104 |
{ return cellw; } |
|
105 |
||
106 |
inline int cellHeight() const |
|
107 |
{ return cellh; } |
|
108 |
||
109 |
inline int rowAt(int y) const |
|
110 |
{ return y / cellh; } |
|
111 |
||
112 |
inline int columnAt(int x) const |
|
113 |
{ if (isRightToLeft()) return ncols - (x / cellw) - 1; return x / cellw; } |
|
114 |
||
115 |
inline int rowY(int row) const |
|
116 |
{ return cellh * row; } |
|
117 |
||
118 |
inline int columnX(int column) const |
|
119 |
{ if (isRightToLeft()) return cellw * (ncols - column - 1); return cellw * column; } |
|
120 |
||
121 |
inline int numRows() const |
|
122 |
{ return nrows; } |
|
123 |
||
124 |
inline int numCols() const |
|
125 |
{return ncols; } |
|
126 |
||
127 |
inline QRect cellRect() const |
|
128 |
{ return QRect(0, 0, cellw, cellh); } |
|
129 |
||
130 |
inline QSize gridSize() const |
|
131 |
{ return QSize(ncols * cellw, nrows * cellh); } |
|
132 |
||
133 |
QRect cellGeometry(int row, int column) |
|
134 |
{ |
|
135 |
QRect r; |
|
136 |
if (row >= 0 && row < nrows && column >= 0 && column < ncols) |
|
137 |
r.setRect(columnX(column), rowY(row), cellw, cellh); |
|
138 |
return r; |
|
139 |
} |
|
140 |
||
141 |
inline void updateCell(int row, int column) { update(cellGeometry(row, column)); } |
|
142 |
||
143 |
signals: |
|
144 |
void selected(int row, int col); |
|
145 |
||
146 |
protected: |
|
147 |
virtual void paintCell(QPainter *, int row, int col, const QRect&); |
|
148 |
virtual void paintCellContents(QPainter *, int row, int col, const QRect&); |
|
149 |
||
150 |
void mousePressEvent(QMouseEvent*); |
|
151 |
void mouseReleaseEvent(QMouseEvent*); |
|
152 |
void keyPressEvent(QKeyEvent*); |
|
153 |
void focusInEvent(QFocusEvent*); |
|
154 |
void focusOutEvent(QFocusEvent*); |
|
155 |
void paintEvent(QPaintEvent *); |
|
156 |
||
157 |
private: |
|
158 |
Q_DISABLE_COPY(QWellArray) |
|
159 |
||
160 |
int nrows; |
|
161 |
int ncols; |
|
162 |
int cellw; |
|
163 |
int cellh; |
|
164 |
int curRow; |
|
165 |
int curCol; |
|
166 |
int selRow; |
|
167 |
int selCol; |
|
168 |
QWellArrayData *d; |
|
169 |
}; |
|
170 |
||
171 |
void QWellArray::paintEvent(QPaintEvent *e) |
|
172 |
{ |
|
173 |
QRect r = e->rect(); |
|
174 |
int cx = r.x(); |
|
175 |
int cy = r.y(); |
|
176 |
int ch = r.height(); |
|
177 |
int cw = r.width(); |
|
178 |
int colfirst = columnAt(cx); |
|
179 |
int collast = columnAt(cx + cw); |
|
180 |
int rowfirst = rowAt(cy); |
|
181 |
int rowlast = rowAt(cy + ch); |
|
182 |
||
183 |
if (isRightToLeft()) { |
|
184 |
int t = colfirst; |
|
185 |
colfirst = collast; |
|
186 |
collast = t; |
|
187 |
} |
|
188 |
||
189 |
QPainter painter(this); |
|
190 |
QPainter *p = &painter; |
|
191 |
QRect rect(0, 0, cellWidth(), cellHeight()); |
|
192 |
||
193 |
||
194 |
if (collast < 0 || collast >= ncols) |
|
195 |
collast = ncols-1; |
|
196 |
if (rowlast < 0 || rowlast >= nrows) |
|
197 |
rowlast = nrows-1; |
|
198 |
||
199 |
// Go through the rows |
|
200 |
for (int r = rowfirst; r <= rowlast; ++r) { |
|
201 |
// get row position and height |
|
202 |
int rowp = rowY(r); |
|
203 |
||
204 |
// Go through the columns in the row r |
|
205 |
// if we know from where to where, go through [colfirst, collast], |
|
206 |
// else go through all of them |
|
207 |
for (int c = colfirst; c <= collast; ++c) { |
|
208 |
// get position and width of column c |
|
209 |
int colp = columnX(c); |
|
210 |
// Translate painter and draw the cell |
|
211 |
rect.translate(colp, rowp); |
|
212 |
paintCell(p, r, c, rect); |
|
213 |
rect.translate(-colp, -rowp); |
|
214 |
} |
|
215 |
} |
|
216 |
} |
|
217 |
||
218 |
struct QWellArrayData { |
|
219 |
QBrush *brush; |
|
220 |
}; |
|
221 |
||
222 |
QWellArray::QWellArray(int rows, int cols, QWidget *parent) |
|
223 |
: QWidget(parent) |
|
224 |
,nrows(rows), ncols(cols) |
|
225 |
{ |
|
226 |
d = 0; |
|
227 |
setFocusPolicy(Qt::StrongFocus); |
|
228 |
cellw = 28; |
|
229 |
cellh = 24; |
|
230 |
curCol = 0; |
|
231 |
curRow = 0; |
|
232 |
selCol = -1; |
|
233 |
selRow = -1; |
|
234 |
} |
|
235 |
||
236 |
QSize QWellArray::sizeHint() const |
|
237 |
{ |
|
238 |
ensurePolished(); |
|
239 |
return gridSize().boundedTo(QSize(640, 480)); |
|
240 |
} |
|
241 |
||
242 |
||
243 |
void QWellArray::paintCell(QPainter* p, int row, int col, const QRect &rect) |
|
244 |
{ |
|
245 |
int b = 3; //margin |
|
246 |
||
247 |
const QPalette & g = palette(); |
|
248 |
QStyleOptionFrame opt; |
|
249 |
int dfw = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); |
|
250 |
opt.lineWidth = dfw; |
|
251 |
opt.midLineWidth = 1; |
|
252 |
opt.rect = rect.adjusted(b, b, -b, -b); |
|
253 |
opt.palette = g; |
|
254 |
opt.state = QStyle::State_Enabled | QStyle::State_Sunken; |
|
255 |
style()->drawPrimitive(QStyle::PE_Frame, &opt, p, this); |
|
256 |
b += dfw; |
|
257 |
||
258 |
if ((row == curRow) && (col == curCol)) { |
|
259 |
if (hasFocus()) { |
|
260 |
QStyleOptionFocusRect opt; |
|
261 |
opt.palette = g; |
|
262 |
opt.rect = rect; |
|
263 |
opt.state = QStyle::State_None | QStyle::State_KeyboardFocusChange; |
|
264 |
style()->drawPrimitive(QStyle::PE_FrameFocusRect, &opt, p, this); |
|
265 |
} |
|
266 |
} |
|
267 |
paintCellContents(p, row, col, opt.rect.adjusted(dfw, dfw, -dfw, -dfw)); |
|
268 |
} |
|
269 |
||
270 |
/*! |
|
271 |
Reimplement this function to change the contents of the well array. |
|
272 |
*/ |
|
273 |
void QWellArray::paintCellContents(QPainter *p, int row, int col, const QRect &r) |
|
274 |
{ |
|
275 |
if (d) { |
|
276 |
p->fillRect(r, d->brush[row*numCols()+col]); |
|
277 |
} else { |
|
278 |
p->fillRect(r, Qt::white); |
|
279 |
p->setPen(Qt::black); |
|
280 |
p->drawLine(r.topLeft(), r.bottomRight()); |
|
281 |
p->drawLine(r.topRight(), r.bottomLeft()); |
|
282 |
} |
|
283 |
} |
|
284 |
||
285 |
void QWellArray::mousePressEvent(QMouseEvent *e) |
|
286 |
{ |
|
287 |
// The current cell marker is set to the cell the mouse is pressed in |
|
288 |
QPoint pos = e->pos(); |
|
289 |
setCurrent(rowAt(pos.y()), columnAt(pos.x())); |
|
290 |
} |
|
291 |
||
292 |
void QWellArray::mouseReleaseEvent(QMouseEvent * /* event */) |
|
293 |
{ |
|
294 |
// The current cell marker is set to the cell the mouse is clicked in |
|
295 |
setSelected(curRow, curCol); |
|
296 |
} |
|
297 |
||
298 |
||
299 |
/* |
|
300 |
Sets the cell currently having the focus. This is not necessarily |
|
301 |
the same as the currently selected cell. |
|
302 |
*/ |
|
303 |
||
304 |
void QWellArray::setCurrent(int row, int col) |
|
305 |
{ |
|
306 |
if ((curRow == row) && (curCol == col)) |
|
307 |
return; |
|
308 |
||
309 |
if (row < 0 || col < 0) |
|
310 |
row = col = -1; |
|
311 |
||
312 |
int oldRow = curRow; |
|
313 |
int oldCol = curCol; |
|
314 |
||
315 |
curRow = row; |
|
316 |
curCol = col; |
|
317 |
||
318 |
updateCell(oldRow, oldCol); |
|
319 |
updateCell(curRow, curCol); |
|
320 |
} |
|
321 |
||
322 |
/* |
|
323 |
Sets the currently selected cell to \a row, \a column. If \a row or |
|
324 |
\a column are less than zero, the current cell is unselected. |
|
325 |
||
326 |
Does not set the position of the focus indicator. |
|
327 |
*/ |
|
328 |
void QWellArray::setSelected(int row, int col) |
|
329 |
{ |
|
330 |
int oldRow = selRow; |
|
331 |
int oldCol = selCol; |
|
332 |
||
333 |
if (row < 0 || col < 0) |
|
334 |
row = col = -1; |
|
335 |
||
336 |
selCol = col; |
|
337 |
selRow = row; |
|
338 |
||
339 |
updateCell(oldRow, oldCol); |
|
340 |
updateCell(selRow, selCol); |
|
341 |
if (row >= 0) |
|
342 |
emit selected(row, col); |
|
343 |
||
344 |
#ifndef QT_NO_MENU |
|
345 |
if (isVisible() && qobject_cast<QMenu*>(parentWidget())) |
|
346 |
parentWidget()->close(); |
|
347 |
#endif |
|
348 |
} |
|
349 |
||
350 |
void QWellArray::focusInEvent(QFocusEvent*) |
|
351 |
{ |
|
352 |
updateCell(curRow, curCol); |
|
353 |
} |
|
354 |
||
355 |
void QWellArray::setCellBrush(int row, int col, const QBrush &b) |
|
356 |
{ |
|
357 |
if (!d) { |
|
358 |
d = new QWellArrayData; |
|
359 |
int i = numRows()*numCols(); |
|
360 |
d->brush = new QBrush[i]; |
|
361 |
} |
|
362 |
if (row >= 0 && row < numRows() && col >= 0 && col < numCols()) |
|
363 |
d->brush[row*numCols()+col] = b; |
|
364 |
} |
|
365 |
||
366 |
/* |
|
367 |
Returns the brush set for the cell at \a row, \a column. If no brush is |
|
368 |
set, Qt::NoBrush is returned. |
|
369 |
*/ |
|
370 |
||
371 |
QBrush QWellArray::cellBrush(int row, int col) |
|
372 |
{ |
|
373 |
if (d && row >= 0 && row < numRows() && col >= 0 && col < numCols()) |
|
374 |
return d->brush[row*numCols()+col]; |
|
375 |
return Qt::NoBrush; |
|
376 |
} |
|
377 |
||
378 |
||
379 |
||
380 |
/*!\reimp |
|
381 |
*/ |
|
382 |
||
383 |
void QWellArray::focusOutEvent(QFocusEvent*) |
|
384 |
{ |
|
385 |
updateCell(curRow, curCol); |
|
386 |
} |
|
387 |
||
388 |
/*\reimp |
|
389 |
*/ |
|
390 |
void QWellArray::keyPressEvent(QKeyEvent* e) |
|
391 |
{ |
|
392 |
switch(e->key()) { // Look at the key code |
|
393 |
case Qt::Key_Left: // If 'left arrow'-key, |
|
394 |
if(curCol > 0) // and cr't not in leftmost col |
|
395 |
setCurrent(curRow, curCol - 1); // set cr't to next left column |
|
396 |
break; |
|
397 |
case Qt::Key_Right: // Correspondingly... |
|
398 |
if(curCol < numCols()-1) |
|
399 |
setCurrent(curRow, curCol + 1); |
|
400 |
break; |
|
401 |
case Qt::Key_Up: |
|
402 |
if(curRow > 0) |
|
403 |
setCurrent(curRow - 1, curCol); |
|
404 |
break; |
|
405 |
case Qt::Key_Down: |
|
406 |
if(curRow < numRows()-1) |
|
407 |
setCurrent(curRow + 1, curCol); |
|
408 |
break; |
|
409 |
#if 0 |
|
410 |
// bad idea that shouldn't have been implemented; very counterintuitive |
|
411 |
case Qt::Key_Return: |
|
412 |
case Qt::Key_Enter: |
|
413 |
/* |
|
414 |
ignore the key, so that the dialog get it, but still select |
|
415 |
the current row/col |
|
416 |
*/ |
|
417 |
e->ignore(); |
|
418 |
// fallthrough intended |
|
419 |
#endif |
|
420 |
case Qt::Key_Space: |
|
421 |
setSelected(curRow, curCol); |
|
422 |
break; |
|
423 |
default: // If not an interesting key, |
|
424 |
e->ignore(); // we don't accept the event |
|
425 |
return; |
|
426 |
} |
|
427 |
||
428 |
} |
|
429 |
||
430 |
//////////// QWellArray END |
|
431 |
||
432 |
static bool initrgb = false; |
|
433 |
static QRgb stdrgb[6*8]; |
|
434 |
static QRgb cusrgb[2*8]; |
|
435 |
static bool customSet = false; |
|
436 |
||
437 |
||
438 |
static void initRGB() |
|
439 |
{ |
|
440 |
if (initrgb) |
|
441 |
return; |
|
442 |
initrgb = true; |
|
443 |
int i = 0; |
|
444 |
for (int g = 0; g < 4; g++) |
|
445 |
for (int r = 0; r < 4; r++) |
|
446 |
for (int b = 0; b < 3; b++) |
|
447 |
stdrgb[i++] = qRgb(r * 255 / 3, g * 255 / 3, b * 255 / 2); |
|
448 |
||
449 |
for (i = 0; i < 2*8; i++) |
|
450 |
cusrgb[i] = 0xffffffff; |
|
451 |
} |
|
452 |
||
453 |
/*! |
|
454 |
Returns the number of custom colors supported by QColorDialog. All |
|
455 |
color dialogs share the same custom colors. |
|
456 |
*/ |
|
457 |
int QColorDialog::customCount() |
|
458 |
{ |
|
459 |
return 2 * 8; |
|
460 |
} |
|
461 |
||
462 |
/*! |
|
463 |
\since 4.5 |
|
464 |
||
465 |
Returns the custom color at the given \a index as a QRgb value. |
|
466 |
*/ |
|
467 |
QRgb QColorDialog::customColor(int index) |
|
468 |
{ |
|
469 |
if (uint(index) >= uint(customCount())) |
|
470 |
return qRgb(255, 255, 255); |
|
471 |
initRGB(); |
|
472 |
return cusrgb[index]; |
|
473 |
} |
|
474 |
||
475 |
/*! |
|
476 |
Sets the custom color at \a index to the QRgb \a color value. |
|
477 |
||
478 |
\note This function does not apply to the Native Color Dialog on the Mac |
|
479 |
OS X platform. If you still require this function, use the |
|
480 |
QColorDialog::DontUseNativeDialog option. |
|
481 |
*/ |
|
482 |
void QColorDialog::setCustomColor(int index, QRgb color) |
|
483 |
{ |
|
484 |
if (uint(index) >= uint(customCount())) |
|
485 |
return; |
|
486 |
initRGB(); |
|
487 |
customSet = true; |
|
488 |
cusrgb[index] = color; |
|
489 |
} |
|
490 |
||
491 |
/*! |
|
492 |
Sets the standard color at \a index to the QRgb \a color value. |
|
493 |
||
494 |
\note This function does not apply to the Native Color Dialog on the Mac |
|
495 |
OS X platform. If you still require this function, use the |
|
496 |
QColorDialog::DontUseNativeDialog option. |
|
497 |
*/ |
|
498 |
||
499 |
void QColorDialog::setStandardColor(int index, QRgb color) |
|
500 |
{ |
|
501 |
if (uint(index) >= uint(6 * 8)) |
|
502 |
return; |
|
503 |
initRGB(); |
|
504 |
stdrgb[index] = color; |
|
505 |
} |
|
506 |
||
507 |
static inline void rgb2hsv(QRgb rgb, int &h, int &s, int &v) |
|
508 |
{ |
|
509 |
QColor c; |
|
510 |
c.setRgb(rgb); |
|
511 |
c.getHsv(&h, &s, &v); |
|
512 |
} |
|
513 |
||
514 |
class QColorWell : public QWellArray |
|
515 |
{ |
|
516 |
public: |
|
517 |
QColorWell(QWidget *parent, int r, int c, QRgb *vals) |
|
518 |
:QWellArray(r, c, parent), values(vals), mousePressed(false), oldCurrent(-1, -1) |
|
519 |
{ setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum)); } |
|
520 |
||
521 |
protected: |
|
522 |
void paintCellContents(QPainter *, int row, int col, const QRect&); |
|
523 |
void mousePressEvent(QMouseEvent *e); |
|
524 |
void mouseMoveEvent(QMouseEvent *e); |
|
525 |
void mouseReleaseEvent(QMouseEvent *e); |
|
526 |
#ifndef QT_NO_DRAGANDDROP |
|
527 |
void dragEnterEvent(QDragEnterEvent *e); |
|
528 |
void dragLeaveEvent(QDragLeaveEvent *e); |
|
529 |
void dragMoveEvent(QDragMoveEvent *e); |
|
530 |
void dropEvent(QDropEvent *e); |
|
531 |
#endif |
|
532 |
||
533 |
private: |
|
534 |
QRgb *values; |
|
535 |
bool mousePressed; |
|
536 |
QPoint pressPos; |
|
537 |
QPoint oldCurrent; |
|
538 |
||
539 |
}; |
|
540 |
||
541 |
void QColorWell::paintCellContents(QPainter *p, int row, int col, const QRect &r) |
|
542 |
{ |
|
543 |
int i = row + col*numRows(); |
|
544 |
p->fillRect(r, QColor(values[i])); |
|
545 |
} |
|
546 |
||
547 |
void QColorWell::mousePressEvent(QMouseEvent *e) |
|
548 |
{ |
|
549 |
oldCurrent = QPoint(selectedRow(), selectedColumn()); |
|
550 |
QWellArray::mousePressEvent(e); |
|
551 |
mousePressed = true; |
|
552 |
pressPos = e->pos(); |
|
553 |
} |
|
554 |
||
555 |
void QColorWell::mouseMoveEvent(QMouseEvent *e) |
|
556 |
{ |
|
557 |
QWellArray::mouseMoveEvent(e); |
|
558 |
#ifndef QT_NO_DRAGANDDROP |
|
559 |
if (!mousePressed) |
|
560 |
return; |
|
561 |
if ((pressPos - e->pos()).manhattanLength() > QApplication::startDragDistance()) { |
|
562 |
setCurrent(oldCurrent.x(), oldCurrent.y()); |
|
563 |
int i = rowAt(pressPos.y()) + columnAt(pressPos.x()) * numRows(); |
|
564 |
QColor col(values[i]); |
|
565 |
QMimeData *mime = new QMimeData; |
|
566 |
mime->setColorData(col); |
|
567 |
QPixmap pix(cellWidth(), cellHeight()); |
|
568 |
pix.fill(col); |
|
569 |
QPainter p(&pix); |
|
570 |
p.drawRect(0, 0, pix.width() - 1, pix.height() - 1); |
|
571 |
p.end(); |
|
572 |
QDrag *drg = new QDrag(this); |
|
573 |
drg->setMimeData(mime); |
|
574 |
drg->setPixmap(pix); |
|
575 |
mousePressed = false; |
|
576 |
drg->start(); |
|
577 |
} |
|
578 |
#endif |
|
579 |
} |
|
580 |
||
581 |
#ifndef QT_NO_DRAGANDDROP |
|
582 |
void QColorWell::dragEnterEvent(QDragEnterEvent *e) |
|
583 |
{ |
|
584 |
if (qvariant_cast<QColor>(e->mimeData()->colorData()).isValid()) |
|
585 |
e->accept(); |
|
586 |
else |
|
587 |
e->ignore(); |
|
588 |
} |
|
589 |
||
590 |
void QColorWell::dragLeaveEvent(QDragLeaveEvent *) |
|
591 |
{ |
|
592 |
if (hasFocus()) |
|
593 |
parentWidget()->setFocus(); |
|
594 |
} |
|
595 |
||
596 |
void QColorWell::dragMoveEvent(QDragMoveEvent *e) |
|
597 |
{ |
|
598 |
if (qvariant_cast<QColor>(e->mimeData()->colorData()).isValid()) { |
|
599 |
setCurrent(rowAt(e->pos().y()), columnAt(e->pos().x())); |
|
600 |
e->accept(); |
|
601 |
} else { |
|
602 |
e->ignore(); |
|
603 |
} |
|
604 |
} |
|
605 |
||
606 |
void QColorWell::dropEvent(QDropEvent *e) |
|
607 |
{ |
|
608 |
QColor col = qvariant_cast<QColor>(e->mimeData()->colorData()); |
|
609 |
if (col.isValid()) { |
|
610 |
int i = rowAt(e->pos().y()) + columnAt(e->pos().x()) * numRows(); |
|
611 |
values[i] = col.rgb(); |
|
612 |
update(); |
|
613 |
e->accept(); |
|
614 |
} else { |
|
615 |
e->ignore(); |
|
616 |
} |
|
617 |
} |
|
618 |
||
619 |
#endif // QT_NO_DRAGANDDROP |
|
620 |
||
621 |
void QColorWell::mouseReleaseEvent(QMouseEvent *e) |
|
622 |
{ |
|
623 |
if (!mousePressed) |
|
624 |
return; |
|
625 |
QWellArray::mouseReleaseEvent(e); |
|
626 |
mousePressed = false; |
|
627 |
} |
|
628 |
||
629 |
class QColorPicker : public QFrame |
|
630 |
{ |
|
631 |
Q_OBJECT |
|
632 |
public: |
|
633 |
QColorPicker(QWidget* parent); |
|
634 |
~QColorPicker(); |
|
635 |
||
636 |
public slots: |
|
637 |
void setCol(int h, int s); |
|
638 |
||
639 |
signals: |
|
640 |
void newCol(int h, int s); |
|
641 |
||
642 |
protected: |
|
643 |
QSize sizeHint() const; |
|
644 |
void paintEvent(QPaintEvent*); |
|
645 |
void mouseMoveEvent(QMouseEvent *); |
|
646 |
void mousePressEvent(QMouseEvent *); |
|
19
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
647 |
void resizeEvent(QResizeEvent *); |
0 | 648 |
|
649 |
private: |
|
650 |
int hue; |
|
651 |
int sat; |
|
652 |
||
653 |
QPoint colPt(); |
|
654 |
int huePt(const QPoint &pt); |
|
655 |
int satPt(const QPoint &pt); |
|
656 |
void setCol(const QPoint &pt); |
|
657 |
||
19
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
658 |
QPixmap pix; |
0 | 659 |
}; |
660 |
||
661 |
static int pWidth = 220; |
|
662 |
static int pHeight = 200; |
|
663 |
||
664 |
class QColorLuminancePicker : public QWidget |
|
665 |
{ |
|
666 |
Q_OBJECT |
|
667 |
public: |
|
668 |
QColorLuminancePicker(QWidget* parent=0); |
|
669 |
~QColorLuminancePicker(); |
|
670 |
||
671 |
public slots: |
|
672 |
void setCol(int h, int s, int v); |
|
673 |
void setCol(int h, int s); |
|
674 |
||
675 |
signals: |
|
676 |
void newHsv(int h, int s, int v); |
|
677 |
||
678 |
protected: |
|
679 |
void paintEvent(QPaintEvent*); |
|
680 |
void mouseMoveEvent(QMouseEvent *); |
|
681 |
void mousePressEvent(QMouseEvent *); |
|
682 |
||
683 |
private: |
|
684 |
enum { foff = 3, coff = 4 }; //frame and contents offset |
|
685 |
int val; |
|
686 |
int hue; |
|
687 |
int sat; |
|
688 |
||
689 |
int y2val(int y); |
|
690 |
int val2y(int val); |
|
691 |
void setVal(int v); |
|
692 |
||
693 |
QPixmap *pix; |
|
694 |
}; |
|
695 |
||
696 |
||
697 |
int QColorLuminancePicker::y2val(int y) |
|
698 |
{ |
|
699 |
int d = height() - 2*coff - 1; |
|
700 |
return 255 - (y - coff)*255/d; |
|
701 |
} |
|
702 |
||
703 |
int QColorLuminancePicker::val2y(int v) |
|
704 |
{ |
|
705 |
int d = height() - 2*coff - 1; |
|
706 |
return coff + (255-v)*d/255; |
|
707 |
} |
|
708 |
||
709 |
QColorLuminancePicker::QColorLuminancePicker(QWidget* parent) |
|
710 |
:QWidget(parent) |
|
711 |
{ |
|
712 |
hue = 100; val = 100; sat = 100; |
|
713 |
pix = 0; |
|
714 |
// setAttribute(WA_NoErase, true); |
|
715 |
} |
|
716 |
||
717 |
QColorLuminancePicker::~QColorLuminancePicker() |
|
718 |
{ |
|
719 |
delete pix; |
|
720 |
} |
|
721 |
||
722 |
void QColorLuminancePicker::mouseMoveEvent(QMouseEvent *m) |
|
723 |
{ |
|
724 |
setVal(y2val(m->y())); |
|
725 |
} |
|
726 |
void QColorLuminancePicker::mousePressEvent(QMouseEvent *m) |
|
727 |
{ |
|
728 |
setVal(y2val(m->y())); |
|
729 |
} |
|
730 |
||
731 |
void QColorLuminancePicker::setVal(int v) |
|
732 |
{ |
|
733 |
if (val == v) |
|
734 |
return; |
|
735 |
val = qMax(0, qMin(v,255)); |
|
736 |
delete pix; pix=0; |
|
737 |
repaint(); |
|
738 |
emit newHsv(hue, sat, val); |
|
739 |
} |
|
740 |
||
741 |
//receives from a hue,sat chooser and relays. |
|
742 |
void QColorLuminancePicker::setCol(int h, int s) |
|
743 |
{ |
|
744 |
setCol(h, s, val); |
|
745 |
emit newHsv(h, s, val); |
|
746 |
} |
|
747 |
||
748 |
void QColorLuminancePicker::paintEvent(QPaintEvent *) |
|
749 |
{ |
|
750 |
int w = width() - 5; |
|
751 |
||
752 |
QRect r(0, foff, w, height() - 2*foff); |
|
753 |
int wi = r.width() - 2; |
|
754 |
int hi = r.height() - 2; |
|
755 |
if (!pix || pix->height() != hi || pix->width() != wi) { |
|
756 |
delete pix; |
|
757 |
QImage img(wi, hi, QImage::Format_RGB32); |
|
758 |
int y; |
|
759 |
uint *pixel = (uint *) img.scanLine(0); |
|
760 |
for (y = 0; y < hi; y++) { |
|
761 |
const uint *end = pixel + wi; |
|
762 |
while (pixel < end) { |
|
763 |
QColor c; |
|
764 |
c.setHsv(hue, sat, y2val(y+coff)); |
|
765 |
*pixel = c.rgb(); |
|
766 |
++pixel; |
|
767 |
} |
|
768 |
} |
|
769 |
pix = new QPixmap(QPixmap::fromImage(img)); |
|
770 |
} |
|
771 |
QPainter p(this); |
|
772 |
p.drawPixmap(1, coff, *pix); |
|
773 |
const QPalette &g = palette(); |
|
774 |
qDrawShadePanel(&p, r, g, true); |
|
775 |
p.setPen(g.foreground().color()); |
|
776 |
p.setBrush(g.foreground()); |
|
777 |
QPolygon a; |
|
778 |
int y = val2y(val); |
|
779 |
a.setPoints(3, w, y, w+5, y+5, w+5, y-5); |
|
780 |
p.eraseRect(w, 0, 5, height()); |
|
781 |
p.drawPolygon(a); |
|
782 |
} |
|
783 |
||
784 |
void QColorLuminancePicker::setCol(int h, int s , int v) |
|
785 |
{ |
|
786 |
val = v; |
|
787 |
hue = h; |
|
788 |
sat = s; |
|
789 |
delete pix; pix=0; |
|
790 |
repaint(); |
|
791 |
} |
|
792 |
||
793 |
QPoint QColorPicker::colPt() |
|
19
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
794 |
{ |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
795 |
QRect r = contentsRect(); |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
796 |
return QPoint((360 - hue) * (r.width() - 1) / 360, (255 - sat) * (r.height() - 1) / 255); |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
797 |
} |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
798 |
|
0 | 799 |
int QColorPicker::huePt(const QPoint &pt) |
19
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
800 |
{ |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
801 |
QRect r = contentsRect(); |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
802 |
return 360 - pt.x() * 360 / (r.width() - 1); |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
803 |
} |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
804 |
|
0 | 805 |
int QColorPicker::satPt(const QPoint &pt) |
19
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
806 |
{ |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
807 |
QRect r = contentsRect(); |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
808 |
return 255 - pt.y() * 255 / (r.height() - 1); |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
809 |
} |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
810 |
|
0 | 811 |
void QColorPicker::setCol(const QPoint &pt) |
19
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
812 |
{ |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
813 |
setCol(huePt(pt), satPt(pt)); |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
814 |
} |
0 | 815 |
|
816 |
QColorPicker::QColorPicker(QWidget* parent) |
|
817 |
: QFrame(parent) |
|
818 |
{ |
|
819 |
hue = 0; sat = 0; |
|
820 |
setCol(150, 255); |
|
821 |
||
822 |
setAttribute(Qt::WA_NoSystemBackground); |
|
823 |
setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed) ); |
|
824 |
} |
|
825 |
||
826 |
QColorPicker::~QColorPicker() |
|
827 |
{ |
|
828 |
} |
|
829 |
||
830 |
QSize QColorPicker::sizeHint() const |
|
831 |
{ |
|
832 |
return QSize(pWidth + 2*frameWidth(), pHeight + 2*frameWidth()); |
|
833 |
} |
|
834 |
||
835 |
void QColorPicker::setCol(int h, int s) |
|
836 |
{ |
|
837 |
int nhue = qMin(qMax(0,h), 359); |
|
838 |
int nsat = qMin(qMax(0,s), 255); |
|
839 |
if (nhue == hue && nsat == sat) |
|
840 |
return; |
|
841 |
||
842 |
QRect r(colPt(), QSize(20,20)); |
|
843 |
hue = nhue; sat = nsat; |
|
844 |
r = r.united(QRect(colPt(), QSize(20,20))); |
|
845 |
r.translate(contentsRect().x()-9, contentsRect().y()-9); |
|
846 |
// update(r); |
|
847 |
repaint(r); |
|
848 |
} |
|
849 |
||
850 |
void QColorPicker::mouseMoveEvent(QMouseEvent *m) |
|
851 |
{ |
|
852 |
QPoint p = m->pos() - contentsRect().topLeft(); |
|
853 |
setCol(p); |
|
854 |
emit newCol(hue, sat); |
|
855 |
} |
|
856 |
||
857 |
void QColorPicker::mousePressEvent(QMouseEvent *m) |
|
858 |
{ |
|
859 |
QPoint p = m->pos() - contentsRect().topLeft(); |
|
860 |
setCol(p); |
|
861 |
emit newCol(hue, sat); |
|
862 |
} |
|
863 |
||
864 |
void QColorPicker::paintEvent(QPaintEvent* ) |
|
865 |
{ |
|
866 |
QPainter p(this); |
|
867 |
drawFrame(&p); |
|
868 |
QRect r = contentsRect(); |
|
869 |
||
19
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
870 |
p.drawPixmap(r.topLeft(), pix); |
0 | 871 |
QPoint pt = colPt() + r.topLeft(); |
872 |
p.setPen(Qt::black); |
|
873 |
||
874 |
p.fillRect(pt.x()-9, pt.y(), 20, 2, Qt::black); |
|
875 |
p.fillRect(pt.x(), pt.y()-9, 2, 20, Qt::black); |
|
876 |
||
877 |
} |
|
878 |
||
19
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
879 |
void QColorPicker::resizeEvent(QResizeEvent *ev) |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
880 |
{ |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
881 |
QFrame::resizeEvent(ev); |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
882 |
|
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
883 |
int w = width() - frameWidth() * 2; |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
884 |
int h = height() - frameWidth() * 2; |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
885 |
QImage img(w, h, QImage::Format_RGB32); |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
886 |
int x, y; |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
887 |
uint *pixel = (uint *) img.scanLine(0); |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
888 |
for (y = 0; y < h; y++) { |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
889 |
const uint *end = pixel + w; |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
890 |
x = 0; |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
891 |
while (pixel < end) { |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
892 |
QPoint p(x, y); |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
893 |
QColor c; |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
894 |
c.setHsv(huePt(p), satPt(p), 200); |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
895 |
*pixel = c.rgb(); |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
896 |
++pixel; |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
897 |
++x; |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
898 |
} |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
899 |
} |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
900 |
pix = QPixmap::fromImage(img); |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
901 |
} |
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
902 |
|
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
903 |
|
0 | 904 |
class QColSpinBox : public QSpinBox |
905 |
{ |
|
906 |
public: |
|
907 |
QColSpinBox(QWidget *parent) |
|
908 |
: QSpinBox(parent) { setRange(0, 255); } |
|
909 |
void setValue(int i) { |
|
910 |
bool block = signalsBlocked(); |
|
911 |
blockSignals(true); |
|
912 |
QSpinBox::setValue(i); |
|
913 |
blockSignals(block); |
|
914 |
} |
|
915 |
}; |
|
916 |
||
917 |
class QColorShowLabel; |
|
918 |
||
919 |
class QColorShower : public QWidget |
|
920 |
{ |
|
921 |
Q_OBJECT |
|
922 |
public: |
|
923 |
QColorShower(QColorDialog *parent); |
|
924 |
||
925 |
//things that don't emit signals |
|
926 |
void setHsv(int h, int s, int v); |
|
927 |
||
928 |
int currentAlpha() const |
|
929 |
{ return (colorDialog->options() & QColorDialog::ShowAlphaChannel) ? alphaEd->value() : 255; } |
|
930 |
void setCurrentAlpha(int a) { alphaEd->setValue(a); rgbEd(); } |
|
931 |
void showAlpha(bool b); |
|
932 |
bool isAlphaVisible() const; |
|
933 |
||
934 |
QRgb currentColor() const { return curCol; } |
|
935 |
QColor currentQColor() const { return curQColor; } |
|
936 |
void retranslateStrings(); |
|
937 |
void updateQColor(); |
|
938 |
||
939 |
public slots: |
|
940 |
void setRgb(QRgb rgb); |
|
941 |
||
942 |
signals: |
|
943 |
void newCol(QRgb rgb); |
|
944 |
void currentColorChanged(const QColor &color); |
|
945 |
||
946 |
private slots: |
|
947 |
void rgbEd(); |
|
948 |
void hsvEd(); |
|
949 |
private: |
|
950 |
void showCurrentColor(); |
|
951 |
int hue, sat, val; |
|
952 |
QRgb curCol; |
|
953 |
QColor curQColor; |
|
954 |
QLabel *lblHue; |
|
955 |
QLabel *lblSat; |
|
956 |
QLabel *lblVal; |
|
957 |
QLabel *lblRed; |
|
958 |
QLabel *lblGreen; |
|
959 |
QLabel *lblBlue; |
|
960 |
QColSpinBox *hEd; |
|
961 |
QColSpinBox *sEd; |
|
962 |
QColSpinBox *vEd; |
|
963 |
QColSpinBox *rEd; |
|
964 |
QColSpinBox *gEd; |
|
965 |
QColSpinBox *bEd; |
|
966 |
QColSpinBox *alphaEd; |
|
967 |
QLabel *alphaLab; |
|
968 |
QColorShowLabel *lab; |
|
969 |
bool rgbOriginal; |
|
970 |
QColorDialog *colorDialog; |
|
971 |
||
972 |
friend class QColorDialog; |
|
973 |
friend class QColorDialogPrivate; |
|
974 |
}; |
|
975 |
||
976 |
class QColorShowLabel : public QFrame |
|
977 |
{ |
|
978 |
Q_OBJECT |
|
979 |
||
980 |
public: |
|
981 |
QColorShowLabel(QWidget *parent) : QFrame(parent) { |
|
982 |
setFrameStyle(QFrame::Panel|QFrame::Sunken); |
|
983 |
setAcceptDrops(true); |
|
984 |
mousePressed = false; |
|
985 |
} |
|
986 |
void setColor(QColor c) { col = c; } |
|
987 |
||
988 |
signals: |
|
989 |
void colorDropped(QRgb); |
|
990 |
||
991 |
protected: |
|
992 |
void paintEvent(QPaintEvent *); |
|
993 |
void mousePressEvent(QMouseEvent *e); |
|
994 |
void mouseMoveEvent(QMouseEvent *e); |
|
995 |
void mouseReleaseEvent(QMouseEvent *e); |
|
996 |
#ifndef QT_NO_DRAGANDDROP |
|
997 |
void dragEnterEvent(QDragEnterEvent *e); |
|
998 |
void dragLeaveEvent(QDragLeaveEvent *e); |
|
999 |
void dropEvent(QDropEvent *e); |
|
1000 |
#endif |
|
1001 |
||
1002 |
private: |
|
1003 |
QColor col; |
|
1004 |
bool mousePressed; |
|
1005 |
QPoint pressPos; |
|
1006 |
}; |
|
1007 |
||
1008 |
void QColorShowLabel::paintEvent(QPaintEvent *e) |
|
1009 |
{ |
|
1010 |
QPainter p(this); |
|
1011 |
drawFrame(&p); |
|
1012 |
p.fillRect(contentsRect()&e->rect(), col); |
|
1013 |
} |
|
1014 |
||
1015 |
void QColorShower::showAlpha(bool b) |
|
1016 |
{ |
|
1017 |
alphaLab->setVisible(b); |
|
1018 |
alphaEd->setVisible(b); |
|
1019 |
} |
|
1020 |
||
1021 |
inline bool QColorShower::isAlphaVisible() const |
|
1022 |
{ |
|
1023 |
return alphaLab->isVisible(); |
|
1024 |
} |
|
1025 |
||
1026 |
void QColorShowLabel::mousePressEvent(QMouseEvent *e) |
|
1027 |
{ |
|
1028 |
mousePressed = true; |
|
1029 |
pressPos = e->pos(); |
|
1030 |
} |
|
1031 |
||
1032 |
void QColorShowLabel::mouseMoveEvent(QMouseEvent *e) |
|
1033 |
{ |
|
1034 |
#ifdef QT_NO_DRAGANDDROP |
|
1035 |
Q_UNUSED(e); |
|
1036 |
#else |
|
1037 |
if (!mousePressed) |
|
1038 |
return; |
|
1039 |
if ((pressPos - e->pos()).manhattanLength() > QApplication::startDragDistance()) { |
|
1040 |
QMimeData *mime = new QMimeData; |
|
1041 |
mime->setColorData(col); |
|
1042 |
QPixmap pix(30, 20); |
|
1043 |
pix.fill(col); |
|
1044 |
QPainter p(&pix); |
|
1045 |
p.drawRect(0, 0, pix.width() - 1, pix.height() - 1); |
|
1046 |
p.end(); |
|
1047 |
QDrag *drg = new QDrag(this); |
|
1048 |
drg->setMimeData(mime); |
|
1049 |
drg->setPixmap(pix); |
|
1050 |
mousePressed = false; |
|
1051 |
drg->start(); |
|
1052 |
} |
|
1053 |
#endif |
|
1054 |
} |
|
1055 |
||
1056 |
#ifndef QT_NO_DRAGANDDROP |
|
1057 |
void QColorShowLabel::dragEnterEvent(QDragEnterEvent *e) |
|
1058 |
{ |
|
1059 |
if (qvariant_cast<QColor>(e->mimeData()->colorData()).isValid()) |
|
1060 |
e->accept(); |
|
1061 |
else |
|
1062 |
e->ignore(); |
|
1063 |
} |
|
1064 |
||
1065 |
void QColorShowLabel::dragLeaveEvent(QDragLeaveEvent *) |
|
1066 |
{ |
|
1067 |
} |
|
1068 |
||
1069 |
void QColorShowLabel::dropEvent(QDropEvent *e) |
|
1070 |
{ |
|
1071 |
QColor color = qvariant_cast<QColor>(e->mimeData()->colorData()); |
|
1072 |
if (color.isValid()) { |
|
1073 |
col = color; |
|
1074 |
repaint(); |
|
1075 |
emit colorDropped(col.rgb()); |
|
1076 |
e->accept(); |
|
1077 |
} else { |
|
1078 |
e->ignore(); |
|
1079 |
} |
|
1080 |
} |
|
1081 |
#endif // QT_NO_DRAGANDDROP |
|
1082 |
||
1083 |
void QColorShowLabel::mouseReleaseEvent(QMouseEvent *) |
|
1084 |
{ |
|
1085 |
if (!mousePressed) |
|
1086 |
return; |
|
1087 |
mousePressed = false; |
|
1088 |
} |
|
1089 |
||
1090 |
QColorShower::QColorShower(QColorDialog *parent) |
|
1091 |
: QWidget(parent) |
|
1092 |
{ |
|
1093 |
colorDialog = parent; |
|
1094 |
||
1095 |
curCol = qRgb(255, 255, 255); |
|
1096 |
curQColor = Qt::white; |
|
1097 |
||
1098 |
QGridLayout *gl = new QGridLayout(this); |
|
1099 |
gl->setMargin(gl->spacing()); |
|
1100 |
lab = new QColorShowLabel(this); |
|
1101 |
||
18
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1102 |
#ifdef QT_SMALL_COLORDIALOG |
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1103 |
# ifdef Q_WS_S60 |
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1104 |
const bool nonTouchUI = !S60->hasTouchscreen; |
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1105 |
# elif defined Q_WS_MAEMO_5 |
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1106 |
const bool nonTouchUI = false; |
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1107 |
# endif |
0 | 1108 |
#endif |
1109 |
||
1110 |
#ifndef Q_WS_WINCE |
|
18
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1111 |
#ifdef QT_SMALL_COLORDIALOG |
0 | 1112 |
lab->setMinimumHeight(60); |
1113 |
#endif |
|
1114 |
lab->setMinimumWidth(60); |
|
1115 |
#else |
|
1116 |
lab->setMinimumWidth(20); |
|
1117 |
#endif |
|
1118 |
||
1119 |
// In S60, due to small screen and different screen layouts need to re-arrange the widgets. |
|
1120 |
// For QVGA screens only the comboboxes and color label are visible. |
|
1121 |
// For nHD screens only color and luminence pickers and color label are visible. |
|
18
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1122 |
#if !defined(QT_SMALL_COLORDIALOG) |
0 | 1123 |
gl->addWidget(lab, 0, 0, -1, 1); |
1124 |
#else |
|
1125 |
if (nonTouchUI) |
|
1126 |
gl->addWidget(lab, 0, 0, 1, -1); |
|
1127 |
else |
|
1128 |
gl->addWidget(lab, 0, 0, -1, 1); |
|
1129 |
#endif |
|
1130 |
connect(lab, SIGNAL(colorDropped(QRgb)), this, SIGNAL(newCol(QRgb))); |
|
1131 |
connect(lab, SIGNAL(colorDropped(QRgb)), this, SLOT(setRgb(QRgb))); |
|
1132 |
||
1133 |
hEd = new QColSpinBox(this); |
|
1134 |
hEd->setRange(0, 359); |
|
1135 |
lblHue = new QLabel(this); |
|
1136 |
#ifndef QT_NO_SHORTCUT |
|
1137 |
lblHue->setBuddy(hEd); |
|
1138 |
#endif |
|
1139 |
lblHue->setAlignment(Qt::AlignRight|Qt::AlignVCenter); |
|
18
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1140 |
#if !defined(QT_SMALL_COLORDIALOG) |
0 | 1141 |
gl->addWidget(lblHue, 0, 1); |
1142 |
gl->addWidget(hEd, 0, 2); |
|
1143 |
#else |
|
1144 |
if (nonTouchUI) { |
|
1145 |
gl->addWidget(lblHue, 1, 0); |
|
1146 |
gl->addWidget(hEd, 2, 0); |
|
1147 |
} else { |
|
1148 |
lblHue->hide(); |
|
1149 |
hEd->hide(); |
|
1150 |
} |
|
1151 |
#endif |
|
1152 |
||
1153 |
sEd = new QColSpinBox(this); |
|
1154 |
lblSat = new QLabel(this); |
|
1155 |
#ifndef QT_NO_SHORTCUT |
|
1156 |
lblSat->setBuddy(sEd); |
|
1157 |
#endif |
|
1158 |
lblSat->setAlignment(Qt::AlignRight|Qt::AlignVCenter); |
|
18
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1159 |
#if !defined(QT_SMALL_COLORDIALOG) |
0 | 1160 |
gl->addWidget(lblSat, 1, 1); |
1161 |
gl->addWidget(sEd, 1, 2); |
|
1162 |
#else |
|
1163 |
if (nonTouchUI) { |
|
1164 |
gl->addWidget(lblSat, 1, 1); |
|
1165 |
gl->addWidget(sEd, 2, 1); |
|
1166 |
} else { |
|
1167 |
lblSat->hide(); |
|
1168 |
sEd->hide(); |
|
1169 |
} |
|
1170 |
#endif |
|
1171 |
||
1172 |
vEd = new QColSpinBox(this); |
|
1173 |
lblVal = new QLabel(this); |
|
1174 |
#ifndef QT_NO_SHORTCUT |
|
1175 |
lblVal->setBuddy(vEd); |
|
1176 |
#endif |
|
1177 |
lblVal->setAlignment(Qt::AlignRight|Qt::AlignVCenter); |
|
18
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1178 |
#if !defined(QT_SMALL_COLORDIALOG) |
0 | 1179 |
gl->addWidget(lblVal, 2, 1); |
1180 |
gl->addWidget(vEd, 2, 2); |
|
1181 |
#else |
|
1182 |
if (nonTouchUI) { |
|
1183 |
gl->addWidget(lblVal, 1, 2); |
|
1184 |
gl->addWidget(vEd, 2, 2); |
|
1185 |
} else { |
|
1186 |
lblVal->hide(); |
|
1187 |
vEd->hide(); |
|
1188 |
} |
|
1189 |
#endif |
|
1190 |
||
1191 |
rEd = new QColSpinBox(this); |
|
1192 |
lblRed = new QLabel(this); |
|
1193 |
#ifndef QT_NO_SHORTCUT |
|
1194 |
lblRed->setBuddy(rEd); |
|
1195 |
#endif |
|
1196 |
lblRed->setAlignment(Qt::AlignRight|Qt::AlignVCenter); |
|
18
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1197 |
#if !defined(QT_SMALL_COLORDIALOG) |
0 | 1198 |
gl->addWidget(lblRed, 0, 3); |
1199 |
gl->addWidget(rEd, 0, 4); |
|
1200 |
#else |
|
1201 |
if (nonTouchUI) { |
|
1202 |
gl->addWidget(lblRed, 3, 0); |
|
1203 |
gl->addWidget(rEd, 4, 0); |
|
1204 |
} else { |
|
1205 |
lblRed->hide(); |
|
1206 |
rEd->hide(); |
|
1207 |
} |
|
1208 |
#endif |
|
1209 |
||
1210 |
gEd = new QColSpinBox(this); |
|
1211 |
lblGreen = new QLabel(this); |
|
1212 |
#ifndef QT_NO_SHORTCUT |
|
1213 |
lblGreen->setBuddy(gEd); |
|
1214 |
#endif |
|
1215 |
lblGreen->setAlignment(Qt::AlignRight|Qt::AlignVCenter); |
|
18
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1216 |
#if !defined(QT_SMALL_COLORDIALOG) |
0 | 1217 |
gl->addWidget(lblGreen, 1, 3); |
1218 |
gl->addWidget(gEd, 1, 4); |
|
1219 |
#else |
|
1220 |
if (nonTouchUI) { |
|
1221 |
gl->addWidget(lblGreen, 3, 1); |
|
1222 |
gl->addWidget(gEd, 4, 1); |
|
1223 |
} else { |
|
1224 |
lblGreen->hide(); |
|
1225 |
gEd->hide(); |
|
1226 |
} |
|
1227 |
#endif |
|
1228 |
||
1229 |
bEd = new QColSpinBox(this); |
|
1230 |
lblBlue = new QLabel(this); |
|
1231 |
#ifndef QT_NO_SHORTCUT |
|
1232 |
lblBlue->setBuddy(bEd); |
|
1233 |
#endif |
|
1234 |
lblBlue->setAlignment(Qt::AlignRight|Qt::AlignVCenter); |
|
18
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1235 |
#if !defined(QT_SMALL_COLORDIALOG) |
0 | 1236 |
gl->addWidget(lblBlue, 2, 3); |
1237 |
gl->addWidget(bEd, 2, 4); |
|
1238 |
#else |
|
1239 |
if (nonTouchUI) { |
|
1240 |
gl->addWidget(lblBlue, 3, 2); |
|
1241 |
gl->addWidget(bEd, 4, 2); |
|
1242 |
} else { |
|
1243 |
lblBlue->hide(); |
|
1244 |
bEd->hide(); |
|
1245 |
} |
|
1246 |
#endif |
|
1247 |
||
1248 |
alphaEd = new QColSpinBox(this); |
|
1249 |
alphaLab = new QLabel(this); |
|
1250 |
#ifndef QT_NO_SHORTCUT |
|
1251 |
alphaLab->setBuddy(alphaEd); |
|
1252 |
#endif |
|
1253 |
alphaLab->setAlignment(Qt::AlignRight|Qt::AlignVCenter); |
|
18
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1254 |
#if !defined(QT_SMALL_COLORDIALOG) |
0 | 1255 |
gl->addWidget(alphaLab, 3, 1, 1, 3); |
1256 |
gl->addWidget(alphaEd, 3, 4); |
|
1257 |
#else |
|
1258 |
if (nonTouchUI) { |
|
1259 |
gl->addWidget(alphaLab, 1, 3, 3, 1); |
|
1260 |
gl->addWidget(alphaEd, 4, 3); |
|
1261 |
} else { |
|
1262 |
alphaLab->hide(); |
|
1263 |
alphaEd->hide(); |
|
1264 |
} |
|
1265 |
#endif |
|
1266 |
alphaEd->hide(); |
|
1267 |
alphaLab->hide(); |
|
1268 |
||
1269 |
connect(hEd, SIGNAL(valueChanged(int)), this, SLOT(hsvEd())); |
|
1270 |
connect(sEd, SIGNAL(valueChanged(int)), this, SLOT(hsvEd())); |
|
1271 |
connect(vEd, SIGNAL(valueChanged(int)), this, SLOT(hsvEd())); |
|
1272 |
||
1273 |
connect(rEd, SIGNAL(valueChanged(int)), this, SLOT(rgbEd())); |
|
1274 |
connect(gEd, SIGNAL(valueChanged(int)), this, SLOT(rgbEd())); |
|
1275 |
connect(bEd, SIGNAL(valueChanged(int)), this, SLOT(rgbEd())); |
|
1276 |
connect(alphaEd, SIGNAL(valueChanged(int)), this, SLOT(rgbEd())); |
|
1277 |
||
1278 |
retranslateStrings(); |
|
1279 |
} |
|
1280 |
||
1281 |
inline QRgb QColorDialogPrivate::currentColor() const { return cs->currentColor(); } |
|
1282 |
inline int QColorDialogPrivate::currentAlpha() const { return cs->currentAlpha(); } |
|
1283 |
inline void QColorDialogPrivate::setCurrentAlpha(int a) { cs->setCurrentAlpha(a); } |
|
1284 |
inline void QColorDialogPrivate::showAlpha(bool b) { cs->showAlpha(b); } |
|
1285 |
inline bool QColorDialogPrivate::isAlphaVisible() const { return cs->isAlphaVisible(); } |
|
1286 |
||
1287 |
QColor QColorDialogPrivate::currentQColor() const |
|
1288 |
{ |
|
1289 |
return cs->currentQColor(); |
|
1290 |
} |
|
1291 |
||
1292 |
void QColorShower::showCurrentColor() |
|
1293 |
{ |
|
1294 |
lab->setColor(currentColor()); |
|
1295 |
lab->repaint(); |
|
1296 |
} |
|
1297 |
||
1298 |
void QColorShower::rgbEd() |
|
1299 |
{ |
|
1300 |
rgbOriginal = true; |
|
1301 |
curCol = qRgba(rEd->value(), gEd->value(), bEd->value(), currentAlpha()); |
|
1302 |
||
1303 |
rgb2hsv(currentColor(), hue, sat, val); |
|
1304 |
||
1305 |
hEd->setValue(hue); |
|
1306 |
sEd->setValue(sat); |
|
1307 |
vEd->setValue(val); |
|
1308 |
||
1309 |
showCurrentColor(); |
|
1310 |
emit newCol(currentColor()); |
|
1311 |
updateQColor(); |
|
1312 |
} |
|
1313 |
||
1314 |
void QColorShower::hsvEd() |
|
1315 |
{ |
|
1316 |
rgbOriginal = false; |
|
1317 |
hue = hEd->value(); |
|
1318 |
sat = sEd->value(); |
|
1319 |
val = vEd->value(); |
|
1320 |
||
1321 |
QColor c; |
|
1322 |
c.setHsv(hue, sat, val); |
|
1323 |
curCol = c.rgb(); |
|
1324 |
||
1325 |
rEd->setValue(qRed(currentColor())); |
|
1326 |
gEd->setValue(qGreen(currentColor())); |
|
1327 |
bEd->setValue(qBlue(currentColor())); |
|
1328 |
||
1329 |
showCurrentColor(); |
|
1330 |
emit newCol(currentColor()); |
|
1331 |
updateQColor(); |
|
1332 |
} |
|
1333 |
||
1334 |
void QColorShower::setRgb(QRgb rgb) |
|
1335 |
{ |
|
1336 |
rgbOriginal = true; |
|
1337 |
curCol = rgb; |
|
1338 |
||
1339 |
rgb2hsv(currentColor(), hue, sat, val); |
|
1340 |
||
1341 |
hEd->setValue(hue); |
|
1342 |
sEd->setValue(sat); |
|
1343 |
vEd->setValue(val); |
|
1344 |
||
1345 |
rEd->setValue(qRed(currentColor())); |
|
1346 |
gEd->setValue(qGreen(currentColor())); |
|
1347 |
bEd->setValue(qBlue(currentColor())); |
|
1348 |
||
1349 |
showCurrentColor(); |
|
1350 |
updateQColor(); |
|
1351 |
} |
|
1352 |
||
1353 |
void QColorShower::setHsv(int h, int s, int v) |
|
1354 |
{ |
|
1355 |
if (h < -1 || (uint)s > 255 || (uint)v > 255) |
|
1356 |
return; |
|
1357 |
||
1358 |
rgbOriginal = false; |
|
1359 |
hue = h; val = v; sat = s; |
|
1360 |
QColor c; |
|
1361 |
c.setHsv(hue, sat, val); |
|
1362 |
curCol = c.rgb(); |
|
1363 |
||
1364 |
hEd->setValue(hue); |
|
1365 |
sEd->setValue(sat); |
|
1366 |
vEd->setValue(val); |
|
1367 |
||
1368 |
rEd->setValue(qRed(currentColor())); |
|
1369 |
gEd->setValue(qGreen(currentColor())); |
|
1370 |
bEd->setValue(qBlue(currentColor())); |
|
1371 |
||
1372 |
showCurrentColor(); |
|
1373 |
updateQColor(); |
|
1374 |
} |
|
1375 |
||
1376 |
void QColorShower::retranslateStrings() |
|
1377 |
{ |
|
1378 |
lblHue->setText(QColorDialog::tr("Hu&e:")); |
|
1379 |
lblSat->setText(QColorDialog::tr("&Sat:")); |
|
1380 |
lblVal->setText(QColorDialog::tr("&Val:")); |
|
1381 |
lblRed->setText(QColorDialog::tr("&Red:")); |
|
1382 |
lblGreen->setText(QColorDialog::tr("&Green:")); |
|
1383 |
lblBlue->setText(QColorDialog::tr("Bl&ue:")); |
|
1384 |
alphaLab->setText(QColorDialog::tr("A&lpha channel:")); |
|
1385 |
} |
|
1386 |
||
1387 |
void QColorShower::updateQColor() |
|
1388 |
{ |
|
1389 |
QColor oldQColor(curQColor); |
|
1390 |
curQColor.setRgba(qRgba(qRed(curCol), qGreen(curCol), qBlue(curCol), currentAlpha())); |
|
1391 |
if (curQColor != oldQColor) |
|
1392 |
emit currentColorChanged(curQColor); |
|
1393 |
} |
|
1394 |
||
1395 |
//sets all widgets to display h,s,v |
|
1396 |
void QColorDialogPrivate::_q_newHsv(int h, int s, int v) |
|
1397 |
{ |
|
1398 |
cs->setHsv(h, s, v); |
|
1399 |
cp->setCol(h, s); |
|
1400 |
lp->setCol(h, s, v); |
|
1401 |
} |
|
1402 |
||
1403 |
//sets all widgets to display rgb |
|
1404 |
void QColorDialogPrivate::setCurrentColor(QRgb rgb) |
|
1405 |
{ |
|
1406 |
cs->setRgb(rgb); |
|
1407 |
_q_newColorTypedIn(rgb); |
|
1408 |
} |
|
1409 |
||
1410 |
// hack; doesn't keep curCol in sync, so use with care |
|
1411 |
void QColorDialogPrivate::setCurrentQColor(const QColor &color) |
|
1412 |
{ |
|
1413 |
Q_Q(QColorDialog); |
|
1414 |
if (cs->curQColor != color) { |
|
1415 |
cs->curQColor = color; |
|
1416 |
emit q->currentColorChanged(color); |
|
1417 |
} |
|
1418 |
} |
|
1419 |
||
1420 |
bool QColorDialogPrivate::selectColor(const QColor &col) |
|
1421 |
{ |
|
1422 |
QRgb color = col.rgb(); |
|
1423 |
int i = 0, j = 0; |
|
1424 |
// Check standard colors |
|
1425 |
if (standard) { |
|
1426 |
for (i = 0; i < 6; i++) { |
|
1427 |
for (j = 0; j < 8; j++) { |
|
1428 |
if (color == stdrgb[i + j*6]) { |
|
1429 |
_q_newStandard(i, j); |
|
1430 |
standard->setCurrent(i, j); |
|
1431 |
standard->setSelected(i, j); |
|
1432 |
standard->setFocus(); |
|
1433 |
return true; |
|
1434 |
} |
|
1435 |
} |
|
1436 |
} |
|
1437 |
} |
|
1438 |
// Check custom colors |
|
1439 |
if (custom) { |
|
1440 |
for (i = 0; i < 2; i++) { |
|
1441 |
for (j = 0; j < 8; j++) { |
|
1442 |
if (color == cusrgb[i + j*2]) { |
|
1443 |
_q_newCustom(i, j); |
|
1444 |
custom->setCurrent(i, j); |
|
1445 |
custom->setSelected(i, j); |
|
1446 |
custom->setFocus(); |
|
1447 |
return true; |
|
1448 |
} |
|
1449 |
} |
|
1450 |
} |
|
1451 |
} |
|
1452 |
return false; |
|
1453 |
} |
|
1454 |
||
1455 |
//sets all widgets except cs to display rgb |
|
1456 |
void QColorDialogPrivate::_q_newColorTypedIn(QRgb rgb) |
|
1457 |
{ |
|
1458 |
int h, s, v; |
|
1459 |
rgb2hsv(rgb, h, s, v); |
|
1460 |
cp->setCol(h, s); |
|
1461 |
lp->setCol(h, s, v); |
|
1462 |
} |
|
1463 |
||
1464 |
void QColorDialogPrivate::_q_newCustom(int r, int c) |
|
1465 |
{ |
|
1466 |
int i = r+2*c; |
|
1467 |
setCurrentColor(cusrgb[i]); |
|
1468 |
nextCust = i; |
|
1469 |
if (standard) |
|
1470 |
standard->setSelected(-1,-1); |
|
1471 |
} |
|
1472 |
||
1473 |
void QColorDialogPrivate::_q_newStandard(int r, int c) |
|
1474 |
{ |
|
1475 |
setCurrentColor(stdrgb[r+c*6]); |
|
1476 |
if (custom) |
|
1477 |
custom->setSelected(-1,-1); |
|
1478 |
} |
|
1479 |
||
1480 |
void QColorDialogPrivate::init(const QColor &initial) |
|
1481 |
{ |
|
1482 |
Q_Q(QColorDialog); |
|
1483 |
||
1484 |
q->setSizeGripEnabled(false); |
|
1485 |
q->setWindowTitle(QColorDialog::tr("Select Color")); |
|
1486 |
||
1487 |
nativeDialogInUse = false; |
|
1488 |
||
1489 |
nextCust = 0; |
|
1490 |
QVBoxLayout *mainLay = new QVBoxLayout(q); |
|
1491 |
// there's nothing in this dialog that benefits from sizing up |
|
1492 |
mainLay->setSizeConstraint(QLayout::SetFixedSize); |
|
1493 |
||
1494 |
QHBoxLayout *topLay = new QHBoxLayout(); |
|
1495 |
mainLay->addLayout(topLay); |
|
1496 |
||
1497 |
leftLay = 0; |
|
1498 |
||
18
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1499 |
#if defined(Q_WS_WINCE) || defined(QT_SMALL_COLORDIALOG) |
0 | 1500 |
smallDisplay = true; |
1501 |
const int lumSpace = 20; |
|
1502 |
#else |
|
1503 |
// small displays (e.g. PDAs) cannot fit the full color dialog, |
|
1504 |
// so just use the color picker. |
|
1505 |
smallDisplay = (QApplication::desktop()->width() < 480 || QApplication::desktop()->height() < 350); |
|
1506 |
const int lumSpace = topLay->spacing() / 2; |
|
1507 |
#endif |
|
1508 |
||
1509 |
if (!smallDisplay) { |
|
1510 |
leftLay = new QVBoxLayout; |
|
1511 |
topLay->addLayout(leftLay); |
|
1512 |
} |
|
1513 |
||
1514 |
initRGB(); |
|
1515 |
||
1516 |
#ifndef QT_NO_SETTINGS |
|
1517 |
if (!customSet) { |
|
1518 |
QSettings settings(QSettings::UserScope, QLatin1String("Trolltech")); |
|
1519 |
for (int i = 0; i < 2*8; ++i) { |
|
1520 |
QVariant v = settings.value(QLatin1String("Qt/customColors/") + QString::number(i)); |
|
1521 |
if (v.isValid()) { |
|
1522 |
QRgb rgb = v.toUInt(); |
|
1523 |
cusrgb[i] = rgb; |
|
1524 |
} |
|
1525 |
} |
|
1526 |
} |
|
1527 |
#endif |
|
1528 |
||
18
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1529 |
#if defined(QT_SMALL_COLORDIALOG) |
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1530 |
# if defined(Q_WS_S60) |
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1531 |
const bool nonTouchUI = !S60->hasTouchscreen; |
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1532 |
# elif defined(Q_WS_MAEMO_5) |
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1533 |
const bool nonTouchUI = false; |
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1534 |
# endif |
0 | 1535 |
#endif |
1536 |
||
1537 |
if (!smallDisplay) { |
|
1538 |
standard = new QColorWell(q, 6, 8, stdrgb); |
|
1539 |
lblBasicColors = new QLabel(q); |
|
1540 |
#ifndef QT_NO_SHORTCUT |
|
1541 |
lblBasicColors->setBuddy(standard); |
|
1542 |
#endif |
|
1543 |
q->connect(standard, SIGNAL(selected(int,int)), SLOT(_q_newStandard(int,int))); |
|
1544 |
leftLay->addWidget(lblBasicColors); |
|
1545 |
leftLay->addWidget(standard); |
|
1546 |
||
1547 |
#if !defined(Q_WS_WINCE) |
|
1548 |
leftLay->addStretch(); |
|
1549 |
#endif |
|
1550 |
||
1551 |
custom = new QColorWell(q, 2, 8, cusrgb); |
|
1552 |
custom->setAcceptDrops(true); |
|
1553 |
||
1554 |
q->connect(custom, SIGNAL(selected(int,int)), SLOT(_q_newCustom(int,int))); |
|
1555 |
lblCustomColors = new QLabel(q); |
|
1556 |
#ifndef QT_NO_SHORTCUT |
|
1557 |
lblCustomColors->setBuddy(custom); |
|
1558 |
#endif |
|
1559 |
leftLay->addWidget(lblCustomColors); |
|
1560 |
leftLay->addWidget(custom); |
|
1561 |
||
1562 |
addCusBt = new QPushButton(q); |
|
1563 |
QObject::connect(addCusBt, SIGNAL(clicked()), q, SLOT(_q_addCustom())); |
|
1564 |
leftLay->addWidget(addCusBt); |
|
1565 |
} else { |
|
1566 |
// better color picker size for small displays |
|
18
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1567 |
#if defined(QT_SMALL_COLORDIALOG) |
0 | 1568 |
QSize screenSize = QApplication::desktop()->availableGeometry(QCursor::pos()).size(); |
1569 |
pWidth = pHeight = qMin(screenSize.width(), screenSize.height()); |
|
1570 |
pHeight -= 20; |
|
1571 |
if(screenSize.height() > screenSize.width()) |
|
1572 |
pWidth -= 20; |
|
1573 |
#else |
|
1574 |
pWidth = 150; |
|
1575 |
pHeight = 100; |
|
1576 |
#endif |
|
1577 |
custom = 0; |
|
1578 |
standard = 0; |
|
1579 |
} |
|
1580 |
||
1581 |
QVBoxLayout *rightLay = new QVBoxLayout; |
|
1582 |
topLay->addLayout(rightLay); |
|
1583 |
||
1584 |
QHBoxLayout *pickLay = new QHBoxLayout; |
|
1585 |
rightLay->addLayout(pickLay); |
|
1586 |
||
1587 |
QVBoxLayout *cLay = new QVBoxLayout; |
|
1588 |
pickLay->addLayout(cLay); |
|
1589 |
cp = new QColorPicker(q); |
|
1590 |
||
1591 |
cp->setFrameStyle(QFrame::Panel + QFrame::Sunken); |
|
1592 |
||
18
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1593 |
#if defined(QT_SMALL_COLORDIALOG) |
0 | 1594 |
if (!nonTouchUI) { |
1595 |
pickLay->addWidget(cp); |
|
1596 |
cLay->addSpacing(lumSpace); |
|
1597 |
} else { |
|
1598 |
cp->hide(); |
|
1599 |
} |
|
1600 |
#else |
|
1601 |
cLay->addSpacing(lumSpace); |
|
1602 |
cLay->addWidget(cp); |
|
1603 |
#endif |
|
1604 |
cLay->addSpacing(lumSpace); |
|
1605 |
||
1606 |
lp = new QColorLuminancePicker(q); |
|
18
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1607 |
#if defined(QT_SMALL_COLORDIALOG) |
0 | 1608 |
QSize screenSize = QApplication::desktop()->availableGeometry(QCursor::pos()).size(); |
1609 |
const int minDimension = qMin(screenSize.height(), screenSize.width()); |
|
1610 |
//set picker to be finger-usable |
|
1611 |
int pickerWidth = !nonTouchUI ? minDimension/9 : minDimension/12; |
|
1612 |
lp->setFixedWidth(pickerWidth); |
|
1613 |
if (!nonTouchUI) |
|
1614 |
pickLay->addWidget(lp); |
|
1615 |
else |
|
1616 |
lp->hide(); |
|
1617 |
#else |
|
1618 |
lp->setFixedWidth(20); |
|
1619 |
pickLay->addWidget(lp); |
|
1620 |
#endif |
|
1621 |
||
1622 |
QObject::connect(cp, SIGNAL(newCol(int,int)), lp, SLOT(setCol(int,int))); |
|
1623 |
QObject::connect(lp, SIGNAL(newHsv(int,int,int)), q, SLOT(_q_newHsv(int,int,int))); |
|
1624 |
||
1625 |
rightLay->addStretch(); |
|
1626 |
||
1627 |
cs = new QColorShower(q); |
|
1628 |
QObject::connect(cs, SIGNAL(newCol(QRgb)), q, SLOT(_q_newColorTypedIn(QRgb))); |
|
3
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
1629 |
QObject::connect(cs, SIGNAL(currentColorChanged(QColor)), |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
1630 |
q, SIGNAL(currentColorChanged(QColor))); |
18
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
1631 |
#if defined(QT_SMALL_COLORDIALOG) |
0 | 1632 |
if (!nonTouchUI) |
1633 |
pWidth -= cp->size().width(); |
|
1634 |
topLay->addWidget(cs); |
|
1635 |
#else |
|
1636 |
rightLay->addWidget(cs); |
|
1637 |
#endif |
|
1638 |
||
1639 |
buttons = new QDialogButtonBox(q); |
|
1640 |
mainLay->addWidget(buttons); |
|
1641 |
||
1642 |
ok = buttons->addButton(QDialogButtonBox::Ok); |
|
1643 |
QObject::connect(ok, SIGNAL(clicked()), q, SLOT(accept())); |
|
1644 |
ok->setDefault(true); |
|
1645 |
cancel = buttons->addButton(QDialogButtonBox::Cancel); |
|
1646 |
QObject::connect(cancel, SIGNAL(clicked()), q, SLOT(reject())); |
|
1647 |
||
1648 |
retranslateStrings(); |
|
1649 |
||
1650 |
#ifdef Q_WS_MAC |
|
1651 |
delegate = 0; |
|
1652 |
#endif |
|
1653 |
||
1654 |
q->setCurrentColor(initial); |
|
1655 |
} |
|
1656 |
||
1657 |
void QColorDialogPrivate::_q_addCustom() |
|
1658 |
{ |
|
1659 |
cusrgb[nextCust] = cs->currentColor(); |
|
1660 |
if (custom) |
|
1661 |
custom->update(); |
|
1662 |
nextCust = (nextCust+1) % 16; |
|
1663 |
} |
|
1664 |
||
1665 |
void QColorDialogPrivate::retranslateStrings() |
|
1666 |
{ |
|
1667 |
if (!smallDisplay) { |
|
1668 |
lblBasicColors->setText(QColorDialog::tr("&Basic colors")); |
|
1669 |
lblCustomColors->setText(QColorDialog::tr("&Custom colors")); |
|
1670 |
addCusBt->setText(QColorDialog::tr("&Add to Custom Colors")); |
|
1671 |
} |
|
1672 |
||
1673 |
cs->retranslateStrings(); |
|
1674 |
} |
|
1675 |
||
1676 |
static const Qt::WindowFlags DefaultWindowFlags = |
|
1677 |
Qt::Dialog | Qt::WindowTitleHint | Qt::MSWindowsFixedSizeDialogHint |
|
1678 |
| Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint; |
|
1679 |
||
1680 |
/*! |
|
1681 |
\class QColorDialog |
|
1682 |
\brief The QColorDialog class provides a dialog widget for specifying colors. |
|
1683 |
||
1684 |
\ingroup standard-dialogs |
|
1685 |
||
1686 |
The color dialog's function is to allow users to choose colors. |
|
1687 |
For example, you might use this in a drawing program to allow the |
|
1688 |
user to set the brush color. |
|
1689 |
||
1690 |
The static functions provide modal color dialogs. |
|
1691 |
\omit |
|
1692 |
If you require a modeless dialog, use the QColorDialog constructor. |
|
1693 |
\endomit |
|
1694 |
||
1695 |
The static getColor() function shows the dialog, and allows the user to |
|
1696 |
specify a color. This function can also be used to let users choose a |
|
1697 |
color with a level of transparency: pass the ShowAlphaChannel option as |
|
1698 |
an additional argument. |
|
1699 |
||
1700 |
The user can store customCount() different custom colors. The |
|
1701 |
custom colors are shared by all color dialogs, and remembered |
|
1702 |
during the execution of the program. Use setCustomColor() to set |
|
1703 |
the custom colors, and use customColor() to get them. |
|
1704 |
||
1705 |
Additional widgets that allow users to pick colors are available |
|
1706 |
as \l{Qt Solutions}. |
|
1707 |
||
1708 |
The \l{dialogs/standarddialogs}{Standard Dialogs} example shows |
|
1709 |
how to use QColorDialog as well as other built-in Qt dialogs. |
|
1710 |
||
1711 |
\image plastique-colordialog.png A color dialog in the Plastique widget style. |
|
1712 |
||
1713 |
\sa QColor, QFileDialog, QPrintDialog, QFontDialog, {Standard Dialogs Example} |
|
1714 |
*/ |
|
1715 |
||
1716 |
/*! |
|
1717 |
\since 4.5 |
|
1718 |
||
1719 |
Constructs a color dialog with the given \a parent. |
|
1720 |
*/ |
|
1721 |
QColorDialog::QColorDialog(QWidget *parent) |
|
1722 |
: QDialog(*new QColorDialogPrivate, parent, DefaultWindowFlags) |
|
1723 |
{ |
|
1724 |
Q_D(QColorDialog); |
|
1725 |
d->init(Qt::white); |
|
1726 |
} |
|
1727 |
||
1728 |
/*! |
|
1729 |
\since 4.5 |
|
1730 |
||
1731 |
Constructs a color dialog with the given \a parent and specified |
|
1732 |
\a initial color. |
|
1733 |
*/ |
|
1734 |
QColorDialog::QColorDialog(const QColor &initial, QWidget *parent) |
|
1735 |
: QDialog(*new QColorDialogPrivate, parent, DefaultWindowFlags) |
|
1736 |
{ |
|
1737 |
Q_D(QColorDialog); |
|
1738 |
d->init(initial); |
|
1739 |
} |
|
1740 |
||
1741 |
/*! |
|
1742 |
\property QColorDialog::currentColor |
|
1743 |
\brief the currently selected color in the dialog |
|
1744 |
*/ |
|
1745 |
||
1746 |
void QColorDialog::setCurrentColor(const QColor &color) |
|
1747 |
{ |
|
1748 |
Q_D(QColorDialog); |
|
1749 |
d->setCurrentColor(color.rgb()); |
|
1750 |
d->selectColor(color); |
|
1751 |
d->setCurrentAlpha(color.alpha()); |
|
1752 |
||
1753 |
#ifdef Q_WS_MAC |
|
1754 |
d->setCurrentQColor(color); |
|
1755 |
d->setCocoaPanelColor(color); |
|
1756 |
#endif |
|
1757 |
if (d->nativeDialogInUse) |
|
1758 |
qt_guiPlatformPlugin()->colorDialogSetCurrentColor(this, color); |
|
1759 |
} |
|
1760 |
||
1761 |
QColor QColorDialog::currentColor() const |
|
1762 |
{ |
|
1763 |
Q_D(const QColorDialog); |
|
1764 |
return d->currentQColor(); |
|
1765 |
} |
|
1766 |
||
1767 |
||
1768 |
/*! |
|
1769 |
Returns the color that the user selected by clicking the \gui{OK} |
|
1770 |
or equivalent button. |
|
1771 |
||
1772 |
\note This color is not always the same as the color held by the |
|
1773 |
\l currentColor property since the user can choose different colors |
|
1774 |
before finally selecting the one to use. |
|
1775 |
*/ |
|
1776 |
QColor QColorDialog::selectedColor() const |
|
1777 |
{ |
|
1778 |
Q_D(const QColorDialog); |
|
1779 |
return d->selectedQColor; |
|
1780 |
} |
|
1781 |
||
1782 |
/*! |
|
1783 |
Sets the given \a option to be enabled if \a on is true; |
|
1784 |
otherwise, clears the given \a option. |
|
1785 |
||
1786 |
\sa options, testOption() |
|
1787 |
*/ |
|
1788 |
void QColorDialog::setOption(ColorDialogOption option, bool on) |
|
1789 |
{ |
|
1790 |
Q_D(QColorDialog); |
|
1791 |
if (!(d->opts & option) != !on) |
|
1792 |
setOptions(d->opts ^ option); |
|
1793 |
} |
|
1794 |
||
1795 |
/*! |
|
1796 |
\since 4.5 |
|
1797 |
||
1798 |
Returns true if the given \a option is enabled; otherwise, returns |
|
1799 |
false. |
|
1800 |
||
1801 |
\sa options, setOption() |
|
1802 |
*/ |
|
1803 |
bool QColorDialog::testOption(ColorDialogOption option) const |
|
1804 |
{ |
|
1805 |
Q_D(const QColorDialog); |
|
1806 |
return (d->opts & option) != 0; |
|
1807 |
} |
|
1808 |
||
1809 |
/*! |
|
1810 |
\property QColorDialog::options |
|
1811 |
\brief the various options that affect the look and feel of the dialog |
|
1812 |
||
1813 |
By default, all options are disabled. |
|
1814 |
||
1815 |
Options should be set before showing the dialog. Setting them while the |
|
1816 |
dialog is visible is not guaranteed to have an immediate effect on the |
|
1817 |
dialog (depending on the option and on the platform). |
|
1818 |
||
1819 |
\sa setOption(), testOption() |
|
1820 |
*/ |
|
1821 |
void QColorDialog::setOptions(ColorDialogOptions options) |
|
1822 |
{ |
|
1823 |
Q_D(QColorDialog); |
|
1824 |
||
1825 |
ColorDialogOptions changed = (options ^ d->opts); |
|
1826 |
if (!changed) |
|
1827 |
return; |
|
1828 |
||
1829 |
d->opts = options; |
|
1830 |
d->buttons->setVisible(!(options & NoButtons)); |
|
1831 |
d->showAlpha(options & ShowAlphaChannel); |
|
1832 |
} |
|
1833 |
||
1834 |
QColorDialog::ColorDialogOptions QColorDialog::options() const |
|
1835 |
{ |
|
1836 |
Q_D(const QColorDialog); |
|
1837 |
return d->opts; |
|
1838 |
} |
|
1839 |
||
1840 |
/*! |
|
1841 |
\enum QColorDialog::ColorDialogOption |
|
1842 |
||
1843 |
\since 4.5 |
|
1844 |
||
1845 |
This enum specifies various options that affect the look and feel |
|
1846 |
of a color dialog. |
|
1847 |
||
1848 |
\value ShowAlphaChannel Allow the user to select the alpha component of a color. |
|
1849 |
\value NoButtons Don't display \gui{OK} and \gui{Cancel} buttons. (Useful for "live dialogs".) |
|
1850 |
\value DontUseNativeDialog Use Qt's standard color dialog on the Mac instead of Apple's |
|
1851 |
native color panel. |
|
1852 |
||
1853 |
\sa options, setOption(), testOption(), windowModality() |
|
1854 |
*/ |
|
1855 |
||
1856 |
/*! |
|
1857 |
\fn void QColorDialog::currentColorChanged(const QColor &color) |
|
1858 |
||
1859 |
This signal is emitted whenever the current color changes in the dialog. |
|
1860 |
The current color is specified by \a color. |
|
1861 |
||
1862 |
\sa color, colorSelected() |
|
1863 |
*/ |
|
1864 |
||
1865 |
#ifdef Q_WS_MAC |
|
1866 |
// can only have one Cocoa color panel active |
|
1867 |
bool QColorDialogPrivate::sharedColorPanelAvailable = true; |
|
1868 |
#endif |
|
1869 |
||
1870 |
/*! |
|
1871 |
\fn void QColorDialog::colorSelected(const QColor &color); |
|
1872 |
||
1873 |
This signal is emitted just after the user has clicked \gui{OK} to |
|
1874 |
select a color to use. The chosen color is specified by \a color. |
|
1875 |
||
1876 |
\sa color, currentColorChanged() |
|
1877 |
*/ |
|
1878 |
||
1879 |
/*! |
|
1880 |
Changes the visibility of the dialog. If \a visible is true, the dialog |
|
1881 |
is shown; otherwise, it is hidden. |
|
1882 |
*/ |
|
1883 |
void QColorDialog::setVisible(bool visible) |
|
1884 |
{ |
|
1885 |
Q_D(QColorDialog); |
|
1886 |
||
1887 |
if (visible){ |
|
1888 |
if (testAttribute(Qt::WA_WState_ExplicitShowHide) && !testAttribute(Qt::WA_WState_Hidden)) |
|
1889 |
return; |
|
1890 |
} else if (testAttribute(Qt::WA_WState_ExplicitShowHide) && testAttribute(Qt::WA_WState_Hidden)) |
|
1891 |
return; |
|
1892 |
||
1893 |
if (visible) |
|
1894 |
d->selectedQColor = QColor(); |
|
1895 |
||
1896 |
#if defined(Q_WS_MAC) |
|
1897 |
if (visible) { |
|
1898 |
if (d->delegate || (QColorDialogPrivate::sharedColorPanelAvailable && |
|
1899 |
!(testAttribute(Qt::WA_DontShowOnScreen) || (d->opts & DontUseNativeDialog)))){ |
|
1900 |
d->openCocoaColorPanel(currentColor(), parentWidget(), windowTitle(), options()); |
|
1901 |
QColorDialogPrivate::sharedColorPanelAvailable = false; |
|
1902 |
setAttribute(Qt::WA_DontShowOnScreen); |
|
1903 |
} |
|
1904 |
setWindowFlags(windowModality() == Qt::WindowModal ? Qt::Sheet : DefaultWindowFlags); |
|
1905 |
} else { |
|
1906 |
if (d->delegate) { |
|
1907 |
d->closeCocoaColorPanel(); |
|
1908 |
setAttribute(Qt::WA_DontShowOnScreen, false); |
|
1909 |
} |
|
1910 |
} |
|
1911 |
#else |
|
1912 |
||
1913 |
if (!(d->opts & DontUseNativeDialog) && qt_guiPlatformPlugin()->colorDialogSetVisible(this, visible)) { |
|
1914 |
d->nativeDialogInUse = true; |
|
1915 |
// Set WA_DontShowOnScreen so that QDialog::setVisible(visible) below |
|
1916 |
// updates the state correctly, but skips showing the non-native version: |
|
1917 |
setAttribute(Qt::WA_DontShowOnScreen); |
|
1918 |
} else { |
|
1919 |
d->nativeDialogInUse = false; |
|
1920 |
setAttribute(Qt::WA_DontShowOnScreen, false); |
|
1921 |
} |
|
1922 |
#endif |
|
1923 |
||
1924 |
QDialog::setVisible(visible); |
|
1925 |
} |
|
1926 |
||
1927 |
/*! |
|
1928 |
\overload |
|
1929 |
\since 4.5 |
|
1930 |
||
1931 |
Opens the dialog and connects its colorSelected() signal to the slot specified |
|
1932 |
by \a receiver and \a member. |
|
1933 |
||
1934 |
The signal will be disconnected from the slot when the dialog is closed. |
|
1935 |
*/ |
|
1936 |
void QColorDialog::open(QObject *receiver, const char *member) |
|
1937 |
{ |
|
1938 |
Q_D(QColorDialog); |
|
3
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
1939 |
connect(this, SIGNAL(colorSelected(QColor)), receiver, member); |
0 | 1940 |
d->receiverToDisconnectOnClose = receiver; |
1941 |
d->memberToDisconnectOnClose = member; |
|
1942 |
QDialog::open(); |
|
1943 |
} |
|
1944 |
||
1945 |
/*! |
|
1946 |
\fn QColorDialog::open() |
|
1947 |
||
1948 |
\since 4.5 |
|
1949 |
Shows the dialog as a \l{QDialog#Modal Dialogs}{window modal dialog}, |
|
1950 |
returning immediately. |
|
1951 |
||
1952 |
\sa QDialog::open() |
|
1953 |
*/ |
|
1954 |
||
1955 |
/*! |
|
1956 |
\since 4.5 |
|
1957 |
||
1958 |
Pops up a modal color dialog with the given window \a title (or "Select Color" if none is |
|
1959 |
specified), lets the user choose a color, and returns that color. The color is initially set |
|
1960 |
to \a initial. The dialog is a child of \a parent. It returns an invalid (see |
|
1961 |
QColor::isValid()) color if the user cancels the dialog. |
|
1962 |
||
1963 |
The \a options argument allows you to customize the dialog. |
|
1964 |
*/ |
|
1965 |
QColor QColorDialog::getColor(const QColor &initial, QWidget *parent, const QString &title, |
|
1966 |
ColorDialogOptions options) |
|
1967 |
{ |
|
1968 |
QColorDialog dlg(parent); |
|
1969 |
if (!title.isEmpty()) |
|
1970 |
dlg.setWindowTitle(title); |
|
1971 |
dlg.setOptions(options); |
|
1972 |
dlg.setCurrentColor(initial); |
|
1973 |
dlg.exec(); |
|
1974 |
return dlg.selectedColor(); |
|
1975 |
} |
|
1976 |
||
1977 |
/*! |
|
1978 |
Pops up a modal color dialog, lets the user choose a color, and |
|
1979 |
returns that color. The color is initially set to \a initial. The |
|
1980 |
dialog is a child of \a parent. It returns an invalid (see |
|
1981 |
QColor::isValid()) color if the user cancels the dialog. |
|
1982 |
*/ |
|
1983 |
||
1984 |
QColor QColorDialog::getColor(const QColor &initial, QWidget *parent) |
|
1985 |
{ |
|
1986 |
return getColor(initial, parent, QString(), ColorDialogOptions(0)); |
|
1987 |
} |
|
1988 |
||
1989 |
||
1990 |
/*! |
|
1991 |
\obsolete |
|
1992 |
||
1993 |
Pops up a modal color dialog to allow the user to choose a color |
|
1994 |
and an alpha channel (transparency) value. The color+alpha is |
|
1995 |
initially set to \a initial. The dialog is a child of \a parent. |
|
1996 |
||
1997 |
If \a ok is non-null, \e *\a ok is set to true if the user clicked |
|
1998 |
\gui{OK}, and to false if the user clicked Cancel. |
|
1999 |
||
2000 |
If the user clicks Cancel, the \a initial value is returned. |
|
2001 |
||
2002 |
Use QColorDialog::getColor() instead, passing the |
|
2003 |
QColorDialog::ShowAlphaChannel option. |
|
2004 |
*/ |
|
2005 |
||
2006 |
QRgb QColorDialog::getRgba(QRgb initial, bool *ok, QWidget *parent) |
|
2007 |
{ |
|
2008 |
QColor color(getColor(QColor(initial), parent, QString(), ShowAlphaChannel)); |
|
2009 |
QRgb result = color.isValid() ? color.rgba() : initial; |
|
2010 |
if (ok) |
|
2011 |
*ok = color.isValid(); |
|
2012 |
return result; |
|
2013 |
} |
|
2014 |
||
2015 |
/*! |
|
2016 |
Destroys the color dialog. |
|
2017 |
*/ |
|
2018 |
||
2019 |
QColorDialog::~QColorDialog() |
|
2020 |
{ |
|
2021 |
Q_D(QColorDialog); |
|
2022 |
#if defined(Q_WS_MAC) |
|
2023 |
if (d->delegate) { |
|
2024 |
d->releaseCocoaColorPanelDelegate(); |
|
2025 |
QColorDialogPrivate::sharedColorPanelAvailable = true; |
|
2026 |
} |
|
2027 |
#endif |
|
2028 |
||
2029 |
#ifndef QT_NO_SETTINGS |
|
2030 |
if (!customSet) { |
|
2031 |
QSettings settings(QSettings::UserScope, QLatin1String("Trolltech")); |
|
2032 |
for (int i = 0; i < 2*8; ++i) |
|
2033 |
settings.setValue(QLatin1String("Qt/customColors/") + QString::number(i), cusrgb[i]); |
|
2034 |
} |
|
2035 |
#endif |
|
2036 |
if (d->nativeDialogInUse) |
|
2037 |
qt_guiPlatformPlugin()->colorDialogDelete(this); |
|
2038 |
||
2039 |
} |
|
2040 |
||
2041 |
||
2042 |
/*! |
|
2043 |
\reimp |
|
2044 |
*/ |
|
2045 |
void QColorDialog::changeEvent(QEvent *e) |
|
2046 |
{ |
|
2047 |
Q_D(QColorDialog); |
|
2048 |
if (e->type() == QEvent::LanguageChange) |
|
2049 |
d->retranslateStrings(); |
|
2050 |
QDialog::changeEvent(e); |
|
2051 |
} |
|
2052 |
||
2053 |
/*! |
|
2054 |
Closes the dialog and sets its result code to \a result. If this dialog |
|
2055 |
is shown with exec(), done() causes the local event loop to finish, |
|
2056 |
and exec() to return \a result. |
|
2057 |
||
2058 |
\sa QDialog::done() |
|
2059 |
*/ |
|
2060 |
void QColorDialog::done(int result) |
|
2061 |
{ |
|
2062 |
Q_D(QColorDialog); |
|
2063 |
QDialog::done(result); |
|
2064 |
if (result == Accepted) { |
|
2065 |
d->selectedQColor = d->currentQColor(); |
|
2066 |
emit colorSelected(d->selectedQColor); |
|
2067 |
} else { |
|
2068 |
d->selectedQColor = QColor(); |
|
2069 |
} |
|
2070 |
if (d->receiverToDisconnectOnClose) { |
|
3
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2071 |
disconnect(this, SIGNAL(colorSelected(QColor)), |
0 | 2072 |
d->receiverToDisconnectOnClose, d->memberToDisconnectOnClose); |
2073 |
d->receiverToDisconnectOnClose = 0; |
|
2074 |
} |
|
2075 |
d->memberToDisconnectOnClose.clear(); |
|
2076 |
} |
|
2077 |
||
2078 |
QT_END_NAMESPACE |
|
2079 |
||
2080 |
#include "qcolordialog.moc" |
|
2081 |
#include "moc_qcolordialog.cpp" |
|
2082 |
||
2083 |
#endif // QT_NO_COLORDIALOG |
|
2084 |
||
2085 |
/*! |
|
2086 |
\fn QColor QColorDialog::getColor(const QColor &init, QWidget *parent, const char *name) |
|
2087 |
\compat |
|
2088 |
*/ |
|
2089 |
||
2090 |
/*! |
|
2091 |
\fn QRgb QColorDialog::getRgba(QRgb rgba, bool *ok, QWidget *parent, const char *name) |
|
2092 |
\compat |
|
2093 |
*/ |