#include "stem.hh"
#include "note-column.hh"
#include "dimensions.hh"
+#include "group-interface.hh"
+
Tuplet_spanner::Tuplet_spanner ()
{
+ /*
+ -> GUILE
+ */
parallel_beam_b_ = false;
+ set_elt_property ("beams", SCM_EOL);
+ set_elt_property ("columns", SCM_EOL);
}
/*
(value == 2 && !parallel_beam_b_));
}
- if (column_arr_.size ()){
- Real ncw = column_arr_.top ()->extent (X_AXIS).length ();
- Real w = extent (X_AXIS).length () + ncw;
- Molecule num (lookup_l ()->text ("italic",
- number_str_, paper_l ()));
- num.align_to (X_AXIS, CENTER);
- num.translate_axis (w/2, X_AXIS);
- Real interline = paper_l ()->get_var ("interline");
- Real dy = column_arr_.top ()->extent (Y_AXIS) [get_direction ()]
- - column_arr_[0]->extent (Y_AXIS) [get_direction ()];
- num.align_to (Y_AXIS, CENTER);
- num.translate_axis (get_direction () * interline, Y_AXIS);
+ if (gh_pair_p (get_elt_property ("columns")))
+ {
+ Link_array<Note_column> column_arr=
+ Group_interface__extract_elements (this, (Note_column*)0, "columns");
+
+ Real ncw = column_arr.top ()->extent(X_AXIS).length ();
+ Real w = spanner_length () + ncw;
+ Molecule num (lookup_l ()->text ("italic",
+ number_str_, paper_l ()));
+ num.align_to (X_AXIS, CENTER);
+ num.translate_axis (w/2, X_AXIS);
+ Real interline = paper_l ()->get_var ("interline");
+ Real dy = column_arr.top ()->extent (Y_AXIS) [get_direction ()]
+ - column_arr[0]->extent (Y_AXIS) [get_direction ()];
+ num.align_to (Y_AXIS, CENTER);
+ num.translate_axis (get_direction () * interline, Y_AXIS);
- num.translate_axis (dy/2, Y_AXIS);
+ num.translate_axis (dy/2, Y_AXIS);
- Real thick = paper_l ()->get_var ("tuplet_thick");
- if (bracket_visibility)
- {
- Real gap = paper_l () -> get_var ("tuplet_spanner_gap");
+ Real thick = paper_l ()->get_var ("tuplet_thick");
+ if (bracket_visibility)
+ {
+ Real gap = paper_l () -> get_var ("tuplet_spanner_gap");
- mol_p->add_molecule (lookup_l ()->tuplet_bracket (dy, w, thick, gap, interline, get_direction ()));
- }
-
- if (number_visibility)
- {
- mol_p->add_molecule (num);
- }
- mol_p->translate_axis (get_direction () * interline, Y_AXIS);
- }
+ mol_p->add_molecule (lookup_l ()->tuplet_bracket (dy, w, thick, gap, interline, get_direction ()));
+ }
+
+ if (number_visibility)
+ {
+ mol_p->add_molecule (num);
+ }
+ mol_p->translate_axis (get_direction () * interline, Y_AXIS);
+ }
return mol_p;
}
void
Tuplet_spanner::do_add_processing ()
{
- if (column_arr_.size ())
+ if (gh_pair_p (get_elt_property ("columns")))
{
- set_bounds (LEFT, column_arr_[0]);
- set_bounds (RIGHT, column_arr_.top ());
+ Link_array<Note_column> column_arr=
+ Group_interface__extract_elements (this, (Note_column*)0, "columns");
+
+ set_bounds (LEFT, column_arr[0]);
+ set_bounds (RIGHT, column_arr.top ());
}
}
void
Tuplet_spanner::do_post_processing ()
{
- if (column_arr_.size())
- translate_axis (column_arr_[0]->extent (Y_AXIS)[get_direction ()], Y_AXIS);
+ Link_array<Note_column> column_arr=
+ Group_interface__extract_elements (this, (Note_column*)0, "columns");
+
+
+ if (column_arr.size())
+ translate_axis (column_arr[0]->extent (Y_AXIS)[get_direction ()], Y_AXIS);
- if (beam_l_arr_.size () == 1)
+
+ if (scm_ilength (get_elt_property ("beams")) == 1)
{
- Beam * beam_l = beam_l_arr_[0];
+ SCM bs = get_elt_property ("beams");
+ Score_element *b = unsmob_element (gh_car (bs));
+ Beam * beam_l = dynamic_cast<Beam*> (b);
if (!broken_b ()
&& spanned_drul_[LEFT]->column_l () == beam_l->spanned_drul_[LEFT]->column_l ()
&& spanned_drul_[RIGHT]->column_l () == beam_l->spanned_drul_[RIGHT]->column_l ())
parallel_beam_b_ = true;
}
-
- // if (column_arr_.size () == 1)
- // bracket_visibility_b_ = false;
}
-void
-Tuplet_spanner::do_substitute_element_pointer (Score_element* o, Score_element* n)
-{
- if (Note_column *onc = dynamic_cast <Note_column *> (o))
- column_arr_.substitute (onc, dynamic_cast<Note_column*> (n));
- else if (Beam * b = dynamic_cast<Beam* > (o))
- {
- beam_l_arr_.substitute (b, dynamic_cast<Beam*> (n));
- }
-}
Direction
Tuplet_spanner::get_default_dir () const
return d;
}
- for (int i=0; i < column_arr_.size (); i ++)
+ for (SCM s = get_elt_property ("columns"); gh_pair_p (s); s = gh_cdr (s))
{
- if (column_arr_[i]->dir () < 0)
+ Score_element * sc = unsmob_element (gh_car (s));
+ Note_column * nc = dynamic_cast<Note_column*> (sc);
+ if (nc->dir () < 0)
{
d = DOWN;
break;
}
}
+
return d;
}
Tuplet_spanner::add_beam (Beam *b)
{
add_dependency (b);
- beam_l_arr_.push (b);
+ Group_interface gi (this, "beams");
+ gi.add_element (b);
}
void
Tuplet_spanner::add_column (Note_column*n)
{
- column_arr_.push (n);
+ Group_interface gi (this, "columns");
+ gi.add_element (n);
+
add_dependency (n);
}
#include "paper-def.hh"
#include "volta-spanner.hh"
#include "stem.hh"
-
-#include "pointer.tcc"
+#include "dimension-cache.hh"
+#include "group-interface.hh"
Volta_spanner::Volta_spanner ()
{
last_b_ = false;
+ dim_cache_ [Y_AXIS]->set_callback (dim_callback);
+ set_elt_property ("bars", SCM_EOL);
+ set_elt_property ("note-columns", SCM_EOL);
}
Molecule*
{
Molecule* mol_p = new Molecule;
- if (!bar_arr_.size ())
+ Link_array<Bar> bar_arr
+ = Group_interface__extract_elements (this, (Bar*)0, "bars");
+
+ if (!bar_arr.size ())
return mol_p;
+
+ Link_array<Bar> note_column_arr
+ = Group_interface__extract_elements (this, (Bar*)0, "note-columns");
+
bool no_vertical_start = false;
bool no_vertical_end = last_b_;
no_vertical_start = true;
if (orig_span && (orig_span->broken_into_l_arr_.top () != (Spanner*)this))
no_vertical_end = true;
- if (bar_arr_.top ()->type_str_.length_i () > 1)
+ if (bar_arr.top ()->type_str_.length_i () > 1)
no_vertical_end = false;
Real interline_f = paper_l ()->get_var ("interline");
Real t = paper_l ()->get_var ("volta_thick");
Real dx = internote_f;
- Real w = extent (X_AXIS).length () - dx - get_broken_left_end_align ();
+ Real w = spanner_length() - dx - get_broken_left_end_align ();
Real h = paper_l()->get_var ("volta_spanner_height");
Molecule volta (lookup_l ()->volta (h, w, t, no_vertical_start, no_vertical_end));
Molecule num (lookup_l ()->text ("volta", number_str_, paper_l ()));
- Real dy = bar_arr_.top ()->extent (Y_AXIS) [UP] >
- bar_arr_[0]->extent (Y_AXIS) [UP];
+ Real dy = bar_arr.top ()->extent (Y_AXIS) [UP] >
+ bar_arr[0]->extent (Y_AXIS) [UP];
dy += 2 * h;
- for (int i = 0; i < note_column_arr_.size (); i++)
- dy = dy >? note_column_arr_[i]->extent (Y_AXIS)[BIGGER];
+ for (int i = 0; i < note_column_arr.size (); i++)
+ dy = dy >? note_column_arr[i]->extent (Y_AXIS)[BIGGER];
dy -= h;
Molecule two (lookup_l ()->text ("number", "2", paper_l ()));
void
Volta_spanner::do_add_processing ()
{
- if (bar_arr_.size ())
+
+ Link_array<Bar> bar_arr
+ = Group_interface__extract_elements (this, (Bar*)0, "bars");
+
+ if (bar_arr.size ())
{
- set_bounds (LEFT, bar_arr_[0]);
- set_bounds (RIGHT, bar_arr_.top ());
+ set_bounds (LEFT, bar_arr[0]);
+ set_bounds (RIGHT, bar_arr.top ());
}
}
-
-Interval
-Volta_spanner::do_height () const
-{
- /*
+
+/*
Originally the following comment existed here
"in most cases, it's a lot better not no have height...",
but problems existed with collision between volta spanner
height is now being returned. Additional space should still
be added elsewhere so lyrics from above staff do not sit on
volta spanner. (Roy R. Rankin)
- */
- Real h = paper_l()->get_var ("volta_spanner_height") * 2.;
+*/
+Interval
+Volta_spanner::dim_callback (Dimension_cache const *c)
+{
+ Volta_spanner * v = dynamic_cast<Volta_spanner*> (c->element_l ());
+ Real h = v->paper_l()->get_var ("volta_spanner_height") * 2.;
return Interval (0., h);
}
void
Volta_spanner::do_post_processing ()
{
- if (bar_arr_.size())
- translate_axis (bar_arr_[0]->extent (Y_AXIS)[UP], Y_AXIS);
+
+ Link_array<Bar> bar_arr
+ = Group_interface__extract_elements (this, (Bar*)0, "bars");
+
+ if (bar_arr.size())
+ translate_axis (bar_arr[0]->extent (Y_AXIS)[UP], Y_AXIS);
translate_axis (get_broken_left_end_align (), X_AXIS);
}
-void
-Volta_spanner::do_substitute_element_pointer (Score_element* o, Score_element* n)
-{
- if (Note_column* c = dynamic_cast <Note_column*> (o))
- note_column_arr_.substitute (c, dynamic_cast<Note_column*> (n));
- else if (Bar* c = dynamic_cast <Bar*> (o))
- bar_arr_.substitute (c, dynamic_cast<Bar*> (n));
-}
+
void
Volta_spanner::add_bar (Bar* c)
{
- bar_arr_.push (c);
+ Group_interface gi(this, "bars");
+ gi.add_element (c);
+
add_dependency (c);
}
void
Volta_spanner::add_column (Note_column* c)
{
- note_column_arr_.push (c);
+ Group_interface gi(this, "note-columns");
+ gi.add_element (c);
+
add_dependency (c);
}