]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/key-item.cc
release: 1.3.88
[lilypond.git] / lily / key-item.cc
index 72380e73116a65a26c25e769f05594a1b9ef429c..bb3ad4a377fd2b8b8c03e3648603146ef80d3388 100644 (file)
@@ -8,53 +8,37 @@
   keyplacement by Mats Bengtsson
 */
 
-#include "group-interface.hh" 
+#include "item.hh"
 #include "key-item.hh"
 #include "molecule.hh"
 #include "paper-def.hh"
 #include "lookup.hh"
 #include "staff-symbol-referencer.hh"
 
+/*
+  FIXME: too much hardcoding here.
+ */
 const int FLAT_TOP_PITCH=2; /* fes,ges,as and bes typeset in lower octave */
 const int SHARP_TOP_PITCH=4; /*  ais and bis typeset in lower octave */
 
-Key_item::Key_item ()
-{
-  set_elt_property ("breakable", SCM_BOOL_T);
-  set_elt_property ("c0-position", gh_int2scm (0));
-
-  set_elt_property ("old-accidentals", SCM_EOL);
-  set_elt_property ("new-accidentals", SCM_EOL);
-}
-
-void
-Key_item::add (int p, int a)
-{
-  SCM pair = gh_cons (gh_int2scm (p),gh_int2scm (a));
-  Group_interface (this, "new-accidentals").add_thing (pair);
-}
-
-void
-Key_item::add_old (int p, int a)
-{
-  SCM pair = gh_cons (gh_int2scm (p),gh_int2scm (a));  
-  Group_interface (this, "old-accidentals").add_thing (pair);
-}
-
 
+/*
+  FIXME: key-item should just get a list of (position, acc), and leave
+  the thinking to other parties.
+ */
 int
-Key_item::calculate_position(SCM pair) const
+Key_item::calculate_position(Score_element *ki, SCM pair) 
 {
   int p = gh_scm2int (gh_car (pair));
   int a = gh_scm2int (gh_cdr (pair));  
-  
-  if (to_boolean (get_elt_property ("multi-octave")))
+  int c0p = gh_scm2int (ki->get_elt_property ("c0-position"));
+  if (to_boolean (ki->get_elt_property ("multi-octave")))
     {
-      return p + gh_scm2int (get_elt_property ("c0-position"));
+      return p + c0p;
     }
   else {
     // Find the c in the range -4 through 2
-    int from_bottom_pos = gh_scm2int (get_elt_property ("c0-position")) + 4;
+    int from_bottom_pos = c0p + 4;
     from_bottom_pos = from_bottom_pos%7;
     from_bottom_pos = (from_bottom_pos + 7)%7; // Precaution to get positive.
     int c0 = from_bottom_pos - 4;
@@ -86,21 +70,18 @@ Key_item::calculate_position(SCM pair) const
 /*
   TODO
   - space the `natural' signs wider
-
-  
-  
  */
-
-Molecule 
-Key_item::do_brew_molecule() const
+MAKE_SCHEME_CALLBACK(Key_item,brew_molecule);
+SCM
+Key_item::brew_molecule (SCM smob)
 {
-  Molecule mol;
+  Score_element*me =unsmob_element (smob);
 
-  Staff_symbol_referencer_interface si (this);
-  Real inter = si.staff_space ()/2.0;
-  
-  SCM newas = get_elt_property ("new-accidentals");  
 
+  Real inter = Staff_symbol_referencer::staff_space (me)/2.0;
+  
+  SCM newas = me->get_elt_property ("new-accidentals");  
+  Molecule mol;
   /*
     SCM lists are stacks, so we work from right to left, ending with
     the cancellation signature.
@@ -108,14 +89,15 @@ Key_item::do_brew_molecule() const
   for (SCM s = newas; gh_pair_p (s); s = gh_cdr (s))
     {
       int a = gh_scm2int (gh_cdar (s));
-      Molecule m = lookup_l ()->afm_find ("accidentals-" + to_str (a));
-      m.translate_axis (calculate_position(gh_car (s)) * inter, Y_AXIS);
+      Molecule m = me->lookup_l ()->afm_find ("accidentals-" + to_str (a));
+      m.translate_axis (calculate_position(me, gh_car (s)) * inter, Y_AXIS);
       mol.add_at_edge (X_AXIS, LEFT, m, 0);
     }
-  
-  if (break_status_dir () != RIGHT)
+
+  Item *it = dynamic_cast<Item*> (me) ;
+  if (it->break_status_dir () != RIGHT)
     {
-      SCM old = get_elt_property ("old-accidentals");
+      SCM old = me->get_elt_property ("old-accidentals");
       /*
        Add half a space between  cancellation and key sig.
 
@@ -124,7 +106,7 @@ Key_item::do_brew_molecule() const
       Interval x(0, inter);
       Interval y(0,0);
 
-      mol.add_at_edge (X_AXIS, LEFT, lookup_l()->blank (Box(x,y)),0);
+      mol.add_at_edge (X_AXIS, LEFT, me->lookup_l()->blank (Box(x,y)),0);
       
       for (; gh_pair_p (old); old = gh_cdr (old))
         {
@@ -139,20 +121,29 @@ Key_item::do_brew_molecule() const
                
          if (found == SCM_EOL || gh_cdr (found) != gh_cdar (old))
            {
-              Molecule m =lookup_l ()->afm_find ("accidentals-0");
+              Molecule m =me->lookup_l ()->afm_find ("accidentals-0");
 
-              m.translate_axis (calculate_position(gh_car(old)) * inter, Y_AXIS);
+              m.translate_axis (calculate_position (me, gh_car (old)) * inter, Y_AXIS);
               mol.add_at_edge (X_AXIS, LEFT, m,0);     
             }
         }
-
-
     }
 
-  return mol;
+  return mol.create_scheme();
 }
 
 
 
 
+
+bool
+Key_item::has_interface (Score_element*m)
+{
+  return m && m->has_interface (ly_symbol2scm ("key-signature-interface"));
+}
+
+void
+Key_item::set_interface (Score_element*m)
+{
+  m->set_interface (ly_symbol2scm ("key-signature-interface"));
+}