]> git.donarmstrong.com Git - lilypond.git/commitdiff
allow reverts of nested properties too.
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Sat, 3 Feb 2007 00:00:27 +0000 (01:00 +0100)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Sat, 3 Feb 2007 00:00:27 +0000 (01:00 +0100)
lily/context-property.cc
lily/grob-property.cc
lily/include/context.hh
lily/include/grob.hh
lily/nested-property.cc [new file with mode: 0644]
scm/ly-syntax-constructors.scm

index 81bb7c588175d56a0ddb5122320e026d53815479..e02597929162c444636c331f49552c686bb0d8f3 100644 (file)
 #include "spanner.hh"
 #include "warn.hh"
 
-/*
-  copy ALIST leaving out SYMBOL. Copying stops at ALIST_END
-*/
-SCM
-evict_from_alist (SCM symbol,
-                 SCM alist,
-                 SCM alist_end)
-{
-  SCM new_alist = SCM_EOL;
-  SCM *tail = &new_alist;
-
-  while (alist != alist_end)
-    {
-      if (ly_is_equal (scm_caar (alist), symbol))
-       {
-         alist = scm_cdr (alist);
-         break;
-       }
-
-      *tail = scm_cons (scm_car (alist), SCM_EOL);
-      tail = SCM_CDRLOC (*tail);
-      alist = scm_cdr (alist);
-    }
-
-  *tail = alist;
-  return new_alist;
-}
 
 void
 general_pushpop_property (Context *context,
@@ -108,8 +81,10 @@ execute_override_property (Context *context,
       return;
     }
 
-  SCM symbol = scm_car (grob_property_path);
   SCM target_alist = scm_car (current_context_val);
+  SCM parent_alist = scm_cdr (current_context_val);
+
+  SCM symbol = scm_car (grob_property_path);
   if (scm_is_pair (scm_cdr (grob_property_path)))
     {
       new_value = nested_property_alist (ly_assoc_get (symbol, target_alist, 
@@ -119,7 +94,8 @@ execute_override_property (Context *context,
     }
 
   if (scm_is_pair (target_alist)
-      && scm_caar (target_alist) == symbol)
+      && scm_caar (target_alist) == symbol
+      && target_alist != parent_alist)
     target_alist = scm_cdr (target_alist);
 
   target_alist = scm_acons (symbol, new_value, target_alist);
@@ -141,7 +117,11 @@ execute_override_property (Context *context,
     }
 }
 
-         
+void
+execute_revert_property (Context *context,
+                        SCM context_property,
+                        SCM grob_property_path);
+
 void
 execute_general_pushpop_property (Context *context,
                                  SCM context_property,
@@ -150,21 +130,26 @@ execute_general_pushpop_property (Context *context,
                                  )
 {
   if (new_value != SCM_UNDEFINED)
-    {
-      execute_override_property (context, context_property,
-                                grob_property_path,
-                                new_value);
-
-      return;
-    }
+    execute_override_property (context, context_property,
+                              grob_property_path,
+                              new_value);
+  else
+    execute_revert_property (context, context_property,
+                            grob_property_path);
+}
 
+void
+execute_revert_property (Context *context,
+                        SCM context_property,
+                        SCM grob_property_path)
+{
   /*
     revert.
-   */
+  */
   SCM current_context_val = SCM_EOL;
   if (context->where_defined (context_property, &current_context_val) == context)
     {
-      SCM current_value = scm_car (current_context_val);
+      SCM current_alist = scm_car (current_context_val);
       SCM daddy = scm_cdr (current_context_val);
 
       if (!scm_is_pair (grob_property_path)
@@ -175,12 +160,29 @@ execute_general_pushpop_property (Context *context,
        }
       
       SCM symbol = scm_car (grob_property_path);
-      SCM new_alist = evict_from_alist (symbol, current_value, daddy);
 
-      if (new_alist == daddy)
-       context->unset_property (context_property);
+      if (scm_is_pair (scm_cdr (grob_property_path)))
+       {
+         SCM current_sub_alist = ly_assoc_get (symbol, current_alist, SCM_EOL);
+         SCM new_val = nested_property_revert_alist (current_sub_alist, scm_cdr (grob_property_path));
+           
+         if (scm_is_pair (current_alist)
+             && scm_caar (current_alist) == symbol
+             && current_alist != daddy)
+           current_alist = scm_cdr (current_alist);
+
+         current_alist = scm_acons (symbol, new_val, current_alist);
+         scm_set_car_x (current_context_val, current_alist);
+       }
       else
-       context->set_property (context_property, scm_cons (new_alist, daddy));
+       {
+         SCM new_alist = evict_from_alist (symbol, current_alist, daddy);
+         
+         if (new_alist == daddy)
+           context->unset_property (context_property);
+         else
+           context->set_property (context_property, scm_cons (new_alist, daddy));
+       }
     }
 }
 
index bebd8dfbf6e4bc364585aa1190dfab5bf7628977..e7b59d954d6559d1babf22a0a0d173c0e1de8b38 100644 (file)
@@ -279,36 +279,3 @@ call_pure_function (SCM unpure, SCM args, int start, int end)
                      scm_list_4 (unpure, args, scm_from_int (start), scm_from_int (end)));
 }
 
-
-/*
-  PROP_PATH should be big-to-small ordering
- */
-SCM 
-nested_property_alist (SCM alist, SCM prop_path, SCM value)
-{
-  SCM new_value = SCM_BOOL_F;
-  if (scm_is_pair (scm_cdr (prop_path)))
-    {
-      SCM sub_alist = ly_assoc_get (scm_car (prop_path), alist, SCM_EOL);
-      new_value = nested_property_alist (sub_alist, scm_cdr (prop_path), value);
-    }
-  else
-    {
-      new_value = value;
-    }
-  
-  return scm_acons (scm_car (prop_path), new_value, alist);
-}
-
-
-void
-set_nested_property (Grob *me, SCM big_to_small, SCM value)
-{
-  SCM alist = me->get_property (scm_car (big_to_small));
-
-  alist = nested_property_alist (alist, scm_cdr (big_to_small), value);
-  
-  me->set_property (scm_car (big_to_small),
-                   alist);
-}
-
index d26739739968323020114c5a18f495fa609fdd7b..31b7baf19fedf4defcc43f84662959dc64802fc4 100644 (file)
@@ -147,6 +147,8 @@ void set_context_property_on_children (Context *trans, SCM sym, SCM val);
 }
 
 SCM nested_property_alist (SCM alist, SCM prop_path, SCM value);
+SCM nested_property_revert_alist (SCM alist, SCM prop_path);
+SCM evict_from_alist (SCM, SCM, SCM);
 
 #endif /* CONTEXT_HH */
 
index d134068568b6810e271203eb1d7b7fac1749a572..2ef5dffcdc13f61f7f7e74148a43f73ccdf4dd24 100644 (file)
@@ -152,5 +152,4 @@ SCM call_pure_function (SCM unpure, SCM args, int start, int end);
 
 void set_nested_property (Grob *, SCM property_path, SCM value);
 
-
 #endif /* GROB_HH */
diff --git a/lily/nested-property.cc b/lily/nested-property.cc
new file mode 100644 (file)
index 0000000..c1174b1
--- /dev/null
@@ -0,0 +1,78 @@
+#include "context.hh"
+#include "grob.hh"
+
+SCM
+evict_from_alist (SCM symbol,
+                 SCM alist,
+                 SCM alist_end)
+{
+  SCM new_alist = SCM_EOL;
+  SCM *tail = &new_alist;
+
+  while (alist != alist_end)
+    {
+      if (ly_is_equal (scm_caar (alist), symbol))
+       {
+         alist = scm_cdr (alist);
+         break;
+       }
+
+      *tail = scm_cons (scm_car (alist), SCM_EOL);
+      tail = SCM_CDRLOC (*tail);
+      alist = scm_cdr (alist);
+    }
+
+  *tail = alist;
+  return new_alist;
+}
+
+/*
+  PROP_PATH should be big-to-small ordering
+ */
+SCM 
+nested_property_alist (SCM alist, SCM prop_path, SCM value)
+{
+  SCM new_value = SCM_BOOL_F;
+  if (scm_is_pair (scm_cdr (prop_path)))
+    {
+      SCM sub_alist = ly_assoc_get (scm_car (prop_path), alist, SCM_EOL);
+      new_value = nested_property_alist (sub_alist, scm_cdr (prop_path), value);
+    }
+  else
+    {
+       new_value = value;
+    }
+
+  return scm_acons (scm_car (prop_path), new_value, alist);
+}
+
+SCM 
+nested_property_revert_alist (SCM alist, SCM prop_path)
+{
+  SCM new_sub_alist = SCM_EOL;
+  SCM sym = scm_car (prop_path);
+  if (scm_is_pair (scm_cdr (prop_path)))
+    {
+      SCM sub_alist = ly_assoc_get (sym, alist, SCM_EOL);
+      new_sub_alist = nested_property_revert_alist (sub_alist, scm_cdr (prop_path));
+    }
+  else
+    {
+      new_sub_alist = evict_from_alist (sym, alist, SCM_EOL);
+    }
+
+  return scm_acons (sym, new_sub_alist, alist);
+}
+
+
+void
+set_nested_property (Grob *me, SCM big_to_small, SCM value)
+{
+  SCM alist = me->get_property (scm_car (big_to_small));
+
+  alist = nested_property_alist (alist, scm_cdr (big_to_small), value);
+  
+  me->set_property (scm_car (big_to_small),
+                   alist);
+}
+
index cfdee35a3bed93f3e14264d57efb739c94c15cef..9e6325a1563b9897828eb8e8ebfa3e2cfac3fdb2 100644 (file)
                  ((OverrideProperty) (list 'grob-value (car args)
                                            'grob-property-path (cdr args)
                                            'pop-first #t))
-                 ((RevertProperty) (list 'grob-property-path args))
+                 ((RevertProperty)
+                  (if (list? (car args))
+                      (list 'grob-property-path (car args))
+                      (list 'grob-property-path args)))
                  (else (ly:error (_ "Invalid property operation ~a") music-type))))
         (oprops (if once (cons* 'once once props) props))
         (m (apply make-music music-type