]> git.donarmstrong.com Git - lilypond.git/blob - lily/span-arpeggio-engraver.cc
patch::: 1.3.95.jcn3
[lilypond.git] / lily / span-arpeggio-engraver.cc
1 /*
2   span-arpeggio-engraver.cc -- implement Span_arpeggio_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 "lily-guile.hh"
11 #include "item.hh"
12 #include "arpeggio.hh"
13 #include "span-arpeggio.hh"
14 #include "group-interface.hh"
15 #include "side-position-interface.hh"
16 #include "staff-symbol-referencer.hh"
17
18
19 /** 
20
21   Make arpeggios that span multiple staffs.  Catch arpeggios, and span a
22   Span_arpeggio over them if we find more than two arpeggios.
23   */
24 class Span_arpeggio_engraver : public Engraver
25 {
26 public:
27   VIRTUAL_COPY_CONS (Translator);
28   Span_arpeggio_engraver ();
29
30 protected:
31   virtual void acknowledge_element (Score_element_info);
32   virtual void process_acknowledged ();
33   virtual void do_pre_move_processing ();
34
35 private:
36   Item *span_arpeggio_;
37   Link_array<Score_element> arpeggios_;
38 };
39
40
41 Span_arpeggio_engraver::Span_arpeggio_engraver ()
42 {
43   span_arpeggio_ = 0;
44 }
45
46 void
47 Span_arpeggio_engraver::acknowledge_element (Score_element_info info)
48 {
49     if (info.origin_trans_l_arr (this).size ()
50         && Arpeggio::has_interface (info.elem_l_))
51     {
52       arpeggios_.push (info.elem_l_);
53     }
54 }
55
56 void
57 Span_arpeggio_engraver::process_acknowledged ()
58 {
59   if (!span_arpeggio_ && arpeggios_.size () > 1
60       && to_boolean (get_property ("connectArpeggios")))
61     {
62       span_arpeggio_ = new Item (get_property ("SpanArpeggio"));
63       span_arpeggio_->set_parent (arpeggios_[0], Y_AXIS);
64       // Side_position::set_axis (span_arpeggio_, X_AXIS);
65       Pointer_group_interface pgi (span_arpeggio_, "arpeggios");
66       for (int i = 0; i < arpeggios_.size () ; i++)
67         {
68           pgi.add_element (arpeggios_[i]);
69           span_arpeggio_->add_dependency (arpeggios_[i]);
70         }
71       
72       announce_element (span_arpeggio_, 0);
73     }
74 }
75
76 void
77 Span_arpeggio_engraver::do_pre_move_processing ()
78 {
79   if (span_arpeggio_) 
80     {
81       typeset_element (span_arpeggio_);
82       span_arpeggio_ = 0;
83     }
84   arpeggios_.clear ();
85 }
86
87 ADD_THIS_TRANSLATOR (Span_arpeggio_engraver);
88