X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fbar-number-engraver.cc;h=4fe7d7172f13a6684cf52acfc673978cd75b733c;hb=6798fd9b3d52cbed28b24dbac067bff9af406230;hp=c334d087ee791a9cafd8d7811d4b0d2e9b016ed7;hpb=fbb6d20e9f58d691ffe845284cbb4d8bacf9ca60;p=lilypond.git diff --git a/lily/bar-number-engraver.cc b/lily/bar-number-engraver.cc index c334d087ee..4fe7d7172f 100644 --- a/lily/bar-number-engraver.cc +++ b/lily/bar-number-engraver.cc @@ -7,39 +7,134 @@ */ -#include "bar-number-engraver.hh" -#include "timing-translator.hh" -#include "timing-engraver.hh" -#include "engraver-group-engraver.hh" -#include "text-item.hh" +#include "lily-guile.hh" +#include "paper-column.hh" +#include "paper-def.hh" +#include "side-position-interface.hh" +#include "staff-symbol.hh" +#include "item.hh" +#include "moment.hh" +#include "engraver.hh" +#include "translator-group.hh" -Bar_number_engraver::Bar_number_engraver() -{ - axis_ = Y_AXIS; - type_ = "barNumber"; -} +class Bar_number_engraver : public Engraver +{ +protected: + Item* text_p_; +protected: + virtual void do_pre_move_processing (); + virtual void acknowledge_element (Score_element_info); + virtual void do_creation_processing (); + void create_items(); + void do_process_music (); +public: + VIRTUAL_COPY_CONS(Translator); + Bar_number_engraver(); +}; void Bar_number_engraver::do_process_music () { - Translator *tr = daddy_grav_l ()->get_simple_translator ("Timing_engraver"); - Timing_translator *time = dynamic_cast(tr); - // todo include (&&!time->cadenza_b_ ) SCM bn = get_property("currentBarNumber"); - + SCM smp = get_property ("measurePosition"); + Moment mp = (unsmob_moment (smp)) ? *unsmob_moment (smp) : Moment (0); + if (gh_number_p (bn) && - !time->measure_position () && now_mom () > Moment (0)) + !mp && now_mom () > Moment (0)) { - create_items (0); + create_items (); // guh. text_p_->set_elt_property ("text", ly_str02scm (to_str (gh_scm2int (bn)).ch_C())); - } } ADD_THIS_TRANSLATOR(Bar_number_engraver); + +Bar_number_engraver::Bar_number_engraver () +{ + text_p_ =0; +} + +void +Bar_number_engraver::do_creation_processing () +{ + /* + ugh: need to share code with mark_engraver + */ + daddy_trans_l_->set_property ("staffsFound", SCM_EOL); +} + + + +void +Bar_number_engraver::acknowledge_element (Score_element_info inf) +{ + Score_element * s = inf.elem_l_; + if (Staff_symbol::has_interface (s)) + { + SCM sts = get_property ("staffsFound"); + SCM thisstaff = inf.elem_l_->self_scm (); + if (scm_memq (thisstaff, sts) == SCM_BOOL_F) + daddy_trans_l_->set_property ("staffsFound", gh_cons (thisstaff, sts)); + } + else if (text_p_ + && dynamic_cast (s) + && s->get_elt_property ("break-align-symbol") == ly_symbol2scm ("Left_edge_item")) + { + /* + By default this would land on the Paper_column -- so why + doesn't it work when you leave this out? */ + text_p_->set_parent (s, X_AXIS); + } +} + +void +Bar_number_engraver::do_pre_move_processing () +{ + if (text_p_) + { + text_p_->set_elt_property ("side-support-elements", get_property ("staffsFound")); + typeset_element (text_p_); + text_p_ =0; + } +} + + +void +Bar_number_engraver::create_items () +{ + if (text_p_) + return; + + SCM b = get_property ("basicBarNumberProperties"); + text_p_ = new Item (b); + Side_position::set_axis(text_p_,Y_AXIS); + + SCM prop = get_property ("barNumberDirection"); + if (!isdir_b (prop)) + { + prop = gh_int2scm (UP); + } + text_p_->set_elt_property ("direction", prop); + + SCM padding = get_property ("barNumberScriptPadding"); + if (gh_number_p(padding)) + { + text_p_->set_elt_property ("padding", padding); + } + else + { + text_p_ + ->set_elt_property ("padding", + gh_double2scm(paper_l ()->get_var ("interline"))); + } + + + announce_element (text_p_, 0); +} +