]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/tab-tie-follow-engraver.cc
Imported Upstream version 2.14.2
[lilypond.git] / lily / tab-tie-follow-engraver.cc
diff --git a/lily/tab-tie-follow-engraver.cc b/lily/tab-tie-follow-engraver.cc
new file mode 100644 (file)
index 0000000..a815c5a
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+  This file is part of LilyPond, the GNU music typesetter.
+
+  Copyright (C) 2010--2011 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 <http://www.gnu.org/licenses/>.
+*/
+
+#include <cctype>
+#include <cstdio>
+
+#include "engraver.hh"
+
+using namespace std;
+
+#include "context.hh"
+#include "item.hh"
+#include "spanner.hh"
+
+#include "translator.icc"
+
+/*
+   Change tab-note-head properties when a tie is followed by a
+   slurs or glissando.
+*/
+class Tab_tie_follow_engraver : public Engraver
+{
+  vector<Spanner *> slurs_;
+  vector<Spanner *> glissandi_;
+  vector<Item *> note_heads_;
+
+public:
+  TRANSLATOR_DECLARATIONS (Tab_tie_follow_engraver);
+
+protected:
+  DECLARE_ACKNOWLEDGER (glissando);
+  DECLARE_ACKNOWLEDGER (slur);
+  DECLARE_ACKNOWLEDGER (tab_note_head);
+
+  void stop_translation_timestep ();
+};
+
+Tab_tie_follow_engraver::Tab_tie_follow_engraver ()
+{
+}
+
+void
+Tab_tie_follow_engraver::acknowledge_glissando (Grob_info info)
+{
+  glissandi_.push_back (info.spanner ());
+}
+
+void
+Tab_tie_follow_engraver::acknowledge_tab_note_head (Grob_info info)
+{
+  note_heads_.push_back (info.item ());
+}
+
+void
+Tab_tie_follow_engraver::acknowledge_slur (Grob_info info)
+{
+  slurs_.push_back (info.spanner ());
+}
+
+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 = left_item->get_property ("cause");
+              Item *slur_cause = unsmob_item (left_cause);
+              if (slur_cause ==  note_heads_[k])
+                {
+                  note_heads_[k]->set_property ("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])
+              {
+                note_heads_[k]->set_property ("span-start", SCM_BOOL_T);
+                break;
+              }
+          }
+    }
+  slurs_.clear ();
+  glissandi_.clear ();
+  note_heads_.clear();
+}
+
+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 */
+                " "
+                );