From 5bf9fa7822d93d0ee456fd843013c6e4fb4e34cd Mon Sep 17 00:00:00 2001 From: Rick Neeft Date: Mon, 13 Oct 2025 14:50:06 +0200 Subject: [PATCH 01/20] copy pasta --- CMakeLists.txt | 5 + src/figure/formation.c | 16 +- src/widget/city.c | 23 +- src/widget/newsidebar/new_city.c | 366 ++++++++++++ src/widget/newsidebar/new_city.h | 15 + src/widget/newsidebar/new_common.c | 39 ++ src/widget/newsidebar/new_common.h | 21 + src/widget/newsidebar/new_extra.c | 813 +++++++++++++++++++++++++++ src/widget/newsidebar/new_extra.h | 31 + src/widget/newsidebar/new_military.c | 681 ++++++++++++++++++++++ src/widget/newsidebar/new_military.h | 21 + src/widget/newsidebar/new_slide.c | 84 +++ src/widget/newsidebar/new_slide.h | 16 + src/widget/sidebar/common.h | 2 +- src/window/build_menu.c | 4 +- src/window/city.c | 45 +- src/window/main_menu.c | 3 +- 17 files changed, 2155 insertions(+), 30 deletions(-) create mode 100644 src/widget/newsidebar/new_city.c create mode 100644 src/widget/newsidebar/new_city.h create mode 100644 src/widget/newsidebar/new_common.c create mode 100644 src/widget/newsidebar/new_common.h create mode 100644 src/widget/newsidebar/new_extra.c create mode 100644 src/widget/newsidebar/new_extra.h create mode 100644 src/widget/newsidebar/new_military.c create mode 100644 src/widget/newsidebar/new_military.h create mode 100644 src/widget/newsidebar/new_slide.c create mode 100644 src/widget/newsidebar/new_slide.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c945b8ab8..240e4e866a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -620,6 +620,11 @@ set(WIDGET_FILES ${PROJECT_SOURCE_DIR}/src/widget/sidebar/extra.c ${PROJECT_SOURCE_DIR}/src/widget/sidebar/military.c ${PROJECT_SOURCE_DIR}/src/widget/sidebar/slide.c + ${PROJECT_SOURCE_DIR}/src/widget/newsidebar/new_city.c + ${PROJECT_SOURCE_DIR}/src/widget/newsidebar/new_common.c + ${PROJECT_SOURCE_DIR}/src/widget/newsidebar/new_extra.c + ${PROJECT_SOURCE_DIR}/src/widget/newsidebar/new_military.c + ${PROJECT_SOURCE_DIR}/src/widget/newsidebar/new_slide.c ) set(WINDOW_FILES ${PROJECT_SOURCE_DIR}/src/window/advisors.c diff --git a/src/figure/formation.c b/src/figure/formation.c index 1fb815288e..5b69d40ef4 100644 --- a/src/figure/formation.c +++ b/src/figure/formation.c @@ -23,6 +23,8 @@ #include +#include "widget/newsidebar/new_military.h" + #define FORMATION_ARRAY_SIZE_STEP 50 #define ORIGINAL_BUFFER_SIZE_PER_FORMATION 128 @@ -96,9 +98,10 @@ formation *formation_create_legion(int building_id, figure_type type) //standards and name - m->legion_flag_id = widget_sidebar_military_get_standard_image(m->legion_id); - m->legion_name_id = widget_sidebar_military_get_legion_name_id(m->legion_id); - m->legion_name_group = widget_sidebar_military_get_legion_name_group(m->legion_id); + //TODO: config (3x) + m->legion_flag_id = widget_new_sidebar_military_get_standard_image(m->legion_id); + m->legion_name_id = widget_new_sidebar_military_get_legion_name_id(m->legion_id); + m->legion_name_group = widget_new_sidebar_military_get_legion_name_group(m->legion_id); return m; } @@ -963,9 +966,10 @@ void formations_load_state(buffer *buf, buffer *totals, int version) f->legion_id = f->legion_id + f->is_legion; // 1-based index for legions } // after increasing number of legions, switched to 1-based index - f->legion_flag_id = widget_sidebar_military_get_standard_image(f->legion_id); - f->legion_name_id = widget_sidebar_military_get_legion_name_id(f->legion_id); - f->legion_name_group = widget_sidebar_military_get_legion_name_group(f->legion_id); + //TODO: config (3x) + f->legion_flag_id = widget_new_sidebar_military_get_standard_image(f->legion_id); + f->legion_name_id = widget_new_sidebar_military_get_legion_name_id(f->legion_id); + f->legion_name_group = widget_new_sidebar_military_get_legion_name_group(f->legion_id); } else { f->legion_flag_id = buffer_read_i32(buf); f->legion_name_id = buffer_read_i32(buf); diff --git a/src/widget/city.c b/src/widget/city.c index 637901a643..1deea46a6b 100644 --- a/src/widget/city.c +++ b/src/widget/city.c @@ -43,6 +43,8 @@ #include "window/building_info.h" #include "window/city.h" +#include "newsidebar/new_extra.h" + #define NO_POSITION ((unsigned int)-1) static struct { @@ -185,7 +187,8 @@ static void draw_construction_buttons(void) city_view_get_viewport(&x, &y, &width, &height); int x_offset = width - 4 * BLOCK_SIZE; int y_offset = 40; - if (((sidebar_extra_is_information_displayed(SIDEBAR_EXTRA_DISPLAY_GAME_SPEED) || !mouse_get()->is_touch) && width < 680) + //TODO: config + if (((new_sidebar_extra_is_information_displayed(NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED) || !mouse_get()->is_touch) && width < 680) && game_state_is_paused()) { y_offset = 100; } @@ -201,7 +204,8 @@ static void draw_construction_buttons(void) if ((mouse_get()->is_touch || config_get(CONFIG_UI_ALWAYS_SHOW_ROTATION_BUTTONS)) && building_construction_can_rotate()) { - if (!sidebar_extra_is_information_displayed(SIDEBAR_EXTRA_DISPLAY_GAME_SPEED)) { + //TODO: config + if (!new_sidebar_extra_is_information_displayed(NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED)) { x_offset = 4 * BLOCK_SIZE + 8; } else { x_offset = 16; @@ -225,7 +229,8 @@ static void draw_construction_buttons(void) void widget_city_draw_construction_buttons(void) { - if (!sidebar_extra_is_information_displayed(SIDEBAR_EXTRA_DISPLAY_GAME_SPEED)) { + //TODO: config + if (!new_sidebar_extra_is_information_displayed(NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED)) { draw_pause_button(); } draw_construction_buttons(); @@ -233,7 +238,8 @@ void widget_city_draw_construction_buttons(void) static int is_pause_button(int x, int y) { - return !sidebar_extra_is_information_displayed(SIDEBAR_EXTRA_DISPLAY_GAME_SPEED) && + //TODO: config + return !new_sidebar_extra_is_information_displayed(NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED) && x < 4 * BLOCK_SIZE + 4 && y >= 24 && y < 56 + 4 * BLOCK_SIZE; } @@ -245,7 +251,8 @@ static int is_cancel_construction_button(int x, int y) int touch_width = 5 * BLOCK_SIZE; int touch_height = 22 + 4 * BLOCK_SIZE; int x_offset = width - touch_width; - int y_offset = (sidebar_extra_is_information_displayed(SIDEBAR_EXTRA_DISPLAY_GAME_SPEED) && width < 680 + //TODO: config + int y_offset = (new_sidebar_extra_is_information_displayed(NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED) && width < 680 && game_state_is_paused()) ? 84 : 24; return x >= x_offset && x < x_offset + touch_width && y >= y_offset && y < y_offset + touch_height; @@ -256,7 +263,8 @@ static int is_rotate_backward_button(int x, int y) int city_x, city_y, width, height; city_view_get_viewport(&city_x, &city_y, &width, &height); - int sidebar_pause_button = sidebar_extra_is_information_displayed(SIDEBAR_EXTRA_DISPLAY_GAME_SPEED); + //TODO: config + int sidebar_pause_button = new_sidebar_extra_is_information_displayed(NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED); int x_offset = sidebar_pause_button ? 16 : 4 * BLOCK_SIZE + 4; int y_offset = sidebar_pause_button && width < 680 && game_state_is_paused() ? 84 : 24; return x >= x_offset && x < x_offset + 3 * BLOCK_SIZE && @@ -268,7 +276,8 @@ static int is_rotate_forward_button(int x, int y) int city_x, city_y, width, height; city_view_get_viewport(&city_x, &city_y, &width, &height); - int sidebar_pause_button = sidebar_extra_is_information_displayed(SIDEBAR_EXTRA_DISPLAY_GAME_SPEED); + //TODO: config + int sidebar_pause_button = new_sidebar_extra_is_information_displayed(NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED); int x_offset = sidebar_pause_button ? 4 * BLOCK_SIZE + 4 : 7 * BLOCK_SIZE + 4; int y_offset = sidebar_pause_button && width < 680 && game_state_is_paused() ? 84 : 24; return x >= x_offset && x < x_offset + 3 * BLOCK_SIZE && diff --git a/src/widget/newsidebar/new_city.c b/src/widget/newsidebar/new_city.c new file mode 100644 index 0000000000..c043b309d1 --- /dev/null +++ b/src/widget/newsidebar/new_city.c @@ -0,0 +1,366 @@ +#include "new_city.h" + +#include "building/menu.h" +#include "city/message.h" +#include "city/view.h" +#include "city/warning.h" +#include "core/config.h" +#include "core/direction.h" +#include "game/campaign.h" +#include "game/orientation.h" +#include "game/state.h" +#include "game/undo.h" +#include "graphics/image.h" +#include "graphics/image_button.h" +#include "graphics/lang_text.h" +#include "graphics/text.h" +#include "graphics/window.h" +#include "scenario/property.h" +#include "translation/translation.h" +#include "widget/city.h" +#include "widget/minimap.h" +#include "widget/newsidebar/new_common.h" +#include "widget/newsidebar/new_extra.h" +#include "widget/newsidebar/new_slide.h" +#include "window/advisors.h" +#include "window/build_menu.h" +#include "window/city.h" +#include "window/empire.h" +#include "window/message_dialog.h" +#include "window/message_list.h" +#include "window/overlay_menu.h" + +#define MINIMAP_Y_OFFSET 59 + +static void button_overlay(int param1, int param2); +static void button_collapse_expand(int param1, int param2); +static void button_build(int submenu, int param2); +static void button_undo(int param1, int param2); +static void button_messages(int param1, int param2); +static void button_help(int param1, int param2); +static void button_go_to_problem(int param1, int param2); +static void button_advisors(int param1, int param2); +static void button_empire(int param1, int param2); +static void button_toggle_grid(int param1, int param2); +static void button_rotate_north(int param1, int param2); +static void button_rotate(int clockwise, int param2); + +static image_button buttons_overlays_collapse_new_sidebar[] = { + {127, 5, 31, 20, IB_NORMAL, 90, 0, button_collapse_expand, button_none, 0, 0, 1}, + {4, 3, 117, 31, IB_NORMAL, 93, 0, button_overlay, button_help, 0, MESSAGE_DIALOG_OVERLAYS, 1} +}; + +static image_button button_expand_new_sidebar[] = { + {6, 4, 31, 20, IB_NORMAL, 90, 4, button_collapse_expand, button_none, 0, 0, 1} +}; + +static image_button buttons_build_collapsed[] = { + {2, 32, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 0, button_build, button_none, BUILD_MENU_VACANT_HOUSE, 0, 1}, + {2, 67, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 8, button_build, button_none, BUILD_MENU_CLEAR_LAND, 0, 1}, + {2, 102, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 12, button_build, button_none, BUILD_MENU_ROAD, 0, 1}, + {2, 137, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 4, button_build, button_none, BUILD_MENU_WATER, 0, 1}, + {2, 172, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 40, button_build, button_none, BUILD_MENU_HEALTH, 0, 1, "UI", "Asclepius Button"}, + {2, 207, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 28, button_build, button_none, BUILD_MENU_TEMPLES, 0, 1}, + {2, 242, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 24, button_build, button_none, BUILD_MENU_EDUCATION, 0, 1}, + {2, 277, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 20, button_build, button_none, BUILD_MENU_ENTERTAINMENT, 0, 1}, + {2, 312, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 16, button_build, button_none, BUILD_MENU_ADMINISTRATION, 0, 1}, + {2, 347, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 44, button_build, button_none, BUILD_MENU_ENGINEERING, 0, 1}, + {2, 382, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 36, button_build, button_none, BUILD_MENU_SECURITY, 0, 1}, + {2, 417, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 32, button_build, button_none, BUILD_MENU_INDUSTRY, 0, 1}, +}; + +static image_button buttons_build_expanded[] = { + {13, 277, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 0, button_build, button_none, BUILD_MENU_VACANT_HOUSE, 0, 1}, + {63, 277, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 8, button_build, button_none, BUILD_MENU_CLEAR_LAND, 0, 1}, + {113, 277, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 12, button_build, button_none, BUILD_MENU_ROAD, 0, 1}, + {13, 313, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 4, button_build, button_none, BUILD_MENU_WATER, 0, 1}, + {63, 313, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 40, button_build, button_none, BUILD_MENU_HEALTH, 0, 1, "UI", "Asclepius Button"}, + {113, 313, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 28, button_build, button_none, BUILD_MENU_TEMPLES, 0, 1}, + {13, 349, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 24, button_build, button_none, BUILD_MENU_EDUCATION, 0, 1}, + {63, 349, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 20, button_build, button_none, BUILD_MENU_ENTERTAINMENT, 0, 1}, + {113, 349, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 16, button_build, button_none, BUILD_MENU_ADMINISTRATION, 0, 1}, + {13, 385, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 44, button_build, button_none, BUILD_MENU_ENGINEERING, 0, 1}, + {63, 385, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 36, button_build, button_none, BUILD_MENU_SECURITY, 0, 1}, + {113, 385, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 32, button_build, button_none, BUILD_MENU_INDUSTRY, 0, 1}, + {13, 421, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 48, button_undo, button_none, 0, 0, 1}, + {63, 421, 39, 26, IB_NORMAL, GROUP_MESSAGE_ICON, 18, button_messages, button_help, 0, MESSAGE_DIALOG_MESSAGES, 1}, + {113, 421, 39, 26, IB_BUILD, GROUP_MESSAGE_ICON, 22, button_go_to_problem, button_none, 0, 0, 1}, +}; + +static image_button buttons_top_expanded[] = { + {7, 155, 71, 23, IB_NORMAL, GROUP_SIDEBAR_ADVISORS_EMPIRE, 0, button_advisors, button_none, 0, 0, 1}, + {84, 155, 71, 23, IB_NORMAL, GROUP_SIDEBAR_ADVISORS_EMPIRE, 3, button_empire, button_help, 0, MESSAGE_DIALOG_EMPIRE_MAP, 1}, + {7, 184, 33, 22, IB_NORMAL, 0, 0, button_toggle_grid, button_none, 0, 0, 1, "UI", "Toggle Grid Button" }, + {46, 184, 33, 22, IB_NORMAL, GROUP_SIDEBAR_BRIEFING_ROTATE_BUTTONS, 3, button_rotate_north, button_none, 0, 0, 1}, + {84, 184, 33, 22, IB_NORMAL, GROUP_SIDEBAR_BRIEFING_ROTATE_BUTTONS, 6, button_rotate, button_none, 0, 0, 1}, + {123, 184, 33, 22, IB_NORMAL, GROUP_SIDEBAR_BRIEFING_ROTATE_BUTTONS, 9, button_rotate, button_none, 1, 0, 1}, +}; + +static struct { + int focus_button_for_tooltip; +} data; + +static void draw_overlay_text(int x_offset) +{ + if (game_state_overlay()) { + const uint8_t *text = get_current_overlay_text(); + text_draw_centered(text, x_offset, 32, 117, FONT_NORMAL_GREEN, 0); + } else { + lang_text_draw_centered(6, 4, x_offset, 32, 117, FONT_NORMAL_GREEN); + } +} + +static void draw_new_sidebar_remainder(int x_offset, int is_collapsed) +{ + int width = SIDEBAR_EXPANDED_WIDTH; + if (is_collapsed) { + width = SIDEBAR_COLLAPSED_WIDTH; + } + int available_height = new_sidebar_common_get_height() - SIDEBAR_MAIN_SECTION_HEIGHT; + int extra_height = new_sidebar_extra_draw_background(x_offset, SIDEBAR_FILLER_Y_OFFSET, + width, available_height, is_collapsed, NEW_SIDEBAR_EXTRA_DISPLAY_ALL); + new_sidebar_extra_draw_foreground(); + int relief_y_offset = SIDEBAR_FILLER_Y_OFFSET + extra_height; + new_sidebar_common_draw_relief(x_offset, relief_y_offset, GROUP_SIDE_PANEL, is_collapsed); +} + +static void draw_number_of_messages(int x_offset) +{ + int messages = city_message_count(); + int show_messages = game_campaign_is_original() || messages > 0 || scenario_intro_message(); + buttons_build_expanded[13].enabled = show_messages; + buttons_build_expanded[14].enabled = city_message_problem_area_count(); + if (show_messages) { + int width = text_get_number_width(messages, '@', "", FONT_SMALL_PLAIN); + text_draw_number(messages, '@', "", (x_offset + 100) - width, 452, FONT_SMALL_PLAIN, COLOR_BLACK); //top + text_draw_number(messages, '@', "", (x_offset + 100) - width, 454, FONT_SMALL_PLAIN, COLOR_BLACK); //bottom + text_draw_number(messages, '@', "", (x_offset + 99) - width, 453, FONT_SMALL_PLAIN, COLOR_BLACK); //left + text_draw_number(messages, '@', "", (x_offset + 101) - width, 453, FONT_SMALL_PLAIN, COLOR_BLACK); //right + text_draw_number(messages, '@', "", (x_offset + 100) - width, 453, FONT_SMALL_PLAIN, COLOR_WHITE); + } +} + +static void draw_buttons_collapsed(int x_offset) +{ + image_buttons_draw(x_offset, 24, button_expand_new_sidebar, 1); + image_buttons_draw(x_offset, 24, buttons_build_collapsed, 12); +} + +static void draw_buttons_expanded(int x_offset) +{ + buttons_build_expanded[12].enabled = game_can_undo(); + image_buttons_draw(x_offset, 24, buttons_overlays_collapse_new_sidebar, 2); + image_buttons_draw(x_offset, 24, buttons_build_expanded, 15); + image_buttons_draw(x_offset, 24, buttons_top_expanded, 6); +} + +static void draw_collapsed_background(void) +{ + int x_offset = new_sidebar_common_get_x_offset_collapsed(); + image_draw(image_group(GROUP_SIDE_PANEL), x_offset, 24, COLOR_MASK_NONE, SCALE_NONE); + draw_buttons_collapsed(x_offset); + draw_new_sidebar_remainder(x_offset, 1); +} + +static void draw_expanded_background(int x_offset) +{ + image_draw(image_group(GROUP_SIDE_PANEL) + 1, x_offset, 24, COLOR_MASK_NONE, SCALE_NONE); + draw_buttons_expanded(x_offset); + draw_overlay_text(x_offset + 4); + draw_number_of_messages(x_offset); + image_draw(window_build_menu_image(), x_offset + 6, 239, COLOR_MASK_NONE, SCALE_NONE); + widget_minimap_update(0); + widget_minimap_draw_decorated(x_offset + 8, MINIMAP_Y_OFFSET, MINIMAP_WIDTH, MINIMAP_HEIGHT); + + draw_new_sidebar_remainder(x_offset, 0); +} + +void widget_new_sidebar_city_draw_background(void) +{ + if (city_view_is_sidebar_collapsed()) { + draw_collapsed_background(); + } else { + draw_expanded_background(new_sidebar_common_get_x_offset_expanded()); + } +} + +static void enable_building_buttons(void) +{ + for (int i = 0; i < 12; i++) { + buttons_build_expanded[i].enabled = 1; + if (building_menu_count_items(buttons_build_expanded[i].parameter1) <= 0) { + buttons_build_expanded[i].enabled = 0; + } + + buttons_build_collapsed[i].enabled = 1; + if (building_menu_count_items(buttons_build_collapsed[i].parameter1) <= 0) { + buttons_build_collapsed[i].enabled = 0; + } + } +} + +void widget_new_sidebar_city_draw_foreground(void) +{ + if (building_menu_has_changed()) { + enable_building_buttons(); + } + if (city_view_is_sidebar_collapsed()) { + int x_offset = new_sidebar_common_get_x_offset_collapsed(); + draw_buttons_collapsed(x_offset); + } else { + int x_offset = new_sidebar_common_get_x_offset_expanded(); + draw_buttons_expanded(x_offset); + draw_overlay_text(x_offset + 4); + widget_minimap_draw_decorated(x_offset + 8, MINIMAP_Y_OFFSET, MINIMAP_WIDTH, MINIMAP_HEIGHT); + draw_number_of_messages(x_offset); + } + new_sidebar_extra_draw_foreground(); +} + +int widget_new_sidebar_city_handle_mouse(const mouse *m) +{ + if (widget_city_has_input()) { + return 0; + } + int handled = 0; + unsigned int button_id; + data.focus_button_for_tooltip = 0; + if (city_view_is_sidebar_collapsed()) { + int x_offset = new_sidebar_common_get_x_offset_collapsed(); + handled |= image_buttons_handle_mouse(m, x_offset, 24, button_expand_new_sidebar, 1, &button_id); + if (button_id) { + data.focus_button_for_tooltip = 12; + } + handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_build_collapsed, 12, &button_id); + if (button_id) { + data.focus_button_for_tooltip = button_id + 19; + } + } else { + if (widget_minimap_handle_mouse(m)) { + return 1; + } + int x_offset = new_sidebar_common_get_x_offset_expanded(); + handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_overlays_collapse_new_sidebar, 2, &button_id); + if (button_id) { + data.focus_button_for_tooltip = button_id + 9; + } + handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_build_expanded, 15, &button_id); + if (button_id) { + data.focus_button_for_tooltip = button_id + 19; + } + handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_top_expanded, 6, &button_id); + if (button_id) { + data.focus_button_for_tooltip = button_id + 39; + } + handled |= new_sidebar_extra_handle_mouse(m); + } + return handled; +} + +int widget_new_sidebar_city_handle_mouse_build_menu(const mouse *m) +{ + if (city_view_is_sidebar_collapsed()) { + return image_buttons_handle_mouse(m, + new_sidebar_common_get_x_offset_collapsed(), 24, buttons_build_collapsed, 12, 0); + } else { + return image_buttons_handle_mouse(m, + new_sidebar_common_get_x_offset_expanded(), 24, buttons_build_expanded, 15, 0); + } +} + +int widget_new_sidebar_city_get_tooltip_text(tooltip_context *c) +{ + if (data.focus_button_for_tooltip) { + if (data.focus_button_for_tooltip == 42) { + c->translation_key = TR_TOGGLE_GRID; + return 0; + } + return data.focus_button_for_tooltip; + } + return new_sidebar_extra_get_tooltip(c); +} + +static void slide_finished(void) +{ + city_view_toggle_sidebar(); + window_city_show(); +} + +static void button_overlay(int param1, int param2) +{ + window_overlay_menu_show(); +} + +static void button_collapse_expand(int param1, int param2) +{ + city_view_start_sidebar_toggle(); + new_sidebar_slide(!city_view_is_sidebar_collapsed(), + draw_collapsed_background, draw_expanded_background, slide_finished); +} + +static void button_build(int submenu, int param2) +{ + window_build_menu_show(submenu); +} + +static void button_undo(int param1, int param2) +{ + window_build_menu_hide(); + game_undo_perform(); + window_invalidate(); +} + +static void button_messages(int param1, int param2) +{ + window_build_menu_hide(); + window_message_list_show(); +} + +static void button_help(int param1, int param2) +{ + window_build_menu_hide(); + window_message_dialog_show(param2, window_city_draw_all); +} + +static void button_go_to_problem(int param1, int param2) +{ + window_build_menu_hide(); + int grid_offset = city_message_next_problem_area_grid_offset(); + if (grid_offset) { + city_view_go_to_grid_offset(grid_offset); + window_city_show(); + } else { + window_invalidate(); + } +} + +static void button_advisors(int param1, int param2) +{ + window_advisors_show_checked(); +} + +static void button_empire(int param1, int param2) +{ + window_empire_show_checked(); +} + +static void button_toggle_grid(int param1, int param2) +{ + config_set(CONFIG_UI_SHOW_GRID, config_get(CONFIG_UI_SHOW_GRID) ^ 1); +} + +static void button_rotate_north(int param1, int param2) +{ + game_orientation_rotate_north(); + window_invalidate(); +} + +static void button_rotate(int clockwise, int param2) +{ + if (clockwise) { + game_orientation_rotate_right(); + } else { + game_orientation_rotate_left(); + } + window_invalidate(); +} diff --git a/src/widget/newsidebar/new_city.h b/src/widget/newsidebar/new_city.h new file mode 100644 index 0000000000..210da0efd7 --- /dev/null +++ b/src/widget/newsidebar/new_city.h @@ -0,0 +1,15 @@ +#ifndef WIDGET_NEW_SIDEBAR_CITY_H +#define WIDGET_NEW_SIDEBAR_CITY_H + +#include "graphics/tooltip.h" +#include "input/mouse.h" + +void widget_new_sidebar_city_draw_background(void); +void widget_new_sidebar_city_draw_foreground(void); + +int widget_new_sidebar_city_handle_mouse(const mouse *m); +int widget_new_sidebar_city_handle_mouse_build_menu(const mouse *m); + +int widget_new_sidebar_city_get_tooltip_text(tooltip_context *c); + +#endif // WIDGET_NEW_SIDEBAR_CITY_H diff --git a/src/widget/newsidebar/new_common.c b/src/widget/newsidebar/new_common.c new file mode 100644 index 0000000000..bbaa88a2e3 --- /dev/null +++ b/src/widget/newsidebar/new_common.c @@ -0,0 +1,39 @@ +#include "new_common.h" + +#include "city/view.h" +#include "graphics/image.h" +#include "graphics/screen.h" +#include "widget/minimap.h" + +int new_sidebar_common_get_x_offset_expanded(void) +{ + return screen_width() - SIDEBAR_EXPANDED_WIDTH; +} + +int new_sidebar_common_get_x_offset_collapsed(void) +{ + return screen_width() - SIDEBAR_COLLAPSED_WIDTH; +} + +int new_sidebar_common_get_height(void) +{ + return screen_height() - TOP_MENU_HEIGHT; +} + +void new_sidebar_common_draw_relief(int x_offset, int y_offset, int image_id, int is_collapsed) +{ + // relief images below panel + int image_base = image_group(image_id); + int image_offset = image_id == GROUP_SIDE_PANEL ? 2 : 1; + int y_max = screen_height(); + while (y_offset < y_max) { + if (y_max - y_offset <= 120) { + image_draw(image_base + image_offset + is_collapsed, x_offset, y_offset, COLOR_MASK_NONE, SCALE_NONE); + y_offset += 120; + } else { + image_draw(image_base + image_offset + image_offset + is_collapsed, x_offset, y_offset, + COLOR_MASK_NONE, SCALE_NONE); + y_offset += 285; + } + } +} diff --git a/src/widget/newsidebar/new_common.h b/src/widget/newsidebar/new_common.h new file mode 100644 index 0000000000..a0564a99dd --- /dev/null +++ b/src/widget/newsidebar/new_common.h @@ -0,0 +1,21 @@ +#ifndef WIDGET_NEW_SIDEBAR_COMMON_H +#define WIDGET_NEW_SIDEBAR_COMMON_H + +#include "graphics/menu.h" + +#define SIDEBAR_COLLAPSED_WIDTH 42 +#define SIDEBAR_EXPANDED_WIDTH 162 +#define SIDEBAR_MAIN_SECTION_HEIGHT 450 +#define SIDEBAR_FILLER_Y_OFFSET (SIDEBAR_MAIN_SECTION_HEIGHT + TOP_MENU_HEIGHT) +#define MINIMAP_WIDTH 146 +#define MINIMAP_HEIGHT 111 + +int new_sidebar_common_get_x_offset_expanded(void); + +int new_sidebar_common_get_x_offset_collapsed(void); + +int new_sidebar_common_get_height(void); + +void new_sidebar_common_draw_relief(int x_offset, int y_offset, int image_id, int is_collapsed); + +#endif // WIDGET_NEW_SIDEBAR_COMMON_H diff --git a/src/widget/newsidebar/new_extra.c b/src/widget/newsidebar/new_extra.c new file mode 100644 index 0000000000..f1636e078d --- /dev/null +++ b/src/widget/newsidebar/new_extra.c @@ -0,0 +1,813 @@ +#include "new_extra.h" + +#include "assets/assets.h" +#include "city/figures.h" +#include "city/finance.h" +#include "city/gods.h" +#include "city/labor.h" +#include "city/military.h" +#include "city/population.h" +#include "city/ratings.h" +#include "city/request.h" +#include "city/resource.h" +#include "core/config.h" +#include "core/image_group.h" +#include "core/lang.h" +#include "core/string.h" +#include "figure/formation_legion.h" +#include "game/resource.h" +#include "game/settings.h" +#include "game/state.h" +#include "graphics/arrow_button.h" +#include "graphics/button.h" +#include "graphics/generic_button.h" +#include "graphics/graphics.h" +#include "graphics/image.h" +#include "graphics/image_button.h" +#include "graphics/lang_text.h" +#include "graphics/menu.h" +#include "graphics/panel.h" +#include "graphics/text.h" +#include "scenario/criteria.h" +#include "scenario/invasion.h" +#include "scenario/property.h" +#include "scenario/request.h" +#include "translation/translation.h" +#include "window/advisor/imperial.h" +#include "window/empire.h" +#include "window/popup_dialog.h" + +#include + +#define EXTRA_INFO_LINE_SPACE 16 +#define EXTRA_INFO_VERTICAL_PADDING 8 +#define EXTRA_INFO_HEIGHT_GAME_SPEED 64 +#define EXTRA_INFO_HEIGHT_UNEMPLOYMENT 48 +#define EXTRA_INFO_HEIGHT_INVASIONS 48 +#define EXTRA_INFO_HEIGHT_GODS 64 +#define EXTRA_INFO_HEIGHT_RATINGS 176 +#define EXTRA_INFO_HEIGHT_REQUESTS_PANEL 48 +#define EXTRA_INFO_HEIGHT_REQUESTS_MIN EXTRA_INFO_LINE_SPACE + EXTRA_INFO_HEIGHT_REQUESTS_PANEL + +#define MAX_REQUESTS_TO_DISPLAY 5 +#define REQUEST_MONTHS_LEFT_FOR_RED_WARNING 3 + +static void button_game_speed(int is_down, int param2); +static void button_toggle_play_paused(int param1, int param2); +static void button_handle_request(const generic_button *button); + +static arrow_button arrow_buttons_speed[] = { + {11, 30, 17, 24, button_game_speed, 1, 0}, + {35, 30, 15, 24, button_game_speed, 0, 0}, +}; + +static image_button play_paused_button = { + 108, 29, 39, 26, IB_NORMAL, 0, 0, button_toggle_play_paused, button_none, 0, 0, 1, "UI", "Pause Button" +}; + +static generic_button buttons_emperor_requests[] = { + {2, 28, 158, 20, button_handle_request}, + {2, 76, 158, 20, button_handle_request, 0, 1}, + {2, 124, 158, 20, button_handle_request, 0, 2}, + {2, 172, 158, 20, button_handle_request, 0, 3}, + {2, 220, 158, 20, button_handle_request, 0, 4} +}; + +static const char *play_pause_button_image_names[] = { "Pause Button", "Play Button" }; + +typedef struct { + int value; + int target; +} objective; + +typedef struct { + int index; + int resource; + int amount; + int available; + int time; + int stockpiled; +} request; + +static struct { + int x_offset; + int y_offset; + int width; + int height; + int available_height; + int is_collapsed; + new_sidebar_extra_display info_to_display; + int game_speed; + struct { + int percentage; + int amount; + } unemployment; + struct { + objective culture; + objective prosperity; + objective peace; + objective favor; + objective population; + } objectives; + struct { + int happy; + int angry; + } gods; + int next_invasion; + unsigned int visible_requests; + unsigned int active_requests; + int troop_requests; + int objectives_y_offset; + int request_buttons_y_offset; + unsigned int focused_request_button_id; + unsigned int selected_request_id; + unsigned int selected_resource; + request requests[MAX_REQUESTS_TO_DISPLAY]; +} data; + +static int count_active_requests(void) +{ + int count = city_request_has_troop_request() + scenario_request_count_visible(); + return count > MAX_REQUESTS_TO_DISPLAY ? MAX_REQUESTS_TO_DISPLAY : count; +} + +static int sort_requests(const void *va, const void *vb) +{ + return ((request *) va)->time - ((request *) vb)->time; +} + +static new_sidebar_extra_display calculate_displayable_info(new_sidebar_extra_display info_to_display, int available_height) +{ + if (data.is_collapsed || !config_get(CONFIG_UI_SIDEBAR_INFO) || info_to_display == NEW_SIDEBAR_EXTRA_DISPLAY_NONE) { + return NEW_SIDEBAR_EXTRA_DISPLAY_NONE; + } + new_sidebar_extra_display result = NEW_SIDEBAR_EXTRA_DISPLAY_NONE; + if (available_height >= EXTRA_INFO_HEIGHT_GAME_SPEED) { + if (info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED) { + available_height -= EXTRA_INFO_HEIGHT_GAME_SPEED; + result |= NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED; + } + } else { + return result; + } + if (available_height >= EXTRA_INFO_HEIGHT_UNEMPLOYMENT) { + if (info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_UNEMPLOYMENT) { + available_height -= EXTRA_INFO_HEIGHT_UNEMPLOYMENT; + result |= NEW_SIDEBAR_EXTRA_DISPLAY_UNEMPLOYMENT; + } + } else { + return result; + } + if (available_height >= EXTRA_INFO_HEIGHT_INVASIONS) { + if (info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_INVASIONS) { + available_height -= EXTRA_INFO_HEIGHT_INVASIONS; + result |= NEW_SIDEBAR_EXTRA_DISPLAY_INVASIONS; + } + } else { + return result; + } + if (available_height >= EXTRA_INFO_HEIGHT_GODS) { + if (info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_GODS) { + available_height -= EXTRA_INFO_HEIGHT_GODS; + result |= NEW_SIDEBAR_EXTRA_DISPLAY_GODS; + } + } else { + return result; + } + if (available_height >= EXTRA_INFO_HEIGHT_REQUESTS_MIN) { + if (info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_REQUESTS) { + available_height -= EXTRA_INFO_HEIGHT_REQUESTS_MIN; + result |= NEW_SIDEBAR_EXTRA_DISPLAY_REQUESTS; + } + } + if (available_height >= EXTRA_INFO_HEIGHT_RATINGS) { + if (info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_RATINGS) { + available_height -= EXTRA_INFO_HEIGHT_RATINGS; + result |= NEW_SIDEBAR_EXTRA_DISPLAY_RATINGS; + } + } else { + return result; + } + + return result; +} + +static int calculate_extra_info_height(int available_height) +{ + if (data.info_to_display == NEW_SIDEBAR_EXTRA_DISPLAY_NONE) { + return 0; + } + int height = 0; + if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED) { + height += EXTRA_INFO_HEIGHT_GAME_SPEED; + } + if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_UNEMPLOYMENT) { + height += EXTRA_INFO_HEIGHT_UNEMPLOYMENT; + } + if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_INVASIONS) { + height += EXTRA_INFO_HEIGHT_INVASIONS; + } + if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_GODS) { + height += EXTRA_INFO_HEIGHT_GODS; + } + if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_REQUESTS) { + height += EXTRA_INFO_HEIGHT_REQUESTS_MIN; + unsigned int num_requests = count_active_requests(); + data.visible_requests = 1; + while (data.visible_requests < num_requests) { + if (height + EXTRA_INFO_HEIGHT_REQUESTS_PANEL > available_height) { + break; + } + height += EXTRA_INFO_HEIGHT_REQUESTS_PANEL; + data.visible_requests++; + } + } + if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_RATINGS) { + height += EXTRA_INFO_HEIGHT_RATINGS; + } + + return height; +} + +static void set_extra_info_objectives(void) +{ + data.objectives.culture.target = 0; + data.objectives.prosperity.target = 0; + data.objectives.peace.target = 0; + data.objectives.favor.target = 0; + data.objectives.population.target = 0; + + if (scenario_is_open_play()) { + return; + } + if (scenario_criteria_culture_enabled()) { + data.objectives.culture.target = scenario_criteria_culture(); + } + if (scenario_criteria_prosperity_enabled()) { + data.objectives.prosperity.target = scenario_criteria_prosperity(); + } + if (scenario_criteria_peace_enabled()) { + data.objectives.peace.target = scenario_criteria_peace(); + } + if (scenario_criteria_favor_enabled()) { + data.objectives.favor.target = scenario_criteria_favor(); + } + if (scenario_criteria_population_enabled()) { + data.objectives.population.target = scenario_criteria_population(); + } +} + +static int count_happy_gods(void) +{ + int happy_gods = 0; + for (int god = 0; god < MAX_GODS; god++) { + if (city_god_happy_bolts(god) > 0) { + happy_gods++; + } + } + return happy_gods; +} + +static int count_angry_gods(void) +{ + int angry_gods = 0; + for (int god = 0; god < 5; god++) { + if (city_god_wrath_bolts(god) > 0) { + angry_gods++; + } + } + return angry_gods; +} + +static int is_stockpiled_changed(resource_type resource) +{ + return city_resource_is_stockpiled(resource); +} + +static int update_extra_info_value(int value, int *field) +{ + if (value == *field) { + return 0; + } else { + *field = value; + return 1; + } +} + +static int update_extra_info(int is_background) +{ + int changed = 0; + if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED) { + changed |= update_extra_info_value(setting_game_speed(), &data.game_speed); + } + if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_UNEMPLOYMENT) { + changed |= update_extra_info_value(city_labor_unemployment_percentage(), &data.unemployment.percentage); + changed |= update_extra_info_value( + city_labor_workers_unemployed() - city_labor_workers_needed(), + &data.unemployment.amount + ); + } + if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_INVASIONS) { + int next_invasion = 0; + if (!city_figures_total_invading_enemies()) { + next_invasion = scenario_invasion_get_years_remaining() + 1; + } + changed |= update_extra_info_value(next_invasion, &data.next_invasion); + } + if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_GODS) { + changed |= update_extra_info_value(count_happy_gods(), &data.gods.happy); + changed |= update_extra_info_value(count_angry_gods(), &data.gods.angry); + } + if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_REQUESTS) { + int new_requests = update_extra_info_value(count_active_requests(), (int *) &data.active_requests); + new_requests |= update_extra_info_value(city_request_has_troop_request(), &data.troop_requests); + + if (data.troop_requests) { + changed |= update_extra_info_value(RESOURCE_TROOPS, &data.requests[0].resource); + changed |= update_extra_info_value(city_military_months_until_distant_battle(), &data.requests[0].time); + changed |= update_extra_info_value(city_military_distant_battle_enemy_strength(), &data.requests[0].amount); + changed |= update_extra_info_value(city_military_empire_service_legions(), &data.requests[0].available); + data.requests[0].index = 0; + } + int other_requests = data.active_requests - data.troop_requests; + int must_resort = 0; + for (int i = 0; i < other_requests; i++) { + request *slot = &data.requests[i + data.troop_requests]; + if (new_requests) { + slot->index = i; + } + const scenario_request *r = scenario_request_get_visible(slot->index); + changed |= update_extra_info_value(r->resource, &slot->resource); + if (r->months_to_comply > slot->time) { + must_resort = 1; + } + changed |= update_extra_info_value(r->months_to_comply, &slot->time); + changed |= update_extra_info_value(r->amount.requested, &slot->amount); + if (r->resource == RESOURCE_DENARII) { + changed |= update_extra_info_value(city_finance_treasury(), &slot->available); + } else { + changed |= update_extra_info_value(city_resource_get_amount_including_granaries(r->resource, + r->amount.requested, 0, 1), &slot->available); + } + + changed |= update_extra_info_value(is_stockpiled_changed(r->resource), &slot->stockpiled); + } + if (new_requests || must_resort) { + qsort(data.requests + data.troop_requests, other_requests, sizeof(request), sort_requests); + changed = 1; + } + } + + if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_RATINGS) { + if (is_background) { + set_extra_info_objectives(); + } + changed |= update_extra_info_value(city_rating_culture(), &data.objectives.culture.value); + changed |= update_extra_info_value(city_rating_prosperity(), &data.objectives.prosperity.value); + changed |= update_extra_info_value(city_rating_peace(), &data.objectives.peace.value); + changed |= update_extra_info_value(city_rating_favor(), &data.objectives.favor.value); + changed |= update_extra_info_value(city_population(), &data.objectives.population.value); + } + + return changed; +} + +static int draw_extra_info_objective( + int x_offset, int y_offset, int text_group, int text_id, objective *obj, int cut_off_at_parenthesis) +{ + if (cut_off_at_parenthesis) { + // Exception for Chinese: the string for "population" includes the hotkey " (6)" + // To fix that: cut the string off at the '(' + uint8_t tmp[100]; + string_copy(lang_get_string(text_group, text_id), tmp, 100); + for (int i = 0; i < 100 && tmp[i]; i++) { + if (tmp[i] == '(') { + tmp[i] = 0; + break; + } + } + text_draw(tmp, x_offset + 11, y_offset, FONT_NORMAL_WHITE, 0); + } else { + lang_text_draw(text_group, text_id, x_offset + 11, y_offset, FONT_NORMAL_WHITE); + } + font_t font = obj->value >= obj->target ? FONT_NORMAL_GREEN : FONT_NORMAL_RED; + int width = text_draw_number(obj->value, '@', "", x_offset + 11, y_offset + EXTRA_INFO_LINE_SPACE, font, 0); + text_draw_number(obj->target, '(', ")", x_offset + 11 + width, y_offset + EXTRA_INFO_LINE_SPACE, font, 0); + return EXTRA_INFO_LINE_SPACE * 2; +} + +static int get_text_offset_for_force_size(int force_size) +{ + if (force_size < 46) { + return 0; + } else if (force_size < 89) { + return 1; + } else { + return 2; + } +} + +static int draw_request_buttons(int y_offset) +{ + int original_offset = y_offset; + + y_offset += EXTRA_INFO_VERTICAL_PADDING; + + for (unsigned int i = 0; i < data.visible_requests; i++) { + const request *r = &data.requests[i]; + int base_button_y_offset = i * EXTRA_INFO_HEIGHT_REQUESTS_PANEL; + + if (data.visible_requests + 1 == data.active_requests && + data.height + EXTRA_INFO_HEIGHT_REQUESTS_PANEL > data.available_height) { + + buttons_emperor_requests[i].y = base_button_y_offset + 9; + buttons_emperor_requests[i].height = 30; + + text_draw_centered(translation_for(TR_SIDEBAR_EXTRA_REQUESTS_VIEW_ALL), + data.x_offset, y_offset + 11, data.width, FONT_NORMAL_GREEN, 0); + break; + } + buttons_emperor_requests[i].y = base_button_y_offset + 28; + buttons_emperor_requests[i].height = 20; + int width = data.x_offset + 10; + if (r->resource == RESOURCE_TROOPS) { + int image_id = resource_get_data(RESOURCE_WEAPONS)->image.icon; + const image *img = image_get(image_id); + int image_y_offset = (EXTRA_INFO_LINE_SPACE - img->height) / 2; + + image_draw(image_id, width, y_offset + image_y_offset - 2, COLOR_MASK_NONE, SCALE_NONE); + + int force_text_offset = get_text_offset_for_force_size(r->amount); + + text_draw_ellipsized(translation_for(TR_SIDEBAR_EXTRA_REQUESTS_SMALL_FORCE + force_text_offset), + data.x_offset + 32, y_offset - 7, data.width - 34, FONT_NORMAL_GREEN, 0); + + lang_text_draw_amount(8, 4, r->time, data.x_offset + 26, y_offset + 6, + r->time <= REQUEST_MONTHS_LEFT_FOR_RED_WARNING ? FONT_NORMAL_RED : FONT_NORMAL_GREEN); + + text_draw_centered(translation_for(TR_SIDEBAR_EXTRA_REQUESTS_SEND), + data.x_offset + 2, y_offset + 25, 158, FONT_NORMAL_GREEN, 0); + } else { + int image_id = resource_get_data(r->resource)->image.icon; + const image *img = image_get(image_id); + int image_y_offset = (EXTRA_INFO_LINE_SPACE - img->height) / 2; + + image_draw(image_id, width, y_offset + image_y_offset, COLOR_MASK_NONE, SCALE_NONE); + + width += img->width + 6; + + if (r->resource != RESOURCE_DENARII) { + int is_stockpiled = city_resource_is_stockpiled(r->resource); + int enough_resource = 0; + + int request_index = data.requests[i].index; + if (city_request_has_troop_request() && i != 0) { + request_index++; + } + + int status = city_request_get_status(request_index); + + // button text + if (status) { + if (status == CITY_REQUEST_STATUS_NOT_ENOUGH_RESOURCES) { + if (is_stockpiled) { + image_draw(assets_get_image_id("UI", "Store Icon"), + data.x_offset + 5, y_offset + 10, COLOR_MASK_NONE, SCALE_NONE); + text_draw_centered(translation_for(TR_SIDEBAR_EXTRA_REQUESTS_UNSTOCK), + data.x_offset + 2, y_offset + 25, 158, FONT_NORMAL_GREEN, 0); + } else { + text_draw_centered(translation_for(TR_SIDEBAR_EXTRA_REQUESTS_STOCK), + data.x_offset + 2, y_offset + 25, 158, FONT_NORMAL_GREEN, 0); + } + } else { + enough_resource = 1; + text_draw_centered(translation_for(TR_SIDEBAR_EXTRA_REQUESTS_SEND), + data.x_offset + 2, y_offset + 25, 158, FONT_NORMAL_GREEN, 0); + } + } + + // request current / total + width += text_draw_number(r->available, 0, "/", width, y_offset + 2, + enough_resource ? FONT_NORMAL_GREEN : FONT_NORMAL_RED, 0); + width += text_draw_number(r->amount, 0, "", + width - 5, y_offset + 2, enough_resource ? FONT_NORMAL_GREEN : FONT_NORMAL_RED, 0); + + } else { + width += text_draw_number(r->amount, 0, "", + width, y_offset + 2, FONT_NORMAL_GREEN, 0); + + text_draw_centered(translation_for(TR_SIDEBAR_EXTRA_REQUESTS_SEND), + data.x_offset + 2, y_offset + 25, 158, FONT_NORMAL_GREEN, 0); + } + + font_t font_color = r->time <= REQUEST_MONTHS_LEFT_FOR_RED_WARNING ? FONT_NORMAL_RED : FONT_NORMAL_GREEN; + + // request time left + text_draw(string_from_ascii(","), width - 12, y_offset + 2, FONT_NORMAL_GREEN, 0); + width += text_draw_number(r->time, 0, "", width, y_offset + 2, font_color, 0); + lang_text_draw_ellipsized(8, 4 + (r->time != 1), width, y_offset + 2, + data.width - (width - data.x_offset) - 4, font_color); + } + y_offset += EXTRA_INFO_HEIGHT_REQUESTS_PANEL; + } + return y_offset - original_offset; +} + +static void draw_extra_info_panel(void) +{ + int panel_blocks = data.height / BLOCK_SIZE; + graphics_draw_line(data.x_offset, data.x_offset, data.y_offset, data.y_offset + data.height, COLOR_WHITE); + graphics_draw_line(data.x_offset + data.width - 1, data.x_offset + data.width - 1, data.y_offset, + data.y_offset + data.height, COLOR_SIDEBAR); + inner_panel_draw(data.x_offset + 1, data.y_offset, data.width / BLOCK_SIZE, panel_blocks); + + int y_offset = data.y_offset + EXTRA_INFO_VERTICAL_PADDING; + + if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED) { + y_offset += EXTRA_INFO_VERTICAL_PADDING; + + lang_text_draw(45, 2, data.x_offset + 10, y_offset, FONT_NORMAL_WHITE); + y_offset += EXTRA_INFO_LINE_SPACE + EXTRA_INFO_VERTICAL_PADDING; + + text_draw_percentage(data.game_speed, data.x_offset + 60, y_offset - 2, FONT_NORMAL_GREEN); + + y_offset += EXTRA_INFO_VERTICAL_PADDING * 3; + } + + if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_UNEMPLOYMENT) { + y_offset += EXTRA_INFO_VERTICAL_PADDING; + + lang_text_draw(68, 148, data.x_offset + 10, y_offset, FONT_NORMAL_WHITE); + y_offset += EXTRA_INFO_LINE_SPACE; + + int text_width = text_draw_percentage(data.unemployment.percentage, + data.x_offset + 10, y_offset, FONT_NORMAL_GREEN); + text_draw_number(data.unemployment.amount, '(', ")", + data.x_offset + 10 + text_width, y_offset, FONT_NORMAL_GREEN, 0); + + y_offset += EXTRA_INFO_VERTICAL_PADDING * 3; + } + + if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_INVASIONS) { + y_offset += EXTRA_INFO_VERTICAL_PADDING; + + text_draw(translation_for(TR_SIDEBAR_EXTRA_INVASIONS), data.x_offset + 10, y_offset, FONT_NORMAL_WHITE, 0); + + y_offset += EXTRA_INFO_VERTICAL_PADDING * 2 + 4; + + font_t font_type = data.next_invasion == 0 || data.next_invasion == 2 ? FONT_NORMAL_RED : FONT_NORMAL_GREEN; + + text_draw_centered(translation_for(TR_SIDEBAR_EXTRA_INVASION_UNDERWAY + data.next_invasion), + data.x_offset + 2, y_offset, data.width - 4, font_type, 0); + + y_offset += EXTRA_INFO_LINE_SPACE + 4; + } + + if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_GODS) { + y_offset += EXTRA_INFO_VERTICAL_PADDING; + + text_draw(translation_for(TR_SIDEBAR_EXTRA_GODS), data.x_offset + 10, y_offset, FONT_NORMAL_WHITE, 0); + y_offset += EXTRA_INFO_LINE_SPACE + EXTRA_INFO_VERTICAL_PADDING; + + font_t font_type = data.gods.angry > 0 ? FONT_NORMAL_RED : FONT_NORMAL_GREEN; + int width = text_draw_number(data.gods.angry, 0, "", data.x_offset + 42, y_offset + 2, font_type, 0); + image_draw(image_group(GROUP_GOD_BOLT), data.x_offset + 42 + width, y_offset - 2, COLOR_MASK_NONE, SCALE_NONE); + + static int happy_image_id; + if (!happy_image_id) { + happy_image_id = assets_get_image_id("UI", "Happy God Icon"); + } + width = text_draw_number(data.gods.happy, 0, "", data.x_offset + 82, y_offset + 2, FONT_NORMAL_GREEN, 0); + image_draw(happy_image_id, data.x_offset + 82 + width, y_offset - 2, COLOR_MASK_NONE, SCALE_NONE); + + y_offset += EXTRA_INFO_VERTICAL_PADDING * 2; + } + + if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_RATINGS) { + y_offset += EXTRA_INFO_LINE_SPACE; + + data.objectives_y_offset = y_offset; + + y_offset += draw_extra_info_objective(data.x_offset, y_offset, 53, 1, &data.objectives.culture, 0); + y_offset += draw_extra_info_objective(data.x_offset, y_offset, 53, 2, &data.objectives.prosperity, 0); + y_offset += draw_extra_info_objective(data.x_offset, y_offset, 53, 3, &data.objectives.peace, 0); + y_offset += draw_extra_info_objective(data.x_offset, y_offset, 53, 4, &data.objectives.favor, 0); + y_offset += draw_extra_info_objective(data.x_offset, y_offset, 4, 6, &data.objectives.population, 1); + } + + if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_REQUESTS) { + y_offset += EXTRA_INFO_VERTICAL_PADDING + 4; + lang_text_draw(44, 40, data.x_offset + 10, y_offset, FONT_NORMAL_WHITE); + y_offset += EXTRA_INFO_VERTICAL_PADDING * 3 - 4; + data.request_buttons_y_offset = y_offset; + + if (data.active_requests == 0) { + lang_text_draw_centered(44, 19, data.x_offset, y_offset + EXTRA_INFO_VERTICAL_PADDING + 4, + data.width, FONT_NORMAL_GREEN); + y_offset += EXTRA_INFO_HEIGHT_REQUESTS_PANEL; + } else { + y_offset += draw_request_buttons(y_offset); + } + } +} + +int new_sidebar_extra_draw_background(int x_offset, int y_offset, int width, int available_height, + int is_collapsed, new_sidebar_extra_display info_to_display) +{ + data.is_collapsed = is_collapsed; + data.x_offset = x_offset; + data.y_offset = y_offset; + data.width = width; + data.info_to_display = calculate_displayable_info(info_to_display, available_height); + data.available_height = available_height; + data.height = calculate_extra_info_height(available_height); + + if (data.info_to_display != NEW_SIDEBAR_EXTRA_DISPLAY_NONE) { + update_extra_info(1); + draw_extra_info_panel(); + } + return data.height; +} + +static void draw_extra_info_buttons(void) +{ + if (update_extra_info(0)) { + // Updates displayed speed % after clicking the arrows + draw_extra_info_panel(); + } + if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED) { + if (!play_paused_button.pressed) { + play_paused_button.image_name = play_pause_button_image_names[game_state_is_paused()]; + } + arrow_buttons_draw(data.x_offset, data.y_offset, arrow_buttons_speed, 2); + image_buttons_draw(data.x_offset, data.y_offset, &play_paused_button, 1); + } + if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_REQUESTS && data.active_requests) { + for (unsigned int i = 0; i < data.visible_requests; i++) { + button_border_draw(data.x_offset + 2, data.request_buttons_y_offset + buttons_emperor_requests[i].y, + data.width - 4, buttons_emperor_requests[i].height, i == data.focused_request_button_id - 1); + } + } +} + +void new_sidebar_extra_draw_foreground(void) +{ + draw_extra_info_buttons(); +} + +int new_sidebar_extra_handle_mouse(const mouse *m) +{ + if ((data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED) && + (arrow_buttons_handle_mouse(m, data.x_offset, data.y_offset, arrow_buttons_speed, 2, 0) || + image_buttons_handle_mouse(m, data.x_offset, data.y_offset, &play_paused_button, 1, 0))) { + return 1; + } + if ((data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_REQUESTS) && + generic_buttons_handle_mouse(m, data.x_offset, data.request_buttons_y_offset, + buttons_emperor_requests, data.visible_requests, &data.focused_request_button_id)) { + return 1; + } + return 0; +} + +int new_sidebar_extra_get_tooltip(tooltip_context *c) +{ + if (!new_sidebar_extra_is_information_displayed(NEW_SIDEBAR_EXTRA_DISPLAY_RATINGS)) { + return 0; + } + const mouse *m = mouse_get(); + if (m->x < data.x_offset + 2 || m->x >= data.x_offset + data.width - 2 || m->y < data.objectives_y_offset || + m->y >= data.objectives_y_offset + EXTRA_INFO_LINE_SPACE * 8) { + return 0; + } + int text_id = 0; + selected_rating rating = (m->y - data.objectives_y_offset) / (EXTRA_INFO_LINE_SPACE * 2) + 1; + switch (rating) { + case SELECTED_RATING_CULTURE: + if (data.objectives.culture.value <= 90) { + text_id = 9 + city_rating_explanation_for(SELECTED_RATING_CULTURE); + } else { + text_id = 50; + } + break; + case SELECTED_RATING_PROSPERITY: + { + if (data.objectives.prosperity.value <= 90) { + text_id = 16 + city_rating_explanation_for(SELECTED_RATING_PROSPERITY); + } else { + text_id = 51; + } + break; + } + case SELECTED_RATING_PEACE: + if (data.objectives.peace.value <= 90) { + text_id = 41 + city_rating_explanation_for(SELECTED_RATING_PEACE); + } else { + text_id = 52; + } + break; + case SELECTED_RATING_FAVOR: + if (data.objectives.favor.value <= 90) { + text_id = 27 + city_rating_explanation_for(SELECTED_RATING_FAVOR); + } else { + text_id = 53; + } + break; + default: + return 0; + } + c->text_group = 53; + return text_id; +} + +static void button_game_speed(int is_down, int param2) +{ + if (is_down) { + setting_decrease_game_speed(); + } else { + setting_increase_game_speed(); + } +} + +static void button_toggle_play_paused(int param1, int param2) +{ + game_state_toggle_paused(); +} + + +static void confirm_nothing(int accepted, int checked) +{} + +static void confirm_send_troops(int accepted, int checked) +{ + if (accepted) { + formation_legions_dispatch_to_distant_battle(); + window_empire_show(); + } +} + +static void confirm_send_goods(int accepted, int checked) +{ + if (accepted) { + scenario_request_dispatch(data.selected_request_id); + if (!checked && city_resource_is_stockpiled(data.selected_resource)) { + city_resource_toggle_stockpiled(data.selected_resource); + } + } +} + +static void button_handle_request(const generic_button *button) +{ + int index = button->parameter1; + if (data.active_requests > data.visible_requests && index == (int) data.visible_requests - 1) { + window_advisors_show_advisor(ADVISOR_IMPERIAL); + return; + } + int request_index = data.requests[index].index; + if (city_request_has_troop_request() && index != 0) { + request_index++; + } + int status = city_request_get_status(request_index); + const request *r = &data.requests[index]; + + if (status) { + city_military_clear_empire_service_legions(); + switch (status) { + case CITY_REQUEST_STATUS_NO_LEGIONS_AVAILABLE: + window_popup_dialog_show(POPUP_DIALOG_NO_LEGIONS_AVAILABLE, confirm_nothing, 0); + break; + case CITY_REQUEST_STATUS_NO_LEGIONS_SELECTED: + window_popup_dialog_show(POPUP_DIALOG_NO_LEGIONS_SELECTED, confirm_nothing, 0); + break; + case CITY_REQUEST_STATUS_CONFIRM_SEND_LEGIONS: + window_popup_dialog_show(POPUP_DIALOG_SEND_TROOPS, confirm_send_troops, 2); + break; + case CITY_REQUEST_STATUS_NOT_ENOUGH_RESOURCES: + city_resource_toggle_stockpiled(r->resource); + break; + default: + data.selected_resource = r->resource; + data.selected_request_id = (status - CITY_REQUEST_STATUS_MAX) & + ~CITY_REQUEST_STATUS_RESOURCES_FROM_GRANARY; + if (status & CITY_REQUEST_STATUS_RESOURCES_FROM_GRANARY) { + window_popup_dialog_show_confirmation( + translation_for(TR_ADVISOR_DISPATCHING_FOOD_FROM_GRANARIES_TITLE), + translation_for(TR_ADVISOR_DISPATCHING_FOOD_FROM_GRANARIES_TEXT), + city_resource_is_stockpiled(r->resource) ? translation_for(TR_ADVISOR_KEEP_STOCKPILING) : 0, + confirm_send_goods); + } else { + window_popup_dialog_show_confirmation( + lang_get_string(5, POPUP_DIALOG_SEND_GOODS), + lang_get_string(5, POPUP_DIALOG_SEND_GOODS + 1), + city_resource_is_stockpiled(r->resource) ? translation_for(TR_ADVISOR_KEEP_STOCKPILING) : 0, + confirm_send_goods); + } + break; + } + } +} + +int new_sidebar_extra_is_information_displayed(new_sidebar_extra_display display) +{ + return (data.info_to_display & display) != 0; +} diff --git a/src/widget/newsidebar/new_extra.h b/src/widget/newsidebar/new_extra.h new file mode 100644 index 0000000000..0b8e6ff30e --- /dev/null +++ b/src/widget/newsidebar/new_extra.h @@ -0,0 +1,31 @@ +#ifndef WIDGET_NEW_SIDEBAR_FILLER_H +#define WIDGET_NEW_SIDEBAR_FILLER_H + +#include "graphics/tooltip.h" +#include "input/mouse.h" + +typedef enum { + NEW_SIDEBAR_EXTRA_DISPLAY_NONE = 0, + NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED = 1, + NEW_SIDEBAR_EXTRA_DISPLAY_UNEMPLOYMENT = 2, + NEW_SIDEBAR_EXTRA_DISPLAY_INVASIONS = 4, + NEW_SIDEBAR_EXTRA_DISPLAY_GODS = 8, + NEW_SIDEBAR_EXTRA_DISPLAY_RATINGS = 16, + NEW_SIDEBAR_EXTRA_DISPLAY_REQUESTS = 32, + NEW_SIDEBAR_EXTRA_DISPLAY_ALL = 63 +} new_sidebar_extra_display; + +/** + * @return The actual height of the extra info + */ +int new_sidebar_extra_draw_background(int x_offset, int y_offset, int width, int height, + int is_collapsed, new_sidebar_extra_display info_to_display); +void new_sidebar_extra_draw_foreground(void); + +int new_sidebar_extra_handle_mouse(const mouse *m); + +int new_sidebar_extra_get_tooltip(tooltip_context *c); + +int new_sidebar_extra_is_information_displayed(new_sidebar_extra_display display); + +#endif // WIDGET_NEW_SIDEBAR_FILLER_H diff --git a/src/widget/newsidebar/new_military.c b/src/widget/newsidebar/new_military.c new file mode 100644 index 0000000000..ee3e3b6390 --- /dev/null +++ b/src/widget/newsidebar/new_military.c @@ -0,0 +1,681 @@ +#include "new_military.h" + +#include "assets/assets.h" +#include "building/count.h" +#include "city/view.h" +#include "core/calc.h" +#include "figure/formation.h" +#include "figure/formation_legion.h" +#include "graphics/arrow_button.h" +#include "graphics/generic_button.h" +#include "graphics/graphics.h" +#include "graphics/image.h" +#include "graphics/image_button.h" +#include "graphics/lang_text.h" +#include "graphics/panel.h" +#include "graphics/screen.h" +#include "graphics/text.h" +#include "graphics/window.h" +#include "map/grid.h" +#include "sound/speech.h" +#include "widget/minimap.h" +#include "widget/newsidebar/new_city.h" +#include "widget/newsidebar/new_common.h" +#include "widget/newsidebar/new_extra.h" +#include "widget/newsidebar/new_slide.h" +#include "window/building/military.h" +#include "window/city.h" +#include "window/military_menu.h" + + +#define LAYOUTS_PER_LEGION 5 + +#define MILITARY_PANEL_HEIGHT 474 +#define Y_OFFSET_PANEL_START 176 +#define Y_OFFSET_LAYOUT_BUTTONS 156 +#define Y_OFFSET_BOTTOM_BUTTONS 257 +#define MILITARY_PANEL_BLOCKS 18 +#define CONTENT_PADDING 10 +#define CONTENT_WIDTH (SIDEBAR_EXPANDED_WIDTH - 2 * CONTENT_PADDING) + +static const int IMAGE_OFFSETS_TO_FORMATION[7] = { + FORMATION_COLUMN, + FORMATION_TORTOISE, + FORMATION_DOUBLE_LINE_1, + FORMATION_DOUBLE_LINE_2, + FORMATION_MOP_UP, + FORMATION_SINGLE_LINE_1, + FORMATION_SINGLE_LINE_2 +}; + +static const int LAYOUT_IMAGE_OFFSETS_LEGIONARY[2][LAYOUTS_PER_LEGION] = { + {0, 0, 2, 3, 4}, {0, 0, 3, 2, 4}, +}; + +static const int LAYOUT_IMAGE_OFFSETS_AUXILIARY[2][LAYOUTS_PER_LEGION] = { + {5, 6, 2, 3, 4}, {6, 5, 3, 2, 4}, +}; + +static const int LAYOUT_BUTTON_INDEXES_LEGIONARY[2][LAYOUTS_PER_LEGION] = { + { + FORMATION_TORTOISE, + FORMATION_COLUMN, + FORMATION_DOUBLE_LINE_1, + FORMATION_DOUBLE_LINE_2, + FORMATION_MOP_UP + }, + { + FORMATION_TORTOISE, + FORMATION_COLUMN, + FORMATION_DOUBLE_LINE_2, + FORMATION_DOUBLE_LINE_1, + FORMATION_MOP_UP + } +}; + +static const int LAYOUT_BUTTON_INDEXES_AUXILIARY[2][LAYOUTS_PER_LEGION] = { + { + FORMATION_SINGLE_LINE_1, + FORMATION_SINGLE_LINE_2, + FORMATION_DOUBLE_LINE_1, + FORMATION_DOUBLE_LINE_2, + FORMATION_MOP_UP + }, + { + FORMATION_SINGLE_LINE_2, + FORMATION_SINGLE_LINE_1, + FORMATION_DOUBLE_LINE_2, + FORMATION_DOUBLE_LINE_1, + FORMATION_MOP_UP + } +}; + +static void button_military_menu(int param1, int param2); +static void button_close_military_new_sidebar(int param1, int param2); +static void button_cycle_legion(int cycle_forward, int param2); +static void button_select_formation_layout(const generic_button *button); +static void button_go_to_legion(const generic_button *button); +static void button_return_to_fort(const generic_button *button); +static void button_empire_service(const generic_button *button); + +static image_button buttons_title_close[] = { + {123, 4, 39, 26, IB_NORMAL, GROUP_OK_CANCEL_SCROLL_BUTTONS, 4, + button_close_military_new_sidebar, button_none, 0, 0, 1}, + {4, 3, 117, 31, IB_NORMAL, 93, 0, button_military_menu, button_none, 0, 0, 1} +}; + +static arrow_button buttons_cycle_legion[] = { + {10, 10, 19, 24, button_cycle_legion, 0, 0}, + {126, 10, 21, 24, button_cycle_legion, 1, 0}, +}; + +static generic_button buttons_formation_layout[LAYOUTS_PER_LEGION - 2][LAYOUTS_PER_LEGION] = { + { + {8, 0, 46, 46, button_select_formation_layout}, + {58, 0, 46, 46, button_select_formation_layout, 0, 1}, + {108, 0, 46, 46, button_select_formation_layout, 0, 2} + }, + { + {33, 50, 46, 46, button_select_formation_layout}, + {33, 0, 46, 46, button_select_formation_layout, 0, 1}, + {83, 0, 46, 46, button_select_formation_layout, 0, 2}, + {83, 50, 46, 46, button_select_formation_layout, 0, 3} + }, + { + {33, 0, 46, 46, button_select_formation_layout}, + {83, 0, 46, 46, button_select_formation_layout, 0, 1}, + {8, 50, 46, 46, button_select_formation_layout, 0, 2}, + {58, 50, 46, 46, button_select_formation_layout, 0, 3}, + {108, 50, 46, 46, button_select_formation_layout, 0, 4} + } +}; + +static generic_button buttons_bottom[] = { + {16, 0, 30, 30, button_go_to_legion}, + {66, 0, 30, 30, button_return_to_fort}, + {116, 0, 30, 30, button_empire_service}, +}; + +typedef struct { + int formation_id; + int standard_id; //figure id of the standard in the figure array + int soldiers; + int health; + int morale; + int layout; + int is_at_fort; + int empire_service; +} legion_info; + +static struct { + legion_info active_legion; + unsigned int top_buttons_focus_id; + unsigned int inner_buttons_focus_id; + unsigned int bottom_buttons_focus_id; + int city_view_was_collapsed; +} data; + +static int available_layouts_for_legion(const formation *m) +{ + int layouts = LAYOUTS_PER_LEGION; + if (m->figure_type == FIGURE_FORT_LEGIONARY || m->figure_type == FIGURE_FORT_INFANTRY) { + if (m->has_military_training) { + layouts = LAYOUTS_PER_LEGION - 1; + } else { + layouts = LAYOUTS_PER_LEGION - 2; + } + } + return layouts; +} + +static void draw_layout_buttons(int x, int y, int background, const formation *m) +{ + int index = 0; + if (city_view_orientation() == DIR_6_LEFT || city_view_orientation() == DIR_2_RIGHT) { + index = 1; + } + const int *offsets = (m->figure_type == FIGURE_FORT_LEGIONARY || m->figure_type == FIGURE_FORT_INFANTRY) ? + LAYOUT_IMAGE_OFFSETS_LEGIONARY[index] : LAYOUT_IMAGE_OFFSETS_AUXILIARY[index]; + int formation_types = available_layouts_for_legion(m); + + int start_formation = LAYOUTS_PER_LEGION - formation_types; + const generic_button *button_offsets = buttons_formation_layout[formation_types - 3]; + + for (unsigned int i = start_formation; i < LAYOUTS_PER_LEGION; i++) { + const generic_button *btn = &button_offsets[i - start_formation]; + + if (background) { + image_draw(image_group(GROUP_FORT_FORMATIONS) + offsets[i], (x + btn->x + 3) * 2, (y + btn->y + 3) * 2, + COLOR_MASK_NONE, 2.0f); + } else { + int is_selected_formation = m->layout == IMAGE_OFFSETS_TO_FORMATION[offsets[i]]; + int is_button_focused = i == data.inner_buttons_focus_id - 1 + start_formation; + button_border_draw(x + btn->x, y + btn->y, 46, 46, is_button_focused || is_selected_formation); + } + } +} + +static int get_health_text_id(int health) +{ + if (health <= 0) { + return 26; + } else if (health <= 20) { + return 27; + } else if (health <= 40) { + return 28; + } else if (health <= 55) { + return 29; + } else if (health <= 70) { + return 30; + } else if (health <= 90) { + return 31; + } else { + return 32; + } +} + +int widget_new_sidebar_military_get_standard_image(int legion_id) +{ + switch (legion_id) { + case 0: return 0; // No standard for non-legion formations; + case 1: return image_group(GROUP_FIGURE_FORT_STANDARD_ICONS + 0); + case 2: return image_group(GROUP_FIGURE_FORT_STANDARD_ICONS) + 1; + case 3: return image_group(GROUP_FIGURE_FORT_STANDARD_ICONS) + 2; + case 4: return image_group(GROUP_FIGURE_FORT_STANDARD_ICONS) + 3; + case 5: return image_group(GROUP_FIGURE_FORT_STANDARD_ICONS) + 4; + case 6: return image_group(GROUP_FIGURE_FORT_STANDARD_ICONS) + 5; + case 7: return image_group(GROUP_FIGURE_FORT_STANDARD_ICONS) + 6; + case 8: return image_group(GROUP_FIGURE_FORT_STANDARD_ICONS) + 7; + case 9: return image_group(GROUP_FIGURE_FORT_STANDARD_ICONS) + 8; + case 10: return image_group(GROUP_FIGURE_FORT_STANDARD_ICONS) + 9; + case 11: return assets_get_image_id("UI", "11Legion_Elephants"); + case 12: return assets_get_image_id("UI", "12Legion_Thunder_Bolts"); + case 13: return assets_get_image_id("UI", "13Legion_Bulls"); + case 14: return assets_get_image_id("UI", "14Legion_Centaurs"); + case 15: return assets_get_image_id("UI", "15Legion_Octopi"); + case 16: return assets_get_image_id("UI", "16Legion_Bears"); + case 17: return assets_get_image_id("UI", "17Legion_Scorpions"); + case 18: return assets_get_image_id("UI", "18Legion_Camels"); + case 19: return assets_get_image_id("UI", "19Legion_Dolphins"); + case 20: return assets_get_image_id("UI", "20Legion_Sea_Goats"); + default: return image_group(GROUP_FIGURE_FORT_STANDARD_ICONS + 9); + } +} + +int widget_new_sidebar_military_get_legion_name_group(int legion_id) +{ + return legion_id <= 10 ? 138 : 10000; +} + +int widget_new_sidebar_military_get_legion_name_id(int legion_id) +{ + if (legion_id <= 10) { + return legion_id - 1; // old index was 0-based, now 1-based + } else { + return TR_BUILDING_FORT_STANDARD_ELEPHANTS + legion_id - 11; + } +} + +static void clear_focus_buttons(void) +{ + data.top_buttons_focus_id = 0; + data.inner_buttons_focus_id = 0; + data.bottom_buttons_focus_id = 0; +} + +static void clear_legion_info(legion_info *legion) +{ + legion->health = 0; + legion->layout = 0; + legion->morale = 0; + legion->soldiers = 0; + legion->is_at_fort = 0; + legion->empire_service = 0; +} + +static void update_legion_info(legion_info *legion, const formation *m) +{ + legion->health = calc_percentage(m->total_damage, m->max_total_damage); + legion->layout = m->layout; + legion->morale = m->morale; + legion->soldiers = formation_legion_count_alive_soldiers(m->id); + legion->is_at_fort = m->is_at_fort; + legion->empire_service = m->empire_service; +} + +static void draw_military_info_text(int x_offset, int y_offset) +{ + legion_info *legion = &data.active_legion; + const formation *m = formation_get(legion->formation_id); + update_legion_info(legion, m); + + int formation_image_id = m->legion_flag_id; + const image *formation_image = image_get(formation_image_id); + + // Legion name + image_draw(formation_image_id, + x_offset + (CONTENT_WIDTH - formation_image->width - formation_image->x_offset) / 2, y_offset + 12, + COLOR_MASK_NONE, SCALE_NONE); + + lang_text_draw_centered(m->legion_name_group, m->legion_name_id, x_offset, y_offset + 40, CONTENT_WIDTH, FONT_NORMAL_WHITE); + + // Number of soldiers + int width = text_draw_number(m->num_figures, '@', " ", x_offset, y_offset + 60, FONT_NORMAL_WHITE, 0); + if (m->figure_type == FIGURE_FORT_INFANTRY) { + text_draw(translation_for(TR_WINDOW_ADVISOR_MILITARY_INFANTRY), x_offset + width, y_offset + 60, FONT_NORMAL_WHITE, 0); + } else if (m->figure_type == FIGURE_FORT_ARCHER) { + text_draw(translation_for(TR_WINDOW_ADVISOR_MILITARY_ARCHER), x_offset + width, y_offset + 60, FONT_NORMAL_WHITE, 0); + } else if (m->figure_type == FIGURE_FORT_LEGIONARY) { + text_draw(translation_for(TR_WINDOW_ADVISOR_LEGIONARIES), x_offset + width, y_offset + 60, FONT_NORMAL_WHITE, 0); + } else if (m->figure_type == FIGURE_FORT_JAVELIN) { + text_draw(translation_for(TR_WINDOW_ADVISOR_JAVELIN), x_offset + width, y_offset + 60, FONT_NORMAL_WHITE, 0); + } else if (m->figure_type == FIGURE_FORT_MOUNTED) { + text_draw(translation_for(TR_WINDOW_ADVISOR_MOUNTED), x_offset + width, y_offset + 60, FONT_NORMAL_WHITE, 0); + } + // No soldiers + if (!m->num_figures) { + int group_id, text_id; + if (m->cursed_by_mars) { + group_id = 89; + text_id = 1; + } else if (building_count_active(BUILDING_BARRACKS)) { + group_id = 138; + text_id = 10; + } else { + group_id = 138; + text_id = 11; + } + lang_text_draw_multiline(group_id, text_id, x_offset, y_offset + 80, CONTENT_WIDTH, FONT_NORMAL_WHITE); + clear_legion_info(legion); + return; + } + + int ellipsized_width = CONTENT_WIDTH + CONTENT_PADDING / 2; + // Morale + lang_text_draw_ellipsized(138, 36, x_offset, y_offset + 80, ellipsized_width, FONT_NORMAL_WHITE); + lang_text_draw_ellipsized(138, 37 + m->morale / 5, x_offset + 4, y_offset + 98, + ellipsized_width, m->morale < 13 ? FONT_NORMAL_RED : FONT_NORMAL_GREEN); + + // Health + lang_text_draw_ellipsized(138, 24, x_offset, y_offset + 120, ellipsized_width, FONT_NORMAL_WHITE); + lang_text_draw_ellipsized(138, get_health_text_id(legion->health), x_offset + 4, y_offset + 138, + ellipsized_width, legion->health < 55 ? FONT_NORMAL_GREEN : FONT_NORMAL_RED); +} + +static void draw_military_info_buttons(int x_offset, int y_offset) +{ + if (!data.active_legion.soldiers) { + return; + } + const formation *m = formation_get(data.active_legion.formation_id); + // Formation layout + draw_layout_buttons(x_offset, y_offset + Y_OFFSET_LAYOUT_BUTTONS, 1, m); + + int formation_options_image = image_group(GROUP_FORT_ICONS); + + // Go to legion button + const generic_button *btn = buttons_bottom; + image_draw(formation_options_image, x_offset + btn->x + 3, y_offset + 260, COLOR_MASK_NONE, SCALE_NONE); + + // Return to fort button + ++btn; + image_draw(formation_options_image + 1 + m->is_at_fort, x_offset + btn->x + 3, y_offset + 260, + COLOR_MASK_NONE, SCALE_NONE); + + // Empire service button + ++btn; + image_draw(formation_options_image + 4 - m->empire_service, x_offset + btn->x + 3, y_offset + 260, + COLOR_MASK_NONE, SCALE_NONE); +} + +static void draw_military_panel_background(int x_offset) +{ + graphics_draw_line(x_offset, x_offset, Y_OFFSET_PANEL_START, + Y_OFFSET_PANEL_START + MILITARY_PANEL_BLOCKS * BLOCK_SIZE, COLOR_WHITE); + graphics_draw_line(x_offset + SIDEBAR_EXPANDED_WIDTH - 1, x_offset + SIDEBAR_EXPANDED_WIDTH - 1, + Y_OFFSET_PANEL_START, Y_OFFSET_PANEL_START + MILITARY_PANEL_BLOCKS * BLOCK_SIZE, COLOR_SIDEBAR); + inner_panel_draw(x_offset + 1, Y_OFFSET_PANEL_START + 10, + SIDEBAR_EXPANDED_WIDTH / BLOCK_SIZE, MILITARY_PANEL_BLOCKS); + inner_panel_draw(x_offset + 1, Y_OFFSET_PANEL_START, SIDEBAR_EXPANDED_WIDTH / BLOCK_SIZE, 1); + + draw_military_info_text(x_offset + CONTENT_PADDING, Y_OFFSET_PANEL_START); + draw_military_info_buttons(x_offset, Y_OFFSET_PANEL_START); +} + +static void draw_legion_buttons(int x_offset, int y_offset) +{ + int num_legions = formation_get_num_legions(); + if (num_legions > 1) { + arrow_buttons_draw(x_offset, y_offset, buttons_cycle_legion, 2); + } + const formation *m = formation_get(data.active_legion.formation_id); + if (m->num_figures) { + draw_layout_buttons(x_offset, y_offset + Y_OFFSET_LAYOUT_BUTTONS, 0, m); + for (unsigned int i = 0; i < 3; i++) { + button_border_draw(x_offset + buttons_bottom[i].x, y_offset + Y_OFFSET_BOTTOM_BUTTONS, + 30, 30, data.bottom_buttons_focus_id == i + 1); + } + } + +} + +static void draw_background(int x_offset) +{ + image_draw(image_group(GROUP_SIDE_PANEL) + 1, x_offset, 24, COLOR_MASK_NONE, SCALE_NONE); + image_buttons_draw(x_offset, 24, buttons_title_close, 2); + lang_text_draw_centered(61, 5, x_offset, 32, 117, FONT_NORMAL_GREEN); + widget_minimap_update(0); + widget_minimap_draw_decorated(x_offset + 8, 59, MINIMAP_WIDTH, MINIMAP_HEIGHT); + draw_military_panel_background(x_offset); + draw_legion_buttons(x_offset, Y_OFFSET_PANEL_START); + int extra_height = new_sidebar_extra_draw_background(x_offset, MILITARY_PANEL_HEIGHT, + SIDEBAR_EXPANDED_WIDTH, new_sidebar_common_get_height() - MILITARY_PANEL_HEIGHT + TOP_MENU_HEIGHT, + 0, NEW_SIDEBAR_EXTRA_DISPLAY_ALL); + new_sidebar_extra_draw_foreground(); + + new_sidebar_common_draw_relief(x_offset, MILITARY_PANEL_HEIGHT + extra_height, GROUP_SIDE_PANEL, 0); +} + +void widget_new_sidebar_military_draw_background(void) +{ + draw_background(new_sidebar_common_get_x_offset_expanded()); +} + +static int has_legion_changed(const legion_info *legion, const formation *m) +{ + return legion->health != calc_percentage(m->total_damage, m->max_total_damage) || + legion->layout != m->layout || + legion->morale != m->morale || + legion->soldiers != m->num_figures || + legion->is_at_fort != m->is_at_fort || + legion->empire_service != m->empire_service; +} + +static void draw_military_panel_foreground(int x_offset) +{ + const formation *m = formation_get(data.active_legion.formation_id); + if (has_legion_changed(&data.active_legion, m)) { + draw_military_panel_background(x_offset); + } + draw_legion_buttons(x_offset, Y_OFFSET_PANEL_START); +} + +static void draw_foreground(int x_offset) +{ + widget_minimap_draw_decorated(x_offset + 8, 59, MINIMAP_WIDTH, MINIMAP_HEIGHT); + image_buttons_draw(x_offset, 24, buttons_title_close, 2); + lang_text_draw_centered(61, 5, x_offset, 32, 117, FONT_NORMAL_GREEN); + draw_military_panel_foreground(x_offset); + new_sidebar_extra_draw_foreground(); +} + +void widget_new_sidebar_military_draw_foreground(void) +{ + draw_foreground(new_sidebar_common_get_x_offset_expanded()); +} + +static void draw_sliding(int x_offset) +{ + draw_background(x_offset); + draw_foreground(x_offset); +} + +int widget_new_sidebar_military_handle_input(const mouse *m) +{ + int x_offset = new_sidebar_common_get_x_offset_expanded(); + if (image_buttons_handle_mouse(m, x_offset, 24, buttons_title_close, 2, &data.top_buttons_focus_id)) { + return 1; + } + int num_legions = formation_get_num_legions(); + if (num_legions > 1 && + arrow_buttons_handle_mouse(m, x_offset, Y_OFFSET_PANEL_START, buttons_cycle_legion, 2, 0)) { + return 1; + } + const formation *selected_legion = formation_get(data.active_legion.formation_id); + if (data.active_legion.soldiers > 0) { + generic_button *layout_buttons = buttons_formation_layout[available_layouts_for_legion(selected_legion) - 3]; + if (generic_buttons_handle_mouse(m, x_offset, Y_OFFSET_PANEL_START + Y_OFFSET_LAYOUT_BUTTONS, + layout_buttons, 5, &data.inner_buttons_focus_id)) { + return 1; + } + if (generic_buttons_handle_mouse(m, x_offset, Y_OFFSET_PANEL_START + Y_OFFSET_BOTTOM_BUTTONS, + buttons_bottom, 3, &data.bottom_buttons_focus_id)) { + return 1; + } + } + return new_sidebar_extra_handle_mouse(m); +} + +static int get_layout_text_id(int layout) +{ + switch (layout) { + case FORMATION_SINGLE_LINE_1: + case FORMATION_SINGLE_LINE_2: + return 16; + case FORMATION_DOUBLE_LINE_1: + case FORMATION_DOUBLE_LINE_2: + return 14; + case FORMATION_TORTOISE: + return 12; + case FORMATION_MOP_UP: + return 15; + case FORMATION_COLUMN: + return 13; + default: + return 16; + } +} + +int widget_new_sidebar_military_get_tooltip_text(tooltip_context *c) +{ + if (data.top_buttons_focus_id) { + if (data.top_buttons_focus_id == 1) { + c->text_group = 68; + return 2; + } + return 0; + } + if (data.inner_buttons_focus_id) { + int index = data.inner_buttons_focus_id - 1; + int layout; + const formation *m = formation_get(data.active_legion.formation_id); + if (m->figure_type == FIGURE_FORT_LEGIONARY || m->figure_type == FIGURE_FORT_INFANTRY) { + int index_increase = m->has_military_training ? 1 : 2; + if (index > 4 - index_increase) { + return 0; + } + index += index_increase; + layout = LAYOUT_BUTTON_INDEXES_LEGIONARY[0][index]; + } else { + layout = LAYOUT_BUTTON_INDEXES_AUXILIARY[0][index]; + } + c->text_group = 138; + return get_layout_text_id(layout); + } + if (data.bottom_buttons_focus_id) { + c->extra_text_type = TOOLTIP_EXTRA_TEXT_JOINED_BY_SPACE; + c->num_extra_texts = 1; + c->text_group = 51; + c->extra_text_groups[0] = 51; + int text_id = data.bottom_buttons_focus_id * 2; + c->extra_text_ids[0] = text_id; + return text_id - 1; + } + return 0; +} + +static void set_formation_id(int formation_id) +{ + data.active_legion.formation_id = formation_id; + clear_legion_info(&data.active_legion); + widget_minimap_invalidate(); +} + +static void slide_in_finished(void) +{ + if (data.city_view_was_collapsed) { + city_view_toggle_sidebar(); + } + widget_minimap_invalidate(); + window_city_return(); +} + +static void slide_out_finished(void) +{ + data.active_legion.formation_id = 0; + widget_minimap_invalidate(); + window_city_show(); +} + +int widget_new_sidebar_military_enter(int formation_id) +{ + clear_focus_buttons(); + int had_selected_legions = data.active_legion.formation_id; + set_formation_id(formation_id); + if (had_selected_legions) { + return 0; + } + data.city_view_was_collapsed = city_view_is_sidebar_collapsed(); + if (data.city_view_was_collapsed) { + city_view_start_sidebar_toggle(); + new_sidebar_slide(SLIDE_DIRECTION_IN, widget_new_sidebar_city_draw_background, draw_sliding, slide_in_finished); + } else { + slide_in_finished(); + } + return 1; +} + +int widget_new_sidebar_military_exit(void) +{ + clear_focus_buttons(); + if (!window_is(WINDOW_CITY_MILITARY)) { + widget_minimap_invalidate(); + return 0; + } + if (data.city_view_was_collapsed) { + city_view_toggle_sidebar(); + new_sidebar_slide(SLIDE_DIRECTION_OUT, widget_new_sidebar_city_draw_background, draw_sliding, slide_out_finished); + } else { + slide_out_finished(); + } + return 1; +} + +static void button_military_menu(int param1, int param2) +{ + window_military_menu_show(); +} + +static void button_close_military_new_sidebar(int param1, int param2) +{ + widget_new_sidebar_military_exit(); +} + +static void button_cycle_legion(int cycle_forward, int param2) +{ + legion_info *legion = &data.active_legion; + int step = cycle_forward ? 1 : -1; + for (int i = legion->formation_id + step; i != legion->formation_id; i += step) { + if (i == 0) { + i = formation_count(); + } else if (i > formation_count()) { + i = 1; + } + const formation *m = formation_get(i); + if (m->in_use && !m->is_herd && m->is_legion) { + legion->formation_id = i; + break; + } + } + formation_set_selected(legion->formation_id); + set_formation_id(legion->formation_id); +} + +static void button_select_formation_layout(const generic_button *button) +{ + int index = button->parameter1; + formation *m = formation_get(data.active_legion.formation_id); + if (m->in_distant_battle) { + return; + } + const int *layout_indexes; + int swap_lines = city_view_orientation() == DIR_6_LEFT || city_view_orientation() == DIR_2_RIGHT; + if (m->figure_type == FIGURE_FORT_LEGIONARY || m->figure_type == FIGURE_FORT_INFANTRY) { + int index_increase = m->has_military_training ? 1 : 2; + if (index > 4 - index_increase) { + return; + } + index += index_increase; + layout_indexes = LAYOUT_BUTTON_INDEXES_LEGIONARY[swap_lines]; + } else { + layout_indexes = LAYOUT_BUTTON_INDEXES_AUXILIARY[swap_lines]; + } + formation_legion_change_layout(m, layout_indexes[index]); + switch (index) { + case 0: sound_speech_play_file("wavs/cohort1.wav"); break; + case 1: sound_speech_play_file("wavs/cohort2.wav"); break; + case 2: sound_speech_play_file("wavs/cohort3.wav"); break; + case 3: sound_speech_play_file("wavs/cohort4.wav"); break; + case 4: sound_speech_play_file("wavs/cohort5.wav"); break; + } +} + +static void button_go_to_legion(const generic_button *button) +{ + const formation *m = formation_get(data.active_legion.formation_id); + city_view_go_to_grid_offset(map_grid_offset(m->x_home, m->y_home)); +} + +static void button_return_to_fort(const generic_button *button) +{ + formation *m = formation_get(data.active_legion.formation_id); + if (!m->in_distant_battle) { + formation_legion_return_home(m); + } +} + +static void button_empire_service(const generic_button *button) +{ + formation_toggle_empire_service(data.active_legion.formation_id); + formation_calculate_figures(); +} diff --git a/src/widget/newsidebar/new_military.h b/src/widget/newsidebar/new_military.h new file mode 100644 index 0000000000..d83ae88851 --- /dev/null +++ b/src/widget/newsidebar/new_military.h @@ -0,0 +1,21 @@ +#ifndef WIDGET_NEW_SIDEBAR_MILITARY_H +#define WIDGET_NEW_SIDEBAR_MILITARY_H + +#include "graphics/tooltip.h" +#include "input/mouse.h" + +int widget_new_sidebar_military_enter(int formation_id); +int widget_new_sidebar_military_exit(void); + +int widget_new_sidebar_military_get_standard_image(int legion_id); +int widget_new_sidebar_military_get_legion_name_id(int legion_id); +int widget_new_sidebar_military_get_legion_name_group(int legion_id); + +void widget_new_sidebar_military_draw_background(void); +void widget_new_sidebar_military_draw_foreground(void); + +int widget_new_sidebar_military_handle_input(const mouse *m); + +int widget_new_sidebar_military_get_tooltip_text(tooltip_context *c); + +#endif // WIDGET_NEW_SIDEBAR_MILITARY_H diff --git a/src/widget/newsidebar/new_slide.c b/src/widget/newsidebar/new_slide.c new file mode 100644 index 0000000000..2d8a86424f --- /dev/null +++ b/src/widget/newsidebar/new_slide.c @@ -0,0 +1,84 @@ +#include "new_slide.h" + +#include "core/speed.h" +#include "graphics/graphics.h" +#include "graphics/menu.h" +#include "graphics/window.h" +#include "sound/effect.h" +#include "widget/newsidebar/new_common.h" +#include "widget/top_menu.h" +#include "window/city.h" + +#define SLIDE_SPEED 7 +#define SLIDE_ACCELERATION_MILLIS 65 +#define SIDEBAR_DECELERATION_OFFSET 125 + +static struct { + int position; + speed_type slide_speed; + slide_direction direction; + back_new_sidebar_draw_function back_new_sidebar_draw; + front_new_sidebar_draw_function front_new_sidebar_draw; + slide_finished_function finished_callback; +} data; + +static void draw_background(void) +{ + widget_top_menu_draw(1); + window_city_draw(); +} + +static void draw_sliding_foreground(void) +{ + window_request_refresh(); + data.position += speed_get_delta(&data.slide_speed); + int is_finished = 0; + if (data.position >= SIDEBAR_EXPANDED_WIDTH) { + data.position = SIDEBAR_EXPANDED_WIDTH; + is_finished = 1; + } + + int x_offset = new_sidebar_common_get_x_offset_expanded(); + graphics_set_clip_rectangle(x_offset, TOP_MENU_HEIGHT, SIDEBAR_EXPANDED_WIDTH, new_sidebar_common_get_height()); + + if (data.direction == SLIDE_DIRECTION_IN) { + if (data.position > SIDEBAR_DECELERATION_OFFSET) { + speed_set_target(&data.slide_speed, 1, SLIDE_ACCELERATION_MILLIS, 1); + } + x_offset += SIDEBAR_EXPANDED_WIDTH - data.position; + } else { + x_offset += data.position; + } + + data.back_new_sidebar_draw(); + data.front_new_sidebar_draw(x_offset); + + graphics_reset_clip_rectangle(); + + if (is_finished) { + data.finished_callback(); + } +} + +void new_sidebar_slide(slide_direction direction, back_new_sidebar_draw_function back_new_sidebar_callback, + front_new_sidebar_draw_function front_new_sidebar_callback, slide_finished_function finished_callback) +{ + data.direction = direction; + data.position = 0; + speed_clear(&data.slide_speed); + speed_set_target(&data.slide_speed, SLIDE_SPEED, + direction == SLIDE_DIRECTION_OUT ? SLIDE_ACCELERATION_MILLIS : SPEED_CHANGE_IMMEDIATE, 1); + data.back_new_sidebar_draw = back_new_sidebar_callback; + data.front_new_sidebar_draw = front_new_sidebar_callback; + data.finished_callback = finished_callback; + sound_effect_play(SOUND_EFFECT_SIDEBAR); + + window_type window = { + WINDOW_SLIDING_SIDEBAR, + draw_background, + draw_sliding_foreground, + 0, + 0 + }; + window_show(&window); +} diff --git a/src/widget/newsidebar/new_slide.h b/src/widget/newsidebar/new_slide.h new file mode 100644 index 0000000000..e709e097b8 --- /dev/null +++ b/src/widget/newsidebar/new_slide.h @@ -0,0 +1,16 @@ +#ifndef WIDGET_NEW_SIDEBAR_SLIDE_H +#define WIDGET_NEW_SIDEBAR_SLIDE_H + +typedef enum { + SLIDE_DIRECTION_IN = 0, + SLIDE_DIRECTION_OUT = 1 +} slide_direction; + +typedef void (*back_new_sidebar_draw_function)(void); +typedef back_new_sidebar_draw_function slide_finished_function; +typedef void (*front_new_sidebar_draw_function)(int x_offset); + +void new_sidebar_slide(slide_direction direction, back_new_sidebar_draw_function back_new_sidebar_callback, + front_new_sidebar_draw_function front_new_sidebar_callback, slide_finished_function finished_callback); + +#endif // WIDGET_NEW_SIDEBAR_SLIDE_H diff --git a/src/widget/sidebar/common.h b/src/widget/sidebar/common.h index 488aa67bec..b994615b1c 100644 --- a/src/widget/sidebar/common.h +++ b/src/widget/sidebar/common.h @@ -4,7 +4,7 @@ #include "graphics/menu.h" #define SIDEBAR_COLLAPSED_WIDTH 42 -#define SIDEBAR_EXPANDED_WIDTH 162 +#define SIDEBAR_EXPANDED_WIDTH 204 // 162 + 42 (old values combined) #define SIDEBAR_MAIN_SECTION_HEIGHT 450 #define SIDEBAR_FILLER_Y_OFFSET (SIDEBAR_MAIN_SECTION_HEIGHT + TOP_MENU_HEIGHT) #define MINIMAP_WIDTH 146 diff --git a/src/window/build_menu.c b/src/window/build_menu.c index be37fab0b2..d2598a3526 100644 --- a/src/window/build_menu.c +++ b/src/window/build_menu.c @@ -20,6 +20,7 @@ #include "scenario/property.h" #include "translation/translation.h" #include "widget/city.h" +#include "widget/newsidebar/new_city.h" #include "widget/sidebar/city.h" #include "window/city.h" @@ -269,7 +270,8 @@ static int handle_build_submenu(const mouse *m) static void handle_input(const mouse *m, const hotkeys *h) { if (handle_build_submenu(m) || - widget_sidebar_city_handle_mouse_build_menu(m)) { + //TODO: config + widget_new_sidebar_city_handle_mouse_build_menu(m)) { return; } if (input_go_back_requested(m, h) || click_outside_menu(m, get_sidebar_x_offset())) { diff --git a/src/window/city.c b/src/window/city.c index 9e168894fc..c0f217503f 100644 --- a/src/window/city.c +++ b/src/window/city.c @@ -43,6 +43,10 @@ #include "widget/city_with_overlay.h" #include "widget/top_menu.h" #include "widget/sidebar/city.h" + +#include "widget/newsidebar/new_city.h" +#include "widget/newsidebar/new_extra.h" +#include "widget/newsidebar/new_military.h" #include "widget/sidebar/extra.h" #include "widget/sidebar/military.h" #include "window/advisors.h" @@ -74,16 +78,18 @@ static void draw_background(void) if (window_is(WINDOW_CITY)) { widget_city_setup_routing_preview(); } - widget_sidebar_city_draw_background(); + //TODO: config + widget_new_sidebar_city_draw_background(); widget_top_menu_draw(1); } static void draw_background_military(void) { + //TODO: config if (config_get(CONFIG_UI_SHOW_MILITARY_SIDEBAR)) { - widget_sidebar_military_draw_background(); + widget_new_sidebar_military_draw_background(); } else { - widget_sidebar_city_draw_background(); + widget_new_sidebar_city_draw_background(); } widget_top_menu_draw(1); } @@ -269,13 +275,15 @@ static void draw_foreground(void) { widget_top_menu_draw(0); window_city_draw(); - widget_sidebar_city_draw_foreground(); + //TODO: config + widget_new_sidebar_city_draw_foreground(); draw_speedrun_info(); if (window_is(WINDOW_CITY) || window_is(WINDOW_CITY_MILITARY)) { draw_time_left(); draw_custom_variables_text_display(); widget_city_draw_construction_buttons(); - if (!mouse_get()->is_touch || sidebar_extra_is_information_displayed(SIDEBAR_EXTRA_DISPLAY_GAME_SPEED)) { + //TODO: config + if (!mouse_get()->is_touch || new_sidebar_extra_is_information_displayed(NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED)) { draw_paused_banner(); } } @@ -290,13 +298,16 @@ static void draw_foreground_military(void) widget_top_menu_draw(0); window_city_draw(); if (config_get(CONFIG_UI_SHOW_MILITARY_SIDEBAR)) { - widget_sidebar_military_draw_foreground(); + //TODO: config + widget_new_sidebar_military_draw_foreground(); } else { - widget_sidebar_city_draw_foreground(); + //TODO: config + widget_new_sidebar_city_draw_foreground(); } draw_time_left(); widget_city_draw_construction_buttons(); - if (!mouse_get()->is_touch || sidebar_extra_is_information_displayed(SIDEBAR_EXTRA_DISPLAY_GAME_SPEED)) { + //TODO: config + if (!mouse_get()->is_touch || new_sidebar_extra_is_information_displayed(NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED)) { draw_paused_banner(); } } @@ -831,7 +842,8 @@ static void handle_input(const mouse *m, const hotkeys *h) if (widget_top_menu_handle_input(m, h)) { return; } - if (widget_sidebar_city_handle_mouse(m)) { + //TODO: config + if (widget_new_sidebar_city_handle_mouse(m)) { return; } } @@ -844,7 +856,8 @@ static void handle_input_military(const mouse *m, const hotkeys *h) if (widget_top_menu_handle_input(m, h)) { return; } - if (config_get(CONFIG_UI_SHOW_MILITARY_SIDEBAR) && widget_sidebar_military_handle_input(m)) { + //TODO: config + if (config_get(CONFIG_UI_SHOW_MILITARY_SIDEBAR) && widget_new_sidebar_military_handle_input(m)) { return; } widget_city_handle_input_military(m, h, formation_get_selected()); @@ -855,9 +868,11 @@ static void get_tooltip(tooltip_context *c) int text_id = widget_top_menu_get_tooltip_text(c); if (!text_id) { if (config_get(CONFIG_UI_SHOW_MILITARY_SIDEBAR) && formation_get_selected()) { - text_id = widget_sidebar_military_get_tooltip_text(c); + //TODO: config + text_id = widget_new_sidebar_military_get_tooltip_text(c); } else { - text_id = widget_sidebar_city_get_tooltip_text(c); + //TODO: config + text_id = widget_new_sidebar_city_get_tooltip_text(c); } } if (text_id || c->translation_key) { @@ -911,7 +926,8 @@ void window_city_show(void) show_roamers_for_overlay(game_state_overlay()); if (formation_get_selected()) { formation_set_selected(0); - if (config_get(CONFIG_UI_SHOW_MILITARY_SIDEBAR) && widget_sidebar_military_exit()) { + //TODO: config + if (config_get(CONFIG_UI_SHOW_MILITARY_SIDEBAR) && widget_new_sidebar_military_exit()) { return; } } @@ -932,7 +948,8 @@ void window_city_military_show(int legion_formation_id) building_construction_clear_type(); } formation_set_selected(legion_formation_id); - if (config_get(CONFIG_UI_SHOW_MILITARY_SIDEBAR) && widget_sidebar_military_enter(legion_formation_id)) { + //TODO: config + if (config_get(CONFIG_UI_SHOW_MILITARY_SIDEBAR) && widget_new_sidebar_military_enter(legion_formation_id)) { return; } window_type window = { diff --git a/src/window/main_menu.c b/src/window/main_menu.c index b0eca2a7b3..1216bf287b 100644 --- a/src/window/main_menu.c +++ b/src/window/main_menu.c @@ -71,7 +71,8 @@ static void draw_background(void) if (!window_is(WINDOW_FILE_DIALOG)) { graphics_in_dialog(); - outer_panel_draw(162, 32, 20, 22); + // ??? + outer_panel_draw(204, 32, 20, 22); if (!data.logo_image_id) { data.logo_image_id = assets_get_image_id("UI", "Main Menu Banner"); } From dcf6371ef8d201bc064650a36fe1c314f85824b4 Mon Sep 17 00:00:00 2001 From: Rick Neeft Date: Mon, 13 Oct 2025 16:07:37 +0200 Subject: [PATCH 02/20] anabled code to displayed two columns of items --- src/widget/newsidebar/new_city.c | 116 ++++++++++++++++------------- src/widget/newsidebar/new_common.c | 2 +- src/widget/newsidebar/new_common.h | 6 +- src/widget/sidebar/common.h | 2 +- src/window/main_menu.c | 4 +- 5 files changed, 71 insertions(+), 59 deletions(-) diff --git a/src/widget/newsidebar/new_city.c b/src/widget/newsidebar/new_city.c index c043b309d1..3a1012e8d5 100644 --- a/src/widget/newsidebar/new_city.c +++ b/src/widget/newsidebar/new_city.c @@ -110,18 +110,21 @@ static void draw_overlay_text(int x_offset) } } -static void draw_new_sidebar_remainder(int x_offset, int is_collapsed) +static void draw_new_sidebar_remainder(int x_offset) { - int width = SIDEBAR_EXPANDED_WIDTH; - if (is_collapsed) { - width = SIDEBAR_COLLAPSED_WIDTH; - } - int available_height = new_sidebar_common_get_height() - SIDEBAR_MAIN_SECTION_HEIGHT; - int extra_height = new_sidebar_extra_draw_background(x_offset, SIDEBAR_FILLER_Y_OFFSET, - width, available_height, is_collapsed, NEW_SIDEBAR_EXTRA_DISPLAY_ALL); + //int width = SIDEBAR_EXPANDED_WIDTH; + int width = 162; + + // int available_height = new_sidebar_common_get_height() - SIDEBAR_MAIN_SECTION_HEIGHT; + int available_height = new_sidebar_common_get_height() - MINIMAP_HEIGHT - MINIMAP_Y_OFFSET; + + int y_offset = SIDEBAR_FILLER_Y_OFFSET + MINIMAP_Y_OFFSET; + + int extra_height = new_sidebar_extra_draw_background(x_offset, y_offset, + width, available_height, 0, NEW_SIDEBAR_EXTRA_DISPLAY_ALL); new_sidebar_extra_draw_foreground(); int relief_y_offset = SIDEBAR_FILLER_Y_OFFSET + extra_height; - new_sidebar_common_draw_relief(x_offset, relief_y_offset, GROUP_SIDE_PANEL, is_collapsed); + new_sidebar_common_draw_relief(x_offset, relief_y_offset, GROUP_SIDE_PANEL, 0); } static void draw_number_of_messages(int x_offset) @@ -159,7 +162,7 @@ static void draw_collapsed_background(void) int x_offset = new_sidebar_common_get_x_offset_collapsed(); image_draw(image_group(GROUP_SIDE_PANEL), x_offset, 24, COLOR_MASK_NONE, SCALE_NONE); draw_buttons_collapsed(x_offset); - draw_new_sidebar_remainder(x_offset, 1); + draw_new_sidebar_remainder(x_offset + 42); } static void draw_expanded_background(int x_offset) @@ -169,19 +172,22 @@ static void draw_expanded_background(int x_offset) draw_overlay_text(x_offset + 4); draw_number_of_messages(x_offset); image_draw(window_build_menu_image(), x_offset + 6, 239, COLOR_MASK_NONE, SCALE_NONE); + widget_minimap_update(0); widget_minimap_draw_decorated(x_offset + 8, MINIMAP_Y_OFFSET, MINIMAP_WIDTH, MINIMAP_HEIGHT); - draw_new_sidebar_remainder(x_offset, 0); + draw_new_sidebar_remainder(x_offset); } void widget_new_sidebar_city_draw_background(void) { - if (city_view_is_sidebar_collapsed()) { - draw_collapsed_background(); - } else { - draw_expanded_background(new_sidebar_common_get_x_offset_expanded()); - } + draw_collapsed_background(); + // + // if (city_view_is_sidebar_collapsed()) { + // draw_collapsed_background(); + // } else { + // draw_expanded_background(new_sidebar_common_get_x_offset_expanded()); + // } } static void enable_building_buttons(void) @@ -204,17 +210,23 @@ void widget_new_sidebar_city_draw_foreground(void) if (building_menu_has_changed()) { enable_building_buttons(); } - if (city_view_is_sidebar_collapsed()) { - int x_offset = new_sidebar_common_get_x_offset_collapsed(); - draw_buttons_collapsed(x_offset); - } else { - int x_offset = new_sidebar_common_get_x_offset_expanded(); - draw_buttons_expanded(x_offset); - draw_overlay_text(x_offset + 4); - widget_minimap_draw_decorated(x_offset + 8, MINIMAP_Y_OFFSET, MINIMAP_WIDTH, MINIMAP_HEIGHT); - draw_number_of_messages(x_offset); - } - new_sidebar_extra_draw_foreground(); + + int x_offset = new_sidebar_common_get_x_offset_collapsed(); + draw_buttons_collapsed(x_offset); + + int new_x_offset = x_offset + 42; + + // if (city_view_is_sidebar_collapsed()) { + // int x_offset = new_sidebar_common_get_x_offset_collapsed(); + // draw_buttons_collapsed(x_offset); + // } else { + // int x_offset = new_sidebar_common_get_x_offset_expanded(); + // draw_buttons_expanded(new_x_offset); + // draw_overlay_text(new_x_offset + 4); + widget_minimap_draw_decorated(new_x_offset + 8, MINIMAP_Y_OFFSET, MINIMAP_WIDTH, MINIMAP_HEIGHT); + // draw_number_of_messages(new_x_offset); + // } + new_sidebar_extra_draw_foreground(); } int widget_new_sidebar_city_handle_mouse(const mouse *m) @@ -225,7 +237,7 @@ int widget_new_sidebar_city_handle_mouse(const mouse *m) int handled = 0; unsigned int button_id; data.focus_button_for_tooltip = 0; - if (city_view_is_sidebar_collapsed()) { + // if (city_view_is_sidebar_collapsed()) { int x_offset = new_sidebar_common_get_x_offset_collapsed(); handled |= image_buttons_handle_mouse(m, x_offset, 24, button_expand_new_sidebar, 1, &button_id); if (button_id) { @@ -235,37 +247,37 @@ int widget_new_sidebar_city_handle_mouse(const mouse *m) if (button_id) { data.focus_button_for_tooltip = button_id + 19; } - } else { - if (widget_minimap_handle_mouse(m)) { - return 1; - } - int x_offset = new_sidebar_common_get_x_offset_expanded(); - handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_overlays_collapse_new_sidebar, 2, &button_id); - if (button_id) { - data.focus_button_for_tooltip = button_id + 9; - } - handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_build_expanded, 15, &button_id); - if (button_id) { - data.focus_button_for_tooltip = button_id + 19; - } - handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_top_expanded, 6, &button_id); - if (button_id) { - data.focus_button_for_tooltip = button_id + 39; - } - handled |= new_sidebar_extra_handle_mouse(m); - } + // } else { + // if (widget_minimap_handle_mouse(m)) { + // return 1; + // } + // int x_offset = new_sidebar_common_get_x_offset_expanded(); + // handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_overlays_collapse_new_sidebar, 2, &button_id); + // if (button_id) { + // data.focus_button_for_tooltip = button_id + 9; + // } + // handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_build_expanded, 15, &button_id); + // if (button_id) { + // data.focus_button_for_tooltip = button_id + 19; + // } + // handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_top_expanded, 6, &button_id); + // if (button_id) { + // data.focus_button_for_tooltip = button_id + 39; + // } + // handled |= new_sidebar_extra_handle_mouse(m); + // } return handled; } int widget_new_sidebar_city_handle_mouse_build_menu(const mouse *m) { - if (city_view_is_sidebar_collapsed()) { + // if (city_view_is_sidebar_collapsed()) { return image_buttons_handle_mouse(m, new_sidebar_common_get_x_offset_collapsed(), 24, buttons_build_collapsed, 12, 0); - } else { - return image_buttons_handle_mouse(m, - new_sidebar_common_get_x_offset_expanded(), 24, buttons_build_expanded, 15, 0); - } + // } else { + // return image_buttons_handle_mouse(m, + // new_sidebar_common_get_x_offset_expanded(), 24, buttons_build_expanded, 15, 0); + // } } int widget_new_sidebar_city_get_tooltip_text(tooltip_context *c) diff --git a/src/widget/newsidebar/new_common.c b/src/widget/newsidebar/new_common.c index bbaa88a2e3..d519a1c297 100644 --- a/src/widget/newsidebar/new_common.c +++ b/src/widget/newsidebar/new_common.c @@ -12,7 +12,7 @@ int new_sidebar_common_get_x_offset_expanded(void) int new_sidebar_common_get_x_offset_collapsed(void) { - return screen_width() - SIDEBAR_COLLAPSED_WIDTH; + return screen_width() - SIDEBAR_EXPANDED_WIDTH; } int new_sidebar_common_get_height(void) diff --git a/src/widget/newsidebar/new_common.h b/src/widget/newsidebar/new_common.h index a0564a99dd..e88ba77239 100644 --- a/src/widget/newsidebar/new_common.h +++ b/src/widget/newsidebar/new_common.h @@ -4,11 +4,11 @@ #include "graphics/menu.h" #define SIDEBAR_COLLAPSED_WIDTH 42 -#define SIDEBAR_EXPANDED_WIDTH 162 -#define SIDEBAR_MAIN_SECTION_HEIGHT 450 -#define SIDEBAR_FILLER_Y_OFFSET (SIDEBAR_MAIN_SECTION_HEIGHT + TOP_MENU_HEIGHT) +#define SIDEBAR_EXPANDED_WIDTH 204 // 162 + 42 (old values combined) +//#define SIDEBAR_MAIN_SECTION_HEIGHT 450 #define MINIMAP_WIDTH 146 #define MINIMAP_HEIGHT 111 +#define SIDEBAR_FILLER_Y_OFFSET (MINIMAP_HEIGHT + TOP_MENU_HEIGHT) int new_sidebar_common_get_x_offset_expanded(void); diff --git a/src/widget/sidebar/common.h b/src/widget/sidebar/common.h index b994615b1c..488aa67bec 100644 --- a/src/widget/sidebar/common.h +++ b/src/widget/sidebar/common.h @@ -4,7 +4,7 @@ #include "graphics/menu.h" #define SIDEBAR_COLLAPSED_WIDTH 42 -#define SIDEBAR_EXPANDED_WIDTH 204 // 162 + 42 (old values combined) +#define SIDEBAR_EXPANDED_WIDTH 162 #define SIDEBAR_MAIN_SECTION_HEIGHT 450 #define SIDEBAR_FILLER_Y_OFFSET (SIDEBAR_MAIN_SECTION_HEIGHT + TOP_MENU_HEIGHT) #define MINIMAP_WIDTH 146 diff --git a/src/window/main_menu.c b/src/window/main_menu.c index 1216bf287b..6f1ad59c5e 100644 --- a/src/window/main_menu.c +++ b/src/window/main_menu.c @@ -71,8 +71,8 @@ static void draw_background(void) if (!window_is(WINDOW_FILE_DIALOG)) { graphics_in_dialog(); - // ??? - outer_panel_draw(204, 32, 20, 22); + + outer_panel_draw(162, 32, 20, 22); if (!data.logo_image_id) { data.logo_image_id = assets_get_image_id("UI", "Main Menu Banner"); } From a7f7acadc9e24ca8656f511e6cde8b424a9bc36a Mon Sep 17 00:00:00 2001 From: Rick Neeft Date: Mon, 13 Oct 2025 22:17:10 +0200 Subject: [PATCH 03/20] Make code a bit easier and removed expand button for the left side --- src/widget/newsidebar/new_city.c | 175 ++++++++++++--------------- src/widget/newsidebar/new_common.c | 6 +- src/widget/newsidebar/new_common.h | 2 +- src/widget/newsidebar/new_military.c | 2 +- src/widget/sidebar/city.c | 6 +- 5 files changed, 87 insertions(+), 104 deletions(-) diff --git a/src/widget/newsidebar/new_city.c b/src/widget/newsidebar/new_city.c index 3a1012e8d5..22e12b9e78 100644 --- a/src/widget/newsidebar/new_city.c +++ b/src/widget/newsidebar/new_city.c @@ -5,7 +5,6 @@ #include "city/view.h" #include "city/warning.h" #include "core/config.h" -#include "core/direction.h" #include "game/campaign.h" #include "game/orientation.h" #include "game/state.h" @@ -32,8 +31,8 @@ #define MINIMAP_Y_OFFSET 59 -static void button_overlay(int param1, int param2); -static void button_collapse_expand(int param1, int param2); +static void button_overlay_click(int param1, int param2); +// static void button_collapse_expand(int param1, int param2); static void button_build(int submenu, int param2); static void button_undo(int param1, int param2); static void button_messages(int param1, int param2); @@ -45,17 +44,20 @@ static void button_toggle_grid(int param1, int param2); static void button_rotate_north(int param1, int param2); static void button_rotate(int clockwise, int param2); -static image_button buttons_overlays_collapse_new_sidebar[] = { - {127, 5, 31, 20, IB_NORMAL, 90, 0, button_collapse_expand, button_none, 0, 0, 1}, - {4, 3, 117, 31, IB_NORMAL, 93, 0, button_overlay, button_help, 0, MESSAGE_DIALOG_OVERLAYS, 1} -}; +// static image_button buttons_overlays_collapse_new_sidebar[] = { +// {127, 5, 31, 20, IB_NORMAL, 90, 0, button_collapse_expand, button_none, 0, 0, 1}, +// }; -static image_button button_expand_new_sidebar[] = { - {6, 4, 31, 20, IB_NORMAL, 90, 4, button_collapse_expand, button_none, 0, 0, 1} +static image_button button_overlay[] ={ + {4, 3, 117, 31, IB_NORMAL, 93, 0, button_overlay_click, button_help, 0, MESSAGE_DIALOG_OVERLAYS, 1} }; -static image_button buttons_build_collapsed[] = { - {2, 32, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 0, button_build, button_none, BUILD_MENU_VACANT_HOUSE, 0, 1}, +// static image_button button_expand_new_sidebar[] = { +// {6, 4, 31, 20, IB_NORMAL, 90, 4, button_collapse_expand, button_none, 0, 0, 1} +// }; + +static image_button buttons_build[] = { + {2, 26, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 0, button_build, button_none, BUILD_MENU_VACANT_HOUSE, 0, 1}, {2, 67, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 8, button_build, button_none, BUILD_MENU_CLEAR_LAND, 0, 1}, {2, 102, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 12, button_build, button_none, BUILD_MENU_ROAD, 0, 1}, {2, 137, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 4, button_build, button_none, BUILD_MENU_WATER, 0, 1}, @@ -67,25 +69,28 @@ static image_button buttons_build_collapsed[] = { {2, 347, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 44, button_build, button_none, BUILD_MENU_ENGINEERING, 0, 1}, {2, 382, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 36, button_build, button_none, BUILD_MENU_SECURITY, 0, 1}, {2, 417, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 32, button_build, button_none, BUILD_MENU_INDUSTRY, 0, 1}, + {2, 452, 39, 26, IB_NORMAL, GROUP_MESSAGE_ICON, 18, button_messages, button_help, 0, MESSAGE_DIALOG_MESSAGES, 1}, + {2, 487, 39, 26, IB_BUILD, GROUP_MESSAGE_ICON, 22, button_go_to_problem, button_none, 0, 0, 1}, + {2, 522, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 48, button_undo, button_none, 0, 0, 1}, }; -static image_button buttons_build_expanded[] = { - {13, 277, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 0, button_build, button_none, BUILD_MENU_VACANT_HOUSE, 0, 1}, - {63, 277, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 8, button_build, button_none, BUILD_MENU_CLEAR_LAND, 0, 1}, - {113, 277, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 12, button_build, button_none, BUILD_MENU_ROAD, 0, 1}, - {13, 313, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 4, button_build, button_none, BUILD_MENU_WATER, 0, 1}, - {63, 313, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 40, button_build, button_none, BUILD_MENU_HEALTH, 0, 1, "UI", "Asclepius Button"}, - {113, 313, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 28, button_build, button_none, BUILD_MENU_TEMPLES, 0, 1}, - {13, 349, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 24, button_build, button_none, BUILD_MENU_EDUCATION, 0, 1}, - {63, 349, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 20, button_build, button_none, BUILD_MENU_ENTERTAINMENT, 0, 1}, - {113, 349, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 16, button_build, button_none, BUILD_MENU_ADMINISTRATION, 0, 1}, - {13, 385, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 44, button_build, button_none, BUILD_MENU_ENGINEERING, 0, 1}, - {63, 385, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 36, button_build, button_none, BUILD_MENU_SECURITY, 0, 1}, - {113, 385, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 32, button_build, button_none, BUILD_MENU_INDUSTRY, 0, 1}, - {13, 421, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 48, button_undo, button_none, 0, 0, 1}, - {63, 421, 39, 26, IB_NORMAL, GROUP_MESSAGE_ICON, 18, button_messages, button_help, 0, MESSAGE_DIALOG_MESSAGES, 1}, - {113, 421, 39, 26, IB_BUILD, GROUP_MESSAGE_ICON, 22, button_go_to_problem, button_none, 0, 0, 1}, -}; +// static image_button buttons_build_expanded[] = { +// {13, 277, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 0, button_build, button_none, BUILD_MENU_VACANT_HOUSE, 0, 1}, +// {63, 277, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 8, button_build, button_none, BUILD_MENU_CLEAR_LAND, 0, 1}, +// {113, 277, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 12, button_build, button_none, BUILD_MENU_ROAD, 0, 1}, +// {13, 313, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 4, button_build, button_none, BUILD_MENU_WATER, 0, 1}, +// {63, 313, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 40, button_build, button_none, BUILD_MENU_HEALTH, 0, 1, "UI", "Asclepius Button"}, +// {113, 313, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 28, button_build, button_none, BUILD_MENU_TEMPLES, 0, 1}, +// {13, 349, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 24, button_build, button_none, BUILD_MENU_EDUCATION, 0, 1}, +// {63, 349, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 20, button_build, button_none, BUILD_MENU_ENTERTAINMENT, 0, 1}, +// {113, 349, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 16, button_build, button_none, BUILD_MENU_ADMINISTRATION, 0, 1}, +// {13, 385, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 44, button_build, button_none, BUILD_MENU_ENGINEERING, 0, 1}, +// {63, 385, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 36, button_build, button_none, BUILD_MENU_SECURITY, 0, 1}, +// {113, 385, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 32, button_build, button_none, BUILD_MENU_INDUSTRY, 0, 1}, +// {13, 421, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 48, button_undo, button_none, 0, 0, 1}, +// {63, 421, 39, 26, IB_NORMAL, GROUP_MESSAGE_ICON, 18, button_messages, button_help, 0, MESSAGE_DIALOG_MESSAGES, 1}, +// {113, 421, 39, 26, IB_BUILD, GROUP_MESSAGE_ICON, 22, button_go_to_problem, button_none, 0, 0, 1}, +// }; static image_button buttons_top_expanded[] = { {7, 155, 71, 23, IB_NORMAL, GROUP_SIDEBAR_ADVISORS_EMPIRE, 0, button_advisors, button_none, 0, 0, 1}, @@ -124,15 +129,15 @@ static void draw_new_sidebar_remainder(int x_offset) width, available_height, 0, NEW_SIDEBAR_EXTRA_DISPLAY_ALL); new_sidebar_extra_draw_foreground(); int relief_y_offset = SIDEBAR_FILLER_Y_OFFSET + extra_height; - new_sidebar_common_draw_relief(x_offset, relief_y_offset, GROUP_SIDE_PANEL, 0); + new_sidebar_common_draw_relief(x_offset - 42, relief_y_offset, GROUP_SIDE_PANEL); } static void draw_number_of_messages(int x_offset) { int messages = city_message_count(); int show_messages = game_campaign_is_original() || messages > 0 || scenario_intro_message(); - buttons_build_expanded[13].enabled = show_messages; - buttons_build_expanded[14].enabled = city_message_problem_area_count(); + buttons_build[12].enabled = show_messages; + buttons_build[13].enabled = city_message_problem_area_count(); if (show_messages) { int width = text_get_number_width(messages, '@', "", FONT_SMALL_PLAIN); text_draw_number(messages, '@', "", (x_offset + 100) - width, 452, FONT_SMALL_PLAIN, COLOR_BLACK); //top @@ -143,32 +148,19 @@ static void draw_number_of_messages(int x_offset) } } -static void draw_buttons_collapsed(int x_offset) -{ - image_buttons_draw(x_offset, 24, button_expand_new_sidebar, 1); - image_buttons_draw(x_offset, 24, buttons_build_collapsed, 12); -} - -static void draw_buttons_expanded(int x_offset) +static void draw_buttons(int x_offset) { - buttons_build_expanded[12].enabled = game_can_undo(); - image_buttons_draw(x_offset, 24, buttons_overlays_collapse_new_sidebar, 2); - image_buttons_draw(x_offset, 24, buttons_build_expanded, 15); - image_buttons_draw(x_offset, 24, buttons_top_expanded, 6); -} - -static void draw_collapsed_background(void) -{ - int x_offset = new_sidebar_common_get_x_offset_collapsed(); - image_draw(image_group(GROUP_SIDE_PANEL), x_offset, 24, COLOR_MASK_NONE, SCALE_NONE); - draw_buttons_collapsed(x_offset); - draw_new_sidebar_remainder(x_offset + 42); + buttons_build[14].enabled = game_can_undo(); + image_buttons_draw(x_offset + 42, 24, button_overlay, 1); + image_buttons_draw(x_offset, 0, buttons_build, 15); + // image_buttons_draw(x_offset, 24, buttons_top_expanded, 6); } static void draw_expanded_background(int x_offset) { - image_draw(image_group(GROUP_SIDE_PANEL) + 1, x_offset, 24, COLOR_MASK_NONE, SCALE_NONE); - draw_buttons_expanded(x_offset); + image_draw(image_group(GROUP_SIDE_PANEL) + 1, x_offset, TOP_MENU_HEIGHT, COLOR_MASK_NONE, SCALE_NONE); + + draw_buttons(x_offset); draw_overlay_text(x_offset + 4); draw_number_of_messages(x_offset); image_draw(window_build_menu_image(), x_offset + 6, 239, COLOR_MASK_NONE, SCALE_NONE); @@ -181,26 +173,23 @@ static void draw_expanded_background(int x_offset) void widget_new_sidebar_city_draw_background(void) { - draw_collapsed_background(); - // - // if (city_view_is_sidebar_collapsed()) { - // draw_collapsed_background(); - // } else { - // draw_expanded_background(new_sidebar_common_get_x_offset_expanded()); - // } + int x_offset = new_sidebar_common_get_x_offset_collapsed(); + image_draw(image_group(GROUP_SIDE_PANEL), x_offset, TOP_MENU_HEIGHT, COLOR_MASK_NONE, SCALE_NONE); + // draw_buttons_collapsed(x_offset); + draw_new_sidebar_remainder(x_offset + 42); } static void enable_building_buttons(void) { for (int i = 0; i < 12; i++) { - buttons_build_expanded[i].enabled = 1; - if (building_menu_count_items(buttons_build_expanded[i].parameter1) <= 0) { - buttons_build_expanded[i].enabled = 0; + buttons_build[i].enabled = 1; + if (building_menu_count_items(buttons_build[i].parameter1) <= 0) { + buttons_build[i].enabled = 0; } - buttons_build_collapsed[i].enabled = 1; - if (building_menu_count_items(buttons_build_collapsed[i].parameter1) <= 0) { - buttons_build_collapsed[i].enabled = 0; + buttons_build[i].enabled = 1; + if (building_menu_count_items(buttons_build[i].parameter1) <= 0) { + buttons_build[i].enabled = 0; } } } @@ -211,20 +200,14 @@ void widget_new_sidebar_city_draw_foreground(void) enable_building_buttons(); } - int x_offset = new_sidebar_common_get_x_offset_collapsed(); - draw_buttons_collapsed(x_offset); + const int x_offset = new_sidebar_common_get_x_offset_collapsed(); + draw_buttons(x_offset); - int new_x_offset = x_offset + 42; + const int new_x_offset = x_offset + 42; - // if (city_view_is_sidebar_collapsed()) { - // int x_offset = new_sidebar_common_get_x_offset_collapsed(); - // draw_buttons_collapsed(x_offset); - // } else { - // int x_offset = new_sidebar_common_get_x_offset_expanded(); - // draw_buttons_expanded(new_x_offset); - // draw_overlay_text(new_x_offset + 4); - widget_minimap_draw_decorated(new_x_offset + 8, MINIMAP_Y_OFFSET, MINIMAP_WIDTH, MINIMAP_HEIGHT); - // draw_number_of_messages(new_x_offset); + draw_overlay_text(new_x_offset + 4); + widget_minimap_draw_decorated(new_x_offset + 8, MINIMAP_Y_OFFSET, MINIMAP_WIDTH, MINIMAP_HEIGHT); + draw_number_of_messages(new_x_offset); // } new_sidebar_extra_draw_foreground(); } @@ -239,11 +222,11 @@ int widget_new_sidebar_city_handle_mouse(const mouse *m) data.focus_button_for_tooltip = 0; // if (city_view_is_sidebar_collapsed()) { int x_offset = new_sidebar_common_get_x_offset_collapsed(); - handled |= image_buttons_handle_mouse(m, x_offset, 24, button_expand_new_sidebar, 1, &button_id); - if (button_id) { - data.focus_button_for_tooltip = 12; - } - handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_build_collapsed, 12, &button_id); + // handled |= image_buttons_handle_mouse(m, x_offset, 24, button_expand_new_sidebar, 1, &button_id); + // if (button_id) { + // data.focus_button_for_tooltip = 12; + // } + handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_build, 12, &button_id); if (button_id) { data.focus_button_for_tooltip = button_id + 19; } @@ -273,10 +256,10 @@ int widget_new_sidebar_city_handle_mouse_build_menu(const mouse *m) { // if (city_view_is_sidebar_collapsed()) { return image_buttons_handle_mouse(m, - new_sidebar_common_get_x_offset_collapsed(), 24, buttons_build_collapsed, 12, 0); + new_sidebar_common_get_x_offset_collapsed(), 24, buttons_build, 12, 0); // } else { // return image_buttons_handle_mouse(m, - // new_sidebar_common_get_x_offset_expanded(), 24, buttons_build_expanded, 15, 0); + // new_sidebar_common_get_x_offset_expanded(), 24, buttons_build, 15, 0); // } } @@ -292,23 +275,23 @@ int widget_new_sidebar_city_get_tooltip_text(tooltip_context *c) return new_sidebar_extra_get_tooltip(c); } -static void slide_finished(void) -{ - city_view_toggle_sidebar(); - window_city_show(); -} +// static void slide_finished(void) +// { +// city_view_toggle_sidebar(); +// window_city_show(); +// } -static void button_overlay(int param1, int param2) +static void button_overlay_click(int param1, int param2) { window_overlay_menu_show(); } -static void button_collapse_expand(int param1, int param2) -{ - city_view_start_sidebar_toggle(); - new_sidebar_slide(!city_view_is_sidebar_collapsed(), - draw_collapsed_background, draw_expanded_background, slide_finished); -} +// static void button_collapse_expand(int param1, int param2) +// { +// city_view_start_sidebar_toggle(); +// new_sidebar_slide(!city_view_is_sidebar_collapsed(), +// draw_collapsed_background, draw_expanded_background, slide_finished); +// } static void button_build(int submenu, int param2) { diff --git a/src/widget/newsidebar/new_common.c b/src/widget/newsidebar/new_common.c index d519a1c297..844a29cd9c 100644 --- a/src/widget/newsidebar/new_common.c +++ b/src/widget/newsidebar/new_common.c @@ -20,7 +20,7 @@ int new_sidebar_common_get_height(void) return screen_height() - TOP_MENU_HEIGHT; } -void new_sidebar_common_draw_relief(int x_offset, int y_offset, int image_id, int is_collapsed) +void new_sidebar_common_draw_relief(int x_offset, int y_offset, int image_id) { // relief images below panel int image_base = image_group(image_id); @@ -28,10 +28,10 @@ void new_sidebar_common_draw_relief(int x_offset, int y_offset, int image_id, in int y_max = screen_height(); while (y_offset < y_max) { if (y_max - y_offset <= 120) { - image_draw(image_base + image_offset + is_collapsed, x_offset, y_offset, COLOR_MASK_NONE, SCALE_NONE); + image_draw(image_base + image_offset, x_offset, y_offset, COLOR_MASK_NONE, SCALE_NONE); y_offset += 120; } else { - image_draw(image_base + image_offset + image_offset + is_collapsed, x_offset, y_offset, + image_draw(image_base + image_offset + image_offset, x_offset, y_offset, COLOR_MASK_NONE, SCALE_NONE); y_offset += 285; } diff --git a/src/widget/newsidebar/new_common.h b/src/widget/newsidebar/new_common.h index e88ba77239..da3f41513d 100644 --- a/src/widget/newsidebar/new_common.h +++ b/src/widget/newsidebar/new_common.h @@ -16,6 +16,6 @@ int new_sidebar_common_get_x_offset_collapsed(void); int new_sidebar_common_get_height(void); -void new_sidebar_common_draw_relief(int x_offset, int y_offset, int image_id, int is_collapsed); +void new_sidebar_common_draw_relief(int x_offset, int y_offset, int image_id); #endif // WIDGET_NEW_SIDEBAR_COMMON_H diff --git a/src/widget/newsidebar/new_military.c b/src/widget/newsidebar/new_military.c index ee3e3b6390..418824392c 100644 --- a/src/widget/newsidebar/new_military.c +++ b/src/widget/newsidebar/new_military.c @@ -413,7 +413,7 @@ static void draw_background(int x_offset) 0, NEW_SIDEBAR_EXTRA_DISPLAY_ALL); new_sidebar_extra_draw_foreground(); - new_sidebar_common_draw_relief(x_offset, MILITARY_PANEL_HEIGHT + extra_height, GROUP_SIDE_PANEL, 0); + new_sidebar_common_draw_relief(x_offset, MILITARY_PANEL_HEIGHT + extra_height, GROUP_SIDE_PANEL); } void widget_new_sidebar_military_draw_background(void) diff --git a/src/widget/sidebar/city.c b/src/widget/sidebar/city.c index 3d86d17ac7..a0c45abc69 100644 --- a/src/widget/sidebar/city.c +++ b/src/widget/sidebar/city.c @@ -36,7 +36,7 @@ #define MINIMAP_Y_OFFSET 59 -static void button_overlay(int param1, int param2); +static void button_overlay_click(int param1, int param2); static void button_collapse_expand(int param1, int param2); static void button_build(int submenu, int param2); static void button_undo(int param1, int param2); @@ -51,7 +51,7 @@ static void button_rotate(int clockwise, int param2); static image_button buttons_overlays_collapse_sidebar[] = { {127, 5, 31, 20, IB_NORMAL, 90, 0, button_collapse_expand, button_none, 0, 0, 1}, - {4, 3, 117, 31, IB_NORMAL, 93, 0, button_overlay, button_help, 0, MESSAGE_DIALOG_OVERLAYS, 1} + {4, 3, 117, 31, IB_NORMAL, 93, 0, button_overlay_click, button_help, 0, MESSAGE_DIALOG_OVERLAYS, 1} }; static image_button button_expand_sidebar[] = { @@ -290,7 +290,7 @@ static void slide_finished(void) window_city_show(); } -static void button_overlay(int param1, int param2) +static void button_overlay_click(int param1, int param2) { window_overlay_menu_show(); } From fc88d35cd6f03c96852e5de2ff23f8543a3d2bc4 Mon Sep 17 00:00:00 2001 From: Rick Neeft Date: Tue, 14 Oct 2025 11:27:01 +0200 Subject: [PATCH 04/20] Renaming collapsed and expended into advanced --- src/widget/newsidebar/new_city.c | 8 ++++---- src/widget/newsidebar/new_common.c | 9 ++------- src/widget/newsidebar/new_common.h | 6 ++---- src/widget/newsidebar/new_military.c | 16 ++++++++-------- src/widget/newsidebar/new_slide.c | 10 +++++----- 5 files changed, 21 insertions(+), 28 deletions(-) diff --git a/src/widget/newsidebar/new_city.c b/src/widget/newsidebar/new_city.c index 22e12b9e78..daedd32f61 100644 --- a/src/widget/newsidebar/new_city.c +++ b/src/widget/newsidebar/new_city.c @@ -173,7 +173,7 @@ static void draw_expanded_background(int x_offset) void widget_new_sidebar_city_draw_background(void) { - int x_offset = new_sidebar_common_get_x_offset_collapsed(); + int x_offset = new_sidebar_common_get_x_offset_advanced(); image_draw(image_group(GROUP_SIDE_PANEL), x_offset, TOP_MENU_HEIGHT, COLOR_MASK_NONE, SCALE_NONE); // draw_buttons_collapsed(x_offset); draw_new_sidebar_remainder(x_offset + 42); @@ -200,7 +200,7 @@ void widget_new_sidebar_city_draw_foreground(void) enable_building_buttons(); } - const int x_offset = new_sidebar_common_get_x_offset_collapsed(); + const int x_offset = new_sidebar_common_get_x_offset_advanced(); draw_buttons(x_offset); const int new_x_offset = x_offset + 42; @@ -221,7 +221,7 @@ int widget_new_sidebar_city_handle_mouse(const mouse *m) unsigned int button_id; data.focus_button_for_tooltip = 0; // if (city_view_is_sidebar_collapsed()) { - int x_offset = new_sidebar_common_get_x_offset_collapsed(); + int x_offset = new_sidebar_common_get_x_offset_advanced(); // handled |= image_buttons_handle_mouse(m, x_offset, 24, button_expand_new_sidebar, 1, &button_id); // if (button_id) { // data.focus_button_for_tooltip = 12; @@ -256,7 +256,7 @@ int widget_new_sidebar_city_handle_mouse_build_menu(const mouse *m) { // if (city_view_is_sidebar_collapsed()) { return image_buttons_handle_mouse(m, - new_sidebar_common_get_x_offset_collapsed(), 24, buttons_build, 12, 0); + new_sidebar_common_get_x_offset_advanced(), 24, buttons_build, 12, 0); // } else { // return image_buttons_handle_mouse(m, // new_sidebar_common_get_x_offset_expanded(), 24, buttons_build, 15, 0); diff --git a/src/widget/newsidebar/new_common.c b/src/widget/newsidebar/new_common.c index 844a29cd9c..9f16416387 100644 --- a/src/widget/newsidebar/new_common.c +++ b/src/widget/newsidebar/new_common.c @@ -5,14 +5,9 @@ #include "graphics/screen.h" #include "widget/minimap.h" -int new_sidebar_common_get_x_offset_expanded(void) +int new_sidebar_common_get_x_offset_advanced(void) { - return screen_width() - SIDEBAR_EXPANDED_WIDTH; -} - -int new_sidebar_common_get_x_offset_collapsed(void) -{ - return screen_width() - SIDEBAR_EXPANDED_WIDTH; + return screen_width() - SIDEBAR_ADVANCED_WIDTH; } int new_sidebar_common_get_height(void) diff --git a/src/widget/newsidebar/new_common.h b/src/widget/newsidebar/new_common.h index da3f41513d..9f70b3c65c 100644 --- a/src/widget/newsidebar/new_common.h +++ b/src/widget/newsidebar/new_common.h @@ -4,15 +4,13 @@ #include "graphics/menu.h" #define SIDEBAR_COLLAPSED_WIDTH 42 -#define SIDEBAR_EXPANDED_WIDTH 204 // 162 + 42 (old values combined) +#define SIDEBAR_ADVANCED_WIDTH 204 // 162 + 42 (old values combined) //#define SIDEBAR_MAIN_SECTION_HEIGHT 450 #define MINIMAP_WIDTH 146 #define MINIMAP_HEIGHT 111 #define SIDEBAR_FILLER_Y_OFFSET (MINIMAP_HEIGHT + TOP_MENU_HEIGHT) -int new_sidebar_common_get_x_offset_expanded(void); - -int new_sidebar_common_get_x_offset_collapsed(void); +int new_sidebar_common_get_x_offset_advanced(void); int new_sidebar_common_get_height(void); diff --git a/src/widget/newsidebar/new_military.c b/src/widget/newsidebar/new_military.c index 418824392c..3a513c3656 100644 --- a/src/widget/newsidebar/new_military.c +++ b/src/widget/newsidebar/new_military.c @@ -36,7 +36,7 @@ #define Y_OFFSET_BOTTOM_BUTTONS 257 #define MILITARY_PANEL_BLOCKS 18 #define CONTENT_PADDING 10 -#define CONTENT_WIDTH (SIDEBAR_EXPANDED_WIDTH - 2 * CONTENT_PADDING) +#define CONTENT_WIDTH (SIDEBAR_ADVANCED_WIDTH - 2 * CONTENT_PADDING) static const int IMAGE_OFFSETS_TO_FORMATION[7] = { FORMATION_COLUMN, @@ -372,11 +372,11 @@ static void draw_military_panel_background(int x_offset) { graphics_draw_line(x_offset, x_offset, Y_OFFSET_PANEL_START, Y_OFFSET_PANEL_START + MILITARY_PANEL_BLOCKS * BLOCK_SIZE, COLOR_WHITE); - graphics_draw_line(x_offset + SIDEBAR_EXPANDED_WIDTH - 1, x_offset + SIDEBAR_EXPANDED_WIDTH - 1, + graphics_draw_line(x_offset + SIDEBAR_ADVANCED_WIDTH - 1, x_offset + SIDEBAR_ADVANCED_WIDTH - 1, Y_OFFSET_PANEL_START, Y_OFFSET_PANEL_START + MILITARY_PANEL_BLOCKS * BLOCK_SIZE, COLOR_SIDEBAR); inner_panel_draw(x_offset + 1, Y_OFFSET_PANEL_START + 10, - SIDEBAR_EXPANDED_WIDTH / BLOCK_SIZE, MILITARY_PANEL_BLOCKS); - inner_panel_draw(x_offset + 1, Y_OFFSET_PANEL_START, SIDEBAR_EXPANDED_WIDTH / BLOCK_SIZE, 1); + SIDEBAR_ADVANCED_WIDTH / BLOCK_SIZE, MILITARY_PANEL_BLOCKS); + inner_panel_draw(x_offset + 1, Y_OFFSET_PANEL_START, SIDEBAR_ADVANCED_WIDTH / BLOCK_SIZE, 1); draw_military_info_text(x_offset + CONTENT_PADDING, Y_OFFSET_PANEL_START); draw_military_info_buttons(x_offset, Y_OFFSET_PANEL_START); @@ -409,7 +409,7 @@ static void draw_background(int x_offset) draw_military_panel_background(x_offset); draw_legion_buttons(x_offset, Y_OFFSET_PANEL_START); int extra_height = new_sidebar_extra_draw_background(x_offset, MILITARY_PANEL_HEIGHT, - SIDEBAR_EXPANDED_WIDTH, new_sidebar_common_get_height() - MILITARY_PANEL_HEIGHT + TOP_MENU_HEIGHT, + SIDEBAR_ADVANCED_WIDTH, new_sidebar_common_get_height() - MILITARY_PANEL_HEIGHT + TOP_MENU_HEIGHT, 0, NEW_SIDEBAR_EXTRA_DISPLAY_ALL); new_sidebar_extra_draw_foreground(); @@ -418,7 +418,7 @@ static void draw_background(int x_offset) void widget_new_sidebar_military_draw_background(void) { - draw_background(new_sidebar_common_get_x_offset_expanded()); + draw_background(new_sidebar_common_get_x_offset_advanced()); } static int has_legion_changed(const legion_info *legion, const formation *m) @@ -451,7 +451,7 @@ static void draw_foreground(int x_offset) void widget_new_sidebar_military_draw_foreground(void) { - draw_foreground(new_sidebar_common_get_x_offset_expanded()); + draw_foreground(new_sidebar_common_get_x_offset_advanced()); } static void draw_sliding(int x_offset) @@ -462,7 +462,7 @@ static void draw_sliding(int x_offset) int widget_new_sidebar_military_handle_input(const mouse *m) { - int x_offset = new_sidebar_common_get_x_offset_expanded(); + int x_offset = new_sidebar_common_get_x_offset_advanced(); if (image_buttons_handle_mouse(m, x_offset, 24, buttons_title_close, 2, &data.top_buttons_focus_id)) { return 1; } diff --git a/src/widget/newsidebar/new_slide.c b/src/widget/newsidebar/new_slide.c index 2d8a86424f..363ea843e6 100644 --- a/src/widget/newsidebar/new_slide.c +++ b/src/widget/newsidebar/new_slide.c @@ -33,19 +33,19 @@ static void draw_sliding_foreground(void) window_request_refresh(); data.position += speed_get_delta(&data.slide_speed); int is_finished = 0; - if (data.position >= SIDEBAR_EXPANDED_WIDTH) { - data.position = SIDEBAR_EXPANDED_WIDTH; + if (data.position >= SIDEBAR_ADVANCED_WIDTH) { + data.position = SIDEBAR_ADVANCED_WIDTH; is_finished = 1; } - int x_offset = new_sidebar_common_get_x_offset_expanded(); - graphics_set_clip_rectangle(x_offset, TOP_MENU_HEIGHT, SIDEBAR_EXPANDED_WIDTH, new_sidebar_common_get_height()); + int x_offset = new_sidebar_common_get_x_offset_advanced(); + graphics_set_clip_rectangle(x_offset, TOP_MENU_HEIGHT, SIDEBAR_ADVANCED_WIDTH, new_sidebar_common_get_height()); if (data.direction == SLIDE_DIRECTION_IN) { if (data.position > SIDEBAR_DECELERATION_OFFSET) { speed_set_target(&data.slide_speed, 1, SLIDE_ACCELERATION_MILLIS, 1); } - x_offset += SIDEBAR_EXPANDED_WIDTH - data.position; + x_offset += SIDEBAR_ADVANCED_WIDTH - data.position; } else { x_offset += data.position; } From 7eff9db4513e5de5a5b3d771fe99e7ee2a074332 Mon Sep 17 00:00:00 2001 From: Rick Neeft Date: Tue, 14 Oct 2025 11:44:52 +0200 Subject: [PATCH 05/20] Make sure the sidebar width is comming from one location --- src/city/view.c | 51 ++++++++++++-------------------- src/widget/newsidebar/new_city.c | 5 ++++ src/widget/newsidebar/new_city.h | 2 ++ 3 files changed, 26 insertions(+), 32 deletions(-) diff --git a/src/city/view.c b/src/city/view.c index 8507ccaf62..4b5ee43c3a 100644 --- a/src/city/view.c +++ b/src/city/view.c @@ -10,6 +10,7 @@ #include "map/grid.h" #include "map/image.h" #include "widget/minimap.h" +#include "widget/newsidebar/new_city.h" #define TILE_WIDTH_PIXELS 60 #define TILE_HEIGHT_PIXELS 30 @@ -43,6 +44,7 @@ static struct { } selected_tile; } data; + static int view_to_grid_offset_lookup[VIEW_X_MAX][VIEW_Y_MAX]; static void check_camera_boundaries(void) @@ -580,35 +582,28 @@ void city_view_rotate_right(void) check_camera_boundaries(); } -static void set_viewport(int x_offset, int y_offset, int width, int height) +static void set_viewport(void) { - data.viewport.x = x_offset; - data.viewport.y = y_offset; + const int sidebar_width = widget_sidebar_width(); + const int width = data.screen_width - sidebar_width - 2; + const int height = data.screen_height - TOP_MENU_HEIGHT; + + data.viewport.x = 0; + data.viewport.y = TOP_MENU_HEIGHT; data.viewport.width_pixels = width - 2; - data.viewport.height_pixels = height; + data.viewport.height_pixels = data.screen_height - TOP_MENU_HEIGHT; + data.viewport.width_tiles = calc_adjust_with_percentage(width, data.scale) / TILE_WIDTH_PIXELS; data.viewport.height_tiles = calc_adjust_with_percentage(height, data.scale) / HALF_TILE_HEIGHT_PIXELS; } -static void set_viewport_with_sidebar(void) -{ - set_viewport(0, TOP_MENU_HEIGHT, data.screen_width - 160, data.screen_height - TOP_MENU_HEIGHT); -} - -static void set_viewport_without_sidebar(void) -{ - set_viewport(0, TOP_MENU_HEIGHT, data.screen_width - 40, data.screen_height - TOP_MENU_HEIGHT); -} - void city_view_set_scale(int scale) { scale = calc_bound(scale, 50, city_view_get_max_scale()); data.scale = scale; - if (data.sidebar_collapsed) { - set_viewport_without_sidebar(); - } else { - set_viewport_with_sidebar(); - } + + set_viewport(); + check_camera_boundaries(); graphics_renderer()->update_scale(scale); } @@ -617,11 +612,7 @@ void city_view_set_viewport(int screen_width, int screen_height) { data.screen_width = screen_width; data.screen_height = screen_height; - if (data.sidebar_collapsed) { - set_viewport_without_sidebar(); - } else { - set_viewport_with_sidebar(); - } + set_viewport(); check_camera_boundaries(); } @@ -646,19 +637,15 @@ int city_view_is_sidebar_collapsed(void) void city_view_start_sidebar_toggle(void) { - set_viewport_without_sidebar(); + set_viewport(); check_camera_boundaries(); } void city_view_toggle_sidebar(void) { - if (data.sidebar_collapsed) { - data.sidebar_collapsed = 0; - set_viewport_with_sidebar(); - } else { - data.sidebar_collapsed = 1; - set_viewport_without_sidebar(); - } + data.sidebar_collapsed = !data.sidebar_collapsed; + + set_viewport(); check_camera_boundaries(); } diff --git a/src/widget/newsidebar/new_city.c b/src/widget/newsidebar/new_city.c index daedd32f61..04c2126622 100644 --- a/src/widget/newsidebar/new_city.c +++ b/src/widget/newsidebar/new_city.c @@ -194,6 +194,11 @@ static void enable_building_buttons(void) } } +int widget_sidebar_width(void) +{ + return SIDEBAR_ADVANCED_WIDTH; +} + void widget_new_sidebar_city_draw_foreground(void) { if (building_menu_has_changed()) { diff --git a/src/widget/newsidebar/new_city.h b/src/widget/newsidebar/new_city.h index 210da0efd7..df37a3e873 100644 --- a/src/widget/newsidebar/new_city.h +++ b/src/widget/newsidebar/new_city.h @@ -4,6 +4,8 @@ #include "graphics/tooltip.h" #include "input/mouse.h" +int widget_sidebar_width(void); + void widget_new_sidebar_city_draw_background(void); void widget_new_sidebar_city_draw_foreground(void); From 2feaf37833455244c31c9d892887af6da25f04cd Mon Sep 17 00:00:00 2001 From: Rick Neeft Date: Sun, 19 Oct 2025 00:26:01 +0200 Subject: [PATCH 06/20] Removed the new_ and newsidebar folder. Move all types of sidebar into three distinct folders. --- CMakeLists.txt | 8 +- src/city/view.c | 12 +- src/figure/formation.c | 16 +- src/game/game.c | 4 - src/graphics/screenshot.c | 6 +- src/widget/city.c | 25 +- src/widget/newsidebar/new_city.h | 17 - src/widget/newsidebar/new_common.c | 34 - src/widget/newsidebar/new_common.h | 19 - src/widget/newsidebar/new_extra.c | 813 ------------------ src/widget/newsidebar/new_extra.h | 31 - src/widget/newsidebar/new_military.c | 681 --------------- src/widget/newsidebar/new_military.h | 21 - src/widget/newsidebar/new_slide.c | 84 -- src/widget/newsidebar/new_slide.h | 16 - .../new_city.c => sidebar/advanced/sidebar.c} | 150 ++-- src/widget/sidebar/advanced/sidebar.h | 17 + src/widget/sidebar/city.c | 440 +++------- src/widget/sidebar/city.h | 8 +- src/widget/sidebar/common.c | 5 + src/widget/sidebar/common.h | 4 + src/widget/sidebar/military.c | 4 +- src/window/build_menu.c | 4 +- src/window/city.c | 53 +- 24 files changed, 267 insertions(+), 2205 deletions(-) delete mode 100644 src/widget/newsidebar/new_city.h delete mode 100644 src/widget/newsidebar/new_common.c delete mode 100644 src/widget/newsidebar/new_common.h delete mode 100644 src/widget/newsidebar/new_extra.c delete mode 100644 src/widget/newsidebar/new_extra.h delete mode 100644 src/widget/newsidebar/new_military.c delete mode 100644 src/widget/newsidebar/new_military.h delete mode 100644 src/widget/newsidebar/new_slide.c delete mode 100644 src/widget/newsidebar/new_slide.h rename src/widget/{newsidebar/new_city.c => sidebar/advanced/sidebar.c} (66%) create mode 100644 src/widget/sidebar/advanced/sidebar.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 240e4e866a..144c666dcc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -614,17 +614,15 @@ set(WIDGET_FILES ${PROJECT_SOURCE_DIR}/src/widget/minimap.c ${PROJECT_SOURCE_DIR}/src/widget/top_menu.c ${PROJECT_SOURCE_DIR}/src/widget/top_menu_editor.c + ${PROJECT_SOURCE_DIR}/src/widget/sidebar/collapsed/sidebar.c + ${PROJECT_SOURCE_DIR}/src/widget/sidebar/expanded/sidebar.c + ${PROJECT_SOURCE_DIR}/src/widget/sidebar/advanced/sidebar.c ${PROJECT_SOURCE_DIR}/src/widget/sidebar/city.c ${PROJECT_SOURCE_DIR}/src/widget/sidebar/common.c ${PROJECT_SOURCE_DIR}/src/widget/sidebar/editor.c ${PROJECT_SOURCE_DIR}/src/widget/sidebar/extra.c ${PROJECT_SOURCE_DIR}/src/widget/sidebar/military.c ${PROJECT_SOURCE_DIR}/src/widget/sidebar/slide.c - ${PROJECT_SOURCE_DIR}/src/widget/newsidebar/new_city.c - ${PROJECT_SOURCE_DIR}/src/widget/newsidebar/new_common.c - ${PROJECT_SOURCE_DIR}/src/widget/newsidebar/new_extra.c - ${PROJECT_SOURCE_DIR}/src/widget/newsidebar/new_military.c - ${PROJECT_SOURCE_DIR}/src/widget/newsidebar/new_slide.c ) set(WINDOW_FILES ${PROJECT_SOURCE_DIR}/src/window/advisors.c diff --git a/src/city/view.c b/src/city/view.c index 4b5ee43c3a..19c392d0a9 100644 --- a/src/city/view.c +++ b/src/city/view.c @@ -10,7 +10,7 @@ #include "map/grid.h" #include "map/image.h" #include "widget/minimap.h" -#include "widget/newsidebar/new_city.h" +#include "widget/sidebar/city.h" #define TILE_WIDTH_PIXELS 60 #define TILE_HEIGHT_PIXELS 30 @@ -23,7 +23,6 @@ static const int Y_DIRECTION_FOR_ORIENTATION[] = {1, -1, -1, 1}; static struct { int screen_width; int screen_height; - int sidebar_collapsed; int orientation; int scale; struct { @@ -584,7 +583,7 @@ void city_view_rotate_right(void) static void set_viewport(void) { - const int sidebar_width = widget_sidebar_width(); + const int sidebar_width = widget_sidebar_city_get_width(); const int width = data.screen_width - sidebar_width - 2; const int height = data.screen_height - TOP_MENU_HEIGHT; @@ -630,11 +629,6 @@ void city_view_get_viewport_size_tiles(int *width, int *height) *height = data.viewport.height_tiles; } -int city_view_is_sidebar_collapsed(void) -{ - return data.sidebar_collapsed; -} - void city_view_start_sidebar_toggle(void) { set_viewport(); @@ -643,7 +637,7 @@ void city_view_start_sidebar_toggle(void) void city_view_toggle_sidebar(void) { - data.sidebar_collapsed = !data.sidebar_collapsed; + //data.sidebar_collapsed = !data.sidebar_collapsed; set_viewport(); check_camera_boundaries(); diff --git a/src/figure/formation.c b/src/figure/formation.c index 5b69d40ef4..1fb815288e 100644 --- a/src/figure/formation.c +++ b/src/figure/formation.c @@ -23,8 +23,6 @@ #include -#include "widget/newsidebar/new_military.h" - #define FORMATION_ARRAY_SIZE_STEP 50 #define ORIGINAL_BUFFER_SIZE_PER_FORMATION 128 @@ -98,10 +96,9 @@ formation *formation_create_legion(int building_id, figure_type type) //standards and name - //TODO: config (3x) - m->legion_flag_id = widget_new_sidebar_military_get_standard_image(m->legion_id); - m->legion_name_id = widget_new_sidebar_military_get_legion_name_id(m->legion_id); - m->legion_name_group = widget_new_sidebar_military_get_legion_name_group(m->legion_id); + m->legion_flag_id = widget_sidebar_military_get_standard_image(m->legion_id); + m->legion_name_id = widget_sidebar_military_get_legion_name_id(m->legion_id); + m->legion_name_group = widget_sidebar_military_get_legion_name_group(m->legion_id); return m; } @@ -966,10 +963,9 @@ void formations_load_state(buffer *buf, buffer *totals, int version) f->legion_id = f->legion_id + f->is_legion; // 1-based index for legions } // after increasing number of legions, switched to 1-based index - //TODO: config (3x) - f->legion_flag_id = widget_new_sidebar_military_get_standard_image(f->legion_id); - f->legion_name_id = widget_new_sidebar_military_get_legion_name_id(f->legion_id); - f->legion_name_group = widget_new_sidebar_military_get_legion_name_group(f->legion_id); + f->legion_flag_id = widget_sidebar_military_get_standard_image(f->legion_id); + f->legion_name_id = widget_sidebar_military_get_legion_name_id(f->legion_id); + f->legion_name_group = widget_sidebar_military_get_legion_name_group(f->legion_id); } else { f->legion_flag_id = buffer_read_i32(buf); f->legion_name_id = buffer_read_i32(buf); diff --git a/src/game/game.c b/src/game/game.c index 145b8b11e6..9392444d1d 100644 --- a/src/game/game.c +++ b/src/game/game.c @@ -178,10 +178,6 @@ int game_init_editor(void) game_file_editor_clear_data(); game_file_editor_create_scenario(2); - if (city_view_is_sidebar_collapsed()) { - city_view_toggle_sidebar(); - } - editor_set_active(1); window_editor_map_show(); return 1; diff --git a/src/graphics/screenshot.c b/src/graphics/screenshot.c index e62598ef98..8020b7b55e 100644 --- a/src/graphics/screenshot.c +++ b/src/graphics/screenshot.c @@ -25,6 +25,8 @@ #include #include +#include "widget/sidebar/city.h" + #define TILE_X_SIZE 60 #define TILE_Y_SIZE 30 #define IMAGE_HEIGHT_CHUNK (TILE_Y_SIZE * 15) @@ -300,7 +302,7 @@ static void create_full_city_screenshot(void) graphics_set_clip_rectangle(0, TOP_MENU_HEIGHT, canvas_width, IMAGE_HEIGHT_CHUNK); int viewport_x, viewport_y, viewport_width, viewport_height; city_view_get_viewport(&viewport_x, &viewport_y, &viewport_width, &viewport_height); - city_view_set_viewport(canvas_width + (city_view_is_sidebar_collapsed() ? 42 : 162), + city_view_set_viewport(canvas_width + widget_sidebar_city_get_width(), IMAGE_HEIGHT_CHUNK + TOP_MENU_HEIGHT); int current_height = base_height; while ((size = image_request_rows()) != 0) { @@ -325,7 +327,7 @@ static void create_full_city_screenshot(void) } current_height += IMAGE_HEIGHT_CHUNK; } - city_view_set_viewport(viewport_width + (city_view_is_sidebar_collapsed() ? 42 : 162), viewport_height + TOP_MENU_HEIGHT); + city_view_set_viewport(viewport_width + widget_sidebar_city_get_width(), viewport_height + TOP_MENU_HEIGHT); city_view_set_scale(old_scale); config_set(CONFIG_UI_DRAW_CLOUD_SHADOWS, draw_cloud_shadows); graphics_reset_clip_rectangle(); diff --git a/src/widget/city.c b/src/widget/city.c index 1deea46a6b..cd94bc0e38 100644 --- a/src/widget/city.c +++ b/src/widget/city.c @@ -1,4 +1,5 @@ #include "city.h" +#include "sidebar/city.h" #include "building/construction.h" #include "building/properties.h" @@ -43,8 +44,6 @@ #include "window/building_info.h" #include "window/city.h" -#include "newsidebar/new_extra.h" - #define NO_POSITION ((unsigned int)-1) static struct { @@ -187,8 +186,8 @@ static void draw_construction_buttons(void) city_view_get_viewport(&x, &y, &width, &height); int x_offset = width - 4 * BLOCK_SIZE; int y_offset = 40; - //TODO: config - if (((new_sidebar_extra_is_information_displayed(NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED) || !mouse_get()->is_touch) && width < 680) + + if (((sidebar_extra_is_information_displayed(SIDEBAR_EXTRA_DISPLAY_GAME_SPEED) || !mouse_get()->is_touch) && width < 680) && game_state_is_paused()) { y_offset = 100; } @@ -204,8 +203,8 @@ static void draw_construction_buttons(void) if ((mouse_get()->is_touch || config_get(CONFIG_UI_ALWAYS_SHOW_ROTATION_BUTTONS)) && building_construction_can_rotate()) { - //TODO: config - if (!new_sidebar_extra_is_information_displayed(NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED)) { + + if (!sidebar_extra_is_information_displayed(SIDEBAR_EXTRA_DISPLAY_GAME_SPEED)) { x_offset = 4 * BLOCK_SIZE + 8; } else { x_offset = 16; @@ -230,7 +229,7 @@ static void draw_construction_buttons(void) void widget_city_draw_construction_buttons(void) { //TODO: config - if (!new_sidebar_extra_is_information_displayed(NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED)) { + if (!sidebar_extra_is_information_displayed(SIDEBAR_EXTRA_DISPLAY_GAME_SPEED)) { draw_pause_button(); } draw_construction_buttons(); @@ -238,8 +237,7 @@ void widget_city_draw_construction_buttons(void) static int is_pause_button(int x, int y) { - //TODO: config - return !new_sidebar_extra_is_information_displayed(NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED) && + return !sidebar_extra_is_information_displayed(SIDEBAR_EXTRA_DISPLAY_GAME_SPEED) && x < 4 * BLOCK_SIZE + 4 && y >= 24 && y < 56 + 4 * BLOCK_SIZE; } @@ -251,8 +249,7 @@ static int is_cancel_construction_button(int x, int y) int touch_width = 5 * BLOCK_SIZE; int touch_height = 22 + 4 * BLOCK_SIZE; int x_offset = width - touch_width; - //TODO: config - int y_offset = (new_sidebar_extra_is_information_displayed(NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED) && width < 680 + int y_offset = (sidebar_extra_is_information_displayed(SIDEBAR_EXTRA_DISPLAY_GAME_SPEED) && width < 680 && game_state_is_paused()) ? 84 : 24; return x >= x_offset && x < x_offset + touch_width && y >= y_offset && y < y_offset + touch_height; @@ -264,7 +261,7 @@ static int is_rotate_backward_button(int x, int y) city_view_get_viewport(&city_x, &city_y, &width, &height); //TODO: config - int sidebar_pause_button = new_sidebar_extra_is_information_displayed(NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED); + int sidebar_pause_button = sidebar_extra_is_information_displayed(SIDEBAR_EXTRA_DISPLAY_GAME_SPEED); int x_offset = sidebar_pause_button ? 16 : 4 * BLOCK_SIZE + 4; int y_offset = sidebar_pause_button && width < 680 && game_state_is_paused() ? 84 : 24; return x >= x_offset && x < x_offset + 3 * BLOCK_SIZE && @@ -277,7 +274,7 @@ static int is_rotate_forward_button(int x, int y) city_view_get_viewport(&city_x, &city_y, &width, &height); //TODO: config - int sidebar_pause_button = new_sidebar_extra_is_information_displayed(NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED); + int sidebar_pause_button = sidebar_extra_is_information_displayed(SIDEBAR_EXTRA_DISPLAY_GAME_SPEED); int x_offset = sidebar_pause_button ? 4 * BLOCK_SIZE + 4 : 7 * BLOCK_SIZE + 4; int y_offset = sidebar_pause_button && width < 680 && game_state_is_paused() ? 84 : 24; return x >= x_offset && x < x_offset + 3 * BLOCK_SIZE && @@ -724,7 +721,7 @@ void widget_city_handle_input_military(const mouse *m, const hotkeys *h, int leg { map_tile *tile = &data.current_tile; update_city_view_coords(m->x, m->y, tile); - if (!city_view_is_sidebar_collapsed() && widget_minimap_handle_mouse(m)) { + if (!widget_sidebar_is_collapsed() && widget_minimap_handle_mouse(m)) { return; } scroll_map(m); diff --git a/src/widget/newsidebar/new_city.h b/src/widget/newsidebar/new_city.h deleted file mode 100644 index df37a3e873..0000000000 --- a/src/widget/newsidebar/new_city.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef WIDGET_NEW_SIDEBAR_CITY_H -#define WIDGET_NEW_SIDEBAR_CITY_H - -#include "graphics/tooltip.h" -#include "input/mouse.h" - -int widget_sidebar_width(void); - -void widget_new_sidebar_city_draw_background(void); -void widget_new_sidebar_city_draw_foreground(void); - -int widget_new_sidebar_city_handle_mouse(const mouse *m); -int widget_new_sidebar_city_handle_mouse_build_menu(const mouse *m); - -int widget_new_sidebar_city_get_tooltip_text(tooltip_context *c); - -#endif // WIDGET_NEW_SIDEBAR_CITY_H diff --git a/src/widget/newsidebar/new_common.c b/src/widget/newsidebar/new_common.c deleted file mode 100644 index 9f16416387..0000000000 --- a/src/widget/newsidebar/new_common.c +++ /dev/null @@ -1,34 +0,0 @@ -#include "new_common.h" - -#include "city/view.h" -#include "graphics/image.h" -#include "graphics/screen.h" -#include "widget/minimap.h" - -int new_sidebar_common_get_x_offset_advanced(void) -{ - return screen_width() - SIDEBAR_ADVANCED_WIDTH; -} - -int new_sidebar_common_get_height(void) -{ - return screen_height() - TOP_MENU_HEIGHT; -} - -void new_sidebar_common_draw_relief(int x_offset, int y_offset, int image_id) -{ - // relief images below panel - int image_base = image_group(image_id); - int image_offset = image_id == GROUP_SIDE_PANEL ? 2 : 1; - int y_max = screen_height(); - while (y_offset < y_max) { - if (y_max - y_offset <= 120) { - image_draw(image_base + image_offset, x_offset, y_offset, COLOR_MASK_NONE, SCALE_NONE); - y_offset += 120; - } else { - image_draw(image_base + image_offset + image_offset, x_offset, y_offset, - COLOR_MASK_NONE, SCALE_NONE); - y_offset += 285; - } - } -} diff --git a/src/widget/newsidebar/new_common.h b/src/widget/newsidebar/new_common.h deleted file mode 100644 index 9f70b3c65c..0000000000 --- a/src/widget/newsidebar/new_common.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef WIDGET_NEW_SIDEBAR_COMMON_H -#define WIDGET_NEW_SIDEBAR_COMMON_H - -#include "graphics/menu.h" - -#define SIDEBAR_COLLAPSED_WIDTH 42 -#define SIDEBAR_ADVANCED_WIDTH 204 // 162 + 42 (old values combined) -//#define SIDEBAR_MAIN_SECTION_HEIGHT 450 -#define MINIMAP_WIDTH 146 -#define MINIMAP_HEIGHT 111 -#define SIDEBAR_FILLER_Y_OFFSET (MINIMAP_HEIGHT + TOP_MENU_HEIGHT) - -int new_sidebar_common_get_x_offset_advanced(void); - -int new_sidebar_common_get_height(void); - -void new_sidebar_common_draw_relief(int x_offset, int y_offset, int image_id); - -#endif // WIDGET_NEW_SIDEBAR_COMMON_H diff --git a/src/widget/newsidebar/new_extra.c b/src/widget/newsidebar/new_extra.c deleted file mode 100644 index f1636e078d..0000000000 --- a/src/widget/newsidebar/new_extra.c +++ /dev/null @@ -1,813 +0,0 @@ -#include "new_extra.h" - -#include "assets/assets.h" -#include "city/figures.h" -#include "city/finance.h" -#include "city/gods.h" -#include "city/labor.h" -#include "city/military.h" -#include "city/population.h" -#include "city/ratings.h" -#include "city/request.h" -#include "city/resource.h" -#include "core/config.h" -#include "core/image_group.h" -#include "core/lang.h" -#include "core/string.h" -#include "figure/formation_legion.h" -#include "game/resource.h" -#include "game/settings.h" -#include "game/state.h" -#include "graphics/arrow_button.h" -#include "graphics/button.h" -#include "graphics/generic_button.h" -#include "graphics/graphics.h" -#include "graphics/image.h" -#include "graphics/image_button.h" -#include "graphics/lang_text.h" -#include "graphics/menu.h" -#include "graphics/panel.h" -#include "graphics/text.h" -#include "scenario/criteria.h" -#include "scenario/invasion.h" -#include "scenario/property.h" -#include "scenario/request.h" -#include "translation/translation.h" -#include "window/advisor/imperial.h" -#include "window/empire.h" -#include "window/popup_dialog.h" - -#include - -#define EXTRA_INFO_LINE_SPACE 16 -#define EXTRA_INFO_VERTICAL_PADDING 8 -#define EXTRA_INFO_HEIGHT_GAME_SPEED 64 -#define EXTRA_INFO_HEIGHT_UNEMPLOYMENT 48 -#define EXTRA_INFO_HEIGHT_INVASIONS 48 -#define EXTRA_INFO_HEIGHT_GODS 64 -#define EXTRA_INFO_HEIGHT_RATINGS 176 -#define EXTRA_INFO_HEIGHT_REQUESTS_PANEL 48 -#define EXTRA_INFO_HEIGHT_REQUESTS_MIN EXTRA_INFO_LINE_SPACE + EXTRA_INFO_HEIGHT_REQUESTS_PANEL - -#define MAX_REQUESTS_TO_DISPLAY 5 -#define REQUEST_MONTHS_LEFT_FOR_RED_WARNING 3 - -static void button_game_speed(int is_down, int param2); -static void button_toggle_play_paused(int param1, int param2); -static void button_handle_request(const generic_button *button); - -static arrow_button arrow_buttons_speed[] = { - {11, 30, 17, 24, button_game_speed, 1, 0}, - {35, 30, 15, 24, button_game_speed, 0, 0}, -}; - -static image_button play_paused_button = { - 108, 29, 39, 26, IB_NORMAL, 0, 0, button_toggle_play_paused, button_none, 0, 0, 1, "UI", "Pause Button" -}; - -static generic_button buttons_emperor_requests[] = { - {2, 28, 158, 20, button_handle_request}, - {2, 76, 158, 20, button_handle_request, 0, 1}, - {2, 124, 158, 20, button_handle_request, 0, 2}, - {2, 172, 158, 20, button_handle_request, 0, 3}, - {2, 220, 158, 20, button_handle_request, 0, 4} -}; - -static const char *play_pause_button_image_names[] = { "Pause Button", "Play Button" }; - -typedef struct { - int value; - int target; -} objective; - -typedef struct { - int index; - int resource; - int amount; - int available; - int time; - int stockpiled; -} request; - -static struct { - int x_offset; - int y_offset; - int width; - int height; - int available_height; - int is_collapsed; - new_sidebar_extra_display info_to_display; - int game_speed; - struct { - int percentage; - int amount; - } unemployment; - struct { - objective culture; - objective prosperity; - objective peace; - objective favor; - objective population; - } objectives; - struct { - int happy; - int angry; - } gods; - int next_invasion; - unsigned int visible_requests; - unsigned int active_requests; - int troop_requests; - int objectives_y_offset; - int request_buttons_y_offset; - unsigned int focused_request_button_id; - unsigned int selected_request_id; - unsigned int selected_resource; - request requests[MAX_REQUESTS_TO_DISPLAY]; -} data; - -static int count_active_requests(void) -{ - int count = city_request_has_troop_request() + scenario_request_count_visible(); - return count > MAX_REQUESTS_TO_DISPLAY ? MAX_REQUESTS_TO_DISPLAY : count; -} - -static int sort_requests(const void *va, const void *vb) -{ - return ((request *) va)->time - ((request *) vb)->time; -} - -static new_sidebar_extra_display calculate_displayable_info(new_sidebar_extra_display info_to_display, int available_height) -{ - if (data.is_collapsed || !config_get(CONFIG_UI_SIDEBAR_INFO) || info_to_display == NEW_SIDEBAR_EXTRA_DISPLAY_NONE) { - return NEW_SIDEBAR_EXTRA_DISPLAY_NONE; - } - new_sidebar_extra_display result = NEW_SIDEBAR_EXTRA_DISPLAY_NONE; - if (available_height >= EXTRA_INFO_HEIGHT_GAME_SPEED) { - if (info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED) { - available_height -= EXTRA_INFO_HEIGHT_GAME_SPEED; - result |= NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED; - } - } else { - return result; - } - if (available_height >= EXTRA_INFO_HEIGHT_UNEMPLOYMENT) { - if (info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_UNEMPLOYMENT) { - available_height -= EXTRA_INFO_HEIGHT_UNEMPLOYMENT; - result |= NEW_SIDEBAR_EXTRA_DISPLAY_UNEMPLOYMENT; - } - } else { - return result; - } - if (available_height >= EXTRA_INFO_HEIGHT_INVASIONS) { - if (info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_INVASIONS) { - available_height -= EXTRA_INFO_HEIGHT_INVASIONS; - result |= NEW_SIDEBAR_EXTRA_DISPLAY_INVASIONS; - } - } else { - return result; - } - if (available_height >= EXTRA_INFO_HEIGHT_GODS) { - if (info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_GODS) { - available_height -= EXTRA_INFO_HEIGHT_GODS; - result |= NEW_SIDEBAR_EXTRA_DISPLAY_GODS; - } - } else { - return result; - } - if (available_height >= EXTRA_INFO_HEIGHT_REQUESTS_MIN) { - if (info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_REQUESTS) { - available_height -= EXTRA_INFO_HEIGHT_REQUESTS_MIN; - result |= NEW_SIDEBAR_EXTRA_DISPLAY_REQUESTS; - } - } - if (available_height >= EXTRA_INFO_HEIGHT_RATINGS) { - if (info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_RATINGS) { - available_height -= EXTRA_INFO_HEIGHT_RATINGS; - result |= NEW_SIDEBAR_EXTRA_DISPLAY_RATINGS; - } - } else { - return result; - } - - return result; -} - -static int calculate_extra_info_height(int available_height) -{ - if (data.info_to_display == NEW_SIDEBAR_EXTRA_DISPLAY_NONE) { - return 0; - } - int height = 0; - if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED) { - height += EXTRA_INFO_HEIGHT_GAME_SPEED; - } - if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_UNEMPLOYMENT) { - height += EXTRA_INFO_HEIGHT_UNEMPLOYMENT; - } - if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_INVASIONS) { - height += EXTRA_INFO_HEIGHT_INVASIONS; - } - if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_GODS) { - height += EXTRA_INFO_HEIGHT_GODS; - } - if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_REQUESTS) { - height += EXTRA_INFO_HEIGHT_REQUESTS_MIN; - unsigned int num_requests = count_active_requests(); - data.visible_requests = 1; - while (data.visible_requests < num_requests) { - if (height + EXTRA_INFO_HEIGHT_REQUESTS_PANEL > available_height) { - break; - } - height += EXTRA_INFO_HEIGHT_REQUESTS_PANEL; - data.visible_requests++; - } - } - if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_RATINGS) { - height += EXTRA_INFO_HEIGHT_RATINGS; - } - - return height; -} - -static void set_extra_info_objectives(void) -{ - data.objectives.culture.target = 0; - data.objectives.prosperity.target = 0; - data.objectives.peace.target = 0; - data.objectives.favor.target = 0; - data.objectives.population.target = 0; - - if (scenario_is_open_play()) { - return; - } - if (scenario_criteria_culture_enabled()) { - data.objectives.culture.target = scenario_criteria_culture(); - } - if (scenario_criteria_prosperity_enabled()) { - data.objectives.prosperity.target = scenario_criteria_prosperity(); - } - if (scenario_criteria_peace_enabled()) { - data.objectives.peace.target = scenario_criteria_peace(); - } - if (scenario_criteria_favor_enabled()) { - data.objectives.favor.target = scenario_criteria_favor(); - } - if (scenario_criteria_population_enabled()) { - data.objectives.population.target = scenario_criteria_population(); - } -} - -static int count_happy_gods(void) -{ - int happy_gods = 0; - for (int god = 0; god < MAX_GODS; god++) { - if (city_god_happy_bolts(god) > 0) { - happy_gods++; - } - } - return happy_gods; -} - -static int count_angry_gods(void) -{ - int angry_gods = 0; - for (int god = 0; god < 5; god++) { - if (city_god_wrath_bolts(god) > 0) { - angry_gods++; - } - } - return angry_gods; -} - -static int is_stockpiled_changed(resource_type resource) -{ - return city_resource_is_stockpiled(resource); -} - -static int update_extra_info_value(int value, int *field) -{ - if (value == *field) { - return 0; - } else { - *field = value; - return 1; - } -} - -static int update_extra_info(int is_background) -{ - int changed = 0; - if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED) { - changed |= update_extra_info_value(setting_game_speed(), &data.game_speed); - } - if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_UNEMPLOYMENT) { - changed |= update_extra_info_value(city_labor_unemployment_percentage(), &data.unemployment.percentage); - changed |= update_extra_info_value( - city_labor_workers_unemployed() - city_labor_workers_needed(), - &data.unemployment.amount - ); - } - if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_INVASIONS) { - int next_invasion = 0; - if (!city_figures_total_invading_enemies()) { - next_invasion = scenario_invasion_get_years_remaining() + 1; - } - changed |= update_extra_info_value(next_invasion, &data.next_invasion); - } - if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_GODS) { - changed |= update_extra_info_value(count_happy_gods(), &data.gods.happy); - changed |= update_extra_info_value(count_angry_gods(), &data.gods.angry); - } - if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_REQUESTS) { - int new_requests = update_extra_info_value(count_active_requests(), (int *) &data.active_requests); - new_requests |= update_extra_info_value(city_request_has_troop_request(), &data.troop_requests); - - if (data.troop_requests) { - changed |= update_extra_info_value(RESOURCE_TROOPS, &data.requests[0].resource); - changed |= update_extra_info_value(city_military_months_until_distant_battle(), &data.requests[0].time); - changed |= update_extra_info_value(city_military_distant_battle_enemy_strength(), &data.requests[0].amount); - changed |= update_extra_info_value(city_military_empire_service_legions(), &data.requests[0].available); - data.requests[0].index = 0; - } - int other_requests = data.active_requests - data.troop_requests; - int must_resort = 0; - for (int i = 0; i < other_requests; i++) { - request *slot = &data.requests[i + data.troop_requests]; - if (new_requests) { - slot->index = i; - } - const scenario_request *r = scenario_request_get_visible(slot->index); - changed |= update_extra_info_value(r->resource, &slot->resource); - if (r->months_to_comply > slot->time) { - must_resort = 1; - } - changed |= update_extra_info_value(r->months_to_comply, &slot->time); - changed |= update_extra_info_value(r->amount.requested, &slot->amount); - if (r->resource == RESOURCE_DENARII) { - changed |= update_extra_info_value(city_finance_treasury(), &slot->available); - } else { - changed |= update_extra_info_value(city_resource_get_amount_including_granaries(r->resource, - r->amount.requested, 0, 1), &slot->available); - } - - changed |= update_extra_info_value(is_stockpiled_changed(r->resource), &slot->stockpiled); - } - if (new_requests || must_resort) { - qsort(data.requests + data.troop_requests, other_requests, sizeof(request), sort_requests); - changed = 1; - } - } - - if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_RATINGS) { - if (is_background) { - set_extra_info_objectives(); - } - changed |= update_extra_info_value(city_rating_culture(), &data.objectives.culture.value); - changed |= update_extra_info_value(city_rating_prosperity(), &data.objectives.prosperity.value); - changed |= update_extra_info_value(city_rating_peace(), &data.objectives.peace.value); - changed |= update_extra_info_value(city_rating_favor(), &data.objectives.favor.value); - changed |= update_extra_info_value(city_population(), &data.objectives.population.value); - } - - return changed; -} - -static int draw_extra_info_objective( - int x_offset, int y_offset, int text_group, int text_id, objective *obj, int cut_off_at_parenthesis) -{ - if (cut_off_at_parenthesis) { - // Exception for Chinese: the string for "population" includes the hotkey " (6)" - // To fix that: cut the string off at the '(' - uint8_t tmp[100]; - string_copy(lang_get_string(text_group, text_id), tmp, 100); - for (int i = 0; i < 100 && tmp[i]; i++) { - if (tmp[i] == '(') { - tmp[i] = 0; - break; - } - } - text_draw(tmp, x_offset + 11, y_offset, FONT_NORMAL_WHITE, 0); - } else { - lang_text_draw(text_group, text_id, x_offset + 11, y_offset, FONT_NORMAL_WHITE); - } - font_t font = obj->value >= obj->target ? FONT_NORMAL_GREEN : FONT_NORMAL_RED; - int width = text_draw_number(obj->value, '@', "", x_offset + 11, y_offset + EXTRA_INFO_LINE_SPACE, font, 0); - text_draw_number(obj->target, '(', ")", x_offset + 11 + width, y_offset + EXTRA_INFO_LINE_SPACE, font, 0); - return EXTRA_INFO_LINE_SPACE * 2; -} - -static int get_text_offset_for_force_size(int force_size) -{ - if (force_size < 46) { - return 0; - } else if (force_size < 89) { - return 1; - } else { - return 2; - } -} - -static int draw_request_buttons(int y_offset) -{ - int original_offset = y_offset; - - y_offset += EXTRA_INFO_VERTICAL_PADDING; - - for (unsigned int i = 0; i < data.visible_requests; i++) { - const request *r = &data.requests[i]; - int base_button_y_offset = i * EXTRA_INFO_HEIGHT_REQUESTS_PANEL; - - if (data.visible_requests + 1 == data.active_requests && - data.height + EXTRA_INFO_HEIGHT_REQUESTS_PANEL > data.available_height) { - - buttons_emperor_requests[i].y = base_button_y_offset + 9; - buttons_emperor_requests[i].height = 30; - - text_draw_centered(translation_for(TR_SIDEBAR_EXTRA_REQUESTS_VIEW_ALL), - data.x_offset, y_offset + 11, data.width, FONT_NORMAL_GREEN, 0); - break; - } - buttons_emperor_requests[i].y = base_button_y_offset + 28; - buttons_emperor_requests[i].height = 20; - int width = data.x_offset + 10; - if (r->resource == RESOURCE_TROOPS) { - int image_id = resource_get_data(RESOURCE_WEAPONS)->image.icon; - const image *img = image_get(image_id); - int image_y_offset = (EXTRA_INFO_LINE_SPACE - img->height) / 2; - - image_draw(image_id, width, y_offset + image_y_offset - 2, COLOR_MASK_NONE, SCALE_NONE); - - int force_text_offset = get_text_offset_for_force_size(r->amount); - - text_draw_ellipsized(translation_for(TR_SIDEBAR_EXTRA_REQUESTS_SMALL_FORCE + force_text_offset), - data.x_offset + 32, y_offset - 7, data.width - 34, FONT_NORMAL_GREEN, 0); - - lang_text_draw_amount(8, 4, r->time, data.x_offset + 26, y_offset + 6, - r->time <= REQUEST_MONTHS_LEFT_FOR_RED_WARNING ? FONT_NORMAL_RED : FONT_NORMAL_GREEN); - - text_draw_centered(translation_for(TR_SIDEBAR_EXTRA_REQUESTS_SEND), - data.x_offset + 2, y_offset + 25, 158, FONT_NORMAL_GREEN, 0); - } else { - int image_id = resource_get_data(r->resource)->image.icon; - const image *img = image_get(image_id); - int image_y_offset = (EXTRA_INFO_LINE_SPACE - img->height) / 2; - - image_draw(image_id, width, y_offset + image_y_offset, COLOR_MASK_NONE, SCALE_NONE); - - width += img->width + 6; - - if (r->resource != RESOURCE_DENARII) { - int is_stockpiled = city_resource_is_stockpiled(r->resource); - int enough_resource = 0; - - int request_index = data.requests[i].index; - if (city_request_has_troop_request() && i != 0) { - request_index++; - } - - int status = city_request_get_status(request_index); - - // button text - if (status) { - if (status == CITY_REQUEST_STATUS_NOT_ENOUGH_RESOURCES) { - if (is_stockpiled) { - image_draw(assets_get_image_id("UI", "Store Icon"), - data.x_offset + 5, y_offset + 10, COLOR_MASK_NONE, SCALE_NONE); - text_draw_centered(translation_for(TR_SIDEBAR_EXTRA_REQUESTS_UNSTOCK), - data.x_offset + 2, y_offset + 25, 158, FONT_NORMAL_GREEN, 0); - } else { - text_draw_centered(translation_for(TR_SIDEBAR_EXTRA_REQUESTS_STOCK), - data.x_offset + 2, y_offset + 25, 158, FONT_NORMAL_GREEN, 0); - } - } else { - enough_resource = 1; - text_draw_centered(translation_for(TR_SIDEBAR_EXTRA_REQUESTS_SEND), - data.x_offset + 2, y_offset + 25, 158, FONT_NORMAL_GREEN, 0); - } - } - - // request current / total - width += text_draw_number(r->available, 0, "/", width, y_offset + 2, - enough_resource ? FONT_NORMAL_GREEN : FONT_NORMAL_RED, 0); - width += text_draw_number(r->amount, 0, "", - width - 5, y_offset + 2, enough_resource ? FONT_NORMAL_GREEN : FONT_NORMAL_RED, 0); - - } else { - width += text_draw_number(r->amount, 0, "", - width, y_offset + 2, FONT_NORMAL_GREEN, 0); - - text_draw_centered(translation_for(TR_SIDEBAR_EXTRA_REQUESTS_SEND), - data.x_offset + 2, y_offset + 25, 158, FONT_NORMAL_GREEN, 0); - } - - font_t font_color = r->time <= REQUEST_MONTHS_LEFT_FOR_RED_WARNING ? FONT_NORMAL_RED : FONT_NORMAL_GREEN; - - // request time left - text_draw(string_from_ascii(","), width - 12, y_offset + 2, FONT_NORMAL_GREEN, 0); - width += text_draw_number(r->time, 0, "", width, y_offset + 2, font_color, 0); - lang_text_draw_ellipsized(8, 4 + (r->time != 1), width, y_offset + 2, - data.width - (width - data.x_offset) - 4, font_color); - } - y_offset += EXTRA_INFO_HEIGHT_REQUESTS_PANEL; - } - return y_offset - original_offset; -} - -static void draw_extra_info_panel(void) -{ - int panel_blocks = data.height / BLOCK_SIZE; - graphics_draw_line(data.x_offset, data.x_offset, data.y_offset, data.y_offset + data.height, COLOR_WHITE); - graphics_draw_line(data.x_offset + data.width - 1, data.x_offset + data.width - 1, data.y_offset, - data.y_offset + data.height, COLOR_SIDEBAR); - inner_panel_draw(data.x_offset + 1, data.y_offset, data.width / BLOCK_SIZE, panel_blocks); - - int y_offset = data.y_offset + EXTRA_INFO_VERTICAL_PADDING; - - if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED) { - y_offset += EXTRA_INFO_VERTICAL_PADDING; - - lang_text_draw(45, 2, data.x_offset + 10, y_offset, FONT_NORMAL_WHITE); - y_offset += EXTRA_INFO_LINE_SPACE + EXTRA_INFO_VERTICAL_PADDING; - - text_draw_percentage(data.game_speed, data.x_offset + 60, y_offset - 2, FONT_NORMAL_GREEN); - - y_offset += EXTRA_INFO_VERTICAL_PADDING * 3; - } - - if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_UNEMPLOYMENT) { - y_offset += EXTRA_INFO_VERTICAL_PADDING; - - lang_text_draw(68, 148, data.x_offset + 10, y_offset, FONT_NORMAL_WHITE); - y_offset += EXTRA_INFO_LINE_SPACE; - - int text_width = text_draw_percentage(data.unemployment.percentage, - data.x_offset + 10, y_offset, FONT_NORMAL_GREEN); - text_draw_number(data.unemployment.amount, '(', ")", - data.x_offset + 10 + text_width, y_offset, FONT_NORMAL_GREEN, 0); - - y_offset += EXTRA_INFO_VERTICAL_PADDING * 3; - } - - if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_INVASIONS) { - y_offset += EXTRA_INFO_VERTICAL_PADDING; - - text_draw(translation_for(TR_SIDEBAR_EXTRA_INVASIONS), data.x_offset + 10, y_offset, FONT_NORMAL_WHITE, 0); - - y_offset += EXTRA_INFO_VERTICAL_PADDING * 2 + 4; - - font_t font_type = data.next_invasion == 0 || data.next_invasion == 2 ? FONT_NORMAL_RED : FONT_NORMAL_GREEN; - - text_draw_centered(translation_for(TR_SIDEBAR_EXTRA_INVASION_UNDERWAY + data.next_invasion), - data.x_offset + 2, y_offset, data.width - 4, font_type, 0); - - y_offset += EXTRA_INFO_LINE_SPACE + 4; - } - - if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_GODS) { - y_offset += EXTRA_INFO_VERTICAL_PADDING; - - text_draw(translation_for(TR_SIDEBAR_EXTRA_GODS), data.x_offset + 10, y_offset, FONT_NORMAL_WHITE, 0); - y_offset += EXTRA_INFO_LINE_SPACE + EXTRA_INFO_VERTICAL_PADDING; - - font_t font_type = data.gods.angry > 0 ? FONT_NORMAL_RED : FONT_NORMAL_GREEN; - int width = text_draw_number(data.gods.angry, 0, "", data.x_offset + 42, y_offset + 2, font_type, 0); - image_draw(image_group(GROUP_GOD_BOLT), data.x_offset + 42 + width, y_offset - 2, COLOR_MASK_NONE, SCALE_NONE); - - static int happy_image_id; - if (!happy_image_id) { - happy_image_id = assets_get_image_id("UI", "Happy God Icon"); - } - width = text_draw_number(data.gods.happy, 0, "", data.x_offset + 82, y_offset + 2, FONT_NORMAL_GREEN, 0); - image_draw(happy_image_id, data.x_offset + 82 + width, y_offset - 2, COLOR_MASK_NONE, SCALE_NONE); - - y_offset += EXTRA_INFO_VERTICAL_PADDING * 2; - } - - if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_RATINGS) { - y_offset += EXTRA_INFO_LINE_SPACE; - - data.objectives_y_offset = y_offset; - - y_offset += draw_extra_info_objective(data.x_offset, y_offset, 53, 1, &data.objectives.culture, 0); - y_offset += draw_extra_info_objective(data.x_offset, y_offset, 53, 2, &data.objectives.prosperity, 0); - y_offset += draw_extra_info_objective(data.x_offset, y_offset, 53, 3, &data.objectives.peace, 0); - y_offset += draw_extra_info_objective(data.x_offset, y_offset, 53, 4, &data.objectives.favor, 0); - y_offset += draw_extra_info_objective(data.x_offset, y_offset, 4, 6, &data.objectives.population, 1); - } - - if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_REQUESTS) { - y_offset += EXTRA_INFO_VERTICAL_PADDING + 4; - lang_text_draw(44, 40, data.x_offset + 10, y_offset, FONT_NORMAL_WHITE); - y_offset += EXTRA_INFO_VERTICAL_PADDING * 3 - 4; - data.request_buttons_y_offset = y_offset; - - if (data.active_requests == 0) { - lang_text_draw_centered(44, 19, data.x_offset, y_offset + EXTRA_INFO_VERTICAL_PADDING + 4, - data.width, FONT_NORMAL_GREEN); - y_offset += EXTRA_INFO_HEIGHT_REQUESTS_PANEL; - } else { - y_offset += draw_request_buttons(y_offset); - } - } -} - -int new_sidebar_extra_draw_background(int x_offset, int y_offset, int width, int available_height, - int is_collapsed, new_sidebar_extra_display info_to_display) -{ - data.is_collapsed = is_collapsed; - data.x_offset = x_offset; - data.y_offset = y_offset; - data.width = width; - data.info_to_display = calculate_displayable_info(info_to_display, available_height); - data.available_height = available_height; - data.height = calculate_extra_info_height(available_height); - - if (data.info_to_display != NEW_SIDEBAR_EXTRA_DISPLAY_NONE) { - update_extra_info(1); - draw_extra_info_panel(); - } - return data.height; -} - -static void draw_extra_info_buttons(void) -{ - if (update_extra_info(0)) { - // Updates displayed speed % after clicking the arrows - draw_extra_info_panel(); - } - if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED) { - if (!play_paused_button.pressed) { - play_paused_button.image_name = play_pause_button_image_names[game_state_is_paused()]; - } - arrow_buttons_draw(data.x_offset, data.y_offset, arrow_buttons_speed, 2); - image_buttons_draw(data.x_offset, data.y_offset, &play_paused_button, 1); - } - if (data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_REQUESTS && data.active_requests) { - for (unsigned int i = 0; i < data.visible_requests; i++) { - button_border_draw(data.x_offset + 2, data.request_buttons_y_offset + buttons_emperor_requests[i].y, - data.width - 4, buttons_emperor_requests[i].height, i == data.focused_request_button_id - 1); - } - } -} - -void new_sidebar_extra_draw_foreground(void) -{ - draw_extra_info_buttons(); -} - -int new_sidebar_extra_handle_mouse(const mouse *m) -{ - if ((data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED) && - (arrow_buttons_handle_mouse(m, data.x_offset, data.y_offset, arrow_buttons_speed, 2, 0) || - image_buttons_handle_mouse(m, data.x_offset, data.y_offset, &play_paused_button, 1, 0))) { - return 1; - } - if ((data.info_to_display & NEW_SIDEBAR_EXTRA_DISPLAY_REQUESTS) && - generic_buttons_handle_mouse(m, data.x_offset, data.request_buttons_y_offset, - buttons_emperor_requests, data.visible_requests, &data.focused_request_button_id)) { - return 1; - } - return 0; -} - -int new_sidebar_extra_get_tooltip(tooltip_context *c) -{ - if (!new_sidebar_extra_is_information_displayed(NEW_SIDEBAR_EXTRA_DISPLAY_RATINGS)) { - return 0; - } - const mouse *m = mouse_get(); - if (m->x < data.x_offset + 2 || m->x >= data.x_offset + data.width - 2 || m->y < data.objectives_y_offset || - m->y >= data.objectives_y_offset + EXTRA_INFO_LINE_SPACE * 8) { - return 0; - } - int text_id = 0; - selected_rating rating = (m->y - data.objectives_y_offset) / (EXTRA_INFO_LINE_SPACE * 2) + 1; - switch (rating) { - case SELECTED_RATING_CULTURE: - if (data.objectives.culture.value <= 90) { - text_id = 9 + city_rating_explanation_for(SELECTED_RATING_CULTURE); - } else { - text_id = 50; - } - break; - case SELECTED_RATING_PROSPERITY: - { - if (data.objectives.prosperity.value <= 90) { - text_id = 16 + city_rating_explanation_for(SELECTED_RATING_PROSPERITY); - } else { - text_id = 51; - } - break; - } - case SELECTED_RATING_PEACE: - if (data.objectives.peace.value <= 90) { - text_id = 41 + city_rating_explanation_for(SELECTED_RATING_PEACE); - } else { - text_id = 52; - } - break; - case SELECTED_RATING_FAVOR: - if (data.objectives.favor.value <= 90) { - text_id = 27 + city_rating_explanation_for(SELECTED_RATING_FAVOR); - } else { - text_id = 53; - } - break; - default: - return 0; - } - c->text_group = 53; - return text_id; -} - -static void button_game_speed(int is_down, int param2) -{ - if (is_down) { - setting_decrease_game_speed(); - } else { - setting_increase_game_speed(); - } -} - -static void button_toggle_play_paused(int param1, int param2) -{ - game_state_toggle_paused(); -} - - -static void confirm_nothing(int accepted, int checked) -{} - -static void confirm_send_troops(int accepted, int checked) -{ - if (accepted) { - formation_legions_dispatch_to_distant_battle(); - window_empire_show(); - } -} - -static void confirm_send_goods(int accepted, int checked) -{ - if (accepted) { - scenario_request_dispatch(data.selected_request_id); - if (!checked && city_resource_is_stockpiled(data.selected_resource)) { - city_resource_toggle_stockpiled(data.selected_resource); - } - } -} - -static void button_handle_request(const generic_button *button) -{ - int index = button->parameter1; - if (data.active_requests > data.visible_requests && index == (int) data.visible_requests - 1) { - window_advisors_show_advisor(ADVISOR_IMPERIAL); - return; - } - int request_index = data.requests[index].index; - if (city_request_has_troop_request() && index != 0) { - request_index++; - } - int status = city_request_get_status(request_index); - const request *r = &data.requests[index]; - - if (status) { - city_military_clear_empire_service_legions(); - switch (status) { - case CITY_REQUEST_STATUS_NO_LEGIONS_AVAILABLE: - window_popup_dialog_show(POPUP_DIALOG_NO_LEGIONS_AVAILABLE, confirm_nothing, 0); - break; - case CITY_REQUEST_STATUS_NO_LEGIONS_SELECTED: - window_popup_dialog_show(POPUP_DIALOG_NO_LEGIONS_SELECTED, confirm_nothing, 0); - break; - case CITY_REQUEST_STATUS_CONFIRM_SEND_LEGIONS: - window_popup_dialog_show(POPUP_DIALOG_SEND_TROOPS, confirm_send_troops, 2); - break; - case CITY_REQUEST_STATUS_NOT_ENOUGH_RESOURCES: - city_resource_toggle_stockpiled(r->resource); - break; - default: - data.selected_resource = r->resource; - data.selected_request_id = (status - CITY_REQUEST_STATUS_MAX) & - ~CITY_REQUEST_STATUS_RESOURCES_FROM_GRANARY; - if (status & CITY_REQUEST_STATUS_RESOURCES_FROM_GRANARY) { - window_popup_dialog_show_confirmation( - translation_for(TR_ADVISOR_DISPATCHING_FOOD_FROM_GRANARIES_TITLE), - translation_for(TR_ADVISOR_DISPATCHING_FOOD_FROM_GRANARIES_TEXT), - city_resource_is_stockpiled(r->resource) ? translation_for(TR_ADVISOR_KEEP_STOCKPILING) : 0, - confirm_send_goods); - } else { - window_popup_dialog_show_confirmation( - lang_get_string(5, POPUP_DIALOG_SEND_GOODS), - lang_get_string(5, POPUP_DIALOG_SEND_GOODS + 1), - city_resource_is_stockpiled(r->resource) ? translation_for(TR_ADVISOR_KEEP_STOCKPILING) : 0, - confirm_send_goods); - } - break; - } - } -} - -int new_sidebar_extra_is_information_displayed(new_sidebar_extra_display display) -{ - return (data.info_to_display & display) != 0; -} diff --git a/src/widget/newsidebar/new_extra.h b/src/widget/newsidebar/new_extra.h deleted file mode 100644 index 0b8e6ff30e..0000000000 --- a/src/widget/newsidebar/new_extra.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef WIDGET_NEW_SIDEBAR_FILLER_H -#define WIDGET_NEW_SIDEBAR_FILLER_H - -#include "graphics/tooltip.h" -#include "input/mouse.h" - -typedef enum { - NEW_SIDEBAR_EXTRA_DISPLAY_NONE = 0, - NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED = 1, - NEW_SIDEBAR_EXTRA_DISPLAY_UNEMPLOYMENT = 2, - NEW_SIDEBAR_EXTRA_DISPLAY_INVASIONS = 4, - NEW_SIDEBAR_EXTRA_DISPLAY_GODS = 8, - NEW_SIDEBAR_EXTRA_DISPLAY_RATINGS = 16, - NEW_SIDEBAR_EXTRA_DISPLAY_REQUESTS = 32, - NEW_SIDEBAR_EXTRA_DISPLAY_ALL = 63 -} new_sidebar_extra_display; - -/** - * @return The actual height of the extra info - */ -int new_sidebar_extra_draw_background(int x_offset, int y_offset, int width, int height, - int is_collapsed, new_sidebar_extra_display info_to_display); -void new_sidebar_extra_draw_foreground(void); - -int new_sidebar_extra_handle_mouse(const mouse *m); - -int new_sidebar_extra_get_tooltip(tooltip_context *c); - -int new_sidebar_extra_is_information_displayed(new_sidebar_extra_display display); - -#endif // WIDGET_NEW_SIDEBAR_FILLER_H diff --git a/src/widget/newsidebar/new_military.c b/src/widget/newsidebar/new_military.c deleted file mode 100644 index 3a513c3656..0000000000 --- a/src/widget/newsidebar/new_military.c +++ /dev/null @@ -1,681 +0,0 @@ -#include "new_military.h" - -#include "assets/assets.h" -#include "building/count.h" -#include "city/view.h" -#include "core/calc.h" -#include "figure/formation.h" -#include "figure/formation_legion.h" -#include "graphics/arrow_button.h" -#include "graphics/generic_button.h" -#include "graphics/graphics.h" -#include "graphics/image.h" -#include "graphics/image_button.h" -#include "graphics/lang_text.h" -#include "graphics/panel.h" -#include "graphics/screen.h" -#include "graphics/text.h" -#include "graphics/window.h" -#include "map/grid.h" -#include "sound/speech.h" -#include "widget/minimap.h" -#include "widget/newsidebar/new_city.h" -#include "widget/newsidebar/new_common.h" -#include "widget/newsidebar/new_extra.h" -#include "widget/newsidebar/new_slide.h" -#include "window/building/military.h" -#include "window/city.h" -#include "window/military_menu.h" - - -#define LAYOUTS_PER_LEGION 5 - -#define MILITARY_PANEL_HEIGHT 474 -#define Y_OFFSET_PANEL_START 176 -#define Y_OFFSET_LAYOUT_BUTTONS 156 -#define Y_OFFSET_BOTTOM_BUTTONS 257 -#define MILITARY_PANEL_BLOCKS 18 -#define CONTENT_PADDING 10 -#define CONTENT_WIDTH (SIDEBAR_ADVANCED_WIDTH - 2 * CONTENT_PADDING) - -static const int IMAGE_OFFSETS_TO_FORMATION[7] = { - FORMATION_COLUMN, - FORMATION_TORTOISE, - FORMATION_DOUBLE_LINE_1, - FORMATION_DOUBLE_LINE_2, - FORMATION_MOP_UP, - FORMATION_SINGLE_LINE_1, - FORMATION_SINGLE_LINE_2 -}; - -static const int LAYOUT_IMAGE_OFFSETS_LEGIONARY[2][LAYOUTS_PER_LEGION] = { - {0, 0, 2, 3, 4}, {0, 0, 3, 2, 4}, -}; - -static const int LAYOUT_IMAGE_OFFSETS_AUXILIARY[2][LAYOUTS_PER_LEGION] = { - {5, 6, 2, 3, 4}, {6, 5, 3, 2, 4}, -}; - -static const int LAYOUT_BUTTON_INDEXES_LEGIONARY[2][LAYOUTS_PER_LEGION] = { - { - FORMATION_TORTOISE, - FORMATION_COLUMN, - FORMATION_DOUBLE_LINE_1, - FORMATION_DOUBLE_LINE_2, - FORMATION_MOP_UP - }, - { - FORMATION_TORTOISE, - FORMATION_COLUMN, - FORMATION_DOUBLE_LINE_2, - FORMATION_DOUBLE_LINE_1, - FORMATION_MOP_UP - } -}; - -static const int LAYOUT_BUTTON_INDEXES_AUXILIARY[2][LAYOUTS_PER_LEGION] = { - { - FORMATION_SINGLE_LINE_1, - FORMATION_SINGLE_LINE_2, - FORMATION_DOUBLE_LINE_1, - FORMATION_DOUBLE_LINE_2, - FORMATION_MOP_UP - }, - { - FORMATION_SINGLE_LINE_2, - FORMATION_SINGLE_LINE_1, - FORMATION_DOUBLE_LINE_2, - FORMATION_DOUBLE_LINE_1, - FORMATION_MOP_UP - } -}; - -static void button_military_menu(int param1, int param2); -static void button_close_military_new_sidebar(int param1, int param2); -static void button_cycle_legion(int cycle_forward, int param2); -static void button_select_formation_layout(const generic_button *button); -static void button_go_to_legion(const generic_button *button); -static void button_return_to_fort(const generic_button *button); -static void button_empire_service(const generic_button *button); - -static image_button buttons_title_close[] = { - {123, 4, 39, 26, IB_NORMAL, GROUP_OK_CANCEL_SCROLL_BUTTONS, 4, - button_close_military_new_sidebar, button_none, 0, 0, 1}, - {4, 3, 117, 31, IB_NORMAL, 93, 0, button_military_menu, button_none, 0, 0, 1} -}; - -static arrow_button buttons_cycle_legion[] = { - {10, 10, 19, 24, button_cycle_legion, 0, 0}, - {126, 10, 21, 24, button_cycle_legion, 1, 0}, -}; - -static generic_button buttons_formation_layout[LAYOUTS_PER_LEGION - 2][LAYOUTS_PER_LEGION] = { - { - {8, 0, 46, 46, button_select_formation_layout}, - {58, 0, 46, 46, button_select_formation_layout, 0, 1}, - {108, 0, 46, 46, button_select_formation_layout, 0, 2} - }, - { - {33, 50, 46, 46, button_select_formation_layout}, - {33, 0, 46, 46, button_select_formation_layout, 0, 1}, - {83, 0, 46, 46, button_select_formation_layout, 0, 2}, - {83, 50, 46, 46, button_select_formation_layout, 0, 3} - }, - { - {33, 0, 46, 46, button_select_formation_layout}, - {83, 0, 46, 46, button_select_formation_layout, 0, 1}, - {8, 50, 46, 46, button_select_formation_layout, 0, 2}, - {58, 50, 46, 46, button_select_formation_layout, 0, 3}, - {108, 50, 46, 46, button_select_formation_layout, 0, 4} - } -}; - -static generic_button buttons_bottom[] = { - {16, 0, 30, 30, button_go_to_legion}, - {66, 0, 30, 30, button_return_to_fort}, - {116, 0, 30, 30, button_empire_service}, -}; - -typedef struct { - int formation_id; - int standard_id; //figure id of the standard in the figure array - int soldiers; - int health; - int morale; - int layout; - int is_at_fort; - int empire_service; -} legion_info; - -static struct { - legion_info active_legion; - unsigned int top_buttons_focus_id; - unsigned int inner_buttons_focus_id; - unsigned int bottom_buttons_focus_id; - int city_view_was_collapsed; -} data; - -static int available_layouts_for_legion(const formation *m) -{ - int layouts = LAYOUTS_PER_LEGION; - if (m->figure_type == FIGURE_FORT_LEGIONARY || m->figure_type == FIGURE_FORT_INFANTRY) { - if (m->has_military_training) { - layouts = LAYOUTS_PER_LEGION - 1; - } else { - layouts = LAYOUTS_PER_LEGION - 2; - } - } - return layouts; -} - -static void draw_layout_buttons(int x, int y, int background, const formation *m) -{ - int index = 0; - if (city_view_orientation() == DIR_6_LEFT || city_view_orientation() == DIR_2_RIGHT) { - index = 1; - } - const int *offsets = (m->figure_type == FIGURE_FORT_LEGIONARY || m->figure_type == FIGURE_FORT_INFANTRY) ? - LAYOUT_IMAGE_OFFSETS_LEGIONARY[index] : LAYOUT_IMAGE_OFFSETS_AUXILIARY[index]; - int formation_types = available_layouts_for_legion(m); - - int start_formation = LAYOUTS_PER_LEGION - formation_types; - const generic_button *button_offsets = buttons_formation_layout[formation_types - 3]; - - for (unsigned int i = start_formation; i < LAYOUTS_PER_LEGION; i++) { - const generic_button *btn = &button_offsets[i - start_formation]; - - if (background) { - image_draw(image_group(GROUP_FORT_FORMATIONS) + offsets[i], (x + btn->x + 3) * 2, (y + btn->y + 3) * 2, - COLOR_MASK_NONE, 2.0f); - } else { - int is_selected_formation = m->layout == IMAGE_OFFSETS_TO_FORMATION[offsets[i]]; - int is_button_focused = i == data.inner_buttons_focus_id - 1 + start_formation; - button_border_draw(x + btn->x, y + btn->y, 46, 46, is_button_focused || is_selected_formation); - } - } -} - -static int get_health_text_id(int health) -{ - if (health <= 0) { - return 26; - } else if (health <= 20) { - return 27; - } else if (health <= 40) { - return 28; - } else if (health <= 55) { - return 29; - } else if (health <= 70) { - return 30; - } else if (health <= 90) { - return 31; - } else { - return 32; - } -} - -int widget_new_sidebar_military_get_standard_image(int legion_id) -{ - switch (legion_id) { - case 0: return 0; // No standard for non-legion formations; - case 1: return image_group(GROUP_FIGURE_FORT_STANDARD_ICONS + 0); - case 2: return image_group(GROUP_FIGURE_FORT_STANDARD_ICONS) + 1; - case 3: return image_group(GROUP_FIGURE_FORT_STANDARD_ICONS) + 2; - case 4: return image_group(GROUP_FIGURE_FORT_STANDARD_ICONS) + 3; - case 5: return image_group(GROUP_FIGURE_FORT_STANDARD_ICONS) + 4; - case 6: return image_group(GROUP_FIGURE_FORT_STANDARD_ICONS) + 5; - case 7: return image_group(GROUP_FIGURE_FORT_STANDARD_ICONS) + 6; - case 8: return image_group(GROUP_FIGURE_FORT_STANDARD_ICONS) + 7; - case 9: return image_group(GROUP_FIGURE_FORT_STANDARD_ICONS) + 8; - case 10: return image_group(GROUP_FIGURE_FORT_STANDARD_ICONS) + 9; - case 11: return assets_get_image_id("UI", "11Legion_Elephants"); - case 12: return assets_get_image_id("UI", "12Legion_Thunder_Bolts"); - case 13: return assets_get_image_id("UI", "13Legion_Bulls"); - case 14: return assets_get_image_id("UI", "14Legion_Centaurs"); - case 15: return assets_get_image_id("UI", "15Legion_Octopi"); - case 16: return assets_get_image_id("UI", "16Legion_Bears"); - case 17: return assets_get_image_id("UI", "17Legion_Scorpions"); - case 18: return assets_get_image_id("UI", "18Legion_Camels"); - case 19: return assets_get_image_id("UI", "19Legion_Dolphins"); - case 20: return assets_get_image_id("UI", "20Legion_Sea_Goats"); - default: return image_group(GROUP_FIGURE_FORT_STANDARD_ICONS + 9); - } -} - -int widget_new_sidebar_military_get_legion_name_group(int legion_id) -{ - return legion_id <= 10 ? 138 : 10000; -} - -int widget_new_sidebar_military_get_legion_name_id(int legion_id) -{ - if (legion_id <= 10) { - return legion_id - 1; // old index was 0-based, now 1-based - } else { - return TR_BUILDING_FORT_STANDARD_ELEPHANTS + legion_id - 11; - } -} - -static void clear_focus_buttons(void) -{ - data.top_buttons_focus_id = 0; - data.inner_buttons_focus_id = 0; - data.bottom_buttons_focus_id = 0; -} - -static void clear_legion_info(legion_info *legion) -{ - legion->health = 0; - legion->layout = 0; - legion->morale = 0; - legion->soldiers = 0; - legion->is_at_fort = 0; - legion->empire_service = 0; -} - -static void update_legion_info(legion_info *legion, const formation *m) -{ - legion->health = calc_percentage(m->total_damage, m->max_total_damage); - legion->layout = m->layout; - legion->morale = m->morale; - legion->soldiers = formation_legion_count_alive_soldiers(m->id); - legion->is_at_fort = m->is_at_fort; - legion->empire_service = m->empire_service; -} - -static void draw_military_info_text(int x_offset, int y_offset) -{ - legion_info *legion = &data.active_legion; - const formation *m = formation_get(legion->formation_id); - update_legion_info(legion, m); - - int formation_image_id = m->legion_flag_id; - const image *formation_image = image_get(formation_image_id); - - // Legion name - image_draw(formation_image_id, - x_offset + (CONTENT_WIDTH - formation_image->width - formation_image->x_offset) / 2, y_offset + 12, - COLOR_MASK_NONE, SCALE_NONE); - - lang_text_draw_centered(m->legion_name_group, m->legion_name_id, x_offset, y_offset + 40, CONTENT_WIDTH, FONT_NORMAL_WHITE); - - // Number of soldiers - int width = text_draw_number(m->num_figures, '@', " ", x_offset, y_offset + 60, FONT_NORMAL_WHITE, 0); - if (m->figure_type == FIGURE_FORT_INFANTRY) { - text_draw(translation_for(TR_WINDOW_ADVISOR_MILITARY_INFANTRY), x_offset + width, y_offset + 60, FONT_NORMAL_WHITE, 0); - } else if (m->figure_type == FIGURE_FORT_ARCHER) { - text_draw(translation_for(TR_WINDOW_ADVISOR_MILITARY_ARCHER), x_offset + width, y_offset + 60, FONT_NORMAL_WHITE, 0); - } else if (m->figure_type == FIGURE_FORT_LEGIONARY) { - text_draw(translation_for(TR_WINDOW_ADVISOR_LEGIONARIES), x_offset + width, y_offset + 60, FONT_NORMAL_WHITE, 0); - } else if (m->figure_type == FIGURE_FORT_JAVELIN) { - text_draw(translation_for(TR_WINDOW_ADVISOR_JAVELIN), x_offset + width, y_offset + 60, FONT_NORMAL_WHITE, 0); - } else if (m->figure_type == FIGURE_FORT_MOUNTED) { - text_draw(translation_for(TR_WINDOW_ADVISOR_MOUNTED), x_offset + width, y_offset + 60, FONT_NORMAL_WHITE, 0); - } - // No soldiers - if (!m->num_figures) { - int group_id, text_id; - if (m->cursed_by_mars) { - group_id = 89; - text_id = 1; - } else if (building_count_active(BUILDING_BARRACKS)) { - group_id = 138; - text_id = 10; - } else { - group_id = 138; - text_id = 11; - } - lang_text_draw_multiline(group_id, text_id, x_offset, y_offset + 80, CONTENT_WIDTH, FONT_NORMAL_WHITE); - clear_legion_info(legion); - return; - } - - int ellipsized_width = CONTENT_WIDTH + CONTENT_PADDING / 2; - // Morale - lang_text_draw_ellipsized(138, 36, x_offset, y_offset + 80, ellipsized_width, FONT_NORMAL_WHITE); - lang_text_draw_ellipsized(138, 37 + m->morale / 5, x_offset + 4, y_offset + 98, - ellipsized_width, m->morale < 13 ? FONT_NORMAL_RED : FONT_NORMAL_GREEN); - - // Health - lang_text_draw_ellipsized(138, 24, x_offset, y_offset + 120, ellipsized_width, FONT_NORMAL_WHITE); - lang_text_draw_ellipsized(138, get_health_text_id(legion->health), x_offset + 4, y_offset + 138, - ellipsized_width, legion->health < 55 ? FONT_NORMAL_GREEN : FONT_NORMAL_RED); -} - -static void draw_military_info_buttons(int x_offset, int y_offset) -{ - if (!data.active_legion.soldiers) { - return; - } - const formation *m = formation_get(data.active_legion.formation_id); - // Formation layout - draw_layout_buttons(x_offset, y_offset + Y_OFFSET_LAYOUT_BUTTONS, 1, m); - - int formation_options_image = image_group(GROUP_FORT_ICONS); - - // Go to legion button - const generic_button *btn = buttons_bottom; - image_draw(formation_options_image, x_offset + btn->x + 3, y_offset + 260, COLOR_MASK_NONE, SCALE_NONE); - - // Return to fort button - ++btn; - image_draw(formation_options_image + 1 + m->is_at_fort, x_offset + btn->x + 3, y_offset + 260, - COLOR_MASK_NONE, SCALE_NONE); - - // Empire service button - ++btn; - image_draw(formation_options_image + 4 - m->empire_service, x_offset + btn->x + 3, y_offset + 260, - COLOR_MASK_NONE, SCALE_NONE); -} - -static void draw_military_panel_background(int x_offset) -{ - graphics_draw_line(x_offset, x_offset, Y_OFFSET_PANEL_START, - Y_OFFSET_PANEL_START + MILITARY_PANEL_BLOCKS * BLOCK_SIZE, COLOR_WHITE); - graphics_draw_line(x_offset + SIDEBAR_ADVANCED_WIDTH - 1, x_offset + SIDEBAR_ADVANCED_WIDTH - 1, - Y_OFFSET_PANEL_START, Y_OFFSET_PANEL_START + MILITARY_PANEL_BLOCKS * BLOCK_SIZE, COLOR_SIDEBAR); - inner_panel_draw(x_offset + 1, Y_OFFSET_PANEL_START + 10, - SIDEBAR_ADVANCED_WIDTH / BLOCK_SIZE, MILITARY_PANEL_BLOCKS); - inner_panel_draw(x_offset + 1, Y_OFFSET_PANEL_START, SIDEBAR_ADVANCED_WIDTH / BLOCK_SIZE, 1); - - draw_military_info_text(x_offset + CONTENT_PADDING, Y_OFFSET_PANEL_START); - draw_military_info_buttons(x_offset, Y_OFFSET_PANEL_START); -} - -static void draw_legion_buttons(int x_offset, int y_offset) -{ - int num_legions = formation_get_num_legions(); - if (num_legions > 1) { - arrow_buttons_draw(x_offset, y_offset, buttons_cycle_legion, 2); - } - const formation *m = formation_get(data.active_legion.formation_id); - if (m->num_figures) { - draw_layout_buttons(x_offset, y_offset + Y_OFFSET_LAYOUT_BUTTONS, 0, m); - for (unsigned int i = 0; i < 3; i++) { - button_border_draw(x_offset + buttons_bottom[i].x, y_offset + Y_OFFSET_BOTTOM_BUTTONS, - 30, 30, data.bottom_buttons_focus_id == i + 1); - } - } - -} - -static void draw_background(int x_offset) -{ - image_draw(image_group(GROUP_SIDE_PANEL) + 1, x_offset, 24, COLOR_MASK_NONE, SCALE_NONE); - image_buttons_draw(x_offset, 24, buttons_title_close, 2); - lang_text_draw_centered(61, 5, x_offset, 32, 117, FONT_NORMAL_GREEN); - widget_minimap_update(0); - widget_minimap_draw_decorated(x_offset + 8, 59, MINIMAP_WIDTH, MINIMAP_HEIGHT); - draw_military_panel_background(x_offset); - draw_legion_buttons(x_offset, Y_OFFSET_PANEL_START); - int extra_height = new_sidebar_extra_draw_background(x_offset, MILITARY_PANEL_HEIGHT, - SIDEBAR_ADVANCED_WIDTH, new_sidebar_common_get_height() - MILITARY_PANEL_HEIGHT + TOP_MENU_HEIGHT, - 0, NEW_SIDEBAR_EXTRA_DISPLAY_ALL); - new_sidebar_extra_draw_foreground(); - - new_sidebar_common_draw_relief(x_offset, MILITARY_PANEL_HEIGHT + extra_height, GROUP_SIDE_PANEL); -} - -void widget_new_sidebar_military_draw_background(void) -{ - draw_background(new_sidebar_common_get_x_offset_advanced()); -} - -static int has_legion_changed(const legion_info *legion, const formation *m) -{ - return legion->health != calc_percentage(m->total_damage, m->max_total_damage) || - legion->layout != m->layout || - legion->morale != m->morale || - legion->soldiers != m->num_figures || - legion->is_at_fort != m->is_at_fort || - legion->empire_service != m->empire_service; -} - -static void draw_military_panel_foreground(int x_offset) -{ - const formation *m = formation_get(data.active_legion.formation_id); - if (has_legion_changed(&data.active_legion, m)) { - draw_military_panel_background(x_offset); - } - draw_legion_buttons(x_offset, Y_OFFSET_PANEL_START); -} - -static void draw_foreground(int x_offset) -{ - widget_minimap_draw_decorated(x_offset + 8, 59, MINIMAP_WIDTH, MINIMAP_HEIGHT); - image_buttons_draw(x_offset, 24, buttons_title_close, 2); - lang_text_draw_centered(61, 5, x_offset, 32, 117, FONT_NORMAL_GREEN); - draw_military_panel_foreground(x_offset); - new_sidebar_extra_draw_foreground(); -} - -void widget_new_sidebar_military_draw_foreground(void) -{ - draw_foreground(new_sidebar_common_get_x_offset_advanced()); -} - -static void draw_sliding(int x_offset) -{ - draw_background(x_offset); - draw_foreground(x_offset); -} - -int widget_new_sidebar_military_handle_input(const mouse *m) -{ - int x_offset = new_sidebar_common_get_x_offset_advanced(); - if (image_buttons_handle_mouse(m, x_offset, 24, buttons_title_close, 2, &data.top_buttons_focus_id)) { - return 1; - } - int num_legions = formation_get_num_legions(); - if (num_legions > 1 && - arrow_buttons_handle_mouse(m, x_offset, Y_OFFSET_PANEL_START, buttons_cycle_legion, 2, 0)) { - return 1; - } - const formation *selected_legion = formation_get(data.active_legion.formation_id); - if (data.active_legion.soldiers > 0) { - generic_button *layout_buttons = buttons_formation_layout[available_layouts_for_legion(selected_legion) - 3]; - if (generic_buttons_handle_mouse(m, x_offset, Y_OFFSET_PANEL_START + Y_OFFSET_LAYOUT_BUTTONS, - layout_buttons, 5, &data.inner_buttons_focus_id)) { - return 1; - } - if (generic_buttons_handle_mouse(m, x_offset, Y_OFFSET_PANEL_START + Y_OFFSET_BOTTOM_BUTTONS, - buttons_bottom, 3, &data.bottom_buttons_focus_id)) { - return 1; - } - } - return new_sidebar_extra_handle_mouse(m); -} - -static int get_layout_text_id(int layout) -{ - switch (layout) { - case FORMATION_SINGLE_LINE_1: - case FORMATION_SINGLE_LINE_2: - return 16; - case FORMATION_DOUBLE_LINE_1: - case FORMATION_DOUBLE_LINE_2: - return 14; - case FORMATION_TORTOISE: - return 12; - case FORMATION_MOP_UP: - return 15; - case FORMATION_COLUMN: - return 13; - default: - return 16; - } -} - -int widget_new_sidebar_military_get_tooltip_text(tooltip_context *c) -{ - if (data.top_buttons_focus_id) { - if (data.top_buttons_focus_id == 1) { - c->text_group = 68; - return 2; - } - return 0; - } - if (data.inner_buttons_focus_id) { - int index = data.inner_buttons_focus_id - 1; - int layout; - const formation *m = formation_get(data.active_legion.formation_id); - if (m->figure_type == FIGURE_FORT_LEGIONARY || m->figure_type == FIGURE_FORT_INFANTRY) { - int index_increase = m->has_military_training ? 1 : 2; - if (index > 4 - index_increase) { - return 0; - } - index += index_increase; - layout = LAYOUT_BUTTON_INDEXES_LEGIONARY[0][index]; - } else { - layout = LAYOUT_BUTTON_INDEXES_AUXILIARY[0][index]; - } - c->text_group = 138; - return get_layout_text_id(layout); - } - if (data.bottom_buttons_focus_id) { - c->extra_text_type = TOOLTIP_EXTRA_TEXT_JOINED_BY_SPACE; - c->num_extra_texts = 1; - c->text_group = 51; - c->extra_text_groups[0] = 51; - int text_id = data.bottom_buttons_focus_id * 2; - c->extra_text_ids[0] = text_id; - return text_id - 1; - } - return 0; -} - -static void set_formation_id(int formation_id) -{ - data.active_legion.formation_id = formation_id; - clear_legion_info(&data.active_legion); - widget_minimap_invalidate(); -} - -static void slide_in_finished(void) -{ - if (data.city_view_was_collapsed) { - city_view_toggle_sidebar(); - } - widget_minimap_invalidate(); - window_city_return(); -} - -static void slide_out_finished(void) -{ - data.active_legion.formation_id = 0; - widget_minimap_invalidate(); - window_city_show(); -} - -int widget_new_sidebar_military_enter(int formation_id) -{ - clear_focus_buttons(); - int had_selected_legions = data.active_legion.formation_id; - set_formation_id(formation_id); - if (had_selected_legions) { - return 0; - } - data.city_view_was_collapsed = city_view_is_sidebar_collapsed(); - if (data.city_view_was_collapsed) { - city_view_start_sidebar_toggle(); - new_sidebar_slide(SLIDE_DIRECTION_IN, widget_new_sidebar_city_draw_background, draw_sliding, slide_in_finished); - } else { - slide_in_finished(); - } - return 1; -} - -int widget_new_sidebar_military_exit(void) -{ - clear_focus_buttons(); - if (!window_is(WINDOW_CITY_MILITARY)) { - widget_minimap_invalidate(); - return 0; - } - if (data.city_view_was_collapsed) { - city_view_toggle_sidebar(); - new_sidebar_slide(SLIDE_DIRECTION_OUT, widget_new_sidebar_city_draw_background, draw_sliding, slide_out_finished); - } else { - slide_out_finished(); - } - return 1; -} - -static void button_military_menu(int param1, int param2) -{ - window_military_menu_show(); -} - -static void button_close_military_new_sidebar(int param1, int param2) -{ - widget_new_sidebar_military_exit(); -} - -static void button_cycle_legion(int cycle_forward, int param2) -{ - legion_info *legion = &data.active_legion; - int step = cycle_forward ? 1 : -1; - for (int i = legion->formation_id + step; i != legion->formation_id; i += step) { - if (i == 0) { - i = formation_count(); - } else if (i > formation_count()) { - i = 1; - } - const formation *m = formation_get(i); - if (m->in_use && !m->is_herd && m->is_legion) { - legion->formation_id = i; - break; - } - } - formation_set_selected(legion->formation_id); - set_formation_id(legion->formation_id); -} - -static void button_select_formation_layout(const generic_button *button) -{ - int index = button->parameter1; - formation *m = formation_get(data.active_legion.formation_id); - if (m->in_distant_battle) { - return; - } - const int *layout_indexes; - int swap_lines = city_view_orientation() == DIR_6_LEFT || city_view_orientation() == DIR_2_RIGHT; - if (m->figure_type == FIGURE_FORT_LEGIONARY || m->figure_type == FIGURE_FORT_INFANTRY) { - int index_increase = m->has_military_training ? 1 : 2; - if (index > 4 - index_increase) { - return; - } - index += index_increase; - layout_indexes = LAYOUT_BUTTON_INDEXES_LEGIONARY[swap_lines]; - } else { - layout_indexes = LAYOUT_BUTTON_INDEXES_AUXILIARY[swap_lines]; - } - formation_legion_change_layout(m, layout_indexes[index]); - switch (index) { - case 0: sound_speech_play_file("wavs/cohort1.wav"); break; - case 1: sound_speech_play_file("wavs/cohort2.wav"); break; - case 2: sound_speech_play_file("wavs/cohort3.wav"); break; - case 3: sound_speech_play_file("wavs/cohort4.wav"); break; - case 4: sound_speech_play_file("wavs/cohort5.wav"); break; - } -} - -static void button_go_to_legion(const generic_button *button) -{ - const formation *m = formation_get(data.active_legion.formation_id); - city_view_go_to_grid_offset(map_grid_offset(m->x_home, m->y_home)); -} - -static void button_return_to_fort(const generic_button *button) -{ - formation *m = formation_get(data.active_legion.formation_id); - if (!m->in_distant_battle) { - formation_legion_return_home(m); - } -} - -static void button_empire_service(const generic_button *button) -{ - formation_toggle_empire_service(data.active_legion.formation_id); - formation_calculate_figures(); -} diff --git a/src/widget/newsidebar/new_military.h b/src/widget/newsidebar/new_military.h deleted file mode 100644 index d83ae88851..0000000000 --- a/src/widget/newsidebar/new_military.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef WIDGET_NEW_SIDEBAR_MILITARY_H -#define WIDGET_NEW_SIDEBAR_MILITARY_H - -#include "graphics/tooltip.h" -#include "input/mouse.h" - -int widget_new_sidebar_military_enter(int formation_id); -int widget_new_sidebar_military_exit(void); - -int widget_new_sidebar_military_get_standard_image(int legion_id); -int widget_new_sidebar_military_get_legion_name_id(int legion_id); -int widget_new_sidebar_military_get_legion_name_group(int legion_id); - -void widget_new_sidebar_military_draw_background(void); -void widget_new_sidebar_military_draw_foreground(void); - -int widget_new_sidebar_military_handle_input(const mouse *m); - -int widget_new_sidebar_military_get_tooltip_text(tooltip_context *c); - -#endif // WIDGET_NEW_SIDEBAR_MILITARY_H diff --git a/src/widget/newsidebar/new_slide.c b/src/widget/newsidebar/new_slide.c deleted file mode 100644 index 363ea843e6..0000000000 --- a/src/widget/newsidebar/new_slide.c +++ /dev/null @@ -1,84 +0,0 @@ -#include "new_slide.h" - -#include "core/speed.h" -#include "graphics/graphics.h" -#include "graphics/menu.h" -#include "graphics/window.h" -#include "sound/effect.h" -#include "widget/newsidebar/new_common.h" -#include "widget/top_menu.h" -#include "window/city.h" - -#define SLIDE_SPEED 7 -#define SLIDE_ACCELERATION_MILLIS 65 -#define SIDEBAR_DECELERATION_OFFSET 125 - -static struct { - int position; - speed_type slide_speed; - slide_direction direction; - back_new_sidebar_draw_function back_new_sidebar_draw; - front_new_sidebar_draw_function front_new_sidebar_draw; - slide_finished_function finished_callback; -} data; - -static void draw_background(void) -{ - widget_top_menu_draw(1); - window_city_draw(); -} - -static void draw_sliding_foreground(void) -{ - window_request_refresh(); - data.position += speed_get_delta(&data.slide_speed); - int is_finished = 0; - if (data.position >= SIDEBAR_ADVANCED_WIDTH) { - data.position = SIDEBAR_ADVANCED_WIDTH; - is_finished = 1; - } - - int x_offset = new_sidebar_common_get_x_offset_advanced(); - graphics_set_clip_rectangle(x_offset, TOP_MENU_HEIGHT, SIDEBAR_ADVANCED_WIDTH, new_sidebar_common_get_height()); - - if (data.direction == SLIDE_DIRECTION_IN) { - if (data.position > SIDEBAR_DECELERATION_OFFSET) { - speed_set_target(&data.slide_speed, 1, SLIDE_ACCELERATION_MILLIS, 1); - } - x_offset += SIDEBAR_ADVANCED_WIDTH - data.position; - } else { - x_offset += data.position; - } - - data.back_new_sidebar_draw(); - data.front_new_sidebar_draw(x_offset); - - graphics_reset_clip_rectangle(); - - if (is_finished) { - data.finished_callback(); - } -} - -void new_sidebar_slide(slide_direction direction, back_new_sidebar_draw_function back_new_sidebar_callback, - front_new_sidebar_draw_function front_new_sidebar_callback, slide_finished_function finished_callback) -{ - data.direction = direction; - data.position = 0; - speed_clear(&data.slide_speed); - speed_set_target(&data.slide_speed, SLIDE_SPEED, - direction == SLIDE_DIRECTION_OUT ? SLIDE_ACCELERATION_MILLIS : SPEED_CHANGE_IMMEDIATE, 1); - data.back_new_sidebar_draw = back_new_sidebar_callback; - data.front_new_sidebar_draw = front_new_sidebar_callback; - data.finished_callback = finished_callback; - sound_effect_play(SOUND_EFFECT_SIDEBAR); - - window_type window = { - WINDOW_SLIDING_SIDEBAR, - draw_background, - draw_sliding_foreground, - 0, - 0 - }; - window_show(&window); -} diff --git a/src/widget/newsidebar/new_slide.h b/src/widget/newsidebar/new_slide.h deleted file mode 100644 index e709e097b8..0000000000 --- a/src/widget/newsidebar/new_slide.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef WIDGET_NEW_SIDEBAR_SLIDE_H -#define WIDGET_NEW_SIDEBAR_SLIDE_H - -typedef enum { - SLIDE_DIRECTION_IN = 0, - SLIDE_DIRECTION_OUT = 1 -} slide_direction; - -typedef void (*back_new_sidebar_draw_function)(void); -typedef back_new_sidebar_draw_function slide_finished_function; -typedef void (*front_new_sidebar_draw_function)(int x_offset); - -void new_sidebar_slide(slide_direction direction, back_new_sidebar_draw_function back_new_sidebar_callback, - front_new_sidebar_draw_function front_new_sidebar_callback, slide_finished_function finished_callback); - -#endif // WIDGET_NEW_SIDEBAR_SLIDE_H diff --git a/src/widget/newsidebar/new_city.c b/src/widget/sidebar/advanced/sidebar.c similarity index 66% rename from src/widget/newsidebar/new_city.c rename to src/widget/sidebar/advanced/sidebar.c index 04c2126622..dc2fa314aa 100644 --- a/src/widget/newsidebar/new_city.c +++ b/src/widget/sidebar/advanced/sidebar.c @@ -1,4 +1,4 @@ -#include "new_city.h" +#include "sidebar.h" #include "building/menu.h" #include "city/message.h" @@ -18,9 +18,9 @@ #include "translation/translation.h" #include "widget/city.h" #include "widget/minimap.h" -#include "widget/newsidebar/new_common.h" -#include "widget/newsidebar/new_extra.h" -#include "widget/newsidebar/new_slide.h" +#include "widget/sidebar/city.h" +#include "widget/sidebar/common.h" +#include "widget/sidebar/extra.h" #include "window/advisors.h" #include "window/build_menu.h" #include "window/city.h" @@ -29,10 +29,11 @@ #include "window/message_list.h" #include "window/overlay_menu.h" + #define MINIMAP_Y_OFFSET 59 static void button_overlay_click(int param1, int param2); -// static void button_collapse_expand(int param1, int param2); +//static void button_collapse_expand(int param1, int param2); static void button_build(int submenu, int param2); static void button_undo(int param1, int param2); static void button_messages(int param1, int param2); @@ -74,24 +75,6 @@ static image_button buttons_build[] = { {2, 522, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 48, button_undo, button_none, 0, 0, 1}, }; -// static image_button buttons_build_expanded[] = { -// {13, 277, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 0, button_build, button_none, BUILD_MENU_VACANT_HOUSE, 0, 1}, -// {63, 277, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 8, button_build, button_none, BUILD_MENU_CLEAR_LAND, 0, 1}, -// {113, 277, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 12, button_build, button_none, BUILD_MENU_ROAD, 0, 1}, -// {13, 313, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 4, button_build, button_none, BUILD_MENU_WATER, 0, 1}, -// {63, 313, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 40, button_build, button_none, BUILD_MENU_HEALTH, 0, 1, "UI", "Asclepius Button"}, -// {113, 313, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 28, button_build, button_none, BUILD_MENU_TEMPLES, 0, 1}, -// {13, 349, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 24, button_build, button_none, BUILD_MENU_EDUCATION, 0, 1}, -// {63, 349, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 20, button_build, button_none, BUILD_MENU_ENTERTAINMENT, 0, 1}, -// {113, 349, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 16, button_build, button_none, BUILD_MENU_ADMINISTRATION, 0, 1}, -// {13, 385, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 44, button_build, button_none, BUILD_MENU_ENGINEERING, 0, 1}, -// {63, 385, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 36, button_build, button_none, BUILD_MENU_SECURITY, 0, 1}, -// {113, 385, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 32, button_build, button_none, BUILD_MENU_INDUSTRY, 0, 1}, -// {13, 421, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 48, button_undo, button_none, 0, 0, 1}, -// {63, 421, 39, 26, IB_NORMAL, GROUP_MESSAGE_ICON, 18, button_messages, button_help, 0, MESSAGE_DIALOG_MESSAGES, 1}, -// {113, 421, 39, 26, IB_BUILD, GROUP_MESSAGE_ICON, 22, button_go_to_problem, button_none, 0, 0, 1}, -// }; - static image_button buttons_top_expanded[] = { {7, 155, 71, 23, IB_NORMAL, GROUP_SIDEBAR_ADVISORS_EMPIRE, 0, button_advisors, button_none, 0, 0, 1}, {84, 155, 71, 23, IB_NORMAL, GROUP_SIDEBAR_ADVISORS_EMPIRE, 3, button_empire, button_help, 0, MESSAGE_DIALOG_EMPIRE_MAP, 1}, @@ -100,9 +83,8 @@ static image_button buttons_top_expanded[] = { {84, 184, 33, 22, IB_NORMAL, GROUP_SIDEBAR_BRIEFING_ROTATE_BUTTONS, 6, button_rotate, button_none, 0, 0, 1}, {123, 184, 33, 22, IB_NORMAL, GROUP_SIDEBAR_BRIEFING_ROTATE_BUTTONS, 9, button_rotate, button_none, 1, 0, 1}, }; - static struct { - int focus_button_for_tooltip; + unsigned int focus_button_for_tooltip; } data; static void draw_overlay_text(int x_offset) @@ -115,21 +97,22 @@ static void draw_overlay_text(int x_offset) } } -static void draw_new_sidebar_remainder(int x_offset) +static void draw_sidebar_remainder(const int x_offset) { //int width = SIDEBAR_EXPANDED_WIDTH; int width = 162; - // int available_height = new_sidebar_common_get_height() - SIDEBAR_MAIN_SECTION_HEIGHT; - int available_height = new_sidebar_common_get_height() - MINIMAP_HEIGHT - MINIMAP_Y_OFFSET; + // int available_height = sidebar_common_get_height() - SIDEBAR_MAIN_SECTION_HEIGHT; + int available_height = sidebar_common_get_height() - MINIMAP_HEIGHT - MINIMAP_Y_OFFSET; int y_offset = SIDEBAR_FILLER_Y_OFFSET + MINIMAP_Y_OFFSET; - int extra_height = new_sidebar_extra_draw_background(x_offset, y_offset, - width, available_height, 0, NEW_SIDEBAR_EXTRA_DISPLAY_ALL); - new_sidebar_extra_draw_foreground(); + int extra_height = sidebar_extra_draw_background(x_offset, y_offset, + width, available_height, 0, SIDEBAR_EXTRA_DISPLAY_ALL); + sidebar_extra_draw_foreground(); int relief_y_offset = SIDEBAR_FILLER_Y_OFFSET + extra_height; - new_sidebar_common_draw_relief(x_offset - 42, relief_y_offset, GROUP_SIDE_PANEL); + + sidebar_common_draw_relief(x_offset - 42, relief_y_offset, GROUP_SIDE_PANEL, 0); } static void draw_number_of_messages(int x_offset) @@ -153,30 +136,7 @@ static void draw_buttons(int x_offset) buttons_build[14].enabled = game_can_undo(); image_buttons_draw(x_offset + 42, 24, button_overlay, 1); image_buttons_draw(x_offset, 0, buttons_build, 15); - // image_buttons_draw(x_offset, 24, buttons_top_expanded, 6); -} - -static void draw_expanded_background(int x_offset) -{ - image_draw(image_group(GROUP_SIDE_PANEL) + 1, x_offset, TOP_MENU_HEIGHT, COLOR_MASK_NONE, SCALE_NONE); - - draw_buttons(x_offset); - draw_overlay_text(x_offset + 4); - draw_number_of_messages(x_offset); - image_draw(window_build_menu_image(), x_offset + 6, 239, COLOR_MASK_NONE, SCALE_NONE); - - widget_minimap_update(0); - widget_minimap_draw_decorated(x_offset + 8, MINIMAP_Y_OFFSET, MINIMAP_WIDTH, MINIMAP_HEIGHT); - - draw_new_sidebar_remainder(x_offset); -} - -void widget_new_sidebar_city_draw_background(void) -{ - int x_offset = new_sidebar_common_get_x_offset_advanced(); - image_draw(image_group(GROUP_SIDE_PANEL), x_offset, TOP_MENU_HEIGHT, COLOR_MASK_NONE, SCALE_NONE); - // draw_buttons_collapsed(x_offset); - draw_new_sidebar_remainder(x_offset + 42); + // image_buttons_draw(x_offset, 24, buttons_top_expanded, 6); } static void enable_building_buttons(void) @@ -194,18 +154,26 @@ static void enable_building_buttons(void) } } -int widget_sidebar_width(void) + +int advanced_sidebar_width(void) { - return SIDEBAR_ADVANCED_WIDTH; + return 204; } -void widget_new_sidebar_city_draw_foreground(void) +void draw_advanced_sidebar_background(int x_offset) +{ + image_draw(image_group(GROUP_SIDE_PANEL), x_offset, TOP_MENU_HEIGHT, COLOR_MASK_NONE, SCALE_NONE); + // draw_buttons_collapsed(x_offset); + draw_sidebar_remainder(x_offset + 42); +} + +void draw_advanced_sidebar_foreground(void) { if (building_menu_has_changed()) { enable_building_buttons(); } - const int x_offset = new_sidebar_common_get_x_offset_advanced(); + const int x_offset = sidebar_common_get_x_offset_advanced(); draw_buttons(x_offset); const int new_x_offset = x_offset + 42; @@ -213,11 +181,11 @@ void widget_new_sidebar_city_draw_foreground(void) draw_overlay_text(new_x_offset + 4); widget_minimap_draw_decorated(new_x_offset + 8, MINIMAP_Y_OFFSET, MINIMAP_WIDTH, MINIMAP_HEIGHT); draw_number_of_messages(new_x_offset); - // } - new_sidebar_extra_draw_foreground(); + // } + sidebar_extra_draw_foreground(); } -int widget_new_sidebar_city_handle_mouse(const mouse *m) +int handle_advanced_sidebar_mouse(const mouse *m) { if (widget_city_has_input()) { return 0; @@ -225,16 +193,16 @@ int widget_new_sidebar_city_handle_mouse(const mouse *m) int handled = 0; unsigned int button_id; data.focus_button_for_tooltip = 0; - // if (city_view_is_sidebar_collapsed()) { - int x_offset = new_sidebar_common_get_x_offset_advanced(); - // handled |= image_buttons_handle_mouse(m, x_offset, 24, button_expand_new_sidebar, 1, &button_id); - // if (button_id) { - // data.focus_button_for_tooltip = 12; - // } - handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_build, 12, &button_id); - if (button_id) { - data.focus_button_for_tooltip = button_id + 19; - } + // if (city_view_is_sidebar_collapsed()) { + int x_offset = sidebar_common_get_x_offset_advanced(); + // handled |= image_buttons_handle_mouse(m, x_offset, 24, button_expand_new_sidebar, 1, &button_id); + // if (button_id) { + // data.focus_button_for_tooltip = 12; + // } + handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_build, 12, &button_id); + if (button_id) { + data.focus_button_for_tooltip = button_id + 19; + } // } else { // if (widget_minimap_handle_mouse(m)) { // return 1; @@ -257,18 +225,18 @@ int widget_new_sidebar_city_handle_mouse(const mouse *m) return handled; } -int widget_new_sidebar_city_handle_mouse_build_menu(const mouse *m) +int handle_advanced_sidebar_mouse_build_menu(const mouse *m) { - // if (city_view_is_sidebar_collapsed()) { - return image_buttons_handle_mouse(m, - new_sidebar_common_get_x_offset_advanced(), 24, buttons_build, 12, 0); + // if (city_view_is_sidebar_collapsed()) { + return image_buttons_handle_mouse(m, + sidebar_common_get_x_offset_advanced(), 24, buttons_build, 12, 0); // } else { // return image_buttons_handle_mouse(m, // new_sidebar_common_get_x_offset_expanded(), 24, buttons_build, 15, 0); // } } -int widget_new_sidebar_city_get_tooltip_text(tooltip_context *c) +unsigned int get_advanced_sidebar_tooltip_text(tooltip_context *c) { if (data.focus_button_for_tooltip) { if (data.focus_button_for_tooltip == 42) { @@ -277,28 +245,15 @@ int widget_new_sidebar_city_get_tooltip_text(tooltip_context *c) } return data.focus_button_for_tooltip; } - return new_sidebar_extra_get_tooltip(c); + return sidebar_extra_get_tooltip(c); } -// static void slide_finished(void) -// { -// city_view_toggle_sidebar(); -// window_city_show(); -// } - -static void button_overlay_click(int param1, int param2) +static void button_collapse_expand(int param1, int param2) { - window_overlay_menu_show(); + sidebar_next(); } -// static void button_collapse_expand(int param1, int param2) -// { -// city_view_start_sidebar_toggle(); -// new_sidebar_slide(!city_view_is_sidebar_collapsed(), -// draw_collapsed_background, draw_expanded_background, slide_finished); -// } - -static void button_build(int submenu, int param2) +static void button_build(const int submenu, int param2) { window_build_menu_show(submenu); } @@ -364,3 +319,8 @@ static void button_rotate(int clockwise, int param2) } window_invalidate(); } + +static void button_overlay_click(int param1, int param2) +{ + window_overlay_menu_show(); +} \ No newline at end of file diff --git a/src/widget/sidebar/advanced/sidebar.h b/src/widget/sidebar/advanced/sidebar.h new file mode 100644 index 0000000000..c16101063b --- /dev/null +++ b/src/widget/sidebar/advanced/sidebar.h @@ -0,0 +1,17 @@ +#ifndef WIDGET_ADVANCED_SIDEBAR +#define WIDGET_ADVANCED_SIDEBAR + +#include "graphics/tooltip.h" +#include "input/mouse.h" + +int advanced_sidebar_width(void); + +void draw_advanced_sidebar_background(int x_offset); +void draw_advanced_sidebar_foreground(void); + +int handle_advanced_sidebar_mouse(const mouse *m); +int handle_advanced_sidebar_mouse_build_menu( const mouse *m); + +unsigned int get_advanced_sidebar_tooltip_text(tooltip_context *c); + +#endif // WIDGET_ADVANCED_SIDEBAR diff --git a/src/widget/sidebar/city.c b/src/widget/sidebar/city.c index a0c45abc69..67107ff31b 100644 --- a/src/widget/sidebar/city.c +++ b/src/widget/sidebar/city.c @@ -1,370 +1,184 @@ #include "city.h" -#include "building/menu.h" -#include "city/message.h" #include "city/view.h" -#include "city/warning.h" -#include "core/config.h" -#include "core/direction.h" -#include "game/campaign.h" -#include "game/orientation.h" -#include "game/state.h" -#include "game/undo.h" -#include "graphics/graphics.h" -#include "graphics/image.h" -#include "graphics/image_button.h" -#include "graphics/lang_text.h" -#include "graphics/screen.h" -#include "graphics/text.h" #include "graphics/window.h" -#include "map/orientation.h" -#include "scenario/property.h" -#include "translation/translation.h" #include "widget/city.h" -#include "widget/minimap.h" -#include "widget/sidebar/common.h" -#include "widget/sidebar/extra.h" #include "widget/sidebar/slide.h" -#include "window/advisors.h" -#include "window/build_menu.h" #include "window/city.h" -#include "window/empire.h" -#include "window/message_dialog.h" -#include "window/message_list.h" -#include "window/mission_briefing.h" -#include "window/overlay_menu.h" - -#define MINIMAP_Y_OFFSET 59 - -static void button_overlay_click(int param1, int param2); -static void button_collapse_expand(int param1, int param2); -static void button_build(int submenu, int param2); -static void button_undo(int param1, int param2); -static void button_messages(int param1, int param2); -static void button_help(int param1, int param2); -static void button_go_to_problem(int param1, int param2); -static void button_advisors(int param1, int param2); -static void button_empire(int param1, int param2); -static void button_toggle_grid(int param1, int param2); -static void button_rotate_north(int param1, int param2); -static void button_rotate(int clockwise, int param2); - -static image_button buttons_overlays_collapse_sidebar[] = { - {127, 5, 31, 20, IB_NORMAL, 90, 0, button_collapse_expand, button_none, 0, 0, 1}, - {4, 3, 117, 31, IB_NORMAL, 93, 0, button_overlay_click, button_help, 0, MESSAGE_DIALOG_OVERLAYS, 1} -}; - -static image_button button_expand_sidebar[] = { - {6, 4, 31, 20, IB_NORMAL, 90, 4, button_collapse_expand, button_none, 0, 0, 1} -}; -static image_button buttons_build_collapsed[] = { - {2, 32, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 0, button_build, button_none, BUILD_MENU_VACANT_HOUSE, 0, 1}, - {2, 67, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 8, button_build, button_none, BUILD_MENU_CLEAR_LAND, 0, 1}, - {2, 102, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 12, button_build, button_none, BUILD_MENU_ROAD, 0, 1}, - {2, 137, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 4, button_build, button_none, BUILD_MENU_WATER, 0, 1}, - {2, 172, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 40, button_build, button_none, BUILD_MENU_HEALTH, 0, 1, "UI", "Asclepius Button"}, - {2, 207, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 28, button_build, button_none, BUILD_MENU_TEMPLES, 0, 1}, - {2, 242, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 24, button_build, button_none, BUILD_MENU_EDUCATION, 0, 1}, - {2, 277, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 20, button_build, button_none, BUILD_MENU_ENTERTAINMENT, 0, 1}, - {2, 312, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 16, button_build, button_none, BUILD_MENU_ADMINISTRATION, 0, 1}, - {2, 347, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 44, button_build, button_none, BUILD_MENU_ENGINEERING, 0, 1}, - {2, 382, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 36, button_build, button_none, BUILD_MENU_SECURITY, 0, 1}, - {2, 417, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 32, button_build, button_none, BUILD_MENU_INDUSTRY, 0, 1}, -}; - -static image_button buttons_build_expanded[] = { - {13, 277, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 0, button_build, button_none, BUILD_MENU_VACANT_HOUSE, 0, 1}, - {63, 277, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 8, button_build, button_none, BUILD_MENU_CLEAR_LAND, 0, 1}, - {113, 277, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 12, button_build, button_none, BUILD_MENU_ROAD, 0, 1}, - {13, 313, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 4, button_build, button_none, BUILD_MENU_WATER, 0, 1}, - {63, 313, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 40, button_build, button_none, BUILD_MENU_HEALTH, 0, 1, "UI", "Asclepius Button"}, - {113, 313, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 28, button_build, button_none, BUILD_MENU_TEMPLES, 0, 1}, - {13, 349, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 24, button_build, button_none, BUILD_MENU_EDUCATION, 0, 1}, - {63, 349, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 20, button_build, button_none, BUILD_MENU_ENTERTAINMENT, 0, 1}, - {113, 349, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 16, button_build, button_none, BUILD_MENU_ADMINISTRATION, 0, 1}, - {13, 385, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 44, button_build, button_none, BUILD_MENU_ENGINEERING, 0, 1}, - {63, 385, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 36, button_build, button_none, BUILD_MENU_SECURITY, 0, 1}, - {113, 385, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 32, button_build, button_none, BUILD_MENU_INDUSTRY, 0, 1}, - {13, 421, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 48, button_undo, button_none, 0, 0, 1}, - {63, 421, 39, 26, IB_NORMAL, GROUP_MESSAGE_ICON, 18, button_messages, button_help, 0, MESSAGE_DIALOG_MESSAGES, 1}, - {113, 421, 39, 26, IB_BUILD, GROUP_MESSAGE_ICON, 22, button_go_to_problem, button_none, 0, 0, 1}, -}; +#include "advanced/sidebar.h" +#include "collapsed/sidebar.h" +#include "expanded/sidebar.h" +#include "graphics/screen.h" -static image_button buttons_top_expanded[] = { - {7, 155, 71, 23, IB_NORMAL, GROUP_SIDEBAR_ADVISORS_EMPIRE, 0, button_advisors, button_none, 0, 0, 1}, - {84, 155, 71, 23, IB_NORMAL, GROUP_SIDEBAR_ADVISORS_EMPIRE, 3, button_empire, button_help, 0, MESSAGE_DIALOG_EMPIRE_MAP, 1}, - {7, 184, 33, 22, IB_NORMAL, 0, 0, button_toggle_grid, button_none, 0, 0, 1, "UI", "Toggle Grid Button" }, - {46, 184, 33, 22, IB_NORMAL, GROUP_SIDEBAR_BRIEFING_ROTATE_BUTTONS, 3, button_rotate_north, button_none, 0, 0, 1}, - {84, 184, 33, 22, IB_NORMAL, GROUP_SIDEBAR_BRIEFING_ROTATE_BUTTONS, 6, button_rotate, button_none, 0, 0, 1}, - {123, 184, 33, 22, IB_NORMAL, GROUP_SIDEBAR_BRIEFING_ROTATE_BUTTONS, 9, button_rotate, button_none, 1, 0, 1}, -}; +typedef enum {EXPANDED, COLLAPSED, ADVANCED } States; static struct { - int focus_button_for_tooltip; + States currentState; + States previousState; } data; -static void draw_overlay_text(int x_offset) -{ - if (game_state_overlay()) { - const uint8_t *text = get_current_overlay_text(); - text_draw_centered(text, x_offset, 32, 117, FONT_NORMAL_GREEN, 0); - } else { - lang_text_draw_centered(6, 4, x_offset, 32, 117, FONT_NORMAL_GREEN); - } -} -static void draw_sidebar_remainder(int x_offset, int is_collapsed) -{ - int width = SIDEBAR_EXPANDED_WIDTH; - if (is_collapsed) { - width = SIDEBAR_COLLAPSED_WIDTH; +static void draw_slide_old(void) +{ + int x_offset = screen_width(); + + switch (data.previousState) { + case EXPANDED: + x_offset -= expanded_sidebar_width(); + draw_advanced_sidebar_background(x_offset); + break; + case COLLAPSED: + x_offset -= collapsed_sidebar_width(); + draw_collapsed_sidebar_background(x_offset); + break; + case ADVANCED: + x_offset -= advanced_sidebar_width(); + draw_advanced_sidebar_background(x_offset); + break; + default:; } - int available_height = sidebar_common_get_height() - SIDEBAR_MAIN_SECTION_HEIGHT; - int extra_height = sidebar_extra_draw_background(x_offset, SIDEBAR_FILLER_Y_OFFSET, - width, available_height, is_collapsed, SIDEBAR_EXTRA_DISPLAY_ALL); - sidebar_extra_draw_foreground(); - int relief_y_offset = SIDEBAR_FILLER_Y_OFFSET + extra_height; - sidebar_common_draw_relief(x_offset, relief_y_offset, GROUP_SIDE_PANEL, is_collapsed); } -static void draw_number_of_messages(int x_offset) +static void draw_slide_new(int x_offset) { - int messages = city_message_count(); - int show_messages = game_campaign_is_original() || messages > 0 || scenario_intro_message(); - buttons_build_expanded[13].enabled = show_messages; - buttons_build_expanded[14].enabled = city_message_problem_area_count(); - if (show_messages) { - int width = text_get_number_width(messages, '@', "", FONT_SMALL_PLAIN); - text_draw_number(messages, '@', "", (x_offset + 100) - width, 452, FONT_SMALL_PLAIN, COLOR_BLACK); //top - text_draw_number(messages, '@', "", (x_offset + 100) - width, 454, FONT_SMALL_PLAIN, COLOR_BLACK); //bottom - text_draw_number(messages, '@', "", (x_offset + 99) - width, 453, FONT_SMALL_PLAIN, COLOR_BLACK); //left - text_draw_number(messages, '@', "", (x_offset + 101) - width, 453, FONT_SMALL_PLAIN, COLOR_BLACK); //right - text_draw_number(messages, '@', "", (x_offset + 100) - width, 453, FONT_SMALL_PLAIN, COLOR_WHITE); + switch (data.currentState) { + case EXPANDED: + draw_expanded_sidebar_background(x_offset); + break; + case COLLAPSED: + draw_collapsed_sidebar_background(x_offset); + break; + case ADVANCED: + draw_advanced_sidebar_background(x_offset); + break; + default: ; } } -static void draw_buttons_collapsed(int x_offset) +static void slide_finished(void) { - image_buttons_draw(x_offset, 24, button_expand_sidebar, 1); - image_buttons_draw(x_offset, 24, buttons_build_collapsed, 12); + city_view_toggle_sidebar(); + window_city_show(); } -static void draw_buttons_expanded(int x_offset) +void sidebar_next(void) { - buttons_build_expanded[12].enabled = game_can_undo(); - image_buttons_draw(x_offset, 24, buttons_overlays_collapse_sidebar, 2); - image_buttons_draw(x_offset, 24, buttons_build_expanded, 15); - image_buttons_draw(x_offset, 24, buttons_top_expanded, 6); -} + city_view_start_sidebar_toggle(); -static void draw_collapsed_background(void) -{ - int x_offset = sidebar_common_get_x_offset_collapsed(); - image_draw(image_group(GROUP_SIDE_PANEL), x_offset, 24, COLOR_MASK_NONE, SCALE_NONE); - draw_buttons_collapsed(x_offset); - draw_sidebar_remainder(x_offset, 1); -} + data.previousState = data.currentState; -static void draw_expanded_background(int x_offset) -{ - image_draw(image_group(GROUP_SIDE_PANEL) + 1, x_offset, 24, COLOR_MASK_NONE, SCALE_NONE); - draw_buttons_expanded(x_offset); - draw_overlay_text(x_offset + 4); - draw_number_of_messages(x_offset); - image_draw(window_build_menu_image(), x_offset + 6, 239, COLOR_MASK_NONE, SCALE_NONE); - widget_minimap_update(0); - widget_minimap_draw_decorated(x_offset + 8, MINIMAP_Y_OFFSET, MINIMAP_WIDTH, MINIMAP_HEIGHT); + if (data.currentState == COLLAPSED) { + data.currentState = ADVANCED; + } else if (data.currentState == ADVANCED) { + data.currentState = EXPANDED; + } else if (data.currentState == EXPANDED) { + data.currentState = COLLAPSED; + } - draw_sidebar_remainder(x_offset, 0); -} + city_view_start_sidebar_toggle(); + sidebar_slide(!widget_sidebar_is_collapsed(), + draw_slide_old, + draw_slide_new, + slide_finished); -void widget_sidebar_city_draw_background(void) -{ - if (city_view_is_sidebar_collapsed()) { - draw_collapsed_background(); - } else { - draw_expanded_background(sidebar_common_get_x_offset_expanded()); - } + window_city_show(); } -static void enable_building_buttons(void) +int widget_sidebar_city_get_width(void) { - for (int i = 0; i < 12; i++) { - buttons_build_expanded[i].enabled = 1; - if (building_menu_count_items(buttons_build_expanded[i].parameter1) <= 0) { - buttons_build_expanded[i].enabled = 0; - } - - buttons_build_collapsed[i].enabled = 1; - if (building_menu_count_items(buttons_build_collapsed[i].parameter1) <= 0) { - buttons_build_collapsed[i].enabled = 0; - } + switch (data.currentState) { + case EXPANDED: + return expanded_sidebar_width(); + case COLLAPSED: + return collapsed_sidebar_width(); + case ADVANCED: + return advanced_sidebar_width(); + default: + return 0; } } -void widget_sidebar_city_draw_foreground(void) +int widget_sidebar_is_collapsed(void) { - if (building_menu_has_changed()) { - enable_building_buttons(); - } - if (city_view_is_sidebar_collapsed()) { - int x_offset = sidebar_common_get_x_offset_collapsed(); - draw_buttons_collapsed(x_offset); - } else { - int x_offset = sidebar_common_get_x_offset_expanded(); - draw_buttons_expanded(x_offset); - draw_overlay_text(x_offset + 4); - widget_minimap_draw_decorated(x_offset + 8, MINIMAP_Y_OFFSET, MINIMAP_WIDTH, MINIMAP_HEIGHT); - draw_number_of_messages(x_offset); - } - sidebar_extra_draw_foreground(); + return data.currentState == COLLAPSED ? 1 : 0; } -int widget_sidebar_city_handle_mouse(const mouse *m) +void widget_sidebar_city_draw_background(void) { - if (widget_city_has_input()) { - return 0; + int x_offset = screen_width(); + + switch (data.currentState) { + case EXPANDED: + x_offset -= expanded_sidebar_width(); + draw_advanced_sidebar_background(x_offset); + break; + case COLLAPSED: + x_offset -= collapsed_sidebar_width(); + draw_collapsed_sidebar_background(x_offset); + break; + case ADVANCED: + x_offset -= advanced_sidebar_width(); + draw_advanced_sidebar_background(x_offset); + break; + default:; } - int handled = 0; - unsigned int button_id; - data.focus_button_for_tooltip = 0; - if (city_view_is_sidebar_collapsed()) { - int x_offset = sidebar_common_get_x_offset_collapsed(); - handled |= image_buttons_handle_mouse(m, x_offset, 24, button_expand_sidebar, 1, &button_id); - if (button_id) { - data.focus_button_for_tooltip = 12; - } - handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_build_collapsed, 12, &button_id); - if (button_id) { - data.focus_button_for_tooltip = button_id + 19; - } - } else { - if (widget_minimap_handle_mouse(m)) { - return 1; - } - int x_offset = sidebar_common_get_x_offset_expanded(); - handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_overlays_collapse_sidebar, 2, &button_id); - if (button_id) { - data.focus_button_for_tooltip = button_id + 9; - } - handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_build_expanded, 15, &button_id); - if (button_id) { - data.focus_button_for_tooltip = button_id + 19; - } - handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_top_expanded, 6, &button_id); - if (button_id) { - data.focus_button_for_tooltip = button_id + 39; - } - handled |= sidebar_extra_handle_mouse(m); - } - return handled; } -int widget_sidebar_city_handle_mouse_build_menu(const mouse *m) +void widget_sidebar_city_draw_foreground(void) { - if (city_view_is_sidebar_collapsed()) { - return image_buttons_handle_mouse(m, - sidebar_common_get_x_offset_collapsed(), 24, buttons_build_collapsed, 12, 0); - } else { - return image_buttons_handle_mouse(m, - sidebar_common_get_x_offset_expanded(), 24, buttons_build_expanded, 15, 0); + switch (data.currentState) { + case EXPANDED: + draw_advanced_sidebar_foreground(); + break; + case COLLAPSED: + draw_collapsed_sidebar_foreground(); + break; + case ADVANCED: + draw_advanced_sidebar_foreground(); + break; + default:; } } -int widget_sidebar_city_get_tooltip_text(tooltip_context *c) +int widget_sidebar_city_handle_mouse(const mouse *m) { - if (data.focus_button_for_tooltip) { - if (data.focus_button_for_tooltip == 42) { - c->translation_key = TR_TOGGLE_GRID; + switch (data.currentState) { + case EXPANDED: + return handle_expanded_sidebar_mouse(m); + case COLLAPSED: + return handle_collapsed_sidebar_mouse(m); + case ADVANCED: + return handle_advanced_sidebar_mouse(m); + default: return 0; - } - return data.focus_button_for_tooltip; } - return sidebar_extra_get_tooltip(c); -} - -static void slide_finished(void) -{ - city_view_toggle_sidebar(); - window_city_show(); -} - -static void button_overlay_click(int param1, int param2) -{ - window_overlay_menu_show(); -} - -static void button_collapse_expand(int param1, int param2) -{ - city_view_start_sidebar_toggle(); - sidebar_slide(!city_view_is_sidebar_collapsed(), - draw_collapsed_background, draw_expanded_background, slide_finished); -} - -static void button_build(int submenu, int param2) -{ - window_build_menu_show(submenu); -} - -static void button_undo(int param1, int param2) -{ - window_build_menu_hide(); - game_undo_perform(); - window_invalidate(); -} - -static void button_messages(int param1, int param2) -{ - window_build_menu_hide(); - window_message_list_show(); } -static void button_help(int param1, int param2) -{ - window_build_menu_hide(); - window_message_dialog_show(param2, window_city_draw_all); -} - -static void button_go_to_problem(int param1, int param2) +int widget_sidebar_city_handle_mouse_build_menu(const mouse *m) { - window_build_menu_hide(); - int grid_offset = city_message_next_problem_area_grid_offset(); - if (grid_offset) { - city_view_go_to_grid_offset(grid_offset); - window_city_show(); - } else { - window_invalidate(); + switch (data.currentState) { + case EXPANDED: + return handle_expanded_sidebar_mouse_build_menu(m); + case COLLAPSED: + return handle_collapsed_sidebar_mouse_build_menu(m); + case ADVANCED: + return handle_advanced_sidebar_mouse_build_menu(m); + default: + return 0; } } -static void button_advisors(int param1, int param2) +unsigned int widget_sidebar_city_get_tooltip_text(tooltip_context *c) { - window_advisors_show_checked(); -} - -static void button_empire(int param1, int param2) -{ - window_empire_show_checked(); -} - -static void button_toggle_grid(int param1, int param2) -{ - config_set(CONFIG_UI_SHOW_GRID, config_get(CONFIG_UI_SHOW_GRID) ^ 1); -} - -static void button_rotate_north(int param1, int param2) -{ - game_orientation_rotate_north(); - window_invalidate(); -} - -static void button_rotate(int clockwise, int param2) -{ - if (clockwise) { - game_orientation_rotate_right(); - } else { - game_orientation_rotate_left(); + switch (data.currentState) { + case EXPANDED: + return get_expanded_sidebar_tooltip_text(c); + case COLLAPSED: + return get_collapsed_sidebar_tooltip_text(c); + case ADVANCED: + return get_advanced_sidebar_tooltip_text(c); + default: + return 0; } - window_invalidate(); -} +} \ No newline at end of file diff --git a/src/widget/sidebar/city.h b/src/widget/sidebar/city.h index 133d0e39dc..13d70c2350 100644 --- a/src/widget/sidebar/city.h +++ b/src/widget/sidebar/city.h @@ -4,12 +4,18 @@ #include "graphics/tooltip.h" #include "input/mouse.h" +int widget_sidebar_is_collapsed(void); + +int widget_sidebar_city_get_width(void); + void widget_sidebar_city_draw_background(void); void widget_sidebar_city_draw_foreground(void); int widget_sidebar_city_handle_mouse(const mouse *m); int widget_sidebar_city_handle_mouse_build_menu(const mouse *m); -int widget_sidebar_city_get_tooltip_text(tooltip_context *c); +unsigned int widget_sidebar_city_get_tooltip_text(tooltip_context *c); + +void sidebar_next(void); #endif // WIDGET_SIDEBAR_CITY_H diff --git a/src/widget/sidebar/common.c b/src/widget/sidebar/common.c index 2fa096da82..e0e7d0e9a6 100644 --- a/src/widget/sidebar/common.c +++ b/src/widget/sidebar/common.c @@ -15,6 +15,11 @@ int sidebar_common_get_x_offset_collapsed(void) return screen_width() - SIDEBAR_COLLAPSED_WIDTH; } +int sidebar_common_get_x_offset_advanced(void) +{ + return screen_width() - SIDEBAR_ADVANCED_WIDTH; +} + int sidebar_common_get_height(void) { return screen_height() - TOP_MENU_HEIGHT; diff --git a/src/widget/sidebar/common.h b/src/widget/sidebar/common.h index 488aa67bec..6d2de1d63f 100644 --- a/src/widget/sidebar/common.h +++ b/src/widget/sidebar/common.h @@ -4,12 +4,16 @@ #include "graphics/menu.h" #define SIDEBAR_COLLAPSED_WIDTH 42 +#define SIDEBAR_ADVANCED_WIDTH 204 // 162 + 42 (old values combined) #define SIDEBAR_EXPANDED_WIDTH 162 #define SIDEBAR_MAIN_SECTION_HEIGHT 450 #define SIDEBAR_FILLER_Y_OFFSET (SIDEBAR_MAIN_SECTION_HEIGHT + TOP_MENU_HEIGHT) #define MINIMAP_WIDTH 146 #define MINIMAP_HEIGHT 111 + +int sidebar_common_get_x_offset_advanced(void); + int sidebar_common_get_x_offset_expanded(void); int sidebar_common_get_x_offset_collapsed(void); diff --git a/src/widget/sidebar/military.c b/src/widget/sidebar/military.c index aabf7fae87..9f391c3580 100644 --- a/src/widget/sidebar/military.c +++ b/src/widget/sidebar/military.c @@ -575,8 +575,8 @@ int widget_sidebar_military_enter(int formation_id) if (had_selected_legions) { return 0; } - data.city_view_was_collapsed = city_view_is_sidebar_collapsed(); - if (data.city_view_was_collapsed) { + + if (widget_sidebar_is_collapsed()) { city_view_start_sidebar_toggle(); sidebar_slide(SLIDE_DIRECTION_IN, widget_sidebar_city_draw_background, draw_sliding, slide_in_finished); } else { diff --git a/src/window/build_menu.c b/src/window/build_menu.c index d2598a3526..be37fab0b2 100644 --- a/src/window/build_menu.c +++ b/src/window/build_menu.c @@ -20,7 +20,6 @@ #include "scenario/property.h" #include "translation/translation.h" #include "widget/city.h" -#include "widget/newsidebar/new_city.h" #include "widget/sidebar/city.h" #include "window/city.h" @@ -270,8 +269,7 @@ static int handle_build_submenu(const mouse *m) static void handle_input(const mouse *m, const hotkeys *h) { if (handle_build_submenu(m) || - //TODO: config - widget_new_sidebar_city_handle_mouse_build_menu(m)) { + widget_sidebar_city_handle_mouse_build_menu(m)) { return; } if (input_go_back_requested(m, h) || click_outside_menu(m, get_sidebar_x_offset())) { diff --git a/src/window/city.c b/src/window/city.c index c0f217503f..b3992c02cb 100644 --- a/src/window/city.c +++ b/src/window/city.c @@ -43,10 +43,6 @@ #include "widget/city_with_overlay.h" #include "widget/top_menu.h" #include "widget/sidebar/city.h" - -#include "widget/newsidebar/new_city.h" -#include "widget/newsidebar/new_extra.h" -#include "widget/newsidebar/new_military.h" #include "widget/sidebar/extra.h" #include "widget/sidebar/military.h" #include "window/advisors.h" @@ -78,18 +74,17 @@ static void draw_background(void) if (window_is(WINDOW_CITY)) { widget_city_setup_routing_preview(); } - //TODO: config - widget_new_sidebar_city_draw_background(); + + widget_sidebar_city_draw_background(); widget_top_menu_draw(1); } static void draw_background_military(void) { - //TODO: config if (config_get(CONFIG_UI_SHOW_MILITARY_SIDEBAR)) { - widget_new_sidebar_military_draw_background(); + widget_sidebar_military_draw_background(); } else { - widget_new_sidebar_city_draw_background(); + widget_sidebar_city_draw_background(); } widget_top_menu_draw(1); } @@ -275,15 +270,15 @@ static void draw_foreground(void) { widget_top_menu_draw(0); window_city_draw(); - //TODO: config - widget_new_sidebar_city_draw_foreground(); + + widget_sidebar_city_draw_foreground(); + draw_speedrun_info(); if (window_is(WINDOW_CITY) || window_is(WINDOW_CITY_MILITARY)) { draw_time_left(); draw_custom_variables_text_display(); widget_city_draw_construction_buttons(); - //TODO: config - if (!mouse_get()->is_touch || new_sidebar_extra_is_information_displayed(NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED)) { + if (!mouse_get()->is_touch || sidebar_extra_is_information_displayed(SIDEBAR_EXTRA_DISPLAY_GAME_SPEED)) { draw_paused_banner(); } } @@ -298,16 +293,14 @@ static void draw_foreground_military(void) widget_top_menu_draw(0); window_city_draw(); if (config_get(CONFIG_UI_SHOW_MILITARY_SIDEBAR)) { - //TODO: config - widget_new_sidebar_military_draw_foreground(); + widget_sidebar_military_draw_foreground(); } else { - //TODO: config - widget_new_sidebar_city_draw_foreground(); + widget_sidebar_city_draw_foreground(); } draw_time_left(); widget_city_draw_construction_buttons(); - //TODO: config - if (!mouse_get()->is_touch || new_sidebar_extra_is_information_displayed(NEW_SIDEBAR_EXTRA_DISPLAY_GAME_SPEED)) { + + if (!mouse_get()->is_touch || sidebar_extra_is_information_displayed(SIDEBAR_EXTRA_DISPLAY_GAME_SPEED)) { draw_paused_banner(); } } @@ -842,8 +835,8 @@ static void handle_input(const mouse *m, const hotkeys *h) if (widget_top_menu_handle_input(m, h)) { return; } - //TODO: config - if (widget_new_sidebar_city_handle_mouse(m)) { + + if (widget_sidebar_city_handle_mouse(m)) { return; } } @@ -856,8 +849,8 @@ static void handle_input_military(const mouse *m, const hotkeys *h) if (widget_top_menu_handle_input(m, h)) { return; } - //TODO: config - if (config_get(CONFIG_UI_SHOW_MILITARY_SIDEBAR) && widget_new_sidebar_military_handle_input(m)) { + + if (config_get(CONFIG_UI_SHOW_MILITARY_SIDEBAR) && widget_sidebar_military_handle_input(m)) { return; } widget_city_handle_input_military(m, h, formation_get_selected()); @@ -868,11 +861,9 @@ static void get_tooltip(tooltip_context *c) int text_id = widget_top_menu_get_tooltip_text(c); if (!text_id) { if (config_get(CONFIG_UI_SHOW_MILITARY_SIDEBAR) && formation_get_selected()) { - //TODO: config - text_id = widget_new_sidebar_military_get_tooltip_text(c); + text_id = widget_sidebar_military_get_tooltip_text(c); } else { - //TODO: config - text_id = widget_new_sidebar_city_get_tooltip_text(c); + text_id = widget_sidebar_city_get_tooltip_text(c); } } if (text_id || c->translation_key) { @@ -926,8 +917,8 @@ void window_city_show(void) show_roamers_for_overlay(game_state_overlay()); if (formation_get_selected()) { formation_set_selected(0); - //TODO: config - if (config_get(CONFIG_UI_SHOW_MILITARY_SIDEBAR) && widget_new_sidebar_military_exit()) { + + if (config_get(CONFIG_UI_SHOW_MILITARY_SIDEBAR) && widget_sidebar_military_exit()) { return; } } @@ -948,8 +939,8 @@ void window_city_military_show(int legion_formation_id) building_construction_clear_type(); } formation_set_selected(legion_formation_id); - //TODO: config - if (config_get(CONFIG_UI_SHOW_MILITARY_SIDEBAR) && widget_new_sidebar_military_enter(legion_formation_id)) { + + if (config_get(CONFIG_UI_SHOW_MILITARY_SIDEBAR) && widget_sidebar_military_enter(legion_formation_id)) { return; } window_type window = { From edb0eaef94ce63a7484c73e3b456617dd4e55569 Mon Sep 17 00:00:00 2001 From: Rick Neeft Date: Sun, 19 Oct 2025 00:26:09 +0200 Subject: [PATCH 07/20] Removed the new_ and newsidebar folder. Move all types of sidebar into three distinct folders. --- src/widget/sidebar/collapsed/sidebar.c | 145 ++++++++++++ src/widget/sidebar/collapsed/sidebar.h | 17 ++ src/widget/sidebar/expanded/sidebar.c | 299 +++++++++++++++++++++++++ src/widget/sidebar/expanded/sidebar.h | 17 ++ 4 files changed, 478 insertions(+) create mode 100644 src/widget/sidebar/collapsed/sidebar.c create mode 100644 src/widget/sidebar/collapsed/sidebar.h create mode 100644 src/widget/sidebar/expanded/sidebar.c create mode 100644 src/widget/sidebar/expanded/sidebar.h diff --git a/src/widget/sidebar/collapsed/sidebar.c b/src/widget/sidebar/collapsed/sidebar.c new file mode 100644 index 0000000000..3009aad0e3 --- /dev/null +++ b/src/widget/sidebar/collapsed/sidebar.c @@ -0,0 +1,145 @@ +#include "sidebar.h" + +#include "building/menu.h" +#include "city/warning.h" +#include "graphics/image.h" +#include "graphics/image_button.h" +#include "graphics/window.h" +#include "translation/translation.h" +#include "widget/city.h" +#include "widget/sidebar/city.h" +#include "widget/sidebar/common.h" +#include "widget/sidebar/extra.h" +#include "window/build_menu.h" + +static void button_collapse_expand(int param1, int param2); +static void button_build(int submenu, int param2); + +static image_button button_expand_sidebar[] = { + {6, 4, 31, 20, IB_NORMAL, 90, 4, button_collapse_expand, button_none, 0, 0, 1} +}; + +static image_button buttons_build_collapsed[] = { + {2, 32, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 0, button_build, button_none, BUILD_MENU_VACANT_HOUSE, 0, 1}, + {2, 67, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 8, button_build, button_none, BUILD_MENU_CLEAR_LAND, 0, 1}, + {2, 102, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 12, button_build, button_none, BUILD_MENU_ROAD, 0, 1}, + {2, 137, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 4, button_build, button_none, BUILD_MENU_WATER, 0, 1}, + {2, 172, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 40, button_build, button_none, BUILD_MENU_HEALTH, 0, 1, "UI", "Asclepius Button"}, + {2, 207, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 28, button_build, button_none, BUILD_MENU_TEMPLES, 0, 1}, + {2, 242, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 24, button_build, button_none, BUILD_MENU_EDUCATION, 0, 1}, + {2, 277, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 20, button_build, button_none, BUILD_MENU_ENTERTAINMENT, 0, 1}, + {2, 312, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 16, button_build, button_none, BUILD_MENU_ADMINISTRATION, 0, 1}, + {2, 347, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 44, button_build, button_none, BUILD_MENU_ENGINEERING, 0, 1}, + {2, 382, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 36, button_build, button_none, BUILD_MENU_SECURITY, 0, 1}, + {2, 417, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 32, button_build, button_none, BUILD_MENU_INDUSTRY, 0, 1}, +}; + +static struct { + unsigned int focus_button_for_tooltip; +} data; + + +static void draw_sidebar_remainder(const int x_offset) +{ + const int width = SIDEBAR_COLLAPSED_WIDTH; // still comming from common + + const int available_height = sidebar_common_get_height() - SIDEBAR_MAIN_SECTION_HEIGHT; + const int extra_height = sidebar_extra_draw_background(x_offset, SIDEBAR_FILLER_Y_OFFSET, + width, available_height, 1, SIDEBAR_EXTRA_DISPLAY_ALL); + sidebar_extra_draw_foreground(); + + const int relief_y_offset = SIDEBAR_FILLER_Y_OFFSET + extra_height; + sidebar_common_draw_relief(x_offset, relief_y_offset, GROUP_SIDE_PANEL, 1); +} + +static void draw_buttons_collapsed(const int x_offset) +{ + image_buttons_draw(x_offset, 24, button_expand_sidebar, 1); + image_buttons_draw(x_offset, 24, buttons_build_collapsed, 12); +} + +static void enable_building_buttons(void) +{ + for (int i = 0; i < 12; i++) { + buttons_build_collapsed[i].enabled = 1; + if (building_menu_count_items(buttons_build_collapsed[i].parameter1) <= 0) { + buttons_build_collapsed[i].enabled = 0; + } + } +} + +int collapsed_sidebar_width(void) +{ + return SIDEBAR_COLLAPSED_WIDTH; +} + + +void draw_collapsed_sidebar_background(int x_offset) +{ + image_draw(image_group(GROUP_SIDE_PANEL), x_offset, 24, COLOR_MASK_NONE, SCALE_NONE); + + draw_buttons_collapsed(x_offset); + draw_sidebar_remainder(x_offset); +} + +void draw_collapsed_sidebar_foreground() +{ + if (building_menu_has_changed()) { + enable_building_buttons(); + } + + const int x_offset = sidebar_common_get_x_offset_collapsed(); + draw_buttons_collapsed(x_offset); + + sidebar_extra_draw_foreground(); +} + +int handle_collapsed_sidebar_mouse(const mouse *m) +{ + if (widget_city_has_input()) { + return 0; + } + int handled = 0; + unsigned int button_id; + data.focus_button_for_tooltip = 0; + + const int x_offset = sidebar_common_get_x_offset_collapsed(); + handled |= image_buttons_handle_mouse(m, x_offset, 24, button_expand_sidebar, 1, &button_id); + if (button_id) { + data.focus_button_for_tooltip = 12; + } + handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_build_collapsed, 12, &button_id); + if (button_id) { + data.focus_button_for_tooltip = button_id + 19; + } + + return handled; +} + +int handle_collapsed_sidebar_mouse_build_menu(const mouse *m) +{ + return image_buttons_handle_mouse(m, + sidebar_common_get_x_offset_collapsed(), 24, buttons_build_collapsed, 12, 0); +} + +unsigned int get_collapsed_sidebar_tooltip_text(tooltip_context *c) +{ + if (data.focus_button_for_tooltip) { + if (data.focus_button_for_tooltip == 42) { + c->translation_key = TR_TOGGLE_GRID; + return 0; + } + return data.focus_button_for_tooltip; + } + return sidebar_extra_get_tooltip(c); +} + +static void button_collapse_expand(int param1, int param2) +{ + sidebar_next(); +} + +static void button_build(const int submenu, int param2) +{ + window_build_menu_show(submenu); +} \ No newline at end of file diff --git a/src/widget/sidebar/collapsed/sidebar.h b/src/widget/sidebar/collapsed/sidebar.h new file mode 100644 index 0000000000..37ee4cbc43 --- /dev/null +++ b/src/widget/sidebar/collapsed/sidebar.h @@ -0,0 +1,17 @@ +#ifndef WIDGET_COLLAPSED_SIDEBAR +#define WIDGET_COLLAPSED_SIDEBAR + +#include "graphics/tooltip.h" +#include "input/mouse.h" + +int collapsed_sidebar_width(void); + +void draw_collapsed_sidebar_background(int x_offset); +void draw_collapsed_sidebar_foreground(void); + +int handle_collapsed_sidebar_mouse(const mouse *m); +int handle_collapsed_sidebar_mouse_build_menu( const mouse *m); + +unsigned int get_collapsed_sidebar_tooltip_text(tooltip_context *c); + +#endif // WIDGET_COLLAPSED_SIDEBAR diff --git a/src/widget/sidebar/expanded/sidebar.c b/src/widget/sidebar/expanded/sidebar.c new file mode 100644 index 0000000000..894aaad267 --- /dev/null +++ b/src/widget/sidebar/expanded/sidebar.c @@ -0,0 +1,299 @@ +#include "sidebar.h" + +#include "building/menu.h" +#include "city/message.h" +#include "city/view.h" +#include "city/warning.h" +#include "core/config.h" +#include "game/campaign.h" +#include "game/orientation.h" +#include "game/state.h" +#include "game/undo.h" +#include "graphics/image.h" +#include "graphics/image_button.h" +#include "graphics/lang_text.h" +#include "graphics/text.h" +#include "graphics/window.h" +#include "scenario/property.h" +#include "translation/translation.h" +#include "widget/city.h" +#include "widget/minimap.h" +#include "widget/sidebar/common.h" +#include "widget/sidebar/extra.h" +#include "window/advisors.h" +#include "window/build_menu.h" +#include "window/city.h" + +#include "widget/sidebar/city.h" +#include "window/empire.h" +#include "window/message_dialog.h" +#include "window/message_list.h" +#include "window/overlay_menu.h" + +#define MINIMAP_Y_OFFSET 59 + +static void button_overlay_click(int param1, int param2); +static void button_collapse(int param1, int param2); +static void button_build(int submenu, int param2); +static void button_undo(int param1, int param2); +static void button_messages(int param1, int param2); +static void button_help(int param1, int param2); +static void button_go_to_problem(int param1, int param2); +static void button_advisors(int param1, int param2); +static void button_empire(int param1, int param2); +static void button_toggle_grid(int param1, int param2); +static void button_rotate_north(int param1, int param2); +static void button_rotate(int clockwise, int param2); + +static image_button buttons_overlays_collapse_sidebar[] = { + {127, 5, 31, 20, IB_NORMAL, 90, 0, button_collapse, button_none, 0, 0, 1}, + {4, 3, 117, 31, IB_NORMAL, 93, 0, button_overlay_click, button_help, 0, MESSAGE_DIALOG_OVERLAYS, 1} +}; + +static image_button buttons_build_expanded[] = { + {13, 277, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 0, button_build, button_none, BUILD_MENU_VACANT_HOUSE, 0, 1}, + {63, 277, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 8, button_build, button_none, BUILD_MENU_CLEAR_LAND, 0, 1}, + {113, 277, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 12, button_build, button_none, BUILD_MENU_ROAD, 0, 1}, + {13, 313, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 4, button_build, button_none, BUILD_MENU_WATER, 0, 1}, + {63, 313, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 40, button_build, button_none, BUILD_MENU_HEALTH, 0, 1, "UI", "Asclepius Button"}, + {113, 313, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 28, button_build, button_none, BUILD_MENU_TEMPLES, 0, 1}, + {13, 349, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 24, button_build, button_none, BUILD_MENU_EDUCATION, 0, 1}, + {63, 349, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 20, button_build, button_none, BUILD_MENU_ENTERTAINMENT, 0, 1}, + {113, 349, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 16, button_build, button_none, BUILD_MENU_ADMINISTRATION, 0, 1}, + {13, 385, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 44, button_build, button_none, BUILD_MENU_ENGINEERING, 0, 1}, + {63, 385, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 36, button_build, button_none, BUILD_MENU_SECURITY, 0, 1}, + {113, 385, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 32, button_build, button_none, BUILD_MENU_INDUSTRY, 0, 1}, + {13, 421, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 48, button_undo, button_none, 0, 0, 1}, + {63, 421, 39, 26, IB_NORMAL, GROUP_MESSAGE_ICON, 18, button_messages, button_help, 0, MESSAGE_DIALOG_MESSAGES, 1}, + {113, 421, 39, 26, IB_BUILD, GROUP_MESSAGE_ICON, 22, button_go_to_problem, button_none, 0, 0, 1}, +}; + +static image_button buttons_top_expanded[] = { + {7, 155, 71, 23, IB_NORMAL, GROUP_SIDEBAR_ADVISORS_EMPIRE, 0, button_advisors, button_none, 0, 0, 1}, + {84, 155, 71, 23, IB_NORMAL, GROUP_SIDEBAR_ADVISORS_EMPIRE, 3, button_empire, button_help, 0, MESSAGE_DIALOG_EMPIRE_MAP, 1}, + {7, 184, 33, 22, IB_NORMAL, 0, 0, button_toggle_grid, button_none, 0, 0, 1, "UI", "Toggle Grid Button" }, + {46, 184, 33, 22, IB_NORMAL, GROUP_SIDEBAR_BRIEFING_ROTATE_BUTTONS, 3, button_rotate_north, button_none, 0, 0, 1}, + {84, 184, 33, 22, IB_NORMAL, GROUP_SIDEBAR_BRIEFING_ROTATE_BUTTONS, 6, button_rotate, button_none, 0, 0, 1}, + {123, 184, 33, 22, IB_NORMAL, GROUP_SIDEBAR_BRIEFING_ROTATE_BUTTONS, 9, button_rotate, button_none, 1, 0, 1}, +}; + +static struct { + unsigned int focus_button_for_tooltip; +} data; + +static void draw_overlay_text(const int x_offset) +{ + if (game_state_overlay()) { + const uint8_t *text = get_current_overlay_text(); + text_draw_centered(text, x_offset, 32, 117, FONT_NORMAL_GREEN, 0); + } else { + lang_text_draw_centered(6, 4, x_offset, 32, 117, FONT_NORMAL_GREEN); + } +} + +static void draw_sidebar_remainder(const int x_offset) +{ + const int width = SIDEBAR_EXPANDED_WIDTH; + + const int available_height = sidebar_common_get_height() - SIDEBAR_MAIN_SECTION_HEIGHT; + const int extra_height = sidebar_extra_draw_background(x_offset, SIDEBAR_FILLER_Y_OFFSET, + width, available_height, 0, SIDEBAR_EXTRA_DISPLAY_ALL); + + sidebar_extra_draw_foreground(); + + const int relief_y_offset = SIDEBAR_FILLER_Y_OFFSET + extra_height; + sidebar_common_draw_relief(x_offset, relief_y_offset, GROUP_SIDE_PANEL, 0); +} + +static void draw_number_of_messages(const int x_offset) +{ + const int messages = city_message_count(); + const int show_messages = game_campaign_is_original() || messages > 0 || scenario_intro_message(); + buttons_build_expanded[13].enabled = show_messages; + buttons_build_expanded[14].enabled = city_message_problem_area_count(); + if (show_messages) { + const int width = text_get_number_width(messages, '@', "", FONT_SMALL_PLAIN); + text_draw_number(messages, '@', "", (x_offset + 100) - width, 452, FONT_SMALL_PLAIN, COLOR_BLACK); //top + text_draw_number(messages, '@', "", (x_offset + 100) - width, 454, FONT_SMALL_PLAIN, COLOR_BLACK); //bottom + text_draw_number(messages, '@', "", (x_offset + 99) - width, 453, FONT_SMALL_PLAIN, COLOR_BLACK); //left + text_draw_number(messages, '@', "", (x_offset + 101) - width, 453, FONT_SMALL_PLAIN, COLOR_BLACK); //right + text_draw_number(messages, '@', "", (x_offset + 100) - width, 453, FONT_SMALL_PLAIN, COLOR_WHITE); + } +} + +static void draw_buttons_expanded(const int x_offset) +{ + buttons_build_expanded[12].enabled = game_can_undo(); + image_buttons_draw(x_offset, 24, buttons_overlays_collapse_sidebar, 2); + image_buttons_draw(x_offset, 24, buttons_build_expanded, 15); + image_buttons_draw(x_offset, 24, buttons_top_expanded, 6); +} + +static void enable_building_buttons(void) +{ + for (int i = 0; i < 12; i++) { + buttons_build_expanded[i].enabled = 1; + if (building_menu_count_items(buttons_build_expanded[i].parameter1) <= 0) { + buttons_build_expanded[i].enabled = 0; + } + } +} + +int expanded_sidebar_width(void) +{ + return SIDEBAR_EXPANDED_WIDTH; +} + +void draw_expanded_sidebar_background(int x_offset) +{ + image_draw(image_group(GROUP_SIDE_PANEL) + 1, x_offset, 24, COLOR_MASK_NONE, SCALE_NONE); + draw_buttons_expanded(x_offset); + draw_overlay_text(x_offset + 4); + draw_number_of_messages(x_offset); + image_draw(window_build_menu_image(), x_offset + 6, 239, COLOR_MASK_NONE, SCALE_NONE); + widget_minimap_update(0); + widget_minimap_draw_decorated(x_offset + 8, MINIMAP_Y_OFFSET, MINIMAP_WIDTH, MINIMAP_HEIGHT); + + draw_sidebar_remainder(x_offset); +} + +void draw_expanded_sidebar_foreground(void) +{ + if (building_menu_has_changed()) { + enable_building_buttons(); + } + + const int x_offset = sidebar_common_get_x_offset_expanded(); + draw_buttons_expanded(x_offset); + draw_overlay_text(x_offset + 4); + widget_minimap_draw_decorated(x_offset + 8, MINIMAP_Y_OFFSET, MINIMAP_WIDTH, MINIMAP_HEIGHT); + draw_number_of_messages(x_offset); + + sidebar_extra_draw_foreground(); +} + +int handle_expanded_sidebar_mouse(const mouse *m) +{ + if (widget_city_has_input()) { + return 0; + } + int handled = 0; + unsigned int button_id; + data.focus_button_for_tooltip = 0; + + if (widget_minimap_handle_mouse(m)) { + return 1; + } + + const int x_offset = sidebar_common_get_x_offset_expanded(); + handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_overlays_collapse_sidebar, 2, &button_id); + if (button_id) { + data.focus_button_for_tooltip = button_id + 9; + } + handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_build_expanded, 15, &button_id); + if (button_id) { + data.focus_button_for_tooltip = button_id + 19; + } + handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_top_expanded, 6, &button_id); + if (button_id) { + data.focus_button_for_tooltip = button_id + 39; + } + handled |= sidebar_extra_handle_mouse(m); + + return handled; +} + +int handle_expanded_sidebar_mouse_build_menu(const mouse *m) +{ + return image_buttons_handle_mouse(m, + sidebar_common_get_x_offset_expanded(), 24, buttons_build_expanded, 15, 0); +} + +unsigned int get_expanded_sidebar_tooltip_text(tooltip_context *c) +{ + if (data.focus_button_for_tooltip) { + if (data.focus_button_for_tooltip == 42) { + c->translation_key = TR_TOGGLE_GRID; + return 0; + } + return data.focus_button_for_tooltip; + } + return sidebar_extra_get_tooltip(c); +} + +static void button_overlay_click(int param1, int param2) +{ + window_overlay_menu_show(); +} + +static void button_collapse(int param1, int param2) +{ + sidebar_next(); +} + +static void button_build(const int submenu, int param2) +{ + window_build_menu_show(submenu); +} + +static void button_undo(int param1, int param2) +{ + window_build_menu_hide(); + game_undo_perform(); + window_invalidate(); +} + +static void button_messages(int param1, int param2) +{ + window_build_menu_hide(); + window_message_list_show(); +} + +static void button_help(int param1, const int param2) +{ + window_build_menu_hide(); + window_message_dialog_show(param2, window_city_draw_all); +} + +static void button_go_to_problem(int param1, int param2) +{ + window_build_menu_hide(); + const int grid_offset = city_message_next_problem_area_grid_offset(); + if (grid_offset) { + city_view_go_to_grid_offset(grid_offset); + window_city_show(); + } else { + window_invalidate(); + } +} + +static void button_advisors(int param1, int param2) +{ + window_advisors_show_checked(); +} + +static void button_empire(int param1, int param2) +{ + window_empire_show_checked(); +} + +static void button_toggle_grid(int param1, int param2) +{ + config_set(CONFIG_UI_SHOW_GRID, config_get(CONFIG_UI_SHOW_GRID) ^ 1); +} + +static void button_rotate_north(int param1, int param2) +{ + game_orientation_rotate_north(); + window_invalidate(); +} + +static void button_rotate(const int clockwise, int param2) +{ + if (clockwise) { + game_orientation_rotate_right(); + } else { + game_orientation_rotate_left(); + } + window_invalidate(); +} diff --git a/src/widget/sidebar/expanded/sidebar.h b/src/widget/sidebar/expanded/sidebar.h new file mode 100644 index 0000000000..b7d6d16fb8 --- /dev/null +++ b/src/widget/sidebar/expanded/sidebar.h @@ -0,0 +1,17 @@ +#ifndef WIDGET_EXPANDED_SIDEBAR +#define WIDGET_EXPANDED_SIDEBAR + +#include "graphics/tooltip.h" +#include "input/mouse.h" + +int expanded_sidebar_width(void); + +void draw_expanded_sidebar_background(int x_offset); +void draw_expanded_sidebar_foreground(void); + +int handle_expanded_sidebar_mouse(const mouse *m); +int handle_expanded_sidebar_mouse_build_menu( const mouse *m); + +unsigned int get_expanded_sidebar_tooltip_text(tooltip_context *c); + +#endif // WIDGET_EXPANDED_SIDEBAR From 9995eb6a260f6e248377ae0ad7a77ef54d2eea56 Mon Sep 17 00:00:00 2001 From: Rick Neeft Date: Sun, 19 Oct 2025 15:51:40 +0200 Subject: [PATCH 08/20] sidebars now moving correctly --- src/widget/sidebar/advanced/sidebar.c | 39 +++++++++++---------------- src/widget/sidebar/city.c | 6 ++--- 2 files changed, 19 insertions(+), 26 deletions(-) diff --git a/src/widget/sidebar/advanced/sidebar.c b/src/widget/sidebar/advanced/sidebar.c index dc2fa314aa..fb251fa502 100644 --- a/src/widget/sidebar/advanced/sidebar.c +++ b/src/widget/sidebar/advanced/sidebar.c @@ -33,7 +33,7 @@ #define MINIMAP_Y_OFFSET 59 static void button_overlay_click(int param1, int param2); -//static void button_collapse_expand(int param1, int param2); +static void button_collapse_expand(int param1, int param2); static void button_build(int submenu, int param2); static void button_undo(int param1, int param2); static void button_messages(int param1, int param2); @@ -45,18 +45,11 @@ static void button_toggle_grid(int param1, int param2); static void button_rotate_north(int param1, int param2); static void button_rotate(int clockwise, int param2); -// static image_button buttons_overlays_collapse_new_sidebar[] = { -// {127, 5, 31, 20, IB_NORMAL, 90, 0, button_collapse_expand, button_none, 0, 0, 1}, -// }; - -static image_button button_overlay[] ={ +static image_button buttons_overlays_collapse_sidebar[] = { + {127, 5, 31, 20, IB_NORMAL, 90, 0, button_collapse_expand, button_none, 0, 0, 1}, {4, 3, 117, 31, IB_NORMAL, 93, 0, button_overlay_click, button_help, 0, MESSAGE_DIALOG_OVERLAYS, 1} }; -// static image_button button_expand_new_sidebar[] = { -// {6, 4, 31, 20, IB_NORMAL, 90, 4, button_collapse_expand, button_none, 0, 0, 1} -// }; - static image_button buttons_build[] = { {2, 26, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 0, button_build, button_none, BUILD_MENU_VACANT_HOUSE, 0, 1}, {2, 67, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 8, button_build, button_none, BUILD_MENU_CLEAR_LAND, 0, 1}, @@ -100,17 +93,17 @@ static void draw_overlay_text(int x_offset) static void draw_sidebar_remainder(const int x_offset) { //int width = SIDEBAR_EXPANDED_WIDTH; - int width = 162; + const int width = 162; // int available_height = sidebar_common_get_height() - SIDEBAR_MAIN_SECTION_HEIGHT; - int available_height = sidebar_common_get_height() - MINIMAP_HEIGHT - MINIMAP_Y_OFFSET; + const int available_height = sidebar_common_get_height() - MINIMAP_HEIGHT - MINIMAP_Y_OFFSET; - int y_offset = SIDEBAR_FILLER_Y_OFFSET + MINIMAP_Y_OFFSET; + const int y_offset = SIDEBAR_FILLER_Y_OFFSET + MINIMAP_Y_OFFSET; - int extra_height = sidebar_extra_draw_background(x_offset, y_offset, + const int extra_height = sidebar_extra_draw_background(x_offset, y_offset, width, available_height, 0, SIDEBAR_EXTRA_DISPLAY_ALL); sidebar_extra_draw_foreground(); - int relief_y_offset = SIDEBAR_FILLER_Y_OFFSET + extra_height; + const int relief_y_offset = SIDEBAR_FILLER_Y_OFFSET + extra_height; sidebar_common_draw_relief(x_offset - 42, relief_y_offset, GROUP_SIDE_PANEL, 0); } @@ -134,7 +127,7 @@ static void draw_number_of_messages(int x_offset) static void draw_buttons(int x_offset) { buttons_build[14].enabled = game_can_undo(); - image_buttons_draw(x_offset + 42, 24, button_overlay, 1); + image_buttons_draw(x_offset + 42, 24, buttons_overlays_collapse_sidebar, 2); image_buttons_draw(x_offset, 0, buttons_build, 15); // image_buttons_draw(x_offset, 24, buttons_top_expanded, 6); } @@ -208,10 +201,10 @@ int handle_advanced_sidebar_mouse(const mouse *m) // return 1; // } // int x_offset = new_sidebar_common_get_x_offset_expanded(); - // handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_overlays_collapse_new_sidebar, 2, &button_id); - // if (button_id) { - // data.focus_button_for_tooltip = button_id + 9; - // } + handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_overlays_collapse_sidebar, 2, &button_id); + if (button_id) { + data.focus_button_for_tooltip = button_id + 9; + } // handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_build_expanded, 15, &button_id); // if (button_id) { // data.focus_button_for_tooltip = button_id + 19; @@ -271,7 +264,7 @@ static void button_messages(int param1, int param2) window_message_list_show(); } -static void button_help(int param1, int param2) +static void button_help(int param1, const int param2) { window_build_menu_hide(); window_message_dialog_show(param2, window_city_draw_all); @@ -280,7 +273,7 @@ static void button_help(int param1, int param2) static void button_go_to_problem(int param1, int param2) { window_build_menu_hide(); - int grid_offset = city_message_next_problem_area_grid_offset(); + const int grid_offset = city_message_next_problem_area_grid_offset(); if (grid_offset) { city_view_go_to_grid_offset(grid_offset); window_city_show(); @@ -310,7 +303,7 @@ static void button_rotate_north(int param1, int param2) window_invalidate(); } -static void button_rotate(int clockwise, int param2) +static void button_rotate(const int clockwise, int param2) { if (clockwise) { game_orientation_rotate_right(); diff --git a/src/widget/sidebar/city.c b/src/widget/sidebar/city.c index 67107ff31b..9c1a836968 100644 --- a/src/widget/sidebar/city.c +++ b/src/widget/sidebar/city.c @@ -26,7 +26,7 @@ static void draw_slide_old(void) switch (data.previousState) { case EXPANDED: x_offset -= expanded_sidebar_width(); - draw_advanced_sidebar_background(x_offset); + draw_expanded_sidebar_background(x_offset); break; case COLLAPSED: x_offset -= collapsed_sidebar_width(); @@ -111,7 +111,7 @@ void widget_sidebar_city_draw_background(void) switch (data.currentState) { case EXPANDED: x_offset -= expanded_sidebar_width(); - draw_advanced_sidebar_background(x_offset); + draw_expanded_sidebar_background(x_offset); break; case COLLAPSED: x_offset -= collapsed_sidebar_width(); @@ -129,7 +129,7 @@ void widget_sidebar_city_draw_foreground(void) { switch (data.currentState) { case EXPANDED: - draw_advanced_sidebar_foreground(); + draw_expanded_sidebar_foreground(); break; case COLLAPSED: draw_collapsed_sidebar_foreground(); From 19228365ff4dcd1a01381c1c0de08e1828c18421 Mon Sep 17 00:00:00 2001 From: Rick Neeft Date: Mon, 20 Oct 2025 11:27:01 +0200 Subject: [PATCH 09/20] Random refactorings and trying to get sliding to work, failed btw --- src/city/view.c | 4 +-- src/widget/sidebar/advanced/sidebar.c | 15 ++++++++--- src/widget/sidebar/advanced/sidebar.h | 2 ++ src/widget/sidebar/city.c | 31 ++++++++++++++++++----- src/widget/sidebar/city.h | 2 ++ src/widget/sidebar/collapsed/sidebar.c | 18 ++++++++++--- src/widget/sidebar/collapsed/sidebar.h | 2 ++ src/widget/sidebar/common.c | 15 ----------- src/widget/sidebar/common.h | 11 -------- src/widget/sidebar/editor.c | 16 ++++++------ src/widget/sidebar/expanded/sidebar.c | 15 ++++++++--- src/widget/sidebar/expanded/sidebar.h | 2 ++ src/widget/sidebar/military.c | 35 +++++++++++++++++--------- src/widget/sidebar/slide.c | 26 ++++++++++++------- src/widget/sidebar/slide.h | 3 ++- 15 files changed, 122 insertions(+), 75 deletions(-) diff --git a/src/city/view.c b/src/city/view.c index 19c392d0a9..a59a579e0b 100644 --- a/src/city/view.c +++ b/src/city/view.c @@ -583,8 +583,8 @@ void city_view_rotate_right(void) static void set_viewport(void) { - const int sidebar_width = widget_sidebar_city_get_width(); - const int width = data.screen_width - sidebar_width - 2; + const int sidebar_width = widget_sidebar_city_get_width() - 2; + const int width = data.screen_width - sidebar_width; const int height = data.screen_height - TOP_MENU_HEIGHT; data.viewport.x = 0; diff --git a/src/widget/sidebar/advanced/sidebar.c b/src/widget/sidebar/advanced/sidebar.c index fb251fa502..a721c01e81 100644 --- a/src/widget/sidebar/advanced/sidebar.c +++ b/src/widget/sidebar/advanced/sidebar.c @@ -12,6 +12,7 @@ #include "graphics/image.h" #include "graphics/image_button.h" #include "graphics/lang_text.h" +#include "graphics/screen.h" #include "graphics/text.h" #include "graphics/window.h" #include "scenario/property.h" @@ -31,6 +32,7 @@ #define MINIMAP_Y_OFFSET 59 +#define SIDEBAR_ADVANCED_WIDTH 204 static void button_overlay_click(int param1, int param2); static void button_collapse_expand(int param1, int param2); @@ -150,7 +152,12 @@ static void enable_building_buttons(void) int advanced_sidebar_width(void) { - return 204; + return SIDEBAR_ADVANCED_WIDTH; +} + +int calculate_x_offset_sidebar_advanced(void) +{ + return screen_width() - SIDEBAR_ADVANCED_WIDTH; } void draw_advanced_sidebar_background(int x_offset) @@ -166,7 +173,7 @@ void draw_advanced_sidebar_foreground(void) enable_building_buttons(); } - const int x_offset = sidebar_common_get_x_offset_advanced(); + const int x_offset = calculate_x_offset_sidebar_advanced(); draw_buttons(x_offset); const int new_x_offset = x_offset + 42; @@ -187,7 +194,7 @@ int handle_advanced_sidebar_mouse(const mouse *m) unsigned int button_id; data.focus_button_for_tooltip = 0; // if (city_view_is_sidebar_collapsed()) { - int x_offset = sidebar_common_get_x_offset_advanced(); + const int x_offset = calculate_x_offset_sidebar_advanced(); // handled |= image_buttons_handle_mouse(m, x_offset, 24, button_expand_new_sidebar, 1, &button_id); // if (button_id) { // data.focus_button_for_tooltip = 12; @@ -222,7 +229,7 @@ int handle_advanced_sidebar_mouse_build_menu(const mouse *m) { // if (city_view_is_sidebar_collapsed()) { return image_buttons_handle_mouse(m, - sidebar_common_get_x_offset_advanced(), 24, buttons_build, 12, 0); + calculate_x_offset_sidebar_advanced(), 24, buttons_build, 12, 0); // } else { // return image_buttons_handle_mouse(m, // new_sidebar_common_get_x_offset_expanded(), 24, buttons_build, 15, 0); diff --git a/src/widget/sidebar/advanced/sidebar.h b/src/widget/sidebar/advanced/sidebar.h index c16101063b..559130014d 100644 --- a/src/widget/sidebar/advanced/sidebar.h +++ b/src/widget/sidebar/advanced/sidebar.h @@ -12,6 +12,8 @@ void draw_advanced_sidebar_foreground(void); int handle_advanced_sidebar_mouse(const mouse *m); int handle_advanced_sidebar_mouse_build_menu( const mouse *m); +int calculate_x_offset_sidebar_advanced(void); + unsigned int get_advanced_sidebar_tooltip_text(tooltip_context *c); #endif // WIDGET_ADVANCED_SIDEBAR diff --git a/src/widget/sidebar/city.c b/src/widget/sidebar/city.c index 9c1a836968..6926950dac 100644 --- a/src/widget/sidebar/city.c +++ b/src/widget/sidebar/city.c @@ -40,7 +40,7 @@ static void draw_slide_old(void) } } -static void draw_slide_new(int x_offset) +static void draw_slide_new(const int x_offset) { switch (data.currentState) { case EXPANDED: @@ -64,23 +64,28 @@ static void slide_finished(void) void sidebar_next(void) { - city_view_start_sidebar_toggle(); - data.previousState = data.currentState; + const int previous_sidebar_width = widget_sidebar_city_get_width(); + const int previous_sidebar_x_offset = widget_sidebar_calculate_x_offset(); + slide_direction slide_direction = SLIDE_DIRECTION_OUT; if (data.currentState == COLLAPSED) { + slide_direction = SLIDE_DIRECTION_IN; data.currentState = ADVANCED; } else if (data.currentState == ADVANCED) { data.currentState = EXPANDED; } else if (data.currentState == EXPANDED) { + slide_direction = SLIDE_DIRECTION_IN; data.currentState = COLLAPSED; } city_view_start_sidebar_toggle(); - sidebar_slide(!widget_sidebar_is_collapsed(), + sidebar_slide(slide_direction, draw_slide_old, draw_slide_new, - slide_finished); + slide_finished, + previous_sidebar_width, + previous_sidebar_x_offset); window_city_show(); } @@ -181,4 +186,18 @@ unsigned int widget_sidebar_city_get_tooltip_text(tooltip_context *c) default: return 0; } -} \ No newline at end of file +} + +int widget_sidebar_calculate_x_offset(void) +{ + switch (data.currentState) { + case EXPANDED: + return calculate_x_offset_sidebar_expanded(); + case COLLAPSED: + return calculate_x_offset_sidebar_collapsed(); + case ADVANCED: + return calculate_x_offset_sidebar_advanced(); + default: + return 0; + } +} diff --git a/src/widget/sidebar/city.h b/src/widget/sidebar/city.h index 13d70c2350..7073a1cc31 100644 --- a/src/widget/sidebar/city.h +++ b/src/widget/sidebar/city.h @@ -14,6 +14,8 @@ void widget_sidebar_city_draw_foreground(void); int widget_sidebar_city_handle_mouse(const mouse *m); int widget_sidebar_city_handle_mouse_build_menu(const mouse *m); +int widget_sidebar_calculate_x_offset(void); + unsigned int widget_sidebar_city_get_tooltip_text(tooltip_context *c); void sidebar_next(void); diff --git a/src/widget/sidebar/collapsed/sidebar.c b/src/widget/sidebar/collapsed/sidebar.c index 3009aad0e3..7a4426f297 100644 --- a/src/widget/sidebar/collapsed/sidebar.c +++ b/src/widget/sidebar/collapsed/sidebar.c @@ -4,6 +4,7 @@ #include "city/warning.h" #include "graphics/image.h" #include "graphics/image_button.h" +#include "graphics/screen.h" #include "graphics/window.h" #include "translation/translation.h" #include "widget/city.h" @@ -12,6 +13,8 @@ #include "widget/sidebar/extra.h" #include "window/build_menu.h" +#define SIDEBAR_COLLAPSED_WIDTH 42 + static void button_collapse_expand(int param1, int param2); static void button_build(int submenu, int param2); @@ -73,7 +76,6 @@ int collapsed_sidebar_width(void) return SIDEBAR_COLLAPSED_WIDTH; } - void draw_collapsed_sidebar_background(int x_offset) { image_draw(image_group(GROUP_SIDE_PANEL), x_offset, 24, COLOR_MASK_NONE, SCALE_NONE); @@ -82,18 +84,26 @@ void draw_collapsed_sidebar_background(int x_offset) draw_sidebar_remainder(x_offset); } +int calculate_x_offset_sidebar_collapsed(void) +{ + return screen_width() - SIDEBAR_COLLAPSED_WIDTH; +} + + void draw_collapsed_sidebar_foreground() { if (building_menu_has_changed()) { enable_building_buttons(); } - const int x_offset = sidebar_common_get_x_offset_collapsed(); + const int x_offset = calculate_x_offset_sidebar_collapsed(); + draw_buttons_collapsed(x_offset); sidebar_extra_draw_foreground(); } + int handle_collapsed_sidebar_mouse(const mouse *m) { if (widget_city_has_input()) { @@ -103,7 +113,7 @@ int handle_collapsed_sidebar_mouse(const mouse *m) unsigned int button_id; data.focus_button_for_tooltip = 0; - const int x_offset = sidebar_common_get_x_offset_collapsed(); + const int x_offset = calculate_x_offset_sidebar_collapsed(); handled |= image_buttons_handle_mouse(m, x_offset, 24, button_expand_sidebar, 1, &button_id); if (button_id) { data.focus_button_for_tooltip = 12; @@ -119,7 +129,7 @@ int handle_collapsed_sidebar_mouse(const mouse *m) int handle_collapsed_sidebar_mouse_build_menu(const mouse *m) { return image_buttons_handle_mouse(m, - sidebar_common_get_x_offset_collapsed(), 24, buttons_build_collapsed, 12, 0); + calculate_x_offset_sidebar_collapsed(), 24, buttons_build_collapsed, 12, 0); } unsigned int get_collapsed_sidebar_tooltip_text(tooltip_context *c) diff --git a/src/widget/sidebar/collapsed/sidebar.h b/src/widget/sidebar/collapsed/sidebar.h index 37ee4cbc43..497a2c3936 100644 --- a/src/widget/sidebar/collapsed/sidebar.h +++ b/src/widget/sidebar/collapsed/sidebar.h @@ -12,6 +12,8 @@ void draw_collapsed_sidebar_foreground(void); int handle_collapsed_sidebar_mouse(const mouse *m); int handle_collapsed_sidebar_mouse_build_menu( const mouse *m); +int calculate_x_offset_sidebar_collapsed(void); + unsigned int get_collapsed_sidebar_tooltip_text(tooltip_context *c); #endif // WIDGET_COLLAPSED_SIDEBAR diff --git a/src/widget/sidebar/common.c b/src/widget/sidebar/common.c index e0e7d0e9a6..cbbc5c744c 100644 --- a/src/widget/sidebar/common.c +++ b/src/widget/sidebar/common.c @@ -5,21 +5,6 @@ #include "graphics/screen.h" #include "widget/minimap.h" -int sidebar_common_get_x_offset_expanded(void) -{ - return screen_width() - SIDEBAR_EXPANDED_WIDTH; -} - -int sidebar_common_get_x_offset_collapsed(void) -{ - return screen_width() - SIDEBAR_COLLAPSED_WIDTH; -} - -int sidebar_common_get_x_offset_advanced(void) -{ - return screen_width() - SIDEBAR_ADVANCED_WIDTH; -} - int sidebar_common_get_height(void) { return screen_height() - TOP_MENU_HEIGHT; diff --git a/src/widget/sidebar/common.h b/src/widget/sidebar/common.h index 6d2de1d63f..b95bf16e37 100644 --- a/src/widget/sidebar/common.h +++ b/src/widget/sidebar/common.h @@ -3,23 +3,12 @@ #include "graphics/menu.h" -#define SIDEBAR_COLLAPSED_WIDTH 42 -#define SIDEBAR_ADVANCED_WIDTH 204 // 162 + 42 (old values combined) -#define SIDEBAR_EXPANDED_WIDTH 162 #define SIDEBAR_MAIN_SECTION_HEIGHT 450 #define SIDEBAR_FILLER_Y_OFFSET (SIDEBAR_MAIN_SECTION_HEIGHT + TOP_MENU_HEIGHT) #define MINIMAP_WIDTH 146 #define MINIMAP_HEIGHT 111 - -int sidebar_common_get_x_offset_advanced(void); - -int sidebar_common_get_x_offset_expanded(void); - -int sidebar_common_get_x_offset_collapsed(void); - int sidebar_common_get_height(void); - void sidebar_common_draw_relief(int x_offset, int y_offset, int image_id, int is_collapsed); #endif // WIDGET_SIDEBAR_COMMON_H diff --git a/src/widget/sidebar/editor.c b/src/widget/sidebar/editor.c index adba67cd78..aeccd0fdbf 100644 --- a/src/widget/sidebar/editor.c +++ b/src/widget/sidebar/editor.c @@ -11,6 +11,8 @@ #include "graphics/text.h" #include "graphics/window.h" #include "scenario/editor.h" + +#include "expanded/sidebar.h" #include "scenario/editor_events.h" #include "scenario/editor_map.h" #include "scenario/invasion.h" @@ -51,12 +53,12 @@ static image_button buttons_build[] = { static void draw_buttons(void) { - image_buttons_draw(sidebar_common_get_x_offset_expanded(), TOP_MENU_HEIGHT, buttons_build, 17); + image_buttons_draw(calculate_x_offset_sidebar_expanded(), TOP_MENU_HEIGHT, buttons_build, 17); } static void draw_status(void) { - int x_offset = sidebar_common_get_x_offset_expanded(); + int x_offset = calculate_x_offset_sidebar_expanded(); inner_panel_draw(x_offset + 1, 175, 10, 7); int text_offset = x_offset + 6; @@ -137,7 +139,7 @@ static void draw_status(void) void widget_sidebar_editor_draw_background(void) { int image_base = image_group(GROUP_EDITOR_SIDE_PANEL); - int x_offset = sidebar_common_get_x_offset_expanded(); + int x_offset = calculate_x_offset_sidebar_expanded(); image_draw(image_base, x_offset, TOP_MENU_HEIGHT, COLOR_MASK_NONE, SCALE_NONE); draw_buttons(); widget_minimap_update(0); @@ -149,7 +151,7 @@ void widget_sidebar_editor_draw_foreground(void) { draw_buttons(); draw_status(); - widget_minimap_draw_decorated(sidebar_common_get_x_offset_expanded() + 8, + widget_minimap_draw_decorated(calculate_x_offset_sidebar_expanded() + 8, MINIMAP_Y_OFFSET, MINIMAP_WIDTH, MINIMAP_HEIGHT); } @@ -158,17 +160,17 @@ int widget_sidebar_editor_handle_mouse(const mouse *m) if (widget_minimap_handle_mouse(m)) { return 1; } - return image_buttons_handle_mouse(m, sidebar_common_get_x_offset_expanded(), 24, buttons_build, 17, 0); + return image_buttons_handle_mouse(m, calculate_x_offset_sidebar_expanded(), 24, buttons_build, 17, 0); } int widget_sidebar_editor_handle_mouse_build_menu(const mouse *m) { - return image_buttons_handle_mouse(m, sidebar_common_get_x_offset_expanded(), 24, buttons_build, 17, 0); + return image_buttons_handle_mouse(m, calculate_x_offset_sidebar_expanded(), 24, buttons_build, 17, 0); } int widget_sidebar_editor_handle_mouse_attributes(const mouse *m) { - return image_buttons_handle_mouse(m, sidebar_common_get_x_offset_expanded(), 24, buttons_build, 2, 0); + return image_buttons_handle_mouse(m, calculate_x_offset_sidebar_expanded(), 24, buttons_build, 2, 0); } static void button_attributes(int show, int param2) diff --git a/src/widget/sidebar/expanded/sidebar.c b/src/widget/sidebar/expanded/sidebar.c index 894aaad267..7ea82f6be1 100644 --- a/src/widget/sidebar/expanded/sidebar.c +++ b/src/widget/sidebar/expanded/sidebar.c @@ -12,6 +12,7 @@ #include "graphics/image.h" #include "graphics/image_button.h" #include "graphics/lang_text.h" +#include "graphics/screen.h" #include "graphics/text.h" #include "graphics/window.h" #include "scenario/property.h" @@ -31,6 +32,7 @@ #include "window/overlay_menu.h" #define MINIMAP_Y_OFFSET 59 +#define SIDEBAR_EXPANDED_WIDTH 162 static void button_overlay_click(int param1, int param2); static void button_collapse(int param1, int param2); @@ -144,7 +146,12 @@ int expanded_sidebar_width(void) return SIDEBAR_EXPANDED_WIDTH; } -void draw_expanded_sidebar_background(int x_offset) +int calculate_x_offset_sidebar_expanded(void) +{ + return screen_width() - SIDEBAR_EXPANDED_WIDTH; +} + +void draw_expanded_sidebar_background(const int x_offset) { image_draw(image_group(GROUP_SIDE_PANEL) + 1, x_offset, 24, COLOR_MASK_NONE, SCALE_NONE); draw_buttons_expanded(x_offset); @@ -163,7 +170,7 @@ void draw_expanded_sidebar_foreground(void) enable_building_buttons(); } - const int x_offset = sidebar_common_get_x_offset_expanded(); + const int x_offset = calculate_x_offset_sidebar_expanded(); draw_buttons_expanded(x_offset); draw_overlay_text(x_offset + 4); widget_minimap_draw_decorated(x_offset + 8, MINIMAP_Y_OFFSET, MINIMAP_WIDTH, MINIMAP_HEIGHT); @@ -185,7 +192,7 @@ int handle_expanded_sidebar_mouse(const mouse *m) return 1; } - const int x_offset = sidebar_common_get_x_offset_expanded(); + const int x_offset = calculate_x_offset_sidebar_expanded(); handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_overlays_collapse_sidebar, 2, &button_id); if (button_id) { data.focus_button_for_tooltip = button_id + 9; @@ -206,7 +213,7 @@ int handle_expanded_sidebar_mouse(const mouse *m) int handle_expanded_sidebar_mouse_build_menu(const mouse *m) { return image_buttons_handle_mouse(m, - sidebar_common_get_x_offset_expanded(), 24, buttons_build_expanded, 15, 0); + calculate_x_offset_sidebar_expanded(), 24, buttons_build_expanded, 15, 0); } unsigned int get_expanded_sidebar_tooltip_text(tooltip_context *c) diff --git a/src/widget/sidebar/expanded/sidebar.h b/src/widget/sidebar/expanded/sidebar.h index b7d6d16fb8..e8b0d7b1e2 100644 --- a/src/widget/sidebar/expanded/sidebar.h +++ b/src/widget/sidebar/expanded/sidebar.h @@ -12,6 +12,8 @@ void draw_expanded_sidebar_foreground(void); int handle_expanded_sidebar_mouse(const mouse *m); int handle_expanded_sidebar_mouse_build_menu( const mouse *m); +int calculate_x_offset_sidebar_expanded(void); + unsigned int get_expanded_sidebar_tooltip_text(tooltip_context *c); #endif // WIDGET_EXPANDED_SIDEBAR diff --git a/src/widget/sidebar/military.c b/src/widget/sidebar/military.c index 9f391c3580..eb47a7e72e 100644 --- a/src/widget/sidebar/military.c +++ b/src/widget/sidebar/military.c @@ -24,6 +24,8 @@ #include "widget/sidebar/extra.h" #include "widget/sidebar/slide.h" #include "window/building/military.h" + +#include "expanded/sidebar.h" #include "window/city.h" #include "window/military_menu.h" @@ -36,7 +38,8 @@ #define Y_OFFSET_BOTTOM_BUTTONS 257 #define MILITARY_PANEL_BLOCKS 18 #define CONTENT_PADDING 10 -#define CONTENT_WIDTH (SIDEBAR_EXPANDED_WIDTH - 2 * CONTENT_PADDING) +#define PANEL_WIDTH 162 +#define CONTENT_WIDTH (PANEL_WIDTH - 2 * CONTENT_PADDING) static const int IMAGE_OFFSETS_TO_FORMATION[7] = { FORMATION_COLUMN, @@ -372,11 +375,11 @@ static void draw_military_panel_background(int x_offset) { graphics_draw_line(x_offset, x_offset, Y_OFFSET_PANEL_START, Y_OFFSET_PANEL_START + MILITARY_PANEL_BLOCKS * BLOCK_SIZE, COLOR_WHITE); - graphics_draw_line(x_offset + SIDEBAR_EXPANDED_WIDTH - 1, x_offset + SIDEBAR_EXPANDED_WIDTH - 1, + graphics_draw_line(x_offset + PANEL_WIDTH - 1, x_offset + PANEL_WIDTH - 1, Y_OFFSET_PANEL_START, Y_OFFSET_PANEL_START + MILITARY_PANEL_BLOCKS * BLOCK_SIZE, COLOR_SIDEBAR); inner_panel_draw(x_offset + 1, Y_OFFSET_PANEL_START + 10, - SIDEBAR_EXPANDED_WIDTH / BLOCK_SIZE, MILITARY_PANEL_BLOCKS); - inner_panel_draw(x_offset + 1, Y_OFFSET_PANEL_START, SIDEBAR_EXPANDED_WIDTH / BLOCK_SIZE, 1); + PANEL_WIDTH / BLOCK_SIZE, MILITARY_PANEL_BLOCKS); + inner_panel_draw(x_offset + 1, Y_OFFSET_PANEL_START, PANEL_WIDTH / BLOCK_SIZE, 1); draw_military_info_text(x_offset + CONTENT_PADDING, Y_OFFSET_PANEL_START); draw_military_info_buttons(x_offset, Y_OFFSET_PANEL_START); @@ -409,7 +412,7 @@ static void draw_background(int x_offset) draw_military_panel_background(x_offset); draw_legion_buttons(x_offset, Y_OFFSET_PANEL_START); int extra_height = sidebar_extra_draw_background(x_offset, MILITARY_PANEL_HEIGHT, - SIDEBAR_EXPANDED_WIDTH, sidebar_common_get_height() - MILITARY_PANEL_HEIGHT + TOP_MENU_HEIGHT, + PANEL_WIDTH, sidebar_common_get_height() - MILITARY_PANEL_HEIGHT + TOP_MENU_HEIGHT, 0, SIDEBAR_EXTRA_DISPLAY_ALL); sidebar_extra_draw_foreground(); @@ -418,7 +421,8 @@ static void draw_background(int x_offset) void widget_sidebar_military_draw_background(void) { - draw_background(sidebar_common_get_x_offset_expanded()); + // todo: this need to change + draw_background(calculate_x_offset_sidebar_expanded()); } static int has_legion_changed(const legion_info *legion, const formation *m) @@ -451,7 +455,8 @@ static void draw_foreground(int x_offset) void widget_sidebar_military_draw_foreground(void) { - draw_foreground(sidebar_common_get_x_offset_expanded()); + // todo: this need to change + draw_foreground(calculate_x_offset_sidebar_expanded()); } static void draw_sliding(int x_offset) @@ -462,7 +467,8 @@ static void draw_sliding(int x_offset) int widget_sidebar_military_handle_input(const mouse *m) { - int x_offset = sidebar_common_get_x_offset_expanded(); + // todo: this need to change + const int x_offset = calculate_x_offset_sidebar_expanded(); if (image_buttons_handle_mouse(m, x_offset, 24, buttons_title_close, 2, &data.top_buttons_focus_id)) { return 1; } @@ -486,7 +492,7 @@ int widget_sidebar_military_handle_input(const mouse *m) return sidebar_extra_handle_mouse(m); } -static int get_layout_text_id(int layout) +static int get_layout_text_id(const int layout) { switch (layout) { case FORMATION_SINGLE_LINE_1: @@ -577,8 +583,10 @@ int widget_sidebar_military_enter(int formation_id) } if (widget_sidebar_is_collapsed()) { - city_view_start_sidebar_toggle(); - sidebar_slide(SLIDE_DIRECTION_IN, widget_sidebar_city_draw_background, draw_sliding, slide_in_finished); + sidebar_next(); + //todo: something need to change here + // 0,0 is WRONG -> Temp value CHANGE todo + sidebar_slide(SLIDE_DIRECTION_IN, widget_sidebar_city_draw_background, draw_sliding, slide_in_finished,0 , 0); } else { slide_in_finished(); } @@ -592,9 +600,12 @@ int widget_sidebar_military_exit(void) widget_minimap_invalidate(); return 0; } + + //todo: something need to change here + // 0,0 is WRONG -> Temp value CHANGE todo if (data.city_view_was_collapsed) { city_view_toggle_sidebar(); - sidebar_slide(SLIDE_DIRECTION_OUT, widget_sidebar_city_draw_background, draw_sliding, slide_out_finished); + sidebar_slide(SLIDE_DIRECTION_OUT, widget_sidebar_city_draw_background, draw_sliding, slide_out_finished,0,0); } else { slide_out_finished(); } diff --git a/src/widget/sidebar/slide.c b/src/widget/sidebar/slide.c index b264ff4291..aa0d5b0f66 100644 --- a/src/widget/sidebar/slide.c +++ b/src/widget/sidebar/slide.c @@ -1,5 +1,6 @@ #include "slide.h" +#include "city.h" #include "core/speed.h" #include "graphics/graphics.h" #include "graphics/menu.h" @@ -15,6 +16,8 @@ static struct { int position; + int previous_sidebar_width; + int previous_sidebar_x_offset; speed_type slide_speed; slide_direction direction; back_sidebar_draw_function back_sidebar_draw; @@ -33,19 +36,20 @@ static void draw_sliding_foreground(void) window_request_refresh(); data.position += speed_get_delta(&data.slide_speed); int is_finished = 0; - if (data.position >= SIDEBAR_EXPANDED_WIDTH) { - data.position = SIDEBAR_EXPANDED_WIDTH; + const int sidebar_width = data.previous_sidebar_width; + if (data.position >= sidebar_width) { + data.position = sidebar_width; is_finished = 1; } - int x_offset = sidebar_common_get_x_offset_expanded(); - graphics_set_clip_rectangle(x_offset, TOP_MENU_HEIGHT, SIDEBAR_EXPANDED_WIDTH, sidebar_common_get_height()); + int x_offset = data.previous_sidebar_x_offset; + graphics_set_clip_rectangle(x_offset, TOP_MENU_HEIGHT, sidebar_width, sidebar_common_get_height()); if (data.direction == SLIDE_DIRECTION_IN) { if (data.position > SIDEBAR_DECELERATION_OFFSET) { speed_set_target(&data.slide_speed, 1, SLIDE_ACCELERATION_MILLIS, 1); } - x_offset += SIDEBAR_EXPANDED_WIDTH - data.position; + x_offset += sidebar_width - data.position; } else { x_offset += data.position; } @@ -60,17 +64,21 @@ static void draw_sliding_foreground(void) } } -void sidebar_slide(slide_direction direction, back_sidebar_draw_function back_sidebar_callback, - front_sidebar_draw_function front_sidebar_callback, slide_finished_function finished_callback) +void sidebar_slide(const slide_direction direction, const back_sidebar_draw_function back_sidebar_callback, + const front_sidebar_draw_function front_sidebar_callback, const slide_finished_function finished_callback, + const int previous_sidebar_width, const int previous_sidebar_x_offset) { data.direction = direction; data.position = 0; speed_clear(&data.slide_speed); - speed_set_target(&data.slide_speed, SLIDE_SPEED, - direction == SLIDE_DIRECTION_OUT ? SLIDE_ACCELERATION_MILLIS : SPEED_CHANGE_IMMEDIATE, 1); + speed_set_target(&data.slide_speed, SLIDE_SPEED,SLIDE_ACCELERATION_MILLIS, 1); + //direction == SLIDE_DIRECTION_OUT ? SLIDE_ACCELERATION_MILLIS : SPEED_CHANGE_IMMEDIATE, 1); + // todo fix?? data.back_sidebar_draw = back_sidebar_callback; data.front_sidebar_draw = front_sidebar_callback; data.finished_callback = finished_callback; + data.previous_sidebar_x_offset = previous_sidebar_x_offset; + data.previous_sidebar_width = previous_sidebar_width; sound_effect_play(SOUND_EFFECT_SIDEBAR); window_type window = { diff --git a/src/widget/sidebar/slide.h b/src/widget/sidebar/slide.h index c234f32e20..34755a6e39 100644 --- a/src/widget/sidebar/slide.h +++ b/src/widget/sidebar/slide.h @@ -11,6 +11,7 @@ typedef back_sidebar_draw_function slide_finished_function; typedef void (*front_sidebar_draw_function)(int x_offset); void sidebar_slide(slide_direction direction, back_sidebar_draw_function back_sidebar_callback, - front_sidebar_draw_function front_sidebar_callback, slide_finished_function finished_callback); + front_sidebar_draw_function front_sidebar_callback, slide_finished_function finished_callback, + int previous_sidebar_width, int previous_sidebar_x_offset); #endif // WIDGET_SIDEBAR_SLIDE_H From 652d03d7fefe56031311d843b4ac17c36d27b57b Mon Sep 17 00:00:00 2001 From: Rick Neeft Date: Mon, 20 Oct 2025 13:53:35 +0200 Subject: [PATCH 10/20] scaled image on the advanced sidebar to the proper width and height. --- src/graphics/image.c | 16 ++++++++++++++++ src/graphics/image.h | 1 + src/widget/sidebar/advanced/sidebar.c | 2 +- src/widget/sidebar/collapsed/sidebar.c | 2 +- src/widget/sidebar/common.c | 16 +++++++++------- src/widget/sidebar/common.h | 2 +- src/widget/sidebar/editor.c | 2 +- src/widget/sidebar/expanded/sidebar.c | 2 +- src/widget/sidebar/military.c | 2 +- 9 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/graphics/image.c b/src/graphics/image.c index b9b543fbd2..cf84b6a16e 100644 --- a/src/graphics/image.c +++ b/src/graphics/image.c @@ -2,6 +2,9 @@ #include "assets/assets.h" #include "core/image.h" + +#include + #include "graphics/renderer.h" #include "graphics/screen.h" @@ -28,6 +31,19 @@ void image_draw_silhouette(int image_id, int x, int y, color_t color, float scal } +void image_draw_scaled_from_corner(const int image_id, const int x, const int y, const color_t color, + const int draw_scale_percent) +{ + const float obj_draw_scale = 100.0f / (float)draw_scale_percent; + + // The draw_image function divides x and y by scale internally. + // Multiply here to cancel (invert) that effect. + const int inverting_scale_x = (int)lroundf((float)x * obj_draw_scale); + const int inverting_scale_y = (int)lroundf((float)y * obj_draw_scale); + + image_draw(image_id, inverting_scale_x, inverting_scale_y, color, obj_draw_scale); +} + void image_draw_scaled_centered(int image_id, int x, int y, color_t color, int draw_scale_percent) { float obj_draw_scale = 100.0f / draw_scale_percent; diff --git a/src/graphics/image.h b/src/graphics/image.h index f85c104e6f..c5b13bcdda 100644 --- a/src/graphics/image.h +++ b/src/graphics/image.h @@ -28,5 +28,6 @@ void image_blend_footprint_color(int x, int y, color_t color, float scale); void image_draw_isometric_top(int image_id, int x, int y, color_t color_mask, float scale); void image_draw_isometric_top_from_draw_tile(int image_id, int x, int y, color_t color_mask, float scale); void image_draw_set_isometric_top_from_draw_tile(int image_id, int x, int y, color_t color_mask, float scale); +void image_draw_scaled_from_corner(int image_id, int x, int y, color_t color, int draw_scale_percent); #endif // GRAPHICS_IMAGE_H diff --git a/src/widget/sidebar/advanced/sidebar.c b/src/widget/sidebar/advanced/sidebar.c index a721c01e81..d567bebf69 100644 --- a/src/widget/sidebar/advanced/sidebar.c +++ b/src/widget/sidebar/advanced/sidebar.c @@ -107,7 +107,7 @@ static void draw_sidebar_remainder(const int x_offset) sidebar_extra_draw_foreground(); const int relief_y_offset = SIDEBAR_FILLER_Y_OFFSET + extra_height; - sidebar_common_draw_relief(x_offset - 42, relief_y_offset, GROUP_SIDE_PANEL, 0); + sidebar_common_draw_relief(x_offset - 42, relief_y_offset, GROUP_SIDE_PANEL, 0, 26); } static void draw_number_of_messages(int x_offset) diff --git a/src/widget/sidebar/collapsed/sidebar.c b/src/widget/sidebar/collapsed/sidebar.c index 7a4426f297..bac36349aa 100644 --- a/src/widget/sidebar/collapsed/sidebar.c +++ b/src/widget/sidebar/collapsed/sidebar.c @@ -52,7 +52,7 @@ static void draw_sidebar_remainder(const int x_offset) sidebar_extra_draw_foreground(); const int relief_y_offset = SIDEBAR_FILLER_Y_OFFSET + extra_height; - sidebar_common_draw_relief(x_offset, relief_y_offset, GROUP_SIDE_PANEL, 1); + sidebar_common_draw_relief(x_offset, relief_y_offset, GROUP_SIDE_PANEL, 1,0); } static void draw_buttons_collapsed(const int x_offset) diff --git a/src/widget/sidebar/common.c b/src/widget/sidebar/common.c index cbbc5c744c..b83ebb3720 100644 --- a/src/widget/sidebar/common.c +++ b/src/widget/sidebar/common.c @@ -10,19 +10,21 @@ int sidebar_common_get_height(void) return screen_height() - TOP_MENU_HEIGHT; } -void sidebar_common_draw_relief(int x_offset, int y_offset, int image_id, int is_collapsed) +void sidebar_common_draw_relief(int x_offset, int y_offset, int image_id, int is_collapsed, int scale_by) { + const int scale = 100 + scale_by; // relief images below panel - int image_base = image_group(image_id); - int image_offset = image_id == GROUP_SIDE_PANEL ? 2 : 1; - int y_max = screen_height(); + const int image_base = image_group(image_id); + const int image_offset = image_id == GROUP_SIDE_PANEL ? 2 : 1; + const int y_max = screen_height(); while (y_offset < y_max) { if (y_max - y_offset <= 120) { - image_draw(image_base + image_offset + is_collapsed, x_offset, y_offset, COLOR_MASK_NONE, SCALE_NONE); + + image_draw_scaled_from_corner(image_base + image_offset + is_collapsed, x_offset, y_offset, COLOR_MASK_NONE, scale); y_offset += 120; } else { - image_draw(image_base + image_offset + image_offset + is_collapsed, x_offset, y_offset, - COLOR_MASK_NONE, SCALE_NONE); + image_draw_scaled_from_corner(image_base + image_offset + image_offset + is_collapsed, x_offset, y_offset, + COLOR_MASK_NONE, scale); y_offset += 285; } } diff --git a/src/widget/sidebar/common.h b/src/widget/sidebar/common.h index b95bf16e37..8dc04ba5cc 100644 --- a/src/widget/sidebar/common.h +++ b/src/widget/sidebar/common.h @@ -9,6 +9,6 @@ #define MINIMAP_HEIGHT 111 int sidebar_common_get_height(void); -void sidebar_common_draw_relief(int x_offset, int y_offset, int image_id, int is_collapsed); +void sidebar_common_draw_relief(int x_offset, int y_offset, int image_id, int is_collapsed, int scale); #endif // WIDGET_SIDEBAR_COMMON_H diff --git a/src/widget/sidebar/editor.c b/src/widget/sidebar/editor.c index aeccd0fdbf..3fb36d583e 100644 --- a/src/widget/sidebar/editor.c +++ b/src/widget/sidebar/editor.c @@ -144,7 +144,7 @@ void widget_sidebar_editor_draw_background(void) draw_buttons(); widget_minimap_update(0); widget_minimap_draw_decorated(x_offset + 8, MINIMAP_Y_OFFSET, MINIMAP_WIDTH, MINIMAP_HEIGHT); - sidebar_common_draw_relief(x_offset, SIDEBAR_FILLER_Y_OFFSET, GROUP_EDITOR_SIDE_PANEL, 0); + sidebar_common_draw_relief(x_offset, SIDEBAR_FILLER_Y_OFFSET, GROUP_EDITOR_SIDE_PANEL, 0, 0); } void widget_sidebar_editor_draw_foreground(void) diff --git a/src/widget/sidebar/expanded/sidebar.c b/src/widget/sidebar/expanded/sidebar.c index 7ea82f6be1..7d3c82315c 100644 --- a/src/widget/sidebar/expanded/sidebar.c +++ b/src/widget/sidebar/expanded/sidebar.c @@ -104,7 +104,7 @@ static void draw_sidebar_remainder(const int x_offset) sidebar_extra_draw_foreground(); const int relief_y_offset = SIDEBAR_FILLER_Y_OFFSET + extra_height; - sidebar_common_draw_relief(x_offset, relief_y_offset, GROUP_SIDE_PANEL, 0); + sidebar_common_draw_relief(x_offset, relief_y_offset, GROUP_SIDE_PANEL, 0, 0); } static void draw_number_of_messages(const int x_offset) diff --git a/src/widget/sidebar/military.c b/src/widget/sidebar/military.c index eb47a7e72e..37f4b37d86 100644 --- a/src/widget/sidebar/military.c +++ b/src/widget/sidebar/military.c @@ -416,7 +416,7 @@ static void draw_background(int x_offset) 0, SIDEBAR_EXTRA_DISPLAY_ALL); sidebar_extra_draw_foreground(); - sidebar_common_draw_relief(x_offset, MILITARY_PANEL_HEIGHT + extra_height, GROUP_SIDE_PANEL, 0); + sidebar_common_draw_relief(x_offset, MILITARY_PANEL_HEIGHT + extra_height, GROUP_SIDE_PANEL, 0, 0); } void widget_sidebar_military_draw_background(void) From bbad43dd7c80a3e9728517cb214c17dce1474672 Mon Sep 17 00:00:00 2001 From: Rick Neeft Date: Mon, 20 Oct 2025 14:54:30 +0200 Subject: [PATCH 11/20] added button to the advanced sidebar. still not happy about how it looks. --- src/widget/sidebar/advanced/sidebar.c | 107 ++++++++++++++++---------- src/widget/sidebar/city.c | 2 +- 2 files changed, 67 insertions(+), 42 deletions(-) diff --git a/src/widget/sidebar/advanced/sidebar.c b/src/widget/sidebar/advanced/sidebar.c index d567bebf69..2138df4aa8 100644 --- a/src/widget/sidebar/advanced/sidebar.c +++ b/src/widget/sidebar/advanced/sidebar.c @@ -47,32 +47,55 @@ static void button_toggle_grid(int param1, int param2); static void button_rotate_north(int param1, int param2); static void button_rotate(int clockwise, int param2); +/* + reminders + ========= + left and right margins are 4 + button margins are 6 + group margins are 15 +*/ + static image_button buttons_overlays_collapse_sidebar[] = { - {127, 5, 31, 20, IB_NORMAL, 90, 0, button_collapse_expand, button_none, 0, 0, 1}, - {4, 3, 117, 31, IB_NORMAL, 93, 0, button_overlay_click, button_help, 0, MESSAGE_DIALOG_OVERLAYS, 1} + {4, 3, 159, 31, IB_NORMAL, 93, 0, button_overlay_click, button_help, 0, MESSAGE_DIALOG_OVERLAYS, 1}, + {165, 5, 31, 20, IB_NORMAL, 90, 0, button_collapse_expand, button_none, 0, 0, 1}, +// ------------------------- +// ---- minimap ---- +// ---- x:36, y:9 ---- +// ---- height: 143 ---- +// ------------------------- + +// ----- width was 71 now 95 + {4, 183, 95, 23, IB_NORMAL, GROUP_SIDEBAR_ADVISORS_EMPIRE, 0, button_advisors, button_none, 0, 0, 1}, + {105, 183, 95, 23, IB_NORMAL, GROUP_SIDEBAR_ADVISORS_EMPIRE, 3, button_empire, button_help, 0, MESSAGE_DIALOG_EMPIRE_MAP, 1}, +// ---- + {4, 212, 33, 22, IB_NORMAL, 0, 0, button_toggle_grid, button_none, 0, 0, 1, "UI", "Toggle Grid Button" }, + {43, 212, 33, 22, IB_NORMAL, GROUP_SIDEBAR_BRIEFING_ROTATE_BUTTONS, 3, button_rotate_north, button_none, 0, 0, 1}, + {81, 212, 33, 22, IB_NORMAL, GROUP_SIDEBAR_BRIEFING_ROTATE_BUTTONS, 6, button_rotate, button_none, 0, 0, 1}, + {120, 212, 33, 22, IB_NORMAL, GROUP_SIDEBAR_BRIEFING_ROTATE_BUTTONS, 9, button_rotate, button_none, 1, 0, 1}, + {159, 212, 39, 22, IB_NORMAL, GROUP_MESSAGE_ICON, 18, button_messages, button_help, 0, MESSAGE_DIALOG_MESSAGES, 1}, + }; + static image_button buttons_build[] = { - {2, 26, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 0, button_build, button_none, BUILD_MENU_VACANT_HOUSE, 0, 1}, - {2, 67, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 8, button_build, button_none, BUILD_MENU_CLEAR_LAND, 0, 1}, - {2, 102, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 12, button_build, button_none, BUILD_MENU_ROAD, 0, 1}, - {2, 137, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 4, button_build, button_none, BUILD_MENU_WATER, 0, 1}, - {2, 172, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 40, button_build, button_none, BUILD_MENU_HEALTH, 0, 1, "UI", "Asclepius Button"}, - {2, 207, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 28, button_build, button_none, BUILD_MENU_TEMPLES, 0, 1}, - {2, 242, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 24, button_build, button_none, BUILD_MENU_EDUCATION, 0, 1}, - {2, 277, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 20, button_build, button_none, BUILD_MENU_ENTERTAINMENT, 0, 1}, - {2, 312, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 16, button_build, button_none, BUILD_MENU_ADMINISTRATION, 0, 1}, - {2, 347, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 44, button_build, button_none, BUILD_MENU_ENGINEERING, 0, 1}, - {2, 382, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 36, button_build, button_none, BUILD_MENU_SECURITY, 0, 1}, - {2, 417, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 32, button_build, button_none, BUILD_MENU_INDUSTRY, 0, 1}, - {2, 452, 39, 26, IB_NORMAL, GROUP_MESSAGE_ICON, 18, button_messages, button_help, 0, MESSAGE_DIALOG_MESSAGES, 1}, - {2, 487, 39, 26, IB_BUILD, GROUP_MESSAGE_ICON, 22, button_go_to_problem, button_none, 0, 0, 1}, - {2, 522, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 48, button_undo, button_none, 0, 0, 1}, + {4, 26, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 0, button_build, button_none, BUILD_MENU_VACANT_HOUSE, 0, 1}, + {4, 67, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 8, button_build, button_none, BUILD_MENU_CLEAR_LAND, 0, 1}, + {4, 102, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 12, button_build, button_none, BUILD_MENU_ROAD, 0, 1}, + {4, 137, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 4, button_build, button_none, BUILD_MENU_WATER, 0, 1}, + {4, 172, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 40, button_build, button_none, BUILD_MENU_HEALTH, 0, 1, "UI", "Asclepius Button"}, + {4, 207, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 28, button_build, button_none, BUILD_MENU_TEMPLES, 0, 1}, + {4, 242, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 24, button_build, button_none, BUILD_MENU_EDUCATION, 0, 1}, + {4, 277, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 20, button_build, button_none, BUILD_MENU_ENTERTAINMENT, 0, 1}, + {4, 312, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 16, button_build, button_none, BUILD_MENU_ADMINISTRATION, 0, 1}, + {4, 347, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 44, button_build, button_none, BUILD_MENU_ENGINEERING, 0, 1}, + {4, 382, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 36, button_build, button_none, BUILD_MENU_SECURITY, 0, 1}, + {4, 417, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 32, button_build, button_none, BUILD_MENU_INDUSTRY, 0, 1}, + {4, 487, 39, 26, IB_BUILD, GROUP_MESSAGE_ICON, 22, button_go_to_problem, button_none, 0, 0, 1}, + {4, 522, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 48, button_undo, button_none, 0, 0, 1}, }; static image_button buttons_top_expanded[] = { - {7, 155, 71, 23, IB_NORMAL, GROUP_SIDEBAR_ADVISORS_EMPIRE, 0, button_advisors, button_none, 0, 0, 1}, - {84, 155, 71, 23, IB_NORMAL, GROUP_SIDEBAR_ADVISORS_EMPIRE, 3, button_empire, button_help, 0, MESSAGE_DIALOG_EMPIRE_MAP, 1}, + {7, 184, 33, 22, IB_NORMAL, 0, 0, button_toggle_grid, button_none, 0, 0, 1, "UI", "Toggle Grid Button" }, {46, 184, 33, 22, IB_NORMAL, GROUP_SIDEBAR_BRIEFING_ROTATE_BUTTONS, 3, button_rotate_north, button_none, 0, 0, 1}, {84, 184, 33, 22, IB_NORMAL, GROUP_SIDEBAR_BRIEFING_ROTATE_BUTTONS, 6, button_rotate, button_none, 0, 0, 1}, @@ -95,15 +118,15 @@ static void draw_overlay_text(int x_offset) static void draw_sidebar_remainder(const int x_offset) { //int width = SIDEBAR_EXPANDED_WIDTH; - const int width = 162; + const int sidebar_without_icons_width = 162; // int available_height = sidebar_common_get_height() - SIDEBAR_MAIN_SECTION_HEIGHT; const int available_height = sidebar_common_get_height() - MINIMAP_HEIGHT - MINIMAP_Y_OFFSET; - const int y_offset = SIDEBAR_FILLER_Y_OFFSET + MINIMAP_Y_OFFSET; + const int y_offset = 201; const int extra_height = sidebar_extra_draw_background(x_offset, y_offset, - width, available_height, 0, SIDEBAR_EXTRA_DISPLAY_ALL); + sidebar_without_icons_width, available_height, 0, SIDEBAR_EXTRA_DISPLAY_ALL); sidebar_extra_draw_foreground(); const int relief_y_offset = SIDEBAR_FILLER_Y_OFFSET + extra_height; @@ -112,25 +135,28 @@ static void draw_sidebar_remainder(const int x_offset) static void draw_number_of_messages(int x_offset) { + const int y = TOP_MENU_HEIGHT + 210 + 8; + x_offset += 159+35; + int messages = city_message_count(); int show_messages = game_campaign_is_original() || messages > 0 || scenario_intro_message(); - buttons_build[12].enabled = show_messages; - buttons_build[13].enabled = city_message_problem_area_count(); + buttons_overlays_collapse_sidebar[8].enabled = show_messages; + buttons_build[12].enabled = city_message_problem_area_count(); if (show_messages) { int width = text_get_number_width(messages, '@', "", FONT_SMALL_PLAIN); - text_draw_number(messages, '@', "", (x_offset + 100) - width, 452, FONT_SMALL_PLAIN, COLOR_BLACK); //top - text_draw_number(messages, '@', "", (x_offset + 100) - width, 454, FONT_SMALL_PLAIN, COLOR_BLACK); //bottom - text_draw_number(messages, '@', "", (x_offset + 99) - width, 453, FONT_SMALL_PLAIN, COLOR_BLACK); //left - text_draw_number(messages, '@', "", (x_offset + 101) - width, 453, FONT_SMALL_PLAIN, COLOR_BLACK); //right - text_draw_number(messages, '@', "", (x_offset + 100) - width, 453, FONT_SMALL_PLAIN, COLOR_WHITE); + text_draw_number(messages, '@', "", x_offset - width, y, FONT_SMALL_PLAIN, COLOR_BLACK); //top + text_draw_number(messages, '@', "", x_offset - width, y, FONT_SMALL_PLAIN, COLOR_BLACK); //bottom + text_draw_number(messages, '@', "", x_offset + 1 - width, y, FONT_SMALL_PLAIN, COLOR_BLACK); //left + text_draw_number(messages, '@', "", x_offset + 2 - width, y, FONT_SMALL_PLAIN, COLOR_BLACK); //right + text_draw_number(messages, '@', "", x_offset - width, y, FONT_SMALL_PLAIN, COLOR_WHITE); } } static void draw_buttons(int x_offset) { - buttons_build[14].enabled = game_can_undo(); - image_buttons_draw(x_offset + 42, 24, buttons_overlays_collapse_sidebar, 2); - image_buttons_draw(x_offset, 0, buttons_build, 15); + buttons_build[13].enabled = game_can_undo(); + image_buttons_draw(x_offset, 24, buttons_overlays_collapse_sidebar, 9); + image_buttons_draw(x_offset, 240, buttons_build, 14); // image_buttons_draw(x_offset, 24, buttons_top_expanded, 6); } @@ -160,11 +186,11 @@ int calculate_x_offset_sidebar_advanced(void) return screen_width() - SIDEBAR_ADVANCED_WIDTH; } -void draw_advanced_sidebar_background(int x_offset) +void draw_advanced_sidebar_background(const int x_offset) { - image_draw(image_group(GROUP_SIDE_PANEL), x_offset, TOP_MENU_HEIGHT, COLOR_MASK_NONE, SCALE_NONE); + // image_draw(image_group(GROUP_SIDE_PANEL), x_offset, TOP_MENU_HEIGHT, COLOR_MASK_NONE, SCALE_NONE); // draw_buttons_collapsed(x_offset); - draw_sidebar_remainder(x_offset + 42); + // draw_sidebar_remainder(x_offset + 42); } void draw_advanced_sidebar_foreground(void) @@ -176,13 +202,12 @@ void draw_advanced_sidebar_foreground(void) const int x_offset = calculate_x_offset_sidebar_advanced(); draw_buttons(x_offset); - const int new_x_offset = x_offset + 42; + draw_overlay_text(x_offset + 4); - draw_overlay_text(new_x_offset + 4); - widget_minimap_draw_decorated(new_x_offset + 8, MINIMAP_Y_OFFSET, MINIMAP_WIDTH, MINIMAP_HEIGHT); - draw_number_of_messages(new_x_offset); - // } - sidebar_extra_draw_foreground(); + widget_minimap_draw_decorated(x_offset + 8, 36 + TOP_MENU_HEIGHT, 187, 143); + draw_number_of_messages(x_offset); + + // sidebar_extra_draw_foreground(); } int handle_advanced_sidebar_mouse(const mouse *m) diff --git a/src/widget/sidebar/city.c b/src/widget/sidebar/city.c index 6926950dac..04e97154bb 100644 --- a/src/widget/sidebar/city.c +++ b/src/widget/sidebar/city.c @@ -11,7 +11,7 @@ #include "expanded/sidebar.h" #include "graphics/screen.h" -typedef enum {EXPANDED, COLLAPSED, ADVANCED } States; +typedef enum {ADVANCED, EXPANDED, COLLAPSED } States; static struct { States currentState; From 021b262950ba74acb3df6fc1b78c6dcbed37544f Mon Sep 17 00:00:00 2001 From: Rick Neeft Date: Thu, 23 Oct 2025 17:40:32 +0200 Subject: [PATCH 12/20] show info when clicked on a building --- CMakeLists.txt | 1 + src/widget/sidebar/advanced/info.c | 14 ++++++ src/widget/sidebar/advanced/info.h | 6 +++ src/widget/sidebar/advanced/sidebar.c | 65 +++++++++++++++++---------- src/widget/sidebar/advanced/sidebar.h | 2 +- 5 files changed, 63 insertions(+), 25 deletions(-) create mode 100644 src/widget/sidebar/advanced/info.c create mode 100644 src/widget/sidebar/advanced/info.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 144c666dcc..6e2625fe9c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -617,6 +617,7 @@ set(WIDGET_FILES ${PROJECT_SOURCE_DIR}/src/widget/sidebar/collapsed/sidebar.c ${PROJECT_SOURCE_DIR}/src/widget/sidebar/expanded/sidebar.c ${PROJECT_SOURCE_DIR}/src/widget/sidebar/advanced/sidebar.c + ${PROJECT_SOURCE_DIR}/src/widget/sidebar/advanced/info.c ${PROJECT_SOURCE_DIR}/src/widget/sidebar/city.c ${PROJECT_SOURCE_DIR}/src/widget/sidebar/common.c ${PROJECT_SOURCE_DIR}/src/widget/sidebar/editor.c diff --git a/src/widget/sidebar/advanced/info.c b/src/widget/sidebar/advanced/info.c new file mode 100644 index 0000000000..4cdc0317ee --- /dev/null +++ b/src/widget/sidebar/advanced/info.c @@ -0,0 +1,14 @@ +#include "info.h" + +#include "graphics/graphics.h" +#include "graphics/panel.h" + + +void draw_infopanel_background(int x_offset, int y_offset, int width, int height) +{ + int panel_blocks = height / BLOCK_SIZE; + graphics_draw_line(x_offset, x_offset, y_offset, y_offset + height, COLOR_WHITE); + graphics_draw_line(x_offset + width - 1, x_offset + width - 1, y_offset, + y_offset + height, COLOR_SIDEBAR); + inner_panel_draw(x_offset + 1, y_offset, width / BLOCK_SIZE, panel_blocks); +} diff --git a/src/widget/sidebar/advanced/info.h b/src/widget/sidebar/advanced/info.h new file mode 100644 index 0000000000..459513f267 --- /dev/null +++ b/src/widget/sidebar/advanced/info.h @@ -0,0 +1,6 @@ +#ifndef WIDGET_SIDEBAR_INFO +#define WIDGET_SIDEBAR_INFO + +void draw_infopanel_background(int x_offset, int y_offset, int width, int height); + +#endif diff --git a/src/widget/sidebar/advanced/sidebar.c b/src/widget/sidebar/advanced/sidebar.c index 2138df4aa8..25ab93efc9 100644 --- a/src/widget/sidebar/advanced/sidebar.c +++ b/src/widget/sidebar/advanced/sidebar.c @@ -1,5 +1,6 @@ #include "sidebar.h" +#include "info.h" #include "building/menu.h" #include "city/message.h" #include "city/view.h" @@ -33,6 +34,8 @@ #define MINIMAP_Y_OFFSET 59 #define SIDEBAR_ADVANCED_WIDTH 204 +#define BUILD_BUTTONS_COUNT 14 +#define TOP_BUTTONS_COUNT 9 static void button_overlay_click(int param1, int param2); static void button_collapse_expand(int param1, int param2); @@ -55,6 +58,7 @@ static void button_rotate(int clockwise, int param2); group margins are 15 */ + static image_button buttons_overlays_collapse_sidebar[] = { {4, 3, 159, 31, IB_NORMAL, 93, 0, button_overlay_click, button_help, 0, MESSAGE_DIALOG_OVERLAYS, 1}, {165, 5, 31, 20, IB_NORMAL, 90, 0, button_collapse_expand, button_none, 0, 0, 1}, @@ -76,22 +80,24 @@ static image_button buttons_overlays_collapse_sidebar[] = { }; +// height for info panel = 494 +// width = 169 static image_button buttons_build[] = { - {4, 26, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 0, button_build, button_none, BUILD_MENU_VACANT_HOUSE, 0, 1}, - {4, 67, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 8, button_build, button_none, BUILD_MENU_CLEAR_LAND, 0, 1}, - {4, 102, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 12, button_build, button_none, BUILD_MENU_ROAD, 0, 1}, - {4, 137, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 4, button_build, button_none, BUILD_MENU_WATER, 0, 1}, - {4, 172, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 40, button_build, button_none, BUILD_MENU_HEALTH, 0, 1, "UI", "Asclepius Button"}, - {4, 207, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 28, button_build, button_none, BUILD_MENU_TEMPLES, 0, 1}, - {4, 242, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 24, button_build, button_none, BUILD_MENU_EDUCATION, 0, 1}, - {4, 277, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 20, button_build, button_none, BUILD_MENU_ENTERTAINMENT, 0, 1}, - {4, 312, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 16, button_build, button_none, BUILD_MENU_ADMINISTRATION, 0, 1}, - {4, 347, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 44, button_build, button_none, BUILD_MENU_ENGINEERING, 0, 1}, - {4, 382, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 36, button_build, button_none, BUILD_MENU_SECURITY, 0, 1}, - {4, 417, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 32, button_build, button_none, BUILD_MENU_INDUSTRY, 0, 1}, - {4, 487, 39, 26, IB_BUILD, GROUP_MESSAGE_ICON, 22, button_go_to_problem, button_none, 0, 0, 1}, - {4, 522, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 48, button_undo, button_none, 0, 0, 1}, + {4, 240, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 0, button_build, button_none, BUILD_MENU_VACANT_HOUSE, 0, 1}, + {4, 275, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 8, button_build, button_none, BUILD_MENU_CLEAR_LAND, 0, 1}, + {4, 310, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 12, button_build, button_none, BUILD_MENU_ROAD, 0, 1}, + {4, 345, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 4, button_build, button_none, BUILD_MENU_WATER, 0, 1}, + {4, 380, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 40, button_build, button_none, BUILD_MENU_HEALTH, 0, 1, "UI", "Asclepius Button"}, + {4, 415, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 28, button_build, button_none, BUILD_MENU_TEMPLES, 0, 1}, + {4, 450, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 24, button_build, button_none, BUILD_MENU_EDUCATION, 0, 1}, + {4, 485, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 20, button_build, button_none, BUILD_MENU_ENTERTAINMENT, 0, 1}, + {4, 520, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 16, button_build, button_none, BUILD_MENU_ADMINISTRATION, 0, 1}, + {4, 555, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 44, button_build, button_none, BUILD_MENU_ENGINEERING, 0, 1}, + {4, 590, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 36, button_build, button_none, BUILD_MENU_SECURITY, 0, 1}, + {4, 625, 39, 26, IB_BUILD, GROUP_SIDEBAR_BUTTONS, 32, button_build, button_none, BUILD_MENU_INDUSTRY, 0, 1}, + {4, 660, 39, 26, IB_BUILD, GROUP_MESSAGE_ICON, 22, button_go_to_problem, button_none, 0, 0, 1}, + {4, 695, 39, 26, IB_NORMAL, GROUP_SIDEBAR_BUTTONS, 48, button_undo, button_none, 0, 0, 1}, }; static image_button buttons_top_expanded[] = { @@ -103,6 +109,7 @@ static image_button buttons_top_expanded[] = { }; static struct { unsigned int focus_button_for_tooltip; + int show_info_for; } data; static void draw_overlay_text(int x_offset) @@ -155,8 +162,8 @@ static void draw_number_of_messages(int x_offset) static void draw_buttons(int x_offset) { buttons_build[13].enabled = game_can_undo(); - image_buttons_draw(x_offset, 24, buttons_overlays_collapse_sidebar, 9); - image_buttons_draw(x_offset, 240, buttons_build, 14); + image_buttons_draw(x_offset, TOP_MENU_HEIGHT, buttons_overlays_collapse_sidebar, TOP_BUTTONS_COUNT); + image_buttons_draw(x_offset, TOP_MENU_HEIGHT, buttons_build, BUILD_BUTTONS_COUNT); // image_buttons_draw(x_offset, 24, buttons_top_expanded, 6); } @@ -167,11 +174,6 @@ static void enable_building_buttons(void) if (building_menu_count_items(buttons_build[i].parameter1) <= 0) { buttons_build[i].enabled = 0; } - - buttons_build[i].enabled = 1; - if (building_menu_count_items(buttons_build[i].parameter1) <= 0) { - buttons_build[i].enabled = 0; - } } } @@ -186,8 +188,20 @@ int calculate_x_offset_sidebar_advanced(void) return screen_width() - SIDEBAR_ADVANCED_WIDTH; } + +static void show_housing_info(void) +{ + int x_offset = calculate_x_offset_sidebar_advanced() + 48; + draw_infopanel_background(x_offset, 240 + 22 + 6, 162, 494); +} + void draw_advanced_sidebar_background(const int x_offset) { + if (data.show_info_for == 1) + { + show_housing_info(); + } + // image_draw(image_group(GROUP_SIDE_PANEL), x_offset, TOP_MENU_HEIGHT, COLOR_MASK_NONE, SCALE_NONE); // draw_buttons_collapsed(x_offset); // draw_sidebar_remainder(x_offset + 42); @@ -224,7 +238,7 @@ int handle_advanced_sidebar_mouse(const mouse *m) // if (button_id) { // data.focus_button_for_tooltip = 12; // } - handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_build, 12, &button_id); + handled |= image_buttons_handle_mouse(m, x_offset, TOP_MENU_HEIGHT, buttons_build, 14, &button_id); if (button_id) { data.focus_button_for_tooltip = button_id + 19; } @@ -233,7 +247,7 @@ int handle_advanced_sidebar_mouse(const mouse *m) // return 1; // } // int x_offset = new_sidebar_common_get_x_offset_expanded(); - handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_overlays_collapse_sidebar, 2, &button_id); + handled |= image_buttons_handle_mouse(m, x_offset, TOP_MENU_HEIGHT, buttons_overlays_collapse_sidebar, 9 , &button_id); if (button_id) { data.focus_button_for_tooltip = button_id + 9; } @@ -254,7 +268,7 @@ int handle_advanced_sidebar_mouse_build_menu(const mouse *m) { // if (city_view_is_sidebar_collapsed()) { return image_buttons_handle_mouse(m, - calculate_x_offset_sidebar_advanced(), 24, buttons_build, 12, 0); + calculate_x_offset_sidebar_advanced(), TOP_MENU_HEIGHT, buttons_build, 12, 0); // } else { // return image_buttons_handle_mouse(m, // new_sidebar_common_get_x_offset_expanded(), 24, buttons_build, 15, 0); @@ -278,8 +292,11 @@ static void button_collapse_expand(int param1, int param2) sidebar_next(); } + static void button_build(const int submenu, int param2) { + data.show_info_for = submenu + 1; + window_build_menu_show(submenu); } diff --git a/src/widget/sidebar/advanced/sidebar.h b/src/widget/sidebar/advanced/sidebar.h index 559130014d..404eb95ad1 100644 --- a/src/widget/sidebar/advanced/sidebar.h +++ b/src/widget/sidebar/advanced/sidebar.h @@ -16,4 +16,4 @@ int calculate_x_offset_sidebar_advanced(void); unsigned int get_advanced_sidebar_tooltip_text(tooltip_context *c); -#endif // WIDGET_ADVANCED_SIDEBAR +#endif From d0073efc4ad80f84150b247951edc449481e45e7 Mon Sep 17 00:00:00 2001 From: Rick Neeft Date: Thu, 23 Oct 2025 17:59:09 +0200 Subject: [PATCH 13/20] housing info start --- src/widget/sidebar/advanced/info.c | 77 +++++++++++++++++++++++++++ src/widget/sidebar/advanced/info.h | 2 + src/widget/sidebar/advanced/sidebar.c | 2 + 3 files changed, 81 insertions(+) diff --git a/src/widget/sidebar/advanced/info.c b/src/widget/sidebar/advanced/info.c index 4cdc0317ee..f61282bc06 100644 --- a/src/widget/sidebar/advanced/info.c +++ b/src/widget/sidebar/advanced/info.c @@ -1,7 +1,14 @@ #include "info.h" +#include "building/count.h" +#include "building/model.h" +#include "city/population.h" +#include "core/image.h" +#include "game/resource.h" #include "graphics/graphics.h" +#include "graphics/lang_text.h" #include "graphics/panel.h" +#include "graphics/text.h" void draw_infopanel_background(int x_offset, int y_offset, int width, int height) @@ -11,4 +18,74 @@ void draw_infopanel_background(int x_offset, int y_offset, int width, int height graphics_draw_line(x_offset + width - 1, x_offset + width - 1, y_offset, y_offset + height, COLOR_SIDEBAR); inner_panel_draw(x_offset + 1, y_offset, width / BLOCK_SIZE, panel_blocks); + +} + +void draw_housing_table(int x, int y_offset) +{ + int rows = 0; + + resource_list list = { 0 }; + for (resource_type r = RESOURCE_MIN_NON_FOOD; r < RESOURCE_MAX_NON_FOOD; r++) { + if (resource_is_inventory(r)) { + list.items[list.size++] = r; + } + } + + int total_residences = 0; + int houses_using_goods[RESOURCE_MAX] = { 0 }; + + for (house_level level = HOUSE_MIN; level <= HOUSE_MAX; level++) { + int residences_at_level = building_count_active(BUILDING_HOUSE_SMALL_TENT + level); + if (!residences_at_level) { + continue; + } + total_residences += residences_at_level; + + for (unsigned int i = 0; i < list.size; i++) { + if (model_house_uses_inventory(level, list.items[i])) { + houses_using_goods[list.items[i]] += residences_at_level; + } + } + + lang_text_draw(29, level, x + 30, y_offset + (20 * rows), FONT_NORMAL_GREEN); + text_draw_number(residences_at_level, '@', " ", x, y_offset + (20 * rows), FONT_NORMAL_WHITE, 0); + if (rows == 11) { + x += 280; + rows = 0; + } else { + rows++; + } + } + + + // info in the top right corner + text_draw(translation_for(TR_ADVISOR_TOTAL_NUM_HOUSES), 320, y_offset + 180, FONT_NORMAL_GREEN, 0); + text_draw_number(total_residences, '@', " ", 500, y_offset + 180, FONT_NORMAL_WHITE, 0); + + text_draw(translation_for(TR_ADVISOR_AVAILABLE_HOUSING_CAPACITY), 320, y_offset + 200, FONT_NORMAL_GREEN, 0); + text_draw_number(city_population_open_housing_capacity(), '@', " ", 500, y_offset + 200, FONT_NORMAL_WHITE, 0); + + text_draw(translation_for(TR_ADVISOR_TOTAL_HOUSING_CAPACITY), 320, y_offset + 220, FONT_NORMAL_GREEN, 0); + text_draw_number(city_population_total_housing_capacity(), '@', " ", 500, y_offset + 220, FONT_NORMAL_WHITE, 0); + + + // the using tabel pottery etc... + // for (unsigned int i = 0; i < list.size; i++) { + // + // int image_id = resource_get_data(list.items[i])->image.icon; + // const image *img = image_get(image_id); + // int base_width = (26 - img->original.width) / 2; + // int base_height = (26 - img->original.height) / 2; + // + // image_draw(resource_get_data(list.items[i])->image.icon, 54 + base_width, y_offset + 260 + (23 * i) + base_height - 5, + // COLOR_MASK_NONE, SCALE_NONE); + // text_draw(translation_for(TR_ADVISOR_RESIDENCES_USING_POTTERY + i), 90, y_offset + 263 + (23 * i), + // FONT_NORMAL_BLACK, 0); + // text_draw_number(houses_using_goods[list.items[i]], '@', " ", 499, y_offset + 263 + (23 * i), + // FONT_NORMAL_BLACK, 0); + // image_draw(resource_get_data(list.items[i])->image.icon, 550 + base_width, y_offset + 260 + (23 * i) + base_height - 5, + // COLOR_MASK_NONE, SCALE_NONE); + // } } + diff --git a/src/widget/sidebar/advanced/info.h b/src/widget/sidebar/advanced/info.h index 459513f267..696575ef5e 100644 --- a/src/widget/sidebar/advanced/info.h +++ b/src/widget/sidebar/advanced/info.h @@ -3,4 +3,6 @@ void draw_infopanel_background(int x_offset, int y_offset, int width, int height); +void draw_housing_table(int x, int y_offset); + #endif diff --git a/src/widget/sidebar/advanced/sidebar.c b/src/widget/sidebar/advanced/sidebar.c index 25ab93efc9..ad774c19ba 100644 --- a/src/widget/sidebar/advanced/sidebar.c +++ b/src/widget/sidebar/advanced/sidebar.c @@ -193,6 +193,8 @@ static void show_housing_info(void) { int x_offset = calculate_x_offset_sidebar_advanced() + 48; draw_infopanel_background(x_offset, 240 + 22 + 6, 162, 494); + + draw_housing_table(x_offset + 2, 240 + 22 + 12); } void draw_advanced_sidebar_background(const int x_offset) From f05991d14e37a3279c1280196d9345b01b4c8b3c Mon Sep 17 00:00:00 2001 From: Rick Neeft Date: Thu, 23 Oct 2025 23:01:29 +0200 Subject: [PATCH 14/20] made housing info nicer --- src/widget/sidebar/advanced/info.c | 114 +++++++++++++++++++------- src/widget/sidebar/advanced/sidebar.c | 1 - 2 files changed, 83 insertions(+), 32 deletions(-) diff --git a/src/widget/sidebar/advanced/info.c b/src/widget/sidebar/advanced/info.c index f61282bc06..9216171a99 100644 --- a/src/widget/sidebar/advanced/info.c +++ b/src/widget/sidebar/advanced/info.c @@ -2,6 +2,7 @@ #include "building/count.h" #include "building/model.h" +#include "city/labor.h" #include "city/population.h" #include "core/image.h" #include "game/resource.h" @@ -9,7 +10,8 @@ #include "graphics/lang_text.h" #include "graphics/panel.h" #include "graphics/text.h" - +#define SECTION_PADDING 8 +#define LINE_HEIGHT 16 void draw_infopanel_background(int x_offset, int y_offset, int width, int height) { @@ -18,57 +20,107 @@ void draw_infopanel_background(int x_offset, int y_offset, int width, int height graphics_draw_line(x_offset + width - 1, x_offset + width - 1, y_offset, y_offset + height, COLOR_SIDEBAR); inner_panel_draw(x_offset + 1, y_offset, width / BLOCK_SIZE, panel_blocks); +} + +static int add_info_header(const uint8_t* header, const int x_offset, const int y_offset) +{ + text_draw(header, x_offset, y_offset, FONT_NORMAL_WHITE, 0); + return y_offset + LINE_HEIGHT; +} +static int add_info_number(const int value, const int x_offset, const int y_offset) +{ + text_draw_number(value, '@', "", x_offset, y_offset, FONT_NORMAL_GREEN, 0); + return y_offset + LINE_HEIGHT; } -void draw_housing_table(int x, int y_offset) +static int add_info_number_with_subsection(const int value, const int sub_value, const int x_offset, const int y_offset) { - int rows = 0; + const int text_width = text_draw_number(value,'@', "", x_offset, y_offset, FONT_NORMAL_GREEN, 0); + text_draw_number(sub_value, '(', ")", x_offset + text_width, y_offset, FONT_NORMAL_GREEN, 0); - resource_list list = { 0 }; - for (resource_type r = RESOURCE_MIN_NON_FOOD; r < RESOURCE_MAX_NON_FOOD; r++) { - if (resource_is_inventory(r)) { - list.items[list.size++] = r; - } - } + return y_offset + LINE_HEIGHT; +} + +static int add_info_section_panel(const uint8_t* header, const int value, const int x_offset, int y_offset) +{ + y_offset = add_info_header(header, x_offset, y_offset); + y_offset = add_info_number(value, x_offset, y_offset); + return y_offset + SECTION_PADDING; +} + +static int add_info_section_panel_with_sub_value(const uint8_t* header, const int value, const int sub_value, const int x_offset, int y_offset) +{ + y_offset = add_info_header(header, x_offset, y_offset); + y_offset = add_info_number_with_subsection(value, sub_value, x_offset, y_offset); + return y_offset + SECTION_PADDING; +} +static int add_info_section_panel_percentage(const uint8_t* header, const int value, const int sub_value, const int x_offset, int y_offset) +{ + y_offset = add_info_header(header, x_offset, y_offset); + + const int text_width = text_draw_percentage(value, x_offset, y_offset, FONT_NORMAL_GREEN); + + text_draw_number(sub_value, '(', ")", x_offset +text_width, y_offset, FONT_NORMAL_GREEN, 0); + + y_offset += LINE_HEIGHT + SECTION_PADDING; + return y_offset; +} + +void draw_housing_table(int x_offset, int y_offset) +{ + x_offset += 5; int total_residences = 0; - int houses_using_goods[RESOURCE_MAX] = { 0 }; + + int housing_y_offset = y_offset + (6 * LINE_HEIGHT) + (3 * SECTION_PADDING); for (house_level level = HOUSE_MIN; level <= HOUSE_MAX; level++) { - int residences_at_level = building_count_active(BUILDING_HOUSE_SMALL_TENT + level); + const int residences_at_level = building_count_active(BUILDING_HOUSE_SMALL_TENT + level); if (!residences_at_level) { continue; } total_residences += residences_at_level; - for (unsigned int i = 0; i < list.size; i++) { - if (model_house_uses_inventory(level, list.items[i])) { - houses_using_goods[list.items[i]] += residences_at_level; - } - } - - lang_text_draw(29, level, x + 30, y_offset + (20 * rows), FONT_NORMAL_GREEN); - text_draw_number(residences_at_level, '@', " ", x, y_offset + (20 * rows), FONT_NORMAL_WHITE, 0); - if (rows == 11) { - x += 280; - rows = 0; - } else { - rows++; - } + add_info_number(residences_at_level, x_offset, housing_y_offset); + housing_y_offset = add_info_header( + lang_get_string(29, level), + x_offset + 30, + housing_y_offset + ); } + y_offset = add_info_section_panel_percentage( + lang_get_string(68, 148), + city_labor_unemployment_percentage(), + city_labor_workers_unemployed() - city_labor_workers_needed(), + x_offset, + y_offset + ); + + y_offset = add_info_section_panel( + translation_for(TR_ADVISOR_TOTAL_NUM_HOUSES), + total_residences, + x_offset, + y_offset + ); + + y_offset = add_info_section_panel_with_sub_value( + translation_for(TR_ADVISOR_TOTAL_HOUSING_CAPACITY), + city_population_total_housing_capacity(), + city_population_open_housing_capacity(), + x_offset, + y_offset + ); + + // info that is normally in the bottom + /* - // info in the top right corner - text_draw(translation_for(TR_ADVISOR_TOTAL_NUM_HOUSES), 320, y_offset + 180, FONT_NORMAL_GREEN, 0); - text_draw_number(total_residences, '@', " ", 500, y_offset + 180, FONT_NORMAL_WHITE, 0); - text_draw(translation_for(TR_ADVISOR_AVAILABLE_HOUSING_CAPACITY), 320, y_offset + 200, FONT_NORMAL_GREEN, 0); - text_draw_number(city_population_open_housing_capacity(), '@', " ", 500, y_offset + 200, FONT_NORMAL_WHITE, 0); text_draw(translation_for(TR_ADVISOR_TOTAL_HOUSING_CAPACITY), 320, y_offset + 220, FONT_NORMAL_GREEN, 0); text_draw_number(city_population_total_housing_capacity(), '@', " ", 500, y_offset + 220, FONT_NORMAL_WHITE, 0); - +*/ // the using tabel pottery etc... // for (unsigned int i = 0; i < list.size; i++) { diff --git a/src/widget/sidebar/advanced/sidebar.c b/src/widget/sidebar/advanced/sidebar.c index ad774c19ba..78b30a0c9c 100644 --- a/src/widget/sidebar/advanced/sidebar.c +++ b/src/widget/sidebar/advanced/sidebar.c @@ -58,7 +58,6 @@ static void button_rotate(int clockwise, int param2); group margins are 15 */ - static image_button buttons_overlays_collapse_sidebar[] = { {4, 3, 159, 31, IB_NORMAL, 93, 0, button_overlay_click, button_help, 0, MESSAGE_DIALOG_OVERLAYS, 1}, {165, 5, 31, 20, IB_NORMAL, 90, 0, button_collapse_expand, button_none, 0, 0, 1}, From 983dc89bb1a92a534bc912b7fbc3795c80b2c68d Mon Sep 17 00:00:00 2001 From: Rick Neeft Date: Fri, 24 Oct 2025 22:50:40 +0200 Subject: [PATCH 15/20] early version with god info --- src/widget/sidebar/advanced/info.c | 85 +++++++++++++++++++-------- src/widget/sidebar/advanced/info.h | 4 +- src/widget/sidebar/advanced/sidebar.c | 11 ++++ 3 files changed, 73 insertions(+), 27 deletions(-) diff --git a/src/widget/sidebar/advanced/info.c b/src/widget/sidebar/advanced/info.c index 9216171a99..753ec01b4e 100644 --- a/src/widget/sidebar/advanced/info.c +++ b/src/widget/sidebar/advanced/info.c @@ -112,32 +112,65 @@ void draw_housing_table(int x_offset, int y_offset) x_offset, y_offset ); +} + +#define LARARIUM_COVERAGE 10 +#define SHRINE_COVERAGE 50 +#define SMALL_TEMPLE_COVERAGE 750 +#define LARGE_TEMPLE_COVERAGE 3000 +#define ORACLE_COVERAGE 500 +#define LARGE_ORACLE_COVERAGE 750 +#define PANTHEON_COVERAGE 1500 +#define GRAND_TEMPLE_COVERAGE 5000 + +static int draw_god_row(god_type god, int x_offset, int y_offset, int base_god_value, building_type altar, building_type small_temple, + building_type large_temple, building_type grand_temple) +{ + + int value = base_god_value + + SHRINE_COVERAGE * building_count_active(altar) + + SMALL_TEMPLE_COVERAGE * building_count_active(small_temple) + + LARGE_TEMPLE_COVERAGE * building_count_active(large_temple) + + GRAND_TEMPLE_COVERAGE * building_count_active(grand_temple); + + y_offset = add_info_section_panel( + lang_get_string(59,11 + god), + value, + x_offset, + y_offset + ); + + return y_offset; - // info that is normally in the bottom - /* - - - - text_draw(translation_for(TR_ADVISOR_TOTAL_HOUSING_CAPACITY), 320, y_offset + 220, FONT_NORMAL_GREEN, 0); - text_draw_number(city_population_total_housing_capacity(), '@', " ", 500, y_offset + 220, FONT_NORMAL_WHITE, 0); -*/ - - // the using tabel pottery etc... - // for (unsigned int i = 0; i < list.size; i++) { - // - // int image_id = resource_get_data(list.items[i])->image.icon; - // const image *img = image_get(image_id); - // int base_width = (26 - img->original.width) / 2; - // int base_height = (26 - img->original.height) / 2; - // - // image_draw(resource_get_data(list.items[i])->image.icon, 54 + base_width, y_offset + 260 + (23 * i) + base_height - 5, - // COLOR_MASK_NONE, SCALE_NONE); - // text_draw(translation_for(TR_ADVISOR_RESIDENCES_USING_POTTERY + i), 90, y_offset + 263 + (23 * i), - // FONT_NORMAL_BLACK, 0); - // text_draw_number(houses_using_goods[list.items[i]], '@', " ", 499, y_offset + 263 + (23 * i), - // FONT_NORMAL_BLACK, 0); - // image_draw(resource_get_data(list.items[i])->image.icon, 550 + base_width, y_offset + 260 + (23 * i) + base_height - 5, - // COLOR_MASK_NONE, SCALE_NONE); - // } } +void draw_gods_table(int x_offset, int y_offset) +{ + x_offset += 5; + + const int oracles = building_count_active(BUILDING_ORACLE); + const int larariums = building_count_total(BUILDING_LARARIUM); + const int nymphaeums = building_count_active(BUILDING_NYMPHAEUM); + const int small_mausoleums = building_count_active(BUILDING_SMALL_MAUSOLEUM); + const int large_mausoleums = building_count_active(BUILDING_LARGE_MAUSOLEUM); + + const int base_god_value = + PANTHEON_COVERAGE * building_count_active(BUILDING_PANTHEON) + + LARARIUM_COVERAGE * larariums + + ORACLE_COVERAGE * oracles + + ORACLE_COVERAGE * small_mausoleums + + LARGE_ORACLE_COVERAGE * nymphaeums + + LARGE_ORACLE_COVERAGE * large_mausoleums ; + + // // god rows + y_offset = draw_god_row(GOD_CERES, x_offset, y_offset, base_god_value, BUILDING_SHRINE_CERES, BUILDING_SMALL_TEMPLE_CERES, + BUILDING_LARGE_TEMPLE_CERES, BUILDING_GRAND_TEMPLE_CERES); + y_offset = draw_god_row(GOD_NEPTUNE, x_offset, y_offset, base_god_value, BUILDING_SHRINE_NEPTUNE, BUILDING_SMALL_TEMPLE_NEPTUNE, + BUILDING_LARGE_TEMPLE_NEPTUNE, BUILDING_GRAND_TEMPLE_NEPTUNE); + y_offset = draw_god_row(GOD_MERCURY, x_offset, y_offset, base_god_value, BUILDING_SHRINE_MERCURY, BUILDING_SMALL_TEMPLE_MERCURY, + BUILDING_LARGE_TEMPLE_MERCURY, BUILDING_GRAND_TEMPLE_MERCURY); + y_offset = draw_god_row(GOD_MARS, x_offset, y_offset, base_god_value, BUILDING_SHRINE_MARS, BUILDING_SMALL_TEMPLE_MARS, + BUILDING_LARGE_TEMPLE_MARS, BUILDING_GRAND_TEMPLE_MARS); + draw_god_row(GOD_VENUS, x_offset, y_offset, base_god_value, BUILDING_SHRINE_VENUS, BUILDING_SMALL_TEMPLE_VENUS, + BUILDING_LARGE_TEMPLE_VENUS, BUILDING_GRAND_TEMPLE_VENUS); +} diff --git a/src/widget/sidebar/advanced/info.h b/src/widget/sidebar/advanced/info.h index 696575ef5e..79d794a144 100644 --- a/src/widget/sidebar/advanced/info.h +++ b/src/widget/sidebar/advanced/info.h @@ -3,6 +3,8 @@ void draw_infopanel_background(int x_offset, int y_offset, int width, int height); -void draw_housing_table(int x, int y_offset); +void draw_housing_table(int x_offset, int y_offset); + +void draw_gods_table(int x_offset, int y_offset); #endif diff --git a/src/widget/sidebar/advanced/sidebar.c b/src/widget/sidebar/advanced/sidebar.c index 78b30a0c9c..6687e942d5 100644 --- a/src/widget/sidebar/advanced/sidebar.c +++ b/src/widget/sidebar/advanced/sidebar.c @@ -196,11 +196,22 @@ static void show_housing_info(void) draw_housing_table(x_offset + 2, 240 + 22 + 12); } +static void show_god_info(void) +{ + int x_offset = calculate_x_offset_sidebar_advanced() + 48; + draw_infopanel_background(x_offset, 240 + 22 + 6, 162, 494); + + draw_gods_table(x_offset + 2, 240 + 22 + 12); +} + void draw_advanced_sidebar_background(const int x_offset) { if (data.show_info_for == 1) { show_housing_info(); + } else if (data.show_info_for == BUILD_MENU_TEMPLES + 1) + { + show_god_info(); } // image_draw(image_group(GROUP_SIDE_PANEL), x_offset, TOP_MENU_HEIGHT, COLOR_MASK_NONE, SCALE_NONE); From e9d0f56df02f44a16071437dea29bf9676cf816b Mon Sep 17 00:00:00 2001 From: Rick Neeft Date: Sat, 25 Oct 2025 21:30:42 +0200 Subject: [PATCH 16/20] Advanced menu now stayed visible when opening build menu --- src/widget/city.c | 1 - src/widget/sidebar/advanced/sidebar.c | 11 ++++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/widget/city.c b/src/widget/city.c index cd94bc0e38..6c90e3807c 100644 --- a/src/widget/city.c +++ b/src/widget/city.c @@ -228,7 +228,6 @@ static void draw_construction_buttons(void) void widget_city_draw_construction_buttons(void) { - //TODO: config if (!sidebar_extra_is_information_displayed(SIDEBAR_EXTRA_DISPLAY_GAME_SPEED)) { draw_pause_button(); } diff --git a/src/widget/sidebar/advanced/sidebar.c b/src/widget/sidebar/advanced/sidebar.c index 6687e942d5..6159572c36 100644 --- a/src/widget/sidebar/advanced/sidebar.c +++ b/src/widget/sidebar/advanced/sidebar.c @@ -215,7 +215,12 @@ void draw_advanced_sidebar_background(const int x_offset) } // image_draw(image_group(GROUP_SIDE_PANEL), x_offset, TOP_MENU_HEIGHT, COLOR_MASK_NONE, SCALE_NONE); - // draw_buttons_collapsed(x_offset); + draw_buttons(x_offset); + draw_overlay_text(x_offset + 4); + draw_number_of_messages(x_offset); + widget_minimap_update(0); + widget_minimap_draw_decorated(x_offset + 8, 36 + TOP_MENU_HEIGHT, 187, 143); + // draw_sidebar_remainder(x_offset + 42); } @@ -227,12 +232,12 @@ void draw_advanced_sidebar_foreground(void) const int x_offset = calculate_x_offset_sidebar_advanced(); draw_buttons(x_offset); - draw_overlay_text(x_offset + 4); - widget_minimap_draw_decorated(x_offset + 8, 36 + TOP_MENU_HEIGHT, 187, 143); draw_number_of_messages(x_offset); + + // sidebar_extra_draw_foreground(); } From 1cde42af635c4a2983ddbb1a5b6fc28b93027ca7 Mon Sep 17 00:00:00 2001 From: Rick Neeft Date: Sat, 25 Oct 2025 22:13:04 +0200 Subject: [PATCH 17/20] Health info --- src/widget/sidebar/advanced/info.c | 103 ++++++++++++++++++++++---- src/widget/sidebar/advanced/info.h | 2 + src/widget/sidebar/advanced/sidebar.c | 11 +++ 3 files changed, 102 insertions(+), 14 deletions(-) diff --git a/src/widget/sidebar/advanced/info.c b/src/widget/sidebar/advanced/info.c index 753ec01b4e..25c3a8f106 100644 --- a/src/widget/sidebar/advanced/info.c +++ b/src/widget/sidebar/advanced/info.c @@ -1,17 +1,26 @@ #include "info.h" +#include "assets/assets.h" #include "building/count.h" #include "building/model.h" +#include "city/culture.h" +#include "city/festival.h" +#include "city/gods.h" +#include "city/health.h" #include "city/labor.h" #include "city/population.h" +#include "core/calc.h" #include "core/image.h" #include "game/resource.h" #include "graphics/graphics.h" +#include "graphics/image.h" #include "graphics/lang_text.h" #include "graphics/panel.h" #include "graphics/text.h" #define SECTION_PADDING 8 #define LINE_HEIGHT 16 +#define HEADER_FONT FONT_NORMAL_WHITE +#define VALUE_FONT FONT_NORMAL_GREEN void draw_infopanel_background(int x_offset, int y_offset, int width, int height) { @@ -24,20 +33,20 @@ void draw_infopanel_background(int x_offset, int y_offset, int width, int height static int add_info_header(const uint8_t* header, const int x_offset, const int y_offset) { - text_draw(header, x_offset, y_offset, FONT_NORMAL_WHITE, 0); + text_draw(header, x_offset, y_offset, HEADER_FONT, 0); return y_offset + LINE_HEIGHT; } static int add_info_number(const int value, const int x_offset, const int y_offset) { - text_draw_number(value, '@', "", x_offset, y_offset, FONT_NORMAL_GREEN, 0); + text_draw_number(value, '@', "", x_offset, y_offset, VALUE_FONT, 0); return y_offset + LINE_HEIGHT; } static int add_info_number_with_subsection(const int value, const int sub_value, const int x_offset, const int y_offset) { - const int text_width = text_draw_number(value,'@', "", x_offset, y_offset, FONT_NORMAL_GREEN, 0); - text_draw_number(sub_value, '(', ")", x_offset + text_width, y_offset, FONT_NORMAL_GREEN, 0); + const int text_width = text_draw_number(value,'@', "", x_offset, y_offset, VALUE_FONT, 0); + text_draw_number(sub_value, '(', ")", x_offset + text_width, y_offset, VALUE_FONT, 0); return y_offset + LINE_HEIGHT; } @@ -60,14 +69,62 @@ static int add_info_section_panel_percentage(const uint8_t* header, const int va { y_offset = add_info_header(header, x_offset, y_offset); - const int text_width = text_draw_percentage(value, x_offset, y_offset, FONT_NORMAL_GREEN); + const int text_width = text_draw_percentage(value, x_offset, y_offset, VALUE_FONT); - text_draw_number(sub_value, '(', ")", x_offset +text_width, y_offset, FONT_NORMAL_GREEN, 0); + text_draw_number(sub_value, '(', ")", x_offset +text_width, y_offset, VALUE_FONT, 0); y_offset += LINE_HEIGHT + SECTION_PADDING; return y_offset; } +static int draw_health_building_info(const int x_offset, int y_offset, const building_type type, const int population_served, const int coverage) +{ + static const int BUILDING_ID_TO_STRING_ID[] = { 28, 30, 24, 26 }; + + lang_text_draw_amount(8, BUILDING_ID_TO_STRING_ID[type - BUILDING_DOCTOR], + building_count_total(type), x_offset, y_offset, HEADER_FONT); + + y_offset += LINE_HEIGHT; + + if (coverage == 0) { + lang_text_draw(57, 10, x_offset, y_offset, VALUE_FONT); + } else if (coverage < 100) { + lang_text_draw(57, coverage / 10 + 11, x_offset, y_offset, VALUE_FONT); + } else { + lang_text_draw(57, 21, x_offset, y_offset, VALUE_FONT); + } + + y_offset += LINE_HEIGHT; + + int width = text_draw_number(population_served, '@', " ", x_offset, y_offset, VALUE_FONT, 0); + + if (type == BUILDING_DOCTOR || type == BUILDING_HOSPITAL) { + lang_text_draw(56, 6, x_offset + width, y_offset, VALUE_FONT); + } else { + lang_text_draw(58, 5, x_offset + width, y_offset, VALUE_FONT); + } + + y_offset += LINE_HEIGHT + SECTION_PADDING; + return y_offset; +} + +void draw_health_table(int x_offset, int y_offset) +{ + const int population = city_population(); + + int people_covered = city_health_get_population_with_baths_access(); + y_offset = draw_health_building_info(x_offset, y_offset, BUILDING_BATHHOUSE, people_covered, calc_percentage(people_covered, population)); + + people_covered = city_health_get_population_with_barber_access(); + y_offset = draw_health_building_info(x_offset, y_offset, BUILDING_BARBER, people_covered, calc_percentage(people_covered, population)); + + people_covered = city_health_get_population_with_clinic_access(); + y_offset = draw_health_building_info(x_offset, y_offset, BUILDING_DOCTOR, people_covered, calc_percentage(people_covered, population)); + + people_covered = 1000 * building_count_active(BUILDING_HOSPITAL); + y_offset = draw_health_building_info(x_offset, y_offset, BUILDING_HOSPITAL, people_covered, city_culture_coverage_hospital()); +} + void draw_housing_table(int x_offset, int y_offset) { x_offset += 5; @@ -123,22 +180,41 @@ void draw_housing_table(int x_offset, int y_offset) #define PANTHEON_COVERAGE 1500 #define GRAND_TEMPLE_COVERAGE 5000 -static int draw_god_row(god_type god, int x_offset, int y_offset, int base_god_value, building_type altar, building_type small_temple, - building_type large_temple, building_type grand_temple) +static int draw_god_row(const god_type god, const int x_offset, int y_offset, const int base_god_value, + const building_type altar, const building_type small_temple, + const building_type large_temple, const building_type grand_temple) { - int value = base_god_value + + const int value = base_god_value + SHRINE_COVERAGE * building_count_active(altar) + SMALL_TEMPLE_COVERAGE * building_count_active(small_temple) + LARGE_TEMPLE_COVERAGE * building_count_active(large_temple) + GRAND_TEMPLE_COVERAGE * building_count_active(grand_temple); - y_offset = add_info_section_panel( - lang_get_string(59,11 + god), + const int god_name_width = text_draw(lang_get_string(59,11 + god) + , x_offset, + y_offset, HEADER_FONT, 0); + + const int bolts = city_god_wrath_bolts(god); + for (int i = 0; i < bolts / 10; i++) { + image_draw(image_group(GROUP_GOD_BOLT), + x_offset + 10 * i + god_name_width, y_offset -2 , COLOR_MASK_NONE, SCALE_NONE); + } + const int happy_bolts = city_god_happy_bolts(god); + for (int i = 0; i < happy_bolts; i++) { + image_draw(assets_get_image_id("UI", "Happy God Icon"), + x_offset + 10 * i + god_name_width, y_offset -2 , COLOR_MASK_NONE, SCALE_NONE); + } + + y_offset += LINE_HEIGHT; + y_offset = add_info_number( value, x_offset, - y_offset - ); + y_offset); + + lang_text_draw(59, 32 + city_god_happiness(god) / 10, x_offset, y_offset, VALUE_FONT); + + y_offset += LINE_HEIGHT + SECTION_PADDING; return y_offset; @@ -162,7 +238,6 @@ void draw_gods_table(int x_offset, int y_offset) LARGE_ORACLE_COVERAGE * nymphaeums + LARGE_ORACLE_COVERAGE * large_mausoleums ; - // // god rows y_offset = draw_god_row(GOD_CERES, x_offset, y_offset, base_god_value, BUILDING_SHRINE_CERES, BUILDING_SMALL_TEMPLE_CERES, BUILDING_LARGE_TEMPLE_CERES, BUILDING_GRAND_TEMPLE_CERES); y_offset = draw_god_row(GOD_NEPTUNE, x_offset, y_offset, base_god_value, BUILDING_SHRINE_NEPTUNE, BUILDING_SMALL_TEMPLE_NEPTUNE, diff --git a/src/widget/sidebar/advanced/info.h b/src/widget/sidebar/advanced/info.h index 79d794a144..0119fbce4a 100644 --- a/src/widget/sidebar/advanced/info.h +++ b/src/widget/sidebar/advanced/info.h @@ -7,4 +7,6 @@ void draw_housing_table(int x_offset, int y_offset); void draw_gods_table(int x_offset, int y_offset); +void draw_health_table(int x_offset, int y_offset); + #endif diff --git a/src/widget/sidebar/advanced/sidebar.c b/src/widget/sidebar/advanced/sidebar.c index 6159572c36..625c0a0840 100644 --- a/src/widget/sidebar/advanced/sidebar.c +++ b/src/widget/sidebar/advanced/sidebar.c @@ -204,6 +204,14 @@ static void show_god_info(void) draw_gods_table(x_offset + 2, 240 + 22 + 12); } +static void show_health_info(void) +{ + int x_offset = calculate_x_offset_sidebar_advanced() + 48; + draw_infopanel_background(x_offset, 240 + 22 + 6, 162, 494); + + draw_health_table(x_offset + 2, 240 + 22 + 12); +} + void draw_advanced_sidebar_background(const int x_offset) { if (data.show_info_for == 1) @@ -212,6 +220,9 @@ void draw_advanced_sidebar_background(const int x_offset) } else if (data.show_info_for == BUILD_MENU_TEMPLES + 1) { show_god_info(); + } else if (data.show_info_for == BUILD_MENU_HEALTH + 1) + { + show_health_info(); } // image_draw(image_group(GROUP_SIDE_PANEL), x_offset, TOP_MENU_HEIGHT, COLOR_MASK_NONE, SCALE_NONE); From 2e07626bce95d78b5e8bc25270614de429bb5d0d Mon Sep 17 00:00:00 2001 From: Rick Neeft Date: Mon, 3 Nov 2025 22:08:16 +0100 Subject: [PATCH 18/20] Small refactoring + help and advisor buttons at the bottom --- CMakeLists.txt | 2 +- .../sidebar/advanced/{ => advisors}/info.c | 167 +++++++++++++----- src/widget/sidebar/advanced/advisors/info.h | 15 ++ src/widget/sidebar/advanced/info.h | 12 -- src/widget/sidebar/advanced/sidebar.c | 81 ++++----- 5 files changed, 178 insertions(+), 99 deletions(-) rename src/widget/sidebar/advanced/{ => advisors}/info.c (57%) create mode 100644 src/widget/sidebar/advanced/advisors/info.h delete mode 100644 src/widget/sidebar/advanced/info.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 6e2625fe9c..5fc095f1df 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -617,7 +617,7 @@ set(WIDGET_FILES ${PROJECT_SOURCE_DIR}/src/widget/sidebar/collapsed/sidebar.c ${PROJECT_SOURCE_DIR}/src/widget/sidebar/expanded/sidebar.c ${PROJECT_SOURCE_DIR}/src/widget/sidebar/advanced/sidebar.c - ${PROJECT_SOURCE_DIR}/src/widget/sidebar/advanced/info.c + src/widget/sidebar/advanced/advisors/info.c ${PROJECT_SOURCE_DIR}/src/widget/sidebar/city.c ${PROJECT_SOURCE_DIR}/src/widget/sidebar/common.c ${PROJECT_SOURCE_DIR}/src/widget/sidebar/editor.c diff --git a/src/widget/sidebar/advanced/info.c b/src/widget/sidebar/advanced/advisors/info.c similarity index 57% rename from src/widget/sidebar/advanced/info.c rename to src/widget/sidebar/advanced/advisors/info.c index 25c3a8f106..7e43f70777 100644 --- a/src/widget/sidebar/advanced/info.c +++ b/src/widget/sidebar/advanced/advisors/info.c @@ -12,23 +12,64 @@ #include "core/calc.h" #include "core/image.h" #include "game/resource.h" +#include "graphics/complex_button.h" +#include "graphics/generic_button.h" #include "graphics/graphics.h" #include "graphics/image.h" +#include "graphics/image_button.h" #include "graphics/lang_text.h" #include "graphics/panel.h" #include "graphics/text.h" +#include "window/advisors.h" +#include "window/city.h" +#include "window/message_dialog.h" + #define SECTION_PADDING 8 #define LINE_HEIGHT 16 +#define INFO_PANEL_HEIGHT 494 +#define INFO_PANEL_WIDTH 160 +#define INFO_PANEL_LEFT_MARGIN 5 +#define INFO_PANEL_TOP_MARGIN 6 +#define LARARIUM_COVERAGE 10 +#define SHRINE_COVERAGE 50 +#define SMALL_TEMPLE_COVERAGE 750 +#define LARGE_TEMPLE_COVERAGE 3000 +#define ORACLE_COVERAGE 500 +#define LARGE_ORACLE_COVERAGE 750 +#define PANTHEON_COVERAGE 1500 +#define GRAND_TEMPLE_COVERAGE 5000 #define HEADER_FONT FONT_NORMAL_WHITE #define VALUE_FONT FONT_NORMAL_GREEN +#define IMAGE_ID_FOR_ADVISOR_BUILDING_WINDOW_BORDER_1_UI 11842 +#define BUTTON_COUNT 2 + +static void button_advisor(int advisor, int param2); +static void button_help(int param1, int param2); + +static image_button health_buttons[] = { + { 0, 0, 27, 27, IB_NORMAL, GROUP_CONTEXT_ICONS, 0,button_help, button_none, 0, 0, 1}, + {0, 0, 27, 27, IB_NORMAL,0, 0, button_advisor, button_none, 0, 0, 1} +}; + -void draw_infopanel_background(int x_offset, int y_offset, int width, int height) +static struct { + int x_offset; + int y_offset; + unsigned int focus_button_id; + int current_advisor; +} data; + + +void draw_info_panel_background(const int x_offset, const int y_offset) { - int panel_blocks = height / BLOCK_SIZE; - graphics_draw_line(x_offset, x_offset, y_offset, y_offset + height, COLOR_WHITE); - graphics_draw_line(x_offset + width - 1, x_offset + width - 1, y_offset, - y_offset + height, COLOR_SIDEBAR); - inner_panel_draw(x_offset + 1, y_offset, width / BLOCK_SIZE, panel_blocks); + const int panel_blocks = INFO_PANEL_HEIGHT / BLOCK_SIZE; + graphics_draw_line(x_offset, x_offset, y_offset, y_offset + INFO_PANEL_HEIGHT, COLOR_WHITE); + graphics_draw_line(x_offset + INFO_PANEL_WIDTH - 1, x_offset + INFO_PANEL_WIDTH - 1, y_offset, + y_offset + INFO_PANEL_HEIGHT, COLOR_SIDEBAR); + inner_panel_draw(x_offset + 1, y_offset, INFO_PANEL_WIDTH / BLOCK_SIZE, panel_blocks); + + data.x_offset = x_offset + INFO_PANEL_LEFT_MARGIN; + data.y_offset = y_offset + INFO_PANEL_TOP_MARGIN; } static int add_info_header(const uint8_t* header, const int x_offset, const int y_offset) @@ -77,6 +118,25 @@ static int add_info_section_panel_percentage(const uint8_t* header, const int va return y_offset; } +int info_panel_mouse_handle(const mouse *m) +{ + return image_buttons_handle_mouse(m, 0,0, health_buttons, BUTTON_COUNT, &data.focus_button_id); +} + +void place_button_at_bottom(const int advisor, const int health_information_dialog) +{ + health_buttons[0].y_offset = data.y_offset + 447; + health_buttons[0].x_offset = data.x_offset + 2; + health_buttons[0].parameter1 = health_information_dialog; + + health_buttons[1].image_offset = IMAGE_ID_FOR_ADVISOR_BUILDING_WINDOW_BORDER_1_UI + advisor * 4; + health_buttons[1].y_offset = data.y_offset + 447; + health_buttons[1].x_offset = data.x_offset + 29; + health_buttons[1].parameter1 = advisor; + + image_buttons_draw(0,0, health_buttons, BUTTON_COUNT); +} + static int draw_health_building_info(const int x_offset, int y_offset, const building_type type, const int population_served, const int coverage) { static const int BUILDING_ID_TO_STRING_ID[] = { 28, 30, 24, 26 }; @@ -96,7 +156,7 @@ static int draw_health_building_info(const int x_offset, int y_offset, const bui y_offset += LINE_HEIGHT; - int width = text_draw_number(population_served, '@', " ", x_offset, y_offset, VALUE_FONT, 0); + const int width = text_draw_number(population_served, '@', " ", x_offset, y_offset, VALUE_FONT, 0); if (type == BUILDING_DOCTOR || type == BUILDING_HOSPITAL) { lang_text_draw(56, 6, x_offset + width, y_offset, VALUE_FONT); @@ -108,26 +168,37 @@ static int draw_health_building_info(const int x_offset, int y_offset, const bui return y_offset; } -void draw_health_table(int x_offset, int y_offset) +void draw_health_table(void) { + place_button_at_bottom(ADVISOR_HEALTH, MESSAGE_DIALOG_ADVISOR_HEALTH); + + int y_offset = data.y_offset; const int population = city_population(); int people_covered = city_health_get_population_with_baths_access(); - y_offset = draw_health_building_info(x_offset, y_offset, BUILDING_BATHHOUSE, people_covered, calc_percentage(people_covered, population)); + y_offset = draw_health_building_info(data.x_offset, y_offset, BUILDING_BATHHOUSE, people_covered, calc_percentage(people_covered, population)); people_covered = city_health_get_population_with_barber_access(); - y_offset = draw_health_building_info(x_offset, y_offset, BUILDING_BARBER, people_covered, calc_percentage(people_covered, population)); + y_offset = draw_health_building_info(data.x_offset, y_offset, BUILDING_BARBER, people_covered, calc_percentage(people_covered, population)); people_covered = city_health_get_population_with_clinic_access(); - y_offset = draw_health_building_info(x_offset, y_offset, BUILDING_DOCTOR, people_covered, calc_percentage(people_covered, population)); + y_offset = draw_health_building_info(data.x_offset, y_offset, BUILDING_DOCTOR, people_covered, calc_percentage(people_covered, population)); people_covered = 1000 * building_count_active(BUILDING_HOSPITAL); - y_offset = draw_health_building_info(x_offset, y_offset, BUILDING_HOSPITAL, people_covered, city_culture_coverage_hospital()); + y_offset = draw_health_building_info(data.x_offset, y_offset, BUILDING_HOSPITAL, people_covered, city_culture_coverage_hospital()); } -void draw_housing_table(int x_offset, int y_offset) +void draw_education_table(const int x_offset, int y_offset) { - x_offset += 5; + lang_text_draw_amount(8, 18, building_count_total(BUILDING_SCHOOL), 40, 105, FONT_NORMAL_WHITE); +} + +void draw_housing_table(void) +{ + place_button_at_bottom(ADVISOR_HOUSING, MESSAGE_DIALOG_ADVISOR_POPULATION); + + int y_offset = data.y_offset; + int total_residences = 0; int housing_y_offset = y_offset + (6 * LINE_HEIGHT) + (3 * SECTION_PADDING); @@ -139,10 +210,10 @@ void draw_housing_table(int x_offset, int y_offset) } total_residences += residences_at_level; - add_info_number(residences_at_level, x_offset, housing_y_offset); + add_info_number(residences_at_level, data.x_offset, housing_y_offset); housing_y_offset = add_info_header( lang_get_string(29, level), - x_offset + 30, + data.x_offset + 30, housing_y_offset ); } @@ -151,14 +222,14 @@ void draw_housing_table(int x_offset, int y_offset) lang_get_string(68, 148), city_labor_unemployment_percentage(), city_labor_workers_unemployed() - city_labor_workers_needed(), - x_offset, + data.x_offset, y_offset ); y_offset = add_info_section_panel( translation_for(TR_ADVISOR_TOTAL_NUM_HOUSES), total_residences, - x_offset, + data.x_offset, y_offset ); @@ -166,21 +237,12 @@ void draw_housing_table(int x_offset, int y_offset) translation_for(TR_ADVISOR_TOTAL_HOUSING_CAPACITY), city_population_total_housing_capacity(), city_population_open_housing_capacity(), - x_offset, + data.x_offset, y_offset ); } -#define LARARIUM_COVERAGE 10 -#define SHRINE_COVERAGE 50 -#define SMALL_TEMPLE_COVERAGE 750 -#define LARGE_TEMPLE_COVERAGE 3000 -#define ORACLE_COVERAGE 500 -#define LARGE_ORACLE_COVERAGE 750 -#define PANTHEON_COVERAGE 1500 -#define GRAND_TEMPLE_COVERAGE 5000 - -static int draw_god_row(const god_type god, const int x_offset, int y_offset, const int base_god_value, +static int draw_god_row(const god_type god, int y_offset, const int base_god_value, const building_type altar, const building_type small_temple, const building_type large_temple, const building_type grand_temple) { @@ -192,27 +254,27 @@ static int draw_god_row(const god_type god, const int x_offset, int y_offset, co GRAND_TEMPLE_COVERAGE * building_count_active(grand_temple); const int god_name_width = text_draw(lang_get_string(59,11 + god) - , x_offset, + , data.x_offset, y_offset, HEADER_FONT, 0); const int bolts = city_god_wrath_bolts(god); for (int i = 0; i < bolts / 10; i++) { image_draw(image_group(GROUP_GOD_BOLT), - x_offset + 10 * i + god_name_width, y_offset -2 , COLOR_MASK_NONE, SCALE_NONE); + data.x_offset + 10 * i + god_name_width, y_offset -2 , COLOR_MASK_NONE, SCALE_NONE); } const int happy_bolts = city_god_happy_bolts(god); for (int i = 0; i < happy_bolts; i++) { image_draw(assets_get_image_id("UI", "Happy God Icon"), - x_offset + 10 * i + god_name_width, y_offset -2 , COLOR_MASK_NONE, SCALE_NONE); + data.x_offset + 10 * i + god_name_width, y_offset -2 , COLOR_MASK_NONE, SCALE_NONE); } y_offset += LINE_HEIGHT; y_offset = add_info_number( value, - x_offset, + data.x_offset, y_offset); - lang_text_draw(59, 32 + city_god_happiness(god) / 10, x_offset, y_offset, VALUE_FONT); + lang_text_draw(59, 32 + city_god_happiness(god) / 10, data.x_offset, y_offset, VALUE_FONT); y_offset += LINE_HEIGHT + SECTION_PADDING; @@ -220,9 +282,11 @@ static int draw_god_row(const god_type god, const int x_offset, int y_offset, co } -void draw_gods_table(int x_offset, int y_offset) +void draw_gods_table(void) { - x_offset += 5; + place_button_at_bottom(ADVISOR_RELIGION, MESSAGE_DIALOG_ADVISOR_RELIGION); + + int y_offset = data.y_offset; const int oracles = building_count_active(BUILDING_ORACLE); const int larariums = building_count_total(BUILDING_LARARIUM); @@ -238,14 +302,25 @@ void draw_gods_table(int x_offset, int y_offset) LARGE_ORACLE_COVERAGE * nymphaeums + LARGE_ORACLE_COVERAGE * large_mausoleums ; - y_offset = draw_god_row(GOD_CERES, x_offset, y_offset, base_god_value, BUILDING_SHRINE_CERES, BUILDING_SMALL_TEMPLE_CERES, - BUILDING_LARGE_TEMPLE_CERES, BUILDING_GRAND_TEMPLE_CERES); - y_offset = draw_god_row(GOD_NEPTUNE, x_offset, y_offset, base_god_value, BUILDING_SHRINE_NEPTUNE, BUILDING_SMALL_TEMPLE_NEPTUNE, - BUILDING_LARGE_TEMPLE_NEPTUNE, BUILDING_GRAND_TEMPLE_NEPTUNE); - y_offset = draw_god_row(GOD_MERCURY, x_offset, y_offset, base_god_value, BUILDING_SHRINE_MERCURY, BUILDING_SMALL_TEMPLE_MERCURY, - BUILDING_LARGE_TEMPLE_MERCURY, BUILDING_GRAND_TEMPLE_MERCURY); - y_offset = draw_god_row(GOD_MARS, x_offset, y_offset, base_god_value, BUILDING_SHRINE_MARS, BUILDING_SMALL_TEMPLE_MARS, - BUILDING_LARGE_TEMPLE_MARS, BUILDING_GRAND_TEMPLE_MARS); - draw_god_row(GOD_VENUS, x_offset, y_offset, base_god_value, BUILDING_SHRINE_VENUS, BUILDING_SMALL_TEMPLE_VENUS, - BUILDING_LARGE_TEMPLE_VENUS, BUILDING_GRAND_TEMPLE_VENUS); + y_offset = draw_god_row(GOD_CERES, y_offset, base_god_value, BUILDING_SHRINE_CERES, + BUILDING_SMALL_TEMPLE_CERES, BUILDING_LARGE_TEMPLE_CERES, BUILDING_GRAND_TEMPLE_CERES); + y_offset = draw_god_row(GOD_NEPTUNE, y_offset, base_god_value, BUILDING_SHRINE_NEPTUNE, + BUILDING_SMALL_TEMPLE_NEPTUNE, BUILDING_LARGE_TEMPLE_NEPTUNE, BUILDING_GRAND_TEMPLE_NEPTUNE); + y_offset = draw_god_row(GOD_MERCURY, y_offset, base_god_value, BUILDING_SHRINE_MERCURY, + BUILDING_SMALL_TEMPLE_MERCURY, BUILDING_LARGE_TEMPLE_MERCURY, BUILDING_GRAND_TEMPLE_MERCURY); + y_offset = draw_god_row(GOD_MARS, y_offset, base_god_value, BUILDING_SHRINE_MARS, + BUILDING_SMALL_TEMPLE_MARS, BUILDING_LARGE_TEMPLE_MARS, BUILDING_GRAND_TEMPLE_MARS); + draw_god_row(GOD_VENUS, y_offset, base_god_value, BUILDING_SHRINE_VENUS, + BUILDING_SMALL_TEMPLE_VENUS, BUILDING_LARGE_TEMPLE_VENUS, BUILDING_GRAND_TEMPLE_VENUS); } + +static void button_advisor(const int advisor, int param2) +{ + window_advisors_show_advisor(advisor); +} + +static void button_help(const int param1, int param2) +{ + window_message_dialog_show(param1, 0); +} + diff --git a/src/widget/sidebar/advanced/advisors/info.h b/src/widget/sidebar/advanced/advisors/info.h new file mode 100644 index 0000000000..cc341a7a24 --- /dev/null +++ b/src/widget/sidebar/advanced/advisors/info.h @@ -0,0 +1,15 @@ +#ifndef WIDGET_SIDEBAR_INFO +#define WIDGET_SIDEBAR_INFO +#include "input/mouse.h" + +void draw_info_panel_background(int x_offset, int y_offset); + +void draw_housing_table(void); + +void draw_gods_table(void); + +void draw_health_table(void); + +int info_panel_mouse_handle(const mouse *m); + +#endif diff --git a/src/widget/sidebar/advanced/info.h b/src/widget/sidebar/advanced/info.h deleted file mode 100644 index 0119fbce4a..0000000000 --- a/src/widget/sidebar/advanced/info.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef WIDGET_SIDEBAR_INFO -#define WIDGET_SIDEBAR_INFO - -void draw_infopanel_background(int x_offset, int y_offset, int width, int height); - -void draw_housing_table(int x_offset, int y_offset); - -void draw_gods_table(int x_offset, int y_offset); - -void draw_health_table(int x_offset, int y_offset); - -#endif diff --git a/src/widget/sidebar/advanced/sidebar.c b/src/widget/sidebar/advanced/sidebar.c index 625c0a0840..d9fa7cfb35 100644 --- a/src/widget/sidebar/advanced/sidebar.c +++ b/src/widget/sidebar/advanced/sidebar.c @@ -1,6 +1,6 @@ #include "sidebar.h" -#include "info.h" +#include "advisors/info.h" #include "building/menu.h" #include "city/message.h" #include "city/view.h" @@ -111,7 +111,7 @@ static struct { int show_info_for; } data; -static void draw_overlay_text(int x_offset) +static void draw_overlay_text(const int x_offset) { if (game_state_overlay()) { const uint8_t *text = get_current_overlay_text(); @@ -176,7 +176,6 @@ static void enable_building_buttons(void) } } - int advanced_sidebar_width(void) { return SIDEBAR_ADVANCED_WIDTH; @@ -187,42 +186,23 @@ int calculate_x_offset_sidebar_advanced(void) return screen_width() - SIDEBAR_ADVANCED_WIDTH; } - -static void show_housing_info(void) -{ - int x_offset = calculate_x_offset_sidebar_advanced() + 48; - draw_infopanel_background(x_offset, 240 + 22 + 6, 162, 494); - - draw_housing_table(x_offset + 2, 240 + 22 + 12); -} - -static void show_god_info(void) -{ - int x_offset = calculate_x_offset_sidebar_advanced() + 48; - draw_infopanel_background(x_offset, 240 + 22 + 6, 162, 494); - - draw_gods_table(x_offset + 2, 240 + 22 + 12); -} - -static void show_health_info(void) -{ - int x_offset = calculate_x_offset_sidebar_advanced() + 48; - draw_infopanel_background(x_offset, 240 + 22 + 6, 162, 494); - - draw_health_table(x_offset + 2, 240 + 22 + 12); -} - void draw_advanced_sidebar_background(const int x_offset) { - if (data.show_info_for == 1) - { - show_housing_info(); - } else if (data.show_info_for == BUILD_MENU_TEMPLES + 1) - { - show_god_info(); - } else if (data.show_info_for == BUILD_MENU_HEALTH + 1) - { - show_health_info(); + const int info_panel_x_offset = x_offset + 48; + const int info_panel_y_offset = 268; + draw_info_panel_background(info_panel_x_offset, info_panel_y_offset); + + switch (data.show_info_for){ + case BUILD_MENU_HEALTH: + draw_health_table(); + break; + case BUILD_MENU_VACANT_HOUSE: + draw_housing_table(); + break; + case BUILD_MENU_TEMPLES: + draw_gods_table(); + break; + default: ; } // image_draw(image_group(GROUP_SIDE_PANEL), x_offset, TOP_MENU_HEIGHT, COLOR_MASK_NONE, SCALE_NONE); @@ -237,11 +217,25 @@ void draw_advanced_sidebar_background(const int x_offset) void draw_advanced_sidebar_foreground(void) { + const int x_offset = calculate_x_offset_sidebar_advanced(); + + switch (data.show_info_for){ + case BUILD_MENU_HEALTH: + draw_health_table(); + break; + case BUILD_MENU_VACANT_HOUSE: + draw_housing_table(); + break; + case BUILD_MENU_TEMPLES: + draw_gods_table(); + break; + default: ; + } + if (building_menu_has_changed()) { enable_building_buttons(); } - const int x_offset = calculate_x_offset_sidebar_advanced(); draw_buttons(x_offset); draw_overlay_text(x_offset + 4); widget_minimap_draw_decorated(x_offset + 8, 36 + TOP_MENU_HEIGHT, 187, 143); @@ -279,6 +273,8 @@ int handle_advanced_sidebar_mouse(const mouse *m) if (button_id) { data.focus_button_for_tooltip = button_id + 9; } + + handled |= info_panel_mouse_handle(m); // handled |= image_buttons_handle_mouse(m, x_offset, 24, buttons_build_expanded, 15, &button_id); // if (button_id) { // data.focus_button_for_tooltip = button_id + 19; @@ -320,10 +316,15 @@ static void button_collapse_expand(int param1, int param2) sidebar_next(); } - static void button_build(const int submenu, int param2) { - data.show_info_for = submenu + 1; + if (submenu == BUILD_MENU_VACANT_HOUSE || + submenu == BUILD_MENU_TEMPLES || + submenu == BUILD_MENU_HEALTH){ + + data.show_info_for = submenu; + } + window_build_menu_show(submenu); } From ddb5bf1ae8d793e888c1f866f2715823f1544ee6 Mon Sep 17 00:00:00 2001 From: Rick Neeft Date: Sun, 30 Nov 2025 13:13:03 +0100 Subject: [PATCH 19/20] Education panel --- src/widget/sidebar/advanced/advisors/info.c | 45 +++++++++++++++++++-- src/widget/sidebar/advanced/advisors/info.h | 2 + src/widget/sidebar/advanced/sidebar.c | 11 +++-- 3 files changed, 52 insertions(+), 6 deletions(-) diff --git a/src/widget/sidebar/advanced/advisors/info.c b/src/widget/sidebar/advanced/advisors/info.c index 7e43f70777..eeadb50991 100644 --- a/src/widget/sidebar/advanced/advisors/info.c +++ b/src/widget/sidebar/advanced/advisors/info.c @@ -51,7 +51,6 @@ static image_button health_buttons[] = { {0, 0, 27, 27, IB_NORMAL,0, 0, button_advisor, button_none, 0, 0, 1} }; - static struct { int x_offset; int y_offset; @@ -188,9 +187,49 @@ void draw_health_table(void) y_offset = draw_health_building_info(data.x_offset, y_offset, BUILDING_HOSPITAL, people_covered, city_culture_coverage_hospital()); } -void draw_education_table(const int x_offset, int y_offset) +static int draw_education_section(const int building_type, const int person_coverage, const int population, const int coverage, int y_offset) { - lang_text_draw_amount(8, 18, building_count_total(BUILDING_SCHOOL), 40, 105, FONT_NORMAL_WHITE); + lang_text_draw_amount(8, 18, building_count_total(building_type), data.x_offset, y_offset, FONT_NORMAL_WHITE); + y_offset += LINE_HEIGHT; + + int number = 10; + if (coverage == 0) { + number = 10; + } else if (coverage < 100) { + number = coverage / 10 + 11; + } else { + number = 21; + } + + lang_text_draw(57, number, data.x_offset, y_offset, VALUE_FONT); + y_offset += LINE_HEIGHT; + + y_offset = add_info_number_with_subsection( + person_coverage, + population, + data.x_offset, + y_offset + ); + + y_offset += LINE_HEIGHT; + + return y_offset; +} + +void draw_education_table(void) +{ + place_button_at_bottom(ADVISOR_EDUCATION, MESSAGE_DIALOG_ADVISOR_EDUCATION); + + int y_offset = data.y_offset; + + y_offset = draw_education_section(BUILDING_SCHOOL, city_culture_get_school_person_coverage(), + city_population_school_age(), city_culture_coverage_school(), y_offset); + + y_offset = draw_education_section(BUILDING_ACADEMY, city_culture_get_academy_person_coverage(), + city_population_academy_age(), city_culture_coverage_academy(), y_offset); + + draw_education_section(BUILDING_LIBRARY, city_culture_get_library_person_coverage(), + city_population(), city_culture_coverage_library(), y_offset); } void draw_housing_table(void) diff --git a/src/widget/sidebar/advanced/advisors/info.h b/src/widget/sidebar/advanced/advisors/info.h index cc341a7a24..d8656c0fee 100644 --- a/src/widget/sidebar/advanced/advisors/info.h +++ b/src/widget/sidebar/advanced/advisors/info.h @@ -10,6 +10,8 @@ void draw_gods_table(void); void draw_health_table(void); +void draw_education_table(void); + int info_panel_mouse_handle(const mouse *m); #endif diff --git a/src/widget/sidebar/advanced/sidebar.c b/src/widget/sidebar/advanced/sidebar.c index d9fa7cfb35..36f4eee41c 100644 --- a/src/widget/sidebar/advanced/sidebar.c +++ b/src/widget/sidebar/advanced/sidebar.c @@ -201,6 +201,8 @@ void draw_advanced_sidebar_background(const int x_offset) break; case BUILD_MENU_TEMPLES: draw_gods_table(); + case BUILD_MENU_EDUCATION: + draw_education_table(); break; default: ; } @@ -229,6 +231,9 @@ void draw_advanced_sidebar_foreground(void) case BUILD_MENU_TEMPLES: draw_gods_table(); break; + case BUILD_MENU_EDUCATION: + draw_education_table(); + break; default: ; } @@ -318,14 +323,14 @@ static void button_collapse_expand(int param1, int param2) static void button_build(const int submenu, int param2) { + // TODO: Why? if (submenu == BUILD_MENU_VACANT_HOUSE || submenu == BUILD_MENU_TEMPLES || - submenu == BUILD_MENU_HEALTH){ - + submenu == BUILD_MENU_HEALTH || + submenu == BUILD_MENU_EDUCATION){ data.show_info_for = submenu; } - window_build_menu_show(submenu); } From 7642eb81f1890713299aedd830bacac6b1a6f596 Mon Sep 17 00:00:00 2001 From: Rick Neeft Date: Sun, 30 Nov 2025 13:35:25 +0100 Subject: [PATCH 20/20] Entertainment panel --- src/widget/sidebar/advanced/advisors/info.c | 77 +++++++++++++++++++++ src/widget/sidebar/advanced/advisors/info.h | 2 + src/widget/sidebar/advanced/sidebar.c | 10 ++- 3 files changed, 88 insertions(+), 1 deletion(-) diff --git a/src/widget/sidebar/advanced/advisors/info.c b/src/widget/sidebar/advanced/advisors/info.c index eeadb50991..89a5f257e5 100644 --- a/src/widget/sidebar/advanced/advisors/info.c +++ b/src/widget/sidebar/advanced/advisors/info.c @@ -232,6 +232,83 @@ void draw_education_table(void) city_population(), city_culture_coverage_library(), y_offset); } +static int draw_entertainment_section(const int building_type, const int building_text_number, const int person_coverage, const int population, const int coverage, int y_offset) +{ + const int group = (building_type == BUILDING_TAVERN || building_type == BUILDING_ARENA) ? CUSTOM_TRANSLATION : 8; + lang_text_draw_amount(group, building_text_number, building_count_total(building_type), data.x_offset, y_offset, FONT_NORMAL_WHITE); + y_offset += LINE_HEIGHT; + + int number = 10; + if (coverage == 0) { + number = 10; + } else if (coverage < 100) { + number = coverage / 10 + 11; + } else { + number = 21; + } + + lang_text_draw(57, number, data.x_offset, y_offset, VALUE_FONT); + y_offset += LINE_HEIGHT; + + y_offset = add_info_number_with_subsection( + person_coverage, + population, + data.x_offset, + y_offset + ); + + y_offset += LINE_HEIGHT; + + return y_offset; +} + +void draw_entertainment_table(void) +{ + place_button_at_bottom(ADVISOR_ENTERTAINMENT, MESSAGE_DIALOG_ADVISOR_ENTERTAINMENT); + int y_offset = data.y_offset; + + const int population = city_population(); + + y_offset = draw_entertainment_section( + BUILDING_THEATER, + 34, + city_culture_get_theatre_person_coverage(), + population, + city_culture_coverage_theater(), + y_offset + ); + + y_offset = draw_entertainment_section( + BUILDING_AMPHITHEATER, + 36, + city_culture_get_ampitheatre_person_coverage(), + population, + city_culture_coverage_amphitheater(), + y_offset + ); + + y_offset = draw_entertainment_section( + BUILDING_ARENA, + TR_WINDOW_ADVISOR_ENTERTAINMENT_ARENA_COVERAGE, + city_culture_get_arena_person_coverage(), + population, + city_culture_coverage_arena(), + y_offset + ); + + draw_entertainment_section( + BUILDING_TAVERN, + TR_WINDOW_ADVISOR_ENTERTAINMENT_TAVERN_COVERAGE, + city_culture_get_tavern_person_coverage(), + population, + city_culture_coverage_tavern(), + y_offset + ); + + // colosseum and hippodrome are not included here as they provider global coverage + // and players are expected to know about them from the city +} + void draw_housing_table(void) { place_button_at_bottom(ADVISOR_HOUSING, MESSAGE_DIALOG_ADVISOR_POPULATION); diff --git a/src/widget/sidebar/advanced/advisors/info.h b/src/widget/sidebar/advanced/advisors/info.h index d8656c0fee..689b9fb570 100644 --- a/src/widget/sidebar/advanced/advisors/info.h +++ b/src/widget/sidebar/advanced/advisors/info.h @@ -12,6 +12,8 @@ void draw_health_table(void); void draw_education_table(void); +void draw_entertainment_table(void); + int info_panel_mouse_handle(const mouse *m); #endif diff --git a/src/widget/sidebar/advanced/sidebar.c b/src/widget/sidebar/advanced/sidebar.c index 36f4eee41c..b8e018ad12 100644 --- a/src/widget/sidebar/advanced/sidebar.c +++ b/src/widget/sidebar/advanced/sidebar.c @@ -201,9 +201,13 @@ void draw_advanced_sidebar_background(const int x_offset) break; case BUILD_MENU_TEMPLES: draw_gods_table(); + break; case BUILD_MENU_EDUCATION: draw_education_table(); break; + case BUILD_MENU_ENTERTAINMENT: + draw_entertainment_table(); + break; default: ; } @@ -234,6 +238,9 @@ void draw_advanced_sidebar_foreground(void) case BUILD_MENU_EDUCATION: draw_education_table(); break; + case BUILD_MENU_ENTERTAINMENT: + draw_entertainment_table(); + break; default: ; } @@ -327,7 +334,8 @@ static void button_build(const int submenu, int param2) if (submenu == BUILD_MENU_VACANT_HOUSE || submenu == BUILD_MENU_TEMPLES || submenu == BUILD_MENU_HEALTH || - submenu == BUILD_MENU_EDUCATION){ + submenu == BUILD_MENU_EDUCATION || + submenu == BUILD_MENU_ENTERTAINMENT){ data.show_info_for = submenu; }