DISTRHO Plugin Framework
ImageBaseWidgets.hpp
1 /*
2  * DISTRHO Plugin Framework (DPF)
3  * Copyright (C) 2012-2021 Filipe Coelho <falktx@falktx.com>
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any purpose with
6  * or without fee is hereby granted, provided that the above copyright notice and this
7  * permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
10  * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
11  * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
12  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
13  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 #ifndef DGL_IMAGE_BASE_WIDGETS_HPP_INCLUDED
18 #define DGL_IMAGE_BASE_WIDGETS_HPP_INCLUDED
19 
20 #include "EventHandlers.hpp"
21 #include "StandaloneWindow.hpp"
22 #include "SubWidget.hpp"
23 
24 START_NAMESPACE_DGL
25 
26 // --------------------------------------------------------------------------------------------------------------------
27 
28 template <class ImageType>
30 {
31 public:
32  explicit ImageBaseAboutWindow(Window& parentWindow, const ImageType& image = ImageType());
33  explicit ImageBaseAboutWindow(TopLevelWidget* parentTopLevelWidget, const ImageType& image = ImageType());
34 
35  void setImage(const ImageType& image);
36 
37 protected:
38  void onDisplay() override;
39  bool onKeyboard(const KeyboardEvent&) override;
40  bool onMouse(const MouseEvent&) override;
41 
42 private:
43  ImageType img;
44 
45  DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ImageBaseAboutWindow)
46 };
47 
48 // --------------------------------------------------------------------------------------------------------------------
49 
50 template <class ImageType>
51 class ImageBaseButton : public SubWidget,
52  public ButtonEventHandler
53 {
54 public:
55  class Callback
56  {
57  public:
58  virtual ~Callback() {}
59  virtual void imageButtonClicked(ImageBaseButton* imageButton, int button) = 0;
60  };
61 
62  explicit ImageBaseButton(Widget* parentWidget, const ImageType& image);
63  explicit ImageBaseButton(Widget* parentWidget, const ImageType& imageNormal, const ImageType& imageDown);
64  explicit ImageBaseButton(Widget* parentWidget, const ImageType& imageNormal, const ImageType& imageHover, const ImageType& imageDown);
65 
66  ~ImageBaseButton() override;
67 
68  void setCallback(Callback* callback) noexcept;
69 
70 protected:
71  void onDisplay() override;
72  bool onMouse(const MouseEvent&) override;
73  bool onMotion(const MotionEvent&) override;
74 
75 private:
76  struct PrivateData;
77  PrivateData* const pData;
78 
79  DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ImageBaseButton)
80 };
81 
82 // --------------------------------------------------------------------------------------------------------------------
83 
84 template <class ImageType>
85 class ImageBaseKnob : public SubWidget,
86  public KnobEventHandler
87 {
88 public:
89  class Callback
90  {
91  public:
92  virtual ~Callback() {}
93  virtual void imageKnobDragStarted(ImageBaseKnob* imageKnob) = 0;
94  virtual void imageKnobDragFinished(ImageBaseKnob* imageKnob) = 0;
95  virtual void imageKnobValueChanged(ImageBaseKnob* imageKnob, float value) = 0;
96  };
97 
98  explicit ImageBaseKnob(Widget* parentWidget, const ImageType& image, Orientation orientation = Vertical) noexcept;
99  explicit ImageBaseKnob(const ImageBaseKnob& imageKnob);
100  ImageBaseKnob& operator=(const ImageBaseKnob& imageKnob);
101  ~ImageBaseKnob() override;
102 
103  void setCallback(Callback* callback) noexcept;
104  void setImageLayerCount(uint count) noexcept;
105  void setRotationAngle(int angle);
106  bool setValue(float value, bool sendCallback = false) noexcept override;
107 
108 protected:
109  void onDisplay() override;
110  bool onMouse(const MouseEvent&) override;
111  bool onMotion(const MotionEvent&) override;
112  bool onScroll(const ScrollEvent&) override;
113 
114 private:
115  struct PrivateData;
116  PrivateData* const pData;
117 
118  DISTRHO_LEAK_DETECTOR(ImageBaseKnob)
119 };
120 
121 // --------------------------------------------------------------------------------------------------------------------
122 
123 // note set range and step before setting the value
124 
125 template <class ImageType>
127 {
128 public:
129  class Callback
130  {
131  public:
132  virtual ~Callback() {}
133  virtual void imageSliderDragStarted(ImageBaseSlider* imageSlider) = 0;
134  virtual void imageSliderDragFinished(ImageBaseSlider* imageSlider) = 0;
135  virtual void imageSliderValueChanged(ImageBaseSlider* imageSlider, float value) = 0;
136  };
137 
138  explicit ImageBaseSlider(Widget* parentWidget, const ImageType& image) noexcept;
139  ~ImageBaseSlider() override;
140 
141  float getValue() const noexcept;
142  void setValue(float value, bool sendCallback = false) noexcept;
143  void setDefault(float def) noexcept;
144 
145  void setStartPos(const Point<int>& startPos) noexcept;
146  void setStartPos(int x, int y) noexcept;
147  void setEndPos(const Point<int>& endPos) noexcept;
148  void setEndPos(int x, int y) noexcept;
149 
150  void setInverted(bool inverted) noexcept;
151  void setRange(float min, float max) noexcept;
152  void setStep(float step) noexcept;
153 
154  void setCallback(Callback* callback) noexcept;
155 
156 protected:
157  void onDisplay() override;
158  bool onMouse(const MouseEvent&) override;
159  bool onMotion(const MotionEvent&) override;
160 
161 private:
162  struct PrivateData;
163  PrivateData* const pData;
164 
165  // these should not be used
166  void setAbsoluteX(int) const noexcept {}
167  void setAbsoluteY(int) const noexcept {}
168  void setAbsolutePos(int, int) const noexcept {}
169  void setAbsolutePos(const Point<int>&) const noexcept {}
170 
171  DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ImageBaseSlider)
172 };
173 
174 // --------------------------------------------------------------------------------------------------------------------
175 
176 template <class ImageType>
178 {
179 public:
180  class Callback
181  {
182  public:
183  virtual ~Callback() {}
184  virtual void imageSwitchClicked(ImageBaseSwitch* imageSwitch, bool down) = 0;
185  };
186 
187  explicit ImageBaseSwitch(Widget* parentWidget, const ImageType& imageNormal, const ImageType& imageDown) noexcept;
188  explicit ImageBaseSwitch(const ImageBaseSwitch& imageSwitch) noexcept;
189  ImageBaseSwitch& operator=(const ImageBaseSwitch& imageSwitch) noexcept;
190  ~ImageBaseSwitch() override;
191 
192  bool isDown() const noexcept;
193  void setDown(bool down) noexcept;
194 
195  void setCallback(Callback* callback) noexcept;
196 
197 protected:
198  void onDisplay() override;
199  bool onMouse(const MouseEvent&) override;
200 
201 private:
202  struct PrivateData;
203  PrivateData* const pData;
204 
205  DISTRHO_LEAK_DETECTOR(ImageBaseSwitch)
206 };
207 
208 // --------------------------------------------------------------------------------------------------------------------
209 
210 END_NAMESPACE_DGL
211 
212 #endif // DGL_IMAGE_BASE_WIDGETS_HPP_INCLUDED
ImageBaseAboutWindow::onDisplay
void onDisplay() override
ImageBaseButton
Definition: ImageBaseWidgets.hpp:51
ImageBaseKnob
Definition: ImageBaseWidgets.hpp:85
Widget::ScrollEvent
Definition: Widget.hpp:217
ImageBaseSlider
Definition: ImageBaseWidgets.hpp:126
Widget::KeyboardEvent
Definition: Widget.hpp:94
SubWidget::setAbsolutePos
void setAbsolutePos(int x, int y) noexcept
Window
Definition: Window.hpp:50
ImageBaseKnob::onScroll
bool onScroll(const ScrollEvent &) override
SubWidget::setAbsoluteY
void setAbsoluteY(int y) noexcept
ImageBaseButton::onDisplay
void onDisplay() override
SubWidget::setAbsoluteX
void setAbsoluteX(int x) noexcept
ImageBaseKnob::onMouse
bool onMouse(const MouseEvent &) override
ImageBaseAboutWindow::onMouse
bool onMouse(const MouseEvent &) override
Widget::MotionEvent
Definition: Widget.hpp:191
ImageBaseAboutWindow::onKeyboard
bool onKeyboard(const KeyboardEvent &) override
ImageBaseAboutWindow
Definition: ImageBaseWidgets.hpp:29
ImageBaseKnob::Callback
Definition: ImageBaseWidgets.hpp:89
ImageBaseKnob::onDisplay
void onDisplay() override
ImageBaseButton::onMouse
bool onMouse(const MouseEvent &) override
StandaloneWindow
Definition: StandaloneWindow.hpp:27
ImageBaseKnob::onMotion
bool onMotion(const MotionEvent &) override
Point
Definition: Geometry.hpp:40
ImageBaseButton::Callback
Definition: ImageBaseWidgets.hpp:55
SubWidget
Definition: SubWidget.hpp:39
Widget::MouseEvent
Definition: Widget.hpp:169
ImageBaseButton::onMotion
bool onMotion(const MotionEvent &) override
ImageBaseSwitch::Callback
Definition: ImageBaseWidgets.hpp:180
ImageBaseSwitch
Definition: ImageBaseWidgets.hpp:177
ButtonEventHandler
Definition: EventHandlers.hpp:37
KnobEventHandler
Definition: EventHandlers.hpp:92
TopLevelWidget
Definition: TopLevelWidget.hpp:46
ImageBaseSlider::Callback
Definition: ImageBaseWidgets.hpp:129
Widget
Definition: Widget.hpp:53