summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2010-07-24 16:40:56 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2010-07-24 16:40:56 +0000
commitc685724c8067fc9308c5f66f1b91d445509159e9 (patch)
tree5261c9d9c168f4f8351e1855f080d0688889e751 /gtk2_ardour
parente3241a03cf3d3d4cc09c125340444c6f72e0346b (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.in28
-rw-r--r--gtk2_ardour/ardour_ui.cc26
-rw-r--r--gtk2_ardour/ardour_ui.h2
-rw-r--r--gtk2_ardour/ardour_ui_dialogs.cc1
-rw-r--r--gtk2_ardour/editor.cc12
-rw-r--r--gtk2_ardour/editor.h1
-rw-r--r--gtk2_ardour/editor_mouse.cc22
-rw-r--r--gtk2_ardour/editor_ops.cc2
-rw-r--r--gtk2_ardour/editor_routes.cc2
-rw-r--r--gtk2_ardour/midi_time_axis.cc18
-rw-r--r--gtk2_ardour/midi_time_axis.h3
-rw-r--r--gtk2_ardour/route_time_axis.cc7
-rw-r--r--gtk2_ardour/route_ui.cc102
-rw-r--r--gtk2_ardour/route_ui.h7
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;