/*
This file is part of LilyPond, the GNU music typesetter.
Copyright (C) 2010--2021 Carl D. Sorensen
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 "context.hh"
#include "item.hh"
#include "spanner.hh"
#include "translator.icc"
#include
#include
using std::vector;
/*
Change tab-note-head properties when a tie is followed by a
slurs or glissando.
*/
class Tab_tie_follow_engraver : public Engraver
{
vector slurs_;
vector glissandi_;
vector- note_heads_;
public:
TRANSLATOR_DECLARATIONS (Tab_tie_follow_engraver);
protected:
void acknowledge_glissando (Grob_info_t);
void acknowledge_slur (Grob_info_t);
void acknowledge_tab_note_head (Grob_info_t
- );
void stop_translation_timestep ();
};
Tab_tie_follow_engraver::Tab_tie_follow_engraver (Context *c)
: Engraver (c)
{
}
void
Tab_tie_follow_engraver::acknowledge_glissando (Grob_info_t info)
{
glissandi_.push_back (info.grob ());
}
void
Tab_tie_follow_engraver::acknowledge_tab_note_head (Grob_info_t
- info)
{
note_heads_.push_back (info.grob ());
}
void
Tab_tie_follow_engraver::acknowledge_slur (Grob_info_t info)
{
slurs_.push_back (info.grob ());
}
void
Tab_tie_follow_engraver::stop_translation_timestep ()
{
for (vsize k = 0; k < note_heads_.size (); k++)
{
bool spanner_start = false;
for (vsize j = 0; j < slurs_.size (); j++)
{
Item *left_item = slurs_[j]->get_bound (LEFT);
if (left_item)
{
SCM left_cause = get_property (left_item, "cause");
Item *slur_cause = unsmob
- (left_cause);
if (slur_cause == note_heads_[k])
{
set_property (note_heads_[k], "span-start", SCM_BOOL_T);
spanner_start = true;
break;
}
}
}
if (!spanner_start)
for (vsize j = 0; j < glissandi_.size (); j++)
{
Item *left_bound = glissandi_[j]->get_bound (LEFT);
if (left_bound == note_heads_[k])
{
set_property (note_heads_[k], "span-start", SCM_BOOL_T);
break;
}
}
}
slurs_.clear ();
glissandi_.clear ();
note_heads_.clear ();
}
void
Tab_tie_follow_engraver::boot ()
{
ADD_ACKNOWLEDGER (Tab_tie_follow_engraver, slur);
ADD_ACKNOWLEDGER (Tab_tie_follow_engraver, glissando);
ADD_ACKNOWLEDGER (Tab_tie_follow_engraver, tab_note_head);
}
ADD_TRANSLATOR (Tab_tie_follow_engraver,
/* doc */
"Adjust TabNoteHead properties when a tie is followed"
" by a slur or glissando.",
/* create */
" ",
/* read */
" ",
/* write */
" "
);