X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fgroup_tabs.cc;h=b8d30dc989809eced10d35f5750c40304c040c58;hb=3f56abe099cd6978fbf2e1778debd74e771c95cd;hp=07962532ccee3548bcccd915f734b16b8eeec627;hpb=eff5781ee1c697fd565e68737fbec8c063f7e637;p=ardour.git diff --git a/gtk2_ardour/group_tabs.cc b/gtk2_ardour/group_tabs.cc index 07962532cc..b8d30dc989 100644 --- a/gtk2_ardour/group_tabs.cc +++ b/gtk2_ardour/group_tabs.cc @@ -42,7 +42,7 @@ GroupTabs::GroupTabs () , _dragging (0) , _dragging_new_tab (0) { - + add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK); } GroupTabs::~GroupTabs () @@ -134,11 +134,17 @@ GroupTabs::on_button_press_event (GdkEventButton* ev) } else if (ev->button == 3) { RouteGroup* g = t ? t->group : 0; - Menu* m = get_menu (g); - if (m) { - m->popup (ev->button, ev->time); + + if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier) && g) { + /* edit */ + RouteGroupDialog d (g, false); + d.do_run (); + } else { + Menu* m = get_menu (g); + if (m) { + m->popup (ev->button, ev->time); + } } - } return true; @@ -169,39 +175,30 @@ GroupTabs::on_motion_notify_event (GdkEventMotion* ev) set_dirty (); queue_draw (); + gdk_event_request_motions(ev); + return true; } bool -GroupTabs::on_button_release_event (GdkEventButton* ev) +GroupTabs::on_button_release_event (GdkEventButton*) { if (_dragging == 0) { return false; } - + if (!_drag_moved) { - + if (_dragging->group) { - - if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) { - - /* edit */ - RouteGroupDialog d (_dragging->group, false); - d.do_run (); - - } else { - - /* toggle active state */ - _dragging->group->set_active (!_dragging->group->is_active (), this); - - } + /* toggle active state */ + _dragging->group->set_active (!_dragging->group->is_active (), this); } - + } else { /* finish drag */ RouteList routes = routes_for_tab (_dragging); - + if (!routes.empty()) { if (_dragging_new_tab) { RouteGroup* g = create_and_add_group (); @@ -213,13 +210,13 @@ GroupTabs::on_button_release_event (GdkEventButton* ev) } else { boost::shared_ptr r = _session->get_routes (); for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { - + bool const was_in_tab = find ( _initial_dragging_routes.begin(), _initial_dragging_routes.end(), *i ) != _initial_dragging_routes.end (); - + bool const now_in_tab = find (routes.begin(), routes.end(), *i) != routes.end(); - + if (was_in_tab && !now_in_tab) { _dragging->group->remove (*i); } else if (!was_in_tab && now_in_tab) { @@ -228,11 +225,11 @@ GroupTabs::on_button_release_event (GdkEventButton* ev) } } } - + set_dirty (); queue_draw (); } - + _dragging = 0; _initial_dragging_routes.clear (); @@ -248,10 +245,12 @@ GroupTabs::render (cairo_t* cr) /* background */ - cairo_set_source_rgb (cr, 0, 0, 0); - cairo_rectangle (cr, 0, 0, _width, _height); - cairo_fill (cr); + Gdk::Color c = get_style()->get_base (Gtk::STATE_NORMAL); + cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); + cairo_rectangle (cr, 0, 0, get_width(), get_height()); + cairo_fill (cr); + /* tabs */ for (list::const_iterator i = _tabs.begin(); i != _tabs.end(); ++i) { @@ -314,23 +313,28 @@ GroupTabs::get_menu (RouteGroup* g) _menu->set_name ("ArdourContextMenu"); MenuList& items = _menu->items(); - items.push_back (MenuElem (_("New..."), hide_return (sigc::mem_fun(*this, &GroupTabs::create_and_add_group)))); - items.push_back (MenuElem (_("New From"), *new_from)); + items.push_back (MenuElem (_("Create New Group ..."), hide_return (sigc::mem_fun(*this, &GroupTabs::create_and_add_group)))); + items.push_back (MenuElem (_("Create New Group From"), *new_from)); if (g) { - items.push_back (MenuElem (_("Edit..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::edit_group), g))); - items.push_back (MenuElem (_("Add New Subgroup Bus"), sigc::bind (sigc::mem_fun (*this, &GroupTabs::subgroup), g, false, PreFader))); + items.push_back (MenuElem (_("Edit Group..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::edit_group), g))); + items.push_back (MenuElem (_("Collect Group"), sigc::bind (sigc::mem_fun (*this, &GroupTabs::collect), g))); + items.push_back (MenuElem (_("Remove Group"), sigc::bind (sigc::mem_fun (*this, &GroupTabs::remove_group), g))); + items.push_back (SeparatorElem()); + if (g->has_subgroup()) { + items.push_back (MenuElem (_("Remove Subgroup Bus"), sigc::bind (sigc::mem_fun (*this, &GroupTabs::un_subgroup), g))); + } else { + items.push_back (MenuElem (_("Add New Subgroup Bus"), sigc::bind (sigc::mem_fun (*this, &GroupTabs::subgroup), g, false, PreFader))); + } items.push_back (MenuElem (_("Add New Aux Bus (pre-fader)"), sigc::bind (sigc::mem_fun (*this, &GroupTabs::subgroup), g, true, PreFader))); items.push_back (MenuElem (_("Add New Aux Bus (post-fader)"), sigc::bind (sigc::mem_fun (*this, &GroupTabs::subgroup), g, true, PostFader))); - items.push_back (MenuElem (_("Collect"), sigc::bind (sigc::mem_fun (*this, &GroupTabs::collect), g))); - items.push_back (MenuElem (_("Remove"), sigc::bind (sigc::mem_fun (*this, &GroupTabs::remove_group), g))); } add_menu_items (_menu, g); items.push_back (SeparatorElem()); - items.push_back (MenuElem (_("Activate All"), sigc::mem_fun(*this, &GroupTabs::activate_all))); - items.push_back (MenuElem (_("Disable All"), sigc::mem_fun(*this, &GroupTabs::disable_all))); + items.push_back (MenuElem (_("Enable All Groups"), sigc::mem_fun(*this, &GroupTabs::activate_all))); + items.push_back (MenuElem (_("Disable All Groups"), sigc::mem_fun(*this, &GroupTabs::disable_all))); return _menu; @@ -436,14 +440,30 @@ GroupTabs::subgroup (RouteGroup* g, bool aux, Placement placement) g->make_subgroup (aux, placement); } +void +GroupTabs::un_subgroup (RouteGroup* g) +{ + g->destroy_subgroup (); +} + struct CollectSorter { - CollectSorter (std::string const & key) : _key (key) {} + CollectSorter (RouteSortOrderKey key) : _key (key) {} bool operator () (boost::shared_ptr a, boost::shared_ptr b) { return a->order_key (_key) < b->order_key (_key); } - std::string _key; + RouteSortOrderKey _key; +}; + +struct OrderSorter { + OrderSorter (RouteSortOrderKey key) : _key (key) {} + + bool operator() (boost::shared_ptr a, boost::shared_ptr b) { + return a->order_key (_key) < b->order_key (_key); + } + + RouteSortOrderKey _key; }; /** Collect all members of a RouteGroup so that they are together in the Editor or Mixer. @@ -458,6 +478,7 @@ GroupTabs::collect (RouteGroup* g) RouteList::iterator i = group_routes->begin (); boost::shared_ptr routes = _session->get_routes (); + routes->sort (OrderSorter (order_key ())); RouteList::const_iterator j = routes->begin (); int diff = 0; @@ -535,7 +556,13 @@ GroupTabs::set_group_color (RouteGroup* group, Gdk::Color color) char buf[64]; snprintf (buf, sizeof (buf), "%d:%d:%d", color.get_red(), color.get_green(), color.get_blue()); - gui_state.set (group_gui_id (group), "color", buf); + gui_state.set_property (group_gui_id (group), "color", buf); + + /* the group color change notification */ + + PBD::PropertyChange change; + change.add (Properties::color); + group->PropertyChanged (change); /* This is a bit of a hack, but this might change our route's effective color, so emit gui_changed