Fixes Issue 1504, allowing feather beam line breaking.
[lilypond/patrick.git] / lily / repeat-tie-engraver.cc
blobb2d5d6134e6fa1f23304dfcd0e33f7153ac7522e
1 /*
2 This file is part of LilyPond, the GNU music typesetter.
4 Copyright (C) 2005--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
7 LilyPond is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 LilyPond is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
22 #include "engraver.hh"
23 #include "item.hh"
24 #include "pointer-group-interface.hh"
25 #include "stream-event.hh"
27 #include "translator.icc"
29 class Repeat_tie_engraver : public Engraver
31 Stream_event *event_;
32 Grob *semi_tie_column_;
33 vector<Grob*> semi_ties_;
35 void stop_translation_timestep ();
36 DECLARE_ACKNOWLEDGER (note_head);
37 DECLARE_TRANSLATOR_LISTENER (repeat_tie);
39 public:
40 TRANSLATOR_DECLARATIONS (Repeat_tie_engraver);
43 Repeat_tie_engraver::Repeat_tie_engraver ()
45 event_ = 0;
46 semi_tie_column_ = 0;
49 void
50 Repeat_tie_engraver::stop_translation_timestep ()
52 event_ = 0;
53 semi_tie_column_ = 0;
54 semi_ties_.clear ();
57 IMPLEMENT_TRANSLATOR_LISTENER (Repeat_tie_engraver, repeat_tie);
58 void
59 Repeat_tie_engraver::listen_repeat_tie (Stream_event *ev)
61 ASSIGN_EVENT_ONCE (event_, ev);
64 void
65 Repeat_tie_engraver::acknowledge_note_head (Grob_info inf)
67 if (!event_)
68 return;
70 if (!semi_tie_column_)
72 semi_tie_column_ = make_item ("RepeatTieColumn", event_->self_scm ());
75 SCM cause = event_->self_scm ();
76 Grob *semi_tie = make_item ("RepeatTie", cause);
77 semi_tie->set_object ("note-head", inf.grob ()->self_scm ());
79 Pointer_group_interface::add_grob (semi_tie_column_, ly_symbol2scm ("ties"),
80 semi_tie);
81 semi_tie->set_parent (semi_tie_column_, Y_AXIS);
82 semi_ties_.push_back (semi_tie);
85 if (is_direction (unsmob_stream_event (cause)->get_property ("direction")))
87 Direction d = to_dir (unsmob_stream_event (cause)->get_property ("direction"));
88 semi_tie->set_property ("direction", scm_from_int (d));
93 ADD_ACKNOWLEDGER (Repeat_tie_engraver, note_head);
94 ADD_TRANSLATOR (Repeat_tie_engraver,
95 /* doc */
96 "Create repeat ties.",
98 /* create */
99 "RepeatTie "
100 "RepeatTieColumn ",
102 /* read */
105 /* write */