X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fsystem-start-delimiter-engraver.cc;h=ed7e34a029034212649ffd60f912c909dca4e372;hb=5b4b0d6e9a197e8f9eb085b7c2ad78b8be3e5cfc;hp=1842ffa6f9d7efa65a9f1c1458e18f23c5fa5f2d;hpb=108cf0e8c08c8e15e2a800feb161cfad9057daa8;p=lilypond.git diff --git a/lily/system-start-delimiter-engraver.cc b/lily/system-start-delimiter-engraver.cc index 1842ffa6f9..ed7e34a029 100644 --- a/lily/system-start-delimiter-engraver.cc +++ b/lily/system-start-delimiter-engraver.cc @@ -1,93 +1,272 @@ /* - 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--2008 Han-Wen Nienhuys + */ -#include "system-start-delimiter.hh" #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" +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_; + vector 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_ = engraver->make_spanner (ly_symbol2string (type).c_str (), SCM_EOL); + + for (vsize 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 (vsize i = 0 ; i < children_.size (); i++) + { + children_[i]->add_support (g); + } +} + +Bracket_nesting_group::~Bracket_nesting_group () +{ + junk_pointers (children_); +} + +void +Bracket_nesting_group::set_bound (Direction d, Grob *g) +{ + delimiter_->set_bound (d, g); + for (vsize 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 (vsize 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_back (node); + } + else if (entry == ly_symbol2scm ("SystemStartBrace") + || entry == ly_symbol2scm ("SystemStartBracket") + || entry == ly_symbol2scm ("SystemStartBar") + || entry == ly_symbol2scm ("SystemStartSquare") + ) + symbol_ = entry; + else + { + children_.push_back (new Bracket_nesting_staff (0)); + } + } +} + +bool +Bracket_nesting_group::add_staff (Grob *grob) +{ + for (vsize 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: - Spanner *delim_; + Bracket_nesting_group *nesting_; + DECLARE_ACKNOWLEDGER (system_start_delimiter); + DECLARE_ACKNOWLEDGER (system_start_text); DECLARE_ACKNOWLEDGER (staff_symbol); void process_music (); virtual void finalize (); }; -void -System_start_delimiter_engraver::acknowledge_staff_symbol (Grob_info inf) +System_start_delimiter_engraver::System_start_delimiter_engraver () { - /* - don't add as Axis_group_interface::add_element (delim_, ), - because that would set the parent as well */ - - Pointer_group_interface::add_grob (delim_, ly_symbol2scm ("elements"), inf.grob ()); + nesting_ = 0; } + void -System_start_delimiter_engraver::acknowledge_system_start_delimiter (Grob_info inf) +System_start_delimiter_engraver::process_music () { - SCM gl = inf.grob ()->get_property ("glyph"); - SCM my_gl = delim_->get_property ("glyph"); - - /* - UGH UGH - */ - if (scm_is_string (gl) && ly_is_equal (gl, scm_makfrom0str ("brace")) - && scm_is_string (my_gl) && ly_is_equal (my_gl, scm_makfrom0str ("bracket"))) - inf.grob ()->translate_axis (-0.8, X_AXIS); // ugh - else if (scm_is_string (gl) && ly_is_equal (gl, scm_makfrom0str ("bracket")) - && scm_is_string (my_gl) && ly_is_equal (my_gl, scm_makfrom0str ("bracket"))) + if (!nesting_) { - inf.grob ()->translate_axis (-0.8, X_AXIS); // ugh + 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"))); } } -System_start_delimiter_engraver::System_start_delimiter_engraver () +void +System_start_delimiter_engraver::finalize () { - delim_ = 0; + if (nesting_) + { + nesting_->set_bound (RIGHT, + unsmob_grob (get_property ("currentCommandColumn"))); + nesting_->set_nesting_support (0); + + delete nesting_; + } } void -System_start_delimiter_engraver::process_music () +System_start_delimiter_engraver::acknowledge_staff_symbol (Grob_info inf) { - if (!delim_) - { - SCM delim_name = get_property ("systemStartDelimiter"); - delim_ = make_spanner_from_properties (this, delim_name, SCM_EOL, - ly_symbol2string (delim_name).to_str0 ()); + Grob *staff = inf.grob (); + bool succ = nesting_->add_staff (staff); - delim_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn"))); + if (!succ) + { + nesting_->children_.push_back (new Bracket_nesting_staff (0)); + nesting_->add_staff (staff); } } + + + void -System_start_delimiter_engraver::finalize () +System_start_delimiter_engraver::acknowledge_system_start_text (Grob_info inf) +{ + nesting_->add_support (inf.grob ()); +} + +void +System_start_delimiter_engraver::acknowledge_system_start_delimiter (Grob_info inf) { - if (delim_) - delim_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn"))); + 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_ACKNOWLEDGER (System_start_delimiter_engraver, system_start_text); ADD_TRANSLATOR (System_start_delimiter_engraver, - /* doc */ "Creates a system start delimiter (ie. SystemStart@{Bar, Brace, Bracket@} spanner", - /* create */ "SystemStartBar SystemStartBrace SystemStartBracket", - /* accept */ "", - /* read */ "systemStartDelimiter", - /* write */ ""); + /* doc */ + "Create a system start delimiter (i.e., a" + " @code{SystemStartBar}, @code{SystemStartBrace}," + " @code{SystemStartBracket} or @code{SystemStartSquare}" + " spanner).", + + /* create */ + "SystemStartSquare " + "SystemStartBrace " + "SystemStartBracket " + "SystemStartBar ", + + /* read */ + "systemStartDelimiter " + "systemStartDelimiterHierarchy " + "currentCommandColumn ", + + /* write */ + "" + );