#include "separation-item.hh"
+#include "accidental-placement.hh"
#include "axis-group-interface.hh"
#include "lookup.hh"
-#include "stencil.hh"
-#include "skyline.hh"
+#include "note-column.hh"
+#include "note-head.hh"
#include "paper-column.hh"
-#include "warn.hh"
#include "pointer-group-interface.hh"
-#include "accidental-placement.hh"
+#include "skyline-pair.hh"
+#include "stencil.hh"
+#include "warn.hh"
void
Separation_item::add_item (Grob *s, Item *i)
Pointer_group_interface::add_grob (me, ly_symbol2scm ("conditional-elements"), e);
}
-bool
-Separation_item::set_distance (Drul_array<Item *> items,
- Real padding)
+Real
+Separation_item::set_distance (Item *l, Item *r, Real padding)
{
- Drul_array<Skyline_pair*> lines (Skyline_pair::unsmob (items[LEFT]->get_property ("horizontal-skylines")),
- Skyline_pair::unsmob (items[RIGHT]->get_property ("horizontal-skylines")));
- Skyline right = conditional_skyline (items[RIGHT], items[LEFT]);
+ Drul_array<Skyline_pair*> lines (Skyline_pair::unsmob (l->get_property ("horizontal-skylines")),
+ Skyline_pair::unsmob (r->get_property ("horizontal-skylines")));
+ Skyline right = conditional_skyline (r, l);
right.merge ((*lines[RIGHT])[LEFT]);
Real dist = padding + (*lines[LEFT])[RIGHT].distance (right);
{
Rod rod;
- rod.item_drul_ = items;
+ rod.item_drul_ = Drul_array<Item*> (l, r);
rod.distance_ = dist;
rod.add_to_cols ();
}
- return dist > 0;
+ return max (dist, 0.0);
}
bool
if (left)
elts = Accidental_placement::get_relevant_accidentals (read_only_elts, left);
else
- elts = read_only_elts;
+ {
+ elts = read_only_elts;
+
+ /* This is a special-case for NoteColumn: we want to include arpeggio in its
+ skyline (so spacing takes it into account) but we don't want to include it
+ in the NoteColumn's extent because some spanners (eg. Hairpin) bound themselves
+ on the NoteColumn and we don't want them to include arpeggios in their bounds.
+ */
+ if (Grob *a = Note_column::arpeggio (me)) {
+ elts.push_back (a);
+ }
+ }
Grob *ycommon = common_refpoint_of_array (elts, me, Y_AXIS);
Item *il = dynamic_cast<Item *> (elts[i]);
if (pc != il->get_column ())
continue;
- if (Axis_group_interface::has_interface (il))
+
+ /* ugh. We want to exclude groups of grobs (so that we insert each grob
+ individually into the skyline instead of adding a single box that
+ bounds all of them). However, we can't exclude an axis-group that
+ adds to its childrens' stencil. Currently, this is just TrillPitchGroup;
+ hence the check for note-head-interface. */
+ if (Axis_group_interface::has_interface (il)
+ && !Note_head::has_interface (il))
continue;
Interval y (il->pure_height (ycommon, 0, very_large));
return out;
}
-extern bool debug_skylines;
MAKE_SCHEME_CALLBACK (Separation_item, print, 1)
SCM
Separation_item::print (SCM smob)
}
ADD_INTERFACE (Separation_item,
- "Item that computes widths to generate spacing rods. "
- ,
+ "Item that computes widths to generate spacing rods.",
+ /* properties */
"X-extent "
"conditional-elements "
"elements "