From 572adb6873294bf2f26062cf297660aa449eb675 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 25 Nov 2011 04:02:49 +0000 Subject: Make it possible to remove connections by middle-clicking on their handle, or selecting them and pressing delete (implement #616). git-svn-id: http://svn.drobilla.net/lad/trunk/patchage@3626 a436a847-0d15-0410-975c-d299462d15a1 --- ChangeLog | 8 ++++++++ src/PatchageCanvas.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ src/PatchageCanvas.hpp | 7 +++++++ 3 files changed, 64 insertions(+) diff --git a/ChangeLog b/ChangeLog index 1320799..9bfc462 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +patchage (UNRELEASED) unstable; urgency=low + + * Make it possible to remove connections by middle-clicking on their + handle, or selecting them and pressing delete. + * Fix font configuration on OSX. + + -- David Robillard (UNRELEASED) + patchage (0.5.0) unstable; urgency=low * Auto-arrange interface modules sanely (align corresponding inputs/outputs) diff --git a/src/PatchageCanvas.cpp b/src/PatchageCanvas.cpp index adb1b7a..175d837 100644 --- a/src/PatchageCanvas.cpp +++ b/src/PatchageCanvas.cpp @@ -259,6 +259,55 @@ PatchageCanvas::add_module(const std::string& name, PatchageModule* module) out_module->set_partner(in_module); } +bool +PatchageCanvas::on_connection_event(FlowCanvas::Connection* c, GdkEvent* ev) +{ + if (ev->type == GDK_BUTTON_PRESS) { + switch (ev->button.button) { + case 1: + if (!(ev->button.state & GDK_CONTROL_MASK) + && !(ev->button.state & GDK_SHIFT_MASK)) { + clear_selection(); + } + select_connection(c); + return true; + case 2: + disconnect(c->source(), c->dest()); + return true; + } + } + return false; +} + +bool +PatchageCanvas::on_event(GdkEvent* ev) +{ + if (ev->type == GDK_KEY_PRESS && ev->key.keyval == GDK_Delete) { + Connections cs = selected_connections(); + clear_selection(); + + for (Connections::const_iterator i = cs.begin(); i != cs.end(); ++i) { + disconnect((*i)->source(), (*i)->dest()); + } + } + + return false; +} + +bool +PatchageCanvas::add_connection(FlowCanvas::Connectable* tail, + FlowCanvas::Connectable* head, + uint32_t color) +{ + FlowCanvas::Connection* c = new FlowCanvas::Connection( + *this, tail, head, color); + c->show_handle(true); + c->signal_event.connect( + sigc::bind<0>(sigc::mem_fun(*this, &PatchageCanvas::on_connection_event), + c)); + return FlowCanvas::Canvas::add_connection(c); +} + bool PatchageCanvas::remove_item(FlowCanvas::Item* i) { diff --git a/src/PatchageCanvas.hpp b/src/PatchageCanvas.hpp index bf70007..5262a5e 100644 --- a/src/PatchageCanvas.hpp +++ b/src/PatchageCanvas.hpp @@ -65,6 +65,10 @@ public: void add_module(const std::string& name, PatchageModule* module); + bool add_connection(FlowCanvas::Connectable* tail, + FlowCanvas::Connectable* head, + uint32_t color); + void remove_port(const PortID& id); void destroy(); @@ -74,6 +78,9 @@ private: bool remove_item(FlowCanvas::Item* i); + bool on_event(GdkEvent* ev); + bool on_connection_event(FlowCanvas::Connection* c, GdkEvent* ev); + typedef std::map PortIndex; PortIndex _port_index; -- cgit v1.2.1