]> git.donarmstrong.com Git - lilypond.git/blob - lily/separating-line-group-engraver.cc
fix various dot-related regressions
[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   void start_translation_timestep ();
54 public:
55   TRANSLATOR_DECLARATIONS (Separating_line_group_engraver);
56 };
57
58 Separating_line_group_engraver::Separating_line_group_engraver ()
59 {
60 }
61
62 void
63 Separating_line_group_engraver::acknowledge_item (Grob_info i)
64 {
65   Item *it = i.item ();
66
67   if (Note_spacing::has_interface (it))
68     {
69       current_spacings_.note_spacings_.push_back (it);
70       return;
71     }
72
73   if (Item::is_non_musical (it)
74       && !current_spacings_.staff_spacing_
75       && to_boolean (get_property ("createSpacing")))
76     {
77       Grob *col = unsmob_grob (get_property ("currentCommandColumn"));
78
79       current_spacings_.staff_spacing_ = make_item ("StaffSpacing", SCM_EOL);
80       context ()->set_property ("hasStaffSpacing", SCM_BOOL_T);
81
82       Pointer_group_interface::add_grob (current_spacings_.staff_spacing_,
83                                          ly_symbol2scm ("left-items"),
84                                          col);
85       
86       if (!last_spacings_.note_spacings_.size ()
87           && last_spacings_.staff_spacing_)
88         {
89           SCM ri = last_spacings_.staff_spacing_->get_object ("right-items");
90           Grob_array *ga = unsmob_grob_array (ri);
91           if (!ga)
92             {
93               SCM ga_scm = Grob_array::make_array ();
94               last_spacings_.staff_spacing_->set_object ("right-items", ga_scm);
95               ga = unsmob_grob_array (ga_scm);
96             }
97           
98           ga->clear ();
99           ga->add (col);
100         }
101     }
102 }
103
104 void
105 Separating_line_group_engraver::start_translation_timestep ()
106 {
107   context ()->unset_property (ly_symbol2scm ("hasStaffSpacing"));
108 }
109
110 void
111 Separating_line_group_engraver::stop_translation_timestep ()
112 {
113   if (!current_spacings_.is_empty ())
114     last_spacings_ = current_spacings_;
115
116   if (Item *sp = current_spacings_.staff_spacing_)
117     if (Grob *col = unsmob_grob (get_property ("currentMusicalColumn")))
118       Pointer_group_interface::add_grob (sp, ly_symbol2scm ("right-items"), col);
119
120   current_spacings_.clear ();
121 }
122
123 ADD_ACKNOWLEDGER (Separating_line_group_engraver, item);
124 ADD_TRANSLATOR (Separating_line_group_engraver,
125                 /* doc */ "Generates objects for computing spacing parameters.",
126
127                 /* create */ "StaffSpacing",
128                 /* read */ "createSpacing",
129                 /* write */ "hasStaffSpacing"
130                 );