pcem/src/wx-deviceconfig.cc
2017-08-05 20:05:35 +01:00

292 lines
11 KiB
C++

#include "wx-deviceconfig.h"
#include "wx-utils.h"
#include "wx/wxprec.h"
#include "wx-dialogbox.h"
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include "wx/xrc/xmlres.h"
extern "C"
{
#include "config.h"
#include "plat-midi.h"
void saveconfig(char*);
void resetpchard();
int deviceconfig_dlgproc(void* hdlg, int message, INT_PARAM wParam,
LONG_PARAM lParam);
device_t *config_device;
int confirm();
}
#define IDC_CONFIG_BASE 1000
int deviceconfig_dlgproc(void* hdlg, int message, INT_PARAM wParam,
LONG_PARAM lParam)
{
switch (message)
{
case WX_INITDIALOG:
{
int id = IDC_CONFIG_BASE;
device_config_t *config = config_device->config;
int c;
while (config->type != -1)
{
device_config_selection_t *selection = config->selection;
void* h = 0;
int val_int;
int num;
char s[100];
switch (config->type)
{
case CONFIG_BINARY:
h = wx_getdlgitem(hdlg, id);
val_int = config_get_int(CFG_MACHINE, config_device->name, config->name, config->default_int);
wx_sendmessage(h, WX_BM_SETCHECK, val_int, 0);
id++;
break;
case CONFIG_SELECTION:
h = wx_getdlgitem(hdlg, id + 1);
val_int = config_get_int(CFG_MACHINE, config_device->name, config->name, config->default_int);
c = 0;
while (selection->description[0])
{
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM) selection->description);
if (val_int == selection->value)
wx_sendmessage(h, WX_CB_SETCURSEL, c, 0);
selection++;
c++;
}
id += 2;
break;
case CONFIG_MIDI:
num = midi_get_num_devs();
if (num > 0)
{
h = wx_getdlgitem(hdlg, id + 1);
val_int = config_get_int(CFG_MACHINE, NULL, config->name, config->default_int);
for (c = 0; c < num; c++)
{
midi_get_dev_name(c, s);
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM) s);
if (val_int == c)
wx_sendmessage(h, WX_CB_SETCURSEL, c, 0);
}
id += 2;
}
break;
}
config++;
}
}
return TRUE;
case WX_COMMAND:
switch (wParam)
{
case wxID_OK:
{
int id = IDC_CONFIG_BASE;
device_config_t *config = config_device->config;
int c;
int changed = 0;
while (config->type != -1)
{
device_config_selection_t *selection = config->selection;
void* h = 0;
int val_int;
switch (config->type)
{
case CONFIG_BINARY:
h = wx_getdlgitem(hdlg, id);
val_int = config_get_int(CFG_MACHINE, config_device->name, config->name, config->default_int);
if (val_int != wx_sendmessage(h, WX_BM_GETCHECK, 0, 0))
changed = 1;
id++;
break;
case CONFIG_SELECTION:
h = wx_getdlgitem(hdlg, id + 1);
val_int = config_get_int(CFG_MACHINE, config_device->name, config->name, config->default_int);
c = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
for (; c > 0; c--)
selection++;
if (val_int != selection->value)
changed = 1;
id += 2;
break;
case CONFIG_MIDI:
if (midi_get_num_devs() > 0)
{
h = wx_getdlgitem(hdlg, id + 1);
val_int = config_get_int(CFG_MACHINE, NULL, config->name, config->default_int);
c = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
if (val_int != c)
changed = 1;
id += 2;
}
break;
}
config++;
}
if (!changed)
{
wx_enddialog(hdlg, 0);
return TRUE;
}
if (has_been_inited && !confirm())
{
wx_enddialog(hdlg, 0);
return TRUE;
}
id = IDC_CONFIG_BASE;
config = config_device->config;
while (config->type != -1)
{
device_config_selection_t *selection = config->selection;
void* h = 0;
switch (config->type)
{
case CONFIG_BINARY:
h = wx_getdlgitem(hdlg, id);
config_set_int(CFG_MACHINE, config_device->name, config->name, wx_sendmessage(h, WX_BM_GETCHECK, 0, 0));
id++;
break;
case CONFIG_SELECTION:
h = wx_getdlgitem(hdlg, id + 1);
c = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
for (; c > 0; c--)
selection++;
config_set_int(CFG_MACHINE, config_device->name, config->name, selection->value);
id += 2;
break;
case CONFIG_MIDI:
if (midi_get_num_devs() > 0)
{
h = wx_getdlgitem(hdlg, id + 1);
c = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
config_set_int(CFG_MACHINE, NULL, config->name, c);
id += 2;
}
break;
}
config++;
}
if (has_been_inited)
{
saveconfig(NULL);
resetpchard();
}
wx_enddialog(hdlg, 0);
return TRUE;
}
case wxID_CANCEL:
wx_enddialog(hdlg, 0);
return TRUE;
}
break;
}
return FALSE;
}
void deviceconfig_open(void* hwnd, device_t *device)
{
char s[257];
config_device = device;
PCemDialogBox dialog((wxWindow*) hwnd, deviceconfig_dlgproc);
// dialog.SetWindowStyle(wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
device_config_t *config = device->config;
dialog.SetTitle("Device Configuration");
wxFlexGridSizer* root = new wxFlexGridSizer(0, 1, 0, 0);
root->SetFlexibleDirection(wxBOTH);
root->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
dialog.SetSizer(root);
wxFlexGridSizer* sizer = new wxFlexGridSizer(0, 2, 0, 0);
sizer->SetFlexibleDirection(wxBOTH);
sizer->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
sizer->AddGrowableCol(1);
root->Add(sizer, 1, wxEXPAND, 5);
int id = IDC_CONFIG_BASE;
while (config->type != -1)
{
switch (config->type)
{
case CONFIG_BINARY:
sizer->Add(0, 0, 1, wxEXPAND, 5);
sizer->Add(new wxCheckBox(&dialog, id++, config->description), 0, wxALL, 5);
break;
case CONFIG_SELECTION:
case CONFIG_MIDI:
{
if (config->type == CONFIG_MIDI && midi_get_num_devs() == 0)
break;
sprintf(s, "%s:", config->description);
sizer->Add(new wxStaticText(&dialog, id++, s), 0, wxALL | wxALIGN_CENTER_VERTICAL, 5);
wxBoxSizer* comboSizer = new wxBoxSizer(wxHORIZONTAL);
sizer->Add(comboSizer, 1, wxEXPAND, 5);
wxComboBox* cb = new wxComboBox(&dialog, id++);
cb->SetEditable(false);
comboSizer->Add(cb, 1, wxALL, 5);
break;
}
}
config++;
}
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();
}