DISTRHO Plugin Framework
 All Classes Functions Variables Enumerations Enumerator Groups Pages
DistrhoUI.hpp
1 /*
2  * DISTRHO Plugin Framework (DPF)
3  * Copyright (C) 2012-2019 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 DISTRHO_UI_HPP_INCLUDED
18 #define DISTRHO_UI_HPP_INCLUDED
19 
20 #include "extra/LeakDetector.hpp"
21 #include "src/DistrhoPluginChecks.h"
22 
23 #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI
24 # include "../dgl/Base.hpp"
25 # include "extra/ExternalWindow.hpp"
26 typedef DISTRHO_NAMESPACE::ExternalWindow UIWidget;
27 #elif DISTRHO_UI_USE_NANOVG
28 # include "../dgl/NanoVG.hpp"
29 typedef DGL_NAMESPACE::NanoWidget UIWidget;
30 #else
31 # include "../dgl/Widget.hpp"
32 typedef DGL_NAMESPACE::Widget UIWidget;
33 #endif
34 
35 #ifdef DGL_CAIRO
36 # include "Cairo.hpp"
37 #endif
38 #ifdef DGL_OPENGL
39 # include "OpenGL.hpp"
40 #endif
41 
42 START_NAMESPACE_DISTRHO
43 
44 /* ------------------------------------------------------------------------------------------------------------
45  * DPF UI */
46 
47 /**
48  @addtogroup MainClasses
49  @{
50  */
51 
52 /**
53  DPF UI class from where UI instances are created.
54 
55  @note You must call setSize during construction,
56  @TODO Detailed information about this class.
57  */
58 class UI : public UIWidget
59 {
60 public:
61  /**
62  UI class constructor.
63  The UI should be initialized to a default state that matches the plugin side.
64  */
65  UI(uint width = 0, uint height = 0);
66 
67  /**
68  Destructor.
69  */
70  virtual ~UI();
71 
72 #if DISTRHO_UI_USER_RESIZABLE && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI
73  /**
74  Set geometry constraints for the UI when resized by the user, and optionally scale UI automatically.
75  @see Window::setGeometryConstraints(uint,uint,bool)
76  @see Window::setScaling(double)
77  */
78  void setGeometryConstraints(uint minWidth, uint minHeight, bool keepAspectRatio, bool automaticallyScale = false);
79 #endif
80 
81  /* --------------------------------------------------------------------------------------------------------
82  * Host state */
83 
84  /**
85  Get the current sample rate used in plugin processing.
86  @see sampleRateChanged(double)
87  */
88  double getSampleRate() const noexcept;
89 
90  /**
91  editParameter.
92 
93  Touch/pressed-down event.
94  Lets the host know the user is tweaking a parameter.
95  Required in some hosts to record automation.
96  */
97  void editParameter(uint32_t index, bool started);
98 
99  /**
100  setParameterValue.
101 
102  Change a parameter value in the Plugin.
103  */
104  void setParameterValue(uint32_t index, float value);
105 
106 #if DISTRHO_PLUGIN_WANT_STATE
107  /**
108  setState.
109  @TODO Document this.
110  */
111  void setState(const char* key, const char* value);
112 #endif
113 
114 #if DISTRHO_PLUGIN_WANT_MIDI_INPUT
115  /**
116  sendNote.
117  @TODO Document this.
118  @note Work in progress. Implemented for DSSI and LV2 formats.
119  */
120  void sendNote(uint8_t channel, uint8_t note, uint8_t velocity);
121 #endif
122 
123 #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS
124  /* --------------------------------------------------------------------------------------------------------
125  * Direct DSP access - DO NOT USE THIS UNLESS STRICTLY NECESSARY!! */
126 
127  /**
128  getPluginInstancePointer.
129  @TODO Document this.
130  */
131  void* getPluginInstancePointer() const noexcept;
132 #endif
133 
134 #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI
135  /* --------------------------------------------------------------------------------------------------------
136  * External UI helpers */
137 
138  /**
139  Get the bundle path that will be used for the next UI.
140  @note: This function is only valid during createUI(),
141  it will return null when called from anywhere else.
142  */
143  static const char* getNextBundlePath() noexcept;
144 
145  /**
146  Get the scale factor that will be used for the next UI.
147  @note: This function is only valid during createUI(),
148  it will return 1.0 when called from anywhere else.
149  */
150  static double getNextScaleFactor() noexcept;
151 
152 # if DISTRHO_PLUGIN_HAS_EMBED_UI
153  /**
154  Get the Window Id that will be used for the next created window.
155  @note: This function is only valid during createUI(),
156  it will return 0 when called from anywhere else.
157  */
158  static uintptr_t getNextWindowId() noexcept;
159 # endif
160 #endif
161 
162 protected:
163  /* --------------------------------------------------------------------------------------------------------
164  * DSP/Plugin Callbacks */
165 
166  /**
167  A parameter has changed on the plugin side.@n
168  This is called by the host to inform the UI about parameter changes.
169  */
170  virtual void parameterChanged(uint32_t index, float value) = 0;
171 
172 #if DISTRHO_PLUGIN_WANT_PROGRAMS
173  /**
174  A program has been loaded on the plugin side.@n
175  This is called by the host to inform the UI about program changes.
176  */
177  virtual void programLoaded(uint32_t index) = 0;
178 #endif
179 
180 #if DISTRHO_PLUGIN_WANT_STATE
181  /**
182  A state has changed on the plugin side.@n
183  This is called by the host to inform the UI about state changes.
184  */
185  virtual void stateChanged(const char* key, const char* value) = 0;
186 #endif
187 
188  /* --------------------------------------------------------------------------------------------------------
189  * DSP/Plugin Callbacks (optional) */
190 
191  /**
192  Optional callback to inform the UI about a sample rate change on the plugin side.
193  @see getSampleRate()
194  */
195  virtual void sampleRateChanged(double newSampleRate);
196 
197 #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI
198  /* --------------------------------------------------------------------------------------------------------
199  * UI Callbacks (optional) */
200 
201  /**
202  uiIdle.
203  @TODO Document this.
204  */
205  virtual void uiIdle() {}
206 
207 # ifndef DGL_FILE_BROWSER_DISABLED
208  /**
209  File browser selected function.
210  @see Window::fileBrowserSelected(const char*)
211  */
212  virtual void uiFileBrowserSelected(const char* filename);
213 # endif
214 
215  /**
216  OpenGL window reshape function, called when parent window is resized.
217  You can reimplement this function for a custom OpenGL state.
218  @see Window::onReshape(uint,uint)
219  */
220  virtual void uiReshape(uint width, uint height);
221 
222  /* --------------------------------------------------------------------------------------------------------
223  * UI Resize Handling, internal */
224 
225  /**
226  OpenGL widget resize function, called when the widget is resized.
227  This is overriden here so the host knows when the UI is resized by you.
228  @see Widget::onResize(const ResizeEvent&)
229  */
230  void onResize(const ResizeEvent& ev) override;
231 #endif
232 
233  // -------------------------------------------------------------------------------------------------------
234 
235 private:
236  struct PrivateData;
237  PrivateData* const pData;
238  friend class UIExporter;
239  friend class UIExporterWindow;
240 
241 #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI
242  // these should not be used
243  void setAbsoluteX(int) const noexcept {}
244  void setAbsoluteY(int) const noexcept {}
245  void setAbsolutePos(int, int) const noexcept {}
246  void setAbsolutePos(const DGL_NAMESPACE::Point<int>&) const noexcept {}
247 #endif
248 
249  DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(UI)
250 };
251 
252 /** @} */
253 
254 /* ------------------------------------------------------------------------------------------------------------
255  * Create UI, entry point */
256 
257 /**
258  @addtogroup EntryPoints
259  @{
260  */
261 
262 /**
263  createUI.
264  @TODO Document this.
265  */
266 extern UI* createUI();
267 
268 /** @} */
269 
270 // -----------------------------------------------------------------------------------------------------------
271 
272 END_NAMESPACE_DISTRHO
273 
274 #endif // DISTRHO_UI_HPP_INCLUDED
void editParameter(uint32_t index, bool started)
virtual void parameterChanged(uint32_t index, float value)=0
static uintptr_t getNextWindowId() noexcept
static double getNextScaleFactor() noexcept
virtual ~UI()
void setParameterValue(uint32_t index, float value)
void * getPluginInstancePointer() const noexcept
virtual void sampleRateChanged(double newSampleRate)
virtual void programLoaded(uint32_t index)=0
void sendNote(uint8_t channel, uint8_t note, uint8_t velocity)
UI(uint width=0, uint height=0)
static const char * getNextBundlePath() noexcept
UI * createUI()
virtual void stateChanged(const char *key, const char *value)=0
double getSampleRate() const noexcept
void setState(const char *key, const char *value)
Definition: DistrhoUI.hpp:58