]> git.donarmstrong.com Git - lilypond.git/blob - lily/key-grav.cc
release: 0.1.32
[lilypond.git] / lily / key-grav.cc
1 /*
2   key-reg.cc -- implement Key_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7
8   
9   Todo: key undo, special keys.
10   
11   */
12 #include "key-grav.hh"
13 #include "key-item.hh"
14 #include "command-request.hh"
15 #include "local-key-grav.hh"
16 #include "musical-request.hh"
17 #include "local-key-item.hh"
18 #include "bar.hh"
19 #include "time-description.hh"
20
21 Key_engraver::Key_engraver()
22 {
23   kit_p_ = 0;
24   do_post_move_processing();
25 }
26
27 void
28 Key_engraver::create_key()
29 {
30   if (!kit_p_) 
31     {
32         int c0_i=0;
33
34         Staff_info inf = get_staff_info();
35         if (inf.c0_position_i_l_)
36             c0_i = *get_staff_info().c0_position_i_l_;  
37         
38         kit_p_ = new Key_item (c0_i);
39         announce_element (Score_elem_info (kit_p_,keyreq_l_));
40         kit_p_->read (*this);
41     }
42 }
43
44 bool
45 Key_engraver::do_try_request (Request * req_l)
46 {
47   Command_req* creq_l= req_l->command();
48   if (!creq_l|| !creq_l->keychange())
49         return false;
50    
51   if (keyreq_l_)
52         return false;           // TODO
53   keyreq_l_ = creq_l->keychange();
54   read_req (keyreq_l_);
55   return true;
56 }
57
58 void
59 Key_engraver::acknowledge_element (Score_elem_info info)
60 {
61   Command_req * r_l = info.req_l_->command() ;
62   if (r_l && r_l->clefchange()) 
63     {
64         create_key();
65     }
66   else if (info.elem_l_->is_type_b (Bar::static_name ())) 
67     {
68         if (!keyreq_l_)
69             default_key_b_ = true;
70         create_key();
71     }
72
73 }
74
75 void
76 Key_engraver::do_process_requests()
77 {
78   if (key_.multi_octave_b_) 
79     {
80         assert (false); // TODO . 
81     }
82   else if (keyreq_l_) 
83     {
84         create_key();
85     }
86 }
87
88 void
89 Key_engraver::do_pre_move_processing()
90
91   if (kit_p_) 
92     {
93         kit_p_->default_b_ = default_key_b_;
94         typeset_element (kit_p_);
95         kit_p_ = 0;
96     }
97 }
98
99
100   
101 void
102 Key_engraver::read_req (Key_change_req * r)
103 {
104   key_.multi_octave_b_ = r->multi_octave_b_;
105   accidental_idx_arr_.clear();
106   for (int i = 0; i < r->melodic_p_arr_.size(); i ++) 
107     {
108         Melodic_req *  m_l =r->melodic_p_arr_[i];
109         int n_i =m_l->notename_i_;
110         int a_i = m_l->accidental_i_;
111         int o_i = m_l->octave_i_;
112         if (r->multi_octave_b_)
113             key_.set (o_i, n_i, a_i);
114         else
115             key_.set (n_i, a_i);
116         accidental_idx_arr_.push (n_i);
117     }
118 }
119
120 void
121 Key_engraver::do_post_move_processing()
122 {
123   keyreq_l_ = 0;
124   default_key_b_ = false;
125 }
126
127
128 IMPLEMENT_IS_TYPE_B1(Key_engraver,Engraver);
129 ADD_THIS_TRANSLATOR(Key_engraver);