summaryrefslogtreecommitdiff
path: root/gtk2_ardour/editor.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gtk2_ardour/editor.cc')
-rw-r--r--gtk2_ardour/editor.cc107
1 files changed, 87 insertions, 20 deletions
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index fa44862191..4f36865905 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -247,6 +247,7 @@ Editor::Editor ()
PublicEditor::_instance = this;
session = 0;
+ _have_idled = false;
selection = new Selection (this);
cut_buffer = new Selection (this);
@@ -382,12 +383,12 @@ Editor::Editor ()
horizontal_adjustment.signal_value_changed().connect (mem_fun(*this, &Editor::canvas_horizontally_scrolled), false);
vertical_adjustment.signal_value_changed().connect (mem_fun(*this, &Editor::tie_vertical_scrolling), true);
- track_canvas.set_hadjustment (horizontal_adjustment);
- track_canvas.set_vadjustment (vertical_adjustment);
- time_canvas.set_hadjustment (horizontal_adjustment);
+ track_canvas->set_hadjustment (horizontal_adjustment);
+ track_canvas->set_vadjustment (vertical_adjustment);
+ time_canvas->set_hadjustment (horizontal_adjustment);
- track_canvas.signal_map_event().connect (mem_fun (*this, &Editor::track_canvas_map_handler));
- time_canvas.signal_map_event().connect (mem_fun (*this, &Editor::time_canvas_map_handler));
+ track_canvas->signal_map_event().connect (mem_fun (*this, &Editor::track_canvas_map_handler));
+ time_canvas->signal_map_event().connect (mem_fun (*this, &Editor::time_canvas_map_handler));
controls_layout.add (edit_controls_vbox);
controls_layout.set_name ("EditControlsBase");
@@ -425,7 +426,7 @@ Editor::Editor ()
time_canvas_vbox.pack_start (*smpte_ruler, false, false);
time_canvas_vbox.pack_start (*frames_ruler, false, false);
time_canvas_vbox.pack_start (*bbt_ruler, false, false);
- time_canvas_vbox.pack_start (time_canvas, true, true);
+ time_canvas_vbox.pack_start (*time_canvas, true, true);
time_canvas_vbox.set_size_request (-1, (int)(timebar_height * visible_timebars) + 5);
bbt_label.set_name ("EditorTimeButton");
@@ -492,7 +493,7 @@ Editor::Editor ()
for the canvas areas.
*/
- track_canvas_event_box.add (track_canvas);
+ track_canvas_event_box.add (*track_canvas);
time_canvas_event_box.add (time_canvas_vbox);
time_canvas_event_box.set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK);
@@ -613,6 +614,10 @@ Editor::Editor ()
region_list_display.set_size_request (100, -1);
region_list_display.set_name ("RegionListDisplay");
+ /* Try to prevent single mouse presses from initiating edits.
+ This relies on a hack in gtktreeview.c:gtk_treeview_button_press()
+ */
+ region_list_display.set_data ("mouse-edits-require-mod1", (gpointer) 0x1);
region_list_model = TreeStore::create (region_list_columns);
region_list_model->set_sort_func (0, mem_fun (*this, &Editor::region_list_sorter));
@@ -748,8 +753,7 @@ Editor::Editor ()
set_snap_to (snap_type);
snap_mode = SnapOff;
set_snap_mode (snap_mode);
- _edit_point = EditAtMouse;
- set_edit_point_preference (_edit_point);
+ set_edit_point_preference (EditAtMouse, true);
XMLNode* node = ARDOUR_UI::instance()->editor_settings();
set_state (*node);
@@ -833,6 +837,16 @@ Editor::~Editor()
image_socket_listener = 0 ;
}
#endif
+
+ if (track_canvas) {
+ delete track_canvas;
+ track_canvas = 0;
+ }
+
+ if (time_canvas) {
+ delete time_canvas;
+ time_canvas = 0;
+ }
}
void
@@ -1150,6 +1164,10 @@ Editor::connect_to_session (Session *t)
{
session = t;
+ /* there are never any selected regions at startup */
+
+ sensitize_the_right_region_actions (false);
+
XMLNode* node = ARDOUR_UI::instance()->editor_settings();
set_state (*node);
@@ -2229,9 +2247,9 @@ Editor::set_snap_mode (SnapMode mode)
instant_save ();
}
void
-Editor::set_edit_point_preference (EditPoint ep)
+Editor::set_edit_point_preference (EditPoint ep, bool force)
{
- bool changed = _edit_point != ep;
+ bool changed = (_edit_point != ep);
_edit_point = ep;
string str = edit_point_strings[(int)ep];
@@ -2242,7 +2260,7 @@ Editor::set_edit_point_preference (EditPoint ep)
set_canvas_cursor ();
- if (!changed) {
+ if (!force && !changed) {
return;
}
@@ -2266,6 +2284,25 @@ Editor::set_edit_point_preference (EditPoint ep)
break;
}
+ const char* action;
+
+ switch (_edit_point) {
+ case EditAtPlayhead:
+ action = "edit-at-playhead";
+ break;
+ case EditAtSelectedMarker:
+ action = "edit-at-marker";
+ break;
+ case EditAtMouse:
+ action = "edit-at-mouse";
+ break;
+ }
+
+ Glib::RefPtr<Action> act = ActionManager::get_action ("Editor", action);
+ if (act) {
+ Glib::RefPtr<RadioAction>::cast_dynamic(act)->set_active (true);
+ }
+
instant_save ();
}
@@ -2339,7 +2376,7 @@ Editor::set_state (const XMLNode& node)
}
if ((prop = node.property ("edit-point"))) {
- set_edit_point_preference ((EditPoint) string_2_enum (prop->value(), _edit_point));
+ set_edit_point_preference ((EditPoint) string_2_enum (prop->value(), _edit_point), true);
}
if ((prop = node.property ("mouse-mode"))) {
@@ -2354,7 +2391,7 @@ Editor::set_state (const XMLNode& node)
if ((prop = node.property ("show-waveforms"))) {
bool yn = (prop->value() == "yes");
_show_waveforms = !yn;
- RefPtr<Action> act = ActionManager::get_action (X_("Editor"), X_("ToggleWaveformVisibility"));
+ RefPtr<Action> act = ActionManager::get_action (X_("Editor"), X_("toggle-waveform-visible"));
if (act) {
RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
/* do it twice to force the change */
@@ -4506,8 +4543,7 @@ Editor::set_loop_range (nframes_t start, nframes_t end, string cmd)
session->set_auto_loop_location (loc);
XMLNode &after = session->locations()->get_state();
session->add_command (new MementoCommand<Locations>(*(session->locations()), &before, &after));
- }
- else {
+ } else {
XMLNode &before = tll->get_state();
tll->set_hidden (false, this);
tll->set (start, end);
@@ -4629,15 +4665,20 @@ Editor::get_regions_for_action (RegionSelection& rs, bool allow_entered)
if (selection->tracks.empty()) {
- /* no regions or tracks selected, but entered regionview is valid
- and we're in object mode - just use entered regionview
+ /* no regions or tracks selected
*/
- if (entered_regionview && (mouse_mode == Editing::MouseObject)) {
+ if (entered_regionview && mouse_mode == Editing::MouseObject) {
+
+ /* entered regionview is valid and we're in object mode -
+ just use entered regionview
+ */
+
rs.add (entered_regionview);
- return;
}
+ return;
+
} else {
/* no regions selected, so get all regions at the edit point across
@@ -4720,3 +4761,29 @@ Editor::show_rhythm_ferret ()
rhythm_ferret->show ();
rhythm_ferret->present ();
}
+
+void
+Editor::first_idle ()
+{
+ MessageDialog* dialog = 0;
+
+ if (track_views.size() > 1) {
+ dialog = new MessageDialog (*this,
+ _("Please wait while Ardour loads visual data"),
+ true,
+ Gtk::MESSAGE_INFO,
+ Gtk::BUTTONS_NONE);
+ dialog->present ();
+ ARDOUR_UI::instance()->flush_pending ();
+ }
+
+ for (TrackViewList::iterator t = track_views.begin(); t != track_views.end(); ++t) {
+ (*t)->first_idle();
+ }
+
+ if (dialog) {
+ delete dialog;
+ }
+
+ _have_idled = true;
+}