]> git.donarmstrong.com Git - lilypond.git/blob - lily/clef-reg.cc
791b72408347d00bc3f8fad4dfaa4738b1db2337
[lilypond.git] / lily / clef-reg.cc
1 /*
2   clef.cc -- implement  Clef_register
3
4   source file of the LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>,
7   Mats Bengtsson <matsb@s3.kth.se>
8 */
9
10 #include "clef-reg.hh"
11 #include "clef-item.hh"
12 #include "debug.hh"
13 #include "command-request.hh"
14 #include "time-description.hh"
15 #include "staff-column.hh"
16
17 Clef_register::Clef_register()
18 {
19     clef_p_ = 0;
20     
21     /* ugly hack to prevent segfault (daddy_reg_l_ == 0 at construction) */
22     clef_type_str_ = "";        
23 }
24
25 bool
26 Clef_register::set_type(String s)
27 {
28     clef_type_str_  = s;
29     if (clef_type_str_ == "violin") {
30         c0_position_i_= -2;
31     } else if (clef_type_str_ == "alto") {
32         c0_position_i_= 4;
33     } else if (clef_type_str_ == "tenor") {
34         c0_position_i_= 6;
35     } else if (clef_type_str_ == "bass") {
36         c0_position_i_= 10;
37     }else 
38         return false;
39     *get_staff_info().c0_position_i_ = c0_position_i_;
40     
41     return true;
42 }
43
44 void 
45 Clef_register::read_req(Clef_change_req*c_l)
46 {
47     if (!set_type(c_l->clef_str_))
48         error("unknown clef type ", c_l->defined_ch_c_l_);
49 }
50
51 bool
52 Clef_register::try_request(Request * r_l)
53 {
54     Command_req* creq_l= r_l->command();
55     if (!creq_l || !creq_l->clefchange())
56         return false;
57
58     clef_req_l_ = creq_l->clefchange();
59     
60     // do it now! Others have to read c0_pos.
61     read_req(creq_l->clefchange()); 
62     return true;
63 }
64
65 void
66 Clef_register::process_requests()
67 {
68     const Time_description *time_l = get_staff_info().time_c_l_;
69     if (!clef_req_l_ && (!time_l->whole_in_measure_|| !time_l->when_)) {
70         clef_p_ = new Clef_item;
71         clef_p_->change = false;
72     } else if (clef_req_l_) {
73         clef_p_ = new Clef_item;
74         clef_p_->change = true;
75     }
76     if (clef_p_) {
77         clef_p_->read(*this);
78         announce_element(Staff_elem_info(clef_p_,
79                                          clef_req_l_));
80     }
81 }
82
83 void
84 Clef_register::pre_move_processing()
85 {
86     if (!clef_p_)
87         return;
88     if (clef_p_->change) {
89         Clef_item* post_p = new Clef_item(*clef_p_);
90         post_p->change = false;
91         typeset_breakable_item(new Clef_item(*clef_p_),
92                                clef_p_,  post_p);
93     } else {
94         typeset_breakable_item(0, 0, clef_p_);
95     }
96     clef_p_ = 0;
97 }
98     
99 void
100 Clef_register::post_move_processing()
101 {
102     clef_req_l_ = 0;
103     /* not in ctor, since the reg might not be linked in.*/
104     if (clef_type_str_ == "") { 
105         set_type("violin");
106     }
107 }