From cd3dffb1d8838e813cfbf58d27e212db7f8eb0af Mon Sep 17 00:00:00 2001 From: David Robillard Date: Mon, 12 Mar 2007 18:13:03 +0000 Subject: Removed name-based interface for FlowCanvas (using the view as a model = evil), related performance improvements (especially for Machina). Updates for FlowCanvas API changes. Machina SMF import performance improvements (temporarily disabled node labels). git-svn-id: http://svn.drobilla.net/lad/ingen@356 a436a847-0d15-0410-975c-d299462d15a1 --- src/libs/client/PatchModel.cpp | 4 +- src/libs/client/PatchModel.h | 6 +- src/progs/ingenuity/NodeModule.cpp | 4 +- src/progs/ingenuity/NodeModule.h | 3 +- src/progs/ingenuity/PatchCanvas.cpp | 103 ++++++++++++++++---------------- src/progs/ingenuity/PatchCanvas.h | 16 +++-- src/progs/ingenuity/PatchPortModule.cpp | 4 +- src/progs/ingenuity/PatchPortModule.h | 7 ++- 8 files changed, 76 insertions(+), 71 deletions(-) (limited to 'src') diff --git a/src/libs/client/PatchModel.cpp b/src/libs/client/PatchModel.cpp index ea625532..94cb3ded 100644 --- a/src/libs/client/PatchModel.cpp +++ b/src/libs/client/PatchModel.cpp @@ -135,9 +135,9 @@ PatchModel::remove_node(SharedPtr nm) SharedPtr cm = (*j); if (cm->src_port_path().parent() == nm->path() || cm->dst_port_path().parent() == nm->path()) { + removed_connection_sig.emit(cm); _connections.erase(j); // cuts our reference assert(!get_connection(cm->src_port_path(), cm->dst_port_path())); // no duplicates - removed_connection_sig.emit(cm->src_port_path(), cm->dst_port_path()); } j = next; } @@ -276,9 +276,9 @@ PatchModel::remove_connection(const string& src_port_path, const string& dst_por for (list >::iterator i = _connections.begin(); i != _connections.end(); ++i) { SharedPtr cm = (*i); if (cm->src_port_path() == src_port_path && cm->dst_port_path() == dst_port_path) { + removed_connection_sig.emit(cm); _connections.erase(i); // cuts our reference assert(!get_connection(src_port_path, dst_port_path)); // no duplicates - removed_connection_sig.emit(src_port_path, dst_port_path); return; } } diff --git a/src/libs/client/PatchModel.h b/src/libs/client/PatchModel.h index efe47e8e..c38d83a5 100644 --- a/src/libs/client/PatchModel.h +++ b/src/libs/client/PatchModel.h @@ -57,9 +57,9 @@ public: sigc::signal > new_node_sig; sigc::signal > removed_node_sig; sigc::signal > new_connection_sig; - sigc::signal removed_connection_sig; - sigc::signal enabled_sig; - sigc::signal disabled_sig; + sigc::signal > removed_connection_sig; + sigc::signal enabled_sig; + sigc::signal disabled_sig; private: friend class Store; diff --git a/src/progs/ingenuity/NodeModule.cpp b/src/progs/ingenuity/NodeModule.cpp index 971dfa6b..c927114d 100644 --- a/src/progs/ingenuity/NodeModule.cpp +++ b/src/progs/ingenuity/NodeModule.cpp @@ -90,7 +90,9 @@ NodeModule::create(boost::shared_ptr canvas, SharedPtr n void NodeModule::add_port(SharedPtr port, bool resize_to_fit) { - Module::add_port(boost::shared_ptr(new Port(shared_from_this(), port))); + Module::add_port(boost::shared_ptr(new Port( + PtrCast(shared_from_this()), port))); + if (resize_to_fit) resize(); } diff --git a/src/progs/ingenuity/NodeModule.h b/src/progs/ingenuity/NodeModule.h index f3ca4cbc..77829e93 100644 --- a/src/progs/ingenuity/NodeModule.h +++ b/src/progs/ingenuity/NodeModule.h @@ -18,7 +18,6 @@ #define NODEMODULE_H #include -#include #include #include #include "raul/SharedPtr.h" @@ -48,7 +47,7 @@ class Port; * * \ingroup Ingenuity */ -class NodeModule : public boost::enable_shared_from_this, public LibFlowCanvas::Module +class NodeModule : public LibFlowCanvas::Module { public: static boost::shared_ptr create (boost::shared_ptr canvas, SharedPtr node); diff --git a/src/progs/ingenuity/PatchCanvas.cpp b/src/progs/ingenuity/PatchCanvas.cpp index c15ba4b8..0835bb97 100644 --- a/src/progs/ingenuity/PatchCanvas.cpp +++ b/src/progs/ingenuity/PatchCanvas.cpp @@ -108,7 +108,7 @@ PatchCanvas::build() // Create pseudo modules for ports (ports on this canvas, not on our module) for (PortModelList::const_iterator i = _patch->ports().begin(); i != _patch->ports().end(); ++i) { - add_item(PatchPortModule::create(shared_this, *i)); + add_port(*i); } // Create connections @@ -126,17 +126,26 @@ PatchCanvas::add_node(SharedPtr nm) boost::dynamic_pointer_cast(shared_from_this()); SharedPtr pm = PtrCast(nm); + SharedPtr module; if (pm) - add_item(SubpatchModule::create(shared_this, pm)); + module = SubpatchModule::create(shared_this, pm); else - add_item(NodeModule::create(shared_this, nm)); + module = NodeModule::create(shared_this, nm); + + add_item(module); + _views.insert(std::make_pair(nm, module)); } void PatchCanvas::remove_node(SharedPtr nm) { - remove_item(nm->path().name()); // should cut all references + Views::iterator i = _views.find(nm); + + if (i != _views.end()) { + remove_item(i->second); + _views.erase(i); + } } @@ -146,37 +155,50 @@ PatchCanvas::add_port(SharedPtr pm) boost::shared_ptr shared_this = boost::dynamic_pointer_cast(shared_from_this()); - add_item(PatchPortModule::create(shared_this, pm)); + SharedPtr view = PatchPortModule::create(shared_this, pm); + _views.insert(std::make_pair(pm, view)); + add_item(view); } void PatchCanvas::remove_port(SharedPtr pm) { - remove_item(pm->path().name()); // should cut all references + Views::iterator i = _views.find(pm); + + if (i != _views.end()) { + remove_item(i->second); + _views.erase(i); + } } -void -PatchCanvas::connection(SharedPtr cm) +SharedPtr +PatchCanvas::get_port_view(SharedPtr port) { - // Deal with port "anonymous nodes" for this patch's own ports... - const Path& src_parent_path = cm->src_port_path().parent(); - const Path& dst_parent_path = cm->dst_port_path().parent(); - - const string& src_parent_name = (src_parent_path == _patch->path()) - ? cm->src_port_path().name() - : src_parent_path.name(); + SharedPtr ret; + SharedPtr module = _views[port]; + + // Port on this patch + if (module) { + ret = (PtrCast(module)) + ? *(PtrCast(module)->ports().begin()) + : PtrCast(module); + } else { + module = PtrCast(_views[port->parent()]); + if (module) + ret = module->get_port(port->path().name()); + } + + return ret; +} - const string& dst_parent_name = (dst_parent_path == _patch->path()) - ? cm->dst_port_path().name() - : dst_parent_path.name(); - boost::shared_ptr src = get_port(src_parent_name, cm->src_port_path().name()); - boost::shared_ptr dst = get_port(dst_parent_name, cm->dst_port_path().name()); - - cerr << "SPN: " << src_parent_name << endl; - cerr << "DPN: " << dst_parent_name << endl; +void +PatchCanvas::connection(SharedPtr cm) +{ + const SharedPtr src = get_port_view(cm->src_port()); + const SharedPtr dst = get_port_view(cm->dst_port()); if (src && dst) add_connection(boost::shared_ptr(new Connection(shared_from_this(), cm, src, dst, src->color() + 0xFFFFFF00))); @@ -187,41 +209,16 @@ PatchCanvas::connection(SharedPtr cm) void -PatchCanvas::disconnection(const Path& src_port_path, const Path& dst_port_path) +PatchCanvas::disconnection(SharedPtr cm) { - // Deal with port "anonymous nodes" for this patch's own ports... - const Path& src_parent_path = src_port_path.parent(); - const Path& dst_parent_path = dst_port_path.parent(); - - const string& src_parent_name = (src_parent_path == _patch->path()) - ? src_port_path.name() - : src_parent_path.name(); - - const string& dst_parent_name = (dst_parent_path == _patch->path()) - ? dst_port_path.name() - : dst_parent_path.name(); - - cerr << "SPN: " << src_parent_name << endl; - cerr << "DPN: " << dst_parent_name << endl; - - boost::shared_ptr src = get_port(src_parent_name, src_port_path.name()); - boost::shared_ptr dst = get_port(dst_parent_name, dst_port_path.name()); - + const SharedPtr src = get_port_view(cm->src_port()); + const SharedPtr dst = get_port_view(cm->dst_port()); + if (src && dst) remove_connection(src, dst); else cerr << "[PatchCanvas] ERROR: Unable to find ports to disconnect " - << src_port_path << " -> " << dst_port_path << endl; - - cerr << "FIXME: disconnection control window stuff\n"; - /* - // Enable control slider in destination node control window - PortController* p = (PortController)Store::instance().port(dst_port_path)->controller(); - assert(p); - - if (p->control_panel()) - p->control_panel()->enable_port(p->path()); - */ + << cm->src_port_path() << " -> " << cm->dst_port_path() << endl; } diff --git a/src/progs/ingenuity/PatchCanvas.h b/src/progs/ingenuity/PatchCanvas.h index 56b463eb..f76e0c94 100644 --- a/src/progs/ingenuity/PatchCanvas.h +++ b/src/progs/ingenuity/PatchCanvas.h @@ -19,11 +19,12 @@ #define PATCHCANVAS_H #include +#include #include #include #include -#include "raul/SharedPtr.h" -#include "raul/Path.h" +#include +#include #include "ConnectionModel.h" #include "PatchModel.h" #include "NodeModule.h" @@ -54,10 +55,10 @@ public: virtual ~PatchCanvas() {} - boost::shared_ptr find_module(const string& name) { + /*boost::shared_ptr find_module(const string& name) { return boost::dynamic_pointer_cast( FlowCanvas::get_item(name)); - } + }*/ void build(); @@ -66,7 +67,7 @@ public: void add_port(SharedPtr pm); void remove_port(SharedPtr pm); void connection(SharedPtr cm); - void disconnection(const Path& src_port_path, const Path& dst_port_path); + void disconnection(SharedPtr cm); void get_new_module_location(double& x, double& y); @@ -87,6 +88,8 @@ private: bool canvas_event(GdkEvent* event); + SharedPtr get_port_view(SharedPtr port); + void connect(boost::shared_ptr src, boost::shared_ptr dst); @@ -95,6 +98,9 @@ private: SharedPtr _patch; + typedef std::map, SharedPtr > Views; + Views _views; + int _last_click_x; int _last_click_y; diff --git a/src/progs/ingenuity/PatchPortModule.cpp b/src/progs/ingenuity/PatchPortModule.cpp index 17633939..048d0ee7 100644 --- a/src/progs/ingenuity/PatchPortModule.cpp +++ b/src/progs/ingenuity/PatchPortModule.cpp @@ -72,10 +72,10 @@ PatchPortModule::create(boost::shared_ptr canvas, SharedPtr_patch_port = boost::shared_ptr(new Port(ret, port, true, true)); ret->add_port(ret->_patch_port); - ret->resize(); - for (MetadataMap::const_iterator m = port->metadata().begin(); m != port->metadata().end(); ++m) ret->metadata_update(m->first, m->second); + + ret->resize(); return ret; } diff --git a/src/progs/ingenuity/PatchPortModule.h b/src/progs/ingenuity/PatchPortModule.h index 05ad4f34..21455089 100644 --- a/src/progs/ingenuity/PatchPortModule.h +++ b/src/progs/ingenuity/PatchPortModule.h @@ -45,11 +45,12 @@ class Port; * * \ingroup Ingenuity */ -class PatchPortModule : public boost::enable_shared_from_this, public LibFlowCanvas::Module +class PatchPortModule : public boost::enable_shared_from_this, + public LibFlowCanvas::Module { public: - static boost::shared_ptr create (boost::shared_ptr canvas, - SharedPtr port); + static boost::shared_ptr create(boost::shared_ptr canvas, + SharedPtr port); virtual ~PatchPortModule() {} -- cgit v1.2.1