Browse Source

Make ImageButton cairo compatible

pull/272/head
falkTX 4 years ago
parent
commit
1f711ed107
9 changed files with 141 additions and 121 deletions
  1. +1
    -0
      dgl/Cairo.hpp
  2. +34
    -0
      dgl/ImageBaseWidgets.hpp
  3. +0
    -32
      dgl/ImageWidgets.hpp
  4. +4
    -0
      dgl/OpenGL.hpp
  5. +2
    -0
      dgl/src/Cairo.cpp
  6. +6
    -5
      dgl/src/Common.hpp
  7. +92
    -0
      dgl/src/ImageBaseWidgets.cpp
  8. +1
    -84
      dgl/src/ImageWidgets.cpp
  9. +1
    -0
      dgl/src/OpenGL.cpp

+ 1
- 0
dgl/Cairo.hpp View File

@@ -170,6 +170,7 @@ typedef CairoBaseWidget<StandaloneWindow> CairoStandaloneWindow;
// --------------------------------------------------------------------------------------------------------------------

typedef ImageBaseAboutWindow<CairoImage> CairoImageAboutWindow;
typedef ImageBaseButton<CairoImage> CairoImageButton;

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



+ 34
- 0
dgl/ImageBaseWidgets.hpp View File

@@ -18,6 +18,7 @@
#define DGL_IMAGE_BASE_WIDGETS_HPP_INCLUDED

#include "StandaloneWindow.hpp"
#include "SubWidget.hpp"

START_NAMESPACE_DGL

@@ -48,6 +49,39 @@ private:

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

template <class ImageType>
class ImageBaseButton : public SubWidget
{
public:
class Callback
{
public:
virtual ~Callback() {}
virtual void imageButtonClicked(ImageBaseButton* imageButton, int button) = 0;
};

explicit ImageBaseButton(Widget* parentWidget, const ImageType& image);
explicit ImageBaseButton(Widget* parentWidget, const ImageType& imageNormal, const ImageType& imageDown);
explicit ImageBaseButton(Widget* parentWidget, const ImageType& imageNormal, const ImageType& imageHover, const ImageType& imageDown);

~ImageBaseButton() override;

void setCallback(Callback* callback) noexcept;

protected:
void onDisplay() override;
bool onMouse(const MouseEvent&) override;
bool onMotion(const MotionEvent&) override;

private:
struct PrivateData;
PrivateData* const pData;

DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ImageBaseButton)
};

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

END_NAMESPACE_DGL

#endif // DGL_IMAGE_BASE_WIDGETS_HPP_INCLUDED

+ 0
- 32
dgl/ImageWidgets.hpp View File

@@ -31,38 +31,6 @@ START_NAMESPACE_DGL

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

class ImageButton : public SubWidget
{
public:
class Callback
{
public:
virtual ~Callback() {}
virtual void imageButtonClicked(ImageButton* imageButton, int button) = 0;
};

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

~ImageButton() override;

void setCallback(Callback* callback) noexcept;

protected:
void onDisplay() override;
bool onMouse(const MouseEvent&) override;
bool onMotion(const MotionEvent&) override;

private:
struct PrivateData;
PrivateData* const pData;

DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ImageButton)
};

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

class ImageKnob : public SubWidget
{
public:


+ 4
- 0
dgl/OpenGL.hpp View File

@@ -281,10 +281,14 @@ private:
// -----------------------------------------------------------------------

typedef ImageBaseAboutWindow<OpenGLImage> OpenGLImageAboutWindow;
typedef ImageBaseButton<OpenGLImage> OpenGLImageButton;

DISTRHO_DEPRECATED_BY("OpenGLImageAboutWindow")
typedef OpenGLImageAboutWindow ImageAboutWindow;

DISTRHO_DEPRECATED_BY("OpenGLImageButton")
typedef OpenGLImageButton ImageButton;

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

END_NAMESPACE_DGL


+ 2
- 0
dgl/src/Cairo.cpp View File

@@ -16,6 +16,7 @@

#include "../Cairo.hpp"
#include "../Color.hpp"
#include "../ImageBaseWidgets.hpp"

#include "SubWidgetPrivateData.hpp"
#include "TopLevelWidgetPrivateData.hpp"
@@ -468,6 +469,7 @@ void ImageBaseAboutWindow<CairoImage>::onDisplay()
}

template class ImageBaseAboutWindow<CairoImage>;
template class ImageBaseButton<CairoImage>;

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



+ 6
- 5
dgl/src/Common.hpp View File

@@ -17,12 +17,13 @@
#ifndef DGL_COMMON_HPP_INCLUDED
#define DGL_COMMON_HPP_INCLUDED

#include "../ImageWidgets.hpp"
#include "../ImageBaseWidgets.hpp"

START_NAMESPACE_DGL

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

template <class ImageType>
struct ButtonImpl {
enum State {
kStateNormal = 0,
@@ -32,11 +33,11 @@ struct ButtonImpl {

int button;
int state;
SubWidget* self;
ImageBaseButton<ImageType>* const self;

ImageButton::Callback* callback_img;
typename ImageBaseButton<ImageType>::Callback* callback_img;

ButtonImpl(SubWidget* const s) noexcept
explicit ButtonImpl(ImageBaseButton<ImageType>* const s) noexcept
: button(-1),
state(kStateNormal),
self(s),
@@ -66,7 +67,7 @@ struct ButtonImpl {
self->repaint();

if (callback_img != nullptr)
callback_img->imageButtonClicked((ImageButton*)self, button2);
callback_img->imageButtonClicked(self, button2);

return true;
}


+ 92
- 0
dgl/src/ImageBaseWidgets.cpp View File

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

#include "../ImageBaseWidgets.hpp"
#include "Common.hpp"

START_NAMESPACE_DGL

@@ -88,4 +89,95 @@ void ImageBaseAboutWindow<ImageType>::onReshape(uint width, uint height)

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

template <class ImageType>
struct ImageBaseButton<ImageType>::PrivateData {
ButtonImpl<ImageType> impl;
ImageType imageNormal;
ImageType imageHover;
ImageType imageDown;

PrivateData(ImageBaseButton<ImageType>* const s, const ImageType& normal, const ImageType& hover, const ImageType& down)
: impl(s),
imageNormal(normal),
imageHover(hover),
imageDown(down) {}

DISTRHO_DECLARE_NON_COPY_STRUCT(PrivateData)
};

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

template <class ImageType>
ImageBaseButton<ImageType>::ImageBaseButton(Widget* const parentWidget, const ImageType& image)
: SubWidget(parentWidget),
pData(new PrivateData(this, image, image, image))
{
setSize(image.getSize());
}

template <class ImageType>
ImageBaseButton<ImageType>::ImageBaseButton(Widget* const parentWidget, const ImageType& imageNormal, const ImageType& imageDown)
: SubWidget(parentWidget),
pData(new PrivateData(this, imageNormal, imageNormal, imageDown))
{
DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageDown.getSize());

setSize(imageNormal.getSize());
}

template <class ImageType>
ImageBaseButton<ImageType>::ImageBaseButton(Widget* const parentWidget, const ImageType& imageNormal, const ImageType& imageHover, const ImageType& imageDown)
: SubWidget(parentWidget),
pData(new PrivateData(this, imageNormal, imageHover, imageDown))
{
DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageHover.getSize() && imageHover.getSize() == imageDown.getSize());

setSize(imageNormal.getSize());
}

template <class ImageType>
ImageBaseButton<ImageType>::~ImageBaseButton()
{
delete pData;
}

template <class ImageType>
void ImageBaseButton<ImageType>::setCallback(Callback* callback) noexcept
{
pData->impl.callback_img = callback;
}

template <class ImageType>
void ImageBaseButton<ImageType>::onDisplay()
{
const GraphicsContext& context(getGraphicsContext());

switch (pData->impl.state)
{
case ButtonImpl<ImageType>::kStateDown:
pData->imageDown.draw(context);
break;
case ButtonImpl<ImageType>::kStateHover:
pData->imageHover.draw(context);
break;
default:
pData->imageNormal.draw(context);
break;
}
}

template <class ImageType>
bool ImageBaseButton<ImageType>::onMouse(const MouseEvent& ev)
{
return pData->impl.onMouse(ev);
}

template <class ImageType>
bool ImageBaseButton<ImageType>::onMotion(const MotionEvent& ev)
{
return pData->impl.onMotion(ev);
}

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

END_NAMESPACE_DGL

+ 1
- 84
dgl/src/ImageWidgets.cpp View File

@@ -14,10 +14,7 @@
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/

#include "../Image.hpp"
#include "../ImageBaseWidgets.hpp"

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

// TODO make this code more generic and move GL specific bits to OpenGL.cpp
@@ -33,86 +30,6 @@ START_NAMESPACE_DGL

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

struct ImageButton::PrivateData {
ButtonImpl impl;
Image imageNormal;
Image imageHover;
Image imageDown;

PrivateData(SubWidget* 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(Widget* const parentWidget, const Image& image)
: SubWidget(parentWidget),
pData(new PrivateData(this, image, image, image))
{
setSize(image.getSize());
}

ImageButton::ImageButton(Widget* const parentWidget, const Image& imageNormal, const Image& imageDown)
: SubWidget(parentWidget),
pData(new PrivateData(this, imageNormal, imageNormal, imageDown))
{
DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageDown.getSize());

setSize(imageNormal.getSize());
}

ImageButton::ImageButton(Widget* const parentWidget, const Image& imageNormal, const Image& imageHover, const Image& imageDown)
: SubWidget(parentWidget),
pData(new PrivateData(this, imageNormal, imageHover, imageDown))
{
DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageHover.getSize() && imageHover.getSize() == imageDown.getSize());

setSize(imageNormal.getSize());
}

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

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

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

bool ImageButton::onMouse(const MouseEvent& ev)
{
return pData->impl.onMouse(ev);
}

bool ImageButton::onMotion(const MotionEvent& ev)
{
return pData->impl.onMotion(ev);
}

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

ImageKnob::ImageKnob(Widget* const parentWidget, const Image& image, Orientation orientation) noexcept
: SubWidget(parentWidget),
fImage(image),


+ 1
- 0
dgl/src/OpenGL.cpp View File

@@ -444,6 +444,7 @@ void ImageBaseAboutWindow<OpenGLImage>::onDisplay()
}

template class ImageBaseAboutWindow<OpenGLImage>;
template class ImageBaseButton<OpenGLImage>;

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



Loading…
Cancel
Save