Merge pull request #4018 from SijmenSchoon/track-save-dialog

Use OpenRCT2 dialog for saving tracks
This commit is contained in:
Ted John 2016-07-11 19:11:33 +01:00 committed by GitHub
commit 21e5093153
7 changed files with 58 additions and 88 deletions

View File

@ -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 #

View File

@ -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
};

View File

@ -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);

View File

@ -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

View File

@ -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;

View File

@ -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);
}
}
}
}

View File

@ -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);
}
/**