Allow showing Syncthing UI in Chromium-based browser in "app mode"

See https://github.com/Martchus/syncthingtray/issues/178
This commit is contained in:
Martchus 2023-03-27 20:13:49 +02:00
parent a95fd02436
commit 58b8a4e540
28 changed files with 1376 additions and 996 deletions

View File

@ -13,7 +13,7 @@ set(META_VERSION_MAJOR 1)
set(META_VERSION_MINOR 4)
set(META_VERSION_PATCH 0)
set(META_RELEASE_DATE "2023-03-07")
set(META_SOVERSION 5)
set(META_SOVERSION 6)
set(META_ADD_DEFAULT_CPP_UNIT_TEST_APPLICATION ON)
project(${META_PROJECT_NAME})

View File

@ -506,6 +506,8 @@ It is possible to turn on logging of the underlying library by setting environme
* `SYNCTHING_PORT`: override the port of the Syncthing test instance spawned when running tests
* `SYNCTHINGTRAY_SYSTEMD_USER_UNIT`: override the name of the systemd user-unit checked by the wizard's
setup detection
* `SYNCTHINGWIDGETS_CHROMIUM_BASED_BROWSER`: override the path of the Chromium-based browser to open
Syncthing in app mode
* `LIB_SYNCTHING_CONNECTOR_USE_DEPRECATED_ROUTES`: change whether to use deprecated routes (enabled by
default for compatibility with older Syncthing versions, set to `0` to change the behavior)

View File

@ -132,15 +132,17 @@ SettingsDialog::SettingsDialog(Plasmoid::SyncthingApplet &applet)
categories << category;
// most startup options don't make much sense for a Plasmoid, so merge webview with startup
auto *const webViewPage = new WebViewOptionPage;
webViewPage->widget()->setWindowTitle(QCoreApplication::translate("Plasmoid::SettingsDialog", "Web view"));
auto *const generalWebViewPage = new GeneralWebViewOptionPage;
generalWebViewPage->widget()->setWindowTitle(QCoreApplication::translate("Plasmoid::SettingsDialog", "General web view settings"));
auto *const builtinWebViewPage = new BuiltinWebViewOptionPage;
builtinWebViewPage->widget()->setWindowTitle(QCoreApplication::translate("Plasmoid::SettingsDialog", "Built-in web view"));
#ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD
auto *const systemdPage = new SystemdOptionPage;
#endif
category = new OptionCategory;
category->setDisplayName(QCoreApplication::translate("Plasmoid::SettingsDialog", "Extras"));
category->assignPages({ webViewPage
category->assignPages({ generalWebViewPage, builtinWebViewPage
#ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD
,
systemdPage

View File

@ -84,9 +84,7 @@ SyncthingApplet::SyncthingApplet(QObject *parent, const QVariantList &data)
, m_settingsDlg(nullptr)
, m_wizard(nullptr)
, m_imageProvider(nullptr)
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
, m_webViewDlg(nullptr)
#endif
, m_currentConnectionConfig(-1)
, m_hasInternalErrors(false)
, m_initialized(false)
@ -417,22 +415,19 @@ void SyncthingApplet::concludeWizard(const QString &errorMessage)
void SyncthingApplet::showWebUI()
{
auto *const dlg = QtGui::showWebUI(m_connection.syncthingUrl(), currentConnectionConfig(), m_webViewDlg);
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
if (Settings::values().webView.disabled) {
#endif
QDesktopServices::openUrl(m_connection.syncthingUrl());
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
} else {
if (!m_webViewDlg) {
m_webViewDlg = new WebViewDialog;
if (const auto *connectionConfig = currentConnectionConfig()) {
m_webViewDlg->applySettings(*connectionConfig, true);
}
connect(m_webViewDlg, &WebViewDialog::destroyed, this, &SyncthingApplet::handleWebViewDeleted);
}
m_webViewDlg->show();
m_webViewDlg->activateWindow();
if (!dlg) {
return;
}
if (!m_webViewDlg) {
m_webViewDlg = dlg;
connect(m_webViewDlg, &WebViewDialog::destroyed, this, &SyncthingApplet::handleWebViewDeleted);
}
m_webViewDlg->show();
m_webViewDlg->activateWindow();
#else
Q_UNUSED(dlg)
#endif
}
@ -588,12 +583,10 @@ void SyncthingApplet::handleAboutDialogDeleted()
m_aboutDlg = nullptr;
}
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
void SyncthingApplet::handleWebViewDeleted()
{
m_webViewDlg = nullptr;
}
#endif
void SyncthingApplet::handleNewNotification(DateTime when, const QString &msg)
{

View File

@ -35,7 +35,11 @@ class IconManager;
} // namespace Data
namespace QtGui {
#ifdef SYNCTHINGWIDGETS_NO_WEBVIEW
using WebViewDialog = void;
#else
class WebViewDialog;
#endif
class Wizard;
} // namespace QtGui
@ -181,9 +185,7 @@ private Q_SLOTS:
void handleDirStatisticsChanged();
void handleErrorsCleared();
void handleAboutDialogDeleted();
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
void handleWebViewDeleted();
#endif
void handleNewNotification(CppUtilities::DateTime when, const QString &msg);
void handleSystemdServiceError(const QString &context, const QString &name, const QString &message);
#ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD
@ -222,9 +224,7 @@ private:
QtGui::DBusStatusNotifier m_dbusNotifier;
std::vector<Data::SyncthingLogEntry> m_notifications;
QtForkAwesome::QuickImageProvider *m_imageProvider;
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
QtGui::WebViewDialog *m_webViewDlg;
#endif
int m_currentConnectionConfig;
bool m_hasInternalErrors;
bool m_initialized;

View File

@ -274,11 +274,20 @@
</message>
<message>
<location filename="../lib/settingsdialog.cpp" line="136"/>
<source>Web view</source>
<translation>Weboberfläche</translation>
<source>General web view settings</source>
<translation>Allgemeine Webanzeigeneinstellungen</translation>
</message>
<message>
<location filename="../lib/settingsdialog.cpp" line="142"/>
<location filename="../lib/settingsdialog.cpp" line="138"/>
<source>Built-in web view</source>
<translation>Eingebaute Webanzeige</translation>
</message>
<message>
<source>Web view</source>
<translation type="vanished">Weboberfläche</translation>
</message>
<message>
<location filename="../lib/settingsdialog.cpp" line="144"/>
<source>Extras</source>
<translation></translation>
</message>
@ -299,22 +308,22 @@
<context>
<name>Plasmoid::SyncthingApplet</name>
<message>
<location filename="../lib/syncthingapplet.cpp" line="460"/>
<location filename="../lib/syncthingapplet.cpp" line="455"/>
<source>About</source>
<translation>Über Syncthing Plasmoid</translation>
</message>
<message>
<location filename="../lib/syncthingapplet.cpp" line="472"/>
<location filename="../lib/syncthingapplet.cpp" line="467"/>
<source>New notifications</source>
<translation>Neue Benachrichtigungen</translation>
</message>
<message>
<location filename="../lib/syncthingapplet.cpp" line="543"/>
<location filename="../lib/syncthingapplet.cpp" line="538"/>
<source>Unable to establish connection to Syncthing.</source>
<translation>Verbindung zu Syncthing kann nicht hergestellt werden.</translation>
</message>
<message>
<location filename="../lib/syncthingapplet.cpp" line="613"/>
<location filename="../lib/syncthingapplet.cpp" line="606"/>
<source>D-Bus error - unable to </source>
<translation>D-Bus-Fehler bei Aktion </translation>
</message>

View File

@ -212,11 +212,16 @@
</message>
<message>
<location filename="../lib/settingsdialog.cpp" line="136"/>
<source>Web view</source>
<source>General web view settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../lib/settingsdialog.cpp" line="142"/>
<location filename="../lib/settingsdialog.cpp" line="138"/>
<source>Built-in web view</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../lib/settingsdialog.cpp" line="144"/>
<source>Extras</source>
<translation type="unfinished"></translation>
</message>
@ -237,22 +242,22 @@
<context>
<name>Plasmoid::SyncthingApplet</name>
<message>
<location filename="../lib/syncthingapplet.cpp" line="460"/>
<location filename="../lib/syncthingapplet.cpp" line="455"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../lib/syncthingapplet.cpp" line="472"/>
<location filename="../lib/syncthingapplet.cpp" line="467"/>
<source>New notifications</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../lib/syncthingapplet.cpp" line="543"/>
<location filename="../lib/syncthingapplet.cpp" line="538"/>
<source>Unable to establish connection to Syncthing.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../lib/syncthingapplet.cpp" line="613"/>
<location filename="../lib/syncthingapplet.cpp" line="606"/>
<source>D-Bus error - unable to </source>
<translation type="unfinished"></translation>
</message>

View File

@ -51,7 +51,8 @@ set(WIDGETS_UI_FILES
settings/autostartoptionpage.ui
settings/launcheroptionpage.ui
settings/systemdoptionpage.ui
settings/webviewoptionpage.ui
settings/generalwebviewoptionpage.ui
settings/builtinwebviewoptionpage.ui
settings/mainconfigwizardpage.ui
settings/autostartwizardpage.ui
settings/applywizardpage.ui)

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>QtGui::WebViewOptionPage</class>
<widget class="QWidget" name="QtGui::WebViewOptionPage">
<class>QtGui::BuiltinWebViewOptionPage</class>
<widget class="QWidget" name="QtGui::BuiltinWebViewOptionPage">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
@ -9,7 +9,7 @@
</sizepolicy>
</property>
<property name="windowTitle">
<string>General</string>
<string>Built-in web view</string>
</property>
<property name="windowIcon">
<iconset theme="internet-web-browser" resource="../resources/syncthingwidgetsicons.qrc">
@ -17,27 +17,13 @@
</property>
<layout class="QFormLayout" name="formLayout">
<item row="1" column="0">
<widget class="QLabel" name="usageLabel">
<property name="text">
<string>Usage</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="disableCheckBox">
<property name="text">
<string>Disable web view (open regular web browser instead)</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="zoomLabel">
<property name="text">
<string>Zoom factor</string>
</property>
</widget>
</item>
<item row="2" column="1">
<item row="1" column="1">
<widget class="QDoubleSpinBox" name="zoomDoubleSpinBox">
<property name="buttonSymbols">
<enum>QAbstractSpinBox::PlusMinus</enum>
@ -53,14 +39,14 @@
</property>
</widget>
</item>
<item row="3" column="0">
<item row="2" column="0">
<widget class="QLabel" name="keepRunningLabel">
<property name="text">
<string>Hiding</string>
</property>
</widget>
</item>
<item row="3" column="1">
<item row="2" column="1">
<widget class="QCheckBox" name="keepRunningCheckBox">
<property name="text">
<string>Keep web view running when currently not shown</string>

View File

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>QtGui::GeneralWebViewOptionPage</class>
<widget class="QWidget" name="QtGui::GeneralWebViewOptionPage">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>General</string>
</property>
<property name="windowIcon">
<iconset theme="preferences-other"/>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Open Syncthing's UI via</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QRadioButton" name="builtinRadioButton">
<property name="text">
<string>Syncthing Tray's built-in web view</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="browserRadioButton">
<property name="text">
<string>Tab in the default web browser</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="appModeRadioButton">
<property name="text">
<string>Chromium-based browser in &quot;app mode&quot;</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -410,7 +410,11 @@ bool restore()
#if defined(SYNCTHINGWIDGETS_USE_WEBENGINE) || defined(SYNCTHINGWIDGETS_USE_WEBKIT)
settings.beginGroup(QStringLiteral("webview"));
auto &webView = v.webView;
webView.disabled = settings.value(QStringLiteral("disabled"), webView.disabled).toBool();
if (auto mode = settings.value(QStringLiteral("mode")); mode.isValid()) {
webView.mode = static_cast<WebView::Mode>(mode.toInt());
} else if (auto disabled = settings.value(QStringLiteral("disabled")); disabled.isValid()) {
webView.mode = disabled.toBool() ? WebView::Mode::Browser : WebView::Mode::Builtin;
}
webView.zoomFactor = settings.value(QStringLiteral("zoomFactor"), webView.zoomFactor).toDouble();
webView.geometry = settings.value(QStringLiteral("geometry")).toByteArray();
webView.keepRunning = settings.value(QStringLiteral("keepRunning"), webView.keepRunning).toBool();
@ -529,7 +533,8 @@ bool save()
#if defined(SYNCTHINGWIDGETS_USE_WEBENGINE) || defined(SYNCTHINGWIDGETS_USE_WEBKIT)
settings.beginGroup(QStringLiteral("webview"));
const auto &webView = v.webView;
settings.setValue(QStringLiteral("disabled"), webView.disabled);
settings.setValue(QStringLiteral("mode"), static_cast<int>(webView.mode));
settings.setValue(QStringLiteral("disabled"), webView.mode == WebView::Mode::Browser);
settings.setValue(QStringLiteral("zoomFactor"), webView.zoomFactor);
settings.setValue(QStringLiteral("geometry"), webView.geometry);
settings.setValue(QStringLiteral("keepRunning"), webView.keepRunning);

View File

@ -141,14 +141,16 @@ struct SYNCTHINGWIDGETS_EXPORT Systemd {
};
#endif
#if defined(SYNCTHINGWIDGETS_USE_WEBENGINE) || defined(SYNCTHINGWIDGETS_USE_WEBKIT)
struct SYNCTHINGWIDGETS_EXPORT WebView {
bool disabled = false;
enum class Mode { Builtin, Browser, Command };
Mode mode;
QString customCommand;
#if defined(SYNCTHINGWIDGETS_USE_WEBENGINE) || defined(SYNCTHINGWIDGETS_USE_WEBKIT)
double zoomFactor = 1.0;
QByteArray geometry;
bool keepRunning = true;
};
#endif
};
struct SYNCTHINGWIDGETS_EXPORT Settings {
bool firstLaunch = false;
@ -173,9 +175,7 @@ struct SYNCTHINGWIDGETS_EXPORT Settings {
#ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD
Systemd systemd;
#endif
#if defined(SYNCTHINGWIDGETS_USE_WEBENGINE) || defined(SYNCTHINGWIDGETS_USE_WEBKIT)
WebView webView;
#endif
QtUtilities::QtSettings qt;
void apply(Data::SyncthingNotifier &notifier) const;

View File

@ -26,7 +26,8 @@
#ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD
#include "ui_systemdoptionpage.h"
#endif
#include "ui_webviewoptionpage.h"
#include "ui_builtinwebviewoptionpage.h"
#include "ui_generalwebviewoptionpage.h"
// use meta-data of syncthingtray application here
#include "resources/../../tray/resources/config.h"
@ -1368,45 +1369,91 @@ void SystemdOptionPage::updateColors()
}
#endif
// WebViewOptionPage
WebViewOptionPage::WebViewOptionPage(QWidget *parentWidget)
: WebViewOptionPageBase(parentWidget)
// GeneralWebViewOptionPage
GeneralWebViewOptionPage::GeneralWebViewOptionPage(QWidget *parentWidget)
: GeneralWebViewOptionPageBase(parentWidget)
{
}
WebViewOptionPage::~WebViewOptionPage()
GeneralWebViewOptionPage::~GeneralWebViewOptionPage()
{
}
QWidget *GeneralWebViewOptionPage::setupWidget()
{
auto *const widget = GeneralWebViewOptionPageBase::setupWidget();
#ifdef SYNCTHINGWIDGETS_NO_WEBVIEW
ui()->builtinRadioButton->setEnabled(false);
#endif
return widget;
}
bool GeneralWebViewOptionPage::apply()
{
auto &webView = values().webView;
if (ui()->builtinRadioButton->isChecked()) {
webView.mode = ::Settings::WebView::Mode::Builtin;
} else if (ui()->browserRadioButton->isChecked()) {
webView.mode = ::Settings::WebView::Mode::Browser;
} else if (ui()->appModeRadioButton->isChecked()) {
webView.mode = ::Settings::WebView::Mode::Command;
}
return true;
}
void GeneralWebViewOptionPage::reset()
{
const auto &webView = values().webView;
switch (webView.mode) {
case ::Settings::WebView::Mode::Builtin:
ui()->builtinRadioButton->setChecked(true);
break;
case ::Settings::WebView::Mode::Browser:
ui()->browserRadioButton->setChecked(true);
break;
case ::Settings::WebView::Mode::Command:
ui()->appModeRadioButton->setChecked(true);
break;
}
}
// BuiltinWebViewOptionPage
BuiltinWebViewOptionPage::BuiltinWebViewOptionPage(QWidget *parentWidget)
: BuiltinWebViewOptionPageBase(parentWidget)
{
}
BuiltinWebViewOptionPage::~BuiltinWebViewOptionPage()
{
}
#ifdef SYNCTHINGWIDGETS_NO_WEBVIEW
QWidget *WebViewOptionPage::setupWidget()
QWidget *BuiltinWebViewOptionPage::setupWidget()
{
auto *label = new QLabel;
label->setWindowTitle(QCoreApplication::translate("QtGui::WebViewOptionPage", "General"));
label->setWindowTitle(QCoreApplication::translate("QtGui::BuiltinWebViewOptionPage", "Built-in web view"));
label->setAlignment(Qt::AlignCenter);
label->setText(QCoreApplication::translate("QtGui::WebViewOptionPage",
label->setText(QCoreApplication::translate("QtGui::BuiltinWebViewOptionPage",
"Syncthing Tray has not been built with vieb view support utilizing either Qt WebKit "
"or Qt WebEngine.\nThe Web UI will be opened in the default web browser instead."));
return label;
}
#endif
bool WebViewOptionPage::apply()
bool BuiltinWebViewOptionPage::apply()
{
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
auto &webView = values().webView;
webView.disabled = ui()->disableCheckBox->isChecked();
webView.zoomFactor = ui()->zoomDoubleSpinBox->value();
webView.keepRunning = ui()->keepRunningCheckBox->isChecked();
#endif
return true;
}
void WebViewOptionPage::reset()
void BuiltinWebViewOptionPage::reset()
{
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
const auto &webView = values().webView;
ui()->disableCheckBox->setChecked(webView.disabled);
ui()->zoomDoubleSpinBox->setValue(webView.zoomFactor);
ui()->keepRunningCheckBox->setChecked(webView.keepRunning);
#endif
@ -1443,7 +1490,7 @@ SettingsDialog::SettingsDialog(Data::SyncthingConnection *connection, QWidget *p
category = new OptionCategory(this);
category->setDisplayName(tr("Web view"));
category->assignPages({ new WebViewOptionPage });
category->assignPages({ new GeneralWebViewOptionPage, new BuiltinWebViewOptionPage });
category->setIcon(
QIcon::fromTheme(QStringLiteral("internet-web-browser"), QIcon(QStringLiteral(":/icons/hicolor/scalable/apps/internet-web-browser.svg"))));
categories << category;
@ -1515,6 +1562,7 @@ INSTANTIATE_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, LauncherOptionPage)
#ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD
INSTANTIATE_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, SystemdOptionPage)
#endif
INSTANTIATE_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, GeneralWebViewOptionPage)
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
INSTANTIATE_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, WebViewOptionPage)
INSTANTIATE_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, BuiltinWebViewOptionPage)
#endif

View File

@ -162,10 +162,11 @@ QMetaObject::Connection m_enabledChangedConn;
END_DECLARE_OPTION_PAGE
#endif
DECLARE_UI_FILE_BASED_OPTION_PAGE_CUSTOM_SETUP(GeneralWebViewOptionPage)
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
DECLARE_UI_FILE_BASED_OPTION_PAGE(WebViewOptionPage)
DECLARE_UI_FILE_BASED_OPTION_PAGE(BuiltinWebViewOptionPage)
#else
DECLARE_OPTION_PAGE(WebViewOptionPage)
DECLARE_OPTION_PAGE(BuiltinWebViewOptionPage)
#endif
class SYNCTHINGWIDGETS_EXPORT SettingsDialog : public QtUtilities::SettingsDialog {
@ -198,8 +199,9 @@ DECLARE_EXTERN_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, LauncherOptionPage)
#ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD
DECLARE_EXTERN_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, SystemdOptionPage)
#endif
DECLARE_EXTERN_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, GeneralWebViewOptionPage)
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
DECLARE_EXTERN_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, WebViewOptionPage)
DECLARE_EXTERN_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, BuiltinWebViewOptionPage)
#endif
#endif // SETTINGS_DIALOG_H

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,20 @@
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
#include "./webviewdialog.h"
#include "../settings/settings.h"
#include "resources/config.h"
#include <syncthingconnector/syncthingprocess.h>
#include <QCoreApplication>
#include <QDesktopServices>
#include <QMessageBox>
#include <QUrl>
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
#include "./webpage.h"
#include "./webviewinterceptor.h"
#include "../settings/settings.h"
#include <qtutilities/misc/compat.h>
#include <qtutilities/misc/dialogutils.h>
#include <QCloseEvent>
@ -149,3 +159,61 @@ bool WebViewDialog::eventFilter(QObject *watched, QEvent *event)
} // namespace QtGui
#endif // SYNCTHINGWIDGETS_NO_WEBVIEW
namespace QtGui {
/*!
* \brief Opens the specified \a url as "app" in a Chromium-based web browser.
* \todo Check for other Chromium-based browsers and use the Windows registry to find apps under Windows.
*/
static void openBrowserInAppMode(const QString &url)
{
static const auto app = qEnvironmentVariable(PROJECT_VARNAME_UPPER "_CHROMIUM_BASED_BROWSER", QStringLiteral("chromium"));
auto *const process = new Data::SyncthingProcess();
QObject::connect(process, &Data::SyncthingProcess::finished, process, &QObject::deleteLater);
QObject::connect(process, &Data::SyncthingProcess::errorOccurred, process, [process] {
auto messageBox = QMessageBox();
messageBox.setWindowTitle(QStringLiteral("Syncthing"));
messageBox.setIcon(QMessageBox::Critical);
messageBox.setText(QCoreApplication::translate("QtGui", "Unable to open Syncthing UI via \"%1\": %2").arg(app, process->errorString()));
messageBox.exec();
});
process->setProcessChannelMode(QProcess::ForwardedChannels);
process->startSyncthing(app, QStringList{ QStringLiteral("--app=") + url });
}
/*!
* \brief Opens the Syncthing UI using the configured web view mode.
* \param url The URL of the Syncthing UI.
* \param settings The connection settings to be used (instead of the \a url) in case a WebViewDialog is used. Allowed to be nullptr.
* \param dlg An existing WebViewDialog that may be reused in case a WebViewDialog is used.
* \param parent The parent to use when creating a new WebViewDialog. Allowed to be nullptr (as usual with parents).
* \returns Returns the used WebViewDialog or nullptr if another method was used.
*/
WebViewDialog *showWebUI(const QString &url, const Data::SyncthingConnectionSettings *settings, WebViewDialog *dlg, QWidget *parent)
{
switch (Settings::values().webView.mode) {
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
case Settings::WebView::Mode::Builtin:
if (!dlg) {
dlg = new WebViewDialog(parent);
}
if (settings) {
dlg->applySettings(*settings, true);
}
return dlg;
#else
Q_UNUSED(settings)
Q_UNUSED(dlg)
Q_UNUSED(parent)
#endif
case Settings::WebView::Mode::Command:
openBrowserInAppMode(url);
break;
default:
QDesktopServices::openUrl(url);
}
return nullptr;
}
} // namespace QtGui

View File

@ -1,20 +1,21 @@
#ifndef WEBVIEW_DIALOG_H
#define WEBVIEW_DIALOG_H
#include "../global.h"
#include <syncthingconnector/syncthingconnectionsettings.h>
QT_FORWARD_DECLARE_CLASS(QString)
QT_FORWARD_DECLARE_CLASS(QWidget)
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
#include "./webviewdefs.h"
#include "../settings/settings.h"
#include <QMainWindow>
QT_FORWARD_DECLARE_CLASS(WEB_VIEW_PROVIDER)
QT_FORWARD_DECLARE_CLASS(QWebEngineProfile)
namespace Settings {
struct ConnectionSettings;
}
namespace QtGui {
class SYNCTHINGWIDGETS_EXPORT WebViewDialog : public QMainWindow {
@ -53,5 +54,16 @@ inline const Data::SyncthingConnectionSettings &WebViewDialog::connectionSetting
} // namespace QtGui
#else // SYNCTHINGWIDGETS_NO_WEBVIEW
namespace QtGui {
using WebViewDialog = void;
}
#endif // SYNCTHINGWIDGETS_NO_WEBVIEW
namespace QtGui {
SYNCTHINGWIDGETS_EXPORT WebViewDialog *showWebUI(
const QString &url, const Data::SyncthingConnectionSettings *settings, WebViewDialog *dlg = nullptr, QWidget *parent = nullptr);
}
#endif // WEBVIEW_DIALOG_H

View File

@ -131,7 +131,7 @@ static void trigger(bool tray, bool webUi, bool wizard)
}
auto *const trayWidget = TrayWidget::instances().front();
if (webUi) {
trayWidget->showWebUi();
trayWidget->showWebUI();
}
if (tray) {
trayWidget->showUsingPositioningSettings();

View File

@ -52,7 +52,7 @@ TrayIcon::TrayIcon(const QString &connectionConfig, QObject *parent)
connect(m_contextMenu.addAction(
QIcon::fromTheme(QStringLiteral("syncthing"), QIcon(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-default.svg"))),
tr("Open Syncthing")),
&QAction::triggered, &widget, &TrayWidget::showWebUi);
&QAction::triggered, &widget, &TrayWidget::showWebUI);
connect(m_contextMenu.addAction(
QIcon::fromTheme(QStringLiteral("preferences-other"), QIcon(QStringLiteral(":/icons/hicolor/scalable/apps/preferences-other.svg"))),
tr("Settings")),
@ -102,7 +102,7 @@ TrayIcon::TrayIcon(const QString &connectionConfig, QObject *parent)
connect(&m_dbusNotifier, &DBusStatusNotifier::dismissNotificationsRequested, &widget, &TrayWidget::dismissNotifications);
connect(&m_dbusNotifier, &DBusStatusNotifier::showNotificationsRequested, &widget, &TrayWidget::showNotifications);
connect(&m_dbusNotifier, &DBusStatusNotifier::errorDetailsRequested, this, &TrayIcon::showInternalErrorsDialog);
connect(&m_dbusNotifier, &DBusStatusNotifier::webUiRequested, &widget, &TrayWidget::showWebUi);
connect(&m_dbusNotifier, &DBusStatusNotifier::webUiRequested, &widget, &TrayWidget::showWebUI);
connect(&notifier, &SyncthingNotifier::connected, &m_dbusNotifier, &DBusStatusNotifier::hideDisconnect);
#endif
@ -136,7 +136,7 @@ void TrayIcon::handleActivated(QSystemTrayIcon::ActivationReason reason)
// can't catch that event on Plasma 5 anyways
break;
case QSystemTrayIcon::MiddleClick:
trayMenu().widget().showWebUi();
trayMenu().widget().showWebUI();
break;
case QSystemTrayIcon::Trigger: {
trayMenu().showUsingPositioningSettings();
@ -158,7 +158,7 @@ void TrayIcon::handleMessageClicked()
showInternalErrorsDialog();
break;
case TrayIconMessageClickedAction::ShowWebUi:
trayMenu().widget().showWebUi();
trayMenu().widget().showWebUI();
break;
}
}

View File

@ -72,9 +72,7 @@ TrayWidget::TrayWidget(TrayMenu *parent)
: QWidget(parent)
, m_menu(parent)
, m_ui(new Ui::TrayWidget)
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
, m_webViewDlg(nullptr)
#endif
, m_internalErrorsButton(nullptr)
, m_notifier(m_connection)
, m_dirModel(m_connection)
@ -194,7 +192,7 @@ TrayWidget::TrayWidget(TrayMenu *parent)
// connect signals and slots
connect(m_ui->statusPushButton, &QPushButton::clicked, this, &TrayWidget::changeStatus);
connect(m_ui->aboutPushButton, &QPushButton::clicked, this, &TrayWidget::showAboutDialog);
connect(m_ui->webUiPushButton, &QPushButton::clicked, this, &TrayWidget::showWebUi);
connect(m_ui->webUiPushButton, &QPushButton::clicked, this, &TrayWidget::showWebUI);
connect(m_ui->settingsPushButton, &QPushButton::clicked, this, &TrayWidget::showSettingsDialog);
connect(&m_connection, &SyncthingConnection::statusChanged, this, &TrayWidget::handleStatusChanged);
connect(&m_connection, &SyncthingConnection::trafficChanged, this, &TrayWidget::updateTraffic);
@ -278,7 +276,7 @@ void TrayWidget::showWizard()
connect(s_wizard, &Wizard::destroyed, this, [] { s_wizard = nullptr; });
connect(s_wizard, &Wizard::settingsDialogRequested, this, &TrayWidget::showSettingsDialog);
connect(s_wizard, &Wizard::openLauncherSettingsRequested, this, &TrayWidget::showLauncherSettings);
connect(s_wizard, &Wizard::openSyncthingRequested, this, &TrayWidget::showWebUi);
connect(s_wizard, &Wizard::openSyncthingRequested, this, &TrayWidget::showWebUI);
connect(s_wizard, &Wizard::settingsChanged, this, &TrayWidget::applySettingsChangesFromWizard);
}
showDialog(s_wizard, centerWidgetAvoidingOverflow(s_wizard));
@ -343,23 +341,20 @@ void TrayWidget::showAboutDialog()
showDialog(s_aboutDlg);
}
void TrayWidget::showWebUi()
void TrayWidget::showWebUI()
{
auto *const dlg = QtGui::showWebUI(m_connection.syncthingUrl(), m_selectedConnection, m_webViewDlg, this);
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
if (Settings::values().webView.disabled) {
#endif
QDesktopServices::openUrl(m_connection.syncthingUrl());
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
} else {
if (!m_webViewDlg) {
m_webViewDlg = new WebViewDialog(this);
if (m_selectedConnection) {
m_webViewDlg->applySettings(*m_selectedConnection, true);
}
connect(m_webViewDlg, &WebViewDialog::destroyed, this, &TrayWidget::handleWebViewDeleted);
}
showDialog(m_webViewDlg);
if (!dlg) {
return;
}
if (!m_webViewDlg) {
m_webViewDlg = dlg;
connect(m_webViewDlg, &WebViewDialog::destroyed, this, &TrayWidget::handleWebViewDeleted);
}
showDialog(m_webViewDlg);
#else
Q_UNUSED(dlg)
#endif
}
@ -890,12 +885,10 @@ Settings::Systemd::ServiceStatus TrayWidget::applySystemdSettings(bool reconnect
}
#endif
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
void TrayWidget::handleWebViewDeleted()
{
m_webViewDlg = nullptr;
}
#endif
void TrayWidget::handleNewNotification(DateTime when, const QString &msg)
{

View File

@ -34,7 +34,11 @@ class AboutDialog;
namespace QtGui {
#ifdef SYNCTHINGWIDGETS_NO_WEBVIEW
using WebViewDialog = void;
#else
class WebViewDialog;
#endif
class SettingsDialog;
class Wizard;
class TrayMenu;
@ -64,7 +68,7 @@ public Q_SLOTS:
void showLauncherSettings();
void showWizard();
void showAboutDialog();
void showWebUi();
void showWebUI();
void showOwnDeviceId();
void showLog();
void showNotifications();
@ -104,9 +108,7 @@ private Q_SLOTS:
Settings::Systemd::ServiceStatus handleSystemdStatusChanged();
Settings::Systemd::ServiceStatus applySystemdSettings(bool reconnectRequired = false);
#endif
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
void handleWebViewDeleted();
#endif
void handleNewNotification(CppUtilities::DateTime when, const QString &msg);
void handleConnectionSelected(QAction *connectionAction);
void concludeWizard(const QString &errorMessage = QString());
@ -119,9 +121,7 @@ private:
static SettingsDialog *s_settingsDlg;
static Wizard *s_wizard;
static QtUtilities::AboutDialog *s_aboutDlg;
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
WebViewDialog *m_webViewDlg;
#endif
QFrame *m_cornerFrame;
QPushButton *m_internalErrorsButton;
Data::SyncthingConnection m_connection;

View File

@ -162,20 +162,20 @@
</message>
<message>
<location filename="../gui/traywidget.ui" line="99"/>
<location filename="../gui/traywidget.cpp" line="339"/>
<location filename="../gui/traywidget.cpp" line="337"/>
<source>About</source>
<translation>O Syncthing Tray</translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="58"/>
<location filename="../gui/traywidget.cpp" line="464"/>
<location filename="../gui/traywidget.cpp" line="459"/>
<source>Connect</source>
<translation>Připojit</translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="72"/>
<location filename="../gui/traywidget.cpp" line="840"/>
<location filename="../gui/traywidget.cpp" line="882"/>
<location filename="../gui/traywidget.cpp" line="836"/>
<location filename="../gui/traywidget.cpp" line="878"/>
<source>Start</source>
<translation>Spustit</translation>
</message>
@ -246,8 +246,8 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
</message>
<message>
<location filename="../gui/traywidget.ui" line="357"/>
<location filename="../gui/traywidget.cpp" line="156"/>
<location filename="../gui/traywidget.cpp" line="382"/>
<location filename="../gui/traywidget.cpp" line="154"/>
<location filename="../gui/traywidget.cpp" line="377"/>
<source>New notifications</source>
<translation>Nová oznámení</translation>
</message>
@ -282,118 +282,118 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
<translation>Zahodit</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="128"/>
<location filename="../gui/traywidget.cpp" line="126"/>
<source>View own device ID</source>
<translation>Zobrazit identifikátor místního zařízení</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="133"/>
<location filename="../gui/traywidget.cpp" line="131"/>
<source>Restart Syncthing</source>
<translation>Restartovat Syncthing</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="138"/>
<location filename="../gui/traywidget.cpp" line="136"/>
<source>Show Syncthing log</source>
<translation>Zobrazit záznam událostí v Syncthing</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="143"/>
<location filename="../gui/traywidget.cpp" line="141"/>
<source>Rescan all directories</source>
<translation>Znovu proskenovat všechny složky</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="150"/>
<location filename="../gui/traywidget.cpp" line="148"/>
<source>Connection</source>
<translation>Spojení</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="172"/>
<location filename="../gui/traywidget.cpp" line="170"/>
<source>Show internal errors</source>
<translation>Zobrazit vnitřní chyby</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="187"/>
<location filename="../gui/traywidget.cpp" line="185"/>
<source>Quit Syncthing Tray</source>
<translation>Ukončit Syncthing Tray</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="439"/>
<location filename="../gui/traywidget.cpp" line="434"/>
<source>Do you really want to restart Syncthing?</source>
<translation>Opravdu chcete Syncthing restartovat?</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="465"/>
<location filename="../gui/traywidget.cpp" line="460"/>
<source>Not connected to Syncthing, click to connect</source>
<translation>Nepřipojeno k Syncthing, klikněte pro připojení se</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="470"/>
<location filename="../gui/traywidget.cpp" line="465"/>
<source>Unable to establish connection to Syncthing.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="480"/>
<location filename="../gui/traywidget.cpp" line="475"/>
<source>Pause</source>
<translation>Pozastavit</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="481"/>
<location filename="../gui/traywidget.cpp" line="476"/>
<source>Syncthing is running, click to pause all devices</source>
<translation>Syncthing je spuštěné, kliknutím pozastavíte veškerá zařízení</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="486"/>
<location filename="../gui/traywidget.cpp" line="481"/>
<source>Continue</source>
<translation>Pokračovat</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="487"/>
<location filename="../gui/traywidget.cpp" line="482"/>
<source>At least one device is paused, click to resume</source>
<translation>Přinejmenším jedno zařízení je pozastaveno, kliknutím pokračujte</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="610"/>
<location filename="../gui/traywidget.cpp" line="605"/>
<source>The specified connection configuration &lt;em&gt;%1&lt;/em&gt; is not defined and hence ignored.</source>
<translation>Zadané nastavení spojení &lt;em&gt;%1&lt;/em&gt; není definováno a proto je ignorováno.</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="645"/>
<location filename="../gui/traywidget.cpp" line="641"/>
<source>The directory &lt;i&gt;%1&lt;/i&gt; does not exist on the local machine.</source>
<translation>Adresář &lt;i&gt;%1&lt;/i&gt; neexistuje místně.</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="656"/>
<location filename="../gui/traywidget.cpp" line="652"/>
<source>The containing directory &lt;i&gt;%1&lt;/i&gt; does not exist on the local machine.</source>
<translation>Obsažený adresář &lt;i&gt;%1&lt;/i&gt; neexistuje místně.</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="699"/>
<location filename="../gui/traywidget.cpp" line="695"/>
<source>Copy path</source>
<translation type="unfinished">Zkopírovat popis umístění</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="703"/>
<location filename="../gui/traywidget.cpp" line="699"/>
<source>Copy device ID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="706"/>
<location filename="../gui/traywidget.cpp" line="702"/>
<source>Copy directory ID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="836"/>
<location filename="../gui/traywidget.cpp" line="876"/>
<location filename="../gui/traywidget.cpp" line="832"/>
<location filename="../gui/traywidget.cpp" line="872"/>
<source>Stop</source>
<translation>Zastavit</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="837"/>
<location filename="../gui/traywidget.cpp" line="833"/>
<source>Stop Syncthing instance launched via tray icon</source>
<translation>Zastavit instanci Syncthing spuštěnou prostřednictvím ikony v oznamovací oblasti</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="841"/>
<location filename="../gui/traywidget.cpp" line="837"/>
<source>Start Syncthing with the built-in launcher configured in the settings</source>
<translation>Spustit Syncthing s vestavěným spouštěčem nastaveným v nastaveních</translation>
</message>

View File

@ -162,20 +162,20 @@
</message>
<message>
<location filename="../gui/traywidget.ui" line="99"/>
<location filename="../gui/traywidget.cpp" line="339"/>
<location filename="../gui/traywidget.cpp" line="337"/>
<source>About</source>
<translation>Über Syncthing Tray</translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="58"/>
<location filename="../gui/traywidget.cpp" line="464"/>
<location filename="../gui/traywidget.cpp" line="459"/>
<source>Connect</source>
<translation>Verbinden</translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="72"/>
<location filename="../gui/traywidget.cpp" line="840"/>
<location filename="../gui/traywidget.cpp" line="882"/>
<location filename="../gui/traywidget.cpp" line="836"/>
<location filename="../gui/traywidget.cpp" line="878"/>
<source>Start</source>
<translation>Starten</translation>
</message>
@ -250,8 +250,8 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
</message>
<message>
<location filename="../gui/traywidget.ui" line="357"/>
<location filename="../gui/traywidget.cpp" line="156"/>
<location filename="../gui/traywidget.cpp" line="382"/>
<location filename="../gui/traywidget.cpp" line="154"/>
<location filename="../gui/traywidget.cpp" line="377"/>
<source>New notifications</source>
<translation>Neue Benachrichtigungen</translation>
</message>
@ -287,118 +287,118 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
<translation>Ignorieren</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="128"/>
<location filename="../gui/traywidget.cpp" line="126"/>
<source>View own device ID</source>
<translation>Eigene Geräte-ID anzeigen</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="133"/>
<location filename="../gui/traywidget.cpp" line="131"/>
<source>Restart Syncthing</source>
<translation>Syncthing neustarten</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="138"/>
<location filename="../gui/traywidget.cpp" line="136"/>
<source>Show Syncthing log</source>
<translation>Syncthing-Log zeigen</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="143"/>
<location filename="../gui/traywidget.cpp" line="141"/>
<source>Rescan all directories</source>
<translation>Alle Verzeichnisse neu scannen</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="150"/>
<location filename="../gui/traywidget.cpp" line="148"/>
<source>Connection</source>
<translation>Verbindung</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="172"/>
<location filename="../gui/traywidget.cpp" line="170"/>
<source>Show internal errors</source>
<translation>Interne Fehler</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="187"/>
<location filename="../gui/traywidget.cpp" line="185"/>
<source>Quit Syncthing Tray</source>
<translation>Syncthing Tray schließen</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="439"/>
<location filename="../gui/traywidget.cpp" line="434"/>
<source>Do you really want to restart Syncthing?</source>
<translation>Soll Syncthing wirklich neu gestartet werden?</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="465"/>
<location filename="../gui/traywidget.cpp" line="460"/>
<source>Not connected to Syncthing, click to connect</source>
<translation>Verbindung zu Syncthing getrennt, klicke um zu verbinden</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="470"/>
<location filename="../gui/traywidget.cpp" line="465"/>
<source>Unable to establish connection to Syncthing.</source>
<translation>Verbindung zu Syncthing kann nicht hergestellt werden.</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="480"/>
<location filename="../gui/traywidget.cpp" line="475"/>
<source>Pause</source>
<translation>Pausieren</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="481"/>
<location filename="../gui/traywidget.cpp" line="476"/>
<source>Syncthing is running, click to pause all devices</source>
<translation>Syncthing läuft, klicke um alle Geräte zu pausieren</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="486"/>
<location filename="../gui/traywidget.cpp" line="481"/>
<source>Continue</source>
<translation>Fortsetzen</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="487"/>
<location filename="../gui/traywidget.cpp" line="482"/>
<source>At least one device is paused, click to resume</source>
<translation>Mind. ein Gerät ist pausiert, klicke um fortzusetzen</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="610"/>
<location filename="../gui/traywidget.cpp" line="605"/>
<source>The specified connection configuration &lt;em&gt;%1&lt;/em&gt; is not defined and hence ignored.</source>
<translation>Die angegebene Verbindungskonfiguration &lt;em&gt;%1&lt;/em&gt; ist nicht definiert und wird daher ignoriert.</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="645"/>
<location filename="../gui/traywidget.cpp" line="641"/>
<source>The directory &lt;i&gt;%1&lt;/i&gt; does not exist on the local machine.</source>
<translation>Das Verzeichnis &lt;i&gt;%1&lt;/i&gt; existiert nicht lokal.</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="656"/>
<location filename="../gui/traywidget.cpp" line="652"/>
<source>The containing directory &lt;i&gt;%1&lt;/i&gt; does not exist on the local machine.</source>
<translation>Das beinhaltende Verzeichnis &lt;i&gt;%1&lt;/i&gt; existiert nicht lokal.</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="699"/>
<location filename="../gui/traywidget.cpp" line="695"/>
<source>Copy path</source>
<translation>Pfad kopieren</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="703"/>
<location filename="../gui/traywidget.cpp" line="699"/>
<source>Copy device ID</source>
<translation>Geräte-ID kopieren</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="706"/>
<location filename="../gui/traywidget.cpp" line="702"/>
<source>Copy directory ID</source>
<translation>Verzeichnis-ID kopieren</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="836"/>
<location filename="../gui/traywidget.cpp" line="876"/>
<location filename="../gui/traywidget.cpp" line="832"/>
<location filename="../gui/traywidget.cpp" line="872"/>
<source>Stop</source>
<translation>Stoppen</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="837"/>
<location filename="../gui/traywidget.cpp" line="833"/>
<source>Stop Syncthing instance launched via tray icon</source>
<translation>Stoppe Syncthing-Instanz, die mit dem internen Starter gestartet wurde</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="841"/>
<location filename="../gui/traywidget.cpp" line="837"/>
<source>Start Syncthing with the built-in launcher configured in the settings</source>
<translation>Starte Syncthing mit dem eingebauten Starter, der in den Einstellungen konfiguriert wird</translation>
</message>

View File

@ -162,20 +162,20 @@
</message>
<message>
<location filename="../gui/traywidget.ui" line="99"/>
<location filename="../gui/traywidget.cpp" line="339"/>
<location filename="../gui/traywidget.cpp" line="337"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="58"/>
<location filename="../gui/traywidget.cpp" line="464"/>
<location filename="../gui/traywidget.cpp" line="459"/>
<source>Connect</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="72"/>
<location filename="../gui/traywidget.cpp" line="840"/>
<location filename="../gui/traywidget.cpp" line="882"/>
<location filename="../gui/traywidget.cpp" line="836"/>
<location filename="../gui/traywidget.cpp" line="878"/>
<source>Start</source>
<translation type="unfinished"></translation>
</message>
@ -245,8 +245,8 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
</message>
<message>
<location filename="../gui/traywidget.ui" line="357"/>
<location filename="../gui/traywidget.cpp" line="156"/>
<location filename="../gui/traywidget.cpp" line="382"/>
<location filename="../gui/traywidget.cpp" line="154"/>
<location filename="../gui/traywidget.cpp" line="377"/>
<source>New notifications</source>
<translation type="unfinished"></translation>
</message>
@ -281,118 +281,118 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="128"/>
<location filename="../gui/traywidget.cpp" line="126"/>
<source>View own device ID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="133"/>
<location filename="../gui/traywidget.cpp" line="131"/>
<source>Restart Syncthing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="138"/>
<location filename="../gui/traywidget.cpp" line="136"/>
<source>Show Syncthing log</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="143"/>
<location filename="../gui/traywidget.cpp" line="141"/>
<source>Rescan all directories</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="150"/>
<location filename="../gui/traywidget.cpp" line="148"/>
<source>Connection</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="172"/>
<location filename="../gui/traywidget.cpp" line="170"/>
<source>Show internal errors</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="187"/>
<location filename="../gui/traywidget.cpp" line="185"/>
<source>Quit Syncthing Tray</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="439"/>
<location filename="../gui/traywidget.cpp" line="434"/>
<source>Do you really want to restart Syncthing?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="465"/>
<location filename="../gui/traywidget.cpp" line="460"/>
<source>Not connected to Syncthing, click to connect</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="470"/>
<location filename="../gui/traywidget.cpp" line="465"/>
<source>Unable to establish connection to Syncthing.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="480"/>
<location filename="../gui/traywidget.cpp" line="475"/>
<source>Pause</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="481"/>
<location filename="../gui/traywidget.cpp" line="476"/>
<source>Syncthing is running, click to pause all devices</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="486"/>
<location filename="../gui/traywidget.cpp" line="481"/>
<source>Continue</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="487"/>
<location filename="../gui/traywidget.cpp" line="482"/>
<source>At least one device is paused, click to resume</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="610"/>
<location filename="../gui/traywidget.cpp" line="605"/>
<source>The specified connection configuration &lt;em&gt;%1&lt;/em&gt; is not defined and hence ignored.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="645"/>
<location filename="../gui/traywidget.cpp" line="641"/>
<source>The directory &lt;i&gt;%1&lt;/i&gt; does not exist on the local machine.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="656"/>
<location filename="../gui/traywidget.cpp" line="652"/>
<source>The containing directory &lt;i&gt;%1&lt;/i&gt; does not exist on the local machine.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="699"/>
<location filename="../gui/traywidget.cpp" line="695"/>
<source>Copy path</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="703"/>
<location filename="../gui/traywidget.cpp" line="699"/>
<source>Copy device ID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="706"/>
<location filename="../gui/traywidget.cpp" line="702"/>
<source>Copy directory ID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="836"/>
<location filename="../gui/traywidget.cpp" line="876"/>
<location filename="../gui/traywidget.cpp" line="832"/>
<location filename="../gui/traywidget.cpp" line="872"/>
<source>Stop</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="837"/>
<location filename="../gui/traywidget.cpp" line="833"/>
<source>Stop Syncthing instance launched via tray icon</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="841"/>
<location filename="../gui/traywidget.cpp" line="837"/>
<source>Start Syncthing with the built-in launcher configured in the settings</source>
<translation type="unfinished"></translation>
</message>

View File

@ -162,20 +162,20 @@
</message>
<message>
<location filename="../gui/traywidget.ui" line="58"/>
<location filename="../gui/traywidget.cpp" line="464"/>
<location filename="../gui/traywidget.cpp" line="459"/>
<source>Connect</source>
<translation></translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="72"/>
<location filename="../gui/traywidget.cpp" line="840"/>
<location filename="../gui/traywidget.cpp" line="882"/>
<location filename="../gui/traywidget.cpp" line="836"/>
<location filename="../gui/traywidget.cpp" line="878"/>
<source>Start</source>
<translation></translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="99"/>
<location filename="../gui/traywidget.cpp" line="339"/>
<location filename="../gui/traywidget.cpp" line="337"/>
<source>About</source>
<translation></translation>
</message>
@ -246,8 +246,8 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
</message>
<message>
<location filename="../gui/traywidget.ui" line="357"/>
<location filename="../gui/traywidget.cpp" line="156"/>
<location filename="../gui/traywidget.cpp" line="382"/>
<location filename="../gui/traywidget.cpp" line="154"/>
<location filename="../gui/traywidget.cpp" line="377"/>
<source>New notifications</source>
<translation></translation>
</message>
@ -282,118 +282,118 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
<translation></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="128"/>
<location filename="../gui/traywidget.cpp" line="126"/>
<source>View own device ID</source>
<translation> ID</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="133"/>
<location filename="../gui/traywidget.cpp" line="131"/>
<source>Restart Syncthing</source>
<translation> Syncthing</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="138"/>
<location filename="../gui/traywidget.cpp" line="136"/>
<source>Show Syncthing log</source>
<translation> Syncthing </translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="143"/>
<location filename="../gui/traywidget.cpp" line="141"/>
<source>Rescan all directories</source>
<translation></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="150"/>
<location filename="../gui/traywidget.cpp" line="148"/>
<source>Connection</source>
<translation></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="172"/>
<location filename="../gui/traywidget.cpp" line="170"/>
<source>Show internal errors</source>
<translation></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="187"/>
<location filename="../gui/traywidget.cpp" line="185"/>
<source>Quit Syncthing Tray</source>
<translation>退 Syncthing Tray</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="439"/>
<location filename="../gui/traywidget.cpp" line="434"/>
<source>Do you really want to restart Syncthing?</source>
<translation> Syncthing </translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="465"/>
<location filename="../gui/traywidget.cpp" line="460"/>
<source>Not connected to Syncthing, click to connect</source>
<translation> Syncthing</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="470"/>
<location filename="../gui/traywidget.cpp" line="465"/>
<source>Unable to establish connection to Syncthing.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="480"/>
<location filename="../gui/traywidget.cpp" line="475"/>
<source>Pause</source>
<translation></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="481"/>
<location filename="../gui/traywidget.cpp" line="476"/>
<source>Syncthing is running, click to pause all devices</source>
<translation>Syncthing </translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="486"/>
<location filename="../gui/traywidget.cpp" line="481"/>
<source>Continue</source>
<translation></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="487"/>
<location filename="../gui/traywidget.cpp" line="482"/>
<source>At least one device is paused, click to resume</source>
<translation></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="610"/>
<location filename="../gui/traywidget.cpp" line="605"/>
<source>The specified connection configuration &lt;em&gt;%1&lt;/em&gt; is not defined and hence ignored.</source>
<translation> &lt;em&gt;%1&lt;/em&gt; </translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="645"/>
<location filename="../gui/traywidget.cpp" line="641"/>
<source>The directory &lt;i&gt;%1&lt;/i&gt; does not exist on the local machine.</source>
<translation> &lt;i&gt;%1&lt;/i&gt;</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="656"/>
<location filename="../gui/traywidget.cpp" line="652"/>
<source>The containing directory &lt;i&gt;%1&lt;/i&gt; does not exist on the local machine.</source>
<translation> &lt;i&gt;%1&lt;/i&gt;</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="699"/>
<location filename="../gui/traywidget.cpp" line="695"/>
<source>Copy path</source>
<translation></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="703"/>
<location filename="../gui/traywidget.cpp" line="699"/>
<source>Copy device ID</source>
<translation> ID</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="706"/>
<location filename="../gui/traywidget.cpp" line="702"/>
<source>Copy directory ID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="836"/>
<location filename="../gui/traywidget.cpp" line="876"/>
<location filename="../gui/traywidget.cpp" line="832"/>
<location filename="../gui/traywidget.cpp" line="872"/>
<source>Stop</source>
<translation></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="837"/>
<location filename="../gui/traywidget.cpp" line="833"/>
<source>Stop Syncthing instance launched via tray icon</source>
<translation> Syncthing </translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="841"/>
<location filename="../gui/traywidget.cpp" line="837"/>
<source>Start Syncthing with the built-in launcher configured in the settings</source>
<translation>使 Syncthing</translation>
</message>