(svn r13180) -Codechange: make a window class of the TownDirectoryWindow.
authorpeter1138
Mon, 19 May 2008 09:17:26 +0000
changeset 9312 cd2d59f498e5
parent 9311 96b830227d9e
child 9313 11c910ed6d40
(svn r13180) -Codechange: make a window class of the TownDirectoryWindow.
src/town_gui.cpp
--- a/src/town_gui.cpp	Mon May 19 02:01:44 2008 +0000
+++ b/src/town_gui.cpp	Mon May 19 09:17:26 2008 +0000
@@ -405,11 +405,6 @@
 	AllocateWindowDescFront<TownViewWindow>(&_town_view_desc, town);
 }
 
-enum TownDirectoryWidget {
-	TDW_SORTNAME = 3,
-	TDW_SORTPOPULATION,
-	TDW_CENTERTOWN,
-};
 static const Widget _town_directory_widgets[] = {
 {   WWT_CLOSEBOX,   RESIZE_NONE,    13,     0,    10,     0,    13, STR_00C5,               STR_018B_CLOSE_WINDOW},
 {    WWT_CAPTION,   RESIZE_NONE,    13,    11,   195,     0,    13, STR_2000_TOWNS,         STR_018C_WINDOW_TITLE_DRAG_THIS},
@@ -482,107 +477,118 @@
 }
 
 
-static void TownDirectoryWndProc(Window *w, WindowEvent *e)
-{
-	switch (e->event) {
-		case WE_PAINT: {
-			if (_town_sort_dirty) {
-				_town_sort_dirty = false;
-				MakeSortedTownList();
+struct TownDirectoryWindow : public Window {
+	enum TownDirectoryWidget {
+		TDW_SORTNAME = 3,
+		TDW_SORTPOPULATION,
+		TDW_CENTERTOWN,
+	};
+
+	TownDirectoryWindow(const WindowDesc *desc) : Window(desc, 0)
+	{
+		this->vscroll.cap = 16;
+		this->resize.step_height = 10;
+		this->resize.height = this->height - 10 * 6; // minimum of 10 items in the list, each item 10 high
+
+		this->FindWindowPlacementAndResize(desc);
+	}
+
+	virtual void OnPaint()
+	{
+		if (_town_sort_dirty) {
+			_town_sort_dirty = false;
+			MakeSortedTownList();
+		}
+
+		SetVScrollCount(this, _num_town_sort);
+
+		this->DrawWidgets();
+		this->DrawSortButtonState((_town_sort_order <= 1) ? TDW_SORTNAME : TDW_SORTPOPULATION, _town_sort_order & 1 ? SBS_DOWN : SBS_UP);
+
+		{
+			int n = 0;
+			uint16 i = this->vscroll.pos;
+			int y = 28;
+
+			while (i < _num_town_sort) {
+				const Town* t = _town_sort[i];
+
+				assert(t->xy);
+
+				SetDParam(0, t->index);
+				SetDParam(1, t->population);
+				DrawString(2, y, STR_2057, TC_FROMSTRING);
+
+				y += 10;
+				i++;
+				if (++n == this->vscroll.cap) break; // max number of towns in 1 window
 			}
 
-			SetVScrollCount(w, _num_town_sort);
-
-			w->DrawWidgets();
-			w->DrawSortButtonState((_town_sort_order <= 1) ? TDW_SORTNAME : TDW_SORTPOPULATION, _town_sort_order & 1 ? SBS_DOWN : SBS_UP);
-
-			{
-				int n = 0;
-				uint16 i = w->vscroll.pos;
-				int y = 28;
-
-				while (i < _num_town_sort) {
-					const Town* t = _town_sort[i];
-
-					assert(t->xy);
-
-					SetDParam(0, t->index);
-					SetDParam(1, t->population);
-					DrawString(2, y, STR_2057, TC_FROMSTRING);
-
-					y += 10;
-					i++;
-					if (++n == w->vscroll.cap) break; // max number of towns in 1 window
-				}
-				SetDParam(0, GetWorldPopulation());
-				DrawString(3, w->height - 12 + 2, STR_TOWN_POPULATION, TC_FROMSTRING);
-			}
-		} break;
-
-		case WE_CLICK:
-			switch (e->we.click.widget) {
-				case TDW_SORTNAME: /* Sort by Name ascending/descending */
-					_town_sort_order = (_town_sort_order == 0) ? 1 : 0;
-					_town_sort_dirty = true;
-					w->SetDirty();
-					break;
+			SetDParam(0, GetWorldPopulation());
+			DrawString(3, this->height - 12 + 2, STR_TOWN_POPULATION, TC_FROMSTRING);
+		}
+	}
 
-				case TDW_SORTPOPULATION: /* Sort by Population ascending/descending */
-					_town_sort_order = (_town_sort_order == 2) ? 3 : 2;
-					_town_sort_dirty = true;
-					w->SetDirty();
-					break;
-
-				case TDW_CENTERTOWN: { /* Click on Town Matrix */
-					const Town* t;
-
-					uint16 id_v = (e->we.click.pt.y - 28) / 10;
-
-					if (id_v >= w->vscroll.cap) return; // click out of bounds
-
-					id_v += w->vscroll.pos;
-
-					if (id_v >= _num_town_sort) return; // click out of town bounds
+	virtual void OnClick(Point pt, int widget)
+	{
+		switch (widget) {
+			case TDW_SORTNAME: /* Sort by Name ascending/descending */
+				_town_sort_order = (_town_sort_order == 0) ? 1 : 0;
+				_town_sort_dirty = true;
+				this->SetDirty();
+				break;
 
-					t = _town_sort[id_v];
-					assert(t->xy);
-					if (_ctrl_pressed) {
-						ShowExtraViewPortWindow(t->xy);
-					} else {
-						ScrollMainWindowToTile(t->xy);
-					}
-				} break;
+			case TDW_SORTPOPULATION: /* Sort by Population ascending/descending */
+				_town_sort_order = (_town_sort_order == 2) ? 3 : 2;
+				_town_sort_dirty = true;
+				this->SetDirty();
+				break;
+
+			case TDW_CENTERTOWN: { /* Click on Town Matrix */
+				const Town* t;
+
+				uint16 id_v = (pt.y - 28) / 10;
+
+				if (id_v >= this->vscroll.cap) return; // click out of bounds
+
+				id_v += this->vscroll.pos;
+
+				if (id_v >= _num_town_sort) return; // click out of town bounds
+
+				t = _town_sort[id_v];
+				assert(t->xy);
+				if (_ctrl_pressed) {
+					ShowExtraViewPortWindow(t->xy);
+				} else {
+					ScrollMainWindowToTile(t->xy);
+				}
+				break;
 			}
-			break;
+		}
+	}
 
-		case WE_100_TICKS:
-			w->SetDirty();
-			break;
+	virtual void OnHundredthTick()
+	{
+		this->SetDirty();
+	}
 
-		case WE_RESIZE:
-			w->vscroll.cap += e->we.sizing.diff.y / 10;
-			break;
+	virtual void OnResize(Point new_size, Point delta)
+	{
+		this->vscroll.cap += delta.y / 10;
 	}
-}
+};
 
 static const WindowDesc _town_directory_desc = {
 	WDP_AUTO, WDP_AUTO, 208, 202, 208, 202,
 	WC_TOWN_DIRECTORY, WC_NONE,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE,
 	_town_directory_widgets,
-	TownDirectoryWndProc
+	NULL
 };
 
-
 void ShowTownDirectory()
 {
-	Window *w = AllocateWindowDescFront<Window>(&_town_directory_desc, 0);
-
-	if (w != NULL) {
-		w->vscroll.cap = 16;
-		w->resize.step_height = 10;
-		w->resize.height = w->height - 10 * 6; // minimum of 10 items in the list, each item 10 high
-	}
+	new TownDirectoryWindow(&_town_directory_desc);
 }
 
 void CcBuildTown(bool success, TileIndex tile, uint32 p1, uint32 p2)