]> git.donarmstrong.com Git - lilypond.git/blob - lily/ledger-line-engraver.cc
7b08506f44302fcbb100ca32e5f07ad4e3b6487c
[lilypond.git] / lily / ledger-line-engraver.cc
1 /*
2   ledger-line-engraver.cc -- implement Ledger_line_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2004--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
7 */
8
9 #include "pointer-group-interface.hh"
10 #include "spanner.hh"
11 #include "engraver.hh"
12 #include "staff-symbol.hh"
13
14 class Ledger_line_engraver : public Engraver
15 {
16   Spanner *span_;
17
18 public:
19   TRANSLATOR_DECLARATIONS (Ledger_line_engraver);
20
21 protected:
22   virtual void finalize ();
23   void process_music ();
24
25   DECLARE_ACKNOWLEDGER (ledgered);
26   DECLARE_ACKNOWLEDGER (staff_symbol);
27
28   void start_spanner ();
29   void stop_spanner ();
30 };
31
32 Ledger_line_engraver::Ledger_line_engraver ()
33 {
34   span_ = 0;
35 }
36
37 void
38 Ledger_line_engraver::start_spanner ()
39 {
40   assert (!span_);
41   span_ = make_spanner ("LedgerLineSpanner", SCM_EOL);
42
43   span_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn")));
44 }
45
46 void
47 Ledger_line_engraver::process_music ()
48 {
49   if (!span_)
50     start_spanner ();
51 }
52
53 void
54 Ledger_line_engraver::finalize ()
55 {
56   stop_spanner ();
57 }
58
59 void
60 Ledger_line_engraver::stop_spanner ()
61 {
62   if (span_)
63     {
64       span_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn")));
65       span_ = 0;
66     }
67 }
68
69 void
70 Ledger_line_engraver::acknowledge_staff_symbol (Grob_info s)
71 {
72   Spanner *sym = dynamic_cast<Spanner *> (s.grob ());
73
74   if (!span_
75       || span_->get_bound (LEFT) != sym->get_bound (LEFT))
76     {
77       stop_spanner ();
78       start_spanner ();
79     }
80 }
81
82 void
83 Ledger_line_engraver::acknowledge_ledgered (Grob_info s)
84 {
85   if (span_)
86     {
87       if (!to_boolean (s.grob ()->get_property ("no-ledgers")))
88         Pointer_group_interface::add_grob (span_, ly_symbol2scm ("note-heads"),
89                                            s.grob ());
90     }
91 }
92
93 #include "translator.icc"
94
95 ADD_ACKNOWLEDGER (Ledger_line_engraver, ledgered);
96 ADD_ACKNOWLEDGER (Ledger_line_engraver, staff_symbol);
97 ADD_TRANSLATOR (Ledger_line_engraver,
98                 "Creates the spanner to draw ledger lines, and notices objects that need ledger lines",
99                 /* create */ "LedgerLineSpanner",
100                 /* accept */ "",
101                 /* read */ "",
102                 /* write */ "")