mirror of https://github.com/OpenRCT2/OpenRCT2.git
Merge pull request #4018 from SijmenSchoon/track-save-dialog
Use OpenRCT2 dialog for saving tracks
This commit is contained in:
commit
21e5093153
|
@ -4203,6 +4203,8 @@ STR_5891 :Default
|
|||
STR_5892 :{SMALLFONT}{BLACK}Go to the default directory
|
||||
STR_5893 :Exchange Rate
|
||||
STR_5894 :Enter the exchange rate
|
||||
STR_5895 :Save Track
|
||||
STR_5896 :Track save failed!
|
||||
|
||||
#############
|
||||
# Scenarios #
|
||||
|
|
|
@ -2671,9 +2671,13 @@ enum {
|
|||
|
||||
STR_LOADSAVE_DEFAULT = 5891,
|
||||
STR_LOADSAVE_DEFAULT_TIP = 5892,
|
||||
|
||||
|
||||
STR_RATE_INPUT_TITLE = 5893,
|
||||
STR_RATE_INPUT_DESC = 5894,
|
||||
|
||||
STR_FILE_DIALOG_TITLE_SAVE_TRACK = 5895,
|
||||
STR_TRACK_SAVE_FAILED = 5896,
|
||||
|
||||
// Have to include resource strings (from scenarios and objects) for the time being now that language is partially working
|
||||
STR_COUNT = 32768
|
||||
};
|
||||
|
|
|
@ -1100,6 +1100,7 @@ bool shop_item_is_souvenir(int shopItem);
|
|||
void ride_reset_all_names();
|
||||
const uint8* ride_seek_available_modes(rct_ride *ride);
|
||||
|
||||
void window_ride_measurements_design_cancel();
|
||||
void window_ride_construction_mouseup_demolish_next_piece(int x, int y, int z, int direction, int type);
|
||||
|
||||
const uint32 ride_customers_per_hour(const rct_ride *ride);
|
||||
|
|
|
@ -218,5 +218,6 @@ bool track_design_save_contains_map_element(rct_map_element *mapElement);
|
|||
void track_design_save_select_nearby_scenery(int rideIndex);
|
||||
void track_design_save_toggle_map_element(int interactionType, int x, int y, rct_map_element *mapElement);
|
||||
bool track_design_save(uint8 rideIndex);
|
||||
bool track_design_save_to_file(const utf8 *path);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -53,7 +53,6 @@ static bool track_design_save_copy_scenery_to_td6(rct_track_td6 *td6);
|
|||
static rct_track_td6 *track_design_save_to_td6(uint8 rideIndex);
|
||||
static bool track_design_save_to_td6_for_maze(uint8 rideIndex, rct_track_td6 *td6);
|
||||
static bool track_design_save_to_td6_for_tracked_ride(uint8 rideIndex, rct_track_td6 *td6);
|
||||
static bool track_design_save_to_file(rct_track_td6 *track_design, utf8 *path);
|
||||
|
||||
void track_design_save_init()
|
||||
{
|
||||
|
@ -119,6 +118,18 @@ void track_design_save_reset_scenery()
|
|||
gfx_invalidate_screen();
|
||||
}
|
||||
|
||||
void track_design_save_callback(int result) {
|
||||
free(_trackDesign->track_elements);
|
||||
free(_trackDesign->entrance_elements);
|
||||
free(_trackDesign->scenery_elements);
|
||||
free(_trackDesign);
|
||||
|
||||
if (result == MODAL_RESULT_OK) {
|
||||
track_design_index_create();
|
||||
}
|
||||
gfx_invalidate_screen();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006D2804, 0x006D264D
|
||||
|
@ -159,63 +170,10 @@ bool track_design_save(uint8 rideIndex)
|
|||
|
||||
utf8 track_name[MAX_PATH];
|
||||
format_string(track_name, ride->name, &ride->name_arguments);
|
||||
|
||||
// Default location
|
||||
utf8 path[MAX_PATH];
|
||||
|
||||
if (gConfigGeneral.last_save_track_directory && platform_directory_exists(gConfigGeneral.last_save_track_directory))
|
||||
safe_strcpy(path, gConfigGeneral.last_save_track_directory, MAX_PATH);
|
||||
else
|
||||
platform_get_user_directory(path, "track");
|
||||
|
||||
strcat(path, track_name);
|
||||
strcat(path, ".td6");
|
||||
window_loadsave_open(LOADSAVETYPE_TRACK | LOADSAVETYPE_SAVE, track_name);
|
||||
gLoadSaveCallback = track_design_save_callback;
|
||||
|
||||
// Show save dialog
|
||||
utf8 initialDirectory[MAX_PATH];
|
||||
{
|
||||
strcpy(initialDirectory, path);
|
||||
utf8 *a = strrchr(initialDirectory, '/');
|
||||
utf8 *b = strrchr(initialDirectory, '\\');
|
||||
utf8 *c = max(a, b);
|
||||
if (c != NULL) {
|
||||
*c = '\0';
|
||||
}
|
||||
}
|
||||
platform_ensure_directory_exists(initialDirectory);
|
||||
|
||||
file_dialog_desc desc;
|
||||
memset(&desc, 0, sizeof(desc));
|
||||
desc.type = FD_SAVE;
|
||||
if (RCT2_GLOBAL(0x009DEA6F, uint8) & 1) {
|
||||
desc.title = language_get_string(STR_SAVE_TRACK_DESIGN_WITH_SCENERY_ITEM);
|
||||
} else {
|
||||
desc.title = language_get_string(STR_SAVE_TRACK_DESIGN_ITEM);
|
||||
}
|
||||
desc.initial_directory = initialDirectory;
|
||||
desc.default_filename = path;
|
||||
desc.filters[0].name = language_get_string(STR_OPENRCT2_TRACK_DESIGN_FILE);
|
||||
desc.filters[0].pattern = "*.td6";
|
||||
|
||||
audio_pause_sounds();
|
||||
bool result = platform_open_common_file_dialog(path, &desc);
|
||||
audio_unpause_sounds();
|
||||
|
||||
if (result) {
|
||||
gConfigGeneral.last_save_track_directory = path_get_directory(path);
|
||||
config_save_default();
|
||||
result = track_design_save_to_file(_trackDesign, path);
|
||||
}
|
||||
|
||||
free(_trackDesign->track_elements);
|
||||
free(_trackDesign->entrance_elements);
|
||||
free(_trackDesign->scenery_elements);
|
||||
free(_trackDesign);
|
||||
|
||||
if (result) {
|
||||
track_design_index_create();
|
||||
}
|
||||
gfx_invalidate_screen();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1280,8 +1238,9 @@ static void auto_buffer_write(auto_buffer *buffer, const void *src, size_t len)
|
|||
* rct2: 0x006771DC but not really its branched from that
|
||||
* quite far.
|
||||
*/
|
||||
static bool track_design_save_to_file(rct_track_td6 *td6, utf8 *path)
|
||||
bool track_design_save_to_file(const utf8 *path)
|
||||
{
|
||||
rct_track_td6 *td6 = _trackDesign;
|
||||
const rct_td6_maze_element EndMarkerForMaze = { 0 };
|
||||
const uint8 EndMarker = 0xFF;
|
||||
|
||||
|
|
|
@ -147,7 +147,7 @@ rct_window *window_loadsave_open(int type, char *defaultName)
|
|||
{
|
||||
gLoadSaveCallback = NULL;
|
||||
gLoadSaveTitleSequenceSave = false;
|
||||
char path[MAX_PATH], *ch;
|
||||
char path[MAX_PATH];
|
||||
int includeNewItem;
|
||||
rct_window* w;
|
||||
_type = type;
|
||||
|
@ -187,6 +187,9 @@ rct_window *window_loadsave_open(int type, char *defaultName)
|
|||
case (LOADSAVETYPE_LOAD | LOADSAVETYPE_TRACK) :
|
||||
w->widgets[WIDX_TITLE].image = STR_FILE_DIALOG_TITLE_INSTALL_NEW_TRACK_DESIGN;
|
||||
break;
|
||||
case (LOADSAVETYPE_SAVE | LOADSAVETYPE_TRACK) :
|
||||
w->widgets[WIDX_TITLE].image = STR_FILE_DIALOG_TITLE_SAVE_TRACK;
|
||||
break;
|
||||
default:
|
||||
log_error("Unsupported load / save type: %d", type & 0x0F);
|
||||
return NULL;
|
||||
|
@ -240,24 +243,16 @@ rct_window *window_loadsave_open(int type, char *defaultName)
|
|||
window_loadsave_populate_list(w, includeNewItem, path, ".sc6");
|
||||
break;
|
||||
case LOADSAVETYPE_TRACK:
|
||||
/*
|
||||
Uncomment when user tracks are separated
|
||||
|
||||
if (gConfigGeneral.last_save_track_directory && platform_ensure_directory_exists(gConfigGeneral.last_save_track_directory))
|
||||
safe_strcpy(path, gConfigGeneral.last_save_track_directory, MAX_PATH);
|
||||
else
|
||||
platform_get_user_directory(path, "track");
|
||||
|
||||
if (!platform_ensure_directory_exists(path)) {
|
||||
log_error("Unable to create tracks directory.");
|
||||
window_close(w);
|
||||
return NULL;
|
||||
}
|
||||
*/
|
||||
|
||||
if (gConfigGeneral.last_save_track_directory && platform_ensure_directory_exists(gConfigGeneral.last_save_track_directory))
|
||||
safe_strcpy(path, gConfigGeneral.last_save_track_directory, MAX_PATH);
|
||||
else {
|
||||
safe_strcpy(path, gRCT2AddressTracksPath, MAX_PATH);
|
||||
ch = strchr(path, '*');
|
||||
if (ch != NULL)
|
||||
*ch = 0;
|
||||
}
|
||||
|
||||
window_loadsave_populate_list(w, includeNewItem, path, ".td?");
|
||||
break;
|
||||
|
@ -361,6 +356,12 @@ static void window_loadsave_mouseup(rct_window *w, int widgetIndex)
|
|||
desc.filters[0].name = language_get_string(STR_OPENRCT2_TRACK_DESIGN_FILE);
|
||||
desc.filters[0].pattern = "*.td4;*.td6";
|
||||
break;
|
||||
case (LOADSAVETYPE_SAVE | LOADSAVETYPE_TRACK) :
|
||||
desc.type = FD_SAVE;
|
||||
desc.title = language_get_string(STR_FILE_DIALOG_TITLE_SAVE_TRACK);
|
||||
desc.filters[0].name = language_get_string(STR_OPENRCT2_TRACK_DESIGN_FILE);
|
||||
desc.filters[0].pattern = "*.td6";
|
||||
break;
|
||||
}
|
||||
|
||||
result = platform_open_common_file_dialog(path, &desc);
|
||||
|
@ -408,21 +409,9 @@ static void window_loadsave_mouseup(rct_window *w, int widgetIndex)
|
|||
break;
|
||||
|
||||
case LOADSAVETYPE_TRACK:
|
||||
{
|
||||
/*
|
||||
Uncomment when tracks get separated
|
||||
|
||||
platform_get_user_directory(directory, "track");
|
||||
*/
|
||||
|
||||
safe_strcpy(directory, gRCT2AddressTracksPath, MAX_PATH);
|
||||
char *ch = strchr(directory, '*');
|
||||
if (ch != NULL)
|
||||
*ch = 0;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
window_loadsave_populate_list(w, includeNewItem, directory, _extension);
|
||||
window_init_scroll_widgets(w);
|
||||
|
@ -892,6 +881,22 @@ static void window_loadsave_select(rct_window *w, const char *path)
|
|||
window_close_by_class(WC_LOADSAVE);
|
||||
window_loadsave_invoke_callback(MODAL_RESULT_OK);
|
||||
break;
|
||||
case (LOADSAVETYPE_SAVE | LOADSAVETYPE_TRACK) :
|
||||
{
|
||||
char *p = _strdup(path);
|
||||
path_set_extension(p, "td6");
|
||||
int success = track_design_save_to_file(p);
|
||||
free(p);
|
||||
|
||||
if (success) {
|
||||
window_close_by_class(WC_LOADSAVE);
|
||||
window_ride_measurements_design_cancel();
|
||||
window_loadsave_invoke_callback(MODAL_RESULT_OK);
|
||||
} else {
|
||||
window_error_open(STR_FILE_DIALOG_TITLE_SAVE_TRACK, STR_TRACK_SAVE_FAILED);
|
||||
window_loadsave_invoke_callback(MODAL_RESULT_FAIL);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -4690,7 +4690,7 @@ static void window_ride_measurements_design_select_nearby_scenery()
|
|||
*
|
||||
* rct2: 0x006AD4DA
|
||||
*/
|
||||
static void window_ride_measurements_design_cancel()
|
||||
void window_ride_measurements_design_cancel()
|
||||
{
|
||||
if (RCT2_GLOBAL(0x009DEA6F, uint8) & 1)
|
||||
cancel_scenery_selection();
|
||||
|
@ -4702,9 +4702,7 @@ static void window_ride_measurements_design_cancel()
|
|||
*/
|
||||
static void window_ride_measurements_design_save(rct_window *w)
|
||||
{
|
||||
if (track_design_save((uint8)w->number) == 0) return;
|
||||
|
||||
window_ride_measurements_design_cancel();
|
||||
track_design_save((uint8)w->number);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue