wesnoth-cvs-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Wesnoth-cvs-commits] wesnoth/src/widgets menu.cpp


From: Guillaume Melquiond
Subject: [Wesnoth-cvs-commits] wesnoth/src/widgets menu.cpp
Date: Thu, 19 May 2005 14:53:00 -0400

CVSROOT:        /cvsroot/wesnoth
Module name:    wesnoth
Branch:         
Changes by:     Guillaume Melquiond <address@hidden>    05/05/19 18:52:59

Modified files:
        src/widgets    : menu.cpp 

Log message:
        Fix bad ordering after 'set_items' under reversed sort. Clean and 
enhance relative position computation and assertion. Use it when deleting an 
item. Fix the 'load' dialog deleting the wrong savefiles and causing assertion 
failures when sorted, after having first deleted a savefile.

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/widgets/menu.cpp.diff?tr1=1.92&tr2=1.93&r1=text&r2=text

Patches:
Index: wesnoth/src/widgets/menu.cpp
diff -u wesnoth/src/widgets/menu.cpp:1.92 wesnoth/src/widgets/menu.cpp:1.93
--- wesnoth/src/widgets/menu.cpp:1.92   Mon May 16 22:44:21 2005
+++ wesnoth/src/widgets/menu.cpp        Thu May 19 18:52:59 2005
@@ -218,11 +218,9 @@
 
        const int selectid = selection();
 
-       if(sortreversed_ == false) {
-               
std::stable_sort(items_.begin(),items_.end(),sort_func(*sorter_,sortby_));
-       } else {
-               std::reverse(items_.begin(),items_.end());
-       }
+       std::stable_sort(items_.begin(), items_.end(), sort_func(*sorter_, 
sortby_));
+       if (sortreversed_)
+               std::reverse(items_.begin(), items_.end());
 
        recalculate_pos();
 
@@ -235,19 +233,20 @@
 
 void menu::recalculate_pos()
 {
-       item_pos_.resize(items_.size());
-       for(std::vector<item>::const_iterator i = items_.begin(); i != 
items_.end(); ++i) {
-               item_pos_[i->id] = i - items_.begin();
-       }
-
+       size_t sz = items_.size();
+       item_pos_.resize(sz);
+       for(size_t i = 0; i != sz; ++i)
+               item_pos_[items_[i].id] = i;
        assert_pos();
 }
 
 void menu::assert_pos()
 {
-       assert(item_pos_.size() == items_.size());
-       for(size_t n = 0; n != item_pos_.size(); ++n) {
-               assert(n == items_[item_pos_[n]].id);
+       size_t sz = items_.size();
+       assert(item_pos_.size() == sz);
+       for(size_t n = 0; n != sz; ++n) {
+               size_t i = item_pos_[n];
+               assert(i < sz && n == items_[i].id);
        }
 }
 
@@ -332,21 +331,23 @@
        size_t nb_items = items_.size();
        if (index >= nb_items)
                return;
+       --nb_items;
 
-       clear_item(nb_items - 1);
-
-       const size_t pos = item_pos_[index];
+       clear_item(nb_items);
 
+       // fix ordered positions of items
+       size_t pos = item_pos_[index];
        item_pos_.erase(item_pos_.begin() + index);
-       for(std::vector<size_t>::iterator i = item_pos_.begin(); i != 
item_pos_.end(); ++i) {
-               if(*i > pos) {
-                       *i = *i-1;
-               }
+       items_.erase(items_.begin() + pos);
+       for(size_t i = 0; i != nb_items; ++i) {
+               size_t &n1 = item_pos_[i], &n2 = items_[i].id;
+               if (n1 > pos) --n1;
+               if (n2 > index) --n2;
        }
+       assert_pos();
 
-       items_.erase(items_.begin() + pos);
-       if (selected_ >= nb_items - 1)
-               selected_ = nb_items - 2;
+       if (selected_ >= nb_items)
+               selected_ = nb_items - 1;
 
        update_scrollbar_grip_height();
        adjust_viewport_to_selection();




reply via email to

[Prev in Thread] Current Thread [Next in Thread]