]> git.donarmstrong.com Git - lilypond.git/blob - lily/grid-line-span-engraver.cc
Issue 5024: Rework the Preinit framework into something simpler
[lilypond.git] / lily / grid-line-span-engraver.cc
1 /*
2   This file is part of LilyPond, the GNU music typesetter.
3
4   Copyright (C) 2005--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
5
6   LilyPond is free software: you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation, either version 3 of the License, or
9   (at your option) any later version.
10
11   LilyPond is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #include "engraver.hh"
21 #include "item.hh"
22 #include "grid-line-interface.hh"
23
24 #include "translator.icc"
25
26 class Grid_line_span_engraver : public Engraver
27 {
28   Item *spanline_;
29   vector<Item *> lines_;
30
31 public:
32   TRANSLATOR_DECLARATIONS (Grid_line_span_engraver);
33 protected:
34   void acknowledge_grid_point (Grob_info);
35   void stop_translation_timestep ();
36 };
37
38 Grid_line_span_engraver::Grid_line_span_engraver ()
39 {
40   spanline_ = 0;
41 }
42
43 void
44 Grid_line_span_engraver::acknowledge_grid_point (Grob_info i)
45 {
46   int depth = i.origin_contexts (this).size ();
47   if (depth)
48     {
49       Item *it = dynamic_cast<Item *> (i.grob ());
50       lines_.push_back (it);
51
52       if (lines_.size () >= 2 && !spanline_)
53         {
54           spanline_ = make_item ("GridLine", SCM_EOL);
55           spanline_->set_parent (lines_[0], X_AXIS);
56         }
57     }
58 }
59
60 void
61 Grid_line_span_engraver::stop_translation_timestep ()
62 {
63   if (spanline_)
64     {
65       for (vsize i = 0; i < lines_.size (); i++)
66         Grid_line_interface::add_grid_point (spanline_, lines_[i]);
67
68       spanline_ = 0;
69     }
70   lines_.resize (0);
71 }
72
73 void
74 Grid_line_span_engraver::boot ()
75 {
76   ADD_ACKNOWLEDGER (Grid_line_span_engraver, grid_point);
77 }
78
79 ADD_TRANSLATOR (Grid_line_span_engraver,
80                 /* doc */
81                 "This engraver makes cross-staff lines: It catches all normal"
82                 " lines and draws a single span line across them.",
83
84                 /* create */
85                 "GridLine ",
86
87                 /* read */
88                 "",
89
90                 /* write */
91                 ""
92                );