Reuse OtherLogsPage directly

Signed-off-by: Yihe Li <winmikedows@hotmail.com>
This commit is contained in:
Yihe Li 2025-06-03 15:44:11 +08:00
parent 289645266a
commit 1aa8d7bc13
No known key found for this signature in database
11 changed files with 251 additions and 964 deletions

View file

@ -40,6 +40,7 @@
#include <QMessageBox>
#include "ui/GuiUtil.h"
#include "ui/themes/ThemeManager.h"
#include <FileSystem.h>
#include <GZip.h>
@ -49,18 +50,26 @@
#include <QShortcut>
#include <QUrl>
OtherLogsPage::OtherLogsPage(InstancePtr instance, QWidget* parent)
OtherLogsPage::OtherLogsPage(QString id, QString displayName, QString helpPage, InstancePtr instance, QWidget* parent)
: QWidget(parent)
, m_id(id)
, m_displayName(displayName)
, m_helpPage(helpPage)
, ui(new Ui::OtherLogsPage)
, m_instance(instance)
, m_basePath(instance->gameRoot())
, m_logSearchPaths(instance->getLogFileSearchPaths())
, m_model(new LogModel(this))
, m_basePath(instance ? instance->gameRoot() : APPLICATION->dataRoot())
, m_logSearchPaths(instance ? instance->getLogFileSearchPaths() : QStringList{ "logs" })
{
ui->setupUi(this);
ui->tabWidget->tabBar()->hide();
m_proxy = new LogFormatProxyModel(this);
if (m_instance) {
m_model.reset(new LogModel(this));
ui->trackLogCheckbox->setVisible(false);
} else {
m_model = APPLICATION->logModel;
}
// set up fonts in the log proxy
{
@ -75,9 +84,13 @@ OtherLogsPage::OtherLogsPage(InstancePtr instance, QWidget* parent)
ui->text->setModel(m_proxy);
m_model->setMaxLines(m_instance->getConsoleMaxLines());
m_model->setStopOnOverflow(m_instance->shouldStopOnConsoleOverflow());
m_model->setOverflowMessage(tr("Cannot display this log since the log length surpassed %1 lines.").arg(m_model->getMaxLines()));
if (m_instance) {
m_model->setMaxLines(m_instance->getConsoleMaxLines());
m_model->setStopOnOverflow(m_instance->shouldStopOnConsoleOverflow());
m_model->setOverflowMessage(tr("Cannot display this log since the log length surpassed %1 lines.").arg(m_model->getMaxLines()));
} else {
modelStateToUI();
}
m_proxy->setSourceModel(m_model.get());
connect(&m_watcher, &QFileSystemWatcher::directoryChanged, this, &OtherLogsPage::populateSelectLogBox);
@ -99,6 +112,39 @@ OtherLogsPage::~OtherLogsPage()
delete ui;
}
void OtherLogsPage::modelStateToUI()
{
if (m_model->wrapLines()) {
ui->text->setWordWrap(true);
ui->wrapCheckbox->setCheckState(Qt::Checked);
} else {
ui->text->setWordWrap(false);
ui->wrapCheckbox->setCheckState(Qt::Unchecked);
}
if (m_model->colorLines()) {
ui->text->setColorLines(true);
ui->colorCheckbox->setCheckState(Qt::Checked);
} else {
ui->text->setColorLines(false);
ui->colorCheckbox->setCheckState(Qt::Unchecked);
}
if (m_model->suspended()) {
ui->trackLogCheckbox->setCheckState(Qt::Unchecked);
} else {
ui->trackLogCheckbox->setCheckState(Qt::Checked);
}
}
void OtherLogsPage::UIToModelState()
{
if (!m_model) {
return;
}
m_model->setLineWrap(ui->wrapCheckbox->checkState() == Qt::Checked);
m_model->setColorLines(ui->colorCheckbox->checkState() == Qt::Checked);
m_model->suspend(ui->trackLogCheckbox->checkState() != Qt::Checked);
}
void OtherLogsPage::retranslate()
{
ui->retranslateUi(this);
@ -136,6 +182,8 @@ void OtherLogsPage::populateSelectLogBox()
ui->selectLogBox->blockSignals(true);
ui->selectLogBox->clear();
if (!m_instance)
ui->selectLogBox->addItem("Current logs");
ui->selectLogBox->addItems(getPaths());
ui->selectLogBox->blockSignals(false);
@ -151,6 +199,9 @@ void OtherLogsPage::populateSelectLogBox()
} else {
setControlsEnabled(false);
}
} else if (!m_instance) {
ui->selectLogBox->setCurrentIndex(0);
setControlsEnabled(true);
}
on_selectLogBox_currentIndexChanged(ui->selectLogBox->currentIndex());
@ -159,27 +210,49 @@ void OtherLogsPage::populateSelectLogBox()
void OtherLogsPage::on_selectLogBox_currentIndexChanged(const int index)
{
QString file;
if (index != -1) {
if (index > 0 || (index == 0 && m_instance)) {
file = ui->selectLogBox->itemText(index);
}
if (file.isEmpty() || !QFile::exists(FS::PathCombine(m_basePath, file))) {
if ((index != 0 || m_instance) && (file.isEmpty() || !QFile::exists(FS::PathCombine(m_basePath, file)))) {
m_currentFile = QString();
ui->text->clear();
setControlsEnabled(false);
} else {
m_currentFile = file;
on_btnReload_clicked();
reload();
setControlsEnabled(true);
}
}
void OtherLogsPage::on_btnReload_clicked()
{
if (!m_instance && m_currentFile.isEmpty()) {
if (!m_model)
return;
m_model->clear();
m_container->refreshContainer();
} else {
reload();
}
}
void OtherLogsPage::reload()
{
if (m_currentFile.isEmpty()) {
setControlsEnabled(false);
if (m_instance) {
setControlsEnabled(false);
} else {
m_model = APPLICATION->logModel;
m_proxy->setSourceModel(m_model.get());
ui->text->setModel(m_proxy);
ui->text->scrollToBottom();
UIToModelState();
setControlsEnabled(true);
}
return;
}
QFile file(FS::PathCombine(m_basePath, m_currentFile));
if (!file.open(QFile::ReadOnly)) {
setControlsEnabled(false);
@ -210,16 +283,20 @@ void OtherLogsPage::on_btnReload_clicked()
line = line.remove(line.size() - 1, 1);
MessageLevel::Enum level = MessageLevel::Unknown;
// if the launcher part set a log level, use it
QString lineTemp = line; // don't edit out the time and level for clarity
auto innerLevel = MessageLevel::fromLine(lineTemp);
if (innerLevel != MessageLevel::Unknown) {
level = innerLevel;
}
if (!m_instance) {
level = MessageLevel::fromLauncherLine(lineTemp);
} else {
// if the launcher part set a log level, use it
auto innerLevel = MessageLevel::fromLine(lineTemp);
if (innerLevel != MessageLevel::Unknown) {
level = innerLevel;
}
// If the level is still undetermined, guess level
if (level == MessageLevel::StdErr || level == MessageLevel::StdOut || level == MessageLevel::Unknown) {
level = LogParser::guessLevel(line, last);
// If the level is still undetermined, guess level
if (level == MessageLevel::StdErr || level == MessageLevel::StdOut || level == MessageLevel::Unknown) {
level = LogParser::guessLevel(line, last);
}
}
last = level;
@ -230,6 +307,12 @@ void OtherLogsPage::on_btnReload_clicked()
// Try to determine a level for each line
ui->text->clear();
ui->text->setModel(nullptr);
if (!m_instance) {
m_model.reset(new LogModel(this));
m_model->setMaxLines(APPLICATION->getConsoleMaxLines());
m_model->setStopOnOverflow(APPLICATION->shouldStopOnConsoleOverflow());
m_model->setOverflowMessage(tr("Cannot display this log since the log length surpassed %1 lines.").arg(m_model->getMaxLines()));
}
m_model->clear();
if (file.fileName().endsWith(".gz")) {
QString line;
@ -259,8 +342,17 @@ void OtherLogsPage::on_btnReload_clicked()
while (!file.atEnd() && !handleLine(QString::fromUtf8(file.readLine()))) {
}
}
ui->text->setModel(m_proxy);
ui->text->scrollToBottom();
if (m_instance) {
ui->text->setModel(m_proxy);
ui->text->scrollToBottom();
} else {
m_proxy->setSourceModel(m_model.get());
ui->text->setModel(m_proxy);
ui->text->scrollToBottom();
UIToModelState();
setControlsEnabled(true);
}
}
}
@ -279,6 +371,13 @@ void OtherLogsPage::on_btnBottom_clicked()
ui->text->scrollToBottom();
}
void OtherLogsPage::on_trackLogCheckbox_clicked(bool checked)
{
if (!m_model)
return;
m_model->suspend(!checked);
}
void OtherLogsPage::on_btnDelete_clicked()
{
if (m_currentFile.isEmpty()) {
@ -377,12 +476,27 @@ void OtherLogsPage::on_colorCheckbox_clicked(bool checked)
void OtherLogsPage::setControlsEnabled(const bool enabled)
{
if (m_instance) {
ui->btnDelete->setEnabled(enabled);
ui->btnClean->setEnabled(enabled);
} else if (!m_currentFile.isEmpty()) {
ui->btnReload->setText("&Reload");
ui->btnReload->setToolTip("Reload the contents of the log from the disk");
ui->btnDelete->setEnabled(enabled);
ui->btnClean->setEnabled(enabled);
ui->trackLogCheckbox->setEnabled(false);
} else {
ui->btnReload->setText("Clear");
ui->btnReload->setToolTip("Clear the log");
ui->btnDelete->setEnabled(false);
ui->btnClean->setEnabled(false);
ui->trackLogCheckbox->setEnabled(enabled);
}
ui->btnReload->setEnabled(enabled);
ui->btnDelete->setEnabled(enabled);
ui->btnCopy->setEnabled(enabled);
ui->btnPaste->setEnabled(enabled);
ui->text->setEnabled(enabled);
ui->btnClean->setEnabled(enabled);
}
QStringList OtherLogsPage::getPaths()