2 separation-item.cc -- implement Separation_item
4 source file of the GNU LilyPond music typesetter
6 (c) 1998--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
9 #include "separation-item.hh"
11 #include "paper-column.hh"
13 #include "group-interface.hh"
14 #include "accidental-placement.hh"
17 Separation_item::add_item (Grob
*s
, Item
*i
)
20 Pointer_group_interface::add_grob (s
, ly_symbol2scm ("elements"), i
);
21 s
->add_dependency (i
);
25 Separation_item::add_conditional_item (Grob
*me
, Grob
*e
)
27 Pointer_group_interface::add_grob (me
, ly_symbol2scm ("conditional-elements"), e
);
31 Return the width of ME given that we are considering the object on
35 Separation_item::conditional_width (Grob
*me
, Grob
*left
)
37 Interval w
= width (me
);
39 Item
*item
= dynamic_cast<Item
*> (me
);
40 Paper_column
*pc
= item
->get_column ();
42 for (SCM s
= me
->get_property ("conditional-elements"); scm_is_pair (s
); s
= scm_cdr (s
))
44 SCM elt
= scm_car (s
);
45 if (!unsmob_grob (elt
))
48 Item
*il
= unsmob_item (elt
);
49 if (pc
!= il
->get_column ())
51 /* this shouldn't happen, but let's continue anyway. */
52 programming_error ("Separation_item: I've been drinking too much");
56 if (to_boolean (il
->get_property ("no-spacing-rods")))
61 if (Accidental_placement::has_interface (il
))
63 w
.unite (Accidental_placement::get_relevant_accidental_extent (il
, pc
, left
));
67 SCM pad
= me
->get_property ("padding");
69 w
.widen (robust_scm2double (pad
, 0.0));
74 Separation_item::width (Grob
*me
)
76 SCM sw
= me
->get_property ("X-extent");
77 if (is_number_pair (sw
))
79 return ly_scm2interval (sw
);
82 Item
*item
= dynamic_cast<Item
*> (me
);
83 Paper_column
*pc
= item
->get_column ();
86 for (SCM s
= me
->get_property ("elements"); scm_is_pair (s
); s
= scm_cdr (s
))
88 SCM elt
= scm_car (s
);
89 if (!unsmob_grob (elt
))
92 Item
*il
= unsmob_item (elt
);
93 if (pc
!= il
->get_column ())
95 /* this shouldn't happen, but let's continue anyway. */
96 programming_error ("Separation_item: I've been drinking too much");
100 if (to_boolean (il
->get_property ("no-spacing-rods")))
105 Interval
iv (il
->extent (pc
, X_AXIS
));
112 SCM pad
= me
->get_property ("padding");
114 w
.widen (robust_scm2double (pad
, 0.0));
116 me
->set_property ("X-extent", ly_interval2scm (w
));
122 Separation_item::relative_width (Grob
*me
, Grob
*common
)
124 Interval iv
= width (me
);
126 return dynamic_cast<Item
*> (me
)->get_column ()->relative_coordinate (common
, X_AXIS
) + iv
;
130 Try to find the break-aligned symbol in SEPARATION_ITEM that is
131 sticking out at direction D. The x size is put in LAST_EXT
134 Separation_item::extremal_break_aligned_grob (Grob
*separation_item
, Direction d
,
137 Grob
*col
= dynamic_cast<Item
*> (separation_item
)->get_column ();
138 last_ext
->set_empty ();
140 for (SCM s
= separation_item
->get_property ("elements");
141 scm_is_pair (s
); s
= scm_cdr (s
))
143 Grob
*break_item
= unsmob_grob (scm_car (s
));
145 if (!scm_is_symbol (break_item
->get_property ("break-align-symbol")))
148 Interval ext
= break_item
->extent (col
, X_AXIS
);
153 || (last_grob
&& d
* (ext
[d
]- (*last_ext
)[d
]) > 0))
156 last_grob
= break_item
;
163 ADD_INTERFACE (Separation_item
, "separation-item-interface",
164 "Item that computes widths to generate spacing rods. "
165 "This is done in concert with @ref{separation-spanner-interface}.",
166 "padding X-extent conditional-elements elements");