tray: Allow specifying name of initial connection via CLI

This includes refactoring TrayWidget::applySettings() which
is now a member function and only affects the current instance.

This prevents applying settings on every instance every time
a new tray widget is created.

To apply settings for all tray widgets, the static function
TrayWidget::applySettingsOnAllInstances() is used instead.
This commit is contained in:
Martchus 2017-08-09 01:11:47 +02:00
parent c843548baa
commit 7b19be01f2
9 changed files with 169 additions and 136 deletions

View File

@ -46,7 +46,7 @@ void handleSystemdServiceError(const QString &context, const QString &name, cons
}
#endif
int initSyncthingTray(bool windowed, bool waitForTray)
int initSyncthingTray(bool windowed, bool waitForTray, const char *connectionConfig)
{
auto &v = Settings::values();
#ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD
@ -54,16 +54,17 @@ int initSyncthingTray(bool windowed, bool waitForTray)
service.setUnitName(v.systemd.syncthingUnit);
QObject::connect(&service, &SyncthingService::errorOccurred, &handleSystemdServiceError);
#endif
const QString connectionConfigQStr = connectionConfig ? QString::fromLocal8Bit(connectionConfig) : QString();
if (windowed) {
v.launcher.autostart();
auto *trayWidget = new TrayWidget;
auto *trayWidget = new TrayWidget(connectionConfigQStr);
trayWidget->setAttribute(Qt::WA_DeleteOnClose);
trayWidget->show();
} else {
#ifndef QT_NO_SYSTEMTRAYICON
if (QSystemTrayIcon::isSystemTrayAvailable() || waitForTray) {
v.launcher.autostart();
auto *trayIcon = new TrayIcon;
auto *trayIcon = new TrayIcon(connectionConfigQStr);
trayIcon->show();
if (v.firstLaunch) {
QMessageBox msgBox;
@ -124,11 +125,13 @@ int runApplication(int argc, const char *const *argv)
Argument waitForTrayArg("wait", '\0',
"wait until the system tray becomes available instead of showing an error message if the system tray is not available on start-up");
waitForTrayArg.setCombinable(true);
ConfigValueArgument connectionArg("connection", '\0', "specifies the connection configuration to be used", { "config name" });
Argument &widgetsGuiArg = qtConfigArgs.qtWidgetsGuiArg();
widgetsGuiArg.addSubArgument(&windowedArg);
widgetsGuiArg.addSubArgument(&showWebUiArg);
widgetsGuiArg.addSubArgument(&triggerArg);
widgetsGuiArg.addSubArgument(&waitForTrayArg);
widgetsGuiArg.addSubArgument(&connectionArg);
parser.setMainArguments({ &qtConfigArgs.qtWidgetsGuiArg(), &helpArg });
try {
@ -149,7 +152,7 @@ int runApplication(int argc, const char *const *argv)
qtConfigArgs.applySettings(true);
LOAD_QT_TRANSLATIONS;
int res = initSyncthingTray(windowedArg.isPresent(), waitForTrayArg.isPresent());
int res = initSyncthingTray(windowedArg.isPresent(), waitForTrayArg.isPresent(), connectionArg.firstValue());
if (!res) {
trigger(triggerArg.isPresent(), showWebUiArg.isPresent());
res = application.exec();
@ -163,7 +166,7 @@ int runApplication(int argc, const char *const *argv)
// if --webui or --trigger is present don't create a new tray icon, just trigger actions
trigger(triggerArg.isPresent(), showWebUiArg.isPresent());
} else {
const int res = initSyncthingTray(windowedArg.isPresent(), waitForTrayArg.isPresent());
const int res = initSyncthingTray(windowedArg.isPresent(), waitForTrayArg.isPresent(), connectionArg.firstValue());
if (!res) {
trigger(triggerArg.isPresent(), showWebUiArg.isPresent());
}

View File

@ -34,10 +34,10 @@ namespace QtGui {
/*!
* \brief Instantiates a new tray icon.
*/
TrayIcon::TrayIcon(QObject *parent)
TrayIcon::TrayIcon(const QString &connectionConfig, QObject *parent)
: QSystemTrayIcon(parent)
, m_initialized(false)
, m_trayMenu(this)
, m_trayMenu(this, connectionConfig)
, m_status(SyncthingStatus::Disconnected)
{
// set context menu

View File

@ -23,7 +23,7 @@ class TrayIcon : public QSystemTrayIcon {
Q_OBJECT
public:
TrayIcon(QObject *parent = nullptr);
TrayIcon(const QString &connectionConfig = QString(), QObject *parent = nullptr);
TrayMenu &trayMenu();
public slots:

View File

@ -11,19 +11,19 @@
namespace QtGui {
TrayMenu::TrayMenu(TrayIcon *trayIcon, QWidget *parent)
: TrayMenu(parent)
TrayMenu::TrayMenu(TrayIcon *trayIcon, const QString &connectionConfig, QWidget *parent)
: TrayMenu(connectionConfig, parent)
{
m_trayIcon = trayIcon;
}
TrayMenu::TrayMenu(QWidget *parent)
TrayMenu::TrayMenu(const QString &connectionConfig, QWidget *parent)
: QMenu(parent)
, m_trayIcon(nullptr)
{
auto *menuLayout = new QHBoxLayout;
menuLayout->setMargin(0), menuLayout->setSpacing(0);
menuLayout->addWidget(m_trayWidget = new TrayWidget(this));
menuLayout->addWidget(m_trayWidget = new TrayWidget(connectionConfig, this));
setLayout(menuLayout);
setPlatformMenu(nullptr);
}

View File

@ -12,8 +12,8 @@ class TrayMenu : public QMenu {
Q_OBJECT
public:
TrayMenu(TrayIcon *trayIcon, QWidget *parent = nullptr);
TrayMenu(QWidget *parent = nullptr);
TrayMenu(TrayIcon *trayIcon, const QString &connectionConfig = QString(), QWidget *parent = nullptr);
TrayMenu(const QString &connectionConfig = QString(), QWidget *parent = nullptr);
QSize sizeHint() const;
TrayWidget *widget();

View File

@ -54,7 +54,7 @@ vector<TrayWidget *> TrayWidget::m_instances;
/*!
* \brief Instantiates a new tray widget.
*/
TrayWidget::TrayWidget(TrayMenu *parent)
TrayWidget::TrayWidget(const QString &connectionConfig, TrayMenu *parent)
: QWidget(parent)
, m_menu(parent)
, m_ui(new Ui::TrayWidget)
@ -113,7 +113,6 @@ TrayWidget::TrayWidget(TrayMenu *parent)
m_connectionsActionGroup = new QActionGroup(m_connectionsMenu = new QMenu(tr("Connection"), this));
m_connectionsMenu->setIcon(
QIcon::fromTheme(QStringLiteral("network-connect"), QIcon(QStringLiteral(":/icons/hicolor/scalable/actions/network-connect.svg"))));
m_ui->connectionsPushButton->setText(Settings::values().connection.primary.label);
m_ui->connectionsPushButton->setMenu(m_connectionsMenu);
// setup notifications menu
@ -123,7 +122,7 @@ TrayWidget::TrayWidget(TrayMenu *parent)
m_ui->notificationsPushButton->setMenu(m_notificationsMenu);
// apply settings, this also establishes the connection to Syncthing (according to settings)
applySettings();
applySettings(connectionConfig);
// setup other widgets
m_ui->notificationsPushButton->setHidden(true);
@ -179,7 +178,7 @@ void TrayWidget::showSettingsDialog()
{
if (!m_settingsDlg) {
m_settingsDlg = new SettingsDialog(&m_connection, this);
connect(m_settingsDlg, &SettingsDialog::applied, &TrayWidget::applySettings);
connect(m_settingsDlg, &SettingsDialog::applied, &TrayWidget::applySettingsOnAllInstances);
}
centerWidget(m_settingsDlg);
showDialog(m_settingsDlg);
@ -360,80 +359,100 @@ void TrayWidget::handleStatusChanged(SyncthingStatus status)
}
}
void TrayWidget::applySettings()
void TrayWidget::applySettings(const QString &connectionConfig)
{
// update connections menu
int connectionIndex = 0;
auto &settings = Settings::values();
auto &primaryConnectionSettings = settings.connection.primary;
auto &secondaryConnectionSettings = settings.connection.secondary;
const int connectionCount = static_cast<int>(1 + secondaryConnectionSettings.size());
const QList<QAction *> connectionActions = m_connectionsActionGroup->actions();
m_selectedConnection = nullptr;
bool specifiedConnectionConfigFound = false;
for (; connectionIndex < connectionCount; ++connectionIndex) {
SyncthingConnectionSettings &connectionSettings
= (connectionIndex == 0 ? primaryConnectionSettings : secondaryConnectionSettings[static_cast<size_t>(connectionIndex - 1)]);
QAction *action;
if (connectionIndex < connectionActions.size()) {
action = connectionActions.at(connectionIndex);
action->setText(connectionSettings.label);
if (action->isChecked() && !m_selectedConnection) {
m_selectedConnection = &connectionSettings;
}
} else {
action = m_connectionsMenu->addAction(connectionSettings.label);
action->setCheckable(true);
m_connectionsActionGroup->addAction(action);
}
if (!connectionConfig.isEmpty() && !connectionSettings.label.compare(connectionConfig, Qt::CaseInsensitive)) {
m_selectedConnection = &connectionSettings;
specifiedConnectionConfigFound = true;
action->setChecked(true);
}
}
for (; connectionIndex < connectionActions.size(); ++connectionIndex) {
delete connectionActions.at(connectionIndex);
}
if (!m_selectedConnection) {
m_selectedConnection = &primaryConnectionSettings;
m_connectionsMenu->actions().at(0)->setChecked(true);
}
m_ui->connectionsPushButton->setText(m_selectedConnection->label);
const bool reconnectRequired = m_connection.applySettings(*m_selectedConnection);
#ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD
// reconnect to apply settings considering systemd
const bool couldReconnect = handleSystemdStatusChanged();
if (reconnectRequired && couldReconnect) {
m_connection.reconnect();
}
#else
instance->m_connection.reconnect();
#endif
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
// web view
if (m_webViewDlg) {
m_webViewDlg->applySettings(*m_selectedConnection);
}
#endif
// update visual appearance
m_ui->trafficFormWidget->setVisible(settings.appearance.showTraffic);
m_ui->trafficIconLabel->setVisible(settings.appearance.showTraffic);
m_ui->trafficHorizontalSpacer->changeSize(
0, 20, settings.appearance.showTraffic ? QSizePolicy::Expanding : QSizePolicy::Ignored, QSizePolicy::Minimum);
if (settings.appearance.showTraffic) {
updateTraffic();
}
m_ui->infoFrame->setFrameStyle(settings.appearance.frameStyle);
m_ui->buttonsFrame->setFrameStyle(settings.appearance.frameStyle);
if (QApplication::style() && !QApplication::style()->objectName().compare(QLatin1String("adwaita"), Qt::CaseInsensitive)) {
m_cornerFrame->setFrameStyle(QFrame::NoFrame);
} else {
m_cornerFrame->setFrameStyle(settings.appearance.frameStyle);
}
if (settings.appearance.tabPosition >= QTabWidget::North && settings.appearance.tabPosition <= QTabWidget::East) {
m_ui->tabWidget->setTabPosition(static_cast<QTabWidget::TabPosition>(settings.appearance.tabPosition));
}
m_dirModel.setBrightColors(settings.appearance.brightTextColors);
m_devModel.setBrightColors(settings.appearance.brightTextColors);
m_dlModel.setBrightColors(settings.appearance.brightTextColors);
// show warning when explicitely specified connection configuration was not found
if (!specifiedConnectionConfigFound && !connectionConfig.isEmpty()) {
auto *const msgBox = new QMessageBox(QMessageBox::Warning, QCoreApplication::applicationName(),
tr("The specified connection configuration <em>%1</em> is not defined and hence ignored.").arg(connectionConfig));
msgBox->setAttribute(Qt::WA_DeleteOnClose);
msgBox->show();
}
}
void TrayWidget::applySettingsOnAllInstances()
{
for (TrayWidget *instance : m_instances) {
// update connections menu
int connectionIndex = 0;
auto &settings = Settings::values();
auto &primaryConnectionSettings = settings.connection.primary;
auto &secondaryConnectionSettings = settings.connection.secondary;
const int connectionCount = static_cast<int>(1 + secondaryConnectionSettings.size());
const QList<QAction *> connectionActions = instance->m_connectionsActionGroup->actions();
instance->m_selectedConnection = nullptr;
for (; connectionIndex < connectionCount; ++connectionIndex) {
SyncthingConnectionSettings &connectionSettings
= (connectionIndex == 0 ? primaryConnectionSettings : secondaryConnectionSettings[static_cast<size_t>(connectionIndex - 1)]);
if (connectionIndex < connectionActions.size()) {
QAction *action = connectionActions.at(connectionIndex);
action->setText(connectionSettings.label);
if (action->isChecked()) {
instance->m_selectedConnection = &connectionSettings;
}
} else {
QAction *action = instance->m_connectionsMenu->addAction(connectionSettings.label);
action->setCheckable(true);
instance->m_connectionsActionGroup->addAction(action);
}
}
for (; connectionIndex < connectionActions.size(); ++connectionIndex) {
delete connectionActions.at(connectionIndex);
}
if (!instance->m_selectedConnection) {
instance->m_selectedConnection = &primaryConnectionSettings;
instance->m_connectionsMenu->actions().at(0)->setChecked(true);
}
instance->m_ui->connectionsPushButton->setText(instance->m_selectedConnection->label);
const bool reconnectRequired = instance->m_connection.applySettings(*instance->m_selectedConnection);
// reconnect to apply settings considering systemd
#ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD
const bool couldReconnect = instance->handleSystemdStatusChanged();
if (reconnectRequired && couldReconnect) {
instance->m_connection.reconnect();
}
#else
instance->m_connection.reconnect();
#endif
// web view
#ifndef SYNCTHINGWIDGETS_NO_WEBVIEW
if (instance->m_webViewDlg) {
instance->m_webViewDlg->applySettings(*instance->m_selectedConnection);
}
#endif
// update visual appearance
instance->m_ui->trafficFormWidget->setVisible(settings.appearance.showTraffic);
instance->m_ui->trafficIconLabel->setVisible(settings.appearance.showTraffic);
instance->m_ui->trafficHorizontalSpacer->changeSize(
0, 20, settings.appearance.showTraffic ? QSizePolicy::Expanding : QSizePolicy::Ignored, QSizePolicy::Minimum);
if (settings.appearance.showTraffic) {
instance->updateTraffic();
}
instance->m_ui->infoFrame->setFrameStyle(settings.appearance.frameStyle);
instance->m_ui->buttonsFrame->setFrameStyle(settings.appearance.frameStyle);
if (QApplication::style() && !QApplication::style()->objectName().compare(QLatin1String("adwaita"), Qt::CaseInsensitive)) {
instance->m_cornerFrame->setFrameStyle(QFrame::NoFrame);
} else {
instance->m_cornerFrame->setFrameStyle(settings.appearance.frameStyle);
}
if (settings.appearance.tabPosition >= QTabWidget::North && settings.appearance.tabPosition <= QTabWidget::East) {
instance->m_ui->tabWidget->setTabPosition(static_cast<QTabWidget::TabPosition>(settings.appearance.tabPosition));
}
instance->m_dirModel.setBrightColors(settings.appearance.brightTextColors);
instance->m_devModel.setBrightColors(settings.appearance.brightTextColors);
instance->m_dlModel.setBrightColors(settings.appearance.brightTextColors);
instance->applySettings();
}
}

View File

@ -40,7 +40,7 @@ class TrayWidget : public QWidget {
Q_OBJECT
public:
TrayWidget(TrayMenu *parent = nullptr);
TrayWidget(const QString &connectionConfig = QString(), TrayMenu *parent = nullptr);
~TrayWidget();
Data::SyncthingConnection &connection();
@ -61,7 +61,8 @@ public slots:
private slots:
void handleStatusChanged(Data::SyncthingStatus status);
static void applySettings();
void applySettings(const QString &connectionConfig = QString());
static void applySettingsOnAllInstances();
void openDir(const Data::SyncthingDir &dir);
void openItemDir(const Data::SyncthingItemDownloadProgress &item);
void scanDir(const Data::SyncthingDir &dir);

View File

@ -124,19 +124,19 @@
</message>
<message>
<location filename="../gui/traywidget.ui" line="72"/>
<location filename="../gui/traywidget.cpp" line="194"/>
<location filename="../gui/traywidget.cpp" line="193"/>
<source>About</source>
<translation>Über Syncthing Tray</translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="99"/>
<location filename="../gui/traywidget.cpp" line="333"/>
<location filename="../gui/traywidget.cpp" line="332"/>
<source>Connect</source>
<translation>Verbinden</translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="113"/>
<location filename="../gui/traywidget.cpp" line="555"/>
<location filename="../gui/traywidget.cpp" line="574"/>
<source>Start</source>
<translation>Starten</translation>
</message>
@ -168,7 +168,7 @@
<message>
<location filename="../gui/traywidget.ui" line="250"/>
<location filename="../gui/traywidget.ui" line="270"/>
<location filename="../gui/traywidget.cpp" line="509"/>
<location filename="../gui/traywidget.cpp" line="528"/>
<source>unknown</source>
<translation>unbekannt</translation>
</message>
@ -191,8 +191,8 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
</message>
<message>
<location filename="../gui/traywidget.ui" line="311"/>
<location filename="../gui/traywidget.cpp" line="120"/>
<location filename="../gui/traywidget.cpp" line="277"/>
<location filename="../gui/traywidget.cpp" line="119"/>
<location filename="../gui/traywidget.cpp" line="276"/>
<source>New notifications</source>
<translation>Neue Benachrichtigungen</translation>
</message>
@ -247,67 +247,72 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
<translation>Verbindung</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="224"/>
<location filename="../gui/traywidget.cpp" line="223"/>
<source>Own device ID</source>
<translation>Eigene Geräte-ID</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="234"/>
<location filename="../gui/traywidget.cpp" line="233"/>
<source>device ID is unknown</source>
<translation>die Geräte-ID ist unbekannt</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="242"/>
<location filename="../gui/traywidget.cpp" line="241"/>
<source>Copy to clipboard</source>
<translation>in Zwischenablage kopieren</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="259"/>
<location filename="../gui/traywidget.cpp" line="258"/>
<source>Log</source>
<translation></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="308"/>
<location filename="../gui/traywidget.cpp" line="307"/>
<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="334"/>
<location filename="../gui/traywidget.cpp" line="333"/>
<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="346"/>
<location filename="../gui/traywidget.cpp" line="345"/>
<source>Pause</source>
<translation>Pausieren</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="347"/>
<location filename="../gui/traywidget.cpp" line="346"/>
<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="353"/>
<location filename="../gui/traywidget.cpp" line="352"/>
<source>Continue</source>
<translation>Fortsetzen</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="354"/>
<location filename="../gui/traywidget.cpp" line="353"/>
<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="446"/>
<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="465"/>
<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="457"/>
<location filename="../gui/traywidget.cpp" line="476"/>
<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="550"/>
<location filename="../gui/traywidget.cpp" line="569"/>
<source>Stop</source>
<translation>Stoppen</translation>
</message>
@ -320,22 +325,22 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
<translation>Fehler beim </translation>
</message>
<message>
<location filename="../application/main.cpp" line="72"/>
<location filename="../application/main.cpp" line="73"/>
<source>You must configure how to connect to Syncthing when using Syncthing Tray the first time.</source>
<translation>Vor der ersten Verwendung muss eingestellt werden, wie sich das Syncthing Tray mit Syncthing verbinden soll.</translation>
</message>
<message>
<location filename="../application/main.cpp" line="73"/>
<location filename="../application/main.cpp" line="74"/>
<source>Note that the settings dialog allows importing URL, credentials and API-key from the local Syncthing configuration.</source>
<translation>Der Einstellungsdialog ermöglicht es die URL, Zugangsdaten und den API-Key automatisch aus der lokalen Syncthing-Konfiguration auszulesen.</translation>
</message>
<message>
<location filename="../application/main.cpp" line="80"/>
<location filename="../application/main.cpp" line="81"/>
<source>The system tray is (currently) not available. You could open the tray menu as a regular window using the -w flag, though.</source>
<translation>Das System-Tray bzw. der Infobereich ist aktuell nicht verfügbar. Es wäre möglich, Syncthing Tray als normales Fenster zu starten (mit Option -w).</translation>
</message>
<message>
<location filename="../application/main.cpp" line="86"/>
<location filename="../application/main.cpp" line="87"/>
<source>The Qt libraries have not been built with tray icon support. You could open the tray menu as a regular window using the -w flag, though.</source>
<translation>Die verwendete Qt-Bibliothek wurde nicht mit Unterstützung für System-Tray konfiguriert. Es wäre möglich, Syncthing Tray als normales Fenster zu starten (mit Option -w).</translation>
</message>

View File

@ -123,19 +123,19 @@
</message>
<message>
<location filename="../gui/traywidget.ui" line="72"/>
<location filename="../gui/traywidget.cpp" line="194"/>
<location filename="../gui/traywidget.cpp" line="193"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="99"/>
<location filename="../gui/traywidget.cpp" line="333"/>
<location filename="../gui/traywidget.cpp" line="332"/>
<source>Connect</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="113"/>
<location filename="../gui/traywidget.cpp" line="555"/>
<location filename="../gui/traywidget.cpp" line="574"/>
<source>Start</source>
<translation type="unfinished"></translation>
</message>
@ -167,7 +167,7 @@
<message>
<location filename="../gui/traywidget.ui" line="250"/>
<location filename="../gui/traywidget.ui" line="270"/>
<location filename="../gui/traywidget.cpp" line="509"/>
<location filename="../gui/traywidget.cpp" line="528"/>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
@ -189,8 +189,8 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
</message>
<message>
<location filename="../gui/traywidget.ui" line="311"/>
<location filename="../gui/traywidget.cpp" line="120"/>
<location filename="../gui/traywidget.cpp" line="277"/>
<location filename="../gui/traywidget.cpp" line="119"/>
<location filename="../gui/traywidget.cpp" line="276"/>
<source>New notifications</source>
<translation type="unfinished"></translation>
</message>
@ -245,67 +245,72 @@ 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="224"/>
<location filename="../gui/traywidget.cpp" line="223"/>
<source>Own device ID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="234"/>
<location filename="../gui/traywidget.cpp" line="233"/>
<source>device ID is unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="242"/>
<location filename="../gui/traywidget.cpp" line="241"/>
<source>Copy to clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="259"/>
<location filename="../gui/traywidget.cpp" line="258"/>
<source>Log</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="308"/>
<location filename="../gui/traywidget.cpp" line="307"/>
<source>Do you really want to restart Syncthing?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="334"/>
<location filename="../gui/traywidget.cpp" line="333"/>
<source>Not connected to Syncthing, click to connect</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="346"/>
<location filename="../gui/traywidget.cpp" line="345"/>
<source>Pause</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="347"/>
<location filename="../gui/traywidget.cpp" line="346"/>
<source>Syncthing is running, click to pause all devices</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="353"/>
<location filename="../gui/traywidget.cpp" line="352"/>
<source>Continue</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="354"/>
<location filename="../gui/traywidget.cpp" line="353"/>
<source>At least one device is paused, click to resume</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="446"/>
<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="465"/>
<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="457"/>
<location filename="../gui/traywidget.cpp" line="476"/>
<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="550"/>
<location filename="../gui/traywidget.cpp" line="569"/>
<source>Stop</source>
<translation type="unfinished"></translation>
</message>
@ -318,22 +323,22 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../application/main.cpp" line="72"/>
<location filename="../application/main.cpp" line="73"/>
<source>You must configure how to connect to Syncthing when using Syncthing Tray the first time.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../application/main.cpp" line="73"/>
<location filename="../application/main.cpp" line="74"/>
<source>Note that the settings dialog allows importing URL, credentials and API-key from the local Syncthing configuration.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../application/main.cpp" line="80"/>
<location filename="../application/main.cpp" line="81"/>
<source>The system tray is (currently) not available. You could open the tray menu as a regular window using the -w flag, though.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../application/main.cpp" line="86"/>
<location filename="../application/main.cpp" line="87"/>
<source>The Qt libraries have not been built with tray icon support. You could open the tray menu as a regular window using the -w flag, though.</source>
<translation type="unfinished"></translation>
</message>