@@ -170,6 +170,7 @@ typedef CairoBaseWidget<StandaloneWindow> CairoStandaloneWindow; | |||||
// -------------------------------------------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------------------------------------------- | ||||
typedef ImageBaseAboutWindow<CairoImage> CairoImageAboutWindow; | typedef ImageBaseAboutWindow<CairoImage> CairoImageAboutWindow; | ||||
typedef ImageBaseButton<CairoImage> CairoImageButton; | |||||
// -------------------------------------------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------------------------------------------- | ||||
@@ -18,6 +18,7 @@ | |||||
#define DGL_IMAGE_BASE_WIDGETS_HPP_INCLUDED | #define DGL_IMAGE_BASE_WIDGETS_HPP_INCLUDED | ||||
#include "StandaloneWindow.hpp" | #include "StandaloneWindow.hpp" | ||||
#include "SubWidget.hpp" | |||||
START_NAMESPACE_DGL | 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 | END_NAMESPACE_DGL | ||||
#endif // DGL_IMAGE_BASE_WIDGETS_HPP_INCLUDED | #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 | class ImageKnob : public SubWidget | ||||
{ | { | ||||
public: | public: | ||||
@@ -281,10 +281,14 @@ private: | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
typedef ImageBaseAboutWindow<OpenGLImage> OpenGLImageAboutWindow; | typedef ImageBaseAboutWindow<OpenGLImage> OpenGLImageAboutWindow; | ||||
typedef ImageBaseButton<OpenGLImage> OpenGLImageButton; | |||||
DISTRHO_DEPRECATED_BY("OpenGLImageAboutWindow") | DISTRHO_DEPRECATED_BY("OpenGLImageAboutWindow") | ||||
typedef OpenGLImageAboutWindow ImageAboutWindow; | typedef OpenGLImageAboutWindow ImageAboutWindow; | ||||
DISTRHO_DEPRECATED_BY("OpenGLImageButton") | |||||
typedef OpenGLImageButton ImageButton; | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
END_NAMESPACE_DGL | END_NAMESPACE_DGL | ||||
@@ -16,6 +16,7 @@ | |||||
#include "../Cairo.hpp" | #include "../Cairo.hpp" | ||||
#include "../Color.hpp" | #include "../Color.hpp" | ||||
#include "../ImageBaseWidgets.hpp" | |||||
#include "SubWidgetPrivateData.hpp" | #include "SubWidgetPrivateData.hpp" | ||||
#include "TopLevelWidgetPrivateData.hpp" | #include "TopLevelWidgetPrivateData.hpp" | ||||
@@ -468,6 +469,7 @@ void ImageBaseAboutWindow<CairoImage>::onDisplay() | |||||
} | } | ||||
template class ImageBaseAboutWindow<CairoImage>; | template class ImageBaseAboutWindow<CairoImage>; | ||||
template class ImageBaseButton<CairoImage>; | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
@@ -17,12 +17,13 @@ | |||||
#ifndef DGL_COMMON_HPP_INCLUDED | #ifndef DGL_COMMON_HPP_INCLUDED | ||||
#define DGL_COMMON_HPP_INCLUDED | #define DGL_COMMON_HPP_INCLUDED | ||||
#include "../ImageWidgets.hpp" | |||||
#include "../ImageBaseWidgets.hpp" | |||||
START_NAMESPACE_DGL | START_NAMESPACE_DGL | ||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
template <class ImageType> | |||||
struct ButtonImpl { | struct ButtonImpl { | ||||
enum State { | enum State { | ||||
kStateNormal = 0, | kStateNormal = 0, | ||||
@@ -32,11 +33,11 @@ struct ButtonImpl { | |||||
int button; | int button; | ||||
int state; | 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), | : button(-1), | ||||
state(kStateNormal), | state(kStateNormal), | ||||
self(s), | self(s), | ||||
@@ -66,7 +67,7 @@ struct ButtonImpl { | |||||
self->repaint(); | self->repaint(); | ||||
if (callback_img != nullptr) | if (callback_img != nullptr) | ||||
callback_img->imageButtonClicked((ImageButton*)self, button2); | |||||
callback_img->imageButtonClicked(self, button2); | |||||
return true; | return true; | ||||
} | } | ||||
@@ -15,6 +15,7 @@ | |||||
*/ | */ | ||||
#include "../ImageBaseWidgets.hpp" | #include "../ImageBaseWidgets.hpp" | ||||
#include "Common.hpp" | |||||
START_NAMESPACE_DGL | 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 | END_NAMESPACE_DGL |
@@ -14,10 +14,7 @@ | |||||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
*/ | */ | ||||
#include "../Image.hpp" | |||||
#include "../ImageBaseWidgets.hpp" | |||||
#include "Common.hpp" | |||||
#include "../ImageWidgets.hpp" | |||||
#include "WidgetPrivateData.hpp" | #include "WidgetPrivateData.hpp" | ||||
// TODO make this code more generic and move GL specific bits to OpenGL.cpp | // 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 | ImageKnob::ImageKnob(Widget* const parentWidget, const Image& image, Orientation orientation) noexcept | ||||
: SubWidget(parentWidget), | : SubWidget(parentWidget), | ||||
fImage(image), | fImage(image), | ||||
@@ -444,6 +444,7 @@ void ImageBaseAboutWindow<OpenGLImage>::onDisplay() | |||||
} | } | ||||
template class ImageBaseAboutWindow<OpenGLImage>; | template class ImageBaseAboutWindow<OpenGLImage>; | ||||
template class ImageBaseButton<OpenGLImage>; | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||