From d31881bf4e0a6f26efd0ad3715e0abf2804f0abd Mon Sep 17 00:00:00 2001 From: Neil Puttock Date: Sun, 14 Sep 2008 21:23:25 +0100 Subject: [PATCH] Break-alignable metronome marks. --- lily/metronome-engraver.cc | 42 ++++++++++++++++++++++++++++++++++++-- scm/define-grobs.scm | 10 +++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/lily/metronome-engraver.cc b/lily/metronome-engraver.cc index 9d585af827..f3f04f1d3c 100644 --- a/lily/metronome-engraver.cc +++ b/lily/metronome-engraver.cc @@ -42,6 +42,9 @@ protected: SCM last_duration_; SCM last_count_; SCM last_text_; + + DECLARE_ACKNOWLEDGER (break_aligned); + DECLARE_ACKNOWLEDGER (break_alignment); protected: virtual void derived_mark () const; @@ -65,13 +68,43 @@ Metronome_mark_engraver::derived_mark () const scm_gc_mark (last_text_); } +void +Metronome_mark_engraver::acknowledge_break_aligned (Grob_info inf) +{ + Grob *s = inf.grob (); + if (text_ + && !text_->get_parent (X_AXIS) + && dynamic_cast (s) + && (s->get_property_data ("break-align-symbol") + == text_->get_property_data ("break-align-symbol"))) + text_->set_parent (s, X_AXIS); +} + +void +Metronome_mark_engraver::acknowledge_break_alignment (Grob_info inf) +{ + Grob *s = inf.grob (); + if (text_ + && dynamic_cast (s)) + { + text_->set_parent (s, X_AXIS); + } +} + + void Metronome_mark_engraver::stop_translation_timestep () { if (text_) { - Grob *mc = unsmob_grob (get_property ("currentMusicalColumn")); - text_->set_parent (mc, X_AXIS); + /* + Problem: how to set musical columns as parent + when there's no breakable object of interest nearby? + We don't want metronome marks aligned to paper columns. + + Grob *mc = unsmob_grob (get_property ("currentMusicalColumn")); + text_->set_parent (mc, X_AXIS); + */ text_->set_object ("side-support-elements", grob_list_to_grob_array (get_property ("stavesFound"))); text_ = 0; @@ -108,6 +141,11 @@ Metronome_mark_engraver::process_music () last_text_ = text; } + + +ADD_ACKNOWLEDGER (Metronome_mark_engraver, break_aligned); +ADD_ACKNOWLEDGER (Metronome_mark_engraver, break_alignment); + ADD_TRANSLATOR (Metronome_mark_engraver, /* doc */ "Engrave metronome marking. This delegates the formatting" diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 2860bc3e6a..88883dc48e 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -1162,10 +1162,19 @@ (side-axis . ,Y) (stencil . ,ly:text-interface::print) (Y-offset . ,ly:side-position-interface::y-aligned-side) + (X-offset . ,(ly:make-simple-closure + `(,+ + ,(ly:make-simple-closure + (list ly:break-alignable-interface::self-align-callback)) + ,(ly:make-simple-closure + (list ly:self-alignment-interface::x-aligned-on-self))))) + (self-alignment-X . -1) + (break-align-symbols . (time-signature)) (meta . ((class . Item) (interfaces . (font-interface metronome-mark-interface side-position-interface + break-alignable-interface text-interface)))))) (MultiMeasureRest @@ -2091,6 +2100,7 @@ (break-align-anchor . ,ly:break-aligned-interface::calc-extent-aligned-anchor) (break-align-symbol . time-signature) + (break-align-anchor-alignment . ,LEFT) (break-visibility . ,all-visible) (extra-spacing-height . (-1.0 . 1.0)) (non-musical . #t) -- 2.39.2