]> git.donarmstrong.com Git - lilypond.git/commitdiff
Fix 1284 -- make \revertTimeSignatureSettings work properly
authorCarl Sorensen <c_sorensen@byu.edu>
Fri, 1 Oct 2010 03:05:22 +0000 (21:05 -0600)
committerCarl Sorensen <c_sorensen@byu.edu>
Fri, 1 Oct 2010 10:31:35 +0000 (04:31 -0600)
scm/time-signature-settings.scm -- fix broken revert function

input/regression/multiple-time-sig-settings.ly -- Add test
for \revertTimeSignatureSettings

input/regression/multiple-time-sig-settings.ly
scm/time-signature-settings.scm

index 3c6565ab797a2c7bcec7efe93d21468f0f4b1367..9a91b5417ccc8ba094323543519c0a42b7952f62 100644 (file)
@@ -3,7 +3,8 @@
 \header {
   texidoc = "
 Multiple overrides to the default time signature settings can be
-added.  In this example, all notes should be beamed at 1/4.
+added.  In this example, notes should be beamed as indicated
+by the markups.
 "
 }
 
@@ -21,11 +22,13 @@ added.  In this example, all notes should be beamed at 1/4.
       #'(1 1 1)    % beatStructure
       #'()       % beamExceptions
   \time 4/4
-  c8 c c c c c c c |
+  c8^\markup {"Beam by 1/4"} c c c c c c c |
   \time 3/4
-  c8 c c c c c |
+  c8^\markup {"Beam by 1/4"} c c c c c |
+  \revertTimeSignatureSettings #'Score #'(4 . 4)
+  \revertTimeSignatureSettings #'Score #'(3 . 4)
   \time 4/4
-  c8 c c c c c c c |
+  c8^\markup {"Beam by 1/2"} c c c c c c c |
   \time 3/4
-  c8 c c c c c |
+  c8^\markup {"Beam by 3/4"} c c c c c |
 }
index 78599e2614000cb0fa82206995983777facf40fe..42bf5bfd41ee163ec17e74132d43b75c1ac695fd 100644 (file)
@@ -254,18 +254,32 @@ checking. "
   "Like the C++ code that executes \revert, but without type
 checking. "
 
-  (define (revert-member alist entry new)
-    "Return ALIST, with ENTRY removed.  ALIST is not modified, instead
+  (define (entry-count alist entry-key)
+    "Count the number of entries in alist with a key of
+ENTRY-KEY."
+    (cond
+      ((null? alist) 0)
+      ((equal? (caar alist) entry-key)
+         (+ 1 (entry-count (cdr alist) entry-key)))
+      (else (entry-count (cdr alist) entry-key))))
+
+  (define (revert-member alist entry-key)
+    "Return ALIST, with the first entry having a key of
+ENTRY-KEY removed.  ALIST is not modified, instead
 a fresh copy of the list-head is made."
     (cond
-      ((null? alist) new)
-      ((equal? (car alist) entry) (revert-member (cdr alist) entry new))
+      ((null? alist) '())
+      ((equal? (caar alist) entry-key) (cdr alist))
       (else (cons (car alist)
-                  (revert-member (cdr alist) entry new)))))
-
-  (ly:context-set-property!
-    context property
-    (revert-member (ly:context-property context property) setting '())))
+                  (revert-member (cdr alist) entry-key)))))
+
+  ;; body of revert-property-setting
+  (let ((current-value (ly:context-property context property)))
+    (if (> (entry-count current-value setting) 1)
+        (ly:context-set-property!
+          context
+          property
+          (revert-member current-value setting)))))
 
 (define-public (override-time-signature-setting time-signature setting . rest)
   "Override the time signature settings for the context in @var{rest},