X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fscreens.c;h=5195cacd33776452acc609b371898fa2ad5b7e3c;hp=c8324210de2648e2cec37e8865946783b2148b0b;hb=dc0d3a4edd8a5b989f6fcd89e48a77b4ca590df4;hpb=7270af24b41bc33fbb89a97227a7696e343eacbb diff --git a/src/screens.c b/src/screens.c index c8324210..5195cacd 100644 --- a/src/screens.c +++ b/src/screens.c @@ -523,6 +523,9 @@ static struct ValueTextInfo grid_sizes_list[] = { -1, NULL }, }; +static int align_xoffset = 0; +static int align_yoffset = 0; + #define DRAW_MODE(s) ((s) >= GAME_MODE_MAIN && \ (s) <= GAME_MODE_SETUP ? (s) : \ (s) == GAME_MODE_PSEUDO_TYPENAME ? \ @@ -579,6 +582,9 @@ static struct ValueTextInfo grid_sizes_list[] = #define mSX (SX + DRAW_XOFFSET(game_status)) #define mSY (SY + DRAW_YOFFSET(game_status)) +#define amSX (mSX + align_xoffset) +#define amSY (mSY + align_yoffset) + #define NUM_MENU_ENTRIES_ON_SCREEN (menu.list_size[game_status] > 2 ? \ menu.list_size[game_status] : \ MAX_MENU_ENTRIES_ON_SCREEN) @@ -1364,8 +1370,8 @@ static void clearMenuListArea(void) static void drawCursorExt(int xpos, int ypos, boolean active, int graphic) { static int cursor_array[MAX_LEV_FIELDY]; - int x = mSX + TILEX * xpos; - int y = mSY + TILEY * (MENU_SCREEN_START_YPOS + ypos); + int x = amSX + TILEX * xpos; + int y = amSY + TILEY * (MENU_SCREEN_START_YPOS + ypos); if (xpos == 0) { @@ -3990,6 +3996,51 @@ void HandleTypeName(int newxpos, Key key) // tree menu functions // ============================================================================ +static int getAlignXOffsetFromTreeInfo(TreeInfo *ti) +{ + if (game_status != GAME_MODE_SETUP || + DRAW_MODE_SETUP(setup_mode) != SETUP_MODE_CHOOSE_OTHER) + return 0; + + int max_text_size = 0; + TreeInfo *node; + + for (node = getTreeInfoFirstGroupEntry(ti); node != NULL; node = node->next) + max_text_size = MAX(max_text_size, strlen(node->name)); + + int num_entries = numTreeInfoInGroup(ti); + boolean scrollbar_needed = (num_entries > NUM_MENU_ENTRIES_ON_SCREEN); + int text_width = max_text_size * getFontWidth(FONT_TEXT_1); + int button_width = SC_MENUBUTTON_XSIZE; + int scrollbar_xpos = SC_SCROLLBAR_XPOS + menu.scrollbar_xoffset; + int screen_width = (scrollbar_needed ? scrollbar_xpos : SXSIZE); + int align = menu.list_setup[SETUP_MODE_CHOOSE_OTHER].align; + int x = ALIGNED_XPOS(0, screen_width, align) * -1; + int align_xoffset_raw = ALIGNED_XPOS(x, button_width + text_width, align); + int align_xoffset = MAX(0, align_xoffset_raw); + + return align_xoffset; +} + +static int getAlignYOffsetFromTreeInfo(TreeInfo *ti) +{ + if (game_status != GAME_MODE_SETUP || + DRAW_MODE_SETUP(setup_mode) != SETUP_MODE_CHOOSE_OTHER) + return 0; + + int num_entries = numTreeInfoInGroup(ti); + int num_page_entries = MIN(num_entries, NUM_MENU_ENTRIES_ON_SCREEN); + int font_height = getFontHeight(FONT_TEXT_1); + int text_height = font_height * num_page_entries; + int page_height = font_height * NUM_MENU_ENTRIES_ON_SCREEN; + int align = menu.list_setup[SETUP_MODE_CHOOSE_OTHER].valign; + int y = ALIGNED_YPOS(0, page_height, align) * -1; + int align_yoffset_raw = ALIGNED_YPOS(y, text_height, align); + int align_yoffset = MAX(0, align_yoffset_raw); + + return align_yoffset; +} + static void DrawChooseTree(TreeInfo **ti_ptr) { int fade_mask = REDRAW_FIELD; @@ -4036,6 +4087,12 @@ static void DrawChooseTree(TreeInfo **ti_ptr) static void drawChooseTreeList(int first_entry, int num_page_entries, TreeInfo *ti) { + int num_entries = numTreeInfoInGroup(ti); + boolean scrollbar_needed = (num_entries > NUM_MENU_ENTRIES_ON_SCREEN); + int scrollbar_xpos = SC_SCROLLBAR_XPOS + menu.scrollbar_xoffset; + int screen_width = (scrollbar_needed ? scrollbar_xpos : SXSIZE); + int font_nr = FONT_TEXT_1; + int font_xoffset = getFontBitmapInfo(font_nr)->draw_xoffset; int i; char *title_string = NULL; int yoffset_sets = MENU_TITLE1_YPOS; @@ -4055,14 +4112,12 @@ static void drawChooseTreeList(int first_entry, int num_page_entries, int entry_pos = first_entry + i; int xpos = MENU_SCREEN_START_XPOS; int ypos = MENU_SCREEN_START_YPOS + i; - int startx = mSX + xpos * 32; - int starty = mSY + ypos * 32; - int font_nr = FONT_TEXT_1; - int font_xoffset = getFontBitmapInfo(font_nr)->draw_xoffset; + int startx = amSX + xpos * 32; + int starty = amSY + ypos * 32; int startx_text = startx + font_xoffset; - int startx_scrollbar = mSX + SC_SCROLLBAR_XPOS + menu.scrollbar_xoffset; - int text_size = startx_scrollbar - startx_text; - int max_buffer_len = text_size / getFontWidth(font_nr); + int endx_text = amSX + screen_width; + int max_text_size = endx_text - startx_text; + int max_buffer_len = max_text_size / getFontWidth(font_nr); char buffer[max_buffer_len + 1]; node_first = getTreeInfoFirstGroupEntry(ti); @@ -4140,6 +4195,9 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, int num_entries = numTreeInfoInGroup(ti); int entry_pos = posTreeInfo(ti); + align_xoffset = getAlignXOffsetFromTreeInfo(ti); + align_yoffset = getAlignYOffsetFromTreeInfo(ti); + if (ti->cl_first == -1) { // only on initialization @@ -4224,8 +4282,8 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, if (mx || my) // mouse input { - x = (mx - mSX) / 32; - y = (my - mSY) / 32 - MENU_SCREEN_START_YPOS; + x = (mx - amSX) / 32; + y = (my - amSY) / 32 - MENU_SCREEN_START_YPOS; } else if (dx || dy) // keyboard or scrollbar/scrollbutton input { @@ -8064,6 +8122,9 @@ void ConfigureVirtualButtons(void) void DrawSetupScreen(void) { + align_xoffset = 0; + align_yoffset = 0; + if (setup_mode == SETUP_MODE_INPUT) DrawSetupScreen_Input(); else if (setup_mode == SETUP_MODE_CHOOSE_GAME_SPEED)