gearmulator

Emulation of classic VA synths of the late 90s/2000s that are based on Motorola 56300 family DSPs
Log | Files | Refs | Submodules | README | LICENSE

commit 15462f577d4490e80cd348f6f8362a8c7f536879
parent 922b4856ec5d9d852d4e482864251841960e7220
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Sat,  1 Jun 2024 02:47:04 +0200

support multiple overlays and layout them next to each other

Diffstat:
Msource/jucePluginEditorLib/imagePool.h | 4+++-
Msource/jucePluginEditorLib/parameterOverlay.cpp | 64++++++++++++++++++++++++++++++++++++++++++++++++++--------------
Msource/jucePluginEditorLib/parameterOverlay.h | 5+++--
3 files changed, 56 insertions(+), 17 deletions(-)

diff --git a/source/jucePluginEditorLib/imagePool.h b/source/jucePluginEditorLib/imagePool.h @@ -17,7 +17,9 @@ namespace jucePluginEditorLib enum class Type { Lock, - Link + Link, + + Count }; using ImageData = std::pair<const char*, size_t>; // pointer to data, data size diff --git a/source/jucePluginEditorLib/parameterOverlay.cpp b/source/jucePluginEditorLib/parameterOverlay.cpp @@ -14,8 +14,10 @@ namespace jucePluginEditorLib ParameterOverlay::~ParameterOverlay() { - delete m_imageLock; setParameter(nullptr); + + for (const auto* image : m_images) + delete image; } void ParameterOverlay::onBind(const pluginLib::ParameterBinding::BoundParameter& _parameter) @@ -53,18 +55,20 @@ namespace jucePluginEditorLib return result; } - void ParameterOverlay::toggleOverlay(juce::DrawableImage*& _image, ImagePool::Type _type, bool _enable) const + void ParameterOverlay::toggleOverlay(ImagePool::Type _type, const bool _enable, float _opacity/* = 1.0f*/) { + juce::DrawableImage*& drawableImage = m_images[static_cast<uint32_t>(_type)]; + if(_enable) { const auto props = getOverlayProperties(); auto updatePosition = [&]() { - _image->setCentrePosition(static_cast<int>(props.position.x) + m_component->getPosition().x, static_cast<int>(props.position.y) + m_component->getPosition().y); + drawableImage->setCentrePosition(static_cast<int>(props.position.x) + m_component->getPosition().x, static_cast<int>(props.position.y) + m_component->getPosition().y); }; - if(!_image) + if(!drawableImage) { auto& editor = m_overlays.getEditor(); @@ -72,35 +76,67 @@ namespace jucePluginEditorLib if(image) { - _image = new juce::DrawableImage(*image); + drawableImage = new juce::DrawableImage(*image); // _image->setOverlayColour(props.color); // juce cannot do it, it does not multiply but replaced the color entirely - _image->setInterceptsMouseClicks(false, false); - _image->setAlwaysOnTop(true); + drawableImage->setInterceptsMouseClicks(false, false); + drawableImage->setAlwaysOnTop(true); - m_component->getParentComponent()->addAndMakeVisible(_image); + m_component->getParentComponent()->addAndMakeVisible(drawableImage); } } else { - _image->setVisible(true); + drawableImage->setVisible(true); } + drawableImage->setOpacity(_opacity); + updatePosition(); } - else if(_image) + else if(drawableImage) { - _image->setVisible(false); + drawableImage->setVisible(false); } } void ParameterOverlay::updateOverlays() { const auto isLocked = m_parameter != nullptr && m_parameter->isLocked(); - const auto isLinked = m_parameter != nullptr && (m_parameter->getLinkState() & pluginLib::Source); + const auto isLinkSource = m_parameter != nullptr && (m_parameter->getLinkState() & pluginLib::Source); + const auto isLinkTarget = m_parameter != nullptr && (m_parameter->getLinkState() & pluginLib::Target); + + const auto linkAlpha = isLinkSource ? 1.0f : 0.5f; + + toggleOverlay(ImagePool::Type::Lock, isLocked); + toggleOverlay(ImagePool::Type::Link, isLinkSource || isLinkTarget, linkAlpha); + + std::array<juce::DrawableImage*, OverlayCount> visibleOverlays; + + uint32_t count = 0; + int totalWidth = 0; + + for (auto* image : m_images) + { + if(image && image->isVisible()) + { + visibleOverlays[count++] = image; + totalWidth += image->getWidth(); + } + } + + if(count <= 1) + return; - toggleOverlay(m_imageLock, ImagePool::Type::Lock, isLocked); - toggleOverlay(m_imageLock, ImagePool::Type::Link, isLinked); + const auto avgWidth = totalWidth / count; + + int x = -(totalWidth >> 1) + (avgWidth>>1) + visibleOverlays[0]->getPosition().x; + + for(uint32_t i=0; i<count; ++i) + { + visibleOverlays[i]->setTopLeftPosition(x, visibleOverlays[i]->getPosition().y); + x += visibleOverlays[i]->getWidth(); + } } void ParameterOverlay::setParameter(pluginLib::Parameter* _parameter) diff --git a/source/jucePluginEditorLib/parameterOverlay.h b/source/jucePluginEditorLib/parameterOverlay.h @@ -16,6 +16,7 @@ namespace jucePluginEditorLib { public: static constexpr size_t InvalidListenerId = pluginLib::Event<int>::InvalidListenerId; + static constexpr uint32_t OverlayCount = static_cast<uint32_t>(ImagePool::Type::Count); explicit ParameterOverlay(ParameterOverlays& _overlays, juce::Component* _component); ~ParameterOverlay(); @@ -33,7 +34,7 @@ namespace jucePluginEditorLib OverlayProperties getOverlayProperties() const; - void toggleOverlay(juce::DrawableImage*& _image, ImagePool::Type _type, bool _enable) const; + void toggleOverlay(ImagePool::Type _type, bool _enable, float _opacity = 1.0f); void updateOverlays(); void setParameter(pluginLib::Parameter* _parameter); @@ -45,6 +46,6 @@ namespace jucePluginEditorLib size_t m_parameterLockChangedListener = InvalidListenerId; size_t m_parameterLinkChangedListener = InvalidListenerId; - juce::DrawableImage* m_imageLock = nullptr; + std::array<juce::DrawableImage*, OverlayCount> m_images{nullptr,nullptr}; }; }