Index: lily/phrasing-slur-engraver.cc |
diff --git a/lily/phrasing-slur-engraver.cc b/lily/phrasing-slur-engraver.cc |
index 7e6c3c63fe3d8b0e026022e2ad555d767ca4dfda..2830f4a3dc29a4b488b2fb47e6dc26958bbe54e6 100644 |
--- a/lily/phrasing-slur-engraver.cc |
+++ b/lily/phrasing-slur-engraver.cc |
@@ -52,9 +52,11 @@ class Phrasing_slur_engraver : public Engraver |
vector<Grob *> slurs_; |
vector<Grob *> end_slurs_; |
vector<Grob_info> objects_to_acknowledge_; |
+ Stream_event *break_slur_; |
protected: |
DECLARE_TRANSLATOR_LISTENER (phrasing_slur); |
+ DECLARE_TRANSLATOR_LISTENER (break_phrasing_slur); |
DECLARE_ACKNOWLEDGER (inline_accidental); |
DECLARE_ACKNOWLEDGER (fingering); |
DECLARE_ACKNOWLEDGER (note_column); |
@@ -102,6 +104,13 @@ Phrasing_slur_engraver::listen_phrasing_slur (Stream_event *ev) |
"phrasing-slur-event", int (d))); |
} |
+IMPLEMENT_TRANSLATOR_LISTENER (Phrasing_slur_engraver, break_phrasing_slur); |
+void |
+Phrasing_slur_engraver::listen_break_phrasing_slur (Stream_event *ev) |
+{ |
+ ASSIGN_EVENT_ONCE (break_slur_, ev); |
+} |
+ |
void |
Phrasing_slur_engraver::acknowledge_note_column (Grob_info info) |
{ |
@@ -181,6 +190,34 @@ Phrasing_slur_engraver::finalize () |
void |
Phrasing_slur_engraver::process_music () |
{ |
+ if (break_slur_ |
+ && unsmob_grob (get_property ("currentCommandColumn"))) |
+ { |
+ for (vsize i = slurs_.size (); i--;) |
+ { |
+ Grob *ccc = unsmob_grob (get_property ("currentCommandColumn")); |
+ Spanner *s = dynamic_cast<Spanner *> (slurs_[i]); |
+ s->set_bound (RIGHT, ccc); |
+ announce_end_grob (s, SCM_EOL); |
+ slurs_.erase (slurs_.begin () + i); |
+ if (robust_scm2dir (break_slur_->get_property ("side-to-junk"), CENTER) == LEFT) |
+ s->suicide (); |
+ |
+ if (robust_scm2dir (break_slur_->get_property ("side-to-junk"), CENTER) != RIGHT) |
+ { |
+ SCM spanner_id = s->get_property ("spanner-id"); |
+ Spanner *slur = make_spanner ("Slur", s->self_scm ()); |
+ slur->set_property ("spanner-id", spanner_id); |
+ if (scm_is_number (s->get_property_data ("direction"))) |
+ set_grob_direction (slur, robust_scm2dir (s->get_property ("direction"), UP)); |
+ slur->set_bound (LEFT, ccc); |
+ slurs_.push_back (slur); |
+ } |
+ } |
+ } |
+ else if (to_boolean (get_property ("breakSlurHere"))) |
+ warning ("no current command column to break slur"); |
+ |
for (vsize i = 0; i < stop_events_.size (); i++) |
{ |
Stream_event *ev = stop_events_[i]; |
@@ -305,6 +342,7 @@ Phrasing_slur_engraver::stop_translation_timestep () |
end_slurs_.clear (); |
start_events_.clear (); |
stop_events_.clear (); |
+ break_slur_ = 0; |
} |
ADD_ACKNOWLEDGER (Phrasing_slur_engraver, inline_accidental); |