]> git.donarmstrong.com Git - lilypond.git/blob - lily/script-engraver.cc
release: 1.1.29
[lilypond.git] / lily / script-engraver.cc
1 /*
2   script-engraver.cc -- implement Script_engraver
3
4   (c)  1997--1999 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_music (Music *r_l)
23 {
24   if (Musical_script_req *mr = dynamic_cast <Musical_script_req *> (r_l))
25     {
26       for (int i=0; i < script_req_l_arr_.size(); i++) 
27         {
28           if (script_req_l_arr_[i]->equal_b (mr))
29             return true;
30         }
31       script_req_l_arr_.push (mr);
32       return true;
33     }
34   return false;
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 (Text_def*td_l = dynamic_cast<Text_def *> (script_p->specs_p_)) // UGH
65         {
66           if (!td_l->style_str_.length_i ())
67             {
68               Scalar style = get_property ("textstyle", 0);
69               if (style.to_bool ())
70                 td_l->style_str_= style;
71             }
72           // urg, what if this is already set? in-band signaling...
73           Scalar alignment = get_property ("textalignment", 0);
74           if (alignment.isnum_b())
75             {
76               td_l->align_dir_= (Direction)(int)alignment;
77             }
78         }
79       typeset_element (script_p);
80     }
81   script_p_arr_.clear();
82 }
83
84 void
85 Script_engraver::do_post_move_processing()
86 {
87   script_req_l_arr_.clear();
88 }
89
90
91
92 ADD_THIS_TRANSLATOR(Script_engraver);