]> git.donarmstrong.com Git - lilypond.git/blob - lily/span-bar-engraver.cc
* flower
[lilypond.git] / lily / span-bar-engraver.cc
1 /*
2   span-bar-engraver.cc -- implement Span_bar_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9 #include "bar-line.hh"
10 #include "item.hh"
11 #include "span-bar.hh"
12 #include "engraver.hh"
13
14 /**
15
16 Make bars that span multiple "staves". Catch bars, and span a
17 Span_bar over them if we find more than 2 bars.  Vertical alignment
18 of staves changes the appearance of spanbars.  It is up to the
19 aligner (Vertical_align_engraver, in this case, to add extra
20 dependencies to the spanbars.
21 */
22 class Span_bar_engraver : public Engraver
23 {
24   Item *spanbar_;
25   Link_array<Item> bars_;
26
27 public:
28   TRANSLATOR_DECLARATIONS (Span_bar_engraver);
29 protected:
30   virtual void acknowledge_grob (Grob_info);
31   virtual void stop_translation_timestep ();
32 };
33
34 Span_bar_engraver::Span_bar_engraver ()
35 {
36   spanbar_ = 0;
37 }
38
39 void
40 Span_bar_engraver::acknowledge_grob (Grob_info i)
41 {
42   int depth = i.origin_contexts (this).size ();
43   if (depth && Bar_line::has_interface (i.grob_))
44     {
45       Item *it = dynamic_cast<Item *> (i.grob_);
46       bars_.push (it);
47
48       if (bars_.size () >= 2 && !spanbar_)
49         {
50           spanbar_ = make_item ("SpanBar", SCM_EOL);
51
52           spanbar_->set_parent (bars_[0], X_AXIS);
53
54         }
55     }
56 }
57
58 void
59 Span_bar_engraver::stop_translation_timestep ()
60 {
61   if (spanbar_)
62     {
63       for (int i = 0; i < bars_.size (); i++)
64         Span_bar::add_bar (spanbar_, bars_[i]);
65
66       SCM vissym = ly_symbol2scm ("break-visibility");
67       SCM vis = bars_[0]->internal_get_property (vissym);
68       if (ly_c_equal_p (spanbar_->internal_get_property (vissym), vis))
69         spanbar_->internal_set_property (vissym, vis);
70
71       spanbar_ = 0;
72     }
73   bars_.set_size (0);
74 }
75
76 ADD_TRANSLATOR (Span_bar_engraver,
77                 /* descr */ "This engraver makes cross-staff barlines: It catches all normal "
78                 "bar lines, and draws a single span-bar across them.",
79                 /* creats*/ "SpanBar",
80                 /* accepts */ "",
81                 /* acks  */ "bar-line-interface",
82                 /* reads */ "",
83                 /* write */ "");