X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpart-combine-engraver.cc;h=9646d7a355a6a46bdf6c6bcb12b36614d9f904b8;hb=a6a51abfd0195a3cf7d6ea095cf69808852f21ce;hp=9e10ff3e12026539f72ea6a6ed3bedac267e7c49;hpb=a999ec6e8af5951c122366fc5a80d66cec2ff6f0;p=lilypond.git diff --git a/lily/part-combine-engraver.cc b/lily/part-combine-engraver.cc index 9e10ff3e12..9646d7a355 100644 --- a/lily/part-combine-engraver.cc +++ b/lily/part-combine-engraver.cc @@ -1,104 +1,165 @@ /* - part-combine-engraver.cc -- implement PC-engraver + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter - - (c) 2000--2005 Jan Nieuwenhuizen + Copyright (C) 2000--2015 Jan Nieuwenhuizen Han-Wen Nienhuys + + 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 . */ #include "engraver.hh" -#include "text-item.hh" #include "note-head.hh" -#include "stem.hh" #include "side-position-interface.hh" -#include "multi-measure-rest.hh" +#include "stem.hh" +#include "stream-event.hh" +#include "text-interface.hh" +#include "item.hh" + +#include "translator.icc" class Part_combine_engraver : public Engraver { TRANSLATOR_DECLARATIONS (Part_combine_engraver); protected: - virtual void acknowledge_grob (Grob_info); - virtual void process_music (); - virtual void stop_translation_timestep (); - virtual bool try_music (Music *); + void acknowledge_note_head (Grob_info); + void acknowledge_stem (Grob_info); + + void listen_part_combine (Stream_event *); + void listen_note (Stream_event *); + void process_music (); + void stop_translation_timestep (); + void create_item (Stream_event *ev); + private: Item *text_; - Music *event_; + Stream_event *new_event_; // Event happened at this moment + bool note_found_; + // Event possibly from an earlier moment waiting to create a text: + Stream_event *waiting_event_; }; -bool -Part_combine_engraver::try_music (Music *m) +void +Part_combine_engraver::listen_part_combine (Stream_event *ev) +{ + ASSIGN_EVENT_ONCE (new_event_, ev); + // If two events occur at the same moment, discard the second as the + // warning indicates: + waiting_event_ = new_event_; +} + +void +Part_combine_engraver::listen_note (Stream_event *) { - event_ = m; - return true; + note_found_ = true; } -Part_combine_engraver::Part_combine_engraver () +Part_combine_engraver::Part_combine_engraver (Context *c) + : Engraver (c) { text_ = 0; - event_ = 0; + new_event_ = 0; + waiting_event_ = 0; + note_found_ = false; +} + +void +Part_combine_engraver::create_item (Stream_event *ev) +{ + SCM what = scm_car (ev->get_property ("class")); + SCM text = SCM_EOL; + if (scm_is_eq (what, ly_symbol2scm ("solo-one-event"))) + text = get_property ("soloText"); + else if (scm_is_eq (what, ly_symbol2scm ("solo-two-event"))) + text = get_property ("soloIIText"); + else if (scm_is_eq (what, ly_symbol2scm ("unisono-event"))) + text = get_property ("aDueText"); + + if (Text_interface::is_markup (text)) + { + text_ = make_item ("CombineTextScript", ev->self_scm ()); + text_->set_property ("text", text); + } } void Part_combine_engraver::process_music () { - if (event_ + if (waiting_event_ && to_boolean (get_property ("printPartCombineTexts"))) { - SCM what = event_->get_property ("part-combine-status"); - SCM text = SCM_EOL; - if (what == ly_symbol2scm ("solo1")) - text = get_property ("soloText"); - else if (what == ly_symbol2scm ("solo2")) - text = get_property ("soloIIText"); - else if (what == ly_symbol2scm ("unisono")) - text = get_property ("aDueText"); - - if (Text_interface::markup_p (text)) - { - text_ = make_item ("CombineTextScript", event_->self_scm ()); - text_->set_property ("text", text); - } + if (note_found_ || !to_boolean (get_property ("partCombineTextsOnNote"))) + { + create_item (waiting_event_); + waiting_event_ = 0; + } } } void -Part_combine_engraver::acknowledge_grob (Grob_info i) +Part_combine_engraver::acknowledge_note_head (Grob_info i) { if (text_) { - if (Note_head::has_interface (i.grob_)) - { - Grob *t = text_; - Side_position_interface::add_support (t, i.grob_); - if (Side_position_interface::get_axis (t) == X_AXIS - && !t->get_parent (Y_AXIS)) - t->set_parent (i.grob_, Y_AXIS); - } - if (Stem::has_interface (i.grob_)) - { - Side_position_interface::add_support (text_, i.grob_); - } + Grob *t = text_; + Side_position_interface::add_support (t, i.grob ()); + if (Side_position_interface::get_axis (t) == X_AXIS + && !t->get_parent (Y_AXIS)) + t->set_parent (i.grob (), Y_AXIS); } } +void +Part_combine_engraver::acknowledge_stem (Grob_info i) +{ + if (text_) + Side_position_interface::add_support (text_, i.grob ()); +} + void Part_combine_engraver::stop_translation_timestep () { text_ = 0; - event_ = 0; + new_event_ = 0; + note_found_ = false; +} + +void +Part_combine_engraver::boot () +{ + ADD_LISTENER (Part_combine_engraver, part_combine); + ADD_LISTENER (Part_combine_engraver, note); + ADD_ACKNOWLEDGER (Part_combine_engraver, note_head); + ADD_ACKNOWLEDGER (Part_combine_engraver, stem); } ADD_TRANSLATOR (Part_combine_engraver, - /* descr */ "Part combine engraver for orchestral scores: " - "Print markings a2, Solo, Solo II, and unisono ", - /* creats*/ "CombineTextScript", - /* accepts */ "part-combine-event", - /* acks */ "multi-measure-rest-interface " - "slur-interface stem-interface note-head-interface", - /* reads */ "printPartCombineTexts soloText soloIIText " - "aDueText", - /* write */ ""); + /* doc */ + "Part combine engraver for orchestral scores: Print markings" + " @q{a2}, @q{Solo}, @q{Solo II}, and @q{unisono}.", + + /* create */ + "CombineTextScript ", + + /* read */ + "printPartCombineTexts " + "partCombineTextsOnNote " + "soloText " + "soloIIText " + "aDueText ", + + /* write */ + "" + );