Browse Source

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

pull/6/head
falkTX 10 years ago
parent
commit
655aabc0e1
4 changed files with 79 additions and 51 deletions
  1. +1
    -1
      dgl/ImageWidgets.hpp
  2. +7
    -2
      dgl/Widget.hpp
  3. +55
    -48
      dgl/src/ImageWidgets.cpp
  4. +16
    -0
      dgl/src/Window.cpp

+ 1
- 1
dgl/ImageWidgets.hpp View File

@@ -77,8 +77,8 @@ private:
Image fImageNormal; Image fImageNormal;
Image fImageHover; Image fImageHover;
Image fImageDown; Image fImageDown;
Image& fCurImage;
int fCurButton; int fCurButton;
int fCurState;


Callback* fCallback; Callback* fCallback;




+ 7
- 2
dgl/Widget.hpp View File

@@ -21,11 +21,15 @@


#include <vector> #include <vector>


START_NAMESPACE_DGL

// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// Forward class names // Forward class names


START_NAMESPACE_DISTRHO
class UI;
END_NAMESPACE_DISTRHO

START_NAMESPACE_DGL

class App; class App;
class ImageSlider; class ImageSlider;
class NanoWidget; class NanoWidget;
@@ -379,6 +383,7 @@ private:
friend class NanoWidget; friend class NanoWidget;
friend class Window; friend class Window;
friend class StandaloneWindow; friend class StandaloneWindow;
friend class DISTRHO_NAMESPACE::UI;


DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(Widget) DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(Widget)
}; };


+ 55
- 48
dgl/src/ImageWidgets.cpp View File

@@ -93,12 +93,12 @@ ImageButton::ImageButton(Window& parent, const Image& image) noexcept
fImageNormal(image), fImageNormal(image),
fImageHover(image), fImageHover(image),
fImageDown(image), fImageDown(image),
fCurImage(fImageNormal),
fCurButton(-1), fCurButton(-1),
fCurState(0),
fCallback(nullptr), fCallback(nullptr),
leakDetector_ImageButton() leakDetector_ImageButton()
{ {
setSize(fCurImage.getSize());
setSize(image.getSize());
} }


ImageButton::ImageButton(Window& parent, const Image& imageNormal, const Image& imageDown) noexcept 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), fImageNormal(imageNormal),
fImageHover(imageNormal), fImageHover(imageNormal),
fImageDown(imageDown), fImageDown(imageDown),
fCurImage(fImageNormal),
fCurButton(-1), fCurButton(-1),
fCurState(0),
fCallback(nullptr), fCallback(nullptr),
leakDetector_ImageButton() 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 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), fImageNormal(imageNormal),
fImageHover(imageHover), fImageHover(imageHover),
fImageDown(imageDown), fImageDown(imageDown),
fCurImage(fImageNormal),
fCurButton(-1), fCurButton(-1),
fCurState(0),
fCallback(nullptr), fCallback(nullptr),
leakDetector_ImageButton() 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 ImageButton::ImageButton(Widget* widget, const Image& image) noexcept
@@ -136,12 +136,12 @@ ImageButton::ImageButton(Widget* widget, const Image& image) noexcept
fImageNormal(image), fImageNormal(image),
fImageHover(image), fImageHover(image),
fImageDown(image), fImageDown(image),
fCurImage(fImageNormal),
fCurButton(-1), fCurButton(-1),
fCurState(0),
fCallback(nullptr), fCallback(nullptr),
leakDetector_ImageButton() leakDetector_ImageButton()
{ {
setSize(fCurImage.getSize());
setSize(image.getSize());
} }


ImageButton::ImageButton(Widget* widget, const Image& imageNormal, const Image& imageDown) noexcept 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), fImageNormal(imageNormal),
fImageHover(imageNormal), fImageHover(imageNormal),
fImageDown(imageDown), fImageDown(imageDown),
fCurImage(fImageNormal),
fCurButton(-1), fCurButton(-1),
fCurState(0),
fCallback(nullptr), fCallback(nullptr),
leakDetector_ImageButton() 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 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), fImageNormal(imageNormal),
fImageHover(imageHover), fImageHover(imageHover),
fImageDown(imageDown), fImageDown(imageDown),
fCurImage(fImageNormal),
fCurButton(-1), fCurButton(-1),
fCurState(0),
fCallback(nullptr), fCallback(nullptr),
leakDetector_ImageButton() 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 void ImageButton::setCallback(Callback* callback) noexcept
@@ -181,50 +181,54 @@ void ImageButton::setCallback(Callback* callback) noexcept


void ImageButton::onDisplay() 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) bool ImageButton::onMouse(const MouseEvent& ev)
{ {
// button was released, handle it now
if (fCurButton != -1 && ! ev.press) 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)) if (! contains(ev.pos))
{ {
fCurButton = -1;
return false;
fCurState = 0;
repaint();
return true;
} }


// still on bounds, register click
fCurState = 1;
repaint();

if (fCallback != nullptr) if (fCallback != nullptr)
fCallback->imageButtonClicked(this, fCurButton); fCallback->imageButtonClicked(this, fCurButton);


#if 0
if (contains(ev.pos))
{
fCurImage = &fImageHover;
repaint();
}
#endif

fCurButton = -1;

return true; return true;
} }


// button was pressed, wait for release
if (ev.press && contains(ev.pos)) if (ev.press && contains(ev.pos))
{ {
if (&fCurImage != &fImageDown)
{
fCurImage = fImageDown;
repaint();
}

fCurButton = ev.button; fCurButton = ev.button;
fCurState = 2;
repaint();
return true; return true;
} }


@@ -233,29 +237,32 @@ bool ImageButton::onMouse(const MouseEvent& ev)


bool ImageButton::onMotion(const MotionEvent& ev) bool ImageButton::onMotion(const MotionEvent& ev)
{ {
// keep pressed
if (fCurButton != -1) if (fCurButton != -1)
return true; return true;


if (contains(ev.pos)) if (contains(ev.pos))
{ {
if (&fCurImage != &fImageHover)
// check if entering hover
if (fCurState == 0)
{ {
fCurImage = fImageHover;
fCurState = 1;
repaint(); repaint();
return true;
} }

return true;
} }
else else
{ {
if (&fCurImage != &fImageNormal)
// check if exiting hover
if (fCurState == 1)
{ {
fCurImage = fImageNormal;
fCurState = 0;
repaint(); repaint();
return true;
} }

return false;
} }

return false;
} }


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------


+ 16
- 0
dgl/src/Window.cpp View File

@@ -355,8 +355,24 @@ struct Window::PrivateData {
fModal.enabled = false; fModal.enabled = false;


if (fModal.parent != nullptr) if (fModal.parent != nullptr)
{
fModal.parent->fModal.childFocus = 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"); DBG("Ok\n");
} }




Loading…
Cancel
Save