diff options
Diffstat (limited to 'src/Canvas.cpp')
-rw-r--r-- | src/Canvas.cpp | 89 |
1 files changed, 46 insertions, 43 deletions
diff --git a/src/Canvas.cpp b/src/Canvas.cpp index 7b9203a..3624933 100644 --- a/src/Canvas.cpp +++ b/src/Canvas.cpp @@ -48,6 +48,52 @@ PATCHAGE_RESTORE_WARNINGS #include <utility> namespace patchage { +namespace { + +struct RemovePortsData { + using Predicate = bool (*)(const CanvasPort*); + + explicit RemovePortsData(Predicate p) + : pred(p) + {} + + Predicate pred; + std::set<ClientID> empty_clients; +}; + +void +delete_port_if_matches(GanvPort* port, void* cdata) +{ + auto* data = static_cast<RemovePortsData*>(cdata); + auto* pport = dynamic_cast<CanvasPort*>(Glib::wrap(port)); + if (pport && data->pred(pport)) { + delete pport; + } +} + +void +remove_ports_matching(GanvNode* node, void* cdata) +{ + if (!GANV_IS_MODULE(node)) { + return; + } + + Ganv::Module* cmodule = Glib::wrap(GANV_MODULE(node)); + auto* pmodule = dynamic_cast<CanvasModule*>(cmodule); + if (!pmodule) { + return; + } + + auto* data = static_cast<RemovePortsData*>(cdata); + + pmodule->for_each_port(delete_port_if_matches, data); + + if (pmodule->num_ports() == 0) { + data->empty_clients.insert(pmodule->id()); + } +} + +} // namespace Canvas::Canvas(ILog& log, ActionSink& action_sink, int width, int height) : Ganv::Canvas(width, height) @@ -183,49 +229,6 @@ Canvas::remove_port(const PortID& id) delete port; } -struct RemovePortsData { - using Predicate = bool (*)(const CanvasPort*); - - explicit RemovePortsData(Predicate p) - : pred(p) - {} - - Predicate pred; - std::set<ClientID> empty_clients; -}; - -static void -delete_port_if_matches(GanvPort* port, void* cdata) -{ - auto* data = static_cast<RemovePortsData*>(cdata); - auto* pport = dynamic_cast<CanvasPort*>(Glib::wrap(port)); - if (pport && data->pred(pport)) { - delete pport; - } -} - -static void -remove_ports_matching(GanvNode* node, void* cdata) -{ - if (!GANV_IS_MODULE(node)) { - return; - } - - Ganv::Module* cmodule = Glib::wrap(GANV_MODULE(node)); - auto* pmodule = dynamic_cast<CanvasModule*>(cmodule); - if (!pmodule) { - return; - } - - auto* data = static_cast<RemovePortsData*>(cdata); - - pmodule->for_each_port(delete_port_if_matches, data); - - if (pmodule->num_ports() == 0) { - data->empty_clients.insert(pmodule->id()); - } -} - void Canvas::remove_ports(bool (*pred)(const CanvasPort*)) { |