Make instance vars to be pointers
[lsnes.git] / src / platform / wxwidgets / settings-aliases.cpp
blobe4c3fb29c1a0e69ebf5fc53a690cbb7deb4836bd
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);
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)
30 : settings_tab(parent)
32 wxButton* tmp;
34 wxSizer* top_s = new wxBoxSizer(wxVERTICAL);
35 SetSizer(top_s);
37 top_s->Add(select = new wxListBox(this, wxID_ANY), 1, wxGROW);
38 select->SetMinSize(wxSize(300, 400));
39 select->Connect(wxEVT_COMMAND_LISTBOX_SELECTED,
40 wxCommandEventHandler(wxeditor_esettings_aliases::on_change), NULL, this);
41 select->Connect(wxEVT_RIGHT_UP, wxMouseEventHandler(wxeditor_esettings_aliases::on_mouse), NULL,
42 this);
43 select->Connect(wxEVT_LEFT_UP, wxMouseEventHandler(wxeditor_esettings_aliases::on_mouse), NULL,
44 this);
46 wxBoxSizer* pbutton_s = new wxBoxSizer(wxHORIZONTAL);
47 pbutton_s->AddStretchSpacer();
48 pbutton_s->Add(tmp = new wxButton(this, wxID_ANY, wxT("Add")), 0, wxGROW);
49 tmp->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(wxeditor_esettings_aliases::on_add),
50 NULL, this);
51 pbutton_s->Add(editbutton = new wxButton(this, wxID_ANY, wxT("Edit")), 0, wxGROW);
52 editbutton->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
53 wxCommandEventHandler(wxeditor_esettings_aliases::on_edit), NULL, this);
54 pbutton_s->Add(deletebutton = new wxButton(this, wxID_ANY, wxT("Delete")), 0, wxGROW);
55 deletebutton->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
56 wxCommandEventHandler(wxeditor_esettings_aliases::on_delete), NULL, this);
57 top_s->Add(pbutton_s, 0, wxGROW);
59 refresh();
60 wxCommandEvent e;
61 on_change(e);
62 top_s->SetSizeHints(this);
63 Fit();
66 wxeditor_esettings_aliases::~wxeditor_esettings_aliases()
70 void wxeditor_esettings_aliases::on_change(wxCommandEvent& e)
72 if(closing())
73 return;
74 bool enable = (selected() != "");
75 editbutton->Enable(enable);
76 deletebutton->Enable(enable);
79 void wxeditor_esettings_aliases::on_popup_menu(wxCommandEvent& e)
81 if(closing())
82 return;
83 if(e.GetId() == wxID_EDIT)
84 on_edit(e);
85 else if(e.GetId() == wxID_DELETE)
86 on_delete(e);
89 void wxeditor_esettings_aliases::on_mouse(wxMouseEvent& e)
91 if(!e.RightUp() && !(e.LeftUp() && e.ControlDown()))
92 return;
93 if(selected() == "")
94 return;
95 wxMenu menu;
96 menu.Connect(wxEVT_COMMAND_MENU_SELECTED,
97 wxCommandEventHandler(wxeditor_esettings_aliases::on_popup_menu), NULL, this);
98 menu.Append(wxID_EDIT, towxstring("Edit"));
99 menu.AppendSeparator();
100 menu.Append(wxID_DELETE, towxstring("Delete"));
101 PopupMenu(&menu);
104 void wxeditor_esettings_aliases::on_add(wxCommandEvent& e)
106 if(closing())
107 return;
108 try {
109 std::string name = pick_text(this, "Enter alias name", "Enter name for the new alias:");
110 if(!lsnes_instance.command->valid_alias_name(name)) {
111 show_message_ok(this, "Error", "Not a valid alias name: " + name, wxICON_EXCLAMATION);
112 throw canceled_exception();
114 std::string old_alias_value = lsnes_instance.command->get_alias_for(name);
115 std::string newcmd = pick_text(this, "Edit alias", "Enter new commands for '" + name + "':",
116 old_alias_value, true);
117 lsnes_instance.command->set_alias_for(name, newcmd);
118 (*lsnes_instance.abindmanager)();
119 do_notify();
120 } catch(...) {
122 refresh();
125 void wxeditor_esettings_aliases::on_edit(wxCommandEvent& e)
127 if(closing())
128 return;
129 std::string name = selected();
130 if(name == "") {
131 refresh();
132 return;
134 try {
135 std::string old_alias_value = lsnes_instance.command->get_alias_for(name);
136 std::string newcmd = pick_text(this, "Edit alias", "Enter new commands for '" + name + "':",
137 old_alias_value, true);
138 lsnes_instance.command->set_alias_for(name, newcmd);
139 (*lsnes_instance.abindmanager)();
140 do_notify();
141 } catch(...) {
143 refresh();
146 void wxeditor_esettings_aliases::on_delete(wxCommandEvent& e)
148 if(closing())
149 return;
150 std::string name = selected();
151 if(name == "") {
152 refresh();
153 return;
155 lsnes_instance.command->set_alias_for(name, "");
156 (*lsnes_instance.abindmanager)();
157 do_notify();
158 refresh();
161 void wxeditor_esettings_aliases::refresh()
163 if(closing())
164 return;
165 int n = select->GetSelection();
166 std::set<std::string> bind;
167 std::vector<wxString> choices;
168 bind = lsnes_instance.command->get_aliases();
169 for(auto i : bind) {
170 numbers[choices.size()] = i;
171 choices.push_back(towxstring(i));
173 select->Set(choices.size(), &choices[0]);
174 if(n == wxNOT_FOUND && select->GetCount())
175 select->SetSelection(0);
176 else if(n >= (int)select->GetCount())
177 select->SetSelection(select->GetCount() ? (select->GetCount() - 1) : wxNOT_FOUND);
178 else
179 select->SetSelection(n);
180 wxCommandEvent e;
181 on_change(e);
182 select->Refresh();
185 std::string wxeditor_esettings_aliases::selected()
187 if(closing())
188 return "";
189 int x = select->GetSelection();
190 if(numbers.count(x))
191 return numbers[x];
192 else
193 return "";
196 settings_tab_factory aliases("Aliases", [](wxWindow* parent) -> settings_tab* {
197 return new wxeditor_esettings_aliases(parent);