From: Carl Hetherington Date: Wed, 18 Nov 2009 14:53:55 +0000 (+0000) Subject: Fix dragging grid lines when you move the mouse outside of the grid during the drag. X-Git-Tag: 3.0-alpha5~2782 X-Git-Url: https://main.carlh.net/gitweb/?a=commitdiff_plain;h=b7cfd2849ebb0d949af3ee39f70cbf1856fbfe0f;p=ardour.git Fix dragging grid lines when you move the mouse outside of the grid during the drag. git-svn-id: svn://localhost/ardour2/branches/3.0@6120 d708f5d6-7413-0410-9779-e7cbd77b26cf --- diff --git a/gtk2_ardour/port_matrix_body.cc b/gtk2_ardour/port_matrix_body.cc index 3d961baa5c..79efd22b7c 100644 --- a/gtk2_ardour/port_matrix_body.cc +++ b/gtk2_ardour/port_matrix_body.cc @@ -328,14 +328,19 @@ PortMatrixBody::on_button_press_event (GdkEventButton* ev) bool PortMatrixBody::on_button_release_event (GdkEventButton* ev) { - if (Gdk::Region (_grid->parent_rectangle()).point_in (ev->x, ev->y)) { - - _grid->button_release ( - _grid->parent_to_component_x (ev->x), - _grid->parent_to_component_y (ev->y), - ev->button, ev->time - ); - + for (list::iterator i = _components.begin(); i != _components.end(); ++i) { + if (Gdk::Region ((*i)->parent_rectangle()).point_in (ev->x, ev->y)) { + (*i)->button_release ( + (*i)->parent_to_component_x (ev->x), + (*i)->parent_to_component_y (ev->y), + ev->button, ev->time + ); + } else { + (*i)->button_release ( + -1, -1, + ev->button, ev->time + ); + } } return true; diff --git a/gtk2_ardour/port_matrix_component.h b/gtk2_ardour/port_matrix_component.h index cbef95344b..86cd0565ae 100644 --- a/gtk2_ardour/port_matrix_component.h +++ b/gtk2_ardour/port_matrix_component.h @@ -50,6 +50,7 @@ public: virtual void mouseover_changed (std::list const &) = 0; virtual void draw_extra (cairo_t *) = 0; virtual void button_press (double, double, int, uint32_t) {} + virtual void button_release (double, double, int, uint32_t) {} virtual void motion (double, double) {} void set_show_ports (bool); diff --git a/gtk2_ardour/port_matrix_grid.cc b/gtk2_ardour/port_matrix_grid.cc index 53b4b50b50..c2af484e6c 100644 --- a/gtk2_ardour/port_matrix_grid.cc +++ b/gtk2_ardour/port_matrix_grid.cc @@ -359,29 +359,33 @@ PortMatrixGrid::button_release (double x, double y, int b, uint32_t /*t*/) { if (b == 1) { - if (_dragging && _moved) { - - if (_drag_valid) { - list const p = nodes_on_line (_drag_start_x, _drag_start_y, _drag_x, _drag_y); - - if (!p.empty()) { - PortMatrixNode::State const s = get_association (p.front()); - for (list::const_iterator i = p.begin(); i != p.end(); ++i) { - set_association (*i, toggle_state (s)); + if (x != -1) { + + if (_dragging && _moved) { + + if (_drag_valid) { + list const p = nodes_on_line (_drag_start_x, _drag_start_y, _drag_x, _drag_y); + + if (!p.empty()) { + PortMatrixNode::State const s = get_association (p.front()); + for (list::const_iterator i = p.begin(); i != p.end(); ++i) { + set_association (*i, toggle_state (s)); + } } } + + } else { + + PortMatrixNode const n = position_to_node (x, y); + if (n.row.bundle && n.column.bundle) { + PortMatrixNode::State const s = get_association (n); + set_association (n, toggle_state (s)); + } } - } else { - - PortMatrixNode const n = position_to_node (x, y); - if (n.row.bundle && n.column.bundle) { - PortMatrixNode::State const s = get_association (n); - set_association (n, toggle_state (s)); - } + require_render (); } - - require_render (); + _body->queue_draw (); }