99 return DropDownListStringItem::Width() + this->checkmark_width;
102 void Draw(
int left,
int right,
int top,
int bottom,
bool sel,
int bg_colour)
const
127 bool Selectable()
const
140 uint Height(uint width)
const
145 void Draw(
int left,
int right,
int top,
int bottom,
bool sel,
int bg_colour)
const
153 int icon_offset = (bottom - top - icon_size.height) / 2;
164 col = sel ? TC_WHITE : TC_BLACK;
193 for (
int i = 0; i < count; i++) {
216 #ifdef ENABLE_NETWORK
223 if (include_spectator) {
250 if (_cursor.
sprite == SPR_CURSOR_SIGN) {
255 return CBF_PLACE_SIGN;
279 _fast_forward ^=
true;
294 OME_SHOW_STATIONNAMES,
295 OME_SHOW_WAYPOINTNAMES,
297 OME_SHOW_COMPETITOR_SIGNS,
300 OME_TRANSPARENTBUILDINGS,
301 OME_SHOW_STATIONSIGNS,
356 case OME_SHOW_COMPETITOR_SIGNS:
373 SLEME_SAVE_SCENARIO = 0,
375 SLEME_SAVE_HEIGHTMAP,
376 SLEME_LOAD_HEIGHTMAP,
425 if (_game_mode == GM_EDITOR) {
431 case SLEME_EXIT_TOINTRO: AskExitToGameMenu();
break;
432 case SLEME_EXIT_GAME: HandleExitGameRequest();
break;
438 case SLNME_EXIT_TOINTRO: AskExitToGameMenu();
break;
439 case SLNME_EXIT_GAME: HandleExitGameRequest();
break;
447 enum MapMenuEntries {
448 MME_SHOW_SMALLMAP = 0,
449 MME_SHOW_EXTRAVIEWPORTS,
452 MME_SHOW_TOWNDIRECTORY,
453 MME_SHOW_INDUSTRYDIRECTORY,
492 case MME_SHOW_TOWNDIRECTORY: ShowTownDirectory();
break;
493 case MME_SHOW_INDUSTRYDIRECTORY: ShowIndustryDirectory();
break;
515 case 0: ShowTownDirectory();
break;
540 case 0: ShowSubsidiesList();
break;
601 #ifdef ENABLE_NETWORK
688 case 0: ShowOperatingProfitGraph();
break;
689 case 1: ShowIncomeGraph();
break;
690 case 2: ShowDeliveredCargoGraph();
break;
691 case 3: ShowPerformanceHistoryGraph();
break;
692 case 4: ShowCompanyValueGraph();
break;
693 case 5: ShowCargoPaymentRates();
break;
695 case 6: ShowCompanyLeagueTable();
break;
696 case 7: ShowPerformanceRatingDetail();
break;
718 case 0: ShowCompanyLeagueTable();
break;
719 case 1: ShowPerformanceRatingDetail();
break;
743 case 0: ShowIndustryDirectory();
break;
745 case 2: ShowBuildIndustryWindow();
break;
881 _last_built_railtype = (
RailType)index;
898 FOR_ALL_ENGINES_OF_TYPE(e,
VEH_ROAD) {
918 _last_built_roadtype = (
RoadType)index;
981 case 1: ShowBuildTreesToolbar();
break;
982 case 2:
return SelectSignTool();
1034 if (_cursor.
sprite == SPR_CURSOR_QUERY) {
1039 return CBF_PLACE_LANDINFO;
1049 static void MenuClickSmallScreenshot()
1073 if ((uint64)vp.
width * (uint64)vp.
height > 8192 * 8192) {
1094 extern bool _draw_bounding_boxes;
1097 _draw_bounding_boxes = !_draw_bounding_boxes;
1111 extern bool _draw_dirty_blocks;
1114 _draw_dirty_blocks = !_draw_dirty_blocks;
1140 case 0:
return PlaceLandBlockInfo();
1143 case 4: MenuClickSmallScreenshot();
break;
1147 case 8: ShowAboutWindow();
break;
1159 if (_toolbar_mode != TB_LOWER) {
1160 _toolbar_mode = TB_LOWER;
1162 _toolbar_mode = TB_UPPER;
1224 ShowFoundTownWindow();
1232 ShowBuildIndustryWindow();
1256 ShowBuildTreesToolbar();
1264 return SelectSignTool();
1274 static MenuClickedProc *
const _menu_clicked_procs[] = {
1339 for (
NWidgetBase *child_wid = this->
head; child_wid != NULL; child_wid = child_wid->
next) {
1340 child_wid->SetupSmallestSize(w, init_array);
1341 this->
smallest_y =
max(this->
smallest_y, child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom);
1342 if (this->
IsButton(child_wid->type)) {
1344 this->
smallest_x =
max(this->
smallest_x, child_wid->smallest_x + child_wid->padding_left + child_wid->padding_right);
1351 for (
NWidgetBase *child_wid = this->
head; child_wid != NULL; child_wid = child_wid->
next) {
1353 if (!this->
IsButton(child_wid->type)) {
1354 child_wid->current_x = child_wid->smallest_x;
1371 uint arrangable_count, button_count, spacer_count;
1372 const byte *arrangement =
GetButtonArrangement(given_width, arrangable_count, button_count, spacer_count);
1373 for (uint i = 0; i < arrangable_count; i++) {
1374 this->
visible[arrangement[i]] =
true;
1379 for (
NWidgetBase *child_wid = this->
head; child_wid != NULL; child_wid = child_wid->
next) {
1381 widgets[((
NWidgetCore*)child_wid)->index] = child_wid;
1386 uint spacer_space =
max(0, (
int)given_width - (
int)(button_count * this->
smallest_x));
1387 uint button_space = given_width - spacer_space;
1392 const byte *cur_wid = rtl ? &arrangement[arrangable_count - 1] : arrangement;
1393 for (uint i = 0; i < arrangable_count; i++) {
1396 if (spacer_space != 0) {
1398 if (possible_spacer != NULL && possible_spacer->
type ==
NWID_SPACER) {
1399 uint add = spacer_space / (spacer_count - spacer_i);
1401 spacer_space -= add;
1408 child_wid->
current_x = button_space / (button_count - button_i);
1430 for (
NWidgetBase *child_wid = rtl ? this->
tail : this->
head; child_wid != NULL; child_wid = rtl ? child_wid->
prev : child_wid->
next) {
1442 for (
NWidgetBase *child_wid = this->
head; child_wid != NULL; child_wid = child_wid->
next) {
1447 if (nwid != NULL)
return nwid;
1460 virtual const byte *
GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count)
const = 0;
1465 const byte *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count)
const
1467 static const uint SMALLEST_ARRANGEMENT = 14;
1468 static const uint BIGGEST_ARRANGEMENT = 20;
1469 static const byte arrange14[] = {
1470 0, 1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 29,
1471 2, 3, 4, 5, 6, 7, 8, 9, 12, 14, 26, 27, 28, 29,
1473 static const byte arrange15[] = {
1474 0, 1, 4, 15, 16, 17, 18, 21, 22, 23, 24, 25, 19, 20, 29,
1475 0, 2, 4, 3, 5, 6, 7, 8, 9, 12, 14, 26, 27, 28, 29,
1477 static const byte arrange16[] = {
1478 0, 1, 2, 4, 15, 16, 17, 18, 21, 22, 23, 24, 25, 19, 20, 29,
1479 0, 1, 3, 5, 6, 7, 8, 9, 12, 14, 26, 27, 28, 19, 20, 29,
1481 static const byte arrange17[] = {
1482 0, 1, 2, 4, 6, 15, 16, 17, 18, 21, 22, 23, 24, 25, 19, 20, 29,
1483 0, 1, 3, 4, 6, 5, 7, 8, 9, 12, 14, 26, 27, 28, 19, 20, 29,
1485 static const byte arrange18[] = {
1486 0, 1, 2, 4, 5, 6, 7, 8, 9, 14, 21, 22, 23, 24, 25, 19, 20, 29,
1487 0, 1, 3, 4, 5, 6, 7, 12, 15, 16, 17, 18, 26, 27, 28, 19, 20, 29,
1489 static const byte arrange19[] = {
1490 0, 1, 2, 4, 5, 6, 15, 16, 17, 18, 21, 22, 23, 24, 25, 26, 19, 20, 29,
1491 0, 1, 3, 4, 7, 8, 9, 12, 14, 27, 21, 22, 23, 24, 25, 28, 19, 20, 29,
1493 static const byte arrange20[] = {
1494 0, 1, 2, 4, 5, 6, 15, 16, 17, 18, 21, 22, 23, 24, 25, 26, 11, 19, 20, 29,
1495 0, 1, 3, 4, 7, 8, 9, 12, 14, 27, 21, 22, 23, 24, 25, 10, 28, 19, 20, 29,
1497 static const byte arrange_all[] = {
1498 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
1503 if (full_buttons > BIGGEST_ARRANGEMENT) {
1504 button_count = arrangable_count =
lengthof(arrange_all);
1510 static const byte *
const arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19, arrange20 };
1512 button_count = arrangable_count = full_buttons;
1514 return arrangements[full_buttons - SMALLEST_ARRANGEMENT] + ((_toolbar_mode == TB_LOWER) ? full_buttons : 0);
1522 void SetupSmallestSize(
Window *w,
bool init_array)
1528 for (
NWidgetBase *child_wid = this->
head; child_wid != NULL; child_wid = child_wid->
next) {
1529 if (child_wid->type ==
NWID_SPACER || this->IsButton(child_wid->type))
continue;
1537 const byte *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count)
const
1539 static const byte arrange_all[] = {
1540 0, 1, 2, 3, 4, 18, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 26, 28,
1542 static const byte arrange_nopanel[] = {
1543 0, 1, 2, 3, 18, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 26, 28,
1545 static const byte arrange_switch[] = {
1546 18, 8, 11, 12, 13, 14, 15, 16, 17, 29,
1547 0, 1, 2, 3, 18, 9, 10, 26, 28, 29,
1552 if (width >= min_full_width) {
1554 arrangable_count =
lengthof(arrange_all);
1555 button_count = arrangable_count - 2;
1562 if (width > min_small_width) {
1564 arrangable_count =
lengthof(arrange_nopanel);
1565 button_count = arrangable_count - 1;
1566 spacer_count = this->
spacers - 1;
1567 return arrange_nopanel;
1572 arrangable_count =
lengthof(arrange_switch) / 2;
1573 button_count = arrangable_count - 1;
1575 return arrange_switch + ((_toolbar_mode == TB_LOWER) ? arrangable_count : 0);
1583 static ToolbarButtonProc *
const _toolbar_button_procs[] = {
1590 ToolbarSubsidiesClick,
1591 ToolbarStationsClick,
1592 ToolbarFinancesClick,
1593 ToolbarCompaniesClick,
1598 ToolbarIndustryClick,
1604 ToolbarZoomOutClick,
1605 ToolbarBuildRailClick,
1606 ToolbarBuildRoadClick,
1607 ToolbarBuildWaterClick,
1608 ToolbarBuildAirClick,
1611 ToolbarNewspaperClick,
1616 enum MainToolbarHotkeys {
1646 MTHK_SMALL_SCREENSHOT,
1647 MTHK_ZOOMEDIN_SCREENSHOT,
1648 MTHK_DEFAULTZOOM_SCREENSHOT,
1649 MTHK_GIANT_SCREENSHOT,
1652 MTHK_EXTRA_VIEWPORT,
1698 if (_game_mode != GM_MENU && !this->
IsWidgetDisabled(widget)) _toolbar_button_procs[widget](
this);
1710 case MTHK_PAUSE: ToolbarPauseClick(
this);
break;
1716 case MTHK_TOWNDIRECTORY: ShowTownDirectory();
break;
1717 case MTHK_SUBSIDIES: ShowSubsidiesList();
break;
1723 case MTHK_GRAPHS: ShowOperatingProfitGraph();
break;
1724 case MTHK_LEAGUE: ShowCompanyLeagueTable();
break;
1725 case MTHK_INDUSTRIES: ShowBuildIndustryWindow();
break;
1730 case MTHK_ZOOM_IN: ToolbarZoomInClick(
this);
break;
1731 case MTHK_ZOOM_OUT: ToolbarZoomOutClick(
this);
break;
1736 case MTHK_BUILD_TREES: ShowBuildTreesToolbar();
break;
1737 case MTHK_MUSIC: ShowMusicWindow();
break;
1739 case MTHK_SMALL_SCREENSHOT: MenuClickSmallScreenshot();
break;
1746 #ifdef ENABLE_NETWORK
1747 case MTHK_CLIENT_LIST:
if (
_networking) ShowClientList();
break;
1758 case CBF_PLACE_SIGN:
1762 case CBF_PLACE_LANDINFO:
1766 default: NOT_REACHED();
1802 if (!gui_scope)
return;
1809 const uint16 _maintoolbar_pause_keys[] = {WKC_F1, WKC_PAUSE, 0};
1810 const uint16 _maintoolbar_zoomin_keys[] = {WKC_NUM_PLUS,
WKC_EQUALS, WKC_SHIFT |
WKC_EQUALS, WKC_SHIFT | WKC_F5, 0};
1811 const uint16 _maintoolbar_zoomout_keys[] = {WKC_NUM_MINUS,
WKC_MINUS, WKC_SHIFT |
WKC_MINUS, WKC_SHIFT | WKC_F6, 0};
1812 const uint16 _maintoolbar_smallmap_keys[] = {WKC_F4,
'M', 0};
1814 static Hotkey maintoolbar_hotkeys[] = {
1815 Hotkey(_maintoolbar_pause_keys,
"pause", MTHK_PAUSE),
1816 Hotkey((uint16)0,
"fastforward", MTHK_FASTFORWARD),
1817 Hotkey(WKC_F2,
"settings", MTHK_SETTINGS),
1818 Hotkey(WKC_F3,
"saveload", MTHK_SAVEGAME),
1819 Hotkey((uint16)0,
"load_game", MTHK_LOADGAME),
1820 Hotkey(_maintoolbar_smallmap_keys,
"smallmap", MTHK_SMALLMAP),
1821 Hotkey(WKC_F5,
"town_list", MTHK_TOWNDIRECTORY),
1822 Hotkey(WKC_F6,
"subsidies", MTHK_SUBSIDIES),
1823 Hotkey(WKC_F7,
"station_list", MTHK_STATIONS),
1824 Hotkey(WKC_F8,
"finances", MTHK_FINANCES),
1825 Hotkey(WKC_F9,
"companies", MTHK_COMPANIES),
1826 Hotkey((uint16)0,
"story_book", MTHK_STORY),
1827 Hotkey((uint16)0,
"goal_list", MTHK_GOAL),
1828 Hotkey(WKC_F10,
"graphs", MTHK_GRAPHS),
1829 Hotkey(WKC_F11,
"league", MTHK_LEAGUE),
1830 Hotkey(WKC_F12,
"industry_list", MTHK_INDUSTRIES),
1831 Hotkey(WKC_SHIFT | WKC_F1,
"train_list", MTHK_TRAIN_LIST),
1832 Hotkey(WKC_SHIFT | WKC_F2,
"roadveh_list", MTHK_ROADVEH_LIST),
1833 Hotkey(WKC_SHIFT | WKC_F3,
"ship_list", MTHK_SHIP_LIST),
1834 Hotkey(WKC_SHIFT | WKC_F4,
"aircraft_list", MTHK_AIRCRAFT_LIST),
1835 Hotkey(_maintoolbar_zoomin_keys,
"zoomin", MTHK_ZOOM_IN),
1836 Hotkey(_maintoolbar_zoomout_keys,
"zoomout", MTHK_ZOOM_OUT),
1837 Hotkey(WKC_SHIFT | WKC_F7,
"build_rail", MTHK_BUILD_RAIL),
1838 Hotkey(WKC_SHIFT | WKC_F8,
"build_road", MTHK_BUILD_ROAD),
1839 Hotkey(WKC_SHIFT | WKC_F9,
"build_docks", MTHK_BUILD_DOCKS),
1840 Hotkey(WKC_SHIFT | WKC_F10,
"build_airport", MTHK_BUILD_AIRPORT),
1841 Hotkey(WKC_SHIFT | WKC_F11,
"build_trees", MTHK_BUILD_TREES),
1842 Hotkey(WKC_SHIFT | WKC_F12,
"music", MTHK_MUSIC),
1843 Hotkey((uint16)0,
"ai_debug", MTHK_AI_DEBUG),
1844 Hotkey(WKC_CTRL |
'S',
"small_screenshot", MTHK_SMALL_SCREENSHOT),
1845 Hotkey(WKC_CTRL |
'P',
"zoomedin_screenshot", MTHK_ZOOMEDIN_SCREENSHOT),
1846 Hotkey(WKC_CTRL |
'D',
"defaultzoom_screenshot", MTHK_DEFAULTZOOM_SCREENSHOT),
1847 Hotkey((uint16)0,
"giant_screenshot", MTHK_GIANT_SCREENSHOT),
1848 Hotkey(WKC_CTRL | WKC_ALT |
'C',
"cheats", MTHK_CHEATS),
1849 Hotkey(
'L',
"terraform", MTHK_TERRAFORM),
1850 Hotkey(
'V',
"extra_viewport", MTHK_EXTRA_VIEWPORT),
1851 #ifdef ENABLE_NETWORK
1852 Hotkey((uint16)0,
"client_list", MTHK_CLIENT_LIST),
1854 Hotkey((uint16)0,
"sign_list", MTHK_SIGN_LIST),
1857 HotkeyList MainToolbarWindow::hotkeys(
"maintoolbar", maintoolbar_hotkeys);
1862 static const SpriteID toolbar_button_sprites[] = {
1864 SPR_IMG_FASTFORWARD,
1870 SPR_IMG_COMPANY_LIST,
1871 SPR_IMG_COMPANY_FINANCE,
1872 SPR_IMG_COMPANY_GENERAL,
1876 SPR_IMG_COMPANY_LEAGUE,
1881 SPR_IMG_AIRPLANESLIST,
1888 SPR_IMG_LANDSCAPING,
1892 SPR_IMG_SWITCH_TOOLBAR,
1898 case 4:
case 8:
case 15:
case 19:
case 21:
case 26: hor->
Add(
new NWidgetSpacer(0, 0));
break;
1907 static const NWidgetPart _nested_toolbar_normal_widgets[] = {
1915 _nested_toolbar_normal_widgets,
lengthof(_nested_toolbar_normal_widgets),
1916 &MainToolbarWindow::hotkeys
1922 static ToolbarButtonProc *
const _scen_toolbar_button_procs[] = {
1929 ToolbarScenDateBackward,
1930 ToolbarScenDateForward,
1931 ToolbarScenMapTownDir,
1933 ToolbarZoomOutClick,
1936 ToolbarScenGenIndustry,
1937 ToolbarScenBuildRoad,
1938 ToolbarScenBuildDocks,
1939 ToolbarScenPlantTrees,
1940 ToolbarScenPlaceSign,
1955 enum MainToolbarEditorHotkeys {
1969 MTEHK_SMALL_SCREENSHOT,
1970 MTEHK_ZOOMEDIN_SCREENSHOT,
1971 MTEHK_DEFAULTZOOM_SCREENSHOT,
1972 MTEHK_GIANT_SCREENSHOT,
1977 MTEHK_EXTRA_VIEWPORT,
2015 int height = r.bottom - r.top;
2018 DrawString(r.left, r.right, (height + 1) / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING,
SA_HOR_CENTER);
2044 if (_game_mode == GM_MENU)
return;
2063 case MTEHK_PAUSE: ToolbarPauseClick(
this);
break;
2067 case MTEHK_GENLAND: ToolbarScenGenLand(
this);
break;
2068 case MTEHK_GENTOWN: ToolbarScenGenTown(
this);
break;
2069 case MTEHK_GENINDUSTRY: ToolbarScenGenIndustry(
this);
break;
2070 case MTEHK_BUILD_ROAD: ToolbarScenBuildRoad(
this);
break;
2071 case MTEHK_BUILD_DOCKS: ToolbarScenBuildDocks(
this);
break;
2072 case MTEHK_BUILD_TREES: ToolbarScenPlantTrees(
this);
break;
2073 case MTEHK_SIGN: cbf = ToolbarScenPlaceSign(
this);
break;
2074 case MTEHK_MUSIC: ShowMusicWindow();
break;
2075 case MTEHK_LANDINFO: cbf = PlaceLandBlockInfo();
break;
2076 case MTEHK_SMALL_SCREENSHOT: MenuClickSmallScreenshot();
break;
2080 case MTEHK_ZOOM_IN: ToolbarZoomInClick(
this);
break;
2081 case MTEHK_ZOOM_OUT: ToolbarZoomOutClick(
this);
break;
2094 case CBF_PLACE_SIGN:
2098 case CBF_PLACE_LANDINFO:
2102 default: NOT_REACHED();
2133 if (!gui_scope)
return;
2140 if (str == NULL)
return;
2157 static Hotkey scenedit_maintoolbar_hotkeys[] = {
2158 Hotkey(_maintoolbar_pause_keys,
"pause", MTEHK_PAUSE),
2159 Hotkey((uint16)0,
"fastforward", MTEHK_FASTFORWARD),
2160 Hotkey(WKC_F2,
"settings", MTEHK_SETTINGS),
2161 Hotkey(WKC_F3,
"saveload", MTEHK_SAVEGAME),
2162 Hotkey(WKC_F4,
"gen_land", MTEHK_GENLAND),
2163 Hotkey(WKC_F5,
"gen_town", MTEHK_GENTOWN),
2164 Hotkey(WKC_F6,
"gen_industry", MTEHK_GENINDUSTRY),
2165 Hotkey(WKC_F7,
"build_road", MTEHK_BUILD_ROAD),
2166 Hotkey(WKC_F8,
"build_docks", MTEHK_BUILD_DOCKS),
2167 Hotkey(WKC_F9,
"build_trees", MTEHK_BUILD_TREES),
2168 Hotkey(WKC_F10,
"build_sign", MTEHK_SIGN),
2169 Hotkey(WKC_F11,
"music", MTEHK_MUSIC),
2170 Hotkey(WKC_F12,
"land_info", MTEHK_LANDINFO),
2171 Hotkey(WKC_CTRL |
'S',
"small_screenshot", MTEHK_SMALL_SCREENSHOT),
2172 Hotkey(WKC_CTRL |
'P',
"zoomedin_screenshot", MTEHK_ZOOMEDIN_SCREENSHOT),
2173 Hotkey(WKC_CTRL |
'D',
"defaultzoom_screenshot", MTEHK_DEFAULTZOOM_SCREENSHOT),
2174 Hotkey((uint16)0,
"giant_screenshot", MTEHK_GIANT_SCREENSHOT),
2175 Hotkey(_maintoolbar_zoomin_keys,
"zoomin", MTEHK_ZOOM_IN),
2176 Hotkey(_maintoolbar_zoomout_keys,
"zoomout", MTEHK_ZOOM_OUT),
2177 Hotkey(
'L',
"terraform", MTEHK_TERRAFORM),
2178 Hotkey(
'M',
"smallmap", MTEHK_SMALLMAP),
2179 Hotkey(
'V',
"extra_viewport", MTEHK_EXTRA_VIEWPORT),
2182 HotkeyList ScenarioEditorToolbarWindow::hotkeys(
"scenedit_maintoolbar", scenedit_maintoolbar_hotkeys);
2184 static const NWidgetPart _nested_toolb_scen_inner_widgets[] = {
2218 static NWidgetBase *MakeScenarioToolbar(
int *biggest_index)
2223 static const NWidgetPart _nested_toolb_scen_widgets[] = {
2231 _nested_toolb_scen_widgets,
lengthof(_nested_toolb_scen_widgets),
2232 &ScenarioEditorToolbarWindow::hotkeys
2241 if (_game_mode == GM_EDITOR) {