Suggestion: Make slider popupdisplay sticking to sliderknob possible

UPDATE: I ended up figuring out how to achieve something similar with BubbleMessageComponent. If anyone ever ends up finding this and needs something similar, here you go

In my Level2Editor.h:

void sliderValueChanged(Slider* slider) override;
void showBubbleMessage(Slider* slider);

std::unique_ptr<BubbleMessageComponent> popupDisplay;
Component* popupParent;

In my Level2Editor.cpp:

Level2Editor::Level2Editor(AudioProcessor& p, Component* parentForPopup) : processor(p),
    popupParent(parentForPopup)
{
...
}

Level2Editor::~Level2Editor()
{
    popupParent = nullptr; // am I doing this right?
}

void Level2Editor::sliderValueChanged(Slider* slider)
{
    showBubbleMessage(slider);
}


void Level2Editor::showBubbleMessage(Slider* slider)
{
    popupDisplay.reset(new BubbleMessageComponent(0));
    popupParent->addChildComponent(popupDisplay.get());
    int sliderTop = slider->getY();
    int sliderX = slider->getX();
    int sliderPos = slider->getPositionOfValue(slider->getValue());
    int x = slider->isHorizontal() ? sliderX + sliderPos : sliderX + slider->getWidth() / 2;
    int y = slider->isHorizontal() ? sliderTop + slider->getHeight() / 2 : sliderTop + sliderPos;
    Point<int> pos(x, y);
    pos.applyTransform(slider->getTransform());
    AttributedString text(String(slider->getValue(), 2) + slider->getTextValueSuffix());
    text.setColour(Colours::white);
    popupDisplay.get()->showAt(Rectangle<int>(25, 25).withCentre(pos), text, 300, false, false);
}

Please let me know if anything above is bad practice.

Original Post:

Hey,

for a project where only the sliderknob is visible I needed the popupdisplay to stick to it, since I can’t extend the Slider class though I couldn’t implement it.
I did try it by directly editing the Slider class though, this is what it looked like, not sure if this would be the correct way, it works for me though:

This is inside the PopupDisplayComponent struct which is inside the Pimpl class.

void updatePosition (const String& newText)
{
    text = newText;
    //BubbleComponent::setPosition (&owner);
    int sliderTop = owner.getY();
    int sliderX = owner.getX();
    int sliderPos = owner.getPositionOfValue(owner.getValue());
    int x = owner.isHorizontal() ? sliderX + sliderPos : sliderX + owner.getWidth() / 2;
    int y = owner.isHorizontal() ? sliderTop + owner.getHeight() / 2 : sliderTop + sliderPos;
    Point<int> pos(x, y);
    pos.applyTransform(owner.getTransform());
    BubbleComponent::setPosition(Rectangle<int>(25, 25).withCentre(pos));
    repaint();
}

I apologize if this has been suggested before, I’m quite new to Juce.

I support this idea too as this is the default behavior of modern slider React Slider component - Material UI