102 return DropDownListStringItem::Width() + this->checkmark_width;
105 void Draw(
int left,
int right,
int top,
int bottom,
bool sel,
int bg_colour)
const
130 bool Selectable()
const
143 uint Height(uint width)
const
148 void Draw(
int left,
int right,
int top,
int bottom,
bool sel,
int bg_colour)
const
156 int icon_offset = (bottom - top - icon_size.height) / 2;
167 col = sel ? TC_WHITE : TC_BLACK;
196 for (
int i = 0; i < count; i++) {
219 #ifdef ENABLE_NETWORK
226 if (include_spectator) {
258 return CBF_PLACE_SIGN;
282 _fast_forward ^=
true;
297 OME_SHOW_STATIONNAMES,
298 OME_SHOW_WAYPOINTNAMES,
300 OME_SHOW_COMPETITOR_SIGNS,
303 OME_TRANSPARENTBUILDINGS,
304 OME_SHOW_STATIONSIGNS,
359 case OME_SHOW_COMPETITOR_SIGNS:
376 SLEME_SAVE_SCENARIO = 0,
378 SLEME_SAVE_HEIGHTMAP,
379 SLEME_LOAD_HEIGHTMAP,
428 if (_game_mode == GM_EDITOR) {
434 case SLEME_EXIT_TOINTRO: AskExitToGameMenu();
break;
435 case SLEME_EXIT_GAME: HandleExitGameRequest();
break;
441 case SLNME_EXIT_TOINTRO: AskExitToGameMenu();
break;
442 case SLNME_EXIT_GAME: HandleExitGameRequest();
break;
450 enum MapMenuEntries {
451 MME_SHOW_SMALLMAP = 0,
452 MME_SHOW_EXTRAVIEWPORTS,
455 MME_SHOW_TOWNDIRECTORY,
456 MME_SHOW_INDUSTRYDIRECTORY,
495 case MME_SHOW_TOWNDIRECTORY: ShowTownDirectory();
break;
496 case MME_SHOW_INDUSTRYDIRECTORY: ShowIndustryDirectory();
break;
518 case 0: ShowTownDirectory();
break;
543 case 0: ShowSubsidiesList();
break;
604 #ifdef ENABLE_NETWORK
691 case 0: ShowOperatingProfitGraph();
break;
692 case 1: ShowIncomeGraph();
break;
693 case 2: ShowDeliveredCargoGraph();
break;
694 case 3: ShowPerformanceHistoryGraph();
break;
695 case 4: ShowCompanyValueGraph();
break;
696 case 5: ShowCargoPaymentRates();
break;
698 case 6: ShowCompanyLeagueTable();
break;
699 case 7: ShowPerformanceRatingDetail();
break;
721 case 0: ShowCompanyLeagueTable();
break;
722 case 1: ShowPerformanceRatingDetail();
break;
746 case 0: ShowIndustryDirectory();
break;
748 case 2: ShowBuildIndustryWindow();
break;
884 _last_built_railtype = (
RailType)index;
901 FOR_ALL_ENGINES_OF_TYPE(e,
VEH_ROAD) {
921 _last_built_roadtype = (
RoadType)index;
984 case 1: ShowBuildTreesToolbar();
break;
985 case 2:
return SelectSignTool();
1042 return CBF_PLACE_LANDINFO;
1052 static void MenuClickSmallScreenshot()
1076 if ((uint64)vp.
width * (uint64)vp.
height > 8192 * 8192) {
1097 extern bool _draw_bounding_boxes;
1100 _draw_bounding_boxes = !_draw_bounding_boxes;
1114 extern bool _draw_dirty_blocks;
1117 _draw_dirty_blocks = !_draw_dirty_blocks;
1143 case 0:
return PlaceLandBlockInfo();
1146 case 4: MenuClickSmallScreenshot();
break;
1150 case 8: ShowAboutWindow();
break;
1162 if (_toolbar_mode != TB_LOWER) {
1163 _toolbar_mode = TB_LOWER;
1165 _toolbar_mode = TB_UPPER;
1227 ShowFoundTownWindow();
1235 ShowBuildIndustryWindow();
1259 ShowBuildTreesToolbar();
1267 return SelectSignTool();
1277 static MenuClickedProc *
const _menu_clicked_procs[] = {
1342 for (
NWidgetBase *child_wid = this->
head; child_wid != NULL; child_wid = child_wid->
next) {
1343 child_wid->SetupSmallestSize(w, init_array);
1344 this->
smallest_y =
max(this->
smallest_y, child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom);
1345 if (this->
IsButton(child_wid->type)) {
1347 this->
smallest_x =
max(this->
smallest_x, child_wid->smallest_x + child_wid->padding_left + child_wid->padding_right);
1354 for (
NWidgetBase *child_wid = this->
head; child_wid != NULL; child_wid = child_wid->
next) {
1356 if (!this->
IsButton(child_wid->type)) {
1357 child_wid->current_x = child_wid->smallest_x;
1374 uint arrangable_count, button_count, spacer_count;
1375 const byte *arrangement =
GetButtonArrangement(given_width, arrangable_count, button_count, spacer_count);
1376 for (uint i = 0; i < arrangable_count; i++) {
1377 this->
visible[arrangement[i]] =
true;
1382 for (
NWidgetBase *child_wid = this->
head; child_wid != NULL; child_wid = child_wid->
next) {
1384 widgets[((
NWidgetCore*)child_wid)->index] = child_wid;
1389 uint spacer_space =
max(0, (
int)given_width - (
int)(button_count * this->
smallest_x));
1390 uint button_space = given_width - spacer_space;
1395 const byte *cur_wid = rtl ? &arrangement[arrangable_count - 1] : arrangement;
1396 for (uint i = 0; i < arrangable_count; i++) {
1399 if (spacer_space != 0) {
1401 if (possible_spacer != NULL && possible_spacer->
type ==
NWID_SPACER) {
1402 uint add = spacer_space / (spacer_count - spacer_i);
1404 spacer_space -= add;
1411 child_wid->
current_x = button_space / (button_count - button_i);
1433 for (
NWidgetBase *child_wid = rtl ? this->
tail : this->
head; child_wid != NULL; child_wid = rtl ? child_wid->
prev : child_wid->
next) {
1445 for (
NWidgetBase *child_wid = this->
head; child_wid != NULL; child_wid = child_wid->
next) {
1450 if (nwid != NULL)
return nwid;
1463 virtual const byte *
GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count)
const = 0;
1468 const byte *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count)
const
1470 static const uint SMALLEST_ARRANGEMENT = 14;
1471 static const uint BIGGEST_ARRANGEMENT = 20;
1472 static const byte arrange14[] = {
1473 0, 1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 29,
1474 2, 3, 4, 5, 6, 7, 8, 9, 12, 14, 26, 27, 28, 29,
1476 static const byte arrange15[] = {
1477 0, 1, 4, 15, 16, 17, 18, 21, 22, 23, 24, 25, 19, 20, 29,
1478 0, 2, 4, 3, 5, 6, 7, 8, 9, 12, 14, 26, 27, 28, 29,
1480 static const byte arrange16[] = {
1481 0, 1, 2, 4, 15, 16, 17, 18, 21, 22, 23, 24, 25, 19, 20, 29,
1482 0, 1, 3, 5, 6, 7, 8, 9, 12, 14, 26, 27, 28, 19, 20, 29,
1484 static const byte arrange17[] = {
1485 0, 1, 2, 4, 6, 15, 16, 17, 18, 21, 22, 23, 24, 25, 19, 20, 29,
1486 0, 1, 3, 4, 6, 5, 7, 8, 9, 12, 14, 26, 27, 28, 19, 20, 29,
1488 static const byte arrange18[] = {
1489 0, 1, 2, 4, 5, 6, 7, 8, 9, 14, 21, 22, 23, 24, 25, 19, 20, 29,
1490 0, 1, 3, 4, 5, 6, 7, 12, 15, 16, 17, 18, 26, 27, 28, 19, 20, 29,
1492 static const byte arrange19[] = {
1493 0, 1, 2, 4, 5, 6, 15, 16, 17, 18, 21, 22, 23, 24, 25, 26, 19, 20, 29,
1494 0, 1, 3, 4, 7, 8, 9, 12, 14, 27, 21, 22, 23, 24, 25, 28, 19, 20, 29,
1496 static const byte arrange20[] = {
1497 0, 1, 2, 4, 5, 6, 15, 16, 17, 18, 21, 22, 23, 24, 25, 26, 11, 19, 20, 29,
1498 0, 1, 3, 4, 7, 8, 9, 12, 14, 27, 21, 22, 23, 24, 25, 10, 28, 19, 20, 29,
1500 static const byte arrange_all[] = {
1501 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28
1506 if (full_buttons > BIGGEST_ARRANGEMENT) {
1507 button_count = arrangable_count =
lengthof(arrange_all);
1513 static const byte *
const arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19, arrange20 };
1515 button_count = arrangable_count = full_buttons;
1517 return arrangements[full_buttons - SMALLEST_ARRANGEMENT] + ((_toolbar_mode == TB_LOWER) ? full_buttons : 0);
1525 void SetupSmallestSize(
Window *w,
bool init_array)
1531 for (
NWidgetBase *child_wid = this->
head; child_wid != NULL; child_wid = child_wid->
next) {
1532 if (child_wid->type ==
NWID_SPACER || this->IsButton(child_wid->type))
continue;
1540 const byte *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count)
const
1542 static const byte arrange_all[] = {
1543 0, 1, 2, 3, 4, 18, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 26, 28,
1545 static const byte arrange_nopanel[] = {
1546 0, 1, 2, 3, 18, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 26, 28,
1548 static const byte arrange_switch[] = {
1549 18, 8, 11, 12, 13, 14, 15, 16, 17, 29,
1550 0, 1, 2, 3, 18, 9, 10, 26, 28, 29,
1555 if (width >= min_full_width) {
1557 arrangable_count =
lengthof(arrange_all);
1558 button_count = arrangable_count - 2;
1565 if (width > min_small_width) {
1567 arrangable_count =
lengthof(arrange_nopanel);
1568 button_count = arrangable_count - 1;
1569 spacer_count = this->
spacers - 1;
1570 return arrange_nopanel;
1575 arrangable_count =
lengthof(arrange_switch) / 2;
1576 button_count = arrangable_count - 1;
1578 return arrange_switch + ((_toolbar_mode == TB_LOWER) ? arrangable_count : 0);
1586 static ToolbarButtonProc *
const _toolbar_button_procs[] = {
1593 ToolbarSubsidiesClick,
1594 ToolbarStationsClick,
1595 ToolbarFinancesClick,
1596 ToolbarCompaniesClick,
1601 ToolbarIndustryClick,
1607 ToolbarZoomOutClick,
1608 ToolbarBuildRailClick,
1609 ToolbarBuildRoadClick,
1610 ToolbarBuildWaterClick,
1611 ToolbarBuildAirClick,
1614 ToolbarNewspaperClick,
1619 enum MainToolbarHotkeys {
1649 MTHK_SMALL_SCREENSHOT,
1650 MTHK_ZOOMEDIN_SCREENSHOT,
1651 MTHK_DEFAULTZOOM_SCREENSHOT,
1652 MTHK_GIANT_SCREENSHOT,
1655 MTHK_EXTRA_VIEWPORT,
1699 if (_game_mode != GM_MENU && !this->
IsWidgetDisabled(widget)) _toolbar_button_procs[widget](
this);
1711 case MTHK_PAUSE: ToolbarPauseClick(
this);
break;
1717 case MTHK_TOWNDIRECTORY: ShowTownDirectory();
break;
1718 case MTHK_SUBSIDIES: ShowSubsidiesList();
break;
1724 case MTHK_GRAPHS: ShowOperatingProfitGraph();
break;
1725 case MTHK_LEAGUE: ShowCompanyLeagueTable();
break;
1726 case MTHK_INDUSTRIES: ShowBuildIndustryWindow();
break;
1731 case MTHK_ZOOM_IN: ToolbarZoomInClick(
this);
break;
1732 case MTHK_ZOOM_OUT: ToolbarZoomOutClick(
this);
break;
1737 case MTHK_BUILD_TREES: ShowBuildTreesToolbar();
break;
1738 case MTHK_MUSIC: ShowMusicWindow();
break;
1740 case MTHK_SMALL_SCREENSHOT: MenuClickSmallScreenshot();
break;
1747 #ifdef ENABLE_NETWORK
1748 case MTHK_CLIENT_LIST:
if (
_networking) ShowClientList();
break;
1759 case CBF_PLACE_SIGN:
1763 case CBF_PLACE_LANDINFO:
1767 default: NOT_REACHED();
1808 if (!gui_scope)
return;
1815 const uint16 _maintoolbar_pause_keys[] = {WKC_F1, WKC_PAUSE, 0};
1816 const uint16 _maintoolbar_zoomin_keys[] = {WKC_NUM_PLUS,
WKC_EQUALS, WKC_SHIFT |
WKC_EQUALS, WKC_SHIFT | WKC_F5, 0};
1817 const uint16 _maintoolbar_zoomout_keys[] = {WKC_NUM_MINUS,
WKC_MINUS, WKC_SHIFT |
WKC_MINUS, WKC_SHIFT | WKC_F6, 0};
1818 const uint16 _maintoolbar_smallmap_keys[] = {WKC_F4,
'M', 0};
1820 static Hotkey maintoolbar_hotkeys[] = {
1821 Hotkey(_maintoolbar_pause_keys,
"pause", MTHK_PAUSE),
1822 Hotkey((uint16)0,
"fastforward", MTHK_FASTFORWARD),
1823 Hotkey(WKC_F2,
"settings", MTHK_SETTINGS),
1824 Hotkey(WKC_F3,
"saveload", MTHK_SAVEGAME),
1825 Hotkey((uint16)0,
"load_game", MTHK_LOADGAME),
1826 Hotkey(_maintoolbar_smallmap_keys,
"smallmap", MTHK_SMALLMAP),
1827 Hotkey(WKC_F5,
"town_list", MTHK_TOWNDIRECTORY),
1828 Hotkey(WKC_F6,
"subsidies", MTHK_SUBSIDIES),
1829 Hotkey(WKC_F7,
"station_list", MTHK_STATIONS),
1830 Hotkey(WKC_F8,
"finances", MTHK_FINANCES),
1831 Hotkey(WKC_F9,
"companies", MTHK_COMPANIES),
1832 Hotkey((uint16)0,
"story_book", MTHK_STORY),
1833 Hotkey((uint16)0,
"goal_list", MTHK_GOAL),
1834 Hotkey(WKC_F10,
"graphs", MTHK_GRAPHS),
1835 Hotkey(WKC_F11,
"league", MTHK_LEAGUE),
1836 Hotkey(WKC_F12,
"industry_list", MTHK_INDUSTRIES),
1837 Hotkey(WKC_SHIFT | WKC_F1,
"train_list", MTHK_TRAIN_LIST),
1838 Hotkey(WKC_SHIFT | WKC_F2,
"roadveh_list", MTHK_ROADVEH_LIST),
1839 Hotkey(WKC_SHIFT | WKC_F3,
"ship_list", MTHK_SHIP_LIST),
1840 Hotkey(WKC_SHIFT | WKC_F4,
"aircraft_list", MTHK_AIRCRAFT_LIST),
1841 Hotkey(_maintoolbar_zoomin_keys,
"zoomin", MTHK_ZOOM_IN),
1842 Hotkey(_maintoolbar_zoomout_keys,
"zoomout", MTHK_ZOOM_OUT),
1843 Hotkey(WKC_SHIFT | WKC_F7,
"build_rail", MTHK_BUILD_RAIL),
1844 Hotkey(WKC_SHIFT | WKC_F8,
"build_road", MTHK_BUILD_ROAD),
1845 Hotkey(WKC_SHIFT | WKC_F9,
"build_docks", MTHK_BUILD_DOCKS),
1846 Hotkey(WKC_SHIFT | WKC_F10,
"build_airport", MTHK_BUILD_AIRPORT),
1847 Hotkey(WKC_SHIFT | WKC_F11,
"build_trees", MTHK_BUILD_TREES),
1848 Hotkey(WKC_SHIFT | WKC_F12,
"music", MTHK_MUSIC),
1849 Hotkey((uint16)0,
"ai_debug", MTHK_AI_DEBUG),
1850 Hotkey(WKC_CTRL |
'S',
"small_screenshot", MTHK_SMALL_SCREENSHOT),
1851 Hotkey(WKC_CTRL |
'P',
"zoomedin_screenshot", MTHK_ZOOMEDIN_SCREENSHOT),
1852 Hotkey(WKC_CTRL |
'D',
"defaultzoom_screenshot", MTHK_DEFAULTZOOM_SCREENSHOT),
1853 Hotkey((uint16)0,
"giant_screenshot", MTHK_GIANT_SCREENSHOT),
1854 Hotkey(WKC_CTRL | WKC_ALT |
'C',
"cheats", MTHK_CHEATS),
1855 Hotkey(
'L',
"terraform", MTHK_TERRAFORM),
1856 Hotkey(
'V',
"extra_viewport", MTHK_EXTRA_VIEWPORT),
1857 #ifdef ENABLE_NETWORK
1858 Hotkey((uint16)0,
"client_list", MTHK_CLIENT_LIST),
1860 Hotkey((uint16)0,
"sign_list", MTHK_SIGN_LIST),
1863 HotkeyList MainToolbarWindow::hotkeys(
"maintoolbar", maintoolbar_hotkeys);
1868 static const SpriteID toolbar_button_sprites[] = {
1870 SPR_IMG_FASTFORWARD,
1876 SPR_IMG_COMPANY_LIST,
1877 SPR_IMG_COMPANY_FINANCE,
1878 SPR_IMG_COMPANY_GENERAL,
1882 SPR_IMG_COMPANY_LEAGUE,
1887 SPR_IMG_AIRPLANESLIST,
1894 SPR_IMG_LANDSCAPING,
1898 SPR_IMG_SWITCH_TOOLBAR,
1904 case 4:
case 8:
case 15:
case 19:
case 21:
case 26: hor->
Add(
new NWidgetSpacer(0, 0));
break;
1913 static const NWidgetPart _nested_toolbar_normal_widgets[] = {
1921 _nested_toolbar_normal_widgets,
lengthof(_nested_toolbar_normal_widgets),
1922 &MainToolbarWindow::hotkeys
1928 static ToolbarButtonProc *
const _scen_toolbar_button_procs[] = {
1935 ToolbarScenDateBackward,
1936 ToolbarScenDateForward,
1937 ToolbarScenMapTownDir,
1939 ToolbarZoomOutClick,
1942 ToolbarScenGenIndustry,
1943 ToolbarScenBuildRoad,
1944 ToolbarScenBuildDocks,
1945 ToolbarScenPlantTrees,
1946 ToolbarScenPlaceSign,
1961 enum MainToolbarEditorHotkeys {
1975 MTEHK_SMALL_SCREENSHOT,
1976 MTEHK_ZOOMEDIN_SCREENSHOT,
1977 MTEHK_DEFAULTZOOM_SCREENSHOT,
1978 MTEHK_GIANT_SCREENSHOT,
1983 MTEHK_EXTRA_VIEWPORT,
2019 int height = r.bottom - r.top;
2022 DrawString(r.left, r.right, (height + 1) / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING,
SA_HOR_CENTER);
2048 if (_game_mode == GM_MENU)
return;
2067 case MTEHK_PAUSE: ToolbarPauseClick(
this);
break;
2071 case MTEHK_GENLAND: ToolbarScenGenLand(
this);
break;
2072 case MTEHK_GENTOWN: ToolbarScenGenTown(
this);
break;
2073 case MTEHK_GENINDUSTRY: ToolbarScenGenIndustry(
this);
break;
2074 case MTEHK_BUILD_ROAD: ToolbarScenBuildRoad(
this);
break;
2075 case MTEHK_BUILD_DOCKS: ToolbarScenBuildDocks(
this);
break;
2076 case MTEHK_BUILD_TREES: ToolbarScenPlantTrees(
this);
break;
2077 case MTEHK_SIGN: cbf = ToolbarScenPlaceSign(
this);
break;
2078 case MTEHK_MUSIC: ShowMusicWindow();
break;
2079 case MTEHK_LANDINFO: cbf = PlaceLandBlockInfo();
break;
2080 case MTEHK_SMALL_SCREENSHOT: MenuClickSmallScreenshot();
break;
2084 case MTEHK_ZOOM_IN: ToolbarZoomInClick(
this);
break;
2085 case MTEHK_ZOOM_OUT: ToolbarZoomOutClick(
this);
break;
2098 case CBF_PLACE_SIGN:
2102 case CBF_PLACE_LANDINFO:
2106 default: NOT_REACHED();
2142 if (!gui_scope)
return;
2149 if (str == NULL)
return;
2166 static Hotkey scenedit_maintoolbar_hotkeys[] = {
2167 Hotkey(_maintoolbar_pause_keys,
"pause", MTEHK_PAUSE),
2168 Hotkey((uint16)0,
"fastforward", MTEHK_FASTFORWARD),
2169 Hotkey(WKC_F2,
"settings", MTEHK_SETTINGS),
2170 Hotkey(WKC_F3,
"saveload", MTEHK_SAVEGAME),
2171 Hotkey(WKC_F4,
"gen_land", MTEHK_GENLAND),
2172 Hotkey(WKC_F5,
"gen_town", MTEHK_GENTOWN),
2173 Hotkey(WKC_F6,
"gen_industry", MTEHK_GENINDUSTRY),
2174 Hotkey(WKC_F7,
"build_road", MTEHK_BUILD_ROAD),
2175 Hotkey(WKC_F8,
"build_docks", MTEHK_BUILD_DOCKS),
2176 Hotkey(WKC_F9,
"build_trees", MTEHK_BUILD_TREES),
2177 Hotkey(WKC_F10,
"build_sign", MTEHK_SIGN),
2178 Hotkey(WKC_F11,
"music", MTEHK_MUSIC),
2179 Hotkey(WKC_F12,
"land_info", MTEHK_LANDINFO),
2180 Hotkey(WKC_CTRL |
'S',
"small_screenshot", MTEHK_SMALL_SCREENSHOT),
2181 Hotkey(WKC_CTRL |
'P',
"zoomedin_screenshot", MTEHK_ZOOMEDIN_SCREENSHOT),
2182 Hotkey(WKC_CTRL |
'D',
"defaultzoom_screenshot", MTEHK_DEFAULTZOOM_SCREENSHOT),
2183 Hotkey((uint16)0,
"giant_screenshot", MTEHK_GIANT_SCREENSHOT),
2184 Hotkey(_maintoolbar_zoomin_keys,
"zoomin", MTEHK_ZOOM_IN),
2185 Hotkey(_maintoolbar_zoomout_keys,
"zoomout", MTEHK_ZOOM_OUT),
2186 Hotkey(
'L',
"terraform", MTEHK_TERRAFORM),
2187 Hotkey(
'M',
"smallmap", MTEHK_SMALLMAP),
2188 Hotkey(
'V',
"extra_viewport", MTEHK_EXTRA_VIEWPORT),
2191 HotkeyList ScenarioEditorToolbarWindow::hotkeys(
"scenedit_maintoolbar", scenedit_maintoolbar_hotkeys);
2193 static const NWidgetPart _nested_toolb_scen_inner_widgets[] = {
2227 static NWidgetBase *MakeScenarioToolbar(
int *biggest_index)
2232 static const NWidgetPart _nested_toolb_scen_widgets[] = {
2240 _nested_toolb_scen_widgets,
lengthof(_nested_toolb_scen_widgets),
2241 &ScenarioEditorToolbarWindow::hotkeys
2250 if (_game_mode == GM_EDITOR) {