diff --git a/src/openrct2-ui/windows/NewVersionInfo.cpp b/src/openrct2-ui/windows/NewVersionInfo.cpp index 82b0f70fe0..4af749b9a4 100644 --- a/src/openrct2-ui/windows/NewVersionInfo.cpp +++ b/src/openrct2-ui/windows/NewVersionInfo.cpp @@ -128,8 +128,8 @@ rct_window* window_new_version_open() window->max_height = MIN_WH; window->colours[0] = COLOUR_GREY; - window->colours[1] = COLOUR_LIGHT_BLUE; - window->colours[2] = COLOUR_LIGHT_BLUE; + window->colours[1] = COLOUR_DARK_GREEN; + window->colours[2] = COLOUR_DARK_GREEN; return window; } diff --git a/src/openrct2-ui/windows/TitleMenu.cpp b/src/openrct2-ui/windows/TitleMenu.cpp index 4702e975bf..9605ab003a 100644 --- a/src/openrct2-ui/windows/TitleMenu.cpp +++ b/src/openrct2-ui/windows/TitleMenu.cpp @@ -27,14 +27,18 @@ enum { WIDX_START_NEW_GAME, WIDX_CONTINUE_SAVED_GAME, WIDX_MULTIPLAYER, - WIDX_GAME_TOOLS + WIDX_GAME_TOOLS, + WIDX_NEW_VERSION, }; +static ScreenRect _filterRect; + static rct_widget window_title_menu_widgets[] = { - MakeWidget({0, 0}, {82, 82}, WWT_IMGBTN, 2, SPR_MENU_NEW_GAME, STR_START_NEW_GAME_TIP), - MakeWidget({0, 0}, {82, 82}, WWT_IMGBTN, 2, SPR_MENU_LOAD_GAME, STR_CONTINUE_SAVED_GAME_TIP), - MakeWidget({0, 0}, {82, 82}, WWT_IMGBTN, 2, SPR_G2_MENU_MULTIPLAYER, STR_SHOW_MULTIPLAYER_TIP), - MakeWidget({0, 0}, {82, 82}, WWT_IMGBTN, 2, SPR_MENU_TOOLBOX, STR_GAME_TOOLS_TIP), + MakeWidget({0, 28}, {82, 82}, WWT_IMGBTN, 2, SPR_MENU_NEW_GAME, STR_START_NEW_GAME_TIP), + MakeWidget({0, 28}, {82, 82}, WWT_IMGBTN, 2, SPR_MENU_LOAD_GAME, STR_CONTINUE_SAVED_GAME_TIP), + MakeWidget({0, 28}, {82, 82}, WWT_IMGBTN, 2, SPR_G2_MENU_MULTIPLAYER, STR_SHOW_MULTIPLAYER_TIP), + MakeWidget({0, 28}, {82, 82}, WWT_IMGBTN, 2, SPR_MENU_TOOLBOX, STR_GAME_TOOLS_TIP), + MakeWidget({0, 0}, {82 * 4, 28}, WWT_EMPTY, 1, STR_UPDATE_AVAILABLE), { WIDGETS_END }, }; @@ -42,6 +46,7 @@ static void window_title_menu_mouseup(rct_window *w, rct_widgetindex widgetIndex static void window_title_menu_mousedown(rct_window *w, rct_widgetindex widgetIndex, rct_widget* widget); static void window_title_menu_dropdown(rct_window *w, rct_widgetindex widgetIndex, int32_t dropdownIndex); static void window_title_menu_cursor(rct_window *w, rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords, int32_t *cursorId); +static void window_title_menu_invalidate(rct_window *w); static void window_title_menu_paint(rct_window *w, rct_drawpixelinfo *dpi); static rct_window_event_list window_title_menu_events = { @@ -70,7 +75,7 @@ static rct_window_event_list window_title_menu_events = { nullptr, window_title_menu_cursor, nullptr, - nullptr, + window_title_menu_invalidate, window_title_menu_paint, nullptr }; @@ -85,7 +90,7 @@ rct_window* window_title_menu_open() rct_window* window; window = window_create( - ScreenCoordsXY(0, context_get_height() - 154), 0, 100, &window_title_menu_events, WC_TITLE_MENU, + ScreenCoordsXY(0, context_get_height() - 182), 0, 100, &window_title_menu_events, WC_TITLE_MENU, WF_STICK_TO_BACK | WF_TRANSPARENT | WF_NO_BACKGROUND); window->widgets = window_title_menu_widgets; window->enabled_widgets @@ -97,7 +102,7 @@ rct_window* window_title_menu_open() rct_widgetindex i = 0; int32_t x = 0; - for (rct_widget* widget = window->widgets; widget->type != WWT_LAST; widget++) + for (rct_widget* widget = window->widgets; widget != &window->widgets[WIDX_NEW_VERSION]; widget++) { if (widget_is_enabled(window, i)) { @@ -113,7 +118,9 @@ rct_window* window_title_menu_open() i++; } window->width = x; + window->widgets[WIDX_NEW_VERSION].right = window->width; window->windowPos.x = (context_get_width() - window->width) / 2; + window->colours[1] = TRANSLUCENT(COLOUR_LIGHT_ORANGE); window_init_scroll_widgets(window); @@ -172,6 +179,9 @@ static void window_title_menu_mouseup(rct_window* w, rct_widgetindex widgetIndex context_open_window(WC_SERVER_LIST); } break; + case WIDX_NEW_VERSION: + context_open_window(WC_NEW_VERSION); + break; } } @@ -226,8 +236,19 @@ static void window_title_menu_cursor( gTooltipTimeout = 2000; } +static void window_title_menu_invalidate(rct_window* w) +{ + _filterRect = { w->windowPos.x, w->windowPos.y + 28, w->windowPos.x + w->width - 1, w->windowPos.y + 82 + 28 - 1 }; + if (OpenRCT2::GetContext()->HasNewVersionInfo()) + { + w->enabled_widgets |= (1ULL << WIDX_NEW_VERSION); + w->widgets[WIDX_NEW_VERSION].type = WWT_BUTTON; + _filterRect.Point1.y = w->windowPos.y; + } +} + static void window_title_menu_paint(rct_window* w, rct_drawpixelinfo* dpi) { - gfx_filter_rect(dpi, w->windowPos.x, w->windowPos.y, w->windowPos.x + w->width - 1, w->windowPos.y + 82 - 1, PALETTE_51); + gfx_filter_rect(dpi, _filterRect, PALETTE_51); window_draw_widgets(w, dpi); } diff --git a/src/openrct2-ui/windows/TopToolbar.cpp b/src/openrct2-ui/windows/TopToolbar.cpp index bd74de7594..f994971b79 100644 --- a/src/openrct2-ui/windows/TopToolbar.cpp +++ b/src/openrct2-ui/windows/TopToolbar.cpp @@ -121,6 +121,8 @@ enum FILE_MENU_DDIDX { // separator DDIDX_QUIT_TO_MENU = 10, DDIDX_EXIT_OPENRCT2 = 11, + // separator + DDIDX_UPDATE_AVAILABLE = 13, }; enum TOP_TOOLBAR_VIEW_MENU_DDIDX { @@ -488,6 +490,12 @@ static void window_top_toolbar_mousedown(rct_window* w, rct_widgetindex widgetIn gDropdownItemsFormat[10] = STR_QUIT_TO_MENU; gDropdownItemsFormat[11] = STR_EXIT_OPENRCT2; numItems = 12; + if (OpenRCT2::GetContext()->HasNewVersionInfo()) + { + gDropdownItemsFormat[12] = STR_EMPTY; + gDropdownItemsFormat[13] = STR_UPDATE_AVAILABLE; + numItems += 2; + } } window_dropdown_show_text( { w->windowPos.x + widget->left, w->windowPos.y + widget->top }, widget->height() + 1, w->colours[0] | 0x80, @@ -603,6 +611,9 @@ static void window_top_toolbar_dropdown(rct_window* w, rct_widgetindex widgetInd case DDIDX_EXIT_OPENRCT2: context_quit(); break; + case DDIDX_UPDATE_AVAILABLE: + context_open_window(WC_NEW_VERSION); + break; } break; case WIDX_CHEATS: diff --git a/src/openrct2/Context.cpp b/src/openrct2/Context.cpp index ab6d2d7b7a..7b0d5f4829 100644 --- a/src/openrct2/Context.cpp +++ b/src/openrct2/Context.cpp @@ -339,17 +339,6 @@ namespace OpenRCT2 crash_init(); - if (!_versionCheckFuture.valid()) - { - _versionCheckFuture = std::async(std::launch::async, [this] { - _newVersionInfo = get_latest_version(); - if (!String::StartsWith(gVersionInfoTag, _newVersionInfo.tag)) - { - _hasNewVersionInfo = true; - } - }); - } - if (gConfigGeneral.last_run_version != nullptr && String::Equals(gConfigGeneral.last_run_version, OPENRCT2_VERSION)) { gOpenRCT2ShowChangelog = false; @@ -486,6 +475,18 @@ namespace OpenRCT2 _titleScreen = std::make_unique(*_gameState); _uiContext->Initialise(); + + if (!_versionCheckFuture.valid()) + { + _versionCheckFuture = std::async(std::launch::async, [this] { + _newVersionInfo = get_latest_version(); + if (!String::StartsWith(gVersionInfoTag, _newVersionInfo.tag)) + { + _hasNewVersionInfo = true; + } + }); + } + return true; } diff --git a/src/openrct2/interface/Window.cpp b/src/openrct2/interface/Window.cpp index 324ddc7623..9dcb834e5f 100644 --- a/src/openrct2/interface/Window.cpp +++ b/src/openrct2/interface/Window.cpp @@ -1629,7 +1629,7 @@ void window_resize_gui(int32_t width, int32_t height) if (titleWind != nullptr) { titleWind->windowPos.x = (width - titleWind->width) / 2; - titleWind->windowPos.y = height - 154; + titleWind->windowPos.y = height - 182; } rct_window* exitWind = window_find_by_class(WC_TITLE_EXIT);