feat: add view help to help menu
This commit is contained in:
parent
05f42e6483
commit
99eb7dc27f
17 changed files with 310 additions and 1 deletions
|
|
@ -30,6 +30,7 @@
|
||||||
<file>icons/deskflow-dark/actions/22/network-connect.svg</file>
|
<file>icons/deskflow-dark/actions/22/network-connect.svg</file>
|
||||||
<file>icons/deskflow-dark/actions/22/network-disconnect.svg</file>
|
<file>icons/deskflow-dark/actions/22/network-disconnect.svg</file>
|
||||||
<file>icons/deskflow-dark/actions/22/process-stop.svg</file>
|
<file>icons/deskflow-dark/actions/22/process-stop.svg</file>
|
||||||
|
<file>icons/deskflow-dark/actions/22/question.svg</file>
|
||||||
<file>icons/deskflow-dark/actions/22/system-run.svg</file>
|
<file>icons/deskflow-dark/actions/22/system-run.svg</file>
|
||||||
<file>icons/deskflow-dark/actions/22/system-search.svg</file>
|
<file>icons/deskflow-dark/actions/22/system-search.svg</file>
|
||||||
<file>icons/deskflow-dark/actions/22/tools-report-bug.svg</file>
|
<file>icons/deskflow-dark/actions/22/tools-report-bug.svg</file>
|
||||||
|
|
@ -50,6 +51,7 @@
|
||||||
<file>icons/deskflow-dark/actions/24/network-connect.svg</file>
|
<file>icons/deskflow-dark/actions/24/network-connect.svg</file>
|
||||||
<file>icons/deskflow-dark/actions/24/network-disconnect.svg</file>
|
<file>icons/deskflow-dark/actions/24/network-disconnect.svg</file>
|
||||||
<file>icons/deskflow-dark/actions/24/process-stop.svg</file>
|
<file>icons/deskflow-dark/actions/24/process-stop.svg</file>
|
||||||
|
<file>icons/deskflow-dark/actions/24/question.svg</file>
|
||||||
<file>icons/deskflow-dark/actions/24/system-run.svg</file>
|
<file>icons/deskflow-dark/actions/24/system-run.svg</file>
|
||||||
<file>icons/deskflow-dark/actions/24/system-search.svg</file>
|
<file>icons/deskflow-dark/actions/24/system-search.svg</file>
|
||||||
<file>icons/deskflow-dark/actions/24/tools-report-bug.svg</file>
|
<file>icons/deskflow-dark/actions/24/tools-report-bug.svg</file>
|
||||||
|
|
@ -115,6 +117,7 @@
|
||||||
<file>icons/deskflow-light/actions/22/network-disconnect.svg</file>
|
<file>icons/deskflow-light/actions/22/network-disconnect.svg</file>
|
||||||
<file>icons/deskflow-light/actions/22/help-about.svg</file>
|
<file>icons/deskflow-light/actions/22/help-about.svg</file>
|
||||||
<file>icons/deskflow-light/actions/22/process-stop.svg</file>
|
<file>icons/deskflow-light/actions/22/process-stop.svg</file>
|
||||||
|
<file>icons/deskflow-light/actions/22/question.svg</file>
|
||||||
<file>icons/deskflow-light/actions/22/system-run.svg</file>
|
<file>icons/deskflow-light/actions/22/system-run.svg</file>
|
||||||
<file>icons/deskflow-light/actions/22/system-search.svg</file>
|
<file>icons/deskflow-light/actions/22/system-search.svg</file>
|
||||||
<file>icons/deskflow-light/actions/22/tools-report-bug.svg</file>
|
<file>icons/deskflow-light/actions/22/tools-report-bug.svg</file>
|
||||||
|
|
@ -135,6 +138,7 @@
|
||||||
<file>icons/deskflow-light/actions/24/network-connect.svg</file>
|
<file>icons/deskflow-light/actions/24/network-connect.svg</file>
|
||||||
<file>icons/deskflow-light/actions/24/network-disconnect.svg</file>
|
<file>icons/deskflow-light/actions/24/network-disconnect.svg</file>
|
||||||
<file>icons/deskflow-light/actions/24/process-stop.svg</file>
|
<file>icons/deskflow-light/actions/24/process-stop.svg</file>
|
||||||
|
<file>icons/deskflow-light/actions/24/question.svg</file>
|
||||||
<file>icons/deskflow-light/actions/24/system-run.svg</file>
|
<file>icons/deskflow-light/actions/24/system-run.svg</file>
|
||||||
<file>icons/deskflow-light/actions/24/system-search.svg</file>
|
<file>icons/deskflow-light/actions/24/system-search.svg</file>
|
||||||
<file>icons/deskflow-light/actions/24/tools-report-bug.svg</file>
|
<file>icons/deskflow-light/actions/24/tools-report-bug.svg</file>
|
||||||
|
|
|
||||||
7
src/apps/res/icons/deskflow-dark/actions/22/question.svg
Normal file
7
src/apps/res/icons/deskflow-dark/actions/22/question.svg
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22">
|
||||||
|
<defs id="defs3051">
|
||||||
|
<style type="text/css" id="current-color-scheme">.ColorScheme-Text { color: #fcfcfc; } </style>
|
||||||
|
</defs>
|
||||||
|
<path style="fill:currentColor;fill-opacity:1;stroke:none" d="M 10.96875 3 C 9.21782 3 7.56187 3.4216019 6 4.2636719 L 6.7773438 6.0507812 C 7.5582637 5.6672613 8.2600456 5.3933025 8.8847656 5.2265625 C 9.5177356 5.0598325 10.162692 4.9765625 10.820312 4.9765625 C 11.806753 4.9765625 12.563734 5.1968119 13.089844 5.6386719 C 13.615944 6.0805419 13.878906 6.7136725 13.878906 7.5390625 C 13.878906 7.9809325 13.822111 8.369625 13.707031 8.703125 C 13.591951 9.036605 13.394724 9.369635 13.115234 9.703125 C 12.835754 10.036615 12.247563 10.586476 11.351562 11.353516 C 10.251483 12.356846 9.10046 14.139 9 16 L 11 16 L 10.994141 15.96875 C 10.994141 15.21007 11.125612 14.601138 11.388672 14.142578 C 11.659952 13.675688 12.201805 13.087576 13.015625 12.378906 C 14.010295 11.536836 14.673153 10.903726 15.001953 10.478516 C 15.338993 10.053316 15.589506 9.6041363 15.753906 9.1289062 C 15.918406 8.6536762 16 8.1071944 16 7.4902344 C 16 6.0728944 15.55227 4.97119 14.65625 4.1875 C 13.76024 3.39546 12.53061 3 10.96875 3 z M 9 17 L 9 19 L 11 19 L 11 17 L 9 17 z " class="ColorScheme-Text"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
9
src/apps/res/icons/deskflow-dark/actions/24/question.svg
Normal file
9
src/apps/res/icons/deskflow-dark/actions/24/question.svg
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
|
||||||
|
<defs id="defs3051">
|
||||||
|
<style type="text/css" id="current-color-scheme">.ColorScheme-Text { color: #fcfcfc; } </style>
|
||||||
|
</defs>
|
||||||
|
<g transform="translate(1,1)">
|
||||||
|
<path style="fill:currentColor;fill-opacity:1;stroke:none" d="M 10.96875 3 C 9.21782 3 7.56187 3.4216019 6 4.2636719 L 6.7773438 6.0507812 C 7.5582637 5.6672613 8.2600456 5.3933025 8.8847656 5.2265625 C 9.5177356 5.0598325 10.162692 4.9765625 10.820312 4.9765625 C 11.806753 4.9765625 12.563734 5.1968119 13.089844 5.6386719 C 13.615944 6.0805419 13.878906 6.7136725 13.878906 7.5390625 C 13.878906 7.9809325 13.822111 8.369625 13.707031 8.703125 C 13.591951 9.036605 13.394724 9.369635 13.115234 9.703125 C 12.835754 10.036615 12.247563 10.586476 11.351562 11.353516 C 10.251483 12.356846 9.10046 14.139 9 16 L 11 16 L 10.994141 15.96875 C 10.994141 15.21007 11.125612 14.601138 11.388672 14.142578 C 11.659952 13.675688 12.201805 13.087576 13.015625 12.378906 C 14.010295 11.536836 14.673153 10.903726 15.001953 10.478516 C 15.338993 10.053316 15.589506 9.6041363 15.753906 9.1289062 C 15.918406 8.6536762 16 8.1071944 16 7.4902344 C 16 6.0728944 15.55227 4.97119 14.65625 4.1875 C 13.76024 3.39546 12.53061 3 10.96875 3 z M 9 17 L 9 19 L 11 19 L 11 17 L 9 17 z " class="ColorScheme-Text"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.4 KiB |
14
src/apps/res/icons/deskflow-light/actions/22/question.svg
Normal file
14
src/apps/res/icons/deskflow-light/actions/22/question.svg
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22">
|
||||||
|
<defs id="defs3051">
|
||||||
|
<style type="text/css" id="current-color-scheme">
|
||||||
|
.ColorScheme-Text {
|
||||||
|
color:#232629;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</defs>
|
||||||
|
<path
|
||||||
|
style="fill:currentColor;fill-opacity:1;stroke:none"
|
||||||
|
d="M 10.96875 3 C 9.21782 3 7.56187 3.4216019 6 4.2636719 L 6.7773438 6.0507812 C 7.5582637 5.6672613 8.2600456 5.3933025 8.8847656 5.2265625 C 9.5177356 5.0598325 10.162692 4.9765625 10.820312 4.9765625 C 11.806753 4.9765625 12.563734 5.1968119 13.089844 5.6386719 C 13.615944 6.0805419 13.878906 6.7136725 13.878906 7.5390625 C 13.878906 7.9809325 13.822111 8.369625 13.707031 8.703125 C 13.591951 9.036605 13.394724 9.369635 13.115234 9.703125 C 12.835754 10.036615 12.247563 10.586476 11.351562 11.353516 C 10.251483 12.356846 9.10046 14.139 9 16 L 11 16 L 10.994141 15.96875 C 10.994141 15.21007 11.125612 14.601138 11.388672 14.142578 C 11.659952 13.675688 12.201805 13.087576 13.015625 12.378906 C 14.010295 11.536836 14.673153 10.903726 15.001953 10.478516 C 15.338993 10.053316 15.589506 9.6041363 15.753906 9.1289062 C 15.918406 8.6536762 16 8.1071944 16 7.4902344 C 16 6.0728944 15.55227 4.97119 14.65625 4.1875 C 13.76024 3.39546 12.53061 3 10.96875 3 z M 9 17 L 9 19 L 11 19 L 11 17 L 9 17 z "
|
||||||
|
class="ColorScheme-Text"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
12
src/apps/res/icons/deskflow-light/actions/24/question.svg
Normal file
12
src/apps/res/icons/deskflow-light/actions/24/question.svg
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
|
||||||
|
<defs id="defs3051">
|
||||||
|
<style type="text/css" id="current-color-scheme">
|
||||||
|
.ColorScheme-Text {
|
||||||
|
color:#232629;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</defs>
|
||||||
|
<g transform="translate(1,1)">
|
||||||
|
<path style="fill:currentColor;fill-opacity:1;stroke:none" d="M 10.96875 3 C 9.21782 3 7.56187 3.4216019 6 4.2636719 L 6.7773438 6.0507812 C 7.5582637 5.6672613 8.2600456 5.3933025 8.8847656 5.2265625 C 9.5177356 5.0598325 10.162692 4.9765625 10.820312 4.9765625 C 11.806753 4.9765625 12.563734 5.1968119 13.089844 5.6386719 C 13.615944 6.0805419 13.878906 6.7136725 13.878906 7.5390625 C 13.878906 7.9809325 13.822111 8.369625 13.707031 8.703125 C 13.591951 9.036605 13.394724 9.369635 13.115234 9.703125 C 12.835754 10.036615 12.247563 10.586476 11.351562 11.353516 C 10.251483 12.356846 9.10046 14.139 9 16 L 11 16 L 10.994141 15.96875 C 10.994141 15.21007 11.125612 14.601138 11.388672 14.142578 C 11.659952 13.675688 12.201805 13.087576 13.015625 12.378906 C 14.010295 11.536836 14.673153 10.903726 15.001953 10.478516 C 15.338993 10.053316 15.589506 9.6041363 15.753906 9.1289062 C 15.918406 8.6536762 16 8.1071944 16 7.4902344 C 16 6.0728944 15.55227 4.97119 14.65625 4.1875 C 13.76024 3.39546 12.53061 3 10.96875 3 z M 9 17 L 9 19 L 11 19 L 11 17 L 9 17 z " class="ColorScheme-Text"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.4 KiB |
|
|
@ -17,7 +17,7 @@ const auto kUrlSourceQuery = QStringLiteral("source=gui");
|
||||||
const auto kUrlApp = QStringLiteral("https://%1").arg(kOrgDomain);
|
const auto kUrlApp = QStringLiteral("https://%1").arg(kOrgDomain);
|
||||||
const auto kUrlHelp = QStringLiteral("%1/help?%2").arg(kUrlApp, kUrlSourceQuery);
|
const auto kUrlHelp = QStringLiteral("%1/help?%2").arg(kUrlApp, kUrlSourceQuery);
|
||||||
const auto kUrlDownload = QStringLiteral("%1/download?%2").arg(kUrlApp, kUrlSourceQuery);
|
const auto kUrlDownload = QStringLiteral("%1/download?%2").arg(kUrlApp, kUrlSourceQuery);
|
||||||
|
const auto kUrlWiki = QStringLiteral("%1/wiki?%2").arg(kUrlApp, kUrlSourceQuery);
|
||||||
const auto kUrlUpdateCheck = QStringLiteral("https://api.%1/version").arg(kOrgDomain);
|
const auto kUrlUpdateCheck = QStringLiteral("https://api.%1/version").arg(kOrgDomain);
|
||||||
|
|
||||||
#if defined(Q_OS_LINUX)
|
#if defined(Q_OS_LINUX)
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,8 @@ add_library(${target} STATIC
|
||||||
dialogs/ClientConfigDialog.ui
|
dialogs/ClientConfigDialog.ui
|
||||||
dialogs/FingerprintDialog.cpp
|
dialogs/FingerprintDialog.cpp
|
||||||
dialogs/FingerprintDialog.h
|
dialogs/FingerprintDialog.h
|
||||||
|
dialogs/HelpDialog.cpp
|
||||||
|
dialogs/HelpDialog.h
|
||||||
dialogs/HotkeyDialog.cpp
|
dialogs/HotkeyDialog.cpp
|
||||||
dialogs/HotkeyDialog.h
|
dialogs/HotkeyDialog.h
|
||||||
dialogs/HotkeyDialog.ui
|
dialogs/HotkeyDialog.ui
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@
|
||||||
#include "dialogs/AboutDialog.h"
|
#include "dialogs/AboutDialog.h"
|
||||||
#include "dialogs/ClientConfigDialog.h"
|
#include "dialogs/ClientConfigDialog.h"
|
||||||
#include "dialogs/FingerprintDialog.h"
|
#include "dialogs/FingerprintDialog.h"
|
||||||
|
#include "dialogs/HelpDialog.h"
|
||||||
#include "dialogs/ServerConfigDialog.h"
|
#include "dialogs/ServerConfigDialog.h"
|
||||||
#include "dialogs/SettingsDialog.h"
|
#include "dialogs/SettingsDialog.h"
|
||||||
|
|
||||||
|
|
@ -79,6 +80,7 @@ MainWindow::MainWindow()
|
||||||
m_actionStartCore{new QAction(this)},
|
m_actionStartCore{new QAction(this)},
|
||||||
m_actionRestartCore{new QAction(this)},
|
m_actionRestartCore{new QAction(this)},
|
||||||
m_actionStopCore{new QAction(this)},
|
m_actionStopCore{new QAction(this)},
|
||||||
|
m_actionShowHelp{new QAction(this)},
|
||||||
m_networkMonitor{new NetworkMonitor(this)}
|
m_networkMonitor{new NetworkMonitor(this)}
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
@ -124,6 +126,9 @@ MainWindow::MainWindow()
|
||||||
m_actionReportBug->setIcon(QIcon::fromTheme(QStringLiteral("tools-report-bug")));
|
m_actionReportBug->setIcon(QIcon::fromTheme(QStringLiteral("tools-report-bug")));
|
||||||
m_actionReportBug->setMenuRole(QAction::NoRole);
|
m_actionReportBug->setMenuRole(QAction::NoRole);
|
||||||
|
|
||||||
|
m_actionShowHelp->setIcon(QIcon::fromTheme(QStringLiteral("question")));
|
||||||
|
m_actionShowHelp->setMenuRole(QAction::NoRole);
|
||||||
|
|
||||||
// Setup the Instance Checking
|
// Setup the Instance Checking
|
||||||
// In case of a previous crash remove first
|
// In case of a previous crash remove first
|
||||||
QLocalServer::removeServer(m_guiSocketName);
|
QLocalServer::removeServer(m_guiSocketName);
|
||||||
|
|
@ -135,6 +140,7 @@ MainWindow::MainWindow()
|
||||||
connectSlots();
|
connectSlots();
|
||||||
setupTrayIcon();
|
setupTrayIcon();
|
||||||
updateScreenName();
|
updateScreenName();
|
||||||
|
setHelpFilePath();
|
||||||
|
|
||||||
qDebug().noquote() << "active settings path:" << Settings::settingsPath();
|
qDebug().noquote() << "active settings path:" << Settings::settingsPath();
|
||||||
|
|
||||||
|
|
@ -263,6 +269,7 @@ void MainWindow::connectSlots()
|
||||||
connect(m_actionStartCore, &QAction::triggered, this, &MainWindow::startCore);
|
connect(m_actionStartCore, &QAction::triggered, this, &MainWindow::startCore);
|
||||||
connect(m_actionRestartCore, &QAction::triggered, this, &MainWindow::resetCore);
|
connect(m_actionRestartCore, &QAction::triggered, this, &MainWindow::resetCore);
|
||||||
connect(m_actionStopCore, &QAction::triggered, this, &MainWindow::stopCore);
|
connect(m_actionStopCore, &QAction::triggered, this, &MainWindow::stopCore);
|
||||||
|
connect(m_actionShowHelp, &QAction::triggered, this, &MainWindow::showHelpViewer);
|
||||||
|
|
||||||
// Mac os tray will only show a menu
|
// Mac os tray will only show a menu
|
||||||
if (!deskflow::platform::isMac())
|
if (!deskflow::platform::isMac())
|
||||||
|
|
@ -672,6 +679,7 @@ void MainWindow::createMenuBar()
|
||||||
m_menuView->addAction(m_logDock->toggleViewAction());
|
m_menuView->addAction(m_logDock->toggleViewAction());
|
||||||
|
|
||||||
m_menuHelp->addAction(m_actionAbout);
|
m_menuHelp->addAction(m_actionAbout);
|
||||||
|
m_menuHelp->addAction(m_actionShowHelp);
|
||||||
m_menuHelp->addAction(m_actionReportBug);
|
m_menuHelp->addAction(m_actionReportBug);
|
||||||
m_menuHelp->addSeparator();
|
m_menuHelp->addSeparator();
|
||||||
m_menuHelp->addAction(m_actionClearSettings);
|
m_menuHelp->addAction(m_actionClearSettings);
|
||||||
|
|
@ -1063,6 +1071,8 @@ void MainWindow::updateText()
|
||||||
//: %1 will be the replaced with the appname
|
//: %1 will be the replaced with the appname
|
||||||
m_actionAbout->setText(tr("About %1...").arg(kAppName));
|
m_actionAbout->setText(tr("About %1...").arg(kAppName));
|
||||||
|
|
||||||
|
m_actionShowHelp->setText(tr("View &Help"));
|
||||||
|
|
||||||
//: start / restart core shortcut
|
//: start / restart core shortcut
|
||||||
m_actionStartCore->setShortcut(QKeySequence(tr("Ctrl+S")));
|
m_actionStartCore->setShortcut(QKeySequence(tr("Ctrl+S")));
|
||||||
m_actionRestartCore->setShortcut(QKeySequence(tr("Ctrl+S")));
|
m_actionRestartCore->setShortcut(QKeySequence(tr("Ctrl+S")));
|
||||||
|
|
@ -1282,6 +1292,36 @@ void MainWindow::updateTimeoutDelay(int newDelay)
|
||||||
m_statusBar->setConnectionInterval(newDelay);
|
m_statusBar->setConnectionInterval(newDelay);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::setHelpFilePath()
|
||||||
|
{
|
||||||
|
const QString appPath = QCoreApplication::applicationDirPath();
|
||||||
|
const auto buildPath = QDir::cleanPath(QString("%1/../docs/user/html/index.html").arg(appPath));
|
||||||
|
auto installPath = QString("%1/../share/doc/deskflow/html/index.html").arg(appPath);
|
||||||
|
if (deskflow::platform::isMac())
|
||||||
|
installPath = QString("%1/Contents/Resources/docs/html/index.html").arg(appPath);
|
||||||
|
else if (deskflow::platform::isWindows())
|
||||||
|
installPath = QString("%1/docs/html/index.html").arg(appPath);
|
||||||
|
|
||||||
|
installPath = QDir::cleanPath(installPath);
|
||||||
|
|
||||||
|
if (QFile::exists(installPath))
|
||||||
|
m_helpPath = QUrl::fromLocalFile(installPath);
|
||||||
|
else if (QFile::exists(buildPath))
|
||||||
|
m_helpPath = QUrl::fromLocalFile(buildPath);
|
||||||
|
else
|
||||||
|
m_helpPath = kUrlWiki;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::showHelpViewer() const
|
||||||
|
{
|
||||||
|
if (m_helpPath.isLocalFile()) {
|
||||||
|
HelpDialog dialogHelp(this->centralWidget(), m_helpPath);
|
||||||
|
dialogHelp.exec();
|
||||||
|
} else {
|
||||||
|
QDesktopServices::openUrl(m_helpPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool MainWindow::canRunCore() const
|
bool MainWindow::canRunCore() const
|
||||||
{
|
{
|
||||||
const auto mode = m_coreProcess.mode();
|
const auto mode = m_coreProcess.mode();
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@
|
||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
#include <QRegularExpression>
|
#include <QRegularExpression>
|
||||||
#include <QSystemTrayIcon>
|
#include <QSystemTrayIcon>
|
||||||
|
#include <QUrl>
|
||||||
|
|
||||||
#include "VersionChecker.h"
|
#include "VersionChecker.h"
|
||||||
#include "config/ServerConfig.h"
|
#include "config/ServerConfig.h"
|
||||||
|
|
@ -141,6 +142,8 @@ private:
|
||||||
void remoteHostChanged(const QString &newRemoteHost);
|
void remoteHostChanged(const QString &newRemoteHost);
|
||||||
void updateIpLabel(const QStringList &addresses);
|
void updateIpLabel(const QStringList &addresses);
|
||||||
void updateTimeoutDelay(int newDelay);
|
void updateTimeoutDelay(int newDelay);
|
||||||
|
void setHelpFilePath();
|
||||||
|
void showHelpViewer() const;
|
||||||
|
|
||||||
bool canRunCore() const;
|
bool canRunCore() const;
|
||||||
|
|
||||||
|
|
@ -200,6 +203,7 @@ private:
|
||||||
QAction *m_actionStartCore = nullptr;
|
QAction *m_actionStartCore = nullptr;
|
||||||
QAction *m_actionRestartCore = nullptr;
|
QAction *m_actionRestartCore = nullptr;
|
||||||
QAction *m_actionStopCore = nullptr;
|
QAction *m_actionStopCore = nullptr;
|
||||||
|
QAction *m_actionShowHelp = nullptr;
|
||||||
|
|
||||||
// Network monitoring
|
// Network monitoring
|
||||||
NetworkMonitor *m_networkMonitor = nullptr;
|
NetworkMonitor *m_networkMonitor = nullptr;
|
||||||
|
|
@ -208,4 +212,5 @@ private:
|
||||||
// Server IP strategy optimization
|
// Server IP strategy optimization
|
||||||
QStringList m_serverStartIPs;
|
QStringList m_serverStartIPs;
|
||||||
QString m_serverStartSuggestedIP;
|
QString m_serverStartSuggestedIP;
|
||||||
|
QUrl m_helpPath;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
92
src/lib/gui/dialogs/HelpDialog.cpp
Normal file
92
src/lib/gui/dialogs/HelpDialog.cpp
Normal file
|
|
@ -0,0 +1,92 @@
|
||||||
|
/*
|
||||||
|
* Deskflow -- mouse and keyboard sharing utility
|
||||||
|
* SPDX-FileCopyrightText: (C) 2026 Deskflow Developers
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "HelpDialog.h"
|
||||||
|
#include <common/Constants.h>
|
||||||
|
|
||||||
|
#include <QDesktopServices>
|
||||||
|
#include <QEvent>
|
||||||
|
#include <QPushButton>
|
||||||
|
#include <QTextBrowser>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include <qfile.h>
|
||||||
|
|
||||||
|
HelpDialog::HelpDialog(QWidget *parent, const QUrl &source)
|
||||||
|
: QDialog(parent),
|
||||||
|
m_initialSource{source},
|
||||||
|
m_btnBack{new QPushButton(this)},
|
||||||
|
m_btnHome{new QPushButton(this)},
|
||||||
|
m_browser{new QTextBrowser(this)},
|
||||||
|
m_btnClose{new QPushButton(this)}
|
||||||
|
{
|
||||||
|
setWindowIcon(QIcon::fromTheme(QStringLiteral("question")));
|
||||||
|
|
||||||
|
m_btnBack->setIcon(QIcon::fromTheme(QIcon::ThemeIcon::GoPrevious));
|
||||||
|
m_btnBack->setMaximumWidth(m_btnBack->height());
|
||||||
|
m_btnBack->setShortcut(QKeySequence::Back);
|
||||||
|
m_btnBack->setEnabled(false);
|
||||||
|
m_btnHome->setIcon(QIcon::fromTheme(QIcon::ThemeIcon::GoHome));
|
||||||
|
m_btnHome->setMaximumWidth(m_btnHome->height());
|
||||||
|
m_btnHome->setEnabled(false);
|
||||||
|
m_btnClose->setIcon(QIcon::fromTheme(QIcon::ThemeIcon::WindowClose));
|
||||||
|
|
||||||
|
updateText();
|
||||||
|
|
||||||
|
m_browser->setMinimumSize(650, 500);
|
||||||
|
m_browser->setOpenExternalLinks(false);
|
||||||
|
m_browser->setOpenLinks(false);
|
||||||
|
|
||||||
|
if (!source.isLocalFile()) {
|
||||||
|
QDesktopServices::openUrl(source);
|
||||||
|
} else {
|
||||||
|
m_browser->setSource(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto topLayout = new QHBoxLayout;
|
||||||
|
topLayout->addWidget(m_btnBack);
|
||||||
|
topLayout->addWidget(m_btnHome);
|
||||||
|
topLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum));
|
||||||
|
auto layout = new QVBoxLayout;
|
||||||
|
layout->addLayout(topLayout);
|
||||||
|
layout->addWidget(m_browser);
|
||||||
|
layout->addWidget(m_btnClose);
|
||||||
|
setLayout(layout);
|
||||||
|
adjustSize();
|
||||||
|
|
||||||
|
connect(m_browser, &QTextBrowser::anchorClicked, this, &HelpDialog::linkClicked);
|
||||||
|
connect(m_browser, &QTextBrowser::historyChanged, this, &HelpDialog::historyChanged);
|
||||||
|
connect(m_btnBack, &QPushButton::clicked, m_browser, &QTextBrowser::backward);
|
||||||
|
connect(m_btnHome, &QPushButton::clicked, m_browser, &QTextBrowser::home);
|
||||||
|
connect(m_btnClose, &QPushButton::clicked, this, &QDialog::close);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HelpDialog::changeEvent(QEvent *e)
|
||||||
|
{
|
||||||
|
QDialog::changeEvent(e);
|
||||||
|
if (e->type() == QEvent::LanguageChange) {
|
||||||
|
updateText();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void HelpDialog::updateText()
|
||||||
|
{
|
||||||
|
setWindowTitle(tr("%1 Help").arg(kAppName));
|
||||||
|
m_btnClose->setText(tr("Close"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void HelpDialog::historyChanged()
|
||||||
|
{
|
||||||
|
m_btnBack->setEnabled(m_browser->isBackwardAvailable());
|
||||||
|
m_btnHome->setEnabled(m_browser->source() != m_initialSource);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HelpDialog::linkClicked(const QUrl &url)
|
||||||
|
{
|
||||||
|
if (!url.isLocalFile())
|
||||||
|
QDesktopServices::openUrl(url);
|
||||||
|
else
|
||||||
|
m_browser->setSource(url);
|
||||||
|
}
|
||||||
34
src/lib/gui/dialogs/HelpDialog.h
Normal file
34
src/lib/gui/dialogs/HelpDialog.h
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* Deskflow -- mouse and keyboard sharing utility
|
||||||
|
* SPDX-FileCopyrightText: (C) 2026 Deskflow Developers
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
#include <QPushButton>
|
||||||
|
#include <QTextBrowser>
|
||||||
|
#include <QUrl>
|
||||||
|
|
||||||
|
class HelpDialog : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit HelpDialog(QWidget *parent = nullptr, const QUrl &source = {});
|
||||||
|
~HelpDialog() override = default;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void changeEvent(QEvent *e) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void updateText();
|
||||||
|
void historyChanged();
|
||||||
|
void linkClicked(const QUrl &url);
|
||||||
|
QUrl m_initialSource;
|
||||||
|
QPushButton *m_btnBack = nullptr;
|
||||||
|
QPushButton *m_btnHome = nullptr;
|
||||||
|
QTextBrowser *m_browser = nullptr;
|
||||||
|
QPushButton *m_btnClose = nullptr;
|
||||||
|
};
|
||||||
|
|
@ -270,6 +270,17 @@ Do you want to connect to the server?
|
||||||
<translation type="unfinished">Formato hash no válido</translation>
|
<translation type="unfinished">Formato hash no válido</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>HelpDialog</name>
|
||||||
|
<message>
|
||||||
|
<source>%1 Help</source>
|
||||||
|
<translation type="unfinished">%1 Ayuda</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Close</source>
|
||||||
|
<translation type="unfinished">Cerca</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>HotkeyDialog</name>
|
<name>HotkeyDialog</name>
|
||||||
<message>
|
<message>
|
||||||
|
|
@ -407,6 +418,10 @@ Do you want to connect to the server?
|
||||||
<extracomment>%1 will be the replaced with the appname</extracomment>
|
<extracomment>%1 will be the replaced with the appname</extracomment>
|
||||||
<translation type="unfinished">Acerca de %1...</translation>
|
<translation type="unfinished">Acerca de %1...</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>View &Help</source>
|
||||||
|
<translation type="unfinished">Ver &ayuda</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Ctrl+S</source>
|
<source>Ctrl+S</source>
|
||||||
<extracomment>start / restart core shortcut</extracomment>
|
<extracomment>start / restart core shortcut</extracomment>
|
||||||
|
|
|
||||||
|
|
@ -270,6 +270,17 @@ Vuoi connetterti al server?
|
||||||
<translation>Formato hash non valido</translation>
|
<translation>Formato hash non valido</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>HelpDialog</name>
|
||||||
|
<message>
|
||||||
|
<source>%1 Help</source>
|
||||||
|
<translation type="unfinished">%1 Aiuto</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Close</source>
|
||||||
|
<translation type="unfinished">Vicino</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>HotkeyDialog</name>
|
<name>HotkeyDialog</name>
|
||||||
<message>
|
<message>
|
||||||
|
|
@ -395,6 +406,10 @@ Vuoi connetterti al server?
|
||||||
<extracomment>%1 will be the replaced with the appname</extracomment>
|
<extracomment>%1 will be the replaced with the appname</extracomment>
|
||||||
<translation>Informazioni su %1...</translation>
|
<translation>Informazioni su %1...</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>View &Help</source>
|
||||||
|
<translation type="unfinished">Visualizza la &guida</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Ctrl+S</source>
|
<source>Ctrl+S</source>
|
||||||
<extracomment>start / restart core shortcut</extracomment>
|
<extracomment>start / restart core shortcut</extracomment>
|
||||||
|
|
|
||||||
|
|
@ -270,6 +270,17 @@ Do you want to connect to the server?
|
||||||
<translation>不正なハッシュ形式</translation>
|
<translation>不正なハッシュ形式</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>HelpDialog</name>
|
||||||
|
<message>
|
||||||
|
<source>%1 Help</source>
|
||||||
|
<translation type="unfinished">%1 ヘルプ</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Close</source>
|
||||||
|
<translation type="unfinished">近い</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>HotkeyDialog</name>
|
<name>HotkeyDialog</name>
|
||||||
<message>
|
<message>
|
||||||
|
|
@ -421,6 +432,10 @@ Do you want to connect to the server?
|
||||||
<source><p>Failed to connect to the server '%1'.</p><p>A Client with your name is already connected to the server.</p>Please ensure that you're using a unique name and that only a single instance of the client process is running.</p></source>
|
<source><p>Failed to connect to the server '%1'.</p><p>A Client with your name is already connected to the server.</p>Please ensure that you're using a unique name and that only a single instance of the client process is running.</p></source>
|
||||||
<translation><p>サーバー '%1' への接続に失敗しました。</p><p>同じ名前のクライアントがサーバーに接続済です。</p><p>名前の重複がないことと、クライアントプロセスが多重起動していない事を確認してください。</p></translation>
|
<translation><p>サーバー '%1' への接続に失敗しました。</p><p>同じ名前のクライアントがサーバーに接続済です。</p><p>名前の重複がないことと、クライアントプロセスが多重起動していない事を確認してください。</p></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>View &Help</source>
|
||||||
|
<translation type="unfinished">ヘルプを表示 (&H)</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>No IP Detected</source>
|
<source>No IP Detected</source>
|
||||||
<translation>IPアドレスが見つかりません</translation>
|
<translation>IPアドレスが見つかりません</translation>
|
||||||
|
|
|
||||||
|
|
@ -270,6 +270,17 @@ Do you want to connect to the server?
|
||||||
<translation>잘못된 해시 형식</translation>
|
<translation>잘못된 해시 형식</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>HelpDialog</name>
|
||||||
|
<message>
|
||||||
|
<source>%1 Help</source>
|
||||||
|
<translation type="unfinished">%1 도움말</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Close</source>
|
||||||
|
<translation type="unfinished">닫다</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>HotkeyDialog</name>
|
<name>HotkeyDialog</name>
|
||||||
<message>
|
<message>
|
||||||
|
|
@ -421,6 +432,10 @@ Do you want to connect to the server?
|
||||||
<source><p>Failed to connect to the server '%1'.</p><p>A Client with your name is already connected to the server.</p>Please ensure that you're using a unique name and that only a single instance of the client process is running.</p></source>
|
<source><p>Failed to connect to the server '%1'.</p><p>A Client with your name is already connected to the server.</p>Please ensure that you're using a unique name and that only a single instance of the client process is running.</p></source>
|
||||||
<translation><p>서버 '%1'에 연결하지 못했습니다.</p><p>같은 이름의 클라이언트가 이미 서버에 연결되어 있습니다.</p><p>고유한 이름을 사용하고, 클라이언트 프로세스가 하나만 실행 중인지 확인하세요.</p></translation>
|
<translation><p>서버 '%1'에 연결하지 못했습니다.</p><p>같은 이름의 클라이언트가 이미 서버에 연결되어 있습니다.</p><p>고유한 이름을 사용하고, 클라이언트 프로세스가 하나만 실행 중인지 확인하세요.</p></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>View &Help</source>
|
||||||
|
<translation type="unfinished">도움말 보기(&H)</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>No IP Detected</source>
|
<source>No IP Detected</source>
|
||||||
<translation>IP를 감지하지 못했습니다</translation>
|
<translation>IP를 감지하지 못했습니다</translation>
|
||||||
|
|
|
||||||
|
|
@ -270,6 +270,17 @@ Do you want to connect to the server?
|
||||||
<translation>Неверный формат хэша</translation>
|
<translation>Неверный формат хэша</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>HelpDialog</name>
|
||||||
|
<message>
|
||||||
|
<source>%1 Help</source>
|
||||||
|
<translation type="unfinished">%1 Справка</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Close</source>
|
||||||
|
<translation type="unfinished">Закрывать</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>HotkeyDialog</name>
|
<name>HotkeyDialog</name>
|
||||||
<message>
|
<message>
|
||||||
|
|
@ -421,6 +432,10 @@ Do you want to connect to the server?
|
||||||
<source><p>Failed to connect to the server '%1'.</p><p>A Client with your name is already connected to the server.</p>Please ensure that you're using a unique name and that only a single instance of the client process is running.</p></source>
|
<source><p>Failed to connect to the server '%1'.</p><p>A Client with your name is already connected to the server.</p>Please ensure that you're using a unique name and that only a single instance of the client process is running.</p></source>
|
||||||
<translation><p>Не удалось подключиться к серверу '%1'.</p><p>Клиент с таким именем уже подключен к серверу.</p>Убедитесь, что вы используете уникальное имя и запущен только один процесс клиента.</p></translation>
|
<translation><p>Не удалось подключиться к серверу '%1'.</p><p>Клиент с таким именем уже подключен к серверу.</p>Убедитесь, что вы используете уникальное имя и запущен только один процесс клиента.</p></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>View &Help</source>
|
||||||
|
<translation type="unfinished">Просмотр &справки</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>No IP Detected</source>
|
<source>No IP Detected</source>
|
||||||
<translation>IP-адрес не обнаружен</translation>
|
<translation>IP-адрес не обнаружен</translation>
|
||||||
|
|
|
||||||
|
|
@ -270,6 +270,17 @@ Do you want to connect to the server?
|
||||||
<translation>无效的哈希格式</translation>
|
<translation>无效的哈希格式</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>HelpDialog</name>
|
||||||
|
<message>
|
||||||
|
<source>%1 Help</source>
|
||||||
|
<translation type="unfinished">%1 帮助</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Close</source>
|
||||||
|
<translation type="unfinished">关闭</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>HotkeyDialog</name>
|
<name>HotkeyDialog</name>
|
||||||
<message>
|
<message>
|
||||||
|
|
@ -421,6 +432,10 @@ Do you want to connect to the server?
|
||||||
<source><p>Failed to connect to the server '%1'.</p><p>A Client with your name is already connected to the server.</p>Please ensure that you're using a unique name and that only a single instance of the client process is running.</p></source>
|
<source><p>Failed to connect to the server '%1'.</p><p>A Client with your name is already connected to the server.</p>Please ensure that you're using a unique name and that only a single instance of the client process is running.</p></source>
|
||||||
<translation><p>连接到服务器“%1”失败。</p><p>一个同名的客户端已连接到服务器。</p>请确保您使用的名称唯一,且只有一个客户端进程实例在运行。</p></translation>
|
<translation><p>连接到服务器“%1”失败。</p><p>一个同名的客户端已连接到服务器。</p>请确保您使用的名称唯一,且只有一个客户端进程实例在运行。</p></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>View &Help</source>
|
||||||
|
<translation type="unfinished">查看帮助(&H)</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>No IP Detected</source>
|
<source>No IP Detected</source>
|
||||||
<translation>未检测到 IP</translation>
|
<translation>未检测到 IP</translation>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue