1 #include "platform/wxwidgets/settings-common.hpp"
2 #include "core/instance.hpp"
3 #include "core/settings.hpp"
9 wxID_CHANGE
= wxID_HIGHEST
+ 1
12 class wxeditor_esettings_advanced
: public settings_tab
15 wxeditor_esettings_advanced(wxWindow
* parent
, emulator_instance
& _inst
);
16 ~wxeditor_esettings_advanced();
17 void on_change(wxCommandEvent
& e
);
18 void on_change2(wxMouseEvent
& e
);
19 void on_selchange(wxCommandEvent
& e
);
20 void on_setting_change(const settingvar::base
& val
);
21 void on_mouse(wxMouseEvent
& e
);
22 void on_popup_menu(wxCommandEvent
& e
);
24 struct listener
: public settingvar::listener
26 listener(settingvar::group
& group
, wxeditor_esettings_advanced
& _obj
)
27 : obj(_obj
), grp(group
)
29 group
.add_listener(*this);
33 grp
.remove_listener(*this);
35 void on_setting_change(settingvar::group
& grp
, const settingvar::base
& val
)
37 obj
.on_setting_change(val
);
39 wxeditor_esettings_advanced
& obj
;
40 settingvar::group
& grp
;
45 std::set
<std::string
> settings
;
46 std::map
<std::string
, std::string
> values
;
47 std::map
<std::string
, std::string
> names
;
48 std::map
<int, std::string
> selections
;
49 std::string
selected();
50 wxButton
* changebutton
;
54 wxeditor_esettings_advanced::wxeditor_esettings_advanced(wxWindow
* parent
, emulator_instance
& _inst
)
55 : settings_tab(parent
, _inst
), _listener(*inst
.settings
, *this)
58 wxSizer
* top_s
= new wxBoxSizer(wxVERTICAL
);
61 top_s
->Add(_settings
= new wxListBox(this, wxID_ANY
), 1, wxGROW
);
62 _settings
->SetMinSize(wxSize(300, 400));
63 _settings
->Connect(wxEVT_COMMAND_LISTBOX_SELECTED
,
64 wxCommandEventHandler(wxeditor_esettings_advanced::on_selchange
), NULL
, this);
65 _settings
->Connect(wxEVT_RIGHT_UP
, wxMouseEventHandler(wxeditor_esettings_advanced::on_mouse
), NULL
,
67 _settings
->Connect(wxEVT_LEFT_UP
, wxMouseEventHandler(wxeditor_esettings_advanced::on_mouse
), NULL
,
70 wxBoxSizer
* pbutton_s
= new wxBoxSizer(wxHORIZONTAL
);
71 pbutton_s
->AddStretchSpacer();
72 pbutton_s
->Add(changebutton
= new wxButton(this, wxID_ANY
, wxT("Change")), 0, wxGROW
);
73 _settings
->Connect(wxEVT_LEFT_DCLICK
,
74 wxMouseEventHandler(wxeditor_esettings_advanced::on_change2
), NULL
, this);
75 changebutton
->Connect(wxEVT_COMMAND_BUTTON_CLICKED
,
76 wxCommandEventHandler(wxeditor_esettings_advanced::on_change
), NULL
, this);
77 top_s
->Add(pbutton_s
, 0, wxGROW
);
82 top_s
->SetSizeHints(this);
86 wxeditor_esettings_advanced::~wxeditor_esettings_advanced()
90 std::string
change_value_of_boolean(const std::string
& name
, const settingvar::description
& desc
,
91 const std::string
& current
)
93 return string_to_bool(current
) ? "0" : "1";
96 std::string
change_value_of_enumeration(wxWindow
* parent
, const std::string
& name
,
97 const settingvar::description
& desc
, const std::string
& current
)
100 std::vector
<std::string
> valset
;
102 for(unsigned i
= 0; i
<= desc
._enumeration
->max_val(); i
++) {
103 valset
.push_back(desc
._enumeration
->get(i
));
104 if(desc
._enumeration
->get(i
) == current
)
107 return pick_among(parent
, "Set value to", "Set " + name
+ " to value:", valset
, dflt
);
110 std::string
change_value_of_string(wxWindow
* parent
, const std::string
& name
,
111 const settingvar::description
& desc
, const std::string
& current
)
113 return pick_text(parent
, "Set value to", "Set " + name
+ " to value:", current
);
116 class numeric_inputbox
: public wxDialog
119 numeric_inputbox(wxWindow
* parent
, const std::string
& name
, int64_t minval
, int64_t maxval
,
120 const std::string
& val
)
121 : wxDialog(parent
, wxID_ANY
, wxT("Set value to"))
124 wxSizer
* s1
= new wxBoxSizer(wxVERTICAL
);
126 s1
->Add(new wxStaticText(this, wxID_ANY
, towxstring("Set " + name
+ " to value:")), 0,
129 s1
->Add(sp
= new wxSpinCtrl(this, wxID_ANY
, wxT(""), wxDefaultPosition
, wxDefaultSize
,
130 wxSP_ARROW_KEYS
, minval
, maxval
, parse_value
<int64_t>(val
)), 1, wxGROW
);
132 wxBoxSizer
* pbutton_s
= new wxBoxSizer(wxHORIZONTAL
);
133 pbutton_s
->AddStretchSpacer();
135 pbutton_s
->Add(t
= new wxButton(this, wxID_CANCEL
, wxT("Cancel")), 0, wxGROW
);
136 t
->Connect(wxEVT_COMMAND_BUTTON_CLICKED
,
137 wxCommandEventHandler(numeric_inputbox::on_button
), NULL
, this);
138 pbutton_s
->Add(t
= new wxButton(this, wxID_OK
, wxT("OK")), 0, wxGROW
);
139 t
->Connect(wxEVT_COMMAND_BUTTON_CLICKED
,
140 wxCommandEventHandler(numeric_inputbox::on_button
), NULL
, this);
141 s1
->Add(pbutton_s
, 0, wxGROW
);
143 s1
->SetSizeHints(this);
145 std::string
get_value() { return (stringfmt() << sp
->GetValue()).str(); }
146 void on_button(wxCommandEvent
& e
) { EndModal(e
.GetId()); }
151 class path_inputbox
: public wxDialog
154 path_inputbox(wxWindow
* parent
, const std::string
& name
, const std::string
& val
)
155 : wxDialog(parent
, wxID_ANY
, wxT("Set path to"))
159 wxSizer
* s1
= new wxBoxSizer(wxVERTICAL
);
161 s1
->Add(new wxStaticText(this, wxID_ANY
, towxstring("Set " + name
+ " to value:")), 0,
163 wxSizer
* s2
= new wxBoxSizer(wxHORIZONTAL
);
164 s2
->Add(pth
= new wxTextCtrl(this, wxID_ANY
, towxstring(val
), wxDefaultPosition
,
165 wxSize(400, -1)), 1, wxGROW
);
166 s2
->Add(t
= new wxButton(this, wxID_HIGHEST
+ 1, wxT("...")), 0, wxGROW
);
167 t
->Connect(wxEVT_COMMAND_BUTTON_CLICKED
,
168 wxCommandEventHandler(path_inputbox::on_pbutton
), NULL
, this);
169 s1
->Add(s2
, 1, wxGROW
);
171 wxBoxSizer
* pbutton_s
= new wxBoxSizer(wxHORIZONTAL
);
172 pbutton_s
->AddStretchSpacer();
173 pbutton_s
->Add(t
= new wxButton(this, wxID_CANCEL
, wxT("Cancel")), 0, wxGROW
);
174 t
->Connect(wxEVT_COMMAND_BUTTON_CLICKED
,
175 wxCommandEventHandler(path_inputbox::on_button
), NULL
, this);
176 pbutton_s
->Add(t
= new wxButton(this, wxID_OK
, wxT("OK")), 0, wxGROW
);
177 t
->Connect(wxEVT_COMMAND_BUTTON_CLICKED
,
178 wxCommandEventHandler(path_inputbox::on_button
), NULL
, this);
179 s1
->Add(pbutton_s
, 0, wxGROW
);
181 s1
->SetSizeHints(this);
183 std::string
get_value() { return tostdstring(pth
->GetValue()); }
184 void on_pbutton(wxCommandEvent
& e
) {
186 d
= new wxDirDialog(this, wxT("Select project directory"),
187 pth
->GetValue(), wxDD_DIR_MUST_EXIST
);
188 if(d
->ShowModal() == wxID_CANCEL
) {
192 pth
->SetValue(d
->GetPath());
195 void on_button(wxCommandEvent
& e
) {
207 std::string
change_value_of_numeric(wxWindow
* parent
, const std::string
& name
,
208 const settingvar::description
& desc
, const std::string
& current
)
211 auto d
= new numeric_inputbox(parent
, name
, desc
.min_val
, desc
.max_val
, current
);
212 int x
= d
->ShowModal();
213 if(x
== wxID_CANCEL
) {
215 throw canceled_exception();
217 std::string v
= d
->get_value();
222 std::string
change_value_of_path(wxWindow
* parent
, const std::string
& name
,
223 const settingvar::description
& desc
, const std::string
& current
)
226 auto d
= new path_inputbox(parent
, name
, current
);
227 int x
= d
->ShowModal();
228 if(x
== wxID_CANCEL
) {
230 throw canceled_exception();
232 std::string v
= d
->get_value();
237 void wxeditor_esettings_advanced::on_popup_menu(wxCommandEvent
& e
)
242 if(e
.GetId() == wxID_EDIT
)
246 void wxeditor_esettings_advanced::on_mouse(wxMouseEvent
& e
)
249 if(!e
.RightUp() && !(e
.LeftUp() && e
.ControlDown()))
254 menu
.Connect(wxEVT_COMMAND_MENU_SELECTED
,
255 wxCommandEventHandler(wxeditor_esettings_advanced::on_popup_menu
), NULL
, this);
256 menu
.Append(wxID_EDIT
, towxstring("Change"));
260 void wxeditor_esettings_advanced::on_change2(wxMouseEvent
& e
)
267 void wxeditor_esettings_advanced::on_change(wxCommandEvent
& e
)
272 std::string name
= selected();
277 value
= inst
.setcache
->get(name
);
278 auto model
= inst
.setcache
->get_description(name
);
281 case settingvar::description::T_BOOLEAN
:
282 value
= change_value_of_boolean(name
, model
, value
); break;
283 case settingvar::description::T_NUMERIC
:
284 value
= change_value_of_numeric(this, name
, model
, value
); break;
285 case settingvar::description::T_STRING
:
286 value
= change_value_of_string(this, name
, model
, value
); break;
287 case settingvar::description::T_PATH
:
288 value
= change_value_of_path(this, name
, model
, value
); break;
289 case settingvar::description::T_ENUMERATION
:
290 value
= change_value_of_enumeration(this, name
, model
, value
); break;
292 value
= change_value_of_string(this, name
, model
, value
); break;
297 inst
.iqueue
->run([this, name
, value
]() {
298 run_show_error(this, "Error setting value", "", [name
, value
]() {
299 CORE().setcache
->set(name
, value
);
304 void wxeditor_esettings_advanced::on_selchange(wxCommandEvent
& e
)
309 std::string sel
= selected();
310 bool enable
= (sel
!= "");
311 changebutton
->Enable(enable
);
314 void wxeditor_esettings_advanced::on_setting_change(const settingvar::base
& val
)
318 runuifun([this, &val
]() {
320 std::string setting
= val
.get_iname();
321 std::string value
= val
.str();
322 this->settings
.insert(setting
);
323 this->values
[setting
] = value
;
328 void wxeditor_esettings_advanced::refresh()
333 settings
= inst
.setcache
->get_keys();
334 for(auto i
: settings
) {
335 values
[i
] = inst
.setcache
->get(i
);
336 names
[i
] = inst
.setcache
->get_hname(i
);
341 std::string
wxeditor_esettings_advanced::selected()
346 int x
= _settings
->GetSelection();
347 if(selections
.count(x
))
348 return selections
[x
];
353 void wxeditor_esettings_advanced::_refresh()
358 std::vector
<wxString
> strings
;
359 std::multimap
<std::string
, std::string
> sort
;
361 for(auto i
: settings
)
362 sort
.insert(std::make_pair(names
[i
], i
));
364 //FIXME: Do something with this?
365 //auto description = inst.setcache->get_description(i.second);
366 strings
.push_back(towxstring(names
[i
.second
] + " (Value: " + values
[i
.second
] + ")"));
367 selections
[k
++] = i
.second
;
369 _settings
->Set(strings
.size(), &strings
[0]);
372 settings_tab_factory
advanced_tab("Advanced", [](wxWindow
* parent
, emulator_instance
& _inst
) ->
374 return new wxeditor_esettings_advanced(parent
, _inst
);