Fix zero luma corner case
[lsnes.git] / src / plat-wxwidgets / filenamebox.cpp
blob5f549bbd61d6f98a2747a6d85ed409858f1a190d
1 #include "core/zip.hpp"
3 #include "plat-wxwidgets/common.hpp"
4 #include "plat-wxwidgets/filenamebox.hpp"
6 #include <wx/wx.h>
7 #include <wx/event.h>
8 #include <wx/control.h>
9 #include <wx/combobox.h>
11 filenamebox::filenamebox(wxSizer* sizer, wxWindow* parent, const std::string& initial_label, int flags,
12 wxEvtHandler* dispatch_to, wxObjectEventFunction on_fn_change)
14 wxSizer* inner = sizer;
15 if(flags & FNBF_OI)
16 inner = new wxFlexGridSizer(1, 3, 0, 0);
17 given_flags = flags;
18 last_label = initial_label;
19 label = new wxStaticText(parent, wxID_ANY, towxstring(last_label));
20 filename = new wxTextCtrl(parent, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(500, -1));
21 file_select = new wxButton(parent, wxID_ANY, wxT("..."));
22 inner->Add(label, 0, wxGROW);
23 inner->Add(filename, 1, wxGROW);
24 inner->Add(file_select, 0, wxGROW);
25 if((flags & FNBF_NN) == 0)
26 filename->Connect(wxEVT_COMMAND_TEXT_UPDATED, on_fn_change, NULL, dispatch_to);
27 file_select->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(filenamebox::on_file_select), NULL,
28 this);
29 if(flags & FNBF_SD)
30 disable();
31 if(flags & FNBF_OI) {
32 inner->SetSizeHints(parent);
33 sizer->Add(inner, 0, wxGROW);
35 pwindow = parent;
36 enabled = ((flags & FNBF_SD) == 0);
39 filenamebox::~filenamebox()
41 //Wxwidgets destroys the subwidgets.
45 void filenamebox::on_file_select(wxCommandEvent& e)
47 std::string fname;
48 wxFileDialog* d = new wxFileDialog(pwindow, towxstring("Choose " + last_label), wxT("."));
49 if(d->ShowModal() == wxID_CANCEL) {
50 d->Destroy();
51 return;
53 fname = tostdstring(d->GetPath());
54 d->Destroy();
55 if(given_flags & FNBF_PZ) {
56 //Did we pick a .zip file?
57 try {
58 zip_reader zr(fname);
59 std::vector<wxString> files;
60 for(auto i : zr)
61 files.push_back(towxstring(i));
62 wxSingleChoiceDialog* d2 = new wxSingleChoiceDialog(pwindow, wxT("Select file within .zip"),
63 wxT("Select member"), files.size(), &files[0]);
64 if(d2->ShowModal() == wxID_CANCEL) {
65 d2->Destroy();
66 return;
68 fname = fname + "/" + tostdstring(d2->GetStringSelection());
69 d2->Destroy();
70 } catch(...) {
71 //Ignore error.
74 filename->SetValue(towxstring(fname));
77 std::string filenamebox::get_file()
79 if(!enabled)
80 return "";
81 else
82 return tostdstring(filename->GetValue());
85 bool filenamebox::is_enabled()
87 return enabled;
90 void filenamebox::enable(const std::string& new_label)
92 change_label(new_label);
93 enable();
96 void filenamebox::change_label(const std::string& new_label)
98 last_label = new_label;
99 if(enabled || (given_flags & FNBF_PL))
100 label->SetLabel(towxstring(last_label));
103 void filenamebox::disable()
105 label->Disable();
106 filename->Disable();
107 file_select->Disable();
108 if((given_flags & FNBF_PL) == 0)
109 label->SetLabel(wxT(""));
110 enabled = false;
113 void filenamebox::enable()
115 if((given_flags & FNBF_PL) == 0)
116 label->SetLabel(towxstring(last_label));
117 label->Enable();
118 filename->Enable();
119 file_select->Enable();
120 enabled = true;
123 bool filenamebox::is_nonblank()
125 if(!enabled)
126 return false;
127 return (filename->GetValue().Length() != 0);
130 bool filenamebox::is_nonblank_or_disabled()
132 if(!enabled)
133 return true;
134 return (filename->GetValue().Length() != 0);
137 void filenamebox::clear()
139 filename->SetValue(wxT(""));