Krita Source Code Documentation
Loading...
Searching...
No Matches
dlg_buginfo.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2017 Boudewijn Rempt <boud@valdyas.org>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#include "dlg_buginfo.h"
8
9#include <klocalizedstring.h>
10#include <kis_debug.h>
11#include <opengl/kis_opengl.h>
12#include <KritaVersionWrapper.h>
13#include <QSysInfo>
14#include <kis_image_config.h>
15#include <QScreen>
16#include <QClipboard>
17#include <QThread>
18#include <QFile>
19#include <QFileInfo>
20#include <QSettings>
21#include <QStandardPaths>
22#include <QScreen>
23
24#include <KoFileDialog.h>
25#include <QMessageBox>
26
27
28#include <KisPortingUtils.h>
29
30#ifdef Q_OS_ANDROID
31#include <QtAndroid>
32#endif
33
34DlgBugInfo::DlgBugInfo(QWidget *parent, KoDialog::ButtonCodes customButtons)
35 : KoDialog(parent)
36 , m_page(new WdgBugInfo(this))
37{
38 setCaption(i18n("Please paste this information in your bug report"));
39
40 setButtons(User1 | User2 | Ok | customButtons);
41 setButtonText(User1, i18n("Copy to clipboard"));
42 setButtonText(User2, i18n("Save to file"));
44
45 Q_CHECK_PTR(m_page);
46
48
49 connect(this, &KoDialog::user1Clicked, this, [this](){
50 QGuiApplication::clipboard()->setText(m_page->txtBugInfo->toPlainText());
51 m_page->txtBugInfo->selectAll(); // feedback
52 });
53
55
56}
57
63
65{
66 const QString configPath = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation);
67 QSettings kritarc(configPath + QStringLiteral("/kritadisplayrc"), QSettings::IniFormat);
68
69 QString info = infoText(kritarc);
70
71 m_page->txtBugInfo->setText(info);
72}
73
75{
76 KoFileDialog dlg(this, KoFileDialog::SaveFile, i18n("Save to file"));
77 dlg.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + "/" + defaultNewFileName());
78 dlg.setMimeTypeFilters(QStringList("text/plain"), "text/plain");
79 QString filename = dlg.filename();
80
81 if (filename.isEmpty()) {
82 return;
83 } else {
84
85 QFile file(filename);
86 if (!file.open(QIODevice::WriteOnly)) {
87 QMessageBox::information(this, i18n("Unable to open file"),
88 file.errorString());
89 return;
90 }
91
92 QTextStream out(&file);
94 QString originalLogFileName = originalFileName();
95 if (originalLogFileName.isEmpty() && QFileInfo(originalLogFileName).exists()) {
96 QFile src(originalLogFileName);
97 out << src.readAll();
98 src.close();
99 } else {
100 out << m_page->txtBugInfo->toPlainText();
101 }
102 file.close();
103 }
104}
105
107{
108 QString info;
109
110 // Krita version info
111 info.append("Krita");
112 info.append("\n Version: ").append(KritaVersionWrapper::versionString(true));
113 info.append("\n\n");
114
115 info.append("Qt");
116 info.append("\n Version (compiled): ").append(QT_VERSION_STR);
117 info.append("\n Version (loaded): ").append(qVersion());
118 info.append("\n\n");
119
120 // OS information
121 info.append("OS Information");
122 info.append("\n Build ABI: ").append(QSysInfo::buildAbi());
123 info.append("\n Build CPU: ").append(QSysInfo::buildCpuArchitecture());
124 info.append("\n CPU: ").append(QSysInfo::currentCpuArchitecture());
125 info.append("\n Kernel Type: ").append(QSysInfo::kernelType());
126 info.append("\n Kernel Version: ").append(QSysInfo::kernelVersion());
127 info.append("\n Pretty Productname: ").append(QSysInfo::prettyProductName());
128 info.append("\n Product Type: ").append(QSysInfo::productType());
129 info.append("\n Product Version: ").append(QSysInfo::productVersion());
130#ifdef Q_OS_ANDROID
131 QString manufacturer =
132 QAndroidJniObject::getStaticObjectField("android/os/Build", "MANUFACTURER", "Ljava/lang/String;").toString();
133 const QString model =
134 QAndroidJniObject::getStaticObjectField("android/os/Build", "MODEL", "Ljava/lang/String;").toString();
135 manufacturer[0] = manufacturer[0].toUpper();
136 info.append("\n Product Model: ").append(manufacturer + " " + model);
137#endif
138 info.append("\n\n");
139
140 // OpenGL information
141 info.append("\n").append(KisOpenGL::getDebugText());
142 info.append("\n\n");
143 // Hardware information
144 info.append("Hardware Information");
145 info.append(QString("\n Memory: %1").arg(KisImageConfig(true).totalRAM() / 1024)).append(" Gb");
146 info.append(QString("\n Cores: %1").arg(QThread::idealThreadCount()));
147 info.append("\n Swap: ").append(KisImageConfig(true).swapDir());
148
149 return info;
150}
151
152QString DlgBugInfo::infoText(QSettings& kritarc)
153{
154 QString info;
155
156 if (!kritarc.value("LogUsage", true).toBool() || !QFileInfo(originalFileName()).exists()) {
157
158 // NOTE: This is intentionally not translated!
159
160 info.append(replacementWarningText());
161 info.append("File name and location: " + originalFileName());
162 info.append("------------------------------------");
163 info.append("\n\n");
164
166 }
167 else {
168
169 QFile log(originalFileName());
170 log.open(QFile::ReadOnly | QFile::Text);
171 info += QString::fromUtf8(log.readAll());
172 log.close();
173 }
174
175 return info;
176
177}
178
180{
181 delete m_page;
182}
QList< QString > QStringList
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
virtual QString originalFileName()=0
DlgBugInfo(QWidget *parent=0, ButtonCodes customButtons=None)
void saveToFile()
void initialize()
virtual QString replacementWarningText()=0
WdgBugInfo * m_page
Definition dlg_buginfo.h:47
virtual QString infoText(QSettings &kritarc)
void initializeText()
~DlgBugInfo() override
QString basicSystemInformationReplacementText()
virtual QString captionText()=0
virtual QString defaultNewFileName()=0
static const QString & getDebugText()
A dialog base class with standard buttons and predefined layouts.
Definition KoDialog.h:116
void user1Clicked()
void setMainWidget(QWidget *widget)
Definition KoDialog.cpp:354
void setButtonText(ButtonCode id, const QString &text)
Definition KoDialog.cpp:648
virtual void setCaption(const QString &caption)
Definition KoDialog.cpp:498
void user2Clicked()
void setButtons(ButtonCodes buttonMask)
Definition KoDialog.cpp:195
void setDefaultButton(ButtonCode id)
Definition KoDialog.cpp:302
@ User2
Show User defined button 2.
Definition KoDialog.h:137
@ Ok
Show Ok button. (this button accept()s the dialog; result set to QDialog::Accepted)
Definition KoDialog.h:127
@ User1
Show User defined button 1.
Definition KoDialog.h:136
QString filename()
Get the file name the user selected in the file dialog.
void setDefaultDir(const QString &defaultDir, bool force=false)
setDefaultDir set the default directory to defaultDir.
void setMimeTypeFilters(const QStringList &mimeTypeList, QString defaultMimeType=QString())
setMimeTypeFilters Update the list of file filters from mime types.
void setUtf8OnStream(QTextStream &stream)
KRITAVERSION_EXPORT QString versionString(bool checkGit=false)