From d0a3496356576eac4e2993c35f495f1382f2c27b Mon Sep 17 00:00:00 2001 From: taynpg Date: Sat, 21 Jun 2025 02:50:05 +0800 Subject: [PATCH] log: color printing adaptive system for dark/light themes. --- Gui/Control/ConnectControl.cpp | 2 +- Gui/Control/LogControl.cpp | 73 +++++++++++++++++++++++++++++----- Gui/Control/LogControl.h | 24 ++++++++++- Server/Server.cpp | 2 +- 4 files changed, 86 insertions(+), 15 deletions(-) diff --git a/Gui/Control/ConnectControl.cpp b/Gui/Control/ConnectControl.cpp index 4a7750c..7d64907 100644 --- a/Gui/Control/ConnectControl.cpp +++ b/Gui/Control/ConnectControl.cpp @@ -162,7 +162,7 @@ void Connecter::InitControl() } auto name = item->text(); ui->elbClient->setText(name); - ui->elbClient->setStyleSheet("color: blue;"); + ui->elbClient->setStyleSheet("color: green;"); remoteCall_(name); }); diff --git a/Gui/Control/LogControl.cpp b/Gui/Control/LogControl.cpp index 1774fc1..7ac4ff5 100644 --- a/Gui/Control/LogControl.cpp +++ b/Gui/Control/LogControl.cpp @@ -12,10 +12,14 @@ LogPrint::LogPrint(QWidget* parent) : QWidget(parent), ui(new Ui::LogPrint) { ui->setupUi(this); InitControl(); + InitColor(); } void LogPrint::InitControl() { + isLightMode_ = QGuiApplication::styleHints()->colorScheme() == Qt::ColorScheme::Light; + styleHints_ = QGuiApplication::styleHints(); + connect(styleHints_, &QStyleHints::colorSchemeChanged, this, &LogPrint::ColorChange); ui->pedText->setReadOnly(true); } @@ -32,33 +36,80 @@ std::string LogPrint::now_str() return timestamp.str(); } +void LogPrint::ColorChange(Qt::ColorScheme scheme) +{ + if (scheme == Qt::ColorScheme::Dark) { + isLightMode_ = false; + } else { + isLightMode_ = true; + } + RePrintLog(); +} + LogPrint::~LogPrint() { delete ui; } +static const QColor DARK_INFO_COLOR = QColor(255, 255, 0); +static const QColor DARK_WARN_COLOR = QColor(255, 102, 0); +static const QColor DARK_ERROR_COLOR = QColor(255, 0, 255); +static const QColor DARK_DEBUG_COLOR = QColor(0, 255, 255); + +void LogPrint::InitColor() +{ + lightMap_[PT_INFO] = Qt::black; + lightMap_[PT_WARN] = Qt::blue; + lightMap_[PT_ERROR] = Qt::red; + lightMap_[PT_DEBUG] = Qt::gray; + + darkMap_[PT_INFO] = DARK_INFO_COLOR; + darkMap_[PT_WARN] = DARK_WARN_COLOR; + darkMap_[PT_ERROR] = DARK_ERROR_COLOR; + darkMap_[PT_DEBUG] = DARK_DEBUG_COLOR; +} + +void LogPrint::RePrintLog() +{ + { + QMutexLocker locker(&mutex_); + ui->pedText->clear(); + } + + for (auto& entry : logEntries_) { + Print(entry.message, entry.level, false); + } +} + void LogPrint::Info(const QString& message) { - Print(message, Qt::black); + Print(message, PT_INFO); } void LogPrint::Warn(const QString& message) { - Print(message, Qt::gray); + Print(message, PT_WARN); } void LogPrint::Error(const QString& message) { - Print(message, Qt::red); + Print(message, PT_ERROR); } void LogPrint::Debug(const QString& message) { - Print(message, Qt::blue); + Print(message, PT_DEBUG); } -void LogPrint::Print(const QString& message, const QBrush& color) -{ - QString timeStr = QString("%1%2").arg(QString::fromStdString(now_str())).arg(message); - QString coloredLog = QString("%2") - .arg(color.color().name()) - .arg(timeStr.toHtmlEscaped()); - ui->pedText->appendHtml(coloredLog); +void LogPrint::Print(const QString& message, PrintType type, bool recordHis) +{ + QMutexLocker locker(&mutex_); + QString timeStr = QString("%1%2").arg(QString::fromStdString(now_str())).arg(message); + QString r; + if (isLightMode_) { + r = QString("%2").arg(lightMap_[type].color().name()).arg(timeStr.toHtmlEscaped()); + } else { + r = QString("%2").arg(darkMap_[type].color().name()).arg(timeStr.toHtmlEscaped()); + } + if (recordHis) { + logEntries_.append({message, type}); + } + ui->pedText->appendHtml(r); } diff --git a/Gui/Control/LogControl.h b/Gui/Control/LogControl.h index 5feeae2..2bd2a22 100644 --- a/Gui/Control/LogControl.h +++ b/Gui/Control/LogControl.h @@ -1,14 +1,25 @@ -#ifndef LOGCONTROL_H +#ifndef LOGCONTROL_H #define LOGCONTROL_H #include +#include +#include +#include #include +#include #include namespace Ui { class LogPrint; } +enum PrintType { PT_INFO, PT_WARN, PT_ERROR, PT_DEBUG }; + +struct LogEntry { + QString message; + PrintType level; +}; + class LogPrint : public QWidget { Q_OBJECT @@ -25,13 +36,22 @@ public: public: std::string now_str(); + void ColorChange(Qt::ColorScheme scheme); private: void InitControl(); - void Print(const QString& message, const QBrush& color); + void InitColor(); + void RePrintLog(); + void Print(const QString& message, PrintType type, bool recordHis = true); private: + QMutex mutex_; + bool isLightMode_{true}; Ui::LogPrint* ui; + QMap lightMap_; + QMap darkMap_; + QVector logEntries_; + QStyleHints* styleHints_{}; QStandardItemModel* model_; }; diff --git a/Server/Server.cpp b/Server/Server.cpp index 3044ce1..bc1ef78 100644 --- a/Server/Server.cpp +++ b/Server/Server.cpp @@ -26,7 +26,7 @@ bool Server::startServer(quint16 port) } qDebug() << "Server started on port" << serverPort(); - monitorTimer_->start(30000); + monitorTimer_->start(300000); id_ = QString("0.0.0.0:%1").arg(serverPort()); return true; }