X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fgrob-scheme.cc;h=c27a9ee8bdab5ff3dbe941a0e9bc6533857ca264;hb=f8159a57125bbf52e96cad584d6c3756a39d5fc9;hp=fefdcd1046b266bc1c7144640d7ed037e7ed58d7;hpb=a667c0fbd789c30b782bae277456bb1f940ddccc;p=lilypond.git diff --git a/lily/grob-scheme.cc b/lily/grob-scheme.cc index fefdcd1046..c27a9ee8bd 100644 --- a/lily/grob-scheme.cc +++ b/lily/grob-scheme.cc @@ -1,10 +1,21 @@ /* - grob-scheme.cc -- Scheme entry points for the grob datatype + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter - - (c) 1998--2007 Jan Nieuwenhuizen + Copyright (C) 1998--2010 Jan Nieuwenhuizen Han-Wen Nienhuys + + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ #include "warn.hh" // error () @@ -17,7 +28,8 @@ LY_DEFINE (ly_grob_property_data, "ly:grob-property-data", 2, 0, 0, (SCM grob, SCM sym), - "Retrieve @var{sym} for @var{grob} but don't process callbacks.") + "Return the value for property @var{sym} of @var{grob}," + " but do not process callbacks.") { Grob *sc = unsmob_grob (grob); @@ -44,23 +56,43 @@ LY_DEFINE (ly_grob_set_property_x, "ly:grob-set-property!", return SCM_UNSPECIFIED; } +LY_DEFINE (ly_grob_set_nested_property_x, "ly:grob-set-nested-property!", + 3, 0, 0, (SCM grob, SCM symlist, SCM val), + "Set nested property @var{symlist} in grob @var{grob} to value @var{val}.") +{ + Grob *sc = unsmob_grob (grob); + + LY_ASSERT_SMOB (Grob, grob, 1); + + bool type_ok = ly_cheap_is_list (symlist); + + if (type_ok) + for (SCM s = symlist; scm_is_pair (s) && type_ok; s = scm_cdr (s)) + type_ok &= ly_is_symbol (scm_car (s)); + + SCM_ASSERT_TYPE (type_ok, symlist, SCM_ARG2, __FUNCTION__, "list of symbols"); + + set_nested_property (sc, symlist, val); + return SCM_UNSPECIFIED; +} + + LY_DEFINE (ly_grob_property, "ly:grob-property", - 2, 1, 0, (SCM grob, SCM sym, SCM deflt), - "Return the value of a value in grob@tie{}@var{g} of property" - " @var{sym}. It returns @code{'()} (end-of-list) or" - " @var{deflt} (if specified) if @var{sym} is undefined" - " in@tie{}@var{g}.") + 2, 1, 0, (SCM grob, SCM sym, SCM val), + "Return the value for property @var{sym} of @var{grob}." + " If no value is found, return @var{val} or @code{'()}" + " if @var{val} is not specified.") { Grob *sc = unsmob_grob (grob); - + LY_ASSERT_SMOB (Grob, grob, 1); LY_ASSERT_TYPE (ly_is_symbol, sym, 2); - if (deflt == SCM_UNDEFINED) - deflt = SCM_EOL; + if (val == SCM_UNDEFINED) + val = SCM_EOL; SCM retval = sc->internal_get_property (sym); if (retval == SCM_EOL) - retval = deflt; + retval = val; return retval; } @@ -92,6 +124,18 @@ LY_DEFINE (ly_grob_object, "ly:grob-object", } +LY_DEFINE (ly_grob_set_object_x, "ly:grob-set-object!", + 3, 0, 0, (SCM grob, SCM sym, SCM val), + "Set @var{sym} in grob @var{grob} to value @var{val}.") +{ + Grob *sc = unsmob_grob (grob); + + LY_ASSERT_SMOB (Grob, grob, 1); + LY_ASSERT_TYPE (ly_is_symbol, sym, 2); + + sc->set_object (sym, val); + return SCM_UNSPECIFIED; +} /* TODO: make difference between scaled and unscalead variable in calling (i.e different funcs.) */ @@ -214,6 +258,22 @@ LY_DEFINE (ly_grob_parent, "ly:grob-parent", return par ? par->self_scm () : SCM_EOL; } +LY_DEFINE (ly_grob_set_parent_x, "ly:grob-set-parent!", + 3, 0, 0, (SCM grob, SCM axis, SCM parent_grob), + "Set @var{parent-grob} the parent of grob @var{grob} in axis @var{axis}.") +{ + Grob *gr = unsmob_grob (grob); + Grob *parent = unsmob_grob (parent_grob); + + LY_ASSERT_SMOB (Grob, grob, 1); + LY_ASSERT_TYPE (is_axis, axis, 2); + LY_ASSERT_SMOB (Grob, parent_grob, 3); + + Axis a = Axis (scm_to_int (axis)); + gr->set_parent (parent, a); + return SCM_UNSPECIFIED; +} + LY_DEFINE (ly_grob_properties, "ly:grob-properties", 1, 0, 0, (SCM grob), "Get the mutable properties of @var{grob}.") @@ -342,3 +402,20 @@ LY_DEFINE (ly_grob_common_refpoint_of_array, "ly:grob-common-refpoint-of-array", Grob *refp = common_refpoint_of_array (ga->array (), gr, Axis (scm_to_int (axis))); return refp ? refp->self_scm () : SCM_BOOL_F; } + +LY_DEFINE (ly_grob_chain_callback, "ly:grob-chain-callback", + 3, 0, 0, (SCM grob, SCM proc, SCM sym), + "Find the callback that is stored as property" + " @var{sym} of grob @var{grob} and chain @var{proc}" + " to the head of this, meaning that it is called" + " using @var{grob} and the previous callback's result.") +{ + Grob *gr = unsmob_grob (grob); + + LY_ASSERT_SMOB (Grob, grob, 1); + LY_ASSERT_TYPE (ly_is_procedure, proc, 2); + LY_ASSERT_TYPE (ly_is_symbol, sym, 3); + + chain_callback (gr, proc, sym); + return SCM_UNSPECIFIED; +}