]> git.donarmstrong.com Git - lilypond.git/commitdiff
Issue 5111: Implement spacing-pair for MeasureCounter
authorDavid Nalesnik <david.nalesnik@gmail.com>
Thu, 30 Mar 2017 17:44:20 +0000 (12:44 -0500)
committerDavid Nalesnik <david.nalesnik@gmail.com>
Thu, 6 Apr 2017 22:25:34 +0000 (17:25 -0500)
Since MeasureCounter grobs are bounded by columns, sophisticated
horizontal positioning is available relative to "prefatory
materials" (such as barlines, clefs, and key signatures) at the
beginning and end of measures.  This allows numbers to be
placed above full-measure rests which have been similarly adjusted
with 'spacing-pair.

The previous default is established in the grob description: count
objects are centered between BreakAlignment grobs.

Paper_column::break_align_width is made available to Scheme as
ly:paper-column:break-align-width.

A regression test is provided.

input/regression/measure-counter-spacing-pair.ly [new file with mode: 0644]
lily/paper-column.cc
scm/define-grob-interfaces.scm
scm/define-grobs.scm
scm/output-lib.scm

diff --git a/input/regression/measure-counter-spacing-pair.ly b/input/regression/measure-counter-spacing-pair.ly
new file mode 100644 (file)
index 0000000..0bef0b1
--- /dev/null
@@ -0,0 +1,57 @@
+\version "2.19.59"
+
+\header {
+  texidoc = "The @code{spacing-pair} property may be used to adjust
+the horizontal positioning of @code{MeasureCounter} objects relative to
+prefatory material.  In the following example, the count should be
+aligned with the full-measure rests.
+"
+}
+
+\layout {
+  ragged-right = ##t
+  \context {
+    \Staff
+    \consists #Measure_counter_engraver
+  }
+}
+
+music = {
+  \key bes \major
+  \time 3/4
+  R2.
+}
+
+{
+  \startMeasureCount
+  \music
+  \override Staff.MeasureCounter.spacing-pair =
+    #'(staff-bar. staff-bar)
+  \override Staff.MultiMeasureRest.spacing-pair =
+    #'(staff-bar . staff-bar)
+  \music
+  \override Staff.MeasureCounter.spacing-pair =
+    #'(key-signature . staff-bar)
+  \override Staff.MultiMeasureRest.spacing-pair =
+    #'(key-signature . staff-bar)
+  \music
+  \override Staff.MeasureCounter.spacing-pair =
+    #'(time-signature . staff-bar)
+  \override Staff.MultiMeasureRest.spacing-pair =
+    #'(time-signature . staff-bar)
+  \music
+  % time-signature is used on left
+  \override Staff.MeasureCounter.spacing-pair =
+    #'((left-edge time-signature) . time-signature)
+  \override Staff.MultiMeasureRest.spacing-pair =
+    #'((left-edge time-signature) . time-signature)
+  \music
+  \break
+  % left-edge is used
+  \override Staff.MeasureCounter.spacing-pair =
+    #'((left-edge key-signature) . staff-bar)
+  \override Staff.MultiMeasureRest.spacing-pair =
+    #'((left-edge key-signature) . staff-bar)
+  \music
+  \stopMeasureCount
+}
index 5462027928693c15aa9a85d00ccca134b8945173..bcb480451507ccbbde9553d113e90bd1bb772df2 100644 (file)
@@ -226,6 +226,22 @@ Paper_column::break_align_width (Grob *me, SCM align_syms)
   return align->extent (p, X_AXIS);
 }
 
+LY_DEFINE (ly_paper_column__break_align_width, "ly:paper-column::break-align-width",
+           2, 0, 0, (SCM col, SCM align_syms),
+           "Determine the extent along the X-axis of a grob used for"
+           " break-alignment organized by column @var{col}. The grob is"
+           " specified by @var{align-syms}, which contains either a"
+           " single @code{break-align-symbol} or a list of such"
+           " symbols.")
+{
+  LY_ASSERT_SMOB (Grob, col, 1);
+  SCM_ASSERT_TYPE (scm_is_symbol (align_syms) || ly_is_list (align_syms),
+                   align_syms, SCM_ARG2, __FUNCTION__, "symbol or list");
+
+  Interval ext = Paper_column::break_align_width (unsmob<Grob> (col), align_syms);
+  return ly_interval2scm (ext);
+}
+
 /*
   Loop through elements of a PaperColumn, find all grobs implementing specified
   interface and return their combined extent.
index ffcfc355113af36777ec91bb8bce72930e5a870b..31188d0d8ea8156e1b762a7512522fbc39f120de 100644 (file)
@@ -204,7 +204,8 @@ accidentals)."
  'measure-counter-interface
  "A counter for numbering measures."
  '(columns
-   count-from))
+   count-from
+   spacing-pair))
 
 (ly:add-interface
  'metronome-mark-interface
index cdea705c4d6f186122ed164e84b72f0a7079359f..e162b408b9d4fd1814b163b6f3aee23bb2e876bb 100644 (file)
         (outside-staff-priority . 750)
         (self-alignment-X . ,CENTER)
         (side-axis . ,Y)
+        (spacing-pair . (break-alignment . break-alignment))
         (staff-padding . 0.5)
         (stencil . ,measure-counter-stencil)
         (Y-offset . ,side-position-interface::y-aligned-side)
index 8df9b56ef2489c4bcbd6737c71523016bf405d27..56e348da3dbcb0c2bf6951d9e8913f357e38e6e9 100644 (file)
@@ -1508,43 +1508,38 @@ parent or the parent has no setting."
 ;; measure counter
 
 (define-public (measure-counter-stencil grob)
-  "Print a number for a measure count.  The number is centered using
-the extents of @code{BreakAlignment} grobs associated with the left and
-right bounds of a @code{MeasureCounter} spanner.  Broken measures are
-numbered in parentheses."
+  "Print a number for a measure count.  Broken measures are numbered in
+parentheses."
   (let* ((num (make-simple-markup
-               (number->string (ly:grob-property grob 'count-from))))
+                (number->string (ly:grob-property grob 'count-from))))
          (orig (ly:grob-original grob))
          (siblings (ly:spanner-broken-into orig)) ; have we been split?
          (num
-          (if (or (null? siblings)
-                  (eq? grob (car siblings)))
+           (if (or (null? siblings)
+                   (eq? grob (car siblings)))
               num
               (make-parenthesize-markup num)))
          (num (grob-interpret-markup grob num))
-         (num (ly:stencil-aligned-to num X (ly:grob-property grob 'self-alignment-X)))
+         (num (ly:stencil-aligned-to
+                num X (ly:grob-property grob 'self-alignment-X)))
          (left-bound (ly:spanner-bound grob LEFT))
          (right-bound (ly:spanner-bound grob RIGHT))
-         (elts-L (ly:grob-array->list (ly:grob-object left-bound 'elements)))
-         (elts-R (ly:grob-array->list (ly:grob-object right-bound 'elements)))
-         (break-alignment-L
-           (filter
-             (lambda (elt) (grob::has-interface elt 'break-alignment-interface))
-             elts-L))
-         (break-alignment-R
-           (filter
-             (lambda (elt) (grob::has-interface elt 'break-alignment-interface))
-             elts-R))
-         (refp (ly:grob-system grob))
-         (break-alignment-L-ext (ly:grob-extent (car break-alignment-L) refp X))
-         (break-alignment-R-ext (ly:grob-extent (car break-alignment-R) refp X))
+         (refp (ly:grob-common-refpoint left-bound right-bound X))
+         (spacing-pair
+           (ly:grob-property grob
+                             'spacing-pair
+                             '(break-alignment . break-alignment)))
+         (ext-L (ly:paper-column::break-align-width left-bound
+                                                    (car spacing-pair)))
+         (ext-R (ly:paper-column::break-align-width right-bound
+                                                    (cdr spacing-pair)))
          (num
            (ly:stencil-translate-axis
              num
-             (+ (interval-length break-alignment-L-ext)
-                (* 0.5
-                   (- (car break-alignment-R-ext)
-                      (cdr break-alignment-L-ext))))
+             (+ (* 0.5 (- (car ext-R)
+                          (cdr ext-L)))
+                (- (cdr ext-L)
+                   (ly:grob-relative-coordinate grob refp X)))
              X)))
     num))