#include "note-spacing.hh"
+#include "bar-line.hh"
#include "directional-element-interface.hh"
#include "grob-array.hh"
#include "paper-column.hh"
Drul_array<Skyline> skys = Spacing_interface::skylines (me, right_col);
Real distance = skys[LEFT].distance (skys[RIGHT]);
Real min_dist = max (0.0, distance);
- Real min_desired_space = left_head_end + (min_dist - left_head_end) / 2;
- Real ideal = max (base_space - increment + left_head_end, min_desired_space);
+ Real min_desired_space = left_head_end + (min_dist - left_head_end + base_space - increment) / 2;
+ Real ideal = base_space - increment + left_head_end;
+
+ /* If we have a NonMusical column on the right, we measure the ideal distance
+ to the bar-line (if present), not the start of the column. */
+ if (!Paper_column::is_musical (right_col)
+ && !skys[RIGHT].is_empty ()
+ && to_boolean (me->get_property ("space-to-barline")))
+ {
+ Grob *bar = Pointer_group_interface::find_grob (right_col,
+ ly_symbol2scm ("elements"),
+ Bar_line::has_interface);
- /* If the NonMusicalPaperColumn on the right sticks out a lot, ensure that
- the amount of whitespace between the end of the note-head and that column is
- (base_spacing - increment) (without this line, this would be the distance,
- not the whitespace)
- */
- if (!Paper_column::is_musical (right_col))
- ideal = max (ideal, base_space - increment + distance);
+ if (bar)
+ {
+ Real shift = bar->extent (right_col, X_AXIS)[LEFT];
+ ideal -= shift;
+ min_desired_space -= max (shift, 0.0);
+ }
+ else
+ ideal -= right_col->extent (right_col, X_AXIS)[RIGHT];
+ }
+ ideal = max (ideal, min_desired_space);
stem_dir_correction (me, right_col, increment, &ideal, &min_desired_space);
- Spring ret (ideal, min_dist);
- ret.set_inverse_compress_strength (max (0.0, ideal - max (min_dist, min_desired_space)));
+ /* TODO: grace notes look bad when things are stretched. Should we increase
+ their stretch strength? */
+ Spring ret (max (0.0, ideal), min_dist);
+ ret.set_inverse_compress_strength (max (0.0, ideal - min_desired_space));
ret.set_inverse_stretch_strength (max (0.1, base_space - increment));
return ret;
}
for (vsize i = 0; i < items.size (); i++)
{
Item *it = dynamic_cast<Item *> (items[i]);
+ if (!Note_column::has_interface (it))
+ continue;
/*
don't correct if accidentals are sticking out of the right side.
"right-items "
"same-direction-correction "
"stem-spacing-correction "
+ "space-to-barline "
);