From 2371d6ba3b62d4d6dc349ab50fa0d76eadfba044 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Janek=20Warcho=C5=82?= Date: Sun, 29 Jun 2014 18:25:04 +0200 Subject: [PATCH] Issue 4005: Set X-parent of TextScript to NoteColumn instead of PaperColumn This makes TextScripts consistent with DynamicTexts and LyricTexts. This is a follow-up to commit 59a842eba0f7ad78289a58a (Issue 2245). Setting TextScript.cross-staff property to #f is required to ensure that there are no collisions between TextScripts and cross-staff notes: \context PianoStaff << \new Staff = "up" { b8[ \change Staff="down" d'] ^"text" } \new Staff = "down" { \clef bass s4 } >> (see also beam-cross-staff-auto-knee.ly) As far as I can see, we don't want TextScript.cross-staff to be true in any situation, because it would result in unwanted collisions. Why it worked before: cross-staff property in this example evaluated to #f, but only because of a bug in Script_interface::calc_cross_staff. That function should have marked the TextScript as cross-staff if the stem of the note to which TextScript was attached was cross-staff, but it didn't work correctly because it expected the parent of the TextScript to be a NoteColumn, while it actually was a PaperColumn. When I changed the parent to be a NoteColumn, the function started working correctly and marked the TextScript as cross-staff, so I had to change the default value of the property. --- lily/text-engraver.cc | 44 ++++++++++++++++++++++++++++++++++--------- scm/define-grobs.scm | 3 ++- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/lily/text-engraver.cc b/lily/text-engraver.cc index ffd669ef80..373cbf7ac7 100644 --- a/lily/text-engraver.cc +++ b/lily/text-engraver.cc @@ -20,6 +20,8 @@ #include "directional-element-interface.hh" #include "engraver.hh" #include "item.hh" +#include "note-column.hh" +#include "pointer-group-interface.hh" #include "side-position-interface.hh" #include "stream-event.hh" #include "text-interface.hh" @@ -29,15 +31,18 @@ /** typeset directions that are plain text. */ + class Text_engraver : public Engraver { vector evs_; + vector scripts_; public: TRANSLATOR_DECLARATIONS (Text_engraver); protected: void stop_translation_timestep (); void process_music (); + DECLARE_ACKNOWLEDGER (note_column); DECLARE_TRANSLATOR_LISTENER (text_script); }; @@ -53,26 +58,44 @@ Text_engraver::process_music () { for (vsize i = 0; i < evs_.size (); i++) { - Stream_event *r = evs_[i]; + Stream_event *ev = evs_[i]; - // URG: Text vs TextScript - Item *text = make_item ("TextScript", r->self_scm ()); + Item *script = make_item ("TextScript", ev->self_scm ()); + scripts_.push_back (script); - int priority = robust_scm2int (text->get_property ("script-priority"), + int priority = robust_scm2int (script->get_property ("script-priority"), 200); /* see script-engraver.cc */ priority += i; - text->set_property ("script-priority", scm_from_int (priority)); + script->set_property ("script-priority", scm_from_int (priority)); - Direction dir = to_dir (r->get_property ("direction")); + Direction dir = to_dir (ev->get_property ("direction")); if (dir) - set_grob_direction (text, dir); + set_grob_direction (script, dir); + + SCM mark = ev->get_property ("text"); + + script->set_property ("text", mark); + } +} - SCM mark = r->get_property ("text"); +void +Text_engraver::acknowledge_note_column (Grob_info info) +{ + // Make note column (or rest, if there are no heads) the parent of the script. + extract_grob_set (info.grob (), "note-heads", heads); + Grob *x_parent = (heads.size () + ? info.grob () + : unsmob_grob (info.grob ()->get_object ("rest"))); - text->set_property ("text", mark); + for (vsize i = 0; i < scripts_.size (); i++) + { + Grob *el = scripts_[i]; + + if (el && !el->get_parent (X_AXIS) && x_parent) + el->set_parent (x_parent, X_AXIS); } } @@ -80,12 +103,15 @@ void Text_engraver::stop_translation_timestep () { evs_.clear (); + scripts_.clear (); } Text_engraver::Text_engraver () { } +ADD_ACKNOWLEDGER (Text_engraver, note_column); + ADD_TRANSLATOR (Text_engraver, /* doc */ "Create text scripts.", diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index bed05c7994..ea606ece06 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -2353,7 +2353,7 @@ (TextScript . ( (avoid-slur . around) - (cross-staff . ,script-or-side-position-cross-staff) + (cross-staff . #f) (direction . ,DOWN) (extra-spacing-width . (+inf.0 . -inf.0)) (outside-staff-horizontal-padding . 0.2) @@ -2371,6 +2371,7 @@ (stencil . ,ly:text-interface::print) (vertical-skylines . ,grob::always-vertical-skylines-from-stencil) (Y-extent . ,grob::always-Y-extent-from-stencil) + (X-align-on-main-noteheads . #t) (X-offset . ,ly:self-alignment-interface::aligned-on-x-parent) (Y-offset . ,side-position-interface::y-aligned-side) (meta . ((class . Item) -- 2.39.5