1 #include "platform/wxwidgets/settings-common.hpp"
2 #include "platform/wxwidgets/settings-keyentry.hpp"
3 #include "core/keymapper.hpp"
4 #include "library/string.hpp"
10 wxID_ADDKEY
= wxID_HIGHEST
+ 1,
14 class wxeditor_esettings_controllers
: public settings_tab
17 wxeditor_esettings_controllers(wxWindow
* parent
);
18 ~wxeditor_esettings_controllers();
19 void on_setkey(wxCommandEvent
& e
);
20 void on_clearkey(wxCommandEvent
& e
);
21 void on_change(wxCommandEvent
& e
);
22 void on_mouse(wxMouseEvent
& e
);
23 void on_popup_menu(wxCommandEvent
& e
);
26 std::map
<string_list
<char>, wxTreeItemId
> items
;
27 std::map
<string_list
<char>, std::string
> names
;
28 std::map
<string_list
<char>, keyboard::ctrlrkey
*> realitems
;
30 wxButton
* clear_button
;
32 string_list
<char> get_selection();
33 wxTreeItemId
get_item(const string_list
<char>& i
);
36 wxeditor_esettings_controllers::wxeditor_esettings_controllers(wxWindow
* parent
)
37 : settings_tab(parent
)
39 wxSizer
* top_s
= new wxBoxSizer(wxVERTICAL
);
43 top_s
->Add(controls
= new wxTreeCtrl(this, wxID_ANY
, wxDefaultPosition
, wxDefaultSize
,
44 wxTR_HIDE_ROOT
| wxTR_LINES_AT_ROOT
), 1, wxGROW
);
45 controls
->SetMinSize(wxSize(300, 400));
46 controls
->Connect(wxEVT_COMMAND_TREE_SEL_CHANGED
,
47 wxCommandEventHandler(wxeditor_esettings_controllers::on_change
), NULL
, this);
48 controls
->Connect(wxEVT_RIGHT_UP
, wxMouseEventHandler(wxeditor_esettings_controllers::on_mouse
), NULL
,
50 controls
->Connect(wxEVT_LEFT_UP
, wxMouseEventHandler(wxeditor_esettings_controllers::on_mouse
), NULL
,
52 controls
->SetMinSize(wxSize(400, 300));
54 wxBoxSizer
* pbutton_s
= new wxBoxSizer(wxHORIZONTAL
);
55 pbutton_s
->AddStretchSpacer();
56 pbutton_s
->Add(set_button
= new wxButton(this, wxID_ANY
, wxT("Add")), 0, wxGROW
);
57 set_button
->Connect(wxEVT_COMMAND_BUTTON_CLICKED
,
58 wxCommandEventHandler(wxeditor_esettings_controllers::on_setkey
), NULL
, this);
59 set_button
->Enable(false);
60 pbutton_s
->Add(clear_button
= new wxButton(this, wxID_ANY
, wxT("Drop")), 0, wxGROW
);
61 clear_button
->Connect(wxEVT_COMMAND_BUTTON_CLICKED
,
62 wxCommandEventHandler(wxeditor_esettings_controllers::on_clearkey
), NULL
, this);
63 clear_button
->Enable(false);
64 top_s
->Add(pbutton_s
, 0, wxGROW
);
66 items
[string_list
<char>()] = controls
->AddRoot(wxT(""));
69 top_s
->SetSizeHints(this);
73 wxTreeItemId
wxeditor_esettings_controllers::get_item(const string_list
<char>& i
)
76 return items
[string_list
<char>()];
77 if(items
.count(i
) && items
[i
].IsOk())
79 return items
[i
] = controls
->AppendItem(get_item(i
.strip_one()), towxstring(i
[i
.size() - 1]));
82 string_list
<char> wxeditor_esettings_controllers::get_selection()
85 return string_list
<char>();
86 string_list
<char> sel
;
87 wxTreeItemId id
= controls
->GetSelection();
94 void wxeditor_esettings_controllers::on_change(wxCommandEvent
& e
)
98 string_list
<char> sel
= get_selection();
99 set_button
->Enable(realitems
.count(sel
));
100 clear_button
->Enable(realitems
.count(sel
));
103 wxeditor_esettings_controllers::~wxeditor_esettings_controllers()
107 void wxeditor_esettings_controllers::on_setkey(wxCommandEvent
& e
)
111 string_list
<char> sel
= get_selection();
112 std::string name
= names
.count(sel
) ? names
[sel
] : "";
118 keyboard::ctrlrkey
* ik
= realitems
[sel
];
123 bool axis
= ik
->is_axis();
124 std::string wtitle
= (axis
? "Specify axis for " : "Specify key for ") + name
;
125 press_button_dialog
* p
= new press_button_dialog(this, wtitle
, axis
);
127 std::string key
= p
->getkey();
136 void wxeditor_esettings_controllers::on_clearkey(wxCommandEvent
& e
)
140 string_list
<char> sel
= get_selection();
141 std::string name
= names
.count(sel
) ? names
[sel
] : "";
147 keyboard::ctrlrkey
* ik
= realitems
[sel
];
152 std::vector
<wxString
> dropchoices
;
155 while((tmp
= ik
->get_string(idx
++)) != "")
156 dropchoices
.push_back(towxstring(tmp
));
158 if(dropchoices
.size() == 0) {
162 if(dropchoices
.size() > 1) {
163 wxSingleChoiceDialog
* d2
= new wxSingleChoiceDialog(this,
164 towxstring("Select key to remove from set"), towxstring("Pick key to drop"),
165 dropchoices
.size(), &dropchoices
[0]);
166 if(d2
->ShowModal() == wxID_CANCEL
) {
171 idx
= d2
->GetSelection();
174 auto g
= ik
->get(idx
);
175 ik
->remove(g
.first
, g
.second
);
181 void wxeditor_esettings_controllers::on_popup_menu(wxCommandEvent
& e
)
185 if(e
.GetId() == wxID_ADDKEY
)
187 else if(e
.GetId() >= wxID_DROPKEY
) {
188 string_list
<char> sel
= get_selection();
189 if(!realitems
.count(sel
))
191 keyboard::ctrlrkey
* ik
= realitems
[sel
];
194 auto g
= ik
->get(e
.GetId() - wxID_DROPKEY
);
195 ik
->remove(g
.first
, g
.second
);
200 void wxeditor_esettings_controllers::on_mouse(wxMouseEvent
& e
)
202 if(!e
.RightUp() && !(e
.LeftUp() && e
.ControlDown()))
204 string_list
<char> sel
= get_selection();
205 if(!realitems
.count(sel
))
207 keyboard::ctrlrkey
* ik
= realitems
[sel
];
212 menu
.Connect(wxEVT_COMMAND_MENU_SELECTED
,
213 wxCommandEventHandler(wxeditor_esettings_controllers::on_popup_menu
), NULL
, this);
214 menu
.Append(wxID_ADDKEY
, towxstring("Add new key"));
218 while((tmp
= ik
->get_string(idx
++)) != "") {
220 menu
.AppendSeparator();
222 menu
.Append(wxID_DROPKEY
+ idx
- 1, towxstring("Drop " + tmp
));
227 void wxeditor_esettings_controllers::refresh()
231 std::map
<keyboard::ctrlrkey
*, std::string
> data
;
232 auto x
= lsnes_mapper
.get_controller_keys();
235 string_list
<char> key
= split_on_codepoint(y
->get_name(), U
'\u2023');
236 names
[key
] = y
->get_name();
240 while((tmp
= y
->get_string(idx
++)) != "")
241 data
[y
] += ((data
[y
] != "") ? ", " : "") + tmp
;
244 //Delete no longer present stuff.
245 for(auto i
= items
.rbegin(); i
!= items
.rend(); i
++) {
246 auto j
= realitems
.lower_bound(i
->first
);
247 if(j
== realitems
.end() || !i
->first
.prefix_of(j
->first
)) {
250 controls
->Delete(i
->second
);
251 items
[i
->first
] = wxTreeItemId();
254 for(auto i
: realitems
) {
255 string_list
<char> key
= i
.first
;
256 std::string text
= key
[key
.size() - 1];
257 if(data
[i
.second
] == "")
258 text
= text
+ " (not set)";
260 text
= text
+ " (" + clean_keystring(data
[i
.second
]) + ")";
261 wxTreeItemId id
= get_item(key
);
262 controls
->SetItemText(id
, towxstring(text
));
269 settings_tab_factory
controllers("Controllers", [](wxWindow
* parent
) -> settings_tab
* {
270 return new wxeditor_esettings_controllers(parent
);