From 2506e612b0cea27b0af242b90db6d98670ef64ca Mon Sep 17 00:00:00 2001 From: MartyLake Date: Tue, 29 Mar 2016 20:43:40 +0200 Subject: [PATCH 01/13] =?UTF-8?q?[FIX]=20Force=20cpp11=C2=A0language?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrdtExamples.jucer | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CrdtExamples.jucer b/CrdtExamples.jucer index a688bbe..ddb2cc3 100644 --- a/CrdtExamples.jucer +++ b/CrdtExamples.jucer @@ -26,9 +26,10 @@ + isDebug="1" optimisation="1" targetName="CrdtExamples" cppLanguageStandard="c++11"/> + isDebug="0" optimisation="3" targetName="CrdtExamples" linkTimeOptimisation="1" + cppLanguageStandard="c++11"/> From 1f3c2a560db676d56f4c1a8ea454565a923ca9ef Mon Sep 17 00:00:00 2001 From: MartyLake Date: Tue, 29 Mar 2016 21:48:34 +0200 Subject: [PATCH 02/13] Add new blank class NetworkComponent : public juce::MultiDocumentPanel --- CrdtExamples.jucer | 4 ++++ Source/MainComponent.cpp | 12 ++++-------- Source/crdtsimNetworkComponent.cpp | 8 ++++++++ Source/crdtsimNetworkComponent.h | 13 +++++++++++++ 4 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 Source/crdtsimNetworkComponent.cpp create mode 100644 Source/crdtsimNetworkComponent.h diff --git a/CrdtExamples.jucer b/CrdtExamples.jucer index ddb2cc3..50c6c93 100644 --- a/CrdtExamples.jucer +++ b/CrdtExamples.jucer @@ -14,6 +14,10 @@ file="Source/crdtsimNetwork.cpp"/> + + diff --git a/Source/MainComponent.cpp b/Source/MainComponent.cpp index eb9967c..ba3bdad 100644 --- a/Source/MainComponent.cpp +++ b/Source/MainComponent.cpp @@ -10,6 +10,7 @@ #define MAINCOMPONENT_H_INCLUDED #include "../JuceLibraryCode/JuceHeader.h" +#include "crdtsimNetworkComponent.h" //============================================================================== /* @@ -22,6 +23,7 @@ class MainContentComponent : public AnimatedAppComponent //============================================================================== MainContentComponent () { + addAndMakeVisible (&networkComponent); setSize (800, 600); setFramesPerSecond (60); } @@ -47,18 +49,12 @@ class MainContentComponent : public AnimatedAppComponent void resized () override { - // This is called when the MainContentComponent is resized. - // If you add any child components, this is where you should - // update their positions. + networkComponent.setBounds (getLocalBounds ()); } private: - //============================================================================== - - // Your private member variables go here... - - + crdtsim::NetworkComponent networkComponent; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainContentComponent) }; diff --git a/Source/crdtsimNetworkComponent.cpp b/Source/crdtsimNetworkComponent.cpp new file mode 100644 index 0000000..7d4f3f4 --- /dev/null +++ b/Source/crdtsimNetworkComponent.cpp @@ -0,0 +1,8 @@ +#include "crdtsimNetworkComponent.h" + +using namespace crdtsim; + +bool NetworkComponent::tryToCloseDocument (juce::Component* component) +{ + //TODO +} diff --git a/Source/crdtsimNetworkComponent.h b/Source/crdtsimNetworkComponent.h new file mode 100644 index 0000000..a824ba0 --- /dev/null +++ b/Source/crdtsimNetworkComponent.h @@ -0,0 +1,13 @@ +#ifndef CRDTSIMNETWORKCOMPONENT_H_INCLUDED +#define CRDTSIMNETWORKCOMPONENT_H_INCLUDED + +#include "JuceHeader.h" +namespace crdtsim +{ +class NetworkComponent : public juce::MultiDocumentPanel +{ +public: + bool tryToCloseDocument (juce::Component* component) override; +}; +} //namespace crdtsim +#endif // CRDTSIMNETWORKCOMPONENT_H_INCLUDED From 1eb09f0de78e304df1d373b5efab8318927026be Mon Sep 17 00:00:00 2001 From: MartyLake Date: Tue, 29 Mar 2016 22:17:48 +0200 Subject: [PATCH 03/13] Add Network::valuetree member and getter method. --- Source/crdtsimNetwork.cpp | 6 +++++- Source/crdtsimNetwork.h | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Source/crdtsimNetwork.cpp b/Source/crdtsimNetwork.cpp index 667827d..ca52bcf 100644 --- a/Source/crdtsimNetwork.cpp +++ b/Source/crdtsimNetwork.cpp @@ -1,9 +1,9 @@ #include "crdtsimNetwork.h" -#include "JuceHeader.h" #include namespace crdtsim { +Network::Network () : valueTree ("RootNetwork") {} int Network::size () const { return nodes.size (); } int Network::createNode () { @@ -98,6 +98,10 @@ void Network::eraseAllConnexionsWithNode (int nodeIdentifier) }; connexions.erase (std::remove_if (std::begin (connexions), std::end (connexions), sameDestinationPredicate), std::end (connexions)); } +juce::ValueTree& Network::getValueTree () +{ + return valueTree; +} class TestNetwork : public juce::UnitTest diff --git a/Source/crdtsimNetwork.h b/Source/crdtsimNetwork.h index eb93b20..b227428 100644 --- a/Source/crdtsimNetwork.h +++ b/Source/crdtsimNetwork.h @@ -3,11 +3,13 @@ #include #include "crdtsimNode.h" #include "crdtsimConnexion.h" +#include "JuceHeader.h" namespace crdtsim { class Network { public: + Network (); int size () const; int createNode (); const Node* getNode (int identifier) const; @@ -15,6 +17,7 @@ class Network bool createConnexion (int sourceIdentifier, int destinationIdentifier); bool eraseConnexion (int sourceIdentifier, int destinationIdentifier); bool connexionExists (int sourceIdentifier, int destinationIdentifier); + juce::ValueTree& getValueTree (); private: std::vector nodes; @@ -22,6 +25,7 @@ class Network std::vector connexions; void eraseAllConnexionsWithNode (int nodeIdentifier); + juce::ValueTree valueTree; }; } //crdtsim #endif // NETWORK_H_INCLUDED From 2d365f17ea7b5efa7f0be8dfcd500436afa47a77 Mon Sep 17 00:00:00 2001 From: MartyLake Date: Tue, 29 Mar 2016 22:18:15 +0200 Subject: [PATCH 04/13] Network creates a valuetree child upon node creation. --- Source/crdtsimNetwork.cpp | 13 +++++++++++++ Source/crdtsimNetwork.h | 1 + 2 files changed, 14 insertions(+) diff --git a/Source/crdtsimNetwork.cpp b/Source/crdtsimNetwork.cpp index ca52bcf..de75941 100644 --- a/Source/crdtsimNetwork.cpp +++ b/Source/crdtsimNetwork.cpp @@ -10,6 +10,8 @@ int Network::createNode () auto newNode = Node{lastNodeIdentifier++}; nodes.push_back (newNode); jassert (size () > 0); + valueTree.getOrCreateChildWithName (getNodeIdentifier (nodes.back ().getIdentifier ()), nullptr); + jassert (valueTree.getNumChildren () > 0); return nodes.back ().getIdentifier (); } const Node* Network::getNode (int identifier) const @@ -102,6 +104,10 @@ juce::ValueTree& Network::getValueTree () { return valueTree; } +juce::Identifier Network::getNodeIdentifier (int nodeIdentifier) +{ + return juce::String ("NODE#" + std::to_string (nodeIdentifier)); +} class TestNetwork : public juce::UnitTest @@ -232,6 +238,13 @@ class TestNetwork : public juce::UnitTest expect (!network.connexionExists (nodeIdentifier1, nodeIdentifier2)); expect (!network.connexionExists (nodeIdentifier2, nodeIdentifier3)); } + { + beginTest ("Network creates a child to ValueTree when creating a node."); + Network network; + auto initialValueTreeSize = network.getValueTree ().getNumChildren (); + network.createNode (); + expectEquals (network.getValueTree ().getNumChildren (), initialValueTreeSize + 1, "Network hasn't taken care of its tree."); + } } } testTestNetwork; } diff --git a/Source/crdtsimNetwork.h b/Source/crdtsimNetwork.h index b227428..499cfc5 100644 --- a/Source/crdtsimNetwork.h +++ b/Source/crdtsimNetwork.h @@ -26,6 +26,7 @@ class Network void eraseAllConnexionsWithNode (int nodeIdentifier); juce::ValueTree valueTree; + static juce::Identifier getNodeIdentifier (int nodeIdentifier); }; } //crdtsim #endif // NETWORK_H_INCLUDED From f1d74858c57df07b367f8b7c599d7c26d96a254c Mon Sep 17 00:00:00 2001 From: MartyLake Date: Tue, 29 Mar 2016 22:23:25 +0200 Subject: [PATCH 05/13] Network remove a valuetree child upon node deletion. --- Source/crdtsimNetwork.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Source/crdtsimNetwork.cpp b/Source/crdtsimNetwork.cpp index de75941..bfa5cd6 100644 --- a/Source/crdtsimNetwork.cpp +++ b/Source/crdtsimNetwork.cpp @@ -41,6 +41,7 @@ bool Network::eraseNode (int identifier) return false; } nodes.erase (nodeToRemodeIt, std::end (nodes)); + valueTree.removeChild (valueTree.getChildWithName (getNodeIdentifier (identifier)), nullptr); eraseAllConnexionsWithNode (identifier); return true; } @@ -245,6 +246,14 @@ class TestNetwork : public juce::UnitTest network.createNode (); expectEquals (network.getValueTree ().getNumChildren (), initialValueTreeSize + 1, "Network hasn't taken care of its tree."); } + { + beginTest ("Network deletes a child to ValueTree when deleting a node."); + Network network; + auto nodeId = network.createNode (); + auto initialValueTreeSize = network.getValueTree ().getNumChildren (); + network.eraseNode (nodeId); + expectEquals (network.getValueTree ().getNumChildren (), initialValueTreeSize - 1, "Network hasn't taken care of its tree."); + } } } testTestNetwork; } From 48bb915aa4a88e11ea954711bcaf0803efa9a0ef Mon Sep 17 00:00:00 2001 From: MartyLake Date: Tue, 29 Mar 2016 22:32:41 +0200 Subject: [PATCH 06/13] Network creates a child to ValueTree when creating a connexion. --- Source/crdtsimNetwork.cpp | 14 ++++++++++++++ Source/crdtsimNetwork.h | 1 + 2 files changed, 15 insertions(+) diff --git a/Source/crdtsimNetwork.cpp b/Source/crdtsimNetwork.cpp index bfa5cd6..e334c8f 100644 --- a/Source/crdtsimNetwork.cpp +++ b/Source/crdtsimNetwork.cpp @@ -67,6 +67,7 @@ bool Network::createConnexion (int sourceIdentifier, int destinationIdentifier) if (std::find (std::begin (connexions), std::end (connexions), connexionToAdd) == std::end (connexions)) { connexions.push_back (connexionToAdd); + valueTree.getOrCreateChildWithName (getConnexionIdentifier (sourceIdentifier, destinationIdentifier), nullptr); } return true; } @@ -109,6 +110,10 @@ juce::Identifier Network::getNodeIdentifier (int nodeIdentifier) { return juce::String ("NODE#" + std::to_string (nodeIdentifier)); } +juce::Identifier Network::getConnexionIdentifier (int sourceIdentifier, int destinationIdentifier) +{ + return juce::String ("CONNEXION#" + std::to_string (sourceIdentifier) + "->" + std::to_string (destinationIdentifier)); +} class TestNetwork : public juce::UnitTest @@ -254,6 +259,15 @@ class TestNetwork : public juce::UnitTest network.eraseNode (nodeId); expectEquals (network.getValueTree ().getNumChildren (), initialValueTreeSize - 1, "Network hasn't taken care of its tree."); } + { + beginTest ("Network creates a child to ValueTree when creating a connexion."); + Network network; + auto nodeId1 = network.createNode (); + auto nodeId2 = network.createNode (); + auto initialValueTreeSize = network.getValueTree ().getNumChildren (); + network.createConnexion (nodeId1, nodeId2); + expectEquals (network.getValueTree ().getNumChildren (), initialValueTreeSize + 1, "Network hasn't taken care of its tree."); + } } } testTestNetwork; } diff --git a/Source/crdtsimNetwork.h b/Source/crdtsimNetwork.h index 499cfc5..7be926d 100644 --- a/Source/crdtsimNetwork.h +++ b/Source/crdtsimNetwork.h @@ -27,6 +27,7 @@ class Network void eraseAllConnexionsWithNode (int nodeIdentifier); juce::ValueTree valueTree; static juce::Identifier getNodeIdentifier (int nodeIdentifier); + static juce::Identifier getConnexionIdentifier (int sourceIdentifier, int destinationIdentifier); }; } //crdtsim #endif // NETWORK_H_INCLUDED From 42c48e8d7ddb6fd623c926b900685fffc0d5d440 Mon Sep 17 00:00:00 2001 From: MartyLake Date: Tue, 29 Mar 2016 22:43:35 +0200 Subject: [PATCH 07/13] Network deletes a child to ValueTree when deleting a connexion. --- Source/crdtsimNetwork.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Source/crdtsimNetwork.cpp b/Source/crdtsimNetwork.cpp index e334c8f..c89979d 100644 --- a/Source/crdtsimNetwork.cpp +++ b/Source/crdtsimNetwork.cpp @@ -81,6 +81,7 @@ bool Network::eraseConnexion (int sourceIdentifier, int destinationIdentifier) return false; } connexions.erase (findResult); + valueTree.removeChild (valueTree.getChildWithName (getConnexionIdentifier (sourceIdentifier, destinationIdentifier)), nullptr); return true; } bool Network::connexionExists (int sourceIdentifier, int destinationIdentifier) @@ -268,6 +269,16 @@ class TestNetwork : public juce::UnitTest network.createConnexion (nodeId1, nodeId2); expectEquals (network.getValueTree ().getNumChildren (), initialValueTreeSize + 1, "Network hasn't taken care of its tree."); } + { + beginTest ("Network deletes a child to ValueTree when deleting a connexion."); + Network network; + auto nodeId1 = network.createNode (); + auto nodeId2 = network.createNode (); + network.createConnexion (nodeId1, nodeId2); + auto initialValueTreeSize = network.getValueTree ().getNumChildren (); + network.eraseConnexion (nodeId1, nodeId2); + expectEquals (network.getValueTree ().getNumChildren (), initialValueTreeSize - 1, "Network hasn't taken care of its tree."); + } } } testTestNetwork; } From ba5e57027d297e4219cbcb5182e708253807c09e Mon Sep 17 00:00:00 2001 From: MartyLake Date: Tue, 29 Mar 2016 23:06:20 +0200 Subject: [PATCH 08/13] Refactor Network to use two different valueTrees for nodes and connexions. --- Source/crdtsimNetwork.cpp | 32 ++++++++++++++++++-------------- Source/crdtsimNetwork.h | 3 ++- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/Source/crdtsimNetwork.cpp b/Source/crdtsimNetwork.cpp index c89979d..33c68e1 100644 --- a/Source/crdtsimNetwork.cpp +++ b/Source/crdtsimNetwork.cpp @@ -10,7 +10,7 @@ int Network::createNode () auto newNode = Node{lastNodeIdentifier++}; nodes.push_back (newNode); jassert (size () > 0); - valueTree.getOrCreateChildWithName (getNodeIdentifier (nodes.back ().getIdentifier ()), nullptr); + getNodesValueTree ().getOrCreateChildWithName (getNodeIdentifier (nodes.back ().getIdentifier ()), nullptr); jassert (valueTree.getNumChildren () > 0); return nodes.back ().getIdentifier (); } @@ -41,7 +41,7 @@ bool Network::eraseNode (int identifier) return false; } nodes.erase (nodeToRemodeIt, std::end (nodes)); - valueTree.removeChild (valueTree.getChildWithName (getNodeIdentifier (identifier)), nullptr); + getNodesValueTree ().removeChild (getNodesValueTree ().getChildWithName (getNodeIdentifier (identifier)), nullptr); eraseAllConnexionsWithNode (identifier); return true; } @@ -67,7 +67,7 @@ bool Network::createConnexion (int sourceIdentifier, int destinationIdentifier) if (std::find (std::begin (connexions), std::end (connexions), connexionToAdd) == std::end (connexions)) { connexions.push_back (connexionToAdd); - valueTree.getOrCreateChildWithName (getConnexionIdentifier (sourceIdentifier, destinationIdentifier), nullptr); + getConnexionsValueTree ().getOrCreateChildWithName (getConnexionIdentifier (sourceIdentifier, destinationIdentifier), nullptr); } return true; } @@ -81,7 +81,7 @@ bool Network::eraseConnexion (int sourceIdentifier, int destinationIdentifier) return false; } connexions.erase (findResult); - valueTree.removeChild (valueTree.getChildWithName (getConnexionIdentifier (sourceIdentifier, destinationIdentifier)), nullptr); + getConnexionsValueTree ().removeChild (getConnexionsValueTree ().getChildWithName (getConnexionIdentifier (sourceIdentifier, destinationIdentifier)), nullptr); return true; } bool Network::connexionExists (int sourceIdentifier, int destinationIdentifier) @@ -103,9 +103,13 @@ void Network::eraseAllConnexionsWithNode (int nodeIdentifier) }; connexions.erase (std::remove_if (std::begin (connexions), std::end (connexions), sameDestinationPredicate), std::end (connexions)); } -juce::ValueTree& Network::getValueTree () +juce::ValueTree Network::getNodesValueTree () { - return valueTree; + return valueTree.getOrCreateChildWithName ("NODES", nullptr); +} +juce::ValueTree Network::getConnexionsValueTree () +{ + return valueTree.getOrCreateChildWithName ("CONNEXIONS", nullptr); } juce::Identifier Network::getNodeIdentifier (int nodeIdentifier) { @@ -248,26 +252,26 @@ class TestNetwork : public juce::UnitTest { beginTest ("Network creates a child to ValueTree when creating a node."); Network network; - auto initialValueTreeSize = network.getValueTree ().getNumChildren (); + auto initialValueTreeSize = network.getNodesValueTree ().getNumChildren (); network.createNode (); - expectEquals (network.getValueTree ().getNumChildren (), initialValueTreeSize + 1, "Network hasn't taken care of its tree."); + expectEquals (network.getNodesValueTree ().getNumChildren (), initialValueTreeSize + 1, "Network hasn't taken care of its tree."); } { beginTest ("Network deletes a child to ValueTree when deleting a node."); Network network; auto nodeId = network.createNode (); - auto initialValueTreeSize = network.getValueTree ().getNumChildren (); + auto initialValueTreeSize = network.getNodesValueTree ().getNumChildren (); network.eraseNode (nodeId); - expectEquals (network.getValueTree ().getNumChildren (), initialValueTreeSize - 1, "Network hasn't taken care of its tree."); + expectEquals (network.getNodesValueTree ().getNumChildren (), initialValueTreeSize - 1, "Network hasn't taken care of its tree."); } { beginTest ("Network creates a child to ValueTree when creating a connexion."); Network network; auto nodeId1 = network.createNode (); auto nodeId2 = network.createNode (); - auto initialValueTreeSize = network.getValueTree ().getNumChildren (); + auto initialValueTreeSize = network.getConnexionsValueTree ().getNumChildren (); network.createConnexion (nodeId1, nodeId2); - expectEquals (network.getValueTree ().getNumChildren (), initialValueTreeSize + 1, "Network hasn't taken care of its tree."); + expectEquals (network.getConnexionsValueTree ().getNumChildren (), initialValueTreeSize + 1, "Network hasn't taken care of its tree."); } { beginTest ("Network deletes a child to ValueTree when deleting a connexion."); @@ -275,9 +279,9 @@ class TestNetwork : public juce::UnitTest auto nodeId1 = network.createNode (); auto nodeId2 = network.createNode (); network.createConnexion (nodeId1, nodeId2); - auto initialValueTreeSize = network.getValueTree ().getNumChildren (); + auto initialValueTreeSize = network.getConnexionsValueTree ().getNumChildren (); network.eraseConnexion (nodeId1, nodeId2); - expectEquals (network.getValueTree ().getNumChildren (), initialValueTreeSize - 1, "Network hasn't taken care of its tree."); + expectEquals (network.getConnexionsValueTree ().getNumChildren (), initialValueTreeSize - 1, "Network hasn't taken care of its tree."); } } } testTestNetwork; diff --git a/Source/crdtsimNetwork.h b/Source/crdtsimNetwork.h index 7be926d..03d4188 100644 --- a/Source/crdtsimNetwork.h +++ b/Source/crdtsimNetwork.h @@ -17,7 +17,8 @@ class Network bool createConnexion (int sourceIdentifier, int destinationIdentifier); bool eraseConnexion (int sourceIdentifier, int destinationIdentifier); bool connexionExists (int sourceIdentifier, int destinationIdentifier); - juce::ValueTree& getValueTree (); + juce::ValueTree getNodesValueTree (); + juce::ValueTree getConnexionsValueTree (); private: std::vector nodes; From 73220fddc6656e7723e098c144aced067be6c5ed Mon Sep 17 00:00:00 2001 From: MartyLake Date: Tue, 29 Mar 2016 23:32:36 +0200 Subject: [PATCH 09/13] [WIP] --- Source/MainComponent.cpp | 7 ++++ Source/crdtsimNetworkComponent.cpp | 60 ++++++++++++++++++++++++++++++ Source/crdtsimNetworkComponent.h | 14 ++++++- 3 files changed, 80 insertions(+), 1 deletion(-) diff --git a/Source/MainComponent.cpp b/Source/MainComponent.cpp index ba3bdad..6b4d521 100644 --- a/Source/MainComponent.cpp +++ b/Source/MainComponent.cpp @@ -11,6 +11,7 @@ #include "../JuceLibraryCode/JuceHeader.h" #include "crdtsimNetworkComponent.h" +#include "crdtsimNetwork.h" //============================================================================== /* @@ -23,6 +24,11 @@ class MainContentComponent : public AnimatedAppComponent //============================================================================== MainContentComponent () { + //MODEL + networkComponent.setNodesValueTree (network.getNodesValueTree ()); + networkComponent.setConnexionsValueTree (network.getConnexionsValueTree ()); + network.createNode (); + //VIEW addAndMakeVisible (&networkComponent); setSize (800, 600); setFramesPerSecond (60); @@ -55,6 +61,7 @@ class MainContentComponent : public AnimatedAppComponent private: crdtsim::NetworkComponent networkComponent; + crdtsim::Network network; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainContentComponent) }; diff --git a/Source/crdtsimNetworkComponent.cpp b/Source/crdtsimNetworkComponent.cpp index 7d4f3f4..baccf11 100644 --- a/Source/crdtsimNetworkComponent.cpp +++ b/Source/crdtsimNetworkComponent.cpp @@ -2,7 +2,67 @@ using namespace crdtsim; +NetworkComponent::NetworkComponent () +{ + useFullscreenWhenOneDocument (false); + setLayoutMode (LayoutMode::FloatingWindows); +} bool NetworkComponent::tryToCloseDocument (juce::Component* component) { //TODO } +void NetworkComponent::setNodesValueTree (juce::ValueTree newValueTree) +{ + nodesValueTree = newValueTree; + nodesValueTree.addListener (this); +} +void NetworkComponent::setConnexionsValueTree (juce::ValueTree newValueTree) +{ + connexionsValueTree = newValueTree; + connexionsValueTree.addListener (this); +} +void NetworkComponent::valueTreePropertyChanged (ValueTree& treeWhosePropertyHasChanged, const Identifier& property) +{ + //TODO +} +void NetworkComponent::valueTreeChildAdded (ValueTree& parentTree, ValueTree& childWhichHasBeenAdded) +{ + if (parentTree == nodesValueTree) + { + auto identifier = childWhichHasBeenAdded.getType (); + auto newNote = new juce::TextButton{}; + newNote->setButtonText (identifier.toString ()); + addDocument (newNote, Colours::lightblue.withAlpha (0.6f), true); + } + else if (parentTree == connexionsValueTree) + { + //TODO + } + else + { + jassertfalse; + } +} +void NetworkComponent::valueTreeChildRemoved (ValueTree& parentTree, ValueTree& childWhichHasBeenRemoved, int /*indexFromWhichChildWasRemoved*/) +{ + if (parentTree == nodesValueTree) + { + //TODO + } + else if (parentTree == connexionsValueTree) + { + //TODO + } + else + { + jassertfalse; + } +} +void NetworkComponent::valueTreeChildOrderChanged (ValueTree& parentTreeWhoseChildrenHaveMoved, int oldIndex, int newIndex) +{ + //TODO +} +void NetworkComponent::valueTreeParentChanged (ValueTree& treeWhoseParentHasChanged) +{ + //TODO +} diff --git a/Source/crdtsimNetworkComponent.h b/Source/crdtsimNetworkComponent.h index a824ba0..0cf726e 100644 --- a/Source/crdtsimNetworkComponent.h +++ b/Source/crdtsimNetworkComponent.h @@ -4,10 +4,22 @@ #include "JuceHeader.h" namespace crdtsim { -class NetworkComponent : public juce::MultiDocumentPanel +class NetworkComponent : public juce::MultiDocumentPanel, + public juce::ValueTree::Listener { public: + NetworkComponent (); bool tryToCloseDocument (juce::Component* component) override; + void setNodesValueTree (juce::ValueTree newValueTree); + void setConnexionsValueTree (juce::ValueTree newValueTree); + void valueTreePropertyChanged (ValueTree& treeWhosePropertyHasChanged, const Identifier& property) override; + void valueTreeChildAdded (ValueTree& parentTree, ValueTree& childWhichHasBeenAdded) override; + void valueTreeChildRemoved (ValueTree& parentTree, ValueTree& childWhichHasBeenRemoved, int indexFromWhichChildWasRemoved) override; + void valueTreeChildOrderChanged (ValueTree& parentTreeWhoseChildrenHaveMoved, int oldIndex, int newIndex) override; + void valueTreeParentChanged (ValueTree& treeWhoseParentHasChanged) override; + +private: + juce::ValueTree nodesValueTree, connexionsValueTree; }; } //namespace crdtsim #endif // CRDTSIMNETWORKCOMPONENT_H_INCLUDED From c24c3d853bcc3b0218fef9adfa75b8df89b878ec Mon Sep 17 00:00:00 2001 From: MartyLake Date: Tue, 12 Apr 2016 08:22:57 +0200 Subject: [PATCH 10/13] Add new class NodesMultiDocumentPanelWindow to customize the window layout of Nodes in the Network comp. --- Source/crdtsimNetworkComponent.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Source/crdtsimNetworkComponent.cpp b/Source/crdtsimNetworkComponent.cpp index baccf11..733b809 100644 --- a/Source/crdtsimNetworkComponent.cpp +++ b/Source/crdtsimNetworkComponent.cpp @@ -2,6 +2,15 @@ using namespace crdtsim; +class NodesMultiDocumentPanelWindow : public MultiDocumentPanelWindow +{ +public: + NodesMultiDocumentPanelWindow (Colour backgroundColour) : MultiDocumentPanelWindow (backgroundColour) + { + setTitleBarButtonsRequired (DocumentWindow::closeButton, true); + } +}; + NetworkComponent::NetworkComponent () { useFullscreenWhenOneDocument (false); From 8d253c1912f7193a6381714aaa1a19f5f2e3bcbe Mon Sep 17 00:00:00 2001 From: MartyLake Date: Tue, 12 Apr 2016 08:23:40 +0200 Subject: [PATCH 11/13] Avoid flickering when adding a new node. --- Source/crdtsimNetworkComponent.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/crdtsimNetworkComponent.cpp b/Source/crdtsimNetworkComponent.cpp index 733b809..d911c74 100644 --- a/Source/crdtsimNetworkComponent.cpp +++ b/Source/crdtsimNetworkComponent.cpp @@ -41,6 +41,7 @@ void NetworkComponent::valueTreeChildAdded (ValueTree& parentTree, ValueTree& ch auto identifier = childWhichHasBeenAdded.getType (); auto newNote = new juce::TextButton{}; newNote->setButtonText (identifier.toString ()); + newNote->setSize (100, 100); addDocument (newNote, Colours::lightblue.withAlpha (0.6f), true); } else if (parentTree == connexionsValueTree) From 78cb142c603831fa084d7791d54f8860e7f62ac0 Mon Sep 17 00:00:00 2001 From: MartyLake Date: Tue, 12 Apr 2016 08:24:21 +0200 Subject: [PATCH 12/13] Apply customized MultiDocumentPanelWindow for Network Comp. --- Source/crdtsimNetworkComponent.cpp | 4 ++++ Source/crdtsimNetworkComponent.h | 1 + 2 files changed, 5 insertions(+) diff --git a/Source/crdtsimNetworkComponent.cpp b/Source/crdtsimNetworkComponent.cpp index d911c74..8f40b53 100644 --- a/Source/crdtsimNetworkComponent.cpp +++ b/Source/crdtsimNetworkComponent.cpp @@ -76,3 +76,7 @@ void NetworkComponent::valueTreeParentChanged (ValueTree& treeWhoseParentHasChan { //TODO } +MultiDocumentPanelWindow* NetworkComponent::createNewDocumentWindow () +{ + return new NodesMultiDocumentPanelWindow (getBackgroundColour ()); +} diff --git a/Source/crdtsimNetworkComponent.h b/Source/crdtsimNetworkComponent.h index 0cf726e..0af8768 100644 --- a/Source/crdtsimNetworkComponent.h +++ b/Source/crdtsimNetworkComponent.h @@ -17,6 +17,7 @@ class NetworkComponent : public juce::MultiDocumentPanel, void valueTreeChildRemoved (ValueTree& parentTree, ValueTree& childWhichHasBeenRemoved, int indexFromWhichChildWasRemoved) override; void valueTreeChildOrderChanged (ValueTree& parentTreeWhoseChildrenHaveMoved, int oldIndex, int newIndex) override; void valueTreeParentChanged (ValueTree& treeWhoseParentHasChanged) override; + MultiDocumentPanelWindow* createNewDocumentWindow () override; private: juce::ValueTree nodesValueTree, connexionsValueTree; From 618197bf069a194d45542ab2af7dfa6990f52a25 Mon Sep 17 00:00:00 2001 From: MartyLake Date: Tue, 12 Apr 2016 08:50:27 +0200 Subject: [PATCH 13/13] Add blank crdtsimNodeComponent cpp and h files. --- Source/crdtsimConnexionComponent.cpp | 3 +++ Source/crdtsimConnexionComponent.h | 10 ++++++++++ 2 files changed, 13 insertions(+) create mode 100644 Source/crdtsimConnexionComponent.cpp create mode 100644 Source/crdtsimConnexionComponent.h diff --git a/Source/crdtsimConnexionComponent.cpp b/Source/crdtsimConnexionComponent.cpp new file mode 100644 index 0000000..1e03c86 --- /dev/null +++ b/Source/crdtsimConnexionComponent.cpp @@ -0,0 +1,3 @@ +#include "crdtsimConnexionComponent.h" + +using namespace crdtsim; diff --git a/Source/crdtsimConnexionComponent.h b/Source/crdtsimConnexionComponent.h new file mode 100644 index 0000000..f386735 --- /dev/null +++ b/Source/crdtsimConnexionComponent.h @@ -0,0 +1,10 @@ +#ifndef CRDTSIMCONNEXIONCOMPONENT_H_INCLUDED +#define CRDTSIMCONNEXIONCOMPONENT_H_INCLUDED +#include "JuceHeader.h" +namespace crdtsim +{ +class NodeComponent : public juce::Component +{ +}; +} //namespace crdtsim +#endif // CRDTSIMCONNEXIONCOMPONENT_H_INCLUDED