Changeset - r16848:90757d155ac6
[Not reviewed]
master
0 1 0
alberth - 13 years ago 2010-12-21 22:00:08
alberth@openttd.org
(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.
1 file changed with 50 insertions and 21 deletions:
0 comments (0 inline, 0 general)
src/toolbar_gui.cpp
Show inline comments
 
@@ -55,24 +55,26 @@
 
RailType _last_built_railtype;
 
RoadType _last_built_roadtype;
 

	
 
enum ToolbarMode {
 
	TB_NORMAL,
 
	TB_UPPER,
 
	TB_LOWER
 
};
 

	
 
/** Callback functions. */
 
enum CallBackFunction {
 
	CBF_NONE,
 
	CBF_PLACE_SIGN,
 
	CBF_PLACE_LANDINFO,
 
};
 

	
 
enum ToolbarNormalWidgets {
 
	TBN_PAUSE         = 0,
 
	TBN_FASTFORWARD,
 
	TBN_SETTINGS,
 
	TBN_SAVEGAME,
 
	TBN_SMALLMAP,
 
	TBN_TOWNDIRECTORY,
 
	TBN_SUBSIDIES,
 
	TBN_STATIONS,
 
	TBN_FINANCES,
 
@@ -242,31 +244,32 @@ static void PopupMainCompanyToolbMenu(Wi
 
	for (CompanyID c = COMPANY_FIRST; c < MAX_COMPANIES; c++) {
 
		if (!Company::IsValidID(c)) continue;
 
		list->push_back(new DropDownListCompanyItem(c, false, HasBit(grey, c)));
 
	}
 

	
 
	ShowDropDownList(w, list, _local_company == COMPANY_SPECTATOR ? CTMN_CLIENT_LIST : (int)_local_company, widget, 240, true, true);
 
	SndPlayFx(SND_15_BEEP);
 
}
 

	
 

	
 
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;
 
	}
 
}
 

	
 
/* --- Pausing --- */
 

	
 
static CallBackFunction ToolbarPauseClick(Window *w)
 
{
 
	if (_networking && !_network_server) return CBF_NONE; // only server can pause the game
 

	
 
	if (DoCommandP(0, PM_PAUSED_NORMAL, _pause_mode == PM_UNPAUSED, CMD_PAUSE)) SndPlayFx(SND_15_BEEP);
 
	return CBF_NONE;
 
}
 
@@ -762,25 +765,25 @@ static CallBackFunction MenuClickBuildAi
 

	
 
static CallBackFunction ToolbarForestClick(Window *w)
 
{
 
	PopupMainToolbMenu(w, TBN_LANDSCAPE, STR_LANDSCAPING_MENU_LANDSCAPING, 3);
 
	return CBF_NONE;
 
}
 

	
 
static CallBackFunction MenuClickForest(int index)
 
{
 
	switch (index) {
 
		case 0: ShowTerraformToolbar();  break;
 
		case 1: ShowBuildTreesToolbar(); break;
 
		case 2: SelectSignTool();        break;
 
		case 2: return SelectSignTool();
 
	}
 
	return CBF_NONE;
 
}
 

	
 
/* --- Music button menu --- */
 

	
 
static CallBackFunction ToolbarMusicClick(Window *w)
 
{
 
	PopupMainToolbMenu(w, TBN_MUSICSOUND, STR_TOOLBAR_SOUND_MUSIC, 1);
 
	return CBF_NONE;
 
}
 

	
 
@@ -801,36 +804,32 @@ static CallBackFunction ToolbarNewspaper
 
static CallBackFunction MenuClickNewspaper(int index)
 
{
 
	switch (index) {
 
		case 0: ShowLastNewsMessage(); break;
 
		case 1: ShowMessageOptions();  break;
 
		case 2: ShowMessageHistory();  break;
 
	}
 
	return CBF_NONE;
 
}
 

	
 
/* --- 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;
 
	}
 
}
 

	
 
static CallBackFunction ToolbarHelpClick(Window *w)
 
{
 
	PopupMainToolbMenu(w, TBN_HELP, STR_ABOUT_MENU_LAND_BLOCK_INFO, _settings_client.gui.newgrf_developer_tools ? 9 : 8);
 
	return CBF_NONE;
 
}
 

	
 
static void MenuClickSmallScreenshot()
 
{
 
	MakeScreenshot(SC_VIEWPORT, NULL);
 
@@ -840,25 +839,25 @@ static void MenuClickZoomedInScreenshot(
 
{
 
	MakeScreenshot(SC_ZOOMEDIN, NULL);
 
}
 

	
 
static void MenuClickWorldScreenshot()
 
{
 
	MakeScreenshot(SC_WORLD, NULL);
 
}
 

	
 
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;
 
		case 5: MenuClickZoomedInScreenshot(); break;
 
		case 6: MenuClickWorldScreenshot();    break;
 
		case 7: ShowAboutWindow();             break;
 
		case 8: ShowSpriteAlignerWindow();     break;
 
	}
 
	return CBF_NONE;
 
}
 

	
 
/* --- Switch toolbar button --- */
 
@@ -963,26 +962,25 @@ static CallBackFunction ToolbarScenBuild
 
static CallBackFunction ToolbarScenPlantTrees(Window *w)
 
{
 
	w->HandleButtonClick(TBSE_PLANTTREES);
 
	SndPlayFx(SND_15_BEEP);
 
	ShowBuildTreesToolbar();
 
	return CBF_NONE;
 
}
 

	
 
static CallBackFunction ToolbarScenPlaceSign(Window *w)
 
{
 
	w->HandleButtonClick(TBSE_PLACESIGNS);
 
	SndPlayFx(SND_15_BEEP);
 
	SelectSignTool();
 
	return CBF_NONE;
 
	return SelectSignTool();
 
}
 

	
 
static CallBackFunction ToolbarBtn_NULL(Window *w)
 
{
 
	return CBF_NONE;
 
}
 

	
 
typedef CallBackFunction MenuClickedProc(int index);
 

	
 
static MenuClickedProc * const _menu_clicked_procs[] = {
 
	NULL,                 // 0
 
	NULL,                 // 1
 
@@ -1348,29 +1346,33 @@ enum MainToolbarHotkeys {
 
	MTHK_MUSIC,
 
	MTHK_AI_DEBUG,
 
	MTHK_SMALL_SCREENSHOT,
 
	MTHK_ZOOMEDIN_SCREENSHOT,
 
	MTHK_GIANT_SCREENSHOT,
 
	MTHK_CHEATS,
 
	MTHK_TERRAFORM,
 
	MTHK_EXTRA_VIEWPORT,
 
	MTHK_CLIENT_LIST,
 
	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
 
		PositionMainToolbar(this);
 
		DoZoomInOutWindow(ZOOM_NONE, this);
 
	}
 

	
 
	virtual void OnPaint()
 
	{
 
		/* If spectator, disable all construction buttons
 
		 * ie : Build road, rail, ships, airports and landscaping
 
		 * Since enabled state is the default, just disable when needed */
 
@@ -1382,25 +1384,26 @@ struct MainToolbarWindow : Window {
 
		this->SetWidgetDisabledState(TBN_AIR, !CanBuildVehicleInfrastructure(VEH_AIRCRAFT));
 

	
 
		this->DrawWidgets();
 
	}
 

	
 
	virtual void OnClick(Point pt, int widget, int click_count)
 
	{
 
		if (_game_mode != GM_MENU && !this->IsWidgetDisabled(widget)) _toolbar_button_procs[widget](this);
 
	}
 

	
 
	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)
 
	{
 
		switch (CheckHotkeyMatch(maintoolbar_hotkeys, keycode, this)) {
 
			case MTHK_PAUSE: ToolbarPauseClick(this); break;
 
			case MTHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
 
			case MTHK_SETTINGS: ShowGameOptions(); break;
 
			case MTHK_SAVEGAME: MenuClickSaveLoad(); break;
 
			case MTHK_LOADGAME: ShowSaveLoadDialog(SLD_LOAD_GAME); break;
 
			case MTHK_SMALLMAP: ShowSmallMap(); break;
 
			case MTHK_TOWNDIRECTORY: ShowTownDirectory(); break;
 
@@ -1432,25 +1435,35 @@ struct MainToolbarWindow : Window {
 
			case MTHK_EXTRA_VIEWPORT: ShowExtraViewPortWindowForTileUnderCursor(); break;
 
#ifdef ENABLE_NETWORK
 
			case MTHK_CLIENT_LIST: if (_networking) ShowClientList(); break;
 
#endif
 
			case MTHK_SIGN_LIST: ShowSignList(); break;
 
			default: return ES_NOT_HANDLED;
 
		}
 
		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 OnTick()
 
	{
 
		if (this->IsWidgetLowered(TBN_PAUSE) != !!_pause_mode) {
 
			this->ToggleWidgetLoweredState(TBN_PAUSE);
 
			this->SetWidgetDirty(TBN_PAUSE);
 
		}
 

	
 
		if (this->IsWidgetLowered(TBN_FASTFORWARD) != !!_fast_forward) {
 
			this->ToggleWidgetLoweredState(TBN_FASTFORWARD);
 
			this->SetWidgetDirty(TBN_FASTFORWARD);
 
@@ -1631,29 +1644,31 @@ enum MainToolbarEditorHotkeys {
 
	MTEHK_LANDINFO,
 
	MTEHK_SMALL_SCREENSHOT,
 
	MTEHK_ZOOMEDIN_SCREENSHOT,
 
	MTEHK_GIANT_SCREENSHOT,
 
	MTEHK_ZOOM_IN,
 
	MTEHK_ZOOM_OUT,
 
	MTEHK_TERRAFORM,
 
	MTEHK_SMALLMAP,
 
	MTEHK_EXTRA_VIEWPORT,
 
};
 

	
 
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);
 
	}
 

	
 
	virtual void OnPaint()
 
	{
 
		this->SetWidgetDisabledState(TBSE_DATEBACKWARD, _settings_game.game_creation.starting_year <= MIN_YEAR);
 
		this->SetWidgetDisabledState(TBSE_DATEFORWARD, _settings_game.game_creation.starting_year >= MAX_YEAR);
 

	
 
		this->DrawWidgets();
 
	}
 
@@ -1688,68 +1703,82 @@ public:
 

	
 
			case TBSE_DATEPANEL:
 
				SetDParam(0, ConvertYMDToDate(MAX_YEAR, 0, 1));
 
				*size = GetStringBoundingBox(STR_WHITE_DATE_LONG);
 
				size->height = max(size->height, GetSpriteSize(SPR_IMG_SAVE).height + WD_IMGBTN_TOP + WD_IMGBTN_BOTTOM);
 
				break;
 
		}
 
	}
 

	
 
	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)
 
	{
 
		/* 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;
 
			case MTEHK_SETTINGS:            ShowGameOptions(); break;
 
			case MTEHK_SAVEGAME:            MenuClickSaveLoad(); break;
 
			case MTEHK_GENLAND:             ToolbarScenGenLand(this); break;
 
			case MTEHK_GENTOWN:             ToolbarScenGenTown(this); break;
 
			case MTEHK_GENINDUSTRY:         ToolbarScenGenIndustry(this); break;
 
			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;
 
			case MTEHK_ZOOM_IN:             ToolbarZoomInClick(this); break;
 
			case MTEHK_ZOOM_OUT:            ToolbarZoomOutClick(this); break;
 
			case MTEHK_TERRAFORM:           ShowEditorTerraformToolbar(); break;
 
			case MTEHK_SMALLMAP:            ShowSmallMap(); break;
 
			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()
 
	{
 
		this->SetWidgetsLoweredState(false, TBSE_DATEBACKWARD, TBSE_DATEFORWARD, WIDGET_LIST_END);
 
		this->SetWidgetDirty(TBSE_DATEBACKWARD);
 
		this->SetWidgetDirty(TBSE_DATEFORWARD);
 
	}
 

	
 
	virtual void OnTick()
 
	{
 
		if (this->IsWidgetLowered(TBSE_PAUSE) != !!_pause_mode) {
0 comments (0 inline, 0 general)