From: Han-Wen Nienhuys Date: Sat, 3 Feb 2007 00:00:27 +0000 (+0100) Subject: allow reverts of nested properties too. X-Git-Tag: release/2.11.16-1~23 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=938ad96fe39f1708d3abf382fe573b1794a53664;p=lilypond.git allow reverts of nested properties too. --- diff --git a/lily/context-property.cc b/lily/context-property.cc index 81bb7c5881..e025979291 100644 --- a/lily/context-property.cc +++ b/lily/context-property.cc @@ -16,33 +16,6 @@ #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, ¤t_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)); + } } } diff --git a/lily/grob-property.cc b/lily/grob-property.cc index bebd8dfbf6..e7b59d954d 100644 --- a/lily/grob-property.cc +++ b/lily/grob-property.cc @@ -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); -} - diff --git a/lily/include/context.hh b/lily/include/context.hh index d267397399..31b7baf19f 100644 --- a/lily/include/context.hh +++ b/lily/include/context.hh @@ -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 */ diff --git a/lily/include/grob.hh b/lily/include/grob.hh index d134068568..2ef5dffcdc 100644 --- a/lily/include/grob.hh +++ b/lily/include/grob.hh @@ -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 index 0000000000..c1174b174d --- /dev/null +++ b/lily/nested-property.cc @@ -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); +} + diff --git a/scm/ly-syntax-constructors.scm b/scm/ly-syntax-constructors.scm index cfdee35a3b..9e6325a156 100644 --- a/scm/ly-syntax-constructors.scm +++ b/scm/ly-syntax-constructors.scm @@ -132,7 +132,10 @@ ((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