Browse Source

Generic ImageBaseSwitch

pull/272/head
falkTX 4 years ago
parent
commit
f0c52659b9
2 changed files with 83 additions and 50 deletions
  1. +1
    -7
      dgl/ImageBaseWidgets.hpp
  2. +82
    -43
      dgl/src/ImageBaseWidgets.cpp

+ 1
- 7
dgl/ImageBaseWidgets.hpp View File

@@ -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)
};



+ 82
- 43
dgl/src/ImageBaseWidgets.cpp View File

@@ -947,89 +947,128 @@ void ImageSlider::_recheckArea() noexcept

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

#if 0
ImageSwitch::ImageSwitch(Widget* parentWidget, const Image& imageNormal, const Image& imageDown) noexcept
template <class ImageType>
struct ImageBaseSwitch<ImageType>::PrivateData {
ImageBaseSwitch<ImageType>* const self;
ImageType imageNormal;
ImageType imageDown;
bool isDown;
Callback* callback;

PrivateData(ImageBaseSwitch<ImageType>* 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<ImageType>* 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 <class ImageType>
ImageBaseSwitch<ImageType>::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 <class ImageType>
ImageBaseSwitch<ImageType>::ImageBaseSwitch(const ImageBaseSwitch<ImageType>& 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 <class ImageType>
ImageBaseSwitch<ImageType>& ImageBaseSwitch<ImageType>::operator=(const ImageBaseSwitch<ImageType>& 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 <class ImageType>
ImageBaseSwitch<ImageType>::~ImageBaseSwitch()
{
return fIsDown;
delete pData;
}

void ImageSwitch::setDown(bool down) noexcept
template <class ImageType>
bool ImageBaseSwitch<ImageType>::isDown() const noexcept
{
if (fIsDown == down)
return pData->isDown;
}

template <class ImageType>
void ImageBaseSwitch<ImageType>::setDown(const bool down) noexcept
{
if (pData->isDown == down)
return;

fIsDown = down;
pData->isDown = down;
repaint();
}

void ImageSwitch::setCallback(Callback* callback) noexcept
template <class ImageType>
void ImageBaseSwitch<ImageType>::setCallback(Callback* const callback) noexcept
{
fCallback = callback;
pData->callback = callback;
}

void ImageSwitch::onDisplay()
template <class ImageType>
void ImageBaseSwitch<ImageType>::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 <class ImageType>
bool ImageBaseSwitch<ImageType>::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

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



Loading…
Cancel
Save