editor group list, route list and named selection treeviews

git-svn-id: svn://localhost/trunk/ardour2@68 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Nick Mainsbridge 2005-10-26 18:12:00 +00:00
parent d8efcf6da2
commit a0ee84a673
5 changed files with 343 additions and 274 deletions

View File

@ -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 ();
}
}

View File

@ -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*);

View File

@ -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;
}
break;
} 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);
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;
ENSURE_GUI_THREAD(bind (mem_fun(*this, &Editor::add_edit_group), group));
names.push_back ("*");
names.push_back (group->name());
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);
}
*/
}

View File

@ -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)
Editor::route_display_selection_changed ()
{
TimeAxisView *tv;
if ((tv = (TimeAxisView *) route_list.get_row_data (row)) != 0) {
tv->set_marked_for_display (true);
route_list_reordered ();
}
}
TreeModel::Children rows = route_display_model->children();
TreeModel::Children::iterator i;
Glib::RefPtr<TreeSelection> selection = route_list.get_selection();
void
Editor::route_list_unselected (gint row, gint col, GdkEvent *ev)
{
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);
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();
TreeModel::Children rows = route_display_model->children();
TreeModel::Children::iterator i;
// GTK2FIX
// track_display_list.freeze ();
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) {
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) {

View File

@ -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);
}