summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/player_gui.cpp57
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;
+ }
}
}