]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/spacing-engraver.cc
*** empty log message ***
[lilypond.git] / lily / spacing-engraver.cc
index d567cb6ebc279d53e1f55ed741b7c9020bf2cf22..b3ca5753932cb2253c2cc3e3d385bc8d18c61940 100644 (file)
@@ -32,9 +32,21 @@ struct Rhythmic_tuple
   static int time_compare (Rhythmic_tuple const &, Rhythmic_tuple const &);
 };
 
-/*
-  TODO: allow starting & stopping of spacing regions.
-*/
+inline int
+compare (Rhythmic_tuple const &a, Rhythmic_tuple const &b)
+{
+  return Rhythmic_tuple::time_compare (a, b);
+}
+
+int
+Rhythmic_tuple::time_compare (Rhythmic_tuple const &h1,
+                             Rhythmic_tuple const &h2)
+{
+  return (h1.end_ - h2.end_).main_part_.sign ();
+}
+
+/****************************************************************/
+
 /*
   Acknowledge rhythmic elements, for initializing spacing fields in
   the columns.
@@ -46,7 +58,8 @@ class Spacing_engraver : public Engraver
   vector<Rhythmic_tuple> stopped_durations_;
   Moment now_;
   Spanner *spacing_;
-
+  Music *start_section_;
+  
   TRANSLATOR_DECLARATIONS (Spacing_engraver);
 
 protected:
@@ -57,39 +70,55 @@ protected:
   void start_translation_timestep ();
   void stop_translation_timestep ();
   void process_music ();
+  
   virtual void finalize ();
+  virtual bool try_music (Music *m);
+
+  void start_spanner ();
+  void stop_spanner ();
 };
 
-inline int
-compare (Rhythmic_tuple const &a, Rhythmic_tuple const &b)
+Spacing_engraver::Spacing_engraver ()
 {
-  return Rhythmic_tuple::time_compare (a, b);
+  spacing_ = 0;
+  start_section_ = 0;
 }
 
-int
-Rhythmic_tuple::time_compare (Rhythmic_tuple const &h1,
-                             Rhythmic_tuple const &h2)
+bool
+Spacing_engraver::try_music (Music *m)
 {
-  return (h1.end_ - h2.end_).main_part_.sign ();
+  start_section_ = m;
+  return true;  
 }
 
-Spacing_engraver::Spacing_engraver ()
+void
+Spacing_engraver::process_music ()
 {
-  spacing_ = 0;
+  if (start_section_ && spacing_)
+    stop_spanner ();
+  
+  if (!spacing_)
+    start_spanner ();
 }
 
 void
-Spacing_engraver::process_music ()
+Spacing_engraver::start_spanner ()
 {
-  if (!spacing_)
-    {
-      spacing_ = make_spanner ("SpacingSpanner", SCM_EOL);
-      spacing_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn")));
-    }
+  assert (!spacing_);
+
+  spacing_ = make_spanner ("SpacingSpanner", SCM_EOL);
+  spacing_->set_bound (LEFT,
+                      unsmob_grob (get_property ("currentCommandColumn")));
 }
 
 void
 Spacing_engraver::finalize ()
+{
+  stop_spanner ();
+}
+
+void
+Spacing_engraver::stop_spanner ()
 {
   if (spacing_)
     {
@@ -186,8 +215,11 @@ Spacing_engraver::stop_translation_timestep ()
 void
 Spacing_engraver::start_translation_timestep ()
 {
+  start_section_ = 0;
+
   now_ = now_mom ();
   stopped_durations_.clear ();
+  
   while (playing_durations_.size () && playing_durations_.front ().end_ < now_)
     playing_durations_.delmin ();
   while (playing_durations_.size () && playing_durations_.front ().end_ == now_)
@@ -203,7 +235,8 @@ ADD_TRANSLATOR (Spacing_engraver,
                "bookkeeping of shortest starting and playing notes  ",
 
                /* create */ "SpacingSpanner",
-               /* accept */ "",
+               /* accept */
+               "spacing-section-event ",
                /* read */
                "currentMusicalColumn "
                "currentCommandColumn "