| @@ -29,7 +29,8 @@ public: | |||
| explicit ResizeHandle(Window& window) | |||
| : TopLevelWidget(window), | |||
| handleSize(16), | |||
| resizing(false) | |||
| hasCursor(false), | |||
| isResizing(false) | |||
| { | |||
| resetArea(); | |||
| } | |||
| @@ -38,7 +39,8 @@ public: | |||
| explicit ResizeHandle(TopLevelWidget* const tlw) | |||
| : TopLevelWidget(tlw->getWindow()), | |||
| handleSize(16), | |||
| resizing(false) | |||
| hasCursor(false), | |||
| isResizing(false) | |||
| { | |||
| resetArea(); | |||
| } | |||
| @@ -56,12 +58,9 @@ protected: | |||
| const GraphicsContext& context(getGraphicsContext()); | |||
| const double lineWidth = 1.0 * getScaleFactor(); | |||
| #ifdef DGL_OPENGL | |||
| glUseProgram(0); | |||
| # ifndef DGL_USE_OPENGL3 | |||
| #if defined(DGL_OPENGL) && !defined(DGL_USE_OPENGL3) | |||
| glMatrixMode(GL_MODELVIEW); | |||
| # endif | |||
| #endif | |||
| #endif | |||
| // draw white lines, 1px wide | |||
| Color(1.0f, 1.0f, 1.0f).setFor(context); | |||
| @@ -87,15 +86,16 @@ protected: | |||
| if (ev.press && area.contains(ev.pos)) | |||
| { | |||
| resizing = true; | |||
| isResizing = true; | |||
| resizingSize = Size<double>(getWidth(), getHeight()); | |||
| lastResizePoint = ev.pos; | |||
| return true; | |||
| } | |||
| if (resizing && ! ev.press) | |||
| if (isResizing && ! ev.press) | |||
| { | |||
| resizing = false; | |||
| isResizing = false; | |||
| recheckCursor(ev.pos); | |||
| return true; | |||
| } | |||
| @@ -104,8 +104,11 @@ protected: | |||
| bool onMotion(const MotionEvent& ev) override | |||
| { | |||
| if (! resizing) | |||
| if (! isResizing) | |||
| { | |||
| recheckCursor(ev.pos); | |||
| return false; | |||
| } | |||
| const Size<double> offset(ev.pos.getX() - lastResizePoint.getX(), | |||
| ev.pos.getY() - lastResizePoint.getY()); | |||
| @@ -113,9 +116,11 @@ protected: | |||
| resizingSize += offset; | |||
| lastResizePoint = ev.pos; | |||
| // TODO min width, min height | |||
| const uint minWidth = 16; | |||
| const uint minHeight = 16; | |||
| // TODO keepAspectRatio | |||
| bool keepAspectRatio; | |||
| const Size<uint> minSize(getWindow().getGeometryConstraints(keepAspectRatio)); | |||
| const uint minWidth = minSize.getWidth(); | |||
| const uint minHeight = minSize.getHeight(); | |||
| if (resizingSize.getWidth() < minWidth) | |||
| resizingSize.setWidth(minWidth); | |||
| @@ -142,10 +147,21 @@ private: | |||
| uint handleSize; | |||
| // event handling state | |||
| bool resizing; | |||
| bool hasCursor, isResizing; | |||
| Point<double> lastResizePoint; | |||
| Size<double> resizingSize; | |||
| void recheckCursor(const Point<double>& pos) | |||
| { | |||
| const bool shouldHaveCursor = area.contains(pos); | |||
| if (shouldHaveCursor == hasCursor) | |||
| return; | |||
| hasCursor = shouldHaveCursor; | |||
| setCursor(shouldHaveCursor ? kMouseCursorDiagonal : kMouseCursorArrow); | |||
| } | |||
| void resetArea() | |||
| { | |||
| const double scaleFactor = getScaleFactor(); | |||