diff options
author | Nick Mainsbridge <beatroute@iprimus.com.au> | 2005-10-26 18:12:00 +0000 |
---|---|---|
committer | Nick Mainsbridge <beatroute@iprimus.com.au> | 2005-10-26 18:12:00 +0000 |
commit | a0ee84a67358a7614cfa1b5e0df9af7e28072490 (patch) | |
tree | 310a6fd57e20a11e928078d356fffadf1866a9c7 | |
parent | d8efcf6da2c391c0b9bb2269f072e03e6f64ed07 (diff) |
editor group list, route list and named selection treeviews
git-svn-id: svn://localhost/trunk/ardour2@68 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r-- | gtk2_ardour/editor.cc | 98 | ||||
-rw-r--r-- | gtk2_ardour/editor.h | 61 | ||||
-rw-r--r-- | gtk2_ardour/editor_edit_groups.cc | 116 | ||||
-rw-r--r-- | gtk2_ardour/editor_route_list.cc | 262 | ||||
-rw-r--r-- | gtk2_ardour/editor_selection_list.cc | 84 |
5 files changed, 345 insertions, 276 deletions
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 215fbcaf64..34b9730070 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -184,8 +184,6 @@ GdkBitmap *Editor::check_mask = 0; GdkPixmap *Editor::empty_pixmap = 0; GdkBitmap *Editor::empty_mask = 0; -extern gint route_list_compare_func (GtkCList*,gconstpointer,gconstpointer); - Editor::Editor (AudioEngine& eng) : engine (eng), @@ -357,7 +355,7 @@ Editor::Editor (AudioEngine& eng) initialize_rulers (); initialize_canvas (); - track_canvas_scroller.add (*track_canvas); + track_canvas_scroller.add (track_canvas); track_canvas_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_NEVER); track_canvas_scroller.set_name ("TrackCanvasScroller"); @@ -376,7 +374,7 @@ Editor::Editor (AudioEngine& eng) edit_hscrollbar.signal_button_release_event().connect (mem_fun(*this, &Editor::hscroll_slider_button_release)); edit_hscrollbar.size_allocate.connect (mem_fun(*this, &Editor::hscroll_slider_allocate)); - time_canvas_scroller.add (*time_canvas); + time_canvas_scroller.add (time_canvas); time_canvas_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_NEVER); time_canvas_scroller.set_hadjustment (*track_canvas_scroller.get_hadjustment()); time_canvas_scroller.set_name ("TimeCanvasScroller"); @@ -531,45 +529,66 @@ Editor::Editor (AudioEngine& eng) bottom_hbox.set_border_width (3); bottom_hbox.set_spacing (3); + route_display_model = ListStore::create(route_display_columns); + route_list.set_model (route_display_model); + route_list.append_column (_("Tracks"), route_display_columns.text); route_list.set_name ("TrackListDisplay"); - route_list.set_size_request (75,-1); - route_list.column_titles_active(); - route_list.set_compare_func (route_list_compare_func); - route_list.set_shadow_type (Gtk::SHADOW_IN); - route_list.set_selection_mode (Gtk::SELECTION_MULTIPLE); + route_list.get_selection()->set_mode (Gtk::SELECTION_MULTIPLE); route_list.set_reorderable (true); - edit_group_list.set_size_request (75, -1); + + route_list.set_size_request (75,-1); + route_list.set_headers_visible (true); + route_list.set_headers_clickable (true); + + route_display_model->set_sort_func (0, mem_fun (*this, &Editor::route_list_compare_func)); + + //route_list.set_shadow_type (Gtk::SHADOW_IN); route_list_scroller.add (route_list); route_list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); - route_list.select_row.connect (mem_fun(*this, &Editor::route_list_selected)); - route_list.unselect_row.connect (mem_fun(*this, &Editor::route_list_unselected)); - route_list.row_move.connect (mem_fun(*this, &Editor::queue_route_list_reordered)); - route_list.click_column.connect (mem_fun(*this, &Editor::route_list_column_click)); + route_list.get_selection()->signal_changed().connect (mem_fun (*this, &Editor::route_display_selection_changed)); + route_display_model->signal_rows_reordered().connect (mem_fun (*this, &Editor::queue_route_list_reordered)); + route_list.signal_button_press_event().connect (mem_fun(*this, &Editor::route_list_column_click)); edit_group_list_button_label.set_text (_("Edit Groups")); edit_group_list_button_label.set_name ("EditGroupTitleButton"); edit_group_list_button.add (edit_group_list_button_label); edit_group_list_button.set_name ("EditGroupTitleButton"); - edit_group_list.column_titles_hide(); + group_model = ListStore::create(group_columns); + edit_group_list.set_model (group_model); + edit_group_list.append_column (_("active"), group_columns.is_active); + edit_group_list.append_column (_("groupname"), group_columns.text); + edit_group_list.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0)); + edit_group_list.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(1)); + + /* use checkbox for the active column */ + + CellRendererToggle *active_cell = dynamic_cast<CellRendererToggle*>(edit_group_list.get_column_cell_renderer (0)); + active_cell->property_activatable() = true; + active_cell->property_radio() = false; + edit_group_list.set_name ("MixerGroupList"); - edit_group_list.set_shadow_type (Gtk::SHADOW_IN); - edit_group_list.set_selection_mode (Gtk::SELECTION_MULTIPLE); + //edit_group_list.set_shadow_type (Gtk::SHADOW_IN); + route_list.set_headers_visible (false); edit_group_list.set_reorderable (false); edit_group_list.set_size_request (75, -1); - edit_group_list.set_column_auto_resize (0, true); edit_group_list.columns_autosize (); + edit_group_list.get_selection()->set_mode (Gtk::SELECTION_MULTIPLE); edit_group_list_scroller.add (edit_group_list); edit_group_list_scroller.set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); edit_group_list_button.signal_clicked().connect (mem_fun(*this, &Editor::edit_group_list_button_clicked)); edit_group_list.signal_button_press_event().connect (mem_fun(*this, &Editor::edit_group_list_button_press_event)); - edit_group_list.select_row.connect (mem_fun(*this, &Editor::edit_group_selected)); - edit_group_list.unselect_row.connect (mem_fun(*this, &Editor::edit_group_unselected)); - + edit_group_list.get_selection()->signal_changed().connect (mem_fun(*this, &Editor::edit_group_selection_changed)); + + TreeModel::Row row = *(group_model->append()); + row[group_columns.is_active] = false; + row[group_columns.text] = (_("-all-")); + edit_group_list.get_selection()->select (row); +/* GTK2FIX is set_data(0) setting the is_active to false here? list<string> stupid_list; stupid_list.push_back ("*"); @@ -579,6 +598,7 @@ Editor::Editor (AudioEngine& eng) edit_group_list.rows().back().set_data (0); edit_group_list.rows().back().select(); +*/ edit_group_vbox.pack_start (edit_group_list_button, false, false); edit_group_vbox.pack_start (edit_group_list_scroller, true, true); @@ -595,7 +615,7 @@ Editor::Editor (AudioEngine& eng) list_vpacker.pack_start (route_group_vpane, true, true); - region_list_model = TreeStore::create (region_list_columns)); + region_list_model = TreeStore::create (region_list_columns); region_list_sort_model = TreeModelSort::create (region_list_model); region_list_model->set_sort_func (0, mem_fun (*this, &Editor::region_list_sorter)); @@ -629,14 +649,15 @@ Editor::Editor (AudioEngine& eng) named_selection_scroller.add (named_selection_display); named_selection_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); + named_selection_model = TreeStore::create (named_selection_columns); + named_selection_display.set_model (named_selection_model); named_selection_display.set_name ("RegionListDisplay"); named_selection_display.set_size_request (100, -1); - named_selection_display.column_titles_active (); - named_selection_display.set_selection_mode (Gtk::SELECTION_SINGLE); - + named_selection_display.set_headers_visible (true); + named_selection_display.set_headers_clickable (true); + named_selection_display.get_selection()->set_mode (Gtk::SELECTION_SINGLE); named_selection_display.signal_button_press_event().connect (mem_fun(*this, &Editor::named_selection_display_button_press)); - named_selection_display.select_row.connect (mem_fun(*this, &Editor::named_selection_display_selected)); - named_selection_display.unselect_row.connect (mem_fun(*this, &Editor::named_selection_display_unselected)); + named_selection_display.get_selection()->signal_changed().connect (mem_fun (*this, &Editor::named_selection_display_selection_changed)); region_selection_vpane.pack1 (region_list_scroller, true, true); region_selection_vpane.pack2 (named_selection_scroller, true, true); @@ -713,7 +734,7 @@ Editor::Editor (AudioEngine& eng) add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK); configure_event.connect (mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler)); - delete_event.connect (mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::exit_on_main_window_close)); + signal_delete_event().connect (mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::exit_on_main_window_close)); constructed = true; instant_save (); @@ -862,7 +883,7 @@ Editor::initialize_canvas () transport_marker_bar->property_fill_color_rgba() << color_map[cTransportMarkerBar]; transport_marker_bar->property_outline_pixels() << 0; - range_bar_drag_rect = Canvas::SimpleRect (*range_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height); + range_bar_drag_rect = Canvas::SimpleRect (*range_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height).gobj(); range_bar_drag_rect->property_fill_color_rgba() << color_map[cRangeBarDragRectFill]; range_bar_drag_rect->property_outline_color_rgba() << color_map[cRangeBarDragRect]; range_bar_drag_rect->property_outline_pixels() << 0; @@ -1641,7 +1662,7 @@ Editor::connect_to_session (Session *t) redisplay_named_selections (); route_list.freeze (); - route_list.clear (); + route_display_model.clear (); session->foreach_route (this, &Editor::handle_new_route); // route_list.select_all (); route_list.sort (); @@ -1685,23 +1706,24 @@ Editor::connect_to_session (Session *t) if (ARDOUR_UI::instance()->session_is_new ()) { - Gtk::CList_Helpers::RowList::iterator i; - Gtk::CList_Helpers::RowList& rowlist = route_list.rows(); - - route_list.freeze (); + TreeModel::Children rows = route_display_model->children(); + TreeModel::Children::iterator i; + + //route_list.freeze (); - for (i = rowlist.begin(); i != rowlist.end(); ++i) { - TimeAxisView *tv = (TimeAxisView *) i->get_data (); + for (i = rows.begin(); i != rows.end(); ++i) { + TimeAxisView *tv = (*i)[route_display_columns.tv]; AudioTimeAxisView *atv; if ((atv = dynamic_cast<AudioTimeAxisView*>(tv)) != 0) { if (atv->route().master()) { - (*i)->unselect (); + route_list.get_selection()->unselect (i); + //(*i)->unselect (); } } } - route_list.thaw (); + //route_list.thaw (); } } diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 46bd6570b1..b90abf4ac3 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -264,8 +264,8 @@ class Editor : public PublicEditor Width editor_mixer_strip_width; void show_editor_mixer (bool yn); void set_selected_mixer_strip (TimeAxisView&); - void unselect_strip_in_display (TimeAxisView& tv); - void select_strip_in_display (TimeAxisView& tv); + void unselect_strip_in_display (TimeAxisView* tv); + void select_strip_in_display (TimeAxisView* tv); /* nudge is initiated by transport controls owned by ARDOUR_UI */ @@ -765,6 +765,18 @@ class Editor : public PublicEditor /* named selections */ + struct NamedSelectionDisplayModelColumns : public Gtk::TreeModel::ColumnRecord { + NamedSelectionDisplayModelColumns() { + add (text); + add (selection); + } + Gtk::TreeModelColumn<Glib::ustring> text; + Gtk::TreeModelColumn<ARDOUR::NamedSelection*> selection; + }; + + NamedSelectionDisplayModelColumns named_selection_columns; + Glib::RefPtr<Gtk::TreeStore> named_selection_model; + Gtk::VPaned region_selection_vpane; Gtk::TreeView named_selection_display; Gtk::ScrolledWindow named_selection_scroller; @@ -779,8 +791,7 @@ class Editor : public PublicEditor void redisplay_named_selections (); gint named_selection_display_button_press (GdkEventButton *ev); - void named_selection_display_selected (gint row, gint col, GdkEvent *ev); - void named_selection_display_unselected (gint row, gint col, GdkEvent *ev); + void named_selection_display_selection_changed (); /* track views */ int track_spacing; @@ -1039,12 +1050,11 @@ class Editor : public PublicEditor void hide_all_tracks (bool with_select); - void route_list_selected (gint row, gint col, GdkEvent* ev); - void route_list_unselected (gint row, gint col, GdkEvent* ev); + void route_display_selection_changed (); void redisplay_route_list(); gint route_list_reordered (); bool ignore_route_list_reorder; - void queue_route_list_reordered (gint row, gint col); + void queue_route_list_reordered (); struct DragInfo { GnomeCanvasItem* item; @@ -1488,11 +1498,25 @@ class Editor : public PublicEditor /* diskstream/route display management */ - Gtk::TreeView route_list; + struct RouteDisplayModelColumns : public Gtk::TreeModel::ColumnRecord { + RouteDisplayModelColumns() { + add (text); + add (tv); + } + Gtk::TreeModelColumn<Glib::ustring> text; + Gtk::TreeModelColumn<TimeAxisView*> tv; + }; + + RouteDisplayModelColumns route_display_columns; + Glib::RefPtr<Gtk::ListStore> route_display_model; + Glib::RefPtr<Gtk::TreeSelection> route_display_selection; + + gint route_list_compare_func (Gtk::TreeModel::iterator, Gtk::TreeModel::iterator); + Gtk::TreeView route_list; //GTK2FIX rename to route_display Gtk::ScrolledWindow route_list_scroller; Gtk::Menu *route_list_menu; - void route_list_column_click (gint); + void route_list_column_click (); void build_route_list_menu (); void select_all_routes (); void unselect_all_routes (); @@ -1503,6 +1527,21 @@ class Editor : public PublicEditor /* edit group management */ + struct GroupListModelColumns : public Gtk::TreeModel::ColumnRecord { + GroupListModelColumns () { + add (is_active); + add (text); + add (routegroup); + } + Gtk::TreeModelColumn<bool> is_active; + Gtk::TreeModelColumn<std::string> text; + Gtk::TreeModelColumn<ARDOUR::RouteGroup*> routegroup; + }; + + GroupListModelColumns group_columns; + Glib::RefPtr<Gtk::ListStore> group_model; + Glib::RefPtr<Gtk::TreeSelection> group_selection; + Gtk::Button edit_group_list_button; Gtk::Label edit_group_list_button_label; Gtk::TreeView edit_group_list; @@ -1510,7 +1549,6 @@ class Editor : public PublicEditor Gtk::Menu *edit_group_list_menu; Gtk::VBox edit_group_vbox; - void edit_group_list_column_click (gint); void build_edit_group_list_menu (); void select_all_edit_groups (); @@ -1518,8 +1556,7 @@ class Editor : public PublicEditor void new_edit_group (); void edit_group_list_button_clicked (); gint edit_group_list_button_press_event (GdkEventButton* ev); - void edit_group_selected (gint row, gint col, GdkEvent* ev); - void edit_group_unselected (gint row, gint col, GdkEvent* ev); + void edit_group_selection_changed (); void fake_add_edit_group (ARDOUR::RouteGroup* group); void add_edit_group (ARDOUR::RouteGroup* group); void group_flags_changed (void*, ARDOUR::RouteGroup*); diff --git a/gtk2_ardour/editor_edit_groups.cc b/gtk2_ardour/editor_edit_groups.cc index 48f1b13c1c..9e3df176f8 100644 --- a/gtk2_ardour/editor_edit_groups.cc +++ b/gtk2_ardour/editor_edit_groups.cc @@ -22,6 +22,7 @@ #include <cmath> #include <gtkmm2ext/stop_signal.h> +#include <gtkmm2ext/gtk_ui.h> #include <ardour/route_group.h> #include "editor.h" @@ -29,6 +30,7 @@ #include "marker.h" #include "time_axis_view.h" #include "prompter.h" +#include "gui_thread.h" #include <ardour/route.h> @@ -73,14 +75,14 @@ void Editor::select_all_edit_groups () { - CList_Helpers::RowList::iterator i; - + /* XXX potential race with remove_track(), but the select operation cannot be done with the track_lock held. */ - for (i = route_list.rows().begin(); i != route_list.rows().end(); ++i) { - i->select (); + 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); } } @@ -96,20 +98,15 @@ Editor::new_edit_group () string result; prompter.set_prompt (_("Name for new edit group")); - prompter.done.connect (Gtk::Main::quit.slot()); - prompter.show_all (); - - Gtk::Main::run (); - - if (prompter.status != Gtkmm2ext::Prompter::entered) { - return; - } - - prompter.get_result (result); - if (result.length()) { - session->add_edit_group (result); + switch (prompter.run ()) { + case GTK_RESPONSE_ACCEPT: + prompter.get_result (result); + if (result.length()) { + session->add_edit_group (result); + } + break; } } @@ -122,13 +119,21 @@ Editor::edit_group_list_button_clicked () gint Editor::edit_group_list_button_press_event (GdkEventButton* ev) { - gint row, col; - if (edit_group_list.get_selection_info ((int)ev->x, (int)ev->y, &row, &col) == 0) { - return FALSE; + RouteGroup* group; + TreeIter iter; + TreeModel::Path path; + TreeViewColumn* column; + int cellx; + int celly; + + if (!edit_group_list.get_path_at_pos ((int)ev->x, (int)ev->y, path, column, cellx, celly)) { + return false; } - if (col == 1) { + switch (GPOINTER_TO_UINT (column->get_data (X_("colnum")))) { + + case 1: if (Keyboard::is_edit_event (ev)) { // RouteGroup* group = (RouteGroup *) edit_group_list.row(row).get_data (); @@ -140,54 +145,61 @@ Editor::edit_group_list_button_press_event (GdkEventButton* ev) /* allow regular select to occur */ return FALSE; } - - } else if (col == 0) { - - RouteGroup* group = reinterpret_cast<RouteGroup *>(edit_group_list.row(row).get_data ()); - - if (group) { - group->set_active (!group->is_active(), this); + break; + + case 0: + 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); + } } + break; } - + return stop_signal (edit_group_list, "button_press_event"); } void -Editor::edit_group_selected (gint row, gint col, GdkEvent* ev) +Editor::edit_group_selection_changed () { - RouteGroup* group = (RouteGroup *) edit_group_list.row(row).get_data (); + TreeModel::iterator i; + TreeModel::Children rows = group_model->children(); + Glib::RefPtr<TreeSelection> selection = edit_group_list.get_selection(); - for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { - if ((*i)->edit_group() == group) { - select_strip_in_display (*(*i)); - } - } -} + for (i = rows.begin(); i != rows.end(); ++i) { + RouteGroup* group; -void -Editor::edit_group_unselected (gint row, gint col, GdkEvent* ev) -{ - RouteGroup* group = (RouteGroup *) edit_group_list.row(row).get_data (); + group = (*i)[group_columns.routegroup]; - for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { - if ((*i)->edit_group() == group) { - unselect_strip_in_display (*(*i)); + 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); + } + } } } } void Editor::add_edit_group (RouteGroup* group) -{ - list<string> names; - names.push_back ("*"); - names.push_back (group->name()); +{ + + ENSURE_GUI_THREAD(bind (mem_fun(*this, &Editor::add_edit_group), group)); - edit_group_list.rows().push_back (names); - edit_group_list.rows().back().set_data (group); - edit_group_list.rows().back().select(); + TreeModel::Row row = *(group_model->append()); + row[group_columns.is_active] = group->is_active(); + row[group_columns.text] = group->name(); + row[group_columns.routegroup] = group; group->FlagsChanged.connect (bind (mem_fun(*this, &Editor::group_flags_changed), group)); } @@ -195,6 +207,8 @@ Editor::add_edit_group (RouteGroup* group) void Editor::group_flags_changed (void* src, RouteGroup* group) { + /* GTK2FIX not needed in gtk2? + if (src != this) { // select row } @@ -206,5 +220,7 @@ Editor::group_flags_changed (void* src, RouteGroup* group) } else { edit_group_list.cell (ri->get_row_num(),0).set_pixmap (empty_pixmap, empty_mask); } + */ } + diff --git a/gtk2_ardour/editor_route_list.cc b/gtk2_ardour/editor_route_list.cc index 0f5838066e..9d3090d97c 100644 --- a/gtk2_ardour/editor_route_list.cc +++ b/gtk2_ardour/editor_route_list.cc @@ -48,29 +48,29 @@ Editor::handle_new_route (Route& route) { TimeAxisView *tv; AudioTimeAxisView *atv; - const gchar *rowdata[1]; + TreeModel::Row row = *(route_display_model->append()); if (route.hidden()) { return; } - tv = new AudioTimeAxisView (*this, *session, route, track_canvas); + tv = new AudioTimeAxisView (*this, *session, route, &track_canvas); track_views.push_back (tv); - rowdata[0] = route.name ().c_str(); + row[route_display_columns.text] = route.name(); + row[route_display_columns.tv] = tv; ignore_route_list_reorder = true; - route_list.rows().push_back (rowdata); - route_list.rows().back().set_data (tv); + if (tv->marked_for_display()) { - route_list.rows().back().select(); + route_list.get_selection()->select (row); } if ((atv = dynamic_cast<AudioTimeAxisView*> (tv)) != 0) { /* added a new fresh one at the end */ if (atv->route().order_key(N_("editor")) == -1) { - atv->route().set_order_key (N_("editor"), route_list.rows().size()-1); + atv->route().set_order_key (N_("editor"), route_display_model->children().size()-1); } } @@ -94,21 +94,24 @@ Editor::handle_gui_changes (string what, void *src) } } + void Editor::remove_route (TimeAxisView *tv) { ENSURE_GUI_THREAD(bind (mem_fun(*this, &Editor::remove_route), tv)); + TrackViewList::iterator i; - CList_Helpers::RowList::iterator ri; + TreeModel::Children rows = route_display_model->children(); + TreeModel::Children::iterator ri; if ((i = find (track_views.begin(), track_views.end(), tv)) != track_views.end()) { track_views.erase (i); } - for (ri = route_list.rows().begin(); ri != route_list.rows().end(); ++ri) { - if (tv == ri->get_data()) { - route_list.rows().erase (ri); + for (ri = rows.begin(); ri != rows.end(); ++ri) { + if ((*ri)[route_display_columns.tv] == tv) { + route_display_model->erase (ri); break; } } @@ -127,70 +130,78 @@ Editor::remove_route (TimeAxisView *tv) void Editor::route_name_changed (TimeAxisView *tv) { - CList_Helpers::RowList::iterator i; - gint row; - - for (row = 0, i = route_list.rows().begin(); i != route_list.rows().end(); ++i, ++row) { - if (tv == i->get_data()) { - route_list.cell (row, 0).set_text (tv->name()); + ENSURE_GUI_THREAD(bind (mem_fun(*this, &Editor::route_name_changed), tv)); + + TreeModel::Children rows = route_display_model->children(); + TreeModel::Children::iterator i; + + for (i = rows.begin(); i != rows.end(); ++i) { + if ((*i)[route_display_columns.tv] == tv) { + (*i)[route_display_columns.text] = tv->name(); break; } - } -} + } -void -Editor::route_list_selected (gint row, gint col, GdkEvent *ev) -{ - TimeAxisView *tv; - if ((tv = (TimeAxisView *) route_list.get_row_data (row)) != 0) { - tv->set_marked_for_display (true); - route_list_reordered (); - } } void -Editor::route_list_unselected (gint row, gint col, GdkEvent *ev) +Editor::route_display_selection_changed () { - TimeAxisView *tv; - AudioTimeAxisView *atv; - - if ((tv = (TimeAxisView *) route_list.get_row_data (row)) != 0) { - - tv->set_marked_for_display (false); - if ((atv = dynamic_cast<AudioTimeAxisView*>(tv)) != 0) { - if (current_mixer_strip && &(atv->route()) == &(current_mixer_strip->route())) { - /* this will hide the mixer strip */ - set_selected_mixer_strip(*atv); + TimeAxisView *tv; + TreeModel::Children rows = route_display_model->children(); + TreeModel::Children::iterator i; + Glib::RefPtr<TreeSelection> selection = route_list.get_selection(); + + for (i = rows.begin(); i != rows.end(); ++i) { + tv = (*i)[route_display_columns.tv]; + if (selection->is_selected (i)) { + tv->set_marked_for_display (true); + } else { + AudioTimeAxisView *atv; + tv->set_marked_for_display (false); + if ((atv = dynamic_cast<AudioTimeAxisView*>(tv)) != 0) { + if (current_mixer_strip && &(atv->route()) == &(current_mixer_strip->route())) { + // this will hide the mixer strip + set_selected_mixer_strip(*atv); + } } } - - route_list_reordered (); } + + route_list_reordered (); } void -Editor::unselect_strip_in_display (TimeAxisView& tv) +Editor::unselect_strip_in_display (TimeAxisView* tv) { - CList_Helpers::RowIterator i; - - if ((i = route_list.rows().find_data (&tv)) != route_list.rows().end()) { - (*i).unselect (); + TreeModel::Children rows = route_display_model->children(); + TreeModel::Children::iterator i; + Glib::RefPtr<TreeSelection> selection = route_list.get_selection(); + + for (i = rows.begin(); i != rows.end(); ++i) { + if ((*i)[route_display_columns.tv] == tv) { + selection->unselect (*i); + } } } void -Editor::select_strip_in_display (TimeAxisView& tv) +Editor::select_strip_in_display (TimeAxisView* tv) { - CList_Helpers::RowIterator i; - - if ((i = route_list.rows().find_data (&tv)) != route_list.rows().end()) { - (*i).select (); + TreeModel::Children rows = route_display_model->children(); + TreeModel::Children::iterator i; + Glib::RefPtr<TreeSelection> selection = route_list.get_selection(); + + for (i = rows.begin(); i != rows.end(); ++i) { + if ((*i)[route_display_columns.tv] == tv) { + selection->select (*i); + } } } void -Editor::queue_route_list_reordered (gint arg1, gint arg2) +Editor::queue_route_list_reordered () { /* the problem here is that we are called *before* the @@ -199,7 +210,7 @@ Editor::queue_route_list_reordered (gint arg1, gint arg2) is complete. */ - Main::idle.connect (mem_fun(*this, &Editor::route_list_reordered)); + Glib::signal_idle().connect (mem_fun(*this, &Editor::route_list_reordered)); } void @@ -211,16 +222,14 @@ Editor::redisplay_route_list () gint Editor::route_list_reordered () { - CList_Helpers::RowList::iterator i; - gdouble y; - int n; - - for (n = 0, y = 0, i = route_list.rows().begin(); i != route_list.rows().end(); ++i) { - - TimeAxisView *tv = (TimeAxisView *) (*i)->get_data (); - - AudioTimeAxisView* at; - + TreeModel::Children rows = route_display_model->children(); + TreeModel::Children::iterator i; + long order; +int n; + + for (n = 0, order = 0, i = rows.begin(); i != rows.end(); ++i, ++order) { + TimeAxisView *tv = (*i)[route_display_columns.tv]; + AudioTimeAxisView* at; if (!ignore_route_list_reorder) { /* this reorder is caused by user action, so reassign sort order keys @@ -228,55 +237,52 @@ Editor::route_list_reordered () */ if ((at = dynamic_cast<AudioTimeAxisView*> (tv)) != 0) { - at->route().set_order_key (N_("editor"), n); + at->route().set_order_key (N_("editor"), order); } } - if (tv->marked_for_display()) { - y += tv->show_at (y, n, &edit_controls_vbox); - y += track_spacing; + order += tv->show_at (order, n, &edit_controls_vbox); + order += track_spacing; } else { tv->hide (); } n++; + } - edit_controls_scroller.queue_resize (); reset_scrolling_region (); - - //gnome_canvas_item_raise_to_top (time_line_group); - gnome_canvas_item_raise_to_top (cursor_group); - return FALSE; } void Editor::hide_all_tracks (bool with_select) { - Gtk::CList_Helpers::RowList::iterator i; - Gtk::CList_Helpers::RowList& rowlist = route_list.rows(); - - route_list.freeze (); - - for (i = rowlist.begin(); i != rowlist.end(); ++i) { - TimeAxisView *tv = (TimeAxisView *) i->get_data (); + TreeModel::Children rows = route_display_model->children(); + TreeModel::Children::iterator i; + // GTK2FIX + // track_display_list.freeze (); + + for (i = rows.begin(); i != rows.end(); ++i) { + + TreeModel::Row row = (*i); + TimeAxisView *tv = row[route_display_columns.tv]; + if (with_select) { - i->unselect (); + route_list.get_selection()->unselect (i); } else { - tv->set_marked_for_display (false); + tv->set_marked_for_display (false); tv->hide(); + } } - - route_list.thaw (); - + //route_list.thaw (); reset_scrolling_region (); } void -Editor::route_list_column_click (gint col) +Editor::route_list_column_click () { if (route_list_menu == 0) { build_route_list_menu (); @@ -288,7 +294,9 @@ Editor::route_list_column_click (gint col) void Editor::build_route_list_menu () { - using namespace Gtk::Menu_Helpers; + using namespace Menu_Helpers; + using namespace Gtk; + route_list_menu = new Menu; @@ -314,107 +322,100 @@ void Editor::select_all_routes () { - CList_Helpers::RowList::iterator i; + TreeModel::Children rows = route_display_model->children(); + TreeModel::Children::iterator i; - for (i = route_list.rows().begin(); i != route_list.rows().end(); ++i) { - i->select (); + for (i = rows.begin(); i != rows.end(); ++i) { + route_list.get_selection()->select (i); } } void Editor::select_all_audiotracks () { - Gtk::CList_Helpers::RowList::iterator i; - Gtk::CList_Helpers::RowList& rowlist = route_list.rows(); - - route_list.freeze (); - - for (i = rowlist.begin(); i != rowlist.end(); ++i) { - TimeAxisView *tv = (TimeAxisView *) i->get_data (); + TreeModel::Children rows = route_display_model->children(); + TreeModel::Children::iterator i; + + for (i = rows.begin(); i != rows.end(); ++i) { + TreeModel::Row row = (*i); + TimeAxisView* tv = row[route_display_columns.tv]; AudioTimeAxisView* atv; if ((atv = dynamic_cast<AudioTimeAxisView*>(tv)) != 0) { if (atv->is_audio_track()) { - i->select (); + route_list.get_selection()->select (i); + } } } - - route_list.thaw (); } -void +void Editor::unselect_all_audiotracks () { - Gtk::CList_Helpers::RowList::iterator i; - Gtk::CList_Helpers::RowList& rowlist = route_list.rows(); - - route_list.freeze (); + TreeModel::Children rows = route_display_model->children(); + TreeModel::Children::iterator i; - for (i = rowlist.begin(); i != rowlist.end(); ++i) { - TimeAxisView *tv = (TimeAxisView *) i->get_data (); + for (i = rows.begin(); i != rows.end(); ++i) { + TreeModel::Row row = (*i); + TimeAxisView *tv = row[route_display_columns.tv]; AudioTimeAxisView* atv; if ((atv = dynamic_cast<AudioTimeAxisView*>(tv)) != 0) { if (atv->is_audio_track()) { - i->unselect (); + route_list.get_selection()->unselect (i); + } } } - - route_list.thaw (); } void Editor::select_all_audiobus () { - Gtk::CList_Helpers::RowList::iterator i; - Gtk::CList_Helpers::RowList& rowlist = route_list.rows(); - - route_list.freeze (); + TreeModel::Children rows = route_display_model->children(); + TreeModel::Children::iterator i; - for (i = rowlist.begin(); i != rowlist.end(); ++i) { - TimeAxisView *tv = (TimeAxisView *) i->get_data (); + for (i = rows.begin(); i != rows.end(); ++i) { + TreeModel::Row row = (*i); + TimeAxisView* tv = row[route_display_columns.tv]; AudioTimeAxisView* atv; if ((atv = dynamic_cast<AudioTimeAxisView*>(tv)) != 0) { if (!atv->is_audio_track()) { - i->select (); + route_list.get_selection()->select (i); + } } } - route_list.thaw (); - } void Editor::unselect_all_audiobus () { - Gtk::CList_Helpers::RowList::iterator i; - Gtk::CList_Helpers::RowList& rowlist = route_list.rows(); - - route_list.freeze (); + TreeModel::Children rows = route_display_model->children(); + TreeModel::Children::iterator i; - for (i = rowlist.begin(); i != rowlist.end(); ++i) { - TimeAxisView *tv = (TimeAxisView *) i->get_data (); + for (i = rows.begin(); i != rows.end(); ++i) { + TreeModel::Row row = (*i); + TimeAxisView* tv = row[route_display_columns.tv]; AudioTimeAxisView* atv; if ((atv = dynamic_cast<AudioTimeAxisView*>(tv)) != 0) { if (!atv->is_audio_track()) { - i->unselect (); + route_list.get_selection()->unselect (i); + } } } - route_list.thaw (); - } gint -route_list_compare_func (GtkCList* clist, gconstpointer a, gconstpointer b) +Editor::route_list_compare_func (TreeModel::iterator a, TreeModel::iterator b) { TimeAxisView *tv1; TimeAxisView *tv2; @@ -423,11 +424,8 @@ route_list_compare_func (GtkCList* clist, gconstpointer a, gconstpointer b) Route* ra; Route* rb; - GtkCListRow *row1 = (GtkCListRow *) a; - GtkCListRow *row2 = (GtkCListRow *) b; - - tv1 = static_cast<TimeAxisView*> (row1->data); - tv2 = static_cast<TimeAxisView*> (row2->data); + tv1 = (*a)[route_display_columns.tv]; + tv2 = (*b)[route_display_columns.tv]; if ((atv1 = dynamic_cast<AudioTimeAxisView*>(tv1)) == 0 || (atv2 = dynamic_cast<AudioTimeAxisView*>(tv2)) == 0) { diff --git a/gtk2_ardour/editor_selection_list.cc b/gtk2_ardour/editor_selection_list.cc index d6681cf5a5..51789880f0 100644 --- a/gtk2_ardour/editor_selection_list.cc +++ b/gtk2_ardour/editor_selection_list.cc @@ -52,60 +52,53 @@ Editor::handle_new_named_selection () void Editor::add_named_selection_to_named_selection_display (NamedSelection& selection) { - const gchar *row[1]; - - row[0] = selection.name.c_str(); - named_selection_display.rows().push_back (row); - named_selection_display.rows().back().set_data (&selection); + TreeModel::Row row = *(named_selection_model->append()); + row[named_selection_columns.text] = selection.name; + row[named_selection_columns.selection] = &selection; } void Editor::redisplay_named_selections () { - named_selection_display.freeze (); - named_selection_display.clear (); + //GTK2FIX + //named_selection_display.freeze (); + named_selection_model.clear (); session->foreach_named_selection (*this, &Editor::add_named_selection_to_named_selection_display); - named_selection_display.thaw (); + //named_selection_display.thaw (); } gint Editor::named_selection_display_button_press (GdkEventButton *ev) { - NamedSelection* named_selection; - gint row; - gint col; - - switch (ev->button) { - case 1: - if (Keyboard::is_delete_event (ev)) { - if (named_selection_display.get_selection_info ((int)ev->x, (int)ev->y, &row, &col) != 0) { - if ((named_selection = reinterpret_cast<NamedSelection *> (named_selection_display.get_row_data (row))) != 0) { - session->remove_named_selection (named_selection); + + TreeModel::Children rows = named_selection_model->children(); + TreeModel::Children::iterator i; + Glib::RefPtr<TreeSelection> selection = named_selection_display.get_selection(); + + for (i = rows.begin(); i != rows.end(); ++i) { + if (selection->is_selected (i)) { + switch (ev->button) { + case 1: + if (Keyboard::is_delete_event (ev)) { + session->remove_named_selection ((*i)[named_selection_columns.selection]); return stop_signal (named_selection_display, "button_press_event"); } + break; + case 2: + break; + case 3: + break; + default: + break; } - } - break; - - case 2: - break; - - case 3: - break; - default: - break; + } } return FALSE; } void -Editor::named_selection_display_selected (gint row, gint col, GdkEvent *ev) -{ -} - -void -Editor::named_selection_display_unselected (gint row, gint col, GdkEvent *ev) +Editor::named_selection_display_selection_changed () { } @@ -115,20 +108,19 @@ Editor::name_selection () ArdourPrompter p; p.set_prompt (_("name for chunk:")); - p.done.connect (mem_fun(*this, &Editor::named_selection_name_chosen)); p.change_labels (_("Create chunk"), _("Forget it")); p.show_all (); - Gtk::Main::run (); - - if (p.status == Prompter::entered) { - string name; + switch (p.run ()) { + case GTK_RESPONSE_ACCEPT: + string name; p.get_result (name); - - if (name.length()){ - create_named_selection (name); - } + if (name.length()) { + create_named_selection (name); + } + break; } + } void @@ -175,11 +167,15 @@ Editor::create_named_selection (string name) } NamedSelection* ns; + TreeModel::Row row = *(named_selection_model->append()); ns = new NamedSelection (name, thelist); + row[named_selection_columns.selection] = ns; + row[named_selection_columns.text] = name; /* make the one we just added be selected */ - named_selection_display.rows().back().select (); + named_selection_display.get_selection()->select (row); + } |