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