If initsram/initstate points to LSS file, pull the matching member
[lsnes.git] / src / platform / wxwidgets / settings-aliases.cpp
blobf9346aa923c6996f50d0f8a4dff557f2f00f327a
1 #include "platform/wxwidgets/settings-common.hpp"
2 #include "platform/wxwidgets/settings-keyentry.hpp"
3 #include "core/command.hpp"
4 #include "core/instance.hpp"
5 #include <wx/defs.h>
7 namespace
9 class wxeditor_esettings_aliases : public settings_tab
11 public:
12 wxeditor_esettings_aliases(wxWindow* parent, emulator_instance& _inst);
13 ~wxeditor_esettings_aliases();
14 void on_add(wxCommandEvent& e);
15 void on_edit(wxCommandEvent& e);
16 void on_delete(wxCommandEvent& e);
17 void on_change(wxCommandEvent& e);
18 void on_mouse(wxMouseEvent& e);
19 void on_popup_menu(wxCommandEvent& e);
20 private:
21 std::map<int, std::string> numbers;
22 wxListBox* select;
23 wxButton* editbutton;
24 wxButton* deletebutton;
25 void refresh();
26 std::string selected();
29 wxeditor_esettings_aliases::wxeditor_esettings_aliases(wxWindow* parent, emulator_instance& _inst)
30 : settings_tab(parent, _inst)
32 CHECK_UI_THREAD;
33 wxButton* tmp;
35 wxSizer* top_s = new wxBoxSizer(wxVERTICAL);
36 SetSizer(top_s);
38 top_s->Add(select = new wxListBox(this, wxID_ANY), 1, wxGROW);
39 select->SetMinSize(wxSize(300, 400));
40 select->Connect(wxEVT_COMMAND_LISTBOX_SELECTED,
41 wxCommandEventHandler(wxeditor_esettings_aliases::on_change), NULL, this);
42 select->Connect(wxEVT_RIGHT_UP, wxMouseEventHandler(wxeditor_esettings_aliases::on_mouse), NULL,
43 this);
44 select->Connect(wxEVT_LEFT_UP, wxMouseEventHandler(wxeditor_esettings_aliases::on_mouse), NULL,
45 this);
47 wxBoxSizer* pbutton_s = new wxBoxSizer(wxHORIZONTAL);
48 pbutton_s->AddStretchSpacer();
49 pbutton_s->Add(tmp = new wxButton(this, wxID_ANY, wxT("Add")), 0, wxGROW);
50 tmp->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(wxeditor_esettings_aliases::on_add),
51 NULL, this);
52 pbutton_s->Add(editbutton = new wxButton(this, wxID_ANY, wxT("Edit")), 0, wxGROW);
53 editbutton->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
54 wxCommandEventHandler(wxeditor_esettings_aliases::on_edit), NULL, this);
55 pbutton_s->Add(deletebutton = new wxButton(this, wxID_ANY, wxT("Delete")), 0, wxGROW);
56 deletebutton->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
57 wxCommandEventHandler(wxeditor_esettings_aliases::on_delete), NULL, this);
58 top_s->Add(pbutton_s, 0, wxGROW);
60 refresh();
61 wxCommandEvent e;
62 on_change(e);
63 top_s->SetSizeHints(this);
64 Fit();
67 wxeditor_esettings_aliases::~wxeditor_esettings_aliases()
71 void wxeditor_esettings_aliases::on_change(wxCommandEvent& e)
73 CHECK_UI_THREAD;
74 if(closing())
75 return;
76 bool enable = (selected() != "");
77 editbutton->Enable(enable);
78 deletebutton->Enable(enable);
81 void wxeditor_esettings_aliases::on_popup_menu(wxCommandEvent& e)
83 CHECK_UI_THREAD;
84 if(closing())
85 return;
86 if(e.GetId() == wxID_EDIT)
87 on_edit(e);
88 else if(e.GetId() == wxID_DELETE)
89 on_delete(e);
92 void wxeditor_esettings_aliases::on_mouse(wxMouseEvent& e)
94 CHECK_UI_THREAD;
95 if(!e.RightUp() && !(e.LeftUp() && e.ControlDown()))
96 return;
97 if(selected() == "")
98 return;
99 wxMenu menu;
100 menu.Connect(wxEVT_COMMAND_MENU_SELECTED,
101 wxCommandEventHandler(wxeditor_esettings_aliases::on_popup_menu), NULL, this);
102 menu.Append(wxID_EDIT, towxstring("Edit"));
103 menu.AppendSeparator();
104 menu.Append(wxID_DELETE, towxstring("Delete"));
105 PopupMenu(&menu);
108 void wxeditor_esettings_aliases::on_add(wxCommandEvent& e)
110 CHECK_UI_THREAD;
111 if(closing())
112 return;
113 try {
114 std::string name = pick_text(this, "Enter alias name", "Enter name for the new alias:");
115 if(!inst.command->valid_alias_name(name)) {
116 show_message_ok(this, "Error", "Not a valid alias name: " + name, wxICON_EXCLAMATION);
117 throw canceled_exception();
119 std::string old_alias_value = inst.command->get_alias_for(name);
120 std::string newcmd = pick_text(this, "Edit alias", "Enter new commands for '" + name + "':",
121 old_alias_value, true);
122 inst.command->set_alias_for(name, newcmd);
123 (*inst.abindmanager)();
124 do_notify();
125 } catch(...) {
127 refresh();
130 void wxeditor_esettings_aliases::on_edit(wxCommandEvent& e)
132 CHECK_UI_THREAD;
133 if(closing())
134 return;
135 std::string name = selected();
136 if(name == "") {
137 refresh();
138 return;
140 try {
141 std::string old_alias_value = inst.command->get_alias_for(name);
142 std::string newcmd = pick_text(this, "Edit alias", "Enter new commands for '" + name + "':",
143 old_alias_value, true);
144 inst.command->set_alias_for(name, newcmd);
145 (*inst.abindmanager)();
146 do_notify();
147 } catch(...) {
149 refresh();
152 void wxeditor_esettings_aliases::on_delete(wxCommandEvent& e)
154 CHECK_UI_THREAD;
155 if(closing())
156 return;
157 std::string name = selected();
158 if(name == "") {
159 refresh();
160 return;
162 inst.command->set_alias_for(name, "");
163 (*inst.abindmanager)();
164 do_notify();
165 refresh();
168 void wxeditor_esettings_aliases::refresh()
170 CHECK_UI_THREAD;
171 if(closing())
172 return;
173 int n = select->GetSelection();
174 std::set<std::string> bind;
175 std::vector<wxString> choices;
176 bind = inst.command->get_aliases();
177 for(auto i : bind) {
178 numbers[choices.size()] = i;
179 choices.push_back(towxstring(i));
181 select->Set(choices.size(), &choices[0]);
182 if(n == wxNOT_FOUND && select->GetCount())
183 select->SetSelection(0);
184 else if(n >= (int)select->GetCount())
185 select->SetSelection(select->GetCount() ? (select->GetCount() - 1) : wxNOT_FOUND);
186 else
187 select->SetSelection(n);
188 wxCommandEvent e;
189 on_change(e);
190 select->Refresh();
193 std::string wxeditor_esettings_aliases::selected()
195 CHECK_UI_THREAD;
196 if(closing())
197 return "";
198 int x = select->GetSelection();
199 if(numbers.count(x))
200 return numbers[x];
201 else
202 return "";
205 settings_tab_factory aliases("Aliases", [](wxWindow* parent, emulator_instance& _inst) -> settings_tab* {
206 return new wxeditor_esettings_aliases(parent, _inst);