2 mark-engraver.cc -- implement Mark_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1998--2005 Jan Nieuwenhuizen <janneke@gnu.org>
12 #include "bar-line.hh"
14 #include "engraver-group.hh"
17 #include "text-interface.hh"
18 #include "grob-array.hh"
21 put stuff over or next to bars. Examples: bar numbers, marginal notes,
24 class Mark_engraver : public Engraver
27 void create_items (Music *);
32 TRANSLATOR_DECLARATIONS (Mark_engraver);
35 virtual bool try_music (Music *ev);
36 void process_music ();
37 void stop_translation_timestep ();
39 DECLARE_ACKNOWLEDGER (break_aligned);
42 Mark_engraver::Mark_engraver ()
49 Mark_engraver::acknowledge_break_aligned (Grob_info inf)
51 Grob *s = inf.grob ();
53 && (get_property ("rehearsalMarkAlignSymbol")
54 == s->get_property ("break-align-symbol")))
57 RehearsalMark cannot be break-aligned, since the width of the
58 object should not be taken into alignment considerations.
60 text_->set_parent (s, X_AXIS);
65 Mark_engraver::stop_translation_timestep ()
69 text_->set_object ("side-support-elements",
70 grob_list_to_grob_array (get_property ("stavesFound")));
77 Mark_engraver::create_items (Music *ev)
82 text_ = make_item ("RehearsalMark", ev->self_scm ());
86 Mark_engraver::try_music (Music *r)
93 TODO: make the increment function in Scheme.
96 Mark_engraver::process_music ()
100 create_items (mark_ev_);
106 SCM m = mark_ev_->get_property ("label");
107 SCM proc = get_property ("markFormatter");
108 if (!Text_interface::is_markup (m)
109 && ly_is_procedure (proc))
111 if (!scm_is_number (m))
112 m = get_property ("rehearsalMark");
114 if (scm_integer_p (m) == SCM_BOOL_T
115 && scm_exact_p (m) == SCM_BOOL_T)
117 int mark_count = scm_to_int (m);
119 context ()->set_property ("rehearsalMark",
120 scm_from_int (mark_count));
123 if (scm_is_number (m))
124 m = scm_call_2 (proc, m, context ()->self_scm ());
126 /* FIXME: constant error message. */
127 warning (_ ("rehearsalMark must have integer value"));
130 if (Text_interface::is_markup (m))
131 text_->set_property ("text", m);
133 warning (_ ("mark label must be a markup object"));
137 #include "translator.icc"
139 ADD_ACKNOWLEDGER (Mark_engraver, break_aligned);
141 ADD_TRANSLATOR (Mark_engraver,
142 /* doc */ "This engraver will create RehearsalMark objects. "
143 "It puts them on top of all staves (which is taken from "
144 "the property @code{stavesFound}). If moving this engraver "
145 "to a different context, "
146 "@ref{Staff_collecting_engraver} must move along, otherwise all marks"
147 "end up on the same Y-location",
148 /* create */ "RehearsalMark",
149 /* accept */ "mark-event",
150 /* read */ "rehearsalMark rehearsalMarkAlignSymbol markFormatter stavesFound",