X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fsystem-start-delimiter-engraver.cc;h=5c28a612311887ea1355022b694f7a77e85eedde;hb=db2d03691f2b1114b1b822c3ed0aa6f803045815;hp=9734f522cbda7ad9af4d33e411a7ab94dda97254;hpb=811be522d0b79493159f47789e5621dc85493495;p=lilypond.git diff --git a/lily/system-start-delimiter-engraver.cc b/lily/system-start-delimiter-engraver.cc index 9734f522cb..5c28a61231 100644 --- a/lily/system-start-delimiter-engraver.cc +++ b/lily/system-start-delimiter-engraver.cc @@ -1,95 +1,262 @@ /* - 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--2006 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_; - 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) +{ + 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 () +{ + for (vsize 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 (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) { - 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"))) + for (SCM s = x; scm_is_pair (s); s = scm_cdr (s)) { - inf.grob ()->translate_axis (-0.8, X_AXIS); // ugh + 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_) { - delim_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn"))); + 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_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, 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 */ "");