]> git.donarmstrong.com Git - lilypond.git/blob - lily/grace-engraver-group.cc
72c1ebdcc6d3e81e62869849844c82e420253c8d
[lilypond.git] / lily / grace-engraver-group.cc
1 /*   
2   grace-engraver-group.cc -- implement Grace_engraver_group
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 1999--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   
8  */
9
10 #include "grace-engraver-group.hh"
11 #include "lily-guile.hh"
12 #include "grob.hh"
13 #include "musical-request.hh"
14
15 void
16 Grace_engraver_group::start ()
17 {
18 }
19 /*
20   We're really finished with this context. Get rid of everything.
21  */
22 void
23 Grace_engraver_group::finish ()
24 {
25   calling_self_b_ = true;
26   removal_processing ();        // ugr. We'd want to have this done by our parents.
27   for (int i=0; i < announce_to_top_.size (); i++)
28     {
29       Engraver::announce_grob (announce_to_top_[i]);
30     }
31
32   for (int i=0; i < typeset_us_.size (); i++)
33     {
34       Engraver::typeset_grob (typeset_us_[i]);
35     }
36   typeset_us_.clear ();
37   calling_self_b_ = false;
38 }
39
40 void
41 Grace_engraver_group::finalize ()
42 {
43   Engraver_group_engraver::finalize ();
44 }
45
46 void
47 Grace_engraver_group::announce_grob (Grob_info inf)
48 {
49   announce_info_arr_.push (inf);
50   // do not propagate to top
51   announce_to_top_.push (inf);
52
53   inf.elem_l_->set_grob_property ("grace", SCM_BOOL_T);
54 }
55
56 void
57 Grace_engraver_group::typeset_grob (Grob*e)
58 {
59   typeset_us_.push (e);
60 }
61
62
63 Grace_engraver_group::Grace_engraver_group ()
64 {
65   calling_self_b_ = false;
66 }
67
68 void
69 Grace_engraver_group::one_time_step ()
70 {
71   calling_self_b_  = true;
72
73   if (!to_boolean (get_property (ly_symbol2scm ("skipTypesetting"))))
74     {
75       process_music ();
76       announces ();
77     }
78   stop_translation_timestep ();
79   check_removal ();
80   calling_self_b_ = false;
81 }
82
83
84 void
85 Grace_engraver_group::each (Method_pointer method)
86 {
87   if (calling_self_b_)
88     Engraver_group_engraver::each (method);
89 }
90
91
92 ADD_THIS_TRANSLATOR (Grace_engraver_group);
93
94
95 /*
96   don't let the commands trickle up.
97  */
98 bool
99 Grace_engraver_group::try_music (Music *m)
100 {
101   bool hebbes_b = try_music_on_nongroup_children (m);
102
103   if (!hebbes_b && pass_to_top_b (m))
104     {
105       hebbes_b = daddy_trans_l_->try_music (m);
106     }
107
108   return hebbes_b;
109 }
110
111 bool
112 Grace_engraver_group::pass_to_top_b (Music *m) const
113 {
114   if (Span_req * sp = dynamic_cast<Span_req*> (m))
115     {
116       if (scm_equal_p (sp->get_mus_property ("span-type"), ly_str02scm ("slur"))
117           == SCM_BOOL_T)
118         //      return true;
119         return false;
120     }
121   return false;
122 }
123
124 void
125 Grace_engraver_group::initialize ()
126 {
127   calling_self_b_ = true;
128   Engraver_group_engraver::initialize ();
129   calling_self_b_ = false;  
130 }