]> git.donarmstrong.com Git - lilypond.git/blob - lily/separating-line-group-engraver.cc
use PaperColumns instead of SeparationItems
[lilypond.git] / lily / separating-line-group-engraver.cc
1 /*
2   separating-line-group-engraver.cc -- implement Separating_line_group_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1998--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
7 */
8
9 #include "engraver.hh"
10
11 #include "separation-item.hh"
12 #include "paper-column.hh"
13 #include "output-def.hh"
14 #include "axis-group-interface.hh"
15 #include "note-spacing.hh"
16 #include "accidental-placement.hh"
17 #include "context.hh"
18 #include "spanner.hh"
19 #include "grob-array.hh"
20 #include "pointer-group-interface.hh"
21
22 #include "translator.icc"
23
24 struct Spacings
25 {
26   Item *staff_spacing_;
27   vector<Item*> note_spacings_;
28
29   Spacings ()
30   {
31     staff_spacing_ = 0;
32   }
33
34   bool is_empty () const
35   {
36     return !staff_spacing_ && !note_spacings_.size ();
37   }
38   void clear ()
39   {
40     staff_spacing_ = 0;
41     note_spacings_.clear ();
42   }
43 };
44
45 class Separating_line_group_engraver : public Engraver
46 {
47 protected:
48   Spacings current_spacings_;
49   Spacings last_spacings_;
50
51   DECLARE_ACKNOWLEDGER (item);
52   void stop_translation_timestep ();
53 public:
54   TRANSLATOR_DECLARATIONS (Separating_line_group_engraver);
55 };
56
57 Separating_line_group_engraver::Separating_line_group_engraver ()
58 {
59 }
60
61 void
62 Separating_line_group_engraver::acknowledge_item (Grob_info i)
63 {
64   Item *it = i.item ();
65
66   if (Note_spacing::has_interface (it))
67     {
68       current_spacings_.note_spacings_.push_back (it);
69       return;
70     }
71
72   if (Item::is_non_musical (it)
73       && !current_spacings_.staff_spacing_
74       && to_boolean (get_property ("createSpacing")))
75     {
76       current_spacings_.staff_spacing_ = make_item ("StaffSpacing", SCM_EOL);
77       
78       if (!last_spacings_.note_spacings_.size ()
79           && last_spacings_.staff_spacing_)
80         {
81           SCM ri = last_spacings_.staff_spacing_->get_object ("right-items");
82           Grob_array *ga = unsmob_grob_array (ri);
83           if (!ga)
84             {
85               SCM ga_scm = Grob_array::make_array ();
86               last_spacings_.staff_spacing_->set_object ("right-items", ga_scm);
87               ga = unsmob_grob_array (ga_scm);
88             }
89           
90           ga->clear ();
91           ga->add (unsmob_grob (get_property ("currentCommandColumn")));
92         }
93     }
94 }
95
96 void
97 Separating_line_group_engraver::stop_translation_timestep ()
98 {
99   if (!current_spacings_.is_empty ())
100     last_spacings_ = current_spacings_;
101
102   current_spacings_.clear ();
103 }
104
105 ADD_ACKNOWLEDGER (Separating_line_group_engraver, item);
106 ADD_TRANSLATOR (Separating_line_group_engraver,
107                 /* doc */ "Generates objects for computing spacing parameters.",
108
109                 /* create */ "StaffSpacing",
110                 /* read */ "createSpacing",
111                 /* write */ ""
112                 );