@@ -170,6 +170,7 @@ typedef CairoBaseWidget<StandaloneWindow> CairoStandaloneWindow; | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
typedef ImageBaseAboutWindow<CairoImage> CairoImageAboutWindow; | |||
typedef ImageBaseButton<CairoImage> CairoImageButton; | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
@@ -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 |
@@ -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: | |||
@@ -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 | |||
@@ -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>; | |||
// ----------------------------------------------------------------------- | |||
@@ -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; | |||
} | |||
@@ -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 |
@@ -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), | |||
@@ -444,6 +444,7 @@ void ImageBaseAboutWindow<OpenGLImage>::onDisplay() | |||
} | |||
template class ImageBaseAboutWindow<OpenGLImage>; | |||
template class ImageBaseButton<OpenGLImage>; | |||
// ----------------------------------------------------------------------- | |||