Signed-off-by: falkTX <falktx@falktx.com>pull/148/head
| @@ -77,7 +77,7 @@ public: | |||
| explicit Window(Application& app); | |||
| explicit Window(Application& app, Window& parent); | |||
| explicit Window(Application& app, intptr_t parentId, bool resizable); | |||
| explicit Window(Application& app, intptr_t parentId, double scaling, bool resizable); | |||
| virtual ~Window(); | |||
| void show(); | |||
| @@ -113,7 +113,6 @@ public: | |||
| void setTransientWinId(uintptr_t winId); | |||
| double getScaling() const noexcept; | |||
| void setScaling(double scaling) noexcept; | |||
| bool getIgnoringKeyRepeat() const noexcept; | |||
| void setIgnoringKeyRepeat(bool ignore) noexcept; | |||
| @@ -136,6 +135,9 @@ protected: | |||
| virtual void fileBrowserSelected(const char* filename); | |||
| #endif | |||
| // internal | |||
| void _setAutoScaling(double scaling) noexcept; | |||
| private: | |||
| struct PrivateData; | |||
| PrivateData* const pData; | |||
| @@ -93,6 +93,7 @@ struct Window::PrivateData { | |||
| fWidth(1), | |||
| fHeight(1), | |||
| fScaling(1.0), | |||
| fAutoScaling(1.0), | |||
| fTitle(nullptr), | |||
| fWidgets(), | |||
| fModal(), | |||
| @@ -124,6 +125,7 @@ struct Window::PrivateData { | |||
| fWidth(1), | |||
| fHeight(1), | |||
| fScaling(1.0), | |||
| fAutoScaling(1.0), | |||
| fTitle(nullptr), | |||
| fWidgets(), | |||
| fModal(parent.pData), | |||
| @@ -156,7 +158,7 @@ struct Window::PrivateData { | |||
| #endif | |||
| } | |||
| PrivateData(Application& app, Window* const self, const intptr_t parentId, const bool resizable) | |||
| PrivateData(Application& app, Window* const self, const intptr_t parentId, const double scaling, const bool resizable) | |||
| : fApp(app), | |||
| fSelf(self), | |||
| fView(puglInit()), | |||
| @@ -166,7 +168,8 @@ struct Window::PrivateData { | |||
| fUsingEmbed(parentId != 0), | |||
| fWidth(1), | |||
| fHeight(1), | |||
| fScaling(1.0), | |||
| fScaling(scaling), | |||
| fAutoScaling(1.0), | |||
| fTitle(nullptr), | |||
| fWidgets(), | |||
| fModal(), | |||
| @@ -565,6 +568,7 @@ struct Window::PrivateData { | |||
| void setGeometryConstraints(uint width, uint height, bool aspect) | |||
| { | |||
| // Did you forget to set DISTRHO_UI_USER_RESIZABLE ? | |||
| DISTRHO_SAFE_ASSERT_RETURN(fResizable,); | |||
| fView->min_width = width; | |||
| @@ -711,11 +715,12 @@ struct Window::PrivateData { | |||
| return fScaling; | |||
| } | |||
| void setScaling(double scaling) noexcept | |||
| void setAutoScaling(const double scaling) noexcept | |||
| { | |||
| DISTRHO_SAFE_ASSERT_RETURN(scaling > 0.0,); | |||
| d_stdout("setAutoScaling called with %f", scaling); | |||
| fScaling = scaling; | |||
| fAutoScaling = scaling; | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| @@ -783,7 +788,7 @@ struct Window::PrivateData { | |||
| FOR_EACH_WIDGET(it) | |||
| { | |||
| Widget* const widget(*it); | |||
| widget->pData->display(fWidth, fHeight, fScaling, false); | |||
| widget->pData->display(fWidth, fHeight, fAutoScaling, false); | |||
| } | |||
| fSelf->onDisplayAfter(); | |||
| @@ -853,8 +858,8 @@ struct Window::PrivateData { | |||
| if (fModal.childFocus != nullptr) | |||
| return fModal.childFocus->focus(); | |||
| x /= fScaling; | |||
| y /= fScaling; | |||
| x /= fAutoScaling; | |||
| y /= fAutoScaling; | |||
| Widget::MouseEvent ev; | |||
| ev.button = button; | |||
| @@ -880,8 +885,8 @@ struct Window::PrivateData { | |||
| if (fModal.childFocus != nullptr) | |||
| return; | |||
| x /= fScaling; | |||
| y /= fScaling; | |||
| x /= fAutoScaling; | |||
| y /= fAutoScaling; | |||
| Widget::MotionEvent ev; | |||
| ev.mod = static_cast<Modifier>(puglGetModifiers(fView)); | |||
| @@ -905,10 +910,10 @@ struct Window::PrivateData { | |||
| if (fModal.childFocus != nullptr) | |||
| return; | |||
| x /= fScaling; | |||
| y /= fScaling; | |||
| dx /= fScaling; | |||
| dy /= fScaling; | |||
| x /= fAutoScaling; | |||
| y /= fAutoScaling; | |||
| dx /= fAutoScaling; | |||
| dy /= fAutoScaling; | |||
| Widget::ScrollEvent ev; | |||
| ev.delta = Point<float>(dx, dy); | |||
| @@ -1060,6 +1065,7 @@ struct Window::PrivateData { | |||
| uint fWidth; | |||
| uint fHeight; | |||
| double fScaling; | |||
| double fAutoScaling; | |||
| char* fTitle; | |||
| std::list<Widget*> fWidgets; | |||
| @@ -1166,8 +1172,8 @@ Window::Window(Application& app) | |||
| Window::Window(Application& app, Window& parent) | |||
| : pData(new PrivateData(app, this, parent)) {} | |||
| Window::Window(Application& app, intptr_t parentId, bool resizable) | |||
| : pData(new PrivateData(app, this, parentId, resizable)) {} | |||
| Window::Window(Application& app, intptr_t parentId, double scaling, bool resizable) | |||
| : pData(new PrivateData(app, this, parentId, scaling, resizable)) {} | |||
| Window::~Window() | |||
| { | |||
| @@ -1358,11 +1364,6 @@ double Window::getScaling() const noexcept | |||
| return pData->getScaling(); | |||
| } | |||
| void Window::setScaling(double scaling) noexcept | |||
| { | |||
| pData->setScaling(scaling); | |||
| } | |||
| bool Window::getIgnoringKeyRepeat() const noexcept | |||
| { | |||
| return pData->getIgnoringKeyRepeat(); | |||
| @@ -1392,6 +1393,11 @@ const GraphicsContext& Window::getGraphicsContext() const noexcept | |||
| return context; | |||
| } | |||
| void Window::_setAutoScaling(double scaling) noexcept | |||
| { | |||
| pData->setAutoScaling(scaling); | |||
| } | |||
| void Window::_addWidget(Widget* const widget) | |||
| { | |||
| pData->addWidget(widget); | |||
| @@ -69,7 +69,7 @@ public: | |||
| */ | |||
| virtual ~UI(); | |||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| #if DISTRHO_UI_USER_RESIZABLE && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| /** | |||
| Set geometry constraints for the UI when resized by the user, and optionally scale UI automatically. | |||
| @see Window::setGeometryConstraints(uint,uint,bool) | |||
| @@ -138,6 +138,13 @@ public: | |||
| */ | |||
| static const char* getNextBundlePath() noexcept; | |||
| /** | |||
| Get the scale factor that will be used for the next UI. | |||
| @note: This function is only valid during createUI(), | |||
| it will return null when called from anywhere else. | |||
| */ | |||
| static double getNextScaleFactor() noexcept; | |||
| # if DISTRHO_PLUGIN_HAS_EMBED_UI | |||
| /** | |||
| Get the Window Id that will be used for the next created window. | |||
| @@ -81,6 +81,16 @@ static void initSignalHandler() | |||
| // ----------------------------------------------------------------------- | |||
| #if DISTRHO_PLUGIN_HAS_UI | |||
| // TODO | |||
| static double getDesktopScaleFactor() noexcept | |||
| { | |||
| return 1.0; | |||
| } | |||
| #endif | |||
| // ----------------------------------------------------------------------- | |||
| #if DISTRHO_PLUGIN_HAS_UI | |||
| class PluginJack : public IdleCallback | |||
| #else | |||
| @@ -91,7 +101,7 @@ public: | |||
| PluginJack(jack_client_t* const client) | |||
| : fPlugin(this, writeMidiCallback), | |||
| #if DISTRHO_PLUGIN_HAS_UI | |||
| fUI(this, 0, nullptr, setParameterValueCallback, setStateCallback, nullptr, setSizeCallback, fPlugin.getInstancePointer()), | |||
| fUI(this, 0, nullptr, setParameterValueCallback, setStateCallback, nullptr, setSizeCallback, getDesktopScaleFactor(), fPlugin.getInstancePointer()), | |||
| #endif | |||
| fClient(client) | |||
| { | |||
| @@ -161,12 +161,12 @@ public: | |||
| class UIVst | |||
| { | |||
| public: | |||
| UIVst(const audioMasterCallback audioMaster, AEffect* const effect, ParameterCheckHelper* const uiHelper, PluginExporter* const plugin, const intptr_t winId) | |||
| UIVst(const audioMasterCallback audioMaster, AEffect* const effect, ParameterCheckHelper* const uiHelper, PluginExporter* const plugin, const intptr_t winId, const float scaleFactor) | |||
| : fAudioMaster(audioMaster), | |||
| fEffect(effect), | |||
| fUiHelper(uiHelper), | |||
| fPlugin(plugin), | |||
| fUI(this, winId, editParameterCallback, setParameterCallback, setStateCallback, sendNoteCallback, setSizeCallback, plugin->getInstancePointer()), | |||
| fUI(this, winId, editParameterCallback, setParameterCallback, setStateCallback, sendNoteCallback, setSizeCallback, scaleFactor, plugin->getInstancePointer()), | |||
| fShouldCaptureVstKeys(false) | |||
| { | |||
| // FIXME only needed for windows? | |||
| @@ -575,8 +575,11 @@ public: | |||
| else | |||
| { | |||
| d_lastUiSampleRate = fPlugin.getSampleRate(); | |||
| // TODO | |||
| const float scaleFactor = 1.0f; | |||
| UIExporter tmpUI(nullptr, 0, nullptr, nullptr, nullptr, nullptr, nullptr, fPlugin.getInstancePointer()); | |||
| UIExporter tmpUI(nullptr, 0, nullptr, nullptr, nullptr, nullptr, nullptr, scaleFactor, fPlugin.getInstancePointer()); | |||
| fVstRect.right = tmpUI.getWidth(); | |||
| fVstRect.bottom = tmpUI.getHeight(); | |||
| tmpUI.quit(); | |||
| @@ -595,8 +598,11 @@ public: | |||
| } | |||
| # endif | |||
| d_lastUiSampleRate = fPlugin.getSampleRate(); | |||
| // TODO | |||
| const float scaleFactor = 1.0f; | |||
| fVstUI = new UIVst(fAudioMaster, fEffect, this, &fPlugin, (intptr_t)ptr); | |||
| fVstUI = new UIVst(fAudioMaster, fEffect, this, &fPlugin, (intptr_t)ptr, scaleFactor); | |||
| # if DISTRHO_PLUGIN_WANT_FULL_STATE | |||
| // Update current state from plugin side | |||
| @@ -27,8 +27,9 @@ START_NAMESPACE_DISTRHO | |||
| double d_lastUiSampleRate = 0.0; | |||
| void* d_lastUiDspPtr = nullptr; | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| uintptr_t g_nextWindowId = 0; | |||
| const char* g_nextBundlePath = nullptr; | |||
| double g_nextScaleFactor = 1.0; | |||
| uintptr_t g_nextWindowId = 0; | |||
| #else | |||
| Window* d_lastUiWindow = nullptr; | |||
| #endif | |||
| @@ -57,7 +58,7 @@ UI::~UI() | |||
| delete pData; | |||
| } | |||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| #if DISTRHO_UI_USER_RESIZABLE && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| void UI::setGeometryConstraints(uint minWidth, uint minHeight, bool keepAspectRatio, bool automaticallyScale) | |||
| { | |||
| DISTRHO_SAFE_ASSERT_RETURN(minWidth > 0,); | |||
| @@ -67,7 +68,13 @@ void UI::setGeometryConstraints(uint minWidth, uint minHeight, bool keepAspectRa | |||
| pData->minWidth = minWidth; | |||
| pData->minHeight = minHeight; | |||
| getParentWindow().setGeometryConstraints(minWidth, minHeight, keepAspectRatio); | |||
| Window& window(getParentWindow()); | |||
| const double uiScaleFactor = window.getScaling(); | |||
| window.setGeometryConstraints(minWidth * uiScaleFactor, minHeight * uiScaleFactor, keepAspectRatio); | |||
| if (d_isNotZero(uiScaleFactor - 1.0)) | |||
| setSize(getWidth() * uiScaleFactor, getHeight() * uiScaleFactor); | |||
| } | |||
| #endif | |||
| @@ -122,6 +129,11 @@ const char* UI::getNextBundlePath() noexcept | |||
| return g_nextBundlePath; | |||
| } | |||
| double UI::getNextScaleFactor() noexcept | |||
| { | |||
| return g_nextScaleFactor; | |||
| } | |||
| # if DISTRHO_PLUGIN_HAS_EMBED_UI | |||
| uintptr_t UI::getNextWindowId() noexcept | |||
| { | |||
| @@ -37,11 +37,13 @@ START_NAMESPACE_DISTRHO | |||
| extern double d_lastUiSampleRate; | |||
| extern void* d_lastUiDspPtr; | |||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| extern const char* g_nextBundlePath; | |||
| extern double g_nextScaleFactor; | |||
| extern uintptr_t g_nextWindowId; | |||
| #else | |||
| extern Window* d_lastUiWindow; | |||
| #endif | |||
| extern uintptr_t g_nextWindowId; | |||
| extern const char* g_nextBundlePath; | |||
| // ----------------------------------------------------------------------- | |||
| // UI callbacks | |||
| @@ -149,15 +151,17 @@ struct UI::PrivateData { | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| static inline | |||
| UI* createUiWrapper(void* const dspPtr, const uintptr_t winId, const char* const bundlePath) | |||
| UI* createUiWrapper(void* const dspPtr, const uintptr_t winId, const double scaleFactor, const char* const bundlePath) | |||
| { | |||
| d_lastUiDspPtr = dspPtr; | |||
| g_nextWindowId = winId; | |||
| g_nextBundlePath = bundlePath; | |||
| UI* const ret = createUI(); | |||
| d_lastUiDspPtr = nullptr; | |||
| g_nextWindowId = 0; | |||
| g_nextBundlePath = nullptr; | |||
| d_lastUiDspPtr = dspPtr; | |||
| g_nextWindowId = winId; | |||
| g_nextScaleFactor = scaleFactor; | |||
| g_nextBundlePath = bundlePath; | |||
| UI* const ret = createUI(); | |||
| d_lastUiDspPtr = nullptr; | |||
| g_nextWindowId = 0; | |||
| g_nextScaleFactor = 1.0; | |||
| g_nextBundlePath = nullptr; | |||
| return ret; | |||
| } | |||
| #else // DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| @@ -175,8 +179,8 @@ UI* createUiWrapper(void* const dspPtr, Window* const window) | |||
| class UIExporterWindow : public Window | |||
| { | |||
| public: | |||
| UIExporterWindow(Application& app, const intptr_t winId, void* const dspPtr) | |||
| : Window(app, winId, DISTRHO_UI_USER_RESIZABLE), | |||
| UIExporterWindow(Application& app, const intptr_t winId, const double scaleFactor, void* const dspPtr) | |||
| : Window(app, winId, scaleFactor, DISTRHO_UI_USER_RESIZABLE), | |||
| fUI(createUiWrapper(dspPtr, this)), | |||
| fIsReady(false) | |||
| { | |||
| @@ -214,7 +218,7 @@ protected: | |||
| { | |||
| const double scaleHorizontal = static_cast<double>(width) / static_cast<double>(pData->minWidth); | |||
| const double scaleVertical = static_cast<double>(height) / static_cast<double>(pData->minHeight); | |||
| setScaling(scaleHorizontal < scaleVertical ? scaleHorizontal : scaleVertical); | |||
| _setAutoScaling(scaleHorizontal < scaleVertical ? scaleHorizontal : scaleVertical); | |||
| } | |||
| pData->resizeInProgress = true; | |||
| @@ -254,13 +258,14 @@ public: | |||
| const setStateFunc setStateCall, | |||
| const sendNoteFunc sendNoteCall, | |||
| const setSizeFunc setSizeCall, | |||
| const float scaleFactor = 1.0f, | |||
| void* const dspPtr = nullptr, | |||
| const char* const bundlePath = nullptr) | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| : fUI(createUiWrapper(dspPtr, winId, bundlePath)), | |||
| : fUI(createUiWrapper(dspPtr, winId, scaleFactor, bundlePath)), | |||
| #else | |||
| : glApp(), | |||
| glWindow(glApp, winId, dspPtr), | |||
| glWindow(glApp, winId, scaleFactor, dspPtr), | |||
| fChangingSize(false), | |||
| fUI(glWindow.getUI()), | |||
| #endif | |||
| @@ -53,8 +53,8 @@ public: | |||
| UiLv2(const char* const bundlePath, const intptr_t winId, | |||
| const LV2_Options_Option* options, const LV2_URID_Map* const uridMap, const LV2UI_Resize* const uiResz, const LV2UI_Touch* uiTouch, | |||
| const LV2UI_Controller controller, const LV2UI_Write_Function writeFunc, | |||
| LV2UI_Widget* const widget, void* const dspPtr) | |||
| : fUI(this, winId, editParameterCallback, setParameterCallback, setStateCallback, sendNoteCallback, setSizeCallback, dspPtr, bundlePath), | |||
| const float scaleFactor, LV2UI_Widget* const widget, void* const dspPtr) | |||
| : fUI(this, winId, editParameterCallback, setParameterCallback, setStateCallback, sendNoteCallback, setSizeCallback, scaleFactor, dspPtr, bundlePath), | |||
| fUridMap(uridMap), | |||
| fUiResize(uiResz), | |||
| fUiTouch(uiTouch), | |||
| @@ -434,22 +434,30 @@ static LV2UI_Handle lv2ui_instantiate(const LV2UI_Descriptor*, const char* uri, | |||
| } | |||
| #endif | |||
| float scaleFactor = 1.0f; | |||
| const intptr_t winId((intptr_t)parentId); | |||
| if (options != nullptr) | |||
| { | |||
| const LV2_URID uridAtomFloat(uridMap->map(uridMap->handle, LV2_ATOM__Float)); | |||
| const LV2_URID uridSampleRate(uridMap->map(uridMap->handle, LV2_PARAMETERS__sampleRate)); | |||
| const LV2_URID uridScaleFactor(uridMap->map(uridMap->handle, "urn:carla:scale")); | |||
| for (int i=0; options[i].key != 0; ++i) | |||
| { | |||
| if (options[i].key == uridSampleRate) | |||
| /**/ if (options[i].key == uridSampleRate) | |||
| { | |||
| if (options[i].type == uridMap->map(uridMap->handle, LV2_ATOM__Float)) | |||
| if (options[i].type == uridAtomFloat) | |||
| d_lastUiSampleRate = *(const float*)options[i].value; | |||
| else | |||
| d_stderr("Host provides UI sample-rate but has wrong value type"); | |||
| break; | |||
| } | |||
| else if (options[i].key == uridScaleFactor) | |||
| { | |||
| if (options[i].type == uridAtomFloat) | |||
| scaleFactor = *(const float*)options[i].value; | |||
| else | |||
| d_stderr("Host provides UI scale factor but has wrong value type"); | |||
| } | |||
| } | |||
| } | |||
| @@ -460,7 +468,7 @@ static LV2UI_Handle lv2ui_instantiate(const LV2UI_Descriptor*, const char* uri, | |||
| d_lastUiSampleRate = 44100.0; | |||
| } | |||
| return new UiLv2(bundlePath, winId, options, uridMap, uiResize, uiTouch, controller, writeFunction, widget, instance); | |||
| return new UiLv2(bundlePath, winId, options, uridMap, uiResize, uiTouch, controller, writeFunction, scaleFactor, widget, instance); | |||
| } | |||
| #define uiPtr ((UiLv2*)ui) | |||
| @@ -43,6 +43,7 @@ public: | |||
| fOutLeft(0.0f), | |||
| fOutRight(0.0f) | |||
| { | |||
| setGeometryConstraints(32, 128, false); | |||
| } | |||
| protected: | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * DISTRHO Plugin Framework (DPF) | |||
| * Copyright (C) 2012-2014 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2012-2019 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
| * or without fee is hereby granted, provided that the above copyright notice and this | |||
| @@ -26,5 +26,6 @@ | |||
| #define DISTRHO_PLUGIN_NUM_INPUTS 2 | |||
| #define DISTRHO_PLUGIN_NUM_OUTPUTS 2 | |||
| #define DISTRHO_PLUGIN_WANT_PROGRAMS 1 | |||
| #define DISTRHO_UI_USER_RESIZABLE 1 | |||
| #endif // DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * DISTRHO Plugin Framework (DPF) | |||
| * Copyright (C) 2012-2014 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2012-2019 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
| * or without fee is hereby granted, provided that the above copyright notice and this | |||
| @@ -28,21 +28,18 @@ using DGL::Rectangle; | |||
| class ExampleUIParameters : public UI | |||
| { | |||
| public: | |||
| /** | |||
| For simplicity this UI will be of constant size. | |||
| */ | |||
| static const int kUIWidth = 512; | |||
| static const int kUIHeight = 512; | |||
| /* constructor */ | |||
| ExampleUIParameters() | |||
| : UI(kUIWidth, kUIHeight) | |||
| : UI(512, 512) | |||
| { | |||
| /** | |||
| Initialize all our parameters to their defaults. | |||
| In this example all default values are false, so we can simply zero them. | |||
| */ | |||
| std::memset(fParamGrid, 0, sizeof(bool)*9); | |||
| // TODO explain why this is here | |||
| setGeometryConstraints(128, 128, true); | |||
| } | |||
| protected: | |||
| @@ -105,15 +102,18 @@ protected: | |||
| */ | |||
| void onDisplay() override | |||
| { | |||
| const uint width = getWidth(); | |||
| const uint height = getHeight(); | |||
| Rectangle<int> r; | |||
| r.setWidth(kUIWidth/3 - 6); | |||
| r.setHeight(kUIHeight/3 - 6); | |||
| r.setWidth(width/3 - 6); | |||
| r.setHeight(height/3 - 6); | |||
| // draw left, center and right columns | |||
| for (int i=0; i<3; ++i) | |||
| { | |||
| r.setX(3 + i*kUIWidth/3); | |||
| r.setX(3 + i*width/3); | |||
| // top | |||
| r.setY(3); | |||
| @@ -126,7 +126,7 @@ protected: | |||
| r.draw(); | |||
| // middle | |||
| r.setY(3 + kUIHeight/3); | |||
| r.setY(3 + height/3); | |||
| if (fParamGrid[3+i]) | |||
| glColor3f(0.8f, 0.5f, 0.3f); | |||
| @@ -136,7 +136,7 @@ protected: | |||
| r.draw(); | |||
| // bottom | |||
| r.setY(3 + kUIHeight*2/3); | |||
| r.setY(3 + height*2/3); | |||
| if (fParamGrid[6+i]) | |||
| glColor3f(0.8f, 0.5f, 0.3f); | |||
| @@ -157,15 +157,18 @@ protected: | |||
| if (ev.button != 1 || ! ev.press) | |||
| return false; | |||
| const uint width = getWidth(); | |||
| const uint height = getHeight(); | |||
| Rectangle<int> r; | |||
| r.setWidth(kUIWidth/3 - 6); | |||
| r.setHeight(kUIHeight/3 - 6); | |||
| r.setWidth(width/3 - 6); | |||
| r.setHeight(height/3 - 6); | |||
| // handle left, center and right columns | |||
| for (int i=0; i<3; ++i) | |||
| { | |||
| r.setX(3 + i*kUIWidth/3); | |||
| r.setX(3 + i*width/3); | |||
| // top | |||
| r.setY(3); | |||
| @@ -187,7 +190,7 @@ protected: | |||
| } | |||
| // middle | |||
| r.setY(3 + kUIHeight/3); | |||
| r.setY(3 + height/3); | |||
| if (r.contains(ev.pos)) | |||
| { | |||
| @@ -200,7 +203,7 @@ protected: | |||
| } | |||
| // bottom | |||
| r.setY(3 + kUIHeight*2/3); | |||
| r.setY(3 + height*2/3); | |||
| if (r.contains(ev.pos)) | |||
| { | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * DISTRHO Plugin Framework (DPF) | |||
| * Copyright (C) 2012-2014 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2012-2019 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
| * or without fee is hereby granted, provided that the above copyright notice and this | |||
| @@ -21,12 +21,13 @@ | |||
| #define DISTRHO_PLUGIN_NAME "States" | |||
| #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/examples/States" | |||
| #define DISTRHO_PLUGIN_HAS_UI 1 | |||
| #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | |||
| #define DISTRHO_PLUGIN_NUM_INPUTS 2 | |||
| #define DISTRHO_PLUGIN_NUM_OUTPUTS 2 | |||
| #define DISTRHO_PLUGIN_WANT_PROGRAMS 1 | |||
| #define DISTRHO_PLUGIN_WANT_STATE 1 | |||
| #define DISTRHO_PLUGIN_HAS_UI 1 | |||
| #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | |||
| #define DISTRHO_PLUGIN_NUM_INPUTS 2 | |||
| #define DISTRHO_PLUGIN_NUM_OUTPUTS 2 | |||
| #define DISTRHO_PLUGIN_WANT_PROGRAMS 1 | |||
| #define DISTRHO_PLUGIN_WANT_STATE 1 | |||
| #define DISTRHO_PLUGIN_WANT_FULL_STATE 1 | |||
| #define DISTRHO_UI_USER_RESIZABLE 1 | |||
| #endif // DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * DISTRHO Plugin Framework (DPF) | |||
| * Copyright (C) 2012-2014 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2012-2019 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
| * or without fee is hereby granted, provided that the above copyright notice and this | |||
| @@ -23,12 +23,6 @@ START_NAMESPACE_DISTRHO | |||
| class ExampleUIParameters : public UI | |||
| { | |||
| public: | |||
| /** | |||
| For simplicity this UI will be of constant size. | |||
| */ | |||
| static const int kUIWidth = 512; | |||
| static const int kUIHeight = 512; | |||
| /** | |||
| Get key name from an index. | |||
| */ | |||
| @@ -52,14 +46,15 @@ public: | |||
| /* constructor */ | |||
| ExampleUIParameters() | |||
| : UI() | |||
| : UI(512, 512) | |||
| { | |||
| /** | |||
| Initialize the grid to all off per default. | |||
| */ | |||
| std::memset(fParamGrid, 0, sizeof(bool)*9); | |||
| setSize(kUIWidth, kUIHeight); | |||
| // TODO explain why this is here | |||
| setGeometryConstraints(128, 128, true); | |||
| } | |||
| protected: | |||
| @@ -77,8 +72,6 @@ protected: | |||
| */ | |||
| void programLoaded(uint32_t index) override | |||
| { | |||
| d_stdout("UI programLoaded %i", index); | |||
| switch (index) | |||
| { | |||
| case 0: | |||
| @@ -148,15 +141,18 @@ protected: | |||
| */ | |||
| void onDisplay() override | |||
| { | |||
| const uint width = getWidth(); | |||
| const uint height = getHeight(); | |||
| Rectangle<int> r; | |||
| r.setWidth(kUIWidth/3 - 6); | |||
| r.setHeight(kUIHeight/3 - 6); | |||
| r.setWidth(width/3 - 6); | |||
| r.setHeight(height/3 - 6); | |||
| // draw left, center and right columns | |||
| for (int i=0; i<3; ++i) | |||
| { | |||
| r.setX(3 + i*kUIWidth/3); | |||
| r.setX(3 + i*width/3); | |||
| // top | |||
| r.setY(3); | |||
| @@ -169,7 +165,7 @@ protected: | |||
| r.draw(); | |||
| // middle | |||
| r.setY(3 + kUIHeight/3); | |||
| r.setY(3 + height/3); | |||
| if (fParamGrid[3+i]) | |||
| glColor3f(0.8f, 0.5f, 0.3f); | |||
| @@ -179,7 +175,7 @@ protected: | |||
| r.draw(); | |||
| // bottom | |||
| r.setY(3 + kUIHeight*2/3); | |||
| r.setY(3 + height*2/3); | |||
| if (fParamGrid[6+i]) | |||
| glColor3f(0.8f, 0.5f, 0.3f); | |||
| @@ -200,15 +196,18 @@ protected: | |||
| if (ev.button != 1 || ! ev.press) | |||
| return false; | |||
| const uint width = getWidth(); | |||
| const uint height = getHeight(); | |||
| Rectangle<int> r; | |||
| r.setWidth(kUIWidth/3 - 6); | |||
| r.setHeight(kUIHeight/3 - 6); | |||
| r.setWidth(width/3 - 6); | |||
| r.setHeight(height/3 - 6); | |||
| // handle left, center and right columns | |||
| for (int i=0; i<3; ++i) | |||
| { | |||
| r.setX(3 + i*kUIWidth/3); | |||
| r.setX(3 + i*width/3); | |||
| // top | |||
| r.setY(3); | |||
| @@ -230,7 +229,7 @@ protected: | |||
| } | |||
| // middle | |||
| r.setY(3 + kUIHeight/3); | |||
| r.setY(3 + height/3); | |||
| if (r.contains(ev.pos)) | |||
| { | |||
| @@ -243,7 +242,7 @@ protected: | |||
| } | |||
| // bottom | |||
| r.setY(3 + kUIHeight*2/3); | |||
| r.setY(3 + height*2/3); | |||
| if (r.contains(ev.pos)) | |||
| { | |||