X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ffingering-engraver.cc;h=4f40bff00e7a1048aed2b02fdc63e088ad14fa29;hb=5d84bfad4626892bcffd05adcced53c8a2329047;hp=a8c4fcf68085bedfe8c5f78bd7e2306cc6345d8b;hpb=31568c504806f35aac420a394c9eab07abd9faa7;p=lilypond.git diff --git a/lily/fingering-engraver.cc b/lily/fingering-engraver.cc index a8c4fcf680..4f40bff00e 100644 --- a/lily/fingering-engraver.cc +++ b/lily/fingering-engraver.cc @@ -1,45 +1,56 @@ /* - fingering-engraver.cc -- implement Fingering_engraver + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 1998--2015 Han-Wen Nienhuys - (c) 1998--2006 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 "side-position-interface.hh" -#include "stem.hh" +#include "pitch.hh" #include "rhythmic-head.hh" #include "self-alignment-interface.hh" -#include "pitch.hh" +#include "side-position-interface.hh" +#include "stem.hh" +#include "stream-event.hh" +#include "item.hh" + +#include "translator.icc" class Fingering_engraver : public Engraver { - vector events_; - vector fingerings_; + vector events_; + vector fingerings_; public: TRANSLATOR_DECLARATIONS (Fingering_engraver); protected: - virtual bool try_music (Music *m); void stop_translation_timestep (); void process_music (); - DECLARE_ACKNOWLEDGER (rhythmic_head); - DECLARE_ACKNOWLEDGER (stem); + void listen_fingering (Stream_event *); + void acknowledge_rhythmic_head (Grob_info); + void acknowledge_stem (Grob_info); + void acknowledge_flag (Grob_info); private: - void make_script (Direction, Music *, int); + void make_script (Direction, Stream_event *, int); }; -bool -Fingering_engraver::try_music (Music *m) +void +Fingering_engraver::listen_fingering (Stream_event *ev) { - if (m->is_mus_type ("fingering-event")) - { - events_.push_back (m); - return true; - } - return false; + events_.push_back (ev); } void @@ -49,6 +60,13 @@ Fingering_engraver::acknowledge_stem (Grob_info inf) Side_position_interface::add_support (fingerings_[i], inf.grob ()); } +void +Fingering_engraver::acknowledge_flag (Grob_info inf) +{ + for (vsize i = 0; i < fingerings_.size (); i++) + Side_position_interface::add_support (fingerings_[i], inf.grob ()); +} + void Fingering_engraver::acknowledge_rhythmic_head (Grob_info inf) { @@ -57,7 +75,7 @@ Fingering_engraver::acknowledge_rhythmic_head (Grob_info inf) Grob *t = fingerings_[i]; Side_position_interface::add_support (t, inf.grob ()); if (!t->get_parent (X_AXIS)) - t->set_parent (inf.grob (), X_AXIS); + t->set_parent (inf.grob (), X_AXIS); } } @@ -72,7 +90,7 @@ Fingering_engraver::process_music () } void -Fingering_engraver::make_script (Direction d, Music *r, int i) +Fingering_engraver::make_script (Direction d, Stream_event *r, int i) { Item *fingering = make_item ("Fingering", r->self_scm ()); @@ -82,7 +100,7 @@ Fingering_engraver::make_script (Direction d, Music *r, int i) junkme. */ SCM pitch = r->get_property ("pitch"); - if (unsmob_pitch (pitch)) + if (unsmob (pitch)) fingering->set_property ("pitch", pitch); /* @@ -90,8 +108,7 @@ Fingering_engraver::make_script (Direction d, Music *r, int i) fingerings for chords need different settings. */ Side_position_interface::set_axis (fingering, Y_AXIS); - Self_alignment_interface::set_align_self (fingering, X_AXIS); - Self_alignment_interface::set_center_parent (fingering, X_AXIS); + Self_alignment_interface::set_aligned_on_parent (fingering, X_AXIS); // Hmm int priority = 200; @@ -104,16 +121,10 @@ Fingering_engraver::make_script (Direction d, Music *r, int i) fingering->set_property ("script-priority", scm_from_int (priority)); - if (!is_direction (fingering->get_property_data (ly_symbol2scm ("direction")))) - { - if (d) - fingering->set_property ("direction", scm_from_int (d)); - else - fingering->set_property ("direction", scm_from_int (RIGHT)); - } - - SCM dig = r->get_property ("digit"); - fingering->set_property ("text", scm_number_to_string (dig, scm_from_int (10))); + if (d) + fingering->set_property ("direction", scm_from_int (d)); + else if (!is_direction (fingering->get_property_data ("direction"))) + fingering->set_property ("direction", scm_from_int (UP)); fingerings_.push_back (fingering); } @@ -121,24 +132,35 @@ Fingering_engraver::make_script (Direction d, Music *r, int i) void Fingering_engraver::stop_translation_timestep () { - if (!fingerings_.size ()) - return; - fingerings_.clear (); events_.clear (); } -Fingering_engraver::Fingering_engraver () +Fingering_engraver::Fingering_engraver (Context *c) + : Engraver (c) { } -#include "translator.icc" -ADD_ACKNOWLEDGER (Fingering_engraver, rhythmic_head); -ADD_ACKNOWLEDGER (Fingering_engraver, stem); +void +Fingering_engraver::boot () +{ + ADD_LISTENER (Fingering_engraver, fingering); + ADD_ACKNOWLEDGER (Fingering_engraver, rhythmic_head); + ADD_ACKNOWLEDGER (Fingering_engraver, stem); + ADD_ACKNOWLEDGER (Fingering_engraver, flag); +} + ADD_TRANSLATOR (Fingering_engraver, - /* doc */ "Create fingering-scripts", - /* create */ "Fingering", - /* accept */ "fingering-event", - /* read */ "", - /* write */ ""); + /* doc */ + "Create fingering scripts.", + + /* create */ + "Fingering ", + + /* read */ + "", + + /* write */ + "" + );