17#include "../ImageBaseWidgets.hpp"
18#include "../Color.hpp"
24template <
class ImageType>
25ImageBaseAboutWindow<ImageType>::ImageBaseAboutWindow(Window& transientParentWindow,
const ImageType& image)
26 : StandaloneWindow(transientParentWindow.getApp(), transientParentWindow),
34 setSize(
image.getSize());
35 setGeometryConstraints(
image.getWidth(),
image.getHeight(),
true,
true);
41template <
class ImageType>
42ImageBaseAboutWindow<ImageType>::ImageBaseAboutWindow(TopLevelWidget*
const topLevelWidget,
const ImageType& image)
43 : StandaloneWindow(topLevelWidget->getApp(), topLevelWidget->getWindow()),
51 setSize(
image.getSize());
52 setGeometryConstraints(
image.getWidth(),
image.getHeight(),
true,
true);
58template <
class ImageType>
59void ImageBaseAboutWindow<ImageType>::setImage(
const ImageType& image)
66 if (
image.isInvalid())
69 setSize(
image.getSize());
70 setGeometryConstraints(
image.getWidth(),
image.getHeight(),
true,
true);
73template <
class ImageType>
74void ImageBaseAboutWindow<ImageType>::onDisplay()
76 img.draw(getGraphicsContext());
79template <
class ImageType>
80bool ImageBaseAboutWindow<ImageType>::onKeyboard(
const KeyboardEvent& ev)
82 if (ev.press && ev.key == kKeyEscape)
91template <
class ImageType>
92bool ImageBaseAboutWindow<ImageType>::onMouse(
const MouseEvent& ev)
105template <
class ImageType>
106struct ImageBaseButton<ImageType>::
PrivateData :
public ButtonEventHandler::Callback {
121 if (ImageBaseButton*
const imageButton =
dynamic_cast<ImageBaseButton*
>(widget))
122 callback->imageButtonClicked(imageButton, button);
130template <
class ImageType>
131ImageBaseButton<ImageType>::ImageBaseButton(Widget*
const parentWidget,
const ImageType& image)
132 : SubWidget(parentWidget),
133 ButtonEventHandler(this),
134 pData(new PrivateData(image, image, image))
136 ButtonEventHandler::setCallback(pData);
137 setSize(image.getSize());
140template <
class ImageType>
141ImageBaseButton<ImageType>::ImageBaseButton(Widget*
const parentWidget,
const ImageType& imageNormal,
const ImageType& imageDown)
142 : SubWidget(parentWidget),
143 ButtonEventHandler(this),
144 pData(new
PrivateData(imageNormal, imageNormal, imageDown))
148 ButtonEventHandler::setCallback(pData);
152template <
class ImageType>
153ImageBaseButton<ImageType>::ImageBaseButton(Widget*
const parentWidget,
const ImageType& imageNormal,
const ImageType& imageHover,
const ImageType& imageDown)
154 : SubWidget(parentWidget),
155 ButtonEventHandler(this),
156 pData(new
PrivateData(imageNormal, imageHover, imageDown))
160 ButtonEventHandler::setCallback(pData);
164template <
class ImageType>
165ImageBaseButton<ImageType>::~ImageBaseButton()
170template <
class ImageType>
171void ImageBaseButton<ImageType>::setCallback(Callback*
callback)
noexcept
176template <
class ImageType>
177void ImageBaseButton<ImageType>::onDisplay()
179 const GraphicsContext& context(getGraphicsContext());
181 const State state = ButtonEventHandler::getState();
183 if (state & kButtonStateActive)
184 pData->imageDown.draw(context);
185 else if (state & kButtonStateHover)
186 pData->imageHover.draw(context);
188 pData->imageNormal.draw(context);
191template <
class ImageType>
192bool ImageBaseButton<ImageType>::onMouse(
const MouseEvent& ev)
194 if (SubWidget::onMouse(ev))
196 return ButtonEventHandler::mouseEvent(ev);
199template <
class ImageType>
200bool ImageBaseButton<ImageType>::onMotion(
const MotionEvent& ev)
202 if (SubWidget::onMotion(ev))
204 return ButtonEventHandler::motionEvent(ev);
209template <
class ImageType>
210struct ImageBaseKnob<ImageType>::
PrivateData :
public KnobEventHandler::Callback {
279 if (ImageBaseKnob*
const imageKnob =
dynamic_cast<ImageBaseKnob*
>(widget))
280 callback->imageKnobDragStarted(imageKnob);
286 if (ImageBaseKnob*
const imageKnob =
dynamic_cast<ImageBaseKnob*
>(widget))
287 callback->imageKnobDragFinished(imageKnob);
296 if (ImageBaseKnob*
const imageKnob =
dynamic_cast<ImageBaseKnob*
>(widget))
309template <
class ImageType>
310ImageBaseKnob<ImageType>::ImageBaseKnob(Widget*
const parentWidget,
311 const ImageType& image,
312 const Orientation orientation)
noexcept
313 : SubWidget(parentWidget),
314 KnobEventHandler(
this),
317 KnobEventHandler::setCallback(pData);
318 setOrientation(orientation);
319 setSize(pData->imgLayerWidth, pData->imgLayerHeight);
322template <
class ImageType>
323ImageBaseKnob<ImageType>::ImageBaseKnob(
const ImageBaseKnob<ImageType>& imageKnob)
324 : SubWidget(imageKnob.getParentWidget()),
325 KnobEventHandler(this, imageKnob),
326 pData(new PrivateData(imageKnob.pData))
328 KnobEventHandler::setCallback(pData);
329 setOrientation(imageKnob.getOrientation());
330 setSize(pData->imgLayerWidth, pData->imgLayerHeight);
333template <
class ImageType>
334ImageBaseKnob<ImageType>& ImageBaseKnob<ImageType>::operator=(
const ImageBaseKnob<ImageType>& imageKnob)
336 KnobEventHandler::operator=(imageKnob);
337 pData->assignFrom(imageKnob.pData);
338 setSize(pData->imgLayerWidth, pData->imgLayerHeight);
342template <
class ImageType>
343ImageBaseKnob<ImageType>::~ImageBaseKnob()
348template <
class ImageType>
349void ImageBaseKnob<ImageType>::setCallback(Callback*
callback)
noexcept
354template <
class ImageType>
355void ImageBaseKnob<ImageType>::setImageLayerCount(
uint count)
noexcept
359 pData->imgLayerCount =
count;
361 if (pData->isImgVertical)
362 pData->imgLayerHeight = pData->image.getHeight()/
count;
364 pData->imgLayerWidth = pData->image.getWidth()/
count;
366 setSize(pData->imgLayerWidth, pData->imgLayerHeight);
369template <
class ImageType>
370void ImageBaseKnob<ImageType>::setRotationAngle(
int angle)
372 if (pData->rotationAngle == angle)
375 pData->rotationAngle = angle;
376 pData->isReady =
false;
379template <
class ImageType>
380bool ImageBaseKnob<ImageType>::setValue(
float value,
bool sendCallback)
noexcept
382 if (KnobEventHandler::setValue(
value, sendCallback))
384 if (pData->rotationAngle == 0 || pData->alwaysRepaint)
385 pData->isReady =
false;
393template <
class ImageType>
394bool ImageBaseKnob<ImageType>::onMouse(
const MouseEvent& ev)
396 if (SubWidget::onMouse(ev))
398 return KnobEventHandler::mouseEvent(ev);
401template <
class ImageType>
402bool ImageBaseKnob<ImageType>::onMotion(
const MotionEvent& ev)
404 if (SubWidget::onMotion(ev))
406 return KnobEventHandler::motionEvent(ev);
409template <
class ImageType>
410bool ImageBaseKnob<ImageType>::onScroll(
const ScrollEvent& ev)
412 if (SubWidget::onScroll(ev))
414 return KnobEventHandler::scrollEvent(ev);
419template <
class ImageType>
469 static_cast<int>(
image.getHeight()));
476 static_cast<int>(
image.getWidth()),
486template <
class ImageType>
487ImageBaseSlider<ImageType>::ImageBaseSlider(Widget*
const parentWidget,
const ImageType& image)
noexcept
488 : SubWidget(parentWidget),
489 pData(
new PrivateData(image))
491 setNeedsFullViewportDrawing();
494template <
class ImageType>
495ImageBaseSlider<ImageType>::~ImageBaseSlider()
500template <
class ImageType>
506template <
class ImageType>
507void ImageBaseSlider<ImageType>::setValue(
float value,
bool sendCallback)
noexcept
509 if (! pData->valueIsSet)
510 pData->valueIsSet =
true;
512 if (d_isEqual(pData->value,
value))
515 pData->value =
value;
517 if (d_isZero(pData->step))
518 pData->valueTmp =
value;
522 if (sendCallback && pData->callback !=
nullptr)
525 pData->callback->imageSliderValueChanged(
this, pData->value);
530template <
class ImageType>
531void ImageBaseSlider<ImageType>::setStartPos(
const Point<int>& startPos)
noexcept
533 pData->startPos = startPos;
534 pData->recheckArea();
537template <
class ImageType>
538void ImageBaseSlider<ImageType>::setStartPos(
int x,
int y)
noexcept
540 setStartPos(Point<int>(
x,
y));
543template <
class ImageType>
544void ImageBaseSlider<ImageType>::setEndPos(
const Point<int>& endPos)
noexcept
546 pData->endPos = endPos;
547 pData->recheckArea();
550template <
class ImageType>
551void ImageBaseSlider<ImageType>::setEndPos(
int x,
int y)
noexcept
553 setEndPos(Point<int>(
x,
y));
556template <
class ImageType>
557void ImageBaseSlider<ImageType>::setInverted(
bool inverted)
noexcept
559 if (pData->inverted == inverted)
562 pData->inverted = inverted;
566template <
class ImageType>
567void ImageBaseSlider<ImageType>::setDefault(
float value)
noexcept
569 pData->valueDef =
value;
570 pData->usingDefault =
true;
573template <
class ImageType>
574void ImageBaseSlider<ImageType>::setRange(
float min,
float max)
noexcept
576 pData->minimum =
min;
577 pData->maximum =
max;
579 if (pData->value <
min)
584 if (pData->callback !=
nullptr && pData->valueIsSet)
587 pData->callback->imageSliderValueChanged(
this, pData->value);
591 else if (pData->value >
max)
596 if (pData->callback !=
nullptr && pData->valueIsSet)
599 pData->callback->imageSliderValueChanged(
this, pData->value);
605template <
class ImageType>
606void ImageBaseSlider<ImageType>::setStep(
float step)
noexcept
611template <
class ImageType>
612void ImageBaseSlider<ImageType>::setCallback(Callback*
callback)
noexcept
617template <
class ImageType>
618void ImageBaseSlider<ImageType>::onDisplay()
620 const GraphicsContext& context(getGraphicsContext());
623 Color(1.0f, 1.0f, 1.0f, 0.5f).setFor(context,
true);
624 Rectangle<int>(pData->sliderArea.getX(),
625 pData->sliderArea.getY(),
626 pData->sliderArea.getX()+pData->sliderArea.getWidth(),
627 pData->sliderArea.getY()+pData->sliderArea.getHeight()).draw(context);
628 Color(1.0f, 1.0f, 1.0f, 1.0f).setFor(context,
true);
631 const float normValue = (pData->value - pData->minimum) / (pData->maximum - pData->minimum);
635 if (pData->startPos.getY() == pData->endPos.getY())
639 x = pData->endPos.getX() -
static_cast<int>(normValue*
static_cast<float>(pData->endPos.getX()-pData->startPos.getX()));
641 x = pData->startPos.getX() +
static_cast<int>(normValue*
static_cast<float>(pData->endPos.getX()-pData->startPos.getX()));
643 y = pData->startPos.getY();
648 x = pData->startPos.getX();
651 y = pData->endPos.getY() -
static_cast<int>(normValue*
static_cast<float>(pData->endPos.getY()-pData->startPos.getY()));
653 y = pData->startPos.getY() +
static_cast<int>(normValue*
static_cast<float>(pData->endPos.getY()-pData->startPos.getY()));
656 pData->image.drawAt(context,
x,
y);
659template <
class ImageType>
660bool ImageBaseSlider<ImageType>::onMouse(
const MouseEvent& ev)
667 if (! pData->sliderArea.contains(ev.pos))
670 if ((ev.mod & kModifierShift) != 0 && pData->usingDefault)
672 setValue(pData->valueDef,
true);
673 pData->valueTmp = pData->value;
678 const double x = ev.pos.getX();
679 const double y = ev.pos.getY();
681 if (pData->startPos.getY() == pData->endPos.getY())
684 vper = float(
x - pData->sliderArea.getX()) / float(pData->sliderArea.getWidth());
689 vper = float(
y - pData->sliderArea.getY()) / float(pData->sliderArea.getHeight());
695 value = pData->maximum - vper * (pData->maximum - pData->minimum);
697 value = pData->minimum + vper * (pData->maximum - pData->minimum);
701 pData->valueTmp =
value = pData->minimum;
703 else if (
value > pData->maximum)
705 pData->valueTmp =
value = pData->maximum;
707 else if (d_isNotZero(pData->step))
709 pData->valueTmp =
value;
710 const float rest = std::fmod(
value, pData->step);
711 value =
value - rest + (rest > pData->step/2.0f ? pData->step : 0.0f);
714 pData->dragging =
true;
718 if (pData->callback !=
nullptr)
719 pData->callback->imageSliderDragStarted(
this);
721 setValue(
value,
true);
725 else if (pData->dragging)
727 if (pData->callback !=
nullptr)
728 pData->callback->imageSliderDragFinished(
this);
730 pData->dragging =
false;
737template <
class ImageType>
738bool ImageBaseSlider<ImageType>::onMotion(
const MotionEvent& ev)
740 if (! pData->dragging)
743 const bool horizontal = pData->startPos.getY() == pData->endPos.getY();
744 const double x = ev.pos.getX();
745 const double y = ev.pos.getY();
747 if ((horizontal && pData->sliderArea.containsX(
x)) || (pData->sliderArea.containsY(
y) && ! horizontal))
754 vper = float(
x - pData->sliderArea.getX()) / float(pData->sliderArea.getWidth());
759 vper = float(
y - pData->sliderArea.getY()) / float(pData->sliderArea.getHeight());
765 value = pData->maximum - vper * (pData->maximum - pData->minimum);
767 value = pData->minimum + vper * (pData->maximum - pData->minimum);
771 pData->valueTmp =
value = pData->minimum;
773 else if (
value > pData->maximum)
775 pData->valueTmp =
value = pData->maximum;
777 else if (d_isNotZero(pData->step))
779 pData->valueTmp =
value;
780 const float rest = std::fmod(
value, pData->step);
781 value =
value - rest + (rest > pData->step/2.0f ? pData->step : 0.0f);
784 setValue(
value,
true);
789 setValue(pData->inverted ? pData->maximum : pData->minimum,
true);
791 setValue(pData->inverted ? pData->minimum : pData->maximum,
true);
796 setValue(pData->inverted ? pData->maximum : pData->minimum,
true);
798 setValue(pData->inverted ? pData->minimum : pData->maximum,
true);
806template <
class ImageType>
845template <
class ImageType>
846ImageBaseSwitch<ImageType>::ImageBaseSwitch(Widget*
const parentWidget,
const ImageType& imageNormal,
const ImageType& imageDown)
noexcept
847 : SubWidget(parentWidget),
848 pData(
new PrivateData(imageNormal, imageDown))
850 setSize(imageNormal.getSize());
853template <
class ImageType>
854ImageBaseSwitch<ImageType>::ImageBaseSwitch(
const ImageBaseSwitch<ImageType>& imageSwitch)
noexcept
855 : SubWidget(imageSwitch.getParentWidget()),
858 setSize(pData->imageNormal.getSize());
861template <
class ImageType>
862ImageBaseSwitch<ImageType>& ImageBaseSwitch<ImageType>::operator=(
const ImageBaseSwitch<ImageType>& imageSwitch)
noexcept
864 pData->assignFrom(imageSwitch.pData);
865 setSize(pData->imageNormal.getSize());
869template <
class ImageType>
870ImageBaseSwitch<ImageType>::~ImageBaseSwitch()
875template <
class ImageType>
878 return pData->isDown;
881template <
class ImageType>
882void ImageBaseSwitch<ImageType>::setDown(
const bool down)
noexcept
884 if (pData->isDown == down)
887 pData->isDown = down;
891template <
class ImageType>
892void ImageBaseSwitch<ImageType>::setCallback(Callback*
const callback)
noexcept
897template <
class ImageType>
898void ImageBaseSwitch<ImageType>::onDisplay()
900 const GraphicsContext& context(getGraphicsContext());
903 pData->imageDown.draw(context);
905 pData->imageNormal.draw(context);
908template <
class ImageType>
909bool ImageBaseSwitch<ImageType>::onMouse(
const MouseEvent& ev)
911 if (ev.press && contains(ev.pos))
913 pData->isDown = !pData->isDown;
917 if (pData->callback !=
nullptr)
918 pData->callback->imageSwitchClicked(
this, pData->isDown);
unsigned int uint
Definition CarlaDefines.h:327
#define noexcept
Definition DistrhoDefines.h:72
#define DISTRHO_SAFE_ASSERT(cond)
Definition DistrhoDefines.h:104
#define DISTRHO_SAFE_ASSERT_RETURN(cond, ret)
Definition DistrhoDefines.h:112
#define nullptr
Definition DistrhoDefines.h:75
#define DISTRHO_DECLARE_NON_COPYABLE(ClassName)
Definition DistrhoDefines.h:154
#define DISTRHO_SAFE_EXCEPTION(msg)
Definition DistrhoDefines.h:140
float normal(const fft_t *freqs, off_t x)
Definition OscilGen.cpp:46
int y
Definition inflate.c:1588
unsigned x[BMAX+1]
Definition inflate.c:1586
static PuglViewHint int value
Definition pugl.h:1708
static void cleanup(void)
Definition lilv_test.c:152
@ image
Definition juce_AccessibilityRole.h:42
#define false
Definition ordinals.h:83
#define min(x, y)
Definition os.h:74
#define max(x, y)
Definition os.h:78
Definition ImageBaseWidgets.cpp:210
PrivateData(const ImageType &img)
Definition ImageBaseWidgets.cpp:228
void assignFrom(PrivateData *const other)
Definition ImageBaseWidgets.cpp:256
~PrivateData()
Definition ImageBaseWidgets.cpp:271
PrivateData(PrivateData *const other)
Definition ImageBaseWidgets.cpp:242
ImageBaseKnob< ImageType >::Callback * callback
Definition ImageBaseWidgets.cpp:211
bool isImgVertical
Definition ImageBaseWidgets.cpp:217
uint imgLayerHeight
Definition ImageBaseWidgets.cpp:219
bool isReady
Definition ImageBaseWidgets.cpp:221
uint imgLayerWidth
Definition ImageBaseWidgets.cpp:218
void knobDragStarted(SubWidget *const widget) override
Definition ImageBaseWidgets.cpp:276
int rotationAngle
Definition ImageBaseWidgets.cpp:214
void knobValueChanged(SubWidget *const widget, const float value) override
Definition ImageBaseWidgets.cpp:290
void knobDragFinished(SubWidget *const widget) override
Definition ImageBaseWidgets.cpp:283
ImageType image
Definition ImageBaseWidgets.cpp:212
bool alwaysRepaint
Definition ImageBaseWidgets.cpp:216
uint imgLayerCount
Definition ImageBaseWidgets.cpp:220
Definition ImageBaseWidgets.cpp:420
ImageType image
Definition ImageBaseWidgets.cpp:421
float value
Definition ImageBaseWidgets.cpp:425
bool dragging
Definition ImageBaseWidgets.cpp:430
bool usingDefault
Definition ImageBaseWidgets.cpp:428
double startedX
Definition ImageBaseWidgets.cpp:433
double startedY
Definition ImageBaseWidgets.cpp:434
PrivateData(const ImageType &img)
Definition ImageBaseWidgets.cpp:442
Point< int > startPos
Definition ImageBaseWidgets.cpp:438
float valueTmp
Definition ImageBaseWidgets.cpp:427
float step
Definition ImageBaseWidgets.cpp:424
Callback * callback
Definition ImageBaseWidgets.cpp:436
Rectangle< double > sliderArea
Definition ImageBaseWidgets.cpp:440
float maximum
Definition ImageBaseWidgets.cpp:423
bool inverted
Definition ImageBaseWidgets.cpp:431
float valueDef
Definition ImageBaseWidgets.cpp:426
bool valueIsSet
Definition ImageBaseWidgets.cpp:432
void recheckArea() noexcept
Definition ImageBaseWidgets.cpp:461
float minimum
Definition ImageBaseWidgets.cpp:422
Point< int > endPos
Definition ImageBaseWidgets.cpp:439
Definition ImageBaseWidgets.cpp:807
ImageType imageNormal
Definition ImageBaseWidgets.cpp:808
bool isDown
Definition ImageBaseWidgets.cpp:810
PrivateData(PrivateData *const other)
Definition ImageBaseWidgets.cpp:822
ImageType imageDown
Definition ImageBaseWidgets.cpp:809
PrivateData(const ImageType &normal, const ImageType &down)
Definition ImageBaseWidgets.cpp:813
Callback * callback
Definition ImageBaseWidgets.cpp:811
void assignFrom(PrivateData *const other)
Definition ImageBaseWidgets.cpp:831
RECT const char void(* callback)(const char *droppath))) SWELL_API_DEFINE(BOOL
Definition swell-functions.h:1004
void Rectangle(HDC ctx, int l, int t, int r, int b)
Definition swell-gdi-generic.cpp:279
_WDL_CSTRING_PREFIX void INT_PTR count
Definition wdlcstring.h:263
#define const
Definition zconf.h:137