changeset 9369:8c20df5757b5 draft

(svn r13271) -Codechange: groups sorting uses GUILists Sort() now
author skidd13 <skidd13@openttd.org>
date Mon, 26 May 2008 18:30:58 +0000
parents ba811bffb84c
children 95dab85715fe
files src/group_gui.cpp
diffstat 1 files changed, 60 insertions(+), 68 deletions(-) [+]
line wrap: on
line diff
--- a/src/group_gui.cpp
+++ b/src/group_gui.cpp
@@ -30,64 +30,6 @@
 
 typedef GUIList<const Group*> GUIGroupList;
 
-static void BuildGroupList(GUIGroupList *gl, PlayerID owner, VehicleType vehicle_type)
-{
-	if (!(gl->flags & VL_REBUILD)) return;
-
-	gl->Clear();
-
-	const Group *g;
-	FOR_ALL_GROUPS(g) {
-		if (g->owner == owner && g->vehicle_type != vehicle_type) *gl->Append() = g;
-	}
-
-	gl->Compact();
-
-	gl->flags &= ~VL_REBUILD;
-	gl->flags |= VL_RESORT;
-}
-
-
-static int CDECL GroupNameSorter(const void *a, const void *b)
-{
-	static const Group *last_group[2] = { NULL, NULL };
-	static char         last_name[2][64] = { "", "" };
-
-	const Group *ga = *(const Group**)a;
-	const Group *gb = *(const Group**)b;
-	int r;
-
-	if (ga != last_group[0]) {
-		last_group[0] = ga;
-		SetDParam(0, ga->index);
-		GetString(last_name[0], STR_GROUP_NAME, lastof(last_name[0]));
-	}
-
-	if (gb != last_group[1]) {
-		last_group[1] = gb;
-		SetDParam(0, gb->index);
-		GetString(last_name[1], STR_GROUP_NAME, lastof(last_name[1]));
-	}
-
-	r = strcmp(last_name[0], last_name[1]); // sort by name
-
-	if (r == 0) return ga->index - gb->index;
-
-	return r;
-}
-
-
-static void SortGroupList(GUIGroupList *gl)
-{
-	if (!(gl->flags & VL_RESORT)) return;
-
-	qsort((void*)gl->Begin(), gl->Length(), sizeof(gl->Begin()), GroupNameSorter);
-
-	gl->resort_timer = DAY_TICKS * PERIODIC_RESORT_DAYS;
-	gl->flags &= ~VL_RESORT;
-}
-
-
 enum GroupListWidgets {
 	GRP_WIDGET_CLOSEBOX = 0,
 	GRP_WIDGET_CAPTION,
@@ -176,11 +118,58 @@
 };
 
 
-struct VehicleGroupWindow : public Window, public VehicleListBase {
+class VehicleGroupWindow : public Window, public VehicleListBase {
+private:
 	GroupID group_sel;
 	VehicleID vehicle_sel;
 	GUIGroupList groups;
 
+	/**
+	 * (Re)Build the group list.
+	 *
+	 * @param owner The owner of the window
+	 */
+	void BuildGroupList(PlayerID owner)
+	{
+		if (!this->groups.NeedRebuild()) return;
+
+		this->groups.Clear();
+
+		const Group *g;
+		FOR_ALL_GROUPS(g) {
+			if (g->owner == owner && g->vehicle_type == this->vehicle_type) {
+				*this->groups.Append() = g;
+			}
+		}
+
+		this->groups.Compact();
+		this->groups.RebuildDone();
+	}
+
+	/** Sort the groups by their name */
+	static int GroupNameSorter(const Group* const *a, const Group* const *b)
+	{
+		static const Group *last_group[2] = { NULL, NULL };
+		static char         last_name[2][64] = { "", "" };
+
+		if (*a != last_group[0]) {
+			last_group[0] = *a;
+			SetDParam(0, (*a)->index);
+			GetString(last_name[0], STR_GROUP_NAME, lastof(last_name[0]));
+		}
+
+		if (*b != last_group[1]) {
+			last_group[1] = *b;
+			SetDParam(0, (*b)->index);
+			GetString(last_name[1], STR_GROUP_NAME, lastof(last_name[1]));
+		}
+
+		int r = strcmp(last_name[0], last_name[1]); // sort by name
+		if (r == 0) return (*a)->index - (*b)->index;
+		return r;
+	}
+
+public:
 	VehicleGroupWindow(const WindowDesc *desc, WindowNumber window_number) : Window(desc, window_number)
 	{
 		const PlayerID owner = (PlayerID)GB(this->window_number, 0, 8);
@@ -221,8 +210,8 @@
 		this->vehicles.flags = VL_REBUILD | (this->sorting->order ? VL_DESC : VL_NONE);
 		this->vehicles.resort_timer = DAY_TICKS * PERIODIC_RESORT_DAYS; // Set up resort timer
 
-		this->groups.flags = VL_REBUILD | VL_NONE;
-		this->groups.resort_timer = DAY_TICKS * PERIODIC_RESORT_DAYS; // Set up resort timer
+		this->groups.ForceRebuild();
+		this->groups.NeedResort();
 
 		this->group_sel = ALL_GROUP;
 		this->vehicle_sel = INVALID_VEHICLE;
@@ -277,7 +266,13 @@
 	virtual void OnInvalidateData(int data)
 	{
 		this->vehicles.flags |= (data == 0 ? VL_REBUILD : VL_RESORT);
-		this->groups.flags |= (data == 0 ? VL_REBUILD : VL_RESORT);
+
+		if (data == 0) {
+			this->groups.ForceRebuild();
+		} else {
+			this->groups.ForceResort();
+		}
+
 		if (!(IsAllGroupID(this->group_sel) || IsDefaultGroupID(this->group_sel) || IsValidGroupID(this->group_sel))) {
 			this->group_sel = ALL_GROUP;
 			HideDropDownMenu(this);
@@ -299,9 +294,8 @@
 		BuildVehicleList(this, owner, this->group_sel, IsAllGroupID(this->group_sel) ? VLW_STANDARD : VLW_GROUP_LIST);
 		SortVehicleList(this);
 
-
-		BuildGroupList(&this->groups, owner, this->vehicle_type);
-		SortGroupList(&this->groups);
+		this->BuildGroupList(owner);
+		this->groups.Sort(GroupNameSorter);
 
 		SetVScrollCount(this, this->groups.Length());
 		SetVScroll2Count(this, this->vehicles.Length());
@@ -726,9 +720,7 @@
 			this->vehicles.flags |= VL_RESORT;
 			this->SetDirty();
 		}
-		if (--this->groups.resort_timer == 0) {
-			this->groups.resort_timer = DAY_TICKS * PERIODIC_RESORT_DAYS;
-			this->groups.flags |= VL_RESORT;
+		if (this->groups.NeedResort()) {
 			this->SetDirty();
 		}
 	}