ImageBaseWidgets.hpp (8913B)
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