]> git.donarmstrong.com Git - lilypond.git/blob - lily/double-percent-repeat-engraver.cc
Web-ja: update introduction
[lilypond.git] / lily / double-percent-repeat-engraver.cc
1 /*
2   This file is part of LilyPond, the GNU music typesetter.
3
4   Copyright (C) 2011--2015 Neil Puttock <n.puttock@gmail.com>
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 "global-context.hh"
22 #include "international.hh"
23 #include "item.hh"
24 #include "side-position-interface.hh"
25 #include "stream-event.hh"
26 #include "warn.hh"
27
28 #include "translator.icc"
29
30 class Double_percent_repeat_engraver : public Engraver
31 {
32 public:
33   TRANSLATOR_DECLARATIONS (Double_percent_repeat_engraver);
34
35 protected:
36   Stream_event *percent_event_;
37
38   // moment (global time) where percent started
39   Moment start_mom_;
40
41   void listen_double_percent (Stream_event *);
42
43   void process_music ();
44 };
45
46 Double_percent_repeat_engraver::Double_percent_repeat_engraver (Context *c)
47   : Engraver (c)
48 {
49   percent_event_ = 0;
50 }
51
52 void
53 Double_percent_repeat_engraver::listen_double_percent (Stream_event *ev)
54 {
55   if (!percent_event_)
56     {
57       Moment meas_len (robust_scm2moment (get_property ("measureLength"),
58                                           Moment (1)));
59       start_mom_ = now_mom () + meas_len;
60       get_global_context ()->add_moment_to_process (start_mom_);
61       percent_event_ = ev;
62     }
63   else
64     ASSIGN_EVENT_ONCE (percent_event_, ev);
65 }
66
67 void
68 Double_percent_repeat_engraver::process_music ()
69 {
70   if (percent_event_ && now_mom ().main_part_ == start_mom_.main_part_)
71     {
72       Item *double_percent = make_item ("DoublePercentRepeat",
73                                         percent_event_->self_scm ());
74
75       SCM count = percent_event_->get_property ("repeat-count");
76       if (!scm_is_null (count) && to_boolean (get_property ("countPercentRepeats"))
77           && check_repeat_count_visibility (context (), count))
78         {
79           Item *double_percent_counter
80             = make_item ("DoublePercentRepeatCounter",
81                          percent_event_->self_scm ());
82
83           SCM text = scm_number_to_string (count, scm_from_int (10));
84           double_percent_counter->set_property ("text", text);
85
86           Side_position_interface::add_support (double_percent_counter,
87                                                 double_percent);
88           double_percent_counter->set_parent (double_percent, Y_AXIS);
89           double_percent_counter->set_parent (double_percent, X_AXIS);
90         }
91       // forbid breaks on a % line
92       context ()->get_score_context ()->set_property ("forbidBreak",
93                                                       SCM_BOOL_T);
94       percent_event_ = 0;
95     }
96 }
97
98 void
99 Double_percent_repeat_engraver::boot ()
100 {
101   ADD_LISTENER (Double_percent_repeat_engraver, double_percent);
102 }
103
104 ADD_TRANSLATOR (Double_percent_repeat_engraver,
105                 /* doc */
106                 "Make double measure repeats.",
107
108                 /* create */
109                 "DoublePercentRepeat "
110                 "DoublePercentRepeatCounter ",
111
112                 /* read */
113                 "countPercentRepeats "
114                 "measureLength "
115                 "repeatCountVisibility ",
116
117                 /* write */
118                 "forbidBreak "
119                );