X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fseparating-group-spanner.cc;h=6b5c2302a82d96992e443e587bb8022ab18e2345;hb=0af2486a28f1c60b9de929a9101964d880927e54;hp=8890ddbdd7aec24f890796fc0398616a12d23cd2;hpb=ad4297de0246935caa4c51f4e152e20009a6f64e;p=lilypond.git diff --git a/lily/separating-group-spanner.cc b/lily/separating-group-spanner.cc index 8890ddbdd7..6b5c2302a8 100644 --- a/lily/separating-group-spanner.cc +++ b/lily/separating-group-spanner.cc @@ -3,31 +3,34 @@ source file of the GNU LilyPond music typesetter - (c) 1998--1999 Han-Wen Nienhuys + (c) 1998--2000 Han-Wen Nienhuys */ #include "separating-group-spanner.hh" -#include "single-malt-grouping-item.hh" +#include "separation-item.hh" #include "paper-column.hh" #include "paper-def.hh" #include "dimensions.hh" +#include "group-interface.hh" static Rod -make_rod (Single_malt_grouping_item *l, Single_malt_grouping_item *r) +make_rod (Item *l, Item *r) { Rod rod; + + Interval li (Separation_item::my_width (l)); + Interval ri (Separation_item::my_width (r)); + rod.item_l_drul_[LEFT] =l; rod.item_l_drul_[RIGHT]=r; - Interval li (l->my_width ()); - Interval ri (r->my_width ()); - if (li.empty_b () || ri.empty_b ()) rod.distance_f_ = 0; else rod.distance_f_ = li[RIGHT] - ri[LEFT]; + rod.columnize (); return rod; } @@ -37,20 +40,30 @@ Separating_group_spanner::get_rods () const { Array a; - for (int i=0; i < spacing_unit_l_arr_.size () -1; i++) + for (SCM s = get_elt_property ("elements"); gh_pair_p (s) && gh_pair_p (gh_cdr (s)); s = gh_cdr (s)) { - Single_malt_grouping_item *l =spacing_unit_l_arr_[i]; - Single_malt_grouping_item *lb - = dynamic_cast(l->find_prebroken_piece (RIGHT)); - Single_malt_grouping_item *r = spacing_unit_l_arr_[i+1]; - Single_malt_grouping_item *rb - = dynamic_cast(r->find_prebroken_piece (LEFT)); + /* + Order of elements is reversed! + */ + SCM elt = gh_cadr (s); + SCM next_elt = gh_car (s); + + Item *l = dynamic_cast (unsmob_element (elt)); + Item *r = dynamic_cast (unsmob_element ( next_elt)); + + if (!r || !l) + continue; - a.push (make_rod(spacing_unit_l_arr_[i], spacing_unit_l_arr_[i+1])); + Item *lb + = dynamic_cast(l->find_prebroken_piece (RIGHT)); + + Item *rb + = dynamic_cast(r->find_prebroken_piece (LEFT)); + + a.push (make_rod(l, r)); if (lb) { Rod rod(make_rod (lb, r)); - rod.distance_f_ += padding_f_; a.push (rod); } @@ -62,34 +75,39 @@ Separating_group_spanner::get_rods () const if (lb && rb) { Rod rod(make_rod (lb, rb)); - rod.distance_f_ += padding_f_; a.push (rod); } } - + + /* + We've done our job, so we get lost. + */ + for (SCM s = get_elt_property ("elements"); gh_pair_p (s); s = gh_cdr (s)) + { + Item * it =dynamic_cast(unsmob_element (gh_car (s))); + if (it && it->broken_b ()) + { + it->find_prebroken_piece (LEFT) ->suicide (); + it->find_prebroken_piece (RIGHT)->suicide (); + } + it->suicide (); + } + + ((Separating_group_spanner *)this)->suicide (); + return a; } void -Separating_group_spanner::add_spacing_unit (Single_malt_grouping_item*i) +Separating_group_spanner::add_spacing_unit (Score_element* me ,Item*i) { - spacing_unit_l_arr_.push (i); - add_dependency (i); + Pointer_group_interface (me, "elements").add_element (i); + me->add_dependency (i); } -void -Separating_group_spanner::do_substitute_element_pointer (Score_element*o, - Score_element*n) -{ - if (dynamic_cast (o)) - { - Single_malt_grouping_item*ns = dynamic_cast (n); - spacing_unit_l_arr_.substitute (dynamic_cast (o), ns); - } -} -Separating_group_spanner::Separating_group_spanner() +Separating_group_spanner::Separating_group_spanner (SCM s) + : Spanner (s) { - set_elt_property (break_helper_only_scm_sym, SCM_BOOL_T); - padding_f_ =0.0; + set_elt_property ("elements", SCM_EOL); }