Ok I figured out how to get it to work;
#pragma once
#include <JuceHeader.h>
#include "ParameterEntryComponent.h"
#include "SetModifierTarget.h"
//====================================================================
class MySlider : public juce::Slider {
public:
MySlider () = default;
MySlider (const juce::String& componentName) :
juce::Slider (componentName) {}
MySlider (juce::Slider::SliderStyle style,
juce::Slider::TextEntryBoxPosition textBoxPosition)
: juce::Slider (style, textBoxPosition) {}
void mouseDown (const juce::MouseEvent& event) override
{
if (juce::ModifierKeys::currentModifiers.isRightButtonDown ())
{
modifierTargetPtr->setModifierTargetStatus
(Slider::getComponentID (), Slider::getTooltip ());
}
else if (juce::ModifierKeys::currentModifiers.isCtrlDown ())
{
sliderPtr = this;
parameterEntryPtr->setEntryTargetStatus
(Slider::getComponentID (), Slider::getTooltip (),
Slider::getValue (), sliderPtr);
}
else
juce::Slider::mouseDown (event);
}
void ParameterEntryComponentPtr (ParameterEntryComponent* ptr)
{
parameterEntryPtr = ptr;
}
void setModifierTargetComponentPtr (SetModifierTarget* ptr)
{
modifierTargetPtr = ptr;
}
private:
Slider* sliderPtr = nullptr;
ParameterEntryComponent* parameterEntryPtr = nullptr;
SetModifierTarget* modifierTargetPtr = nullptr;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MySlider)
};
#pragma once
#include <JuceHeader.h>
//====================================================================
/*
*/
class ParameterEntryComponent : public juce::Component,
public Button::Listener, public Label::Listener
{
public:
ParameterEntryComponent();
~ParameterEntryComponent() override;
void setEntryTargetStatus (String id, String toolTip, double value,
Slider* ptr);
void paint (juce::Graphics&) override;
void resized() override;
int appWidth = 100, appHeight = 10;
int modifierTargetX = 100, modifierTargetY = 10;
private:
void buttonClicked (Button* button) override;
bool initializeObjects ();
void labelTextChanged (Label* label) override;
Slider* sliderPtr = nullptr;
int windowWidth = 0;
int windowHeight = 0;
String targetSliderID; // Knob's or switch's ID
String targetToolTip; // Knob's tooltip
float titleFontSize = 0;
bool componentConstructed = false;
TextButton closeButton; // Close target window
Label manualParamField;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ParameterEntryComponent)
};
#include "ParameterEntryComponent.h"
#include "globalVars.h"
//====================================================================
ParameterEntryComponent::ParameterEntryComponent()
{
}
ParameterEntryComponent::~ParameterEntryComponent()
{
}
//====================================================================
void ParameterEntryComponent::buttonClicked (Button* button)
{
String id = button->getComponentID ();
if (id == "Close") setVisible (false);
}
//====================================================================
bool ParameterEntryComponent::initializeObjects ()
{
closeButton.setComponentID ("Close");
closeButton.setColour (TextButton::buttonColourId, Colours::darkred);
closeButton.setButtonText ("x");
closeButton.getProperties ().set ("Label", 0);
closeButton.addListener (this);
addAndMakeVisible (closeButton);
manualParamField.setComponentID ("Manual Entry Field");
manualParamField.setColour (TextButton::textColourOffId, Colours::black);
manualParamField.setColour (TextButton::buttonOnColourId, statusCS[15]);
manualParamField.setColour (TextButton::textColourOnId, Colours::black);
manualParamField.setTooltip ("Manual Parameter Entry Field\n\nEnter value and press 'Enter'.");
manualParamField.setJustificationType (Justification::centred);
manualParamField.setWantsKeyboardFocus (true);
manualParamField.setEditable (true);
addAndMakeVisible (manualParamField);
manualParamField.addListener (this);
return true;
}
void ParameterEntryComponent::setEntryTargetStatus (String id, String toolTip, double value, Slider* ptr)
{
sliderPtr = ptr;
auto& desktop = Desktop::getInstance ();
auto mouseSource = desktop.getMainMouseSource ();
auto mousePos = mouseSource.getScreenPosition ();
int mouseX = roundToInt (mousePos.getX ());
int mouseY = roundToInt (mousePos.getY ());
auto window = getTopLevelComponent ();
int appX = window->getScreenBounds ().getX ();
int appY = window->getScreenBounds ().getY ();
// Details Parameter?
targetSliderID = id;
targetSliderID = targetSliderID.replace (" - Strip", "", false);
targetToolTip = toolTip;
// Set window height
// Title
int height = window->getScreenBounds ().getHeight () / 4;
setBounds (modifierTargetX, modifierTargetY,
window->getScreenBounds ().getWidth () / 7, height);
// Move component position close to calling knob's position
int x = mouseX - appX - windowWidth / 2;
int y = mouseY - appY + 30;
// Adjust x position if part exceeds app
if (x < 0)
x = 2;
else if (x + windowWidth > appWidth)
x = appWidth - windowWidth - 2;
// Adjust y position if part exceeds app
if (y < 0)
y = 2;
else if (y + windowHeight > appHeight)
y = appHeight - windowHeight - 2;
// Now save position in case app is resized while component is visible
modifierTargetX = x;
modifierTargetY = y;
setBounds (modifierTargetX, modifierTargetY, windowWidth, windowHeight);
setVisible (true);
resized ();
manualParamField.setText (String (value), dontSendNotification);
manualParamField.showEditor ();
}
//====================================================================
void ParameterEntryComponent::labelTextChanged (Label* label)
{
sliderPtr->setValue (label->getTextValue ().getValue ());
manualParamField.showEditor ();
}
//====================================================================
void ParameterEntryComponent::paint (juce::Graphics& g)
{
g.fillAll (innerColor.brighter (0.2f));
// Border
g.setColour (sectionTitleColorSelected);
g.drawRect (0, 0, windowWidth, windowHeight);
// Parameter title
int yPos = roundToInt (titleFontSize);
g.setColour (sectionTitleColorSelected);
g.setFont (titleFontSize * 1.25f);
String title = targetSliderID;
title = title.replace ("TG ", "Tone Generator ", false);
title = title.replace (" Engine ", " ", false);
g.drawFittedText (title, windowWidth / 27, 0,
windowWidth - windowWidth / 9, yPos,
Justification::horizontallyCentred, 1, 0.5f);
// Sub Title
yPos += roundToInt (titleFontSize);
g.setColour (sectionTitleColorSelected.darker (0.5f));
g.setFont (titleFontSize);
g.drawSingleLineText ("Manual Parameter Entry",
windowWidth / 2, yPos, Justification::horizontallyCentred);
yPos += roundToInt (titleFontSize * 6);
g.setColour (sectionTitleColorSelected.darker (0.25f));
g.setFont (titleFontSize * 0.85f);
g.drawFittedText (targetToolTip, windowWidth / 27, yPos,
windowWidth - windowWidth / 9, roundToInt (titleFontSize * 3),
Justification::horizontallyCentred, 5, 0.5f);
}
void ParameterEntryComponent::resized()
{
windowWidth = getWidth ();
windowHeight = getHeight ();
titleFontSize = float (windowWidth / 15);
if (componentConstructed == false) componentConstructed = initializeObjects ();
// Buttons and knobs
int buttonSize = windowWidth / 15;
closeButton.setBounds (windowWidth - 1 - buttonSize, 1, buttonSize, buttonSize);
manualParamField.setBounds (roundToInt (windowWidth * 0.325f),
windowHeight / 6, windowWidth / 3, windowHeight / 6);
}
And in PlugInEditor reSized;
if (setEntryTargetComponent.modifierTargetX != setEntryTargetComponent.getScreenX ())
{
float scale = float (setEntryTargetComponent.modifierTargetX) / float (setEntryTargetComponent.getScreenX ());
setEntryTargetComponent.modifierTargetX = roundToInt (float (setEntryTargetComponent.modifierTargetX) / scale);
setEntryTargetComponent.modifierTargetY = roundToInt (float (setEntryTargetComponent.modifierTargetY) / scale);
}
setEntryTargetComponent.setBounds (setEntryTargetComponent.modifierTargetX, setEntryTargetComponent.modifierTargetY, sectionGeneralPtr->doubleSectionMargin + roundToInt (sectionGeneralPtr->knobSizeXOffset[1] * 4.45f), sectionGeneralPtr->doubleSectionMargin + roundToInt (sectionGeneralPtr->knobSizeXOffset[1] * 4.5f));