#include "spanner.hh"
#include "staff-symbol-referencer.hh"
#include "text-item.hh"
+#include "percent-repeat-item.hh"
+
void
Multi_measure_rest::set_interface (Grob*me)
return me->has_interface (ly_symbol2scm ("multi-measure-rest-interface"));
}
+MAKE_SCHEME_CALLBACK (Multi_measure_rest,percent,1);
+SCM
+Multi_measure_rest::percent (SCM smob)
+{
+
+ Grob *me = unsmob_grob (smob);
+ Spanner *sp = dynamic_cast<Spanner*> (me);
+
+ Molecule r = Percent_repeat_item_interface::x_percent (me, 1, 0.75, 1.6);
+
+ // ugh copy & paste.
+
+ Interval sp_iv;
+ Direction d = LEFT;
+ do
+ {
+ Item * col = sp->get_bound (d)->column_l ();
+
+ Interval coldim = col->extent (0, X_AXIS);
+
+ sp_iv[d] = coldim[-d] ;
+ }
+ while ((flip (&d)) != LEFT);
+ Real x_off = 0.0;
+
+ Real rx = sp->get_bound (LEFT)->relative_coordinate (0, X_AXIS);
/*
+ we gotta stay clear of sp_iv, so move a bit to the right if
+ needed.
+ */
+ x_off += (sp_iv[LEFT] - rx) >? 0;
+
+ /*
+ center between stuff.
+ */
+ x_off += sp_iv.length ()/ 2;
+
+ r.translate_axis (x_off,X_AXIS);
+
+
+ return r.smobbed_copy ();
+}
+
+
+/*
[TODO] 17
- * variable-sized multi-measure rest symbol: |====| ??
+ variable-sized multi-measure rest symbol: |====| ??
*/
-MAKE_SCHEME_CALLBACK(Multi_measure_rest,brew_molecule,1);
+MAKE_SCHEME_CALLBACK (Multi_measure_rest,brew_molecule,1);
SCM
Multi_measure_rest::brew_molecule (SCM smob)
{
Molecule s;
- int measures = 1;
+ int measures = 0;
SCM m (me->get_grob_property ("measure-count"));
if (gh_number_p (m))
{
SCM limit = me->get_grob_property ("expand-limit");
- if (measures <= gh_scm2int (limit))
+ if (measures <= 0)
+ return SCM_EOL;
+ if (measures == 1)
+ {
+ s = musfont->find_by_name (Rest::glyph_name (me, 0, ""));
+
+ /*
+ ugh.
+ */
+ if (Staff_symbol_referencer::position_f (me) == 0.0)
+ s.translate_axis (Staff_symbol_referencer::staff_space (me), Y_AXIS);
+ }
+ else if (measures <= gh_scm2int (limit))
{
/*
Build a rest from smaller parts. Distances inbetween are
}
else
{
- String idx = ("rests-") + to_str (-4);
+ String idx = ("rests-") + to_str (-4);
s = musfont->find_by_name (idx);
}
mol.add_molecule (s);
}
mol.translate_axis (x_off, X_AXIS);
- return mol.smobbed_copy();
+ return mol.smobbed_copy ();
}
/*
Grob*me = unsmob_grob (smob);
Spanner*sp = dynamic_cast<Spanner*> (me);
- if (!(sp->get_bound (LEFT) && sp->get_bound (RIGHT)))
+ if (! (sp->get_bound (LEFT) && sp->get_bound (RIGHT)))
{
programming_error ("Multi_measure_rest::get_rods (): I am not spanned!");
return SCM_UNSPECIFIED;