#include "debug.hh"
#include "item.hh"
-Hara_kiri_group_spanner::Hara_kiri_group_spanner()
+/*
+ */
+Hara_kiri_group_spanner::Hara_kiri_group_spanner(SCM s)
+ : Spanner (s)
{
- set_elt_property ("items-worth-living", SCM_EOL);
+ set_elt_pointer ("items-worth-living", SCM_EOL);
}
void
Hara_kiri_group_spanner::add_interesting_item (Item* n)
{
add_dependency (n);
- set_elt_property ("items-worth-living",
- gh_cons (n->self_scm_,
- get_elt_property ("items-worth-living")));
+ Pointer_group_interface (this, "items-worth-living").add_element (n);
+
}
void
Hara_kiri_group_spanner::after_line_breaking ()
{
- SCM worth = get_elt_property ("items-worth-living");
+ SCM worth = get_elt_pointer ("items-worth-living");
+ /*
+ worth == self_scm is a stupid way to signal that we're done.
+ */
if (gh_pair_p (worth))
return;
if ( line_l () != s->line_l ())
programming_error ("Killing other children too");
- s->set_elt_property ("transparent", SCM_BOOL_T);
- s->set_empty (X_AXIS);
- s->set_empty (Y_AXIS);
-
+ s->suicide ();
}
- set_empty (X_AXIS);
- set_empty (Y_AXIS);
+
+ /*
+ very appropriate name here :-)
+ */
+ suicide ();
}
+/*
+ We can't rely on offsets and dimensions of elements in a hara-kiri
+ group. Use a callback to make sure that hara-kiri has been done
+ before asking for offsets. */
+Real
+Hara_kiri_group_spanner::force_hara_kiri_callback (Score_element const *elt, Axis a)
+{
+ while (elt && !dynamic_cast<Hara_kiri_group_spanner const*> (elt))
+ elt = elt->parent_l(a);
+
+ if (elt)
+ {
+ Hara_kiri_group_spanner const * seppuku = dynamic_cast<Hara_kiri_group_spanner const*> (elt);
+
+ ((Hara_kiri_group_spanner*)seppuku)->after_line_breaking ();
+ }
+
+ return 0.0;
+}