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;
1479 static const byte arrange14[] = {
1510 static const byte arrange15[] = {
1543 static const byte arrange16[] = {
1578 static const byte arrange17[] = {
1615 static const byte arrange18[] = {
1654 static const byte arrange19[] = {
1695 static const byte arrange20[] = {
1738 static const byte arrange_all[] = {
1772 if (full_buttons > BIGGEST_ARRANGEMENT) {
1773 button_count = arrangable_count =
lengthof(arrange_all);
1779 static const byte *
const arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19, arrange20 };
1781 button_count = arrangable_count = full_buttons;
1783 return arrangements[full_buttons - SMALLEST_ARRANGEMENT] + ((_toolbar_mode == TB_LOWER) ? full_buttons : 0);
1791 void SetupSmallestSize(
Window *w,
bool init_array)
1797 for (
NWidgetBase *child_wid = this->
head; child_wid != NULL; child_wid = child_wid->
next) {
1798 if (child_wid->type ==
NWID_SPACER || this->IsButton(child_wid->type))
continue;
1806 const byte *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count)
const
1808 static const byte arrange_all[] = {
1828 static const byte arrange_nopanel[] = {
1847 static const byte arrange_switch[] = {
1872 if (width >= min_full_width) {
1874 arrangable_count =
lengthof(arrange_all);
1875 button_count = arrangable_count - 2;
1882 if (width > min_small_width) {
1884 arrangable_count =
lengthof(arrange_nopanel);
1885 button_count = arrangable_count - 1;
1886 spacer_count = this->
spacers - 1;
1887 return arrange_nopanel;
1892 arrangable_count =
lengthof(arrange_switch) / 2;
1893 button_count = arrangable_count - 1;
1895 return arrange_switch + ((_toolbar_mode == TB_LOWER) ? arrangable_count : 0);
1903 static ToolbarButtonProc *
const _toolbar_button_procs[] = {
1910 ToolbarSubsidiesClick,
1911 ToolbarStationsClick,
1912 ToolbarFinancesClick,
1913 ToolbarCompaniesClick,
1918 ToolbarIndustryClick,
1924 ToolbarZoomOutClick,
1925 ToolbarBuildRailClick,
1926 ToolbarBuildRoadClick,
1927 ToolbarBuildWaterClick,
1928 ToolbarBuildAirClick,
1931 ToolbarNewspaperClick,
1936 enum MainToolbarHotkeys {
1966 MTHK_SMALL_SCREENSHOT,
1967 MTHK_ZOOMEDIN_SCREENSHOT,
1968 MTHK_DEFAULTZOOM_SCREENSHOT,
1969 MTHK_GIANT_SCREENSHOT,
1972 MTHK_EXTRA_VIEWPORT,
2016 if (_game_mode != GM_MENU && !this->
IsWidgetDisabled(widget)) _toolbar_button_procs[widget](
this);
2028 case MTHK_PAUSE: ToolbarPauseClick(
this);
break;
2034 case MTHK_TOWNDIRECTORY: ShowTownDirectory();
break;
2035 case MTHK_SUBSIDIES: ShowSubsidiesList();
break;
2041 case MTHK_GRAPHS: ShowOperatingProfitGraph();
break;
2042 case MTHK_LEAGUE: ShowCompanyLeagueTable();
break;
2043 case MTHK_INDUSTRIES: ShowBuildIndustryWindow();
break;
2048 case MTHK_ZOOM_IN: ToolbarZoomInClick(
this);
break;
2049 case MTHK_ZOOM_OUT: ToolbarZoomOutClick(
this);
break;
2054 case MTHK_BUILD_TREES: ShowBuildTreesToolbar();
break;
2055 case MTHK_MUSIC: ShowMusicWindow();
break;
2057 case MTHK_SMALL_SCREENSHOT: MenuClickSmallScreenshot();
break;
2064 #ifdef ENABLE_NETWORK
2065 case MTHK_CLIENT_LIST:
if (
_networking) ShowClientList();
break;
2076 case CBF_PLACE_SIGN:
2080 case CBF_PLACE_LANDINFO:
2084 default: NOT_REACHED();
2125 if (!gui_scope)
return;
2132 const uint16 _maintoolbar_pause_keys[] = {WKC_F1, WKC_PAUSE, 0};
2133 const uint16 _maintoolbar_zoomin_keys[] = {WKC_NUM_PLUS,
WKC_EQUALS, WKC_SHIFT |
WKC_EQUALS, WKC_SHIFT | WKC_F5, 0};
2134 const uint16 _maintoolbar_zoomout_keys[] = {WKC_NUM_MINUS,
WKC_MINUS, WKC_SHIFT |
WKC_MINUS, WKC_SHIFT | WKC_F6, 0};
2135 const uint16 _maintoolbar_smallmap_keys[] = {WKC_F4,
'M', 0};
2137 static Hotkey maintoolbar_hotkeys[] = {
2138 Hotkey(_maintoolbar_pause_keys,
"pause", MTHK_PAUSE),
2139 Hotkey((uint16)0,
"fastforward", MTHK_FASTFORWARD),
2140 Hotkey(WKC_F2,
"settings", MTHK_SETTINGS),
2141 Hotkey(WKC_F3,
"saveload", MTHK_SAVEGAME),
2142 Hotkey((uint16)0,
"load_game", MTHK_LOADGAME),
2143 Hotkey(_maintoolbar_smallmap_keys,
"smallmap", MTHK_SMALLMAP),
2144 Hotkey(WKC_F5,
"town_list", MTHK_TOWNDIRECTORY),
2145 Hotkey(WKC_F6,
"subsidies", MTHK_SUBSIDIES),
2146 Hotkey(WKC_F7,
"station_list", MTHK_STATIONS),
2147 Hotkey(WKC_F8,
"finances", MTHK_FINANCES),
2148 Hotkey(WKC_F9,
"companies", MTHK_COMPANIES),
2149 Hotkey((uint16)0,
"story_book", MTHK_STORY),
2150 Hotkey((uint16)0,
"goal_list", MTHK_GOAL),
2151 Hotkey(WKC_F10,
"graphs", MTHK_GRAPHS),
2152 Hotkey(WKC_F11,
"league", MTHK_LEAGUE),
2153 Hotkey(WKC_F12,
"industry_list", MTHK_INDUSTRIES),
2154 Hotkey(WKC_SHIFT | WKC_F1,
"train_list", MTHK_TRAIN_LIST),
2155 Hotkey(WKC_SHIFT | WKC_F2,
"roadveh_list", MTHK_ROADVEH_LIST),
2156 Hotkey(WKC_SHIFT | WKC_F3,
"ship_list", MTHK_SHIP_LIST),
2157 Hotkey(WKC_SHIFT | WKC_F4,
"aircraft_list", MTHK_AIRCRAFT_LIST),
2158 Hotkey(_maintoolbar_zoomin_keys,
"zoomin", MTHK_ZOOM_IN),
2159 Hotkey(_maintoolbar_zoomout_keys,
"zoomout", MTHK_ZOOM_OUT),
2160 Hotkey(WKC_SHIFT | WKC_F7,
"build_rail", MTHK_BUILD_RAIL),
2161 Hotkey(WKC_SHIFT | WKC_F8,
"build_road", MTHK_BUILD_ROAD),
2162 Hotkey(WKC_SHIFT | WKC_F9,
"build_docks", MTHK_BUILD_DOCKS),
2163 Hotkey(WKC_SHIFT | WKC_F10,
"build_airport", MTHK_BUILD_AIRPORT),
2164 Hotkey(WKC_SHIFT | WKC_F11,
"build_trees", MTHK_BUILD_TREES),
2165 Hotkey(WKC_SHIFT | WKC_F12,
"music", MTHK_MUSIC),
2166 Hotkey((uint16)0,
"ai_debug", MTHK_AI_DEBUG),
2167 Hotkey(WKC_CTRL |
'S',
"small_screenshot", MTHK_SMALL_SCREENSHOT),
2168 Hotkey(WKC_CTRL |
'P',
"zoomedin_screenshot", MTHK_ZOOMEDIN_SCREENSHOT),
2169 Hotkey(WKC_CTRL |
'D',
"defaultzoom_screenshot", MTHK_DEFAULTZOOM_SCREENSHOT),
2170 Hotkey((uint16)0,
"giant_screenshot", MTHK_GIANT_SCREENSHOT),
2171 Hotkey(WKC_CTRL | WKC_ALT |
'C',
"cheats", MTHK_CHEATS),
2172 Hotkey(
'L',
"terraform", MTHK_TERRAFORM),
2173 Hotkey(
'V',
"extra_viewport", MTHK_EXTRA_VIEWPORT),
2174 #ifdef ENABLE_NETWORK
2175 Hotkey((uint16)0,
"client_list", MTHK_CLIENT_LIST),
2177 Hotkey((uint16)0,
"sign_list", MTHK_SIGN_LIST),
2180 HotkeyList MainToolbarWindow::hotkeys(
"maintoolbar", maintoolbar_hotkeys);
2185 static const SpriteID toolbar_button_sprites[] = {
2187 SPR_IMG_FASTFORWARD,
2193 SPR_IMG_COMPANY_LIST,
2194 SPR_IMG_COMPANY_FINANCE,
2195 SPR_IMG_COMPANY_GENERAL,
2199 SPR_IMG_COMPANY_LEAGUE,
2204 SPR_IMG_AIRPLANESLIST,
2211 SPR_IMG_LANDSCAPING,
2215 SPR_IMG_SWITCH_TOOLBAR,
2237 static const NWidgetPart _nested_toolbar_normal_widgets[] = {
2245 _nested_toolbar_normal_widgets,
lengthof(_nested_toolbar_normal_widgets),
2246 &MainToolbarWindow::hotkeys
2252 static ToolbarButtonProc *
const _scen_toolbar_button_procs[] = {
2259 ToolbarScenDateBackward,
2260 ToolbarScenDateForward,
2261 ToolbarScenMapTownDir,
2263 ToolbarZoomOutClick,
2266 ToolbarScenGenIndustry,
2267 ToolbarScenBuildRoad,
2268 ToolbarScenBuildDocks,
2269 ToolbarScenPlantTrees,
2270 ToolbarScenPlaceSign,
2285 enum MainToolbarEditorHotkeys {
2299 MTEHK_SMALL_SCREENSHOT,
2300 MTEHK_ZOOMEDIN_SCREENSHOT,
2301 MTEHK_DEFAULTZOOM_SCREENSHOT,
2302 MTEHK_GIANT_SCREENSHOT,
2307 MTEHK_EXTRA_VIEWPORT,
2343 int height = r.bottom - r.top;
2346 DrawString(r.left, r.right, (height + 1) / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING,
SA_HOR_CENTER);
2372 if (_game_mode == GM_MENU)
return;
2391 case MTEHK_PAUSE: ToolbarPauseClick(
this);
break;
2395 case MTEHK_GENLAND: ToolbarScenGenLand(
this);
break;
2396 case MTEHK_GENTOWN: ToolbarScenGenTown(
this);
break;
2397 case MTEHK_GENINDUSTRY: ToolbarScenGenIndustry(
this);
break;
2398 case MTEHK_BUILD_ROAD: ToolbarScenBuildRoad(
this);
break;
2399 case MTEHK_BUILD_DOCKS: ToolbarScenBuildDocks(
this);
break;
2400 case MTEHK_BUILD_TREES: ToolbarScenPlantTrees(
this);
break;
2401 case MTEHK_SIGN: cbf = ToolbarScenPlaceSign(
this);
break;
2402 case MTEHK_MUSIC: ShowMusicWindow();
break;
2403 case MTEHK_LANDINFO: cbf = PlaceLandBlockInfo();
break;
2404 case MTEHK_SMALL_SCREENSHOT: MenuClickSmallScreenshot();
break;
2408 case MTEHK_ZOOM_IN: ToolbarZoomInClick(
this);
break;
2409 case MTEHK_ZOOM_OUT: ToolbarZoomOutClick(
this);
break;
2422 case CBF_PLACE_SIGN:
2426 case CBF_PLACE_LANDINFO:
2430 default: NOT_REACHED();
2466 if (!gui_scope)
return;
2473 if (str == NULL)
return;
2490 static Hotkey scenedit_maintoolbar_hotkeys[] = {
2491 Hotkey(_maintoolbar_pause_keys,
"pause", MTEHK_PAUSE),
2492 Hotkey((uint16)0,
"fastforward", MTEHK_FASTFORWARD),
2493 Hotkey(WKC_F2,
"settings", MTEHK_SETTINGS),
2494 Hotkey(WKC_F3,
"saveload", MTEHK_SAVEGAME),
2495 Hotkey(WKC_F4,
"gen_land", MTEHK_GENLAND),
2496 Hotkey(WKC_F5,
"gen_town", MTEHK_GENTOWN),
2497 Hotkey(WKC_F6,
"gen_industry", MTEHK_GENINDUSTRY),
2498 Hotkey(WKC_F7,
"build_road", MTEHK_BUILD_ROAD),
2499 Hotkey(WKC_F8,
"build_docks", MTEHK_BUILD_DOCKS),
2500 Hotkey(WKC_F9,
"build_trees", MTEHK_BUILD_TREES),
2501 Hotkey(WKC_F10,
"build_sign", MTEHK_SIGN),
2502 Hotkey(WKC_F11,
"music", MTEHK_MUSIC),
2503 Hotkey(WKC_F12,
"land_info", MTEHK_LANDINFO),
2504 Hotkey(WKC_CTRL |
'S',
"small_screenshot", MTEHK_SMALL_SCREENSHOT),
2505 Hotkey(WKC_CTRL |
'P',
"zoomedin_screenshot", MTEHK_ZOOMEDIN_SCREENSHOT),
2506 Hotkey(WKC_CTRL |
'D',
"defaultzoom_screenshot", MTEHK_DEFAULTZOOM_SCREENSHOT),
2507 Hotkey((uint16)0,
"giant_screenshot", MTEHK_GIANT_SCREENSHOT),
2508 Hotkey(_maintoolbar_zoomin_keys,
"zoomin", MTEHK_ZOOM_IN),
2509 Hotkey(_maintoolbar_zoomout_keys,
"zoomout", MTEHK_ZOOM_OUT),
2510 Hotkey(
'L',
"terraform", MTEHK_TERRAFORM),
2511 Hotkey(
'M',
"smallmap", MTEHK_SMALLMAP),
2512 Hotkey(
'V',
"extra_viewport", MTEHK_EXTRA_VIEWPORT),
2515 HotkeyList ScenarioEditorToolbarWindow::hotkeys(
"scenedit_maintoolbar", scenedit_maintoolbar_hotkeys);
2517 static const NWidgetPart _nested_toolb_scen_inner_widgets[] = {
2551 static NWidgetBase *MakeScenarioToolbar(
int *biggest_index)
2556 static const NWidgetPart _nested_toolb_scen_widgets[] = {
2564 _nested_toolb_scen_widgets,
lengthof(_nested_toolb_scen_widgets),
2565 &ScenarioEditorToolbarWindow::hotkeys
2574 if (_game_mode == GM_EDITOR) {