From 5a2925466db4c5162bb1cc644e98652851b21687 Mon Sep 17 00:00:00 2001
From: YuSanka <yusanka@gmail.com>
Date: Wed, 12 Jan 2022 11:19:59 +0100
Subject: [PATCH] Follow-up to
 https://github.com/prusa3d/PrusaSlicer/commit/1dffc40f324a9bf2361b55c0f4e227508e25f388
 - Fixed a message text. +Improved context of the MessageDialogs. We can use
 hyperlinks now.

---
 src/slic3r/GUI/GUI_App.cpp   | 34 +++++++++++++++++++++++-----------
 src/slic3r/GUI/MsgDialog.cpp | 18 +++++++++++++++---
 2 files changed, 38 insertions(+), 14 deletions(-)

diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp
index 42ea55578..12a5fc4e2 100644
--- a/src/slic3r/GUI/GUI_App.cpp
+++ b/src/slic3r/GUI/GUI_App.cpp
@@ -1322,19 +1322,31 @@ bool GUI_App::on_init_inner()
     m_initialized = true;
 
     if (const std::string& crash_reason = app_config->get("restore_win_position");
-        crash_reason.find_first_of("crashed") == 0)
+        boost::starts_with(crash_reason,"crashed"))
     {
-        MessageDialog dialog(mainframe,
-            format_wxstr(_L("PrusaSlicer was crashed during a previous start due to \"%1%\".\n"
-               "PrusaSlicer works in save mode now.\n"
-               "To avoid a next application crash you have to disable\n"
-               "\"%2%\" in \"Preferences\""), from_u8(crash_reason), _L("Restore window position on start"))
-                + "\n\n" +
-            format_wxstr(_L("Do you want to disable \"%1%\"?"), _L("Restore window position on start")),
-            _L("Start PrusaSlicer in save mode"),
-            wxICON_QUESTION | wxYES_NO);
-        if (dialog.ShowModal() == wxID_YES)
+        wxString preferences_item = _L("Restore window position on start");
+        InfoDialog dialog(nullptr,
+            _L("PrusaSlicer is started in save mode"),
+            format_wxstr(_L("PrusaSlicer was crashed last time due to \"%1%\".\n"
+                "For more information see issues \"%2%\" and \"%3%\"\n\n"
+                "To avoid an application crash next time you have to disable\n"
+                "\"%4%\" in \"Preferences\""),
+                "<b>" + from_u8(crash_reason) + "</b>",
+                "<a href=http://github.com/prusa3d/PrusaSlicer/issues/2939>#2939</a>",
+                "<a href=http://github.com/prusa3d/PrusaSlicer/issues/5573>#5573</a>",
+                "<b>" + preferences_item + "</b>")
+            + "\n\n" +
+            format_wxstr(_L("Note: Enabling of the \"%1%\" will caused an application crash on next start."), preferences_item),
+            true, wxYES_NO);
+
+        dialog.SetButtonLabel(wxID_YES, format_wxstr(_L("Disable \"%1%\""), preferences_item));
+        dialog.SetButtonLabel(wxID_NO,  format_wxstr(_L("Enable \"%1%\"") , preferences_item));
+        
+        auto answer = dialog.ShowModal();
+        if (answer == wxID_YES)
             app_config->set("restore_win_position", "0");
+        else if (answer == wxID_NO)
+            app_config->set("restore_win_position", "1");
     }
 
     return true;
diff --git a/src/slic3r/GUI/MsgDialog.cpp b/src/slic3r/GUI/MsgDialog.cpp
index 199fdebce..f64923c9b 100644
--- a/src/slic3r/GUI/MsgDialog.cpp
+++ b/src/slic3r/GUI/MsgDialog.cpp
@@ -24,7 +24,6 @@
 namespace Slic3r {
 namespace GUI {
 
-
 MsgDialog::MsgDialog(wxWindow *parent, const wxString &title, const wxString &headline, long style, wxBitmap bitmap)
 	: wxDialog(parent ? parent : dynamic_cast<wxWindow*>(wxGetApp().mainframe), wxID_ANY, title, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
 	, boldfont(wxGetApp().normal_font())
@@ -182,13 +181,26 @@ static void add_msg_content(wxWindow* parent, wxBoxSizer* content_sizer, wxStrin
     }
     html->SetMinSize(page_size);
 
-    std::string msg_escaped = xml_escape(msg.ToUTF8().data(), is_marked_msg);
+    std::string msg_escaped = xml_escape(into_u8(msg), is_marked_msg);
     boost::replace_all(msg_escaped, "\r\n", "<br>");
     boost::replace_all(msg_escaped, "\n", "<br>");
     if (monospaced_font)
         // Code formatting will be preserved. This is useful for reporting errors from the placeholder parser.
         msg_escaped = std::string("<pre><code>") + msg_escaped + "</code></pre>";
-    html->SetPage("<html><body bgcolor=\"" + bgr_clr_str + "\"><font color=\"" + text_clr_str + "\">" + wxString::FromUTF8(msg_escaped.data()) + "</font></body></html>");
+    html->SetPage(format_wxstr("<html>"
+                                    "<body bgcolor=%1% link=%2%>"
+                                        "<font color=%2%>"
+                                            "%3%"
+                                        "</font>"
+                                    "</body>"
+                               "</html>", 
+                    bgr_clr_str, text_clr_str, from_u8(msg_escaped)));
+
+    html->Bind(wxEVT_HTML_LINK_CLICKED, [parent](wxHtmlLinkEvent& event) {
+        wxGetApp().open_browser_with_warning_dialog(event.GetLinkInfo().GetHref(), parent, false);
+        event.Skip(false);
+    });
+
     content_sizer->Add(html, 1, wxEXPAND);
     wxGetApp().UpdateDarkUI(html);
 }