-
- SCM before = scm_hash_ref (id_to_group_hashtab_, before_id, SCM_BOOL_F);
- SCM after = scm_hash_ref (id_to_group_hashtab_, after_id, SCM_BOOL_F);
-
-
- Align_interface::add_element (valign_, i.grob (),
- get_property ("verticalAlignmentChildCallback"));
-
- if (unsmob_grob (before) || unsmob_grob (after))
- {
- SCM elts = valign_->get_property ("elements");
- SCM new_order = scm_cdr (elts);
- SCM *current = &new_order;
-
- for (SCM s = new_order; scm_is_pair (s); s = scm_cdr (s))
- {
- if (scm_car (s) == after)
- {
- *current = scm_cons (i.grob ()->self_scm(), s);
- break;
- }
- else if (scm_car (s) == before)
- {
- scm_set_cdr_x (s, scm_cons (i.grob ()->self_scm (),
- scm_cdr (s)));
- break;
- }
-
- current = SCM_CDRLOC (s);
- }
-
- valign_->set_property ("elements", new_order);
- }
+
+ SCM before = scm_hash_ref (id_to_group_hashtab_, before_id, SCM_BOOL_F);
+ SCM after = scm_hash_ref (id_to_group_hashtab_, after_id, SCM_BOOL_F);
+
+ 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 ());