Fix zero luma corner case
[lsnes.git] / src / plat-wxwidgets / rom_select_window.cpp
blob01388d8d97846bf9537ec1dbeb7f1679de5cd958
1 #include "plat-wxwidgets/callrom.hpp"
2 #include "plat-wxwidgets/rom_patch_window.hpp"
3 #include "plat-wxwidgets/rom_select_window.hpp"
5 wx_rom_select_window::wx_rom_select_window()
6 : wxFrame(NULL, wxID_ANY, wxT("Select ROM"), wxDefaultPosition, wxSize(-1, -1),
7 primary_window_style)
9 wxString rtchoices[5];
10 wxString rrchoices[3];
11 size_t systems = populate_system_choices(rtchoices);
12 size_t regions = populate_region_choices(rrchoices);
14 Centre();
15 wxFlexGridSizer* top_s = new wxFlexGridSizer(3, 1, 0, 0);
16 SetSizer(top_s);
18 wxBoxSizer* selects_s = new wxBoxSizer(wxHORIZONTAL);
19 rtypec = new labeledcombobox(selects_s, this, "ROM type:", rtchoices, systems, 0, true, this,
20 wxCommandEventHandler(wx_rom_select_window::on_romtype_change));
21 regionc = new labeledcombobox(selects_s, this, "Region:", rrchoices, regions, 0, true, this,
22 wxCommandEventHandler(wx_rom_select_window::on_romtype_change));
23 top_s->Add(selects_s, 0, wxGROW);
25 //The XMLs don't matter, so don't notify those.
26 wxFlexGridSizer* romgrid_s = new wxFlexGridSizer(6, 3, 0, 0);
27 main_rom = new filenamebox(romgrid_s, this, "ROM", FNBF_PZ, this,
28 wxCommandEventHandler(wx_rom_select_window::on_filename_change));
29 main_xml = new filenamebox(romgrid_s, this, "ROM XML", FNBF_NN | FNBF_PZ, this,
30 wxCommandEventHandler(wx_rom_select_window::on_filename_change));
31 slota_rom = new filenamebox(romgrid_s, this, "SLOT A ROM", FNBF_PZ, this,
32 wxCommandEventHandler(wx_rom_select_window::on_filename_change));
33 slota_xml = new filenamebox(romgrid_s, this, "SLOT A XML", FNBF_NN | FNBF_PZ, this,
34 wxCommandEventHandler(wx_rom_select_window::on_filename_change));
35 slotb_rom = new filenamebox(romgrid_s, this, "SLOT A ROM", FNBF_PZ, this,
36 wxCommandEventHandler(wx_rom_select_window::on_filename_change));
37 slotb_xml = new filenamebox(romgrid_s, this, "SLOT A XML", FNBF_NN | FNBF_PZ, this,
38 wxCommandEventHandler(wx_rom_select_window::on_filename_change));
40 top_s->Add(romgrid_s, 1, wxGROW);
41 wxBoxSizer* button_s = new wxBoxSizer(wxHORIZONTAL);
42 button_s->AddStretchSpacer();
43 button_s->Add(open_rom = new wxButton(this, wxID_OPEN, wxT("Open ROM")), 0, wxALIGN_RIGHT);
44 button_s->Add(quit_button = new wxButton(this, wxID_EXIT, wxT("Quit")), 0, wxALIGN_RIGHT);
45 open_rom->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
46 wxCommandEventHandler(wx_rom_select_window::on_open_rom), NULL, this);
47 open_rom->Disable();
48 quit_button->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
49 wxCommandEventHandler(wx_rom_select_window::on_quit), NULL, this);
50 top_s->Add(button_s, 1, wxGROW);
52 set_rtype("");
54 top_s->SetSizeHints(this);
55 Fit();
58 wx_rom_select_window::~wx_rom_select_window()
60 delete rtypec;
61 delete regionc;
62 delete main_rom;
63 delete main_xml;
64 delete slota_rom;
65 delete slota_xml;
66 delete slotb_rom;
67 delete slotb_xml;
71 void wx_rom_select_window::set_rtype(std::string rtype)
73 bool no_rtype = (current_rtype == "");
74 if(rtype == "")
75 rtype = rtypec->get_choice();
76 if(rtype == current_rtype)
77 return;
78 if(has_forced_region(rtype))
79 regionc->disable(forced_region_for_romtype(rtype));
80 else
81 regionc->enable();
82 wxString tmp[6];
83 unsigned c = fill_rom_names(romtype_from_string(rtype), tmp);
84 if(c > 0) main_rom->enable(tostdstring(tmp[0])); else main_rom->disable();
85 if(c > 1) main_xml->enable(tostdstring(tmp[1])); else main_xml->disable();
86 if(c > 2) slota_rom->enable(tostdstring(tmp[2])); else slota_rom->disable();
87 if(c > 3) slota_xml->enable(tostdstring(tmp[3])); else slota_xml->disable();
88 if(c > 4) slotb_rom->enable(tostdstring(tmp[4])); else slotb_rom->disable();
89 if(c > 5) slotb_xml->enable(tostdstring(tmp[5])); else slotb_xml->disable();
90 current_rtype = rtype;
91 Fit();
94 void wx_rom_select_window::on_filename_change(wxCommandEvent& e)
96 bool ok = true;
97 enum rom_type rtype = romtype_from_string(rtypec->get_choice());
98 ok = ok && main_rom->is_nonblank();
99 if(rtype == ROMTYPE_BSX || rtype == ROMTYPE_BSXSLOTTED || rtype == ROMTYPE_SGB)
100 ok = ok && slota_rom->is_nonblank();
101 if(rtype == ROMTYPE_SUFAMITURBO)
102 ok = ok && (slota_rom->is_nonblank() || slotb_rom->is_nonblank());
103 open_rom->Enable(ok);
106 void wx_rom_select_window::on_romtype_change(wxCommandEvent& e)
108 set_rtype(rtypec->get_choice());
109 on_filename_change(e);
112 void wx_rom_select_window::on_quit(wxCommandEvent& e)
114 Close(true);
117 void wx_rom_select_window::on_open_rom(wxCommandEvent& e)
119 rom_files rfiles;
120 rfiles.base_file = "";
121 rfiles.rtype = romtype_from_string(rtypec->get_choice());
122 rfiles.region = region_from_string(regionc->get_choice());
123 rfiles.rom = main_rom->get_file();
124 rfiles.rom_xml = main_xml->get_file();
125 rfiles.slota = slota_rom->get_file();
126 rfiles.slota_xml = slota_xml->get_file();
127 rfiles.slotb = slotb_rom->get_file();
128 rfiles.slotb_xml = slotb_xml->get_file();
129 try {
130 our_rom = new loaded_rom(rfiles);
131 } catch(std::exception& e) {
132 wxMessageDialog* d = new wxMessageDialog(this, towxstring(e.what()),
133 wxT("Error loading ROM"), wxOK | wxICON_EXCLAMATION);
134 d->ShowModal();
136 wx_rom_patch_window* projwin = new wx_rom_patch_window(*our_rom);
137 projwin->Show();
138 Destroy();