mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
Added a couple of methods to ValueTree. Added a MidiBuffer::ensureSize method and used it in the audio plugin wrapper code to preallocate their midi buffers.
This commit is contained in:
parent
c85d54b1cb
commit
c1f4f5501f
14 changed files with 445 additions and 169 deletions
|
|
@ -282,16 +282,12 @@ const ValueTree ComponentDocument::getComponent (int index) const
|
|||
|
||||
const ValueTree ComponentDocument::getComponentWithMemberName (const String& name) const
|
||||
{
|
||||
const ValueTree comps (getComponentGroup());
|
||||
return getComponentGroup().getChildWithProperty (memberNameProperty, name);
|
||||
}
|
||||
|
||||
for (int i = comps.getNumChildren(); --i >= 0;)
|
||||
{
|
||||
const ValueTree v (comps.getChild(i));
|
||||
if (v [memberNameProperty] == name)
|
||||
return v;
|
||||
}
|
||||
|
||||
return ValueTree::invalid;
|
||||
const ValueTree ComponentDocument::getComponentWithID (const String& uid) const
|
||||
{
|
||||
return getComponentGroup().getChildWithProperty (idProperty, uid);
|
||||
}
|
||||
|
||||
Component* ComponentDocument::createComponent (int index)
|
||||
|
|
@ -301,8 +297,8 @@ Component* ComponentDocument::createComponent (int index)
|
|||
if (v.isValid())
|
||||
{
|
||||
Component* c = ComponentTypeManager::getInstance()->createFromStoredType (*this, v);
|
||||
c->getProperties().set (idProperty, v[idProperty]);
|
||||
jassert (c->getProperties()[idProperty].toString().isNotEmpty());
|
||||
c->getProperties().set (jucerIDProperty, v[idProperty]);
|
||||
jassert (getJucerIDFor (c).isNotEmpty());
|
||||
return c;
|
||||
}
|
||||
|
||||
|
|
@ -490,25 +486,11 @@ const ValueTree ComponentDocument::getComponentState (Component* comp) const
|
|||
return ValueTree::invalid;
|
||||
}
|
||||
|
||||
void ComponentDocument::getComponentProperties (Array <PropertyComponent*>& props, Component* comp)
|
||||
{
|
||||
ValueTree v (getComponentState (comp));
|
||||
|
||||
if (v.isValid())
|
||||
{
|
||||
ComponentTypeHandler* handler = ComponentTypeManager::getInstance()->getHandlerFor (v.getType());
|
||||
jassert (handler != 0);
|
||||
|
||||
if (handler != 0)
|
||||
handler->createPropertyEditors (*this, v, props);
|
||||
}
|
||||
}
|
||||
|
||||
bool ComponentDocument::isStateForComponent (const ValueTree& storedState, Component* comp) const
|
||||
{
|
||||
jassert (comp != 0);
|
||||
jassert (! storedState [idProperty].isVoid());
|
||||
return storedState [idProperty] == comp->getProperties() [idProperty];
|
||||
return storedState [idProperty] == getJucerIDFor (comp);
|
||||
}
|
||||
|
||||
void ComponentDocument::removeComponent (const ValueTree& state)
|
||||
|
|
@ -594,6 +576,7 @@ void ComponentDocument::MarkerList::createMarker (const String& name, int positi
|
|||
ValueTree marker (markerTag);
|
||||
marker.setProperty (markerNameProperty, document.getNonexistentMarkerName (name), 0);
|
||||
marker.setProperty (markerPosProperty, Coordinate (position, isX).toString(), 0);
|
||||
marker.setProperty (idProperty, createAlphaNumericUID(), 0);
|
||||
group.addChild (marker, -1, document.getUndoManager());
|
||||
}
|
||||
|
||||
|
|
@ -617,6 +600,24 @@ const Coordinate ComponentDocument::MarkerList::findMarker (const String& name,
|
|||
return Coordinate (isX);
|
||||
}
|
||||
|
||||
void ComponentDocument::MarkerList::createMarkerProperties (Array <PropertyComponent*>& props, ValueTree& marker)
|
||||
{
|
||||
props.add (new TextPropertyComponent (getNameAsValue (marker), "Marker Name", 256, false));
|
||||
}
|
||||
|
||||
bool ComponentDocument::MarkerList::createProperties (Array <PropertyComponent*>& props, const String& itemId)
|
||||
{
|
||||
ValueTree marker (group.getChildWithProperty (idProperty, itemId));
|
||||
|
||||
if (marker.isValid())
|
||||
{
|
||||
createMarkerProperties (props, marker);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
const String ComponentDocument::getNonexistentMarkerName (const String& name)
|
||||
{
|
||||
String n (makeValidCppIdentifier (name, false, true, false));
|
||||
|
|
@ -628,12 +629,59 @@ const String ComponentDocument::getNonexistentMarkerName (const String& name)
|
|||
return n;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
bool ComponentDocument::createItemProperties (Array <PropertyComponent*>& props, const String& itemId)
|
||||
{
|
||||
ValueTree comp (getComponentWithID (itemId));
|
||||
|
||||
if (comp.isValid())
|
||||
{
|
||||
ComponentTypeHandler* handler = ComponentTypeManager::getInstance()->getHandlerFor (comp.getType());
|
||||
jassert (handler != 0);
|
||||
|
||||
if (handler != 0)
|
||||
handler->createPropertyEditors (*this, comp, props);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (markersX->createProperties (props, itemId)
|
||||
|| markersY->createProperties (props, itemId))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void ComponentDocument::createItemProperties (Array <PropertyComponent*>& props, const StringArray& selectedItemIds)
|
||||
{
|
||||
if (selectedItemIds.size() != 1)
|
||||
return; //xxx
|
||||
|
||||
for (int i = 0; i < selectedItemIds.size(); ++i)
|
||||
createItemProperties (props, selectedItemIds[i]);
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
UndoManager* ComponentDocument::getUndoManager() const
|
||||
{
|
||||
return &undoManager;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
const char* const ComponentDocument::jucerIDProperty = "jucerID";
|
||||
|
||||
const String ComponentDocument::getJucerIDFor (Component* c)
|
||||
{
|
||||
if (c == 0)
|
||||
{
|
||||
jassertfalse;
|
||||
return String::empty;
|
||||
}
|
||||
|
||||
jassert (c->getProperties().contains (jucerIDProperty));
|
||||
return c->getProperties() [jucerIDProperty];
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
void ComponentDocument::createClassProperties (Array <PropertyComponent*>& props)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -61,11 +61,11 @@ public:
|
|||
int getNumComponents() const;
|
||||
const ValueTree getComponent (int index) const;
|
||||
const ValueTree getComponentWithMemberName (const String& name) const;
|
||||
const ValueTree getComponentWithID (const String& uid) const;
|
||||
Component* createComponent (int index);
|
||||
void updateComponent (Component* comp);
|
||||
bool containsComponent (Component* comp) const;
|
||||
const ValueTree getComponentState (Component* comp) const;
|
||||
void getComponentProperties (Array <PropertyComponent*>& props, Component* comp);
|
||||
bool isStateForComponent (const ValueTree& storedState, Component* comp) const;
|
||||
void removeComponent (const ValueTree& state);
|
||||
const RectangleCoordinates getCoordsFor (const ValueTree& componentState) const;
|
||||
|
|
@ -102,6 +102,9 @@ public:
|
|||
// for Coordinate::MarkerResolver:
|
||||
const Coordinate findMarker (const String& name, bool isHorizontal) const;
|
||||
|
||||
bool createProperties (Array <PropertyComponent*>& props, const String& itemId);
|
||||
void createMarkerProperties (Array <PropertyComponent*>& props, ValueTree& marker);
|
||||
|
||||
private:
|
||||
ComponentDocument& document;
|
||||
ValueTree group;
|
||||
|
|
@ -117,6 +120,9 @@ public:
|
|||
|
||||
const String getNonexistentMarkerName (const String& name);
|
||||
|
||||
//==============================================================================
|
||||
void createItemProperties (Array <PropertyComponent*>& props, const StringArray& selectedItemIds);
|
||||
|
||||
//==============================================================================
|
||||
void beginDrag (const Array<Component*>& items, const MouseEvent& e,
|
||||
Component* parentForOverlays, const ResizableBorderComponent::Zone& zone);
|
||||
|
|
@ -139,6 +145,9 @@ public:
|
|||
static const char* const markerNameProperty;
|
||||
static const char* const markerPosProperty;
|
||||
|
||||
static const char* const jucerIDProperty;
|
||||
static const String getJucerIDFor (Component* c);
|
||||
|
||||
private:
|
||||
Project* project;
|
||||
File cppFile;
|
||||
|
|
@ -158,6 +167,8 @@ private:
|
|||
|
||||
void writeCode (OutputStream& cpp, OutputStream& header);
|
||||
void writeMetadata (OutputStream& out);
|
||||
|
||||
bool createItemProperties (Array <PropertyComponent*>& props, const String& itemId);
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@ public:
|
|||
setBoundsInTargetSpace (component->getBounds().expanded (borderThickness, borderThickness));
|
||||
}
|
||||
|
||||
uint32 getTargetComponentUID() const { return component == 0 ? 0 : component->getComponentUID(); }
|
||||
const String getTargetComponentID() const { return component == 0 ? String::empty : ComponentDocument::getJucerIDFor (component); }
|
||||
|
||||
//==============================================================================
|
||||
class SizeGuideComponent : public OverlayItemComponent,
|
||||
|
|
@ -300,6 +300,8 @@ public:
|
|||
toFront (false);
|
||||
updateLabel();
|
||||
|
||||
canvas.getSelection().selectOnly (marker [ComponentDocument::idProperty]);
|
||||
|
||||
if (e.mods.isPopupMenu())
|
||||
{
|
||||
isDragging = false;
|
||||
|
|
@ -394,7 +396,7 @@ public:
|
|||
|
||||
if (! doc.containsComponent (c))
|
||||
{
|
||||
selection.deselect (c->getComponentUID());
|
||||
selection.deselect (ComponentDocument::getJucerIDFor (c));
|
||||
delete c;
|
||||
}
|
||||
}
|
||||
|
|
@ -418,11 +420,16 @@ public:
|
|||
}
|
||||
|
||||
// Make sure the z-order is correct..
|
||||
for (i = 0; i < num - 1; ++i)
|
||||
componentsInOrder.getUnchecked(i)->toBehind (componentsInOrder.getUnchecked (i + 1));
|
||||
if (num > 0)
|
||||
{
|
||||
componentsInOrder.getLast()->toFront (false);
|
||||
|
||||
for (i = num - 1; --i >= 0;)
|
||||
componentsInOrder.getUnchecked(i)->toBehind (componentsInOrder.getUnchecked (i + 1));
|
||||
}
|
||||
}
|
||||
|
||||
Component* getComponentForState (ComponentDocument& doc, const ValueTree& state)
|
||||
Component* getComponentForState (ComponentDocument& doc, const ValueTree& state) const
|
||||
{
|
||||
for (int i = getNumChildComponents(); --i >= 0;)
|
||||
{
|
||||
|
|
@ -435,6 +442,19 @@ public:
|
|||
return 0;
|
||||
}
|
||||
|
||||
Component* findComponentWithID (const String& uid) const
|
||||
{
|
||||
for (int i = getNumChildComponents(); --i >= 0;)
|
||||
{
|
||||
Component* const c = getChildComponent(i);
|
||||
|
||||
if (ComponentDocument::getJucerIDFor (c) == uid)
|
||||
return c;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Component* findComponentAt (const Point<int>& pos) const
|
||||
{
|
||||
for (int i = getNumChildComponents(); --i >= 0;)
|
||||
|
|
@ -453,7 +473,7 @@ public:
|
|||
{
|
||||
Component* c = getChildComponent(i);
|
||||
if (c->getBounds().intersects (lassoArea))
|
||||
itemsFound.add (c->getComponentUID());
|
||||
itemsFound.add (ComponentDocument::getJucerIDFor (c));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
@ -493,7 +513,7 @@ public:
|
|||
void mouseDown (const MouseEvent& e)
|
||||
{
|
||||
lasso = 0;
|
||||
mouseDownCompUID = 0;
|
||||
mouseDownCompUID = String::empty;
|
||||
isDraggingClickedComp = false;
|
||||
|
||||
Component* underMouse = canvas.getComponentHolder()->findComponentAt (e.getEventRelativeTo (canvas.getComponentHolder()).getPosition());
|
||||
|
|
@ -502,8 +522,8 @@ public:
|
|||
{
|
||||
if (underMouse != 0)
|
||||
{
|
||||
if (! canvas.getSelection().isSelected (underMouse->getComponentUID()))
|
||||
canvas.getSelection().selectOnly (underMouse->getComponentUID());
|
||||
if (! canvas.getSelection().isSelected (ComponentDocument::getJucerIDFor (underMouse)))
|
||||
canvas.getSelection().selectOnly (ComponentDocument::getJucerIDFor (underMouse));
|
||||
}
|
||||
|
||||
PopupMenu m;
|
||||
|
|
@ -528,12 +548,14 @@ public:
|
|||
{
|
||||
if (underMouse == 0 || e.mods.isAltDown())
|
||||
{
|
||||
canvas.deselectNonComponents();
|
||||
addAndMakeVisible (lasso = new LassoComponent <SelectedItems::ItemType>());
|
||||
lasso->beginLasso (e, this);
|
||||
}
|
||||
else
|
||||
{
|
||||
mouseDownCompUID = underMouse->getComponentUID();
|
||||
mouseDownCompUID = ComponentDocument::getJucerIDFor (underMouse);
|
||||
canvas.deselectNonComponents();
|
||||
mouseDownResult = canvas.getSelection().addToSelectionOnMouseDown (mouseDownCompUID, e.mods);
|
||||
|
||||
updateResizeFrames();
|
||||
|
|
@ -549,7 +571,7 @@ public:
|
|||
{
|
||||
lasso->dragLasso (e);
|
||||
}
|
||||
else if (mouseDownCompUID != 0 && (! e.mouseWasClicked()) && (! e.mods.isPopupMenu()))
|
||||
else if (mouseDownCompUID.isNotEmpty() && (! e.mouseWasClicked()) && (! e.mods.isPopupMenu()))
|
||||
{
|
||||
if (! isDraggingClickedComp)
|
||||
{
|
||||
|
|
@ -653,40 +675,24 @@ private:
|
|||
ValueTree markerRootX, markerRootY;
|
||||
ScopedPointer <LassoComponent <SelectedItems::ItemType> > lasso;
|
||||
bool mouseDownResult, isDraggingClickedComp;
|
||||
uint32 mouseDownCompUID;
|
||||
SelectedItems::ItemType mouseDownCompUID;
|
||||
|
||||
ComponentDocument& getDocument() { return canvas.getDocument(); }
|
||||
|
||||
Component* getComponentWithUID (const uint32 uid) const
|
||||
{
|
||||
for (int i = canvas.getComponentHolder()->getNumChildComponents(); --i >= 0;)
|
||||
{
|
||||
Component* c = canvas.getComponentHolder()->getChildComponent(i);
|
||||
|
||||
if (c->getComponentUID() == uid)
|
||||
return c;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void updateResizeFrames()
|
||||
{
|
||||
SelectedItems& selection = canvas.getSelection();
|
||||
StringArray requiredIds (canvas.getSelectedIds());
|
||||
|
||||
Array<int> requiredIds;
|
||||
int i;
|
||||
for (i = selection.getNumSelected(); --i >= 0;)
|
||||
requiredIds.add (selection.getSelectedItem(i));
|
||||
|
||||
for (i = getNumChildComponents(); --i >= 0;)
|
||||
{
|
||||
ComponentResizeFrame* resizer = dynamic_cast <ComponentResizeFrame*> (getChildComponent(i));
|
||||
|
||||
if (resizer != 0)
|
||||
{
|
||||
if (selection.isSelected (resizer->getTargetComponentUID()))
|
||||
requiredIds.removeValue (resizer->getTargetComponentUID());
|
||||
if (selection.isSelected (resizer->getTargetComponentID()))
|
||||
requiredIds.removeString (resizer->getTargetComponentID());
|
||||
else
|
||||
delete resizer;
|
||||
}
|
||||
|
|
@ -694,7 +700,7 @@ private:
|
|||
|
||||
for (i = requiredIds.size(); --i >= 0;)
|
||||
{
|
||||
Component* c = getComponentWithUID (requiredIds.getUnchecked(i));
|
||||
Component* c = canvas.getComponentHolder()->findComponentWithID (requiredIds[i]);
|
||||
|
||||
if (c != 0)
|
||||
{
|
||||
|
|
@ -951,16 +957,19 @@ void ComponentEditorCanvas::updateComponents()
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
const StringArray ComponentEditorCanvas::getSelectedIds() const
|
||||
{
|
||||
StringArray ids;
|
||||
const int num = selection.getNumSelected();
|
||||
for (int i = 0; i < num; ++i)
|
||||
ids.add (selection.getSelectedItem(i));
|
||||
|
||||
return ids;
|
||||
}
|
||||
|
||||
void ComponentEditorCanvas::getSelectedItemProperties (Array <PropertyComponent*>& props)
|
||||
{
|
||||
//xxx needs to handle multiple selections..
|
||||
|
||||
if (selection.getNumSelected() == 1)
|
||||
{
|
||||
Component* c = getComponentForUID (selection.getSelectedItem (0));
|
||||
jassert (c != 0);
|
||||
getDocument().getComponentProperties (props, c);
|
||||
}
|
||||
getDocument().createItemProperties (props, getSelectedIds());
|
||||
}
|
||||
|
||||
void ComponentEditorCanvas::deleteSelection()
|
||||
|
|
@ -969,7 +978,7 @@ void ComponentEditorCanvas::deleteSelection()
|
|||
|
||||
for (int i = selection.getNumSelected(); --i >= 0;)
|
||||
{
|
||||
Component* c = getComponentForUID (selection.getSelectedItem (0));
|
||||
Component* c = componentHolder->findComponentWithID (selection.getSelectedItem (0));
|
||||
|
||||
if (c != 0)
|
||||
getDocument().removeComponent (getDocument().getComponentState (c));
|
||||
|
|
@ -980,6 +989,13 @@ void ComponentEditorCanvas::deleteSelection()
|
|||
getDocument().beginNewTransaction();
|
||||
}
|
||||
|
||||
void ComponentEditorCanvas::deselectNonComponents()
|
||||
{
|
||||
for (int i = getSelection().getNumSelected(); --i >= 0;)
|
||||
if (! getDocument().getComponentWithID (getSelection().getSelectedItem (i)).isValid())
|
||||
getSelection().deselect (getSelection().getSelectedItem (i));
|
||||
}
|
||||
|
||||
void ComponentEditorCanvas::selectionToFront()
|
||||
{
|
||||
getDocument().beginNewTransaction();
|
||||
|
|
@ -990,11 +1006,10 @@ void ComponentEditorCanvas::selectionToFront()
|
|||
const ValueTree comp (getDocument().getComponent (index));
|
||||
Component* c = componentHolder->getComponentForState (getDocument(), comp);
|
||||
|
||||
if (c != 0 && selection.isSelected (c->getComponentUID()))
|
||||
if (c != 0 && selection.isSelected (ComponentDocument::getJucerIDFor (c)))
|
||||
{
|
||||
ValueTree parent (comp.getParent());
|
||||
parent.removeChild (comp, getDocument().getUndoManager());
|
||||
parent.addChild (comp, -1, getDocument().getUndoManager());
|
||||
parent.moveChild (parent.indexOf (comp), -1, getDocument().getUndoManager());
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1015,11 +1030,10 @@ void ComponentEditorCanvas::selectionToBack()
|
|||
const ValueTree comp (getDocument().getComponent (index));
|
||||
Component* c = componentHolder->getComponentForState (getDocument(), comp);
|
||||
|
||||
if (c != 0 && selection.isSelected (c->getComponentUID()))
|
||||
if (c != 0 && selection.isSelected (ComponentDocument::getJucerIDFor (c)))
|
||||
{
|
||||
ValueTree parent (comp.getParent());
|
||||
parent.removeChild (comp, getDocument().getUndoManager());
|
||||
parent.addChild (comp, 0, getDocument().getUndoManager());
|
||||
parent.moveChild (parent.indexOf (comp), 0, getDocument().getUndoManager());
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1036,22 +1050,13 @@ void ComponentEditorCanvas::hideSizeGuides() { overlay->hideSizeGuides(); }
|
|||
|
||||
|
||||
//==============================================================================
|
||||
Component* ComponentEditorCanvas::getComponentForUID (const uint32 uid) const
|
||||
{
|
||||
for (int i = componentHolder->getNumChildComponents(); --i >= 0;)
|
||||
if (componentHolder->getChildComponent (i)->getComponentUID() == uid)
|
||||
return componentHolder->getChildComponent (i);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const Array<Component*> ComponentEditorCanvas::getSelectedComps() const
|
||||
{
|
||||
Array<Component*> comps;
|
||||
|
||||
for (int i = 0; i < selection.getNumSelected(); ++i)
|
||||
{
|
||||
Component* c = getComponentForUID (selection.getSelectedItem (i));
|
||||
Component* c = componentHolder->findComponentWithID (selection.getSelectedItem (i));
|
||||
jassert (c != 0);
|
||||
if (c != 0)
|
||||
comps.add (c);
|
||||
|
|
@ -1065,7 +1070,7 @@ const Array<Component*> ComponentEditorCanvas::getUnselectedComps() const
|
|||
Array<Component*> comps;
|
||||
|
||||
for (int i = componentHolder->getNumChildComponents(); --i >= 0;)
|
||||
if (! selection.isSelected (componentHolder->getChildComponent(i)->getComponentUID()))
|
||||
if (! selection.isSelected (ComponentDocument::getJucerIDFor (componentHolder->getChildComponent(i))))
|
||||
comps.add (componentHolder->getChildComponent(i));
|
||||
|
||||
return comps;
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ public:
|
|||
ComponentEditor& getEditor();
|
||||
ComponentDocument& getDocument();
|
||||
|
||||
typedef SelectedItemSet<uint32> SelectedItems;
|
||||
typedef SelectedItemSet<String> SelectedItems;
|
||||
SelectedItems& getSelection();
|
||||
|
||||
class ComponentHolder;
|
||||
|
|
@ -67,8 +67,10 @@ public:
|
|||
void valueTreeParentChanged (ValueTree& treeWhoseParentHasChanged) {}
|
||||
|
||||
//==============================================================================
|
||||
const StringArray getSelectedIds() const;
|
||||
void getSelectedItemProperties (Array <PropertyComponent*>& props);
|
||||
void deleteSelection();
|
||||
void deselectNonComponents();
|
||||
void selectionToFront();
|
||||
void selectionToBack();
|
||||
|
||||
|
|
@ -114,7 +116,6 @@ private:
|
|||
WholeComponentResizer* resizeFrame;
|
||||
SelectedItems selection;
|
||||
|
||||
Component* getComponentForUID (const uint32 uid) const;
|
||||
const Array<Component*> getSelectedComps() const;
|
||||
const Array<Component*> getUnselectedComps() const;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -654,7 +654,9 @@ public:
|
|||
juceFilter->prepareToPlay (GetSampleRate(),
|
||||
GetMaxFramesPerSlice());
|
||||
|
||||
midiEvents.ensureSize (2048);
|
||||
midiEvents.clear();
|
||||
incomingEvents.ensureSize (2048);
|
||||
incomingEvents.clear();
|
||||
|
||||
channels.calloc (jmax (juceFilter->getNumInputChannels(),
|
||||
|
|
|
|||
|
|
@ -506,6 +506,8 @@ protected:
|
|||
|
||||
juceFilter->setPlayHead (this);
|
||||
juceFilter->addListener (this);
|
||||
|
||||
midiEvents.ensureSize (2048);
|
||||
}
|
||||
|
||||
void handleAsyncUpdate()
|
||||
|
|
|
|||
|
|
@ -779,6 +779,8 @@ public:
|
|||
deleteTempChannels();
|
||||
|
||||
filter->prepareToPlay (rate, blockSize);
|
||||
|
||||
midiEvents.ensureSize (2048);
|
||||
midiEvents.clear();
|
||||
|
||||
setInitialDelay (filter->getLatencySamples());
|
||||
|
|
|
|||
|
|
@ -15704,11 +15704,11 @@ END_JUCE_NAMESPACE
|
|||
/*** Start of inlined file: juce_ValueTree.cpp ***/
|
||||
BEGIN_JUCE_NAMESPACE
|
||||
|
||||
class ValueTreeSetPropertyAction : public UndoableAction
|
||||
class ValueTree::SetPropertyAction : public UndoableAction
|
||||
{
|
||||
public:
|
||||
ValueTreeSetPropertyAction (const ValueTree::SharedObjectPtr& target_, const var::identifier& name_,
|
||||
const var& newValue_, const bool isAddingNewProperty_, const bool isDeletingProperty_)
|
||||
SetPropertyAction (const SharedObjectPtr& target_, const var::identifier& name_,
|
||||
const var& newValue_, const bool isAddingNewProperty_, const bool isDeletingProperty_)
|
||||
: target (target_), name (name_), newValue (newValue_),
|
||||
isAddingNewProperty (isAddingNewProperty_),
|
||||
isDeletingProperty (isDeletingProperty_)
|
||||
|
|
@ -15717,7 +15717,7 @@ public:
|
|||
oldValue = target_->getProperty (name_);
|
||||
}
|
||||
|
||||
~ValueTreeSetPropertyAction() {}
|
||||
~SetPropertyAction() {}
|
||||
|
||||
bool perform()
|
||||
{
|
||||
|
|
@ -15747,21 +15747,21 @@ public:
|
|||
}
|
||||
|
||||
private:
|
||||
const ValueTree::SharedObjectPtr target;
|
||||
const SharedObjectPtr target;
|
||||
const var::identifier name;
|
||||
const var newValue;
|
||||
var oldValue;
|
||||
const bool isAddingNewProperty, isDeletingProperty;
|
||||
|
||||
ValueTreeSetPropertyAction (const ValueTreeSetPropertyAction&);
|
||||
ValueTreeSetPropertyAction& operator= (const ValueTreeSetPropertyAction&);
|
||||
SetPropertyAction (const SetPropertyAction&);
|
||||
SetPropertyAction& operator= (const SetPropertyAction&);
|
||||
};
|
||||
|
||||
class ValueTreeChildChangeAction : public UndoableAction
|
||||
class ValueTree::AddOrRemoveChildAction : public UndoableAction
|
||||
{
|
||||
public:
|
||||
ValueTreeChildChangeAction (const ValueTree::SharedObjectPtr& target_, const int childIndex_,
|
||||
const ValueTree::SharedObjectPtr& newChild_)
|
||||
AddOrRemoveChildAction (const SharedObjectPtr& target_, const int childIndex_,
|
||||
const SharedObjectPtr& newChild_)
|
||||
: target (target_),
|
||||
child (newChild_ != 0 ? newChild_ : target_->children [childIndex_]),
|
||||
childIndex (childIndex_),
|
||||
|
|
@ -15770,7 +15770,7 @@ public:
|
|||
jassert (child != 0);
|
||||
}
|
||||
|
||||
~ValueTreeChildChangeAction() {}
|
||||
~AddOrRemoveChildAction() {}
|
||||
|
||||
bool perform()
|
||||
{
|
||||
|
|
@ -15805,12 +15805,50 @@ public:
|
|||
}
|
||||
|
||||
private:
|
||||
const ValueTree::SharedObjectPtr target, child;
|
||||
const SharedObjectPtr target, child;
|
||||
const int childIndex;
|
||||
const bool isDeleting;
|
||||
|
||||
ValueTreeChildChangeAction (const ValueTreeChildChangeAction&);
|
||||
ValueTreeChildChangeAction& operator= (const ValueTreeChildChangeAction&);
|
||||
AddOrRemoveChildAction (const AddOrRemoveChildAction&);
|
||||
AddOrRemoveChildAction& operator= (const AddOrRemoveChildAction&);
|
||||
};
|
||||
|
||||
class ValueTree::MoveChildAction : public UndoableAction
|
||||
{
|
||||
public:
|
||||
MoveChildAction (const SharedObjectPtr& target_,
|
||||
const int startIndex_, const int endIndex_)
|
||||
: target (target_),
|
||||
startIndex (startIndex_),
|
||||
endIndex (endIndex_)
|
||||
{
|
||||
}
|
||||
|
||||
~MoveChildAction() {}
|
||||
|
||||
bool perform()
|
||||
{
|
||||
target->moveChild (startIndex, endIndex, 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool undo()
|
||||
{
|
||||
target->moveChild (endIndex, startIndex, 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
int getSizeInUnits()
|
||||
{
|
||||
return (int) sizeof (*this); //xxx should be more accurate
|
||||
}
|
||||
|
||||
private:
|
||||
const SharedObjectPtr target, child;
|
||||
const int startIndex, endIndex;
|
||||
|
||||
MoveChildAction (const MoveChildAction&);
|
||||
MoveChildAction& operator= (const MoveChildAction&);
|
||||
};
|
||||
|
||||
ValueTree::SharedObject::SharedObject (const String& type_)
|
||||
|
|
@ -15926,11 +15964,11 @@ void ValueTree::SharedObject::setProperty (const var::identifier& name, const va
|
|||
if (existingValue != 0)
|
||||
{
|
||||
if (*existingValue != newValue)
|
||||
undoManager->perform (new ValueTreeSetPropertyAction (this, name, newValue, false, false));
|
||||
undoManager->perform (new SetPropertyAction (this, name, newValue, false, false));
|
||||
}
|
||||
else
|
||||
{
|
||||
undoManager->perform (new ValueTreeSetPropertyAction (this, name, newValue, true, false));
|
||||
undoManager->perform (new SetPropertyAction (this, name, newValue, true, false));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -15950,7 +15988,7 @@ void ValueTree::SharedObject::removeProperty (const var::identifier& name, UndoM
|
|||
else
|
||||
{
|
||||
if (properties.contains (name))
|
||||
undoManager->perform (new ValueTreeSetPropertyAction (this, name, var::null, false, true));
|
||||
undoManager->perform (new SetPropertyAction (this, name, var::null, false, true));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -15968,7 +16006,7 @@ void ValueTree::SharedObject::removeAllProperties (UndoManager* const undoManage
|
|||
else
|
||||
{
|
||||
for (int i = properties.size(); --i >= 0;)
|
||||
undoManager->perform (new ValueTreeSetPropertyAction (this, properties.getName(i), var::null, false, true));
|
||||
undoManager->perform (new SetPropertyAction (this, properties.getName(i), var::null, false, true));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -16005,6 +16043,11 @@ bool ValueTree::SharedObject::isAChildOf (const SharedObject* const possiblePare
|
|||
return false;
|
||||
}
|
||||
|
||||
int ValueTree::SharedObject::indexOf (const ValueTree& child) const
|
||||
{
|
||||
return children.indexOf (child.object);
|
||||
}
|
||||
|
||||
void ValueTree::SharedObject::addChild (SharedObject* child, int index, UndoManager* const undoManager)
|
||||
{
|
||||
if (child != 0 && child->parent != this)
|
||||
|
|
@ -16034,7 +16077,7 @@ void ValueTree::SharedObject::addChild (SharedObject* child, int index, UndoMana
|
|||
if (index < 0)
|
||||
index = children.size();
|
||||
|
||||
undoManager->perform (new ValueTreeChildChangeAction (this, index, child));
|
||||
undoManager->perform (new AddOrRemoveChildAction (this, index, child));
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
@ -16061,7 +16104,7 @@ void ValueTree::SharedObject::removeChild (const int childIndex, UndoManager* co
|
|||
}
|
||||
else
|
||||
{
|
||||
undoManager->perform (new ValueTreeChildChangeAction (this, childIndex, 0));
|
||||
undoManager->perform (new AddOrRemoveChildAction (this, childIndex, 0));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -16072,6 +16115,29 @@ void ValueTree::SharedObject::removeAllChildren (UndoManager* const undoManager)
|
|||
removeChild (children.size() - 1, undoManager);
|
||||
}
|
||||
|
||||
void ValueTree::SharedObject::moveChild (int currentIndex, int newIndex, UndoManager* undoManager)
|
||||
{
|
||||
// The source index must be a valid index!
|
||||
jassert (((unsigned int) currentIndex) < (unsigned int) children.size());
|
||||
|
||||
if (currentIndex != newIndex
|
||||
&& ((unsigned int) currentIndex) < (unsigned int) children.size())
|
||||
{
|
||||
if (undoManager == 0)
|
||||
{
|
||||
children.move (currentIndex, newIndex);
|
||||
sendChildChangeMessage();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (((unsigned int) newIndex) >= (unsigned int) children.size())
|
||||
newIndex = children.size() - 1;
|
||||
|
||||
undoManager->perform (new MoveChildAction (this, currentIndex, newIndex));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ValueTree::ValueTree() throw()
|
||||
: object (0)
|
||||
{
|
||||
|
|
@ -16274,6 +16340,11 @@ bool ValueTree::isAChildOf (const ValueTree& possibleParent) const
|
|||
return object != 0 && object->isAChildOf (possibleParent.object);
|
||||
}
|
||||
|
||||
int ValueTree::indexOf (const ValueTree& child) const
|
||||
{
|
||||
return object != 0 ? object->indexOf (child) : -1;
|
||||
}
|
||||
|
||||
void ValueTree::addChild (ValueTree child, int index, UndoManager* const undoManager)
|
||||
{
|
||||
if (object != 0)
|
||||
|
|
@ -16298,6 +16369,12 @@ void ValueTree::removeAllChildren (UndoManager* const undoManager)
|
|||
object->removeAllChildren (undoManager);
|
||||
}
|
||||
|
||||
void ValueTree::moveChild (int currentIndex, int newIndex, UndoManager* undoManager)
|
||||
{
|
||||
if (object != 0)
|
||||
object->moveChild (currentIndex, newIndex, undoManager);
|
||||
}
|
||||
|
||||
void ValueTree::addListener (Listener* listener)
|
||||
{
|
||||
if (listener != 0)
|
||||
|
|
@ -26435,6 +26512,11 @@ void MidiBuffer::addEvents (const MidiBuffer& otherBuffer,
|
|||
}
|
||||
}
|
||||
|
||||
void MidiBuffer::ensureSize (size_t minimumNumBytes)
|
||||
{
|
||||
data.ensureSize (minimumNumBytes);
|
||||
}
|
||||
|
||||
bool MidiBuffer::isEmpty() const throw()
|
||||
{
|
||||
return bytesUsed == 0;
|
||||
|
|
@ -32340,7 +32422,7 @@ void VSTPluginInstance::processBlock (AudioSampleBuffer& buffer,
|
|||
// copy any incoming midi..
|
||||
const ScopedLock sl (midiInLock);
|
||||
|
||||
midiMessages = incomingMidi;
|
||||
midiMessages.swapWith (incomingMidi);
|
||||
incomingMidi.clear();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6726,19 +6726,19 @@ public:
|
|||
|
||||
const var& operator[] (const var::identifier& name) const;
|
||||
|
||||
void setProperty (const var::identifier& name, const var& newValue, UndoManager* const undoManager);
|
||||
void setProperty (const var::identifier& name, const var& newValue, UndoManager* undoManager);
|
||||
|
||||
bool hasProperty (const var::identifier& name) const;
|
||||
|
||||
void removeProperty (const var::identifier& name, UndoManager* const undoManager);
|
||||
void removeProperty (const var::identifier& name, UndoManager* undoManager);
|
||||
|
||||
void removeAllProperties (UndoManager* const undoManager);
|
||||
void removeAllProperties (UndoManager* undoManager);
|
||||
|
||||
int getNumProperties() const;
|
||||
|
||||
const var::identifier getPropertyName (int index) const;
|
||||
|
||||
Value getPropertyAsValue (const var::identifier& name, UndoManager* const undoManager) const;
|
||||
Value getPropertyAsValue (const var::identifier& name, UndoManager* undoManager) const;
|
||||
|
||||
int getNumChildren() const;
|
||||
|
||||
|
|
@ -6748,16 +6748,20 @@ public:
|
|||
|
||||
ValueTree getChildWithProperty (const var::identifier& propertyName, const var& propertyValue) const;
|
||||
|
||||
void addChild (ValueTree child, int index, UndoManager* const undoManager);
|
||||
void addChild (ValueTree child, int index, UndoManager* undoManager);
|
||||
|
||||
void removeChild (const ValueTree& child, UndoManager* const undoManager);
|
||||
void removeChild (const ValueTree& child, UndoManager* undoManager);
|
||||
|
||||
void removeChild (const int childIndex, UndoManager* const undoManager);
|
||||
void removeChild (int childIndex, UndoManager* undoManager);
|
||||
|
||||
void removeAllChildren (UndoManager* const undoManager);
|
||||
void removeAllChildren (UndoManager* undoManager);
|
||||
|
||||
void moveChild (int currentIndex, int newIndex, UndoManager* undoManager);
|
||||
|
||||
bool isAChildOf (const ValueTree& possibleParent) const;
|
||||
|
||||
int indexOf (const ValueTree& child) const;
|
||||
|
||||
ValueTree getParent() const;
|
||||
|
||||
XmlElement* createXml() const;
|
||||
|
|
@ -6801,8 +6805,12 @@ public:
|
|||
juce_UseDebuggingNewOperator
|
||||
|
||||
private:
|
||||
friend class ValueTreeSetPropertyAction;
|
||||
friend class ValueTreeChildChangeAction;
|
||||
class SetPropertyAction;
|
||||
friend class SetPropertyAction;
|
||||
class AddOrRemoveChildAction;
|
||||
friend class AddOrRemoveChildAction;
|
||||
class MoveChildAction;
|
||||
friend class MoveChildAction;
|
||||
|
||||
class JUCE_API SharedObject : public ReferenceCountedObject
|
||||
{
|
||||
|
|
@ -6824,16 +6832,18 @@ private:
|
|||
void sendParentChangeMessage();
|
||||
const var& getProperty (const var::identifier& name) const;
|
||||
const var getProperty (const var::identifier& name, const var& defaultReturnValue) const;
|
||||
void setProperty (const var::identifier& name, const var& newValue, UndoManager* const undoManager);
|
||||
void setProperty (const var::identifier& name, const var& newValue, UndoManager*);
|
||||
bool hasProperty (const var::identifier& name) const;
|
||||
void removeProperty (const var::identifier& name, UndoManager* const undoManager);
|
||||
void removeAllProperties (UndoManager* const undoManager);
|
||||
bool isAChildOf (const SharedObject* const possibleParent) const;
|
||||
void removeProperty (const var::identifier& name, UndoManager*);
|
||||
void removeAllProperties (UndoManager*);
|
||||
bool isAChildOf (const SharedObject* possibleParent) const;
|
||||
int indexOf (const ValueTree& child) const;
|
||||
ValueTree getChildWithName (const String& type) const;
|
||||
ValueTree getChildWithProperty (const var::identifier& propertyName, const var& propertyValue) const;
|
||||
void addChild (SharedObject* child, int index, UndoManager* const undoManager);
|
||||
void removeChild (const int childIndex, UndoManager* const undoManager);
|
||||
void removeAllChildren (UndoManager* const undoManager);
|
||||
void addChild (SharedObject* child, int index, UndoManager*);
|
||||
void removeChild (int childIndex, UndoManager*);
|
||||
void removeAllChildren (UndoManager*);
|
||||
void moveChild (int currentIndex, int newIndex, UndoManager*);
|
||||
XmlElement* createXml() const;
|
||||
|
||||
juce_UseDebuggingNewOperator
|
||||
|
|
@ -6861,14 +6871,13 @@ private:
|
|||
};
|
||||
|
||||
friend class SharedObject;
|
||||
|
||||
typedef ReferenceCountedObjectPtr <SharedObject> SharedObjectPtr;
|
||||
|
||||
ReferenceCountedObjectPtr <SharedObject> object;
|
||||
SharedObjectPtr object;
|
||||
ListenerList <Listener> listeners;
|
||||
|
||||
public:
|
||||
explicit ValueTree (SharedObject* const object_); // (can be made private when VC6 support is finally dropped)
|
||||
explicit ValueTree (SharedObject*); // (can be made private when VC6 support is finally dropped)
|
||||
};
|
||||
|
||||
#endif // __JUCE_VALUETREE_JUCEHEADER__
|
||||
|
|
@ -15723,6 +15732,8 @@ public:
|
|||
|
||||
void swapWith (MidiBuffer& other);
|
||||
|
||||
void ensureSize (size_t minimumNumBytes);
|
||||
|
||||
class Iterator
|
||||
{
|
||||
public:
|
||||
|
|
|
|||
|
|
@ -191,6 +191,11 @@ void MidiBuffer::addEvents (const MidiBuffer& otherBuffer,
|
|||
}
|
||||
}
|
||||
|
||||
void MidiBuffer::ensureSize (size_t minimumNumBytes)
|
||||
{
|
||||
data.ensureSize (minimumNumBytes);
|
||||
}
|
||||
|
||||
bool MidiBuffer::isEmpty() const throw()
|
||||
{
|
||||
return bytesUsed == 0;
|
||||
|
|
|
|||
|
|
@ -157,6 +157,12 @@ public:
|
|||
*/
|
||||
void swapWith (MidiBuffer& other);
|
||||
|
||||
/** Preallocates some memory for the buffer to use.
|
||||
This helps to avoid needing to reallocate space when the buffer has messages
|
||||
added to it.
|
||||
*/
|
||||
void ensureSize (size_t minimumNumBytes);
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
Used to iterate through the events in a MidiBuffer.
|
||||
|
|
|
|||
|
|
@ -1140,7 +1140,7 @@ void VSTPluginInstance::processBlock (AudioSampleBuffer& buffer,
|
|||
// copy any incoming midi..
|
||||
const ScopedLock sl (midiInLock);
|
||||
|
||||
midiMessages = incomingMidi;
|
||||
midiMessages.swapWith (incomingMidi);
|
||||
incomingMidi.clear();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,11 +31,11 @@ BEGIN_JUCE_NAMESPACE
|
|||
|
||||
|
||||
//==============================================================================
|
||||
class ValueTreeSetPropertyAction : public UndoableAction
|
||||
class ValueTree::SetPropertyAction : public UndoableAction
|
||||
{
|
||||
public:
|
||||
ValueTreeSetPropertyAction (const ValueTree::SharedObjectPtr& target_, const var::identifier& name_,
|
||||
const var& newValue_, const bool isAddingNewProperty_, const bool isDeletingProperty_)
|
||||
SetPropertyAction (const SharedObjectPtr& target_, const var::identifier& name_,
|
||||
const var& newValue_, const bool isAddingNewProperty_, const bool isDeletingProperty_)
|
||||
: target (target_), name (name_), newValue (newValue_),
|
||||
isAddingNewProperty (isAddingNewProperty_),
|
||||
isDeletingProperty (isDeletingProperty_)
|
||||
|
|
@ -44,7 +44,7 @@ public:
|
|||
oldValue = target_->getProperty (name_);
|
||||
}
|
||||
|
||||
~ValueTreeSetPropertyAction() {}
|
||||
~SetPropertyAction() {}
|
||||
|
||||
bool perform()
|
||||
{
|
||||
|
|
@ -74,22 +74,22 @@ public:
|
|||
}
|
||||
|
||||
private:
|
||||
const ValueTree::SharedObjectPtr target;
|
||||
const SharedObjectPtr target;
|
||||
const var::identifier name;
|
||||
const var newValue;
|
||||
var oldValue;
|
||||
const bool isAddingNewProperty, isDeletingProperty;
|
||||
|
||||
ValueTreeSetPropertyAction (const ValueTreeSetPropertyAction&);
|
||||
ValueTreeSetPropertyAction& operator= (const ValueTreeSetPropertyAction&);
|
||||
SetPropertyAction (const SetPropertyAction&);
|
||||
SetPropertyAction& operator= (const SetPropertyAction&);
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
class ValueTreeChildChangeAction : public UndoableAction
|
||||
class ValueTree::AddOrRemoveChildAction : public UndoableAction
|
||||
{
|
||||
public:
|
||||
ValueTreeChildChangeAction (const ValueTree::SharedObjectPtr& target_, const int childIndex_,
|
||||
const ValueTree::SharedObjectPtr& newChild_)
|
||||
AddOrRemoveChildAction (const SharedObjectPtr& target_, const int childIndex_,
|
||||
const SharedObjectPtr& newChild_)
|
||||
: target (target_),
|
||||
child (newChild_ != 0 ? newChild_ : target_->children [childIndex_]),
|
||||
childIndex (childIndex_),
|
||||
|
|
@ -98,7 +98,7 @@ public:
|
|||
jassert (child != 0);
|
||||
}
|
||||
|
||||
~ValueTreeChildChangeAction() {}
|
||||
~AddOrRemoveChildAction() {}
|
||||
|
||||
bool perform()
|
||||
{
|
||||
|
|
@ -133,12 +133,51 @@ public:
|
|||
}
|
||||
|
||||
private:
|
||||
const ValueTree::SharedObjectPtr target, child;
|
||||
const SharedObjectPtr target, child;
|
||||
const int childIndex;
|
||||
const bool isDeleting;
|
||||
|
||||
ValueTreeChildChangeAction (const ValueTreeChildChangeAction&);
|
||||
ValueTreeChildChangeAction& operator= (const ValueTreeChildChangeAction&);
|
||||
AddOrRemoveChildAction (const AddOrRemoveChildAction&);
|
||||
AddOrRemoveChildAction& operator= (const AddOrRemoveChildAction&);
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
class ValueTree::MoveChildAction : public UndoableAction
|
||||
{
|
||||
public:
|
||||
MoveChildAction (const SharedObjectPtr& target_,
|
||||
const int startIndex_, const int endIndex_)
|
||||
: target (target_),
|
||||
startIndex (startIndex_),
|
||||
endIndex (endIndex_)
|
||||
{
|
||||
}
|
||||
|
||||
~MoveChildAction() {}
|
||||
|
||||
bool perform()
|
||||
{
|
||||
target->moveChild (startIndex, endIndex, 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool undo()
|
||||
{
|
||||
target->moveChild (endIndex, startIndex, 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
int getSizeInUnits()
|
||||
{
|
||||
return (int) sizeof (*this); //xxx should be more accurate
|
||||
}
|
||||
|
||||
private:
|
||||
const SharedObjectPtr target, child;
|
||||
const int startIndex, endIndex;
|
||||
|
||||
MoveChildAction (const MoveChildAction&);
|
||||
MoveChildAction& operator= (const MoveChildAction&);
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -258,11 +297,11 @@ void ValueTree::SharedObject::setProperty (const var::identifier& name, const va
|
|||
if (existingValue != 0)
|
||||
{
|
||||
if (*existingValue != newValue)
|
||||
undoManager->perform (new ValueTreeSetPropertyAction (this, name, newValue, false, false));
|
||||
undoManager->perform (new SetPropertyAction (this, name, newValue, false, false));
|
||||
}
|
||||
else
|
||||
{
|
||||
undoManager->perform (new ValueTreeSetPropertyAction (this, name, newValue, true, false));
|
||||
undoManager->perform (new SetPropertyAction (this, name, newValue, true, false));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -282,7 +321,7 @@ void ValueTree::SharedObject::removeProperty (const var::identifier& name, UndoM
|
|||
else
|
||||
{
|
||||
if (properties.contains (name))
|
||||
undoManager->perform (new ValueTreeSetPropertyAction (this, name, var::null, false, true));
|
||||
undoManager->perform (new SetPropertyAction (this, name, var::null, false, true));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -300,7 +339,7 @@ void ValueTree::SharedObject::removeAllProperties (UndoManager* const undoManage
|
|||
else
|
||||
{
|
||||
for (int i = properties.size(); --i >= 0;)
|
||||
undoManager->perform (new ValueTreeSetPropertyAction (this, properties.getName(i), var::null, false, true));
|
||||
undoManager->perform (new SetPropertyAction (this, properties.getName(i), var::null, false, true));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -337,6 +376,11 @@ bool ValueTree::SharedObject::isAChildOf (const SharedObject* const possiblePare
|
|||
return false;
|
||||
}
|
||||
|
||||
int ValueTree::SharedObject::indexOf (const ValueTree& child) const
|
||||
{
|
||||
return children.indexOf (child.object);
|
||||
}
|
||||
|
||||
void ValueTree::SharedObject::addChild (SharedObject* child, int index, UndoManager* const undoManager)
|
||||
{
|
||||
if (child != 0 && child->parent != this)
|
||||
|
|
@ -366,7 +410,7 @@ void ValueTree::SharedObject::addChild (SharedObject* child, int index, UndoMana
|
|||
if (index < 0)
|
||||
index = children.size();
|
||||
|
||||
undoManager->perform (new ValueTreeChildChangeAction (this, index, child));
|
||||
undoManager->perform (new AddOrRemoveChildAction (this, index, child));
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
@ -393,7 +437,7 @@ void ValueTree::SharedObject::removeChild (const int childIndex, UndoManager* co
|
|||
}
|
||||
else
|
||||
{
|
||||
undoManager->perform (new ValueTreeChildChangeAction (this, childIndex, 0));
|
||||
undoManager->perform (new AddOrRemoveChildAction (this, childIndex, 0));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -404,6 +448,28 @@ void ValueTree::SharedObject::removeAllChildren (UndoManager* const undoManager)
|
|||
removeChild (children.size() - 1, undoManager);
|
||||
}
|
||||
|
||||
void ValueTree::SharedObject::moveChild (int currentIndex, int newIndex, UndoManager* undoManager)
|
||||
{
|
||||
// The source index must be a valid index!
|
||||
jassert (((unsigned int) currentIndex) < (unsigned int) children.size());
|
||||
|
||||
if (currentIndex != newIndex
|
||||
&& ((unsigned int) currentIndex) < (unsigned int) children.size())
|
||||
{
|
||||
if (undoManager == 0)
|
||||
{
|
||||
children.move (currentIndex, newIndex);
|
||||
sendChildChangeMessage();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (((unsigned int) newIndex) >= (unsigned int) children.size())
|
||||
newIndex = children.size() - 1;
|
||||
|
||||
undoManager->perform (new MoveChildAction (this, currentIndex, newIndex));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
ValueTree::ValueTree() throw()
|
||||
|
|
@ -610,6 +676,11 @@ bool ValueTree::isAChildOf (const ValueTree& possibleParent) const
|
|||
return object != 0 && object->isAChildOf (possibleParent.object);
|
||||
}
|
||||
|
||||
int ValueTree::indexOf (const ValueTree& child) const
|
||||
{
|
||||
return object != 0 ? object->indexOf (child) : -1;
|
||||
}
|
||||
|
||||
void ValueTree::addChild (ValueTree child, int index, UndoManager* const undoManager)
|
||||
{
|
||||
if (object != 0)
|
||||
|
|
@ -634,6 +705,12 @@ void ValueTree::removeAllChildren (UndoManager* const undoManager)
|
|||
object->removeAllChildren (undoManager);
|
||||
}
|
||||
|
||||
void ValueTree::moveChild (int currentIndex, int newIndex, UndoManager* undoManager)
|
||||
{
|
||||
if (object != 0)
|
||||
object->moveChild (currentIndex, newIndex, undoManager);
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
void ValueTree::addListener (Listener* listener)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -159,7 +159,7 @@ public:
|
|||
so that this change can be undone.
|
||||
@see var, getProperty, removeProperty
|
||||
*/
|
||||
void setProperty (const var::identifier& name, const var& newValue, UndoManager* const undoManager);
|
||||
void setProperty (const var::identifier& name, const var& newValue, UndoManager* undoManager);
|
||||
|
||||
/** Returns true if the node contains a named property. */
|
||||
bool hasProperty (const var::identifier& name) const;
|
||||
|
|
@ -168,13 +168,13 @@ public:
|
|||
If the undoManager parameter is non-null, its UndoManager::perform() method will be used,
|
||||
so that this change can be undone.
|
||||
*/
|
||||
void removeProperty (const var::identifier& name, UndoManager* const undoManager);
|
||||
void removeProperty (const var::identifier& name, UndoManager* undoManager);
|
||||
|
||||
/** Removes all properties from the node.
|
||||
If the undoManager parameter is non-null, its UndoManager::perform() method will be used,
|
||||
so that this change can be undone.
|
||||
*/
|
||||
void removeAllProperties (UndoManager* const undoManager);
|
||||
void removeAllProperties (UndoManager* undoManager);
|
||||
|
||||
/** Returns the total number of properties that the node contains.
|
||||
@see getProperty.
|
||||
|
|
@ -192,7 +192,7 @@ public:
|
|||
it needs to change the value. Attaching a Value::Listener to the value object will provide
|
||||
callbacks whenever the property changes.
|
||||
*/
|
||||
Value getPropertyAsValue (const var::identifier& name, UndoManager* const undoManager) const;
|
||||
Value getPropertyAsValue (const var::identifier& name, UndoManager* undoManager) const;
|
||||
|
||||
//==============================================================================
|
||||
/** Returns the number of child nodes belonging to this one.
|
||||
|
|
@ -233,31 +233,50 @@ public:
|
|||
If the undoManager parameter is non-null, its UndoManager::perform() method will be used,
|
||||
so that this change can be undone.
|
||||
*/
|
||||
void addChild (ValueTree child, int index, UndoManager* const undoManager);
|
||||
void addChild (ValueTree child, int index, UndoManager* undoManager);
|
||||
|
||||
/** Removes the specified child from this node's child-list.
|
||||
If the undoManager parameter is non-null, its UndoManager::perform() method will be used,
|
||||
so that this change can be undone.
|
||||
*/
|
||||
void removeChild (const ValueTree& child, UndoManager* const undoManager);
|
||||
void removeChild (const ValueTree& child, UndoManager* undoManager);
|
||||
|
||||
/** Removes a child from this node's child-list.
|
||||
If the undoManager parameter is non-null, its UndoManager::perform() method will be used,
|
||||
so that this change can be undone.
|
||||
*/
|
||||
void removeChild (const int childIndex, UndoManager* const undoManager);
|
||||
void removeChild (int childIndex, UndoManager* undoManager);
|
||||
|
||||
/** Removes all child-nodes from this node.
|
||||
If the undoManager parameter is non-null, its UndoManager::perform() method will be used,
|
||||
so that this change can be undone.
|
||||
*/
|
||||
void removeAllChildren (UndoManager* const undoManager);
|
||||
void removeAllChildren (UndoManager* undoManager);
|
||||
|
||||
/** Moves one of the children to a different index.
|
||||
|
||||
This will move the child to a specified index, shuffling along any intervening
|
||||
items as required. So for example, if you have a list of { 0, 1, 2, 3, 4, 5 }, then
|
||||
calling move (2, 4) would result in { 0, 1, 3, 4, 2, 5 }.
|
||||
|
||||
@param currentIndex the index of the item to be moved. If this isn't a
|
||||
valid index, then nothing will be done
|
||||
@param newIndex the index at which you'd like this item to end up. If this
|
||||
is less than zero, the value will be moved to the end
|
||||
of the list
|
||||
*/
|
||||
void moveChild (int currentIndex, int newIndex, UndoManager* undoManager);
|
||||
|
||||
/** Returns true if this node is anywhere below the specified parent node.
|
||||
This returns true if the node is a child-of-a-child, as well as a direct child.
|
||||
*/
|
||||
bool isAChildOf (const ValueTree& possibleParent) const;
|
||||
|
||||
/** Returns the index of a child item in this parent.
|
||||
If the child isn't found, this returns -1.
|
||||
*/
|
||||
int indexOf (const ValueTree& child) const;
|
||||
|
||||
/** Returns the parent node that contains this one.
|
||||
If the node has no parent, this will return an invalid node. (See isValid() to find out
|
||||
whether a node is valid).
|
||||
|
|
@ -403,8 +422,12 @@ public:
|
|||
juce_UseDebuggingNewOperator
|
||||
|
||||
private:
|
||||
friend class ValueTreeSetPropertyAction;
|
||||
friend class ValueTreeChildChangeAction;
|
||||
class SetPropertyAction;
|
||||
friend class SetPropertyAction;
|
||||
class AddOrRemoveChildAction;
|
||||
friend class AddOrRemoveChildAction;
|
||||
class MoveChildAction;
|
||||
friend class MoveChildAction;
|
||||
|
||||
class JUCE_API SharedObject : public ReferenceCountedObject
|
||||
{
|
||||
|
|
@ -426,16 +449,18 @@ private:
|
|||
void sendParentChangeMessage();
|
||||
const var& getProperty (const var::identifier& name) const;
|
||||
const var getProperty (const var::identifier& name, const var& defaultReturnValue) const;
|
||||
void setProperty (const var::identifier& name, const var& newValue, UndoManager* const undoManager);
|
||||
void setProperty (const var::identifier& name, const var& newValue, UndoManager*);
|
||||
bool hasProperty (const var::identifier& name) const;
|
||||
void removeProperty (const var::identifier& name, UndoManager* const undoManager);
|
||||
void removeAllProperties (UndoManager* const undoManager);
|
||||
bool isAChildOf (const SharedObject* const possibleParent) const;
|
||||
void removeProperty (const var::identifier& name, UndoManager*);
|
||||
void removeAllProperties (UndoManager*);
|
||||
bool isAChildOf (const SharedObject* possibleParent) const;
|
||||
int indexOf (const ValueTree& child) const;
|
||||
ValueTree getChildWithName (const String& type) const;
|
||||
ValueTree getChildWithProperty (const var::identifier& propertyName, const var& propertyValue) const;
|
||||
void addChild (SharedObject* child, int index, UndoManager* const undoManager);
|
||||
void removeChild (const int childIndex, UndoManager* const undoManager);
|
||||
void removeAllChildren (UndoManager* const undoManager);
|
||||
void addChild (SharedObject* child, int index, UndoManager*);
|
||||
void removeChild (int childIndex, UndoManager*);
|
||||
void removeAllChildren (UndoManager*);
|
||||
void moveChild (int currentIndex, int newIndex, UndoManager*);
|
||||
XmlElement* createXml() const;
|
||||
|
||||
juce_UseDebuggingNewOperator
|
||||
|
|
@ -463,15 +488,14 @@ private:
|
|||
};
|
||||
|
||||
friend class SharedObject;
|
||||
|
||||
typedef ReferenceCountedObjectPtr <SharedObject> SharedObjectPtr;
|
||||
|
||||
ReferenceCountedObjectPtr <SharedObject> object;
|
||||
SharedObjectPtr object;
|
||||
ListenerList <Listener> listeners;
|
||||
|
||||
public:
|
||||
/** @internal */
|
||||
explicit ValueTree (SharedObject* const object_); // (can be made private when VC6 support is finally dropped)
|
||||
explicit ValueTree (SharedObject*); // (can be made private when VC6 support is finally dropped)
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue