diff --git a/dgl/ImageBaseWidgets.hpp b/dgl/ImageBaseWidgets.hpp index 33a72639..7cb25a90 100644 --- a/dgl/ImageBaseWidgets.hpp +++ b/dgl/ImageBaseWidgets.hpp @@ -255,6 +255,7 @@ public: explicit ImageBaseSwitch(Widget* parentWidget, const ImageType& imageNormal, const ImageType& imageDown) noexcept; explicit ImageBaseSwitch(const ImageBaseSwitch& imageSwitch) noexcept; ImageBaseSwitch& operator=(const ImageBaseSwitch& imageSwitch) noexcept; + ~ImageBaseSwitch() override; bool isDown() const noexcept; void setDown(bool down) noexcept; @@ -269,13 +270,6 @@ private: struct PrivateData; PrivateData* const pData; - /* - Image fImageNormal; - Image fImageDown; - bool fIsDown; - Callback* fCallback; - */ - DISTRHO_LEAK_DETECTOR(ImageBaseSwitch) }; diff --git a/dgl/src/ImageBaseWidgets.cpp b/dgl/src/ImageBaseWidgets.cpp index b9e46896..f9652d4b 100644 --- a/dgl/src/ImageBaseWidgets.cpp +++ b/dgl/src/ImageBaseWidgets.cpp @@ -947,89 +947,128 @@ void ImageSlider::_recheckArea() noexcept // -------------------------------------------------------------------------------------------------------------------- -#if 0 -ImageSwitch::ImageSwitch(Widget* parentWidget, const Image& imageNormal, const Image& imageDown) noexcept +template +struct ImageBaseSwitch::PrivateData { + ImageBaseSwitch* const self; + ImageType imageNormal; + ImageType imageDown; + bool isDown; + Callback* callback; + + PrivateData(ImageBaseSwitch* const s, const ImageType& normal, const ImageType& down) + : self(s), + imageNormal(normal), + imageDown(down), + isDown(false), + callback(nullptr) + { + DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageDown.getSize()); + } + + PrivateData(ImageBaseSwitch* const s, PrivateData* const other) + : self(s), + imageNormal(other->imageNormal), + imageDown(other->imageDown), + isDown(other->isDown), + callback(other->callback) + { + DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageDown.getSize()); + } + + void assignFrom(PrivateData* const other) + { + imageNormal = other->imageNormal; + imageDown = other->imageDown; + isDown = other->isDown; + callback = other->callback; + DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageDown.getSize()); + } + + DISTRHO_DECLARE_NON_COPY_STRUCT(PrivateData) +}; + +// -------------------------------------------------------------------------------------------------------------------- + +template +ImageBaseSwitch::ImageBaseSwitch(Widget* const parentWidget, const ImageType& imageNormal, const ImageType& imageDown) noexcept : SubWidget(parentWidget), - fImageNormal(imageNormal), - fImageDown(imageDown), - fIsDown(false), - fCallback(nullptr) + pData(new PrivateData(this, imageNormal, imageDown)) { - DISTRHO_SAFE_ASSERT(fImageNormal.getSize() == fImageDown.getSize()); - - setSize(fImageNormal.getSize()); + setSize(imageNormal.getSize()); } -ImageSwitch::ImageSwitch(const ImageSwitch& imageSwitch) noexcept +template +ImageBaseSwitch::ImageBaseSwitch(const ImageBaseSwitch& imageSwitch) noexcept : SubWidget(imageSwitch.getParentWidget()), - fImageNormal(imageSwitch.fImageNormal), - fImageDown(imageSwitch.fImageDown), - fIsDown(imageSwitch.fIsDown), - fCallback(imageSwitch.fCallback) + pData(new PrivateData(this, imageSwitch.pData)) { - DISTRHO_SAFE_ASSERT(fImageNormal.getSize() == fImageDown.getSize()); - - setSize(fImageNormal.getSize()); + setSize(pData->imageNormal.getSize()); } -ImageSwitch& ImageSwitch::operator=(const ImageSwitch& imageSwitch) noexcept +template +ImageBaseSwitch& ImageBaseSwitch::operator=(const ImageBaseSwitch& imageSwitch) noexcept { - fImageNormal = imageSwitch.fImageNormal; - fImageDown = imageSwitch.fImageDown; - fIsDown = imageSwitch.fIsDown; - fCallback = imageSwitch.fCallback; - - DISTRHO_SAFE_ASSERT(fImageNormal.getSize() == fImageDown.getSize()); - - setSize(fImageNormal.getSize()); - + pData->assignFrom(imageSwitch.pData); + setSize(pData->imageNormal.getSize()); return *this; } -bool ImageSwitch::isDown() const noexcept +template +ImageBaseSwitch::~ImageBaseSwitch() { - return fIsDown; + delete pData; } -void ImageSwitch::setDown(bool down) noexcept +template +bool ImageBaseSwitch::isDown() const noexcept { - if (fIsDown == down) + return pData->isDown; +} + +template +void ImageBaseSwitch::setDown(const bool down) noexcept +{ + if (pData->isDown == down) return; - fIsDown = down; + pData->isDown = down; repaint(); } -void ImageSwitch::setCallback(Callback* callback) noexcept +template +void ImageBaseSwitch::setCallback(Callback* const callback) noexcept { - fCallback = callback; + pData->callback = callback; } -void ImageSwitch::onDisplay() +template +void ImageBaseSwitch::onDisplay() { - if (fIsDown) - fImageDown.draw(); + const GraphicsContext& context(getGraphicsContext()); + + if (pData->isDown) + pData->imageDown.draw(context); else - fImageNormal.draw(); + pData->imageNormal.draw(context); } -bool ImageSwitch::onMouse(const MouseEvent& ev) +template +bool ImageBaseSwitch::onMouse(const MouseEvent& ev) { if (ev.press && contains(ev.pos)) { - fIsDown = !fIsDown; + pData->isDown = !pData->isDown; repaint(); - if (fCallback != nullptr) - fCallback->imageSwitchClicked(this, fIsDown); + if (pData->callback != nullptr) + pData->callback->imageSwitchClicked(this, pData->isDown); return true; } return false; } -#endif // --------------------------------------------------------------------------------------------------------------------