]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/tie-specification.cc
Doc-es: various updates.
[lilypond.git] / lily / tie-specification.cc
index 3a7ce345cb425ec45d8fc5a326b3f6366d3e6525..f404ad597c4b9514885b3d1e7aa2aed5cddbec18 100644 (file)
@@ -1,5 +1,8 @@
 #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"
@@ -13,28 +16,38 @@ Tie_specification::Tie_specification ()
   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;
     }