Browse Source

Move common button code into a new file, cleanup

pull/6/head
falkTX 10 years ago
parent
commit
a02cdf7ace
5 changed files with 225 additions and 218 deletions
  1. +10
    -13
      dgl/ImageWidgets.hpp
  2. +5
    -8
      dgl/NanoWidgets.hpp
  3. +129
    -0
      dgl/src/Common.hpp
  4. +44
    -112
      dgl/src/ImageWidgets.cpp
  5. +37
    -85
      dgl/src/NanoWidgets.cpp

+ 10
- 13
dgl/ImageWidgets.hpp View File

@@ -58,13 +58,15 @@ public:
virtual void imageButtonClicked(ImageButton* imageButton, int button) = 0; virtual void imageButtonClicked(ImageButton* imageButton, int button) = 0;
}; };


explicit ImageButton(Window& parent, const Image& image) noexcept;
explicit ImageButton(Window& parent, const Image& imageNormal, const Image& imageDown) noexcept;
explicit ImageButton(Window& parent, const Image& imageNormal, const Image& imageHover, const Image& imageDown) noexcept;
explicit ImageButton(Window& parent, const Image& image);
explicit ImageButton(Window& parent, const Image& imageNormal, const Image& imageDown);
explicit ImageButton(Window& parent, const Image& imageNormal, const Image& imageHover, const Image& imageDown);


explicit ImageButton(Widget* widget, const Image& image) noexcept;
explicit ImageButton(Widget* widget, const Image& imageNormal, const Image& imageDown) noexcept;
explicit ImageButton(Widget* widget, const Image& imageNormal, const Image& imageHover, const Image& imageDown) noexcept;
explicit ImageButton(Widget* widget, const Image& image);
explicit ImageButton(Widget* widget, const Image& imageNormal, const Image& imageDown);
explicit ImageButton(Widget* widget, const Image& imageNormal, const Image& imageHover, const Image& imageDown);

~ImageButton() override;


void setCallback(Callback* callback) noexcept; void setCallback(Callback* callback) noexcept;


@@ -74,13 +76,8 @@ protected:
bool onMotion(const MotionEvent&) override; bool onMotion(const MotionEvent&) override;


private: private:
Image fImageNormal;
Image fImageHover;
Image fImageDown;
int fCurButton;
int fCurState;

Callback* fCallback;
struct PrivateData;
PrivateData* const pData;


DISTRHO_LEAK_DETECTOR(ImageButton) DISTRHO_LEAK_DETECTOR(ImageButton)
}; };


+ 5
- 8
dgl/NanoWidgets.hpp View File

@@ -34,8 +34,9 @@ public:
virtual void blendishButtonClicked(BlendishButton* blendishButton, int button) = 0; virtual void blendishButtonClicked(BlendishButton* blendishButton, int button) = 0;
}; };


explicit BlendishButton(Window& parent, const char* text = "", int iconId = -1) noexcept;
explicit BlendishButton(NanoWidget* widget, const char* text = "", int iconId = -1) noexcept;
explicit BlendishButton(Window& parent, const char* text = "", int iconId = -1);
explicit BlendishButton(NanoWidget* widget, const char* text = "", int iconId = -1);
~BlendishButton() override;


int getIconId() const noexcept; int getIconId() const noexcept;
void setIconId(int iconId) noexcept; void setIconId(int iconId) noexcept;
@@ -51,12 +52,8 @@ protected:
bool onMotion(const MotionEvent&) override; bool onMotion(const MotionEvent&) override;


private: private:
int fCurButton;
int fCurState;
int fIconId;
DISTRHO_NAMESPACE::String fText;

Callback* fCallback;
struct PrivateData;
PrivateData* const pData;


void _updateBounds(); void _updateBounds();




+ 129
- 0
dgl/src/Common.hpp View File

@@ -0,0 +1,129 @@
/*
* DISTRHO Plugin Framework (DPF)
* Copyright (C) 2012-2015 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
* permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
* TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/

#ifndef DGL_COMMON_HPP_INCLUDED
#define DGL_COMMON_HPP_INCLUDED

#include "../ImageWidgets.hpp"
#include "../NanoWidgets.hpp"

START_NAMESPACE_DGL

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

struct ButtonImpl {
enum State {
kStateNormal = 0,
kStateHover,
kStateDown
};

int button;
int state;
Widget* self;

BlendishButton::Callback* callback_b;
ImageButton::Callback* callback_i;

ButtonImpl(Widget* const s) noexcept
: button(-1),
state(kStateNormal),
self(s),
callback_b(nullptr),
callback_i(nullptr) {}

bool onMouse(const Widget::MouseEvent& ev)
{
// button was released, handle it now
if (button != -1 && ! ev.press)
{
DISTRHO_SAFE_ASSERT(state == kStateDown);

// release button
const int button2 = button;
button = -1;

// cursor was moved outside the button bounds, ignore click
if (! self->contains(ev.pos))
{
state = kStateNormal;
self->repaint();
return true;
}

// still on bounds, register click
state = kStateHover;
self->repaint();

if (callback_b != nullptr)
callback_b->blendishButtonClicked((BlendishButton*)self, button2);
if (callback_i != nullptr)
callback_i->imageButtonClicked((ImageButton*)self, button2);

return true;
}

// button was pressed, wait for release
if (ev.press && self->contains(ev.pos))
{
button = ev.button;
state = kStateDown;
self->repaint();
return true;
}

return false;
}

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

if (self->contains(ev.pos))
{
// check if entering hover
if (state == kStateNormal)
{
state = kStateHover;
self->repaint();
return true;
}
}
else
{
// check if exiting hover
if (state == kStateHover)
{
state = kStateNormal;
self->repaint();
return true;
}
}

return false;
}

DISTRHO_PREVENT_HEAP_ALLOCATION
DISTRHO_DECLARE_NON_COPY_STRUCT(ButtonImpl)
};

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

END_NAMESPACE_DGL

#endif // DGL_APP_PRIVATE_DATA_HPP_INCLUDED

+ 44
- 112
dgl/src/ImageWidgets.cpp View File

@@ -15,6 +15,7 @@
*/ */


#include "../ImageWidgets.hpp" #include "../ImageWidgets.hpp"
#include "Common.hpp"
#include "WidgetPrivateData.hpp" #include "WidgetPrivateData.hpp"


START_NAMESPACE_DGL START_NAMESPACE_DGL
@@ -87,27 +88,34 @@ void ImageAboutWindow::onReshape(uint width, uint height)


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


ImageButton::ImageButton(Window& parent, const Image& image) noexcept
struct ImageButton::PrivateData {
ButtonImpl impl;
Image imageNormal;
Image imageHover;
Image imageDown;

PrivateData(Widget* const s, const Image& normal, const Image& hover, const Image& down)
: impl(s),
imageNormal(normal),
imageHover(hover),
imageDown(down) {}

DISTRHO_DECLARE_NON_COPY_STRUCT(PrivateData)
};

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

ImageButton::ImageButton(Window& parent, const Image& image)
: Widget(parent), : Widget(parent),
fImageNormal(image),
fImageHover(image),
fImageDown(image),
fCurButton(-1),
fCurState(0),
fCallback(nullptr),
pData(new PrivateData(this, image, image, image)),
leakDetector_ImageButton() leakDetector_ImageButton()
{ {
setSize(image.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)
: Widget(parent), : Widget(parent),
fImageNormal(imageNormal),
fImageHover(imageNormal),
fImageDown(imageDown),
fCurButton(-1),
fCurState(0),
fCallback(nullptr),
pData(new PrivateData(this, imageNormal, imageNormal, imageDown)),
leakDetector_ImageButton() leakDetector_ImageButton()
{ {
DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageDown.getSize()); DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageDown.getSize());
@@ -115,14 +123,9 @@ ImageButton::ImageButton(Window& parent, const Image& imageNormal, const Image&
setSize(imageNormal.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)
: Widget(parent), : Widget(parent),
fImageNormal(imageNormal),
fImageHover(imageHover),
fImageDown(imageDown),
fCurButton(-1),
fCurState(0),
fCallback(nullptr),
pData(new PrivateData(this, imageNormal, imageHover, imageDown)),
leakDetector_ImageButton() leakDetector_ImageButton()
{ {
DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageHover.getSize() && imageHover.getSize() == imageDown.getSize()); DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageHover.getSize() && imageHover.getSize() == imageDown.getSize());
@@ -130,27 +133,17 @@ ImageButton::ImageButton(Window& parent, const Image& imageNormal, const Image&
setSize(imageNormal.getSize()); setSize(imageNormal.getSize());
} }


ImageButton::ImageButton(Widget* widget, const Image& image) noexcept
ImageButton::ImageButton(Widget* widget, const Image& image)
: Widget(widget->getParentWindow()), : Widget(widget->getParentWindow()),
fImageNormal(image),
fImageHover(image),
fImageDown(image),
fCurButton(-1),
fCurState(0),
fCallback(nullptr),
pData(new PrivateData(this, image, image, image)),
leakDetector_ImageButton() leakDetector_ImageButton()
{ {
setSize(image.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)
: Widget(widget->getParentWindow()), : Widget(widget->getParentWindow()),
fImageNormal(imageNormal),
fImageHover(imageNormal),
fImageDown(imageDown),
fCurButton(-1),
fCurState(0),
fCallback(nullptr),
pData(new PrivateData(this, imageNormal, imageNormal, imageDown)),
leakDetector_ImageButton() leakDetector_ImageButton()
{ {
DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageDown.getSize()); DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageDown.getSize());
@@ -158,14 +151,9 @@ ImageButton::ImageButton(Widget* widget, const Image& imageNormal, const Image&
setSize(imageNormal.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)
: Widget(widget->getParentWindow()), : Widget(widget->getParentWindow()),
fImageNormal(imageNormal),
fImageHover(imageHover),
fImageDown(imageDown),
fCurButton(-1),
fCurState(0),
fCallback(nullptr),
pData(new PrivateData(this, imageNormal, imageHover, imageDown)),
leakDetector_ImageButton() leakDetector_ImageButton()
{ {
DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageHover.getSize() && imageHover.getSize() == imageDown.getSize()); DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageHover.getSize() && imageHover.getSize() == imageDown.getSize());
@@ -173,96 +161,40 @@ ImageButton::ImageButton(Widget* widget, const Image& imageNormal, const Image&
setSize(imageNormal.getSize()); setSize(imageNormal.getSize());
} }


ImageButton::~ImageButton()
{
delete pData;
}

void ImageButton::setCallback(Callback* callback) noexcept void ImageButton::setCallback(Callback* callback) noexcept
{ {
fCallback = callback;
pData->impl.callback_i = callback;
} }


void ImageButton::onDisplay() void ImageButton::onDisplay()
{ {
switch (fCurState)
switch (pData->impl.state)
{ {
case 2:
fImageDown.draw();
case ButtonImpl::kStateDown:
pData->imageDown.draw();
break; break;
case 1:
fImageHover.draw();
case ButtonImpl::kStateHover:
pData->imageHover.draw();
break; break;
default: default:
fImageNormal.draw();
pData->imageNormal.draw();
break; break;
} }
} }


bool ImageButton::onMouse(const MouseEvent& ev) bool ImageButton::onMouse(const MouseEvent& ev)
{ {
// button was released, handle it now
if (fCurButton != -1 && ! ev.press)
{
DISTRHO_SAFE_ASSERT(fCurState == 2);

// release button
const int button = fCurButton;
fCurButton = -1;

// cursor was moved outside the button bounds, ignore click
if (! contains(ev.pos))
{
fCurState = 0;
repaint();
return true;
}

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

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

return true;
}

// button was pressed, wait for release
if (ev.press && contains(ev.pos))
{
fCurButton = ev.button;
fCurState = 2;
repaint();
return true;
}

return false;
return pData->impl.onMouse(ev);
} }


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

if (contains(ev.pos))
{
// check if entering hover
if (fCurState == 0)
{
fCurState = 1;
repaint();
return true;
}
}
else
{
// check if exiting hover
if (fCurState == 1)
{
fCurState = 0;
repaint();
return true;
}
}

return false;
return pData->impl.onMotion(ev);
} }


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


+ 37
- 85
dgl/src/NanoWidgets.cpp View File

@@ -15,6 +15,7 @@
*/ */


#include "../NanoWidgets.hpp" #include "../NanoWidgets.hpp"
#include "Common.hpp"


#define BLENDISH_IMPLEMENTATION #define BLENDISH_IMPLEMENTATION
#include "nanovg/nanovg.h" #include "nanovg/nanovg.h"
@@ -38,149 +39,100 @@ static void registerBlendishResourcesIfNeeded(NVGcontext* const context)


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


BlendishButton::BlendishButton(Window& parent, const char* text, int iconId) noexcept
struct BlendishButton::PrivateData {
ButtonImpl impl;
int iconId;
DISTRHO_NAMESPACE::String text;

PrivateData(Widget* const s, const char* const t, const int i) noexcept
: impl(s),
iconId(i),
text(t) {}

DISTRHO_DECLARE_NON_COPY_STRUCT(PrivateData)
};

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

BlendishButton::BlendishButton(Window& parent, const char* text, int iconId)
: NanoWidget(parent), : NanoWidget(parent),
fCurButton(-1),
fCurState(0),
fIconId(iconId),
fText(text),
fCallback(nullptr),
pData(new PrivateData(this, text, iconId)),
leakDetector_BlendishButton() leakDetector_BlendishButton()
{ {
registerBlendishResourcesIfNeeded(getContext()); registerBlendishResourcesIfNeeded(getContext());
_updateBounds(); _updateBounds();
} }


BlendishButton::BlendishButton(NanoWidget* widget, const char* text, int iconId) noexcept
BlendishButton::BlendishButton(NanoWidget* widget, const char* text, int iconId)
: NanoWidget(widget), : NanoWidget(widget),
fCurButton(-1),
fCurState(0),
fIconId(iconId),
fText(text),
fCallback(nullptr),
pData(new PrivateData(this, text, iconId)),
leakDetector_BlendishButton() leakDetector_BlendishButton()
{ {
registerBlendishResourcesIfNeeded(getContext()); registerBlendishResourcesIfNeeded(getContext());
_updateBounds(); _updateBounds();
} }


BlendishButton::~BlendishButton()
{
delete pData;
}

int BlendishButton::getIconId() const noexcept int BlendishButton::getIconId() const noexcept
{ {
return fIconId;
return pData->iconId;
} }


void BlendishButton::setIconId(int iconId) noexcept void BlendishButton::setIconId(int iconId) noexcept
{ {
if (fIconId == iconId)
if (pData->iconId == iconId)
return; return;


fIconId = iconId;
pData->iconId = iconId;
_updateBounds(); _updateBounds();
repaint(); repaint();
} }


const char* BlendishButton::getText() const noexcept const char* BlendishButton::getText() const noexcept
{ {
return fText;
return pData->text;
} }


void BlendishButton::setText(const char* text) noexcept void BlendishButton::setText(const char* text) noexcept
{ {
if (fText == text)
if (pData->text == text)
return; return;


fText = text;
pData->text = text;
_updateBounds(); _updateBounds();
repaint(); repaint();
} }


void BlendishButton::setCallback(Callback* callback) noexcept void BlendishButton::setCallback(Callback* callback) noexcept
{ {
fCallback = callback;
pData->impl.callback_b = callback;
} }


void BlendishButton::onNanoDisplay() void BlendishButton::onNanoDisplay()
{ {
bndToolButton(getContext(), bndToolButton(getContext(),
getAbsoluteX(), getAbsoluteY(), getWidth(), getHeight(), getAbsoluteX(), getAbsoluteY(), getWidth(), getHeight(),
0, static_cast<BNDwidgetState>(fCurState), fIconId, fText);
0, static_cast<BNDwidgetState>(pData->impl.state), pData->iconId, pData->text);
} }


bool BlendishButton::onMouse(const MouseEvent& ev) bool BlendishButton::onMouse(const MouseEvent& ev)
{ {
// button was released, handle it now
if (fCurButton != -1 && ! ev.press)
{
DISTRHO_SAFE_ASSERT(fCurState == 2);

// release button
const int button = fCurButton;
fCurButton = -1;

// cursor was moved outside the button bounds, ignore click
if (! contains(ev.pos))
{
fCurState = 0;
repaint();
return true;
}

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

if (fCallback != nullptr)
fCallback->blendishButtonClicked(this, button);

return true;
}

// button was pressed, wait for release
if (ev.press && contains(ev.pos))
{
fCurButton = ev.button;
fCurState = 2;
repaint();
return true;
}

return false;
return pData->impl.onMouse(ev);
} }


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

if (contains(ev.pos))
{
// check if entering hover
if (fCurState == 0)
{
fCurState = 1;
repaint();
return true;
}
}
else
{
// check if exiting hover
if (fCurState == 1)
{
fCurState = 0;
repaint();
return true;
}
}

return false;
return pData->impl.onMotion(ev);
} }


void BlendishButton::_updateBounds() void BlendishButton::_updateBounds()
{ {
const float width = bndLabelWidth (getContext(), fIconId, fText);
const float height = bndLabelHeight(getContext(), fIconId, fText, width);
const float width = bndLabelWidth (getContext(), pData->iconId, pData->text);
const float height = bndLabelHeight(getContext(), pData->iconId, pData->text, width);


setSize(width, height); setSize(width, height);
} }


Loading…
Cancel
Save