1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 11:03:00 +01:00

Refactor title editor window

This commit is contained in:
Ted John
2016-11-26 14:10:44 +00:00
parent afdd45f3cc
commit 20d2ff56f8

View File

@@ -274,83 +274,75 @@ void window_title_editor_open(int tab)
static void window_title_editor_close(rct_window *w)
{
rct_window *command_editor_w, *load_save_w;
// Close the related windows
command_editor_w = window_find_by_class(WC_TITLE_COMMAND_EDITOR);
load_save_w = window_find_by_class(WC_LOADSAVE);
if (command_editor_w)
window_close(command_editor_w);
if (load_save_w && gLoadSaveTitleSequenceSave)
window_close(load_save_w);
window_close_by_class(WC_TITLE_COMMAND_EDITOR);
if (gLoadSaveTitleSequenceSave) {
window_close_by_class(WC_LOADSAVE);
}
}
static void window_title_editor_mouseup(rct_window *w, int widgetIndex)
{
char path[MAX_PATH];
int defaultPreset, playing, inTitle, i, commandEditorOpen;
defaultPreset = (gCurrentTitleSequence < TITLE_SEQUENCE_DEFAULT_PRESETS);
playing = (gCurrentTitleSequence == gCurrentPreviewTitleSequence) && ((gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) == SCREEN_FLAGS_TITLE_DEMO);
inTitle = ((gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) == SCREEN_FLAGS_TITLE_DEMO);
commandEditorOpen = (window_find_by_class(WC_TITLE_COMMAND_EDITOR) != NULL);
bool readOnly = (gCurrentTitleSequence < TITLE_SEQUENCE_DEFAULT_PRESETS);
bool playing = (gCurrentTitleSequence == gCurrentPreviewTitleSequence) && ((gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) == SCREEN_FLAGS_TITLE_DEMO);
bool inTitle = ((gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) == SCREEN_FLAGS_TITLE_DEMO);
bool commandEditorOpen = (window_find_by_class(WC_TITLE_COMMAND_EDITOR) != NULL);
switch (widgetIndex) {
case WIDX_TITLE_EDITOR_CLOSE:
window_close(w);
break;
case WIDX_TITLE_EDITOR_NEW_BUTTON:
commandEditorOpen *= 2;
if (!commandEditorOpen)
if (!commandEditorOpen) {
// TODO: This should probably be 'NEW'
window_text_input_open(w, widgetIndex, STR_TITLE_EDITOR_ACTION_DUPLICATE, STR_TITLE_EDITOR_ENTER_NAME_FOR_SEQUENCE, STR_NONE, 0, 64);
}
break;
case WIDX_TITLE_EDITOR_DUPLICATE_BUTTON:
commandEditorOpen *= 2;
if (!commandEditorOpen)
if (!commandEditorOpen) {
window_text_input_open(w, widgetIndex, STR_TITLE_EDITOR_ACTION_DUPLICATE, STR_TITLE_EDITOR_ENTER_NAME_FOR_SEQUENCE, STR_STRING, (uintptr_t)_loadedTitleSequence->Name, 64);
}
break;
case WIDX_TITLE_EDITOR_DELETE_BUTTON:
defaultPreset *= 2; commandEditorOpen *= 2;
if (!defaultPreset && !commandEditorOpen)
if (!readOnly && !commandEditorOpen) {
title_sequence_delete_preset(gCurrentTitleSequence);
}
break;
case WIDX_TITLE_EDITOR_RENAME_BUTTON:
defaultPreset *= 2; commandEditorOpen *= 2;
if (!defaultPreset && !commandEditorOpen)
if (!readOnly && !commandEditorOpen) {
window_text_input_open(w, widgetIndex, STR_TRACK_MANAGE_RENAME, STR_TITLE_EDITOR_ENTER_NAME_FOR_SEQUENCE, STR_STRING, (uintptr_t)_loadedTitleSequence->Name, 64);
}
break;
case WIDX_TITLE_EDITOR_ADD:
defaultPreset *= 2; playing *= 2; commandEditorOpen *= 2;
if (!defaultPreset && !playing && !commandEditorOpen) {
if (!readOnly && !playing && !commandEditorOpen) {
window_loadsave_open(LOADSAVETYPE_LOAD | LOADSAVETYPE_GAME, NULL);
gLoadSaveTitleSequenceSave = true;
}
break;
case WIDX_TITLE_EDITOR_REMOVE:
defaultPreset *= 2; playing *= 2; commandEditorOpen *= 2;
if (!defaultPreset && !playing && !commandEditorOpen) {
if (!readOnly && !playing && !commandEditorOpen) {
if (w->selected_list_item != -1) {
title_sequence_remove_save(gCurrentTitleSequence, w->selected_list_item);
if (w->selected_list_item > 0)
if (w->selected_list_item > 0) {
w->selected_list_item--;
else if (w->selected_list_item > (sint16)_loadedTitleSequence->NumSaves)
} else if (w->selected_list_item > (sint16)_loadedTitleSequence->NumSaves) {
w->selected_list_item = (sint16)(_loadedTitleSequence->NumSaves - 1);
}
}
}
break;
case WIDX_TITLE_EDITOR_RENAME:
defaultPreset *= 2; playing *= 2; commandEditorOpen *= 2;
if (!defaultPreset && !playing && !commandEditorOpen) {
if (w->selected_list_item != -1)
if (!readOnly && !playing && !commandEditorOpen) {
if (w->selected_list_item != -1) {
window_text_input_open(w, widgetIndex, STR_FILEBROWSER_RENAME_SAVE_TITLE, STR_TITLE_EDITOR_ENTER_NAME_FOR_SAVE, STR_STRING, (uintptr_t)_loadedTitleSequence->Saves[w->selected_list_item], 52 - 1);
}
}
break;
case WIDX_TITLE_EDITOR_LOAD:
if (w->selected_list_item != -1) {
utf8 path[MAX_PATH];
if (str_is_null_or_empty(_loadedTitleSequence->Path)) {
safe_strcpy(path, _loadedTitleSequence->Path, sizeof(path));
}
else {
} else {
// TODO: This should probably use a constant
platform_get_user_directory(path, "title sequences", sizeof(path));
safe_strcat_path(path, _loadedTitleSequence->Name, sizeof(path));
@@ -362,35 +354,34 @@ static void window_title_editor_mouseup(rct_window *w, int widgetIndex)
}
break;
case WIDX_TITLE_EDITOR_INSERT:
defaultPreset *= 2; playing *= 2; commandEditorOpen *= 2;
if (!defaultPreset && !playing && !commandEditorOpen) {
if (w->selected_list_item != -1)
if (!readOnly && !playing && !commandEditorOpen) {
if (w->selected_list_item != -1) {
window_title_command_editor_open(w->selected_list_item + 1, true);
else
} else {
window_title_command_editor_open((int)_loadedTitleSequence->NumCommands, true);
}
}
break;
case WIDX_TITLE_EDITOR_EDIT:
defaultPreset *= 2; playing *= 2; commandEditorOpen *= 2;
if (!defaultPreset && !playing && !commandEditorOpen) {
if (w->selected_list_item != -1 && w->selected_list_item < (sint16)_loadedTitleSequence->NumCommands)
if (!readOnly && !playing && !commandEditorOpen) {
if (w->selected_list_item != -1 && w->selected_list_item < (sint16)_loadedTitleSequence->NumCommands) {
window_title_command_editor_open(w->selected_list_item, false);
}
}
break;
case WIDX_TITLE_EDITOR_DELETE:
defaultPreset *= 2; playing *= 2; commandEditorOpen *= 2;
if (!defaultPreset && !playing && !commandEditorOpen) {
if (!readOnly && !playing && !commandEditorOpen) {
if (w->selected_list_item != -1 && w->selected_list_item < (sint16)_loadedTitleSequence->NumCommands) {
title_sequence_delete_command(gCurrentTitleSequence, w->selected_list_item);
if (w->selected_list_item > 0)
if (w->selected_list_item > 0) {
w->selected_list_item--;
else if (w->selected_list_item >= (sint16)_loadedTitleSequence->NumCommands)
} else if (w->selected_list_item >= (sint16)_loadedTitleSequence->NumCommands) {
w->selected_list_item = (sint16)(_loadedTitleSequence->NumCommands - 1);
}
}
}
break;
/*case WIDX_TITLE_EDITOR_RELOAD:
playing *= 2; commandEditorOpen *= 2;
if (!playing && !commandEditorOpen) {
//title_sequence_open
}
@@ -401,7 +392,7 @@ static void window_title_editor_mouseup(rct_window *w, int widgetIndex)
gTitleScriptCommand = 0;
}
if (gTitleScriptCommand != w->selected_list_item) {
for (i = gTitleScriptCommand + 1; i < (int)_loadedTitleSequence->NumCommands; i++) {
for (int i = gTitleScriptCommand + 1; i < (int)_loadedTitleSequence->NumCommands; i++) {
if (_loadedTitleSequence->Commands[i].Type == TITLE_SCRIPT_LOAD ||
_loadedTitleSequence->Commands[i].Type == TITLE_SCRIPT_LOADMM) {
gTitleScriptSkipLoad = i;
@@ -415,8 +406,7 @@ static void window_title_editor_mouseup(rct_window *w, int widgetIndex)
}
break;
case WIDX_TITLE_EDITOR_MOVE_DOWN:
defaultPreset *= 2; playing *= 2; commandEditorOpen *= 2;
if (!defaultPreset && !playing && !commandEditorOpen) {
if (!readOnly && !playing && !commandEditorOpen) {
if (w->selected_list_item != -1 && w->selected_list_item < (sint16)_loadedTitleSequence->NumCommands - 1) {
title_sequence_move_down_command(gCurrentTitleSequence, w->selected_list_item);
w->selected_list_item++;
@@ -424,8 +414,7 @@ static void window_title_editor_mouseup(rct_window *w, int widgetIndex)
}
break;
case WIDX_TITLE_EDITOR_MOVE_UP:
defaultPreset *= 2; playing *= 2; commandEditorOpen *= 2;
if (!defaultPreset && !playing && !commandEditorOpen) {
if (!readOnly && !playing && !commandEditorOpen) {
if (w->selected_list_item != -1 && w->selected_list_item > 0) {
title_sequence_move_up_command(gCurrentTitleSequence, w->selected_list_item);
w->selected_list_item--;
@@ -446,6 +435,7 @@ static void window_title_editor_mouseup(rct_window *w, int widgetIndex)
break;
case WIDX_TITLE_EDITOR_SKIP:
if (playing) {
int i;
for (i = gTitleScriptCommand; i < (int)_loadedTitleSequence->NumCommands; i++) {
if (_loadedTitleSequence->Commands[i].Type == TITLE_SCRIPT_LOAD ||
_loadedTitleSequence->Commands[i].Type == TITLE_SCRIPT_LOADMM
@@ -469,107 +459,62 @@ static void window_title_editor_mouseup(rct_window *w, int widgetIndex)
}
break;
}
if (defaultPreset == 2)
if (readOnly == 2) {
window_error_open(STR_ERROR_CANT_CHANGE_TITLE_SEQUENCE, STR_NONE);
else if (commandEditorOpen == 2)
} else if (commandEditorOpen == 2) {
window_error_open(STR_TITLE_EDITOR_ERR_CANT_CHANGE_WHILE_EDITOR_IS_OPEN, STR_NONE);
else if (playing == 2)
} else if (playing == 2) {
window_error_open(STR_TITLE_EDITOR_ERR_CANT_EDIT_WHILE_PLAYING, STR_TITLE_EDITOR_PRESS_STOP_TO_CONTINUE_EDITING);
}
}
static void window_title_editor_resize(rct_window *w)
{
if (w->selected_tab == WINDOW_TITLE_EDITOR_TAB_PRESETS) {
w->min_width = WW;
w->min_height = WH2;
w->max_width = WW;
w->max_height = WH2;
if (w->width < w->min_width) {
w->width = w->min_width;
gfx_invalidate_screen();
}
if (w->height < w->min_height) {
w->height = w->min_height;
gfx_invalidate_screen();
}
if (w->width > w->max_width) {
w->width = w->max_width;
gfx_invalidate_screen();
}
if (w->height > w->max_height) {
w->height = w->max_height;
gfx_invalidate_screen();
}
}
else {
w->min_width = WW;
w->min_height = WH;
w->max_width = 500;
w->max_height = 580;
if (w->width < w->min_width) {
w->width = w->min_width;
window_invalidate(w);
}
if (w->height < w->min_height) {
w->height = w->min_height;
window_invalidate(w);
}
if (w->width > w->max_width) {
w->width = w->max_width;
window_invalidate(w);
}
if (w->height > w->max_height) {
w->height = w->max_height;
window_invalidate(w);
}
window_set_resize(w, WW, WH, WH2, WH2);
} else {
window_set_resize(w, WW, WH, 500, 580);
}
}
static void window_title_editor_mousedown(int widgetIndex, rct_window* w, rct_widget* widget)
{
short newSelectedTab;
int num_items, i;
switch (widgetIndex) {
case WIDX_TITLE_EDITOR_PRESETS_TAB:
case WIDX_TITLE_EDITOR_SAVES_TAB:
case WIDX_TITLE_EDITOR_SCRIPT_TAB:
newSelectedTab = widgetIndex - WIDX_TITLE_EDITOR_PRESETS_TAB;
if (w->selected_tab == newSelectedTab)
break;
w->selected_tab = newSelectedTab;
w->selected_list_item = -1;
_window_title_editor_highlighted_index = -1;
w->scrolls[0].v_top = 0;
w->frame_no = 0;
window_event_resize_call(w);
window_invalidate(w);
{
int newSelectedTab = widgetIndex - WIDX_TITLE_EDITOR_PRESETS_TAB;
if (w->selected_tab != newSelectedTab) {
w->selected_tab = newSelectedTab;
w->selected_list_item = -1;
_window_title_editor_highlighted_index = -1;
w->scrolls[0].v_top = 0;
w->frame_no = 0;
window_event_resize_call(w);
window_invalidate(w);
}
break;
}
case WIDX_TITLE_EDITOR_PRESETS_DROPDOWN:
if (window_find_by_class(WC_TITLE_COMMAND_EDITOR) != NULL) {
window_error_open(STR_TITLE_EDITOR_ERR_CANT_CHANGE_WHILE_EDITOR_IS_OPEN, STR_NONE);
}
else {
num_items = (int)title_sequence_manager_get_count();
widget--;
for (i = 0; i < num_items; i++) {
} else {
int numItems = (int)title_sequence_manager_get_count();
for (int i = 0; i < numItems; i++) {
gDropdownItemsFormat[i] = STR_OPTIONS_DROPDOWN_ITEM;
gDropdownItemsArgs[i] = (uintptr_t)title_sequence_manager_get_name(i);
}
widget--;
window_dropdown_show_text_custom_width(
w->x + widget->left,
w->y + widget->top,
widget->bottom - widget->top + 1,
w->colours[1],
DROPDOWN_FLAG_STAY_OPEN,
num_items,
widget->right - widget->left - 3
);
numItems,
widget->right - widget->left - 3);
dropdown_set_checked(gCurrentTitleSequence, true);
}
break;
@@ -593,8 +538,9 @@ static void window_title_editor_dropdown(rct_window *w, int widgetIndex, int dro
static void window_title_editor_update(rct_window *w)
{
w->frame_no++;
if (w->frame_no >= window_title_editor_tab_animation_loops[w->selected_tab])
if (w->frame_no >= window_title_editor_tab_animation_loops[w->selected_tab]) {
w->frame_no = 0;
}
if (!widget_is_highlighted(w, WIDX_TITLE_EDITOR_LIST)) {
_window_title_editor_highlighted_index = -1;
@@ -607,15 +553,17 @@ static void window_title_editor_update(rct_window *w)
static void window_title_editor_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height)
{
size_t lineCount = 1;
if (w->selected_tab == WINDOW_TITLE_EDITOR_TAB_SAVES)
if (w->selected_tab == WINDOW_TITLE_EDITOR_TAB_SAVES) {
lineCount = _loadedTitleSequence->NumSaves;
else if (w->selected_tab == WINDOW_TITLE_EDITOR_TAB_SCRIPT)
} else if (w->selected_tab == WINDOW_TITLE_EDITOR_TAB_SCRIPT) {
lineCount = _loadedTitleSequence->NumCommands;
}
*height = (int)(lineCount * ROW_HEIGHT);
int i = *height - window_title_editor_widgets[WIDX_TITLE_EDITOR_LIST].bottom + window_title_editor_widgets[WIDX_TITLE_EDITOR_LIST].top + 21;
if (i < 0)
if (i < 0) {
i = 0;
}
if (i < w->scrolls[0].v_top) {
w->scrolls[0].v_top = i;
window_invalidate(w);
@@ -626,9 +574,7 @@ static void window_title_editor_scrollgetsize(rct_window *w, int scrollIndex, in
static void window_title_editor_scrollmousedown(rct_window *w, int scrollIndex, int x, int y)
{
int index;
index = y / ROW_HEIGHT;
int index = y / ROW_HEIGHT;
w->selected_list_item = -1;
switch (w->selected_tab) {
case WINDOW_TITLE_EDITOR_TAB_SAVES:
@@ -648,9 +594,7 @@ static void window_title_editor_scrollmousedown(rct_window *w, int scrollIndex,
static void window_title_editor_scrollmouseover(rct_window *w, int scrollIndex, int x, int y)
{
int index;
index = y / ROW_HEIGHT;
int index = y / ROW_HEIGHT;
switch (w->selected_tab) {
case WINDOW_TITLE_EDITOR_TAB_SAVES:
if (index < (int)_loadedTitleSequence->NumSaves)
@@ -661,16 +605,14 @@ static void window_title_editor_scrollmouseover(rct_window *w, int scrollIndex,
_window_title_editor_highlighted_index = (sint16)index;
break;
}
// This check is disabled since for some reason it creates a problem with highlighting index 1
//if (oldHighlightedIndex != _window_title_editor_highlighted_index) {
widget_invalidate(w, WIDX_TITLE_EDITOR_LIST);
//}
}
static void window_title_editor_textinput(rct_window *w, int widgetIndex, char *text)
{
if (text == NULL || text[0] == 0)
if (str_is_null_or_empty(text)) {
return;
}
switch (widgetIndex) {
case WIDX_TITLE_EDITOR_NEW_BUTTON:
@@ -680,21 +622,17 @@ static void window_title_editor_textinput(rct_window *w, int widgetIndex, char *
if (!title_sequence_name_exists(text)) {
if (widgetIndex == WIDX_TITLE_EDITOR_NEW_BUTTON) {
title_sequence_create_preset(text);
}
else if (widgetIndex == WIDX_TITLE_EDITOR_DUPLICATE_BUTTON) {
} else if (widgetIndex == WIDX_TITLE_EDITOR_DUPLICATE_BUTTON) {
title_sequence_duplicate_preset(gCurrentTitleSequence, text);
}
else {
} else {
title_sequence_rename_preset(gCurrentTitleSequence, text);
}
config_save_default();
window_invalidate(w);
}
else {
} else {
window_error_open(STR_ERROR_EXISTING_NAME, STR_NONE);
}
}
else {
} else {
window_error_open(STR_ERROR_INVALID_CHARACTERS, STR_NONE);
}
break;
@@ -704,12 +642,10 @@ static void window_title_editor_textinput(rct_window *w, int widgetIndex, char *
title_sequence_rename_save(gCurrentTitleSequence, w->selected_list_item, text);
TileSequenceSave(_loadedTitleSequence);
window_invalidate(w);
}
else {
} else {
window_error_open(STR_ERROR_EXISTING_NAME, STR_NONE);
}
}
else {
} else {
window_error_open(STR_ERROR_INVALID_CHARACTERS, STR_NONE);
}
break;
@@ -811,19 +747,18 @@ static void window_title_editor_invalidate(rct_window *w)
window_title_editor_widgets[WIDX_TITLE_EDITOR_SKIP].top = w->height - 32;
window_title_editor_widgets[WIDX_TITLE_EDITOR_SKIP].bottom = w->height - 16;
int playing, inTitle;
playing = (gCurrentTitleSequence == gCurrentPreviewTitleSequence) && ((gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) == SCREEN_FLAGS_TITLE_DEMO);
inTitle = ((gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) == SCREEN_FLAGS_TITLE_DEMO);
if (!inTitle)
int playing = (gCurrentTitleSequence == gCurrentPreviewTitleSequence) && ((gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) == SCREEN_FLAGS_TITLE_DEMO);
int inTitle = ((gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) == SCREEN_FLAGS_TITLE_DEMO);
if (!inTitle) {
w->disabled_widgets |= (1 << WIDX_TITLE_EDITOR_PLAY);
else
} else {
w->disabled_widgets &= ~(1 << WIDX_TITLE_EDITOR_PLAY);
if (!playing)
}
if (!playing) {
w->disabled_widgets |= (1 << WIDX_TITLE_EDITOR_REPLAY) | (1 << WIDX_TITLE_EDITOR_STOP) | (1 << WIDX_TITLE_EDITOR_SKIP) | (1 << WIDX_TITLE_EDITOR_SKIP_TO);
else
} else {
w->disabled_widgets &= ~((1 << WIDX_TITLE_EDITOR_REPLAY) | (1 << WIDX_TITLE_EDITOR_STOP) | (1 << WIDX_TITLE_EDITOR_SKIP) | (1 << WIDX_TITLE_EDITOR_SKIP_TO));
}
}
static void window_title_editor_paint(rct_window *w, rct_drawpixelinfo *dpi)
@@ -835,7 +770,6 @@ static void window_title_editor_paint(rct_window *w, rct_drawpixelinfo *dpi)
// Draw strings
switch (w->selected_tab) {
case WINDOW_TITLE_EDITOR_TAB_PRESETS:
set_format_arg(0, uintptr_t, _loadedTitleSequence->Name);
gfx_draw_string_left(dpi, STR_TITLE_SEQUENCE, NULL, w->colours[1], w->x + 10, w->y + window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS].top + 1);
gfx_draw_string_left_clipped(
@@ -845,15 +779,11 @@ static void window_title_editor_paint(rct_window *w, rct_drawpixelinfo *dpi)
w->colours[1],
w->x + window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS].left + 1,
w->y + window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS].top,
w->x + window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS_DROPDOWN].left - window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS].left - 4
);
w->x + window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS_DROPDOWN].left - window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS].left - 4);
break;
case WINDOW_TITLE_EDITOR_TAB_SAVES:
break;
case WINDOW_TITLE_EDITOR_TAB_SCRIPT:
break;
}
}
@@ -991,20 +921,18 @@ static void window_title_editor_scrollpaint_commands(rct_window *w, rct_drawpixe
static void window_title_editor_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w)
{
int sprite_idx;
int x, y;
for (int i = 0; i < WINDOW_TITLE_EDITOR_TAB_COUNT; i++) {
x = 0;
y = 0;
sprite_idx = window_title_editor_tab_sprites[i];
if (w->selected_tab == i)
sprite_idx += w->frame_no / window_title_editor_tab_animation_divisor[w->selected_tab];
int x = 0;
int y = 0;
int spriteId = window_title_editor_tab_sprites[i];
if (w->selected_tab == i) {
spriteId += w->frame_no / window_title_editor_tab_animation_divisor[w->selected_tab];
}
if (i == 1) {
x = 4;
y = 1;
}
gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TITLE_EDITOR_PRESETS_TAB + i].left + x, w->y + w->widgets[WIDX_TITLE_EDITOR_PRESETS_TAB + i].top + y, 0);
gfx_draw_sprite(dpi, spriteId, w->x + w->widgets[WIDX_TITLE_EDITOR_PRESETS_TAB + i].left + x, w->y + w->widgets[WIDX_TITLE_EDITOR_PRESETS_TAB + i].top + y, 0);
}
}