pcem/src/wx-createdisc.cc

146 lines
5 KiB
C++

#include <stdint.h>
extern "C" void pclog(const char *format, ...);
#include "wx-createdisc.h"
#include "wx-utils.h"
#include "wx/wxprec.h"
#include "wx-dialogbox.h"
#include <stdint.h>
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include "wx/xrc/xmlres.h"
#define IDC_CONFIG_BASE 1000
static struct
{
char name[80];
int nr_sectors;
} disc_formats[] =
{
{"160 kB", 1*40*8},
{"180 kB", 1*40*9},
{"320 kB", 2*40*8},
{"360 kB", 2*40*9},
{"720 kB", 2*80*9},
{"1.44 MB", 2*80*18},
{"2.88 MB", 2*80*36},
{"100 MB (Zip)", 2048*96},
{"", 0}
};
static int creatediscimage_dlgproc(void *hdlg, int message, INT_PARAM wParam,
LONG_PARAM lParam)
{
wxWindow *window = (wxWindow *)hdlg;
int c;
switch (message)
{
case WX_INITDIALOG:
return TRUE;
case WX_COMMAND:
switch (wParam)
{
case wxID_OK:
c = 0;
while (disc_formats[c].nr_sectors)
{
wxWindow *rb_win = window->FindWindow(IDC_CONFIG_BASE + c);
wxRadioButton *rb = wxDynamicCast(rb_win, wxRadioButton);
if (rb->GetValue())
break;
c++;
}
if (disc_formats[c].nr_sectors)
{
char openfilestring[260];
int ret;
memset(openfilestring, 0, sizeof(openfilestring));
ret = wx_filedialog(hdlg, "Save", "",
"Disc image (*.img;*.ima)|*.img;*.ima|All files (*.*)|*.*",
".img",
0, openfilestring);
if (!ret)
{
FILE *f = fopen(openfilestring, "wb");
if (f)
{
uint8_t sector[512];
int d;
memset(sector, 0, 512);
for (d = 0; d < disc_formats[c].nr_sectors; d++)
fwrite(sector, 512, 1, f);
fclose(f);
}
}
}
wx_enddialog(hdlg, 0);
return TRUE;
case wxID_CANCEL:
wx_enddialog(hdlg, 0);
return TRUE;
}
break;
}
return FALSE;
}
void creatediscimage_open(void *hwnd)
{
int id = IDC_CONFIG_BASE;
int c = 0;
PCemDialogBox dialog((wxWindow *)hwnd, creatediscimage_dlgproc);
dialog.SetTitle("Create Disc Image");
wxFlexGridSizer* root = new wxFlexGridSizer(0, 1, 0, 0);
root->SetFlexibleDirection(wxBOTH);
root->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
dialog.SetSizer(root);
wxFlexGridSizer* sizer = new wxFlexGridSizer(0, 1, 0, 0);
sizer->SetFlexibleDirection(wxBOTH);
sizer->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
root->Add(sizer, 1, wxEXPAND, 5);
while (disc_formats[c].nr_sectors)
{
wxBoxSizer *radioSizer = new wxBoxSizer(wxHORIZONTAL);
sizer->Add(radioSizer, 1, wxEXPAND, 5);
wxRadioButton *rb = new wxRadioButton(&dialog, id++, disc_formats[c].name);
radioSizer->Add(rb, 1, wxALL, 5);
c++;
}
wxBoxSizer* okCancelSizer = new wxBoxSizer(wxHORIZONTAL);
root->Add(okCancelSizer, 1, wxEXPAND, 5);
okCancelSizer->Add(0, 0, 1, wxEXPAND, 5);
okCancelSizer->Add(new wxButton(&dialog, wxID_OK), 0, wxALL, 5);
okCancelSizer->Add(new wxButton(&dialog, wxID_CANCEL), 0, wxALL, 5);
dialog.Fit();
dialog.OnInit();
dialog.ShowModal();
dialog.Destroy();
}