src/dock_gui.cpp
branchnoai
changeset 10645 8cbdb511a674
parent 10513 33cb70ff2f5d
child 10715 6bdf79ffb022
--- a/src/dock_gui.cpp	Mon May 19 14:14:33 2008 +0000
+++ b/src/dock_gui.cpp	Mon May 19 15:13:58 2008 +0000
@@ -125,80 +125,85 @@
 	BuildDocksClick_Buoy
 };
 
-static void BuildDocksToolbWndProc(Window *w, WindowEvent *e)
-{
-	switch (e->event) {
-	case WE_PAINT:
-		DrawWindowWidgets(w);
-		w->SetWidgetsDisabledState(!CanBuildVehicleInfrastructure(VEH_SHIP), 7, 8, 9, WIDGET_LIST_END);
-		break;
-
-	case WE_CLICK:
-		if (e->we.click.widget - 3 >= 0 && e->we.click.widget != 5) _build_docks_button_proc[e->we.click.widget - 3](w);
-		break;
-
-	case WE_KEYPRESS:
-		switch (e->we.keypress.keycode) {
-			case '1': BuildDocksClick_Canal(w); break;
-			case '2': BuildDocksClick_Lock(w); break;
-			case '3': BuildDocksClick_Demolish(w); break;
-			case '4': BuildDocksClick_Depot(w); break;
-			case '5': BuildDocksClick_Dock(w); break;
-			case '6': BuildDocksClick_Buoy(w); break;
-			default:  return;
-		}
-		break;
-
-	case WE_PLACE_OBJ:
-		_place_proc(e->we.place.tile);
-		break;
-
-	case WE_PLACE_DRAG: {
-		VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.select_method);
-		return;
+struct BuildDocksToolbarWindow : Window {
+	BuildDocksToolbarWindow(const WindowDesc *desc, WindowNumber window_number) : Window(desc, window_number)
+	{
+		this->FindWindowPlacementAndResize(desc);
+		if (_patches.link_terraform_toolbar) ShowTerraformToolbar(this);
 	}
 
-	case WE_PLACE_MOUSEUP:
-		if (e->we.place.pt.x != -1) {
-			switch (e->we.place.select_proc) {
+	~BuildDocksToolbarWindow()
+	{
+		if (_patches.link_terraform_toolbar) DeleteWindowById(WC_SCEN_LAND_GEN, 0);
+	}
+
+	virtual void OnPaint()
+	{
+		this->SetWidgetsDisabledState(!CanBuildVehicleInfrastructure(VEH_SHIP), 7, 8, 9, WIDGET_LIST_END);
+		this->DrawWidgets();
+	}
+
+	virtual void OnClick(Point pt, int widget)
+	{
+		if (widget - 3 >= 0 && widget != 5) _build_docks_button_proc[widget - 3](this);
+	}
+
+	virtual EventState OnKeyPress(uint16 key, uint16 keycode)
+	{
+		switch (keycode) {
+			case '1': BuildDocksClick_Canal(this); break;
+			case '2': BuildDocksClick_Lock(this); break;
+			case '3': BuildDocksClick_Demolish(this); break;
+			case '4': BuildDocksClick_Depot(this); break;
+			case '5': BuildDocksClick_Dock(this); break;
+			case '6': BuildDocksClick_Buoy(this); break;
+			default:  return ES_NOT_HANDLED;
+		}
+		return ES_HANDLED;
+	}
+
+	virtual void OnPlaceObject(Point pt, TileIndex tile)
+	{
+		_place_proc(tile);
+	}
+
+	virtual void OnPlaceDrag(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt)
+	{
+		VpSelectTilesWithMethod(pt.x, pt.y, select_method);
+	}
+
+	virtual void OnPlaceMouseUp(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt, TileIndex start_tile, TileIndex end_tile)
+	{
+		if (pt.x != -1) {
+			switch (select_proc) {
 				case DDSP_DEMOLISH_AREA:
-					GUIPlaceProcDragXY(e);
+					GUIPlaceProcDragXY(select_proc, start_tile, end_tile);
 					break;
 				case DDSP_CREATE_WATER:
-					DoCommandP(e->we.place.tile, e->we.place.starttile, 0, CcBuildCanal, CMD_BUILD_CANAL | CMD_MSG(STR_CANT_BUILD_CANALS));
+					DoCommandP(end_tile, start_tile, 0, CcBuildCanal, CMD_BUILD_CANAL | CMD_MSG(STR_CANT_BUILD_CANALS));
 					break;
+
 				default: break;
 			}
 		}
-		break;
-
-	case WE_ABORT_PLACE_OBJ:
-		w->RaiseButtons();
-
-		w = FindWindowById(WC_BUILD_STATION, 0);
-		if (w != NULL) WP(w, def_d).close = true;
+	}
 
-		w = FindWindowById(WC_BUILD_DEPOT, 0);
-		if (w != NULL) WP(w, def_d).close = true;
-		break;
+	virtual void OnPlaceObjectAbort()
+	{
+		this->RaiseButtons();
 
-	case WE_PLACE_PRESIZE: {
-		TileIndex tile_from;
-		TileIndex tile_to;
+		delete FindWindowById(WC_BUILD_STATION, 0);
+		delete FindWindowById(WC_BUILD_DEPOT, 0);
+	}
 
-		tile_from = e->we.place.tile;
-
+	virtual void OnPlacePresize(Point pt, TileIndex tile_from)
+	{
 		DiagDirection dir = GetInclinedSlopeDirection(GetTileSlope(tile_from, NULL));
-		tile_to = (dir != INVALID_DIAGDIR ? TileAddByDiagDir(tile_from, ReverseDiagDir(dir)) : tile_from);
+		TileIndex tile_to = (dir != INVALID_DIAGDIR ? TileAddByDiagDir(tile_from, ReverseDiagDir(dir)) : tile_from);
 
 		VpSetPresizeRange(tile_from, tile_to);
-	} break;
-
-	case WE_DESTROY:
-		if (_patches.link_terraform_toolbar) DeleteWindowById(WC_SCEN_LAND_GEN, 0);
-		break;
 	}
-}
+};
 
 static const Widget _build_docks_toolb_widgets[] = {
 {   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                   STR_018B_CLOSE_WINDOW},
@@ -221,7 +226,6 @@
 	WC_BUILD_TOOLBAR, WC_NONE,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
 	_build_docks_toolb_widgets,
-	BuildDocksToolbWndProc
 };
 
 void ShowBuildDocksToolbar()
@@ -229,20 +233,32 @@
 	if (!IsValidPlayer(_current_player)) return;
 
 	DeleteWindowByClass(WC_BUILD_TOOLBAR);
-	Window *w = AllocateWindowDescFront<Window>(&_build_docks_toolbar_desc, TRANSPORT_WATER);
-	if (_patches.link_terraform_toolbar) ShowTerraformToolbar(w);
+	AllocateWindowDescFront<BuildDocksToolbarWindow>(&_build_docks_toolbar_desc, TRANSPORT_WATER);
 }
 
-static void BuildDockStationWndProc(Window *w, WindowEvent *e)
-{
-	switch (e->event) {
-	case WE_CREATE: w->LowerWidget(_station_show_coverage + 3); break;
+struct BuildDocksStationWindow : public PickerWindowBase {
+private:
+	enum BuildDockStationWidgets {
+		BDSW_CLOSE,
+		BDSW_CAPTION,
+		BDSW_BACKGROUND,
+		BDSW_LT_OFF,
+		BDSW_LT_ON,
+		BDSW_INFO,
+	};
 
-	case WE_PAINT: {
+public:
+	BuildDocksStationWindow(const WindowDesc *desc) : PickerWindowBase(desc)
+	{
+		this->LowerWidget(_station_show_coverage + BDSW_LT_OFF);
+		this->FindWindowPlacementAndResize(desc);
+	}
+
+	virtual void OnPaint()
+	{
 		int rad = (_patches.modified_catchment) ? CA_DOCK : CA_UNMODIFIED;
 
-		if (WP(w, def_d).close) return;
-		DrawWindowWidgets(w);
+		this->DrawWidgets();
 
 		if (_station_show_coverage) {
 			SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);
@@ -252,50 +268,40 @@
 
 		int text_end = DrawStationCoverageAreaText(4, 50, SCT_ALL, rad, false);
 		text_end = DrawStationCoverageAreaText(4, text_end + 4, SCT_ALL, rad, true) + 4;
-		if (text_end != w->widget[2].bottom) {
-			w->SetDirty();
-			ResizeWindowForWidget(w, 2, 0, text_end - w->widget[2].bottom);
-			w->SetDirty();
+		if (text_end != this->widget[BDSW_BACKGROUND].bottom) {
+			this->SetDirty();
+			ResizeWindowForWidget(this, 2, 0, text_end - this->widget[BDSW_BACKGROUND].bottom);
+			this->SetDirty();
 		}
-
-		break;
 	}
 
-	case WE_CLICK:
-		switch (e->we.click.widget) {
-			case 3:
-			case 4:
-				w->RaiseWidget(_station_show_coverage + 3);
-				_station_show_coverage = (e->we.click.widget != 3);
-				w->LowerWidget(_station_show_coverage + 3);
+	virtual void OnClick(Point pt, int widget)
+	{
+		switch (widget) {
+			case BDSW_LT_OFF:
+			case BDSW_LT_ON:
+				this->RaiseWidget(_station_show_coverage + BDSW_LT_OFF);
+				_station_show_coverage = (widget != BDSW_LT_OFF);
+				this->LowerWidget(_station_show_coverage + BDSW_LT_OFF);
 				SndPlayFx(SND_15_BEEP);
-				w->SetDirty();
+				this->SetDirty();
 				break;
 		}
-		break;
-
-	case WE_TICK:
-		if (WP(w, def_d).close) {
-			delete w;
-			return;
-		}
+	}
 
-		CheckRedrawStationCoverage(w);
-		break;
-
-	case WE_DESTROY:
-		if (!WP(w, def_d).close) ResetObjectToPlace();
-		break;
+	virtual void OnTick()
+	{
+		CheckRedrawStationCoverage(this);
 	}
-}
+};
 
 static const Widget _build_dock_station_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                         STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   147,     0,    13, STR_3068_DOCK,                    STR_018C_WINDOW_TITLE_DRAG_THIS},
-{      WWT_PANEL,   RESIZE_NONE,     7,     0,   147,    14,    74, 0x0,                              STR_NULL},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    14,    73,    30,    40, STR_02DB_OFF,                     STR_3065_DON_T_HIGHLIGHT_COVERAGE},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    74,   133,    30,    40, STR_02DA_ON,                      STR_3064_HIGHLIGHT_COVERAGE_AREA},
-{      WWT_LABEL,   RESIZE_NONE,     7,     0,   147,    17,    30, STR_3066_COVERAGE_AREA_HIGHLIGHT, STR_NULL},
+{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                         STR_018B_CLOSE_WINDOW},             // BDSW_CLOSE
+{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   147,     0,    13, STR_3068_DOCK,                    STR_018C_WINDOW_TITLE_DRAG_THIS},   // BDSW_CAPTION
+{      WWT_PANEL,   RESIZE_NONE,     7,     0,   147,    14,    74, 0x0,                              STR_NULL},                          // BDSW_BACKGROUND
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    14,    73,    30,    40, STR_02DB_OFF,                     STR_3065_DON_T_HIGHLIGHT_COVERAGE}, // BDSW_LT_OFF
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    74,   133,    30,    40, STR_02DA_ON,                      STR_3064_HIGHLIGHT_COVERAGE_AREA},  // BDSW_LT_ON
+{      WWT_LABEL,   RESIZE_NONE,     7,     0,   147,    17,    30, STR_3066_COVERAGE_AREA_HIGHLIGHT, STR_NULL},                          // BDSW_INFO
 {   WIDGETS_END},
 };
 
@@ -304,67 +310,72 @@
 	WC_BUILD_STATION, WC_BUILD_TOOLBAR,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET,
 	_build_dock_station_widgets,
-	BuildDockStationWndProc
 };
 
 static void ShowBuildDockStationPicker()
 {
-	new Window(&_build_dock_station_desc);
+	new BuildDocksStationWindow(&_build_dock_station_desc);
 }
 
-static void UpdateDocksDirection()
-{
-	if (_ship_depot_direction != AXIS_X) {
-		SetTileSelectSize(1, 2);
-	} else {
-		SetTileSelectSize(2, 1);
+struct BuildDocksDepotWindow : public PickerWindowBase {
+private:
+	enum BuildDockDepotWidgets {
+		BDDW_CLOSE,
+		BDDW_CAPTION,
+		BDDW_BACKGROUND,
+		BDDW_X,
+		BDDW_Y,
+	};
+
+	static void UpdateDocksDirection()
+	{
+		if (_ship_depot_direction != AXIS_X) {
+			SetTileSelectSize(1, 2);
+		} else {
+			SetTileSelectSize(2, 1);
+		}
 	}
-}
 
-static void BuildDocksDepotWndProc(Window *w, WindowEvent *e)
-{
-	switch (e->event) {
-	case WE_CREATE: w->LowerWidget(_ship_depot_direction + 3); break;
+public:
+	BuildDocksDepotWindow(const WindowDesc *desc) : PickerWindowBase(desc)
+	{
+		this->LowerWidget(_ship_depot_direction + BDDW_X);
+		UpdateDocksDirection();
+		this->FindWindowPlacementAndResize(desc);
+	}
 
-	case WE_PAINT:
-		DrawWindowWidgets(w);
+	virtual void OnPaint()
+	{
+		this->DrawWidgets();
 
 		DrawShipDepotSprite(67, 35, 0);
 		DrawShipDepotSprite(35, 51, 1);
 		DrawShipDepotSprite(135, 35, 2);
 		DrawShipDepotSprite(167, 51, 3);
-		return;
+	}
 
-	case WE_CLICK: {
-		switch (e->we.click.widget) {
-		case 3:
-		case 4:
-			w->RaiseWidget(_ship_depot_direction + 3);
-			_ship_depot_direction = (e->we.click.widget == 3 ? AXIS_X : AXIS_Y);
-			w->LowerWidget(_ship_depot_direction + 3);
-			SndPlayFx(SND_15_BEEP);
-			UpdateDocksDirection();
-			w->SetDirty();
-			break;
+	virtual void OnClick(Point pt, int widget)
+	{
+		switch (widget) {
+			case BDDW_X:
+			case BDDW_Y:
+				this->RaiseWidget(_ship_depot_direction + BDDW_X);
+				_ship_depot_direction = (widget == BDDW_X ? AXIS_X : AXIS_Y);
+				this->LowerWidget(_ship_depot_direction + BDDW_X);
+				SndPlayFx(SND_15_BEEP);
+				UpdateDocksDirection();
+				this->SetDirty();
+				break;
 		}
-	} break;
-
-	case WE_TICK:
-		if (WP(w, def_d).close) delete w;
-		break;
-
-	case WE_DESTROY:
-		if (!WP(w, def_d).close) ResetObjectToPlace();
-		break;
 	}
-}
+};
 
 static const Widget _build_docks_depot_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                        STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   203,     0,    13, STR_3800_SHIP_DEPOT_ORIENTATION, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{      WWT_PANEL,   RESIZE_NONE,     7,     0,   203,    14,    85, 0x0,                             STR_NULL},
-{      WWT_PANEL,   RESIZE_NONE,    14,     3,   100,    17,    82, 0x0,                             STR_3803_SELECT_SHIP_DEPOT_ORIENTATION},
-{      WWT_PANEL,   RESIZE_NONE,    14,   103,   200,    17,    82, 0x0,                             STR_3803_SELECT_SHIP_DEPOT_ORIENTATION},
+{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                        STR_018B_CLOSE_WINDOW},                  // BDDW_CLOSE
+{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   203,     0,    13, STR_3800_SHIP_DEPOT_ORIENTATION, STR_018C_WINDOW_TITLE_DRAG_THIS},        // BDDW_CAPTION
+{      WWT_PANEL,   RESIZE_NONE,     7,     0,   203,    14,    85, 0x0,                             STR_NULL},                               // BDDW_BACKGROUND
+{      WWT_PANEL,   RESIZE_NONE,    14,     3,   100,    17,    82, 0x0,                             STR_3803_SELECT_SHIP_DEPOT_ORIENTATION}, // BDDW_X
+{      WWT_PANEL,   RESIZE_NONE,    14,   103,   200,    17,    82, 0x0,                             STR_3803_SELECT_SHIP_DEPOT_ORIENTATION}, // BDDW_Y
 {   WIDGETS_END},
 };
 
@@ -373,14 +384,12 @@
 	WC_BUILD_DEPOT, WC_BUILD_TOOLBAR,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET,
 	_build_docks_depot_widgets,
-	BuildDocksDepotWndProc
 };
 
 
 static void ShowBuildDocksDepotPicker()
 {
-	new Window(&_build_docks_depot_desc);
-	UpdateDocksDirection();
+	new BuildDocksDepotWindow(&_build_docks_depot_desc);
 }