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_MINOR 4)
set(META_VERSION_PATCH 0) set(META_VERSION_PATCH 0)
set(META_RELEASE_DATE "2023-03-07") set(META_RELEASE_DATE "2023-03-07")
set(META_SOVERSION 5) set(META_SOVERSION 6)
set(META_ADD_DEFAULT_CPP_UNIT_TEST_APPLICATION ON) set(META_ADD_DEFAULT_CPP_UNIT_TEST_APPLICATION ON)
project(${META_PROJECT_NAME}) 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 * `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 * `SYNCTHINGTRAY_SYSTEMD_USER_UNIT`: override the name of the systemd user-unit checked by the wizard's
setup detection 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 * `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) 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; categories << category;
// most startup options don't make much sense for a Plasmoid, so merge webview with startup // most startup options don't make much sense for a Plasmoid, so merge webview with startup
auto *const webViewPage = new WebViewOptionPage; auto *const generalWebViewPage = new GeneralWebViewOptionPage;
webViewPage->widget()->setWindowTitle(QCoreApplication::translate("Plasmoid::SettingsDialog", "Web view")); 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 #ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD
auto *const systemdPage = new SystemdOptionPage; auto *const systemdPage = new SystemdOptionPage;
#endif #endif
category = new OptionCategory; category = new OptionCategory;
category->setDisplayName(QCoreApplication::translate("Plasmoid::SettingsDialog", "Extras")); category->setDisplayName(QCoreApplication::translate("Plasmoid::SettingsDialog", "Extras"));
category->assignPages({ webViewPage category->assignPages({ generalWebViewPage, builtinWebViewPage
#ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD #ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD
, ,
systemdPage systemdPage

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>QtGui::WebViewOptionPage</class> <class>QtGui::BuiltinWebViewOptionPage</class>
<widget class="QWidget" name="QtGui::WebViewOptionPage"> <widget class="QWidget" name="QtGui::BuiltinWebViewOptionPage">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum"> <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch> <horstretch>0</horstretch>
@ -9,7 +9,7 @@
</sizepolicy> </sizepolicy>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>General</string> <string>Built-in web view</string>
</property> </property>
<property name="windowIcon"> <property name="windowIcon">
<iconset theme="internet-web-browser" resource="../resources/syncthingwidgetsicons.qrc"> <iconset theme="internet-web-browser" resource="../resources/syncthingwidgetsicons.qrc">
@ -17,27 +17,13 @@
</property> </property>
<layout class="QFormLayout" name="formLayout"> <layout class="QFormLayout" name="formLayout">
<item row="1" column="0"> <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"> <widget class="QLabel" name="zoomLabel">
<property name="text"> <property name="text">
<string>Zoom factor</string> <string>Zoom factor</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="1"> <item row="1" column="1">
<widget class="QDoubleSpinBox" name="zoomDoubleSpinBox"> <widget class="QDoubleSpinBox" name="zoomDoubleSpinBox">
<property name="buttonSymbols"> <property name="buttonSymbols">
<enum>QAbstractSpinBox::PlusMinus</enum> <enum>QAbstractSpinBox::PlusMinus</enum>
@ -53,14 +39,14 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="0"> <item row="2" column="0">
<widget class="QLabel" name="keepRunningLabel"> <widget class="QLabel" name="keepRunningLabel">
<property name="text"> <property name="text">
<string>Hiding</string> <string>Hiding</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="1"> <item row="2" column="1">
<widget class="QCheckBox" name="keepRunningCheckBox"> <widget class="QCheckBox" name="keepRunningCheckBox">
<property name="text"> <property name="text">
<string>Keep web view running when currently not shown</string> <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) #if defined(SYNCTHINGWIDGETS_USE_WEBENGINE) || defined(SYNCTHINGWIDGETS_USE_WEBKIT)
settings.beginGroup(QStringLiteral("webview")); settings.beginGroup(QStringLiteral("webview"));
auto &webView = v.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.zoomFactor = settings.value(QStringLiteral("zoomFactor"), webView.zoomFactor).toDouble();
webView.geometry = settings.value(QStringLiteral("geometry")).toByteArray(); webView.geometry = settings.value(QStringLiteral("geometry")).toByteArray();
webView.keepRunning = settings.value(QStringLiteral("keepRunning"), webView.keepRunning).toBool(); webView.keepRunning = settings.value(QStringLiteral("keepRunning"), webView.keepRunning).toBool();
@ -529,7 +533,8 @@ bool save()
#if defined(SYNCTHINGWIDGETS_USE_WEBENGINE) || defined(SYNCTHINGWIDGETS_USE_WEBKIT) #if defined(SYNCTHINGWIDGETS_USE_WEBENGINE) || defined(SYNCTHINGWIDGETS_USE_WEBKIT)
settings.beginGroup(QStringLiteral("webview")); settings.beginGroup(QStringLiteral("webview"));
const auto &webView = v.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("zoomFactor"), webView.zoomFactor);
settings.setValue(QStringLiteral("geometry"), webView.geometry); settings.setValue(QStringLiteral("geometry"), webView.geometry);
settings.setValue(QStringLiteral("keepRunning"), webView.keepRunning); settings.setValue(QStringLiteral("keepRunning"), webView.keepRunning);

View File

@ -141,14 +141,16 @@ struct SYNCTHINGWIDGETS_EXPORT Systemd {
}; };
#endif #endif
#if defined(SYNCTHINGWIDGETS_USE_WEBENGINE) || defined(SYNCTHINGWIDGETS_USE_WEBKIT)
struct SYNCTHINGWIDGETS_EXPORT WebView { 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; double zoomFactor = 1.0;
QByteArray geometry; QByteArray geometry;
bool keepRunning = true; bool keepRunning = true;
};
#endif #endif
};
struct SYNCTHINGWIDGETS_EXPORT Settings { struct SYNCTHINGWIDGETS_EXPORT Settings {
bool firstLaunch = false; bool firstLaunch = false;
@ -173,9 +175,7 @@ struct SYNCTHINGWIDGETS_EXPORT Settings {
#ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD #ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD
Systemd systemd; Systemd systemd;
#endif #endif
#if defined(SYNCTHINGWIDGETS_USE_WEBENGINE) || defined(SYNCTHINGWIDGETS_USE_WEBKIT)
WebView webView; WebView webView;
#endif
QtUtilities::QtSettings qt; QtUtilities::QtSettings qt;
void apply(Data::SyncthingNotifier &notifier) const; void apply(Data::SyncthingNotifier &notifier) const;

View File

@ -26,7 +26,8 @@
#ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD #ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD
#include "ui_systemdoptionpage.h" #include "ui_systemdoptionpage.h"
#endif #endif
#include "ui_webviewoptionpage.h" #include "ui_builtinwebviewoptionpage.h"
#include "ui_generalwebviewoptionpage.h"
// use meta-data of syncthingtray application here // use meta-data of syncthingtray application here
#include "resources/../../tray/resources/config.h" #include "resources/../../tray/resources/config.h"
@ -1368,45 +1369,91 @@ void SystemdOptionPage::updateColors()
} }
#endif #endif
// WebViewOptionPage // GeneralWebViewOptionPage
WebViewOptionPage::WebViewOptionPage(QWidget *parentWidget) GeneralWebViewOptionPage::GeneralWebViewOptionPage(QWidget *parentWidget)
: WebViewOptionPageBase(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 #ifdef SYNCTHINGWIDGETS_NO_WEBVIEW
QWidget *WebViewOptionPage::setupWidget() QWidget *BuiltinWebViewOptionPage::setupWidget()
{ {
auto *label = new QLabel; 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->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 " "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.")); "or Qt WebEngine.\nThe Web UI will be opened in the default web browser instead."));
return label; return label;
} }
#endif #endif
bool WebViewOptionPage::apply() bool BuiltinWebViewOptionPage::apply()
{ {
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW #ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
auto &webView = values().webView; auto &webView = values().webView;
webView.disabled = ui()->disableCheckBox->isChecked();
webView.zoomFactor = ui()->zoomDoubleSpinBox->value(); webView.zoomFactor = ui()->zoomDoubleSpinBox->value();
webView.keepRunning = ui()->keepRunningCheckBox->isChecked(); webView.keepRunning = ui()->keepRunningCheckBox->isChecked();
#endif #endif
return true; return true;
} }
void WebViewOptionPage::reset() void BuiltinWebViewOptionPage::reset()
{ {
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW #ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
const auto &webView = values().webView; const auto &webView = values().webView;
ui()->disableCheckBox->setChecked(webView.disabled);
ui()->zoomDoubleSpinBox->setValue(webView.zoomFactor); ui()->zoomDoubleSpinBox->setValue(webView.zoomFactor);
ui()->keepRunningCheckBox->setChecked(webView.keepRunning); ui()->keepRunningCheckBox->setChecked(webView.keepRunning);
#endif #endif
@ -1443,7 +1490,7 @@ SettingsDialog::SettingsDialog(Data::SyncthingConnection *connection, QWidget *p
category = new OptionCategory(this); category = new OptionCategory(this);
category->setDisplayName(tr("Web view")); category->setDisplayName(tr("Web view"));
category->assignPages({ new WebViewOptionPage }); category->assignPages({ new GeneralWebViewOptionPage, new BuiltinWebViewOptionPage });
category->setIcon( category->setIcon(
QIcon::fromTheme(QStringLiteral("internet-web-browser"), QIcon(QStringLiteral(":/icons/hicolor/scalable/apps/internet-web-browser.svg")))); QIcon::fromTheme(QStringLiteral("internet-web-browser"), QIcon(QStringLiteral(":/icons/hicolor/scalable/apps/internet-web-browser.svg"))));
categories << category; categories << category;
@ -1515,6 +1562,7 @@ INSTANTIATE_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, LauncherOptionPage)
#ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD #ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD
INSTANTIATE_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, SystemdOptionPage) INSTANTIATE_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, SystemdOptionPage)
#endif #endif
INSTANTIATE_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, GeneralWebViewOptionPage)
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW #ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
INSTANTIATE_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, WebViewOptionPage) INSTANTIATE_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, BuiltinWebViewOptionPage)
#endif #endif

View File

@ -162,10 +162,11 @@ QMetaObject::Connection m_enabledChangedConn;
END_DECLARE_OPTION_PAGE END_DECLARE_OPTION_PAGE
#endif #endif
DECLARE_UI_FILE_BASED_OPTION_PAGE_CUSTOM_SETUP(GeneralWebViewOptionPage)
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW #ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
DECLARE_UI_FILE_BASED_OPTION_PAGE(WebViewOptionPage) DECLARE_UI_FILE_BASED_OPTION_PAGE(BuiltinWebViewOptionPage)
#else #else
DECLARE_OPTION_PAGE(WebViewOptionPage) DECLARE_OPTION_PAGE(BuiltinWebViewOptionPage)
#endif #endif
class SYNCTHINGWIDGETS_EXPORT SettingsDialog : public QtUtilities::SettingsDialog { 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 #ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD
DECLARE_EXTERN_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, SystemdOptionPage) DECLARE_EXTERN_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, SystemdOptionPage)
#endif #endif
DECLARE_EXTERN_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, GeneralWebViewOptionPage)
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW #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
#endif // SETTINGS_DIALOG_H #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 "./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 "./webpage.h"
#include "./webviewinterceptor.h" #include "./webviewinterceptor.h"
#include "../settings/settings.h" #include <qtutilities/misc/compat.h>
#include <qtutilities/misc/dialogutils.h> #include <qtutilities/misc/dialogutils.h>
#include <QCloseEvent> #include <QCloseEvent>
@ -149,3 +159,61 @@ bool WebViewDialog::eventFilter(QObject *watched, QEvent *event)
} // namespace QtGui } // namespace QtGui
#endif // SYNCTHINGWIDGETS_NO_WEBVIEW #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 #ifndef WEBVIEW_DIALOG_H
#define 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 #ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
#include "./webviewdefs.h" #include "./webviewdefs.h"
#include "../settings/settings.h"
#include <QMainWindow> #include <QMainWindow>
QT_FORWARD_DECLARE_CLASS(WEB_VIEW_PROVIDER) QT_FORWARD_DECLARE_CLASS(WEB_VIEW_PROVIDER)
QT_FORWARD_DECLARE_CLASS(QWebEngineProfile) QT_FORWARD_DECLARE_CLASS(QWebEngineProfile)
namespace Settings {
struct ConnectionSettings;
}
namespace QtGui { namespace QtGui {
class SYNCTHINGWIDGETS_EXPORT WebViewDialog : public QMainWindow { class SYNCTHINGWIDGETS_EXPORT WebViewDialog : public QMainWindow {
@ -53,5 +54,16 @@ inline const Data::SyncthingConnectionSettings &WebViewDialog::connectionSetting
} // namespace QtGui } // namespace QtGui
#else // SYNCTHINGWIDGETS_NO_WEBVIEW
namespace QtGui {
using WebViewDialog = void;
}
#endif // SYNCTHINGWIDGETS_NO_WEBVIEW #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 #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(); auto *const trayWidget = TrayWidget::instances().front();
if (webUi) { if (webUi) {
trayWidget->showWebUi(); trayWidget->showWebUI();
} }
if (tray) { if (tray) {
trayWidget->showUsingPositioningSettings(); trayWidget->showUsingPositioningSettings();

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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