]> git.donarmstrong.com Git - lilypond.git/blob - lily/key-grav.cc
release: 0.1.36
[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         kit_p_->break_priority_i_ = -1; // ugh
40         announce_element (Score_elem_info (kit_p_,keyreq_l_));
41         kit_p_->read (*this);
42     }
43 }
44
45 bool
46 Key_engraver::do_try_request (Request * req_l)
47 {
48   Command_req* creq_l= req_l->command();
49   if (!creq_l|| !creq_l->keychange())
50         return false;
51    
52   if (keyreq_l_)
53         return false;           // TODO
54   keyreq_l_ = creq_l->keychange();
55   read_req (keyreq_l_);
56   return true;
57 }
58
59 void
60 Key_engraver::acknowledge_element (Score_elem_info info)
61 {
62   Command_req * r_l = info.req_l_->command() ;
63   if (r_l && r_l->clefchange()) 
64     {
65         create_key();
66     }
67   else if (info.elem_l_->is_type_b (Bar::static_name ())) 
68     {
69         if (!keyreq_l_)
70             default_key_b_ = true;
71         create_key();
72     }
73
74 }
75
76 void
77 Key_engraver::do_process_requests()
78 {
79   if (key_.multi_octave_b_) 
80     {
81         assert (false); // TODO . 
82     }
83   else if (keyreq_l_) 
84     {
85         create_key();
86     }
87 }
88
89 void
90 Key_engraver::do_pre_move_processing()
91
92   if (kit_p_) 
93     {
94         kit_p_->default_b_ = default_key_b_;
95         typeset_element (kit_p_);
96         kit_p_ = 0;
97     }
98 }
99
100
101   
102 void
103 Key_engraver::read_req (Key_change_req * r)
104 {
105   key_.multi_octave_b_ = r->multi_octave_b_;
106   accidental_idx_arr_.clear();
107   for (int i = 0; i < r->melodic_p_arr_.size(); i ++) 
108     {
109         Melodic_req *  m_l =r->melodic_p_arr_[i];
110         int n_i =m_l->notename_i_;
111         int a_i = m_l->accidental_i_;
112         int o_i = m_l->octave_i_;
113         if (r->multi_octave_b_)
114             key_.set (o_i, n_i, a_i);
115         else
116             key_.set (n_i, a_i);
117         accidental_idx_arr_.push (n_i);
118     }
119 }
120
121 void
122 Key_engraver::do_post_move_processing()
123 {
124   keyreq_l_ = 0;
125   default_key_b_ = false;
126 }
127
128
129 IMPLEMENT_IS_TYPE_B1(Key_engraver,Engraver);
130 ADD_THIS_TRANSLATOR(Key_engraver);