diff --git a/src/lib/gui/CMakeLists.txt b/src/lib/gui/CMakeLists.txt index af34c88f8..13c9a06a4 100644 --- a/src/lib/gui/CMakeLists.txt +++ b/src/lib/gui/CMakeLists.txt @@ -114,6 +114,8 @@ add_library(${target} STATIC widgets/FingerprintPreview.h widgets/KeySequenceWidget.cpp widgets/KeySequenceWidget.h + widgets/LogWidget.h + widgets/LogWidget.cpp widgets/NewScreenWidget.cpp widgets/NewScreenWidget.h widgets/ScreenSetupView.cpp diff --git a/src/lib/gui/MainWindow.cpp b/src/lib/gui/MainWindow.cpp index d7ec9dcb1..3963d41e8 100644 --- a/src/lib/gui/MainWindow.cpp +++ b/src/lib/gui/MainWindow.cpp @@ -21,11 +21,11 @@ #include "base/String.h" #include "common/Settings.h" #include "common/UrlConstants.h" -#include "gui/Logger.h" #include "gui/Messages.h" #include "gui/Styles.h" #include "gui/core/CoreProcess.h" #include "gui/ipc/DaemonIpcClient.h" +#include "gui/widgets/LogWidget.h" #include "net/FingerprintDatabase.h" #include "platform/Wayland.h" @@ -33,6 +33,7 @@ #include "Config.h" #endif +#include #include #include #include @@ -45,6 +46,7 @@ #include #include #include +#include #include #include @@ -68,6 +70,7 @@ MainWindow::MainWindow() m_trayIcon{new QSystemTrayIcon(this)}, m_guiDupeChecker{new QLocalServer(this)}, m_daemonIpcClient{new ipc::DaemonIpcClient(this)}, + m_logWidget{new LogWidget(this)}, m_lblSecurityStatus{new QLabel(this)}, m_lblStatus{new QLabel(this)}, m_btnFingerprint{new QToolButton(this)}, @@ -88,13 +91,7 @@ MainWindow::MainWindow() setWindowIcon(QIcon::fromTheme(QStringLiteral("deskflow"))); - // setup the log font - ui->textLog->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont)); -#ifdef Q_OS_MAC - auto f = ui->textLog->font(); - f.setPixelSize(12); - ui->textLog->setFont(f); -#endif + ui->frameLog->layout()->addWidget(m_logWidget); // Setup Actions m_actionAbout->setText(tr("About %1...").arg(kAppName)); @@ -231,10 +228,10 @@ void MainWindow::setupControls() ui->btnToggleLog->setStyleSheet(kStyleFlatButton); if (Settings::value(Settings::Gui::LogExpanded).toBool()) { ui->btnToggleLog->setArrowType(Qt::DownArrow); - ui->textLog->setVisible(true); + m_logWidget->setVisible(true); ui->btnToggleLog->click(); } else { - ui->textLog->setVisible(false); + m_logWidget->setVisible(false); } ui->serverOptions->setVisible(false); @@ -294,8 +291,6 @@ void MainWindow::setupControls() // signal is emitted from the thread that owns the receiver's object. void MainWindow::connectSlots() { - connect(&Logger::instance(), &Logger::newLine, this, &MainWindow::handleLogLine); - connect(Settings::instance(), &Settings::serverSettingsChanged, this, &MainWindow::serverConfigSaving); connect(Settings::instance(), &Settings::settingsChanged, this, &MainWindow::settingsChanged); @@ -371,7 +366,7 @@ void MainWindow::toggleLogVisible(bool visible) ui->btnToggleLog->setArrowType(Qt::RightArrow); m_expandedSize = size(); } - ui->textLog->setVisible(visible); + m_logWidget->setVisible(visible); Settings::setValue(Settings::Gui::LogExpanded, visible); // 15 ms delay is to make sure we have left the function before calling updateSize QTimer::singleShot(15, this, &MainWindow::updateSize); @@ -810,21 +805,7 @@ void MainWindow::setIcon() void MainWindow::handleLogLine(const QString &line) { - const int kScrollBottomThreshold = 2; - - QScrollBar *verticalScroll = ui->textLog->verticalScrollBar(); - int currentScroll = verticalScroll->value(); - int maxScroll = verticalScroll->maximum(); - const auto scrollAtBottom = qAbs(currentScroll - maxScroll) <= kScrollBottomThreshold; - - // Never trim the log line; doing so would hide underlying bugs where newlines and space is added unintentionally. - ui->textLog->appendPlainText(line); - - if (scrollAtBottom) { - verticalScroll->setValue(verticalScroll->maximum()); - ui->textLog->horizontalScrollBar()->setValue(0); - } - + m_logWidget->appendLine(line); updateFromLogLine(line); } diff --git a/src/lib/gui/MainWindow.h b/src/lib/gui/MainWindow.h index 712a00079..0c9a583b7 100644 --- a/src/lib/gui/MainWindow.h +++ b/src/lib/gui/MainWindow.h @@ -46,6 +46,7 @@ class QAbstractButton; class QLocalServer; class DeskflowApplication; +class LogWidget; namespace Ui { class MainWindow; @@ -185,6 +186,7 @@ private: QLocalServer *m_guiDupeChecker = nullptr; deskflow::gui::ipc::DaemonIpcClient *m_daemonIpcClient = nullptr; + LogWidget *m_logWidget = nullptr; QLabel *m_lblSecurityStatus = nullptr; QLabel *m_lblStatus = nullptr; QToolButton *m_btnFingerprint = nullptr; diff --git a/src/lib/gui/MainWindow.ui b/src/lib/gui/MainWindow.ui index 96ebf1cb7..edb643464 100644 --- a/src/lib/gui/MainWindow.ui +++ b/src/lib/gui/MainWindow.ui @@ -7,7 +7,7 @@ 0 0 758 - 466 + 259 @@ -523,25 +523,6 @@ - - - - - 0 - 0 - - - - QPlainTextEdit::LineWrapMode::NoWrap - - - true - - - 10000 - - - @@ -551,7 +532,6 @@ btnToggleLog - textLog diff --git a/src/lib/gui/widgets/LogWidget.cpp b/src/lib/gui/widgets/LogWidget.cpp new file mode 100644 index 000000000..313200d95 --- /dev/null +++ b/src/lib/gui/widgets/LogWidget.cpp @@ -0,0 +1,41 @@ +/* + * Deskflow -- mouse and keyboard sharing utility + * SPDX-FileCopyrightText: (C) 2025 Chris Rizzitello + * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception + */ + +#include "LogWidget.h" + +#include + +#include +#include + +LogWidget::LogWidget(QWidget *parent) : QWidget{parent}, m_textLog{new QPlainTextEdit(this)} +{ + m_textLog->setReadOnly(true); + m_textLog->setMaximumBlockCount(10000); + m_textLog->setLineWrapMode(QPlainTextEdit::NoWrap); + + // setup the log font + m_textLog->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont)); +#ifdef Q_OS_MAC + auto f = m_textLog->font(); + f.setPixelSize(12); + m_textLog->setFont(f); +#endif + auto layout = new QVBoxLayout; + layout->setContentsMargins(0, 0, 0, 0); + layout->addWidget(m_textLog); + + setLayout(layout); + + connect( + &deskflow::gui::Logger::instance(), &deskflow::gui::Logger::newLine, m_textLog, &QPlainTextEdit::appendPlainText + ); +} + +void LogWidget::appendLine(const QString &msg) +{ + m_textLog->appendPlainText(msg); +} diff --git a/src/lib/gui/widgets/LogWidget.h b/src/lib/gui/widgets/LogWidget.h new file mode 100644 index 000000000..1ab4bc9bd --- /dev/null +++ b/src/lib/gui/widgets/LogWidget.h @@ -0,0 +1,26 @@ +/* + * Deskflow -- mouse and keyboard sharing utility + * SPDX-FileCopyrightText: (C) 2025 Chris Rizzitello + * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception + */ + +#pragma once + +#include +#include + +class QPlainTextEdit; +class QTemporaryFile; + +class LogWidget : public QWidget +{ + Q_OBJECT +public: + explicit LogWidget(QWidget *parent = nullptr); + void appendLine(const QString &msg); + +Q_SIGNALS: + +private: + QPlainTextEdit *m_textLog = nullptr; +};