diff options
Diffstat (limited to 'ingen')
-rw-r--r-- | ingen/GraphObject.hpp | 4 | ||||
-rw-r--r-- | ingen/Store.hpp | 40 | ||||
-rw-r--r-- | ingen/client/ClientStore.hpp | 6 | ||||
-rw-r--r-- | ingen/client/NodeModel.hpp | 2 |
4 files changed, 36 insertions, 16 deletions
diff --git a/ingen/GraphObject.hpp b/ingen/GraphObject.hpp index 048aaebd..25d6ea75 100644 --- a/ingen/GraphObject.hpp +++ b/ingen/GraphObject.hpp @@ -31,6 +31,7 @@ namespace Ingen { class Edge; class Plugin; +class Store; /** An object on the audio graph - Patch, Node, Port, etc. * @@ -80,6 +81,9 @@ public: } protected: + friend class Store; + virtual void set_path(const Raul::Path& p) = 0; + GraphObject(URIs& uris, const Raul::Path& path) : Resource(uris, path_to_uri(path)) {} diff --git a/ingen/Store.hpp b/ingen/Store.hpp index f35c8368..87f6f7e0 100644 --- a/ingen/Store.hpp +++ b/ingen/Store.hpp @@ -17,32 +17,52 @@ #ifndef INGEN_STORE_HPP #define INGEN_STORE_HPP -#include <string> +#include <map> #undef nil #include <glibmm/thread.h> -#include "raul/PathTable.hpp" - #include "ingen/GraphObject.hpp" +#include "raul/Deletable.hpp" +#include "raul/Noncopyable.hpp" namespace Ingen { /** Store of objects in the patch hierarchy. * @ingroup IngenShared */ -class Store : public Raul::PathTable< SharedPtr<GraphObject> > { +class Store : public Raul::Noncopyable + , public Raul::Deletable + , public std::map< const Raul::Path, SharedPtr<GraphObject> > { public: - virtual ~Store() {} - - virtual void add(GraphObject* o); + void add(GraphObject* o); - typedef Raul::Table< Raul::Path, SharedPtr<GraphObject> > Objects; + GraphObject* get(const Raul::Path& path) { + const iterator i = find(path); + return (i == end()) ? NULL : i->second.get(); + } typedef std::pair<const_iterator, const_iterator> const_range; - const_range - children_range(SharedPtr<const GraphObject> o) const; + typedef std::map< Raul::Path, SharedPtr<GraphObject> > Objects; + + iterator find_descendants_end(Store::iterator parent); + const_iterator find_descendants_end(Store::const_iterator parent) const; + + const_range children_range(SharedPtr<const GraphObject> o) const; + + /** Remove the object at @p top and all its children from the store. + * + * @param removed Filled with all the removed objects. Note this may be + * many objects since any children will be removed as well. + */ + void remove(iterator top, Objects& removed); + + /** Rename (move) the object at @p top to @p new_path. + * + * Note this invalidates @p i. + */ + void rename(iterator i, const Raul::Path& new_path); unsigned child_name_offset(const Raul::Path& parent, const Raul::Symbol& symbol, diff --git a/ingen/client/ClientStore.hpp b/ingen/client/ClientStore.hpp index 3762dcb0..cfa9df12 100644 --- a/ingen/client/ClientStore.hpp +++ b/ingen/client/ClientStore.hpp @@ -25,9 +25,7 @@ #include "ingen/client/signal.hpp" #include "ingen/Store.hpp" #include "raul/Path.hpp" -#include "raul/PathTable.hpp" #include "raul/SharedPtr.hpp" -#include "raul/TableImpl.hpp" namespace Raul { class Atom; } @@ -67,7 +65,7 @@ public: void clear(); - typedef Raul::Table<Raul::URI, SharedPtr<PluginModel> > Plugins; + typedef std::map< const Raul::URI, SharedPtr<PluginModel> > Plugins; SharedPtr<const Plugins> plugins() const { return _plugins; } SharedPtr<Plugins> plugins() { return _plugins; } void set_plugins(SharedPtr<Plugins> p) { _plugins = p; } @@ -109,8 +107,6 @@ public: INGEN_SIGNAL(new_plugin, void, SharedPtr<PluginModel>); private: - void add(GraphObject* o) { throw; } - SharedPtr<ObjectModel> _object(const Raul::Path& path); SharedPtr<PluginModel> _plugin(const Raul::URI& uri); SharedPtr<Resource> _resource(const Raul::URI& uri); diff --git a/ingen/client/NodeModel.hpp b/ingen/client/NodeModel.hpp index 93a512f0..9f2fab6e 100644 --- a/ingen/client/NodeModel.hpp +++ b/ingen/client/NodeModel.hpp @@ -96,7 +96,7 @@ protected: virtual void clear(); - Ports _ports; ///< Vector of ports (not a Table to preserve order) + Ports _ports; ///< Vector of ports Raul::URI _plugin_uri; ///< Plugin URI (if PluginModel is unknown) SharedPtr<PluginModel> _plugin; ///< The plugin this node is an instance of |