changeset 16858:60399340c1a8 draft

(svn r21592) -Codechange: Return unique values for placing a sign and land-info querying, store the callback information locally, and use it instead of the global _place_proc.
author alberth <alberth@openttd.org>
date Tue, 21 Dec 2010 22:00:08 +0000
parents c34dea8763ee
children 040bd9347a6e
files src/toolbar_gui.cpp
diffstat 1 files changed, 50 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/src/toolbar_gui.cpp
+++ b/src/toolbar_gui.cpp
@@ -64,6 +64,8 @@
 /** Callback functions. */
 enum CallBackFunction {
 	CBF_NONE,
+	CBF_PLACE_SIGN,
+	CBF_PLACE_LANDINFO,
 };
 
 enum ToolbarNormalWidgets {
@@ -251,13 +253,14 @@
 
 static ToolbarMode _toolbar_mode;
 
-static void SelectSignTool()
+static CallBackFunction SelectSignTool()
 {
 	if (_cursor.sprite == SPR_CURSOR_SIGN) {
 		ResetObjectToPlace();
+		return CBF_NONE;
 	} else {
 		SetObjectToPlace(SPR_CURSOR_SIGN, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
-		_place_proc = PlaceProc_Sign;
+		return CBF_PLACE_SIGN;
 	}
 }
 
@@ -771,7 +774,7 @@
 	switch (index) {
 		case 0: ShowTerraformToolbar();  break;
 		case 1: ShowBuildTreesToolbar(); break;
-		case 2: SelectSignTool();        break;
+		case 2: return SelectSignTool();
 	}
 	return CBF_NONE;
 }
@@ -810,18 +813,14 @@
 
 /* --- Help button menu --- */
 
-static void Place_LandInfo(TileIndex tile)
-{
-	ShowLandInfo(tile);
-}
-
-static void PlaceLandBlockInfo()
+static CallBackFunction PlaceLandBlockInfo()
 {
 	if (_cursor.sprite == SPR_CURSOR_QUERY) {
 		ResetObjectToPlace();
+		return CBF_NONE;
 	} else {
-		_place_proc = Place_LandInfo;
 		SetObjectToPlace(SPR_CURSOR_QUERY, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
+		return CBF_PLACE_LANDINFO;
 	}
 }
 
@@ -849,7 +848,7 @@
 static CallBackFunction MenuClickHelp(int index)
 {
 	switch (index) {
-		case 0: PlaceLandBlockInfo();          break;
+		case 0: return PlaceLandBlockInfo();
 		case 2: IConsoleSwitch();              break;
 		case 3: ShowAIDebugWindow();           break;
 		case 4: MenuClickSmallScreenshot();    break;
@@ -972,8 +971,7 @@
 {
 	w->HandleButtonClick(TBSE_PLACESIGNS);
 	SndPlayFx(SND_15_BEEP);
-	SelectSignTool();
-	return CBF_NONE;
+	return SelectSignTool();
 }
 
 static CallBackFunction ToolbarBtn_NULL(Window *w)
@@ -1357,11 +1355,15 @@
 	MTHK_SIGN_LIST,
 };
 
+/** Main toolbar. */
 struct MainToolbarWindow : Window {
+	CallBackFunction last_started_action; ///< Last started user action.
+
 	MainToolbarWindow(const WindowDesc *desc) : Window()
 	{
 		this->InitNested(desc, 0);
 
+		this->last_started_action = CBF_NONE;
 		CLRBITS(this->flags4, WF_WHITE_BORDER_MASK);
 		this->SetWidgetDisabledState(TBN_PAUSE, _networking && !_network_server); // if not server, disable pause button
 		this->SetWidgetDisabledState(TBN_FASTFORWARD, _networking); // if networking, disable fast-forward button
@@ -1391,7 +1393,8 @@
 
 	virtual void OnDropdownSelect(int widget, int index)
 	{
-		_menu_clicked_procs[widget](index);
+		CallBackFunction cbf = _menu_clicked_procs[widget](index);
+		if (cbf != CBF_NONE) this->last_started_action = cbf;
 	}
 
 	virtual EventState OnKeyPress(uint16 key, uint16 keycode)
@@ -1441,7 +1444,17 @@
 
 	virtual void OnPlaceObject(Point pt, TileIndex tile)
 	{
-		_place_proc(tile);
+		switch (this->last_started_action) {
+			case CBF_PLACE_SIGN:
+				PlaceProc_Sign(tile);
+				break;
+
+			case CBF_PLACE_LANDINFO:
+				ShowLandInfo(tile);
+				break;
+
+			default: NOT_REACHED();
+		}
 	}
 
 	virtual void OnTick()
@@ -1640,11 +1653,13 @@
 };
 
 struct ScenarioEditorToolbarWindow : Window {
-public:
+	CallBackFunction last_started_action; ///< Last started user action.
+
 	ScenarioEditorToolbarWindow(const WindowDesc *desc) : Window()
 	{
 		this->InitNested(desc, 0);
 
+		this->last_started_action = CBF_NONE;
 		CLRBITS(this->flags4, WF_WHITE_BORDER_MASK);
 		PositionMainToolbar(this);
 		DoZoomInOutWindow(ZOOM_NONE, this);
@@ -1697,7 +1712,8 @@
 	virtual void OnClick(Point pt, int widget, int click_count)
 	{
 		if (_game_mode == GM_MENU) return;
-		_scen_toolbar_button_procs[widget](this);
+		CallBackFunction cbf = _scen_toolbar_button_procs[widget](this);
+		if (cbf != CBF_NONE) this->last_started_action = cbf;
 	}
 
 	virtual void OnDropdownSelect(int widget, int index)
@@ -1705,12 +1721,14 @@
 		/* The map button is in a different location on the scenario
 		 * editor toolbar, so we need to adjust for it. */
 		if (widget == TBSE_SMALLMAP) widget = TBN_SMALLMAP;
-		_menu_clicked_procs[widget](index);
+		CallBackFunction cbf = _menu_clicked_procs[widget](index);
+		if (cbf != CBF_NONE) this->last_started_action = cbf;
 		SndPlayFx(SND_15_BEEP);
 	}
 
 	virtual EventState OnKeyPress(uint16 key, uint16 keycode)
 	{
+		CallBackFunction cbf = CBF_NONE;
 		switch (CheckHotkeyMatch(scenedit_maintoolbar_hotkeys, keycode, this)) {
 			case MTEHK_PAUSE:               ToolbarPauseClick(this); break;
 			case MTEHK_FASTFORWARD:         ToolbarFastForwardClick(this); break;
@@ -1722,9 +1740,9 @@
 			case MTEHK_BUILD_ROAD:          ToolbarScenBuildRoad(this); break;
 			case MTEHK_BUILD_DOCKS:         ToolbarScenBuildDocks(this); break;
 			case MTEHK_BUILD_TREES:         ToolbarScenPlantTrees(this); break;
-			case MTEHK_SIGN:                ToolbarScenPlaceSign(this); break;
+			case MTEHK_SIGN:                cbf = ToolbarScenPlaceSign(this); break;
 			case MTEHK_MUSIC:               ShowMusicWindow(); break;
-			case MTEHK_LANDINFO:            PlaceLandBlockInfo(); break;
+			case MTEHK_LANDINFO:            cbf = PlaceLandBlockInfo(); break;
 			case MTEHK_SMALL_SCREENSHOT:    MenuClickSmallScreenshot(); break;
 			case MTEHK_ZOOMEDIN_SCREENSHOT: MenuClickZoomedInScreenshot(); break;
 			case MTEHK_GIANT_SCREENSHOT:    MenuClickWorldScreenshot(); break;
@@ -1735,12 +1753,23 @@
 			case MTEHK_EXTRA_VIEWPORT:      ShowExtraViewPortWindowForTileUnderCursor(); break;
 			default: return ES_NOT_HANDLED;
 		}
+		if (cbf != CBF_NONE) this->last_started_action = cbf;
 		return ES_HANDLED;
 	}
 
 	virtual void OnPlaceObject(Point pt, TileIndex tile)
 	{
-		_place_proc(tile);
+		switch (this->last_started_action) {
+			case CBF_PLACE_SIGN:
+				PlaceProc_Sign(tile);
+				break;
+
+			case CBF_PLACE_LANDINFO:
+				ShowLandInfo(tile);
+				break;
+
+			default: NOT_REACHED();
+		}
 	}
 
 	virtual void OnTimeout()