2 horizontal-align-item.cc -- implement Horizontal_align_item
4 source file of the GNU LilyPond music typesetter
6 (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
9 #include "horizontal-align-item.hh"
12 IMPLEMENT_IS_TYPE_B1(Horizontal_align_item,Item);
15 Horizontal_align_item::contains_b (Item *i) const
17 return item_l_arr_.find_l (i);
21 Horizontal_align_item::add (Item *i,int p)
23 assert (! contains_b (i));
24 priority_i_arr_.push (p);
30 Horizontal_align_item::do_substitute_dependency (Score_elem*o,Score_elem*n)
33 while ((i = item_l_arr_.find_i (o->item())) >=0)
36 item_l_arr_[i] = n->item();
42 struct Horizontal_align_item_content {
45 static int compare (Horizontal_align_item_content const &h1,
46 Horizontal_align_item_content const &h2)
48 return h1.priority_i_ - h2.priority_i_;
50 Horizontal_align_item_content (Item*i, int p)
55 Horizontal_align_item_content(){item_l_ =0; priority_i_ =0; }
60 Horizontal_align_item::do_pre_processing()
63 Array<Horizontal_align_item_content> content;
64 for (int i =0; i < item_l_arr_.size(); i++)
66 Horizontal_align_item_content (
67 item_l_arr_[i], priority_i_arr_[i]));
68 content.sort (Horizontal_align_item_content::compare);
70 priority_i_arr_.clear();
71 for (int i =0; i < content.size(); i++)
73 item_l_arr_.push (content[i].item_l_);
74 priority_i_arr_.push (content[i].priority_i_);
80 for (int i =0; i < item_l_arr_.size(); i++)
83 Interval item_width= item_l_arr_[i]->width();
84 if (item_width.empty_b())
86 item_width = Interval (0,0);
88 dims.push (item_width);
89 total += item_width.length();
92 Real where_f= total * (align_i_-1.0)/2.0;
94 for (int i=0 ; i < item_l_arr_.size(); i++)
96 Real dx = where_f -dims[i][-1];
97 item_l_arr_[i]->translate (dx , X_AXIS);
98 if (item_l_arr_[i] == center_l_)
99 center_dx_f = where_f;
100 where_f += dims[i].length();
102 if (center_dx_f && !align_i_)
103 for (int i=0 ; i < item_l_arr_.size(); i++)
104 item_l_arr_[i]->translate (- center_dx_f , X_AXIS);
109 Horizontal_align_item::do_width() const
111 return Interval (0,0);
115 Horizontal_align_item::do_print() const
119 DOUT << "contains: ";
120 for (int i=0 ; i < item_l_arr_.size(); i++)
121 DOUT << item_l_arr_[i]->name () << ", ";
125 Horizontal_align_item::Horizontal_align_item()
130 transparent_b_ = true;