From f88087ee5074153e31edb79c4b587bb66776782a Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Fri, 25 Nov 2005 15:49:56 +0000 Subject: [PATCH] * lily/system-start-delimiter-engraver.cc: move from Nested_system_start_delimiter_engraver, rename Nested_system_start_delimiter_engraver -> System_start_delimiter_engraver. * lily/nested-system-start-delimiter-engraver.cc (from_list): read bracket type from hierarchy. --- ChangeLog | 5 + Documentation/topdocs/NEWS.tely | 5 +- input/regression/system-start-nesting.ly | 11 +- lily/mark-engraver.cc | 15 +- .../nested-system-start-delimiter-engraver.cc | 247 ------------------ lily/system-start-delimiter-engraver.cc | 218 ++++++++++++++-- ly/engraver-init.ly | 8 +- scm/define-context-properties.scm | 2 - 8 files changed, 216 insertions(+), 295 deletions(-) delete mode 100644 lily/nested-system-start-delimiter-engraver.cc diff --git a/ChangeLog b/ChangeLog index 1fbc938829..9ad98a2b9d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2005-11-25 Han-Wen Nienhuys + * lily/system-start-delimiter-engraver.cc: move from + Nested_system_start_delimiter_engraver, rename + Nested_system_start_delimiter_engraver -> + System_start_delimiter_engraver. + * lily/nested-system-start-delimiter-engraver.cc (from_list): read bracket type from hierarchy. diff --git a/Documentation/topdocs/NEWS.tely b/Documentation/topdocs/NEWS.tely index 8a4462a3e9..0146cd0ec4 100644 --- a/Documentation/topdocs/NEWS.tely +++ b/Documentation/topdocs/NEWS.tely @@ -53,9 +53,8 @@ delimiters, @lilypond[raggedright] \new StaffGroup \relative << - \set StaffGroup.systemStartDelimiters - = #'(SystemStartSquare SystemStartBracket SystemStartSquare) - \set StaffGroup.systemStartDelimiterHierarchy = #'((a (b)) c) + \set StaffGroup.systemStartDelimiterHierarchy + = #'(SystemStartSquare (SystemStartBracket a (SystemStartSquare b)) d) \new Staff { c1 } \new Staff { c1 } \new Staff { c1 } diff --git a/input/regression/system-start-nesting.ly b/input/regression/system-start-nesting.ly index 7c30e52c3b..5f5ff48d24 100644 --- a/input/regression/system-start-nesting.ly +++ b/input/regression/system-start-nesting.ly @@ -9,15 +9,10 @@ raggedright = ##t } -\new StaffGroup \with { - \remove "System_start_delimiter_engraver" - \consists "Nested_system_start_delimiter_engraver" -} +\new StaffGroup \relative << - \set StaffGroup.systemStartDelimiters = - #'(SystemStartSquare SystemStartBracket SystemStartSquare) - - \set StaffGroup.systemStartDelimiterHierarchy = #'((a (b)) c) + \set StaffGroup.systemStartDelimiterHierarchy + = #'(SystemStartSquare (SystemStartBracket a (SystemStartSquare b)) d) \new Staff { c1 } \new Staff { c1 } \new Staff { c1 } diff --git a/lily/mark-engraver.cc b/lily/mark-engraver.cc index 0215ce4b8e..82fc31ba39 100644 --- a/lily/mark-engraver.cc +++ b/lily/mark-engraver.cc @@ -23,19 +23,20 @@ using namespace std; */ class Mark_engraver : public Engraver { + + void create_items (Music *); + Item *text_; + Music *mark_ev_; + public: TRANSLATOR_DECLARATIONS (Mark_engraver); + protected: - Item *text_; -protected: - void stop_translation_timestep (); - DECLARE_ACKNOWLEDGER (bar_line); - void create_items (Music *); virtual bool try_music (Music *ev); void process_music (); + void stop_translation_timestep (); -private: - Music *mark_ev_; + DECLARE_ACKNOWLEDGER (bar_line); }; Mark_engraver::Mark_engraver () diff --git a/lily/nested-system-start-delimiter-engraver.cc b/lily/nested-system-start-delimiter-engraver.cc deleted file mode 100644 index 4bed89dacd..0000000000 --- a/lily/nested-system-start-delimiter-engraver.cc +++ /dev/null @@ -1,247 +0,0 @@ -/* - new-system-start-delimiter-engraver.cc -- implement - Nested_system_start_delimiter_engraver - - source file of the GNU LilyPond music typesetter - - (c) 2005 Han-Wen Nienhuys - -*/ - -#include "side-position-interface.hh" -#include "system-start-delimiter.hh" -#include "engraver.hh" -#include "staff-symbol.hh" -#include "pointer-group-interface.hh" -#include "paper-column.hh" -#include "output-def.hh" -#include "spanner.hh" - - -struct Bracket_nesting_node -{ -public: - virtual ~Bracket_nesting_node(){} - virtual bool add_staff (Grob *) { return false; } - virtual void add_support (Grob *) { } - virtual void set_bound (Direction, Grob *){} - virtual void set_nesting_support (Grob*) {} - virtual void create_grobs (Engraver*, SCM) {} -}; - -struct Bracket_nesting_group : public Bracket_nesting_node -{ - Spanner *delimiter_; - Link_array children_; - SCM symbol_; - - void from_list (SCM ); - virtual void add_support (Grob *grob); - virtual bool add_staff (Grob *grob); - virtual void set_nesting_support (Grob*); - virtual void set_bound (Direction, Grob *grob); - virtual void create_grobs (Engraver*, SCM); - ~Bracket_nesting_group (); - Bracket_nesting_group (); -}; - - -struct Bracket_nesting_staff : public Bracket_nesting_node -{ - Grob *staff_; - - Bracket_nesting_staff (Grob *s) { staff_ = s; } - virtual bool add_staff (Grob *); -}; - - -Bracket_nesting_group::Bracket_nesting_group () -{ - symbol_ = SCM_EOL; - delimiter_ = 0; -} - -bool -Bracket_nesting_staff::add_staff (Grob *g) -{ - if (!staff_) - { - staff_ = g; - return true; - } - return false; -} - -void -Bracket_nesting_group::create_grobs (Engraver *engraver, SCM default_type) -{ - SCM type = scm_is_symbol (symbol_) ? symbol_ : default_type; - delimiter_ = make_spanner_from_properties (engraver, type, - SCM_EOL, ly_symbol2string (type).to_str0 ()); - - for (int i = 0 ; i < children_.size (); i++) - { - children_[i]->create_grobs (engraver, default_type); - } -} - -void -Bracket_nesting_group::add_support (Grob *g) -{ - Side_position_interface::add_support (g, delimiter_); - for (int i = 0 ; i < children_.size (); i++) - { - children_[i]->add_support (g); - } -} - -Bracket_nesting_group::~Bracket_nesting_group () -{ - for (int i = 0 ; i < children_.size (); i++) - delete children_[i]; -} - -void -Bracket_nesting_group::set_bound (Direction d, Grob *g) -{ - delimiter_->set_bound (d, g); - for (int i = 0 ; i < children_.size (); i++) - { - children_[i]->set_bound (d, g); - } -} - -void -Bracket_nesting_group::set_nesting_support (Grob *parent) -{ - if (parent) - Side_position_interface::add_support (delimiter_, parent); - - for (int i = 0 ; i < children_.size (); i++) - { - children_[i]->set_nesting_support (delimiter_); - } -} - - -void -Bracket_nesting_group::from_list (SCM x) -{ - for (SCM s = x; scm_is_pair (s); s = scm_cdr (s)) - { - SCM entry = scm_car (s); - if (scm_is_pair (entry)) - { - Bracket_nesting_group *node = new Bracket_nesting_group; - node->from_list (entry); - children_.push (node); - } - else - { - children_.push (new Bracket_nesting_staff (0)); - } - - if (scm_is_symbol (entry)) - symbol_ = entry; - } -} - -bool -Bracket_nesting_group::add_staff (Grob *grob) -{ - for (int i = 0; i < children_.size (); i++) - { - if (children_[i]->add_staff (grob)) - { - Pointer_group_interface::add_grob (delimiter_, ly_symbol2scm ("elements"), grob); - return true; - } - } - - return false; -} - - - - -/****************/ - -class Nested_system_start_delimiter_engraver : public Engraver -{ -public: - TRANSLATOR_DECLARATIONS (Nested_system_start_delimiter_engraver); - -protected: - Bracket_nesting_group *nesting_; - - DECLARE_ACKNOWLEDGER (system_start_delimiter); - DECLARE_ACKNOWLEDGER (staff_symbol); - - void process_music (); - virtual void finalize (); -}; - -Nested_system_start_delimiter_engraver::Nested_system_start_delimiter_engraver () -{ - nesting_ = 0; -} - - - -void -Nested_system_start_delimiter_engraver::process_music () -{ - if (!nesting_) - { - nesting_ = new Bracket_nesting_group (); - SCM hierarchy = get_property ("systemStartDelimiterHierarchy"); - SCM delimiter_name = get_property ("systemStartDelimiter"); - - nesting_->from_list (hierarchy); - nesting_->create_grobs (this, delimiter_name); - nesting_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn"))); - } -} - -void -Nested_system_start_delimiter_engraver::finalize () -{ - if (nesting_) - { - nesting_->set_bound (RIGHT, - unsmob_grob (get_property ("currentCommandColumn"))); - nesting_->set_nesting_support (0); - } -} - -void -Nested_system_start_delimiter_engraver::acknowledge_staff_symbol (Grob_info inf) -{ - Grob *staff = inf.grob(); - bool succ = nesting_->add_staff (staff); - - if (!succ) - { - nesting_->children_.push (new Bracket_nesting_staff (0)); - nesting_->add_staff (staff); - } -} - - -void -Nested_system_start_delimiter_engraver::acknowledge_system_start_delimiter (Grob_info inf) -{ - nesting_->add_support (inf.grob ()); -} - -#include "translator.icc" - -ADD_ACKNOWLEDGER (Nested_system_start_delimiter_engraver, staff_symbol); -ADD_ACKNOWLEDGER (Nested_system_start_delimiter_engraver, system_start_delimiter); - -ADD_TRANSLATOR (Nested_system_start_delimiter_engraver, - /* doc */ "Creates a system start delimiter (ie. SystemStart@{Bar, Brace, Bracket@} spanner", - /* create */ "SystemStartSquare SystemStartBrace SystemStartBracket SystemStartBar", - /* accept */ "", - /* read */ "systemStartDelimiter systemStartDelimiterHierarchy currentCommandColumn", - /* write */ ""); diff --git a/lily/system-start-delimiter-engraver.cc b/lily/system-start-delimiter-engraver.cc index 293006d9aa..a8414f932b 100644 --- a/lily/system-start-delimiter-engraver.cc +++ b/lily/system-start-delimiter-engraver.cc @@ -1,80 +1,250 @@ /* - system-start-delimiter-engraver.cc -- implement System_start_delimiter_engraver + System-start-delimiter-engraver.cc -- implement + System_start_delimiter_engraver source file of the GNU LilyPond music typesetter - (c) 2000--2005 Han-Wen Nienhuys + (c) 2005 Han-Wen Nienhuys + */ #include "engraver.hh" +#include "side-position-interface.hh" #include "system-start-delimiter.hh" #include "staff-symbol.hh" #include "pointer-group-interface.hh" #include "paper-column.hh" #include "output-def.hh" #include "spanner.hh" -#include "side-position-interface.hh" -class System_start_delimiter_engraver : public Engraver +struct Bracket_nesting_node { public: - TRANSLATOR_DECLARATIONS (System_start_delimiter_engraver); + virtual ~Bracket_nesting_node(){} + virtual bool add_staff (Grob *) { return false; } + virtual void add_support (Grob *) { } + virtual void set_bound (Direction, Grob *){} + virtual void set_nesting_support (Grob*) {} + virtual void create_grobs (Engraver*, SCM) {} +}; -protected: +struct Bracket_nesting_group : public Bracket_nesting_node +{ Spanner *delimiter_; - DECLARE_ACKNOWLEDGER (system_start_delimiter); - DECLARE_ACKNOWLEDGER (staff_symbol); + Link_array children_; + SCM symbol_; + + void from_list (SCM ); + virtual void add_support (Grob *grob); + virtual bool add_staff (Grob *grob); + virtual void set_nesting_support (Grob*); + virtual void set_bound (Direction, Grob *grob); + virtual void create_grobs (Engraver*, SCM); + ~Bracket_nesting_group (); + Bracket_nesting_group (); +}; - void process_music (); - virtual void finalize (); + +struct Bracket_nesting_staff : public Bracket_nesting_node +{ + Grob *staff_; + + Bracket_nesting_staff (Grob *s) { staff_ = s; } + virtual bool add_staff (Grob *); }; + +Bracket_nesting_group::Bracket_nesting_group () +{ + symbol_ = SCM_EOL; + delimiter_ = 0; +} + +bool +Bracket_nesting_staff::add_staff (Grob *g) +{ + if (!staff_) + { + staff_ = g; + return true; + } + return false; +} + void -System_start_delimiter_engraver::acknowledge_staff_symbol (Grob_info inf) +Bracket_nesting_group::create_grobs (Engraver *engraver, SCM default_type) { - Pointer_group_interface::add_grob (delimiter_, ly_symbol2scm ("elements"), inf.grob ()); + SCM type = scm_is_symbol (symbol_) ? symbol_ : default_type; + delimiter_ = make_spanner_from_properties (engraver, type, + SCM_EOL, ly_symbol2string (type).to_str0 ()); + + for (int i = 0 ; i < children_.size (); i++) + { + children_[i]->create_grobs (engraver, default_type); + } } +void +Bracket_nesting_group::add_support (Grob *g) +{ + Side_position_interface::add_support (g, delimiter_); + for (int i = 0 ; i < children_.size (); i++) + { + children_[i]->add_support (g); + } +} + +Bracket_nesting_group::~Bracket_nesting_group () +{ + for (int i = 0 ; i < children_.size (); i++) + delete children_[i]; +} void -System_start_delimiter_engraver::acknowledge_system_start_delimiter (Grob_info inf) +Bracket_nesting_group::set_bound (Direction d, Grob *g) +{ + delimiter_->set_bound (d, g); + for (int i = 0 ; i < children_.size (); i++) + { + children_[i]->set_bound (d, g); + } +} + +void +Bracket_nesting_group::set_nesting_support (Grob *parent) { - Side_position_interface::add_support (inf.grob (), delimiter_); + if (parent) + Side_position_interface::add_support (delimiter_, parent); + + for (int i = 0 ; i < children_.size (); i++) + { + children_[i]->set_nesting_support (delimiter_); + } } + +void +Bracket_nesting_group::from_list (SCM x) +{ + for (SCM s = x; scm_is_pair (s); s = scm_cdr (s)) + { + SCM entry = scm_car (s); + if (scm_is_pair (entry)) + { + Bracket_nesting_group *node = new Bracket_nesting_group; + node->from_list (entry); + children_.push (node); + } + else if (entry == ly_symbol2scm ("SystemStartBrace") + || entry == ly_symbol2scm ("SystemStartBracket") + || entry == ly_symbol2scm ("SystemStartBar") + || entry == ly_symbol2scm ("SystemStartSquare") + ) + symbol_ = entry; + else + { + children_.push (new Bracket_nesting_staff (0)); + } + } +} + +bool +Bracket_nesting_group::add_staff (Grob *grob) +{ + for (int i = 0; i < children_.size (); i++) + { + if (children_[i]->add_staff (grob)) + { + Pointer_group_interface::add_grob (delimiter_, ly_symbol2scm ("elements"), grob); + return true; + } + } + + return false; +} + + + + +/****************/ + +class System_start_delimiter_engraver : public Engraver +{ +public: + TRANSLATOR_DECLARATIONS (System_start_delimiter_engraver); + +protected: + Bracket_nesting_group *nesting_; + + DECLARE_ACKNOWLEDGER (system_start_delimiter); + DECLARE_ACKNOWLEDGER (staff_symbol); + + void process_music (); + virtual void finalize (); +}; + System_start_delimiter_engraver::System_start_delimiter_engraver () { - delimiter_ = 0; + nesting_ = 0; } + + void System_start_delimiter_engraver::process_music () { - if (!delimiter_) + if (!nesting_) { + nesting_ = new Bracket_nesting_group (); + SCM hierarchy = get_property ("systemStartDelimiterHierarchy"); SCM delimiter_name = get_property ("systemStartDelimiter"); - delimiter_ = make_spanner_from_properties (this, delimiter_name, SCM_EOL, - ly_symbol2string (delimiter_name).to_str0 ()); - delimiter_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn"))); + nesting_->from_list (hierarchy); + nesting_->create_grobs (this, delimiter_name); + nesting_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn"))); } } + void System_start_delimiter_engraver::finalize () { - if (delimiter_) - delimiter_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn"))); + if (nesting_) + { + nesting_->set_bound (RIGHT, + unsmob_grob (get_property ("currentCommandColumn"))); + nesting_->set_nesting_support (0); + } +} + +void +System_start_delimiter_engraver::acknowledge_staff_symbol (Grob_info inf) +{ + Grob *staff = inf.grob(); + bool succ = nesting_->add_staff (staff); + + if (!succ) + { + nesting_->children_.push (new Bracket_nesting_staff (0)); + nesting_->add_staff (staff); + } +} + + +void +System_start_delimiter_engraver::acknowledge_system_start_delimiter (Grob_info inf) +{ + nesting_->add_support (inf.grob ()); } #include "translator.icc" -ADD_ACKNOWLEDGER (System_start_delimiter_engraver, system_start_delimiter); ADD_ACKNOWLEDGER (System_start_delimiter_engraver, staff_symbol); +ADD_ACKNOWLEDGER (System_start_delimiter_engraver, system_start_delimiter); ADD_TRANSLATOR (System_start_delimiter_engraver, /* doc */ "Creates a system start delimiter (ie. SystemStart@{Bar, Brace, Bracket@} spanner", - /* create */ "SystemStartBar SystemStartBrace SystemStartBracket", + /* create */ "SystemStartSquare SystemStartBrace SystemStartBracket SystemStartBar", /* accept */ "", - /* read */ "systemStartDelimiter", + /* read */ "systemStartDelimiter systemStartDelimiterHierarchy currentCommandColumn", /* write */ ""); diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly index efb04f5be9..90bfa08c87 100644 --- a/ly/engraver-init.ly +++ b/ly/engraver-init.ly @@ -87,7 +87,7 @@ \context { \type "Engraver_group" \name InnerChoirStaff - \consists "Nested_system_start_delimiter_engraver" + \consists "System_start_delimiter_engraver" systemStartDelimiter = #'SystemStartBracket \accepts "Staff" @@ -264,7 +264,7 @@ contained staves are not connected vertically." \consists "Span_bar_engraver" \consists "Span_arpeggio_engraver" - \consists "Nested_system_start_delimiter_engraver" + \consists "System_start_delimiter_engraver" systemStartDelimiter = #'SystemStartBrace \accepts "Staff" @@ -298,7 +298,7 @@ contained staves are not connected vertically." \consists "Output_property_engraver" systemStartDelimiter = #'SystemStartBracket - \consists "Nested_system_start_delimiter_engraver" + \consists "System_start_delimiter_engraver" \defaultchild "Staff" \accepts "Staff" @@ -436,7 +436,7 @@ AncientRemoveEmptyStaffContext = \context { \consists "Timing_translator" \consists "Default_bar_line_engraver" \consists "Output_property_engraver" - \consists "Nested_system_start_delimiter_engraver" + \consists "System_start_delimiter_engraver" \consists "Mark_engraver" \consists "Metronome_mark_engraver" \consists "Break_align_engraver" diff --git a/scm/define-context-properties.scm b/scm/define-context-properties.scm index 67f825cc63..a206a625a7 100644 --- a/scm/define-context-properties.scm +++ b/scm/define-context-properties.scm @@ -379,8 +379,6 @@ at beat positions by only drawing one beam over the beat.") (systemStartDelimiterHierarchy ,pair? "A nested list, indicating the nesting of a start delimiters.") - (systemStartDelimiters ,list? "Grobs for nested system starts -Overrides @code{systemStartDelimiter}.") (systemStartDelimiter ,symbol? "Which grob to make for the start of the system/staff? Set to @code{SystemStartBrace}, @code{SystemStartBracket} or @code{SystemStartBar}.") -- 2.39.2