]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/key-reg.cc
release: 0.0.49
[lilypond.git] / lily / key-reg.cc
index ca98995b1cf3d865c8ae4282640068a7f290f0d8..0694a3b83f3fefc007d4dc7fc45ae1ce2e849703 100644 (file)
@@ -8,13 +8,14 @@
   todo: key undo
   
   */
-#include "time-description.hh"
 #include "key-reg.hh"
 #include "key-item.hh"
 #include "command-request.hh"
 #include "staff-column.hh"
 #include "local-key-reg.hh"
 #include "musical-request.hh"
+#include "local-key-item.hh"
+#include "bar.hh"
 
 Key_register::Key_register()
 {
@@ -25,11 +26,12 @@ bool
 Key_register::try_request(Request * req_l)
 {
     Command_req* creq_l= req_l->command();
-     if (!creq_l|| !creq_l->keychange())
+    if (!creq_l|| !creq_l->keychange())
        return false;
      
     assert(!keyreq_l_);                // todo
     keyreq_l_ = creq_l->keychange();
+    change_key_b_ = true;
     read_req(keyreq_l_);
     return true;
 }
@@ -38,41 +40,43 @@ void
 Key_register::acknowledge_element(Staff_elem_info info)
 {
     Command_req * r_l = info.req_l_->command() ;
-    if (r_l && r_l->clefchange() && !kit_p_) {
-       int c0_i= *get_staff_info().c0_position_i_l_;
-        kit_p_ = new Key_item(c0_i);
-        kit_p_->read(*this);
-        announce_element(Staff_elem_info(kit_p_, keyreq_l_));
+    if (r_l && r_l->clefchange()) {
+       change_key_b_ = true;
     }
+    
+    if (info.elem_p_->name() == Bar::static_name()) 
+       default_key_b_ = true;
+
 }
 
 void
 Key_register::process_requests()
 {
-    Time_description const *time_l = get_staff_info().time_C_;
+    int c0_i= *get_staff_info().c0_position_i_l_;
 
-    if (!keyreq_l_ &&
-       (!time_l->whole_in_measure_|| !time_l->when_)) {
-       default_key_b_ = true;
-    }
-
-     if ( default_key_b_ || keyreq_l_) {
-        int c0_i= *get_staff_info().c0_position_i_l_;
-        kit_p_ = new Key_item(c0_i);
-        kit_p_->read(*this);
-        announce_element(Staff_elem_info(kit_p_, keyreq_l_));
-     }
+    if (key_.multi_octave_b_)
+       assert(false); // TODO . 
+    else 
+       kit_p_ = new Key_item(c0_i);
+    kit_p_->read(*this);
+    announce_element(Staff_elem_info(kit_p_, keyreq_l_));
 }
 
 void
 Key_register::pre_move_processing()
-{
+{ 
+
+    if (! default_key_b_ && ! change_key_b_ ) {
+       delete kit_p_ ;
+       kit_p_ =0;
+    }
+    
     if (kit_p_) {
-       if (default_key_b_) 
-           typeset_breakable_item(0,0,kit_p_);
-       else 
+       if (change_key_b_) 
            typeset_breakable_item(
                new Key_item(*kit_p_), kit_p_, new Key_item(*kit_p_));
+       else 
+           typeset_breakable_item(0,0,kit_p_);
        kit_p_ = 0;
     }
 }
@@ -82,10 +86,17 @@ Key_register::pre_move_processing()
 void
 Key_register::read_req(Key_change_req * r)
 {
+    key_.multi_octave_b_ = r->multi_octave_b_;
     accidental_idx_arr_.set_size(0);
     for (int i = 0; i < r->melodic_p_arr_.size(); i ++) {
-       int n_i=r->melodic_p_arr_[i]->notename_i_;
-       key_.set(n_i, r->melodic_p_arr_[i]->accidental_i_);
+       Melodic_req *  m_l =r->melodic_p_arr_[i];
+       int n_i=m_l->notename_i_;
+       int a_i = m_l->accidental_i_;
+       int o_i = m_l->octave_i_;
+       if (r->multi_octave_b_)
+           key_.set(o_i, n_i, a_i);
+       else
+           key_.set(n_i, a_i);
        accidental_idx_arr_.push(n_i);
     }
 }
@@ -96,6 +107,7 @@ Key_register::post_move_processing()
     keyreq_l_ = 0;
     default_key_b_ = false;
     kit_p_ = 0;
+    change_key_b_ = false;
 }
 IMPLEMENT_STATIC_NAME(Key_register);
 ADD_THIS_REGISTER(Key_register);