]> git.donarmstrong.com Git - lilypond.git/commitdiff
Issue 4828/2: Add StaffSymbol.ledger-positions-function
authorPaul Morris <paulwmorris@gmail.com>
Sat, 23 Apr 2016 20:04:56 +0000 (16:04 -0400)
committerPaul Morris <paulwmorris@gmail.com>
Sun, 1 May 2016 16:22:23 +0000 (12:22 -0400)
Lets the user provide a (quoted) function that is used
to determine the list of ledger positions for a given
note head position.

lily/staff-symbol.cc
scm/define-grob-properties.scm

index 527a5c7baf726b2a0d04d7e4e1c841777ea9fa0f..0697085e114b7fb7811c65a71947e6c61052d9c3 100644 (file)
@@ -137,7 +137,7 @@ Staff_symbol::line_positions (Grob *me)
 vector<Real>
 Staff_symbol::ledger_positions (Grob *me, int pos, Item const *head)
 {
-  // allow the option to override ledger positions via note head grob
+  // allow override of ledger positions via note head grob...
   if (head)
     {
       SCM posns = head->get_property ("ledger-positions");
@@ -145,6 +145,17 @@ Staff_symbol::ledger_positions (Grob *me, int pos, Item const *head)
         return ly_scm2floatvector (posns);
     }
 
+  // ...or via custom ledger positions function
+  SCM lp_function = me->get_property ("ledger-positions-function");
+  if (scm_is_pair (lp_function))
+    {
+      SCM func = scm_eval (lp_function, scm_interaction_environment ());
+      if (ly_is_procedure (func))
+        return ly_scm2floatvector (scm_call_2 (func,
+                                               me->self_scm (),
+                                               scm_from_int (pos)));
+    }
+
   SCM ledger_positions = me->get_property ("ledger-positions");
   Real ledger_extra = robust_scm2double (me->get_property ("ledger-extra"), 0);
   vector<Real> line_positions = Staff_symbol::line_positions (me);
@@ -174,7 +185,7 @@ Staff_symbol::ledger_positions (Grob *me, int pos, Item const *head)
   Direction dir = (Direction)sign (pos - nearest_line);
 
   if (scm_is_pair (ledger_positions))
-    // custom ledger line positions
+    // custom ledger positions via StaffSymbol.ledger-positions
     {
       Real min_pos = HUGE_VAL;
       Real max_pos = -HUGE_VAL;
@@ -410,6 +421,7 @@ ADD_INTERFACE (Staff_symbol,
                "ledger-extra "
                "ledger-line-thickness "
                "ledger-positions "
+               "ledger-positions-function "
                "line-count "
                "line-positions "
                "staff-space "
index dcf9705998236a2a78da8ae062fb62d003930731..60b9d5b000c2e6896237aac6c9404857610719ac 100644 (file)
@@ -579,6 +579,9 @@ are added.")
 When set on a @code{StaffSymbol} grob it defines a repeating
 pattern of ledger lines and any parenthesized groups will always be
 shown together.")
+     (ledger-positions-function ,scheme? "A quoted Scheme procedure that
+takes a @code{StaffSymbol} grob and the vertical position of a note head
+as arguments and returns a list of ledger line positions.")
      (left-bound-info ,list? "An alist of properties for determining
 attachments of spanners to edges.")
      (left-padding ,ly:dimension? "The amount of space that is put