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 --- src/PatchageCanvas.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'src/PatchageCanvas.cpp') 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) { -- cgit v1.2.1