|
@@ -1103,97 +1103,97 @@ static CallBackFunction PlaceLandBlockIn
|
|
|
}
|
|
|
|
|
|
static CallBackFunction ToolbarHelpClick(Window *w)
|
|
|
{
|
|
|
PopupMainToolbMenu(w, _game_mode == GM_EDITOR ? (int)WID_TE_HELP : (int)WID_TN_HELP, STR_ABOUT_MENU_LAND_BLOCK_INFO, _settings_client.gui.newgrf_developer_tools ? 10 : 7);
|
|
|
return CBF_NONE;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Toggle drawing of sprites' bounding boxes.
|
|
|
* @note has only an effect when newgrf_developer_tools are active.
|
|
|
*
|
|
|
* Function is found here and not in viewport.cpp in order to avoid
|
|
|
* importing the settings structs to there.
|
|
|
*/
|
|
|
void ToggleBoundingBoxes()
|
|
|
{
|
|
|
extern bool _draw_bounding_boxes;
|
|
|
/* Always allow to toggle them off */
|
|
|
if (_settings_client.gui.newgrf_developer_tools || _draw_bounding_boxes) {
|
|
|
_draw_bounding_boxes = !_draw_bounding_boxes;
|
|
|
MarkWholeScreenDirty();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Toggle drawing of the dirty blocks.
|
|
|
* @note has only an effect when newgrf_developer_tools are active.
|
|
|
*
|
|
|
* Function is found here and not in viewport.cpp in order to avoid
|
|
|
* importing the settings structs to there.
|
|
|
*/
|
|
|
void ToggleDirtyBlocks()
|
|
|
{
|
|
|
extern bool _draw_dirty_blocks;
|
|
|
/* Always allow to toggle them off */
|
|
|
if (_settings_client.gui.newgrf_developer_tools || _draw_dirty_blocks) {
|
|
|
_draw_dirty_blocks = !_draw_dirty_blocks;
|
|
|
MarkWholeScreenDirty();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Set the starting year for a scenario.
|
|
|
* @param year New starting year.
|
|
|
*/
|
|
|
void SetStartingYear(TimerGameCalendar::Year year)
|
|
|
{
|
|
|
_settings_game.game_creation.starting_year = Clamp(year, MIN_YEAR, MAX_YEAR);
|
|
|
_settings_game.game_creation.starting_year = Clamp(year, CalendarTime::MIN_YEAR, CalendarTime::MAX_YEAR);
|
|
|
TimerGameCalendar::Date new_date = TimerGameCalendar::ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1);
|
|
|
/* If you open a savegame as scenario there may already be link graphs.*/
|
|
|
LinkGraphSchedule::instance.ShiftDates(new_date - TimerGameCalendar::date);
|
|
|
TimerGameCalendar::SetDate(new_date, 0);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Choose the proper callback function for the main toolbar's help menu.
|
|
|
* @param index The menu index which was selected.
|
|
|
* @return CBF_NONE
|
|
|
*/
|
|
|
static CallBackFunction MenuClickHelp(int index)
|
|
|
{
|
|
|
switch (index) {
|
|
|
case 0: return PlaceLandBlockInfo();
|
|
|
case 2: IConsoleSwitch(); break;
|
|
|
case 3: ShowScriptDebugWindow(); break;
|
|
|
case 4: ShowScreenshotWindow(); break;
|
|
|
case 5: ShowFramerateWindow(); break;
|
|
|
case 6: ShowAboutWindow(); break;
|
|
|
case 7: ShowSpriteAlignerWindow(); break;
|
|
|
case 8: ToggleBoundingBoxes(); break;
|
|
|
case 9: ToggleDirtyBlocks(); break;
|
|
|
}
|
|
|
return CBF_NONE;
|
|
|
}
|
|
|
|
|
|
/* --- Switch toolbar button --- */
|
|
|
|
|
|
static CallBackFunction ToolbarSwitchClick(Window *w)
|
|
|
{
|
|
|
if (_toolbar_mode != TB_LOWER) {
|
|
|
_toolbar_mode = TB_LOWER;
|
|
|
} else {
|
|
|
_toolbar_mode = TB_UPPER;
|
|
|
}
|
|
|
|
|
|
w->ReInit();
|
|
|
w->SetWidgetLoweredState(_game_mode == GM_EDITOR ? (uint)WID_TE_SWITCH_BAR : (uint)WID_TN_SWITCH_BAR, _toolbar_mode == TB_LOWER);
|
|
|
if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
|
|
|
return CBF_NONE;
|
|
|
}
|
|
|
|
|
|
/* --- Scenario editor specific handlers. */
|
|
|
|
|
|
/**
|
|
|
* Called when clicking at the date panel of the scenario editor toolbar.
|
|
|
*/
|
|
@@ -2312,138 +2312,138 @@ static ToolbarButtonProc * const _scen_t
|
|
|
ToolbarHelpClick,
|
|
|
ToolbarSwitchClick,
|
|
|
};
|
|
|
|
|
|
enum MainToolbarEditorHotkeys {
|
|
|
MTEHK_PAUSE,
|
|
|
MTEHK_FASTFORWARD,
|
|
|
MTEHK_SETTINGS,
|
|
|
MTEHK_SAVEGAME,
|
|
|
MTEHK_GENLAND,
|
|
|
MTEHK_GENTOWN,
|
|
|
MTEHK_GENINDUSTRY,
|
|
|
MTEHK_BUILD_ROAD,
|
|
|
MTEHK_BUILD_TRAM,
|
|
|
MTEHK_BUILD_DOCKS,
|
|
|
MTEHK_BUILD_TREES,
|
|
|
MTEHK_SIGN,
|
|
|
MTEHK_MUSIC,
|
|
|
MTEHK_LANDINFO,
|
|
|
MTEHK_SMALL_SCREENSHOT,
|
|
|
MTEHK_ZOOMEDIN_SCREENSHOT,
|
|
|
MTEHK_DEFAULTZOOM_SCREENSHOT,
|
|
|
MTEHK_GIANT_SCREENSHOT,
|
|
|
MTEHK_ZOOM_IN,
|
|
|
MTEHK_ZOOM_OUT,
|
|
|
MTEHK_TERRAFORM,
|
|
|
MTEHK_SMALLMAP,
|
|
|
MTEHK_EXTRA_VIEWPORT,
|
|
|
};
|
|
|
|
|
|
struct ScenarioEditorToolbarWindow : Window {
|
|
|
ScenarioEditorToolbarWindow(WindowDesc *desc) : Window(desc)
|
|
|
{
|
|
|
this->InitNested(0);
|
|
|
|
|
|
_last_started_action = CBF_NONE;
|
|
|
CLRBITS(this->flags, WF_WHITE_BORDER);
|
|
|
PositionMainToolbar(this);
|
|
|
DoZoomInOutWindow(ZOOM_NONE, this);
|
|
|
}
|
|
|
|
|
|
void FindWindowPlacementAndResize(int def_width, int def_height) override
|
|
|
{
|
|
|
Window::FindWindowPlacementAndResize(_toolbar_width, def_height);
|
|
|
}
|
|
|
|
|
|
void OnPaint() override
|
|
|
{
|
|
|
this->SetWidgetDisabledState(WID_TE_DATE_BACKWARD, _settings_game.game_creation.starting_year <= MIN_YEAR);
|
|
|
this->SetWidgetDisabledState(WID_TE_DATE_FORWARD, _settings_game.game_creation.starting_year >= MAX_YEAR);
|
|
|
this->SetWidgetDisabledState(WID_TE_DATE_BACKWARD, _settings_game.game_creation.starting_year <= CalendarTime::MIN_YEAR);
|
|
|
this->SetWidgetDisabledState(WID_TE_DATE_FORWARD, _settings_game.game_creation.starting_year >= CalendarTime::MAX_YEAR);
|
|
|
this->SetWidgetDisabledState(WID_TE_ROADS, (GetRoadTypes(true) & ~_roadtypes_type) == ROADTYPES_NONE);
|
|
|
this->SetWidgetDisabledState(WID_TE_TRAMS, (GetRoadTypes(true) & _roadtypes_type) == ROADTYPES_NONE);
|
|
|
|
|
|
this->DrawWidgets();
|
|
|
}
|
|
|
|
|
|
void SetStringParameters(int widget) const override
|
|
|
{
|
|
|
switch (widget) {
|
|
|
case WID_TE_DATE:
|
|
|
SetDParam(0, TimerGameCalendar::ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1));
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void DrawWidget(const Rect &r, int widget) const override
|
|
|
{
|
|
|
switch (widget) {
|
|
|
case WID_TE_SPACER: {
|
|
|
int height = r.Height();
|
|
|
if (height > 2 * FONT_HEIGHT_NORMAL) {
|
|
|
DrawString(r.left, r.right, height / 2 - FONT_HEIGHT_NORMAL, STR_SCENEDIT_TOOLBAR_OPENTTD, TC_FROMSTRING, SA_HOR_CENTER);
|
|
|
DrawString(r.left, r.right, height / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
|
|
|
} else {
|
|
|
DrawString(r.left, r.right, (height - FONT_HEIGHT_NORMAL) / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override
|
|
|
{
|
|
|
switch (widget) {
|
|
|
case WID_TE_SPACER:
|
|
|
size->width = std::max(GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_OPENTTD).width, GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR).width) + padding.width;
|
|
|
break;
|
|
|
|
|
|
case WID_TE_DATE:
|
|
|
SetDParam(0, TimerGameCalendar::ConvertYMDToDate(MAX_YEAR, 0, 1));
|
|
|
SetDParam(0, TimerGameCalendar::ConvertYMDToDate(CalendarTime::MAX_YEAR, 0, 1));
|
|
|
*size = GetStringBoundingBox(STR_JUST_DATE_LONG);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void OnClick(Point pt, int widget, int click_count) override
|
|
|
{
|
|
|
if (_game_mode == GM_MENU) return;
|
|
|
CallBackFunction cbf = _scen_toolbar_button_procs[widget](this);
|
|
|
if (cbf != CBF_NONE) _last_started_action = cbf;
|
|
|
}
|
|
|
|
|
|
void OnDropdownSelect(int widget, int index) override
|
|
|
{
|
|
|
CallBackFunction cbf = _scen_toolbar_dropdown_procs[widget](index);
|
|
|
if (cbf != CBF_NONE) _last_started_action = cbf;
|
|
|
if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
|
|
|
}
|
|
|
|
|
|
EventState OnHotkey(int hotkey) override
|
|
|
{
|
|
|
CallBackFunction cbf = CBF_NONE;
|
|
|
switch (hotkey) {
|
|
|
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: ToolbarScenBuildRoadClick(this); break;
|
|
|
case MTEHK_BUILD_TRAM: ToolbarScenBuildTramClick(this); break;
|
|
|
case MTEHK_BUILD_DOCKS: ToolbarScenBuildDocks(this); break;
|
|
|
case MTEHK_BUILD_TREES: ToolbarScenPlantTrees(this); break;
|
|
|
case MTEHK_SIGN: cbf = ToolbarScenPlaceSign(this); break;
|
|
|
case MTEHK_MUSIC: ShowMusicWindow(); break;
|
|
|
case MTEHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
|
|
|
case MTEHK_SMALL_SCREENSHOT: MakeScreenshotWithConfirm(SC_VIEWPORT); break;
|
|
|
case MTEHK_ZOOMEDIN_SCREENSHOT: MakeScreenshotWithConfirm(SC_ZOOMEDIN); break;
|
|
|
case MTEHK_DEFAULTZOOM_SCREENSHOT: MakeScreenshotWithConfirm(SC_DEFAULTZOOM); break;
|
|
|
case MTEHK_GIANT_SCREENSHOT: MakeScreenshotWithConfirm(SC_WORLD); 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;
|
|
|
}
|
|
@@ -2467,97 +2467,97 @@ struct ScenarioEditorToolbarWindow : Win
|
|
|
}
|
|
|
|
|
|
void OnPlaceObjectAbort() override
|
|
|
{
|
|
|
_last_started_action = CBF_NONE;
|
|
|
}
|
|
|
|
|
|
void OnTimeout() override
|
|
|
{
|
|
|
this->SetWidgetsLoweredState(false, WID_TE_DATE_BACKWARD, WID_TE_DATE_FORWARD, WIDGET_LIST_END);
|
|
|
this->SetWidgetDirty(WID_TE_DATE_BACKWARD);
|
|
|
this->SetWidgetDirty(WID_TE_DATE_FORWARD);
|
|
|
}
|
|
|
|
|
|
/** Refresh the state of pause / game-speed on a regular interval.*/
|
|
|
IntervalTimer<TimerWindow> refresh_interval = {std::chrono::milliseconds(30), [this](auto) {
|
|
|
if (this->IsWidgetLowered(WID_TE_PAUSE) != !!_pause_mode) {
|
|
|
this->ToggleWidgetLoweredState(WID_TE_PAUSE);
|
|
|
this->SetDirty();
|
|
|
}
|
|
|
|
|
|
if (this->IsWidgetLowered(WID_TE_FAST_FORWARD) != (_game_speed != 100)) {
|
|
|
this->ToggleWidgetLoweredState(WID_TE_FAST_FORWARD);
|
|
|
this->SetDirty();
|
|
|
}
|
|
|
}};
|
|
|
|
|
|
/**
|
|
|
* Some data on this window has become invalid.
|
|
|
* @param data Information about the changed data.
|
|
|
* @param gui_scope Whether the call is done from GUI scope. You may not do everything when not in GUI scope. See #InvalidateWindowData() for details.
|
|
|
*/
|
|
|
void OnInvalidateData(int data = 0, bool gui_scope = true) override
|
|
|
{
|
|
|
if (!gui_scope) return;
|
|
|
HandleZoomMessage(this, GetMainWindow()->viewport, WID_TE_ZOOM_IN, WID_TE_ZOOM_OUT);
|
|
|
}
|
|
|
|
|
|
void OnQueryTextFinished(char *str) override
|
|
|
{
|
|
|
/* Was 'cancel' pressed? */
|
|
|
if (str == nullptr) return;
|
|
|
|
|
|
TimerGameCalendar::Year value;
|
|
|
if (!StrEmpty(str)) {
|
|
|
value = atoi(str);
|
|
|
} else {
|
|
|
/* An empty string means revert to the default */
|
|
|
value = static_cast<int32_t>(DEF_START_YEAR);
|
|
|
value = static_cast<int32_t>(CalendarTime::DEF_START_YEAR);
|
|
|
}
|
|
|
SetStartingYear(value);
|
|
|
|
|
|
this->SetDirty();
|
|
|
}
|
|
|
|
|
|
static inline HotkeyList hotkeys{"scenedit_maintoolbar", {
|
|
|
Hotkey({WKC_F1, WKC_PAUSE}, "pause", MTEHK_PAUSE),
|
|
|
Hotkey(0, "fastforward", MTEHK_FASTFORWARD),
|
|
|
Hotkey(WKC_F2, "settings", MTEHK_SETTINGS),
|
|
|
Hotkey(WKC_F3, "saveload", MTEHK_SAVEGAME),
|
|
|
Hotkey(WKC_F4, "gen_land", MTEHK_GENLAND),
|
|
|
Hotkey(WKC_F5, "gen_town", MTEHK_GENTOWN),
|
|
|
Hotkey(WKC_F6, "gen_industry", MTEHK_GENINDUSTRY),
|
|
|
Hotkey(WKC_F7, "build_road", MTEHK_BUILD_ROAD),
|
|
|
Hotkey(0, "build_tram", MTEHK_BUILD_TRAM),
|
|
|
Hotkey(WKC_F8, "build_docks", MTEHK_BUILD_DOCKS),
|
|
|
Hotkey(WKC_F9, "build_trees", MTEHK_BUILD_TREES),
|
|
|
Hotkey(WKC_F10, "build_sign", MTEHK_SIGN),
|
|
|
Hotkey(WKC_F11, "music", MTEHK_MUSIC),
|
|
|
Hotkey(WKC_F12, "land_info", MTEHK_LANDINFO),
|
|
|
Hotkey(WKC_CTRL | 'S', "small_screenshot", MTEHK_SMALL_SCREENSHOT),
|
|
|
Hotkey(WKC_CTRL | 'P', "zoomedin_screenshot", MTEHK_ZOOMEDIN_SCREENSHOT),
|
|
|
Hotkey(WKC_CTRL | 'D', "defaultzoom_screenshot", MTEHK_DEFAULTZOOM_SCREENSHOT),
|
|
|
Hotkey(0, "giant_screenshot", MTEHK_GIANT_SCREENSHOT),
|
|
|
Hotkey({WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5}, "zoomin", MTEHK_ZOOM_IN),
|
|
|
Hotkey({WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6}, "zoomout", MTEHK_ZOOM_OUT),
|
|
|
Hotkey('L', "terraform", MTEHK_TERRAFORM),
|
|
|
Hotkey('M', "smallmap", MTEHK_SMALLMAP),
|
|
|
Hotkey('V', "extra_viewport", MTEHK_EXTRA_VIEWPORT),
|
|
|
}};
|
|
|
};
|
|
|
|
|
|
static const NWidgetPart _nested_toolb_scen_inner_widgets[] = {
|
|
|
NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_PAUSE), SetDataTip(SPR_IMG_PAUSE, STR_TOOLBAR_TOOLTIP_PAUSE_GAME),
|
|
|
NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_FAST_FORWARD), SetDataTip(SPR_IMG_FASTFORWARD, STR_TOOLBAR_TOOLTIP_FORWARD),
|
|
|
NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SETTINGS), SetDataTip(SPR_IMG_SETTINGS, STR_TOOLBAR_TOOLTIP_OPTIONS),
|
|
|
NWidget(WWT_IMGBTN_2, COLOUR_GREY, WID_TE_SAVE), SetDataTip(SPR_IMG_SAVE, STR_SCENEDIT_TOOLBAR_TOOLTIP_SAVE_SCENARIO_LOAD_SCENARIO),
|
|
|
NWidget(NWID_SPACER),
|
|
|
NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_SPACER), EndContainer(),
|
|
|
NWidget(NWID_SPACER),
|
|
|
NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_DATE_PANEL),
|
|
|
NWidget(NWID_HORIZONTAL), SetPIP(2, 2, 2), SetPadding(1),
|
|
|
NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_DATE_BACKWARD), SetDataTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD), SetFill(0, 1),
|
|
|
NWidget(WWT_TEXT, COLOUR_GREY, WID_TE_DATE), SetDataTip(STR_JUST_DATE_LONG, STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE), SetTextStyle(TC_WHITE), SetAlignment(SA_CENTER), SetFill(0, 1),
|
|
|
NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_DATE_FORWARD), SetDataTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD), SetFill(0, 1),
|
|
|
EndContainer(),
|
|
|
EndContainer(),
|