2 item.cc -- implement Item
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
14 #include "lily-guile.hh"
18 unbroken_original_l_ =0;
19 break_priority_i_ = 0;
21 break_status_dir_ = CENTER;
22 broken_to_drul_[LEFT] = broken_to_drul_[RIGHT]=0;
26 Item::breakable_b () const
28 return !unbroken_original_l_
29 && dynamic_cast<Item*> (parent_l (X_AXIS))->breakable_b ();
33 Item::do_print() const
36 DOUT << "breakable_b_: " << breakable_b_ <<
37 " break_status_dir_: " << break_status_dir_;
45 return absolute_coordinate (X_AXIS);
51 Graphical_element *g = parent_l (X_AXIS);
54 return dynamic_cast<Score_element *> (g)-> line_l ();
58 Item::break_status_dir() const
60 return break_status_dir_;
64 Item::copy_breakable_items()
66 if (broken_to_drul_[LEFT] || broken_to_drul_[RIGHT]
70 Drul_array<Item *> new_copies;
74 Score_element * dolly = clone();
75 Item * item_p = dynamic_cast<Item*>(dolly);
76 item_p->unbroken_original_l_ = this;
77 item_p->break_status_dir_ = i;
78 pscore_l_->typeset_element (item_p);
79 new_copies[i] =item_p;
81 while (flip(&i) != LEFT);
82 broken_to_drul_= new_copies;
86 broken_to_drul_[i]->handle_prebroken_dependencies();
87 broken_to_drul_[i]->try_visibility_lambda();
89 while (flip(&i) != LEFT);
90 try_visibility_lambda ();
94 Item::try_visibility_lambda ()
96 SCM vis = get_elt_property (ly_symbol ("visibility_lambda"));
97 if (vis != SCM_BOOL_F)
99 SCM args = scm_listify (gh_int2scm (break_status_dir_), SCM_UNDEFINED);
100 SCM result = gh_apply ( SCM_CDR(vis), args);
101 int trans = gh_scm2bool (gh_car (result));
102 int empty = gh_scm2bool (gh_cdr (result));
107 transparent_b_ = true;
114 copy_breakable_items();
115 handle_prebroken_dependencies();
118 Otherwise the broken items won't be pre_process()'ed.
120 add_dependency (broken_to_drul_[LEFT]);
121 add_dependency (broken_to_drul_[RIGHT]);
125 Item::do_breakable_col_processing()
132 Item::find_prebroken_piece (Line_of_score*l) const
135 return (Item*)(this);
136 else if (broken_to_drul_[LEFT] && broken_to_drul_[LEFT]->line_l() == l)
137 return broken_to_drul_[LEFT];
138 else if (broken_to_drul_[RIGHT] && broken_to_drul_[RIGHT]->line_l() == l)
139 return broken_to_drul_[RIGHT];
145 Item::find_prebroken_piece (Direction d) const
148 return (Item *) (this); // ugh
150 return dynamic_cast<Item*> (broken_to_drul_[d]);
154 Item::handle_prebroken_dependencies()
157 Score_element::handle_prebroken_dependencies();
161 Item::left_right_compare(Item const *l, Item const *r)
163 Paper_column *p1 = l->column_l ();
164 Paper_column* p2 = r->column_l ();
165 return p1->rank_i () - p2->rank_i ();
170 Item::linked_b() const
172 return Score_element::linked_b() || attached_span_l_arr_.size();
178 Item::column_l () const
180 return dynamic_cast<Item*> (parent_l (X_AXIS))->column_l ();
183 Item::Item (Item const &s)
186 unbroken_original_l_ = 0;
187 /* do not copy attached_span_l_arr_ */
188 breakable_b_ = s.breakable_b_;
189 broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] =0;
190 break_status_dir_ = s.break_status_dir_;
191 break_priority_i_ = s.break_priority_i_;
196 Item::handle_prebroken_dependents ()
198 Item * parent = dynamic_cast<Item*> (parent_l( X_AXIS));
199 if (breakable_b () && parent)
201 if(!(broken_to_drul_[LEFT] || broken_to_drul_[RIGHT]))
207 broken_to_drul_[d]->dim_cache_[X_AXIS].parent_l_ =
208 &parent->broken_to_drul_[d]->dim_cache_[X_AXIS];
209 parent->broken_to_drul_[d]->add_dependency (broken_to_drul_[d]);
211 while ((flip (&d))!=LEFT);