comparison DPF-Prymula-audioplugins/dpf/dgl/ImageBaseWidgets.hpp @ 3:84e66ea83026

DPF-Prymula-audioplugins-0.231015-2
author prymula <prymula76@outlook.com>
date Mon, 16 Oct 2023 21:53:34 +0200
parents
children
comparison
equal deleted inserted replaced
2:cf2cb71d31dd 3:84e66ea83026
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 /**
29 DGL Image About Window class.
30
31 This is a Window attached (transient) to another Window that simply shows an Image as its content.
32 It is typically used for "about this project" style pop-up Windows.
33
34 Pressing 'Esc' or clicking anywhere on the window will automatically close it.
35
36 @see CairoImageAboutWindow, OpenGLImageAboutWindow, Window::runAsModal(bool)
37 */
38 template <class ImageType>
39 class ImageBaseAboutWindow : public StandaloneWindow
40 {
41 public:
42 /**
43 Constructor taking an existing Window as the parent transient window and an optional image.
44 If @a image is valid, the about window size will match the image size.
45 */
46 explicit ImageBaseAboutWindow(Window& transientParentWindow, const ImageType& image = ImageType());
47
48 /**
49 Constructor taking a top-level-widget's Window as the parent transient window and an optional image.
50 If @a image is valid, the about window size will match the image size.
51 */
52 explicit ImageBaseAboutWindow(TopLevelWidget* topLevelWidget, const ImageType& image = ImageType());
53
54 /**
55 Set a new image to use as background for this window.
56 Window size will adjust to match the image size.
57 */
58 void setImage(const ImageType& image);
59
60 protected:
61 void onDisplay() override;
62 bool onKeyboard(const KeyboardEvent&) override;
63 bool onMouse(const MouseEvent&) override;
64
65 private:
66 ImageType img;
67
68 DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ImageBaseAboutWindow)
69 };
70
71 // --------------------------------------------------------------------------------------------------------------------
72
73 /**
74 DGL Image Button class.
75
76 This is a typical button, where the drawing comes from a pregenerated set of images.
77 The button can be under "normal", "hover" and "down" states, with one separate image possible for each.
78
79 The event logic for this button comes from the ButtonEventHandler class.
80
81 @see CairoImageButton, OpenGLImageButton
82 */
83 template <class ImageType>
84 class ImageBaseButton : public SubWidget,
85 public ButtonEventHandler
86 {
87 public:
88 class Callback
89 {
90 public:
91 virtual ~Callback() {}
92 virtual void imageButtonClicked(ImageBaseButton* imageButton, int button) = 0;
93 };
94
95 explicit ImageBaseButton(Widget* parentWidget, const ImageType& image);
96 explicit ImageBaseButton(Widget* parentWidget, const ImageType& imageNormal, const ImageType& imageDown);
97 explicit ImageBaseButton(Widget* parentWidget, const ImageType& imageNormal, const ImageType& imageHover, const ImageType& imageDown);
98
99 ~ImageBaseButton() override;
100
101 void setCallback(Callback* callback) noexcept;
102
103 protected:
104 void onDisplay() override;
105 bool onMouse(const MouseEvent&) override;
106 bool onMotion(const MotionEvent&) override;
107
108 private:
109 struct PrivateData;
110 PrivateData* const pData;
111
112 DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ImageBaseButton)
113 };
114
115 // --------------------------------------------------------------------------------------------------------------------
116
117 /**
118 DGL Image Knob class.
119
120 This is a typical knob/dial, where the drawing comes from a pregenerated image "filmstrip".
121 The knob's "filmstrip" image can be either horizontal or vertical,
122 with the number of steps automatically based on the largest value (ie, horizontal if width>height, vertical if height>width).
123 There are no different images for "hover" or "down" states.
124
125 The event logic for this knob comes from the KnobEventHandler class.
126
127 @see CairoImageKnob, OpenGLImageKnob
128 */
129 template <class ImageType>
130 class ImageBaseKnob : public SubWidget,
131 public KnobEventHandler
132 {
133 public:
134 class Callback
135 {
136 public:
137 virtual ~Callback() {}
138 virtual void imageKnobDragStarted(ImageBaseKnob* imageKnob) = 0;
139 virtual void imageKnobDragFinished(ImageBaseKnob* imageKnob) = 0;
140 virtual void imageKnobValueChanged(ImageBaseKnob* imageKnob, float value) = 0;
141 };
142
143 explicit ImageBaseKnob(Widget* parentWidget, const ImageType& image, Orientation orientation = Vertical) noexcept;
144 explicit ImageBaseKnob(const ImageBaseKnob& imageKnob);
145 ImageBaseKnob& operator=(const ImageBaseKnob& imageKnob);
146 ~ImageBaseKnob() override;
147
148 void setCallback(Callback* callback) noexcept;
149 void setImageLayerCount(uint count) noexcept;
150 void setRotationAngle(int angle);
151 bool setValue(float value, bool sendCallback = false) noexcept override;
152
153 protected:
154 void onDisplay() override;
155 bool onMouse(const MouseEvent&) override;
156 bool onMotion(const MotionEvent&) override;
157 bool onScroll(const ScrollEvent&) override;
158
159 private:
160 struct PrivateData;
161 PrivateData* const pData;
162
163 DISTRHO_LEAK_DETECTOR(ImageBaseKnob)
164 };
165
166 // --------------------------------------------------------------------------------------------------------------------
167
168 // note set range and step before setting the value
169
170 template <class ImageType>
171 class ImageBaseSlider : public SubWidget
172 {
173 public:
174 class Callback
175 {
176 public:
177 virtual ~Callback() {}
178 virtual void imageSliderDragStarted(ImageBaseSlider* imageSlider) = 0;
179 virtual void imageSliderDragFinished(ImageBaseSlider* imageSlider) = 0;
180 virtual void imageSliderValueChanged(ImageBaseSlider* imageSlider, float value) = 0;
181 };
182
183 explicit ImageBaseSlider(Widget* parentWidget, const ImageType& image) noexcept;
184 ~ImageBaseSlider() override;
185
186 float getValue() const noexcept;
187 void setValue(float value, bool sendCallback = false) noexcept;
188 void setDefault(float def) noexcept;
189
190 void setStartPos(const Point<int>& startPos) noexcept;
191 void setStartPos(int x, int y) noexcept;
192 void setEndPos(const Point<int>& endPos) noexcept;
193 void setEndPos(int x, int y) noexcept;
194
195 void setCheckable(bool checkable) noexcept;
196 void setInverted(bool inverted) noexcept;
197 void setRange(float min, float max) noexcept;
198 void setStep(float step) noexcept;
199
200 void setCallback(Callback* callback) noexcept;
201
202 protected:
203 void onDisplay() override;
204 bool onMouse(const MouseEvent&) override;
205 bool onMotion(const MotionEvent&) override;
206
207 private:
208 struct PrivateData;
209 PrivateData* const pData;
210
211 // these should not be used
212 void setAbsoluteX(int) const noexcept {}
213 void setAbsoluteY(int) const noexcept {}
214 void setAbsolutePos(int, int) const noexcept {}
215 void setAbsolutePos(const Point<int>&) const noexcept {}
216
217 DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ImageBaseSlider)
218 };
219
220 // --------------------------------------------------------------------------------------------------------------------
221
222 template <class ImageType>
223 class ImageBaseSwitch : public SubWidget
224 {
225 public:
226 class Callback
227 {
228 public:
229 virtual ~Callback() {}
230 virtual void imageSwitchClicked(ImageBaseSwitch* imageSwitch, bool down) = 0;
231 };
232
233 explicit ImageBaseSwitch(Widget* parentWidget, const ImageType& imageNormal, const ImageType& imageDown) noexcept;
234 explicit ImageBaseSwitch(const ImageBaseSwitch& imageSwitch) noexcept;
235 ImageBaseSwitch& operator=(const ImageBaseSwitch& imageSwitch) noexcept;
236 ~ImageBaseSwitch() override;
237
238 bool isDown() const noexcept;
239 void setDown(bool down) noexcept;
240
241 void setCallback(Callback* callback) noexcept;
242
243 protected:
244 void onDisplay() override;
245 bool onMouse(const MouseEvent&) override;
246
247 private:
248 struct PrivateData;
249 PrivateData* const pData;
250
251 DISTRHO_LEAK_DETECTOR(ImageBaseSwitch)
252 };
253
254 // --------------------------------------------------------------------------------------------------------------------
255
256 END_NAMESPACE_DGL
257
258 #endif // DGL_IMAGE_BASE_WIDGETS_HPP_INCLUDED