From 74a3eb19f586e3548f59bb9ff9137703cdc45de8 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 3 Dec 2011 21:45:57 +0000 Subject: Don't expose canvas data structures. git-svn-id: http://svn.drobilla.net/lad/trunk/patchage@3775 a436a847-0d15-0410-975c-d299462d15a1 --- src/Patchage.cpp | 49 +++++++++++++++++++----------- src/PatchageCanvas.cpp | 81 +++++++++++++++++++++++++++++++++----------------- src/PatchageModule.cpp | 12 ++++++++ src/PatchageModule.hpp | 3 ++ src/PatchagePort.hpp | 4 ++- 5 files changed, 103 insertions(+), 46 deletions(-) diff --git a/src/Patchage.cpp b/src/Patchage.cpp index e815891..2c35255 100644 --- a/src/Patchage.cpp +++ b/src/Patchage.cpp @@ -412,15 +412,22 @@ Patchage::warning_msg(const std::string& msg) _status_text->scroll_to_mark(buffer->get_insert(), 0); } +static void +load_module_location(FlowCanvasNode* node, void* data) +{ + if (FLOW_CANVAS_IS_MODULE(node)) { + FlowCanvas::Module* cmodule = Glib::wrap(FLOW_CANVAS_MODULE(node)); + PatchageModule* pmodule = dynamic_cast(cmodule); + if (pmodule) { + pmodule->load_location(); + } + } +} + void Patchage::update_state() { - for (FlowCanvas::Canvas::Items::const_iterator i = _canvas->items().begin(); - i != _canvas->items().end(); ++i) { - PatchageModule* module = dynamic_cast(*i); - if (module) - module->load_location(); - } + _canvas->for_each_node(load_module_location, NULL); } /** Update the sensitivity status of menus to reflect the present. @@ -485,6 +492,23 @@ Patchage::show_open_session_dialog() } } +static void +print_edge(FlowCanvasEdge* edge, void* data) +{ + std::ofstream* script = (std::ofstream*)data; + FlowCanvas::Edge* edgemm = Glib::wrap(edge); + + PatchagePort* src = dynamic_cast((edgemm)->get_tail()); + PatchagePort* dst = dynamic_cast((edgemm)->get_head()); + + if (!src || !dst || src->type() == ALSA_MIDI || dst->type() == ALSA_MIDI) { + return; + } + + (*script) << "jack_connect '" << src->full_name() + << "' '" << dst->full_name() << "' &" << endl; +} + void Patchage::save_session(bool close) { @@ -531,18 +555,7 @@ Patchage::save_session(bool close) script << "sleep 3" << endl; script << endl; - for (FlowCanvas::Canvas::Edges::const_iterator c = _canvas->edges().begin(); - c != _canvas->edges().end(); ++c) { - PatchagePort* src = dynamic_cast((*c)->get_tail()); - PatchagePort* dst = dynamic_cast((*c)->get_head()); - - if (!src || !dst || src->type() == ALSA_MIDI || dst->type() == ALSA_MIDI) { - continue; - } - - script << "jack_connect '" << src->full_name() - << "' '" << dst->full_name() << "' &" << endl; - } + _canvas->for_each_edge(print_edge, &script); script.close(); g_chmod(script_path.c_str(), 0740); diff --git a/src/PatchageCanvas.cpp b/src/PatchageCanvas.cpp index 907cdba..25483a4 100644 --- a/src/PatchageCanvas.cpp +++ b/src/PatchageCanvas.cpp @@ -121,28 +121,50 @@ PatchageCanvas::remove_port(const PortID& id) delete port; } -void -PatchageCanvas::remove_ports(bool (*pred)(const PatchagePort*)) -{ +struct RemovePortsData { + typedef bool (*Predicate)(const PatchagePort*); + + RemovePortsData(Predicate p) : pred(p) {} + + Predicate pred; std::set empty; - for (Items::const_iterator i = items().begin(); i != items().end(); ++i) { - PatchageModule* module = dynamic_cast(*i); - if (!module) - continue; - - FlowCanvas::Module::Ports ports = module->ports(); // copy - for (FlowCanvas::Module::Ports::iterator p = ports.begin(); - p != ports.end(); ++p) { - if (pred(dynamic_cast(*p))) { - delete *p; - } - } +}; + +static void +remove_ports_matching(FlowCanvasNode* node, void* cdata) +{ + if (!FLOW_CANVAS_IS_MODULE(node)) { + return; + } + + FlowCanvas::Module* cmodule = Glib::wrap(FLOW_CANVAS_MODULE(node)); + PatchageModule* pmodule = dynamic_cast(cmodule); + if (!pmodule) { + return; + } - if (module->num_ports() == 0) { - empty.insert(module); + RemovePortsData* data = (RemovePortsData*)cdata; + + FlowCanvas::Module::Ports ports = pmodule->ports(); // copy + for (FlowCanvas::Module::Ports::iterator p = ports.begin(); + p != ports.end(); ++p) { + if (data->pred(dynamic_cast(*p))) { + delete *p; } } + if (pmodule->num_ports() == 0) { + data->empty.insert(pmodule); + } +} + +void +PatchageCanvas::remove_ports(bool (*pred)(const PatchagePort*)) +{ + RemovePortsData data(pred); + + for_each_node(remove_ports_matching, &data); + for (PortIndex::iterator i = _port_index.begin(); i != _port_index.end();) { PortIndex::iterator next = i; @@ -153,8 +175,8 @@ PatchageCanvas::remove_ports(bool (*pred)(const PatchagePort*)) i = next; } - for (std::set::iterator i = empty.begin(); - i != empty.end(); ++i) { + for (std::set::iterator i = data.empty.begin(); + i != data.empty.end(); ++i) { delete *i; } } @@ -274,19 +296,24 @@ PatchageCanvas::on_connection_event(FlowCanvas::Edge* c, GdkEvent* ev) return false; } +static void +disconnect_edge(FlowCanvasEdge* edge, void* data) +{ + PatchageCanvas* canvas = (PatchageCanvas*)data; + FlowCanvas::Edge* edgemm = Glib::wrap(edge); + canvas->disconnect(edgemm->get_tail(), edgemm->get_head()); +} + bool PatchageCanvas::on_event(GdkEvent* ev) { if (ev->type == GDK_KEY_PRESS && ev->key.keyval == GDK_Delete) { - SelectedEdges cs = selected_edges(); + for_each_selected_edge(disconnect_edge, this); clear_selection(); - - for (Edges::const_iterator i = cs.begin(); i != cs.end(); ++i) { - disconnect((*i)->get_tail(), (*i)->get_head()); - } + return true; } - return false; + return Canvas::on_event(ev); } bool @@ -315,8 +342,8 @@ PatchageCanvas::remove_item(FlowCanvas::Node* i) return ret; // Remove module from cache - for (ModuleIndex::iterator i = _module_index.find(module->name()); - i != _module_index.end() && i->first == module->name(); ++i) { + for (ModuleIndex::iterator i = _module_index.find(module->get_label()); + i != _module_index.end() && i->first == module->get_label(); ++i) { if (i->second == module) { _module_index.erase(i); return true; diff --git a/src/PatchageModule.cpp b/src/PatchageModule.cpp index fd7d0ef..85538cd 100644 --- a/src/PatchageModule.cpp +++ b/src/PatchageModule.cpp @@ -148,3 +148,15 @@ PatchageModule::menu_disconnect_all() for (Ports::iterator p = _ports.begin(); p != _ports.end(); ++p) (*p)->disconnect_all(); } + +PatchagePort* +PatchageModule::get_port(const std::string& name) +{ + for (Ports::const_iterator p = _ports.begin(); p != _ports.end(); ++p) { + if ((*p)->get_label() == name) { + return dynamic_cast(*p); + } + } + + return NULL; +} diff --git a/src/PatchageModule.hpp b/src/PatchageModule.hpp index 7b8c02d..56c7980 100644 --- a/src/PatchageModule.hpp +++ b/src/PatchageModule.hpp @@ -27,6 +27,7 @@ #include "StateManager.hpp" class Patchage; +class PatchagePort; class PatchageModule : public FlowCanvas::Module { @@ -40,6 +41,8 @@ public: bool show_menu(GdkEventButton* ev); void update_menu(); + PatchagePort* get_port(const std::string& name); + void load_location(); void menu_disconnect_all(); void show_dialog() {} diff --git a/src/PatchagePort.hpp b/src/PatchagePort.hpp index 693091a..e2e6679 100644 --- a/src/PatchagePort.hpp +++ b/src/PatchagePort.hpp @@ -49,7 +49,9 @@ public: virtual ~PatchagePort() {} /** Returns the full name of this port, as "modulename:portname" */ - std::string full_name() const { return _module->name() + ":" + _name; } + std::string full_name() const { + return std::string(_module->get_label()) + ":" + get_label(); + } bool on_click(GdkEventButton* ev) { if (ev->button != 3) { -- cgit v1.2.1