|
|
1.1 ! root 1: /* ! 2: Hatari - dlgFloppy.c ! 3: ! 4: This file is distributed under the GNU Public License, version 2 or at ! 5: your option any later version. Read the file gpl.txt for details. ! 6: */ ! 7: const char DlgFloppy_fileid[] = "Hatari dlgFloppy.c : " __DATE__ " " __TIME__; ! 8: ! 9: #include <assert.h> ! 10: #include "main.h" ! 11: #include "configuration.h" ! 12: #include "dialog.h" ! 13: #include "sdlgui.h" ! 14: #include "file.h" ! 15: ! 16: ! 17: #define FLOPPYDLG_EJECTA 3 ! 18: #define FLOPPYDLG_BROWSEA 4 ! 19: #define FLOPPYDLG_DISKA 5 ! 20: #define FLOPPYDLG_EJECTB 7 ! 21: #define FLOPPYDLG_BROWSEB 8 ! 22: #define FLOPPYDLG_DISKB 9 ! 23: #define FLOPPYDLG_IMGDIR 11 ! 24: #define FLOPPYDLG_BROWSEIMG 12 ! 25: #define FLOPPYDLG_AUTOB 13 ! 26: #define FLOPPYDLG_SLOWFLOPPY 14 ! 27: #define FLOPPYDLG_CREATEIMG 15 ! 28: #define FLOPPYDLG_PROTOFF 17 ! 29: #define FLOPPYDLG_PROTON 18 ! 30: #define FLOPPYDLG_PROTAUTO 19 ! 31: #define FLOPPYDLG_EXIT 20 ! 32: ! 33: ! 34: /* The floppy disks dialog: */ ! 35: static SGOBJ floppydlg[] = ! 36: { ! 37: { SGBOX, 0, 0, 0,0, 64,20, NULL }, ! 38: { SGTEXT, 0, 0, 25,1, 12,1, "Floppy disks" }, ! 39: { SGTEXT, 0, 0, 2,3, 8,1, "Drive A:" }, ! 40: { SGBUTTON, 0, 0, 46,3, 7,1, "Eject" }, ! 41: { SGBUTTON, 0, 0, 54,3, 8,1, "Browse" }, ! 42: { SGTEXT, 0, 0, 3,4, 58,1, NULL }, ! 43: { SGTEXT, 0, 0, 2,6, 8,1, "Drive B:" }, ! 44: { SGBUTTON, 0, 0, 46,6, 7,1, "Eject" }, ! 45: { SGBUTTON, 0, 0, 54,6, 8,1, "Browse" }, ! 46: { SGTEXT, 0, 0, 3,7, 58,1, NULL }, ! 47: { SGTEXT, 0, 0, 2,9, 32,1, "Default floppy images directory:" }, ! 48: { SGTEXT, 0, 0, 3,10, 58,1, NULL }, ! 49: { SGBUTTON, 0, 0, 54,9, 8,1, "Browse" }, ! 50: { SGCHECKBOX, 0, 0, 2,12, 16,1, "Auto insert B" }, ! 51: { SGCHECKBOX, 0, 0, 2,14, 21,1, "Slow floppy access" }, ! 52: { SGBUTTON, 0, 0, 42,14, 20,1, "Create blank image" }, ! 53: { SGTEXT, 0, 0, 2,16, 17,1, "Write protection:" }, ! 54: { SGRADIOBUT, 0, 0, 21,16, 5,1, "Off" }, ! 55: { SGRADIOBUT, 0, 0, 28,16, 5,1, "On" }, ! 56: { SGRADIOBUT, 0, 0, 34,16, 6,1, "Auto" }, ! 57: { SGBUTTON, SG_DEFAULT, 0, 22,18, 20,1, "Back to main menu" }, ! 58: { -1, 0, 0, 0,0, 0,0, NULL } ! 59: }; ! 60: ! 61: ! 62: #define DLGMOUNT_A 2 ! 63: #define DLGMOUNT_B 3 ! 64: #define DLGMOUNT_CANCEL 4 ! 65: ! 66: /* The "Alert"-dialog: */ ! 67: static SGOBJ alertdlg[] = ! 68: { ! 69: { SGBOX, 0, 0, 0,0, 40,6, NULL }, ! 70: { SGTEXT, 0, 0, 3,1, 30,1, "Insert last created disk to?" }, ! 71: { SGBUTTON, 0, 0, 3,4, 10,1, "Drive A:" }, ! 72: { SGBUTTON, 0, 0, 15,4, 10,1, "Drive B:" }, ! 73: { SGBUTTON, SG_CANCEL, 0, 27,4, 10,1, "Cancel" }, ! 74: { -1, 0, 0, 0,0, 0,0, NULL } ! 75: }; ! 76: ! 77: ! 78: /** ! 79: * Let user browse given disk, insert disk if one selected. ! 80: */ ! 81: static void DlgDisk_BrowseDisk(char *dlgname, int drive, int diskid) ! 82: { ! 83: char *selname, *zip_path; ! 84: const char *tmpname, *realname; ! 85: ! 86: assert(drive >= 0 && drive < MAX_FLOPPYDRIVES); ! 87: if (ConfigureParams.DiskImage.szDiskFileName[drive][0]) ! 88: tmpname = ConfigureParams.DiskImage.szDiskFileName[drive]; ! 89: else ! 90: tmpname = ConfigureParams.DiskImage.szDiskImageDirectory; ! 91: ! 92: selname = SDLGui_FileSelect(tmpname, &zip_path, false); ! 93: if (!selname) ! 94: return; ! 95: ! 96: if (File_Exists(selname)) ! 97: { ! 98: realname = Floppy_SetDiskFileName(drive, selname, zip_path); ! 99: if (realname) ! 100: File_ShrinkName(dlgname, realname, floppydlg[diskid].w); ! 101: } ! 102: else ! 103: { ! 104: Floppy_SetDiskFileNameNone(drive); ! 105: dlgname[0] = '\0'; ! 106: } ! 107: if (zip_path) ! 108: free(zip_path); ! 109: free(selname); ! 110: } ! 111: ! 112: ! 113: /** ! 114: * Let user browse given directory, set directory if one selected. ! 115: */ ! 116: static void DlgDisk_BrowseDir(char *dlgname, char *confname, int maxlen) ! 117: { ! 118: char *str, *selname; ! 119: ! 120: selname = SDLGui_FileSelect(confname, NULL, false); ! 121: if (!selname) ! 122: return; ! 123: ! 124: strcpy(confname, selname); ! 125: free(selname); ! 126: ! 127: str = strrchr(confname, PATHSEP); ! 128: if (str != NULL) ! 129: str[1] = 0; ! 130: File_CleanFileName(confname); ! 131: File_ShrinkName(dlgname, confname, maxlen); ! 132: } ! 133: ! 134: ! 135: /** ! 136: * Ask whether new disk should be inserted to A: or B: and if yes, insert. ! 137: */ ! 138: static void DlgFloppy_QueryInsert(char *namea, int ida, char *nameb, int idb, const char *path) ! 139: { ! 140: const char *realname; ! 141: int diskid, dlgid; ! 142: char *dlgname; ! 143: ! 144: SDLGui_CenterDlg(alertdlg); ! 145: switch (SDLGui_DoDialog(alertdlg, NULL)) ! 146: { ! 147: case DLGMOUNT_A: ! 148: dlgname = namea; ! 149: dlgid = ida; ! 150: diskid = 0; ! 151: break; ! 152: case DLGMOUNT_B: ! 153: dlgname = nameb; ! 154: dlgid = idb; ! 155: diskid = 1; ! 156: break; ! 157: default: ! 158: return; ! 159: } ! 160: ! 161: realname = Floppy_SetDiskFileName(diskid, path, NULL); ! 162: if (realname) ! 163: File_ShrinkName(dlgname, realname, floppydlg[dlgid].w); ! 164: } ! 165: ! 166: ! 167: /** ! 168: * Show and process the floppy disk image dialog. ! 169: */ ! 170: void DlgFloppy_Main(void) ! 171: { ! 172: int but, i; ! 173: char *newdisk; ! 174: char dlgname[MAX_FLOPPYDRIVES][64], dlgdiskdir[64]; ! 175: ! 176: SDLGui_CenterDlg(floppydlg); ! 177: ! 178: /* Set up dialog to actual values: */ ! 179: ! 180: /* Disk name A: */ ! 181: if (EmulationDrives[0].bDiskInserted) ! 182: File_ShrinkName(dlgname[0], ConfigureParams.DiskImage.szDiskFileName[0], ! 183: floppydlg[FLOPPYDLG_DISKA].w); ! 184: else ! 185: dlgname[0][0] = '\0'; ! 186: floppydlg[FLOPPYDLG_DISKA].txt = dlgname[0]; ! 187: ! 188: /* Disk name B: */ ! 189: if (EmulationDrives[1].bDiskInserted) ! 190: File_ShrinkName(dlgname[1], ConfigureParams.DiskImage.szDiskFileName[1], ! 191: floppydlg[FLOPPYDLG_DISKB].w); ! 192: else ! 193: dlgname[1][0] = '\0'; ! 194: floppydlg[FLOPPYDLG_DISKB].txt = dlgname[1]; ! 195: ! 196: /* Default image directory: */ ! 197: File_ShrinkName(dlgdiskdir, ConfigureParams.DiskImage.szDiskImageDirectory, ! 198: floppydlg[FLOPPYDLG_IMGDIR].w); ! 199: floppydlg[FLOPPYDLG_IMGDIR].txt = dlgdiskdir; ! 200: ! 201: /* Auto insert disk B: */ ! 202: if (ConfigureParams.DiskImage.bAutoInsertDiskB) ! 203: floppydlg[FLOPPYDLG_AUTOB].state |= SG_SELECTED; ! 204: else ! 205: floppydlg[FLOPPYDLG_AUTOB].state &= ~SG_SELECTED; ! 206: ! 207: /* Write protection */ ! 208: for (i = FLOPPYDLG_PROTOFF; i <= FLOPPYDLG_PROTAUTO; i++) ! 209: { ! 210: floppydlg[i].state &= ~SG_SELECTED; ! 211: } ! 212: floppydlg[FLOPPYDLG_PROTOFF+ConfigureParams.DiskImage.nWriteProtection].state |= SG_SELECTED; ! 213: ! 214: /* Slow floppy access */ ! 215: if (ConfigureParams.DiskImage.bSlowFloppy) ! 216: floppydlg[FLOPPYDLG_SLOWFLOPPY].state |= SG_SELECTED; ! 217: else ! 218: floppydlg[FLOPPYDLG_SLOWFLOPPY].state &= ~SG_SELECTED; ! 219: ! 220: /* Draw and process the dialog */ ! 221: do ! 222: { ! 223: but = SDLGui_DoDialog(floppydlg, NULL); ! 224: switch (but) ! 225: { ! 226: case FLOPPYDLG_EJECTA: /* Eject disk in drive A: */ ! 227: Floppy_SetDiskFileNameNone(0); ! 228: dlgname[0][0] = '\0'; ! 229: break; ! 230: case FLOPPYDLG_BROWSEA: /* Choose a new disk A: */ ! 231: DlgDisk_BrowseDisk(dlgname[0], 0, FLOPPYDLG_DISKA); ! 232: break; ! 233: case FLOPPYDLG_EJECTB: /* Eject disk in drive B: */ ! 234: Floppy_SetDiskFileNameNone(1); ! 235: dlgname[1][0] = '\0'; ! 236: break; ! 237: case FLOPPYDLG_BROWSEB: /* Choose a new disk B: */ ! 238: DlgDisk_BrowseDisk(dlgname[1], 1, FLOPPYDLG_DISKB); ! 239: break; ! 240: case FLOPPYDLG_BROWSEIMG: ! 241: DlgDisk_BrowseDir(dlgdiskdir, ! 242: ConfigureParams.DiskImage.szDiskImageDirectory, ! 243: floppydlg[FLOPPYDLG_IMGDIR].w); ! 244: break; ! 245: case FLOPPYDLG_CREATEIMG: ! 246: newdisk = DlgNewDisk_Main(); ! 247: if (newdisk) ! 248: { ! 249: DlgFloppy_QueryInsert(dlgname[0], FLOPPYDLG_DISKA, ! 250: dlgname[1], FLOPPYDLG_DISKB, ! 251: newdisk); ! 252: free(newdisk); ! 253: } ! 254: break; ! 255: } ! 256: } ! 257: while (but != FLOPPYDLG_EXIT && but != SDLGUI_QUIT ! 258: && but != SDLGUI_ERROR && !bQuitProgram); ! 259: ! 260: /* Read values from dialog: */ ! 261: ! 262: for (i = FLOPPYDLG_PROTOFF; i <= FLOPPYDLG_PROTAUTO; i++) ! 263: { ! 264: if (floppydlg[i].state & SG_SELECTED) ! 265: { ! 266: ConfigureParams.DiskImage.nWriteProtection = i-FLOPPYDLG_PROTOFF; ! 267: break; ! 268: } ! 269: } ! 270: ! 271: ConfigureParams.DiskImage.bAutoInsertDiskB = (floppydlg[FLOPPYDLG_AUTOB].state & SG_SELECTED); ! 272: ConfigureParams.DiskImage.bSlowFloppy = (floppydlg[FLOPPYDLG_SLOWFLOPPY].state & SG_SELECTED); ! 273: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.