]> git.donarmstrong.com Git - lilypond.git/blob - lily/key-reg.cc
release: 0.0.46.jcn1
[lilypond.git] / lily / key-reg.cc
1 /*
2   key-reg.cc -- implement Key_register
3
4   source file of the LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7
8   todo: key undo
9   
10   */
11 #include "time-description.hh"
12 #include "key-reg.hh"
13 #include "key-item.hh"
14 #include "command-request.hh"
15 #include "staff-column.hh"
16 #include "local-key-reg.hh"
17 #include "musical-request.hh"
18
19 Key_register::Key_register()
20 {
21     post_move_processing();
22 }
23
24 bool
25 Key_register::try_request(Request * req_l)
26 {
27     Command_req* creq_l= req_l->command();
28      if (!creq_l|| !creq_l->keychange())
29         return false;
30      
31     assert(!keyreq_l_);         // todo
32     keyreq_l_ = creq_l->keychange();
33     read_req(keyreq_l_);
34     return true;
35 }
36
37 void
38 Key_register::acknowledge_element(Staff_elem_info info)
39 {
40     Command_req * r_l = info.req_l_->command() ;
41     if (r_l && r_l->clefchange() && !kit_p_) {
42         int c0_i= *get_staff_info().c0_position_i_l_;
43          kit_p_ = new Key_item(c0_i);
44          kit_p_->read(*this);
45          announce_element(Staff_elem_info(kit_p_, keyreq_l_));
46     }
47 }
48
49 void
50 Key_register::process_requests()
51 {
52     Time_description const *time_l = get_staff_info().time_C_;
53
54     if (!keyreq_l_ &&
55         (!time_l->whole_in_measure_|| !time_l->when_)) {
56         default_key_b_ = true;
57     }
58
59      if ( default_key_b_ || keyreq_l_) {
60          int c0_i= *get_staff_info().c0_position_i_l_;
61          kit_p_ = new Key_item(c0_i);
62          kit_p_->read(*this);
63          announce_element(Staff_elem_info(kit_p_, keyreq_l_));
64      }
65 }
66
67 void
68 Key_register::pre_move_processing()
69 {
70     if (kit_p_) {
71         if (default_key_b_) 
72             typeset_breakable_item(0,0,kit_p_);
73         else 
74             typeset_breakable_item(
75                 new Key_item(*kit_p_), kit_p_, new Key_item(*kit_p_));
76         kit_p_ = 0;
77     }
78 }
79
80
81     
82 void
83 Key_register::read_req(Key_change_req * r)
84 {
85     accidental_idx_arr_.set_size(0);
86     for (int i = 0; i < r->melodic_p_arr_.size(); i ++) {
87         int n_i=r->melodic_p_arr_[i]->notename_i_;
88         key_.set(n_i, r->melodic_p_arr_[i]->accidental_i_);
89         accidental_idx_arr_.push(n_i);
90     }
91 }
92
93 void
94 Key_register::post_move_processing()
95 {
96     keyreq_l_ = 0;
97     default_key_b_ = false;
98     kit_p_ = 0;
99 }
100 IMPLEMENT_STATIC_NAME(Key_register);
101 ADD_THIS_REGISTER(Key_register);