1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-24 01:54:22 +00:00

BLOCKS: Make sure midi connection listener is refreshed after revalidating a block

This commit is contained in:
jules 2018-07-26 12:22:54 +01:00
parent ac8c1a11fb
commit d2968c6e3f

View file

@ -1460,12 +1460,7 @@ struct PhysicalTopologySource::Internal
if (modelData.numLEDRowLEDs > 0)
ledRow.reset (new LEDRowImplementation (*this));
listenerToMidiConnection = dynamic_cast<MIDIDeviceConnection*> (detector.getDeviceConnectionFor (*this));
if (listenerToMidiConnection != nullptr)
listenerToMidiConnection->addListener (this);
config.setDeviceComms (listenerToMidiConnection);
updateMidiConnectionListener();
}
~BlockImplementation()
@ -1480,6 +1475,13 @@ struct PhysicalTopologySource::Internal
void invalidate()
{
isStillConnected = false;
if (auto surface = dynamic_cast<TouchSurfaceImplementation*> (touchSurface.get()))
surface->disableTouchSurface();
for (auto* b : controlButtons)
if (auto controlButton = dynamic_cast<ControlButtonImplementation*> (b))
controlButton->disableControlButton();
}
void revalidate (BlocksProtocol::VersionNumber newVersion, BlocksProtocol::BlockName newName, bool master)
@ -1488,6 +1490,15 @@ struct PhysicalTopologySource::Internal
name = getNameString (newName);
isMaster = master;
isStillConnected = true;
if (auto surface = dynamic_cast<TouchSurfaceImplementation*> (touchSurface.get()))
surface->activateTouchSurface();
for (auto* b : controlButtons)
if (auto controlButton = dynamic_cast<ControlButtonImplementation*> (b))
controlButton->activateControlButton();
updateMidiConnectionListener();
}
void setToMaster (bool shouldBeMaster)
@ -1495,6 +1506,16 @@ struct PhysicalTopologySource::Internal
isMaster = shouldBeMaster;
}
void updateMidiConnectionListener()
{
listenerToMidiConnection = dynamic_cast<MIDIDeviceConnection*> (detector.getDeviceConnectionFor (*this));
if (listenerToMidiConnection != nullptr)
listenerToMidiConnection->addListener (this);
config.setDeviceComms (listenerToMidiConnection);
}
Type getType() const override { return modelData.apiType; }
juce::String getDeviceDescription() const override { return modelData.description; }
int getWidth() const override { return modelData.widthUnits; }
@ -2224,6 +2245,16 @@ struct PhysicalTopologySource::Internal
private juce::Timer
{
TouchSurfaceImplementation (BlockImplementation& b) : TouchSurface (b), blockImpl (b)
{
activateTouchSurface();
}
~TouchSurfaceImplementation()
{
disableTouchSurface();
}
void activateTouchSurface()
{
if (auto det = Detector::getFrom (block))
det->activeTouchSurfaces.add (this);
@ -2231,8 +2262,10 @@ struct PhysicalTopologySource::Internal
startTimer (500);
}
~TouchSurfaceImplementation()
void disableTouchSurface()
{
stopTimer();
if (auto det = Detector::getFrom (block))
det->activeTouchSurfaces.removeFirstMatchingValue (this);
}
@ -2337,12 +2370,22 @@ struct PhysicalTopologySource::Internal
{
ControlButtonImplementation (BlockImplementation& b, int index, BlocksProtocol::BlockDataSheet::ButtonInfo info)
: ControlButton (b), blockImpl (b), buttonInfo (info), buttonIndex (index)
{
activateControlButton();
}
~ControlButtonImplementation()
{
disableControlButton();
}
void activateControlButton()
{
if (auto det = Detector::getFrom (block))
det->activeControlButtons.add (this);
}
~ControlButtonImplementation()
void disableControlButton()
{
if (auto det = Detector::getFrom (block))
det->activeControlButtons.removeFirstMatchingValue (this);