diff options
-rw-r--r-- | src/player_gui.cpp | 57 |
1 files changed, 48 insertions, 9 deletions
diff --git a/src/player_gui.cpp b/src/player_gui.cpp index 0bf6815e8..c9503123c 100644 --- a/src/player_gui.cpp +++ b/src/player_gui.cpp @@ -40,8 +40,12 @@ struct facesel_d { }; assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(facesel_d)); -static void DoShowPlayerFinances(PlayerID player, bool show_small, bool show_stickied); -static void DoSelectPlayerFace(PlayerID player, bool show_big); +enum { + FIRST_GUI_CALL = INT_MAX, ///< default value to specify thuis is the first call of the resizable gui +}; + +static void DoShowPlayerFinances(PlayerID player, bool show_small, bool show_stickied, int top = FIRST_GUI_CALL, int left = FIRST_GUI_CALL); +static void DoSelectPlayerFace(PlayerID player, bool show_big, int top = FIRST_GUI_CALL, int left = FIRST_GUI_CALL); static void DrawPlayerEconomyStats(const Player *p, byte mode) { @@ -188,10 +192,15 @@ static void PlayerFinancesWndProc(Window *w, WindowEvent *e) case PFW_WIDGET_TOGGLE_SIZE: {/* toggle size */ byte mode = (byte)WP(w, def_d).data_1; bool stickied = !!(w->flags4 & WF_STICKY); + int oldtop = w->top; ///< current top position of the window before closing it + int oldleft = w->left; ///< current left position of the window before closing it PlayerID player = (PlayerID)w->window_number; + DeleteWindow(w); - DoShowPlayerFinances(player, !HasBit(mode, 0), stickied); - } break; + /* Open up the (toggled size) Finance window at the same position as the previous */ + DoShowPlayerFinances(player, !HasBit(mode, 0), stickied, oldtop, oldleft); + } + break; case PFW_WIDGET_INCREASE_LOAN: /* increase loan */ DoCommandP(0, 0, _ctrl_pressed, NULL, CMD_INCREASE_LOAN | CMD_MSG(STR_702C_CAN_T_BORROW_ANY_MORE_MONEY)); @@ -221,7 +230,18 @@ static const WindowDesc _player_finances_small_desc = { PlayerFinancesWndProc }; -static void DoShowPlayerFinances(PlayerID player, bool show_small, bool show_stickied) +/** + * Open the small/large finance window of the player + * + * @param player the player who's finances are requested to be seen + * @param show_small show large or small version opf the window + * @param show_stickied previous "stickyness" of the window + * @param top previous top position of the window + * @param left previous left position of the window + * + * @pre is player a valid player + */ +static void DoShowPlayerFinances(PlayerID player, bool show_small, bool show_stickied, int top, int left) { if (!IsValidPlayer(player)) return; @@ -229,7 +249,14 @@ static void DoShowPlayerFinances(PlayerID player, bool show_small, bool show_sti if (w != NULL) { w->caption_color = w->window_number; WP(w, def_d).data_1 = show_small; + if (show_stickied) w->flags4 |= WF_STICKY; + + /* Check if repositioning from default is required */ + if (top != FIRST_GUI_CALL && left != FIRST_GUI_CALL) { + w->top = top; + w->left = left; + } } } @@ -811,11 +838,15 @@ static void SelectPlayerFaceWndProc(Window *w, WindowEvent *e) switch (e->we.click.widget) { /* Toggle size, advanced/simple face selection */ case PFW_WIDGET_TOGGLE_LARGE_SMALL: - case PFW_WIDGET_TOGGLE_LARGE_SMALL_BUTTON: + case PFW_WIDGET_TOGGLE_LARGE_SMALL_BUTTON: { + int oldtop = w->top; ///< current top position of the window before closing it + int oldleft = w->left; ///< current top position of the window before closing it + DoCommandP(0, 0, *pf, NULL, CMD_SET_PLAYER_FACE); DeleteWindow(w); - DoSelectPlayerFace((PlayerID)w->window_number, !WP(w, facesel_d).advanced); - break; + /* Open up the (toggled size) Face selection window at the same position as the previous */ + DoSelectPlayerFace((PlayerID)w->window_number, !WP(w, facesel_d).advanced, oldtop, oldleft); + } break; /* Cancel button */ case PFW_WIDGET_CANCEL: @@ -949,10 +980,12 @@ static const WindowDesc _select_player_face_adv_desc = { * * @param player the player which face shall be edited * @param adv simple or advanced player face selection window + * @param top previous top position of the window + * @param left previous left position of the window * * @pre is player a valid player */ -static void DoSelectPlayerFace(PlayerID player, bool adv) +static void DoSelectPlayerFace(PlayerID player, bool adv, int top, int left) { if (!IsValidPlayer(player)) return; @@ -962,6 +995,12 @@ static void DoSelectPlayerFace(PlayerID player, bool adv) w->caption_color = w->window_number; WP(w, facesel_d).face = GetPlayer((PlayerID)w->window_number)->face; WP(w, facesel_d).advanced = adv; + + /* Check if repositioning from default is required */ + if (top != FIRST_GUI_CALL && left != FIRST_GUI_CALL) { + w->top = top; + w->left = left; + } } } |