lilypond-0.1.37
[lilypond.git] / src / key-reg.cc
blob84b0e268c66592b7774b189cabc865da2b9b9884
1 /*
2 key-reg.cc -- implement Key_register
4 source file of the LilyPond music typesetter
6 (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
8 todo: key undo
11 #include "time-description.hh"
12 #include "key-reg.hh"
13 #include "key-item.hh"
14 #include "commandrequest.hh"
15 #include "staff-column.hh"
16 #include "local-key-reg.hh"
17 #include "musicalrequest.hh"
19 Key_register::Key_register()
21 post_move_processing();
24 bool
25 Key_register::try_request(Request * req_l)
27 Command_req* creq_l= req_l->command();
28 if (!creq_l|| !creq_l->keychange())
29 return false;
31 assert(!keyreq_l_); // todo
32 keyreq_l_ = creq_l->keychange();
33 read_req(keyreq_l_);
34 return true;
37 void
38 Key_register::acknowledge_element(Staff_elem_info info)
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_;
43 kit_p_ = new Key_item(c0_i);
44 kit_p_->read(*this);
45 announce_element(Staff_elem_info(kit_p_, keyreq_l_));
49 void
50 Key_register::process_requests()
52 const Time_description *time_l = get_staff_info().time_c_l_;
54 if (!keyreq_l_ &&
55 (!time_l->whole_in_measure_|| !time_l->when_)) {
56 default_key_b_ = true;
59 if ( default_key_b_ || keyreq_l_) {
60 int c0_i= *get_staff_info().c0_position_i_;
61 kit_p_ = new Key_item(c0_i);
62 kit_p_->read(*this);
63 announce_element(Staff_elem_info(kit_p_, keyreq_l_));
67 void
68 Key_register::pre_move_processing()
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;
82 void
83 Key_register::read_req(Key_change_req * r)
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);
93 void
94 Key_register::post_move_processing()
96 keyreq_l_ = 0;
97 default_key_b_ = false;
98 kit_p_ = 0;