X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fsystem-start-delimiter-engraver.cc;h=ee4bf6ef114a5265cbb595e91361c6c09647988b;hb=88e7690f21930c2a1fbbaa1d7a0b2fe85fdfa2be;hp=ac341eaa1200c4a2e8fc134b3951b7ece1d7651e;hpb=2cb28056f4c767e3d0d00e73e53607af00ba38e8;p=lilypond.git diff --git a/lily/system-start-delimiter-engraver.cc b/lily/system-start-delimiter-engraver.cc index ac341eaa12..ee4bf6ef11 100644 --- a/lily/system-start-delimiter-engraver.cc +++ b/lily/system-start-delimiter-engraver.cc @@ -1,92 +1,263 @@ /* - 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--2007 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"))) - add_offset_callback (inf.grob (), scm_from_double (-0.8), X_AXIS); - 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"))) - add_offset_callback (inf.grob (), scm_from_double (-0.8), X_AXIS); + 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"))); + } } -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", + /* create */ "SystemStartSquare " + "SystemStartBrace " + "SystemStartBracket " + "SystemStartBar", + /* read */ + "systemStartDelimiter " + "systemStartDelimiterHierarchy " + "currentCommandColumn", + /* write */ "");