DPF

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

commit 655aabc0e1a3ffdfcce31ca4d1adda7f1e52b427
parent 1c3fdcfae85d6d147c4276f82f89276cfe44f5cf
Author: falkTX <falktx@gmail.com>
Date:   Tue,  5 May 2015 03:04:35 +0200

Fix mouse handling for ImageButton; Send motion event when modal closes

Diffstat:
Mdgl/ImageWidgets.hpp | 2+-
Mdgl/Widget.hpp | 9+++++++--
Mdgl/src/ImageWidgets.cpp | 103++++++++++++++++++++++++++++++++++++++++++-------------------------------------
Mdgl/src/Window.cpp | 16++++++++++++++++
4 files changed, 79 insertions(+), 51 deletions(-)

diff --git a/dgl/ImageWidgets.hpp b/dgl/ImageWidgets.hpp @@ -77,8 +77,8 @@ private: Image fImageNormal; Image fImageHover; Image fImageDown; - Image& fCurImage; int fCurButton; + int fCurState; Callback* fCallback; diff --git a/dgl/Widget.hpp b/dgl/Widget.hpp @@ -21,11 +21,15 @@ #include <vector> -START_NAMESPACE_DGL - // ----------------------------------------------------------------------- // Forward class names +START_NAMESPACE_DISTRHO +class UI; +END_NAMESPACE_DISTRHO + +START_NAMESPACE_DGL + class App; class ImageSlider; class NanoWidget; @@ -379,6 +383,7 @@ private: friend class NanoWidget; friend class Window; friend class StandaloneWindow; + friend class DISTRHO_NAMESPACE::UI; DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(Widget) }; diff --git a/dgl/src/ImageWidgets.cpp b/dgl/src/ImageWidgets.cpp @@ -93,12 +93,12 @@ ImageButton::ImageButton(Window& parent, const Image& image) noexcept fImageNormal(image), fImageHover(image), fImageDown(image), - fCurImage(fImageNormal), fCurButton(-1), + fCurState(0), fCallback(nullptr), leakDetector_ImageButton() { - setSize(fCurImage.getSize()); + setSize(image.getSize()); } ImageButton::ImageButton(Window& parent, const Image& imageNormal, const Image& imageDown) noexcept @@ -106,14 +106,14 @@ ImageButton::ImageButton(Window& parent, const Image& imageNormal, const Image& fImageNormal(imageNormal), fImageHover(imageNormal), fImageDown(imageDown), - fCurImage(fImageNormal), fCurButton(-1), + fCurState(0), fCallback(nullptr), leakDetector_ImageButton() { - DISTRHO_SAFE_ASSERT(fImageNormal.getSize() == fImageDown.getSize()); + DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageDown.getSize()); - setSize(fCurImage.getSize()); + setSize(imageNormal.getSize()); } ImageButton::ImageButton(Window& parent, const Image& imageNormal, const Image& imageHover, const Image& imageDown) noexcept @@ -121,14 +121,14 @@ ImageButton::ImageButton(Window& parent, const Image& imageNormal, const Image& fImageNormal(imageNormal), fImageHover(imageHover), fImageDown(imageDown), - fCurImage(fImageNormal), fCurButton(-1), + fCurState(0), fCallback(nullptr), leakDetector_ImageButton() { - DISTRHO_SAFE_ASSERT(fImageNormal.getSize() == fImageHover.getSize() && fImageHover.getSize() == fImageDown.getSize()); + DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageHover.getSize() && imageHover.getSize() == imageDown.getSize()); - setSize(fCurImage.getSize()); + setSize(imageNormal.getSize()); } ImageButton::ImageButton(Widget* widget, const Image& image) noexcept @@ -136,12 +136,12 @@ ImageButton::ImageButton(Widget* widget, const Image& image) noexcept fImageNormal(image), fImageHover(image), fImageDown(image), - fCurImage(fImageNormal), fCurButton(-1), + fCurState(0), fCallback(nullptr), leakDetector_ImageButton() { - setSize(fCurImage.getSize()); + setSize(image.getSize()); } ImageButton::ImageButton(Widget* widget, const Image& imageNormal, const Image& imageDown) noexcept @@ -149,14 +149,14 @@ ImageButton::ImageButton(Widget* widget, const Image& imageNormal, const Image& fImageNormal(imageNormal), fImageHover(imageNormal), fImageDown(imageDown), - fCurImage(fImageNormal), fCurButton(-1), + fCurState(0), fCallback(nullptr), leakDetector_ImageButton() { - DISTRHO_SAFE_ASSERT(fImageNormal.getSize() == fImageDown.getSize()); + DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageDown.getSize()); - setSize(fCurImage.getSize()); + setSize(imageNormal.getSize()); } ImageButton::ImageButton(Widget* widget, const Image& imageNormal, const Image& imageHover, const Image& imageDown) noexcept @@ -164,14 +164,14 @@ ImageButton::ImageButton(Widget* widget, const Image& imageNormal, const Image& fImageNormal(imageNormal), fImageHover(imageHover), fImageDown(imageDown), - fCurImage(fImageNormal), fCurButton(-1), + fCurState(0), fCallback(nullptr), leakDetector_ImageButton() { - DISTRHO_SAFE_ASSERT(fImageNormal.getSize() == fImageHover.getSize() && fImageHover.getSize() == fImageDown.getSize()); + DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageHover.getSize() && imageHover.getSize() == imageDown.getSize()); - setSize(fCurImage.getSize()); + setSize(imageNormal.getSize()); } void ImageButton::setCallback(Callback* callback) noexcept @@ -181,50 +181,54 @@ void ImageButton::setCallback(Callback* callback) noexcept void ImageButton::onDisplay() { - fCurImage.draw(); + switch (fCurState) + { + case 2: + fImageDown.draw(); + break; + case 1: + fImageHover.draw(); + break; + default: + fImageNormal.draw(); + break; + } } bool ImageButton::onMouse(const MouseEvent& ev) { + // button was released, handle it now if (fCurButton != -1 && ! ev.press) { - if (&fCurImage != &fImageNormal) - { - fCurImage = fImageNormal; - repaint(); - } + DISTRHO_SAFE_ASSERT(fCurState == 2); + // release button + fCurButton = -1; + + // cursor was moved outside the button bounds, ignore click if (! contains(ev.pos)) { - fCurButton = -1; - return false; + fCurState = 0; + repaint(); + return true; } + // still on bounds, register click + fCurState = 1; + repaint(); + if (fCallback != nullptr) fCallback->imageButtonClicked(this, fCurButton); -#if 0 - if (contains(ev.pos)) - { - fCurImage = &fImageHover; - repaint(); - } -#endif - - fCurButton = -1; - return true; } + // button was pressed, wait for release if (ev.press && contains(ev.pos)) { - if (&fCurImage != &fImageDown) - { - fCurImage = fImageDown; - repaint(); - } - fCurButton = ev.button; + fCurState = 2; + repaint(); return true; } @@ -233,29 +237,32 @@ bool ImageButton::onMouse(const MouseEvent& ev) bool ImageButton::onMotion(const MotionEvent& ev) { + // keep pressed if (fCurButton != -1) return true; if (contains(ev.pos)) { - if (&fCurImage != &fImageHover) + // check if entering hover + if (fCurState == 0) { - fCurImage = fImageHover; + fCurState = 1; repaint(); + return true; } - - return true; } else { - if (&fCurImage != &fImageNormal) + // check if exiting hover + if (fCurState == 1) { - fCurImage = fImageNormal; + fCurState = 0; repaint(); + return true; } - - return false; } + + return false; } // ----------------------------------------------------------------------- diff --git a/dgl/src/Window.cpp b/dgl/src/Window.cpp @@ -355,8 +355,24 @@ struct Window::PrivateData { fModal.enabled = false; if (fModal.parent != nullptr) + { fModal.parent->fModal.childFocus = nullptr; + // the mouse position probably changed since the modal appeared, + // so send a mouse motion event to the modal's parent window +#if defined(DISTRHO_OS_WINDOWS) + // TODO +#elif defined(DISTRHO_OS_MAC) + // TODO +#elif defined(DISTRHO_OS_LINUX) + int i, wx, wy; + uint u; + ::Window w; + if (XQueryPointer(fModal.parent->xDisplay, fModal.parent->xWindow, &w, &w, &i, &i, &wx, &wy, &u) == True) + fModal.parent->onPuglMotion(wx, wy); +#endif + } + DBG("Ok\n"); }