DPF

DISTRHO Plugin Framework
Log | Files | Refs | Submodules | README | LICENSE

commit 638585dc744b575eeaca794dc02e1780fa35a6b1
parent aa6ada4eceda538197edea224922e19303cdd112
Author: falkTX <falktx@gmail.com>
Date:   Sun, 30 Sep 2018 12:30:07 +0200

Add option to automatically scale plugin UIs

Diffstat:
Mdistrho/DistrhoUI.hpp | 6+++---
Mdistrho/src/DistrhoUI.cpp | 11+++++++++--
Mdistrho/src/DistrhoUIInternal.hpp | 16+++++++++++++++-
3 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/distrho/DistrhoUI.hpp b/distrho/DistrhoUI.hpp @@ -62,11 +62,11 @@ public: virtual ~UI(); /** - Set geometry constraints for the UI when resized by the user. - This is a convenience function that calls getParentWindow().setGeometryConstraints() + Set geometry constraints for the UI when resized by the user, and optionally scale UI automatically. @see Window::setGeometryConstraints(uint,uint,bool) + @see Window::setScaling(double) */ - void setGeometryConstraints(uint minWidth, uint minHeight, bool keepAspectRatio); + void setGeometryConstraints(uint minWidth, uint minHeight, bool keepAspectRatio, bool automaticallyScale = false); /* -------------------------------------------------------------------------------------------------------- * Host state */ diff --git a/distrho/src/DistrhoUI.cpp b/distrho/src/DistrhoUI.cpp @@ -57,9 +57,16 @@ UI::~UI() delete pData; } -void UI::setGeometryConstraints(uint minWidth, uint minHeight, bool keepAspectRatio) +void UI::setGeometryConstraints(uint minWidth, uint minHeight, bool keepAspectRatio, bool automaticallyScale) { - return getParentWindow().setGeometryConstraints(minWidth, minHeight, keepAspectRatio); + DISTRHO_SAFE_ASSERT_RETURN(minWidth > 0,); + DISTRHO_SAFE_ASSERT_RETURN(minHeight > 0,); + + pData->automaticallyScale = automaticallyScale; + pData->minWidth = minWidth; + pData->minHeight = minHeight; + + getParentWindow().setGeometryConstraints(minWidth, minHeight, keepAspectRatio); } /* ------------------------------------------------------------------------------------------------------------ diff --git a/distrho/src/DistrhoUIInternal.hpp b/distrho/src/DistrhoUIInternal.hpp @@ -62,6 +62,9 @@ struct UI::PrivateData { // UI const bool userResizable; + bool automaticallyScale; + uint minWidth; + uint minHeight; // Callbacks void* callbacksPtr; @@ -71,13 +74,16 @@ struct UI::PrivateData { sendNoteFunc sendNoteCallbackFunc; setSizeFunc setSizeCallbackFunc; - PrivateData(bool resizable) noexcept + PrivateData(const bool resizable) noexcept : sampleRate(d_lastUiSampleRate), parameterOffset(0), #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS dspPtr(d_lastUiDspPtr), #endif userResizable(resizable), + automaticallyScale(false), + minWidth(0), + minHeight(0), callbacksPtr(nullptr), editParamCallbackFunc(nullptr), setParamCallbackFunc(nullptr), @@ -185,6 +191,14 @@ protected: void onReshape(uint width, uint height) override { DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(fUI->pData != nullptr,); + + if (fUI->pData->automaticallyScale) + { + const double scaleHorizontal = static_cast<double>(width) / static_cast<double>(fUI->pData->minWidth); + const double scaleVertical = static_cast<double>(height) / static_cast<double>(fUI->pData->minHeight); + setScaling(scaleHorizontal < scaleVertical ? scaleHorizontal : scaleVertical); + } fUI->setSize(width, height); fUI->uiReshape(width, height);