]> git.donarmstrong.com Git - lilypond.git/blob - lily/note-head-line-engraver.cc
patch::: 1.3.111.jcn3
[lilypond.git] / lily / note-head-line-engraver.cc
1 /*   
2   note-head-line-engraver.cc -- implement Note_head_line_engraver
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 2000 Jan Nieuwenhuizen <janneke@gnu.org>
7  */
8
9 #include "engraver.hh"
10 #include "group-interface.hh"
11 #include "item.hh"
12 #include "musical-request.hh"
13 #include "spanner.hh"
14 #include "rhythmic-head.hh"
15 #include "side-position-interface.hh"
16 #include "staff-symbol-referencer.hh"
17 #include "translator-group.hh"
18
19 /**
20    Create line-spanner grobs for glissandi (and possibly other) lines
21    that connect note heads.
22  */
23
24 class Note_head_line_engraver : public Engraver
25 {
26 public:
27   VIRTUAL_COPY_CONS (Translator);
28   Note_head_line_engraver ();
29
30 protected:
31   virtual void acknowledge_grob (Grob_info);
32   virtual void create_grobs ();
33   virtual void stop_translation_timestep ();
34   virtual bool try_music (Music *);
35
36 private:
37   Spanner* line_; 
38   Request* req_;
39   Request* last_req_;
40   Translator* last_staff_;
41   Grob* head_;
42   Grob* last_head_;
43 };
44
45 Note_head_line_engraver::Note_head_line_engraver ()
46 {
47   line_ = 0;
48   req_ = 0;
49   last_req_ = 0;
50   head_ = 0;
51   last_head_ = 0;
52   last_staff_ = 0;
53 }
54
55 bool
56 Note_head_line_engraver::try_music (Music* m)
57 {
58   if (!req_)
59     {
60       if (Glissando_req *r = dynamic_cast<Glissando_req*> (m))
61         {
62           req_ = r;
63           return true;
64         }
65     }
66   return false;
67 }
68
69 void
70 Note_head_line_engraver::acknowledge_grob (Grob_info info)
71 {
72   if (Rhythmic_head::has_interface (info.elem_l_))
73     {
74       last_head_ = head_;
75       head_ = info.elem_l_;
76       if (to_boolean (get_property ("followThread")))
77         {
78           Translator* staff = daddy_trans_l_ && daddy_trans_l_->daddy_trans_l_
79             ? daddy_trans_l_->daddy_trans_l_->daddy_trans_l_ : 0;
80           if (staff != last_staff_)
81             {
82               if (last_head_)
83                 last_req_ = (Request*)1; // ugh
84               last_staff_ = staff;
85             }
86         }
87     }
88 }
89
90 void
91 Note_head_line_engraver::create_grobs ()
92 {
93   if (!line_ && last_req_ && last_head_ && head_)
94     {
95       /* type Glissando? */
96       line_ = new Spanner (get_property ("NoteHeadLine"));
97       line_->set_bound (LEFT, head_);
98       line_->set_bound (RIGHT, last_head_);
99
100       line_->set_parent (head_, X_AXIS);
101       line_->set_parent (head_, Y_AXIS);
102
103       line_->set_parent (last_head_, X_AXIS);
104       line_->set_parent (last_head_, Y_AXIS);
105
106       if ((int)last_req_ == 1) // ugh
107         last_req_ = 0;
108       
109       announce_grob (line_, last_req_);
110       last_req_ = 0;
111       last_head_ = head_;
112       head_ = 0;
113     }
114 }
115
116 void
117 Note_head_line_engraver::stop_translation_timestep ()
118 {
119   if (line_)
120     {
121       typeset_grob (line_);
122       line_ = 0;
123     }
124   if (req_)
125     last_req_ = req_;
126   req_ = 0;
127 }
128
129
130 ADD_THIS_TRANSLATOR (Note_head_line_engraver);
131