]> git.donarmstrong.com Git - lilypond.git/commitdiff
* scm/define-grobs.scm (all-grob-descriptions): new grob
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Fri, 18 Nov 2005 21:36:27 +0000 (21:36 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Fri, 18 Nov 2005 21:36:27 +0000 (21:36 +0000)
NestedSystemStartDelimiter.

* input/regression/system-start-heavy-bar.ly: new file.

* lily/nested-system-start-delimiter-engraver.cc: new file.

* lily/nested-system-start-delimiter.cc: new file.

* input/regression/system-start-nesting.ly: new file.

* scm/define-grobs.scm (all-grob-descriptions): use X side
positioning for positioning braces for nested contexts.

* lily/system-start-delimiter.cc (print): don't divide extent by
staff_space.
(print): use style iso. glyph.
(staff_bracket): translate glyph inside routine already.

14 files changed:
ChangeLog
Documentation/topdocs/NEWS.tely
input/regression/system-start-heavy-bar.ly [new file with mode: 0644]
input/regression/system-start-nesting.ly [new file with mode: 0644]
lily/include/system-start-delimiter.hh
lily/nested-system-start-delimiter-engraver.cc [new file with mode: 0644]
lily/nested-system-start-delimiter.cc [new file with mode: 0644]
lily/spacing-spanner.cc
lily/system-start-delimiter-engraver.cc
lily/system-start-delimiter.cc
ly/engraver-init.ly
scm/define-context-properties.scm
scm/define-grob-properties.scm
scm/define-grobs.scm

index 26104894791d693ed7d2ad494faa44cceedff93e..39cae7484d039ffd3fd6a724c4efbc07638763b6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+2005-11-18  Han-Wen Nienhuys  <hanwen@xs4all.nl>
+
+       * scm/define-grobs.scm (all-grob-descriptions): new grob
+       NestedSystemStartDelimiter.
+
+       * input/regression/system-start-heavy-bar.ly: new file.
+
+       * lily/nested-system-start-delimiter-engraver.cc: new file.
+
+       * lily/nested-system-start-delimiter.cc: new file.
+
+       * input/regression/system-start-nesting.ly: new file.
+
+       * scm/define-grobs.scm (all-grob-descriptions): use X side
+       positioning for positioning braces for nested contexts.
+
+       * lily/system-start-delimiter.cc (print): don't divide extent by
+       staff_space.
+       (print): use style iso. glyph.
+       (staff_bracket): translate glyph inside routine already.
+
 2005-11-18  Michael Welsh Duggan <md5i@cs.cmu.edu>
 
        * lily/vaticana-ligature-engraver.cc: fixed 2 typos in glyph
index b9ee991d56f92fab20c3b64ae981a032a84fe167..e3be786d15253268e11b940e655401a0ccd4417b 100644 (file)
@@ -45,6 +45,34 @@ This document is also available in @uref{NEWS.pdf,PDF}.
 
 
 @itemize @bullet
+
+@item
+It's now possible to easily create deeply nested system start
+brackets,
+
+@lilypond[raggedright]
+\new StaffGroup \with {
+  \remove "System_start_delimiter_engraver"
+  \consists "Nested_system_start_delimiter_engraver"
+}
+\relative <<
+  \override StaffGroup.NestedSystemStartDelimiter #'styles
+     = #'(line-bracket bracket line-bracket)
+  \set StaffGroup.systemStartDelimiterHierarchy = #'((a (b)) c)
+  \new Staff { c1 }
+  \new Staff { c1 }
+  \new Staff { c1 }
+  \new Staff { c1 }
+  \new Staff { c1 }
+>>
+@end lilypond
+
+
+In addition, there is now also support for ``square'' system start
+brackets.
+
+This feature was sponsored by Trevor Bača.
+
 @item
 Tie formatting now uses scoring. This opens the road to formatting
 which handles complex situations require tradeoffs between different
diff --git a/input/regression/system-start-heavy-bar.ly b/input/regression/system-start-heavy-bar.ly
new file mode 100644 (file)
index 0000000..a5ca7e8
--- /dev/null
@@ -0,0 +1,19 @@
+\header { texidoc = "A heavy-bar system start delimiter may be created by tuning the @code{SystemStartBar} grob."
+       } 
+
+\version "2.7.18"
+
+\paper {
+  raggedright = ##t
+}
+<<
+  \new StaffGroup
+  \relative <<
+    \set StaffGroup.systemStartDelimiter = #'SystemStartBar
+    \override StaffGroup.SystemStartBar #'thickness = #8
+    \override StaffGroup.SystemStartBar #'padding = #0.2
+    \new Staff { c1 }
+    \new Staff { c1 }
+  >>
+  \new Staff { c1 }
+>>
diff --git a/input/regression/system-start-nesting.ly b/input/regression/system-start-nesting.ly
new file mode 100644 (file)
index 0000000..79ee620
--- /dev/null
@@ -0,0 +1,24 @@
+\header { texidoc = "Deeply nested system braces/brackets/etc. may be created with the
+  @code{Nested_system_start_delimiter_engraver}"
+
+}
+
+\version "2.7.18"
+
+\paper {
+  raggedright = ##t
+}
+
+\new StaffGroup \with {
+  \remove "System_start_delimiter_engraver"
+  \consists "Nested_system_start_delimiter_engraver"
+}
+\relative <<
+  \override StaffGroup.NestedSystemStartDelimiter #'styles = #'(line-bracket bracket line-bracket)
+  \set StaffGroup.systemStartDelimiterHierarchy = #'((a (b)) c)
+  \new Staff { c1 }
+  \new Staff { c1 }
+  \new Staff { c1 }
+  \new Staff { c1 }
+  \new Staff { c1 }
+  >>
index 73b0a6754362db958217ae7356e30d06eb023da6..e8fe049c60f031f01ec997ededadea106f088268 100644 (file)
@@ -26,6 +26,7 @@ public:
   static Stencil old_staff_bracket (Grob *, Real);
   static Stencil staff_brace (Grob *, Real);
   static Stencil simple_bar (Grob *, Real);
+  static Stencil line_bracket (Grob *, Real);
 };
 
 #endif /* SYSTEM_START_DELIMITER_HH */
diff --git a/lily/nested-system-start-delimiter-engraver.cc b/lily/nested-system-start-delimiter-engraver.cc
new file mode 100644 (file)
index 0000000..5f88554
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+  new-system-start-delimiter-engraver.cc -- implement
+  Nested_system_start_delimiter_engraver
+
+  source file of the GNU LilyPond music typesetter
+
+  (c) 2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+*/
+
+#include "side-position-interface.hh"
+#include "system-start-delimiter.hh"
+#include "engraver.hh"
+#include "staff-symbol.hh"
+#include "pointer-group-interface.hh"
+#include "paper-column.hh"
+#include "output-def.hh"
+#include "spanner.hh"
+
+class Nested_system_start_delimiter_engraver : public Engraver
+{
+public:
+  TRANSLATOR_DECLARATIONS (Nested_system_start_delimiter_engraver);
+
+protected:
+  Spanner *delimiter_;
+  
+  DECLARE_ACKNOWLEDGER (system_start_delimiter);
+  DECLARE_ACKNOWLEDGER (staff_symbol);
+
+  void process_music ();
+  virtual void finalize ();
+};
+
+Nested_system_start_delimiter_engraver::Nested_system_start_delimiter_engraver ()
+{
+  delimiter_ = 0;
+}
+
+bool
+add_staff_to_hierarchy (SCM hierarchy, SCM grob)
+{
+  for (SCM s = hierarchy; scm_is_pair (s); s = scm_cdr (s))
+    {
+      SCM entry = scm_car (s);
+
+      if (unsmob_grob (entry))
+       ;
+      else if (scm_is_pair (entry))
+       {
+         bool success = add_staff_to_hierarchy (entry, grob);
+         if (success)
+           return success;
+       }
+      else
+       {
+         scm_set_car_x (s, grob);
+         return true;
+       }
+    }
+
+  return false;
+}
+
+void
+Nested_system_start_delimiter_engraver::process_music ()
+{
+  if (!delimiter_)
+    {
+      delimiter_ = make_spanner ("NestedSystemStartDelimiter", SCM_EOL);
+      SCM hierarchy = get_property ("systemStartDelimiterHierarchy");
+      
+      
+      delimiter_->set_object ("staff-hierarchy", ly_deep_copy (hierarchy));
+      delimiter_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn")));
+    }
+}
+
+void
+Nested_system_start_delimiter_engraver::finalize ()
+{
+  if (delimiter_)
+    delimiter_->set_bound (RIGHT,
+                          unsmob_grob (get_property ("currentCommandColumn")));
+}
+
+void
+Nested_system_start_delimiter_engraver::acknowledge_staff_symbol (Grob_info inf)
+{
+  Grob *staff = inf.grob();
+  SCM hier = delimiter_->get_object ("staff-hierarchy");
+  bool succ = add_staff_to_hierarchy (hier, staff->self_scm ());
+
+  if (!succ)
+    {
+      hier = scm_append_x (scm_list_2 (hier,
+                                      scm_list_1 (staff->self_scm ())));
+
+      delimiter_->set_object ("staff-hierarchy", hier);
+    }
+}
+
+
+void
+Nested_system_start_delimiter_engraver::acknowledge_system_start_delimiter (Grob_info inf)
+{
+  Side_position_interface::add_support (inf.grob (), delimiter_);
+}
+
+#include "translator.icc"
+
+ADD_ACKNOWLEDGER (Nested_system_start_delimiter_engraver, staff_symbol);
+ADD_ACKNOWLEDGER (Nested_system_start_delimiter_engraver, system_start_delimiter);
+
+ADD_TRANSLATOR (Nested_system_start_delimiter_engraver,
+               /* doc */ "Creates a system start delimiter (ie. SystemStart@{Bar, Brace, Bracket@} spanner",
+               /* create */ "NestedSystemStartDelimiter",
+               /* accept */ "",
+               /* read */ "systemStartDelimiterHierarchy",
+               /* write */ "");
diff --git a/lily/nested-system-start-delimiter.cc b/lily/nested-system-start-delimiter.cc
new file mode 100644 (file)
index 0000000..404685c
--- /dev/null
@@ -0,0 +1,159 @@
+/*
+  system-start-delimiter.cc -- implement Nested_system_start_delimiter
+
+  source file of the GNU LilyPond music typesetter
+
+  (c) 2000--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
+*/
+
+#include "system-start-delimiter.hh"
+#include "spanner.hh"
+#include "axis-group-interface.hh"
+#include "output-def.hh"
+#include "font-interface.hh"
+#include "all-font-metrics.hh"
+#include "staff-symbol-referencer.hh"
+#include "lookup.hh"
+#include "item.hh"
+
+#include "pointer-group-interface.hh"
+
+
+struct Nested_system_start_delimiter
+{
+public:
+  bool has_interface (Grob *);
+  Stencil static make_substencil (Spanner *, Grob *, SCM, SCM, SCM);
+  DECLARE_SCHEME_CALLBACK (print, (SCM));
+};
+
+Link_array<Grob> 
+flatten_hierarchy (SCM hier)
+{
+  Link_array<Grob> retval;
+  if (unsmob_grob (hier))
+    retval.push (unsmob_grob (hier));
+  
+  if (scm_is_pair (hier))
+    {
+      retval = flatten_hierarchy (scm_car (hier));
+      retval.concat (flatten_hierarchy (scm_cdr (hier)));
+    }
+  
+  return retval;
+}
+
+
+Stencil
+Nested_system_start_delimiter::make_substencil (Spanner *me,
+                                            Grob *common,
+                                            SCM hierarchy,
+                                            SCM depth_styles,
+                                            SCM default_style
+                                            )
+{
+  Interval ext;
+  Link_array<Grob> elts = flatten_hierarchy (hierarchy);
+
+  if (elts.is_empty ())
+    return Stencil();
+  
+  int non_empty_count = 0;
+  for (int i = elts.size (); i--;)
+    {
+      Spanner *sp = dynamic_cast<Spanner *> (elts[i]);
+
+      if (sp
+         && sp->get_bound (LEFT) == me->get_bound (LEFT))
+       {
+         Interval dims = sp->extent (common, Y_AXIS);
+         if (!dims.is_empty ())
+           {
+             non_empty_count ++;
+             ext.unite (dims);
+           }
+       }
+    }
+
+  SCM glyph_sym = ly_symbol2scm ("bracket");
+  if (scm_is_pair (depth_styles))
+    glyph_sym = scm_car (depth_styles);
+  
+  if (ext.is_empty ()
+      || (robust_scm2double (me->get_property ("collapse-height"), 0.0) >= ext.length()))
+    {
+      return Stencil();
+    }
+
+  Stencil total;
+
+  Real len = ext.length ();
+  if (glyph_sym == ly_symbol2scm ("bracket"))
+    total = System_start_delimiter::staff_bracket (me, len);
+  else if (glyph_sym == ly_symbol2scm ("brace"))
+    total = System_start_delimiter::staff_brace (me, len);
+  else if (glyph_sym == ly_symbol2scm ("bar-line"))
+    total = System_start_delimiter::simple_bar (me, len);
+  else if (glyph_sym == ly_symbol2scm ("line-bracket"))
+    total = System_start_delimiter::line_bracket (me, len);
+
+  total.translate_axis (ext.center (), Y_AXIS);
+
+  Real left_x = total.extent (X_AXIS)[LEFT];
+  for (SCM s = hierarchy; scm_is_pair (s); s = scm_cdr (s))
+    {
+      SCM entry = scm_car (s);
+
+      if (scm_is_pair (entry)
+         && !scm_is_symbol (scm_car (entry)))
+       {
+         Stencil sub = make_substencil (me, common, entry,
+                                        scm_is_pair (depth_styles)
+                                        ? scm_cdr (depth_styles) : SCM_EOL,
+                                        default_style);
+         sub.translate_axis (left_x, X_AXIS);
+         total.add_stencil (sub);
+       }
+    }
+
+  return total;
+}
+
+MAKE_SCHEME_CALLBACK (Nested_system_start_delimiter, print, 1);
+SCM
+Nested_system_start_delimiter::print (SCM smob)
+{
+  Spanner *me = unsmob_spanner (smob);
+  if (!me)
+    return SCM_EOL;
+
+  SCM hierarchy = me->get_object ("staff-hierarchy");
+  Link_array<Grob> elts = flatten_hierarchy (hierarchy);
+  Grob *common = common_refpoint_of_array (elts, me, Y_AXIS);
+
+  SCM default_style = me->get_property ("style");
+  if (!scm_is_symbol (default_style))
+    default_style = ly_symbol2scm ("line-bracket"); 
+  
+  Stencil total = make_substencil (me, common, hierarchy, me->get_property ("styles"),
+                                  default_style);
+  total.translate_axis (- me->relative_coordinate (common, Y_AXIS), Y_AXIS);
+
+  return total.smobbed_copy ();
+
+}
+
+ADD_INTERFACE (Nested_system_start_delimiter,
+              "nested-system-start-delimiter-interface",
+              
+              "The brace, bracket or bar in front of the system.  By setting "
+              "@code{staff-hierarchy}, eg. to @code{(a (b d) c)}, nesting for staff "
+              "braces can be produced."  
+              ,
+              
+
+              /* properties */
+              "collapse-height "
+              "styles "
+              "staff-hierarchy "
+              );
index baa7cd483f584c48ec2d04790b0bd00fbd7d3742..254bbbc6708916a59ee76d9f624fe8e6078aa2da 100644 (file)
@@ -25,6 +25,13 @@ using namespace std;
 #include "staff-spacing.hh"
 #include "spacing-interface.hh"
 
+
+/*
+  TODO:
+
+  use callback instead?
+
+*/
 Rational
 Spacing_spanner::effective_shortest_duration (Grob *me,
                                              Link_array<Grob> const &all)
index ac341eaa1200c4a2e8fc134b3951b7ece1d7651e..293006d9aa05db7f37dab54ae1ea5c1d753ebce2 100644 (file)
@@ -6,13 +6,15 @@
   (c) 2000--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
-#include "system-start-delimiter.hh"
 #include "engraver.hh"
+
+#include "system-start-delimiter.hh"
 #include "staff-symbol.hh"
 #include "pointer-group-interface.hh"
 #include "paper-column.hh"
 #include "output-def.hh"
 #include "spanner.hh"
+#include "side-position-interface.hh"
 
 class System_start_delimiter_engraver : public Engraver
 {
@@ -20,7 +22,7 @@ public:
   TRANSLATOR_DECLARATIONS (System_start_delimiter_engraver);
 
 protected:
-  Spanner *delim_;
+  Spanner *delimiter_;
   DECLARE_ACKNOWLEDGER (system_start_delimiter);
   DECLARE_ACKNOWLEDGER (staff_symbol);
 
@@ -31,52 +33,38 @@ protected:
 void
 System_start_delimiter_engraver::acknowledge_staff_symbol (Grob_info inf)
 {
-  /*
-    don't add as Axis_group_interface::add_element (delim_, ),
-    because that would set the parent as well */
-
-  Pointer_group_interface::add_grob (delim_, ly_symbol2scm ("elements"), inf.grob ());
+  Pointer_group_interface::add_grob (delimiter_, ly_symbol2scm ("elements"), inf.grob ());
 }
 
+
 void
 System_start_delimiter_engraver::acknowledge_system_start_delimiter (Grob_info inf)
 {
-  SCM gl = inf.grob ()->get_property ("glyph");
-  SCM my_gl = delim_->get_property ("glyph");
-
-  /*
-    UGH UGH
-  */
-  if (scm_is_string (gl) && ly_is_equal (gl, scm_makfrom0str ("brace"))
-      && scm_is_string (my_gl) && ly_is_equal (my_gl, scm_makfrom0str ("bracket")))
-    add_offset_callback (inf.grob (), scm_from_double (-0.8), X_AXIS);
-  else if (scm_is_string (gl) && ly_is_equal (gl, scm_makfrom0str ("bracket"))
-          && scm_is_string (my_gl) && ly_is_equal (my_gl, scm_makfrom0str ("bracket")))
-    add_offset_callback (inf.grob (), scm_from_double (-0.8), X_AXIS);
+  Side_position_interface::add_support (inf.grob (), delimiter_);
 }
 
 System_start_delimiter_engraver::System_start_delimiter_engraver ()
 {
-  delim_ = 0;
+  delimiter_ = 0;
 }
 
 void
 System_start_delimiter_engraver::process_music ()
 {
-  if (!delim_)
+  if (!delimiter_)
     {
-      SCM delim_name = get_property ("systemStartDelimiter");
-      delim_ = make_spanner_from_properties (this, delim_name, SCM_EOL,
-                                            ly_symbol2string (delim_name).to_str0 ());
+      SCM delimiter_name = get_property ("systemStartDelimiter");
+      delimiter_ = make_spanner_from_properties (this, delimiter_name, SCM_EOL,
+                                                ly_symbol2string (delimiter_name).to_str0 ());
 
-      delim_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn")));
+      delimiter_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn")));
     }
 }
 void
 System_start_delimiter_engraver::finalize ()
 {
-  if (delim_)
-    delim_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn")));
+  if (delimiter_)
+    delimiter_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn")));
 }
 
 #include "translator.icc"
index 9973a781edc3e6ea47ce30a796675f7c62db3091..c7317a620ec56e644236dda4b2af641dcdccda69 100644 (file)
 #include "staff-symbol-referencer.hh"
 #include "lookup.hh"
 #include "item.hh"
+#include "line-interface.hh"
 
 #include "pointer-group-interface.hh"
 
 Stencil
 System_start_delimiter::staff_bracket (Grob *me, Real height)
 {
-  Font_metric *fm = Font_interface::get_default_font (me);
+  SCM fam = scm_cons (ly_symbol2scm ("font-encoding"),
+                     ly_symbol2scm ("fetaMusic"));
+
+  SCM alist = scm_list_n (fam, SCM_UNDEFINED);
+  Font_metric *fm = select_font (me->layout (), scm_list_n (alist, SCM_UNDEFINED));
+
   Drul_array<Stencil> tips (fm->find_by_name ("brackettips.down"),
                            fm->find_by_name ("brackettips.up"));
 
@@ -31,19 +37,48 @@ System_start_delimiter::staff_bracket (Grob *me, Real height)
 
   Real overlap = 0.1 * thickness;
 
-  Stencil bracket = Lookup::filled_box (Box (Interval (0, thickness),
-                                            Interval (-1, 1)
-                                            * (height / 2 + overlap)));
-
+  Box box (Interval (0, thickness),
+          Interval (-1, 1)
+          * (height / 2 + overlap));
+  
+  Stencil bracket = Lookup::filled_box (box);
   Direction d = DOWN;
   do
     bracket.add_at_edge (Y_AXIS, d, tips[d], -overlap, 0.0);
-  while (flip (&d) != DOWN)
-    ;
+  while (flip (&d) != DOWN);
+  bracket = Stencil (box, bracket.expr ());
 
+  bracket.translate_axis (-0.8, X_AXIS);
+  
   return bracket;
 }
 
+Stencil
+System_start_delimiter::line_bracket (Grob *me, Real height)
+{
+  height -= 1.0;
+
+  Real thick
+    = me->layout ()->get_dimension (ly_symbol2scm ("linethickness"))
+    * robust_scm2double (me->get_property ("thickness"), 1);
+  Real w = 0.8;
+  
+  Stencil tip1 = Line_interface::make_line (thick,
+                                          Offset (0, -height/2),
+                                          Offset (w, -height/2));
+  Stencil tip2 = Line_interface::make_line (thick,
+                                           Offset (0, height/2),
+                                           Offset (w, height/2));
+  Stencil vline = Line_interface::make_line (thick,
+                                            Offset (0, -height/2),
+                                            Offset (0, height/2));
+
+  vline.add_stencil (tip1);
+  vline.add_stencil (tip2);
+  vline.translate_axis (-w, X_AXIS);
+  return vline;
+}
+
 Stencil
 System_start_delimiter::simple_bar (Grob *me, Real h)
 {
@@ -58,21 +93,10 @@ SCM
 System_start_delimiter::print (SCM smob)
 {
   Spanner *me = unsmob_spanner (smob);
-  if (!me)
-    return SCM_EOL;
-
-  SCM s = me->get_property ("glyph");
-  if (!scm_is_string (s))
-    return SCM_EOL;
-  SCM gsym = scm_string_to_symbol (s);
-
-  Real staff_space = Staff_symbol_referencer::staff_space (me);
-
   extract_grob_set (me, "elements", elts);
   Grob *common = common_refpoint_of_array (elts, me, Y_AXIS);
 
   Interval ext;
-
   int non_empty_count = 0;
   for (int i = elts.size (); i--;)
     {
@@ -90,31 +114,23 @@ System_start_delimiter::print (SCM smob)
        }
     }
 
-  if (gsym == ly_symbol2scm ("bar-line")
-      && non_empty_count <= 1)
-    {
-      me->suicide ();
-      return SCM_EOL;
-    }
-  
-  ext -= me->relative_coordinate (common, Y_AXIS);
-
-  Real len = ext.length () / staff_space;
-
+  SCM glyph_sym = me->get_property ("style");
+  Real len = ext.length ();
   if (ext.is_empty ()
-      || (robust_scm2double (me->get_property ("collapse-height"), 0.0) >= len))
+      || (robust_scm2double (me->get_property ("collapse-height"), 0.0) >= ext.length ())
+      || (glyph_sym == ly_symbol2scm ("bar-line")
+         && non_empty_count <= 1))
     {
       me->suicide ();
-      return SCM_EOL;
+      return SCM_UNSPECIFIED;
     }
 
   Stencil m;
-
-  if (gsym == ly_symbol2scm ("bracket"))
+  if (glyph_sym == ly_symbol2scm ("bracket"))
     m = staff_bracket (me, len);
-  else if (gsym == ly_symbol2scm ("brace"))
+  else if (glyph_sym == ly_symbol2scm ("brace"))
     m = staff_brace (me, len);
-  else if (gsym == ly_symbol2scm ("bar-line"))
+  else if (glyph_sym == ly_symbol2scm ("bar-line"))
     m = simple_bar (me, len);
 
   m.translate_axis (ext.center (), Y_AXIS);
@@ -128,7 +144,7 @@ System_start_delimiter::staff_brace (Grob *me, Real y)
   /* We go through the style sheet to lookup the font file
      name.  This is better than using find_font directly,
      esp. because that triggers mktextfm for non-existent
-     fonts. */
+>     fonts. */
   SCM fam = scm_cons (ly_symbol2scm ("font-encoding"),
                      ly_symbol2scm ("fetaBraces"));
 
@@ -154,15 +170,18 @@ System_start_delimiter::staff_brace (Grob *me, Real y)
   Stencil stil (fm->find_by_name ("brace" + to_string (lo)));
   stil.translate_axis (-b[X_AXIS].length()/2, X_AXIS);
 
+  stil.translate_axis (-0.2, X_AXIS);
+  
   return stil;
 }
 
 ADD_INTERFACE (System_start_delimiter, "system-start-delimiter-interface",
               "The brace, bracket or bar in front of the system. "
-              "It is implemented as a spanner.",
+              ,
 
               /* properties */
               "collapse-height "
-              "glyph "
+              "styles "
+              "staff-hierarchy "
               "thickness "
               );
index 9ac8cfad6ddae5b887e53114057b8dc6fc245078..90bfa08c87ee16b6323bd3c7b87245cc72f7d0a4 100644 (file)
@@ -586,6 +586,7 @@ AncientRemoveEmptyStaffContext = \context {
   \consists "Skip_event_swallow_translator"
   \consists "Separating_line_group_engraver"
   \consists "Hara_kiri_engraver"
+
   \override VerticalAxisGroup #'remove-empty = ##t
   \override VerticalAxisGroup #'remove-first = ##t
   \override VerticalAxisGroup #'minimum-Y-extent = #'(-0.5 . 2.5)
index 051d1d28dcaf541c1d7f210894ce07ebb9fa30ec..430cde9234401238079e7f91a45b4bd210ff208e 100644 (file)
@@ -377,6 +377,7 @@ one).")
 at beat positions by only drawing one beam over the beat.")
      (suggestAccidentals ,boolean? "If set, accidentals are typeset as cautionary suggestions over the note.")
 
+     (systemStartDelimiterHierarchy ,pair? "A nested list, indicating the nesting of a start delimiters.") 
      (systemStartDelimiter ,symbol? "Which grob to make for the start of
 the system/staff? Set to @code{SystemStartBrace},
 @code{SystemStartBracket} or @code{SystemStartBar}.")
index 9695d628b82c1ff6b461e73c3fd6f150455d5be9..7569f3bc3a0e6eb71c258de019a4c1d4f97de2e2 100644 (file)
@@ -412,6 +412,7 @@ separately, but put before musical columns.")
      (style ,symbol? "This setting determines in what style a grob is
 typeset. Valid choices depend on the @code{stencil} callback reading
 this property.")
+     (styles ,list? "A list of style symbols.")   
      (text ,markup? "Text markup.  See @usermanref{Text markup}.")
 ;;FIXME -- Should both be the same?
      (text-direction ,ly:dir? "This controls the ordering of the
@@ -570,14 +571,17 @@ debugging")
      (shorten ,ly:dimension? "The amount of space that a
 stem. Internally used to distribute beam shortening over stems. ")
      (slur ,ly:grob? "A pointer to a slur object")
+     (staff-hierarchy ,pair? "A nested list of staff symbol grobs.")
      (use-breve-rest ,boolean? "Use breve rests for measures longer
 than a whole rest.")
      
 
      (spaceable-staves ,ly:grob-array? "Objects to be spaced during page layout.")
 
+     
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      ;; ancient notation
-
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      ;;;;;;; TODO:
      ;; there are too many properties for ancient notation
      ;; probably neume-types (a list of symbols) would also work.
index 1b5dbf31d96612b645f3d81afc291bb7f57aa55f..f5d516cc1162b6aacecd51453bebd33f73b1c484 100644 (file)
                 (interfaces . (system-interface
                                axis-group-interface))))))
 
+    (NestedSystemStartDelimiter 
+     . (
+       (stencil . ,Nested_system_start_delimiter::print)
+       (X-offset . ,Side_position_interface::x_aligned_side)
+       (direction . ,LEFT)
+       (collapse-height . 1.0)
+       (padding . 0.0)
+       (font-encoding . fetaBraces)
+       (Y-extent . #f)
+       (meta . ((class . Spanner)
+                (interfaces . (system-start-delimiter-interface
+                               side-position-interface
+                               font-interface))))))
+
     (SystemStartBrace
      . (
-       (glyph . "brace")
+       (style . brace)
+       (padding . 0.2)
        (stencil . ,System_start_delimiter::print)
        (collapse-height . 5.0)
+       (X-offset . ,Side_position_interface::x_aligned_side)
+       (direction . ,LEFT)
        (font-encoding . fetaBraces)
        (Y-extent . #f)
        (meta . ((class . Spanner)
                 (interfaces . (system-start-delimiter-interface
+                               side-position-interface
                                font-interface))))))
 
     (SystemStartBracket
      . (
        (Y-extent . #f)
-       (X-offset . -0.8)
+       (padding . 0.8)
+       (X-offset . ,Side_position_interface::x_aligned_side)
+       (direction . ,LEFT)
        (stencil . ,System_start_delimiter::print)
-       (glyph . "bracket")
+       (style . bracket)
        (collapse-height . 5.0)
        (thickness . 0.45)
        (meta . ((class . Spanner)
                 (interfaces . (font-interface
+                               side-position-interface
                                system-start-delimiter-interface))))))
 
     (SystemStartBar
      . (
        (Y-extent . #f)
-       (glyph . "bar-line")
+       (padding . 0.0)
+       (X-offset . ,Side_position_interface::x_aligned_side)
+       (direction . ,LEFT)
+       (style . bar-line)
        (thickness . 1.6)
        (stencil . ,System_start_delimiter::print)
        (meta . ((class . Spanner)
-                (interfaces . (system-start-delimiter-interface))))))
+                (interfaces . (side-position-interface
+                               system-start-delimiter-interface))))))
+
 
     (TabNoteHead
      . (