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:
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};
};
}