]> git.mxchange.org Git - flightgear.git/blobdiff - src/GUI/puList.cxx
Clear chat messages when an aircraft becomes inactive in the property tree.
[flightgear.git] / src / GUI / puList.cxx
index 7f85cc549e4860be158470c6e546ecf04d09ad9a..63bdd60116b63fa1ef3cb302c9a1a3740f65cdb7 100644 (file)
@@ -37,6 +37,7 @@ handle_arrow (puObject * arrow)
 {
     puSlider * slider = (puSlider *)arrow->getUserData();
     puListBox * list_box = (puListBox *)slider->getUserData();
+    puList * list = (puList *)list_box->getUserData();
 
     int step;
     switch (((puArrowButton *)arrow)->getArrowType()) {
@@ -51,14 +52,9 @@ handle_arrow (puObject * arrow)
         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)
@@ -92,6 +88,25 @@ puList::newList (char ** contents)
     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 ()
 {
@@ -105,38 +120,6 @@ puList::getListIntegerValue()
   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)
 {
@@ -151,19 +134,6 @@ puList::setColour (int which, 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)
 {
@@ -207,4 +177,36 @@ 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