, minsec_label (_("Mins:Secs"))
, bbt_label (_("Bars:Beats"))
, timecode_label (_("Timecode"))
- , frame_label (_("Samples"))
+ , samples_label (_("Samples"))
, tempo_label (_("Tempo"))
, meter_label (_("Meter"))
, mark_label (_("Location Markers"))
, automation_mode_button (_("mode"))
, global_automation_button (_("automation"))
+ , _toolbar_viewport (*manage (new Gtk::Adjustment (0, 0, 1e10)), *manage (new Gtk::Adjustment (0, 0, 1e10)))
, midi_panic_button (_("Panic"))
#ifdef WITH_CMT
editor_ruler_menu = 0;
no_ruler_shown_update = false;
marker_menu = 0;
- session_range_marker_menu = 0;
range_marker_menu = 0;
marker_menu_item = 0;
tempo_or_meter_marker_menu = 0;
timecode_label.set_padding (5,0);
timecode_label.hide ();
timecode_label.set_no_show_all();
- frame_label.set_name ("EditorTimeButton");
- frame_label.set_size_request (-1, (int)timebar_height);
- frame_label.set_alignment (1.0, 0.5);
- frame_label.set_padding (5,0);
- frame_label.hide ();
- frame_label.set_no_show_all();
+ samples_label.set_name ("EditorTimeButton");
+ samples_label.set_size_request (-1, (int)timebar_height);
+ samples_label.set_alignment (1.0, 0.5);
+ samples_label.set_padding (5,0);
+ samples_label.hide ();
+ samples_label.set_no_show_all();
tempo_label.set_name ("EditorTimeButton");
tempo_label.set_size_request (-1, (int)timebar_height);
tempo_label.set_padding (5,0);
tempo_label.hide();
tempo_label.set_no_show_all();
+
meter_label.set_name ("EditorTimeButton");
meter_label.set_size_request (-1, (int)timebar_height);
meter_label.set_alignment (1.0, 0.5);
meter_label.set_padding (5,0);
meter_label.hide();
meter_label.set_no_show_all();
+
mark_label.set_name ("EditorTimeButton");
mark_label.set_size_request (-1, (int)timebar_height);
mark_label.set_alignment (1.0, 0.5);
mark_label.set_padding (5,0);
mark_label.hide();
mark_label.set_no_show_all();
+
cd_mark_label.set_name ("EditorTimeButton");
cd_mark_label.set_size_request (-1, (int)timebar_height);
cd_mark_label.set_alignment (1.0, 0.5);
cd_mark_label.set_padding (5,0);
cd_mark_label.hide();
cd_mark_label.set_no_show_all();
+
range_mark_label.set_name ("EditorTimeButton");
range_mark_label.set_size_request (-1, (int)timebar_height);
range_mark_label.set_alignment (1.0, 0.5);
range_mark_label.set_padding (5,0);
range_mark_label.hide();
range_mark_label.set_no_show_all();
+
transport_mark_label.set_name ("EditorTimeButton");
transport_mark_label.set_size_request (-1, (int)timebar_height);
transport_mark_label.set_alignment (1.0, 0.5);
initialize_rulers ();
initialize_canvas ();
+
_summary = new EditorSummary (this);
selection->TimeChanged.connect (sigc::mem_fun(*this, &Editor::time_selection_changed));
selection->TracksChanged.connect (sigc::mem_fun(*this, &Editor::track_selection_changed));
+
editor_regions_selection_changed_connection = selection->RegionsChanged.connect (sigc::mem_fun(*this, &Editor::region_selection_changed));
+
selection->PointsChanged.connect (sigc::mem_fun(*this, &Editor::point_selection_changed));
selection->MarkersChanged.connect (sigc::mem_fun(*this, &Editor::marker_selection_changed));
controls_layout.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK);
controls_layout.signal_button_release_event().connect (sigc::mem_fun(*this, &Editor::edit_controls_button_release));
- controls_layout_size_request_connection = controls_layout.signal_size_request().connect (sigc::mem_fun (*this, &Editor::controls_layout_size_request));
_cursors = new MouseCursors;
ArdourCanvas::Canvas* time_pad = manage(new ArdourCanvas::Canvas());
ArdourCanvas::SimpleLine* pad_line_1 = manage(new ArdourCanvas::SimpleLine(*time_pad->root(),
0.0, 1.0, 100.0, 1.0));
+
pad_line_1->property_color_rgba() = 0xFF0000FF;
pad_line_1->show();
+
time_pad->show();
time_canvas_vbox.set_size_request (-1, (int)(timebar_height * visible_timebars) + 2);
_snapshots = new EditorSnapshots (this);
_locations = new EditorLocations (this);
- Gtk::Label* nlabel;
-
- nlabel = manage (new Label (_("Regions")));
- nlabel->set_angle (-90);
- the_notebook.append_page (_regions->widget (), *nlabel);
- nlabel = manage (new Label (_("Tracks & Busses")));
- nlabel->set_angle (-90);
- the_notebook.append_page (_routes->widget (), *nlabel);
- nlabel = manage (new Label (_("Snapshots")));
- nlabel->set_angle (-90);
- the_notebook.append_page (_snapshots->widget (), *nlabel);
- nlabel = manage (new Label (_("Route Groups")));
- nlabel->set_angle (-90);
- the_notebook.append_page (_route_groups->widget (), *nlabel);
- nlabel = manage (new Label (_("Ranges & Marks")));
- nlabel->set_angle (-90);
- the_notebook.append_page (_locations->widget (), *nlabel);
-
- the_notebook.set_show_tabs (true);
- the_notebook.set_scrollable (true);
- the_notebook.popup_disable ();
- the_notebook.set_tab_pos (Gtk::POS_RIGHT);
- the_notebook.show_all ();
-
+ add_notebook_page (_("Regions"), _regions->widget ());
+ add_notebook_page (_("Tracks & Busses"), _routes->widget ());
+ add_notebook_page (_("Snapshots"), _snapshots->widget ());
+ add_notebook_page (_("Route Groups"), _route_groups->widget ());
+ add_notebook_page (_("Ranges & Marks"), _locations->widget ());
+
+ _the_notebook.set_show_tabs (true);
+ _the_notebook.set_scrollable (true);
+ _the_notebook.popup_disable ();
+ _the_notebook.set_tab_pos (Gtk::POS_RIGHT);
+ _the_notebook.show_all ();
+
post_maximal_editor_width = 0;
post_maximal_horizontal_pane_position = 0;
post_maximal_editor_height = 0;
post_maximal_vertical_pane_position = 0;
+ _notebook_shrunk = false;
editor_summary_pane.pack1(edit_packer);
summary_arrows_left_left->add (*manage (new Arrow (ARROW_LEFT, SHADOW_NONE)));
summary_arrows_left_left->signal_pressed().connect (sigc::hide_return (sigc::mem_fun (*this, &Editor::horizontal_scroll_left_press)));
summary_arrows_left_left->signal_released().connect (sigc::mem_fun (*this, &Editor::horizontal_scroll_left_release));
+
Button* summary_arrows_left_right = manage (new Button);
summary_arrows_left_right->add (*manage (new Arrow (ARROW_RIGHT, SHADOW_NONE)));
summary_arrows_left_right->signal_pressed().connect (sigc::hide_return (sigc::mem_fun (*this, &Editor::horizontal_scroll_right_press)));
summary_arrows_left_right->signal_released().connect (sigc::mem_fun (*this, &Editor::horizontal_scroll_right_release));
+
VBox* summary_arrows_left = manage (new VBox);
summary_arrows_left->pack_start (*summary_arrows_left_left);
summary_arrows_left->pack_start (*summary_arrows_left_right);
summary_arrows_right_left->add (*manage (new Arrow (ARROW_LEFT, SHADOW_NONE)));
summary_arrows_right_left->signal_pressed().connect (sigc::hide_return (sigc::mem_fun (*this, &Editor::horizontal_scroll_left_press)));
summary_arrows_right_left->signal_released().connect (sigc::mem_fun (*this, &Editor::horizontal_scroll_left_release));
+
Button* summary_arrows_right_right = manage (new Button);
summary_arrows_right_right->add (*manage (new Arrow (ARROW_RIGHT, SHADOW_NONE)));
summary_arrows_right_right->signal_pressed().connect (sigc::hide_return (sigc::mem_fun (*this, &Editor::horizontal_scroll_right_press)));
summary_arrows_right_right->signal_released().connect (sigc::mem_fun (*this, &Editor::horizontal_scroll_right_release));
+
VBox* summary_arrows_right = manage (new VBox);
summary_arrows_right->pack_start (*summary_arrows_right_left);
summary_arrows_right->pack_start (*summary_arrows_right_right);
Frame* summary_frame = manage (new Frame);
summary_frame->set_shadow_type (Gtk::SHADOW_ETCHED_IN);
+
summary_frame->add (*_summary);
summary_frame->show ();
editor_summary_pane.pack2 (_summary_hbox);
edit_pane.pack1 (editor_summary_pane, true, true);
- edit_pane.pack2 (the_notebook, false, true);
+ edit_pane.pack2 (_the_notebook, false, true);
editor_summary_pane.signal_size_allocate().connect (sigc::bind (sigc::mem_fun (*this, &Editor::pane_allocation_handler), static_cast<Paned*> (&editor_summary_pane)));
Glib::PropertyProxy<int> proxy = edit_pane.property_position();
proxy.signal_changed().connect (bind (sigc::ptr_fun (pane_size_watcher), static_cast<Paned*> (&edit_pane)));
#endif
- top_hbox.pack_start (toolbar_frame, false, true);
+ top_hbox.pack_start (toolbar_frame);
HBox *hbox = manage (new HBox);
hbox->pack_start (edit_pane, true, true);
void
Editor::show_window ()
{
- if (! is_visible ()) {
+ if (!is_visible ()) {
show_all ();
- /* re-hide editor list if necessary */
+ /* re-hide stuff if necessary */
editor_list_button_toggled ();
-
- /* re-hide summary widget if necessary */
parameter_changed ("show-summary");
-
parameter_changed ("show-edit-group-tabs");
+ parameter_changed ("show-zoom-tools");
/* now reset all audio_time_axis heights, because widgets might need
to be re-hidden
Location* loc = _session->locations()->auto_loop_location();
if (loc == 0) {
loc = new Location (*_session, 0, _session->current_end_frame(), _("Loop"),(Location::Flags) (Location::IsAutoLoop | Location::IsHidden));
+
if (loc->start() == loc->end()) {
loc->set_end (loc->start() + 1);
}
+
_session->locations()->add (loc, false);
_session->set_auto_loop_location (loc);
} else {
}
loc = _session->locations()->auto_punch_location();
+
if (loc == 0) {
loc = new Location (*_session, 0, _session->current_end_frame(), _("Punch"), (Location::Flags) (Location::IsAutoPunch | Location::IsHidden));
+
if (loc->start() == loc->end()) {
loc->set_end (loc->start() + 1);
}
+
_session->locations()->add (loc, false);
_session->set_auto_punch_location (loc);
} else {
region_edit_menu_split_item = 0;
region_edit_menu_split_multichannel_item = 0;
+ /* we might try to use items that are currently attached to a crossfade menu,
+ so clear that, too.
+ */
+ track_crossfade_context_menu.items().clear ();
+
RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (clicked_axisview);
if (rtv) {
boost::shared_ptr<Track> tr;
boost::shared_ptr<Playlist> pl;
- /* Don't offer a region submenu if we are in internal edit mode, as we don't select regions in this
- mode and so offering region context is somewhat confusing.
- */
- if ((tr = rtv->track()) && ((pl = tr->playlist())) && !internal_editing()) {
+ if ((tr = rtv->track()) && ((pl = tr->playlist()))) {
framepos_t const framepos = (framepos_t) floor ((double) get_preferred_edit_position() * tr->speed());
uint32_t regions_at = pl->count_regions_at (framepos);
add_region_context_items (edit_items, regions_at > 1);
MenuList& edit_items = track_crossfade_context_menu.items();
edit_items.clear ();
+ /* we might try to use items that are currently attached to a crossfade menu,
+ so clear that, too.
+ */
+ track_region_context_menu.items().clear ();
+
AudioTimeAxisView* atv = dynamic_cast<AudioTimeAxisView*> (clicked_axisview);
if (atv) {
}
}
- set_default_size (g.base_width, g.base_height);
+ //set_default_size (g.base_width, g.base_height);
move (x, y);
-
+
if (_session && (prop = node.property ("playhead"))) {
framepos_t pos;
sscanf (prop->value().c_str(), "%" PRIi64, &pos);
set_mouse_mode (MouseObject, true);
}
- if ((prop = node.property ("left-frame")) != 0){
+ if ((prop = node.property ("left-frame")) != 0) {
framepos_t pos;
if (sscanf (prop->value().c_str(), "%" PRId64, &pos) == 1) {
reset_x_origin (pos);
}
if ((prop = node.property (X_("editor-list-page")))) {
- the_notebook.set_current_page (atoi (prop->value ()));
+ _the_notebook.set_current_page (atoi (prop->value ()));
}
if ((prop = node.property (X_("show-marker-lines")))) {
geometry->add_property("y-off", string(buf));
snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast<Paned*>(&edit_pane)->gobj()));
geometry->add_property("edit-horizontal-pane-pos", string(buf));
+ geometry->add_property("notebook-shrunk", _notebook_shrunk ? "1" : "0");
+ snprintf(buf,sizeof(buf), "%d",pre_maximal_horizontal_pane_position);
+ geometry->add_property("pre-maximal-horizontal-pane-position", string(buf));
snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast<Paned*>(&editor_summary_pane)->gobj()));
geometry->add_property("edit-vertical-pane-pos", string(buf));
node->add_property (X_("show-editor-list"), tact->get_active() ? "yes" : "no");
}
- snprintf (buf, sizeof (buf), "%d", the_notebook.get_current_page ());
+ snprintf (buf, sizeof (buf), "%d", _the_notebook.get_current_page ());
node->add_property (X_("editor-list-page"), buf);
node->add_property (X_("show-marker-lines"), _show_marker_lines ? "yes" : "no");
mouse_mode_button_box->pack_start (mouse_audition_button);
mouse_mode_button_box->pack_start (internal_edit_button);
- vector<string> edit_mode_strings;
edit_mode_strings.push_back (edit_mode_to_string (Slide));
if (!Profile->get_sae()) {
edit_mode_strings.push_back (edit_mode_to_string (Splice));
toolbar_base.set_name ("ToolBarBase");
toolbar_base.add (toolbar_hbox);
+ _toolbar_viewport.add (toolbar_base);
+ /* stick to the required height but allow width to vary if there's not enough room */
+ _toolbar_viewport.set_size_request (1, -1);
+
toolbar_frame.set_shadow_type (SHADOW_OUT);
toolbar_frame.set_name ("BaseFrame");
- toolbar_frame.add (toolbar_base);
+ toolbar_frame.add (_toolbar_viewport);
+
+ DPIReset.connect (sigc::mem_fun (*this, &Editor::resize_text_widgets));
}
void
}
void
-Editor::commit_reversible_command ()
+Editor::begin_reversible_command (GQuark q)
{
if (_session) {
- _session->commit_reversible_command ();
+ _session->begin_reversible_command (q);
}
}
void
-Editor::set_route_group_solo (Route& route, bool yn)
-{
- RouteGroup *route_group;
-
- if ((route_group = route.route_group()) != 0) {
- route_group->apply (&Route::set_solo, yn, this);
- } else {
- route.set_solo (yn, this);
- }
-}
-
-void
-Editor::set_route_group_mute (Route& route, bool yn)
+Editor::commit_reversible_command ()
{
- RouteGroup *route_group = 0;
-
- if ((route_group = route.route_group()) != 0) {
- route_group->apply (&Route::set_mute, yn, this);
- } else {
- route.set_mute (yn, this);
+ if (_session) {
+ _session->commit_reversible_command ();
}
}
void
Editor::edit_mode_selection_done ()
{
- Config->set_edit_mode (string_to_edit_mode (edit_mode_selector.get_active_text ()));
+ string s = edit_mode_selector.get_active_text ();
+
+ if (!s.empty()) {
+ Config->set_edit_mode (string_to_edit_mode (s));
+ }
}
void
return;
}
+ if (geometry && (prop = geometry->property ("notebook-shrunk"))) {
+ _notebook_shrunk = string_is_affirmative (prop->value ());
+ }
+
+ if (geometry && (prop = geometry->property ("pre-maximal-horizontal-pane-position"))) {
+ pre_maximal_horizontal_pane_position = atoi (prop->value ());
+ }
+
if (!geometry || (prop = geometry->property ("edit-horizontal-pane-pos")) == 0) {
/* initial allocation is 90% to canvas, 10% to notebook */
pos = (int) floor (alloc.get_width() * 0.90f);
if (GTK_WIDGET(edit_pane.gobj())->allocation.width > pos) {
edit_pane.set_position (pos);
- pre_maximal_horizontal_pane_position = pos;
+ if (pre_maximal_horizontal_pane_position == 0) {
+ pre_maximal_horizontal_pane_position = pos;
+ }
}
done = (Pane) (done | Horizontal);
}
}
+/** @param yn true to follow playhead, otherwise false.
+ * @param catch_up true to reset the editor view to show the playhead (if yn == true), otherwise false.
+ */
void
-Editor::set_follow_playhead (bool yn)
+Editor::set_follow_playhead (bool yn, bool catch_up)
{
if (_follow_playhead != yn) {
- if ((_follow_playhead = yn) == true) {
+ if ((_follow_playhead = yn) == true && catch_up) {
/* catch up */
reset_x_origin_to_follow_playhead ();
}
if (Config->get_keep_tearoffs()) {
_mouse_mode_tearoff->set_visible (true);
_tools_tearoff->set_visible (true);
- _zoom_tearoff->set_visible (true);
+ if (Config->get_show_zoom_tools ()) {
+ _zoom_tearoff->set_visible (true);
+ }
}
}
_mouse_mode_tearoff->set_visible (true);
_tools_tearoff->set_visible (true);
- _zoom_tearoff->set_visible (true);
+ if (Config->get_show_zoom_tools ()) {
+ _zoom_tearoff->set_visible (true);
+ }
post_maximal_editor_width = this->get_width();
post_maximal_editor_height = this->get_height();
}
for (TrackViewList::const_iterator t = tracks->begin(); t != tracks->end(); ++t) {
+
RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*>(*t);
+
if (rtv) {
boost::shared_ptr<Track> tr;
boost::shared_ptr<Playlist> pl;
if ((tr = rtv->track()) && ((pl = tr->playlist()))) {
Playlist::RegionList* regions = pl->regions_at (
- (framepos_t) floor ( (double)where * tr->speed()));
+ (framepos_t) floor ( (double) where * tr->speed()));
for (Playlist::RegionList::iterator i = regions->begin(); i != regions->end(); ++i) {
RegionView* rv = rtv->view()->find_view (*i);
}
}
+/** Start with regions that are selected. Then add equivalent regions
+ * on tracks in the same active edit-enabled route group as any of
+ * the regions that we started with.
+ */
+
+RegionSelection
+Editor::get_regions_from_selection ()
+{
+ return get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id);
+}
+
/** Get regions using the following method:
*
* Make an initial region list using the selected regions, unless
for (RegionSelection::iterator i = regions.begin (); i != regions.end(); ++i) {
RouteGroup* g = (*i)->get_time_axis_view().route_group ();
+
if (g && g->is_active() && g->is_edit()) {
tracks.add (axis_views_from_routes (g->route_list()));
}
-
}
if (!tracks.empty()) {
return regions;
}
+/** Start with regions that are selected, or the entered regionview if none are selected.
+ * Then add equivalent regions on tracks in the same active edit-enabled route group as any
+ * of the regions that we started with.
+ */
RegionSelection
Editor::get_regions_from_selection_and_entered ()
{
- RegionSelection rs = selection->regions;
+ RegionSelection regions = selection->regions;
- if (rs.empty() && entered_regionview) {
- rs.add (entered_regionview);
+ if (regions.empty() && entered_regionview) {
+ regions.add (entered_regionview);
}
- return rs;
+ return get_equivalent_regions (regions, ARDOUR::Properties::edit.property_id);
}
void
_summary->set_dirty ();
}
+void
+Editor::region_view_removed ()
+{
+ _summary->set_dirty ();
+}
+
TimeAxisView*
Editor::axis_view_from_route (boost::shared_ptr<Route> r) const
{
RouteTimeAxisView *rtv;
list<RouteTimeAxisView*> new_views;
+ cerr << "Handle new route\n";
+
for (RouteList::iterator x = routes.begin(); x != routes.end(); ++x) {
boost::shared_ptr<Route> route = (*x);
rtv->effective_gain_display ();
rtv->view()->RegionViewAdded.connect (sigc::mem_fun (*this, &Editor::region_view_added));
+ rtv->view()->RegionViewRemoved.connect (sigc::mem_fun (*this, &Editor::region_view_removed));
}
_routes->routes_added (new_views);
+ _summary->routes_added (new_views);
if (show_editor_mixer_when_tracks_arrive) {
show_editor_mixer (true);
}
editor_list_button.set_sensitive (true);
-
- _summary->set_dirty ();
}
void
Editor::show_editor_list (bool yn)
{
if (yn) {
- the_notebook.show();
+ _the_notebook.show ();
} else {
- the_notebook.hide();
+ _the_notebook.hide ();
}
}
return *manage (a->create_menu_item ());
}
+void
+Editor::resize_text_widgets ()
+{
+ set_size_request_to_display_given_text (edit_mode_selector, edit_mode_strings, COMBO_FUDGE+10, 15);
+ set_size_request_to_display_given_text (zoom_focus_selector, zoom_focus_strings, COMBO_FUDGE+10, 15);
+ set_size_request_to_display_given_text (snap_type_selector, snap_type_strings, COMBO_FUDGE+10, 15);
+ set_size_request_to_display_given_text (snap_mode_selector, snap_mode_strings, COMBO_FUDGE+10, 15);
+ set_size_request_to_display_given_text (edit_point_selector, edit_point_strings, COMBO_FUDGE+10, 15);
+}
+
+void
+Editor::add_notebook_page (string const & name, Gtk::Widget& widget)
+{
+ EventBox* b = manage (new EventBox);
+ b->signal_button_press_event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::notebook_tab_clicked), &widget));
+ Label* l = manage (new Label (name));
+ l->set_angle (-90);
+ b->add (*l);
+ b->show_all ();
+ _the_notebook.append_page (widget, *b);
+}
+
+bool
+Editor::notebook_tab_clicked (GdkEventButton* ev, Gtk::Widget* page)
+{
+ if (ev->type == GDK_BUTTON_PRESS || ev->type == GDK_2BUTTON_PRESS) {
+ _the_notebook.set_current_page (_the_notebook.page_num (*page));
+ }
+
+ if (ev->type == GDK_2BUTTON_PRESS) {
+
+ /* double-click on a notebook tab shrinks or expands the notebook */
+
+ if (_notebook_shrunk) {
+ edit_pane.set_position (pre_maximal_horizontal_pane_position);
+ _notebook_shrunk = false;
+ } else {
+ pre_maximal_horizontal_pane_position = edit_pane.get_position ();
+ edit_pane.set_position (edit_pane.get_position() + page->get_width());
+ _notebook_shrunk = true;
+ }
+ }
+
+ return true;
+}
+