Browse Source

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

tags/2021-05-28
jules 7 years ago
parent
commit
d2968c6e3f
1 changed files with 51 additions and 8 deletions
  1. +51
    -8
      modules/juce_blocks_basics/topology/juce_PhysicalTopologySource.cpp

+ 51
- 8
modules/juce_blocks_basics/topology/juce_PhysicalTopologySource.cpp 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);


Loading…
Cancel
Save