/*
- quote-iterator.cc -- implement Quote_iterator
+ This file is part of LilyPond, the GNU music typesetter.
- source file of the GNU LilyPond music typesetter
+ Copyright (C) 2004--2010 Han-Wen Nienhuys <hanwen@xs4all.nl>
- (c) 2004--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ LilyPond is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ LilyPond is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
*/
#include "music-wrapper-iterator.hh"
#include "lily-guile.hh"
#include "music-sequence.hh"
#include "music.hh"
-#include "stream-event.hh"
#include "warn.hh"
class Quote_iterator : public Music_wrapper_iterator
DECLARE_SCHEME_CALLBACK (constructor, ());
bool quote_ok () const;
- bool accept_music_type (Stream_event *) const;
+ bool accept_music_type (Stream_event *, bool is_cue = true) const;
protected:
virtual void derived_mark () const;
}
bool
-Quote_iterator::accept_music_type (Stream_event *ev) const
+Quote_iterator::accept_music_type (Stream_event *ev, bool is_cue) const
{
- for (SCM accept = get_outlet ()->get_property ("quotedEventTypes");
- scm_is_pair (accept); accept = scm_cdr (accept))
+ SCM accept = SCM_EOL;
+ // Cue notes use the quotedCueEventTypes property, otherwise (and as fallback
+ // for cue notes if quotedCueEventTypes is not set) use quotedEventTypes
+ if (is_cue)
+ accept = get_outlet ()->get_property ("quotedCueEventTypes");
+ if (accept == SCM_EOL)
+ accept = get_outlet ()->get_property ("quotedEventTypes");
+
+ for (; scm_is_pair (accept); accept = scm_cdr (accept))
{
if (ev->internal_in_event_class (scm_car (accept)))
return true;
Pitch *me_pitch = unsmob_pitch (get_music ()->get_property ("quoted-transposition"));
if (!me_pitch)
me_pitch = unsmob_pitch (get_outlet ()->get_property ("instrumentTransposition"));
+ SCM cid = get_music ()->get_property ("quoted-context-id");
+ bool is_cue = scm_is_string (cid) && (ly_scm2string (cid) == "cue");
for (SCM s = scm_cdr (entry); scm_is_pair (s); s = scm_cdr (s))
{
Stream_event *ev = unsmob_stream_event (scm_car (ev_acc));
if (!ev)
programming_error ("no music found in quote");
- else if (accept_music_type (ev))
+ else if (accept_music_type (ev, is_cue))
{
/* create a transposed copy if necessary */
if (quote_pitch || me_pitch)
mp = *me_pitch;
Pitch diff = pitch_interval (qp, mp);
-
- SCM props = transpose_mutable (ev->get_property_alist (true), diff);
- ev = new Stream_event (ev->get_property ("class"), props);
+ ev = ev->clone ();
+
+ transpose_mutable (ev->get_property_alist (true), diff);
transposed_musics_ = scm_cons (ev->unprotect (), transposed_musics_);
}
quote_outlet_.get_outlet ()->event_source ()->broadcast (ev);