src/toolbar_gui.cpp
changeset 9305 d6694e58c36b
parent 9301 3b20dfb6c4e8
child 9310 d2f150a6e2f0
equal deleted inserted replaced
9304:0942e5c1fa1a 9305:d6694e58c36b
   664 	ToolbarMusicClick,
   664 	ToolbarMusicClick,
   665 	ToolbarNewspaperClick,
   665 	ToolbarNewspaperClick,
   666 	ToolbarHelpClick,
   666 	ToolbarHelpClick,
   667 };
   667 };
   668 
   668 
   669 static void MainToolbarWndProc(Window *w, WindowEvent *e)
   669 struct MainToolbarWindow : Window {
   670 {
   670 	MainToolbarWindow(const WindowDesc *desc) : Window(desc)
   671 	switch (e->event) {
   671 	{
   672 		case WE_PAINT:
   672 		this->SetWidgetDisabledState(0, _networking && !_network_server); // if not server, disable pause button
   673 			/* Draw brown-red toolbar bg. */
   673 		this->SetWidgetDisabledState(1, _networking); // if networking, disable fast-forward button
   674 			GfxFillRect(0, 0, w->width - 1, w->height - 1, 0xB2);
   674 
   675 			GfxFillRect(0, 0, w->width - 1, w->height - 1, 0xB4 | (1 << PALETTE_MODIFIER_GREYOUT));
   675 		CLRBITS(this->flags4, WF_WHITE_BORDER_MASK);
   676 
   676 
   677 			/* If spectator, disable all construction buttons
   677 		PositionMainToolbar(this);
   678 			* ie : Build road, rail, ships, airports and landscaping
   678 		DoZoomInOutWindow(ZOOM_NONE, this);
   679 			* Since enabled state is the default, just disable when needed */
   679 		this->FindWindowPlacementAndResize(desc);
   680 			w->SetWidgetsDisabledState(_current_player == PLAYER_SPECTATOR, 19, 20, 21, 22, 23, WIDGET_LIST_END);
   680 	}
   681 			/* disable company list drop downs, if there are no companies */
   681 
   682 			w->SetWidgetsDisabledState(ActivePlayerCount() == 0, 7, 8, 13, 14, 15, 16, WIDGET_LIST_END);
   682 	virtual void OnPaint()
   683 
   683 	{
   684 			w->SetWidgetDisabledState(19, !CanBuildVehicleInfrastructure(VEH_TRAIN));
   684 		/* Draw brown-red toolbar bg. */
   685 			w->SetWidgetDisabledState(22, !CanBuildVehicleInfrastructure(VEH_AIRCRAFT));
   685 		GfxFillRect(0, 0, this->width - 1, this->height - 1, 0xB2);
   686 
   686 		GfxFillRect(0, 0, this->width - 1, this->height - 1, 0xB4 | (1 << PALETTE_MODIFIER_GREYOUT));
   687 			w->DrawWidgets();
   687 
   688 			break;
   688 		/* If spectator, disable all construction buttons
   689 
   689 		* ie : Build road, rail, ships, airports and landscaping
   690 		case WE_CLICK:
   690 		* Since enabled state is the default, just disable when needed */
   691 			if (_game_mode != GM_MENU && !w->IsWidgetDisabled(e->we.click.widget)) _toolbar_button_procs[e->we.click.widget](w);
   691 		this->SetWidgetsDisabledState(_current_player == PLAYER_SPECTATOR, 19, 20, 21, 22, 23, WIDGET_LIST_END);
   692 			break;
   692 		/* disable company list drop downs, if there are no companies */
   693 
   693 		this->SetWidgetsDisabledState(ActivePlayerCount() == 0, 7, 8, 13, 14, 15, 16, WIDGET_LIST_END);
   694 		case WE_KEYPRESS:
   694 
   695 			switch (e->we.keypress.keycode) {
   695 		this->SetWidgetDisabledState(19, !CanBuildVehicleInfrastructure(VEH_TRAIN));
   696 				case WKC_F1: case WKC_PAUSE: ToolbarPauseClick(w); break;
   696 		this->SetWidgetDisabledState(22, !CanBuildVehicleInfrastructure(VEH_AIRCRAFT));
   697 				case WKC_F2: ShowGameOptions(); break;
   697 
   698 				case WKC_F3: MenuClickSaveLoad(0); break;
   698 		this->DrawWidgets();
   699 				case WKC_F4: ShowSmallMap(); break;
   699 	}
   700 				case WKC_F5: ShowTownDirectory(); break;
   700 
   701 				case WKC_F6: ShowSubsidiesList(); break;
   701 	virtual void OnClick(Point pt, int widget)
   702 				case WKC_F7: ShowPlayerStations(_local_player); break;
   702 	{
   703 				case WKC_F8: ShowPlayerFinances(_local_player); break;
   703 		if (_game_mode != GM_MENU && !this->IsWidgetDisabled(widget)) _toolbar_button_procs[widget](this);
   704 				case WKC_F9: ShowPlayerCompany(_local_player); break;
   704 	}
   705 				case WKC_F10: ShowOperatingProfitGraph(); break;
   705 
   706 				case WKC_F11: ShowCompanyLeagueTable(); break;
   706 	virtual EventState OnKeyPress(uint16 key, uint16 keycode)
   707 				case WKC_F12: ShowBuildIndustryWindow(); break;
   707 	{
   708 				case WKC_SHIFT | WKC_F1: ShowVehicleListWindow(_local_player, VEH_TRAIN); break;
   708 		switch (keycode) {
   709 				case WKC_SHIFT | WKC_F2: ShowVehicleListWindow(_local_player, VEH_ROAD); break;
   709 			case WKC_F1: case WKC_PAUSE: ToolbarPauseClick(this); break;
   710 				case WKC_SHIFT | WKC_F3: ShowVehicleListWindow(_local_player, VEH_SHIP); break;
   710 			case WKC_F2: ShowGameOptions(); break;
   711 				case WKC_SHIFT | WKC_F4: ShowVehicleListWindow(_local_player, VEH_AIRCRAFT); break;
   711 			case WKC_F3: MenuClickSaveLoad(0); break;
   712 				case WKC_NUM_PLUS: // Fall through
   712 			case WKC_F4: ShowSmallMap(); break;
   713 				case WKC_EQUALS: // Fall through
   713 			case WKC_F5: ShowTownDirectory(); break;
   714 				case WKC_SHIFT | WKC_EQUALS: // Fall through
   714 			case WKC_F6: ShowSubsidiesList(); break;
   715 				case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(w); break;
   715 			case WKC_F7: ShowPlayerStations(_local_player); break;
   716 				case WKC_NUM_MINUS: // Fall through
   716 			case WKC_F8: ShowPlayerFinances(_local_player); break;
   717 				case WKC_MINUS: // Fall through
   717 			case WKC_F9: ShowPlayerCompany(_local_player); break;
   718 				case WKC_SHIFT | WKC_MINUS: // Fall through
   718 			case WKC_F10: ShowOperatingProfitGraph(); break;
   719 				case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(w); break;
   719 			case WKC_F11: ShowCompanyLeagueTable(); break;
   720 				case WKC_SHIFT | WKC_F7: if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, -1); break;
   720 			case WKC_F12: ShowBuildIndustryWindow(); break;
   721 				case WKC_SHIFT | WKC_F8: ShowBuildRoadToolbar(_last_built_roadtype); break;
   721 			case WKC_SHIFT | WKC_F1: ShowVehicleListWindow(_local_player, VEH_TRAIN); break;
   722 				case WKC_SHIFT | WKC_F9: ShowBuildDocksToolbar(); break;
   722 			case WKC_SHIFT | WKC_F2: ShowVehicleListWindow(_local_player, VEH_ROAD); break;
   723 				case WKC_SHIFT | WKC_F10: if (CanBuildVehicleInfrastructure(VEH_AIRCRAFT)) ShowBuildAirToolbar(); break;
   723 			case WKC_SHIFT | WKC_F3: ShowVehicleListWindow(_local_player, VEH_SHIP); break;
   724 				case WKC_SHIFT | WKC_F11: ShowBuildTreesToolbar(); break;
   724 			case WKC_SHIFT | WKC_F4: ShowVehicleListWindow(_local_player, VEH_AIRCRAFT); break;
   725 				case WKC_SHIFT | WKC_F12: ShowMusicWindow(); break;
   725 			case WKC_NUM_PLUS: // Fall through
   726 				case WKC_CTRL  | 'S': MenuClickSmallScreenshot(); break;
   726 			case WKC_EQUALS: // Fall through
   727 				case WKC_CTRL  | 'G': MenuClickWorldScreenshot(); break;
   727 			case WKC_SHIFT | WKC_EQUALS: // Fall through
   728 				case WKC_CTRL | WKC_ALT | 'C': if (!_networking) ShowCheatWindow(); break;
   728 			case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(this); break;
   729 				case 'A': if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, 4); break; // Invoke Autorail
   729 			case WKC_NUM_MINUS: // Fall through
   730 				case 'L': ShowTerraformToolbar(); break;
   730 			case WKC_MINUS: // Fall through
   731 				case 'M': ShowSmallMap(); break;
   731 			case WKC_SHIFT | WKC_MINUS: // Fall through
   732 				case 'V': ShowExtraViewPortWindow(); break;
   732 			case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(this); break;
   733 				default: return;
   733 			case WKC_SHIFT | WKC_F7: if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, -1); break;
       
   734 			case WKC_SHIFT | WKC_F8: ShowBuildRoadToolbar(_last_built_roadtype); break;
       
   735 			case WKC_SHIFT | WKC_F9: ShowBuildDocksToolbar(); break;
       
   736 			case WKC_SHIFT | WKC_F10: if (CanBuildVehicleInfrastructure(VEH_AIRCRAFT)) ShowBuildAirToolbar(); break;
       
   737 			case WKC_SHIFT | WKC_F11: ShowBuildTreesToolbar(); break;
       
   738 			case WKC_SHIFT | WKC_F12: ShowMusicWindow(); break;
       
   739 			case WKC_CTRL  | 'S': MenuClickSmallScreenshot(); break;
       
   740 			case WKC_CTRL  | 'G': MenuClickWorldScreenshot(); break;
       
   741 			case WKC_CTRL | WKC_ALT | 'C': if (!_networking) ShowCheatWindow(); break;
       
   742 			case 'A': if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, 4); break; // Invoke Autorail
       
   743 			case 'L': ShowTerraformToolbar(); break;
       
   744 			case 'M': ShowSmallMap(); break;
       
   745 			case 'V': ShowExtraViewPortWindow(); break;
       
   746 			default: return ES_NOT_HANDLED;
       
   747 		}
       
   748 		return ES_HANDLED;
       
   749 	}
       
   750 
       
   751 	virtual void OnPlaceObject(Point pt, TileIndex tile)
       
   752 	{
       
   753 		_place_proc(tile);
       
   754 	}
       
   755 
       
   756 	virtual void OnPlaceObjectAbort()
       
   757 	{
       
   758 		this->RaiseWidget(25);
       
   759 		this->SetDirty();
       
   760 	}
       
   761 
       
   762 	virtual void OnTick()
       
   763 	{
       
   764 		if (this->IsWidgetLowered(0) != !!_pause_game) {
       
   765 			this->ToggleWidgetLoweredState(0);
       
   766 			this->InvalidateWidget(0);
       
   767 		}
       
   768 
       
   769 		if (this->IsWidgetLowered(1) != !!_fast_forward) {
       
   770 			this->ToggleWidgetLoweredState(1);
       
   771 			this->InvalidateWidget(1);
       
   772 		}
       
   773 	}
       
   774 
       
   775 	virtual void OnResize(Point new_size, Point delta)
       
   776 	{
       
   777 		/* There are 27 buttons plus some spacings if the space allows it */
       
   778 		uint button_width;
       
   779 		uint spacing;
       
   780 		if (this->width >= 27 * 22) {
       
   781 			button_width = 22;
       
   782 			spacing = this->width - (27 * button_width);
       
   783 		} else {
       
   784 			button_width = this->width / 27;
       
   785 			spacing = 0;
       
   786 		}
       
   787 		uint extra_spacing_at[] = { 4, 8, 13, 17, 19, 24, 0 };
       
   788 
       
   789 		for (uint i = 0, x = 0, j = 0; i < 27; i++) {
       
   790 			if (extra_spacing_at[j] == i) {
       
   791 				j++;
       
   792 				uint add = spacing / (lengthof(extra_spacing_at) - j);
       
   793 				spacing -= add;
       
   794 				x += add;
   734 			}
   795 			}
   735 			e->we.keypress.cont = false;
   796 
   736 			break;
   797 			this->widget[i].left = x;
   737 
   798 			x += (spacing != 0) ? button_width : (this->width - x) / (27 - i);
   738 		case WE_PLACE_OBJ:
   799 			this->widget[i].right = x - 1;
   739 			_place_proc(e->we.place.tile);
   800 		}
   740 			break;
   801 	}
   741 
   802 
   742 		case WE_ABORT_PLACE_OBJ:
   803 	virtual void OnTimeout()
   743 			w->RaiseWidget(25);
   804 	{
   744 			w->SetDirty();
   805 		for (uint i = 2; i < this->widget_count; i++) {
   745 			break;
   806 			if (this->IsWidgetLowered(i)) {
   746 
   807 				this->RaiseWidget(i);
   747 		case WE_TICK:
   808 				this->InvalidateWidget(i);
   748 			if (w->IsWidgetLowered(0) != !!_pause_game) {
       
   749 				w->ToggleWidgetLoweredState(0);
       
   750 				w->InvalidateWidget(0);
       
   751 			}
   809 			}
   752 
   810 		}
   753 			if (w->IsWidgetLowered(1) != !!_fast_forward) {
   811 	}
   754 				w->ToggleWidgetLoweredState(1);
   812 
   755 				w->InvalidateWidget(1);
   813 	virtual void OnInvalidateData(int data)
   756 			}
   814 	{
   757 			break;
   815 		if (FindWindowById(WC_MAIN_WINDOW, 0) != NULL) HandleZoomMessage(this, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, 17, 18);
   758 
   816 	}
   759 		case WE_RESIZE: {
   817 };
   760 			/* There are 27 buttons plus some spacings if the space allows it */
       
   761 			uint button_width;
       
   762 			uint spacing;
       
   763 			if (w->width >= 27 * 22) {
       
   764 				button_width = 22;
       
   765 				spacing = w->width - (27 * button_width);
       
   766 			} else {
       
   767 				button_width = w->width / 27;
       
   768 				spacing = 0;
       
   769 			}
       
   770 			uint extra_spacing_at[] = { 4, 8, 13, 17, 19, 24, 0 };
       
   771 
       
   772 			for (uint i = 0, x = 0, j = 0; i < 27; i++) {
       
   773 				if (extra_spacing_at[j] == i) {
       
   774 					j++;
       
   775 					uint add = spacing / (lengthof(extra_spacing_at) - j);
       
   776 					spacing -= add;
       
   777 					x += add;
       
   778 				}
       
   779 
       
   780 				w->widget[i].left = x;
       
   781 				x += (spacing != 0) ? button_width : (w->width - x) / (27 - i);
       
   782 				w->widget[i].right = x - 1;
       
   783 			}
       
   784 		} break;
       
   785 
       
   786 		case WE_TIMEOUT:
       
   787 			for (uint i = 2; i < w->widget_count; i++) {
       
   788 				if (w->IsWidgetLowered(i)) {
       
   789 					w->RaiseWidget(i);
       
   790 					w->InvalidateWidget(i);
       
   791 				}
       
   792 			}
       
   793 			break;
       
   794 
       
   795 		case WE_INVALIDATE_DATA:
       
   796 			if (FindWindowById(WC_MAIN_WINDOW, 0) != NULL) HandleZoomMessage(w, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, 17, 18);
       
   797 			break;
       
   798 	}
       
   799 }
       
   800 
   818 
   801 static const Widget _toolb_normal_widgets[] = {
   819 static const Widget _toolb_normal_widgets[] = {
   802 {     WWT_IMGBTN,   RESIZE_LEFT,    14,     0,     0,     0,    21, SPR_IMG_PAUSE,           STR_0171_PAUSE_GAME},
   820 {     WWT_IMGBTN,   RESIZE_LEFT,    14,     0,     0,     0,    21, SPR_IMG_PAUSE,           STR_0171_PAUSE_GAME},
   803 {     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_FASTFORWARD,     STR_FAST_FORWARD},
   821 {     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_FASTFORWARD,     STR_FAST_FORWARD},
   804 {     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_SETTINGS,        STR_0187_OPTIONS},
   822 {     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_SETTINGS,        STR_0187_OPTIONS},
   838 static const WindowDesc _toolb_normal_desc = {
   856 static const WindowDesc _toolb_normal_desc = {
   839 	0, 0, 0, 22, 640, 22,
   857 	0, 0, 0, 22, 640, 22,
   840 	WC_MAIN_TOOLBAR, WC_NONE,
   858 	WC_MAIN_TOOLBAR, WC_NONE,
   841 	WDF_STD_TOOLTIPS | WDF_DEF_WIDGET,
   859 	WDF_STD_TOOLTIPS | WDF_DEF_WIDGET,
   842 	_toolb_normal_widgets,
   860 	_toolb_normal_widgets,
   843 	MainToolbarWndProc
   861 	NULL
   844 };
   862 };
   845 
   863 
   846 
   864 
   847 /* --- Toolbar handling for the scenario editor */
   865 /* --- Toolbar handling for the scenario editor */
   848 
   866 
   874 	ToolbarMusicClick,
   892 	ToolbarMusicClick,
   875 	NULL,
   893 	NULL,
   876 	ToolbarHelpClick,
   894 	ToolbarHelpClick,
   877 };
   895 };
   878 
   896 
   879 static void ScenEditToolbarWndProc(Window *w, WindowEvent *e)
   897 struct ScenarioEditorToolbarWindow : Window {
   880 {
   898 	ScenarioEditorToolbarWindow(const WindowDesc *desc) : Window(desc)
   881 	switch (e->event) {
   899 	{
   882 		case WE_PAINT:
   900 		CLRBITS(this->flags4, WF_WHITE_BORDER_MASK);
   883 			w->SetWidgetDisabledState(6, _patches_newgame.starting_year <= MIN_YEAR);
   901 
   884 			w->SetWidgetDisabledState(7, _patches_newgame.starting_year >= MAX_YEAR);
   902 		PositionMainToolbar(this);
   885 
   903 		DoZoomInOutWindow(ZOOM_NONE, this);
   886 			/* Draw brown-red toolbar bg. */
   904 		this->FindWindowPlacementAndResize(desc);
   887 			GfxFillRect(0, 0, w->width - 1, w->height - 1, 0xB2);
   905 	}
   888 			GfxFillRect(0, 0, w->width - 1, w->height - 1, 0xB4 | (1 << PALETTE_MODIFIER_GREYOUT));
   906 
   889 
   907 	virtual void OnPaint()
   890 			w->DrawWidgets();
   908 	{
   891 
   909 		this->SetWidgetDisabledState(6, _patches_newgame.starting_year <= MIN_YEAR);
   892 			SetDParam(0, ConvertYMDToDate(_patches_newgame.starting_year, 0, 1));
   910 		this->SetWidgetDisabledState(7, _patches_newgame.starting_year >= MAX_YEAR);
   893 			DrawStringCenteredTruncated(w->widget[6].right, w->widget[7].left, 6, STR_00AF, TC_FROMSTRING);
   911 
   894 
   912 		/* Draw brown-red toolbar bg. */
   895 			/* We hide this panel when the toolbar space gets too small */
   913 		GfxFillRect(0, 0, this->width - 1, this->height - 1, 0xB2);
   896 			if (w->widget[4].left != w->widget[4].right) {
   914 		GfxFillRect(0, 0, this->width - 1, this->height - 1, 0xB4 | (1 << PALETTE_MODIFIER_GREYOUT));
   897 				DrawStringCenteredTruncated(w->widget[4].left + 1, w->widget[4].right - 1,  1, STR_0221_OPENTTD, TC_FROMSTRING);
   915 
   898 				DrawStringCenteredTruncated(w->widget[4].left + 1, w->widget[4].right - 1, 11, STR_0222_SCENARIO_EDITOR, TC_FROMSTRING);
   916 		this->DrawWidgets();
       
   917 
       
   918 		SetDParam(0, ConvertYMDToDate(_patches_newgame.starting_year, 0, 1));
       
   919 		DrawStringCenteredTruncated(this->widget[6].right, this->widget[7].left, 6, STR_00AF, TC_FROMSTRING);
       
   920 
       
   921 		/* We hide this panel when the toolbar space gets too small */
       
   922 		if (this->widget[4].left != this->widget[4].right) {
       
   923 			DrawStringCenteredTruncated(this->widget[4].left + 1, this->widget[4].right - 1,  1, STR_0221_OPENTTD, TC_FROMSTRING);
       
   924 			DrawStringCenteredTruncated(this->widget[4].left + 1, this->widget[4].right - 1, 11, STR_0222_SCENARIO_EDITOR, TC_FROMSTRING);
       
   925 		}
       
   926 	}
       
   927 
       
   928 	virtual void OnClick(Point pt, int widget)
       
   929 	{
       
   930 		if (_game_mode == GM_MENU) return;
       
   931 		_scen_toolbar_button_procs[widget](this);
       
   932 	}
       
   933 
       
   934 	virtual EventState OnKeyPress(uint16 key, uint16 keycode)
       
   935 	{
       
   936 		switch (keycode) {
       
   937 			case WKC_F1: case WKC_PAUSE: ToolbarPauseClick(this); break;
       
   938 			case WKC_F2: ShowGameOptions(); break;
       
   939 			case WKC_F3: MenuClickSaveLoad(0); break;
       
   940 			case WKC_F4: ToolbarScenGenLand(this); break;
       
   941 			case WKC_F5: ToolbarScenGenTown(this); break;
       
   942 			case WKC_F6: ToolbarScenGenIndustry(this); break;
       
   943 			case WKC_F7: ToolbarScenBuildRoad(this); break;
       
   944 			case WKC_F8: ToolbarScenPlantTrees(this); break;
       
   945 			case WKC_F9: ToolbarScenPlaceSign(this); break;
       
   946 			case WKC_F10: ShowMusicWindow(); break;
       
   947 			case WKC_F11: PlaceLandBlockInfo(); break;
       
   948 			case WKC_CTRL | 'S': MenuClickSmallScreenshot(); break;
       
   949 			case WKC_CTRL | 'G': MenuClickWorldScreenshot(); break;
       
   950 
       
   951 			/* those following are all fall through */
       
   952 			case WKC_NUM_PLUS:
       
   953 			case WKC_EQUALS:
       
   954 			case WKC_SHIFT | WKC_EQUALS:
       
   955 			case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(this); break;
       
   956 
       
   957 			/* those following are all fall through */
       
   958 			case WKC_NUM_MINUS:
       
   959 			case WKC_MINUS:
       
   960 			case WKC_SHIFT | WKC_MINUS:
       
   961 			case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(this); break;
       
   962 
       
   963 			case 'L': ShowEditorTerraformToolbar(); break;
       
   964 			case 'M': ShowSmallMap(); break;
       
   965 			case 'V': ShowExtraViewPortWindow(); break;
       
   966 			default: return ES_NOT_HANDLED;
       
   967 		}
       
   968 		return ES_HANDLED;
       
   969 	}
       
   970 
       
   971 	virtual void OnPlaceObject(Point pt, TileIndex tile)
       
   972 	{
       
   973 		_place_proc(tile);
       
   974 	}
       
   975 
       
   976 	virtual void OnPlaceObjectAbort()
       
   977 	{
       
   978 		this->RaiseWidget(25);
       
   979 		this->SetDirty();
       
   980 	}
       
   981 
       
   982 	virtual void OnResize(Point new_size, Point delta)
       
   983 	{
       
   984 		/* There are 15 buttons plus some spacings if the space allows it.
       
   985 		 * Furthermore there are two panels of which one is non - essential
       
   986 		 * and that one can be removed is the space is too small. */
       
   987 		uint buttons_width;
       
   988 		uint spacing;
       
   989 
       
   990 		static int normal_min_width = (15 * 22) + (2 * 130);
       
   991 		static int one_less_panel_min_width = (15 * 22) + 130;
       
   992 
       
   993 		if (this->width >= one_less_panel_min_width) {
       
   994 			buttons_width = 15 * 22;
       
   995 			spacing = this->width - ((this->width >= normal_min_width) ? normal_min_width : one_less_panel_min_width);
       
   996 		} else {
       
   997 			buttons_width = this->width - 130;
       
   998 			spacing = 0;
       
   999 		}
       
  1000 		uint extra_spacing_at[] = { 3, 4, 7, 8, 10, 16, 0 };
       
  1001 
       
  1002 		/* Yes, it defines about 27 widgets for this toolbar */
       
  1003 		for (uint i = 0, x = 0, j = 0, b = 0; i < 27; i++) {
       
  1004 			switch (i) {
       
  1005 				case 4:
       
  1006 					this->widget[i].left = x;
       
  1007 					if (this->width < normal_min_width) {
       
  1008 						this->widget[i].right = x;
       
  1009 						j++;
       
  1010 						continue;
       
  1011 					}
       
  1012 
       
  1013 					x += 130;
       
  1014 					this->widget[i].right = x - 1;
       
  1015 					break;
       
  1016 
       
  1017 				case 5: {
       
  1018 					int offset = x - this->widget[i].left;
       
  1019 					this->widget[i + 1].left  += offset;
       
  1020 					this->widget[i + 1].right += offset;
       
  1021 					this->widget[i + 2].left  += offset;
       
  1022 					this->widget[i + 2].right += offset;
       
  1023 					this->widget[i].left = x;
       
  1024 					x += 130;
       
  1025 					this->widget[i].right = x - 1;
       
  1026 					i += 2;
       
  1027 				} break;
       
  1028 
       
  1029 				default:
       
  1030 					if (this->widget[i].bottom == 0) continue;
       
  1031 
       
  1032 					this->widget[i].left = x;
       
  1033 					x += buttons_width / (15 - b);
       
  1034 					this->widget[i].right = x - 1;
       
  1035 					buttons_width -= buttons_width / (15 - b);
       
  1036 					b++;
       
  1037 					break;
   899 			}
  1038 			}
   900 
  1039 
   901 			break;
  1040 			if (extra_spacing_at[j] == i) {
   902 
  1041 				j++;
   903 		case WE_CLICK:
  1042 				uint add = spacing / (lengthof(extra_spacing_at) - j);
   904 			if (_game_mode == GM_MENU) return;
  1043 				spacing -= add;
   905 			_scen_toolbar_button_procs[e->we.click.widget](w);
  1044 				x += add;
   906 			break;
       
   907 
       
   908 		case WE_KEYPRESS:
       
   909 			switch (e->we.keypress.keycode) {
       
   910 				case WKC_F1: case WKC_PAUSE: ToolbarPauseClick(w); break;
       
   911 				case WKC_F2: ShowGameOptions(); break;
       
   912 				case WKC_F3: MenuClickSaveLoad(0); break;
       
   913 				case WKC_F4: ToolbarScenGenLand(w); break;
       
   914 				case WKC_F5: ToolbarScenGenTown(w); break;
       
   915 				case WKC_F6: ToolbarScenGenIndustry(w); break;
       
   916 				case WKC_F7: ToolbarScenBuildRoad(w); break;
       
   917 				case WKC_F8: ToolbarScenPlantTrees(w); break;
       
   918 				case WKC_F9: ToolbarScenPlaceSign(w); break;
       
   919 				case WKC_F10: ShowMusicWindow(); break;
       
   920 				case WKC_F11: PlaceLandBlockInfo(); break;
       
   921 				case WKC_CTRL | 'S': MenuClickSmallScreenshot(); break;
       
   922 				case WKC_CTRL | 'G': MenuClickWorldScreenshot(); break;
       
   923 
       
   924 				/* those following are all fall through */
       
   925 				case WKC_NUM_PLUS:
       
   926 				case WKC_EQUALS:
       
   927 				case WKC_SHIFT | WKC_EQUALS:
       
   928 				case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(w); break;
       
   929 
       
   930 				/* those following are all fall through */
       
   931 				case WKC_NUM_MINUS:
       
   932 				case WKC_MINUS:
       
   933 				case WKC_SHIFT | WKC_MINUS:
       
   934 				case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(w); break;
       
   935 
       
   936 				case 'L': ShowEditorTerraformToolbar(); break;
       
   937 				case 'M': ShowSmallMap(); break;
       
   938 				case 'V': ShowExtraViewPortWindow(); break;
       
   939 				default: return;
       
   940 			}
  1045 			}
   941 			e->we.keypress.cont = false;
  1046 		}
   942 			break;
  1047 	}
   943 
  1048 
   944 		case WE_PLACE_OBJ:
  1049 	virtual void OnTick()
   945 			_place_proc(e->we.place.tile);
  1050 	{
   946 			break;
  1051 		if (this->IsWidgetLowered(0) != !!_pause_game) {
   947 
  1052 			this->ToggleWidgetLoweredState(0);
   948 		case WE_ABORT_PLACE_OBJ:
  1053 			this->SetDirty();
   949 			w->RaiseWidget(25);
  1054 		}
   950 			w->SetDirty();
  1055 
   951 			break;
  1056 		if (this->IsWidgetLowered(1) != !!_fast_forward) {
   952 
  1057 			this->ToggleWidgetLoweredState(1);
   953 		case WE_RESIZE: {
  1058 			this->SetDirty();
   954 			/* There are 15 buttons plus some spacings if the space allows it.
  1059 		}
   955 			* Furthermore there are two panels of which one is non - essential
  1060 	}
   956 			* and that one can be removed is the space is too small. */
  1061 
   957 			uint buttons_width;
  1062 	virtual void OnInvalidateData(int data)
   958 			uint spacing;
  1063 	{
   959 
  1064 		if (FindWindowById(WC_MAIN_WINDOW, 0) != NULL) HandleZoomMessage(this, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, 17, 18);
   960 			static int normal_min_width = (15 * 22) + (2 * 130);
  1065 	}
   961 			static int one_less_panel_min_width = (15 * 22) + 130;
  1066 };
   962 
       
   963 			if (w->width >= one_less_panel_min_width) {
       
   964 				buttons_width = 15 * 22;
       
   965 				spacing = w->width - ((w->width >= normal_min_width) ? normal_min_width : one_less_panel_min_width);
       
   966 			} else {
       
   967 				buttons_width = w->width - 130;
       
   968 				spacing = 0;
       
   969 			}
       
   970 			uint extra_spacing_at[] = { 3, 4, 7, 8, 10, 16, 0 };
       
   971 
       
   972 			/* Yes, it defines about 27 widgets for this toolbar */
       
   973 			for (uint i = 0, x = 0, j = 0, b = 0; i < 27; i++) {
       
   974 				switch (i) {
       
   975 					case 4:
       
   976 						w->widget[i].left = x;
       
   977 						if (w->width < normal_min_width) {
       
   978 							w->widget[i].right = x;
       
   979 							j++;
       
   980 							continue;
       
   981 						}
       
   982 
       
   983 						x += 130;
       
   984 						w->widget[i].right = x - 1;
       
   985 						break;
       
   986 
       
   987 					case 5: {
       
   988 						int offset = x - w->widget[i].left;
       
   989 						w->widget[i + 1].left  += offset;
       
   990 						w->widget[i + 1].right += offset;
       
   991 						w->widget[i + 2].left  += offset;
       
   992 						w->widget[i + 2].right += offset;
       
   993 						w->widget[i].left = x;
       
   994 						x += 130;
       
   995 						w->widget[i].right = x - 1;
       
   996 						i += 2;
       
   997 					} break;
       
   998 
       
   999 					default:
       
  1000 						if (w->widget[i].bottom == 0) continue;
       
  1001 
       
  1002 						w->widget[i].left = x;
       
  1003 						x += buttons_width / (15 - b);
       
  1004 						w->widget[i].right = x - 1;
       
  1005 						buttons_width -= buttons_width / (15 - b);
       
  1006 						b++;
       
  1007 						break;
       
  1008 				}
       
  1009 
       
  1010 				if (extra_spacing_at[j] == i) {
       
  1011 					j++;
       
  1012 					uint add = spacing / (lengthof(extra_spacing_at) - j);
       
  1013 					spacing -= add;
       
  1014 					x += add;
       
  1015 				}
       
  1016 			}
       
  1017 		} break;
       
  1018 
       
  1019 		case WE_TICK:
       
  1020 			if (w->IsWidgetLowered(0) != !!_pause_game) {
       
  1021 				w->ToggleWidgetLoweredState(0);
       
  1022 				w->SetDirty();
       
  1023 			}
       
  1024 
       
  1025 			if (w->IsWidgetLowered(1) != !!_fast_forward) {
       
  1026 				w->ToggleWidgetLoweredState(1);
       
  1027 				w->SetDirty();
       
  1028 			}
       
  1029 			break;
       
  1030 
       
  1031 		case WE_INVALIDATE_DATA:
       
  1032 			HandleZoomMessage(w, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, 9, 10);
       
  1033 			break;
       
  1034 	}
       
  1035 }
       
  1036 
  1067 
  1037 static const Widget _toolb_scen_widgets[] = {
  1068 static const Widget _toolb_scen_widgets[] = {
  1038 {  WWT_IMGBTN, RESIZE_LEFT, 14,   0,   0,  0, 21, SPR_IMG_PAUSE,       STR_0171_PAUSE_GAME},
  1069 {  WWT_IMGBTN, RESIZE_LEFT, 14,   0,   0,  0, 21, SPR_IMG_PAUSE,       STR_0171_PAUSE_GAME},
  1039 {  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_FASTFORWARD, STR_FAST_FORWARD},
  1070 {  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_FASTFORWARD, STR_FAST_FORWARD},
  1040 {  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_SETTINGS,    STR_0187_OPTIONS},
  1071 {  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_SETTINGS,    STR_0187_OPTIONS},
  1074 static const WindowDesc _toolb_scen_desc = {
  1105 static const WindowDesc _toolb_scen_desc = {
  1075 	0, 0, 130, 22, 640, 22,
  1106 	0, 0, 130, 22, 640, 22,
  1076 	WC_MAIN_TOOLBAR, WC_NONE,
  1107 	WC_MAIN_TOOLBAR, WC_NONE,
  1077 	WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
  1108 	WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
  1078 	_toolb_scen_widgets,
  1109 	_toolb_scen_widgets,
  1079 	ScenEditToolbarWndProc
  1110 	NULL
  1080 };
  1111 };
  1081 
  1112 
  1082 /* --- Rendering/handling the drop down menus --- */
  1113 /* --- Rendering/handling the drop down menus --- */
  1083 
  1114 
  1084 typedef void MenuClickedProc(int index);
  1115 typedef void MenuClickedProc(int index);
  1430 void AllocateToolbar()
  1461 void AllocateToolbar()
  1431 {
  1462 {
  1432 	/* Clean old GUI values; railtype is (re)set by rail_gui.cpp */
  1463 	/* Clean old GUI values; railtype is (re)set by rail_gui.cpp */
  1433 	_last_built_roadtype = ROADTYPE_ROAD;
  1464 	_last_built_roadtype = ROADTYPE_ROAD;
  1434 
  1465 
  1435 	Window *w = new Window((_game_mode != GM_EDITOR) ? &_toolb_normal_desc : &_toolb_scen_desc);
  1466 	if (_game_mode == GM_EDITOR) {
  1436 	assert(w != NULL);
  1467 		new ScenarioEditorToolbarWindow(&_toolb_scen_desc);;
  1437 
  1468 	} else {
  1438 	CLRBITS(w->flags4, WF_WHITE_BORDER_MASK);
  1469 		new MainToolbarWindow(&_toolb_normal_desc);
  1439 
  1470 	}
  1440 	w->SetWidgetDisabledState(0, _networking && !_network_server); // if not server, disable pause button
  1471 }
  1441 	w->SetWidgetDisabledState(1, _networking); // if networking, disable fast-forward button
       
  1442 
       
  1443 	/* 'w' is for sure a WC_MAIN_TOOLBAR */
       
  1444 	PositionMainToolbar(w);
       
  1445 	DoZoomInOutWindow(ZOOM_NONE, w);
       
  1446 }