From 8ac86c5ec53115d53d3d0803cfae9843f6969986 Mon Sep 17 00:00:00 2001 From: Chenx Dust Date: Tue, 4 Aug 2026 16:37:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=85=A8=E6=96=B0=E5=A4=96=E8=A7=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 2 +- presentation/main/mainwindow.cpp | 164 ++++++++- presentation/main/mainwindow.h | 6 + presentation/main/mainwindow.ui | 601 +++++++++++++++++++++++-------- resource.qrc | 3 + resource/mainwindow-dark.qss | 204 +++++++++++ resource/mainwindow-light.qss | 204 +++++++++++ resource/mainwindow.qss | 144 ++++++++ 8 files changed, 1166 insertions(+), 162 deletions(-) create mode 100644 resource/mainwindow-dark.qss create mode 100644 resource/mainwindow-light.qss create mode 100644 resource/mainwindow.qss diff --git a/CMakeLists.txt b/CMakeLists.txt index 5a564ac..b6ef988 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,7 +19,7 @@ endif() add_compile_definitions(PROJ_VER="${PROJ_VER}") message("PROJ_VER=${PROJ_VER}") -find_package(Qt6 COMPONENTS +find_package(Qt6 6.5 COMPONENTS Core Concurrent Gui diff --git a/presentation/main/mainwindow.cpp b/presentation/main/mainwindow.cpp index 0141178..e1767f3 100644 --- a/presentation/main/mainwindow.cpp +++ b/presentation/main/mainwindow.cpp @@ -4,10 +4,15 @@ #include #include #include +#include #include +#include #include +#include #include #include +#include +#include #include #include "mainwindow.h" @@ -25,6 +30,23 @@ #include "presentation/presentationhelpers.h" #include "ui_mainwindow.h" +namespace +{ +bool appendStyleSheet(const QString &path, QString &styleSheet) +{ + QFile styleFile(path); + if (!styleFile.open(QIODevice::ReadOnly | QIODevice::Text)) + { + qWarning().noquote() << "无法加载样式资源:" << path; + return false; + } + + styleSheet.append(QString::fromUtf8(styleFile.readAll())); + styleSheet.append('\n'); + return true; +} +} + MainWindow::MainWindow( ApplicationLogger *logger, ApplicationLogFile *logFile, @@ -47,6 +69,13 @@ MainWindow::MainWindow( upgradeSettings(); ui->setupUi(this); + ui->logPlainTextEdit->setFont( + QFontDatabase::systemFont(QFontDatabase::FixedFont) + ); + QStyleHints *styleHints = QGuiApplication::styleHints(); + applyColorScheme(styleHints->colorScheme()); + connect(styleHints, &QStyleHints::colorSchemeChanged, + this, &MainWindow::applyColorScheme); authenticationDialogs = coordinator->authenticationDialogs(); connectionSession = coordinator->connection(); systemProxySession = coordinator->systemProxy(); @@ -58,9 +87,9 @@ MainWindow::MainWindow( { const QString componentName = component == UpdateComponent::Ui ? QStringLiteral("UI") : QStringLiteral("核心"); - ui->versionLabel->setText( - "当前版本:" + QApplication::applicationVersion() + - "\n检查" + componentName + "更新失败\n" + ui->versionLabel->setToolTip( + ui->versionLabel->toolTip() + + "\n检查" + componentName + "更新失败" ); }); connect(updateChecker, &UpdateChecker::uiUpdateAvailable, this, @@ -104,6 +133,8 @@ MainWindow::MainWindow( { ui->pushButton2->hide(); } + updateProfileSummary(); + updateConnectionState(connectionSession->state()); }); setupTrayIcon(); setupProfileMenu(); @@ -115,6 +146,10 @@ MainWindow::MainWindow( ui->applicationNameLabel->setText(QApplication::applicationDisplayName()); updateVersionInfo(); + updateConnectionState(connectionSession->state()); + + connect(connectionSession, &ConnectionSession::stateChanged, this, + &MainWindow::updateConnectionState); // 文件-退出 @@ -128,6 +163,13 @@ MainWindow::MainWindow( settingWindow->show(); }); + connect(ui->settingPushButton, &QPushButton::clicked, + ui->settingAction, &QAction::trigger); + connect(ui->guidePushButton, &QPushButton::clicked, + ui->configurationGuideAction, &QAction::trigger); + connect(ui->openLogPushButton, &QPushButton::clicked, + ui->openLogAction, &QAction::trigger); + // 文件-打开日志文件 connect(ui->openLogAction, &QAction::triggered, this, [this]() @@ -380,6 +422,110 @@ void MainWindow::resetZjuConnectUi() trayConnectAction->setText("连接服务器"); ui->pushButton2->setText("设置系统代理"); ui->pushButton2->hide(); + updateConnectionState(ConnectionState::Disconnected); + updateProfileSummary(); +} + +void MainWindow::applyColorScheme(Qt::ColorScheme scheme) +{ + const QString themePath = scheme == Qt::ColorScheme::Dark + ? QStringLiteral(":/resource/mainwindow-dark.qss") + : QStringLiteral(":/resource/mainwindow-light.qss"); + + QString styleSheet; + if (!appendStyleSheet(QStringLiteral(":/resource/mainwindow.qss"), styleSheet) + || !appendStyleSheet(themePath, styleSheet)) + { + return; + } + + setStyleSheet(styleSheet); +} + +void MainWindow::updateConnectionState(ConnectionState state) +{ + QString propertyValue; + QString title; + QString detail; + + switch (state) + { + case ConnectionState::Disconnected: + propertyValue = "disconnected"; + title = "尚未连接"; + detail = "连接后即可访问校园网络资源。"; + break; + case ConnectionState::Starting: + propertyValue = "starting"; + title = "正在连接"; + detail = "正在启动核心并建立安全通道。"; + break; + case ConnectionState::Running: + propertyValue = "running"; + title = "已连接"; + detail = systemProxySession->isEnabled() + ? "VPN 通道与系统代理均已启用。" + : "VPN 通道运行中,可按需启用系统代理。"; + break; + case ConnectionState::Stopping: + propertyValue = "stopping"; + title = "正在断开"; + detail = "正在安全关闭当前连接。"; + break; + case ConnectionState::Reconnecting: + propertyValue = "reconnecting"; + title = "正在重连"; + detail = "连接中断,正在按当前策略重新尝试。"; + break; + case ConnectionState::Failed: + propertyValue = "failed"; + title = "连接失败"; + detail = "请查看右侧日志,确认网络与账户配置。"; + break; + } + + ui->statusTitleLabel->setText(title); + ui->statusDetailLabel->setText(detail); + + const QList styledWidgets{ + ui->statusIndicator, + ui->pushButton1 + }; + for (QWidget *widget : styledWidgets) + { + widget->setProperty("connectionState", propertyValue); + widget->style()->unpolish(widget); + widget->style()->polish(widget); + widget->update(); + } +} + +void MainWindow::updateProfileSummary() +{ + const QString profileName = currentProfileId.isEmpty() + ? QStringLiteral("默认") + : currentProfileId; + const QString protocolSetting = settings->value( + "ZJUConnect/Protocol", + "easyconnect" + ).toString(); + const QString protocol = protocolSetting.compare( + "atrust", + Qt::CaseInsensitive + ) == 0 ? QStringLiteral("aTrust") : QStringLiteral("EasyConnect"); + const QString server = settings->value( + "ZJUConnect/ServerAddress" + ).toString().trimmed(); + + QStringList details{protocol}; + details.append(server.isEmpty() ? QStringLiteral("尚未配置服务器") : server); + if (systemProxySession != nullptr && systemProxySession->isEnabled()) + { + details.append(QStringLiteral("系统代理已启用")); + } + + ui->profileNameLabel->setText(profileName); + ui->profileDetailLabel->setText(details.join(QStringLiteral(" · "))); } void MainWindow::setupTrayIcon() @@ -622,6 +768,7 @@ void MainWindow::createProfile() upgradeSettings(); updateVersionInfo(); resetZjuConnectUi(); + updateVersionInfo(); clearLog(); refreshProfileMenu(); @@ -844,11 +991,12 @@ void MainWindow::upgradeSettings() void MainWindow::updateVersionInfo() { const VersionInfo &versionInfo = updateChecker->versionInfo(); - ui->versionLabel->setText( - "UI 版本:" + versionInfo.uiVersion + " 最新:" + versionInfo.uiLatest + "\n" - "核心版本:" + versionInfo.coreVersion + " 最新:" + versionInfo.coreLatest + "\n" - "当前配置:" + (currentProfileId.isEmpty() ? "默认" : currentProfileId) - ); + ui->versionLabel->setText("版本 " + versionInfo.uiVersion); + ui->versionLabel->setToolTip( + "UI 版本:" + versionInfo.uiVersion + "(最新:" + versionInfo.uiLatest + ")\n" + "核心版本:" + versionInfo.coreVersion + "(最新:" + versionInfo.coreLatest + ")" + ); + updateProfileSummary(); } void MainWindow::showNotification(const QString &title, const QString &content, QSystemTrayIcon::MessageIcon icon) diff --git a/presentation/main/mainwindow.h b/presentation/main/mainwindow.h index 403af45..7ab8f93 100644 --- a/presentation/main/mainwindow.h +++ b/presentation/main/mainwindow.h @@ -53,6 +53,12 @@ private: void resetZjuConnectUi(); + void applyColorScheme(Qt::ColorScheme scheme); + + void updateConnectionState(ConnectionState state); + + void updateProfileSummary(); + void showNotification( const QString &title, const QString &content, diff --git a/presentation/main/mainwindow.ui b/presentation/main/mainwindow.ui index 97605c3..2a9b5b1 100644 --- a/presentation/main/mainwindow.ui +++ b/presentation/main/mainwindow.ui @@ -6,142 +6,442 @@ 0 0 - 600 - 325 + 822 + 583 + + + 600 + 400 + + + + EZ4Connect + - - - - - 设置系统代理 + + + 12 + + + 16 + + + 16 + + + 16 + + + 16 + + + + + 12 - + + + + + 44 + 44 + + + + + 44 + 44 + + + + :/resource/icon.png + + + true + + + + + + + 1 + + + + + + + EZ4Connect + + + + + + + 版本 dev + + + Qt::AlignmentFlag::AlignCenter + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + + 支持 aTrust 与 EasyConnect 协议 + + + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + 打开配置引导 + + + 配置引导 + + + + + + + 打开完整设置 + + + 设置 + + + + - - - - 连接服务器 + + + + 12 - - - - - - true - - - 1000 - - - - - - - ZJU-Connect 图形界面 -支持 aTrust 和 EasyConnect 协议 - -如遇问题欢迎加入 QQ 群 1037726410 反馈 - - - - - - - Line 1 -Line 2 -Line3 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - Qt::Orientation::Horizontal - - - QSizePolicy::Policy::Minimum - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - - 20 - - - - 关注 HITSZ OSA 谢谢喵!n(*≧▽≦*)n - - - EZ4Connect - - - Qt::AlignmentFlag::AlignCenter - - - - - - - - 0 - 0 - - - - 复制日志到剪贴板 - - - 复制日志 - - - - - - - - 0 - 0 - - - - 清空窗口中的日志 - - - 清空日志 - - - - - - - Qt::Orientation::Horizontal - - - - 40 - 20 - - - + + + + + 280 + 0 + + + + + 336 + 16777215 + + + + QFrame::Shape::StyledPanel + + + + 12 + + + 16 + + + 16 + + + 16 + + + 16 + + + + + VPN 连接 + + + + + + + 9 + + + + + + 10 + 10 + + + + + 10 + 10 + + + + + + + + + + + 尚未连接 + + + + + + + Qt::Orientation::Horizontal + + + + 20 + 20 + + + + + + + + + + 连接后即可访问校园网络资源。 + + + true + + + + + + + + 0 + 48 + + + + 连接服务器 + + + true + + + + + + + + 0 + 42 + + + + 设置系统代理 + + + + + + + QFrame::Shape::HLine + + + QFrame::Shadow::Sunken + + + + + + + 当前配置 + + + + + + + 默认 + + + + + + + EasyConnect · 等待连接 + + + true + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + 如遇问题加 QQ 群反馈:1037726410 + + + + + + + + + + QFrame::Shape::StyledPanel + + + + 14 + + + 16 + + + 16 + + + 16 + + + 16 + + + + + 8 + + + + + 2 + + + + + 运行日志 + + + + + + + 连接过程与诊断信息 + + + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + 在系统中打开完整日志文件 + + + 打开日志文件 + + + + + + + 复制日志到剪贴板 + + + 复制 + + + + + + + 清空窗口中的日志 + + + 清空 + + + + + + + + + true + + + 1000 + + + 连接日志将在这里显示 + + + + + + + @@ -150,28 +450,10 @@ Line3 0 0 - 600 + 822 33 - - QMenu::item { - padding: 5px 10px 5px 10px; - } - QMenu::item:selected { - background-color: rgb(0, 85, 127); - color: rgb(255, 255, 255); - } - - - - - 帮助 - - - - - 文件 @@ -192,6 +474,14 @@ Line3 + + + 帮助 + + + + + @@ -200,9 +490,6 @@ Line3 关于本软件 - - 关于本软件 - QAction::MenuRole::AboutRole @@ -277,8 +564,16 @@ Line3 + guidePushButton + settingPushButton + pushButton1 + pushButton2 logPlainTextEdit + copyLogPushButton + clearLogPushButton - + + + diff --git a/resource.qrc b/resource.qrc index 901b272..93be5fe 100644 --- a/resource.qrc +++ b/resource.qrc @@ -1,5 +1,8 @@ resource/icon.png + resource/mainwindow.qss + resource/mainwindow-light.qss + resource/mainwindow-dark.qss diff --git a/resource/mainwindow-dark.qss b/resource/mainwindow-dark.qss new file mode 100644 index 0000000..1143635 --- /dev/null +++ b/resource/mainwindow-dark.qss @@ -0,0 +1,204 @@ +QMainWindow { + background: #141b20; +} + +QLabel, +QPlainTextEdit, +QMenuBar, +QMenu { + color: #e6edf1; +} + +QMenuBar { + background: #141b20; + border-bottom-color: #2d3a42; +} + +QMenuBar::item:selected { + background: #24323a; +} + +QMenu { + background: #1d272d; + border-color: #354650; +} + +QMenu::item:selected { + background: #243f4d; + color: #9fdcff; +} + +#applicationNameLabel { + color: #f0f5f7; +} + +#applicationSubtitleLabel, +#logSubtitleLabel, +#logHintLabel, +#supportLabel { + color: #9eafb9; +} + +#versionLabel { + background: #26333b; + color: #bdcbd3; +} + +#controlPanel, +#logPanel { + background: #1c252b; + border-color: #30404a; +} + +#connectionEyebrowLabel, +#profileEyebrowLabel { + color: #a4b4bd; +} + +#statusTitleLabel, +#profileNameLabel, +#logTitleLabel { + color: #edf3f6; +} + +#statusDetailLabel, +#profileDetailLabel, +#qqGroupLabel { + color: #acbac2; +} + +#statusIndicator { + background: #71838e; +} + +#statusIndicator[connectionState="starting"], +#statusIndicator[connectionState="reconnecting"] { + background: #dfa24f; +} + +#statusIndicator[connectionState="running"] { + background: #55b9e7; +} + +#statusIndicator[connectionState="stopping"] { + background: #8b9ca6; +} + +#statusIndicator[connectionState="failed"] { + background: #dc7777; +} + +QPushButton#guidePushButton, +QPushButton#settingPushButton, +QPushButton#pushButton1, +QPushButton#pushButton2, +QPushButton#openLogPushButton, +QPushButton#copyLogPushButton, +QPushButton#clearLogPushButton { + background: #243038; + border-color: #40545f; + color: #dfe8ed; +} + +QPushButton#guidePushButton:hover, +QPushButton#settingPushButton:hover, +QPushButton#pushButton1:hover, +QPushButton#pushButton2:hover, +QPushButton#openLogPushButton:hover, +QPushButton#copyLogPushButton:hover, +QPushButton#clearLogPushButton:hover { + background: #2b3b44; + border-color: #5d7684; +} + +QPushButton#guidePushButton:pressed, +QPushButton#settingPushButton:pressed, +QPushButton#pushButton1:pressed, +QPushButton#pushButton2:pressed, +QPushButton#openLogPushButton:pressed, +QPushButton#copyLogPushButton:pressed, +QPushButton#clearLogPushButton:pressed { + background: #192329; +} + +QPushButton#guidePushButton:focus, +QPushButton#settingPushButton:focus, +QPushButton#pushButton1:focus, +QPushButton#pushButton2:focus, +QPushButton#openLogPushButton:focus, +QPushButton#copyLogPushButton:focus, +QPushButton#clearLogPushButton:focus { + border-color: #69c4ed; +} + +QPushButton#guidePushButton:disabled, +QPushButton#settingPushButton:disabled, +QPushButton#pushButton1:disabled, +QPushButton#pushButton2:disabled, +QPushButton#openLogPushButton:disabled, +QPushButton#copyLogPushButton:disabled, +QPushButton#clearLogPushButton:disabled { + background: #1d272d; + border-color: #2f3e46; + color: #71818a; +} + +QPushButton#pushButton1 { + background: #55b9e7; + border-color: #55b9e7; + color: #081820; +} + +QPushButton#pushButton1:hover { + background: #6bc7ee; + border-color: #6bc7ee; +} + +QPushButton#pushButton1:pressed { + background: #3aa5d5; +} + +QPushButton#pushButton1[connectionState="running"], +QPushButton#pushButton1[connectionState="starting"], +QPushButton#pushButton1[connectionState="reconnecting"] { + background: #302626; + border-color: #765252; + color: #efaaaa; +} + +QPushButton#pushButton1[connectionState="running"]:hover, +QPushButton#pushButton1[connectionState="starting"]:hover, +QPushButton#pushButton1[connectionState="reconnecting"]:hover { + background: #3a2929; + border-color: #a46a6a; +} + +QPushButton#pushButton2 { + background: #203744; + border-color: #37647a; + color: #9fdcff; +} + +#controlDivider { + color: #30404a; +} + +#logPlainTextEdit { + background: #141c21; + border-color: #30404a; + color: #dae5ea; + selection-background-color: #285b73; + selection-color: #f1f7fa; +} + +#logPlainTextEdit:focus { + border-color: #5799b8; +} + +QScrollBar::handle:vertical { + background: #485b66; +} + +QScrollBar::handle:vertical:hover { + background: #617784; +} diff --git a/resource/mainwindow-light.qss b/resource/mainwindow-light.qss new file mode 100644 index 0000000..e20e84f --- /dev/null +++ b/resource/mainwindow-light.qss @@ -0,0 +1,204 @@ +QMainWindow { + background: #f2f7fa; +} + +QLabel, +QPlainTextEdit, +QMenuBar, +QMenu { + color: #202a31; +} + +QMenuBar { + background: #f2f7fa; + border-bottom-color: #dbe5eb; +} + +QMenuBar::item:selected { + background: #e2f0f7; +} + +QMenu { + background: #ffffff; + border-color: #d5e1e8; +} + +QMenu::item:selected { + background: #e1f1f9; + color: #176b92; +} + +#applicationNameLabel { + color: #18242b; +} + +#applicationSubtitleLabel, +#logSubtitleLabel, +#logHintLabel, +#supportLabel { + color: #687985; +} + +#versionLabel { + background: #e3eef4; + color: #506b7a; +} + +#controlPanel, +#logPanel { + background: #ffffff; + border-color: #d7e3e9; +} + +#connectionEyebrowLabel, +#profileEyebrowLabel { + color: #6b7d88; +} + +#statusTitleLabel, +#profileNameLabel, +#logTitleLabel { + color: #202a31; +} + +#statusDetailLabel, +#profileDetailLabel, +#qqGroupLabel { + color: #60727d; +} + +#statusIndicator { + background: #9eacb5; +} + +#statusIndicator[connectionState="starting"], +#statusIndicator[connectionState="reconnecting"] { + background: #bc7a27; +} + +#statusIndicator[connectionState="running"] { + background: #278bb9; +} + +#statusIndicator[connectionState="stopping"] { + background: #71808a; +} + +#statusIndicator[connectionState="failed"] { + background: #b94b4b; +} + +QPushButton#guidePushButton, +QPushButton#settingPushButton, +QPushButton#pushButton1, +QPushButton#pushButton2, +QPushButton#openLogPushButton, +QPushButton#copyLogPushButton, +QPushButton#clearLogPushButton { + background: #ffffff; + border-color: #c8d7df; + color: #2e3b43; +} + +QPushButton#guidePushButton:hover, +QPushButton#settingPushButton:hover, +QPushButton#pushButton1:hover, +QPushButton#pushButton2:hover, +QPushButton#openLogPushButton:hover, +QPushButton#copyLogPushButton:hover, +QPushButton#clearLogPushButton:hover { + background: #f0f7fa; + border-color: #a9c2cf; +} + +QPushButton#guidePushButton:pressed, +QPushButton#settingPushButton:pressed, +QPushButton#pushButton1:pressed, +QPushButton#pushButton2:pressed, +QPushButton#openLogPushButton:pressed, +QPushButton#copyLogPushButton:pressed, +QPushButton#clearLogPushButton:pressed { + background: #e3eff4; +} + +QPushButton#guidePushButton:focus, +QPushButton#settingPushButton:focus, +QPushButton#pushButton1:focus, +QPushButton#pushButton2:focus, +QPushButton#openLogPushButton:focus, +QPushButton#copyLogPushButton:focus, +QPushButton#clearLogPushButton:focus { + border-color: #167aa8; +} + +QPushButton#guidePushButton:disabled, +QPushButton#settingPushButton:disabled, +QPushButton#pushButton1:disabled, +QPushButton#pushButton2:disabled, +QPushButton#openLogPushButton:disabled, +QPushButton#copyLogPushButton:disabled, +QPushButton#clearLogPushButton:disabled { + background: #edf2f4; + border-color: #dde5e9; + color: #9ca8ae; +} + +QPushButton#pushButton1 { + background: #167aa8; + border-color: #167aa8; + color: #ffffff; +} + +QPushButton#pushButton1:hover { + background: #126b94; + border-color: #126b94; +} + +QPushButton#pushButton1:pressed { + background: #0f5a7d; +} + +QPushButton#pushButton1[connectionState="running"], +QPushButton#pushButton1[connectionState="starting"], +QPushButton#pushButton1[connectionState="reconnecting"] { + background: #ffffff; + border-color: #c9aaa7; + color: #943f3f; +} + +QPushButton#pushButton1[connectionState="running"]:hover, +QPushButton#pushButton1[connectionState="starting"]:hover, +QPushButton#pushButton1[connectionState="reconnecting"]:hover { + background: #fbf3f2; + border-color: #b9807c; +} + +QPushButton#pushButton2 { + background: #e7f4fa; + border-color: #bddce9; + color: #176f98; +} + +#controlDivider { + color: #dce6eb; +} + +#logPlainTextEdit { + background: #f6f9fb; + border-color: #dce6eb; + color: #2e3b43; + selection-background-color: #c4e5f4; + selection-color: #153746; +} + +#logPlainTextEdit:focus { + border-color: #65a6c4; +} + +QScrollBar::handle:vertical { + background: #c2cfd6; +} + +QScrollBar::handle:vertical:hover { + background: #a5b7c0; +} diff --git a/resource/mainwindow.qss b/resource/mainwindow.qss new file mode 100644 index 0000000..9accb9d --- /dev/null +++ b/resource/mainwindow.qss @@ -0,0 +1,144 @@ +QLabel, +QPlainTextEdit, +QMenuBar, +QMenu { + font-size: 13px; +} + +QMenuBar { + border-bottom-width: 1px; + border-bottom-style: solid; + padding: 3px 10px; +} + +QMenuBar::item { + background: transparent; + border-radius: 4px; + padding: 5px 10px; +} + +QMenu { + border-width: 1px; + border-style: solid; + padding: 6px; +} + +QMenu::item { + border-radius: 4px; + padding: 7px 24px 7px 10px; +} + +#applicationNameLabel { + font-size: 21px; + font-weight: 600; +} + +#applicationSubtitleLabel, +#logSubtitleLabel, +#logHintLabel, +#supportLabel { + font-size: 12px; +} + +#versionLabel { + border-radius: 4px; + font-size: 12px; + font-weight: 600; + margin-left: 6px; + padding: 4px 6px; +} + +#controlPanel, +#logPanel { + border-width: 1px; + border-style: solid; + border-radius: 7px; +} + +#connectionEyebrowLabel, +#profileEyebrowLabel { + font-size: 11px; + font-weight: 600; +} + +#statusTitleLabel { + font-size: 24px; + font-weight: 600; +} + +#profileNameLabel, +#logTitleLabel { + font-size: 17px; + font-weight: 600; +} + +#statusIndicator { + border-radius: 5px; +} + +QPushButton#guidePushButton, +QPushButton#settingPushButton, +QPushButton#pushButton1, +QPushButton#pushButton2, +QPushButton#openLogPushButton, +QPushButton#copyLogPushButton, +QPushButton#clearLogPushButton { + min-height: 34px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + font-size: 13px; + font-weight: 500; + padding: 0 14px; +} + +QPushButton#guidePushButton:focus, +QPushButton#settingPushButton:focus, +QPushButton#pushButton1:focus, +QPushButton#pushButton2:focus, +QPushButton#openLogPushButton:focus, +QPushButton#copyLogPushButton:focus, +QPushButton#clearLogPushButton:focus { + border-width: 2px; +} + +QPushButton#pushButton1 { + font-size: 14px; + font-weight: 600; +} + +#guidePushButton, +#settingPushButton, +#copyLogPushButton, +#clearLogPushButton, +#openLogPushButton { + min-height: 32px; + font-size: 12px; +} + +#logPlainTextEdit { + border-width: 1px; + border-style: solid; + border-radius: 5px; + font-size: 12px; + padding: 8px; +} + +QScrollBar:vertical { + background: transparent; + margin: 4px 2px; + width: 10px; +} + +QScrollBar::handle:vertical { + border-radius: 4px; + min-height: 30px; +} + +QScrollBar::add-line:vertical, +QScrollBar::sub-line:vertical, +QScrollBar::add-page:vertical, +QScrollBar::sub-page:vertical { + background: transparent; + height: 0; +}