]> git.donarmstrong.com Git - lilypond.git/blob - lily/grid-line-span-engraver.cc
* input/regression/grid-lines.ly (Module): new file.
[lilypond.git] / lily / grid-line-span-engraver.cc
1 /*
2   grid-line-span-engraver.cc --  implement Grid_line_span_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
7
8 */
9
10 #include "engraver.hh"
11 #include "item.hh"
12 #include "grid-line-interface.hh"
13
14 class Grid_line_span_engraver : public Engraver
15 {
16   Item *spanline_;
17   Link_array<Item> lines_;
18
19 public:
20   TRANSLATOR_DECLARATIONS (Grid_line_span_engraver);
21 protected:
22   virtual void acknowledge_grob (Grob_info);
23   virtual void stop_translation_timestep ();
24 };
25
26 Grid_line_span_engraver::Grid_line_span_engraver ()
27 {
28   spanline_ = 0;
29 }
30
31 void
32 Grid_line_span_engraver::acknowledge_grob (Grob_info i)
33 {
34   int depth = i.origin_contexts (this).size ();
35   if (depth && i.grob_->internal_has_interface (ly_symbol2scm ("grid-point-interface")))
36     {
37       Item *it = dynamic_cast<Item *> (i.grob_);
38       lines_.push (it);
39
40       if (lines_.size () >= 2 && !spanline_)
41         {
42           spanline_ = make_item ("GridLine", SCM_EOL);
43           spanline_->set_parent (lines_[0], X_AXIS);
44         }
45     }
46 }
47
48 void
49 Grid_line_span_engraver::stop_translation_timestep ()
50 {
51   if (spanline_)
52     {
53       for (int i = 0; i < lines_.size (); i++)
54         Grid_line_interface::add_grid_point (spanline_, lines_[i]);
55
56       spanline_ = 0;
57     }
58   lines_.set_size (0);
59 }
60
61 ADD_TRANSLATOR (Grid_line_span_engraver,
62                 /* descr */ "This engraver makes cross-staff linelines: It catches all normal "
63                 "line lines, and draws a single span-line across them.",
64                 /* creats*/ "GridLine",
65                 /* accepts */ "",
66                 /* acks  */ "grid-point-interface",
67                 /* reads */ "",
68                 /* write */ "");