X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_edit_groups.cc;h=2ee1773646b78327812f95a0f0c4c900fa6a57a9;hb=b529cbc5dc0b92f01ff01d5f40786ff025fbb63b;hp=9e3df176f8fb5a08ff41dbd0888eea6fa4c6ebac;hpb=a0ee84a67358a7614cfa1b5e0df9af7e28072490;p=ardour.git diff --git a/gtk2_ardour/editor_edit_groups.cc b/gtk2_ardour/editor_edit_groups.cc index 9e3df176f8..2ee1773646 100644 --- a/gtk2_ardour/editor_edit_groups.cc +++ b/gtk2_ardour/editor_edit_groups.cc @@ -38,22 +38,11 @@ using namespace sigc; using namespace ARDOUR; +using namespace PBD; using namespace Gtk; -void -Editor::edit_group_list_column_click (gint col) - -{ - if (edit_group_list_menu == 0) { - build_edit_group_list_menu (); - } - - edit_group_list_menu->popup (0, 0); -} - void Editor::build_edit_group_list_menu () - { using namespace Gtk::Menu_Helpers; @@ -61,52 +50,59 @@ Editor::build_edit_group_list_menu () edit_group_list_menu->set_name ("ArdourContextMenu"); MenuList& items = edit_group_list_menu->items(); - items.push_back (MenuElem (_("Show All"), mem_fun(*this, &Editor::select_all_edit_groups))); - items.push_back (MenuElem (_("Hide All"), mem_fun(*this, &Editor::unselect_all_edit_groups))); + items.push_back (MenuElem (_("Activate All"), mem_fun(*this, &Editor::activate_all_edit_groups))); + items.push_back (MenuElem (_("Disable All"), mem_fun(*this, &Editor::disable_all_edit_groups))); + items.push_back (SeparatorElem()); + items.push_back (MenuElem (_("Add group"), mem_fun(*this, &Editor::new_edit_group))); + } void -Editor::unselect_all_edit_groups () - +Editor::activate_all_edit_groups () { + Gtk::TreeModel::Children children = group_model->children(); + for(Gtk::TreeModel::Children::iterator iter = children.begin(); iter != children.end(); ++iter) { + (*iter)[group_columns.is_active] = true; + } } void -Editor::select_all_edit_groups () - +Editor::disable_all_edit_groups () { - - /* XXX potential race with remove_track(), but the select operation - cannot be done with the track_lock held. - */ - Gtk::TreeModel::Children children = group_model->children(); for(Gtk::TreeModel::Children::iterator iter = children.begin(); iter != children.end(); ++iter) { - edit_group_list.get_selection()->select (iter); + (*iter)[group_columns.is_active] = false; } } void Editor::new_edit_group () +{ + session->add_edit_group (""); +} +void +Editor::remove_selected_edit_group () { - if (session == 0) { + Glib::RefPtr selection = edit_group_display.get_selection(); + TreeView::Selection::ListHandle_Path rows = selection->get_selected_rows (); + + if (rows.empty()) { return; } - ArdourPrompter prompter; - string result; + TreeView::Selection::ListHandle_Path::iterator i = rows.begin(); + TreeIter iter; + + /* selection mode is single, so rows.begin() is it */ + + if ((iter = group_model->get_iter (*i))) { - prompter.set_prompt (_("Name for new edit group")); - prompter.show_all (); + RouteGroup* rg = (*iter)[group_columns.routegroup]; - switch (prompter.run ()) { - case GTK_RESPONSE_ACCEPT: - prompter.get_result (result); - if (result.length()) { - session->add_edit_group (result); + if (rg) { + session->remove_edit_group (*rg); } - break; } } @@ -119,6 +115,14 @@ Editor::edit_group_list_button_clicked () gint Editor::edit_group_list_button_press_event (GdkEventButton* ev) { + if (Keyboard::is_context_menu_event (ev)) { + if (edit_group_list_menu == 0) { + build_edit_group_list_menu (); + } + edit_group_list_menu->popup (1, ev->time); + return true; + } + RouteGroup* group; TreeIter iter; @@ -126,101 +130,171 @@ Editor::edit_group_list_button_press_event (GdkEventButton* ev) TreeViewColumn* column; int cellx; int celly; - - if (!edit_group_list.get_path_at_pos ((int)ev->x, (int)ev->y, path, column, cellx, celly)) { + + if (!edit_group_display.get_path_at_pos ((int)ev->x, (int)ev->y, path, column, cellx, celly)) { return false; } switch (GPOINTER_TO_UINT (column->get_data (X_("colnum")))) { - - case 1: - + case 0: if (Keyboard::is_edit_event (ev)) { - // RouteGroup* group = (RouteGroup *) edit_group_list.row(row).get_data (); - // edit_route_group (group); - - return stop_signal (edit_group_list, "button_press_event"); + if ((iter = group_model->get_iter (path))) { + if ((group = (*iter)[group_columns.routegroup]) != 0) { + // edit_route_group (group); + return true; + } + } + + } + break; - } else { - /* allow regular select to occur */ - return FALSE; + case 1: + if ((iter = group_model->get_iter (path))) { + bool active = (*iter)[group_columns.is_active]; + (*iter)[group_columns.is_active] = !active; + return true; } break; - - case 0: + + case 2: if ((iter = group_model->get_iter (path))) { - /* path points to a valid node */ - - if ((group = (*iter)[group_columns.routegroup]) != 0) { - group->set_active (!group->is_active (), this); - } + bool visible = (*iter)[group_columns.is_visible]; + (*iter)[group_columns.is_visible] = !visible; + return true; } break; + + default: + break; } - - return stop_signal (edit_group_list, "button_press_event"); -} + + return false; + } -void -Editor::edit_group_selection_changed () +void +Editor::edit_group_row_change (const Gtk::TreeModel::Path& path,const Gtk::TreeModel::iterator& iter) { - TreeModel::iterator i; - TreeModel::Children rows = group_model->children(); - Glib::RefPtr selection = edit_group_list.get_selection(); - - for (i = rows.begin(); i != rows.end(); ++i) { - RouteGroup* group; - - group = (*i)[group_columns.routegroup]; - - if (selection->is_selected (i)) { - for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) { - if ((*j)->edit_group() == group) { - select_strip_in_display (*j); - } - } - } else { - for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) { - if ((*j)->edit_group() == group) { - unselect_strip_in_display (*j); - } - } + RouteGroup* group; + + if (in_edit_group_row_change) { + return; + } + + if ((group = (*iter)[group_columns.routegroup]) == 0) { + return; + } + + if ((*iter)[group_columns.is_visible]) { + for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) { + if ((*j)->edit_group() == group) { + show_track_in_display (**j); + } } + } else { + for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) { + if ((*j)->edit_group() == group) { + hide_track_in_display (**j); + } + } + } + + bool active = (*iter)[group_columns.is_active]; + group->set_active (active, this); + + + string name = (*iter)[group_columns.text]; + + if (name != group->name()) { + group->set_name (name); } } void Editor::add_edit_group (RouteGroup* group) - { - ENSURE_GUI_THREAD(bind (mem_fun(*this, &Editor::add_edit_group), group)); + bool focus = false; TreeModel::Row row = *(group_model->append()); row[group_columns.is_active] = group->is_active(); - row[group_columns.text] = group->name(); + row[group_columns.is_visible] = !group->is_hidden(); + + in_edit_group_row_change = true; + row[group_columns.routegroup] = group; + if (!group->name().empty()) { + row[group_columns.text] = group->name(); + } else { + row[group_columns.text] = _("unnamed"); + focus = true; + } + group->FlagsChanged.connect (bind (mem_fun(*this, &Editor::group_flags_changed), group)); + + if (focus) { + TreeViewColumn* col = edit_group_display.get_column (0); + CellRendererText* name_cell = dynamic_cast(edit_group_display.get_column_cell_renderer (0)); + edit_group_display.set_cursor (group_model->get_path (row), *col, *name_cell, true); + } + + in_edit_group_row_change = false; } void -Editor::group_flags_changed (void* src, RouteGroup* group) +Editor::edit_groups_changed () { - /* GTK2FIX not needed in gtk2? + ENSURE_GUI_THREAD (mem_fun (*this, &Editor::edit_groups_changed)); - if (src != this) { - // select row - } + /* just rebuild the while thing */ - CList_Helpers::RowIterator ri = edit_group_list.rows().find_data (group); + group_model->clear (); - if (group->is_active()) { - edit_group_list.cell (ri->get_row_num(),0).set_pixmap (check_pixmap, check_mask); - } else { - edit_group_list.cell (ri->get_row_num(),0).set_pixmap (empty_pixmap, empty_mask); + { + TreeModel::Row row; + row = *(group_model->append()); + row[group_columns.is_active] = false; + row[group_columns.is_visible] = true; + row[group_columns.text] = (_("-all-")); + row[group_columns.routegroup] = 0; } - */ + + session->foreach_edit_group (mem_fun (*this, &Editor::add_edit_group)); } +void +Editor::group_flags_changed (void* src, RouteGroup* group) +{ + ENSURE_GUI_THREAD(bind (mem_fun(*this, &Editor::group_flags_changed), src, group)); + + in_edit_group_row_change = true; + + Gtk::TreeModel::Children children = group_model->children(); + for(Gtk::TreeModel::Children::iterator iter = children.begin(); iter != children.end(); ++iter) { + if (group == (*iter)[group_columns.routegroup]) { + (*iter)[group_columns.is_active] = group->is_active(); + (*iter)[group_columns.is_visible] = !group->is_hidden(); + (*iter)[group_columns.text] = group->name(); + } + } + in_edit_group_row_change = false; +} + +void +Editor::edit_group_name_edit (const Glib::ustring& path, const Glib::ustring& new_text) +{ + RouteGroup* group; + TreeIter iter; + + if ((iter = group_model->get_iter (path))) { + + if ((group = (*iter)[group_columns.routegroup]) == 0) { + return; + } + + if (new_text != group->name()) { + group->set_name (new_text); + } + } +}