static vector<Box> boxes (Grob *me, Grob *left);
static Skyline conditional_skyline (Grob *, Grob *);
static Grob *extremal_break_aligned_grob (Grob *, Direction, Interval *);
- static void set_distance (Drul_array<Item *>, Real);
+ static bool set_distance (Drul_array<Item *>, Real);
static bool is_empty (Grob *me);
static void add_item (Grob *, Item *);
static void add_conditional_item (Grob *, Grob *);
Pointer_group_interface::add_grob (me, ly_symbol2scm ("conditional-elements"), e);
}
-void
+bool
Separation_item::set_distance (Drul_array<Item *> items,
- Real padding)
+ 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")));
rod.distance_ = dist;
rod.add_to_cols ();
- }
+ }
+
+ return dist > 0;
}
bool
if (Separation_item::is_empty (r))
return;
- while (idx--)
+ bool constraint = false;
+ bool grace = false;
+
+ idx--;
+ do
{
Item *l = dynamic_cast<Item*> (cols[idx]);
Item *lb = l->find_prebroken_piece (RIGHT);
if (Separation_item::is_empty (l) && (!lb || Separation_item::is_empty (lb)))
continue;
- Separation_item::set_distance (Drul_array<Item *> (l, r), padding);
if (lb)
Separation_item::set_distance (Drul_array<Item*> (lb, r), padding);
+ constraint = Separation_item::set_distance (Drul_array<Item *> (l, r), padding);
/*
the accidentals of main note may stick out so far to cover
a barline preceding the grace note.
*/
- if (spanned_time_interval (l, r).length ().main_part_ > Rational (0))
- break;
+ grace = spanned_time_interval (l, r).length ().main_part_ == Rational (0);
/*
this grob doesn't cause a constraint. We look further until we
find one that does.
*/
}
+ while (idx-- && (!constraint || grace));
}
void