]> git.donarmstrong.com Git - lilypond.git/commitdiff
Fix #223.
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Sat, 6 Jan 2007 14:50:11 +0000 (15:50 +0100)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Sat, 6 Jan 2007 14:50:11 +0000 (15:50 +0100)
Add Spanner_break_forbid_engraver.  Looks for spanners with
unbreakable-spanner-interface, and forbids breaks while those are
active. Remove allowBeamBreak.

input/regression/glissando-no-break.ly [new file with mode: 0644]
lily/beam-engraver.cc
lily/glissando-engraver.cc
lily/spanner-break-forbid-engraver.cc [new file with mode: 0644]
ly/engraver-init.ly
python/convertrules.py
scm/define-context-properties.scm
scm/define-grob-interfaces.scm
scm/define-grob-properties.scm
scm/define-grobs.scm

diff --git a/input/regression/glissando-no-break.ly b/input/regression/glissando-no-break.ly
new file mode 100644 (file)
index 0000000..a30f4f5
--- /dev/null
@@ -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
+} 
index b0d640a62b77811f427ae0a5fe79698b533b98ef..5ddf31008f79db006651f98d046dde16737dd988 100644 (file)
@@ -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 */ "");
index 4c506df38d14efc8d4e9e47cdc327bea35a8f72e..71a75d8804d372a9d54fe7641c6eb394ab831961 100644 (file)
@@ -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 (file)
index 0000000..41d061c
--- /dev/null
@@ -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 <hanwen@lilypond.org>
+*/
+
+
+
+#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<Spanner*> 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<Spanner*>::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 */ "");
index afc251b00b1893fab647fdbdf0ab7f0f5b732e57..759ef96fa698949840af46ed3f5e5890db576a79 100644 (file)
@@ -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"
index d6b89e777d67c0252de6873d77f56176d4999b99..2a54213bda3a7aa289ffde06cc18e95871b9088a 100644 (file)
@@ -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"""))
index ee889b916a079648e2e6dd7aa4209dcbcb354c6a..5debc1d10d531e510b84f5944c4178aad72deab3 100644 (file)
@@ -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
index 49367101724cc0ad4ba1eaa41a5da37c8b9d352d..e141103e05b05d0aadfe0d5098e56912d76405a1 100644 (file)
@@ -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:
index 07dd64b3c426be3eea81922a316623e792f1648f..d2c49e6278c4e03a2554f760dda1085a443860f9 100644 (file)
@@ -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
index 149b80a99a85fd3256e271498f5a6830cfa5cedb..e41b08d34c8e52216840c638bdd8d4625eb862bd 100644 (file)
        (after-line-breaking . ,ly:line-spanner::after-line-breaking)
        (meta . ((class . Spanner)
                 (interfaces . (line-interface
+                               unbreakable-spanner-interface
                                line-spanner-interface))))))
 
     (GraceSpacing