update for button rect

This commit is contained in:
sonil 2022-10-31 10:10:48 +08:00
parent b26d19b624
commit 7b689d1bbc
7 changed files with 135 additions and 21 deletions

View File

@ -286,6 +286,11 @@ int showDialogBox(const char* title, const char** body, int bodyLength, int x, i
_colorTable[18979]);
}
Rect offset;
offset.top = -5;
offset.bottom = 5;
offset.left = -18;
offset.right = 82;
int btn = buttonCreate(win,
v27 + 13,
_doneY[dialogType] + 4,
@ -298,7 +303,8 @@ int showDialogBox(const char* title, const char** body, int bodyLength, int x, i
buttonNormalFrmImage.getData(),
buttonPressedFrmImage.getData(),
NULL,
BUTTON_FLAG_TRANSPARENT);
BUTTON_FLAG_TRANSPARENT,
offset);
if (btn != -1) {
buttonSetCallbacks(btn, _gsound_red_butt_press, _gsound_red_butt_release);
}
@ -327,6 +333,11 @@ int showDialogBox(const char* title, const char** body, int bodyLength, int x, i
backgroundFrmImage.getWidth(),
_colorTable[18979]);
Rect offset;
offset.top = -5;
offset.bottom = 5;
offset.left = -17;
offset.right = 82;
int btn = buttonCreate(win,
doneBoxFrmImage.getWidth() + _doneX[dialogType] + 37,
_doneY[dialogType] + 4,
@ -339,7 +350,8 @@ int showDialogBox(const char* title, const char** body, int bodyLength, int x, i
buttonNormalFrmImage.getData(),
buttonPressedFrmImage.getData(),
0,
BUTTON_FLAG_TRANSPARENT);
BUTTON_FLAG_TRANSPARENT,
offset);
if (btn != -1) {
buttonSetCallbacks(btn, _gsound_red_butt_press, _gsound_red_butt_release);
}

View File

@ -3183,13 +3183,19 @@ int _gdialog_barter_create_win()
backgroundFrmImage.unlock();
Rect offset;
offset.top = -7;
offset.bottom = 7;
offset.left = -18;
offset.right = 18;
// TRADE
_gdialog_buttons[0] = buttonCreate(gGameDialogWindow, 41, 163, 14, 14, -1, -1, -1, KEY_LOWERCASE_M, _redButtonNormalFrmImage.getData(), _redButtonPressedFrmImage.getData(), 0, BUTTON_FLAG_TRANSPARENT);
_gdialog_buttons[0] = buttonCreate(gGameDialogWindow, 41, 163, 14, 14, -1, -1, -1, KEY_LOWERCASE_M, _redButtonNormalFrmImage.getData(), _redButtonPressedFrmImage.getData(), 0, BUTTON_FLAG_TRANSPARENT, offset);
if (_gdialog_buttons[0] != -1) {
buttonSetCallbacks(_gdialog_buttons[0], _gsound_med_butt_press, _gsound_med_butt_release);
// TALK
_gdialog_buttons[1] = buttonCreate(gGameDialogWindow, 584, 162, 14, 14, -1, -1, -1, KEY_LOWERCASE_T, _redButtonNormalFrmImage.getData(), _redButtonPressedFrmImage.getData(), 0, BUTTON_FLAG_TRANSPARENT);
_gdialog_buttons[1] = buttonCreate(gGameDialogWindow, 584, 162, 14, 14, -1, -1, -1, KEY_LOWERCASE_T, _redButtonNormalFrmImage.getData(), _redButtonPressedFrmImage.getData(), 0, BUTTON_FLAG_TRANSPARENT, offset);
if (_gdialog_buttons[1] != -1) {
buttonSetCallbacks(_gdialog_buttons[1], _gsound_med_butt_press, _gsound_med_butt_release);
@ -4306,8 +4312,14 @@ int _gdialog_window_create()
_gdialog_scroll_subwin(gGameDialogWindow, 1, backgroundFrmData, v10, 0, _dialogue_subwin_len, 0);
}
Rect offset;
offset.top = -7;
offset.bottom = 7;
offset.left = -18;
offset.right = 18;
// BARTER/TRADE
_gdialog_buttons[0] = buttonCreate(gGameDialogWindow, 593, 41, 14, 14, -1, -1, -1, -1, _redButtonNormalFrmImage.getData(), _redButtonPressedFrmImage.getData(), NULL, BUTTON_FLAG_TRANSPARENT);
_gdialog_buttons[0] = buttonCreate(gGameDialogWindow, 593, 41, 14, 14, -1, -1, -1, -1, _redButtonNormalFrmImage.getData(), _redButtonPressedFrmImage.getData(), NULL, BUTTON_FLAG_TRANSPARENT, offset);
if (_gdialog_buttons[0] != -1) {
buttonSetMouseCallbacks(_gdialog_buttons[0], NULL, NULL, NULL, gameDialogBarterButtonUpMouseUp);
buttonSetCallbacks(_gdialog_buttons[0], _gsound_med_butt_press, _gsound_med_butt_release);

View File

@ -999,6 +999,12 @@ static bool _setup_inventory(int inventoryWindowType)
fid = buildFid(OBJ_TYPE_INTERFACE, 9, 0, 0, 0);
_inventoryFrmImages[1].lock(fid);
Rect offset;
offset.top = -7;
offset.bottom= 7;
offset.left = -95;
offset.right = 20;
if (_inventoryFrmImages[0].isLocked() && _inventoryFrmImages[1].isLocked()) {
btn = -1;
switch (inventoryWindowType) {
@ -1016,7 +1022,8 @@ static bool _setup_inventory(int inventoryWindowType)
_inventoryFrmImages[0].getData(),
_inventoryFrmImages[1].getData(),
NULL,
BUTTON_FLAG_TRANSPARENT);
BUTTON_FLAG_TRANSPARENT,
offset);
break;
case INVENTORY_WINDOW_TYPE_USE_ITEM_ON:
// Cancel button
@ -1032,7 +1039,8 @@ static bool _setup_inventory(int inventoryWindowType)
_inventoryFrmImages[0].getData(),
_inventoryFrmImages[1].getData(),
NULL,
BUTTON_FLAG_TRANSPARENT);
BUTTON_FLAG_TRANSPARENT,
offset);
break;
case INVENTORY_WINDOW_TYPE_LOOT:
// Done button
@ -1048,7 +1056,8 @@ static bool _setup_inventory(int inventoryWindowType)
_inventoryFrmImages[0].getData(),
_inventoryFrmImages[1].getData(),
NULL,
BUTTON_FLAG_TRANSPARENT);
BUTTON_FLAG_TRANSPARENT,
offset);
break;
}
@ -5854,7 +5863,13 @@ static int inventoryQuantityWindowInit(int inventoryWindowType, Object* item)
fid = buildFid(OBJ_TYPE_INTERFACE, 9, 0, 0, 0);
_moveFrmImages[5].lock(fid);
Rect offset;
if (_moveFrmImages[4].isLocked() && _moveFrmImages[5].isLocked()) {
offset.top = -1;
offset.bottom = 1;
offset.left = -80;
offset.right = 10;
// Done
btn = buttonCreate(_mt_wid,
98,
@ -5868,11 +5883,16 @@ static int inventoryQuantityWindowInit(int inventoryWindowType, Object* item)
_moveFrmImages[4].getData(),
_moveFrmImages[5].getData(),
NULL,
BUTTON_FLAG_TRANSPARENT);
BUTTON_FLAG_TRANSPARENT,
offset);
if (btn != -1) {
buttonSetCallbacks(btn, _gsound_red_butt_press, _gsound_red_butt_release);
}
offset.top = -1;
offset.bottom = 1;
offset.left = -10;
offset.right = 80;
// Cancel
btn = buttonCreate(_mt_wid,
148,
@ -5886,7 +5906,8 @@ static int inventoryQuantityWindowInit(int inventoryWindowType, Object* item)
_moveFrmImages[4].getData(),
_moveFrmImages[5].getData(),
NULL,
BUTTON_FLAG_TRANSPARENT);
BUTTON_FLAG_TRANSPARENT,
offset);
if (btn != -1) {
buttonSetCallbacks(btn, _gsound_red_butt_press, _gsound_red_butt_release);
}

View File

@ -1404,6 +1404,12 @@ static int lsgWindowInit(int windowType)
int btn;
Rect offset;
offset.top = -5;
offset.bottom = 5;
offset.left = -12;
offset.right = 72;
btn = buttonCreate(gLoadSaveWindow,
391,
349,
@ -1416,7 +1422,8 @@ static int lsgWindowInit(int windowType)
_loadsaveFrmImages[LOAD_SAVE_FRM_RED_BUTTON_NORMAL].getData(),
_loadsaveFrmImages[LOAD_SAVE_FRM_RED_BUTTON_PRESSED].getData(),
NULL,
BUTTON_FLAG_TRANSPARENT);
BUTTON_FLAG_TRANSPARENT,
offset);
if (btn != -1) {
buttonSetCallbacks(btn, _gsound_red_butt_press, _gsound_red_butt_release);
}
@ -1433,7 +1440,8 @@ static int lsgWindowInit(int windowType)
_loadsaveFrmImages[LOAD_SAVE_FRM_RED_BUTTON_NORMAL].getData(),
_loadsaveFrmImages[LOAD_SAVE_FRM_RED_BUTTON_PRESSED].getData(),
NULL,
BUTTON_FLAG_TRANSPARENT);
BUTTON_FLAG_TRANSPARENT,
offset);
if (btn != -1) {
buttonSetCallbacks(btn, _gsound_red_butt_press, _gsound_red_butt_release);
}
@ -2123,6 +2131,12 @@ static int _GetComment(int a1)
int btn;
// DONE
Rect offset;
offset.top = -5;
offset.bottom = 5;
offset.left = -15;
offset.right = 87;
btn = buttonCreate(window,
34,
58,
@ -2135,7 +2149,8 @@ static int _GetComment(int a1)
_loadsaveFrmImages[LOAD_SAVE_FRM_RED_BUTTON_NORMAL].getData(),
_loadsaveFrmImages[LOAD_SAVE_FRM_RED_BUTTON_PRESSED].getData(),
NULL,
BUTTON_FLAG_TRANSPARENT);
BUTTON_FLAG_TRANSPARENT,
offset);
if (btn == -1) {
buttonSetCallbacks(btn, _gsound_red_butt_press, _gsound_red_butt_release);
}
@ -2153,7 +2168,8 @@ static int _GetComment(int a1)
_loadsaveFrmImages[LOAD_SAVE_FRM_RED_BUTTON_NORMAL].getData(),
_loadsaveFrmImages[LOAD_SAVE_FRM_RED_BUTTON_PRESSED].getData(),
NULL,
BUTTON_FLAG_TRANSPARENT);
BUTTON_FLAG_TRANSPARENT,
offset);
if (btn == -1) {
buttonSetCallbacks(btn, _gsound_red_butt_press, _gsound_red_butt_release);
}

View File

@ -889,6 +889,12 @@ static int mainMenuWindowInit()
offsetX = offsetY = 0;
configGetInt(&gSfallConfig, SFALL_CONFIG_MISC_KEY, SFALL_CONFIG_MAIN_MENU_OFFSET_X_KEY, &offsetX);
configGetInt(&gSfallConfig, SFALL_CONFIG_MISC_KEY, SFALL_CONFIG_MAIN_MENU_OFFSET_Y_KEY, &offsetY);
Rect offset;
offset.top = -2;
offset.bottom = 3;
offset.left = -1;
offset.right = 150;
for (int index = 0; index < MAIN_MENU_BUTTON_COUNT; index++) {
gMainMenuButtons[index] = buttonCreate(gMainMenuWindow,
@ -903,7 +909,8 @@ static int mainMenuWindowInit()
_mainMenuButtonNormalFrmImage.getData(),
_mainMenuButtonPressedFrmImage.getData(),
0,
BUTTON_FLAG_TRANSPARENT);
BUTTON_FLAG_TRANSPARENT,
offset);
if (gMainMenuButtons[index] == -1) {
// NOTE: Uninline.
return main_menu_fatal_error();

View File

@ -1355,6 +1355,39 @@ bool showMesageBox(const char* text)
return true;
}
int buttonCreate(int win, int x, int y, int width, int height, int mouseEnterEventCode, int mouseExitEventCode, int mouseDownEventCode, int mouseUpEventCode, unsigned char* up, unsigned char* dn, unsigned char* hover, int flags,Rect offset)
{
Window* window = windowGetWindow(win);
if (!gWindowSystemInitialized) {
return -1;
}
if (window == NULL) {
return -1;
}
if (up == NULL && (dn != NULL || hover != NULL)) {
return -1;
}
Button* button = buttonCreateInternal(win, x, y, width, height, mouseEnterEventCode, mouseExitEventCode, mouseDownEventCode, mouseUpEventCode, flags | BUTTON_FLAG_0x010000, up, dn, hover);
if (button == NULL) {
return -1;
}
button->clickRect.left += offset.left;
button->clickRect.right += offset.right;
button->clickRect.top += offset.top;
button->clickRect.bottom += offset.bottom;
button->ignoreMask = true;
_button_draw(button, window, button->mouseUpImage, 0, NULL, 0);
return button->id;
}
// 0x4D8260
int buttonCreate(int win, int x, int y, int width, int height, int mouseEnterEventCode, int mouseExitEventCode, int mouseDownEventCode, int mouseUpEventCode, unsigned char* up, unsigned char* dn, unsigned char* hover, int flags)
{
@ -1377,6 +1410,8 @@ int buttonCreate(int win, int x, int y, int width, int height, int mouseEnterEve
return -1;
}
button->ignoreMask = false;
_button_draw(button, window, button->mouseUpImage, 0, NULL, 0);
return button->id;
@ -1657,10 +1692,17 @@ Button* buttonCreateInternal(int win, int x, int y, int width, int height, int m
button->id = buttonId;
button->flags = flags;
button->rect.left = x;
button->rect.top = y;
button->rect.right = x + width - 1;
button->rect.bottom = y + height - 1;
button->clickRect.left = x;
button->clickRect.top = y;
button->clickRect.right = x + width - 1;
button->clickRect.bottom = y + height - 1;
button->mouseEnterEventCode = mouseEnterEventCode;
button->mouseExitEventCode = mouseExitEventCode;
button->lefMouseDownEventCode = mouseDownEventCode;
@ -1731,10 +1773,10 @@ int _GNW_check_buttons(Window* window, int* keyCodePtr)
field_38 = window->field_38;
if (field_34 != NULL) {
rectCopy(&v58, &(field_34->rect));
rectCopy(&v58, &(field_34->clickRect));
rectOffset(&v58, window->rect.left, window->rect.top);
} else if (field_38 != NULL) {
rectCopy(&v58, &(field_38->rect));
rectCopy(&v58, &(field_38->clickRect));
rectOffset(&v58, window->rect.left, window->rect.top);
}
@ -1747,7 +1789,7 @@ int _GNW_check_buttons(Window* window, int* keyCodePtr)
Button* touchButton = window->buttonListHead;
while (touchButton != NULL && gTouch) {
if (!(touchButton->flags & BUTTON_FLAG_DISABLED)) {
if (xx > touchButton->rect.left && xx < touchButton->rect.right && yy > touchButton->rect.top && yy < touchButton->rect.bottom) {
if (xx > touchButton->clickRect.left && xx < touchButton->clickRect.right && yy > touchButton->clickRect.top && yy < touchButton->clickRect.bottom) {
_win_button_press_and_release(touchButton->id);
}
@ -1859,7 +1901,8 @@ int _GNW_check_buttons(Window* window, int* keyCodePtr)
while (button != NULL) {
if (!(button->flags & BUTTON_FLAG_DISABLED)) {
rectCopy(&v58, &(button->rect));
button->mask = NULL;
rectCopy(&v58, &(button->clickRect));
rectOffset(&v58, window->rect.left, window->rect.top);
if (_button_under_mouse(button, &v58)) {
if (!(button->flags & BUTTON_FLAG_DISABLED)) {
@ -2087,7 +2130,7 @@ bool _button_under_mouse(Button* button, Rect* rect)
return false;
}
if (button->mask == NULL) {
if (button->mask == NULL || button->ignoreMask) {
return true;
}

View File

@ -111,6 +111,8 @@ typedef struct Button {
int id;
int flags;
Rect rect;
Rect clickRect;
bool ignoreMask;
int mouseEnterEventCode;
int mouseExitEventCode;
int lefMouseDownEventCode;
@ -180,6 +182,7 @@ int _GNW_check_menu_bars(int a1);
void programWindowSetTitle(const char* title);
bool showMesageBox(const char* str);
int buttonCreate(int win, int x, int y, int width, int height, int mouseEnterEventCode, int mouseExitEventCode, int mouseDownEventCode, int mouseUpEventCode, unsigned char* up, unsigned char* dn, unsigned char* hover, int flags);
int buttonCreate(int win, int x, int y, int width, int height, int mouseEnterEventCode, int mouseExitEventCode, int mouseDownEventCode, int mouseUpEventCode, unsigned char* up, unsigned char* dn, unsigned char* hover, int flags,Rect offset);
int _win_register_text_button(int win, int x, int y, int mouseEnterEventCode, int mouseExitEventCode, int mouseDownEventCode, int mouseUpEventCode, const char* title, int flags);
int _win_register_button_disable(int btn, unsigned char* up, unsigned char* down, unsigned char* hover);
int _win_register_button_image(int btn, unsigned char* up, unsigned char* down, unsigned char* hover, int a5);