-\version "2.11.22"
+\version "2.11.23"
\header {
texidoc = "The default callback for break-align-anchor in clefs and time/key
}
{
- \override Score.RehearsalMark #'break-align-symbol = #'key-signature
+ \override Score.RehearsalMark #'break-align-symbols = #'(key-signature)
c1
\key cis \major
\once \override Staff.KeySignature #'break-align-anchor-alignment = #LEFT
-\version "2.11.22"
+\version "2.11.23"
\header {
texidoc = "The break-align-anchor property of a break-aligned grob gives
}
{
- \override Score.RehearsalMark #'break-align-symbol = #'staff-bar
+ \override Score.RehearsalMark #'break-align-symbols = #'(staff-bar)
c'1
\once \override Staff.BarLine #'break-align-anchor = #-5
\mark \default
\header {
texidoc = "The rehearsal mark is put on top a breakable symbol,
- according to the value of @code{break-align-symbol} value of the
+ according to the value of @code{break-align-symbols} value of the
@code{RehearsalMark}. The same holds for @code{BarNumber} grobs."
}
c1
\key cis \major
\clef alto
- \override Score.RehearsalMark #'break-align-symbol = #'key-signature
+ \override Score.RehearsalMark #'break-align-symbols = #'(key-signature)
\mark "on-key"
cis
\key ces \major
- \override Score.RehearsalMark #'break-align-symbol = #'clef
+ \override Score.RehearsalMark #'break-align-symbols = #'(clef)
\clef treble
\mark "on clef"
ces
if (!Break_alignment_interface::has_interface (alignment))
return scm_from_int (0);
- SCM my_align = me->get_property ("break-align-symbol");
- SCM order = Break_alignment_interface::break_align_order (alignment);
-
+ SCM symbol_list = me->get_property ("break-align-symbols");
vector<Grob*> elements = Break_alignment_interface::ordered_elements (alignment);
if (elements.size () == 0)
return scm_from_int (0);
- int last_idx_found = -1;
- vsize i = 0;
- for (SCM s = order; scm_is_pair (s); s = scm_cdr (s))
+ int break_aligned_grob = -1;
+ for (; scm_is_pair (symbol_list); symbol_list = scm_cdr (symbol_list))
{
- if (i < elements.size ()
- && elements[i]->get_property ("break-align-symbol") == scm_car (s))
+ SCM sym = scm_car (symbol_list);
+ for (vsize i = 0; i < elements.size (); i++)
{
- last_idx_found = i;
- i ++;
+ if (elements[i]->get_property ("break-align-symbol") == sym)
+ {
+ if (Item::break_visible (elements[i]))
+ {
+ break_aligned_grob = i;
+ goto found_break_aligned_grob; /* ugh. need to break out of 2 loops */
+ }
+ else if (break_aligned_grob == -1)
+ break_aligned_grob = i;
+ }
}
+ }
- if (scm_car (s) == my_align)
- break ;
- }
+found_break_aligned_grob:
+ if (break_aligned_grob == -1)
+ return scm_from_int (0);
- Grob *alignment_parent = elements[last_idx_found];
+ Grob *alignment_parent = elements[break_aligned_grob];
Grob *common = me->common_refpoint (alignment_parent, X_AXIS);
Real anchor = robust_scm2double (alignment_parent->get_property ("break-align-anchor"), 0);
return scm_from_double (me->extent (me, X_AXIS).linear_combination (alignment));
}
+MAKE_SCHEME_CALLBACK (Break_aligned_interface, calc_break_visibility, 1)
+SCM
+Break_aligned_interface::calc_break_visibility (SCM smob)
+{
+ /* a BreakAlignGroup is break-visible iff it has one element that is break-visible */
+ Grob *me = unsmob_grob (smob);
+ SCM ret = scm_c_make_vector (3, SCM_EOL);
+ extract_grob_set (me, "elements", elts);
+ for (int dir = 0; dir <= 2; dir++)
+ {
+ bool visible = false;
+ for (vsize i = 0; i < elts.size (); i++)
+ {
+ SCM vis = elts[i]->get_property ("break-visibility");
+ if (scm_is_vector (vis) && to_boolean (scm_c_vector_ref (vis, dir)))
+ visible = true;
+ }
+ scm_c_vector_set_x (ret, dir, scm_from_bool (visible));
+ }
+ return ret;
+}
+
ADD_INTERFACE (Break_alignable_interface,
"Object that is aligned on a break aligment. ",
/* properties */
- "break-align-symbol "
+ "break-align-symbols "
)
{
DECLARE_SCHEME_CALLBACK (calc_average_anchor, (SCM));
DECLARE_SCHEME_CALLBACK (calc_extent_aligned_anchor, (SCM));
+ DECLARE_SCHEME_CALLBACK (calc_break_visibility, (SCM));
DECLARE_GROB_INTERFACE();
};
virtual Grob *clone () const;
static bool is_non_musical (Grob *);
+ static bool break_visible(Grob *);
bool is_broken () const;
bool pure_is_visible (int start, int end) const;
Can't do this earlier, because try_visibility_lambda () might set
the elt property transparent, which would then be copied.
*/
- SCM vis = get_property ("break-visibility");
- if (scm_is_vector (vis))
- {
- bool visible = to_boolean (scm_c_vector_ref (vis, break_status_dir () + 1));
+ if (!Item::break_visible (this))
+ suicide ();
+}
- if (!visible)
- suicide ();
- }
+bool
+Item::break_visible (Grob *g)
+{
+ Item *it = dynamic_cast<Item*> (g);
+ SCM vis = g->get_property ("break-visibility");
+ if (scm_is_vector (vis))
+ return to_boolean (scm_c_vector_ref (vis, it->break_status_dir () + 1));
+ return true;
}
bool
return str
conversions.append (((2, 11, 15), conv, """#'edge-height -> #'bound-details #'right/left #'text = ..."""))
+
+def conv (str):
+ str = re.sub (r"\\override\s*([a-zA-Z.]+)\s*#'break-align-symbol\s*=\s*#'([a-z-]+)",
+ r"\\override \1 #'break-align-symbols = #'(\2)", str)
+ return str
+
+conversions.append (((2, 11, 23), conv, """#'break-align-symbol -> #'break-align-symbols"""))
+
an anchor to a grobs extent")
(break-align-symbol ,symbol? "This key is used for aligning and
spacing breakable items.")
+ (break-align-symbols ,list? "A list of symbols that determine
+which break-aligned grobs to align this to. If the grob selected by
+the first symbol in the list is invisible due to break-visibility,
+we will align to the next grob (and so on).")
(break-align-orders ,vector? "Defines the order in which
prefatory matter (clefs, key signatures) appears. The format is a
vector of length@tie{}3, where each element is one order for
(self-alignment-X . 1)
;; want the bar number before the clef at line start.
- (break-align-symbol . left-edge)
+ (break-align-symbols . (left-edge staff-bar))
(meta .
((class . Item)
(interfaces . (side-position-interface
(axes . (0))
(X-extent . ,ly:axis-group-interface::width)
(break-align-anchor . ,ly:break-aligned-interface::calc-average-anchor)
+ (break-visibility . ,ly:break-aligned-interface::calc-break-visibility)
(meta . ((class . Item)
(interfaces . (break-aligned-interface
axis-group-interface))))))
(font-size . 2)
(baseline-skip . 2)
(break-visibility . ,end-of-line-invisible)
- (break-align-symbol . clef)
+ (break-align-symbols . (staff-bar clef))
(padding . 0.8)
(outside-staff-priority . 1500)
(meta . ((class . Item)