]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-1.1.52
authorfred <fred>
Tue, 26 Mar 2002 22:14:35 +0000 (22:14 +0000)
committerfred <fred>
Tue, 26 Mar 2002 22:14:35 +0000 (22:14 +0000)
lily/beam-engraver.cc
lily/include/local-key-engraver.hh
lily/local-key-engraver.cc

index cb6ec3ef3c413dc991cc802ea6bc0db3490166a1..4e860dcd219ae6b36c3e22bb714a85a1838f7a78 100644 (file)
@@ -138,11 +138,11 @@ Beam_engraver::acknowledge_element (Score_element_info info)
       if (!stem_l || stem_l->beam_l_)
        return;
 
-      bool self_grace = beam_p_->get_elt_property (grace_scm_sym) != SCM_BOOL_F;
+
       bool stem_grace = stem_l->get_elt_property (grace_scm_sym) != SCM_BOOL_F;
 
-      if (!self_grace && stem_grace)
-       return;
+      if (get_property ("weAreGraceContext",0).to_bool () != stem_grace)
+       return;
 
       Rhythmic_req *rhythmic_req = dynamic_cast <Rhythmic_req *> (info.req_l_);
       if (!rhythmic_req)
index 8109865d24765433c43353e60d9ce94e5badc237..bba7b4cadd8e7a9abd1803c73f1cd5deec565602 100644 (file)
@@ -13,7 +13,7 @@
 #include "parray.hh"
 
 struct Local_key_engraver : Engraver {
-    Local_key_item *key_item_p_;
+  Local_key_item *key_item_p_;
 protected:
   VIRTUAL_COPY_CONS(Translator);
   virtual void do_process_requests();
@@ -21,15 +21,17 @@ protected:
   virtual void do_pre_move_processing();
   virtual void do_creation_processing ();
   virtual void process_acknowledged ();
+  virtual void do_removal_processing ();
 public:
   
   Key local_key_;
-  Key const *key_C_;
+  Key_engraver *key_grav_l_;
   Array<Note_req* > mel_l_arr_;
   Array<Item* > support_l_arr_;
   Link_array<Item  > forced_l_arr_;
   Link_array<Item > tied_l_arr_;
   Local_key_engraver();
+  bool self_grace_b_;
   
 };
 
index c5230c09057a9ed9e5db383c471e9e0227dcab29..1307cba00021bf586da820c024783c911270fb68 100644 (file)
 
 Local_key_engraver::Local_key_engraver()
 {
-  key_C_ = 0;
+  key_grav_l_ = 0;
   key_item_p_ =0;
+  self_grace_b_ = false;
 }
 
 void
 Local_key_engraver::do_creation_processing ()
 {
-/*
+  /*
     UGHGUHGUH.
 
     Breaks if Key_engraver is removed from under us.
@@ -34,15 +35,23 @@ Local_key_engraver::do_creation_processing ()
   Translator * result =
     daddy_grav_l()->get_simple_translator ("Key_engraver");
 
-  if (!result)
+  key_grav_l_ = dynamic_cast<Key_engraver *> (result);
+
+  if (!key_grav_l_)
     {
       warning (_ ("out of tune") + "! " + _ ("can't find") + " Key_engraver");
     }
   else
     {
-      key_C_ = &(dynamic_cast<Key_engraver *> (result))->key_;
-      local_key_ = *key_C_;
+      local_key_ = key_grav_l_->key_;
     }
+
+  self_grace_b_ = get_property ("weAreGraceContext",0 ).to_bool ();
+
+  /*
+    TODO
+    (if we are grace) get key info from parent Local_key_engraver
+  */
 }
 
 void
@@ -84,6 +93,12 @@ Local_key_engraver::process_acknowledged ()
     }
 }
 
+void
+Local_key_engraver::do_removal_processing ()
+{
+  // TODO: signal accidentals to Local_key_engraver the 
+}
+
 void
 Local_key_engraver::do_pre_move_processing()
 {
@@ -107,17 +122,17 @@ Local_key_engraver::acknowledge_element (Score_element_info info)
 {    
   Note_req * note_l =  dynamic_cast <Note_req *> (info.req_l_);
   Note_head * note_head = dynamic_cast<Note_head *> (info.elem_l_);
+
+  bool gr = (info.elem_l_->get_elt_property (grace_scm_sym)!=SCM_BOOL_F);
+  if (gr != self_grace_b_)
+    return;
   
   if (note_l && note_head)
     {
       mel_l_arr_.push (note_l);
       support_l_arr_.push (note_head);
     }
-  else if (dynamic_cast <Key_change_req*> (info.req_l_))
-    {
-      local_key_ = *key_C_;
-    }
-  else if (Tie * tie_l = dynamic_cast<Tie *> (info.elem_l_))
+ else if (Tie * tie_l = dynamic_cast<Tie *> (info.elem_l_))
     {
       tied_l_arr_.push (tie_l-> head_l_drul_[RIGHT]);
     }
@@ -130,8 +145,12 @@ Local_key_engraver::do_process_requests()
   if (time_C_ && !time_C_->whole_in_measure_)
     {
       bool no_res = get_property ("noResetKey",0).to_bool ();
-      if (!no_res && key_C_)
-       local_key_= *key_C_;
+      if (!no_res && key_grav_l_)
+       local_key_= key_grav_l_->key_;
+    }
+  else if (key_grav_l_ && key_grav_l_->key_changed_b ())
+    {
+      local_key_ = key_grav_l_->key_;
     }
 }