DPF

DISTRHO Plugin Framework
Log | Files | Refs | Submodules | README | LICENSE

commit 772e4f5ae8e21ff2d13f5e5633436fbd283e00bc
parent 176b1a4707225796ea3d290b379b3e404a2d94b8
Author: falkTX <falktx@falktx.com>
Date:   Fri, 17 Jun 2022 21:24:59 +0100

Update Info plugin example resize handle to set mouse cursor

Signed-off-by: falkTX <falktx@falktx.com>

Diffstat:
Mexamples/Info/ResizeHandle.hpp | 55+++++++++++++++++++++++++++++++++++++++++++------------
1 file changed, 43 insertions(+), 12 deletions(-)

diff --git a/examples/Info/ResizeHandle.hpp b/examples/Info/ResizeHandle.hpp @@ -1,6 +1,6 @@ /* * Resize handle for DPF - * Copyright (C) 2021 Filipe Coelho <falktx@falktx.com> + * Copyright (C) 2021-2022 Filipe Coelho <falktx@falktx.com> * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -19,6 +19,10 @@ #include "TopLevelWidget.hpp" #include "Color.hpp" +#if defined(DGL_OPENGL) && !defined(DGL_USE_OPENGL3) +#include "OpenGL-include.hpp" +#endif + START_NAMESPACE_DGL /** Resize handle for DPF windows, will sit on bottom-right. */ @@ -29,7 +33,8 @@ public: explicit ResizeHandle(Window& window) : TopLevelWidget(window), handleSize(16), - resizing(false) + hasCursor(false), + isResizing(false) { resetArea(); } @@ -38,12 +43,14 @@ public: explicit ResizeHandle(TopLevelWidget* const tlw) : TopLevelWidget(tlw->getWindow()), handleSize(16), - resizing(false) + hasCursor(false), + isResizing(false) { resetArea(); } - /** Set the handle size, minimum 16. */ + /** Set the handle size, minimum 16. + * Scale factor is automatically applied on top of this size as needed */ void setHandleSize(const uint size) { handleSize = std::max(16u, size); @@ -53,9 +60,15 @@ public: protected: void onDisplay() override { + // TODO implement gl3 stuff in DPF +#ifndef DGL_USE_OPENGL3 const GraphicsContext& context(getGraphicsContext()); const double lineWidth = 1.0 * getScaleFactor(); + #if defined(DGL_OPENGL) && !defined(DGL_USE_OPENGL3) + glMatrixMode(GL_MODELVIEW); + #endif + // draw white lines, 1px wide Color(1.0f, 1.0f, 1.0f).setFor(context); l1.draw(context, lineWidth); @@ -71,6 +84,7 @@ protected: l1b.draw(context, lineWidth); l2b.draw(context, lineWidth); l3b.draw(context, lineWidth); +#endif } bool onMouse(const MouseEvent& ev) override @@ -80,15 +94,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; } @@ -97,8 +112,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()); @@ -106,9 +124,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); @@ -135,10 +155,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();