1 /***************************************************************************
2 * Copyright (C) 2010 by Till Theato (root@ttill.de) *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
18 ***************************************************************************/
21 #include "colorpickerwidget.h"
23 #include <QMouseEvent>
24 #include <QHBoxLayout>
25 #include <QPushButton>
28 #include <QDesktopWidget>
30 #include <KApplication>
31 #include <KColorDialog>
33 #include <KLocalizedString>
39 class KCDPickerFilter: public QWidget
42 KCDPickerFilter(QWidget* parent): QWidget(parent) {}
44 virtual bool x11Event(XEvent* event) {
45 if (event->type == ButtonRelease) {
46 QMouseEvent e(QEvent::MouseButtonRelease, QPoint(),
47 QPoint(event->xmotion.x_root, event->xmotion.y_root) , Qt::NoButton, Qt::NoButton, Qt::NoModifier);
48 QApplication::sendEvent(parentWidget(), &e);
57 ColorPickerWidget::ColorPickerWidget(QWidget *parent) :
65 QHBoxLayout *layout = new QHBoxLayout(this);
67 QPushButton *button = new QPushButton(this);
68 button->setIcon(KIcon("color-picker"));
69 button->setToolTip(i18n("Pick a color on the screen"));
70 connect(button, SIGNAL(clicked()), this, SLOT(slotSetupEventFilter()));
72 m_size = new QSpinBox(this);
73 m_size->setMinimum(1);
74 //m_size->setMaximum(qMin(qApp->desktop()->geometry().width(), qApp->desktop()->geometry().height()));
75 m_size->setMaximum(100);
78 layout->addWidget(button);
79 layout->addStretch(1);
80 layout->addWidget(new QLabel(i18n("Width of square to pick color from:")));
81 layout->addWidget(m_size);
84 ColorPickerWidget::~ColorPickerWidget()
87 if (m_filterActive && kapp)
88 kapp->removeX11EventFilter(m_filter);
92 QColor ColorPickerWidget::averagePickedColor(const QPoint pos)
94 int size = m_size->value();
95 int x0 = qMax(0, pos.x() - size / 2);
96 int y0 = qMax(0, pos.y() - size / 2);
97 int x1 = qMin(qApp->desktop()->geometry().width(), pos.x() + size / 2);
98 int y1 = qMin(qApp->desktop()->geometry().height(), pos.y() + size / 2);
104 for (int i = x0; i < x1; ++i) {
105 for (int j = y0; j < y1; ++j) {
106 QColor color = KColorDialog::grabColor(QPoint(i, j));
108 sumG += color.green();
109 sumB += color.blue();
113 int numPixel = (x1 - x0) * (y1 - y0);
114 return QColor(sumR / numPixel, sumG / numPixel, sumB / numPixel);
117 void ColorPickerWidget::mousePressEvent(QMouseEvent* event)
119 if (event->button() != Qt::LeftButton) {
124 QWidget::mousePressEvent(event);
127 void ColorPickerWidget::mouseReleaseEvent(QMouseEvent *event)
129 if (m_filterActive) {
132 if (m_size->value() == 1)
133 emit colorPicked(KColorDialog::grabColor(event->globalPos()));
135 emit colorPicked(averagePickedColor(event->globalPos()));
139 QWidget::mouseReleaseEvent(event);
142 void ColorPickerWidget::keyPressEvent(QKeyEvent *event)
144 if (m_filterActive) {
145 // "special keys" (non letter, numeral) do not work, so close for every key
146 //if (event->key() == Qt::Key_Escape)
151 QWidget::keyPressEvent(event);
154 void ColorPickerWidget::slotSetupEventFilter()
156 m_filterActive = true;
158 m_filter = new KCDPickerFilter(this);
159 kapp->installX11EventFilter(m_filter);
161 if (m_size->value() == 1)
162 grabMouse(QCursor(KIcon("color-picker").pixmap(22, 22), 0, 21));
164 grabMouse(Qt::CrossCursor);
168 void ColorPickerWidget::closeEventFilter()
170 m_filterActive = false;
172 kapp->removeX11EventFilter(m_filter);
180 #include "colorpickerwidget.moc"