Fix scaling-related crashes
[lsnes.git] / src / platform / wxwidgets / settings-downloads.cpp
blob71f9c3ed970fff96d17984a8ecc99e1ffcd6cc4b
1 #include "platform/wxwidgets/settings-common.hpp"
2 #include "core/filedownload.hpp"
4 namespace
6 class wxeditor_esettings_download : public settings_tab
8 public:
9 wxeditor_esettings_download(wxWindow* parent, emulator_instance& _inst);
10 ~wxeditor_esettings_download();
11 void on_add(wxCommandEvent& e);
12 void on_delete(wxCommandEvent& e);
13 void on_change(wxCommandEvent& e);
14 void on_change2(wxMouseEvent& e);
15 void on_selchange(wxCommandEvent& e);
16 void on_mouse(wxMouseEvent& e);
17 void on_popup_menu(wxCommandEvent& e);
18 void _refresh();
19 private:
20 void refresh();
21 std::set<std::string> patterns;
22 std::map<std::string, std::string> values;
23 std::map<std::string, std::string> names;
24 std::map<int, std::string> selections;
25 std::string selected();
26 wxButton* addbutton;
27 wxButton* changebutton;
28 wxButton* deletebutton;
29 wxListBox* _settings;
32 wxeditor_esettings_download::wxeditor_esettings_download(wxWindow* parent, emulator_instance& _inst)
33 : settings_tab(parent, inst)
35 CHECK_UI_THREAD;
36 wxSizer* top_s = new wxBoxSizer(wxVERTICAL);
37 SetSizer(top_s);
39 top_s->Add(_settings = new wxListBox(this, wxID_ANY), 1, wxGROW);
40 _settings->SetMinSize(wxSize(300, 400));
41 _settings->Connect(wxEVT_COMMAND_LISTBOX_SELECTED,
42 wxCommandEventHandler(wxeditor_esettings_download::on_selchange), NULL, this);
43 _settings->Connect(wxEVT_RIGHT_UP, wxMouseEventHandler(wxeditor_esettings_download::on_mouse), NULL,
44 this);
45 _settings->Connect(wxEVT_LEFT_UP, wxMouseEventHandler(wxeditor_esettings_download::on_mouse), NULL,
46 this);
48 wxBoxSizer* pbutton_s = new wxBoxSizer(wxHORIZONTAL);
49 pbutton_s->AddStretchSpacer();
50 pbutton_s->Add(addbutton = new wxButton(this, wxID_ANY, wxT("Add")), 0, wxGROW);
51 pbutton_s->Add(changebutton = new wxButton(this, wxID_ANY, wxT("Change")), 0, wxGROW);
52 pbutton_s->Add(deletebutton = new wxButton(this, wxID_ANY, wxT("Delete")), 0, wxGROW);
53 _settings->Connect(wxEVT_LEFT_DCLICK,
54 wxMouseEventHandler(wxeditor_esettings_download::on_change2), NULL, this);
55 changebutton->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
56 wxCommandEventHandler(wxeditor_esettings_download::on_change), NULL, this);
57 addbutton->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
58 wxCommandEventHandler(wxeditor_esettings_download::on_add), NULL, this);
59 deletebutton->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
60 wxCommandEventHandler(wxeditor_esettings_download::on_delete), NULL, this);
61 top_s->Add(pbutton_s, 0, wxGROW);
63 refresh();
64 wxCommandEvent e;
65 on_selchange(e);
66 top_s->SetSizeHints(this);
67 Fit();
70 wxeditor_esettings_download::~wxeditor_esettings_download()
74 void wxeditor_esettings_download::on_popup_menu(wxCommandEvent& e)
76 CHECK_UI_THREAD;
77 if(closing())
78 return;
79 if(e.GetId() == wxID_EDIT)
80 on_change(e);
83 void wxeditor_esettings_download::on_mouse(wxMouseEvent& e)
85 CHECK_UI_THREAD;
86 if(!e.RightUp() && !(e.LeftUp() && e.ControlDown()))
87 return;
88 if(selected() == "")
89 return;
90 wxMenu menu;
91 menu.Connect(wxEVT_COMMAND_MENU_SELECTED,
92 wxCommandEventHandler(wxeditor_esettings_download::on_popup_menu), NULL, this);
93 menu.Append(wxID_EDIT, towxstring("Change"));
94 PopupMenu(&menu);
97 void wxeditor_esettings_download::on_change2(wxMouseEvent& e)
99 CHECK_UI_THREAD;
100 wxCommandEvent e2;
101 on_change(e2);
104 void wxeditor_esettings_download::on_add(wxCommandEvent& e)
106 CHECK_UI_THREAD;
107 if(closing())
108 return;
109 std::string name, value;
110 try {
111 name = pick_text(this, "Method name", "Name for the new shortcut scheme:\n"
112 "(A-Z, a-z, 0-9, +, ., -. Has to start with a letter)", "");
113 if(!regex_match("[A-Za-z][A-Za-z0-9+.-]*", name)) {
114 wxMessageBox(towxstring("Invalid scheme name"), wxT("Error setting pattern"),
115 wxICON_EXCLAMATION | wxOK);
116 return;
118 value = pick_text(this, "Set URL to", "Set " + name + " to URL:\n"
119 "(Use $0 for placeholder, use $$ for literial $)", "");
120 } catch(...) {
121 return;
123 bool error = false;
124 std::string errorstr;
125 try {
126 lsnes_uri_rewrite.set_rewrite(name, value);
127 } catch(std::exception& e) {
128 error = true;
129 errorstr = e.what();
131 if(error)
132 wxMessageBox(towxstring(errorstr), wxT("Error setting pattern"), wxICON_EXCLAMATION | wxOK);
133 else
134 refresh();
137 void wxeditor_esettings_download::on_delete(wxCommandEvent& e)
139 CHECK_UI_THREAD;
140 if(closing())
141 return;
142 std::string name = selected();
143 if(name == "")
144 return;
145 lsnes_uri_rewrite.delete_rewrite(name);
146 refresh();
149 void wxeditor_esettings_download::on_change(wxCommandEvent& e)
151 CHECK_UI_THREAD;
152 if(closing())
153 return;
154 std::string name = selected();
155 if(name == "")
156 return;
157 std::string value;
158 std::string err;
159 try {
160 value = lsnes_uri_rewrite.get_rewrite(name);
161 } catch(...) {
163 try {
164 value = pick_text(this, "Set URL to", "Set " + name + " to URL:\n"
165 "(Use $0 for placeholder, use $$ for literial $)", value);
166 } catch(...) {
167 return;
169 bool error = false;
170 std::string errorstr;
171 try {
172 lsnes_uri_rewrite.set_rewrite(name, value);
173 } catch(std::exception& e) {
174 error = true;
175 errorstr = e.what();
177 if(error)
178 wxMessageBox(towxstring(errorstr), wxT("Error setting replace"), wxICON_EXCLAMATION | wxOK);
179 else
180 refresh();
183 void wxeditor_esettings_download::on_selchange(wxCommandEvent& e)
185 CHECK_UI_THREAD;
186 if(closing())
187 return;
188 std::string sel = selected();
189 bool enable = (sel != "");
190 changebutton->Enable(enable);
191 deletebutton->Enable(enable);
194 void wxeditor_esettings_download::refresh()
196 CHECK_UI_THREAD;
197 if(closing())
198 return;
199 patterns = lsnes_uri_rewrite.get_schemes();
200 for(auto i : patterns) {
201 values[i] = lsnes_uri_rewrite.get_rewrite(i);
202 names[i] = i;
204 _refresh();
207 std::string wxeditor_esettings_download::selected()
209 CHECK_UI_THREAD;
210 if(closing())
211 return "";
212 int x = _settings->GetSelection();
213 if(selections.count(x))
214 return selections[x];
215 else
216 return "";
219 void wxeditor_esettings_download::_refresh()
221 CHECK_UI_THREAD;
222 if(closing())
223 return;
224 std::vector<wxString> strings;
225 std::multimap<std::string, std::string> sort;
226 int k = 0;
227 for(auto i : patterns)
228 sort.insert(std::make_pair(names[i], i));
229 for(auto i : sort) {
230 strings.push_back(towxstring(names[i.second] + " (Target: " + values[i.second] + ")"));
231 selections[k++] = i.second;
233 _settings->Set(strings.size(), &strings[0]);
236 settings_tab_factory download_tab("URI shortcuts", [](wxWindow* parent, emulator_instance& _inst) ->
237 settings_tab* {
238 return new wxeditor_esettings_download(parent, _inst);