]> git.donarmstrong.com Git - lilypond.git/blob - lily/part-combine-engraver.cc
* lily/dynamic-engraver.cc (acknowledge_grob): attach hairpin
[lilypond.git] / lily / part-combine-engraver.cc
1 /*
2   part-combine-engraver.cc -- implement PC-engraver
3
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 2000--2004 Jan Nieuwenhuizen <janneke@gnu.org>
7
8   Han-Wen Nienhuys <hanwen@xs4all.nl>
9   
10 */
11
12 #include "engraver.hh"
13 #include "item.hh"
14 #include "text-item.hh"
15 #include "note-head.hh"
16 #include "stem.hh"
17 #include "side-position-interface.hh"
18 #include "multi-measure-rest.hh"
19
20 class Part_combine_engraver : public Engraver
21 {
22   TRANSLATOR_DECLARATIONS (Part_combine_engraver);
23
24 protected:
25   virtual void acknowledge_grob (Grob_info);
26   virtual void process_music ();
27   virtual void stop_translation_timestep ();
28   virtual bool try_music (Music *);
29 private:
30   Item *text_;
31   Music *event_;
32 };
33
34 bool
35 Part_combine_engraver::try_music (Music*m)
36 {
37   event_ = m;
38   return true;
39 }
40
41 Part_combine_engraver::Part_combine_engraver ()
42 {
43   text_ = 0;
44   event_  =0;
45 }
46
47 void
48 Part_combine_engraver::process_music ()
49 {
50   if (event_
51       && to_boolean (get_property ("printPartCombineTexts")))
52     {
53       SCM what = event_->get_property ("part-combine-status");
54       SCM text = SCM_EOL;
55       if (what == ly_symbol2scm ("solo1"))
56         text = get_property ("soloText");
57       else if (what== ly_symbol2scm ("solo2"))
58         text = get_property ("soloIIText");
59       else if (what == ly_symbol2scm ("unisono"))
60         text = get_property ("aDueText");
61
62       if (Text_interface::markup_p (text))
63         {
64           text_ =  make_item ("CombineTextScript", event_->self_scm () );
65           text_->set_property ("text", text);
66         }
67     }
68 }
69
70 void
71 Part_combine_engraver::acknowledge_grob (Grob_info i)
72 {
73   if (text_)
74     {
75       if (Note_head::has_interface (i.grob_))
76         {
77           Grob*t = text_;
78           Side_position_interface::add_support (t, i.grob_);
79           if (Side_position_interface::get_axis (t) == X_AXIS
80               && !t->get_parent (Y_AXIS))
81             t->set_parent (i.grob_, Y_AXIS);
82         }
83       if (Stem::has_interface (i.grob_))
84         {
85           Side_position_interface::add_support (text_, i.grob_);
86         }
87     }
88 }
89
90 void 
91 Part_combine_engraver::stop_translation_timestep ()
92 {
93       text_ = 0;
94   event_ = 0;
95 }
96
97 ENTER_DESCRIPTION (Part_combine_engraver,
98 /* descr */       "Part combine engraver for orchestral scores:         "
99                   "Print markings a2, Solo, Solo II, and unisono ",
100 /* creats*/       "CombineTextScript",
101 /* accepts */     "part-combine-event",
102 /* acks  */       "multi-measure-rest-interface "
103 "slur-interface stem-interface note-head-interface"
104 ,/* reads */       "printPartCombineTexts",
105 /* write */       "");