diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2016-09-05 18:24:01 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2016-09-05 18:24:01 +0200 |
commit | 9e63b4ecafcb66c275760cd28d2cfb0d258a474e (patch) | |
tree | bde33bb3e4d3c576637709f056ca994372d9a588 /spline-widget | |
parent | b77a3539a46f9ac8fc06ee701e00512aac4c7550 (diff) |
spline-widget: stop dragging when alt-tabbing away
Unfortunately now spline widgets grab keyboard focus. Qt doesn't seem to have a
better way to detect whether some other application gained focus.
Diffstat (limited to 'spline-widget')
-rw-r--r-- | spline-widget/spline-widget.cpp | 39 | ||||
-rw-r--r-- | spline-widget/spline-widget.hpp | 4 |
2 files changed, 23 insertions, 20 deletions
diff --git a/spline-widget/spline-widget.cpp b/spline-widget/spline-widget.cpp index d4e01189..ed07419e 100644 --- a/spline-widget/spline-widget.cpp +++ b/spline-widget/spline-widget.cpp @@ -33,6 +33,8 @@ spline_widget::spline_widget(QWidget *parent) : { update_range(); setMouseTracking(true); + setFocusPolicy(Qt::ClickFocus); + setCursor(Qt::ArrowCursor); } spline_widget::~spline_widget() @@ -280,7 +282,6 @@ void spline_widget::mousePressEvent(QMouseEvent *e) points_t points = _config->getPoints(); if (e->button() == Qt::LeftButton) { - setFocus(); bool bTouchingPoint = false; moving_control_point_idx = -1; if (_config) @@ -314,7 +315,6 @@ void spline_widget::mousePressEvent(QMouseEvent *e) { _config->addPoint(pixel_coord_to_point(e->pos())); show_tooltip(e->pos()); - setFocus(); } } } @@ -322,7 +322,6 @@ void spline_widget::mousePressEvent(QMouseEvent *e) if (e->button() == Qt::RightButton) { - clearFocus(); if (_config) { int found_pt = -1; @@ -348,22 +347,15 @@ void spline_widget::mousePressEvent(QMouseEvent *e) void spline_widget::mouseMoveEvent(QMouseEvent *e) { - if (!_config || !isEnabled()) - return; - - const bool has_focus = hasFocus(); - - if (!has_focus) + if (!_config || !isEnabled() || !hasFocus() || !isActiveWindow()) { - moving_control_point_idx = -1; - setCursor(Qt::ArrowCursor); + clearFocus(); + return; } points_t points = _config->getPoints(); - if (hasFocus() && - moving_control_point_idx >= 0 && - moving_control_point_idx < points.size()) + if (moving_control_point_idx >= 0 && moving_control_point_idx < points.size()) { const int idx = moving_control_point_idx; @@ -419,8 +411,6 @@ void spline_widget::mouseMoveEvent(QMouseEvent *e) } else { - moving_control_point_idx = -1; - int i; bool is_on_point = is_on_pt(e->pos(), &i); @@ -442,10 +432,11 @@ void spline_widget::mouseMoveEvent(QMouseEvent *e) void spline_widget::mouseReleaseEvent(QMouseEvent *e) { - if (!_config || !isEnabled()) + if (!_config || !isEnabled() || !isActiveWindow() || !hasFocus()) + { + clearFocus(); return; - - clearFocus(); + } if (e->button() == Qt::LeftButton) { @@ -542,6 +533,16 @@ bool spline_widget::point_within_pixel(const QPointF& pt, const QPoint &pixel) return sqrt(QPointF::dotProduct(tmp, tmp)) < point_size; } +void spline_widget::focusOutEvent(QFocusEvent* e) +{ + if (moving_control_point_idx != -1) + QToolTip::hideText(); + moving_control_point_idx = -1; + lower(); + setCursor(Qt::ArrowCursor); + e->accept(); +} + QPointF spline_widget::pixel_coord_to_point(const QPoint& point) { if (!_config) diff --git a/spline-widget/spline-widget.hpp b/spline-widget/spline-widget.hpp index 53560d6a..477e3ba6 100644 --- a/spline-widget/spline-widget.hpp +++ b/spline-widget/spline-widget.hpp @@ -22,6 +22,7 @@ using namespace options; #include <QPointF> #include <QToolTip> #include <QShowEvent> +#include <QFocusEvent> #include <QMetaObject> #include <QDebug> @@ -74,7 +75,8 @@ private: void drawPoint(QPainter& painter, const QPointF& pt, const QColor& colBG, const QColor& border = QColor(50, 100, 120, 200)); void drawLine(QPainter& painter, const QPoint& start, const QPoint& end, const QPen& pen); bool point_within_pixel(const QPointF& pt, const QPoint& pixel); -protected: + + void focusOutEvent(QFocusEvent*e) override; void resizeEvent(QResizeEvent *) override; private: bool is_on_pt(const QPoint& pos, int* pt = nullptr); |