]> git.donarmstrong.com Git - lilypond.git/blob - lily/script-engraver.cc
release: 1.1.5
[lilypond.git] / lily / script-engraver.cc
1 /*
2   script-reg.cc -- implement Script_engraver
3
4   (c)  1997--1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
5 */
6
7 #include "script-engraver.hh"
8 #include "script.hh"
9 #include "musical-request.hh"
10 #include "stem.hh"
11 #include "staff-sym.hh"
12 #include "general-script-def.hh"
13 #include "text-def.hh"
14
15
16 Script_engraver::Script_engraver()
17 {
18   do_post_move_processing();
19 }
20
21 bool
22 Script_engraver::do_try_request (Request *r_l)
23 {
24   if (!dynamic_cast <Musical_script_req *> (r_l))
25     return false ;
26   
27   for (int i=0; i < script_req_l_arr_.size(); i++) 
28     {
29       if (r_l->equal_b (script_req_l_arr_[i]))
30         return true;
31     }
32   script_req_l_arr_.push (dynamic_cast <Script_req *> (r_l));
33   
34   return true;
35 }
36
37 void
38 Script_engraver::do_process_requests()
39 {
40   if (script_p_arr_.size ())
41     return ;
42   
43   for (int i=0; i < script_req_l_arr_.size(); i++)
44     {
45       Script_req* l=script_req_l_arr_[i];
46       Script *p =new Script;
47       p->dir_ = l->dir_;
48       p->specs_p_ = l->scriptdef_p_->clone ();
49       script_p_arr_.push (p);
50       announce_element (Score_element_info (p, l));
51     }
52 }
53
54 void
55 Script_engraver::do_pre_move_processing()
56 {
57   Staff_symbol* s_l = get_staff_info().staff_sym_l_;
58   for (int i=0; i < script_p_arr_.size(); i++) 
59     {
60       Script*script_p = script_p_arr_[i];
61       if (!script_p->specs_p_->inside_b())
62         script_p->add_support (s_l);
63
64       if (dynamic_cast<Text_def *> (script_p->specs_p_)) // UGH
65         {
66           Text_def * td_l = (Text_def*)script_p->specs_p_;
67           if (!td_l->style_str_.length_i ())
68             {
69               Scalar style = get_property ("textstyle");
70               if (style.to_bool ())
71                 td_l->style_str_= style;
72             }
73           // urg, what if this is already set? in-band signaling...
74           Scalar alignment = get_property ("textalignment");
75           if (alignment.isnum_b())
76             {
77               td_l->align_dir_= (Direction)(int)alignment;
78             }
79         }
80       typeset_element (script_p);
81     }
82   script_p_arr_.clear();
83 }
84
85 void
86 Script_engraver::do_post_move_processing()
87 {
88   script_req_l_arr_.clear();
89 }
90
91
92 IMPLEMENT_IS_TYPE_B1(Script_engraver,Engraver);
93 ADD_THIS_TRANSLATOR(Script_engraver);