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 
107 protected:
108  void onDisplay() override;
109  bool onMouse(const MouseEvent&) override;
110  bool onMotion(const MotionEvent&) override;
111  bool onScroll(const ScrollEvent&) override;
112 
113 private:
114  struct PrivateData;
115  PrivateData* const pData;
116 
117  DISTRHO_LEAK_DETECTOR(ImageBaseKnob)
118 };
119 
120 // --------------------------------------------------------------------------------------------------------------------
121 
122 // note set range and step before setting the value
123 
124 template <class ImageType>
126 {
127 public:
128  class Callback
129  {
130  public:
131  virtual ~Callback() {}
132  virtual void imageSliderDragStarted(ImageBaseSlider* imageSlider) = 0;
133  virtual void imageSliderDragFinished(ImageBaseSlider* imageSlider) = 0;
134  virtual void imageSliderValueChanged(ImageBaseSlider* imageSlider, float value) = 0;
135  };
136 
137  explicit ImageBaseSlider(Widget* parentWidget, const ImageType& image) noexcept;
138  ~ImageBaseSlider() override;
139 
140  float getValue() const noexcept;
141  void setValue(float value, bool sendCallback = false) noexcept;
142  void setDefault(float def) noexcept;
143 
144  void setStartPos(const Point<int>& startPos) noexcept;
145  void setStartPos(int x, int y) noexcept;
146  void setEndPos(const Point<int>& endPos) noexcept;
147  void setEndPos(int x, int y) noexcept;
148 
149  void setInverted(bool inverted) noexcept;
150  void setRange(float min, float max) noexcept;
151  void setStep(float step) noexcept;
152 
153  void setCallback(Callback* callback) noexcept;
154 
155 protected:
156  void onDisplay() override;
157  bool onMouse(const MouseEvent&) override;
158  bool onMotion(const MotionEvent&) override;
159 
160 private:
161  struct PrivateData;
162  PrivateData* const pData;
163 
164  // these should not be used
165  void setAbsoluteX(int) const noexcept {}
166  void setAbsoluteY(int) const noexcept {}
167  void setAbsolutePos(int, int) const noexcept {}
168  void setAbsolutePos(const Point<int>&) const noexcept {}
169 
170  DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ImageBaseSlider)
171 };
172 
173 // --------------------------------------------------------------------------------------------------------------------
174 
175 template <class ImageType>
177 {
178 public:
179  class Callback
180  {
181  public:
182  virtual ~Callback() {}
183  virtual void imageSwitchClicked(ImageBaseSwitch* imageSwitch, bool down) = 0;
184  };
185 
186  explicit ImageBaseSwitch(Widget* parentWidget, const ImageType& imageNormal, const ImageType& imageDown) noexcept;
187  explicit ImageBaseSwitch(const ImageBaseSwitch& imageSwitch) noexcept;
188  ImageBaseSwitch& operator=(const ImageBaseSwitch& imageSwitch) noexcept;
189  ~ImageBaseSwitch() override;
190 
191  bool isDown() const noexcept;
192  void setDown(bool down) noexcept;
193 
194  void setCallback(Callback* callback) noexcept;
195 
196 protected:
197  void onDisplay() override;
198  bool onMouse(const MouseEvent&) override;
199 
200 private:
201  struct PrivateData;
202  PrivateData* const pData;
203 
204  DISTRHO_LEAK_DETECTOR(ImageBaseSwitch)
205 };
206 
207 // --------------------------------------------------------------------------------------------------------------------
208 
209 END_NAMESPACE_DGL
210 
211 #endif // DGL_IMAGE_BASE_WIDGETS_HPP_INCLUDED
ImageBaseAboutWindow::onDisplay
void onDisplay() override
ImageBaseButton
Definition: ImageBaseWidgets.hpp:51
ImageBaseKnob
Definition: ImageBaseWidgets.hpp:85
ImageBaseSwitch::onMouse
bool onMouse(const MouseEvent &) override
Widget::ScrollEvent
Definition: Widget.hpp:213
ImageBaseSlider
Definition: ImageBaseWidgets.hpp:125
Widget::KeyboardEvent
Definition: Widget.hpp:94
Window
Definition: Window.hpp:50
ImageBaseKnob::onScroll
bool onScroll(const ScrollEvent &) override
ImageBaseButton::onDisplay
void onDisplay() override
ImageBaseKnob::onMouse
bool onMouse(const MouseEvent &) override
ImageBaseAboutWindow::onMouse
bool onMouse(const MouseEvent &) override
Widget::MotionEvent
Definition: Widget.hpp:187
ImageBaseAboutWindow::onKeyboard
bool onKeyboard(const KeyboardEvent &) override
ImageBaseAboutWindow
Definition: ImageBaseWidgets.hpp:29
ImageBaseKnob::Callback
Definition: ImageBaseWidgets.hpp:89
ImageBaseKnob::onDisplay
void onDisplay() override
ImageBaseSwitch::onDisplay
void onDisplay() override
ImageBaseSlider::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:165
ImageBaseButton::onMotion
bool onMotion(const MotionEvent &) override
ImageBaseSwitch::Callback
Definition: ImageBaseWidgets.hpp:179
ImageBaseSwitch
Definition: ImageBaseWidgets.hpp:176
ButtonEventHandler
Definition: EventHandlers.hpp:26
KnobEventHandler
Definition: EventHandlers.hpp:81
ImageBaseSlider::onMotion
bool onMotion(const MotionEvent &) override
TopLevelWidget
Definition: TopLevelWidget.hpp:46
ImageBaseSlider::onMouse
bool onMouse(const MouseEvent &) override
ImageBaseSlider::Callback
Definition: ImageBaseWidgets.hpp:128
Widget
Definition: Widget.hpp:53