From 10fcff2ab04beb0f31888d56f22855e84c08c3a7 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Thu, 1 May 2008 18:15:48 -0300 Subject: [PATCH] Fix #434, #440 In single tie case, use Tie::get_default_dir() to determine tie directions. This now peeks across line boundaries, so the direction for the 2 broken halves is synced. Add neutral-direction to Tie so the defaults can be adjusted. --- input/regression/tie-direction-broken.ly | 21 +++++++++++++++++++++ lily/include/tie-details.hh | 1 + lily/tie-details.cc | 5 ++++- lily/tie-formatting-problem.cc | 3 ++- lily/tie.cc | 20 +++++++++++++++++--- scm/define-grobs.scm | 1 + 6 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 input/regression/tie-direction-broken.ly diff --git a/input/regression/tie-direction-broken.ly b/input/regression/tie-direction-broken.ly new file mode 100644 index 0000000000..895f87f56f --- /dev/null +++ b/input/regression/tie-direction-broken.ly @@ -0,0 +1,21 @@ + +\version "2.11.45" + +\header { + + texidoc = "In the single tie case, broken ties peek across line + boundaries to determine which direction to take." + +} + + +\paper { + ragged-right = ##t +} + +\relative c'' { + bes1~ \break + bes2. + \stemUp bes4 ~ \break + bes1 +} diff --git a/lily/include/tie-details.hh b/lily/include/tie-details.hh index 18b9127d1e..24402e56c5 100644 --- a/lily/include/tie-details.hh +++ b/lily/include/tie-details.hh @@ -43,6 +43,7 @@ struct Tie_details int single_tie_region_size_; int multi_tie_region_size_; + Direction neutral_direction_; Tie_details (); void from_grob (Grob *); diff --git a/lily/tie-details.cc b/lily/tie-details.cc index 7c39b1c717..75a32d5bb7 100644 --- a/lily/tie-details.cc +++ b/lily/tie-details.cc @@ -28,7 +28,10 @@ Tie_details::from_grob (Grob *me) { staff_symbol_referencer_ = me; staff_space_ = Staff_symbol_referencer::staff_space (me); - + + neutral_direction_ = to_dir (me->get_property ("neutral-direction")); + if (!neutral_direction_) + neutral_direction_ = DOWN; SCM details = me->get_property ("details"); diff --git a/lily/tie-formatting-problem.cc b/lily/tie-formatting-problem.cc index bb50c4fbc1..6aa5feb3b1 100644 --- a/lily/tie-formatting-problem.cc +++ b/lily/tie-formatting-problem.cc @@ -977,7 +977,8 @@ Tie_formatting_problem::set_ties_config_standard_directions (Ties_configuration tie_configs->at (0).dir_ = Direction (sign (tie_configs->at (0).position_)); if (!tie_configs->at (0).dir_) - tie_configs->at (0).dir_ = DOWN; + tie_configs->at (0).dir_ + = (tie_configs->size() > 1) ? DOWN : details_.neutral_direction_; } if (!tie_configs->back ().dir_) diff --git a/lily/tie.cc b/lily/tie.cc index aa265f5042..980484d21b 100644 --- a/lily/tie.cc +++ b/lily/tie.cc @@ -17,6 +17,7 @@ #include "note-head.hh" #include "output-def.hh" #include "paper-column.hh" +#include "pointer-group-interface.hh" #include "rhythmic-head.hh" #include "spanner.hh" #include "staff-symbol-referencer.hh" @@ -113,7 +114,11 @@ Tie::get_default_dir (Grob *me) Direction d = LEFT; do { - Grob *stem = head (me, d) ? Rhythmic_head::get_stem (head (me, d)) : 0; + Grob *one_head = head (me, d); + if (!one_head && dynamic_cast (me)) + one_head = Tie::head (dynamic_cast (me)->broken_neighbor (d), d); + + Grob *stem = one_head ? Rhythmic_head::get_stem (one_head) : 0; if (stem) stem = Stem::is_invisible (stem) ? 0 : stem; @@ -135,7 +140,7 @@ Tie::get_default_dir (Grob *me) else if (int p = get_position (me)) return Direction (sign (p)); - return UP; + return to_dir (me->get_property("neutral-direction")); } @@ -218,6 +223,14 @@ Tie::calc_control_points (SCM smob) // && unsmob_grob_array (yparent->get_object ("ties"))->size () > 1 ) { + extract_grob_set (yparent, "ties", ties); + if (ties.size() == 1 + && !to_dir (me->get_property_data ("direction"))) + { + assert (ties[0] == me); + set_grob_direction (me, Tie::get_default_dir (me)); + } + /* trigger positioning. */ (void) yparent->get_property ("positioning-done"); } @@ -310,10 +323,11 @@ ADD_INTERFACE (Tie, "dash-period " "details " "direction " - "separation-item " "head-direction " "line-thickness " + "neutral-direction " "quant-score " + "separation-item " "staff-position " "thickness " ); diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 652a139243..bb56a76827 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -1886,6 +1886,7 @@ (springs-and-rods . ,ly:spanner::set-spacing-rods) (avoid-slur . inside) (direction . ,ly:tie::calc-direction) + (neutral-direction . ,DOWN) (stencil . ,ly:tie::print) (font-size . -6) (details . ( -- 2.39.5