From bebd93c2dd0d7363f311d912ec1ed1f7dfcb36ba Mon Sep 17 00:00:00 2001 From: Neil Puttock Date: Wed, 20 Jul 2011 15:49:45 +0100 Subject: [PATCH] Fix #1695: Clef change placed outside score. A MetronomeMark represents a special case for a break-alignable grob, since sometimes it will be aligned on noteheads rather than prefatory material. In this case, we don't want it to be acknowledged by the Break_align_engraver, since it will hijack the X-parent before the Metronome_engraver can set it at the end of the timestep. This causes the Paper_column_engraver to add the MetronomeMark to the 'elements list of a NonMusicalPaperColumn. If this paper column is loose, its X-extent calculation will be incorrect, since it includes the extent of the MetronomeMark whose refpoint is different (a System). This results in the column being translated away from the MetronomeMark into the left margin. This patch fixes issue 1695 by removing the default setting for 'non-musical and setting it dynamically in the Metronome_engraver. Note that this isn't sufficient in itself since `non-musical' checks use Item::non_musical (), which recursively checks parents; in the case where a MetronomeMark is effectively musical (i.e., aligned on a notehead, and parented by a PaperColumn), we also need to return from the Break_align_engraver without potentially creating a new BreakAlignment and setting the temporary X-parent. * input/regression/metronome-mark-loose-column.ly: new regtest * lily/break-align-engraver.cc (acknowledge_break_alignable): return if ack'd grob is musical (only applies to MetronomeMark) * lily/metronome-engraver.cc (acknowledge_break_aligned): if a valid break-aligned grob has been ack'd, set non-musical for MetronomeMark * scm/define-grobs.scm (all-grob-descriptions): remove default setting for non-musical in MetronomeMark definition (cherry picked from commit 70f52d14e861d3afa78508fb735b1d4e7bb274a3) --- .../regression/metronome-mark-loose-column.ly | 27 +++++++++++++++++++ lily/break-align-engraver.cc | 9 ++++++- lily/metronome-engraver.cc | 2 ++ scm/define-grobs.scm | 1 - 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 input/regression/metronome-mark-loose-column.ly diff --git a/input/regression/metronome-mark-loose-column.ly b/input/regression/metronome-mark-loose-column.ly new file mode 100644 index 0000000000..c9026b3246 --- /dev/null +++ b/input/regression/metronome-mark-loose-column.ly @@ -0,0 +1,27 @@ +\version "2.15.6" + +\header { + texidoc = "Metronome marks aligned on notes do not interfere with +the positioning of loose columns in other staves. Here the loose +column supporting the clef is correctly placed immediately before +the second note in the lower staff." +} + +\score { + << + \new Staff \relative c' { + c8 c c c + \tempo 4 = 60 + c2 + } + \new Staff \relative c' { + c2 \clef bass c2 + } + >> + \layout { + \context { + \Score + \override NonMusicalPaperColumn #'stencil = #ly:paper-column::print + } + } +} diff --git a/lily/break-align-engraver.cc b/lily/break-align-engraver.cc index 73f7db34ae..76d6e891f6 100644 --- a/lily/break-align-engraver.cc +++ b/lily/break-align-engraver.cc @@ -69,6 +69,13 @@ Break_align_engraver::derived_mark () const void Break_align_engraver::acknowledge_break_alignable (Grob_info inf) { + /* + Special case for MetronomeMark: filter out items which will be aligned + on note heads rather than prefatory material + */ + if (!Item::is_non_musical (inf.item ())) + return; + if (!align_) create_alignment (inf); @@ -95,7 +102,7 @@ Break_align_engraver::acknowledge_break_aligned (Grob_info inf) SCM align_name = item->get_property ("break-align-symbol"); if (!scm_is_symbol (align_name)) return; - + if (!align_) create_alignment (inf); diff --git a/lily/metronome-engraver.cc b/lily/metronome-engraver.cc index 09673b7e14..09606c261e 100644 --- a/lily/metronome-engraver.cc +++ b/lily/metronome-engraver.cc @@ -93,6 +93,8 @@ Metronome_mark_engraver::acknowledge_break_aligned (Grob_info info) support_ = g; text_->set_parent (g, X_AXIS); } + if (bar_ || support_) + text_->set_property ("non-musical", SCM_BOOL_T); } void diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 393bc7c187..a5c03a5275 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -1291,7 +1291,6 @@ (self-alignment-X . ,LEFT) (break-align-symbols . (time-signature)) (non-break-align-symbols . (multi-measure-rest-interface)) - (non-musical . #t) (meta . ((class . Item) (interfaces . (break-alignable-interface font-interface -- 2.39.5