X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor.cc;h=864e2eab272e260a0f84ccfa6fa1301b7d4e8bb3;hb=91e6c1b176d93f43bab6713574c590ea97801bdc;hp=22a4f9e805f454fea9a426ef609797de52125474;hpb=ee76685f8d3cd04ffa5905def8f760aeda8faa10;p=ardour.git diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 22a4f9e805..864e2eab27 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -115,6 +115,8 @@ #include "editor_snapshots.h" #include "editor_summary.h" #include "region_layering_order_editor.h" +#include "mouse_cursors.h" +#include "editor_cursors.h" #include "i18n.h" @@ -136,8 +138,6 @@ using Gtkmm2ext::Keyboard; const double Editor::timebar_height = 15.0; -#include "editor_xpms" - static const gchar *_snap_type_strings[] = { N_("CD Frames"), N_("Timecode Frames"), @@ -207,45 +207,6 @@ static const gchar *_rb_opt_strings[] = { }; #endif -/* Soundfile drag-n-drop */ - -Gdk::Cursor* Editor::cross_hair_cursor = 0; -Gdk::Cursor* Editor::selector_cursor = 0; -Gdk::Cursor* Editor::trimmer_cursor = 0; -Gdk::Cursor* Editor::left_side_trim_cursor = 0; -Gdk::Cursor* Editor::right_side_trim_cursor = 0; -Gdk::Cursor* Editor::left_side_trim_right_only_cursor = 0; -Gdk::Cursor* Editor::right_side_trim_left_only_cursor = 0; -Gdk::Cursor* Editor::fade_in_cursor = 0; -Gdk::Cursor* Editor::fade_out_cursor = 0; -Gdk::Cursor* Editor::grabber_cursor = 0; -Gdk::Cursor* Editor::grabber_note_cursor = 0; -Gdk::Cursor* Editor::grabber_edit_point_cursor = 0; -Gdk::Cursor* Editor::zoom_in_cursor = 0; -Gdk::Cursor* Editor::zoom_out_cursor = 0; -Gdk::Cursor* Editor::time_fx_cursor = 0; -Gdk::Cursor* Editor::fader_cursor = 0; -Gdk::Cursor* Editor::speaker_cursor = 0; -Gdk::Cursor* Editor::midi_pencil_cursor = 0; -Gdk::Cursor* Editor::midi_select_cursor = 0; -Gdk::Cursor* Editor::midi_resize_cursor = 0; -Gdk::Cursor* Editor::midi_erase_cursor = 0; -Gdk::Cursor* Editor::wait_cursor = 0; -Gdk::Cursor* Editor::timebar_cursor = 0; -Gdk::Cursor* Editor::transparent_cursor = 0; -Gdk::Cursor* Editor::up_down_cursor = 0; -Gdk::Cursor* Editor::resize_left_cursor = 0; -Gdk::Cursor* Editor::resize_top_left_cursor = 0; -Gdk::Cursor* Editor::resize_top_cursor = 0; -Gdk::Cursor* Editor::resize_top_right_cursor = 0; -Gdk::Cursor* Editor::resize_right_cursor = 0; -Gdk::Cursor* Editor::resize_bottom_right_cursor = 0; -Gdk::Cursor* Editor::resize_bottom_cursor = 0; -Gdk::Cursor* Editor::resize_bottom_left_cursor = 0; -Gdk::Cursor* Editor::move_cursor = 0; -Gdk::Cursor* Editor::expand_left_right_cursor = 0; -Gdk::Cursor* Editor::expand_up_down_cursor = 0; - void show_me_the_size (Requisition* r, const char* what) { @@ -256,20 +217,20 @@ show_me_the_size (Requisition* r, const char* what) static void pane_size_watcher (Paned* pane) { - /* if the handle of a pane vanishes into (at least) the tabs of a notebook, - it is no longer accessible. so stop that. this doesn't happen on X11, - just the quartz backend. + /* if the handle of a pane vanishes into (at least) the tabs of a notebook, + it is no longer accessible. so stop that. this doesn't happen on X11, + just the quartz backend. - ugh. - */ + ugh. + */ - int max_width_of_lhs = GTK_WIDGET(pane->gobj())->allocation.width - 25; + int max_width_of_lhs = GTK_WIDGET(pane->gobj())->allocation.width - 25; - gint pos = pane->get_position (); + gint pos = pane->get_position (); - if (pos > max_width_of_lhs) { - pane->set_position (max_width_of_lhs); - } + if (pos > max_width_of_lhs) { + pane->set_position (max_width_of_lhs); + } } #endif @@ -280,7 +241,7 @@ Editor::Editor () , 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")) @@ -304,6 +265,7 @@ Editor::Editor () , 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 @@ -377,7 +339,6 @@ Editor::Editor () 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; @@ -401,7 +362,7 @@ Editor::Editor () _dragging_edit_point = false; select_new_marker = false; rhythm_ferret = 0; - layering_order_editor = 0; + layering_order_editor = 0; _bundle_manager = 0; no_save_visual = false; resize_idle_id = -1; @@ -446,12 +407,12 @@ Editor::Editor () 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); @@ -459,30 +420,35 @@ Editor::Editor () 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); @@ -492,11 +458,14 @@ Editor::Editor () 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)); @@ -516,15 +485,16 @@ Editor::Editor () 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)); - build_cursors (); + _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); @@ -573,34 +543,23 @@ Editor::Editor () _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); @@ -608,10 +567,12 @@ Editor::Editor () 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); @@ -620,16 +581,19 @@ Editor::Editor () 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 (); @@ -640,7 +604,7 @@ Editor::Editor () 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 (&editor_summary_pane))); @@ -648,10 +612,10 @@ Editor::Editor () edit_pane.signal_size_allocate().connect (sigc::bind (sigc::mem_fun(*this, &Editor::pane_allocation_handler), static_cast (&edit_pane))); #ifdef GTKOSX - Glib::PropertyProxy proxy = edit_pane.property_position(); - proxy.signal_changed().connect (bind (sigc::ptr_fun (pane_size_watcher), static_cast (&edit_pane))); + Glib::PropertyProxy proxy = edit_pane.property_position(); + proxy.signal_changed().connect (bind (sigc::ptr_fun (pane_size_watcher), static_cast (&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); @@ -849,16 +813,14 @@ Editor::set_entered_track (TimeAxisView* tav) 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 @@ -1124,12 +1086,11 @@ Editor::set_session (Session *t) but use Gtkmm2ext::UI::instance()->call_slot(); */ - _session->StepEditStatusChange.connect (_session_connections, invalidator (*this), ui_bind(&Editor::step_edit_status_change, this, _1), gui_context()); + _session->StepEditStatusChange.connect (_session_connections, invalidator (*this), ui_bind(&Editor::step_edit_status_change, this, _1), gui_context()); _session->TransportStateChange.connect (_session_connections, invalidator (*this), boost::bind (&Editor::map_transport_state, this), gui_context()); _session->PositionChanged.connect (_session_connections, invalidator (*this), ui_bind (&Editor::map_position_change, this, _1), gui_context()); _session->RouteAdded.connect (_session_connections, invalidator (*this), ui_bind (&Editor::handle_new_route, this, _1), gui_context()); _session->DirtyChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::update_title, this), gui_context()); - _session->TimecodeOffsetChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::update_just_timecode, this), gui_context()); _session->tempo_map().PropertyChanged.connect (_session_connections, invalidator (*this), ui_bind (&Editor::tempo_map_changed, this, _1), gui_context()); _session->Located.connect (_session_connections, invalidator (*this), boost::bind (&Editor::located, this), gui_context()); _session->config.ParameterChanged.connect (_session_connections, invalidator (*this), ui_bind (&Editor::parameter_changed, this, _1), gui_context()); @@ -1141,11 +1102,11 @@ Editor::set_session (Session *t) _session->history().Changed.connect (_session_connections, invalidator (*this), boost::bind (&Editor::history_changed, this), gui_context()); if (Profile->get_sae()) { - BBT_Time bbt; + Timecode::BBT_Time bbt; bbt.bars = 0; bbt.beats = 0; bbt.ticks = 120; - nframes_t pos = _session->tempo_map().bbt_duration_at (0, bbt, 1); + framepos_t pos = _session->tempo_map().bbt_duration_at (0, bbt, 1); nudge_clock.set_mode(AudioClock::BBT); nudge_clock.set (pos, true, 0, AudioClock::BBT); @@ -1158,9 +1119,11 @@ Editor::set_session (Session *t) 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 { @@ -1169,11 +1132,14 @@ Editor::set_session (Session *t) } 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 { @@ -1236,169 +1202,6 @@ Editor::action_pre_activated (Glib::RefPtr const & a) } } -void -Editor::build_cursors () -{ - using namespace Gdk; - - { - Glib::RefPtr zoom_in_cursor_pixbuf (::get_icon ("zoom_in_cursor")); - zoom_in_cursor = new Gdk::Cursor (Gdk::Display::get_default(), zoom_in_cursor_pixbuf, 5, 5); - } - - { - Glib::RefPtr zoom_out_cursor_pixbuf (::get_icon ("zoom_out_cursor")); - zoom_out_cursor = new Gdk::Cursor (Gdk::Display::get_default(), zoom_out_cursor_pixbuf, 5, 5); - } - - Gdk::Color fbg ("#ffffff" ); - Gdk::Color ffg ("#000000" ); - - { - RefPtr source, mask; - - source = Bitmap::create (fader_cursor_bits, fader_cursor_width, fader_cursor_height); - mask = Bitmap::create (fader_cursor_mask_bits, fader_cursor_width, fader_cursor_height); - fader_cursor = new Gdk::Cursor (source, mask, ffg, fbg, fader_cursor_x_hot, fader_cursor_y_hot); - } - - { - RefPtr source, mask; - source = Bitmap::create (speaker_cursor_bits, speaker_cursor_width, speaker_cursor_height); - mask = Bitmap::create (speaker_cursor_mask_bits, speaker_cursor_width, speaker_cursor_height); - speaker_cursor = new Gdk::Cursor (source, mask, ffg, fbg, speaker_cursor_x_hot, speaker_cursor_y_hot); - } - - { - RefPtr bits; - char pix[4] = { 0, 0, 0, 0 }; - bits = Bitmap::create (pix, 2, 2); - Gdk::Color c; - transparent_cursor = new Gdk::Cursor (bits, bits, c, c, 0, 0); - } - - { - RefPtr bits; - char pix[4] = { 0, 0, 0, 0 }; - bits = Bitmap::create (pix, 2, 2); - Gdk::Color c; - transparent_cursor = new Gdk::Cursor (bits, bits, c, c, 0, 0); - } - - { - Glib::RefPtr grabber_pixbuf (::get_icon ("grabber")); - grabber_cursor = new Gdk::Cursor (Gdk::Display::get_default(), grabber_pixbuf, 5, 0); - } - - { - Glib::RefPtr grabber_note_pixbuf (::get_icon ("grabber_note")); - grabber_note_cursor = new Gdk::Cursor (Gdk::Display::get_default(), grabber_note_pixbuf, 5, 10); - } - - { - Glib::RefPtr grabber_edit_point_pixbuf (::get_icon ("grabber_edit_point")); - grabber_edit_point_cursor = new Gdk::Cursor (Gdk::Display::get_default(), grabber_edit_point_pixbuf, 5, 17); - } - - cross_hair_cursor = new Gdk::Cursor (CROSSHAIR); - trimmer_cursor = new Gdk::Cursor (SB_H_DOUBLE_ARROW); - - { - Glib::RefPtr apixbuf (::get_icon ("trim_left_cursor")); - left_side_trim_cursor = new Gdk::Cursor (Gdk::Display::get_default(), apixbuf, 5, 11); - } - - { - Glib::RefPtr apixbuf (::get_icon ("trim_right_cursor")); - right_side_trim_cursor = new Gdk::Cursor (Gdk::Display::get_default(), apixbuf, 23, 11); - } - - { - Glib::RefPtr apixbuf (::get_icon ("trim_left_cursor_right_only")); - left_side_trim_right_only_cursor = new Gdk::Cursor (Gdk::Display::get_default(), apixbuf, 5, 11); - } - - { - Glib::RefPtr apixbuf (::get_icon ("trim_right_cursor_left_only")); - right_side_trim_left_only_cursor = new Gdk::Cursor (Gdk::Display::get_default(), apixbuf, 23, 11); - } - - { - Glib::RefPtr apixbuf (::get_icon ("fade_in_cursor")); - fade_in_cursor = new Gdk::Cursor (Gdk::Display::get_default(), apixbuf, 0, 0); - } - - { - Glib::RefPtr apixbuf (::get_icon ("fade_out_cursor")); - fade_out_cursor = new Gdk::Cursor (Gdk::Display::get_default(), apixbuf, 29, 0); - } - - { - Glib::RefPtr p (::get_icon ("resize_left_cursor")); - resize_left_cursor = new Gdk::Cursor (Gdk::Display::get_default(), p, 3, 10); - } - - { - Glib::RefPtr p (::get_icon ("resize_top_left_cursor")); - resize_top_left_cursor = new Gdk::Cursor (Gdk::Display::get_default(), p, 3, 3); - } - - { - Glib::RefPtr p (::get_icon ("resize_top_cursor")); - resize_top_cursor = new Gdk::Cursor (Gdk::Display::get_default(), p, 10, 3); - } - - { - Glib::RefPtr p (::get_icon ("resize_top_right_cursor")); - resize_top_right_cursor = new Gdk::Cursor (Gdk::Display::get_default(), p, 18, 3); - } - - { - Glib::RefPtr p (::get_icon ("resize_right_cursor")); - resize_right_cursor = new Gdk::Cursor (Gdk::Display::get_default(), p, 24, 10); - } - - { - Glib::RefPtr p (::get_icon ("resize_bottom_right_cursor")); - resize_bottom_right_cursor = new Gdk::Cursor (Gdk::Display::get_default(), p, 18, 18); - } - - { - Glib::RefPtr p (::get_icon ("resize_bottom_cursor")); - resize_bottom_cursor = new Gdk::Cursor (Gdk::Display::get_default(), p, 10, 24); - } - - { - Glib::RefPtr p (::get_icon ("resize_bottom_left_cursor")); - resize_bottom_left_cursor = new Gdk::Cursor (Gdk::Display::get_default(), p, 3, 18); - } - - { - Glib::RefPtr p (::get_icon ("move_cursor")); - move_cursor = new Gdk::Cursor (Gdk::Display::get_default(), p, 11, 11); - } - - { - Glib::RefPtr p (::get_icon ("expand_left_right_cursor")); - expand_left_right_cursor = new Gdk::Cursor (Gdk::Display::get_default(), p, 11, 4); - } - - { - Glib::RefPtr p (::get_icon ("expand_up_down_cursor")); - expand_up_down_cursor = new Gdk::Cursor (Gdk::Display::get_default(), p, 4, 11); - } - - selector_cursor = new Gdk::Cursor (XTERM); - time_fx_cursor = new Gdk::Cursor (SIZING); - wait_cursor = new Gdk::Cursor (WATCH); - timebar_cursor = new Gdk::Cursor(LEFT_PTR); - midi_pencil_cursor = new Gdk::Cursor (PENCIL); - midi_select_cursor = new Gdk::Cursor (CENTER_PTR); - midi_resize_cursor = new Gdk::Cursor (SIZING); - midi_erase_cursor = new Gdk::Cursor (DRAPED_BOX); - up_down_cursor = new Gdk::Cursor (Gdk::SB_V_DOUBLE_ARROW); -} - /** Pop up a context menu for when the user clicks on a fade in or fade out */ void Editor::popup_fade_context_menu (int button, int32_t time, ArdourCanvas::Item* item, ItemType item_type) @@ -1610,8 +1413,8 @@ Editor::popup_track_context_menu (int button, int32_t time, ItemType item_type, case RegionItem: case RegionViewName: case RegionViewNameHighlight: - case LeftFrameHandle: - case RightFrameHandle: + case LeftFrameHandle: + case RightFrameHandle: if (!with_selection) { if (region_edit_menu_split_item) { if (clicked_regionview && clicked_regionview->region()->covers (get_preferred_edit_position())) { @@ -1720,19 +1523,21 @@ Editor::build_track_region_context_menu () 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 (clicked_axisview); if (rtv) { boost::shared_ptr tr; boost::shared_ptr 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()) { - 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); + 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); } } @@ -1748,6 +1553,11 @@ Editor::build_track_crossfade_context_menu () 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 (clicked_axisview); if (atv) { @@ -1769,7 +1579,7 @@ Editor::build_track_crossfade_context_menu () framepos_t 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); + add_region_context_items (edit_items, regions_at > 1); } } @@ -1912,7 +1722,7 @@ Editor::add_region_context_items (Menu_Helpers::MenuList& edit_items, bool multi } if (_popup_region_menu_item == 0) { - _popup_region_menu_item = new MenuItem (menu_item_name); + _popup_region_menu_item = manage (new MenuItem (menu_item_name)); _popup_region_menu_item->set_submenu (*dynamic_cast (ActionManager::get_widget (X_("/PopupRegionMenu")))); _popup_region_menu_item->show (); } else { @@ -1947,7 +1757,7 @@ Editor::add_selection_context_items (Menu_Helpers::MenuList& edit_items) } edit_items.push_back (SeparatorElem()); - edit_items.push_back (MenuElem (_("Convert to region in-place"), mem_fun(*this, &Editor::separate_region_from_selection))); + edit_items.push_back (MenuElem (_("Convert to Region In-Place"), mem_fun(*this, &Editor::separate_region_from_selection))); edit_items.push_back (MenuElem (_("Convert to Region in Region List"), sigc::mem_fun(*this, &Editor::new_region_from_selection))); edit_items.push_back (SeparatorElem()); @@ -2303,12 +2113,12 @@ Editor::set_state (const XMLNode& node, int /*version*/) } } - 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); + sscanf (prop->value().c_str(), "%" PRIi64, &pos); playhead_cursor->set_position (pos); } else { playhead_cursor->set_position (0); @@ -2343,7 +2153,7 @@ Editor::set_state (const XMLNode& node, int /*version*/) 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); @@ -2396,17 +2206,17 @@ Editor::set_state (const XMLNode& node, int /*version*/) } } - if ((prop = node.property ("stationary-playhead"))) { - bool yn = (prop->value() == "yes"); - set_stationary_playhead (yn); - RefPtr act = ActionManager::get_action (X_("Editor"), X_("toggle-stationary-playhead")); - if (act) { - RefPtr tact = RefPtr::cast_dynamic(act); - if (tact->get_active() != yn) { - tact->set_active (yn); - } - } - } + if ((prop = node.property ("stationary-playhead"))) { + bool yn = (prop->value() == "yes"); + set_stationary_playhead (yn); + RefPtr act = ActionManager::get_action (X_("Editor"), X_("toggle-stationary-playhead")); + if (act) { + RefPtr tact = RefPtr::cast_dynamic(act); + if (tact->get_active() != yn) { + tact->set_active (yn); + } + } + } if ((prop = node.property ("region-list-sort-type"))) { RegionListSortType st; @@ -2448,7 +2258,7 @@ Editor::set_state (const XMLNode& node, int /*version*/) } 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")))) { @@ -2503,6 +2313,9 @@ Editor::get_state () geometry->add_property("y-off", string(buf)); snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast(&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(&editor_summary_pane)->gobj())); geometry->add_property("edit-vertical-pane-pos", string(buf)); @@ -2531,7 +2344,7 @@ Editor::get_state () node->add_property ("show-measures", _show_measures ? "yes" : "no"); node->add_property ("follow-playhead", _follow_playhead ? "yes" : "no"); - node->add_property ("stationary-playhead", _stationary_playhead ? "yes" : "no"); + node->add_property ("stationary-playhead", _stationary_playhead ? "yes" : "no"); node->add_property ("xfades-visible", _xfade_visibility ? "yes" : "no"); node->add_property ("region-list-sort-type", enum_2_string (_regions->sort_type ())); node->add_property ("mouse-mode", enum2str(mouse_mode)); @@ -2550,7 +2363,7 @@ Editor::get_state () 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"); @@ -2631,11 +2444,10 @@ Editor::timecode_snap_to_internal (framepos_t& start, int32_t direction, bool /* break; case SnapToTimecodeSeconds: - if (_session->timecode_offset_negative()) - { - start += _session->timecode_offset (); + if (_session->config.get_timecode_offset_negative()) { + start += _session->config.get_timecode_offset (); } else { - start -= _session->timecode_offset (); + start -= _session->config.get_timecode_offset (); } if (((direction == 0) && (start % one_timecode_second > one_timecode_second / 2)) || direction > 0) { start = (framepos_t) ceil ((double) start / one_timecode_second) * one_timecode_second; @@ -2643,31 +2455,28 @@ Editor::timecode_snap_to_internal (framepos_t& start, int32_t direction, bool /* start = (framepos_t) floor ((double) start / one_timecode_second) * one_timecode_second; } - if (_session->timecode_offset_negative()) - { - start -= _session->timecode_offset (); + if (_session->config.get_timecode_offset_negative()) { + start -= _session->config.get_timecode_offset (); } else { - start += _session->timecode_offset (); + start += _session->config.get_timecode_offset (); } break; case SnapToTimecodeMinutes: - if (_session->timecode_offset_negative()) - { - start += _session->timecode_offset (); + if (_session->config.get_timecode_offset_negative()) { + start += _session->config.get_timecode_offset (); } else { - start -= _session->timecode_offset (); + start -= _session->config.get_timecode_offset (); } if (((direction == 0) && (start % one_timecode_minute > one_timecode_minute / 2)) || direction > 0) { start = (framepos_t) ceil ((double) start / one_timecode_minute) * one_timecode_minute; } else { start = (framepos_t) floor ((double) start / one_timecode_minute) * one_timecode_minute; } - if (_session->timecode_offset_negative()) - { - start -= _session->timecode_offset (); + if (_session->config.get_timecode_offset_negative()) { + start -= _session->config.get_timecode_offset (); } else { - start += _session->timecode_offset (); + start += _session->config.get_timecode_offset (); } break; default: @@ -2890,7 +2699,6 @@ Editor::setup_toolbar () mouse_mode_button_box->pack_start (mouse_audition_button); mouse_mode_button_box->pack_start (internal_edit_button); - vector 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)); @@ -2913,13 +2721,13 @@ Editor::setup_toolbar () } _mouse_mode_tearoff->Detach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast(&toolbar_hbox), - &_mouse_mode_tearoff->tearoff_window())); + &_mouse_mode_tearoff->tearoff_window())); _mouse_mode_tearoff->Attach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast (&toolbar_hbox), - &_mouse_mode_tearoff->tearoff_window(), 1)); + &_mouse_mode_tearoff->tearoff_window(), 1)); _mouse_mode_tearoff->Hidden.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast(&toolbar_hbox), - &_mouse_mode_tearoff->tearoff_window())); + &_mouse_mode_tearoff->tearoff_window())); _mouse_mode_tearoff->Visible.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast (&toolbar_hbox), - &_mouse_mode_tearoff->tearoff_window(), 1)); + &_mouse_mode_tearoff->tearoff_window(), 1)); mouse_move_button.set_mode (false); mouse_select_button.set_mode (false); @@ -3046,13 +2854,13 @@ Editor::setup_toolbar () } _tools_tearoff->Detach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast(&toolbar_hbox), - &_tools_tearoff->tearoff_window())); + &_tools_tearoff->tearoff_window())); _tools_tearoff->Attach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast (&toolbar_hbox), - &_tools_tearoff->tearoff_window(), 0)); + &_tools_tearoff->tearoff_window(), 0)); _tools_tearoff->Hidden.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast(&toolbar_hbox), - &_tools_tearoff->tearoff_window())); + &_tools_tearoff->tearoff_window())); _tools_tearoff->Visible.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast (&toolbar_hbox), - &_tools_tearoff->tearoff_window(), 0)); + &_tools_tearoff->tearoff_window(), 0)); toolbar_hbox.set_spacing (10); toolbar_hbox.set_border_width (1); @@ -3070,9 +2878,15 @@ Editor::setup_toolbar () 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 @@ -3282,34 +3096,18 @@ Editor::begin_reversible_command (string name) } 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 (); } } @@ -3452,8 +3250,8 @@ Editor::show_verbose_canvas_cursor_with (const string & txt, int32_t xoffset, in track_canvas->get_pointer (x, y); track_canvas->window_to_world (x, y, wx, wy); - wx += xoffset; - wy += yoffset; + wx += xoffset; + wy += yoffset; /* don't get too close to the edge */ verbose_canvas_cursor->property_x() = clamp_verbose_cursor_x (wx); @@ -3506,7 +3304,11 @@ Editor::cycle_edit_mode () 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 @@ -3756,6 +3558,14 @@ Editor::pane_allocation_handler (Allocation &alloc, Paned* which) 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); @@ -3766,7 +3576,9 @@ Editor::pane_allocation_handler (Allocation &alloc, Paned* which) 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); @@ -3835,11 +3647,14 @@ Editor::toggle_follow_playhead () } } +/** @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 (); } @@ -3850,24 +3665,24 @@ Editor::set_follow_playhead (bool yn) void Editor::toggle_stationary_playhead () { - RefPtr act = ActionManager::get_action (X_("Editor"), X_("toggle-stationary-playhead")); - if (act) { - RefPtr tact = RefPtr::cast_dynamic(act); - set_stationary_playhead (tact->get_active()); - } + RefPtr act = ActionManager::get_action (X_("Editor"), X_("toggle-stationary-playhead")); + if (act) { + RefPtr tact = RefPtr::cast_dynamic(act); + set_stationary_playhead (tact->get_active()); + } } void Editor::set_stationary_playhead (bool yn) { - if (_stationary_playhead != yn) { - if ((_stationary_playhead = yn) == true) { - /* catch up */ - // FIXME need a 3.0 equivalent of this 2.X call - // update_current_screen (); - } - instant_save (); - } + if (_stationary_playhead != yn) { + if ((_stationary_playhead = yn) == true) { + /* catch up */ + // FIXME need a 3.0 equivalent of this 2.X call + // update_current_screen (); + } + instant_save (); + } } void @@ -4169,7 +3984,9 @@ Editor::maximise_editing_space () 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); + } } } @@ -4191,7 +4008,9 @@ Editor::restore_editing_space () _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(); @@ -4686,7 +4505,9 @@ Editor::get_regions_at (RegionSelection& rs, framepos_t where, const TrackViewLi } for (TrackViewList::const_iterator t = tracks->begin(); t != tracks->end(); ++t) { + RouteTimeAxisView* rtv = dynamic_cast(*t); + if (rtv) { boost::shared_ptr tr; boost::shared_ptr pl; @@ -4694,7 +4515,7 @@ Editor::get_regions_at (RegionSelection& rs, framepos_t where, const TrackViewLi 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); @@ -4729,7 +4550,7 @@ Editor::get_regions_after (RegionSelection& rs, framepos_t where, const TrackVie if ((tr = rtv->track()) && ((pl = tr->playlist()))) { Playlist::RegionList* regions = pl->regions_touched ( - (framepos_t) floor ( (double)where * tr->speed()), max_framepos); + (framepos_t) floor ( (double)where * tr->speed()), max_framepos); for (Playlist::RegionList::iterator i = regions->begin(); i != regions->end(); ++i) { @@ -4746,74 +4567,96 @@ Editor::get_regions_after (RegionSelection& rs, framepos_t where, const TrackVie } } -/** Get regions using the following conditions: - * 1. If the edit point is `mouse': - * if the mouse is over a selected region, or no region, return all selected regions. - * if the mouse is over an unselected region, return just that region. - * 2. For all other edit points: - * return the selected regions AND those that are both under the edit position - * AND on a selected track, or on a track which is in the same active edit-enabled route group - * as a selected region. +/** 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 + * the edit point is `mouse' and the mouse is over an unselected + * region. In this case, start with just that region. * - * The rationale here is that the mouse edit point is special in that its position describes - * both a time and a track; the other edit modes only describe a time. + * Then, make an initial track list of the tracks that these + * regions are on, and if the edit point is not `mouse', add the + * selected tracks. * - * @param rs Returned region list. + * Look at this track list and add any other tracks that are on the + * same active edit-enabled route group as one of the initial tracks. + * + * Finally take the initial region list and add any regions that are + * under the edit point on one of the tracks on the track list to get + * the returned region list. + * + * The rationale here is that the mouse edit point is special in that + * its position describes both a time and a track; the other edit + * modes only describe a time. Hence if the edit point is `mouse' we + * ignore selected tracks, as we assume the user means something by + * pointing at a particular track. Also in this case we take note of + * the region directly under the edit point, as there is always just one + * (rather than possibly several with non-mouse edit points). */ RegionSelection Editor::get_regions_from_selection_and_edit_point () { - if (_edit_point == EditAtMouse) { - if (entered_regionview == 0 || selection->regions.contains (entered_regionview)) { - return selection->regions; - } else { - RegionSelection rs; - rs.add (entered_regionview); - return rs; - } + RegionSelection regions; + + if (_edit_point == EditAtMouse && entered_regionview && !selection->regions.contains (entered_regionview)) { + regions.add (entered_regionview); + } else { + regions = selection->regions; } - /* We're using the edit point, but its not EditAtMouse */ + TrackViewList tracks; - /* Start with selected regions */ - RegionSelection rs = selection->regions; - - TrackViewList tracks = selection->tracks; + if (_edit_point != EditAtMouse) { + tracks = selection->tracks; + } - /* Tracks is currently the set of selected tracks; add any other tracks that - have regions that are in the same edit-activated route group as one of - our regions. + /* Add any other tracks that have regions that are in the same + edit-activated route group as one of our regions. */ - for (RegionSelection::iterator i = rs.begin (); i != rs.end(); ++i) { + 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()) { /* now find regions that are at the edit position on those tracks */ framepos_t const where = get_preferred_edit_position (); - get_regions_at (rs, where, tracks); + get_regions_at (regions, where, tracks); } - return rs; + 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 @@ -4944,7 +4787,7 @@ Editor::idle_resize () } } - _pending_resize_amount = 0; + _pending_resize_amount = 0; flush_canvas (); _group_tabs->set_dirty (); resize_idle_id = -1; @@ -4972,6 +4815,12 @@ Editor::region_view_added (RegionView *) _summary->set_dirty (); } +void +Editor::region_view_removed () +{ + _summary->set_dirty (); +} + TimeAxisView* Editor::axis_view_from_route (boost::shared_ptr r) const { @@ -5012,6 +4861,8 @@ Editor::handle_new_route (RouteList& routes) RouteTimeAxisView *rtv; list new_views; + cerr << "Handle new route\n"; + for (RouteList::iterator x = routes.begin(); x != routes.end(); ++x) { boost::shared_ptr route = (*x); @@ -5035,17 +4886,17 @@ Editor::handle_new_route (RouteList& routes) 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 @@ -5225,11 +5076,11 @@ Editor::show_region_in_region_list () void Editor::step_edit_status_change (bool yn) { - if (yn) { - start_step_editing (); - } else { - stop_step_editing (); - } + if (yn) { + start_step_editing (); + } else { + stop_step_editing (); + } } void @@ -5410,33 +5261,33 @@ Editor::super_rapid_screen_update () playhead_cursor->set_position (frame); } - if (!_stationary_playhead) { + if (!_stationary_playhead) { - if (!_dragging_playhead && _follow_playhead && _session->requested_return_frame() < 0) { - reset_x_origin_to_follow_playhead (); - } + if (!_dragging_playhead && _follow_playhead && _session->requested_return_frame() < 0) { + reset_x_origin_to_follow_playhead (); + } - } else { + } else { - /* don't do continuous scroll till the new position is in the rightmost quarter of the - editor canvas - */ + /* don't do continuous scroll till the new position is in the rightmost quarter of the + editor canvas + */ #if 0 - // FIXME DO SOMETHING THAT WORKS HERE - this is 2.X code - double target = ((double)frame - (double)current_page_frames()/2.0) / frames_per_unit; - if (target <= 0.0) { - target = 0.0; - } - if (fabs(target - current) < current_page_frames() / frames_per_unit) { - target = (target * 0.15) + (current * 0.85); - } else { - /* relax */ - } + // FIXME DO SOMETHING THAT WORKS HERE - this is 2.X code + double target = ((double)frame - (double)current_page_frames()/2.0) / frames_per_unit; + if (target <= 0.0) { + target = 0.0; + } + if (fabs(target - current) < current_page_frames() / frames_per_unit) { + target = (target * 0.15) + (current * 0.85); + } else { + /* relax */ + } - current = target; - set_horizontal_position (current); + current = target; + set_horizontal_position (current); #endif - } + } } } @@ -5519,9 +5370,9 @@ void Editor::show_editor_list (bool yn) { if (yn) { - the_notebook.show(); + _the_notebook.show (); } else { - the_notebook.hide(); + _the_notebook.hide (); } } @@ -5530,31 +5381,31 @@ Editor::change_region_layering_order () { framepos_t const position = get_preferred_edit_position (); - if (!clicked_routeview) { - if (layering_order_editor) { - layering_order_editor->hide (); - } + if (!clicked_routeview) { + if (layering_order_editor) { + layering_order_editor->hide (); + } return; } - boost::shared_ptr track = boost::dynamic_pointer_cast (clicked_routeview->route()); + boost::shared_ptr track = boost::dynamic_pointer_cast (clicked_routeview->route()); - if (!track) { - return; - } + if (!track) { + return; + } boost::shared_ptr pl = track->playlist(); if (!pl) { - return; - } + return; + } - if (layering_order_editor == 0) { - layering_order_editor = new RegionLayeringOrderEditor(*this); - } + if (layering_order_editor == 0) { + layering_order_editor = new RegionLayeringOrderEditor(*this); + } - layering_order_editor->set_context (clicked_routeview->name(), _session, pl, position); - layering_order_editor->maybe_present (); + layering_order_editor->set_context (clicked_routeview->name(), _session, pl, position); + layering_order_editor->maybe_present (); } void @@ -5592,3 +5443,49 @@ Editor::action_menu_item (std::string const & name) 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; +} +