diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2010-07-24 16:40:56 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2010-07-24 16:40:56 +0000 |
commit | c685724c8067fc9308c5f66f1b91d445509159e9 (patch) | |
tree | 5261c9d9c168f4f8351e1855f080d0688889e751 /gtk2_ardour | |
parent | e3241a03cf3d3d4cc09c125340444c6f72e0346b (diff) |
step editing now accessed via a context menu on MIDI track rec-enable buttons. along the way, fixed up confusion between set_rec_enable() and set_rec_enabled() methods in Route/Track/Diskstream
git-svn-id: svn://localhost/ardour2/branches/3.0@7482 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/ardour3_ui_dark.rc.in | 28 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui.cc | 26 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui.h | 2 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui_dialogs.cc | 1 | ||||
-rw-r--r-- | gtk2_ardour/editor.cc | 12 | ||||
-rw-r--r-- | gtk2_ardour/editor.h | 1 | ||||
-rw-r--r-- | gtk2_ardour/editor_mouse.cc | 22 | ||||
-rw-r--r-- | gtk2_ardour/editor_ops.cc | 2 | ||||
-rw-r--r-- | gtk2_ardour/editor_routes.cc | 2 | ||||
-rw-r--r-- | gtk2_ardour/midi_time_axis.cc | 18 | ||||
-rw-r--r-- | gtk2_ardour/midi_time_axis.h | 3 | ||||
-rw-r--r-- | gtk2_ardour/route_time_axis.cc | 7 | ||||
-rw-r--r-- | gtk2_ardour/route_ui.cc | 102 | ||||
-rw-r--r-- | gtk2_ardour/route_ui.h | 7 |
14 files changed, 188 insertions, 45 deletions
diff --git a/gtk2_ardour/ardour3_ui_dark.rc.in b/gtk2_ardour/ardour3_ui_dark.rc.in index 1be6acbb9d..dc560699d0 100644 --- a/gtk2_ardour/ardour3_ui_dark.rc.in +++ b/gtk2_ardour/ardour3_ui_dark.rc.in @@ -303,6 +303,19 @@ style "track_rec_enable_button_alternate" = "small_button" bg[PRELIGHT] = { 0.91, 0.68, 0.68} } +style "track_rec_enable_button_alternate_two" = "small_button" +{ + fg[SELECTED] = { 0.0, 0.0, 0.0 } + fg[ACTIVE] = { 0.0, 0.0, 0.0 } + fg[PRELIGHT] = { 0.0, 0.0, 0.0 } + fg[NORMAL] = { 0.0, 0.0, 0.0 } + + bg[NORMAL] = { 0.91, 0.68, 0.00 } + bg[ACTIVE] = { 0.91, 0.68, 0.00 } + bg[SELECTED] = { 0.91, 0.68, 0.00 } + bg[PRELIGHT] = { 0.91, 0.68, 0.00 } +} + style "mixer_track_rec_enable_button" = "track_rec_enable_button" { font_name = "@FONT_SMALLER@" @@ -564,6 +577,19 @@ style "transport_button_active" fg[ACTIVE] = { 0, 0, 0 } } +style "transport_button_alternate_two" +{ + fg[SELECTED] = { 0.0, 0.0, 0.0 } + fg[ACTIVE] = { 0.0, 0.0, 0.0 } + fg[PRELIGHT] = { 0.0, 0.0, 0.0 } + fg[NORMAL] = { 0.0, 0.0, 0.0 } + + bg[NORMAL] = { 0.91, 0.68, 0.00 } + bg[ACTIVE] = { 0.91, 0.68, 0.00 } + bg[SELECTED] = { 0.91, 0.68, 0.00 } + bg[PRELIGHT] = { 0.91, 0.68, 0.00 } +} + style "transport_rec_button" { @@ -1479,6 +1505,7 @@ widget "*NewSessionDialogButton" style:highest "small_red_active_and_selected_bu widget "*RecordEnableButton" style:highest "track_rec_enable_button" widget "*RecordEnableButton-active" style:highest "track_rec_enable_button_active" widget "*RecordEnableButton-alternate" style:highest "track_rec_enable_button_alternate" +widget "*RecordEnableButton-alternate2" style:highest "track_rec_enable_button_alternate_two" widget "*MixerRecordEnableButton" style:highest "mixer_track_rec_enable_button" widget "*MixerRecordEnableButton-active" style:highest "mixer_track_rec_enable_button_active" widget "*MixerRecordEnableButton-alternate" style:highest "mixer_track_rec_enable_button_alternate" @@ -1518,6 +1545,7 @@ widget "*EditGroupButton" style:highest "very_small_button" widget "*EditGroupButtonLabel" style:highest "very_small_button" widget "*TransportButton" style:highest "transport_button" widget "*TransportButton-active" style:highest "transport_button_active" +widget "*TransportButton-alternate2" style:highest "transport_button_alternate_two" widget "*TransportSyncButton" style:highest "transport_button" widget "*TransportSyncButton*" style:highest "transport_button" widget "*TransportSyncButton-active" style:highest "sync_alert" diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 9cc879c3ff..9d789c20be 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -1690,7 +1690,7 @@ ARDOUR_UI::transport_forward (int option) } void -ARDOUR_UI::toggle_record_enable (uint32_t dstream) +ARDOUR_UI::toggle_record_enable (uint32_t rid) { if (_session == 0) { return; @@ -1698,12 +1698,12 @@ ARDOUR_UI::toggle_record_enable (uint32_t dstream) boost::shared_ptr<Route> r; - if ((r = _session->route_by_remote_id (dstream)) != 0) { + if ((r = _session->route_by_remote_id (rid)) != 0) { Track* t; if ((t = dynamic_cast<Track*>(r.get())) != 0) { - t->set_record_enabled (!t->record_enabled()); + t->set_record_enabled (!t->record_enabled(), this); } } if (_session == 0) { @@ -2103,6 +2103,10 @@ ARDOUR_UI::transport_rec_enable_blink (bool onoff) return; } + if (_session->step_editing()) { + return; + } + Session::RecordState const r = _session->record_status (); bool const h = _session->have_rec_enabled_track (); @@ -3348,6 +3352,22 @@ ARDOUR_UI::update_transport_clocks (nframes_t pos) } } + +void +ARDOUR_UI::step_edit_status_change (bool yn) +{ + // XXX should really store pre-step edit status of things + // we make insensitive + + if (yn) { + rec_button.set_visual_state (3); + rec_button.set_sensitive (false); + } else { + rec_button.set_visual_state (0); + rec_button.set_sensitive (true); + } +} + void ARDOUR_UI::record_state_changed () { diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 4e8137d76e..04cd080ac3 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -697,6 +697,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr void fontconfig_dialog (); PBD::ScopedConnectionList forever_connections; + + void step_edit_status_change (bool); }; #endif /* __ardour_gui_h__ */ diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc index c187a5df56..747354ca4e 100644 --- a/gtk2_ardour/ardour_ui_dialogs.cc +++ b/gtk2_ardour/ardour_ui_dialogs.cc @@ -126,6 +126,7 @@ ARDOUR_UI::set_session (Session *s) Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::audition_blink)); _session->RecordStateChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::record_state_changed, this), gui_context()); + _session->StepEditStatusChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::step_edit_status_change, this, _1), gui_context()); _session->TransportStateChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::map_transport_state, this), gui_context()); _session->DirtyChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::update_autosave, this), gui_context()); diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 49470849c6..7f19e1e415 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -1102,6 +1102,7 @@ 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->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()); @@ -5189,6 +5190,16 @@ Editor::show_region_in_region_list () } void +Editor::step_edit_status_change (bool yn) +{ + if (yn) { + start_step_editing (); + } else { + stop_step_editing (); + } +} + +void Editor::start_step_editing () { step_edit_connection = Glib::signal_timeout().connect (sigc::mem_fun (*this, &Editor::check_step_edit), 20); @@ -5480,3 +5491,4 @@ Editor::show_editor_list (bool yn) the_notebook.hide(); } } + diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 167872fcdd..15758b97fb 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -2037,6 +2037,7 @@ public: EditorGroupTabs* _group_tabs; void fit_route_group (ARDOUR::RouteGroup *); + void step_edit_status_change (bool); void start_step_editing (); void stop_step_editing (); bool check_step_edit (); diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 0302054760..da2ee66a0f 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -2659,37 +2659,19 @@ Editor::set_internal_edit (bool yn) mouse_select_button.set_image (*(manage (new Image (::get_icon("midi_tool_pencil"))))); mouse_select_button.get_image ()->show (); ARDOUR_UI::instance()->tooltips().set_tip (mouse_select_button, _("Draw/Edit MIDI Notes")); - - for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { - MidiTimeAxisView* mtv = dynamic_cast<MidiTimeAxisView*> (*i); - if (mtv) { - mtv->start_step_editing (); - } - } + set_canvas_cursor (); /* deselect everything to avoid confusion when e.g. we can't now cut a previously selected region because cut means "cut note" rather than "cut region". */ selection->clear (); - start_step_editing (); - set_canvas_cursor (); - } else { mouse_select_button.set_image (*(manage (new Image (::get_icon("tool_range"))))); mouse_select_button.get_image ()->show (); ARDOUR_UI::instance()->tooltips().set_tip (mouse_select_button, _("Select/Move Ranges")); - stop_step_editing (); - - for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { - MidiTimeAxisView* mtv = dynamic_cast<MidiTimeAxisView*> (*i); - if (mtv) { - mtv->stop_step_editing (); - } - } - - mouse_mode_toggled (mouse_mode); + mouse_mode_toggled (mouse_mode); // sets cursor } } diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index adc9078fba..cb76fcb1ec 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -5116,7 +5116,7 @@ Editor::toggle_record_enable () first = false; } - rtav->track()->set_record_enable(new_state, this); + rtav->track()->set_record_enabled (new_state, this); } } diff --git a/gtk2_ardour/editor_routes.cc b/gtk2_ardour/editor_routes.cc index 308f0c50b8..81e56c3e32 100644 --- a/gtk2_ardour/editor_routes.cc +++ b/gtk2_ardour/editor_routes.cc @@ -222,7 +222,7 @@ EditorRoutes::on_tv_rec_enable_toggled (Glib::ustring const & path_string) if (atv != 0 && atv->is_audio_track()){ boost::shared_ptr<RouteList> rl (new RouteList); rl->push_back (atv->route()); - _session->set_record_enable (rl, !atv->track()->record_enabled(), Session::rt_cleanup); + _session->set_record_enabled (rl, !atv->track()->record_enabled(), Session::rt_cleanup); } } diff --git a/gtk2_ardour/midi_time_axis.cc b/gtk2_ardour/midi_time_axis.cc index a4e09871c9..cb4eb795bd 100644 --- a/gtk2_ardour/midi_time_axis.cc +++ b/gtk2_ardour/midi_time_axis.cc @@ -859,6 +859,20 @@ MidiTimeAxisView::route_active_changed () } void +MidiTimeAxisView::toggle_step_edit () +{ + if (_route->record_enabled()) { + return; + } + + if (midi_track()->step_editing ()) { + stop_step_editing (); + } else { + start_step_editing (); + } +} + +void MidiTimeAxisView::start_step_editing () { step_edit_insert_position = _editor.get_preferred_edit_position (); @@ -918,6 +932,8 @@ MidiTimeAxisView::check_step_edit () fatal << X_("programming error: no view found for new MIDI region") << endmsg; /*NOTREACHED*/ } + cerr << "New step edit region is called " << step_edit_region->name() + << " view @ " << step_edit_region_view << endl; } if (step_edit_region_view) { @@ -946,7 +962,7 @@ MidiTimeAxisView::step_edit_rest () } boost::shared_ptr<Region> -MidiTimeAxisView::add_region (nframes64_t pos) +MidiTimeAxisView::add_region (framepos_t pos) { Editor* real_editor = dynamic_cast<Editor*> (&_editor); diff --git a/gtk2_ardour/midi_time_axis.h b/gtk2_ardour/midi_time_axis.h index e15167f855..b118b9ab63 100644 --- a/gtk2_ardour/midi_time_axis.h +++ b/gtk2_ardour/midi_time_axis.h @@ -67,7 +67,7 @@ class MidiTimeAxisView : public RouteTimeAxisView void set_height (uint32_t); void hide (); - boost::shared_ptr<ARDOUR::Region> add_region (nframes64_t pos); + boost::shared_ptr<ARDOUR::Region> add_region (ARDOUR::framepos_t pos); void show_all_automation (); void show_existing_automation (); @@ -86,6 +86,7 @@ class MidiTimeAxisView : public RouteTimeAxisView return _midi_patch_settings_changed; } + void toggle_step_edit (); void start_step_editing (); void stop_step_editing (); void check_step_edit (); diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index 49c49a3734..d1df63d187 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -170,7 +170,12 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, boost::sh rec_enable_button->show_all (); controls_table.attach (*rec_enable_button, 5, 6, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0); - ARDOUR_UI::instance()->set_tip(*rec_enable_button, _("Record")); + + if (is_midi_track()) { + ARDOUR_UI::instance()->set_tip(*rec_enable_button, _("Record (Right-click for Step Edit)")); + } else { + ARDOUR_UI::instance()->set_tip(*rec_enable_button, _("Record")); + } rec_enable_button->set_sensitive (_session->writable()); } diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc index 71d38360d5..6e9f5a73d1 100644 --- a/gtk2_ardour/route_ui.cc +++ b/gtk2_ardour/route_ui.cc @@ -83,6 +83,7 @@ RouteUI::~RouteUI() delete solo_menu; delete mute_menu; delete sends_menu; + delete record_menu; } void @@ -93,6 +94,7 @@ RouteUI::init () mute_menu = 0; solo_menu = 0; sends_menu = 0; + record_menu = 0; pre_fader_mute_check = 0; post_fader_mute_check = 0; listen_mute_check = 0; @@ -106,6 +108,7 @@ RouteUI::init () _mute_release = 0; route_active_menu_item = 0; denormal_menu_item = 0; + step_edit_item = 0; multiple_mute_change = false; multiple_solo_change = false; @@ -229,6 +232,12 @@ RouteUI::set_route (boost::shared_ptr<Route> rp) rec_enable_button->set_controllable (t->rec_enable_control()); update_rec_display (); + + if (is_midi_track()) { + midi_track()->StepEditStatusChange.connect (route_connections, invalidator (*this), + ui_bind (&RouteUI::step_edit_changed, this, _1), gui_context()); + } + } mute_button->unset_flags (Gtk::CAN_FOCUS); @@ -526,6 +535,15 @@ RouteUI::rec_enable_press(GdkEventButton* ev) return true; } + if (is_midi_track()) { + + /* cannot rec-enable while step-editing */ + + if (midi_track()->step_editing()) { + return true; + } + } + if (!ignore_toggle && is_track() && rec_enable_button) { if (Keyboard::is_button2_event (ev)) { @@ -535,7 +553,7 @@ RouteUI::rec_enable_press(GdkEventButton* ev) } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier))) { - _session->set_record_enable (_session->get_routes(), !rec_enable_button->get_active()); + _session->set_record_enabled (_session->get_routes(), !rec_enable_button->get_active()); } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) { @@ -543,7 +561,7 @@ RouteUI::rec_enable_press(GdkEventButton* ev) NOTE: Primary-button2 is MIDI learn. */ if (ev->button == 1 && _route->route_group()) { - _session->set_record_enable (_route->route_group()->route_list(), !rec_enable_button->get_active(), Session::rt_cleanup, true); + _session->set_record_enabled (_route->route_group()->route_list(), !rec_enable_button->get_active(), Session::rt_cleanup, true); } } else if (Keyboard::is_context_menu_event (ev)) { @@ -554,16 +572,67 @@ RouteUI::rec_enable_press(GdkEventButton* ev) boost::shared_ptr<RouteList> rl (new RouteList); rl->push_back (route()); - _session->set_record_enable (rl, !rec_enable_button->get_active()); + _session->set_record_enabled (rl, !rec_enable_button->get_active()); } } return true; } +void +RouteUI::build_record_menu () +{ + if (record_menu) { + return; + } + + /* no rec-button context menu for non-MIDI tracks + */ + + if (!is_midi_track()) { + return; + } + + record_menu = new Menu; + record_menu->set_name ("ArdourContextMenu"); + + using namespace Menu_Helpers; + MenuList& items = record_menu->items(); + + items.push_back (CheckMenuElem (_("Step Edit"), sigc::mem_fun (*this, &RouteUI::toggle_step_edit))); + step_edit_item = dynamic_cast<CheckMenuItem*> (&items.back()); +} + +void +RouteUI::toggle_step_edit () +{ +} + +void +RouteUI::step_edit_changed (bool yn) +{ + if (yn) { + if (rec_enable_button) { + rec_enable_button->set_visual_state (3); + } + } else { + if (rec_enable_button) { + rec_enable_button->set_visual_state (0); + } + } +} + bool -RouteUI::rec_enable_release (GdkEventButton*) +RouteUI::rec_enable_release (GdkEventButton* ev) { + if (Keyboard::is_context_menu_event (ev)) { + build_record_menu (); + if (record_menu) { + record_menu->popup (1, ev->time); + } + return true; + } + return true; } @@ -907,7 +976,7 @@ RouteUI::update_mute_display () void RouteUI::route_rec_enable_changed () { - Gtkmm2ext::UI::instance()->call_slot (invalidator (*this), boost::bind (&RouteUI::update_rec_display, this)); + update_rec_display (); } void @@ -939,18 +1008,17 @@ RouteUI::update_rec_display () /* now make sure its color state is correct */ if (model) { - - switch (_session->record_status ()) { - case Session::Recording: - rec_enable_button->set_visual_state (1); - break; - - case Session::Disabled: - case Session::Enabled: - rec_enable_button->set_visual_state (2); - break; - - } + switch (_session->record_status ()) { + case Session::Recording: + rec_enable_button->set_visual_state (1); + break; + + case Session::Disabled: + case Session::Enabled: + rec_enable_button->set_visual_state (2); + break; + + } } else { rec_enable_button->set_visual_state (0); diff --git a/gtk2_ardour/route_ui.h b/gtk2_ardour/route_ui.h index cc11b18094..8d819de505 100644 --- a/gtk2_ardour/route_ui.h +++ b/gtk2_ardour/route_ui.h @@ -180,6 +180,13 @@ class RouteUI : public virtual AxisView void toggle_route_active (); virtual void route_active_changed (); + Gtk::Menu* record_menu; + void build_record_menu (); + + Gtk::CheckMenuItem *step_edit_item; + virtual void toggle_step_edit (); + virtual void step_edit_changed (bool); + virtual void polarity_changed (); Gtk::CheckMenuItem *denormal_menu_item; |