diff --git a/gtk2_ardour/canvas-note-event.cc b/gtk2_ardour/canvas-note-event.cc index 77ef7b263f..74632d7ddf 100644 --- a/gtk2_ardour/canvas-note-event.cc +++ b/gtk2_ardour/canvas-note-event.cc @@ -212,6 +212,12 @@ CanvasNoteEvent::base_color() bool CanvasNoteEvent::on_event(GdkEvent* ev) { + PublicEditor& editor (_region.get_time_axis_view().editor()); + + if (!editor.internal_editing()) { + return false; + } + MidiStreamView *streamview = _region.midi_stream_view(); static uint8_t drag_delta_note = 0; static double drag_delta_x = 0; @@ -220,13 +226,6 @@ CanvasNoteEvent::on_event(GdkEvent* ev) bool select_mod; uint8_t d_velocity = 10; - if (_region.get_time_axis_view().editor().current_mouse_mode() != Editing::MouseNote) { - return false; - } - - const Editing::MidiEditMode midi_edit_mode - = _region.midi_view()->editor().current_midi_edit_mode(); - switch (ev->type) { case GDK_SCROLL: if (Keyboard::modifier_state_equals (ev->scroll.state, Keyboard::Level4Modifier)) { @@ -286,8 +285,7 @@ CanvasNoteEvent::on_event(GdkEvent* ev) switch (_state) { case Pressed: // Drag begin - if (midi_edit_mode == Editing::MidiEditSelect - && _region.mouse_state() != MidiRegionView::SelectTouchDragging) { + if (editor.current_mouse_mode() == Editing::MouseRange && _region.mouse_state() != MidiRegionView::SelectTouchDragging) { _item->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, Gdk::Cursor(Gdk::FLEUR), ev->motion.time); _state = Dragging; @@ -355,7 +353,7 @@ CanvasNoteEvent::on_event(GdkEvent* ev) switch (_state) { case Pressed: // Clicked - if (midi_edit_mode == Editing::MidiEditSelect) { + if (editor.current_mouse_mode() == Editing::MouseRange) { _state = None; if (_selected && !select_mod && _region.selection_size() > 1) { _region.unique_select(this); @@ -364,10 +362,12 @@ CanvasNoteEvent::on_event(GdkEvent* ev) } else { _region.note_selected(this, select_mod); } +#if 0 } else if (midi_edit_mode == Editing::MidiEditErase) { _region.start_delta_command(); _region.command_remove_note(this); _region.apply_command(); +#endif } return true; diff --git a/gtk2_ardour/canvas-note.cc b/gtk2_ardour/canvas-note.cc index 06234e3e55..f51a58ff5f 100644 --- a/gtk2_ardour/canvas-note.cc +++ b/gtk2_ardour/canvas-note.cc @@ -11,16 +11,21 @@ namespace Canvas { bool CanvasNote::on_event(GdkEvent* ev) { + PublicEditor& editor (_region.get_trackview().editor()); + + if (!editor.internal_editing()) { + return false; + } + double event_x; static double middle_point, last_x; Gdk::Cursor cursor; static NoteEnd note_end; - Editing::MidiEditMode edit_mode = _region.get_trackview().editor().current_midi_edit_mode(); switch (ev->type) { case GDK_BUTTON_PRESS: if (ev->button.button == 2 || - (ev->button.button == 1 && edit_mode == Editing::MidiEditResize)) { + (ev->button.button == 1 && editor.current_mouse_mode() == Editing::MouseTimeFX)) { double region_start = _region.get_position_pixels(); event_x = ev->button.x; middle_point = region_start + x1() + (x2() - x1()) / 2.0L; diff --git a/gtk2_ardour/editing.cc b/gtk2_ardour/editing.cc index 1e58fcddbc..cd1c820d61 100644 --- a/gtk2_ardour/editing.cc +++ b/gtk2_ardour/editing.cc @@ -115,25 +115,6 @@ const char *mousemodestrs[] = { #undef MOUSEMODE #define MOUSEMODE(a) /*empty*/ -// MIDIEDITMODE -#undef MIDIEDITMODE -#define MIDIEDITMODE(s) if (!strcmp(type, #s)) {return s;} -MidiEditMode -str2midieditmode (const string & str) { - const char* type = str.c_str(); - #include "editing_syms.h" - return MidiEditSelect; -} - -#undef MIDIEDITMODE -#define MIDIEDITMODE(s) N_(#s), -const char *midieditmodestrs[] = { - #include "editing_syms.h" - 0 -}; -#undef MIDIEDITMODE -#define MIDIEDITMODE(a) /*empty*/ - // ZOOMFOCUS #undef ZOOMFOCUS #define ZOOMFOCUS(s) if (!strcmp(type, #s)) {return s;} diff --git a/gtk2_ardour/editing_syms.h b/gtk2_ardour/editing_syms.h index 1717a3228c..7b3e87db16 100644 --- a/gtk2_ardour/editing_syms.h +++ b/gtk2_ardour/editing_syms.h @@ -59,12 +59,6 @@ MOUSEMODE(MouseRange) MOUSEMODE(MouseTimeFX) MOUSEMODE(MouseZoom) MOUSEMODE(MouseAudition) -MOUSEMODE(MouseNote) - -MIDIEDITMODE(MidiEditPencil) -MIDIEDITMODE(MidiEditSelect) -MIDIEDITMODE(MidiEditResize) -MIDIEDITMODE(MidiEditErase) /* Changing this order will break the menu */ ZOOMFOCUS(ZoomFocusLeft) diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index f1da5c6dcf..c1ee69ef2d 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -211,50 +211,47 @@ show_me_the_size (Requisition* r, const char* what) } Editor::Editor () - : /* time display buttons */ - - minsec_label (_("Mins:Secs")), - bbt_label (_("Bars:Beats")), - smpte_label (_("Timecode")), - frame_label (_("Samples")), - tempo_label (_("Tempo")), - meter_label (_("Meter")), - mark_label (_("Location Markers")), - range_mark_label (_("Range Markers")), - transport_mark_label (_("Loop/Punch Ranges")), - cd_mark_label (_("CD Markers")), - edit_packer (4, 4, true), + : minsec_label (_("Mins:Secs")) + , bbt_label (_("Bars:Beats")) + , smpte_label (_("Timecode")) + , frame_label (_("Samples")) + , tempo_label (_("Tempo")) + , meter_label (_("Meter")) + , mark_label (_("Location Markers")) + , range_mark_label (_("Range Markers")) + , transport_mark_label (_("Loop/Punch Ranges")) + , cd_mark_label (_("CD Markers")) + , edit_packer (4, 4, true) /* the values here don't matter: layout widgets reset them as needed. */ - - vertical_adjustment (0.0, 0.0, 10.0, 400.0), - horizontal_adjustment (0.0, 0.0, 20.0, 1200.0), - + + , vertical_adjustment (0.0, 0.0, 10.0, 400.0) + , horizontal_adjustment (0.0, 0.0, 20.0, 1200.0) + /* tool bar related */ - edit_point_clock (X_("editpoint"), false, X_("EditPointClock"), true), - zoom_range_clock (X_("zoomrange"), false, X_("ZoomRangeClock"), true, true), + , edit_point_clock (X_("editpoint"), false, X_("EditPointClock"), true) + , zoom_range_clock (X_("zoomrange"), false, X_("ZoomRangeClock"), true, true) - toolbar_selection_clock_table (2,3), + , toolbar_selection_clock_table (2,3) + + , automation_mode_button (_("mode")) + , global_automation_button (_("automation")) + + , midi_panic_button (_("Panic")) - automation_mode_button (_("mode")), - global_automation_button (_("automation")), - - midi_panic_button (_("Panic")), - midi_tools_tearoff (0), - #ifdef WITH_CMT - image_socket_listener(0), + , image_socket_listener(0) #endif - + /* nudge */ - - nudge_clock (X_("nudge"), false, X_("NudgeClock"), true, true), - meters_running(false), - _pending_locate_request (false) + + , nudge_clock (X_("nudge"), false, X_("NudgeClock"), true, true) + , meters_running(false) + , _pending_locate_request (false) { constructed = false; @@ -328,8 +325,6 @@ Editor::Editor () region_edit_menu_split_item = 0; temp_location = 0; leftmost_frame = 0; - ignore_mouse_mode_toggle = false; - ignore_midi_edit_mode_toggle = false; current_stepping_trackview = 0; entered_track = 0; entered_regionview = 0; @@ -363,9 +358,9 @@ Editor::Editor () location_loop_color = ARDOUR_UI::config()->canvasvar_LocationLoop.get(); location_punch_color = ARDOUR_UI::config()->canvasvar_LocationPunch.get(); - set_midi_edit_mode (MidiEditPencil, true); _edit_point = EditAtMouse; - set_mouse_mode (MouseObject, true); + _internal_editing = false; + current_canvas_cursor = 0; frames_per_unit = 2048; /* too early to use reset_zoom () */ reset_hscrollbar_stepping (); @@ -589,7 +584,6 @@ Editor::Editor () edit_pane.signal_size_allocate().connect (bind (mem_fun(*this, &Editor::pane_allocation_handler), static_cast (&edit_pane))); top_hbox.pack_start (toolbar_frame, false, true); - top_hbox.pack_start (midi_toolbar_frame, false, true); HBox *hbox = manage (new HBox); hbox->pack_start (edit_pane, true, true); @@ -616,6 +610,7 @@ Editor::Editor () snap_mode = SnapOff; set_snap_mode (snap_mode); set_edit_point_preference (EditAtMouse, true); + set_mouse_mode (MouseObject, true); XMLNode* node = ARDOUR_UI::instance()->editor_settings(); set_state (*node); @@ -2785,36 +2780,13 @@ Editor::setup_toolbar () /* Mode Buttons (tool selection) */ - vector mouse_mode_buttons; - - mouse_move_button.add (*(manage (new Image (::get_icon("tool_object"))))); mouse_move_button.set_relief(Gtk::RELIEF_NONE); - mouse_mode_buttons.push_back (&mouse_move_button); - - if (!Profile->get_sae()) { - mouse_select_button.add (*(manage (new Image (get_xpm("tool_range.xpm"))))); - mouse_select_button.set_relief(Gtk::RELIEF_NONE); - mouse_mode_buttons.push_back (&mouse_select_button); - - mouse_gain_button.add (*(manage (new Image (::get_icon("tool_gain"))))); - mouse_gain_button.set_relief(Gtk::RELIEF_NONE); - mouse_mode_buttons.push_back (&mouse_gain_button); - } - - mouse_zoom_button.add (*(manage (new Image (::get_icon("tool_zoom"))))); + mouse_select_button.set_relief(Gtk::RELIEF_NONE); + mouse_gain_button.set_relief(Gtk::RELIEF_NONE); mouse_zoom_button.set_relief(Gtk::RELIEF_NONE); - mouse_mode_buttons.push_back (&mouse_zoom_button); - mouse_timefx_button.add (*(manage (new Image (::get_icon("tool_stretch"))))); mouse_timefx_button.set_relief(Gtk::RELIEF_NONE); - mouse_mode_buttons.push_back (&mouse_timefx_button); - mouse_audition_button.add (*(manage (new Image (::get_icon("tool_audition"))))); mouse_audition_button.set_relief(Gtk::RELIEF_NONE); - mouse_note_button.add (*(manage (new Image (::get_icon("tool_note"))))); - mouse_note_button.set_relief(Gtk::RELIEF_NONE); - mouse_mode_buttons.push_back (&mouse_note_button); - mouse_mode_buttons.push_back (&mouse_audition_button); - - mouse_mode_button_set = new GroupedButtons (mouse_mode_buttons); + // internal_edit_button.set_relief(Gtk::RELIEF_NONE); HBox* mode_box = manage(new HBox); mode_box->set_border_width (2); @@ -2830,7 +2802,7 @@ Editor::setup_toolbar () } mouse_mode_button_box.pack_start(mouse_timefx_button, true, true); mouse_mode_button_box.pack_start(mouse_audition_button, true, true); - mouse_mode_button_box.pack_start(mouse_note_button, true, true); + mouse_mode_button_box.pack_start(internal_edit_button, true, true); mouse_mode_button_box.set_homogeneous(true); vector edit_mode_strings; @@ -2863,21 +2835,21 @@ Editor::setup_toolbar () mouse_mode_tearoff->Visible.connect (bind (mem_fun(*this, &Editor::reattach_tearoff), static_cast (&toolbar_hbox), &mouse_mode_tearoff->tearoff_window(), 1)); + mouse_move_button.set_mode (false); + mouse_select_button.set_mode (false); + mouse_gain_button.set_mode (false); + mouse_zoom_button.set_mode (false); + mouse_timefx_button.set_mode (false); + mouse_audition_button.set_mode (false); + mouse_move_button.set_name ("MouseModeButton"); mouse_select_button.set_name ("MouseModeButton"); mouse_gain_button.set_name ("MouseModeButton"); mouse_zoom_button.set_name ("MouseModeButton"); mouse_timefx_button.set_name ("MouseModeButton"); mouse_audition_button.set_name ("MouseModeButton"); - mouse_note_button.set_name ("MouseModeButton"); - ARDOUR_UI::instance()->tooltips().set_tip (mouse_move_button, _("Select/Move Objects")); - ARDOUR_UI::instance()->tooltips().set_tip (mouse_select_button, _("Select/Move Ranges")); - ARDOUR_UI::instance()->tooltips().set_tip (mouse_gain_button, _("Draw Gain Automation")); - ARDOUR_UI::instance()->tooltips().set_tip (mouse_zoom_button, _("Select Zoom Range")); - ARDOUR_UI::instance()->tooltips().set_tip (mouse_timefx_button, _("Stretch/Shrink Regions")); - ARDOUR_UI::instance()->tooltips().set_tip (mouse_audition_button, _("Listen to Specific Regions")); - ARDOUR_UI::instance()->tooltips().set_tip (mouse_note_button, _("Edit MIDI Notes")); + internal_edit_button.set_name ("MouseModeButton"); mouse_move_button.unset_flags (CAN_FOCUS); mouse_select_button.unset_flags (CAN_FOCUS); @@ -2885,20 +2857,7 @@ Editor::setup_toolbar () mouse_zoom_button.unset_flags (CAN_FOCUS); mouse_timefx_button.unset_flags (CAN_FOCUS); mouse_audition_button.unset_flags (CAN_FOCUS); - mouse_note_button.unset_flags (CAN_FOCUS); - - mouse_select_button.signal_toggled().connect (bind (mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseRange)); - mouse_select_button.signal_button_release_event().connect (mem_fun(*this, &Editor::mouse_select_button_release)); - - mouse_move_button.signal_toggled().connect (bind (mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseObject)); - mouse_gain_button.signal_toggled().connect (bind (mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseGain)); - mouse_zoom_button.signal_toggled().connect (bind (mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseZoom)); - mouse_timefx_button.signal_toggled().connect (bind (mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseTimeFX)); - mouse_audition_button.signal_toggled().connect (bind (mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseAudition)); - mouse_note_button.signal_toggled().connect (bind (mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseNote)); - - // mouse_move_button.set_active (true); - + internal_edit_button.unset_flags (CAN_FOCUS); /* Zoom */ @@ -3000,11 +2959,10 @@ Editor::setup_toolbar () toolbar_hbox.pack_start (*mouse_mode_tearoff, false, false); toolbar_hbox.pack_start (*tools_tearoff, false, false); - hbox->pack_start (snap_box, false, false); - // hbox->pack_start (zoom_box, false, false); hbox->pack_start (*nudge_box, false, false); + hbox->pack_start (panic_box, false, false); hbox->show_all (); @@ -3027,12 +2985,7 @@ Editor::midi_panic_button_pressed () void Editor::setup_midi_toolbar () { - string pixmap_path; - - /* Mode Buttons (tool selection) */ - - vector midi_tool_buttons; - +#if 0 midi_tool_pencil_button.add (*(manage (new Image (::get_icon("midi_tool_pencil"))))); midi_tool_pencil_button.set_relief(Gtk::RELIEF_NONE); midi_tool_buttons.push_back (&midi_tool_pencil_button); @@ -3046,42 +2999,11 @@ Editor::setup_midi_toolbar () midi_tool_erase_button.set_relief(Gtk::RELIEF_NONE); midi_tool_buttons.push_back (&midi_tool_erase_button); - midi_tool_pencil_button.set_active(true); - - midi_tool_button_set = new GroupedButtons (midi_tool_buttons); - - midi_tool_button_box.set_border_width (2); - midi_tool_button_box.set_spacing(1); - midi_tool_button_box.pack_start(midi_tool_pencil_button, true, true); - midi_tool_button_box.pack_start(midi_tool_select_button, true, true); - midi_tool_button_box.pack_start(midi_tool_resize_button, true, true); - midi_tool_button_box.pack_start(midi_tool_erase_button , true, true); - midi_tool_button_box.set_homogeneous(true); - - midi_tool_pencil_button.set_name ("MouseModeButton"); - midi_tool_select_button.set_name ("MouseModeButton"); - midi_tool_resize_button.set_name ("MouseModeButton"); - midi_tool_erase_button .set_name ("MouseModeButton"); - ARDOUR_UI::instance()->tooltips().set_tip (midi_tool_pencil_button, _("Add/Move/Stretch Notes")); ARDOUR_UI::instance()->tooltips().set_tip (midi_tool_select_button, _("Select/Move Notes")); ARDOUR_UI::instance()->tooltips().set_tip (midi_tool_resize_button, _("Resize Notes")); ARDOUR_UI::instance()->tooltips().set_tip (midi_tool_erase_button, _("Erase Notes")); - - midi_tool_pencil_button.unset_flags (CAN_FOCUS); - midi_tool_select_button.unset_flags (CAN_FOCUS); - midi_tool_resize_button.unset_flags (CAN_FOCUS); - midi_tool_erase_button.unset_flags (CAN_FOCUS); - - midi_tool_pencil_button.signal_toggled().connect (bind (mem_fun(*this, - &Editor::midi_edit_mode_toggled), Editing::MidiEditPencil)); - midi_tool_select_button.signal_toggled().connect (bind (mem_fun(*this, - &Editor::midi_edit_mode_toggled), Editing::MidiEditSelect)); - midi_tool_resize_button.signal_toggled().connect (bind (mem_fun(*this, - &Editor::midi_edit_mode_toggled), Editing::MidiEditResize)); - midi_tool_erase_button.signal_toggled().connect (bind (mem_fun(*this, - &Editor::midi_edit_mode_toggled), Editing::MidiEditErase)); - +#endif /* Midi sound notes */ midi_sound_notes.add (*(manage (new Image (::get_icon("midi_sound_notes"))))); @@ -3091,46 +3013,11 @@ Editor::setup_midi_toolbar () /* Panic */ - HBox* panic_box = manage (new HBox); midi_panic_button.set_name("MidiPanicButton"); - midi_panic_button.signal_pressed().connect ( - mem_fun(this, &Editor::midi_panic_button_pressed)); - panic_box->pack_start (midi_sound_notes , true, true); - panic_box->pack_start (midi_panic_button, true, true); - - /* Pack everything in... */ + midi_panic_button.signal_pressed().connect (mem_fun(this, &Editor::midi_panic_button_pressed)); - midi_tools_tearoff = manage (new TearOff (midi_tool_button_box)); - midi_tools_tearoff->set_name ("MouseModeBase"); - - /* - midi_tools_tearoff->Detach.connect (bind (mem_fun(*this, &Editor::detach_tearoff), static_cast(&midi_toolbar_hbox), - &midi_tools_tearoff->tearoff_window())); - midi_tools_tearoff->Attach.connect (bind (mem_fun(*this, &Editor::reattach_tearoff), static_cast (&midi_toolbar_hbox), - &midi_tools_tearoff->tearoff_window(), 0)); - midi_tools_tearoff->Hidden.connect (bind (mem_fun(*this, &Editor::detach_tearoff), static_cast(&midi_toolbar_hbox), - &midi_tools_tearoff->tearoff_window())); - midi_tools_tearoff->Visible.connect (bind (mem_fun(*this, &Editor::reattach_tearoff), static_cast (&midi_toolbar_hbox), - &midi_tools_tearoff->tearoff_window(), 0)); - */ - - midi_toolbar_hbox.set_spacing (10); - midi_toolbar_hbox.set_border_width (1); - - midi_toolbar_hbox.pack_start (*midi_tools_tearoff, false, true); - - midi_toolbar_hbox.pack_start(*panic_box, false, true, 4); - - midi_tool_button_box.show_all (); - midi_toolbar_hbox.show_all(); - midi_tools_tearoff->show_all(); - - midi_toolbar_base.set_name ("ToolBarBase"); - midi_toolbar_base.add (midi_toolbar_hbox); - - midi_toolbar_frame.set_shadow_type (SHADOW_OUT); - midi_toolbar_frame.set_name ("BaseFrame"); - midi_toolbar_frame.add (midi_toolbar_base); + panic_box.pack_start (midi_sound_notes , true, true); + panic_box.pack_start (midi_panic_button, true, true); } int @@ -3812,6 +3699,8 @@ Editor::pane_allocation_handler (Allocation &alloc, Paned* which) void Editor::detach_tearoff (Box* /*b*/, Window* /*w*/) { + cerr << "remove tearoff\n"; + if (tools_tearoff->torn_off() && mouse_mode_tearoff->torn_off()) { top_hbox.remove (toolbar_frame); @@ -3821,6 +3710,7 @@ Editor::detach_tearoff (Box* /*b*/, Window* /*w*/) void Editor::reattach_tearoff (Box* /*b*/, Window* /*w*/, int32_t /*n*/) { + cerr << "reattach tearoff\n"; if (toolbar_frame.get_parent() == 0) { top_hbox.pack_end (toolbar_frame); } diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 5e2bb980e1..b4ab0898be 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -184,10 +184,10 @@ class Editor : public PublicEditor void set_mouse_mode (Editing::MouseMode, bool force=true); void step_mouse_mode (bool next); Editing::MouseMode current_mouse_mode () const { return mouse_mode; } - - void set_midi_edit_cursor (Editing::MidiEditMode); - void set_midi_edit_mode (Editing::MidiEditMode, bool force=true); - Editing::MidiEditMode current_midi_edit_mode () const { return midi_edit_mode; } + Editing::MidiEditMode current_midi_edit_mode () const; + + bool internal_editing() const { return _internal_editing ; } + void set_internal_edit (bool yn); #ifdef WITH_CMT void add_imageframe_time_axis(const std::string & track_name, void*) ; @@ -467,8 +467,8 @@ class Editor : public PublicEditor void post_zoom (); Editing::MouseMode mouse_mode; - Editing::MidiEditMode midi_edit_mode; - + bool _internal_editing; + int post_maximal_editor_width; int post_maximal_pane_position; int pre_maximal_pane_position; @@ -1513,17 +1513,19 @@ public: Gtk::HBox mouse_mode_button_box; Gtkmm2ext::TearOff* mouse_mode_tearoff; - Gtk::ToggleButton mouse_select_button; - Gtk::ToggleButton mouse_move_button; - Gtk::ToggleButton mouse_gain_button; - Gtk::ToggleButton mouse_zoom_button; - Gtk::ToggleButton mouse_timefx_button; - Gtk::ToggleButton mouse_audition_button; - Gtk::ToggleButton mouse_note_button; - GroupedButtons *mouse_mode_button_set; + Gtk::ToggleButton mouse_select_button; + Gtk::ToggleButton mouse_move_button; + Gtk::ToggleButton mouse_gain_button; + Gtk::ToggleButton mouse_zoom_button; + Gtk::ToggleButton mouse_timefx_button; + Gtk::ToggleButton mouse_audition_button; + void mouse_mode_toggled (Editing::MouseMode m); bool ignore_mouse_mode_toggle; + Gtk::ToggleButton internal_edit_button; + void toggle_internal_editing (); + gint mouse_select_button_release (GdkEventButton*); Gtk::VBox automation_box; @@ -1578,25 +1580,12 @@ public: /* midi toolbar */ - Gtk::HBox midi_tool_button_box; - Gtk::ToggleButton midi_tool_pencil_button; - Gtk::ToggleButton midi_tool_select_button; - Gtk::ToggleButton midi_tool_resize_button; - Gtk::ToggleButton midi_tool_erase_button; + Gtk::HBox panic_box; Gtk::Button midi_panic_button; Gtk::ToggleButton midi_sound_notes; - GroupedButtons *midi_tool_button_set; - void midi_edit_mode_toggled (Editing::MidiEditMode m); void midi_panic_button_pressed (); bool sound_notes () const { return midi_sound_notes.get_active(); } - bool ignore_midi_edit_mode_toggle; - - Gtkmm2ext::TearOff* midi_tools_tearoff; - Gtk::HBox midi_toolbar_hbox; - Gtk::EventBox midi_toolbar_base; - Gtk::Frame midi_toolbar_frame; - void setup_midi_toolbar (); /* selection process */ diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index fa7619b78d..f6766c561f 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -17,6 +17,9 @@ */ +#include +#include + #include "ardour/ardour.h" #include "ardour/profile.h" @@ -661,15 +664,61 @@ Editor::register_actions () Glib::RefPtr mouse_mode_actions = ActionGroup::create (X_("MouseMode")); RadioAction::Group mouse_mode_group; - ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-object", _("Object Tool"), bind (mem_fun(*this, &Editor::set_mouse_mode), Editing::MouseObject, false)); - ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-range", _("Range Tool"), bind (mem_fun(*this, &Editor::set_mouse_mode), Editing::MouseRange, false)); - ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-gain", _("Gain Tool"), bind (mem_fun(*this, &Editor::set_mouse_mode), Editing::MouseGain, false)); - ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-zoom", _("Zoom Tool"), bind (mem_fun(*this, &Editor::set_mouse_mode), Editing::MouseZoom, false)); - ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-timefx", _("Timefx Tool"), bind (mem_fun(*this, &Editor::set_mouse_mode), Editing::MouseTimeFX, false)); - ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-note", _("Note Tool"), bind (mem_fun(*this, &Editor::set_mouse_mode), Editing::MouseNote, false)); + ARDOUR_UI::instance()->tooltips().set_tip (mouse_move_button, _("Select/Move Objects")); + ARDOUR_UI::instance()->tooltips().set_tip (mouse_select_button, _("Select/Move Ranges")); + ARDOUR_UI::instance()->tooltips().set_tip (mouse_gain_button, _("Draw Gain Automation")); + ARDOUR_UI::instance()->tooltips().set_tip (mouse_zoom_button, _("Select Zoom Range")); + ARDOUR_UI::instance()->tooltips().set_tip (mouse_timefx_button, _("Stretch/Shrink Regions")); + ARDOUR_UI::instance()->tooltips().set_tip (mouse_audition_button, _("Listen to Specific Regions")); + /* in the future, this may allow other kinds of "intra-region" editing, but for now its just MIDI */ + ARDOUR_UI::instance()->tooltips().set_tip (internal_edit_button, _("Edit MIDI Notes")); + cerr << "Registering mouse mode actions\n"; + + act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-object", _("Object Tool"), bind (mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseObject)); + act->connect_proxy (mouse_move_button); + mouse_move_button.set_image (*(manage (new Image (::get_icon("tool_object"))))); + mouse_move_button.set_label (""); + mouse_move_button.set_name ("MouseModeButton"); + + act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-range", _("Range Tool"), bind (mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseRange)); + act->connect_proxy (mouse_select_button); + mouse_select_button.set_image (*(manage (new Image (::get_xpm("tool_range.xpm"))))); + mouse_select_button.set_label (""); + mouse_select_button.set_name ("MouseModeButton"); + + act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-gain", _("Gain Tool"), bind (mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseGain)); + act->connect_proxy (mouse_gain_button); + mouse_gain_button.set_image (*(manage (new Image (::get_icon("tool_gain"))))); + mouse_gain_button.set_label (""); + mouse_gain_button.set_name ("MouseModeButton"); + + act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-zoom", _("Zoom Tool"), bind (mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseZoom)); + act->connect_proxy (mouse_zoom_button); + mouse_zoom_button.set_image (*(manage (new Image (::get_icon("tool_zoom"))))); + mouse_zoom_button.set_label (""); + mouse_zoom_button.set_name ("MouseModeButton"); + + act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-audition", _("Audition Tool"), bind (mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseAudition)); + act->connect_proxy (mouse_audition_button); + mouse_audition_button.set_image (*(manage (new Image (::get_icon("tool_audition"))))); + mouse_audition_button.set_label (""); + mouse_audition_button.set_name ("MouseModeButton"); + + act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-timefx", _("Timefx Tool"), bind (mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseTimeFX)); + act->connect_proxy (mouse_timefx_button); + mouse_timefx_button.set_image (*(manage (new Image (::get_icon("tool_stretch"))))); + mouse_timefx_button.set_label (""); + mouse_timefx_button.set_name ("MouseModeButton"); + ActionManager::register_action (editor_actions, "step-mouse-mode", _("Step Mouse Mode"), bind (mem_fun(*this, &Editor::step_mouse_mode), true)); + act = ActionManager::register_toggle_action (mouse_mode_actions, "toggle-internal-edit", _("Edit MIDI"), mem_fun(*this, &Editor::toggle_internal_editing)); + act->connect_proxy (internal_edit_button); + internal_edit_button.set_image (*(manage (new Image (::get_icon("tool_note"))))); + internal_edit_button.set_label (""); + internal_edit_button.set_name ("MouseModeButton"); + RadioAction::Group edit_point_group; ActionManager::register_radio_action (editor_actions, edit_point_group, X_("edit-at-playhead"), _("Playhead"), (bind (mem_fun(*this, &Editor::edit_point_chosen), Editing::EditAtPlayhead))); ActionManager::register_radio_action (editor_actions, edit_point_group, X_("edit-at-mouse"), _("Mouse"), (bind (mem_fun(*this, &Editor::edit_point_chosen), Editing::EditAtPlayhead))); @@ -1342,3 +1391,12 @@ Editor::reset_canvas_action_sensitivity (bool onoff) } } +void +Editor::toggle_internal_editing () +{ + Glib::RefPtr act = ActionManager::get_action (X_("MouseMode"), X_("toggle-internal-edit")); + if (act) { + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + set_internal_edit (tact->get_active()); + } +} diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc index d340da71f9..b99189218a 100644 --- a/gtk2_ardour/editor_canvas.cc +++ b/gtk2_ardour/editor_canvas.cc @@ -432,7 +432,9 @@ Editor::controls_layout_size_request (Requisition* req) bool Editor::track_canvas_map_handler (GdkEventAny* /*ev*/) { - track_canvas->get_window()->set_cursor (*current_canvas_cursor); + if (current_canvas_cursor) { + track_canvas->get_window()->set_cursor (*current_canvas_cursor); + } return false; } diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 16e19bcfd6..aea06d6410 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -26,12 +26,14 @@ #include #include "pbd/error.h" +#include "pbd/enumwriter.h" #include #include #include "pbd/memento_command.h" #include "pbd/basename.h" #include "ardour_ui.h" +#include "actions.h" #include "editor.h" #include "time_axis_view.h" #include "audio_time_axis.h" @@ -163,105 +165,92 @@ Editor::event_frame (GdkEvent const * event, double* pcx, double* pcy) const return pixel_to_frame (*pcx); } -void -Editor::mouse_mode_toggled (MouseMode m) -{ - if (ignore_mouse_mode_toggle) { - return; - } - - switch (m) { - case MouseRange: - if (mouse_select_button.get_active()) { - set_mouse_mode (m); - } - break; - - case MouseObject: - if (mouse_move_button.get_active()) { - set_mouse_mode (m); - } - break; - - case MouseGain: - if (mouse_gain_button.get_active()) { - set_mouse_mode (m); - } - break; - - case MouseZoom: - if (mouse_zoom_button.get_active()) { - set_mouse_mode (m); - } - break; - - case MouseTimeFX: - if (mouse_timefx_button.get_active()) { - set_mouse_mode (m); - } - break; - - case MouseAudition: - if (mouse_audition_button.get_active()) { - set_mouse_mode (m); - } - break; - - case MouseNote: - if (mouse_note_button.get_active()) { - set_mouse_mode (m); - } - break; - - default: - break; - } -} - Gdk::Cursor* Editor::which_grabber_cursor () { - switch (_edit_point) { - case EditAtMouse: - return grabber_edit_point_cursor; - break; - default: - break; + Gdk::Cursor* c = grabber_cursor; + + if (_internal_editing) { + switch (mouse_mode) { + case MouseObject: + c = midi_pencil_cursor; + break; + + case MouseRange: + c = midi_select_cursor; + break; + + case MouseTimeFX: + c = midi_resize_cursor; + break; + + default: + break; + } + + } else { + + switch (_edit_point) { + case EditAtMouse: + c = grabber_edit_point_cursor; + break; + default: + break; + } } - return grabber_cursor; + + return c; } void Editor::set_canvas_cursor () { - switch (mouse_mode) { - case MouseRange: - current_canvas_cursor = selector_cursor; - break; + if (_internal_editing) { - case MouseObject: - current_canvas_cursor = which_grabber_cursor(); - break; + switch (mouse_mode) { + case MouseObject: + current_canvas_cursor = midi_pencil_cursor; + break; + + case MouseRange: + current_canvas_cursor = midi_select_cursor; + break; + + case MouseTimeFX: + current_canvas_cursor = midi_resize_cursor; + break; - case MouseGain: - current_canvas_cursor = cross_hair_cursor; - break; + default: + return; + } - case MouseZoom: - current_canvas_cursor = zoom_cursor; - break; + } else { - case MouseTimeFX: - current_canvas_cursor = time_fx_cursor; // just use playhead - break; - - case MouseAudition: - current_canvas_cursor = speaker_cursor; - break; - - case MouseNote: - set_midi_edit_cursor (current_midi_edit_mode()); - break; + switch (mouse_mode) { + case MouseRange: + current_canvas_cursor = selector_cursor; + break; + + case MouseObject: + current_canvas_cursor = which_grabber_cursor(); + break; + + case MouseGain: + current_canvas_cursor = cross_hair_cursor; + break; + + case MouseZoom: + current_canvas_cursor = zoom_cursor; + break; + + case MouseTimeFX: + current_canvas_cursor = time_fx_cursor; // just use playhead + break; + + case MouseAudition: + current_canvas_cursor = speaker_cursor; + break; + } } if (is_drawable()) { @@ -279,7 +268,45 @@ Editor::set_mouse_mode (MouseMode m, bool force) if (!force && m == mouse_mode) { return; } - + + Glib::RefPtr act; + + switch (m) { + case MouseRange: + act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-range")); + break; + + case MouseObject: + act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-object")); + break; + + case MouseGain: + act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-gain")); + break; + + case MouseZoom: + act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-zoom")); + break; + + case MouseTimeFX: + act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-timefx")); + break; + + case MouseAudition: + act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-audition")); + break; + } + + assert (act); + + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (act); + assert (tact); + tact->set_active (true); +} + +void +Editor::mouse_mode_toggled (MouseMode m) +{ mouse_mode = m; instant_save (); @@ -310,54 +337,6 @@ Editor::set_mouse_mode (MouseMode m, bool force) } } - /* XXX the hack of unsetting all other buttons should go - away once GTK2 allows us to use regular radio buttons drawn like - normal buttons, rather than my silly GroupedButton hack. - */ - - ignore_mouse_mode_toggle = true; - - switch (mouse_mode) { - case MouseRange: - mouse_select_button.set_active (true); - break; - - case MouseObject: - mouse_move_button.set_active (true); - break; - - case MouseGain: - mouse_gain_button.set_active (true); - break; - - case MouseZoom: - mouse_zoom_button.set_active (true); - break; - - case MouseTimeFX: - mouse_timefx_button.set_active (true); - break; - - case MouseAudition: - mouse_audition_button.set_active (true); - break; - - case MouseNote: - mouse_note_button.set_active (true); - set_midi_edit_cursor (current_midi_edit_mode()); - break; - } - - if (midi_tools_tearoff) { - if (mouse_mode == MouseNote) { - midi_tools_tearoff->show(); - } else { - midi_tools_tearoff->hide(); - } - } - - ignore_mouse_mode_toggle = false; - set_canvas_cursor (); } @@ -419,113 +398,6 @@ Editor::step_mouse_mode (bool next) if (next) set_mouse_mode (MouseObject); else set_mouse_mode (MouseTimeFX); break; - - case MouseNote: - if (next) set_mouse_mode (MouseObject); - else set_mouse_mode (MouseAudition); - break; - } -} - -void -Editor::midi_edit_mode_toggled (MidiEditMode m) -{ - if (ignore_midi_edit_mode_toggle) { - return; - } - - switch (m) { - case MidiEditPencil: - if (midi_tool_pencil_button.get_active()) - set_midi_edit_mode (m); - break; - - case MidiEditSelect: - if (midi_tool_select_button.get_active()) - set_midi_edit_mode (m); - break; - - case MidiEditResize: - if (midi_tool_resize_button.get_active()) - set_midi_edit_mode (m); - break; - - case MidiEditErase: - if (midi_tool_erase_button.get_active()) - set_midi_edit_mode (m); - break; - - default: - break; - } - - set_midi_edit_cursor(m); -} - - -void -Editor::set_midi_edit_mode (MidiEditMode m, bool force) -{ - if (_drag) { - return; - } - - if (!force && m == midi_edit_mode) { - return; - } - - midi_edit_mode = m; - - instant_save (); - - ignore_midi_edit_mode_toggle = true; - - switch (midi_edit_mode) { - case MidiEditPencil: - midi_tool_pencil_button.set_active (true); - break; - - case MidiEditSelect: - midi_tool_select_button.set_active (true); - break; - - case MidiEditResize: - midi_tool_resize_button.set_active (true); - break; - - case MidiEditErase: - midi_tool_erase_button.set_active (true); - break; - } - - ignore_midi_edit_mode_toggle = false; - - set_midi_edit_cursor (current_midi_edit_mode()); - - if (is_drawable()) { - track_canvas->get_window()->set_cursor(*current_canvas_cursor); - } -} - -void -Editor::set_midi_edit_cursor (MidiEditMode) -{ - switch (midi_edit_mode) { - case MidiEditPencil: - current_canvas_cursor = midi_pencil_cursor; - break; - - case MidiEditSelect: - current_canvas_cursor = midi_select_cursor; - break; - - case MidiEditResize: - current_canvas_cursor = midi_resize_cursor; - break; - - case MidiEditErase: - current_canvas_cursor = midi_erase_cursor; - break; } } @@ -766,107 +638,187 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp } } - switch (mouse_mode) { - case MouseRange: - switch (item_type) { - case StartSelectionTrimItem: - assert (_drag == 0); - _drag = new SelectionDrag (this, item, SelectionDrag::SelectionStartTrim); - _drag->start_grab (event); - break; - - case EndSelectionTrimItem: - assert (_drag == 0); - _drag = new SelectionDrag (this, item, SelectionDrag::SelectionEndTrim); - _drag->start_grab (event); - break; - - case SelectionItem: - if (Keyboard::modifier_state_contains - (event->button.state, Keyboard::ModifierMask(Keyboard::SecondaryModifier))) { - // contains and not equals because I can't use alt as a modifier alone. - start_selection_grab (item, event); - } else if (Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) { - /* grab selection for moving */ + if (internal_editing()) { + assert (_drag == 0); + _drag = new RegionCreateDrag (this, item, clicked_axisview); + _drag->start_grab (event); + cerr << "--- DRAG START FOR RCD\n"; + } else { + switch (mouse_mode) { + case MouseRange: + switch (item_type) { + case StartSelectionTrimItem: assert (_drag == 0); - _drag = new SelectionDrag (this, item, SelectionDrag::SelectionMove); + _drag = new SelectionDrag (this, item, SelectionDrag::SelectionStartTrim); _drag->start_grab (event); - } else { - /* this was debated, but decided the more common action was to - make a new selection */ + break; + + case EndSelectionTrimItem: + assert (_drag == 0); + _drag = new SelectionDrag (this, item, SelectionDrag::SelectionEndTrim); + _drag->start_grab (event); + break; + + case SelectionItem: + if (Keyboard::modifier_state_contains + (event->button.state, Keyboard::ModifierMask(Keyboard::SecondaryModifier))) { + // contains and not equals because I can't use alt as a modifier alone. + start_selection_grab (item, event); + } else if (Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) { + /* grab selection for moving */ + assert (_drag == 0); + _drag = new SelectionDrag (this, item, SelectionDrag::SelectionMove); + _drag->start_grab (event); + } else { + /* this was debated, but decided the more common action was to + make a new selection */ + assert (_drag == 0); + _drag = new SelectionDrag (this, item, SelectionDrag::CreateSelection); + _drag->start_grab (event); + } + break; + + default: assert (_drag == 0); _drag = new SelectionDrag (this, item, SelectionDrag::CreateSelection); _drag->start_grab (event); } + return true; break; - - default: - assert (_drag == 0); - _drag = new SelectionDrag (this, item, SelectionDrag::CreateSelection); - _drag->start_grab (event); - } - return true; - break; - case MouseObject: - if (Keyboard::modifier_state_contains (event->button.state, Keyboard::ModifierMask(Keyboard::PrimaryModifier|Keyboard::SecondaryModifier)) && - event->type == GDK_BUTTON_PRESS) { + case MouseObject: + if (Keyboard::modifier_state_contains (event->button.state, Keyboard::ModifierMask(Keyboard::PrimaryModifier|Keyboard::SecondaryModifier)) && + event->type == GDK_BUTTON_PRESS) { - assert (_drag == 0); - _drag = new RubberbandSelectDrag (this, item); - _drag->start_grab (event); - - } else if (event->type == GDK_BUTTON_PRESS) { - - switch (item_type) { - case FadeInHandleItem: - { assert (_drag == 0); - RegionSelection s = get_equivalent_regions (selection->regions, RouteGroup::Edit); - _drag = new FadeInDrag (this, item, reinterpret_cast (item->get_data("regionview")), s); + _drag = new RubberbandSelectDrag (this, item); _drag->start_grab (event); - return true; - } - - case FadeOutHandleItem: - { - assert (_drag == 0); - RegionSelection s = get_equivalent_regions (selection->regions, RouteGroup::Edit); - _drag = new FadeOutDrag (this, item, reinterpret_cast (item->get_data("regionview")), s); - _drag->start_grab (event); - return true; - } - case RegionItem: - if (Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)) { - start_region_copy_grab (item, event, clicked_regionview); - } else if (Keyboard::the_keyboard().key_is_down (GDK_b)) { - start_region_brush_grab (item, event, clicked_regionview); - } else { - start_region_grab (item, event, clicked_regionview); + } else if (event->type == GDK_BUTTON_PRESS) { + + switch (item_type) { + case FadeInHandleItem: + { + assert (_drag == 0); + RegionSelection s = get_equivalent_regions (selection->regions, RouteGroup::Edit); + _drag = new FadeInDrag (this, item, reinterpret_cast (item->get_data("regionview")), s); + _drag->start_grab (event); + return true; } - break; - case RegionViewNameHighlight: - { + case FadeOutHandleItem: + { + assert (_drag == 0); + RegionSelection s = get_equivalent_regions (selection->regions, RouteGroup::Edit); + _drag = new FadeOutDrag (this, item, reinterpret_cast (item->get_data("regionview")), s); + _drag->start_grab (event); + return true; + } + + case RegionItem: + if (Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)) { + start_region_copy_grab (item, event, clicked_regionview); + } else if (Keyboard::the_keyboard().key_is_down (GDK_b)) { + start_region_brush_grab (item, event, clicked_regionview); + } else { + start_region_grab (item, event, clicked_regionview); + } + break; + + case RegionViewNameHighlight: + { + assert (_drag == 0); + RegionSelection s = get_equivalent_regions (selection->regions, RouteGroup::Edit); + _drag = new TrimDrag (this, item, clicked_regionview, s.by_layer()); + _drag->start_grab (event); + return true; + break; + } + + case RegionViewName: + { + /* rename happens on edit clicks */ + assert (_drag == 0); + RegionSelection s = get_equivalent_regions (selection->regions, RouteGroup::Edit); + _drag = new TrimDrag (this, clicked_regionview->get_name_highlight(), clicked_regionview, s.by_layer()); + _drag->start_grab (event); + return true; + break; + } + + case ControlPointItem: + assert (_drag == 0); + _drag = new ControlPointDrag (this, item); + _drag->start_grab (event); + return true; + break; + + case AutomationLineItem: + assert (_drag == 0); + _drag = new LineDrag (this, item); + _drag->start_grab (event); + return true; + break; + + case StreamItem: + case AutomationTrackItem: + assert (_drag == 0); + _drag = new RubberbandSelectDrag (this, item); + _drag->start_grab (event); + break; + +#ifdef WITH_CMT + case ImageFrameHandleStartItem: + imageframe_start_handle_op(item, event) ; + return(true) ; + break ; + case ImageFrameHandleEndItem: + imageframe_end_handle_op(item, event) ; + return(true) ; + break ; + case MarkerViewHandleStartItem: + markerview_item_start_handle_op(item, event) ; + return(true) ; + break ; + case MarkerViewHandleEndItem: + markerview_item_end_handle_op(item, event) ; + return(true) ; + break ; + case MarkerViewItem: + start_markerview_grab(item, event) ; + break ; + case ImageFrameItem: + start_imageframe_grab(item, event) ; + break ; +#endif + + case MarkerBarItem: + + break; + + default: + break; + } + } + return true; + break; + + case MouseGain: + switch (item_type) { + case RegionItem: + /* start a grab so that if we finish after moving + we can tell what happened. + */ assert (_drag == 0); - RegionSelection s = get_equivalent_regions (selection->regions, RouteGroup::Edit); - _drag = new TrimDrag (this, item, clicked_regionview, s.by_layer()); + _drag = new RegionGainDrag (this, item); + _drag->start_grab (event, current_canvas_cursor); + break; + + case GainLineItem: + assert (_drag == 0); + _drag = new LineDrag (this, item); _drag->start_grab (event); return true; - break; - } - - case RegionViewName: - { - /* rename happens on edit clicks */ - assert (_drag == 0); - RegionSelection s = get_equivalent_regions (selection->regions, RouteGroup::Edit); - _drag = new TrimDrag (this, clicked_regionview->get_name_highlight(), clicked_regionview, s.by_layer()); - _drag->start_grab (event); - return true; - break; - } case ControlPointItem: assert (_drag == 0); @@ -874,148 +826,69 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp _drag->start_grab (event); return true; break; - + + default: + break; + } + return true; + break; + + switch (item_type) { + case ControlPointItem: + assert (_drag == 0); + _drag = new ControlPointDrag (this, item); + _drag->start_grab (event); + break; + case AutomationLineItem: assert (_drag == 0); _drag = new LineDrag (this, item); _drag->start_grab (event); - return true; break; - case StreamItem: - case AutomationTrackItem: - assert (_drag == 0); - _drag = new RubberbandSelectDrag (this, item); - _drag->start_grab (event); - break; - -#ifdef WITH_CMT - case ImageFrameHandleStartItem: - imageframe_start_handle_op(item, event) ; - return(true) ; - break ; - case ImageFrameHandleEndItem: - imageframe_end_handle_op(item, event) ; - return(true) ; - break ; - case MarkerViewHandleStartItem: - markerview_item_start_handle_op(item, event) ; - return(true) ; - break ; - case MarkerViewHandleEndItem: - markerview_item_end_handle_op(item, event) ; - return(true) ; - break ; - case MarkerViewItem: - start_markerview_grab(item, event) ; - break ; - case ImageFrameItem: - start_imageframe_grab(item, event) ; - break ; -#endif - - case MarkerBarItem: - + case RegionItem: + // XXX need automation mode to identify which + // line to use + // start_line_grab_from_regionview (item, event); break; default: break; } - } - return true; - break; - - case MouseGain: - switch (item_type) { - case RegionItem: - /* start a grab so that if we finish after moving - we can tell what happened. - */ - assert (_drag == 0); - _drag = new RegionGainDrag (this, item); - _drag->start_grab (event, current_canvas_cursor); + return true; break; - case GainLineItem: - assert (_drag == 0); - _drag = new LineDrag (this, item); - _drag->start_grab (event); - return true; + case MouseZoom: + if (event->type == GDK_BUTTON_PRESS) { + assert (_drag == 0); + _drag = new MouseZoomDrag (this, item); + _drag->start_grab (event); + } - case ControlPointItem: - assert (_drag == 0); - _drag = new ControlPointDrag (this, item); - _drag->start_grab (event); return true; break; + case MouseTimeFX: + if (item_type == RegionItem) { + assert (_drag == 0); + _drag = new TimeFXDrag (this, item, clicked_regionview, selection->regions.by_layer()); + _drag->start_grab (event); + } + break; + + case MouseAudition: + _drag = new ScrubDrag (this, item); + _drag->start_grab (event); + scrub_reversals = 0; + scrub_reverse_distance = 0; + last_scrub_x = event->button.x; + scrubbing_direction = 0; + track_canvas->get_window()->set_cursor (*transparent_cursor); + break; + default: break; } - return true; - break; - - switch (item_type) { - case ControlPointItem: - assert (_drag == 0); - _drag = new ControlPointDrag (this, item); - _drag->start_grab (event); - break; - - case AutomationLineItem: - assert (_drag == 0); - _drag = new LineDrag (this, item); - _drag->start_grab (event); - break; - - case RegionItem: - // XXX need automation mode to identify which - // line to use - // start_line_grab_from_regionview (item, event); - break; - - default: - break; - } - return true; - break; - - case MouseZoom: - if (event->type == GDK_BUTTON_PRESS) { - assert (_drag == 0); - _drag = new MouseZoomDrag (this, item); - _drag->start_grab (event); - } - - return true; - break; - - case MouseTimeFX: - if (item_type == RegionItem) { - assert (_drag == 0); - _drag = new TimeFXDrag (this, item, clicked_regionview, selection->regions.by_layer()); - _drag->start_grab (event); - } - break; - - case MouseAudition: - _drag = new ScrubDrag (this, item); - _drag->start_grab (event); - scrub_reversals = 0; - scrub_reverse_distance = 0; - last_scrub_x = event->button.x; - scrubbing_direction = 0; - track_canvas->get_window()->set_cursor (*transparent_cursor); - break; - - case MouseNote: - assert (_drag == 0); - _drag = new RegionCreateDrag (this, item, clicked_axisview); - _drag->start_grab (event); - break; - - default: - break; } break; @@ -1119,6 +992,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT bool const r = _drag->end_grab (event); delete _drag; _drag = 0; + cerr << "DRAG DONE, r = " << r << endl; if (r) { /* grab dragged, so do nothing else */ return true; @@ -2669,3 +2543,10 @@ Editor::break_drag () _drag->break_drag (); } } + +void +Editor::set_internal_edit (bool yn) +{ + _internal_editing = yn; + set_canvas_cursor (); +} diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 8c20c02237..aa964749ff 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -195,6 +195,12 @@ MidiRegionView::init (Gdk::Color const & basic_color, bool wfd) bool MidiRegionView::canvas_event(GdkEvent* ev) { + PublicEditor& editor (trackview.editor()); + + if (!editor.internal_editing()) { + return false; + } + static double drag_start_x, drag_start_y; static double last_x, last_y; double event_x, event_y; @@ -202,11 +208,6 @@ MidiRegionView::canvas_event(GdkEvent* ev) static ArdourCanvas::SimpleRect* drag_rect = NULL; - if (trackview.editor().current_mouse_mode() != MouseNote) - return false; - - const Editing::MidiEditMode midi_edit_mode = trackview.editor().current_midi_edit_mode(); - switch (ev->type) { case GDK_KEY_PRESS: if (ev->key.keyval == GDK_Shift_L || ev->key.keyval == GDK_Control_L) { @@ -262,7 +263,7 @@ MidiRegionView::canvas_event(GdkEvent* ev) case Pressed: // Drag start // Select drag start - if (_pressed_button == 1 && midi_edit_mode == MidiEditSelect) { + if (_pressed_button == 1 && editor.current_mouse_mode() == MouseRange) { group->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, Gdk::Cursor(Gdk::FLEUR), ev->motion.time); last_x = event_x; @@ -285,7 +286,7 @@ MidiRegionView::canvas_event(GdkEvent* ev) return true; // Add note drag start - } else if (midi_edit_mode == MidiEditPencil) { + } else if (editor.current_mouse_mode() == MouseObject) { group->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, Gdk::Cursor(Gdk::FLEUR), ev->motion.time); last_x = event_x; @@ -365,12 +366,12 @@ MidiRegionView::canvas_event(GdkEvent* ev) switch (_mouse_state) { case Pressed: // Clicked - switch (midi_edit_mode) { - case MidiEditSelect: - case MidiEditResize: + switch (editor.current_mouse_mode()) { + case MouseRange: + case MouseTimeFX: clear_selection(); break; - case MidiEditPencil: + case MouseObject: create_note_at(event_x, event_y, _default_note_length); default: break; } diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index 7171edf98d..4d40e1c11e 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -150,19 +150,19 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulThingWithGoingAway * (defined in editing_syms.h) */ virtual Editing::MouseMode current_mouse_mode () const = 0; + + /** Switch into a mode in which editing is primarily focused on "within" regions, + rather than regions as black-box objects. For Ardour3, this is aimed at + editing MIDI regions but may expand in the future to other types of regions. + */ - /** Set the midi edit mode (pencil, select, eraser, etc.) - * @param m Midi edit mode (defined in editing_syms.h) - * @param force Perform the effects of the change even if no change is required - * (ie even if the current midi edit mode is equal to \ref m) + virtual void set_internal_edit (bool yn) = 0; + + /** @return Whether editing is currently in "internal" mode or not */ - virtual void set_midi_edit_mode (Editing::MidiEditMode m, bool force = false) = 0; - - /** @return The current mouse mode (gain, object, range, timefx etc.) - * (defined in editing_syms.h) - */ - virtual Editing::MidiEditMode current_midi_edit_mode () const = 0; - + + virtual bool internal_editing() const = 0; + /** @return Sound edited notes in MIDI regions while editing */ virtual bool sound_notes () const = 0; diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc index df922c2d62..7a1c9c6968 100644 --- a/gtk2_ardour/utils.cc +++ b/gtk2_ardour/utils.cc @@ -705,9 +705,8 @@ get_xpm (std::string name) return xpm_map[name]; } - -Glib::RefPtr -get_icon (const char* cname) +Glib::ustring +get_icon_path (const char* cname) { string name = cname; name += X_(".png"); @@ -723,9 +722,15 @@ get_icon (const char* cname) fatal << string_compose (_("cannot find icon image for %1"), name) << endmsg; } + return data_file_path.to_string(); +} + +Glib::RefPtr +get_icon (const char* cname) +{ Glib::RefPtr img; try { - img = Gdk::Pixbuf::create_from_file (data_file_path.to_string()); + img = Gdk::Pixbuf::create_from_file (get_icon_path (cname)); } catch (const Gdk::PixbufError &e) { cerr << "Caught PixbufError: " << e.what() << endl; } catch (...) { diff --git a/gtk2_ardour/utils.h b/gtk2_ardour/utils.h index 39d2046253..4cf54f6c91 100644 --- a/gtk2_ardour/utils.h +++ b/gtk2_ardour/utils.h @@ -86,6 +86,7 @@ bool key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev); bool possibly_translate_keyval_to_make_legal_accelerator (uint32_t& keyval); Glib::RefPtr get_xpm (std::string); +Glib::ustring get_icon_path (const char*); Glib::RefPtr get_icon (const char*); static std::map > xpm_map; const char* const *get_xpm_data (std::string path); diff --git a/libs/ardour/ardour/buffer_set.h b/libs/ardour/ardour/buffer_set.h index 284609a988..49c392ce6a 100644 --- a/libs/ardour/ardour/buffer_set.h +++ b/libs/ardour/ardour/buffer_set.h @@ -62,6 +62,11 @@ public: void attach_buffers(PortSet& ports, nframes_t nframes, nframes_t offset = 0); + /* the capacity here is a size_t and has a different interpretation depending + on the DataType of the buffers. for audio, its a frame count. for MIDI + its a byte count. + */ + void ensure_buffers(DataType type, size_t num_buffers, size_t buffer_capacity); void ensure_buffers(const ChanCount& chns, size_t buffer_capacity); diff --git a/libs/ardour/ardour/internal_send.h b/libs/ardour/ardour/internal_send.h index 3e89b8aec6..4cca8e2c89 100644 --- a/libs/ardour/ardour/internal_send.h +++ b/libs/ardour/ardour/internal_send.h @@ -43,10 +43,13 @@ class InternalSend : public Send void run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_t nframes); bool feeds (boost::shared_ptr other) const; bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + bool configure_io (ChanCount in, ChanCount out); + void set_block_size (nframes_t); boost::shared_ptr target_route() const { return _send_to; } private: + BufferSet mixbufs; BufferSet* target; boost::shared_ptr _send_to; PBD::ID _send_to_id; diff --git a/libs/ardour/internal_send.cc b/libs/ardour/internal_send.cc index f11c6037b3..bbf15166d4 100644 --- a/libs/ardour/internal_send.cc +++ b/libs/ardour/internal_send.cc @@ -80,10 +80,9 @@ InternalSend::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, // we have to copy the input, because we may alter the buffers with the amp // in-place, which a send must never do. - BufferSet& sendbufs = _session.get_mix_buffers (bufs.count()); - sendbufs.read_from (bufs, nframes); - assert(sendbufs.count() == bufs.count()); - + assert(mixbufs.available() >= bufs.count()); + mixbufs.read_from (bufs, nframes); + /* gain control */ gain_t tgain = target_gain (); @@ -92,7 +91,7 @@ InternalSend::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, /* target gain has changed */ - Amp::apply_gain (sendbufs, nframes, _current_gain, tgain); + Amp::apply_gain (mixbufs, nframes, _current_gain, tgain); _current_gain = tgain; } else if (tgain == 0.0) { @@ -101,13 +100,13 @@ InternalSend::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, */ _meter->reset (); - Amp::apply_simple_gain (sendbufs, nframes, 0.0); + Amp::apply_simple_gain (mixbufs, nframes, 0.0); goto out; } else if (tgain != 1.0) { /* target gain has not changed, but is not zero or unity */ - Amp::apply_simple_gain (sendbufs, nframes, tgain); + Amp::apply_simple_gain (mixbufs, nframes, tgain); } @@ -115,7 +114,7 @@ InternalSend::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, // so that we don't overwrite the main automation data for the route amp // _amp->setup_gain_automation (start_frame, end_frame, nframes); - _amp->run (sendbufs, start_frame, end_frame, nframes); + _amp->run (mixbufs, start_frame, end_frame, nframes); /* XXX NEED TO PAN */ @@ -125,18 +124,24 @@ InternalSend::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, if (_amp->gain_control()->get_value() == 0) { _meter->reset(); } else { - _meter->run (sendbufs, start_frame, end_frame, nframes); + _meter->run (mixbufs, start_frame, end_frame, nframes); } } /* deliver to target */ - target->merge_from (sendbufs, nframes); + target->merge_from (mixbufs, nframes); out: _active = _pending_active; } +void +InternalSend::set_block_size (nframes_t nframes) +{ + mixbufs.ensure_buffers (_configured_input, nframes); +} + bool InternalSend::feeds (boost::shared_ptr other) const { @@ -221,6 +226,14 @@ InternalSend::can_support_io_configuration (const ChanCount& in, ChanCount& out) return true; } +bool +InternalSend::configure_io (ChanCount in, ChanCount out) +{ + bool ret = Send::configure_io (in, out); + set_block_size (_session.get_block_size()); + return ret; +} + bool InternalSend::set_name (const std::string& str) { diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 56311c975d..e9c09e33bb 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -694,8 +694,10 @@ Route::add_processor (boost::shared_ptr processor, ProcessorList::ite } - // XXX: do we want to emit the signal here ? change call order. - processor->activate (); + if (_control_outs != processor) { + // XXX: do we want to emit the signal here ? change call order. + processor->activate (); + } processor->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false)); _output->set_user_latency (0); diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index ba4e6db37d..06967127ee 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -62,6 +62,7 @@ #include "ardour/cycle_timer.h" #include "ardour/data_type.h" #include "ardour/filename_extensions.h" +#include "ardour/internal_send.h" #include "ardour/io_processor.h" #include "ardour/midi_diskstream.h" #include "ardour/midi_playlist.h" diff --git a/libs/gtkmm2ext/tearoff.cc b/libs/gtkmm2ext/tearoff.cc index aad14308a4..eb5dc8f7ef 100644 --- a/libs/gtkmm2ext/tearoff.cc +++ b/libs/gtkmm2ext/tearoff.cc @@ -19,6 +19,7 @@ */ #include +#include #include #include @@ -124,6 +125,8 @@ TearOff::tearoff_click (GdkEventButton* /*ev*/) own_window.set_name (get_name()); close_event_box.set_name (get_name()); own_window.show_all (); + own_window.present (); + std::cerr << "own window should be visible\n"; hide (); Detach (); }