Browse Source

Handle scaling of plugins via host (TESTING)

Signed-off-by: falkTX <falktx@falktx.com>
pull/148/head
falkTX 4 years ago
parent
commit
2ed5e0a665
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
13 changed files with 162 additions and 101 deletions
  1. +4
    -2
      dgl/Window.hpp
  2. +26
    -20
      dgl/src/Window.cpp
  3. +8
    -1
      distrho/DistrhoUI.hpp
  4. +11
    -1
      distrho/src/DistrhoPluginJack.cpp
  5. +10
    -4
      distrho/src/DistrhoPluginVST.cpp
  6. +15
    -3
      distrho/src/DistrhoUI.cpp
  7. +21
    -16
      distrho/src/DistrhoUIInternal.hpp
  8. +15
    -7
      distrho/src/DistrhoUILV2.cpp
  9. +1
    -0
      examples/Meters/ExampleUIMeters.cpp
  10. +2
    -1
      examples/Parameters/DistrhoPluginInfo.h
  11. +21
    -18
      examples/Parameters/ExampleUIParameters.cpp
  12. +8
    -7
      examples/States/DistrhoPluginInfo.h
  13. +20
    -21
      examples/States/ExampleUIStates.cpp

+ 4
- 2
dgl/Window.hpp View File

@@ -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;


+ 26
- 20
dgl/src/Window.cpp View File

@@ -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);


+ 8
- 1
distrho/DistrhoUI.hpp View File

@@ -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.


+ 11
- 1
distrho/src/DistrhoPluginJack.cpp View File

@@ -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)
{


+ 10
- 4
distrho/src/DistrhoPluginVST.cpp View File

@@ -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


+ 15
- 3
distrho/src/DistrhoUI.cpp View File

@@ -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
{


+ 21
- 16
distrho/src/DistrhoUIInternal.hpp View File

@@ -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


+ 15
- 7
distrho/src/DistrhoUILV2.cpp View File

@@ -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)


+ 1
- 0
examples/Meters/ExampleUIMeters.cpp View File

@@ -43,6 +43,7 @@ public:
fOutLeft(0.0f),
fOutRight(0.0f)
{
setGeometryConstraints(32, 128, false);
}

protected:


+ 2
- 1
examples/Parameters/DistrhoPluginInfo.h View File

@@ -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

+ 21
- 18
examples/Parameters/ExampleUIParameters.cpp View File

@@ -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))
{


+ 8
- 7
examples/States/DistrhoPluginInfo.h View File

@@ -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

+ 20
- 21
examples/States/ExampleUIStates.cpp View File

@@ -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))
{


Loading…
Cancel
Save