]> git.donarmstrong.com Git - lilypond.git/commitdiff
Fix 432.
authorJoe Neeman <joeneeman@gmail.com>
Tue, 27 Nov 2007 05:34:01 +0000 (16:34 +1100)
committerJoe Neeman <joeneeman@gmail.com>
Tue, 27 Nov 2007 05:34:01 +0000 (16:34 +1100)
Acknowledge break-alignables in break-align-engraver so that they are still
aligned even if they are created in a lower context.

input/regression/rehearsal-mark-align-staff-context.ly [new file with mode: 0644]
lily/break-align-engraver.cc
lily/mark-engraver.cc

diff --git a/input/regression/rehearsal-mark-align-staff-context.ly b/input/regression/rehearsal-mark-align-staff-context.ly
new file mode 100644 (file)
index 0000000..8d3330f
--- /dev/null
@@ -0,0 +1,32 @@
+\version "2.11.30"
+
+\header {
+  texidoc = "RehearsalMarks still align correctly if Mark_engraver is moved to
+another context."
+}
+
+\layout {
+  \context {
+    \Staff
+    \consists "Mark_engraver"
+  }
+  \context {
+    \Score
+    \remove "Mark_engraver"
+  }
+}
+
+\relative {
+  c1 \mark "foo"
+  c1
+  \key cis \major
+  \clef alto
+  \override Score.RehearsalMark #'break-align-symbols = #'(key-signature)
+  \mark "on-key"
+  cis
+  \key ces \major
+  \override Score.RehearsalMark #'break-align-symbols = #'(clef)
+  \clef treble
+  \mark "on clef"
+  ces
+}
index b3e74500d0c5ae102d14457ff3259c6a5335841c..8059200849770fcccc83500b5a00b35be19d9232 100644 (file)
@@ -23,12 +23,14 @@ class Break_align_engraver : public Engraver
   Item *left_edge_;
 
   void add_to_group (SCM, Item *);
+  void create_alignment (Grob_info);
 protected:
   void stop_translation_timestep ();
   virtual void derived_mark () const;
 public:
   TRANSLATOR_DECLARATIONS (Break_align_engraver);
   DECLARE_ACKNOWLEDGER (break_aligned);
+  DECLARE_ACKNOWLEDGER (break_alignable);
 };
 
 void
@@ -53,6 +55,18 @@ Break_align_engraver::derived_mark () const
   scm_gc_mark (column_alist_);
 }
 
+void
+Break_align_engraver::acknowledge_break_alignable (Grob_info inf)
+{
+  if (!align_)
+    create_alignment (inf);
+
+  Grob *g = inf.grob ();
+
+  if (!g->get_parent (X_AXIS))
+    g->set_parent (align_, X_AXIS);
+}
+
 void
 Break_align_engraver::acknowledge_break_aligned (Grob_info inf)
 {
@@ -72,26 +86,30 @@ Break_align_engraver::acknowledge_break_aligned (Grob_info inf)
        return;
          
       if (!align_)
-       {
-         align_ = make_item ("BreakAlignment", SCM_EOL);
+       create_alignment (inf);
+
+      add_to_group (align_name, item);
+    }
+}
 
-         Context *origin = inf.origin_contexts (this)[0];
+void
+Break_align_engraver::create_alignment (Grob_info inf)
+{
+  align_ = make_item ("BreakAlignment", SCM_EOL);
 
-         Translator_group *tg = origin->implementation ();
-         Engraver *random_source = dynamic_cast<Engraver *> (unsmob_translator (scm_car (tg->get_simple_trans_list ())));
-         if (!random_source)
-           random_source = this;
+  Context *origin = inf.origin_contexts (this)[0];
 
-         /*
-           Make left edge appear to come from same context as clef/bar-line etc.
-         */
-         left_edge_ = random_source->make_item ("LeftEdge", SCM_EOL);
-         add_to_group (left_edge_->get_property ("break-align-symbol"),
-                       left_edge_);
-       }
+  Translator_group *tg = origin->implementation ();
+  Engraver *random_source = dynamic_cast<Engraver *> (unsmob_translator (scm_car (tg->get_simple_trans_list ())));
+  if (!random_source)
+    random_source = this;
 
-      add_to_group (align_name, item);
-    }
+  /*
+    Make left edge appear to come from same context as clef/bar-line etc.
+  */
+  left_edge_ = random_source->make_item ("LeftEdge", SCM_EOL);
+  add_to_group (left_edge_->get_property ("break-align-symbol"),
+               left_edge_);
 }
 
 void
@@ -119,6 +137,7 @@ Break_align_engraver::add_to_group (SCM align_name, Item *item)
   Axis_group_interface::add_element (group, item);
 }
 ADD_ACKNOWLEDGER (Break_align_engraver, break_aligned);
+ADD_ACKNOWLEDGER (Break_align_engraver, break_alignable);
 ADD_TRANSLATOR (Break_align_engraver,
                "Align grobs with corresponding @code{break-align-symbols} into "
                "groups, and order the groups according to @code{breakAlignOrder}. "
index 3b12e46e43d1be36dfdcfa606cd4dc677c07f8d0..8c0233c9095b6b93cdd3ca4186daad873682f024 100644 (file)
@@ -43,7 +43,6 @@ protected:
 
   DECLARE_TRANSLATOR_LISTENER (mark);
   DECLARE_ACKNOWLEDGER (break_alignment);
-  DECLARE_ACKNOWLEDGER (break_aligned);
 };
 
 Mark_engraver::Mark_engraver ()
@@ -52,30 +51,6 @@ Mark_engraver::Mark_engraver ()
   mark_ev_ = 0;
 }
 
-/*
-  This is a flawed approach, since various break-aligned objects may
-  not appear depending on key signature etc.
-
-   We keep it in case someone puts the engraver in a lower context than score.
- */
-void
-Mark_engraver::acknowledge_break_aligned (Grob_info inf)
-{
-  Grob *s = inf.grob ();
-  if (text_
-      && !text_->get_parent (X_AXIS)
-      && (text_->get_property_data ("break-align-symbol")
-         == s->get_property_data ("break-align-symbol"))
-      && Axis_group_interface::has_interface (s))
-    {
-      /*
-       RehearsalMark cannot be break-aligned, since the width of the
-       object should not be taken into alignment considerations.
-      */
-      text_->set_parent (s, X_AXIS);
-    }
-}
-
 void
 Mark_engraver::acknowledge_break_alignment (Grob_info inf)
 {
@@ -161,7 +136,6 @@ Mark_engraver::process_music ()
     }
 }
 
-ADD_ACKNOWLEDGER (Mark_engraver, break_aligned);
 ADD_ACKNOWLEDGER (Mark_engraver, break_alignment);
 
 ADD_TRANSLATOR (Mark_engraver,