1 // puList.cxx - implementation of a scrolling list box.
7 * Static function: handle slider movements.
10 handle_slider (puObject * slider)
12 puListBox * box = (puListBox *)slider->getUserData();
13 int total = box->getNumItems();
14 int visible = box->getNumVisible();
15 // negative numbers are OK -- setTopItem() clamps anyway
16 int index = int((total - visible) * (1.0 - slider->getFloatValue()));
17 box->setTopItem(index);
22 * Static function: handle list entry clicks.
25 handle_list_entry (puObject * listbox)
27 puListBox * box = (puListBox *)listbox->getUserData();
28 box->invokeCallback();
33 * Static function: handle arrow clicks.
36 handle_arrow (puObject * arrow)
38 puSlider * slider = (puSlider *)arrow->getUserData();
39 puListBox * list_box = (puListBox *)slider->getUserData();
40 puList * list = (puList *)list_box->getUserData();
43 switch (((puArrowButton *)arrow)->getArrowType()) {
55 int index = list->getTopItem();
56 list->setTopItem(index + step);
57 slider->setValue(1.0f - float(list->getTopItem()) / (list->getNumItems() - list->getNumVisible()));
60 puList::puList (int x, int y, int w, int h, int sl_width)
68 puList::puList (int x, int y, int w, int h, char ** contents, int sl_width)
82 puList::newList (char ** contents)
84 _list_box->newList(contents);
87 // new size calculation to consider slider visibility
88 setSize(_width, _height);
92 puList::setTopItem( int top )
94 int visible = _list_box->getNumVisible();
95 int num = _list_box->getNumItems();
96 if ( top < 0 || num <= visible )
98 else if ( num > 0 && top > num-visible )
101 _list_box->setTopItem(top);
102 top = _list_box->getTopItem();
103 // read clamped value back in, and only set slider if it doesn't match the new
104 // index to avoid jumps
105 int slider_index = int((1.0f - _slider->getFloatValue()) * (getNumItems() - getNumVisible()));
106 if (slider_index != top)
107 _slider->setValue(1.0f - float(getTopItem()) / (getNumItems() - getNumVisible()));
111 puList::getListStringValue ()
113 int i = _list_box->getIntegerValue();
114 return i < 0 ? 0 : _contents[i];
118 puList::getListIntegerValue()
120 return _list_box->getIntegerValue();
124 puList::setColourScheme (float r, float g, float b, float a)
126 puObject::setColourScheme(r, g, b, a);
127 _list_box->setColourScheme(r, g, b, a);
131 puList::setColour (int which, float r, float g, float b, float a)
133 puObject::setColour(which, r, g, b, a);
134 _list_box->setColour(which, r, g, b, a);
138 puList::setSize (int w, int h)
142 puObject::setSize(w, h);
144 _frame->setSize(w, h);
146 int total = _list_box->getNumItems();
147 int visible = _list_box->getNumVisible();
151 if (!_slider->isVisible())
153 _slider->setValue(1.0f);
156 _down_arrow->reveal();
158 _list_box->setSize(w-_sw, h);
160 _slider->setPosition(w-_sw, _sw);
161 _slider->setSize(_sw, h-2*_sw);
162 _slider->setSliderFraction(float(visible) / total);
164 _down_arrow->setPosition(w-_sw, 0);
165 _up_arrow->setPosition(w-_sw, h-_sw);
170 if (_slider->isVisible())
176 _list_box->setSize(w, h);
181 puList::init (int w, int h, short transparent)
186 _frame = new puFrame(0, 0, w, h);
188 _list_box = new puListBox(0, 0, w-_sw, h);
189 _list_box->setStyle(-PUSTYLE_SMALL_SHADED);
190 _list_box->setUserData(this);
191 _list_box->setCallback(handle_list_entry);
192 _list_box->setValue(0);
194 _slider = new puSlider(w-_sw, _sw, h-2*_sw, true, _sw);
195 _slider->setValue(1.0f);
196 _slider->setUserData(_list_box);
197 _slider->setCallback(handle_slider);
198 _slider->setCBMode(PUSLIDER_ALWAYS);
200 _down_arrow = new puArrowButton(w-_sw, 0, w, _sw, PUARROW_DOWN) ;
201 _down_arrow->setUserData(_slider);
202 _down_arrow->setCallback(handle_arrow);
204 _up_arrow = new puArrowButton(w-_sw, h-_sw, w, h, PUARROW_UP);
205 _up_arrow->setUserData(_slider);
206 _up_arrow->setCallback(handle_arrow);