#include "tie-formatting-problem.hh"
#include "grob.hh"
+#include "item.hh"
+#include "semi-tie.hh"
+#include "spanner.hh"
#include "tie.hh"
#include "libc-extension.hh"
#include "tie-specification.hh"
position_ = 0;
manual_position_ = 0;
manual_dir_ = CENTER;
- note_head_drul_[LEFT] =
- note_head_drul_[RIGHT] = 0;
- column_ranks_[RIGHT] =
- column_ranks_[LEFT] = 0;
+ note_head_drul_[LEFT]
+ = note_head_drul_[RIGHT] = 0;
+ column_ranks_[RIGHT]
+ = column_ranks_[LEFT] = 0;
}
-
void
Tie_specification::from_grob (Grob *tie)
{
+ // In this method, Tie and Semi_tie require the same logic with different
+ // types. It might be clearer to use a template.
tie_grob_ = tie;
if (scm_is_number (tie->get_property_data ("direction")))
{
manual_dir_ = to_dir (tie->get_property ("direction"));
has_manual_dir_ = true;
}
-
- position_ = Tie::get_position (tie);
+
+ if (Spanner *spanner = dynamic_cast<Spanner *> (tie))
+ position_ = Tie::get_position (spanner);
+ else if (Item *item = dynamic_cast<Item *> (tie))
+ position_ = Semi_tie::get_position (item);
+ else
+ {
+ programming_error ("grob is neither a tie nor a semi-tie");
+ position_ = 0;
+ }
+
SCM pos_scm = tie->get_property ("staff-position");
if (scm_is_number (pos_scm))
{
- has_manual_delta_y_ = (scm_inexact_p (pos_scm) == SCM_BOOL_T);
+ has_manual_delta_y_ = !ly_is_rational (pos_scm);
manual_position_ = scm_to_double (tie->get_property ("staff-position"));
has_manual_position_ = true;
}