222 lines
5.6 KiB
C++
222 lines
5.6 KiB
C++
/**********************************************************************
|
|
|
|
Audacity: A Digital Audio Editor
|
|
|
|
ErrorReportDialog.cpp
|
|
|
|
Dmitry Vedenko
|
|
|
|
**********************************************************************/
|
|
|
|
#include "ErrorReportDialog.h"
|
|
|
|
#include <wx/app.h>
|
|
#include <wx/artprov.h>
|
|
#include <wx/button.h>
|
|
#include <wx/collpane.h>
|
|
#include <wx/dialog.h>
|
|
#include <wx/html/htmlwin.h>
|
|
#include <wx/icon.h>
|
|
#include <wx/intl.h>
|
|
#include <wx/settings.h>
|
|
#include <wx/sizer.h>
|
|
#include <wx/statbmp.h>
|
|
#include <wx/stattext.h>
|
|
#include <wx/statusbr.h>
|
|
#include <wx/textctrl.h>
|
|
#include <wx/bmpbuttn.h>
|
|
|
|
#include "AllThemeResources.h"
|
|
#include "Theme.h"
|
|
#include "HelpText.h"
|
|
#include "Prefs.h"
|
|
#include "ShuttleGui.h"
|
|
#include "HelpSystem.h"
|
|
|
|
#include "SentryReport.h"
|
|
#include "CodeConversions.h"
|
|
|
|
constexpr int MaxUserCommentLength = 2000;
|
|
|
|
BEGIN_EVENT_TABLE(ErrorReportDialog, wxDialogWrapper)
|
|
EVT_BUTTON(wxID_YES, ErrorReportDialog::OnSend)
|
|
EVT_BUTTON(wxID_NO, ErrorReportDialog::OnDontSend)
|
|
EVT_BUTTON(wxID_HELP, ErrorReportDialog::OnHelp)
|
|
END_EVENT_TABLE()
|
|
|
|
ErrorReportDialog::ErrorReportDialog(
|
|
wxWindow* parent, const TranslatableString& dlogTitle,
|
|
const TranslatableString& message, const wxString& helpUrl,
|
|
const wxString& log, const bool modal)
|
|
: wxDialogWrapper(
|
|
parent, wxID_ANY, dlogTitle, wxDefaultPosition, wxDefaultSize,
|
|
wxDEFAULT_DIALOG_STYLE)
|
|
, mHelpUrl(helpUrl)
|
|
, mIsModal(modal)
|
|
{
|
|
audacity::sentry::Exception ex = audacity::sentry::Exception::Create(
|
|
audacity::ToUTF8(dlogTitle.Debug()),message.Debug());
|
|
|
|
if (!log.empty())
|
|
ex.AddData("log", log);
|
|
|
|
mReport = std::make_unique<audacity::sentry::Report> (ex);
|
|
|
|
ShuttleGui S(this, eIsCreating);
|
|
|
|
const wxFont headingFont = wxFont(wxFontInfo(12).Bold());
|
|
const wxFont textFont = wxFont(wxFontInfo(10));
|
|
|
|
S.SetBorder(0);
|
|
|
|
S.StartHorizontalLay(wxEXPAND, 0);
|
|
{
|
|
S.AddSpace(40, 0);
|
|
S.StartVerticalLay(wxEXPAND, 0);
|
|
{
|
|
S.AddSpace(0, 32);
|
|
|
|
S.StartHorizontalLay(wxEXPAND, 1);
|
|
{
|
|
S.StartVerticalLay(0);
|
|
{
|
|
wxBitmap bitmap = wxArtProvider::GetBitmap(
|
|
wxART_WARNING, wxART_MESSAGE_BOX, wxSize(24, 24));
|
|
|
|
S.Prop(0).AddWindow(
|
|
safenew wxStaticBitmap(S.GetParent(), -1, bitmap));
|
|
|
|
S.AddSpace(0, 0, 1);
|
|
}
|
|
S.EndVerticalLay();
|
|
|
|
S.AddSpace(10, 0);
|
|
|
|
S.StartVerticalLay(0);
|
|
{
|
|
S.AddSpace(0, 7);
|
|
|
|
S.Prop(1)
|
|
.AddVariableText(message, false, 0, 560)
|
|
->SetFont(headingFont);
|
|
}
|
|
S.EndVerticalLay();
|
|
}
|
|
S.EndHorizontalLay();
|
|
|
|
S.AddSpace(0, 20);
|
|
|
|
S.AddVariableText(XO(
|
|
"Click \"Send\" to submit the report to Audacity. This information is collected anonymously."))
|
|
->SetFont(textFont);
|
|
|
|
S.AddSpace(0, 20);
|
|
|
|
S.AddVariableText(XO("Problem details"))->SetFont(textFont);
|
|
|
|
S.AddSpace(0, 6);
|
|
|
|
S.Style(wxTE_RICH | wxTE_READONLY | wxTE_MULTILINE | wxTE_DONTWRAP)
|
|
.MinSize(wxSize(0, 152))
|
|
.Name(XO("Problem details"))
|
|
.AddTextBox({}, mReport->GetReportPreview(), 0);
|
|
|
|
S.AddSpace(0, 20);
|
|
|
|
S.AddVariableText(XO("Comments"))->SetFont(textFont);
|
|
|
|
S.AddSpace(0, 6);
|
|
|
|
mCommentsControl = S.Style(wxTE_MULTILINE)
|
|
.MinSize(wxSize(0, 76))
|
|
.Name(XO("Comments"))
|
|
.AddTextBox({}, {}, 0);
|
|
|
|
mCommentsControl->SetMaxLength(MaxUserCommentLength);
|
|
|
|
S.AddSpace(0, 20);
|
|
|
|
S.StartHorizontalLay(wxEXPAND);
|
|
{
|
|
if (!mHelpUrl.empty())
|
|
{
|
|
wxBitmapButton* helpButton =
|
|
S.Id(wxID_HELP).AddBitmapButton(theTheme.Bitmap(bmpHelpIcon));
|
|
// For screen readers
|
|
helpButton->SetToolTip(XO("Help").Translation());
|
|
helpButton->SetLabel(XO("Help").Translation());
|
|
}
|
|
|
|
S.AddSpace(0, 0, 1);
|
|
|
|
S.Id(wxID_NO).AddButton(XC("&Don't send", "crash reporter button"));
|
|
|
|
S.AddSpace(13, 0);
|
|
|
|
S.Id(wxID_YES).AddButton(XC("&Send", "crash reporter button"));
|
|
}
|
|
S.EndHorizontalLay();
|
|
|
|
S.AddSpace(0, 20);
|
|
}
|
|
S.EndVerticalLay();
|
|
|
|
S.AddSpace(28, 0);
|
|
}
|
|
S.EndHorizontalLay();
|
|
|
|
S.SetBorder(2);
|
|
|
|
Layout();
|
|
GetSizer()->Fit(this);
|
|
SetMinSize(GetSize());
|
|
Center();
|
|
}
|
|
|
|
ErrorReportDialog::~ErrorReportDialog()
|
|
{
|
|
}
|
|
|
|
void ErrorReportDialog::OnSend(wxCommandEvent& event)
|
|
{
|
|
Disable();
|
|
|
|
mReport->AddUserComment(audacity::ToUTF8(mCommentsControl->GetValue()));
|
|
|
|
mReport->Send(
|
|
[this](int code, std::string body) {
|
|
CallAfter([this]() {
|
|
EndModal(true);
|
|
});
|
|
});
|
|
}
|
|
|
|
void ErrorReportDialog::OnDontSend(wxCommandEvent& event)
|
|
{
|
|
EndModal(true);
|
|
}
|
|
|
|
void ErrorReportDialog::OnHelp(wxCommandEvent& event)
|
|
{
|
|
if (mHelpUrl.StartsWith(wxT("innerlink:")))
|
|
{
|
|
HelpSystem::ShowHtmlText(
|
|
this, TitleText(mHelpUrl.Mid(10)), HelpText(mHelpUrl.Mid(10)), false,
|
|
true);
|
|
return;
|
|
}
|
|
|
|
HelpSystem::ShowHelp(this, mHelpUrl, false);
|
|
}
|
|
|
|
void ShowErrorReportDialog(
|
|
wxWindow* parent, const TranslatableString& dlogTitle,
|
|
const TranslatableString& message, const wxString& helpPage,
|
|
const wxString& log)
|
|
{
|
|
ErrorReportDialog dlog(parent, dlogTitle, message, helpPage, log);
|
|
|
|
dlog.CentreOnParent();
|
|
dlog.ShowModal();
|
|
}
|