diff options
author | Carl Hetherington <carl@carlh.net> | 2009-06-21 22:17:17 +0000 |
---|---|---|
committer | Carl Hetherington <carl@carlh.net> | 2009-06-21 22:17:17 +0000 |
commit | 49928d3fa3d96942deffe70c5845175986b1ce44 (patch) | |
tree | 7f7a73099b470b20bba25ec3ef9f48cde5b99fef /gtk2_ardour/group_tabs.cc | |
parent | 955d731fa6933e6769986687a781d16f7889da67 (diff) |
Refactor group tabs code a bit. Allow dragging of group tabs to alter group membership.
git-svn-id: svn://localhost/ardour2/branches/3.0@5237 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/group_tabs.cc')
-rw-r--r-- | gtk2_ardour/group_tabs.cc | 145 |
1 files changed, 134 insertions, 11 deletions
diff --git a/gtk2_ardour/group_tabs.cc b/gtk2_ardour/group_tabs.cc index ed179e3aef..1dd15b31ba 100644 --- a/gtk2_ardour/group_tabs.cc +++ b/gtk2_ardour/group_tabs.cc @@ -24,12 +24,14 @@ #include "group_tabs.h" #include "i18n.h" +using namespace std; using namespace Gtk; using namespace ARDOUR; GroupTabs::GroupTabs () : _session (0), - _menu (0) + _menu (0), + _dragging (0) { } @@ -57,20 +59,38 @@ bool GroupTabs::on_button_press_event (GdkEventButton* ev) { using namespace Menu_Helpers; - - RouteGroup* g = click_to_route_group (ev); - - if (ev->button == 1 && g) { - - g->set_active (!g->is_active (), this); - - } else if (ev->button == 3 && g) { + + double const p = primary_coordinate (ev->x, ev->y); + + Tab* prev; + Tab* next; + Tab* t = click_to_tab (p, &prev, &next); + if (t == 0) { + return false; + } + + if (ev->button == 1) { + + _dragging = t; + _drag_moved = false; + _drag_last = p; + + double const h = (t->from + t->to) / 2; + _drag_from = p < h; + + if (_drag_from) { + _drag_limit = prev ? prev->to : 0; + } else { + _drag_limit = next ? next->from : extent (); + } + + } else if (ev->button == 3) { if (!_menu) { _menu = new Menu; MenuList& items = _menu->items (); - items.push_back (MenuElem (_("Edit..."), bind (mem_fun (*this, &GroupTabs::edit_group), g))); - items.push_back (MenuElem (_("Remove"), bind (mem_fun (*this, &GroupTabs::remove_group), g))); + items.push_back (MenuElem (_("Edit..."), bind (mem_fun (*this, &GroupTabs::edit_group), t->group))); + items.push_back (MenuElem (_("Remove"), bind (mem_fun (*this, &GroupTabs::remove_group), t->group))); } _menu->popup (ev->button, ev->time); @@ -81,6 +101,63 @@ GroupTabs::on_button_press_event (GdkEventButton* ev) } +bool +GroupTabs::on_motion_notify_event (GdkEventMotion* ev) +{ + if (_dragging == 0) { + return false; + } + + double const p = primary_coordinate (ev->x, ev->y); + + if (p != _drag_last) { + _drag_moved = true; + } + + if (_drag_from) { + double f = _dragging->from + p - _drag_last; + if (f < _drag_limit) { + f = _drag_limit; + } + _dragging->from = f; + } else { + double t = _dragging->to + p - _drag_last; + if (t > _drag_limit) { + t = _drag_limit; + } + _dragging->to = t; + } + + set_dirty (); + queue_draw (); + + _drag_last = p; + + return true; +} + + +bool +GroupTabs::on_button_release_event (GdkEventButton* ev) +{ + if (_dragging == 0) { + return false; + } + + if (!_drag_moved) { + _dragging->group->set_active (!_dragging->group->is_active (), this); + _dragging = 0; + } else { + _dragging = 0; + reflect_tabs (_tabs); + set_dirty (); + queue_draw (); + } + + return true; +} + + void GroupTabs::edit_group (RouteGroup* g) { @@ -93,3 +170,49 @@ GroupTabs::remove_group (RouteGroup *g) { _session->remove_route_group (*g); } + +void +GroupTabs::render (cairo_t* cr) +{ + if (_dragging == 0) { + _tabs = compute_tabs (); + } + + /* background */ + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_rectangle (cr, 0, 0, _width, _height); + cairo_fill (cr); + + /* tabs */ + + for (list<Tab>::const_iterator i = _tabs.begin(); i != _tabs.end(); ++i) { + draw_tab (cr, *i); + } +} + + +GroupTabs::Tab * +GroupTabs::click_to_tab (double c, Tab** prev, Tab** next) +{ + list<Tab>::iterator i = _tabs.begin (); + while (i != _tabs.end() && (c < i->from || c > i->to)) { + *prev = &(*i); + ++i; + } + + if (i == _tabs.end()) { + *next = 0; + return 0; + } + + list<Tab>::iterator j = i; + ++j; + if (j == _tabs.end()) { + *next = 0; + } else { + *next = &(*j); + } + + return &(*i); +} |