]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/volta-engraver.cc
2003 -> 2004
[lilypond.git] / lily / volta-engraver.cc
index 587a9e0981392cd8b6100914b6e12e67e8d9133d..7e2b3376a34eed2403a239be03aa819fcfefe993 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2000--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c) 2000--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
   
  */
 
@@ -31,13 +31,15 @@ protected:
   virtual void finalize ();
   virtual void stop_translation_timestep ();
   virtual void process_music ();
-  virtual void process_acknowledged_grobs ();
   
   Moment started_mom_;
   Spanner *volta_span_;
   Spanner *end_volta_span_;
   SCM staff_;
   SCM start_string_;
+
+  bool staff_eligible ();
 };
 
 Volta_engraver::Volta_engraver ()
@@ -48,10 +50,23 @@ Volta_engraver::Volta_engraver ()
 }
 
 
-void
-Volta_engraver::process_music ()
+/*
+  TODO: this logic should be rewritten, it is buggy.
+
+  One of the problems is that we can't determine wether or not to
+  print the volta bracket during the first step, since that requires
+  acknowledging the staff.
+ */
+bool
+Volta_engraver::staff_eligible ()
 {
-  if (unsmob_grob (staff_))
+  /*
+    UGH.
+   */
+  if (!unsmob_grob (staff_))
+    return true;
+  
+  if (!to_boolean (get_property ("voltaOnThisStaff")))
     {
       /*
        TODO: this does weird things when you open a piece with a
@@ -68,21 +83,35 @@ Volta_engraver::process_music ()
        
       */
       if (!gh_pair_p (staffs))
-       programming_error ("Huh? Volta engraver can't find staffs?");
+       {
+         programming_error ("Huh? Volta engraver can't find staffs?");
+         return false;
+       }
       else if (ly_car (scm_last_pair (staffs)) != staff_)
-       return ;
+       {
+         return false;
+       }
     }
-       
-  
+  return true;
+}
+
+void
+Volta_engraver::process_music ()
+{
   SCM cs = get_property ("repeatCommands");
 
+  if (!staff_eligible ())
+    return ; 
+
+    
   bool  end = false;
   start_string_ = SCM_EOL;
   while (gh_pair_p (cs))
     {
       SCM c = ly_car (cs);
 
-      if (gh_pair_p (c) && ly_car (c) == ly_symbol2scm ("volta")
+      if (gh_pair_p (c)
+         && ly_car (c) == ly_symbol2scm ("volta")
          && gh_pair_p (ly_cdr (c)))
        {
          if (ly_cadr (c) ==  SCM_BOOL_F)
@@ -116,7 +145,8 @@ Volta_engraver::process_music ()
       volta_span_ =0;
     }
 
-  if (gh_string_p (start_string_) && volta_span_)
+  if (volta_span_ && 
+      (gh_string_p (start_string_) || gh_pair_p (start_string_)))
     {
       warning (_ ("Already have a volta spanner.  Stopping that one prematurely."));
       
@@ -129,25 +159,20 @@ Volta_engraver::process_music ()
       end_volta_span_ = volta_span_;
       volta_span_ = 0;
     }
-}
 
-/*
-  this could just as well be done in process_music (), but what the hack.
- */
-void
-Volta_engraver::process_acknowledged_grobs ()
-{
-  if (!volta_span_ && gh_string_p (start_string_))
+  if (!volta_span_ && 
+      (gh_string_p (start_string_) || gh_pair_p (start_string_)))
     {
       started_mom_ = now_mom () ;
 
-      volta_span_ = new Spanner (get_property ("VoltaBracket"));
+      volta_span_ = make_spanner ("VoltaBracket");
 
       announce_grob (volta_span_, SCM_EOL);
       volta_span_->set_grob_property ("text", start_string_);
     }
 }
 
+
 void
 Volta_engraver::acknowledge_grob (Grob_info i)
 {
@@ -197,6 +222,19 @@ Volta_engraver::finalize ()
 void 
 Volta_engraver::stop_translation_timestep ()
 {
+  if (volta_span_ && !staff_eligible ())
+    {
+      /*
+       THIS IS A KLUDGE.
+
+       we need to do this here, because STAFF_ is not initialized yet
+       in the 1st call of process_music()
+      */
+      
+      volta_span_->suicide( );
+      volta_span_ = 0;
+    }
+  
   if (end_volta_span_)
     {
       typeset_grob (end_volta_span_);
@@ -211,6 +249,7 @@ Volta_engraver::stop_translation_timestep ()
 ENTER_DESCRIPTION(Volta_engraver,
 /* descr */       "Make volta brackets",
 /* creats*/       "VoltaBracket",
+/* accepts */     "",
 /* acks  */       "bar-line-interface staff-symbol-interface note-column-interface",
 /* reads */       "repeatCommands voltaSpannerDuration stavesFound",
 /* write */       "");