From: Carl Sorensen Date: Fri, 1 Oct 2010 03:05:22 +0000 (-0600) Subject: Fix 1284 -- make \revertTimeSignatureSettings work properly X-Git-Tag: release/2.13.36-1~82^2~3 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=9392f895cb37b3678ec03cc30ff28bccb7f3f452;p=lilypond.git Fix 1284 -- make \revertTimeSignatureSettings work properly scm/time-signature-settings.scm -- fix broken revert function input/regression/multiple-time-sig-settings.ly -- Add test for \revertTimeSignatureSettings --- diff --git a/input/regression/multiple-time-sig-settings.ly b/input/regression/multiple-time-sig-settings.ly index 3c6565ab79..9a91b5417c 100644 --- a/input/regression/multiple-time-sig-settings.ly +++ b/input/regression/multiple-time-sig-settings.ly @@ -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 | } diff --git a/scm/time-signature-settings.scm b/scm/time-signature-settings.scm index 78599e2614..42bf5bfd41 100644 --- a/scm/time-signature-settings.scm +++ b/scm/time-signature-settings.scm @@ -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},