diff options
-rw-r--r-- | src/libs/client/PatchModel.cpp | 4 | ||||
-rw-r--r-- | src/libs/client/PatchModel.h | 6 | ||||
-rw-r--r-- | src/progs/ingenuity/NodeModule.cpp | 4 | ||||
-rw-r--r-- | src/progs/ingenuity/NodeModule.h | 3 | ||||
-rw-r--r-- | src/progs/ingenuity/PatchCanvas.cpp | 103 | ||||
-rw-r--r-- | src/progs/ingenuity/PatchCanvas.h | 16 | ||||
-rw-r--r-- | src/progs/ingenuity/PatchPortModule.cpp | 4 | ||||
-rw-r--r-- | src/progs/ingenuity/PatchPortModule.h | 7 |
8 files changed, 76 insertions, 71 deletions
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<NodeModel> nm) SharedPtr<ConnectionModel> 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<SharedPtr<ConnectionModel> >::iterator i = _connections.begin(); i != _connections.end(); ++i) { SharedPtr<ConnectionModel> 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<void, SharedPtr<NodeModel> > new_node_sig; sigc::signal<void, SharedPtr<NodeModel> > removed_node_sig; sigc::signal<void, SharedPtr<ConnectionModel> > new_connection_sig; - sigc::signal<void, const Path&, const Path& > removed_connection_sig; - sigc::signal<void> enabled_sig; - sigc::signal<void> disabled_sig; + sigc::signal<void, SharedPtr<ConnectionModel> > removed_connection_sig; + sigc::signal<void> enabled_sig; + sigc::signal<void> 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<PatchCanvas> canvas, SharedPtr<NodeModel> n void NodeModule::add_port(SharedPtr<PortModel> port, bool resize_to_fit) { - Module::add_port(boost::shared_ptr<Port>(new Port(shared_from_this(), port))); + Module::add_port(boost::shared_ptr<Port>(new Port( + PtrCast<NodeModule>(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 <string> -#include <boost/enable_shared_from_this.hpp> #include <libgnomecanvasmm.h> #include <flowcanvas/Module.h> #include "raul/SharedPtr.h" @@ -48,7 +47,7 @@ class Port; * * \ingroup Ingenuity */ -class NodeModule : public boost::enable_shared_from_this<NodeModule>, public LibFlowCanvas::Module +class NodeModule : public LibFlowCanvas::Module { public: static boost::shared_ptr<NodeModule> create (boost::shared_ptr<PatchCanvas> canvas, SharedPtr<NodeModel> 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<NodeModel> nm) boost::dynamic_pointer_cast<PatchCanvas>(shared_from_this()); SharedPtr<PatchModel> pm = PtrCast<PatchModel>(nm); + SharedPtr<NodeModule> 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<NodeModel> 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<PortModel> pm) boost::shared_ptr<PatchCanvas> shared_this = boost::dynamic_pointer_cast<PatchCanvas>(shared_from_this()); - add_item(PatchPortModule::create(shared_this, pm)); + SharedPtr<PatchPortModule> view = PatchPortModule::create(shared_this, pm); + _views.insert(std::make_pair(pm, view)); + add_item(view); } void PatchCanvas::remove_port(SharedPtr<PortModel> 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<ConnectionModel> cm) +SharedPtr<LibFlowCanvas::Port> +PatchCanvas::get_port_view(SharedPtr<PortModel> 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<LibFlowCanvas::Port> ret; + SharedPtr<LibFlowCanvas::Module> module = _views[port]; + + // Port on this patch + if (module) { + ret = (PtrCast<PatchPortModule>(module)) + ? *(PtrCast<PatchPortModule>(module)->ports().begin()) + : PtrCast<LibFlowCanvas::Port>(module); + } else { + module = PtrCast<NodeModule>(_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<LibFlowCanvas::Port> src = get_port(src_parent_name, cm->src_port_path().name()); - boost::shared_ptr<LibFlowCanvas::Port> 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<ConnectionModel> cm) +{ + const SharedPtr<LibFlowCanvas::Port> src = get_port_view(cm->src_port()); + const SharedPtr<LibFlowCanvas::Port> dst = get_port_view(cm->dst_port()); if (src && dst) add_connection(boost::shared_ptr<Connection>(new Connection(shared_from_this(), cm, src, dst, src->color() + 0xFFFFFF00))); @@ -187,41 +209,16 @@ PatchCanvas::connection(SharedPtr<ConnectionModel> cm) void -PatchCanvas::disconnection(const Path& src_port_path, const Path& dst_port_path) +PatchCanvas::disconnection(SharedPtr<ConnectionModel> 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<LibFlowCanvas::Port> src = get_port(src_parent_name, src_port_path.name()); - boost::shared_ptr<LibFlowCanvas::Port> dst = get_port(dst_parent_name, dst_port_path.name()); - + const SharedPtr<LibFlowCanvas::Port> src = get_port_view(cm->src_port()); + const SharedPtr<LibFlowCanvas::Port> 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 <string> +#include <map> #include <boost/shared_ptr.hpp> #include <flowcanvas/FlowCanvas.h> #include <flowcanvas/Module.h> -#include "raul/SharedPtr.h" -#include "raul/Path.h" +#include <raul/SharedPtr.h> +#include <raul/Path.h> #include "ConnectionModel.h" #include "PatchModel.h" #include "NodeModule.h" @@ -54,10 +55,10 @@ public: virtual ~PatchCanvas() {} - boost::shared_ptr<NodeModule> find_module(const string& name) { + /*boost::shared_ptr<NodeModule> find_module(const string& name) { return boost::dynamic_pointer_cast<NodeModule>( FlowCanvas::get_item(name)); - } + }*/ void build(); @@ -66,7 +67,7 @@ public: void add_port(SharedPtr<PortModel> pm); void remove_port(SharedPtr<PortModel> pm); void connection(SharedPtr<ConnectionModel> cm); - void disconnection(const Path& src_port_path, const Path& dst_port_path); + void disconnection(SharedPtr<ConnectionModel> cm); void get_new_module_location(double& x, double& y); @@ -87,6 +88,8 @@ private: bool canvas_event(GdkEvent* event); + SharedPtr<LibFlowCanvas::Port> get_port_view(SharedPtr<PortModel> port); + void connect(boost::shared_ptr<LibFlowCanvas::Connectable> src, boost::shared_ptr<LibFlowCanvas::Connectable> dst); @@ -95,6 +98,9 @@ private: SharedPtr<PatchModel> _patch; + typedef std::map<SharedPtr<ObjectModel>, SharedPtr<LibFlowCanvas::Module> > 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<PatchCanvas> canvas, SharedPtr<PortMod ret->_patch_port = boost::shared_ptr<Port>(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<LibFlowCanvas::Module>, public LibFlowCanvas::Module +class PatchPortModule : public boost::enable_shared_from_this<LibFlowCanvas::Module>, + public LibFlowCanvas::Module { public: - static boost::shared_ptr<PatchPortModule> create (boost::shared_ptr<PatchCanvas> canvas, - SharedPtr<PortModel> port); + static boost::shared_ptr<PatchPortModule> create(boost::shared_ptr<PatchCanvas> canvas, + SharedPtr<PortModel> port); virtual ~PatchPortModule() {} |