From 13311b7a32f246531077516631c1be7767b35a6b Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sat, 8 Apr 2023 11:44:03 -0600 Subject: [PATCH] tempo mapping: tempo group and mapping group are now only ever visible one at a time Currently, the "switch" is in Edit > Tempo --- gtk2_ardour/editor.cc | 11 ++---- gtk2_ardour/editor.h | 4 +- gtk2_ardour/editor_actions.cc | 5 +-- gtk2_ardour/editor_canvas.cc | 11 ++++-- gtk2_ardour/editor_rulers.cc | 29 ++------------- gtk2_ardour/editor_tempodisplay.cc | 59 +++++++++++++++++++++++++++++- 6 files changed, 76 insertions(+), 43 deletions(-) diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 0a8da3abc3..63d44499b1 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -332,7 +332,6 @@ Editor::Editor () , timecode_label (_("Timecode")) , samples_label (_("Samples")) , tempo_label (_("Tempo")) - , mapping_label (_("Tempo Mapping")) , meter_label (_("Time Signature")) , mark_label (_("Location Markers")) , range_mark_label (_("Range Markers")) @@ -545,13 +544,6 @@ Editor::Editor () tempo_label.hide(); tempo_label.set_no_show_all(); - mapping_label.set_name ("EditorRulerLabel"); - mapping_label.set_size_request (-1, (int)timebar_height); - mapping_label.set_alignment (1.0, 0.5); - mapping_label.set_padding (5,0); - mapping_label.hide(); - mapping_label.set_no_show_all(); - meter_label.set_name ("EditorRulerLabel"); meter_label.set_size_request (-1, (int)timebar_height); meter_label.set_alignment (1.0, 0.5); @@ -890,6 +882,9 @@ Editor::Editor () UIConfiguration::instance().map_parameters (pc); setup_fade_images (); + + /* force correct state for tempo edit behavior */ + tempo_edit_behavior_toggled (_tempo_edit_behavior); } Editor::~Editor() diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 8a01b0f5c5..43bb2c7e91 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -917,6 +917,7 @@ private: Gtk::EventBox time_bars_event_box; Gtk::VBox time_bars_vbox; + ArdourCanvas::Container* tempo_meta_group; ArdourCanvas::Container* tempo_group; ArdourCanvas::Container* mapping_group; ArdourCanvas::Container* meter_group; @@ -965,7 +966,6 @@ private: Glib::RefPtr ruler_bbt_action; Glib::RefPtr ruler_meter_action; Glib::RefPtr ruler_tempo_action; - Glib::RefPtr ruler_mapping_action; Glib::RefPtr ruler_range_action; Glib::RefPtr ruler_loop_punch_action; Glib::RefPtr ruler_cd_marker_action; @@ -1070,7 +1070,6 @@ private: Gtk::Label timecode_label; Gtk::Label samples_label; Gtk::Label tempo_label; - Gtk::Label mapping_label; Gtk::Label meter_label; Gtk::Label mark_label; Gtk::Label range_mark_label; @@ -2529,6 +2528,7 @@ private: void choose_mapping_drag (ArdourCanvas::Item*, GdkEvent*); Editing::TempoEditBehavior _tempo_edit_behavior; + void tempo_edit_behavior_toggled (Editing::TempoEditBehavior); template Temporal::TimeDomain drag_time_domain (T* thing_with_time_domain) { diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index e28e2435b5..e6e7ca2b7b 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -207,8 +207,8 @@ Editor::register_actions () ActionManager::register_action (editor_actions, "lock", S_("Session|Lock"), sigc::mem_fun (*this, &Editor::lock)); RadioAction::Group tempo_edit_group; - ActionManager::register_radio_action (editor_actions, tempo_edit_group, "tempo-edit-is-mapping", _("Map Tempo"), sigc::bind (sigc::mem_fun (*this, &Editor::set_tempo_edit_behavior), Editing::TempoMapping)); - ActionManager::register_radio_action (editor_actions, tempo_edit_group, "tempo-edit-is-change", _("Change Tempo"), sigc::bind (sigc::mem_fun (*this, &Editor::set_tempo_edit_behavior), Editing::TempoChanging)); + ActionManager::register_radio_action (editor_actions, tempo_edit_group, "tempo-edit-is-mapping", _("Map Tempo"), sigc::bind (sigc::mem_fun (*this, &Editor::tempo_edit_behavior_toggled), Editing::TempoMapping)); + ActionManager::register_radio_action (editor_actions, tempo_edit_group, "tempo-edit-is-changing", _("Change Tempo"), sigc::bind (sigc::mem_fun (*this, &Editor::tempo_edit_behavior_toggled), Editing::TempoChanging)); toggle_reg_sens (editor_actions, "show-editor-mixer", _("Show Editor Mixer"), sigc::mem_fun (*this, &Editor::editor_mixer_button_toggled)); toggle_reg_sens (editor_actions, "show-editor-list", _("Show Editor List"), sigc::mem_fun (*this, &Editor::editor_list_button_toggled)); @@ -718,7 +718,6 @@ Editor::register_actions () ruler_bbt_action = Glib::RefPtr::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-bbt-ruler"), _("Bars:Beats"), sigc::mem_fun(*this, &Editor::toggle_ruler_visibility))); ruler_meter_action = Glib::RefPtr::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-meter-ruler"), _("Time Signature"), sigc::mem_fun(*this, &Editor::toggle_ruler_visibility))); ruler_tempo_action = Glib::RefPtr::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-tempo-ruler"), _("Tempo"), sigc::mem_fun(*this, &Editor::toggle_ruler_visibility))); - ruler_mapping_action = Glib::RefPtr::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-mapping-ruler"), _("Tempo Mapping"), sigc::mem_fun(*this, &Editor::toggle_ruler_visibility))); ruler_range_action = Glib::RefPtr::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-range-ruler"), _("Range Markers"), sigc::mem_fun(*this, &Editor::toggle_ruler_visibility))); ruler_loop_punch_action = Glib::RefPtr::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-loop-punch-ruler"), _("Loop/Punch Ranges"), sigc::mem_fun(*this, &Editor::toggle_ruler_visibility))); ruler_cd_marker_action = Glib::RefPtr::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-cd-marker-ruler"), _("CD Markers"), sigc::mem_fun(*this, &Editor::toggle_ruler_visibility))); diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc index 46caefaaa0..f91d8fd20e 100644 --- a/gtk2_ardour/editor_canvas.cc +++ b/gtk2_ardour/editor_canvas.cc @@ -162,12 +162,14 @@ Editor::initialize_canvas () CANVAS_DEBUG_NAME (transport_marker_group, "transport marker group"); range_marker_group = new ArdourCanvas::Container (_time_markers_group, ArdourCanvas::Duple (0.0, (timebar_height * 3.0) + 1.0)); CANVAS_DEBUG_NAME (range_marker_group, "range marker group"); - tempo_group = new ArdourCanvas::Container (_time_markers_group, ArdourCanvas::Duple (0.0, (timebar_height * 4.0) + 1.0)); + tempo_meta_group = new ArdourCanvas::Container (_time_markers_group, ArdourCanvas::Duple (0.0, (timebar_height * 4.0) + 1.0)); + CANVAS_DEBUG_NAME (tempo_meta_group, "tempo meta group"); + tempo_group = new ArdourCanvas::Container (tempo_meta_group, ArdourCanvas::Duple (0.0, 0.0)); CANVAS_DEBUG_NAME (tempo_group, "tempo group"); + mapping_group = new ArdourCanvas::Container (tempo_meta_group, ArdourCanvas::Duple (0.0, 0.0)); + CANVAS_DEBUG_NAME (tempo_group, "mapping group"); meter_group = new ArdourCanvas::Container (_time_markers_group, ArdourCanvas::Duple (0.0, (timebar_height * 5.0) + 1.0)); CANVAS_DEBUG_NAME (meter_group, "meter group"); - mapping_group = new ArdourCanvas::Container (_time_markers_group, ArdourCanvas::Duple (0.0, (timebar_height * 6.0) + 1.0)); - CANVAS_DEBUG_NAME (mapping_group, "mapping group"); float timebar_thickness = timebar_height; //was 4 float timebar_top = (timebar_height - timebar_thickness)/2; @@ -183,11 +185,12 @@ Editor::initialize_canvas () tempo_bar->set_outline(false); tempo_bar->set_outline_what(ArdourCanvas::Rectangle::BOTTOM); - mapping_bar = new ArdourCanvas::Rectangle (mapping_group, ArdourCanvas::Rect (0.0, 0.0, ArdourCanvas::COORD_MAX, timebar_height)); + mapping_bar = new ArdourCanvas::Rectangle (tempo_group, ArdourCanvas::Rect (0.0, 0.0, ArdourCanvas::COORD_MAX, timebar_height)); CANVAS_DEBUG_NAME (mapping_bar, "Mapping Bar"); mapping_bar->set_fill(true); mapping_bar->set_outline(false); mapping_bar->set_outline_what(ArdourCanvas::Rectangle::BOTTOM); + mapping_bar->hide (); range_marker_bar = new ArdourCanvas::Rectangle (range_marker_group, ArdourCanvas::Rect (0.0, timebar_top, ArdourCanvas::COORD_MAX, timebar_btm)); CANVAS_DEBUG_NAME (range_marker_bar, "Range Marker Bar"); diff --git a/gtk2_ardour/editor_rulers.cc b/gtk2_ardour/editor_rulers.cc index 4c0a87ba50..5d6e74cc72 100644 --- a/gtk2_ardour/editor_rulers.cc +++ b/gtk2_ardour/editor_rulers.cc @@ -173,7 +173,6 @@ Editor::initialize_rulers () lab_children.push_back (Element(timecode_label, PACK_SHRINK, PACK_START)); lab_children.push_back (Element(samples_label, PACK_SHRINK, PACK_START)); lab_children.push_back (Element(bbt_label, PACK_SHRINK, PACK_START)); - lab_children.push_back (Element(mapping_label, PACK_SHRINK, PACK_START)); lab_children.push_back (Element(tempo_label, PACK_SHRINK, PACK_START)); lab_children.push_back (Element(meter_label, PACK_SHRINK, PACK_START)); lab_children.push_back (Element(range_mark_label, PACK_SHRINK, PACK_START)); @@ -336,7 +335,6 @@ Editor::store_ruler_visibility () node->set_property (X_("bbt"), ruler_bbt_action->get_active()); node->set_property (X_("meter"), ruler_meter_action->get_active()); node->set_property (X_("tempo"), ruler_tempo_action->get_active()); - node->set_property (X_("mapping"), ruler_mapping_action->get_active()); node->set_property (X_("rangemarker"), ruler_range_action->get_active()); node->set_property (X_("transportmarker"), ruler_loop_punch_action->get_active()); node->set_property (X_("cdmarker"), ruler_cd_marker_action->get_active()); @@ -371,9 +369,6 @@ Editor::restore_ruler_visibility () if (node->get_property ("tempo", yn)) { ruler_tempo_action->set_active (yn); } - if (node->get_property ("mapping", yn)) { - ruler_mapping_action->set_active (yn); - } if (node->get_property ("meter", yn)) { ruler_meter_action->set_active (yn); } @@ -453,7 +448,6 @@ Editor::update_ruler_visibility () /* gtk update probs require this (damn) */ meter_label.hide(); tempo_label.hide(); - mapping_label.hide(); range_mark_label.hide(); transport_mark_label.hide(); cd_mark_label.hide(); @@ -522,33 +516,18 @@ Editor::update_ruler_visibility () bbt_label.hide(); } - if (ruler_mapping_action->get_active()) { - old_unit_pos = mapping_group->position().y; - if (tbpos != old_unit_pos) { - mapping_group->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); - } - mapping_group->show(); - mapping_label.show(); - tbpos += timebar_height; - tbgpos += timebar_height; - visible_timebars++; - } else { - mapping_group->hide(); - mapping_label.hide(); - } - if (ruler_tempo_action->get_active()) { - old_unit_pos = tempo_group->position().y; + old_unit_pos = tempo_meta_group->position().y; if (tbpos != old_unit_pos) { - tempo_group->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); + tempo_meta_group->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); } - tempo_group->show(); + tempo_meta_group->show(); tempo_label.show(); tbpos += timebar_height; tbgpos += timebar_height; visible_timebars++; } else { - tempo_group->hide(); + tempo_meta_group->hide(); tempo_label.hide(); } diff --git a/gtk2_ardour/editor_tempodisplay.cc b/gtk2_ardour/editor_tempodisplay.cc index 6f1938175a..703345a725 100644 --- a/gtk2_ardour/editor_tempodisplay.cc +++ b/gtk2_ardour/editor_tempodisplay.cc @@ -898,5 +898,62 @@ Editor::mid_tempo_per_region_update (RegionView* rv) void Editor::set_tempo_edit_behavior (TempoEditBehavior teb) { - _tempo_edit_behavior = teb; + /* As with all things radio-action related, we carry out the change by + toggling the action, and then actually do the model-view changes in + the actions' toggled handler. + */ + + Glib::RefPtr act; + + switch (teb) { + case TempoMapping: + act = ActionManager::get_action (X_("Editor"), X_("tempo-edit-is-mapping")); + break; + case TempoChanging: + act = ActionManager::get_action (X_("Editor"), X_("tempo-edit-is-changing")); + } + + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + + /* go there and back to ensure that the toggled handler is called to set up mouse_mode */ + tact->set_active (false); + tact->set_active (true); +} + +void +Editor::tempo_edit_behavior_toggled (TempoEditBehavior teb) +{ + Glib::RefPtr act; + + switch (teb) { + case TempoMapping: + act = ActionManager::get_action (X_("Editor"), X_("tempo-edit-is-mapping")); + break; + case TempoChanging: + act = ActionManager::get_action (X_("Editor"), X_("tempo-edit-is-changing")); + } + + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + + if (!tact->get_active()) { + /* this was just the notification that the old mode has been + * left. we'll get called again with the new mode active in a + * jiffy. + */ + return; + } + + /* change the ruler shown in the tempo position */ + _tempo_edit_behavior = teb; + + switch (teb) { + case TempoMapping: + tempo_group->hide (); + mapping_group->show (); + break; + case TempoChanging: + tempo_group->show (); + mapping_group->hide (); + break; + } }