From 0d4c79ec0f5d728ac7fe58b87ccf51079ec33766 Mon Sep 17 00:00:00 2001 From: Mike Solomon Date: Wed, 12 Sep 2012 07:59:38 +0200 Subject: [PATCH] Allows the user to override the text property of ChordName Checks to see if the user has set text and, if so, does not call set_property in the engraver. Compares contents of markups to determine chord equality, allowing successive overridden chords with the same markup content to be identified as equal. --- input/regression/chord-name-override-text.ly | 13 +++++++ lily/chord-name-engraver.cc | 40 ++++++++++++-------- 2 files changed, 38 insertions(+), 15 deletions(-) create mode 100644 input/regression/chord-name-override-text.ly diff --git a/input/regression/chord-name-override-text.ly b/input/regression/chord-name-override-text.ly new file mode 100644 index 0000000000..4acd549394 --- /dev/null +++ b/input/regression/chord-name-override-text.ly @@ -0,0 +1,13 @@ +\version "2.17.2" + +\header { + texidoc = "Users can override the @code{text} property of +@code{ChordName}. +" +} + +\new ChordNames \chordmode { + a b c:7 + \once \override ChordName #'text = #"foo" + d +} \ No newline at end of file diff --git a/lily/chord-name-engraver.cc b/lily/chord-name-engraver.cc index eab4d94d07..26b4a607bb 100644 --- a/lily/chord-name-engraver.cc +++ b/lily/chord-name-engraver.cc @@ -71,12 +71,21 @@ Chord_name_engraver::Chord_name_engraver () void Chord_name_engraver::process_music () { + if (!rest_event_ && !notes_.size ()) + return; + + chord_name_ = make_item ("ChordName", + rest_event_ ? rest_event_->self_scm () : notes_[0]->self_scm ()); + + SCM maybe_markup = chord_name_->get_property_data ("text"); + + bool make_markup = !(Text_interface::is_markup (maybe_markup) + || ly_is_procedure (maybe_markup)); + SCM markup; - SCM bass = SCM_EOL; - SCM inversion = SCM_EOL; - SCM pitches = SCM_EOL; - if (rest_event_) + if (rest_event_ && !make_markup) { } + else if (rest_event_) { SCM no_chord_markup = get_property ("noChordSymbol"); if (!Text_interface::is_markup (no_chord_markup)) @@ -85,8 +94,9 @@ Chord_name_engraver::process_music () } else { - if (!notes_.size ()) - return; + SCM bass = SCM_EOL; + SCM inversion = SCM_EOL; + SCM pitches = SCM_EOL; Stream_event *inversion_event = 0; for (vsize i = 0; i < notes_.size (); i++) @@ -125,24 +135,24 @@ Chord_name_engraver::process_music () pitches = scm_sort_list (pitches, Pitch::less_p_proc); SCM name_proc = get_property ("chordNameFunction"); - markup = scm_call_4 (name_proc, pitches, bass, inversion, - context ()->self_scm ()); + if (make_markup) + markup = scm_call_4 (name_proc, pitches, bass, inversion, + context ()->self_scm ()); } /* Ugh. */ - SCM chord_as_scm = scm_cons (pitches, scm_cons (bass, inversion)); - - chord_name_ = make_item ("ChordName", - rest_event_ ? rest_event_->self_scm () : notes_[0]->self_scm ()); - chord_name_->set_property ("text", markup); + if (make_markup) + chord_name_->set_property ("text", markup); + else if (Text_interface::is_markup (maybe_markup)) + markup = maybe_markup; SCM chord_changes = get_property ("chordChanges"); if (to_boolean (chord_changes) && scm_is_pair (last_chord_) - && ly_is_equal (chord_as_scm, last_chord_)) + && ly_is_equal (markup, last_chord_)) chord_name_->set_property ("begin-of-line-visible", SCM_BOOL_T); - last_chord_ = chord_as_scm; + last_chord_ = markup; } IMPLEMENT_TRANSLATOR_LISTENER (Chord_name_engraver, note); -- 2.39.5