168 : DPIDialog(
static_cast<wxWindow*
>(wxGetApp().mainframe), wxID_ANY,
_L(
"Troubleshoot Center"),
169 wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE)
170{
172 SetBackgroundColour(*wxWHITE);
173
175 auto app_config = wxGetApp().app_config;
176 bool is_dark = app_config->get(
"dark_color_mode") ==
"1";
177
178
179
180
181 m_logo = ScalableBitmap(
this,
is_dark ?
"OrcaSlicer_horizontal_dark" :
"OrcaSlicer_horizontal_light", 64);
183 auto logo_line = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, FromDIP(2)));
185 auto version = new Label(this, wxString(SoftFever_VERSION), wxALIGN_CENTRE_HORIZONTAL);
186 wxFont version_font = GetFont();
187 version_font = version_font.Scaled(1.65f);
188 version->SetFont(version_font);
190
193 auto hash_url =
"https://github.com/OrcaSlicer/OrcaSlicer/commit/" + wxString(
build_commit_hash);
194 build->SetToolTip(hash_url);
195 build->Bind(wxEVT_BUTTON, [hash_url](wxCommandEvent &e) {
196 wxLaunchDefaultBrowser(hash_url);
197 });
198
199
200 auto sys_info_lines = [this](bool show_sys) {
201 if(!show_sys)
202 return std::vector<wxString>{
GetOStype()};
203 return std::vector<wxString>{
205#ifdef __LINUX__
207#else
209#endif
214 };
215 };
216
217 auto* sys_panel = new CenteredMultiLinePanel(this, sys_info_lines(true));
218 sys_panel->SetBackgroundColour(*wxWHITE);
220
221 auto sys_less_btn =
new Button(
this,
_L(
"Hide"));
223 sys_less_btn->SetToolTip(
_L(
"Show/Hide system information"));
224
225 auto sys_copy_btn =
new Button(
this,
_L(
"Copy"));
227 sys_copy_btn->SetToolTip(
_L(
"Copy system information to clipboard"));
228
229 sys_copy_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) {
230 wxClipboardLocker
lock;
231 if (!lock)
232 return false;
233 return wxTheClipboard->SetData(
new wxTextDataObject(
GetSysInfoAll()));
234 });
235
236 sys_less_btn->Bind(wxEVT_BUTTON, [this, sys_panel, sys_less_btn, sys_info_lines](wxCommandEvent &e) {
240 Layout();
241 Fit();
242 });
243
244 auto wiki_btn = new Button(this, "", "toolbar_wiki", 0, 15);
245 auto wiki_url = "https://www.orcaslicer.com/wiki/troubleshoot_center";
246 wiki_btn->SetToolTip(
_L(
"Wiki Guide") +
"\n" + wiki_url);
248 wiki_btn->SetCanFocus(false);
249 wiki_btn->Bind(wxEVT_LEFT_DOWN, ([wiki_url](auto& e) {wxLaunchDefaultBrowser(wiki_url);}));
250
251 auto video_btn = new Button(this, "", "toolbar_video_guide", 0, 15);
252 auto video_url = "https://www.youtube.com/watch?v=CFzt8W7OCx0";
253 video_btn->SetToolTip(
_L(
"Video Guide") +
"\n" + video_url);
255 video_btn->SetCanFocus(false);
256 video_btn->Bind(wxEVT_LEFT_DOWN, ([video_url](auto& e) {wxLaunchDefaultBrowser(video_url);}));
257
258
259
260 auto create_title = [this](wxString title) {
261 auto line = new StaticLine(this, false, title);
264 return line;
265 };
266
267 auto create_label = [this](wxString title, wxString tooltip, Label** label_out = nullptr) {
268 wxBoxSizer *sizer = new wxBoxSizer(wxHORIZONTAL);
269 auto label =
new Label(
this, title,
LB_AUTO_WRAP, wxSize(FromDIP(275),-1));
271 label->SetToolTip(tooltip);
272 sizer->Add(label, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, FromDIP(15));
273
274 if (label_out) *label_out = label;
275
276 return sizer;
277 };
278
279 auto create_btn = [this](wxString title, wxString tooltip) {
280 auto btn = new Button(this, title);
281 btn->SetToolTip(tooltip);
283 return btn;
284 };
285
286
287 auto create_info_line = [this](wxString title) {
288 auto info = new Label(this, title);
290 info->SetMaxSize(wxSize(FromDIP(400),-1));
291 info->Wrap(FromDIP(400));
292 return info;
293 };
294
295 auto info_desc_1 = create_info_line(
_L(
"We need information for diagnosing source of the issue. Check wiki page for detailed guide."));
296 auto info_desc_2 = create_info_line(
_L(
"Pack button collects project file and logs of current session onto a ZIP archive."));
297 auto info_desc_3 = create_info_line(
_L(
"Any additional visual examples like images or screen recordings might be helpful while reporting the issue."));
298 wxBoxSizer *info_desc_sizer = new wxBoxSizer(wxVERTICAL);
299 info_desc_sizer->Add(info_desc_1, 0, wxEXPAND | wxBOTTOM, FromDIP(8));
300 info_desc_sizer->Add(info_desc_2, 0, wxEXPAND | wxBOTTOM, FromDIP(8));
301 info_desc_sizer->Add(info_desc_3, 0, wxEXPAND);
302
303 auto link_report =
new HyperLink(
this,
_L(
"Report issue") +
" ");
304 link_report->Bind(wxEVT_LEFT_DOWN, [
this](
wxMouseEvent &e) {
305 auto encodeStr = [](const wxString& text) {
306 wxString out;
307 const wxScopedCharBuffer utf8 = text.utf8_str();
308 for (const unsigned char* p = (const unsigned char*)utf8.data(); *p; ++p) {
309 unsigned char c = *p;
310 if (isalnum(c) || c == '-' || c == '_' || c == '.' || c == '~')
311 out += (wxChar)c;
312 else
313 out += wxString::Format(wxT("%%%02X"), c);
314 }
315 return out;
316 };
317
318 wxString url = "https://github.com/OrcaSlicer/OrcaSlicer/issues/new?template=bug_report.yml";
320 if(!os.IsEmpty())
321 url += "&os_type=%22" + os +"%22";
322 url += "&version=" + encodeStr(wxString(SoftFever_VERSION));
323 url +=
"&os_version=" + encodeStr(
GetOSinfo());
324 wxLaunchDefaultBrowser(url);
325 });
326
327 auto pack_btn =
new Button(
this,
_L(
"Pack") +
"...");
329 pack_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) {
331 });
332
333
334 auto prf_sys_cache_tip =
_L(
"Cleans and rebuilds system profiles cache on next launch.");
335 auto prf_sys_cache_szr = create_label(
_L(
"Clean system profiles cache"), prf_sys_cache_tip);
336 auto prf_sys_cache_btn = create_btn(
_L(
"Clean"), prf_sys_cache_tip);
337 prf_sys_cache_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) {
339 });
340 prf_sys_cache_szr->Add(prf_sys_cache_btn, 0, wxALIGN_CENTER_VERTICAL);
341
342 auto prf_loaded_szr = create_label(
_L(
"Loaded profiles overview"),
_L(
"This section shows information for loaded profiles."));
343 auto prf_loaded_btn = create_btn(
_L(
"Export") +
dots,
_L(
"Exports detailed overview of loaded profiles in json format."));
344 prf_loaded_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) {
346 });
347 prf_loaded_szr->Add(prf_loaded_btn, 0, wxALIGN_CENTER_VERTICAL);
348
350
351
352 auto cfg_folder_szr = create_label(
_L(
"Configurations folder"),
"");
353 auto cfg_folder_btn = create_btn(
_L(
"Browse") +
"...",
_L(
"Opens configurations folder."));
354 cfg_folder_btn->Bind(wxEVT_BUTTON, [
this,
data_dir](wxCommandEvent &e) {
356 });
357 cfg_folder_szr->Add(cfg_folder_btn, 0, wxALIGN_CENTER_VERTICAL);
358
359 auto log_level_szr = create_label(
_L(
"Log level"),
"");
361
362 auto log_pack_szr = create_label(
_L(
"Stored logs"),
_L(
"Packs all stored logs onto a ZIP archive."));
363 auto log_pack_btn = create_btn(
_L(
"Pack") +
"...",
"");
364 log_pack_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) {
367 });
368 log_pack_szr->Add(log_pack_btn, 0, wxALIGN_CENTER_VERTICAL);
369
371 auto log_clear_btn = create_btn(
_L(
"Clear"),
"");
372 log_clear_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) {
374 });
375 log_clear_szr->Add(log_clear_btn, 0, wxALIGN_CENTER_VERTICAL);
376
378
379
380 wxBoxSizer *left_sizer = new wxBoxSizer(wxVERTICAL);
381
382 wxBoxSizer *sys_btn_sizer = new wxBoxSizer(wxHORIZONTAL);
383 sys_btn_sizer->Add(sys_less_btn, 0, wxLEFT | wxRIGHT, FromDIP(5));
384 sys_btn_sizer->AddStretchSpacer();
385 sys_btn_sizer->Add(sys_copy_btn, 0, wxLEFT | wxRIGHT, FromDIP(5));
386
387 wxBoxSizer *link_btn_sizer = new wxBoxSizer(wxHORIZONTAL);
388 link_btn_sizer->Add(wiki_btn);
389 link_btn_sizer->Add(video_btn, 0, wxLEFT, FromDIP(10));
390
391 left_sizer->Add(
m_header_logo , 0, wxEXPAND | wxALIGN_CENTER);
392 left_sizer->Add(logo_line , 0, wxEXPAND | wxTOP, FromDIP(12));
393 left_sizer->Add(version , 0, wxEXPAND | wxTOP, FromDIP(6));
394 left_sizer->Add(build , 0, wxALIGN_CENTER | wxTOP, FromDIP(4));
395 left_sizer->Add(sys_panel , 0, wxEXPAND | wxTOP, FromDIP(15));
396 left_sizer->AddStretchSpacer();
397 left_sizer->Add(sys_btn_sizer , 0, wxEXPAND | wxTOP, FromDIP(15));
398 left_sizer->Add(link_btn_sizer , 0, wxALIGN_CENTER | wxTOP, FromDIP(15));
399
400 wxBoxSizer *right_sizer = new wxBoxSizer(wxVERTICAL);
401
402 wxBoxSizer *pack_btn_sizer = new wxBoxSizer(wxHORIZONTAL);
403 pack_btn_sizer->Add(link_report , 0, wxRIGHT, FromDIP(5));
404 pack_btn_sizer->AddStretchSpacer();
405 pack_btn_sizer->Add(pack_btn);
406
407 right_sizer->Add(create_title(
_L(
"Information")), 0, wxEXPAND);
408 right_sizer->Add(info_desc_sizer , 0, wxEXPAND | wxTOP, FromDIP(5));
409 right_sizer->Add(pack_btn_sizer , 0, wxEXPAND | wxTOP, FromDIP(12));
410
411 right_sizer->Add(create_title(
_L(
"Profiles")) , 0, wxEXPAND | wxTOP, FromDIP(12));
412 right_sizer->Add(prf_sys_cache_szr , 0, wxEXPAND | wxTOP, FromDIP(8));
413 right_sizer->Add(prf_loaded_szr , 0, wxEXPAND | wxTOP, FromDIP(5));
414 right_sizer->Add(profiles_loaded , 0, wxEXPAND | wxTOP, FromDIP(5));
415
416 right_sizer->Add(create_title(
_L(
"More")) , 0, wxEXPAND | wxTOP, FromDIP(12));
417 right_sizer->Add(cfg_folder_szr , 0, wxEXPAND | wxTOP, FromDIP(8));
418 right_sizer->Add(log_level_szr , 0, wxEXPAND | wxTOP, FromDIP(5));
419 right_sizer->Add(log_pack_szr , 0, wxEXPAND | wxTOP, FromDIP(5));
420 right_sizer->Add(log_clear_szr , 0, wxEXPAND | wxTOP, FromDIP(5));
421
422 wxBoxSizer *m_sizer = new wxBoxSizer(wxHORIZONTAL);
423 m_sizer->Add(left_sizer , 0, wxEXPAND | wxTOP | wxBOTTOM | wxLEFT , FromDIP(15));
424 m_sizer->AddSpacer(FromDIP(20));
425 m_sizer->Add(right_sizer, 0, wxEXPAND | wxTOP | wxBOTTOM | wxRIGHT, FromDIP(15));
426
427 SetSizerAndFit(m_sizer);
428 Layout();
429 Fit();
430 CenterOnParent();
431 wxGetApp().UpdateDlgDarkUI(this);
432}
#define LB_AUTO_WRAP
Definition Label.hpp:12
#define _L(s)
Definition OBJ.cpp:34
static bool is_dark()
Definition TextureImportDialog.cpp:85
static wxFont Head_16
Definition Label.hpp:43
const wxFont & normal_font() const
Definition GUI_Utils.hpp:205
wxStaticBitmap * m_header_logo
Definition TroubleshootDialog.hpp:44
wxString GetCPUinfo()
Definition TroubleshootDialog.cpp:831
void ClearLogs()
Definition TroubleshootDialog.cpp:1156
wxString GetSysInfoAll()
Definition TroubleshootDialog.cpp:440
wxString GetTimestamp()
Definition TroubleshootDialog.cpp:434
ComboBox * create_item_log_level_combo()
Definition TroubleshootDialog.cpp:147
void PackAll()
Definition TroubleshootDialog.cpp:991
ScalableBitmap m_logo
Definition TroubleshootDialog.hpp:43
Label * m_logs_storage
Definition TroubleshootDialog.hpp:45
wxString GetMONinfo()
Definition TroubleshootDialog.cpp:904
bool ExportAsJson(const wxString &json_data, const wxString &export_name=wxEmptyString)
Definition TroubleshootDialog.cpp:1280
void BrowseFolder(std::string path)
Definition TroubleshootDialog.cpp:1214
bool ExportAsZip(const std::vector< wxString > &sources, const wxString &export_name)
Definition TroubleshootDialog.cpp:1323
wxString GetOStype()
Definition TroubleshootDialog.cpp:622
wxString GetPackageType()
Definition TroubleshootDialog.cpp:778
void UpdateLogsStorage()
Definition TroubleshootDialog.cpp:1193
void RebuildSystemProfiles()
Definition TroubleshootDialog.cpp:1039
bool m_sys_panel_mode
Definition TroubleshootDialog.hpp:52
wxString GetProfilesOverview()
Definition TroubleshootDialog.cpp:482
wxString GetOSinfo()
Definition TroubleshootDialog.cpp:635
wxString GetRAMinfo()
Definition TroubleshootDialog.cpp:888
wxString GetGPUinfo()
Definition TroubleshootDialog.cpp:894
wxFlexGridSizer * create_item_loaded_profiles()
Definition TroubleshootDialog.cpp:105
static wxColour darkModeColorFor(wxColour const &color)
Definition StateColor.cpp:219
const char *const build_commit_label
Definition BuildCommit.cpp:7
wxMouseEvent
Definition CameraPopup.cpp:47
static wxString dots("...", wxConvUTF8)
const char *const build_commit_hash
Definition BuildCommit.cpp:6
const std::string & data_dir()
Definition utils.cpp:365
@ lock
Definition GLGizmoEmboss.cpp:209