Refactor emulator status reporting (and fix the statusbar doesn't update bug)
[lsnes.git] / src / platform / wxwidgets / settings-aliases.cpp
blobf904eb90b97ac497eab05e4920c9d2dac3776c0c
1 #include "platform/wxwidgets/settings-common.hpp"
2 #include "platform/wxwidgets/settings-keyentry.hpp"
3 #include "core/command.hpp"
4 #include <wx/defs.h>
6 namespace
8 class wxeditor_esettings_aliases : public settings_tab
10 public:
11 wxeditor_esettings_aliases(wxWindow* parent);
12 ~wxeditor_esettings_aliases();
13 void on_add(wxCommandEvent& e);
14 void on_edit(wxCommandEvent& e);
15 void on_delete(wxCommandEvent& e);
16 void on_change(wxCommandEvent& e);
17 void on_mouse(wxMouseEvent& e);
18 void on_popup_menu(wxCommandEvent& e);
19 private:
20 std::map<int, std::string> numbers;
21 wxListBox* select;
22 wxButton* editbutton;
23 wxButton* deletebutton;
24 void refresh();
25 std::string selected();
28 wxeditor_esettings_aliases::wxeditor_esettings_aliases(wxWindow* parent)
29 : settings_tab(parent)
31 wxButton* tmp;
33 wxSizer* top_s = new wxBoxSizer(wxVERTICAL);
34 SetSizer(top_s);
36 top_s->Add(select = new wxListBox(this, wxID_ANY), 1, wxGROW);
37 select->SetMinSize(wxSize(300, 400));
38 select->Connect(wxEVT_COMMAND_LISTBOX_SELECTED,
39 wxCommandEventHandler(wxeditor_esettings_aliases::on_change), NULL, this);
40 select->Connect(wxEVT_RIGHT_UP, wxMouseEventHandler(wxeditor_esettings_aliases::on_mouse), NULL,
41 this);
42 select->Connect(wxEVT_LEFT_UP, wxMouseEventHandler(wxeditor_esettings_aliases::on_mouse), NULL,
43 this);
45 wxBoxSizer* pbutton_s = new wxBoxSizer(wxHORIZONTAL);
46 pbutton_s->AddStretchSpacer();
47 pbutton_s->Add(tmp = new wxButton(this, wxID_ANY, wxT("Add")), 0, wxGROW);
48 tmp->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(wxeditor_esettings_aliases::on_add),
49 NULL, this);
50 pbutton_s->Add(editbutton = new wxButton(this, wxID_ANY, wxT("Edit")), 0, wxGROW);
51 editbutton->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
52 wxCommandEventHandler(wxeditor_esettings_aliases::on_edit), NULL, this);
53 pbutton_s->Add(deletebutton = new wxButton(this, wxID_ANY, wxT("Delete")), 0, wxGROW);
54 deletebutton->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
55 wxCommandEventHandler(wxeditor_esettings_aliases::on_delete), NULL, this);
56 top_s->Add(pbutton_s, 0, wxGROW);
58 refresh();
59 wxCommandEvent e;
60 on_change(e);
61 top_s->SetSizeHints(this);
62 Fit();
65 wxeditor_esettings_aliases::~wxeditor_esettings_aliases()
69 void wxeditor_esettings_aliases::on_change(wxCommandEvent& e)
71 if(closing())
72 return;
73 bool enable = (selected() != "");
74 editbutton->Enable(enable);
75 deletebutton->Enable(enable);
78 void wxeditor_esettings_aliases::on_popup_menu(wxCommandEvent& e)
80 if(closing())
81 return;
82 if(e.GetId() == wxID_EDIT)
83 on_edit(e);
84 else if(e.GetId() == wxID_DELETE)
85 on_delete(e);
88 void wxeditor_esettings_aliases::on_mouse(wxMouseEvent& e)
90 if(!e.RightUp() && !(e.LeftUp() && e.ControlDown()))
91 return;
92 if(selected() == "")
93 return;
94 wxMenu menu;
95 menu.Connect(wxEVT_COMMAND_MENU_SELECTED,
96 wxCommandEventHandler(wxeditor_esettings_aliases::on_popup_menu), NULL, this);
97 menu.Append(wxID_EDIT, towxstring("Edit"));
98 menu.AppendSeparator();
99 menu.Append(wxID_DELETE, towxstring("Delete"));
100 PopupMenu(&menu);
103 void wxeditor_esettings_aliases::on_add(wxCommandEvent& e)
105 if(closing())
106 return;
107 try {
108 std::string name = pick_text(this, "Enter alias name", "Enter name for the new alias:");
109 if(!lsnes_cmd.valid_alias_name(name)) {
110 show_message_ok(this, "Error", "Not a valid alias name: " + name, wxICON_EXCLAMATION);
111 throw canceled_exception();
113 std::string old_alias_value = lsnes_cmd.get_alias_for(name);
114 std::string newcmd = pick_text(this, "Edit alias", "Enter new commands for '" + name + "':",
115 old_alias_value, true);
116 lsnes_cmd.set_alias_for(name, newcmd);
117 refresh_alias_binds();
118 do_notify();
119 } catch(...) {
121 refresh();
124 void wxeditor_esettings_aliases::on_edit(wxCommandEvent& e)
126 if(closing())
127 return;
128 std::string name = selected();
129 if(name == "") {
130 refresh();
131 return;
133 try {
134 std::string old_alias_value = lsnes_cmd.get_alias_for(name);
135 std::string newcmd = pick_text(this, "Edit alias", "Enter new commands for '" + name + "':",
136 old_alias_value, true);
137 lsnes_cmd.set_alias_for(name, newcmd);
138 refresh_alias_binds();
139 do_notify();
140 } catch(...) {
142 refresh();
145 void wxeditor_esettings_aliases::on_delete(wxCommandEvent& e)
147 if(closing())
148 return;
149 std::string name = selected();
150 if(name == "") {
151 refresh();
152 return;
154 lsnes_cmd.set_alias_for(name, "");
155 refresh_alias_binds();
156 do_notify();
157 refresh();
160 void wxeditor_esettings_aliases::refresh()
162 if(closing())
163 return;
164 int n = select->GetSelection();
165 std::set<std::string> bind;
166 std::vector<wxString> choices;
167 bind = lsnes_cmd.get_aliases();
168 for(auto i : bind) {
169 numbers[choices.size()] = i;
170 choices.push_back(towxstring(i));
172 select->Set(choices.size(), &choices[0]);
173 if(n == wxNOT_FOUND && select->GetCount())
174 select->SetSelection(0);
175 else if(n >= (int)select->GetCount())
176 select->SetSelection(select->GetCount() ? (select->GetCount() - 1) : wxNOT_FOUND);
177 else
178 select->SetSelection(n);
179 wxCommandEvent e;
180 on_change(e);
181 select->Refresh();
184 std::string wxeditor_esettings_aliases::selected()
186 if(closing())
187 return "";
188 int x = select->GetSelection();
189 if(numbers.count(x))
190 return numbers[x];
191 else
192 return "";
195 settings_tab_factory aliases("Aliases", [](wxWindow* parent) -> settings_tab* {
196 return new wxeditor_esettings_aliases(parent);