Add progress bar to game saves on exit

This commit is contained in:
Lephenixnoir 2021-09-19 17:33:33 +02:00
parent 6742defa3d
commit 380a64f989
Signed by: Lephenixnoir
GPG Key ID: 1BBA026E13FC0495
3 changed files with 86 additions and 3 deletions

View File

@ -510,3 +510,39 @@ void UI_Error(const char *fmt, va_list args)
while(PRGM_GetKey());
GetKey(&key);
}
void UI_DelayedWrites(CGD_DelayedFileWrite const *dfw, int count,
int current_file, int current_file_done)
{
int total = 0;
int current = 0;
for(int i = 0; i < count; i++) {
if(dfw[i].data == NULL)
continue;
total += dfw[i].size;
if(i < current_file)
current += dfw[i].size;
else if(i == current_file)
current += current_file_done;
}
Bdisp_AllClr_VRAM();
UI_Printf(WIDTH / 2, 10, 0x0000, UI_CENTER,
"Game saves");
if(current_file_done == -1)
UI_Printf(WIDTH / 2, HEIGHT / 2 - 12, 0x0000, UI_CENTER,
"Creating %s... (%d kB)", dfw[current_file].filename,
dfw[current_file].size >> 10);
else
UI_Printf(WIDTH / 2, HEIGHT / 2 - 12, 0x0000, UI_CENTER,
"Saving %s... (%d/%d kB)", dfw[current_file].filename,
current_file_done >> 10, dfw[current_file].size >> 10);
UI_ProgressBar(HEIGHT / 2 + 7, current, total);
Bdisp_FrameAndColor(3, 16);
Bdisp_FrameAndColor(1, 0);
Bdisp_PutDisp_DD();
}

View File

@ -76,4 +76,8 @@ int UI_Main(WADFileInfo *wads, int wad_count,
/* Show an error with custom formatting. */
void UI_Error(const char *fmt, va_list args);
/* Show a file save with a progress bar. */
void UI_DelayedWrites(CGD_DelayedFileWrite const *dfw, int count,
int current_file, int current_amount);
#endif /* CGDOOM_UI_H */

View File

@ -643,6 +643,50 @@ static int FindZeroedMemory(void *start)
return size & ~0xfff;
}
static void DelayedWriteFile(int i)
{
CGD_DelayedFileWrite const *dfw = &CGD_DelayedSaves[i];
uint16_t fc_path[100] = u"\\\\fls0\\";
int j=7, rc, fd;
for (int i = 0; dfw->filename[i]; i++)
fc_path[j++] = dfw->filename[i];
fc_path[j++] = 0x0000;
UI_DelayedWrites(CGD_DelayedSaves, 6, i, -1);
Bfile_DeleteEntry(fc_path);
rc = Bfile_CreateEntry_OS(fc_path, CREATEMODE_FILE, (size_t *)&dfw->size);
if (rc < 0) {
I_Error("Bfile_CreateEntry_OS(%s, %d bytes): %d", dfw->filename,
dfw->size, rc);
return;
}
fd = Bfile_OpenFile_OS(fc_path, WRITE, 0);
if (fd < 0) {
I_Error("Bfile_OpenFile_OS(%s): %d", dfw->filename, fd);
return;
}
/* Write chunks of 4096 bytes and show progress in-between chunks */
int size = dfw->size;
const void *source = dfw->data;
while(size > 0) {
int chunk_size = (size >= 4096) ? 4096 : size;
Bfile_WriteFile_OS(fd, source, chunk_size);
source += chunk_size;
size -= chunk_size;
UI_DelayedWrites(CGD_DelayedSaves, 6, i, dfw->size - size);
}
Bfile_CloseFile_OS(fd);
}
///////////////////////////////////////////////////////////////////////////////////////////////////
int main(void)
{
@ -790,9 +834,8 @@ int main(void)
int delayed_writes = sizeof(CGD_DelayedSaves) / sizeof(CGD_DelayedSaves[0]);
for(int i = 0; i < delayed_writes; i++) {
CGD_DelayedFileWrite *dfw = &CGD_DelayedSaves[i];
if(dfw->data != NULL) {
M_WriteFile(dfw->filename, dfw->data, dfw->size);
}
if(dfw->data != NULL)
DelayedWriteFile(i);
}
if(dev_info) {