From: Han-Wen Nienhuys Date: Sat, 6 Jan 2007 14:50:11 +0000 (+0100) Subject: Fix #223. X-Git-Tag: release/2.11.10-1~70 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=c5bf34be054141c1b2ebd354630ada56db1dfc76;p=lilypond.git Fix #223. Add Spanner_break_forbid_engraver. Looks for spanners with unbreakable-spanner-interface, and forbids breaks while those are active. Remove allowBeamBreak. --- diff --git a/input/regression/glissando-no-break.ly b/input/regression/glissando-no-break.ly new file mode 100644 index 0000000000..a30f4f56e4 --- /dev/null +++ b/input/regression/glissando-no-break.ly @@ -0,0 +1,17 @@ +\header { + + texidoc = "Glissandi are not broken. Here a @code{\break} is ineffective. +Use @code{breakable} grob property to override." + +} +\version "2.11.10" +\layout { + ragged-right = ##t +} +\relative c' { + c1 + c1\glissando + \break + d'1 + d1 +} diff --git a/lily/beam-engraver.cc b/lily/beam-engraver.cc index b0d640a62b..5ddf31008f 100644 --- a/lily/beam-engraver.cc +++ b/lily/beam-engraver.cc @@ -119,9 +119,6 @@ Beam_engraver::set_melisma (bool ml) void Beam_engraver::process_music () { - if (beam_ && !to_boolean (get_property ("allowBeamBreak"))) - context ()->get_score_context ()->set_property ("forbidBreak", SCM_BOOL_T); - if (start_ev_) { if (beam_) @@ -341,7 +338,6 @@ ADD_TRANSLATOR (Grace_beam_engraver, /* read */ "beamMelismaBusy " "beatLength " - "allowBeamBreak " "subdivideBeams " , /* write */ ""); diff --git a/lily/glissando-engraver.cc b/lily/glissando-engraver.cc index 4c506df38d..71a75d8804 100644 --- a/lily/glissando-engraver.cc +++ b/lily/glissando-engraver.cc @@ -7,6 +7,7 @@ */ #include "engraver.hh" + #include "international.hh" #include "rhythmic-head.hh" #include "spanner.hh" diff --git a/lily/spanner-break-forbid-engraver.cc b/lily/spanner-break-forbid-engraver.cc new file mode 100644 index 0000000000..41d061c058 --- /dev/null +++ b/lily/spanner-break-forbid-engraver.cc @@ -0,0 +1,68 @@ +/* + spanner-break-forbid-engraver.cc -- implement Spanner_break_forbid_engraver + + source file of the GNU LilyPond music typesetter + + (c) 2007 Han-Wen Nienhuys +*/ + + + +#include "engraver.hh" +#include "international.hh" +#include "spanner.hh" +#include "stream-event.hh" +#include "warn.hh" +#include "context.hh" + +#include "translator.icc" + +class Spanner_break_forbid_engraver : public Engraver +{ + TRANSLATOR_DECLARATIONS (Spanner_break_forbid_engraver); + vector running_spanners_; +protected: + DECLARE_ACKNOWLEDGER (unbreakable_spanner); + DECLARE_END_ACKNOWLEDGER (unbreakable_spanner); + + void process_music (); +}; + + +void +Spanner_break_forbid_engraver::process_music () +{ + if (running_spanners_.size ()) + { + context ()->get_score_context ()->set_property ("forbidBreak", SCM_BOOL_T); + } +} + +void +Spanner_break_forbid_engraver::acknowledge_end_unbreakable_spanner (Grob_info gi) +{ + vector::iterator i = find (running_spanners_.begin (), running_spanners_.end (), + gi.spanner ()); + if (i != running_spanners_.end ()) + running_spanners_.erase (i); +} + +void +Spanner_break_forbid_engraver::acknowledge_unbreakable_spanner (Grob_info gi) +{ + if (!to_boolean (gi.grob ()->get_property ("breakable"))) + running_spanners_.push_back (gi.spanner ()); +} + +Spanner_break_forbid_engraver::Spanner_break_forbid_engraver () +{ +} + + +ADD_END_ACKNOWLEDGER (Spanner_break_forbid_engraver, unbreakable_spanner); +ADD_ACKNOWLEDGER (Spanner_break_forbid_engraver, unbreakable_spanner); +ADD_TRANSLATOR (Spanner_break_forbid_engraver, + /* doc */ "Forbid breaks in certain spanners", + /* create */ "", + /* read */ "", + /* write */ ""); diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly index afc251b00b..759ef96fa6 100644 --- a/ly/engraver-init.ly +++ b/ly/engraver-init.ly @@ -233,6 +233,7 @@ contained staves are not connected vertically." \consists "Script_column_engraver" \consists "Rhythmic_column_engraver" \consists "Note_spacing_engraver" + \consists "Spanner_break_forbid_engraver" \consists "Phrasing_slur_engraver" \consists "Cluster_spanner_engraver" \consists "Slur_engraver" diff --git a/python/convertrules.py b/python/convertrules.py index d6b89e777d..2a54213bda 100644 --- a/python/convertrules.py +++ b/python/convertrules.py @@ -2927,3 +2927,13 @@ def conv (str): return str conversions.append (((2, 11, 6), conv, """Rename accidental glyphs, use glyph-name-alist.""")) + + +def conv (str): + str = re.sub (r'(\\set\s+)?([A-Z][a-zA-Z]+\s*\.\s*)allowBeamBreak', + r"\override \2Beam #'breakable", str) + str = re.sub (r'(\\set\s+)?allowBeamBreak', + r"\override Beam #'breakable", str) + return str + +conversions.append (((2, 11, 10), conv, """allowBeamBreak -> Beam #'breakable = ##t""")) diff --git a/scm/define-context-properties.scm b/scm/define-context-properties.scm index ee889b916a..5debc1d10d 100644 --- a/scm/define-context-properties.scm +++ b/scm/define-context-properties.scm @@ -38,7 +38,6 @@ (alignBassFigureAccidentals ,boolean? "If true, then the accidentals are aligned in bass figure context.") - (allowBeamBreak ,boolean? "If true allow line breaks for beams over bar lines.") (associatedVoice ,string? "Name of the @code{Voice} that has the melody for this @code{Lyrics} line.") (autoBeamSettings ,list? "Specifies diff --git a/scm/define-grob-interfaces.scm b/scm/define-grob-interfaces.scm index 4936710172..e141103e05 100644 --- a/scm/define-grob-interfaces.scm +++ b/scm/define-grob-interfaces.scm @@ -176,6 +176,13 @@ interesting enough to maintain a hara-kiri staff." "An interface for any notes set in a tablature staff" '()) +(ly:add-interface + 'unbreakable-spanner-interface + "A spanner that should not be broken across line breaks. Override +with @code{breakable=##t}. " + + '(breakable)) + (ly:add-interface 'vertically-spaceable-interface "Objects that should be kept at constant vertical distances. Typically: diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm index 07dd64b3c4..d2c49e6278 100644 --- a/scm/define-grob-properties.scm +++ b/scm/define-grob-properties.scm @@ -68,6 +68,7 @@ beaming patterns from stem to stem inside a beam.") (bracket-flare ,number-pair? "A pair of numbers specifying how much edges of brackets should slant outward. Value 0.0 means straight edges") + (breakable ,boolean? "Allow breaks here.") (break-align-symbol ,symbol? "This key is used for aligning and spacing breakable items.") (break-align-orders ,vector? " Defines the order in which diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 149b80a99a..e41b08d34c 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -698,6 +698,7 @@ (after-line-breaking . ,ly:line-spanner::after-line-breaking) (meta . ((class . Spanner) (interfaces . (line-interface + unbreakable-spanner-interface line-spanner-interface)))))) (GraceSpacing