]> git.donarmstrong.com Git - lilypond.git/blob - lily/staff-margin-engraver.cc
fd68c6fb4bbfff5311a6c4536de46db012065620
[lilypond.git] / lily / staff-margin-engraver.cc
1 /*
2   staff-margin-engraver.cc -- implement Staff_margin_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1998--2000 Jan Nieuwenhuizen <janneke@gnu.org>
7 */
8
9 #include "translator.hh"
10 #include "engraver.hh"
11 #include "bar.hh"
12 #include "dimension-cache.hh"
13 #include "timing-translator.hh"
14 #include "text-item.hh"
15 #include "side-position-interface.hh"
16 #include "bar-script-engraver.hh"
17 #include "staff-symbol-referencer.hh"
18 #include "staff-symbol.hh"
19
20 /*
21   TODO:
22
23     * padding
24     * merge with/derive from/add functionality to Bar_script_engraver
25  */
26
27 /**
28    Hang on left edge of staff to provide suppor for simple items.
29  */
30 class Left_edge_item : public Item
31 {
32 public:
33   VIRTUAL_COPY_CONS (Score_element);
34 };
35
36 /**
37   put (instrument) text to left of line
38  */
39 class Staff_margin_engraver : public Engraver
40 {
41 public:
42   VIRTUAL_COPY_CONS (Translator);
43   Staff_margin_engraver ();
44
45 protected:
46   virtual void do_pre_move_processing ();
47   virtual void acknowledge_element (Score_element_info);
48
49 private:
50   String type_;
51   Text_item* text_p_;
52   Left_edge_item* left_edge_p_;
53   void create_text (SCM);
54 };
55
56 ADD_THIS_TRANSLATOR (Staff_margin_engraver);
57
58
59 Staff_margin_engraver::Staff_margin_engraver ()
60 {
61   type_ = "margin";
62   text_p_ = 0;
63   left_edge_p_ = 0;
64 }
65
66 void
67 Staff_margin_engraver::acknowledge_element (Score_element_info info)
68 {
69   SCM s = get_property ("instrument");
70   
71   if (now_mom () > Moment (0))
72     s = get_property ("instr");
73
74   //s = ly_str02scm ("HALLO");
75   
76   if (dynamic_cast<Bar*> (info.elem_l_) && gh_string_p (s))
77     create_text (s);
78 }
79
80 void
81 Staff_margin_engraver::create_text (SCM text)
82 {
83   if (!text_p_)
84     {
85       assert (!left_edge_p_);
86       Left_edge_item* l = new Left_edge_item;
87       
88       l->set_elt_property ("breakable", SCM_BOOL_T);
89       l->set_elt_property ("break-aligned", SCM_BOOL_T);
90
91       announce_element (Score_element_info (l, 0));
92
93       Staff_symbol_referencer_interface sl (l);
94       sl.set_interface ();
95       left_edge_p_ = l;
96       
97       Text_item* t = new Text_item;
98
99       t->set_elt_property ("self-alignment-Y", gh_int2scm (0));
100       t->dim_cache_[Y_AXIS]->off_callbacks_.push
101         (Side_position_interface::aligned_on_self);
102
103       t->set_parent (l, X_AXIS);
104       t->set_parent (l, Y_AXIS);
105
106       // 'just to be sure': see Clef_item::do_add_processing
107       l->add_dependency (t);
108
109       announce_element (Score_element_info (t, 0));
110
111       /*
112         Hmm.
113         In almost every score that uses "instrument" and "instr"
114         we need two different paddings.
115         Let's try one of those first:
116            instrumentScriptPadding/instrScriptPadding
117        */
118       SCM s = get_property (String (now_mom () ? "instr" : "instrument")
119                             + "ScriptPadding");
120       if (!gh_number_p (s))
121         s = get_property (type_ + "ScriptPadding");
122       if (gh_number_p (s))
123         {
124           //t->set_elt_property ("padding", s);
125           t->translate_axis (-gh_scm2double (s), X_AXIS);
126         }
127       text_p_ = t;
128     }
129   //text_p_->set_elt_property ("style", s);
130   //text_p_->set_elt_property ("direction", gh_int2scm (RIGHT));
131   text_p_->set_elt_property ("text", text);
132 }
133
134 void
135 Staff_margin_engraver::do_pre_move_processing ()
136 {
137   if (text_p_)
138     {
139       /*
140         Let's not allow user settings for visibility function (yet).
141         Although end-of-line would work, to some extent, we should
142         make a properly ordered Right_edge_item, if that need arises.
143        */
144       text_p_->set_elt_property("visibility-lambda",
145                               ly_eval_str ("begin-of-line-visible"));
146       typeset_element (text_p_);
147       text_p_ = 0;
148       assert (left_edge_p_);
149       typeset_element (left_edge_p_);
150       left_edge_p_ = 0;
151     }
152 }