X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fsystem-start-delimiter-engraver.cc;h=ee4bf6ef114a5265cbb595e91361c6c09647988b;hb=85902ccc9c481c2f992676ecff060e05caffef8f;hp=102f48b68e78106a1b5565d2c414d0019237f98d;hpb=f2c2c5c43858f323e4708f83fd97e0f38017c275;p=lilypond.git diff --git a/lily/system-start-delimiter-engraver.cc b/lily/system-start-delimiter-engraver.cc index 102f48b68e..ee4bf6ef11 100644 --- a/lily/system-start-delimiter-engraver.cc +++ b/lily/system-start-delimiter-engraver.cc @@ -1,95 +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" -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: - Spanner *delim_; - DECLARE_ACKNOWLEDGER(system_start_delimiter); - DECLARE_ACKNOWLEDGER(staff_symbol); +struct Bracket_nesting_group : public Bracket_nesting_node +{ + Spanner *delimiter_; + vector children_; + SCM symbol_; - PRECOMPUTED_VIRTUAL void process_music (); - virtual void finalize (); + 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 -System_start_delimiter_engraver::acknowledge_staff_symbol (Grob_info inf) +Bracket_nesting_group::create_grobs (Engraver *engraver, SCM default_type) { - /* - don't add as Axis_group_interface::add_element (delim_, ), - because that would set the parent as well */ + SCM type = scm_is_symbol (symbol_) ? symbol_ : default_type; + delimiter_ = engraver->make_spanner (ly_symbol2string (type).c_str (), SCM_EOL); - Pointer_group_interface::add_grob (delim_, ly_symbol2scm ("elements"), inf.grob ()); + for (vsize i = 0 ; i < children_.size (); i++) + { + children_[i]->create_grobs (engraver, default_type); + } } + void -System_start_delimiter_engraver::acknowledge_system_start_delimiter (Grob_info inf) +Bracket_nesting_group::add_support (Grob *g) { - 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"))) + Side_position_interface::add_support (g, delimiter_); + for (vsize i = 0 ; i < children_.size (); i++) { - inf.grob ()->translate_axis (-0.8, X_AXIS); // ugh + 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: + Bracket_nesting_group *nesting_; + + DECLARE_ACKNOWLEDGER (system_start_delimiter); + DECLARE_ACKNOWLEDGER (system_start_text); + DECLARE_ACKNOWLEDGER (staff_symbol); + + void process_music (); + virtual void finalize (); +}; + System_start_delimiter_engraver::System_start_delimiter_engraver () { - delim_ = 0; + nesting_ = 0; } void System_start_delimiter_engraver::process_music () { - if (!delim_) + if (!nesting_) { - SCM delim_name = get_property ("systemStartDelimiter"); - delim_ = make_spanner_from_properties (this, delim_name, SCM_EOL, - ly_symbol2string (delim_name).to_str0 ()); + nesting_ = new Bracket_nesting_group (); + SCM hierarchy = get_property ("systemStartDelimiterHierarchy"); + SCM delimiter_name = get_property ("systemStartDelimiter"); - delim_->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 (delim_) + if (nesting_) + { + nesting_->set_bound (RIGHT, + unsmob_grob (get_property ("currentCommandColumn"))); + nesting_->set_nesting_support (0); + + delete nesting_; + } +} + +void +System_start_delimiter_engraver::acknowledge_staff_symbol (Grob_info inf) +{ + Grob *staff = inf.grob (); + bool succ = nesting_->add_staff (staff); + + if (!succ) { - delim_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn"))); + nesting_->children_.push_back (new Bracket_nesting_staff (0)); + nesting_->add_staff (staff); } } + + +void +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) +{ + 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, 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, - /* descr */ "Creates a system start delimiter (ie. SystemStart@{Bar, Brace, Bracket@} spanner", - /* creats*/ "SystemStartBar SystemStartBrace SystemStartBracket", - /* accepts */ "", - /* reads */ "systemStartDelimiter", + /* doc */ "Creates a system start delimiter (ie. SystemStart@{Bar, Brace, Bracket@} spanner", + /* create */ "SystemStartSquare " + "SystemStartBrace " + "SystemStartBracket " + "SystemStartBar", + /* read */ + "systemStartDelimiter " + "systemStartDelimiterHierarchy " + "currentCommandColumn", + /* write */ "");