From e36dfa1f0937d928f790bfd158c05aeaad75effa Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 25 Jul 2023 11:58:51 -0600 Subject: [PATCH] change display and interaction for BBT Markers Draw regular tempo/meter markers for BBT markers, and move them when BBT marker is dragged This will (does) allow regular editing workflow for the tempo/meter at at BBT marker --- gtk2_ardour/editor.h | 2 + gtk2_ardour/editor_tempodisplay.cc | 61 ++++++++++++++---------------- gtk2_ardour/marker.cc | 26 ++----------- gtk2_ardour/marker.h | 5 +-- gtk2_ardour/public_editor.h | 7 ++++ 5 files changed, 43 insertions(+), 58 deletions(-) diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 8c7f327c0c..e037891e2d 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -760,6 +760,8 @@ private: LocationMarkers* find_location_markers (ARDOUR::Location*) const; ARDOUR::Location* find_location_from_marker (ArdourMarker*, bool& is_start) const; ArdourMarker* find_marker_from_location_id (PBD::ID const&, bool) const; + TempoMarker* find_marker_for_tempo (Temporal::TempoPoint const &); + MeterMarker* find_marker_for_meter (Temporal::MeterPoint const &); ArdourMarker* entered_marker; bool _show_marker_lines; diff --git a/gtk2_ardour/editor_tempodisplay.cc b/gtk2_ardour/editor_tempodisplay.cc index 8386e0c558..a64dfce2d3 100644 --- a/gtk2_ardour/editor_tempodisplay.cc +++ b/gtk2_ardour/editor_tempodisplay.cc @@ -112,16 +112,7 @@ Editor::reassociate_metric_markers (TempoMap::SharedPtr const& tmap) void Editor::reassociate_tempo_marker (TempoMap::SharedPtr const & tmap, Tempos const & tempos, TempoMarker& marker) { - Temporal::MusicTimePoint const * mtp; - for (auto const & tempo : tempos) { - if ((mtp = dynamic_cast(&tempo)) != 0) { - /* do nothing .. but we had to catch - this first because MusicTimePoint - IS-A TempoPoint - */ - continue; - } if (marker.point().sclock() == tempo.sclock()) { marker.reset_tempo (tempo); marker.curve().reset_point (tempo); @@ -133,16 +124,7 @@ Editor::reassociate_tempo_marker (TempoMap::SharedPtr const & tmap, Tempos const void Editor::reassociate_meter_marker (TempoMap::SharedPtr const & tmap, Meters const & meters, MeterMarker& marker) { - Temporal::MusicTimePoint const * mtp; - for (auto const & meter : meters) { - if ((mtp = dynamic_cast(&meter)) != 0) { - /* do nothing .. but we had to catch - this first because MusicTimePoint - IS-A MeterPoint - */ - continue; - } if (marker.point().sclock() == meter.sclock()) { marker.reset_meter (meter); break; @@ -164,7 +146,7 @@ Editor::reassociate_bartime_marker (TempoMap::SharedPtr const & tmap, MusicTimes void Editor::make_bbt_marker (MusicTimePoint const * mtp, Marks::iterator before) { - bbt_marks.insert (before, new BBTMarker (*this, *bbt_ruler, "meter marker", *mtp, *tempo_group, *mapping_group, *meter_group)); + bbt_marks.insert (before, new BBTMarker (*this, *bbt_ruler, "meter marker", *mtp)); } void @@ -207,6 +189,7 @@ Editor::reset_metric_marks () { reset_tempo_marks (); reset_meter_marks (); + /* Must come last, after temp and meter marks are created and are discoverable */ reset_bbt_marks (); } @@ -232,13 +215,8 @@ Editor::reset_tempo_marks () tempo_marks.clear (); for (auto const & t : tempi) { - - /* do not draw BBT position elements that are both tempo & meter points */ - - if (!dynamic_cast (&t)) { - make_tempo_marker (&t, min_tempo, max_tempo, prev_ts, tc_color, sr, tempo_marks.end()); - prev_ts = &t; - } + make_tempo_marker (&t, min_tempo, max_tempo, prev_ts, tc_color, sr, tempo_marks.end()); + prev_ts = &t; } update_tempo_curves (min_tempo, max_tempo, sr); @@ -260,12 +238,7 @@ Editor::reset_meter_marks () meter_marks.clear (); for (auto const & m : meters) { - - /* do not draw BBT position elements that are both tempo & meter points */ - - if (!dynamic_cast (&m)) { - make_meter_marker (&m, meter_marks.end()); - } + make_meter_marker (&m, meter_marks.end()); } } @@ -1063,3 +1036,27 @@ Editor::clear_tempo_markers_after (timepos_t where, bool stop_at_music_times) _session->add_command (new Temporal::TempoCommand (_("clear later tempos"), before_state, &after)); commit_reversible_command (); } + +TempoMarker* +Editor::find_marker_for_tempo (Temporal::TempoPoint const & tp) +{ + for (auto const & tm : tempo_marks) { + TempoMarker* t; + if ((t = dynamic_cast(tm))->tempo() == tp) { + return t; + } + } + return nullptr; +} + +MeterMarker* +Editor::find_marker_for_meter (Temporal::MeterPoint const & mp) +{ + for (auto const & mm : meter_marks) { + MeterMarker* m; + if ((m = dynamic_cast(mm))->meter() == mp) { + return m; + } + } + return nullptr; +} diff --git a/gtk2_ardour/marker.cc b/gtk2_ardour/marker.cc index dd6abb6697..3f7020fef5 100644 --- a/gtk2_ardour/marker.cc +++ b/gtk2_ardour/marker.cc @@ -857,37 +857,19 @@ MeterMarker::point() const /***********************************************************************/ -BBTMarker::BBTMarker (PublicEditor& editor, ArdourCanvas::Item& parent, std::string const& color_name, Temporal::MusicTimePoint const & p, - ArdourCanvas::Item& tempo_parent, - ArdourCanvas::Item& mapping_parent, - ArdourCanvas::Item& meter_parent) +BBTMarker::BBTMarker (PublicEditor& editor, ArdourCanvas::Item& parent, std::string const& color_name, Temporal::MusicTimePoint const & p) : MetricMarker (editor, parent, color_name, p.name(), BBTPosition, p.time(), false) , _point (&p) - , tempo_marker (new TempoMarker (editor, tempo_parent, mapping_parent, X_("tempo marker"), "", p, p.sample (TEMPORAL_SAMPLE_RATE), UIConfiguration::instance().color (X_("tempo curve")))) { - std::stringstream full_tooltip; - - full_tooltip << name(); - full_tooltip << " ("; - full_tooltip << p.bbt(); - full_tooltip << ')'; - - set_name (name(), full_tooltip.str()); + set_name (name(), string()); group->Event.connect (sigc::bind (sigc::mem_fun (editor, &PublicEditor::canvas_bbt_marker_event), group, this)); - char buf[64]; - - snprintf (buf, sizeof(buf), "%d/%d", p.divisions_per_bar(), p.note_value ()); - meter_marker = new MeterMarker (editor, meter_parent, "meter marker", buf, p); - - tempo_marker->the_item().set_ignore_events (true); - meter_marker->the_item().set_ignore_events (true); + tempo_marker = editor.find_marker_for_tempo (p); + meter_marker = editor.find_marker_for_meter (p); } BBTMarker::~BBTMarker () { - delete tempo_marker; - delete meter_marker; } void diff --git a/gtk2_ardour/marker.h b/gtk2_ardour/marker.h index ac9eef53c1..eae4752748 100644 --- a/gtk2_ardour/marker.h +++ b/gtk2_ardour/marker.h @@ -231,10 +231,7 @@ class MeterMarker : public MetricMarker class BBTMarker : public MetricMarker { public: - BBTMarker (PublicEditor& editor, ArdourCanvas::Item &, std::string const& color_name, Temporal::MusicTimePoint const &, - ArdourCanvas::Item & tempo_parent, - ArdourCanvas::Item & mapping_parent, - ArdourCanvas::Item & meter_parent); + BBTMarker (PublicEditor& editor, ArdourCanvas::Item &, std::string const& color_name, Temporal::MusicTimePoint const &); ~BBTMarker (); void reset_point (Temporal::MusicTimePoint const &); diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index 1563a9d124..220ea7dfdb 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -64,6 +64,11 @@ #include "editing.h" #include "selection.h" +namespace Temporal { + class TempoPoint; + class MeterPoint; +} + namespace ARDOUR { class Session; class Region; @@ -544,6 +549,8 @@ public: virtual ARDOUR::Location* find_location_from_marker (ArdourMarker*, bool&) const = 0; virtual ArdourMarker* find_marker_from_location_id (PBD::ID const&, bool) const = 0; + virtual TempoMarker* find_marker_for_tempo (Temporal::TempoPoint const &) = 0; + virtual MeterMarker* find_marker_for_meter (Temporal::MeterPoint const &) = 0; virtual void snap_to_with_modifier (Temporal::timepos_t & first, GdkEvent const* ev,