X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fcolorpickerwidget.cpp;h=a9b8ce860973cb5aa22c3ad999bbf04efcb15664;hb=c3302003093710ee247ad84c0fe2ef3c579d417f;hp=480ed8d13a61064e4ba856d8f34e8aa7a23530f1;hpb=61474e6475b9e26b4373942824b353929410b433;p=kdenlive diff --git a/src/colorpickerwidget.cpp b/src/colorpickerwidget.cpp index 480ed8d1..a9b8ce86 100644 --- a/src/colorpickerwidget.cpp +++ b/src/colorpickerwidget.cpp @@ -30,28 +30,30 @@ #include #include +#include #include #ifdef Q_WS_X11 #include #include +#endif -class KCDPickerFilter: public QWidget +MyFrame::MyFrame(QWidget* parent) : + QFrame(parent) { -public: - KCDPickerFilter(QWidget* parent): QWidget(parent) {} - - virtual bool x11Event(XEvent* event) { - if (event->type == ButtonRelease) { - QMouseEvent e(QEvent::MouseButtonRelease, QPoint(), - QPoint(event->xmotion.x_root, event->xmotion.y_root) , Qt::NoButton, Qt::NoButton, Qt::NoModifier); - QApplication::sendEvent(parentWidget(), &e); - return true; - } - return false; - } -}; -#endif + setFrameStyle(QFrame::Box | QFrame::Plain); + setWindowOpacity(0.5); + setWindowFlags(Qt::FramelessWindowHint); +} + +// virtual +void MyFrame::hideEvent ( QHideEvent * event ) +{ + QFrame::hideEvent(event); + // We need a timer here since hiding the frame will trigger a monitor refresh timer that will + // repaint the monitor after 70 ms. + QTimer::singleShot(250, this, SIGNAL(getColor())); +} ColorPickerWidget::ColorPickerWidget(QWidget *parent) : @@ -59,7 +61,6 @@ ColorPickerWidget::ColorPickerWidget(QWidget *parent) : m_filterActive(false) { #ifdef Q_WS_X11 - m_filter = 0; m_image = NULL; #endif @@ -68,31 +69,26 @@ ColorPickerWidget::ColorPickerWidget(QWidget *parent) : QToolButton *button = new QToolButton(this); button->setIcon(KIcon("color-picker")); - // TODO: make translatable after 0.8.2 release - button->setToolTip(i18n("Pick a color on the screen") + QString("\nBy pressing the mouse button and then moving your mouse you can select a section of the screen from which to get an average color.")); + button->setToolTip("

" + i18n("Pick a color on the screen. By pressing the mouse button and then moving your mouse you can select a section of the screen from which to get an average color.") + "

"); button->setAutoRaise(true); connect(button, SIGNAL(clicked()), this, SLOT(slotSetupEventFilter())); layout->addWidget(button); + setFocusPolicy(Qt::StrongFocus); - m_grabRectFrame = new QFrame(); - m_grabRectFrame->setFrameStyle(QFrame::Box | QFrame::Plain); - m_grabRectFrame->setWindowOpacity(0.5); - m_grabRectFrame->setWindowFlags(Qt::FramelessWindowHint); + m_grabRectFrame = new MyFrame(); m_grabRectFrame->hide(); } ColorPickerWidget::~ColorPickerWidget() { delete m_grabRectFrame; -#ifdef Q_WS_X11 - if (m_filterActive && kapp) - kapp->removeX11EventFilter(m_filter); -#endif + if (m_filterActive) removeEventFilter(this); } void ColorPickerWidget::slotGetAverageColor() { + disconnect(m_grabRectFrame, SIGNAL(getColor()), this, SLOT(slotGetAverageColor())); m_grabRect = m_grabRect.normalized(); int numPixel = m_grabRect.width() * m_grabRect.height(); @@ -139,12 +135,14 @@ void ColorPickerWidget::slotGetAverageColor() emit displayMessage(i18n("Calculated average color for rectangle."), -1); emit colorPicked(QColor(sumR / numPixel, sumG / numPixel, sumB / numPixel)); + emit disableCurrentFilter(false); } void ColorPickerWidget::mousePressEvent(QMouseEvent* event) { if (event->button() != Qt::LeftButton) { closeEventFilter(); + emit disableCurrentFilter(false); event->accept(); return; } @@ -161,20 +159,20 @@ void ColorPickerWidget::mousePressEvent(QMouseEvent* event) void ColorPickerWidget::mouseReleaseEvent(QMouseEvent *event) { if (m_filterActive) { - m_grabRectFrame->hide(); - closeEventFilter(); m_grabRect.setWidth(event->globalX() - m_grabRect.x()); m_grabRect.setHeight(event->globalY() - m_grabRect.y()); if (m_grabRect.width() * m_grabRect.height() == 0) { + m_grabRectFrame->hide(); emit colorPicked(grabColor(event->globalPos())); + emit disableCurrentFilter(false); } else { // delay because m_grabRectFrame does not hide immediately - QTimer::singleShot(50, this, SLOT(slotGetAverageColor())); + connect(m_grabRectFrame, SIGNAL(getColor()), this, SLOT(slotGetAverageColor())); + m_grabRectFrame->hide(); } - return; } QWidget::mouseReleaseEvent(event); @@ -190,25 +188,12 @@ void ColorPickerWidget::mouseMoveEvent(QMouseEvent* event) QWidget::mouseMoveEvent(event); } -void ColorPickerWidget::keyPressEvent(QKeyEvent *event) -{ - if (m_filterActive) { - // "special keys" (non letter, numeral) do not work, so close for every key - //if (event->key() == Qt::Key_Escape) - closeEventFilter(); - event->accept(); - return; - } - QWidget::keyPressEvent(event); -} - void ColorPickerWidget::slotSetupEventFilter() { + emit disableCurrentFilter(true); m_filterActive = true; -#ifdef Q_WS_X11 - m_filter = new KCDPickerFilter(this); - kapp->installX11EventFilter(m_filter); -#endif + setFocus(); + installEventFilter(this); grabMouse(QCursor(KIcon("color-picker").pixmap(22, 22), 0, 21)); grabKeyboard(); } @@ -216,13 +201,22 @@ void ColorPickerWidget::slotSetupEventFilter() void ColorPickerWidget::closeEventFilter() { m_filterActive = false; -#ifdef Q_WS_X11 - kapp->removeX11EventFilter(m_filter); - delete m_filter; - m_filter = 0; -#endif releaseMouse(); releaseKeyboard(); + removeEventFilter(this); +} + +bool ColorPickerWidget::eventFilter(QObject *object, QEvent *event) +{ + // Close color picker on any key press + if (event->type() == QEvent::KeyPress || event->type() == QEvent::ShortcutOverride) { + closeEventFilter(); + emit disableCurrentFilter(false); + event->setAccepted(true); + return true; + } + return QObject::eventFilter(object, event); + } QColor ColorPickerWidget::grabColor(const QPoint &p, bool destroyImage)