-ENTER_DESCRIPTION (Vertical_align_engraver,
-/* descr */ "Catch Vertical axis groups and stack them.",
-/* creats*/ "VerticalAlignment",
-/* accepts */ "",
-/* acks */ "axis-group-interface",
-/* reads */ "",
-/* write */ "");
+ Grob *before_grob = unsmob_grob (before);
+ Grob *after_grob = unsmob_grob (after);
+
+ Align_interface::add_element (valign_, i.grob ());
+
+ if (before_grob || after_grob)
+ {
+ Grob_array *ga = unsmob_grob_array (valign_->get_object ("elements"));
+ vector<Grob*> &arr = ga->array_reference ();
+
+ Grob *added = arr.back ();
+ arr.pop_back ();
+ for (vsize i = 0; i < arr.size (); i++)
+ {
+ if (arr[i] == before_grob)
+ {
+ arr.insert (arr.begin () + i, added);
+
+ /* Only set staff affinity if it already has one. That way we won't
+ set staff-affinity on things that don't want it (like staves). */
+ if (scm_is_number (added->get_property ("staff-affinity")))
+ added->set_property ("staff-affinity", scm_from_int (DOWN));
+ break;
+ }
+ else if (arr[i] == after_grob)
+ {
+ arr.insert (arr.begin () + i + 1, added);
+ if (scm_is_number (added->get_property ("staff-affinity")))
+ added->set_property ("staff-affinity", scm_from_int (UP));
+ break;
+ }
+ }
+ }
+ }
+ else if (qualifies (i))
+ {
+ Pointer_group_interface::add_grob (valign_, ly_symbol2scm ("elements"), i.grob ());
+ if (!unsmob_grob (i.grob ()->get_object ("staff-grouper")))
+ i.grob ()->set_object ("staff-grouper", valign_->self_scm ());
+ }
+}