]> git.donarmstrong.com Git - lilypond.git/commitdiff
Break-alignable metronome marks.
authorNeil Puttock <n.puttock@gmail.com>
Sun, 14 Sep 2008 20:23:25 +0000 (21:23 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Tue, 24 Aug 2010 13:24:25 +0000 (15:24 +0200)
lily/metronome-engraver.cc
scm/define-grobs.scm

index 9d585af827c16465d058cd163493993cf1c2d473..f3f04f1d3cd7d0f60f9ca30e8492a4ea471e2af2 100644 (file)
@@ -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<Item *> (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<Item *> (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"
index 2860bc3e6aaa0925f6e12136b1e382733c068ca5..88883dc48ef4974013216660628851b893c26340 100644 (file)
        (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
        (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)