route list + edit group list now pretty much functional, plus preparations for ardour2.0-alpha1

git-svn-id: svn://localhost/trunk/ardour2@253 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2006-01-10 04:25:47 +00:00
parent 86f540cb05
commit a9e38032a3
18 changed files with 458 additions and 406 deletions

View file

@ -13,7 +13,7 @@ import SCons.Node.FS
SConsignFile()
EnsureSConsVersion(0, 96)
version = '1.9beta1'
version = '2.0alpha1'
subst_dict = { }

View file

@ -14,81 +14,4 @@
<Option name="mmc-port" value="trident"/>
<Option name="monitor-inputs" value="no"/>
</Config>
<Keys>
<context name="default">
<binding keys="Ctrl-w" action="close-dialog"/>
<binding keys="Ctrl-u" action="start-prefix"/>
<binding keys="Alt-e" action="toggle-editor-window"/>
<binding keys="Alt-m" action="toggle-mixer-window"/>
<binding keys="Alt-r" action="toggle-recorder-window"/>
<binding keys="Alt-l" action="toggle-locations-window"/>
<binding keys="Alt-c" action="toggle-big-clock-window"/>
<binding keys="Alt-o" action="toggle-options-window"/>
<binding keys=" " action="toggle-playback"/>
<binding keys="Ctrl-Shift- " action="toggle-playback-forget-capture"/>
<binding keys="Ctrl-n" action="new-session"/>
<binding keys="Ctrl-t" action="add-audio-track"/>
<binding keys="Ctrl-s" action="save-state"/>
<binding keys="Ctrl-q" action="quit"/>
<binding keys="Left" action="transport-rewind"/>
<binding keys="Right" action="transport-forward"/>
<binding keys="r" action="transport-record"/>
<binding keys="Home" action="transport-goto-start"/>
<binding keys="Ctrl-a" action="transport-goto-start"/>
<binding keys="End" action="transport-goto-end"/>
<binding keys="Ctrl-e" action="transport-goto-end"/>
</context>
<context name="editor">
<binding keys="Tab" action="playhead-to-next-region-start"/>
<binding keys="Ctrl-Tab" action="playhead-to-next-region-end"/>
<binding keys="`" action="playhead-to-previous-region-start"/>
<binding keys="Ctrl-`" action="playhead-to-previous-region-end"/>
<binding keys="[" action="edit-cursor-to-previous-region-start"/>
<binding keys="Ctrl-[" action="edit-cursor-to-previous-region-end"/>
<binding keys="]" action="edit-cursor-to-next-region-start"/>
<binding keys="Ctrl-]" action="edit-cursor-to-next-region-end"/>
<binding keys="'" action="edit-cursor-to-next-region-sync"/>
<binding keys=";" action="edit-cursor-to-previous-region-sync"/>
<binding keys="Left" action="scroll-backward"/>
<binding keys="Right" action="scroll-forward"/>
<binding keys="KP_6" action="jump-forward-to-mark"/>
<binding keys="KP_Right" action="jump-forward-to-mark"/>
<binding keys="KP_4" action="jump-backward-to-mark"/>
<binding keys="KP_Left" action="jump-backward-to-mark"/>
<binding keys="KP_Enter" action="add-location-from-playhead"/>
<binding keys="KP_Add" action="nudge-forward"/>
<binding keys="Ctrl-KP_Add" action="nudge-next-forward"/>
<binding keys="KP_Subtract" action="nudge-backward"/>
<binding keys="Ctrl-KP_Subtract" action="nudge-next-backward"/>
<binding keys="=" action="temporal-zoom-out"/>
<binding keys="-" action="temporal-zoom-in"/>
<binding keys="Page_Up" action="scroll-tracks-up"/>
<binding keys="Page_Down" action="scroll-tracks-down"/>
<binding keys="o" action="set-mouse-mode-object"/>
<binding keys="g" action="set-mouse-mode-range"/>
<binding keys="G" action="set-mouse-mode-gain"/>
<binding keys="t" action="set-mouse-mode-timefx"/>
<binding keys="f" action="toggle-follow-playhead"/>
<binding keys="z" action="set-mouse-mode-zoom"/>
<binding keys="Z" action="zoom-focus-playhead"/>
<binding keys="Ctrl-z" action="set-undo"/>
<binding keys="Ctrl-r" action="set-redo"/>
<binding keys="Ctrl-x" action="editor-cut"/>
<binding keys="Ctrl-c" action="editor-copy"/>
<binding keys="Ctrl-v" action="editor-paste"/>
<binding keys="Insert" action="insert-region"/>
<binding keys="Delete" action="editor-cut"/>
<binding keys="Meta-d" action="duplicate-region"/>
<binding keys="Alt-r" action="reverse-region"/>
<binding keys="Alt-n" action="normalize-region"/>
<binding keys="Ctrl-l" action="center-playhead"/>
<binding keys="Ctrl-g" action="goto"/>
<binding keys="Ctrl-f" action="scroll-forward"/>
<binding keys="Ctrl-b" action="scroll-backward"/>
<binding keys="Alt-f" action="playhead-forward"/>
<binding keys="Alt-b" action="playhead-backward"/>
<binding keys="Return" action="playhead-to-edit"/>
<binding keys="Alt-Return" action="edit-to-playhead"/>
</context>
</Keys>
</Ardour>

View file

@ -224,7 +224,8 @@ if env['NLS']:
env.Alias('install', env.InstallAs(os.path.join(install_prefix, 'bin')+'/ardour', ardour))
env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour'), 'ardour2_ui.rc'))
env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour'), 'ardour-menus.xml'))
env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour'), 'ardour.menus'))
env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour'), 'ardour.bindings'))
env.Alias('install', env.Install(os.path.join(install_prefix, 'share/ardour'), 'splash.ppm'))
env.Alias('install', env.Install(os.path.join(install_prefix, 'share/ardour/glade'), glade_files))
@ -233,7 +234,9 @@ env.Alias ('tarball', env.Distribute (env['DISTTREE'],
[ 'SConscript',
'i18n.h', 'gettext.h',
'editor_xpms', 'misc_xpms',
'ardour2_ui.rc', 'splash.ppm'
'crossfade_xpms.h', 'meter_xpms.h',
'ardour2_ui.rc', 'splash.ppm',
'ardour.menus', 'ardour.bindings'
] +
gtkardour_files + vst_files + glade_files +
glob.glob('po/*.po') + glob.glob('*.h')))

View file

@ -644,12 +644,11 @@ style "plugin_slider"
style "track_list_display" = "small_bold_text"
{
fg[NORMAL] = { 0.80, 0.80, 0.80 }
fg[ACTIVE] = { 0.80, 0.80, 0.80 }
fg[SELECTED] = { 0.50, 1.0, 1.0 }
bg[NORMAL] = { 0, 0, 0 }
bg[ACTIVE] = { 0, 0, 0 }
bg[SELECTED] = { 0, 0, 0 }
text[NORMAL] = { 0.80, 0.80, 0.80 }
text[ACTIVE] = { 0.3, 0.3, 0.3 }
text[INSENSITIVE] = { 0, 0, 0 }
text[SELECTED] = { 0.8, 0.8, 0.8 }
base[NORMAL] = { 0, 0, 0 }
base[ACTIVE] = { 0, 0, 0 }
base[INSENSITIVE] = { 0, 0, 0 }
@ -1045,6 +1044,7 @@ widget "*PluginUIClickBox*" style "medium_bold_entry"
widget "*PluginSlider" style "plugin_slider"
widget "*TrackListDisplay" style "track_list_display"
widget "*TrackListDisplay.*" style "small_bold_text"
widget "*EditGroupList" style "track_list_display"
widget "*RegionListDisplay" style "small_bold_entry"
widget "*RegionListDisplay.*" style "small_bold_text"
widget "*MixerRedirectSelector" style "small_bold_entry"

View file

@ -1120,7 +1120,7 @@ AudioTimeAxisView::visual_click ()
void
AudioTimeAxisView::hide_click ()
{
editor.unselect_strip_in_display (*this);
editor.hide_track_in_display (*this);
}
Region*

View file

@ -522,65 +522,73 @@ Editor::Editor (AudioEngine& eng)
bottom_hbox.set_border_width (3);
bottom_hbox.set_spacing (3);
route_display_model = ListStore::create(route_display_columns);
route_display_model = TreeStore::create(route_display_columns);
route_list_display.set_model (route_display_model);
route_list_display.append_column (_("Tracks"), route_display_columns.text);
route_list_display.set_headers_visible (false);
route_list_display.append_column (_("Visible"), route_display_columns.visible);
route_list_display.append_column (_("Name"), route_display_columns.text);
route_list_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0));
route_list_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1));
route_list_display.set_headers_visible (true);
route_list_display.set_name ("TrackListDisplay");
route_list_display.get_selection()->set_mode (SELECTION_MULTIPLE);
route_list_display.get_selection()->set_mode (SELECTION_NONE);
route_list_display.set_reorderable (true);
route_list_display.set_size_request (75,-1);
route_display_model->signal_rows_reordered().connect (mem_fun (*this, &Editor::route_list_reordered));
route_display_model->set_sort_func (0, mem_fun (*this, &Editor::route_list_compare_func));
route_display_model->set_sort_column (0, SORT_ASCENDING);
CellRendererToggle* route_list_visible_cell = dynamic_cast<CellRendererToggle*>(route_list_display.get_column_cell_renderer (0));
route_list_visible_cell->property_activatable() = true;
route_list_visible_cell->property_radio() = false;
route_display_model->signal_row_deleted().connect (mem_fun (*this, &Editor::route_list_delete));
route_display_model->signal_row_changed().connect (mem_fun (*this, &Editor::route_list_change));
route_list_display.signal_button_press_event().connect (mem_fun (*this, &Editor::route_list_display_button_press), false);
route_list_scroller.add (route_list_display);
route_list_scroller.set_policy (POLICY_NEVER, POLICY_AUTOMATIC);
route_list_display.get_selection()->signal_changed().connect (mem_fun (*this, &Editor::route_display_selection_changed));
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");
group_model = ListStore::create(group_columns);
edit_group_display.set_model (group_model);
edit_group_display.append_column (_("active"), group_columns.is_active);
edit_group_display.append_column (_("groupname"), group_columns.text);
edit_group_display.append_column (_("Active"), group_columns.is_active);
edit_group_display.append_column (_("Visible"), group_columns.is_visible);
edit_group_display.append_column (_("Name"), group_columns.text);
edit_group_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0));
edit_group_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(1));
edit_group_display.set_headers_visible (false);
edit_group_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1));
edit_group_display.get_column (2)->set_data (X_("colnum"), GUINT_TO_POINTER(2));
edit_group_display.set_headers_visible (true);
/* use checkbox for the active column */
/* use checkbox for the active + visible columns */
CellRendererToggle *active_cell = dynamic_cast<CellRendererToggle*>(edit_group_display.get_column_cell_renderer (0));
CellRendererToggle* active_cell = dynamic_cast<CellRendererToggle*>(edit_group_display.get_column_cell_renderer (0));
active_cell->property_activatable() = true;
active_cell->property_radio() = false;
edit_group_display.set_name ("MixerGroupList");
edit_group_display.columns_autosize ();
edit_group_display.get_selection()->set_mode (SELECTION_MULTIPLE);
active_cell = dynamic_cast<CellRendererToggle*>(edit_group_display.get_column_cell_renderer (1));
active_cell->property_activatable() = true;
active_cell->property_radio() = false;
edit_group_display.set_name ("EditGroupList");
group_model->signal_row_changed().connect (mem_fun (*this, &Editor::edit_group_row_change));
edit_group_display.set_name ("EditGroupList");
edit_group_display.get_selection()->set_mode (SELECTION_NONE);
edit_group_display.set_reorderable (false);
edit_group_display.set_size_request (75, -1);
edit_group_list_scroller.add (edit_group_display);
edit_group_list_scroller.set_policy (POLICY_AUTOMATIC, POLICY_AUTOMATIC);
edit_group_display_scroller.add (edit_group_display);
edit_group_display_scroller.set_policy (POLICY_AUTOMATIC, POLICY_AUTOMATIC);
edit_group_list_button.signal_clicked().connect (mem_fun(*this, &Editor::edit_group_list_button_clicked));
edit_group_display.signal_button_press_event().connect (mem_fun(*this, &Editor::edit_group_list_button_press_event));
edit_group_display.get_selection()->signal_changed().connect (mem_fun(*this, &Editor::edit_group_selection_changed));
edit_group_display.signal_button_press_event().connect (mem_fun(*this, &Editor::edit_group_list_button_press_event), false);
TreeModel::Row row = *(group_model->append());
{
TreeModel::Row row;
row = *(group_model->append());
row[group_columns.is_active] = false;
row[group_columns.is_visible] = true;
row[group_columns.text] = (_("-all-"));
row[group_columns.routegroup] = 0;
edit_group_display.get_selection()->select (row);
edit_group_vbox.pack_start (edit_group_list_button, false, false);
edit_group_vbox.pack_start (edit_group_list_scroller, true, true);
}
region_list_display.set_size_request (100, -1);
region_list_display.set_name ("RegionListDisplay");
@ -600,8 +608,6 @@ Editor::Editor (AudioEngine& eng)
tv_col->add_attribute(renderer->property_text(), region_list_columns.name);
tv_col->add_attribute(renderer->property_foreground_gdk(), region_list_columns.color_);
region_list_display.set_reorderable (true);
region_list_display.get_selection()->set_mode (SELECTION_MULTIPLE);
region_list_display.add_object_drag (region_list_columns.region.index(), "regions");
@ -659,7 +665,7 @@ Editor::Editor (AudioEngine& eng)
the_notebook.append_page (region_list_scroller, _("Regions"));
the_notebook.append_page (route_list_scroller, _("Tracks/Busses"));
the_notebook.append_page (snapshot_display_scroller, _("Snapshots"));
the_notebook.append_page (edit_group_vbox, _("Edit Groups"));
the_notebook.append_page (edit_group_display_scroller, _("Edit Groups"));
the_notebook.append_page (named_selection_scroller, _("Chunks"));
the_notebook.set_show_tabs (true);
the_notebook.set_scrollable (true);
@ -1255,11 +1261,7 @@ Editor::connect_to_session (Session *t)
redisplay_named_selections ();
redisplay_snapshots ();
route_display_model->clear ();
no_route_list_redisplay = true;
session->foreach_route (this, &Editor::handle_new_route);
no_route_list_redisplay = false;
route_list_display.get_selection()->select_all ();
initial_route_list_display ();
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
(static_cast<TimeAxisView*>(*i))->set_samples_per_unit (frames_per_unit);
@ -1293,7 +1295,7 @@ Editor::connect_to_session (Session *t)
TreeModel::Children rows = route_display_model->children();
TreeModel::Children::iterator i;
//route_list_display.freeze ();
no_route_list_redisplay = true;
for (i = rows.begin(); i != rows.end(); ++i) {
TimeAxisView *tv = (*i)[route_display_columns.tv];
@ -1302,12 +1304,12 @@ Editor::connect_to_session (Session *t)
if ((atv = dynamic_cast<AudioTimeAxisView*>(tv)) != 0) {
if (atv->route().master()) {
route_list_display.get_selection()->unselect (i);
//(*i)->unselect ();
}
}
}
//route_list_display.thaw ();
no_route_list_redisplay = false;
redisplay_route_list ();
}
}

View file

@ -259,8 +259,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 hide_track_in_display (TimeAxisView& tv);
void show_track_in_display (TimeAxisView& tv);
/* nudge is initiated by transport controls owned by ARDOUR_UI */
@ -1035,13 +1035,6 @@ class Editor : public PublicEditor
void hide_all_tracks (bool with_select);
void route_display_selection_changed ();
void redisplay_route_list();
void route_list_reordered (const Gtk::TreeModel::Path& path, const Gtk::TreeModel::iterator& iter, int* what);
bool ignore_route_list_reorder;
bool no_route_list_redisplay;
void queue_route_list_reordered ();
struct DragInfo {
ArdourCanvas::Item* item;
void* data;
@ -1452,14 +1445,16 @@ class Editor : public PublicEditor
struct RouteDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
RouteDisplayModelColumns() {
add (text);
add (visible);
add (tv);
}
Gtk::TreeModelColumn<Glib::ustring> text;
Gtk::TreeModelColumn<bool> visible;
Gtk::TreeModelColumn<TimeAxisView*> tv;
};
RouteDisplayModelColumns route_display_columns;
Glib::RefPtr<Gtk::ListStore> route_display_model;
Glib::RefPtr<Gtk::TreeStore> route_display_model;
Glib::RefPtr<Gtk::TreeSelection> route_display_selection;
gint route_list_compare_func (Gtk::TreeModel::iterator, Gtk::TreeModel::iterator);
@ -1467,24 +1462,42 @@ class Editor : public PublicEditor
Gtk::ScrolledWindow route_list_scroller;
Gtk::Menu* route_list_menu;
void route_list_column_click ();
bool route_list_display_button_press (GdkEventButton*);
bool route_list_selection_filter (const Glib::RefPtr<Gtk::TreeModel>& model, const Gtk::TreeModel::Path& path, bool yn);
void route_list_change (const Gtk::TreeModel::Path&,const Gtk::TreeModel::iterator&);
void route_list_delete (const Gtk::TreeModel::Path&);
void initial_route_list_display ();
void redisplay_route_list();
void route_list_reordered (const Gtk::TreeModel::Path& path, const Gtk::TreeModel::iterator& iter, int* what);
bool ignore_route_list_reorder;
bool no_route_list_redisplay;
void queue_route_list_reordered ();
void build_route_list_menu ();
void select_all_routes ();
void unselect_all_routes ();
void select_all_audiotracks ();
void unselect_all_audiotracks ();
void select_all_audiobus ();
void unselect_all_audiobus ();
void show_route_list_menu ();
void show_all_routes ();
void hide_all_routes ();
void show_all_audiotracks ();
void hide_all_audiotracks ();
void show_all_audiobus ();
void hide_all_audiobus ();
void set_all_tracks_visibility (bool yn);
void set_all_audio_visibility (int type, bool yn);
/* edit group management */
struct GroupListModelColumns : public Gtk::TreeModel::ColumnRecord {
GroupListModelColumns () {
add (is_active);
add (is_visible);
add (text);
add (routegroup);
}
Gtk::TreeModelColumn<bool> is_active;
Gtk::TreeModelColumn<bool> is_visible;
Gtk::TreeModelColumn<std::string> text;
Gtk::TreeModelColumn<ARDOUR::RouteGroup*> routegroup;
};
@ -1493,17 +1506,16 @@ class Editor : public PublicEditor
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;
Gtkmm2ext::DnDTreeView edit_group_display;
Gtk::ScrolledWindow edit_group_list_scroller;
Gtk::TreeView edit_group_display;
Gtk::ScrolledWindow edit_group_display_scroller;
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 ();
void unselect_all_edit_groups ();
void activate_all_edit_groups ();
void disable_all_edit_groups ();
void edit_group_row_change (const Gtk::TreeModel::Path&,const Gtk::TreeModel::iterator&);
void new_edit_group ();
void edit_group_list_button_clicked ();
gint edit_group_list_button_press_event (GdkEventButton* ev);

View file

@ -367,9 +367,11 @@ Editor::reset_scrolling_region (Gtk::Allocation* alloc)
for (pos = 0, i = rows.begin(); i != rows.end(); ++i) {
TimeAxisView *tv = (*i)[route_display_columns.tv];
if (tv != 0) {
pos += tv->effective_height;
pos += track_spacing;
}
}
RefPtr<Gdk::Screen> screen = get_screen();
@ -396,9 +398,11 @@ Editor::controls_layout_size_request (Requisition* req)
for (pos = 0, i = rows.begin(); i != rows.end(); ++i) {
TimeAxisView *tv = (*i)[route_display_columns.tv];
if (tv != 0) {
pos += tv->effective_height;
pos += track_spacing;
}
}
RefPtr<Gdk::Screen> screen = get_screen();

View file

@ -40,20 +40,8 @@ using namespace sigc;
using namespace ARDOUR;
using namespace Gtk;
void
Editor::edit_group_list_column_click (gint col)
{
if (edit_group_list_menu == 0) {
build_edit_group_list_menu ();
}
edit_group_list_menu->popup (0, 0);
}
void
Editor::build_edit_group_list_menu ()
{
using namespace Gtk::Menu_Helpers;
@ -61,34 +49,33 @@ Editor::build_edit_group_list_menu ()
edit_group_list_menu->set_name ("ArdourContextMenu");
MenuList& items = edit_group_list_menu->items();
items.push_back (MenuElem (_("Show All"), mem_fun(*this, &Editor::select_all_edit_groups)));
items.push_back (MenuElem (_("Hide All"), mem_fun(*this, &Editor::unselect_all_edit_groups)));
items.push_back (MenuElem (_("Activate All"), mem_fun(*this, &Editor::activate_all_edit_groups)));
items.push_back (MenuElem (_("Disable All"), mem_fun(*this, &Editor::disable_all_edit_groups)));
items.push_back (SeparatorElem());
items.push_back (MenuElem (_("Add group"), mem_fun(*this, &Editor::new_edit_group)));
}
void
Editor::unselect_all_edit_groups ()
Editor::activate_all_edit_groups ()
{
}
void
Editor::select_all_edit_groups ()
{
/* XXX potential race with remove_track(), but the select operation
cannot be done with the track_lock held.
*/
Gtk::TreeModel::Children children = group_model->children();
for(Gtk::TreeModel::Children::iterator iter = children.begin(); iter != children.end(); ++iter) {
edit_group_display.get_selection()->select (iter);
(*iter)[group_columns.is_active] = true;
}
}
void
Editor::disable_all_edit_groups ()
{
Gtk::TreeModel::Children children = group_model->children();
for(Gtk::TreeModel::Children::iterator iter = children.begin(); iter != children.end(); ++iter) {
(*iter)[group_columns.is_active] = false;
}
}
void
Editor::new_edit_group ()
{
if (session == 0) {
return;
@ -119,6 +106,15 @@ Editor::edit_group_list_button_clicked ()
gint
Editor::edit_group_list_button_press_event (GdkEventButton* ev)
{
if (Keyboard::is_context_menu_event (ev)) {
if (edit_group_list_menu == 0) {
build_edit_group_list_menu ();
}
edit_group_list_menu->popup (1, 0);
return true;
}
RouteGroup* group;
TreeIter iter;
TreeModel::Path path;
@ -131,72 +127,76 @@ Editor::edit_group_list_button_press_event (GdkEventButton* ev)
}
switch (GPOINTER_TO_UINT (column->get_data (X_("colnum")))) {
case 2:
if (Keyboard::is_edit_event (ev)) {
if ((iter = group_model->get_iter (path))) {
if ((group = (*iter)[group_columns.routegroup]) != 0) {
// edit_route_group (group);
return true;
}
}
}
break;
case 1:
if (Keyboard::is_edit_event (ev)) {
// RouteGroup* group = (RouteGroup *) edit_group_display.row(row).get_data ();
// edit_route_group (group);
return stop_signal (edit_group_display, "button_press_event");
} else {
/* allow regular select to occur */
return FALSE;
if ((iter = group_model->get_iter (path))) {
bool visible = (*iter)[group_columns.is_visible];
(*iter)[group_columns.is_visible] = !visible;
return true;
}
break;
case 0:
if ((iter = group_model->get_iter (path))) {
/* path points to a valid node */
bool active = (*iter)[group_columns.is_active];
(*iter)[group_columns.is_active] = !active;
return true;
}
break;
if ((group = (*iter)[group_columns.routegroup]) != 0) {
group->set_active (!group->is_active (), this);
}
}
default:
break;
}
return stop_signal (edit_group_display, "button_press_event");
}
return false;
}
void
Editor::edit_group_selection_changed ()
Editor::edit_group_row_change (const Gtk::TreeModel::Path& path,const Gtk::TreeModel::iterator& iter)
{
TreeModel::iterator i;
TreeModel::Children rows = group_model->children();
Glib::RefPtr<TreeSelection> selection = edit_group_display.get_selection();
for (i = rows.begin(); i != rows.end(); ++i) {
RouteGroup* group;
group = (*i)[group_columns.routegroup];
if ((group = (*iter)[group_columns.routegroup]) == 0) {
return;
}
if (selection->is_selected (i)) {
if ((*iter)[group_columns.is_visible]) {
for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) {
if ((*j)->edit_group() == group) {
select_strip_in_display (*j);
show_track_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);
}
hide_track_in_display (**j);
}
}
}
bool active = (*iter)[group_columns.is_active];
group->set_active (active, this);
}
void
Editor::add_edit_group (RouteGroup* group)
{
ENSURE_GUI_THREAD(bind (mem_fun(*this, &Editor::add_edit_group), group));
TreeModel::Row row = *(group_model->append());
row[group_columns.is_active] = group->is_active();
row[group_columns.is_visible] = true;
row[group_columns.text] = group->name();
row[group_columns.routegroup] = group;
@ -206,20 +206,14 @@ Editor::add_edit_group (RouteGroup* group)
void
Editor::group_flags_changed (void* src, RouteGroup* group)
{
/* GTK2FIX not needed in gtk2?
ENSURE_GUI_THREAD(bind (mem_fun(*this, &Editor::group_flags_changed), src, group));
if (src != this) {
// select row
Gtk::TreeModel::Children children = group_model->children();
for(Gtk::TreeModel::Children::iterator iter = children.begin(); iter != children.end(); ++iter) {
if (group == (*iter)[group_columns.routegroup]) {
(*iter)[group_columns.is_active] = group->is_active();
}
CList_Helpers::RowIterator ri = edit_group_display.rows().find_data (group);
if (group->is_active()) {
edit_group_display.cell (ri->get_row_num(),0).set_pixmap (check_pixmap, check_mask);
} else {
edit_group_display.cell (ri->get_row_num(),0).set_pixmap (empty_pixmap, empty_mask);
}
*/
}

View file

@ -29,6 +29,7 @@
#include "gui_thread.h"
#include <ardour/route.h>
#include <ardour/audio_track.h>
#include "i18n.h"
@ -48,7 +49,8 @@ Editor::handle_new_route (Route& route)
{
TimeAxisView *tv;
AudioTimeAxisView *atv;
TreeModel::Row row = *(route_display_model->append());
TreeModel::Row parent;
TreeModel::Row row;
if (route.hidden()) {
return;
@ -56,16 +58,43 @@ Editor::handle_new_route (Route& route)
tv = new AudioTimeAxisView (*this, *session, route, track_canvas);
track_views.push_back (tv);
#if 0
if (route_display_model->children().size() == 0) {
/* set up basic entries */
TreeModel::Row row;
row = *(route_display_model->append()); // path = "0"
row[route_display_columns.text] = _("Busses");
row[route_display_columns.tv] = 0;
row = *(route_display_model->append()); // path = "1"
row[route_display_columns.text] = _("Tracks");
row[route_display_columns.tv] = 0;
}
if (dynamic_cast<AudioTrack*>(&route) != 0) {
TreeModel::iterator iter = route_display_model->get_iter ("1"); // audio tracks
parent = *iter;
} else {
TreeModel::iterator iter = route_display_model->get_iter ("0"); // busses
parent = *iter;
}
row = *(route_display_model->append (parent.children()));
#else
row = *(route_display_model->append ());
#endif
row[route_display_columns.text] = route.name();
row[route_display_columns.visible] = tv->marked_for_display();
row[route_display_columns.tv] = tv;
ignore_route_list_reorder = true;
track_views.push_back (tv);
if (!no_route_list_redisplay && tv->marked_for_display()) {
route_list_display.get_selection()->select (row);
}
ignore_route_list_reorder = true;
if ((atv = dynamic_cast<AudioTimeAxisView*> (tv)) != 0) {
/* added a new fresh one at the end */
@ -144,35 +173,7 @@ Editor::route_name_changed (TimeAxisView *tv)
}
void
Editor::route_display_selection_changed ()
{
TimeAxisView *tv;
TreeModel::Children rows = route_display_model->children();
TreeModel::Children::iterator i;
Glib::RefPtr<TreeSelection> selection = route_list_display.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 (false);
} else {
AudioTimeAxisView *atv;
tv->set_marked_for_display (true);
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);
}
}
}
}
redisplay_route_list ();
}
void
Editor::unselect_strip_in_display (TimeAxisView& tv)
Editor::hide_track_in_display (TimeAxisView& tv)
{
TreeModel::Children rows = route_display_model->children();
TreeModel::Children::iterator i;
@ -180,21 +181,31 @@ Editor::unselect_strip_in_display (TimeAxisView& tv)
for (i = rows.begin(); i != rows.end(); ++i) {
if ((*i)[route_display_columns.tv] == &tv) {
selection->unselect (*i);
(*i)[route_display_columns.visible] = false;
break;
}
}
AudioTimeAxisView* atv = dynamic_cast<AudioTimeAxisView*> (&tv);
if (atv && current_mixer_strip && &(atv->route()) == &(current_mixer_strip->route())) {
// this will hide the mixer strip
set_selected_mixer_strip (tv);
}
}
void
Editor::select_strip_in_display (TimeAxisView* tv)
Editor::show_track_in_display (TimeAxisView& tv)
{
TreeModel::Children rows = route_display_model->children();
TreeModel::Children::iterator i;
Glib::RefPtr<TreeSelection> selection = route_list_display.get_selection();
for (i = rows.begin(); i != rows.end(); ++i) {
if ((*i)[route_display_columns.tv] == tv) {
selection->select (*i);
if ((*i)[route_display_columns.tv] == &tv) {
(*i)[route_display_columns.visible] = true;
tv.set_marked_for_display (true);
break;
}
}
}
@ -218,10 +229,15 @@ Editor::redisplay_route_list ()
return;
}
for (n = 0, order = 0, position = 0, i = rows.begin(); i != rows.end(); ++i, ++order) {
for (n = 0, order = 0, position = 0, i = rows.begin(); i != rows.end(); ++i) {
TimeAxisView *tv = (*i)[route_display_columns.tv];
AudioTimeAxisView* at;
if (tv == 0) {
// just a "title" row
continue;
}
if (!ignore_route_list_reorder) {
/* this reorder is caused by user action, so reassign sort order keys
@ -230,9 +246,14 @@ Editor::redisplay_route_list ()
if ((at = dynamic_cast<AudioTimeAxisView*> (tv)) != 0) {
at->route().set_order_key (N_("editor"), order);
++order;
}
}
if (tv->marked_for_display()) {
bool visible = (*i)[route_display_columns.visible];
if (visible) {
tv->set_marked_for_display (false);
position += tv->show_at (position, n, &edit_controls_vbox);
position += track_spacing;
} else {
@ -243,7 +264,6 @@ Editor::redisplay_route_list ()
}
controls_layout.queue_resize ();
reset_scrolling_region ();
}
@ -253,23 +273,27 @@ Editor::hide_all_tracks (bool with_select)
TreeModel::Children rows = route_display_model->children();
TreeModel::Children::iterator i;
// GTK2FIX
// track_display_list.freeze ();
no_route_list_redisplay = true;
for (i = rows.begin(); i != rows.end(); ++i) {
TreeModel::Row row = (*i);
TimeAxisView *tv = row[route_display_columns.tv];
if (with_select) {
route_list_display.get_selection()->unselect (i);
} else {
tv->set_marked_for_display (false);
tv->hide();
if (tv == 0) {
continue;
}
row[route_display_columns.visible] = false;
}
}
//route_list_display.thaw ();
no_route_list_redisplay = false;
redisplay_route_list ();
/* XXX this seems like a hack and half, but its not clear where to put this
otherwise.
*/
reset_scrolling_region ();
}
@ -279,146 +303,212 @@ Editor::build_route_list_menu ()
using namespace Menu_Helpers;
using namespace Gtk;
route_list_menu = new Menu;
MenuList& items = route_list_menu->items();
route_list_menu->set_name ("ArdourContextMenu");
items.push_back (MenuElem (_("Show All"), mem_fun(*this, &Editor::select_all_routes)));
items.push_back (MenuElem (_("Hide All"), mem_fun(*this, &Editor::unselect_all_routes)));
items.push_back (MenuElem (_("Show All AbstractTracks"), mem_fun(*this, &Editor::select_all_audiotracks)));
items.push_back (MenuElem (_("Hide All AbstractTracks"), mem_fun(*this, &Editor::unselect_all_audiotracks)));
items.push_back (MenuElem (_("Show All AudioBus"), mem_fun(*this, &Editor::select_all_audiobus)));
items.push_back (MenuElem (_("Hide All AudioBus"), mem_fun(*this, &Editor::unselect_all_audiobus)));
items.push_back (MenuElem (_("Show All"), mem_fun(*this, &Editor::show_all_routes)));
items.push_back (MenuElem (_("Hide All"), mem_fun(*this, &Editor::hide_all_routes)));
items.push_back (MenuElem (_("Show All Audio Tracks"), mem_fun(*this, &Editor::show_all_audiotracks)));
items.push_back (MenuElem (_("Hide All Audio Tracks"), mem_fun(*this, &Editor::hide_all_audiotracks)));
items.push_back (MenuElem (_("Show All Audio Busses"), mem_fun(*this, &Editor::show_all_audiobus)));
items.push_back (MenuElem (_("Hide All Audio Busses"), mem_fun(*this, &Editor::hide_all_audiobus)));
}
void
Editor::unselect_all_routes ()
{
hide_all_tracks (true);
}
void
Editor::select_all_routes ()
Editor::set_all_tracks_visibility (bool yn)
{
TreeModel::Children rows = route_display_model->children();
TreeModel::Children::iterator i;
no_route_list_redisplay = true;
for (i = rows.begin(); i != rows.end(); ++i) {
route_list_display.get_selection()->select (i);
TreeModel::Row row = (*i);
TimeAxisView* tv = row[route_display_columns.tv];
if (tv == 0) {
continue;
}
(*i)[route_display_columns.visible] = yn;
}
no_route_list_redisplay = false;
redisplay_route_list ();
}
void
Editor::select_all_audiotracks ()
Editor::set_all_audio_visibility (int tracks, bool yn)
{
TreeModel::Children rows = route_display_model->children();
TreeModel::Children::iterator i;
no_route_list_redisplay = true;
for (i = rows.begin(); i != rows.end(); ++i) {
TreeModel::Row row = (*i);
TimeAxisView* tv = row[route_display_columns.tv];
AudioTimeAxisView* atv;
if (tv == 0) {
continue;
}
if ((atv = dynamic_cast<AudioTimeAxisView*>(tv)) != 0) {
switch (tracks) {
case 0:
(*i)[route_display_columns.visible] = yn;
break;
case 1:
if (atv->is_audio_track()) {
route_list_display.get_selection()->select (i);
}
}
(*i)[route_display_columns.visible] = yn;
}
break;
}
void
Editor::unselect_all_audiotracks ()
{
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()) {
route_list_display.get_selection()->unselect (i);
}
}
}
}
void
Editor::select_all_audiobus ()
{
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) {
case 2:
if (!atv->is_audio_track()) {
route_list_display.get_selection()->select (i);
(*i)[route_display_columns.visible] = yn;
}
break;
}
}
}
no_route_list_redisplay = false;
redisplay_route_list ();
}
void
Editor::unselect_all_audiobus ()
Editor::hide_all_routes ()
{
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()) {
route_list_display.get_selection()->unselect (i);
}
}
}
set_all_tracks_visibility (false);
}
gint
Editor::route_list_compare_func (TreeModel::iterator a, TreeModel::iterator b)
void
Editor::show_all_routes ()
{
TimeAxisView *tv1;
TimeAxisView *tv2;
AudioTimeAxisView *atv1;
AudioTimeAxisView *atv2;
Route* ra;
Route* rb;
set_all_tracks_visibility (true);
}
tv1 = (*a)[route_display_columns.tv];
tv2 = (*b)[route_display_columns.tv];
void
Editor::show_all_audiobus ()
{
set_all_audio_visibility (2, true);
}
void
Editor::hide_all_audiobus ()
{
set_all_audio_visibility (2, false);
}
if ((atv1 = dynamic_cast<AudioTimeAxisView*>(tv1)) == 0 ||
(atv2 = dynamic_cast<AudioTimeAxisView*>(tv2)) == 0) {
return FALSE;
void
Editor::show_all_audiotracks()
{
set_all_audio_visibility (1, true);
}
void
Editor::hide_all_audiotracks ()
{
set_all_audio_visibility (1, false);
}
bool
Editor::route_list_display_button_press (GdkEventButton* ev)
{
if (Keyboard::is_context_menu_event (ev)) {
show_route_list_menu ();
return true;
}
ra = &atv1->route();
rb = &atv2->route();
TreeIter iter;
TreeModel::Path path;
TreeViewColumn* column;
int cellx;
int celly;
if (!route_list_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:
if ((iter = route_display_model->get_iter (path))) {
TimeAxisView* tv = (*iter)[route_display_columns.tv];
if (tv) {
bool visible = (*iter)[route_display_columns.visible];
(*iter)[route_display_columns.visible] = !visible;
}
}
return true;
case 1:
/* allow normal processing to occur */
return false;
default:
break;
}
return false;
}
void
Editor::show_route_list_menu()
{
if (route_list_menu == 0) {
build_route_list_menu ();
}
route_list_menu->popup (1, 0);
}
bool
Editor::route_list_selection_filter (const Glib::RefPtr<TreeModel>& model, const TreeModel::Path& path, bool yn)
{
return true;
}
struct EditorOrderRouteSorter {
bool operator() (Route* a, Route* b) {
/* use of ">" forces the correct sort order */
return a->order_key ("editor") > b->order_key ("editor");
}
};
return ra->order_key ("editor") > rb->order_key ("editor");
void
Editor::initial_route_list_display ()
{
Session::RouteList routes = session->get_routes();
EditorOrderRouteSorter sorter;
routes.sort (sorter);
no_route_list_redisplay = true;
route_display_model->clear ();
for (Session::RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
handle_new_route (**i);
}
no_route_list_redisplay = false;
redisplay_route_list ();
}
void
Editor::route_list_change (const Gtk::TreeModel::Path& path,const Gtk::TreeModel::iterator& iter)
{
redisplay_route_list ();
}
void
Editor::route_list_delete (const Gtk::TreeModel::Path& path)
{
redisplay_route_list ();
}

View file

@ -45,3 +45,7 @@ for lang in languages[:]:
modir = (os.path.join (install_prefix, 'share/locale/' + lang + '/LC_MESSAGES/'))
moname = domain + '.mo'
env.Alias('install', env.InstallAs (os.path.join (modir, moname), lang + '.mo'))
env.Alias ('tarball', env.Distribute (env['DISTTREE'],
[ 'SConscript' ] +
glob.glob('*.po')))

View file

@ -103,7 +103,7 @@ class PublicEditor : public Gtk::Window, public Stateful {
virtual void route_name_changed (TimeAxisView *) = 0;
virtual void clear_playlist (ARDOUR::Playlist&) = 0;
virtual void set_selected_mixer_strip (TimeAxisView&) = 0;
virtual void unselect_strip_in_display (TimeAxisView& tv) = 0;
virtual void hide_track_in_display (TimeAxisView& tv) = 0;
virtual void set_follow_playhead (bool yn) = 0;
virtual void toggle_follow_playhead () = 0;
virtual bool follow_playhead() const = 0;

View file

@ -222,7 +222,7 @@ VisualTimeAxis::visual_click()
void
VisualTimeAxis::hide_click()
{
editor.unselect_strip_in_display (*this);
editor.hide_track_in_display (*this);
}

View file

@ -113,4 +113,10 @@ DnDTreeView::on_drag_data_received(const RefPtr<DragContext>& context, int x, in
}
}
bool
DnDTreeView::on_drag_drop(const Glib::RefPtr<Gdk::DragContext>& context, int x, int y, guint time)
{
suggested_action = Gdk::DragAction (0);
return TreeView::on_drag_drop (context, x, y, time);
}

View file

@ -51,11 +51,7 @@ class DnDTreeView : public Gtk::TreeView
suggested_action = context->get_suggested_action();
return TreeView::on_drag_motion (context, x, y, time);
}
bool on_drag_drop(const Glib::RefPtr<Gdk::DragContext>& context, int x, int y, guint time) {
suggested_action = Gdk::DragAction (0);
return TreeView::on_drag_drop (context, x, y, time);
}
bool on_drag_drop(const Glib::RefPtr<Gdk::DragContext>& context, int x, int y, guint time);
void on_drag_data_get(const Glib::RefPtr<Gdk::DragContext>& context, Gtk::SelectionData& selection_data, guint info, guint time);
void on_drag_data_received(const Glib::RefPtr<Gdk::DragContext>& context, int x, int y, const Gtk::SelectionData& selection_data, guint info, guint time);

View file

@ -46,3 +46,7 @@ midi2.VersionBuild(['version.cc','midi++/version.h'], 'SConscript')
libmidi2 = midi2.StaticLibrary('midi++', [ sources, sysdep_src ])
Default(libmidi2)
env.Alias('tarball', env.Distribute (env['DISTTREE'],
[ 'SConscript' ] + sources + sysdep_sources +
glob.glob('midi++/*.h')))

View file

@ -42,3 +42,6 @@ pbd3.VersionBuild(['version.cc','pbd/version.h'], 'SConscript')
libpbd3 = pbd3.StaticLibrary('pbd', pbd3_files)
Default(libpbd3)
env.Alias('tarball', env.Distribute (env['DISTTREE'],
[ 'SConscript' ] + pbd3_files + glob.glob('pbd/*.h')))

View file

@ -16,3 +16,14 @@ if os.path.exists ('CVS'):
Default([sigc2_config_h,libsigc2])
else:
Default([libsigc2])
env.Alias('tarball', env.Distribute (env['DISTTREE'],
[ 'NEWS', 'README', 'AUTHORS', 'ChangeLog',
'configure', 'Makefile.am', 'SConscript',
'sigc++/Makefile.am',
'sigc++config.h',
] + sigc2_files +
glob.glob('sigc++/*.h') +
glob.glob('sigc++/functors/*.h') + glob.glob('sigc++/adaptors/lambda/*.h') +
glob.glob('sigc++/adaptors/*.h')
))