]> git.donarmstrong.com Git - lilypond.git/commitdiff
add VoltaBracketSpanner to align volta brackets
authorJoe Neeman <joeneeman@gmail.com>
Thu, 5 Jul 2007 23:31:06 +0000 (09:31 +1000)
committerJoe Neeman <joeneeman@gmail.com>
Thu, 5 Jul 2007 23:31:06 +0000 (09:31 +1000)
lily/volta-bracket.cc
lily/volta-engraver.cc
scm/define-grobs.scm

index fb3cb12fc604341342dfe847e77189fbb08bf07e..cedc7df6cbb883078b1dea8cd005d5451948eea7 100644 (file)
@@ -156,7 +156,6 @@ void
 Volta_bracket_interface::add_bar (Grob *me, Item *b)
 {
   Pointer_group_interface::add_grob (me, ly_symbol2scm ("bars"), b);
-  Side_position_interface::add_support (me, b);
   add_bound_item (dynamic_cast<Spanner *> (me), b);
 }
 
index 1860cbcf518261444a4200cad0adc93a13d0763b..dad57ca7f47584d34b7c5ee1780202d3ffa506be 100644 (file)
@@ -8,6 +8,7 @@
 
 #include "engraver.hh"
 
+#include "axis-group-interface.hh"
 #include "bar-line.hh"
 #include "context.hh"
 #include "grob-array.hh"
@@ -39,8 +40,9 @@ protected:
   void process_music ();
 
   Moment started_mom_;
-  Spanner *volta_span_;
-  Spanner *end_volta_span_;
+  Spanner *volta_bracket_;
+  Spanner *end_volta_bracket_;
+  Spanner *volta_spanner_;
   SCM start_string_;
 };
 
@@ -53,8 +55,9 @@ Volta_engraver::derived_mark () const
 Volta_engraver::Volta_engraver ()
 {
   start_string_ = SCM_EOL;
-  volta_span_ = 0;
-  end_volta_span_ = 0;
+  volta_bracket_ = 0;
+  end_volta_bracket_ = 0;
+  volta_spanner_ = 0;
 }
 
 void
@@ -81,7 +84,7 @@ Volta_engraver::process_music ()
       cs = scm_cdr (cs);
     }
 
-  if (volta_span_)
+  if (volta_bracket_)
     {
       SCM l (get_property ("voltaSpannerDuration"));
       Moment now = now_mom ();
@@ -92,73 +95,91 @@ Volta_engraver::process_music ()
       end = end || early_stop;
     }
 
-  if (end && !volta_span_)
+  if (end && !volta_bracket_)
     /* fixme: be more verbose.  */
     warning (_ ("cannot end volta spanner"));
   else if (end)
     {
-      end_volta_span_ = volta_span_;
-      volta_span_ = 0;
+      end_volta_bracket_ = volta_bracket_;
+      volta_bracket_ = 0;
     }
 
-  if (volta_span_
+  if (volta_bracket_
       && (scm_is_string (start_string_) || scm_is_pair (start_string_)))
     {
       warning (_ ("already have a volta spanner, ending that one prematurely"));
 
-      if (end_volta_span_)
+      if (end_volta_bracket_)
        {
          warning (_ ("also already have an ended spanner"));
          warning (_ ("giving up"));
          return;
        }
 
-      end_volta_span_ = volta_span_;
-      volta_span_ = 0;
+      end_volta_bracket_ = volta_bracket_;
+      volta_bracket_ = 0;
     }
 
-  if (!volta_span_
+  if (!volta_bracket_
       && Text_interface::is_markup (start_string_))
     {
       started_mom_ = now_mom ();
 
-      volta_span_ = make_spanner ("VoltaBracket", SCM_EOL);
+      volta_bracket_ = make_spanner ("VoltaBracket", SCM_EOL);
 
-      volta_span_->set_property ("text", start_string_);
+      volta_bracket_->set_property ("text", start_string_);
+
+      if (!volta_spanner_)
+       {
+         volta_spanner_ = make_spanner ("VoltaBracketSpanner", SCM_EOL);
+         /* ensure that we don't get spanned up by VerticalAlignment.
+            ugh. this could cause problems if we get moved to Staff context */
+         Axis_group_interface::add_element (unsmob_grob (get_property ("rootSystem")),
+                                            volta_spanner_);
+       }
+
+      Axis_group_interface::add_element (volta_spanner_, volta_bracket_);
     }
 }
 
 void
 Volta_engraver::acknowledge_bar_line (Grob_info i)
 {
-  if (volta_span_)
-    Volta_bracket_interface::add_bar (volta_span_, i.item ());
-  if (end_volta_span_)
-    Volta_bracket_interface::add_bar (end_volta_span_, i.item ());
+  if (volta_bracket_)
+    Volta_bracket_interface::add_bar (volta_bracket_, i.item ());
+  if (end_volta_bracket_)
+    Volta_bracket_interface::add_bar (end_volta_bracket_, i.item ());
+
+  if (volta_spanner_)
+    Side_position_interface::add_support (volta_spanner_, i.grob ());
 }
 
 void
 Volta_engraver::stop_translation_timestep ()
 {
-  if (end_volta_span_ && !end_volta_span_->get_bound (RIGHT))
-    {
-      Grob *cc = unsmob_grob (get_property ("currentCommandColumn"));
-      Item *ci = dynamic_cast<Item *> (cc);
-      end_volta_span_->set_bound (RIGHT, ci);
-    }
+  Grob *cc = unsmob_grob (get_property ("currentCommandColumn"));
+  Item *ci = dynamic_cast<Item *> (cc);
 
-  if (end_volta_span_)
-    for (SCM s = get_property ("stavesFound"); scm_is_pair (s); s = scm_cdr (s))
-      Side_position_interface::add_support (end_volta_span_, unsmob_grob (scm_car (s)));
+  if (end_volta_bracket_ && !end_volta_bracket_->get_bound (RIGHT))
+    end_volta_bracket_->set_bound (RIGHT, ci);
 
-  end_volta_span_ = 0;
+  if (volta_spanner_ && end_volta_bracket_)
+    volta_spanner_->set_bound (RIGHT, end_volta_bracket_->get_bound (RIGHT));
 
-  if (volta_span_ && !volta_span_->get_bound (LEFT))
+  if (end_volta_bracket_ && !volta_bracket_)
     {
-      Grob *cc = unsmob_grob (get_property ("currentCommandColumn"));
-      Item *ci = dynamic_cast<Item *> (cc);
-      volta_span_->set_bound (LEFT, ci);
+      for (SCM s = get_property ("stavesFound"); scm_is_pair (s); s = scm_cdr (s))
+       Side_position_interface::add_support (volta_spanner_, unsmob_grob (scm_car (s)));
+      volta_spanner_ = 0;
     }
+
+  end_volta_bracket_ = 0;
+
+  if (volta_bracket_ && !volta_bracket_->get_bound (LEFT))
+    volta_bracket_->set_bound (LEFT, ci);
+
+  if (volta_spanner_ && volta_bracket_ && !volta_spanner_->get_bound (LEFT))
+    volta_spanner_->set_bound (LEFT, volta_bracket_->get_bound (LEFT));
 }
 
 /*
index bbae0e8955fa6da83715e43ec1fe82b974b9692c..f5bdb0417f56e60b49aa4729db500d8ffcdbb996 100644 (file)
        (font-size . -2)
        (Y-offset . ,ly:side-position-interface::y-aligned-side)
        (side-axis . ,Y)
+       (outside-staff-priority . 100)
        (X-offset . ,(ly:make-simple-closure
                      `(,+
                        ,(ly:make-simple-closure
     (VoltaBracket
      . (
        (stencil . ,ly:volta-bracket-interface::print)
-       (direction . ,UP)
-       (padding . 1)
        (font-encoding . fetaNumber)
-       (minimum-Y-extent . (0 . 2))
-       (Y-offset . ,ly:side-position-interface::y-aligned-side)
-       (side-axis . ,Y)
        (thickness . 1.6)  ;;  line-thickness
        (edge-height . (2.0 . 2.0)) ;; staff-space;
        (font-size . -4)
-       (outside-staff-priority . 100)
+       (direction . ,UP)
        (meta . ((class . Spanner)
                 (interfaces . (volta-bracket-interface
                                horizontal-bracket-interface                            
                                font-interface)))
              )))
 
+    (VoltaBracketSpanner
+     . (       
+       (axes . (1))
+       (side-axis . ,Y)
+       (direction . ,UP)
+       (padding . 1)
+       (Y-offset . ,ly:side-position-interface::y-aligned-side)
+       (outside-staff-priority . 100)
+       (Y-extent . ,ly:axis-group-interface::height)
+       (X-extent . ,ly:axis-group-interface::width)
+       (meta . ((class . Spanner)
+                (interfaces . (side-position-interface
+                               axis-group-interface)))
+             )))
 
     (VoiceFollower
      . (