/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 1998--2010 Jan Nieuwenhuizen <janneke@gnu.org>
+ Copyright (C) 1998--2011 Jan Nieuwenhuizen <janneke@gnu.org>
LilyPond is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
class Metronome_mark_engraver : public Engraver
{
-public:
- TRANSLATOR_DECLARATIONS (Metronome_mark_engraver);
-
-protected:
Item *text_;
Grob *support_;
Grob *bar_;
+ Stream_event *tempo_ev_;
- SCM last_duration_;
- SCM last_count_;
- SCM last_text_;
-
- DECLARE_ACKNOWLEDGER (break_aligned);
- DECLARE_ACKNOWLEDGER (grob);
+public:
+ TRANSLATOR_DECLARATIONS (Metronome_mark_engraver);
protected:
- virtual void derived_mark () const;
void stop_translation_timestep ();
void process_music ();
+
+ DECLARE_ACKNOWLEDGER (break_aligned);
+ DECLARE_ACKNOWLEDGER (break_alignment);
+ DECLARE_ACKNOWLEDGER (grob);
+
+ DECLARE_TRANSLATOR_LISTENER (tempo_change);
};
Metronome_mark_engraver::Metronome_mark_engraver ()
text_ = 0;
support_ = 0;
bar_ = 0;
- last_duration_ = SCM_EOL;
- last_count_ = SCM_EOL;
- last_text_ = SCM_EOL;
+ tempo_ev_ = 0;
}
+IMPLEMENT_TRANSLATOR_LISTENER (Metronome_mark_engraver, tempo_change);
void
-Metronome_mark_engraver::derived_mark () const
+Metronome_mark_engraver::listen_tempo_change (Stream_event *ev)
{
- scm_gc_mark (last_count_);
- scm_gc_mark (last_duration_);
- scm_gc_mark (last_text_);
+ ASSIGN_EVENT_ONCE (tempo_ev_, ev);
}
static bool
if (text_
&& g->get_property ("break-align-symbol")
== ly_symbol2scm ("staff-bar"))
- bar_ = g;
+ bar_ = g;
else if (text_
&& !support_
&& safe_is_member (g->get_property ("break-align-symbol"),
- text_->get_property ("break-align-symbols")))
+ text_->get_property ("break-align-symbols"))
+ && Item::break_visible (g))
{
support_ = g;
text_->set_parent (g, X_AXIS);
}
}
-SCM
-grob_name_scm (Grob *g)
+void
+Metronome_mark_engraver::acknowledge_break_alignment (Grob_info info)
{
- SCM name_pair = scm_assq (ly_symbol2scm ("name"), g->get_property ("meta"));
- return (scm_is_pair (name_pair)
- ? ly_camel_case_2_lisp_identifier (scm_cdr (name_pair))
- : SCM_EOL);
+ Grob *g = info.grob ();
+
+ if (text_
+ && support_
+ && dynamic_cast<Item *> (g))
+ text_->set_parent (g, X_AXIS);
}
void
{
Grob *g = info.grob ();
- if (text_
- && safe_is_member (grob_name_scm (g),
- text_->get_property ("non-break-align-symbols")))
- text_->set_parent (g, X_AXIS);
+ if (text_)
+ for (SCM s = text_->get_property ("non-break-align-symbols");
+ scm_is_pair (s);
+ s = scm_cdr (s))
+ if (g->internal_has_interface (scm_car (s)))
+ text_->set_parent (g, X_AXIS);
}
void
text_ = 0;
support_ = 0;
bar_ = 0;
+ tempo_ev_ = 0;
}
}
void
Metronome_mark_engraver::process_music ()
{
- SCM count = get_property ("tempoUnitCount");
- SCM duration = get_property ("tempoUnitDuration");
- SCM text = get_property ("tempoText");
-
- if ( ( (unsmob_duration (duration) && scm_is_number (count))
- || Text_interface::is_markup (text) )
- && !(ly_is_equal (count, last_count_)
- && ly_is_equal (duration, last_duration_)
- && ly_is_equal (text, last_text_)))
+ if (tempo_ev_)
{
- text_ = make_item ("MetronomeMark", SCM_EOL);
+ text_ = make_item ("MetronomeMark", tempo_ev_->self_scm ());
SCM proc = get_property ("metronomeMarkFormatter");
- SCM result = scm_call_4 (proc,
- text,
- duration,
- count,
+ SCM result = scm_call_2 (proc,
+ tempo_ev_->self_scm (),
context ()->self_scm ());
text_->set_property ("text", result);
}
-
- last_duration_ = duration;
- last_count_ = count;
- last_text_ = text;
}
-
-
ADD_ACKNOWLEDGER (Metronome_mark_engraver, break_aligned);
+ADD_ACKNOWLEDGER (Metronome_mark_engraver, break_alignment);
ADD_ACKNOWLEDGER (Metronome_mark_engraver, grob);
ADD_TRANSLATOR (Metronome_mark_engraver,
"MetronomeMark ",
/* read */
- "stavesFound "
+ "currentCommandColumn "
+ "currentMusicalColumn "
"metronomeMarkFormatter "
- "tempoUnitDuration "
- "tempoUnitCount "
- "tempoText "
+ "stavesFound "
"tempoHideNote ",
/* write */