X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fmixer_ui.cc;h=221f45ec2a93621d6b05cd2afdb4a82e1565f9c8;hb=4c7b9537a3386942ff34bbd7a025e5e70fbbc10b;hp=9a0ea6068a8d42f3bad452913388015d33305636;hpb=4b233612261e2d13ebbd1931f4d999c6da1451e9;p=ardour.git diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index 9a0ea6068a..221f45ec2a 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -36,7 +36,6 @@ #include "mixer_strip.h" #include "plugin_selector.h" #include "ardour_ui.h" -#include "check_mark.h" #include "prompter.h" #include "utils.h" #include "gui_thread.h" @@ -48,116 +47,80 @@ using namespace Gtk; using namespace Gtkmm2ext; using namespace sigc; -static const gchar* track_display_titles[] = { - N_("Strips"), - 0 -}; -static const gchar* snapshot_display_titles[] = { - N_("Snapshots"), - 0 -}; - -static const gchar* group_list_titles[] = { - N_("***"), - N_("Bar"), - 0 -}; - -GdkPixmap* Mixer_UI::check_pixmap = 0; -GdkBitmap* Mixer_UI::check_mask = 0; -GdkPixmap* Mixer_UI::empty_pixmap = 0; -GdkBitmap* Mixer_UI::empty_mask = 0; - - Mixer_UI::Mixer_UI (AudioEngine& eng) - : Gtk::Window (GTK_WINDOW_TOPLEVEL), - KeyboardTarget (*this, "mixer"), - engine (eng), - track_display_list (internationalize (track_display_titles)), - group_list (internationalize (group_list_titles)), - snapshot_display (internationalize (snapshot_display_titles)) - + : Window (Gtk::WINDOW_TOPLEVEL), + engine (eng) { _strip_width = Wide; track_menu = 0; - check_pixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, - gtk_widget_get_colormap (GTK_WIDGET(group_list.gobj())), - &check_mask, NULL, (gchar **) check_xpm); - empty_pixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, - gtk_widget_get_colormap (GTK_WIDGET(group_list.gobj())), - &empty_mask, NULL, (gchar **) empty_xpm); - XMLNode* node = ARDOUR_UI::instance()->mixer_settings(); set_state (*node); - scroller_base.signal_add_event()s (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); + scroller_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); scroller_base.set_name ("MixerWindow"); scroller_base.signal_button_release_event().connect (mem_fun(*this, &Mixer_UI::strip_scroller_button_release)); // add as last item of strip packer strip_packer.pack_end (scroller_base, true, true); - scroller.add_with_viewport (strip_packer); + scroller.add (strip_packer); scroller.set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); - track_display_list.column_titles_active(); - track_display_list.set_name ("MixerTrackDisplayList"); - track_display_list.set_shadow_type (Gtk::SHADOW_IN); - track_display_list.set_selection_mode (GTK_SELECTION_MULTIPLE); - track_display_list.set_reorderable (true); - track_display_list.set_size_request (75, -1); - track_display_scroller.add (track_display_list); + track_display_model = ListStore::create (track_display_columns); + track_display.set_model (track_display_model); + track_display.append_column (_("Strips"), track_display_columns.text); + track_display.set_name (X_("MixerTrackDisplayList")); + track_display.get_selection()->set_mode (Gtk::SELECTION_MULTIPLE); + track_display.set_reorderable (true); + track_display.set_size_request (75, -1); + track_display.set_headers_visible (true); + track_display.set_headers_clickable (true); + track_display_scroller.add (track_display); track_display_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); - snapshot_display.column_titles_active(); + group_display_model = ListStore::create (group_display_columns); + group_display.set_model (group_display_model); + group_display.append_column (_("active"), group_display_columns.active); + group_display.append_column (_("groupname"), group_display_columns.text); + group_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0)); + group_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1)); + + /* use checkbox for the active column */ + + CellRendererToggle *active_cell = dynamic_cast(group_display.get_column_cell_renderer (0)); + active_cell->property_activatable() = true; + active_cell->property_radio() = false; + + group_display.set_name ("MixerGroupList"); + group_display.set_reorderable (true); + group_display.set_size_request (true); + group_display_scroller.add (group_display); + group_display_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); + + snapshot_display_model = ListStore::create (group_display_columns); + snapshot_display.set_model (snapshot_display_model); + snapshot_display.append_column (X_("mixgroups"), snapshot_display_columns.visible_name); snapshot_display.set_name ("MixerSnapshotDisplayList"); - snapshot_display.set_shadow_type (Gtk::SHADOW_IN); - snapshot_display.set_selection_mode (GTK_SELECTION_SINGLE); - snapshot_display.set_reorderable (true); snapshot_display.set_size_request (75, -1); + snapshot_display.set_reorderable (true); snapshot_display_scroller.add (snapshot_display); snapshot_display_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); - group_list_button_label.set_text (_("Mix Groups")); - group_list_button_label.set_name ("MixerGroupTitleButton"); - group_list_button.add (group_list_button_label); - group_list_button.set_name ("MixerGroupTitleButton"); - - group_list.column_titles_hide(); - group_list.set_name ("MixerGroupList"); - group_list.set_shadow_type (Gtk::SHADOW_IN); - group_list.set_selection_mode (GTK_SELECTION_MULTIPLE); - group_list.set_reorderable (false); - group_list.set_size_request (75, -1); - group_list.set_column_auto_resize (0, true); - group_list_scroller.add (group_list); - group_list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); - - group_list_vbox.pack_start (group_list_button, false, false); - group_list_vbox.pack_start (group_list_scroller, true, true); - - list stupid_list; - - stupid_list.push_back (""); - stupid_list.push_back (_("-all-")); - - group_list.rows().push_back (stupid_list); - group_list.rows().back().set_data (0); - group_list.rows().back().select(); - group_list.cell(0,0).set_pixmap (check_pixmap); + group_display_vbox.pack_start (group_display_button, false, false); + group_display_vbox.pack_start (group_display_scroller, true, true); track_display_frame.set_name("BaseFrame"); track_display_frame.set_shadow_type (Gtk::SHADOW_IN); track_display_frame.add(track_display_scroller); - group_list_frame.set_name ("BaseFrame"); - group_list_frame.set_shadow_type (Gtk::SHADOW_IN); - group_list_frame.add (group_list_vbox); + group_display_frame.set_name ("BaseFrame"); + group_display_frame.set_shadow_type (Gtk::SHADOW_IN); + group_display_frame.add (group_display_vbox); rhs_pane1.add1 (track_display_frame); rhs_pane1.add2 (rhs_pane2); - rhs_pane2.add1 (group_list_frame); + rhs_pane2.add1 (group_display_frame); rhs_pane2.add2 (snapshot_display_scroller); list_vpacker.pack_start (rhs_pane1, true, true); @@ -168,13 +131,13 @@ Mixer_UI::Mixer_UI (AudioEngine& eng) list_hpane.add1(list_vpacker); list_hpane.add2(global_hpacker); - rhs_pane1.size_allocate.connect_after (bind (mem_fun(*this, &Mixer_UI::pane_allocation_handler), - static_cast (&rhs_pane1))); - rhs_pane2.size_allocate.connect_after (bind (mem_fun(*this, &Mixer_UI::pane_allocation_handler), - static_cast (&rhs_pane2))); - list_hpane.size_allocate.connect_after (bind (mem_fun(*this, &Mixer_UI::pane_allocation_handler), - static_cast (&list_hpane))); - + rhs_pane1.signal_size_allocate().connect (bind (mem_fun(*this, &Mixer_UI::pane_allocation_handler), + static_cast (&rhs_pane1))); + rhs_pane2.signal_size_allocate().connect (bind (mem_fun(*this, &Mixer_UI::pane_allocation_handler), + static_cast (&rhs_pane2))); + list_hpane.signal_size_allocate().connect (bind (mem_fun(*this, &Mixer_UI::pane_allocation_handler), + static_cast (&list_hpane))); + rhs_pane1.set_data ("collapse-direction", (gpointer) 0); rhs_pane2.set_data ("collapse-direction", (gpointer) 0); @@ -191,27 +154,21 @@ Mixer_UI::Mixer_UI (AudioEngine& eng) set_title (_("ardour: mixer")); set_wmclass (_("ardour_mixer"), "Ardour"); - delete_event.connect (bind (ptr_fun (just_hide_it), - static_cast(this))); + signal_delete_event().connect (bind (ptr_fun (just_hide_it), static_cast(this))); add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK); - snapshot_display.select_row.connect (mem_fun(*this, &Mixer_UI::snapshot_display_selected)); + track_display.get_selection()->signal_changed().connect (mem_fun(*this, &Mixer_UI::track_display_selection_changed)); + track_display_model->signal_rows_reordered().connect (mem_fun (*this, &Mixer_UI::track_display_reordered_proxy)); - track_display_list.select_row.connect (mem_fun(*this, &Mixer_UI::track_display_selected)); - track_display_list.unselect_row.connect (mem_fun(*this, &Mixer_UI::track_display_unselected)); - track_display_list.row_move.connect (mem_fun(*this, &Mixer_UI::queue_track_display_reordered)); - track_display_list.click_column.connect (mem_fun(*this, &Mixer_UI::track_column_click)); + group_display.signal_button_press_event().connect (mem_fun (*this, &Mixer_UI::group_display_button_press)); + group_display.get_selection()->signal_changed().connect (mem_fun (*this, &Mixer_UI::group_display_selection_changed)); - group_list_button.signal_clicked().connect (mem_fun(*this, &Mixer_UI::group_list_button_clicked)); - group_list.signal_button_press_event().connect (mem_fun(*this, &Mixer_UI::group_list_button_press_event)); - group_list.select_row.connect (mem_fun(*this, &Mixer_UI::group_selected)); - group_list.unselect_row.connect (mem_fun(*this, &Mixer_UI::group_unselected)); + snapshot_display.get_selection()->signal_changed().connect (mem_fun(*this, &Mixer_UI::snapshot_display_selection_changed)); + snapshot_display.signal_button_press_event().connect (mem_fun (*this, &Mixer_UI::snapshot_display_button_press)); _plugin_selector = new PluginSelector (PluginManager::the_manager()); - _plugin_selector->signal_delete_event().connect (bind (ptr_fun (just_hide_it), - static_cast (_plugin_selector))); - configure_event.connect (mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler)); + signal_configure_event().connect (mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler)); _selection.RoutesChanged.connect (mem_fun(*this, &Mixer_UI::follow_strip_selection)); } @@ -233,10 +190,12 @@ Mixer_UI::show_window () /* now reset each strips width so the right widgets are shown */ MixerStrip* ms; - CList_Helpers::RowList::iterator i; - for (i = track_display_list.rows().begin(); i != track_display_list.rows().end(); ++i) { - ms = (MixerStrip *) i->get_data (); + TreeModel::Children rows = track_display_model->children(); + TreeModel::Children::iterator ri; + + for (ri = rows.begin(); ri != rows.end(); ++ri) { + ms = (*ri)[track_display_columns.strip]; ms->set_width (ms->get_width()); } } @@ -258,16 +217,13 @@ Mixer_UI::add_strip (Route* route) strip->set_width (_strip_width); show_strip (strip); - const gchar* rowdata[1]; - rowdata[0] = route->name().c_str(); - - track_display_list.freeze (); - track_display_list.rows().push_back (rowdata); - track_display_list.rows().back().set_data (strip); - track_display_list.thaw (); + TreeModel::Row row = *(track_display_model->append()); + row[track_display_columns.text] = route->name(); + row[track_display_columns.route] = route; + row[track_display_columns.strip] = strip; if (strip->marked_for_display() || strip->packed()) { - track_display_list.rows().back().select (); + track_display.get_selection()->select (row); } route->name_changed.connect (bind (mem_fun(*this, &Mixer_UI::strip_name_changed), strip)); @@ -285,16 +241,17 @@ Mixer_UI::remove_strip (MixerStrip* strip) { ENSURE_GUI_THREAD(bind (mem_fun(*this, &Mixer_UI::remove_strip), strip)); - CList_Helpers::RowList::iterator ri; + TreeModel::Children rows = track_display_model->children(); + TreeModel::Children::iterator ri; list::iterator i; if ((i = find (strips.begin(), strips.end(), strip)) != strips.end()) { strips.erase (i); } - for (ri = track_display_list.rows().begin(); ri != track_display_list.rows().end(); ++ri) { - if ((MixerStrip *) ri->get_data () == strip) { - track_display_list.rows().erase (ri); + for (ri = rows.begin(); ri != rows.end(); ++ri) { + if ((*ri)[track_display_columns.strip] == strip) { + track_display_model->erase (ri); break; } } @@ -318,8 +275,6 @@ Mixer_UI::strip_button_release_event (GdkEventButton *ev, MixerStrip *strip) at the same time. */ - ARDOUR_UI::instance()->allow_focus (false); - if (_selection.selected (&strip->route())) { _selection.remove (&strip->route()); } else { @@ -343,12 +298,14 @@ Mixer_UI::connect_to_session (Session* sess) wintitle += session->name(); set_title (wintitle); - track_display_list.freeze (); - track_display_list.clear (); + // GTK2FIX + // track_display_list.freeze (); + + track_display_model->clear (); session->foreach_route (this, &Mixer_UI::add_strip); - track_display_list.thaw (); + // track_display_list.thaw (); session->going_away.connect (mem_fun(*this, &Mixer_UI::disconnect_from_session)); session->RouteAdded.connect (mem_fun(*this, &Mixer_UI::add_strip)); @@ -369,7 +326,7 @@ Mixer_UI::disconnect_from_session () { ENSURE_GUI_THREAD(mem_fun(*this, &Mixer_UI::disconnect_from_session)); - group_list.clear (); + group_display_model->clear (); set_title (_("ardour: mixer")); stop_updating (); hide_all_strips (false); @@ -378,22 +335,25 @@ Mixer_UI::disconnect_from_session () void Mixer_UI::hide_all_strips (bool with_select) { - MixerStrip* ms; - CList_Helpers::RowList::iterator i; + TreeModel::Children rows = track_display_model->children(); + TreeModel::Children::iterator i; - track_display_list.freeze (); + // GTK2FIX + // track_display_list.freeze (); - for (i = track_display_list.rows().begin(); i != track_display_list.rows().end(); ++i) { - ms = (MixerStrip *) i->get_data (); - + for (i = rows.begin(); i != rows.end(); ++i) { + + TreeModel::Row row = (*i); + MixerStrip* ms = row[track_display_columns.strip]; + if (with_select) { - i->unselect (); + track_display.get_selection()->unselect (i); } else { hide_strip (ms); } } - track_display_list.thaw (); + // track_display_list.thaw (); } void @@ -405,87 +365,60 @@ Mixer_UI::unselect_all_strips () void Mixer_UI::select_all_strips () { - CList_Helpers::RowList::iterator i; + TreeModel::Children rows = track_display_model->children(); + TreeModel::Children::iterator i; - for (i = track_display_list.rows().begin(); i != track_display_list.rows().end(); ++i) { - i->select (); + for (i = rows.begin(); i != rows.end(); ++i) { + track_display.get_selection()->select (i); } } void -Mixer_UI::select_all_audiotrack_strips () +Mixer_UI::strip_select_op (bool audiotrack, bool select) { MixerStrip* ms; - CList_Helpers::RowList::iterator i; + TreeModel::Children rows = track_display_model->children(); + TreeModel::Children::iterator i; - track_display_list.freeze (); + // GTK2FIX + // track_display_list.freeze (); - for (i = track_display_list.rows().begin(); i != track_display_list.rows().end(); ++i) { - ms = (MixerStrip *) i->get_data (); + for (i = rows.begin(); i != rows.end(); ++i) { + ms = (*i)[track_display_columns.strip]; - if (ms->is_audio_track()) { - i->select (); + if (ms->is_audio_track() == audiotrack) { + if (select) { + track_display.get_selection()->select (i); + } else { + track_display.get_selection()->unselect (i); + } } } - track_display_list.thaw (); + // track_display_list.thaw (); } +void +Mixer_UI::select_all_audiotrack_strips () +{ + strip_select_op (true, true); +} void Mixer_UI::unselect_all_audiotrack_strips () { - MixerStrip* ms; - CList_Helpers::RowList::iterator i; - - track_display_list.freeze (); - - for (i = track_display_list.rows().begin(); i != track_display_list.rows().end(); ++i) { - ms = (MixerStrip *) i->get_data (); - - if (ms->is_audio_track()) { - i->unselect (); - } - } - - track_display_list.thaw (); + strip_select_op (true, false); } void Mixer_UI::select_all_audiobus_strips () { - MixerStrip* ms; - CList_Helpers::RowList::iterator i; - - track_display_list.freeze (); - - for (i = track_display_list.rows().begin(); i != track_display_list.rows().end(); ++i) { - ms = (MixerStrip *) i->get_data (); - - if (!ms->is_audio_track()) { - i->select (); - } - } - - track_display_list.thaw (); + strip_select_op (false, true); } void Mixer_UI::unselect_all_audiobus_strips () { - MixerStrip* ms; - CList_Helpers::RowList::iterator i; - - track_display_list.freeze (); - - for (i = track_display_list.rows().begin(); i != track_display_list.rows().end(); ++i) { - ms = (MixerStrip *) i->get_data (); - - if (!ms->is_audio_track()) { - i->unselect (); - } - } - - track_display_list.thaw (); + strip_select_op (false, false); } void @@ -554,96 +487,97 @@ Mixer_UI::fast_update_strips () } void -Mixer_UI::snapshot_display_selected (gint row, gint col, GdkEvent* ev) +Mixer_UI::snapshot_display_selection_changed () { - string* snap_name; + TreeModel::iterator i = snapshot_display.get_selection()->get_selected(); + + Glib::ustring snap_name = (*i)[snapshot_display_columns.real_name]; - if ((snap_name = (string*) snapshot_display.get_row_data(row)) != 0){ - if (session->snap_name() == *snap_name){ - return; - } - string path = session->path(); - ARDOUR_UI::instance()->load_session(path, *snap_name); + if (session->snap_name() == snap_name) { + return; } + + ARDOUR_UI::instance()->load_session(session->path(), string (snap_name)); +} + +bool +Mixer_UI::snapshot_display_button_press (GdkEventButton* ev) +{ + return false; } void -Mixer_UI::track_display_selected (gint row, gint col, GdkEvent* ev) +Mixer_UI::track_display_selection_changed () { MixerStrip* strip; - - if ((strip = (MixerStrip *) track_display_list.get_row_data (row)) != 0) { - strip->set_marked_for_display (true); - show_strip (strip); - - /* just redraw the whole thing so that we get the right order - when we reinsert the strip. - */ - - track_display_reordered (); + TreeModel::Children rows = track_display_model->children(); + TreeModel::Children::iterator i; + Glib::RefPtr selection = track_display.get_selection(); + + for (i = rows.begin(); i != rows.end(); ++i) { + if (selection->is_selected (i)) { + strip->set_marked_for_display (true); + show_strip (strip); + } else { + strip->set_marked_for_display (false); + hide_strip (strip); + } } + + track_display_reordered (); } void -Mixer_UI::track_display_unselected (gint row, gint col, GdkEvent* ev) +Mixer_UI::select_strip_op (MixerStrip *strip, bool yn) { - MixerStrip* strip; - - if ((strip = (MixerStrip *) track_display_list.get_row_data (row)) != 0) { - strip->set_marked_for_display (false); - hide_strip (strip); + TreeModel::Children rows = track_display_model->children(); + TreeModel::Children::iterator i; + Glib::RefPtr selection = track_display.get_selection(); + + for (i = rows.begin(); i != rows.end(); ++i) { + if ((*i)[track_display_columns.strip] == strip) { + if (yn) { + selection->select (*i); + } else { + selection->unselect (*i); + } + break; + } } } void Mixer_UI::unselect_strip_in_display (MixerStrip *strip) { - CList_Helpers::RowIterator i; - - if ((i = track_display_list.rows().find_data (strip)) != track_display_list.rows().end()) { - (*i).unselect (); - } + select_strip_op (strip, true); } - void Mixer_UI::select_strip_in_display (MixerStrip *strip) { - CList_Helpers::RowIterator i; - - if ((i = track_display_list.rows().find_data (strip)) != track_display_list.rows().end()) { - (*i).select (); - } + select_strip_op (strip, false); } void -Mixer_UI::queue_track_display_reordered (gint arg1, gint arg2) +Mixer_UI::track_display_reordered_proxy (const TreeModel::Path& path, const TreeModel::iterator& i, int* n) { - /* the problem here is that we are called *before* the - list has been reordered. so just queue up - the actual re-drawer to happen once the re-ordering - is complete. - */ - - Main::idle.connect (mem_fun(*this, &Mixer_UI::track_display_reordered)); + track_display_reordered (); } -int +void Mixer_UI::track_display_reordered () { - CList_Helpers::RowList::iterator i; + TreeModel::Children rows = track_display_model->children(); + TreeModel::Children::iterator i; long order; + + for (order = 0, i = rows.begin(); i != rows.end(); ++i, ++order) { + MixerStrip* strip = (*i)[track_display_columns.strip]; - // hide_all_strips (false); - - for (order = 0, i = track_display_list.rows().begin(); i != track_display_list.rows().end(); ++i, ++order) { - MixerStrip* strip = (MixerStrip *) (*i)->get_data (); if (strip->marked_for_display()) { strip->route().set_order_key (N_("signal"), order); strip_packer.reorder_child (*strip, -1); /* put at end */ } } - - return FALSE; } void @@ -681,14 +615,17 @@ Mixer_UI::strip_name_changed (void* src, MixerStrip* mx) { ENSURE_GUI_THREAD(bind (mem_fun(*this, &Mixer_UI::strip_name_changed), src, mx)); - CList_Helpers::RowList::iterator i; - - if ((i = track_display_list.rows().find_data (mx)) == track_display_list.rows().end()) { - error << _("track display list item for renamed strip not found!") << endmsg; - return; - } + TreeModel::Children rows = track_display_model->children(); + TreeModel::Children::iterator i; + + for (i = rows.begin(); i != rows.end(); ++i) { + if ((*i)[track_display_columns.strip] == mx) { + (*i)[track_display_columns.text] = mx->route().name(); + return; + } + } - track_display_list.cell ((*i)->get_row_num(), 0).set_text (mx->route().name()); + error << _("track display list item for renamed strip not found!") << endmsg; } void @@ -698,99 +635,89 @@ Mixer_UI::new_mix_group () string result; prompter.set_prompt (_("Name for new mix group")); - prompter.done.connect (Main::quit.slot()); - prompter.show_all (); - Main::run (); - - if (prompter.status != Gtkmm2ext::Prompter::entered) { - return; - } - - prompter.get_result (result); - - if (result.length()) { - session->add_mix_group (result); + switch (prompter.run ()) { + case GTK_RESPONSE_ACCEPT: + prompter.get_result (result); + if (result.length()) { + session->add_mix_group (result); + } + break; } } -void -Mixer_UI::group_list_button_clicked () -{ - if (session) { - new_mix_group (); - } -} +// GTK2FIX +//void +//Mixer_UI::group_display_button_clicked () +//{ +// if (session) { +// new_mix_group (); +// } +//} -gint -Mixer_UI::group_list_button_press_event (GdkEventButton* ev) +bool +Mixer_UI::group_display_button_press (GdkEventButton* ev) { - gint row, col; RouteGroup* group; - if (group_list.get_selection_info ((int)ev->x, (int)ev->y, &row, &col) == 0) { - return FALSE; + TreeIter iter; + TreeModel::Path path; + TreeViewColumn* column; + int cellx; + int celly; + + if (!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 0: + /* active column click */ + + if ((iter = group_display_model->get_iter (path))) { + /* path points to a valid node */ + if ((group = (*iter)[group_display_columns.group]) != 0) { + group->set_active (!group->is_active (), this); + } + } + break; - switch (col) { case 1: if (Keyboard::is_edit_event (ev)) { - // RouteGroup* group = (RouteGroup *) group_list.row(row).get_data (); - + // RouteGroup* group = (RouteGroup *) group_display.row(row).get_data (); // edit_mix_group (group); - return stop_signal (group_list, "button_press_event"); - } else { /* allow regular select to occur */ - return FALSE; - } - - case 0: - stop_signal (group_list, "button_press_event"); - if ((group = (RouteGroup *) group_list.row(row).get_data ()) != 0) { - group->set_active (!group->is_active (), this); + return false; } break; } - return TRUE; + return true; } void -Mixer_UI::group_selected (gint row, gint col, GdkEvent* ev) +Mixer_UI::group_display_selection_changed () { - RouteGroup* group = (RouteGroup *) group_list.row(row).get_data (); - - if (group) { - group->set_hidden (false, this); - } else { - /* the master group */ + TreeModel::iterator i; + TreeModel::Children rows = group_display_model->children(); + Glib::RefPtr selection = group_display.get_selection(); - for (list::iterator i = strips.begin(); i != strips.end(); ++i) { - show_strip (*i); - } + for (i = rows.begin(); i != rows.end(); ++i) { + RouteGroup* group; - track_display_reordered (); - } -} + group = (*i)[group_display_columns.group]; -void -Mixer_UI::group_unselected (gint row, gint col, GdkEvent* ev) - -{ - RouteGroup* group = (RouteGroup *) group_list.row(row).get_data (); - - if (group) { - group->set_hidden (true, this); - } else { - /* the master group */ - - for (list::iterator i = strips.begin(); i != strips.end(); ++i) { - hide_strip (*i); + if (selection->is_selected (i)) { + group->set_hidden (true, this); + } else { + group->set_hidden (true, this); } } + + track_display_reordered (); } void @@ -802,24 +729,33 @@ Mixer_UI::group_flags_changed (void* src, RouteGroup* group) // select row } - CList_Helpers::RowIterator ri = group_list.rows().find_data (group); + TreeModel::Children rows = group_display_model->children(); + TreeModel::Children::iterator gi; + TreeModel::Children::iterator ti; + + for (gi = rows.begin(); gi != rows.end(); ++gi) { + if ((*gi)[group_display_columns.group] == group) { + break; + } + } + + if (gi == rows.end()) { + return; + } + + rows = track_display_model->children(); for (list::iterator i = strips.begin(); i != strips.end(); ++i) { if ((*i)->route().mix_group() == group) { if (group->is_hidden ()) { unselect_strip_in_display(*i); + group_display.get_selection()->unselect (*gi); } else { select_strip_in_display(*i); - (*ri)->select(); + group_display.get_selection()->select (*gi); } } } - - if (group->is_active()) { - group_list.cell (ri->get_row_num(),0).set_pixmap (check_pixmap, check_mask); - } else { - group_list.cell (ri->get_row_num(),0).set_pixmap (empty_pixmap, empty_mask); - } } void @@ -827,18 +763,11 @@ Mixer_UI::add_mix_group (RouteGroup* group) { ENSURE_GUI_THREAD(bind (mem_fun(*this, &Mixer_UI::add_mix_group), group)); - - list names; - - names.push_back (""); - names.push_back (group->name()); - group_list.rows().push_back (names); - group_list.rows().back().set_data (group); - - /* update display to reflect group flags */ - - group_flags_changed (0, group); + TreeModel::Row row = *(group_display_model->append()); + row[group_display_columns.active] = group->is_active(); + row[group_display_columns.text] = group->name(); + row[group_display_columns.group] = group; group->FlagsChanged.connect (bind (mem_fun(*this, &Mixer_UI::group_flags_changed), group)); } @@ -855,23 +784,16 @@ Mixer_UI::redisplay_snapshots () return; } - snapshot_display.freeze(); - snapshot_display.rows().clear (); - + snapshot_display_model->clear (); + for (vector::iterator i = states->begin(); i != states->end(); ++i) { string statename = *(*i); - const char *rowtext[1]; - - rowtext[0] = statename.c_str(); - - snapshot_display.rows().push_back (rowtext); - snapshot_display.rows().back().set_data (new string (statename), deferred_delete); - - delete *i; + TreeModel::Row row = *(snapshot_display_model->append()); + row[snapshot_display_columns.visible_name] = statename; + row[snapshot_display_columns.real_name] = statename; } delete states; - snapshot_display.thaw(); } void @@ -932,7 +854,8 @@ Mixer_UI::set_state (const XMLNode& node) } set_default_size(width, height); - set_uposition(x, y-yoff); + // GTK2FIX + // set_uposition(x, y-yoff); if ((prop = node.property ("narrow-strips"))) { if (prop->value() == "yes") { @@ -951,12 +874,12 @@ Mixer_UI::get_state (void) XMLNode* node = new XMLNode ("Mixer"); if (is_realized()) { - Gdk_Window win = get_window(); + Glib::RefPtr win = get_window(); int x, y, xoff, yoff, width, height; - win.get_root_origin(x, y); - win.get_position(xoff, yoff); - win.get_size(width, height); + win->get_root_origin(x, y); + win->get_position(xoff, yoff); + win->get_size(width, height); XMLNode* geometry = new XMLNode ("geometry"); char buf[32]; @@ -990,7 +913,7 @@ Mixer_UI::get_state (void) void -Mixer_UI::pane_allocation_handler (GtkAllocation *alloc, Gtk::Paned* which) +Mixer_UI::pane_allocation_handler (Allocation& alloc, Gtk::Paned* which) { int pos; XMLProperty* prop = 0;