{
puSlider * slider = (puSlider *)arrow->getUserData();
puListBox * list_box = (puListBox *)slider->getUserData();
+ puList * list = (puList *)list_box->getUserData();
int step;
switch (((puArrowButton *)arrow)->getArrowType()) {
break;
}
- int total = list_box->getNumItems();
- int visible = list_box->getNumVisible();
- int index = list_box->getTopItem();
- list_box->setTopItem(index + step);
- // read back to get setTopItem()'s clamping
- index = list_box->getTopItem();
- // negative numbers can't happen, as the buttons aren't visible then
- slider->setValue(1.0f - float(index)/(total-visible));
+ int index = list->getTopItem();
+ list->setTopItem(index + step);
+ slider->setValue(1.0f - float(list->getTopItem()) / (list->getNumItems() - list->getNumVisible()));
}
puList::puList (int x, int y, int w, int h, int sl_width)
setSize(_width, _height);
}
+void
+puList::setTopItem( int top )
+{
+ int visible = _list_box->getNumVisible();
+ int num = _list_box->getNumItems();
+ if ( top < 0 || num <= visible )
+ top = 0 ;
+ else if ( num > 0 && top > num-visible )
+ top = num-visible;
+
+ _list_box->setTopItem(top);
+ top = _list_box->getTopItem();
+ // read clamped value back in, and only set slider if it doesn't match the new
+ // index to avoid jumps
+ int slider_index = int((1.0f - _slider->getFloatValue()) * (getNumItems() - getNumVisible()));
+ if (slider_index != top)
+ _slider->setValue(1.0f - float(getTopItem()) / (getNumItems() - getNumVisible()));
+}
+
char *
puList::getListStringValue ()
{
return _list_box->getIntegerValue();
}
-void
-puList::init (int w, int h, short transparent)
-{
- if ( transparent )
- _frame = NULL ;
- else
- _frame = new puFrame(0, 0, w, h);
-
- _list_box = new puListBox(0, 0, w-_sw, h);
- _list_box->setStyle(-PUSTYLE_SMALL_SHADED);
- _list_box->setUserData(this);
- _list_box->setCallback(handle_list_entry);
- _list_box->setValue(0);
-
- _slider = new puSlider(w-_sw, _sw, h-2*_sw, true, _sw);
- _slider->setValue(1.0f);
- _slider->setUserData(_list_box);
- _slider->setCallback(handle_slider);
- _slider->setCBMode(PUSLIDER_ALWAYS);
-
- _down_arrow = new puArrowButton(w-_sw, 0, w, _sw, PUARROW_DOWN) ;
- _down_arrow->setUserData(_slider);
- _down_arrow->setCallback(handle_arrow);
-
- _up_arrow = new puArrowButton(w-_sw, h-_sw, w, h, PUARROW_UP);
- _up_arrow->setUserData(_slider);
- _up_arrow->setCallback(handle_arrow);
-
- setSize(w, h);
- close();
-}
-
void
puList::setColourScheme (float r, float g, float b, float a)
{
_list_box->setColour(which, r, g, b, a);
}
-void
-puList::setTopItem( int top )
-{
- int visible = _list_box->getNumVisible();
- int num = _list_box->getNumItems();
- if ( top < 0 || num <= visible )
- top = 0 ;
- else if ( num > 0 && top > num-visible )
- top = num-visible;
-
- _list_box->setTopItem(top) ;
-}
-
void
puList::setSize (int w, int h)
{
}
}
+void
+puList::init (int w, int h, short transparent)
+{
+ if ( transparent )
+ _frame = NULL ;
+ else
+ _frame = new puFrame(0, 0, w, h);
+
+ _list_box = new puListBox(0, 0, w-_sw, h);
+ _list_box->setStyle(-PUSTYLE_SMALL_SHADED);
+ _list_box->setUserData(this);
+ _list_box->setCallback(handle_list_entry);
+ _list_box->setValue(0);
+
+ _slider = new puSlider(w-_sw, _sw, h-2*_sw, true, _sw);
+ _slider->setValue(1.0f);
+ _slider->setUserData(_list_box);
+ _slider->setCallback(handle_slider);
+ _slider->setCBMode(PUSLIDER_ALWAYS);
+
+ _down_arrow = new puArrowButton(w-_sw, 0, w, _sw, PUARROW_DOWN) ;
+ _down_arrow->setUserData(_slider);
+ _down_arrow->setCallback(handle_arrow);
+
+ _up_arrow = new puArrowButton(w-_sw, h-_sw, w, h, PUARROW_UP);
+ _up_arrow->setUserData(_slider);
+ _up_arrow->setCallback(handle_arrow);
+
+ setSize(w, h);
+ close();
+}
+
// end of puList.cxx
*/
class puList : public puGroup
{
+ char ** _contents;
+ puFrame * _frame;
+ puSlider * _slider;
+ puArrowButton * _up_arrow;
+ puArrowButton * _down_arrow;
+ int _style;
+ int _sw; // slider width
+ int _width, _height;
+
+ protected:
+ virtual void init (int w, int h, short transparent);
+ puListBox * _list_box;
+
public:
puList (int x, int y, int w, int h, int sl_width = 20);
puList (int x, int y, int w, int h, char ** contents, int sl_width = 20);
virtual ~puList ();
virtual void newList (char ** contents);
+
// TODO: other string value funcs
virtual char * getListStringValue ();
virtual int getListIntegerValue();
virtual void setColour (int which, float r, float g, float b, float a);
virtual void setSize (int w, int h);
- int getNumItems ( void ) const ;
- int getTopItem ( void ) const { return _list_box->getTopItem(); }
- void setTopItem (int index);
+ int getNumVisible ( void ) const { return _list_box->getNumVisible(); }
+ int getNumItems ( void ) const { return _list_box->getNumItems(); }
+ int getTopItem ( void ) const { return _list_box->getTopItem(); }
+ void setTopItem (int index);
- protected:
- virtual void init (int w, int h, short transparent);
- puListBox * _list_box;
-
- private:
- char ** _contents;
- puFrame * _frame;
- puSlider * _slider;
- puArrowButton * _up_arrow;
- puArrowButton * _down_arrow;
- int _style;
- int _sw; // slider width
- int _width, _height;
};
#endif // __PULIST_HXX