Fix zero luma corner case
[lsnes.git] / src / plat-wxwidgets / settingseditor.cpp
blob62fd4c67d55d81d5c056945e3a16d58c72ab2637
1 #include "core/settings.hpp"
2 #include "core/window.hpp"
4 #include "plat-wxwidgets/settingseditor.hpp"
5 #include "plat-wxwidgets/common.hpp"
7 #include <stdexcept>
9 wx_settings_editor_setting::wx_settings_editor_setting(wxSizer* sizer, wxWindow* window, const std::string& name)
11 a_name = name;
12 parent = window;
13 std::string pvalue = "<unknown>";
14 try {
15 if(!setting::is_set(a_name))
16 pvalue = "<unset>";
17 else
18 pvalue = setting::get(a_name);
19 } catch(...) {
21 sizer->Add(new wxStaticText(window, wxID_ANY, towxstring(name)), 0, wxGROW);
22 sizer->Add(label = new wxStaticText(window, wxID_ANY, towxstring(pvalue)), 0, wxGROW);
23 sizer->Add(edit = new wxButton(window, wxID_ANY, wxT("Edit")), 0, wxGROW);
24 sizer->Add(clear = new wxButton(window, wxID_ANY, wxT("Clear")), 0, wxGROW);
25 edit->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
26 wxCommandEventHandler(wx_settings_editor_setting::on_edit_click), NULL, this);
27 clear->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
28 wxCommandEventHandler(wx_settings_editor_setting::on_clear_click), NULL, this);
31 void wx_settings_editor_setting::on_clear_click(wxCommandEvent& e)
33 try {
34 setting::blank(a_name);
35 }catch(std::exception& e) {
36 wxMessageDialog* d = new wxMessageDialog(parent, towxstring(std::string("Can't clear setting: ") +
37 e.what()), wxT("Error"), wxOK | wxICON_EXCLAMATION);
38 d->ShowModal();
39 d->Destroy();
43 void wx_settings_editor_setting::on_edit_click(wxCommandEvent& e)
45 try {
46 std::string newsetting;
47 std::string oldvalue = setting::get(a_name);
48 wxTextEntryDialog* d = new wxTextEntryDialog(parent, towxstring("Enter new value for " + a_name),
49 wxT("Enter new value for setting"), towxstring(oldvalue));
50 if(d->ShowModal() == wxID_CANCEL) {
51 d->Destroy();
52 return;
54 newsetting = tostdstring(d->GetValue());
55 setting::set(a_name, newsetting);
56 } catch(std::exception& e) {
57 wxMessageDialog* d = new wxMessageDialog(parent, towxstring(std::string("Can't set setting: ") +
58 e.what()), wxT("Error"), wxOK | wxICON_EXCLAMATION);
59 d->ShowModal();
60 d->Destroy();
64 void wx_settings_editor_setting::change_setting(const std::string& _setting, const std::string& value)
66 if(_setting != a_name)
67 return;
68 label->SetLabel(towxstring(value));
71 void wx_settings_editor_setting::clear_setting(const std::string& _setting)
73 if(_setting != a_name)
74 return;
75 label->SetLabel(wxT("<unset>"));
78 wx_settings_editor::wx_settings_editor(wxWindow* parent)
79 : wxDialog(parent, wxID_ANY, wxT("lsnes: Edit settings"), wxDefaultPosition, wxSize(-1, -1)), listener(this)
81 std::set<std::string> settings_set = setting::get_settings_set();
83 Centre();
84 wxFlexGridSizer* top_s = new wxFlexGridSizer(2, 1, 0, 0);
85 SetSizer(top_s);
87 wxFlexGridSizer* t_s = new wxFlexGridSizer(settings_set.size(), 4, 0, 0);
88 for(auto i : settings_set)
89 esettings.push_back(new wx_settings_editor_setting(t_s, this, i));
90 top_s->Add(t_s);
92 wxBoxSizer* pbutton_s = new wxBoxSizer(wxHORIZONTAL);
93 pbutton_s->AddStretchSpacer();
94 pbutton_s->Add(close = new wxButton(this, wxID_CANCEL, wxT("Close")), 0, wxGROW);
95 close->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
96 wxCommandEventHandler(wx_settings_editor::on_close), NULL, this);
97 top_s->Add(pbutton_s, 0, wxGROW);
99 t_s->SetSizeHints(this);
100 top_s->SetSizeHints(this);
101 Fit();
104 wx_settings_editor::~wx_settings_editor()
106 for(auto i : esettings)
107 delete i;
110 bool wx_settings_editor::ShouldPreventAppExit() const
112 return false;
115 void wx_settings_editor::on_close(wxCommandEvent& e)
117 EndModal(wxID_OK);
120 void wx_settings_editor::change_setting(const std::string& _setting, const std::string& value)
122 for(auto i : esettings)
123 i->change_setting(_setting, value);
126 void wx_settings_editor::clear_setting(const std::string& _setting)
128 for(auto i : esettings)
129 i->clear_setting(_setting);
132 wx_settings_editor_listener::wx_settings_editor_listener(wx_settings_editor* _editor)
133 : information_dispatch("wx-settings-editor-listener")
135 editor = _editor;
138 wx_settings_editor_listener::~wx_settings_editor_listener() throw()
142 void wx_settings_editor_listener::on_setting_change(const std::string& _setting, const std::string& value)
144 editor->change_setting(_setting, value);
147 void wx_settings_editor_listener::on_setting_clear(const std::string& _setting)
149 editor->clear_setting(_setting);