Make the tray a single instance application
This commit is contained in:
parent
23a4833b6e
commit
e50c006dd7
|
@ -36,6 +36,7 @@ set(SRC_FILES
|
|||
|
||||
set(WIDGETS_HEADER_FILES
|
||||
application/settings.h
|
||||
application/singleinstance.h
|
||||
gui/trayicon.h
|
||||
gui/traywidget.h
|
||||
gui/traymenu.h
|
||||
|
@ -54,6 +55,7 @@ set(WIDGETS_HEADER_FILES
|
|||
set(WIDGETS_SRC_FILES
|
||||
application/main.cpp
|
||||
application/settings.cpp
|
||||
application/singleinstance.cpp
|
||||
gui/trayicon.cpp
|
||||
gui/traywidget.cpp
|
||||
gui/traymenu.cpp
|
||||
|
|
|
@ -10,7 +10,7 @@ support
|
|||
* Openbox/qt5ct/Tint2
|
||||
* Cinnamon
|
||||
* Windows 10
|
||||
* Can be shown as regular window if tray icon support is not available
|
||||
* Can be shown as regular window if tray icon support is not available
|
||||
|
||||
## Features
|
||||
* Provides quick access to most frequently used features but does not intend to replace the official web UI
|
||||
|
@ -54,6 +54,12 @@ The tray is still under development; the following features are planned:
|
|||
### Web view (dark color theme)
|
||||
![Web view](/resources/screenshots/webview.png?raw=true)
|
||||
|
||||
## Hotkey for Web UI
|
||||
To create a hotkey for the web UI, you can use the same approach as for any other
|
||||
application. Just add `--webui` to the arguments to trigger the web UI.
|
||||
Syncthing Tray ensures that no second instance will be spawned if it is already
|
||||
running.
|
||||
|
||||
## Download / binary repository
|
||||
I currently provide packages for Arch Linux and Windows. Sources for those packages can be found in a
|
||||
separate [repository](https://github.com/Martchus/PKGBUILDs). For binaries checkout my
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
#include "./settings.h"
|
||||
#include "./singleinstance.h"
|
||||
|
||||
#include "../gui/trayicon.h"
|
||||
#include "../gui/traywidget.h"
|
||||
|
||||
#include "../data/syncthingprocess.h"
|
||||
|
||||
#include "resources/config.h"
|
||||
|
@ -24,69 +27,101 @@ using namespace ApplicationUtilities;
|
|||
using namespace QtGui;
|
||||
using namespace Data;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
int initSyncthingTray(bool windowed, bool waitForTray)
|
||||
{
|
||||
SET_APPLICATION_INFO;
|
||||
if(windowed) {
|
||||
if(Settings::launchSynchting()) {
|
||||
syncthingProcess().startSyncthing();
|
||||
}
|
||||
auto *trayWidget = new TrayWidget;
|
||||
trayWidget->setAttribute(Qt::WA_DeleteOnClose);
|
||||
trayWidget->show();
|
||||
} else {
|
||||
#ifndef QT_NO_SYSTEMTRAYICON
|
||||
if(QSystemTrayIcon::isSystemTrayAvailable() || waitForTray) {
|
||||
if(Settings::launchSynchting()) {
|
||||
syncthingProcess().startSyncthing();
|
||||
}
|
||||
auto *trayIcon = new TrayIcon;
|
||||
trayIcon->show();
|
||||
if(Settings::firstLaunch()) {
|
||||
QMessageBox msgBox;
|
||||
msgBox.setIcon(QMessageBox::Information);
|
||||
msgBox.setText(QCoreApplication::translate("main", "You must configure how to connect to Syncthing when using Syncthing Tray the first time."));
|
||||
msgBox.setInformativeText(QCoreApplication::translate("main", "Note that the settings dialog allows importing URL, credentials and API-key from the local Syncthing configuration."));
|
||||
msgBox.exec();
|
||||
trayIcon->trayMenu().widget()->showSettingsDialog();
|
||||
}
|
||||
} else {
|
||||
QMessageBox::critical(nullptr, QApplication::applicationName(), QApplication::translate("main", "The system tray is (currently) not available. You could open the tray menu as a regular window using the -w flag, though."));
|
||||
return -1;
|
||||
}
|
||||
#else
|
||||
QMessageBox::critical(nullptr, QApplication::applicationName(), QApplication::translate("main", "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."));
|
||||
return -2;
|
||||
#endif
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int runApplication(int argc, const char *const *argv)
|
||||
{
|
||||
static bool firstRun = true;
|
||||
|
||||
// setup argument parser
|
||||
SET_APPLICATION_INFO;
|
||||
ArgumentParser parser;
|
||||
HelpArgument helpArg(parser);
|
||||
// Qt configuration arguments
|
||||
QT_CONFIG_ARGUMENTS qtConfigArgs;
|
||||
Argument windowedArg("windowed", 'w', "opens the tray menu as a regular window");
|
||||
windowedArg.setCombinable(true);
|
||||
Argument showWebUi("webui", '\0', "instantly shows the web UI - meant for creating shortcut to web UI");
|
||||
showWebUi.setCombinable(true);
|
||||
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);
|
||||
qtConfigArgs.qtWidgetsGuiArg().addSubArgument(&windowedArg);
|
||||
qtConfigArgs.qtWidgetsGuiArg().addSubArgument(&showWebUi);
|
||||
qtConfigArgs.qtWidgetsGuiArg().addSubArgument(&waitForTrayArg);
|
||||
parser.setMainArguments({&qtConfigArgs.qtWidgetsGuiArg(), &helpArg});
|
||||
try {
|
||||
parser.parseArgs(argc, argv);
|
||||
if(qtConfigArgs.qtWidgetsGuiArg().isPresent()) {
|
||||
SET_QT_APPLICATION_INFO;
|
||||
QApplication application(argc, argv);
|
||||
Settings::restore();
|
||||
Settings::qtSettings().apply();
|
||||
qtConfigArgs.applySettings(true);
|
||||
LOAD_QT_TRANSLATIONS;
|
||||
QtUtilitiesResources::init();
|
||||
int res;
|
||||
if(windowedArg.isPresent()) {
|
||||
if(Settings::launchSynchting()) {
|
||||
syncthingProcess().startSyncthing();
|
||||
}
|
||||
TrayWidget trayWidget;
|
||||
trayWidget.show();
|
||||
res = application.exec();
|
||||
} else {
|
||||
#ifndef QT_NO_SYSTEMTRAYICON
|
||||
if(QSystemTrayIcon::isSystemTrayAvailable() || waitForTrayArg.isPresent()) {
|
||||
if(Settings::launchSynchting()) {
|
||||
syncthingProcess().startSyncthing();
|
||||
}
|
||||
application.setQuitOnLastWindowClosed(false);
|
||||
TrayIcon trayIcon;
|
||||
trayIcon.show();
|
||||
if(Settings::firstLaunch()) {
|
||||
QMessageBox msgBox;
|
||||
msgBox.setIcon(QMessageBox::Information);
|
||||
msgBox.setText(QCoreApplication::translate("main", "You must configure how to connect to Syncthing when using Syncthing Tray the first time."));
|
||||
msgBox.setInformativeText(QCoreApplication::translate("main", "Note that the settings dialog allows importing URL, credentials and API-key from the local Syncthing configuration."));
|
||||
msgBox.exec();
|
||||
trayIcon.trayMenu().widget()->showSettingsDialog();
|
||||
if(firstRun) {
|
||||
firstRun = false;
|
||||
|
||||
SET_QT_APPLICATION_INFO;
|
||||
QApplication application(argc, const_cast<char **>(argv));
|
||||
QGuiApplication::setQuitOnLastWindowClosed(false);
|
||||
SingleInstance singleInstance(argc, argv);
|
||||
QObject::connect(&singleInstance, &SingleInstance::newInstance, &runApplication);
|
||||
|
||||
Settings::restore();
|
||||
Settings::qtSettings().apply();
|
||||
qtConfigArgs.applySettings(true);
|
||||
|
||||
LOAD_QT_TRANSLATIONS;
|
||||
QtUtilitiesResources::init();
|
||||
|
||||
int res = initSyncthingTray(windowedArg.isPresent(), waitForTrayArg.isPresent());
|
||||
if(!res) {
|
||||
if(!TrayWidget::instances().empty() && showWebUi.isPresent()) {
|
||||
TrayWidget::instances().front()->showWebUi();
|
||||
}
|
||||
res = application.exec();
|
||||
} else {
|
||||
QMessageBox::critical(nullptr, QApplication::applicationName(), QApplication::translate("main", "The system tray is (currently) not available. You could open the tray menu as a regular window using the -w flag, though."));
|
||||
res = -1;
|
||||
}
|
||||
#else
|
||||
QMessageBox::critical(nullptr, QApplication::applicationName(), QApplication::translate("main", "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."));
|
||||
res = -2;
|
||||
#endif
|
||||
|
||||
Settings::save();
|
||||
QtUtilitiesResources::cleanup();
|
||||
return res;
|
||||
} else {
|
||||
if(!TrayWidget::instances().empty() && showWebUi.isPresent()) {
|
||||
// if --webui is present don't create a new tray icon, just show the web UI one of the present ones
|
||||
TrayWidget::instances().front()->showWebUi();
|
||||
} else {
|
||||
return initSyncthingTray(windowedArg.isPresent(), waitForTrayArg.isPresent());
|
||||
}
|
||||
}
|
||||
Settings::save();
|
||||
QtUtilitiesResources::cleanup();
|
||||
return res;
|
||||
}
|
||||
} catch(const Failure &ex) {
|
||||
CMD_UTILS_START_CONSOLE;
|
||||
|
@ -96,3 +131,8 @@ int main(int argc, char *argv[])
|
|||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
return runApplication(argc, argv);
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,97 @@
|
|||
#include "./singleinstance.h"
|
||||
|
||||
#include <c++utilities/misc/memory.h>
|
||||
#include <c++utilities/conversion/binaryconversion.h>
|
||||
|
||||
#include <QLocalServer>
|
||||
#include <QLocalSocket>
|
||||
#include <QStringBuilder>
|
||||
#include <QCoreApplication>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
using namespace ConversionUtilities;
|
||||
|
||||
namespace QtGui {
|
||||
|
||||
SingleInstance::SingleInstance(int argc, const char *const *argv, QObject *parent) :
|
||||
QObject(parent),
|
||||
m_server(nullptr)
|
||||
{
|
||||
const QString appId(QCoreApplication::applicationName() % QStringLiteral(" by ") % QCoreApplication::organizationName());
|
||||
|
||||
// check for previous instance
|
||||
QLocalSocket socket;
|
||||
socket.connectToServer(appId, QLocalSocket::ReadWrite);
|
||||
if(socket.waitForConnected(1000)) {
|
||||
cerr << "Info: Application already running, sending args to previous instance" << endl;
|
||||
if(argc >= 0 && argc <= 0xFFFF) {
|
||||
char buffer[2];
|
||||
BE::getBytes(static_cast<uint16>(argc), buffer);
|
||||
socket.write(buffer, 2);
|
||||
*buffer = '\0';
|
||||
for(const char *const *end = argv + argc; argv != end; ++argv) {
|
||||
socket.write(*argv);
|
||||
socket.write(buffer, 1);
|
||||
}
|
||||
} else {
|
||||
cerr << "Error: Unable to pass the specified number of arguments" << endl;
|
||||
}
|
||||
socket.flush();
|
||||
socket.close();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
// no previous instance running
|
||||
// -> however, previous server instance might not have been cleaned up dute to crash
|
||||
QLocalServer::removeServer(appId);
|
||||
// -> start server
|
||||
m_server = new QLocalServer(this);
|
||||
connect(m_server, &QLocalServer::newConnection, this, &SingleInstance::handleNewConnection);
|
||||
if(!m_server->listen(appId)) {
|
||||
cerr << "Error: Unable to launch as single instance application" << endl;
|
||||
}
|
||||
}
|
||||
|
||||
void SingleInstance::handleNewConnection()
|
||||
{
|
||||
QLocalSocket *socket = m_server->nextPendingConnection();
|
||||
connect(socket, &QLocalSocket::readChannelFinished, this, &SingleInstance::readArgs);
|
||||
}
|
||||
|
||||
void SingleInstance::readArgs()
|
||||
{
|
||||
auto *socket = static_cast<QLocalSocket *>(sender());
|
||||
|
||||
// check arg data size
|
||||
const auto argDataSize = socket->bytesAvailable();
|
||||
if(argDataSize < 2 && argDataSize > (1024 * 1024)) {
|
||||
cerr << "Error: Another application instance sent invalid argument data." << endl;
|
||||
return;
|
||||
}
|
||||
|
||||
// read arg data
|
||||
auto argData = make_unique<char[]>(static_cast<size_t>(argDataSize));
|
||||
socket->read(argData.get(), argDataSize);
|
||||
socket->close();
|
||||
socket->deleteLater();
|
||||
|
||||
// reconstruct argc argv array
|
||||
uint16 argc = BE::toUInt16(argData.get());
|
||||
vector<const char *> args;
|
||||
args.reserve(argc + 1);
|
||||
for(const char *argv = argData.get() + 2, *end = argData.get() + argDataSize, *i = argv; i != end && *argv;) {
|
||||
if(!*i) {
|
||||
args.push_back(argv);
|
||||
argv = ++i;
|
||||
} else {
|
||||
++i;
|
||||
}
|
||||
}
|
||||
args.push_back(nullptr);
|
||||
|
||||
emit newInstance(static_cast<int>(argc), args.data());
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
#ifndef SINGLEINSTANCE_H
|
||||
#define SINGLEINSTANCE_H
|
||||
|
||||
#include <QObject>
|
||||
|
||||
QT_FORWARD_DECLARE_CLASS(QLocalServer)
|
||||
|
||||
namespace Data {
|
||||
struct SyncthingDir;
|
||||
}
|
||||
|
||||
namespace QtGui {
|
||||
|
||||
class SingleInstance : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
SingleInstance(int argc, const char *const *argv, QObject *parent = nullptr);
|
||||
|
||||
Q_SIGNALS:
|
||||
void newInstance(int argc, const char *const *argv);
|
||||
|
||||
private Q_SLOTS:
|
||||
void handleNewConnection();
|
||||
void readArgs();
|
||||
|
||||
private:
|
||||
QLocalServer *m_server;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // SINGLEINSTANCE_H
|
|
@ -29,7 +29,9 @@ void SyncthingProcess::restartSyncthing()
|
|||
|
||||
void SyncthingProcess::startSyncthing()
|
||||
{
|
||||
start(Settings::syncthingPath() % QChar(' ') % Settings::syncthingArgs(), QProcess::ReadOnly);
|
||||
if(state() == QProcess::NotRunning) {
|
||||
start(Settings::syncthingPath() % QChar(' ') % Settings::syncthingArgs(), QProcess::ReadOnly);
|
||||
}
|
||||
}
|
||||
|
||||
void SyncthingProcess::handleFinished(int exitCode, QProcess::ExitStatus exitStatus)
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
#include <qtutilities/misc/dialogutils.h>
|
||||
|
||||
#include <QCoreApplication>
|
||||
#include <QApplication>
|
||||
#include <QSvgRenderer>
|
||||
#include <QPainter>
|
||||
#include <QPixmap>
|
||||
|
@ -28,6 +28,7 @@ TrayIcon::TrayIcon(QObject *parent) :
|
|||
m_statusIconNotify(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-notify.svg")))),
|
||||
m_statusIconPause(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-pause.svg")))),
|
||||
m_statusIconSync(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-sync.svg")))),
|
||||
m_trayMenu(this),
|
||||
m_status(SyncthingStatus::Disconnected)
|
||||
{
|
||||
// set context menu
|
||||
|
@ -37,7 +38,7 @@ TrayIcon::TrayIcon(QObject *parent) :
|
|||
m_contextMenu.addMenu(m_trayMenu.widget()->connectionsMenu());
|
||||
connect(m_contextMenu.addAction(QIcon::fromTheme(QStringLiteral("help-about"), QIcon(QStringLiteral(":/icons/hicolor/scalable/apps/help-about.svg"))), tr("About")), &QAction::triggered, m_trayMenu.widget(), &TrayWidget::showAboutDialog);
|
||||
m_contextMenu.addSeparator();
|
||||
connect(m_contextMenu.addAction(QIcon::fromTheme(QStringLiteral("window-close"), QIcon(QStringLiteral(":/icons/hicolor/scalable/actions/window-close.svg"))), tr("Close")), &QAction::triggered, &QCoreApplication::quit);
|
||||
connect(m_contextMenu.addAction(QIcon::fromTheme(QStringLiteral("window-close"), QIcon(QStringLiteral(":/icons/hicolor/scalable/actions/window-close.svg"))), tr("Close")), &QAction::triggered, this, &TrayIcon::deleteLater);
|
||||
setContextMenu(&m_contextMenu);
|
||||
|
||||
// set initial status
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#include "./traymenu.h"
|
||||
#include "./traywidget.h"
|
||||
#include "./trayicon.h"
|
||||
|
||||
#include "../application/settings.h"
|
||||
|
||||
|
@ -7,8 +8,15 @@
|
|||
|
||||
namespace QtGui {
|
||||
|
||||
TrayMenu::TrayMenu(TrayIcon *trayIcon, QWidget *parent) :
|
||||
TrayMenu(parent)
|
||||
{
|
||||
m_trayIcon = trayIcon;
|
||||
}
|
||||
|
||||
TrayMenu::TrayMenu(QWidget *parent) :
|
||||
QMenu(parent)
|
||||
QMenu(parent),
|
||||
m_trayIcon(nullptr)
|
||||
{
|
||||
auto *menuLayout = new QHBoxLayout;
|
||||
menuLayout->setMargin(0), menuLayout->setSpacing(0);
|
||||
|
@ -17,6 +25,11 @@ TrayMenu::TrayMenu(QWidget *parent) :
|
|||
setPlatformMenu(nullptr);
|
||||
}
|
||||
|
||||
TrayMenu::~TrayMenu()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QSize TrayMenu::sizeHint() const
|
||||
{
|
||||
return Settings::trayMenuSize();
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
namespace QtGui {
|
||||
|
||||
class TrayIcon;
|
||||
class TrayWidget;
|
||||
|
||||
class TrayMenu : public QMenu
|
||||
|
@ -12,13 +13,17 @@ class TrayMenu : public QMenu
|
|||
Q_OBJECT
|
||||
|
||||
public:
|
||||
TrayMenu(TrayIcon *trayIcon, QWidget *parent = nullptr);
|
||||
TrayMenu(QWidget *parent = nullptr);
|
||||
~TrayMenu();
|
||||
|
||||
QSize sizeHint() const;
|
||||
TrayWidget *widget();
|
||||
TrayIcon *icon();
|
||||
|
||||
private:
|
||||
TrayWidget *m_trayWidget;
|
||||
TrayIcon *m_trayIcon;
|
||||
};
|
||||
|
||||
inline TrayWidget *TrayMenu::widget()
|
||||
|
@ -26,6 +31,11 @@ inline TrayWidget *TrayMenu::widget()
|
|||
return m_trayWidget;
|
||||
}
|
||||
|
||||
inline TrayIcon *TrayMenu::icon()
|
||||
{
|
||||
return m_trayIcon;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif // TRAY_MENU_H
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#include "./traywidget.h"
|
||||
#include "./traymenu.h"
|
||||
#include "./trayicon.h"
|
||||
#include "./settingsdialog.h"
|
||||
#include "./webviewdialog.h"
|
||||
#include "./textviewdialog.h"
|
||||
|
@ -28,6 +29,7 @@
|
|||
#include <QFontDatabase>
|
||||
|
||||
#include <functional>
|
||||
#include <algorithm>
|
||||
|
||||
using namespace ApplicationUtilities;
|
||||
using namespace ConversionUtilities;
|
||||
|
@ -38,6 +40,8 @@ using namespace std;
|
|||
|
||||
namespace QtGui {
|
||||
|
||||
vector<TrayWidget *> TrayWidget::m_instances;
|
||||
|
||||
/*!
|
||||
* \brief Instantiates a new tray widget.
|
||||
*/
|
||||
|
@ -55,6 +59,8 @@ TrayWidget::TrayWidget(TrayMenu *parent) :
|
|||
m_dlModel(m_connection),
|
||||
m_selectedConnection(nullptr)
|
||||
{
|
||||
m_instances.push_back(this);
|
||||
|
||||
m_ui->setupUi(this);
|
||||
|
||||
// setup model and view
|
||||
|
@ -105,7 +111,7 @@ TrayWidget::TrayWidget(TrayMenu *parent) :
|
|||
|
||||
// connect signals and slots
|
||||
connect(m_ui->statusPushButton, &QPushButton::clicked, this, &TrayWidget::changeStatus);
|
||||
connect(m_ui->closePushButton, &QPushButton::clicked, &QCoreApplication::quit);
|
||||
connect(m_ui->closePushButton, &QPushButton::clicked, this, &TrayWidget::quitTray);
|
||||
connect(m_ui->aboutPushButton, &QPushButton::clicked, this, &TrayWidget::showAboutDialog);
|
||||
connect(m_ui->webUiPushButton, &QPushButton::clicked, this, &TrayWidget::showWebUi);
|
||||
connect(m_ui->settingsPushButton, &QPushButton::clicked, this, &TrayWidget::showSettingsDialog);
|
||||
|
@ -126,7 +132,15 @@ TrayWidget::TrayWidget(TrayMenu *parent) :
|
|||
}
|
||||
|
||||
TrayWidget::~TrayWidget()
|
||||
{}
|
||||
{
|
||||
auto i = std::find(m_instances.begin(), m_instances.end(), this);
|
||||
if(i != m_instances.end()) {
|
||||
m_instances.erase(i);
|
||||
}
|
||||
if(m_instances.empty()) {
|
||||
QCoreApplication::quit();
|
||||
}
|
||||
}
|
||||
|
||||
void TrayWidget::showSettingsDialog()
|
||||
{
|
||||
|
@ -228,6 +242,21 @@ void TrayWidget::showNotifications()
|
|||
m_ui->notificationsPushButton->setHidden(true);
|
||||
}
|
||||
|
||||
void TrayWidget::quitTray()
|
||||
{
|
||||
QObject *parent;
|
||||
if(m_menu) {
|
||||
if(m_menu->icon()) {
|
||||
parent = m_menu->icon();
|
||||
} else {
|
||||
parent = m_menu;
|
||||
}
|
||||
} else {
|
||||
parent = this;
|
||||
}
|
||||
parent->deleteLater();
|
||||
}
|
||||
|
||||
void TrayWidget::handleStatusChanged(SyncthingStatus status)
|
||||
{
|
||||
switch(status) {
|
||||
|
|
|
@ -46,6 +46,7 @@ public:
|
|||
|
||||
Data::SyncthingConnection &connection();
|
||||
QMenu *connectionsMenu();
|
||||
static const std::vector<TrayWidget *> &instances();
|
||||
|
||||
public slots:
|
||||
void showSettingsDialog();
|
||||
|
@ -54,6 +55,7 @@ public slots:
|
|||
void showOwnDeviceId();
|
||||
void showLog();
|
||||
void showNotifications();
|
||||
void quitTray();
|
||||
|
||||
private slots:
|
||||
void handleStatusChanged(Data::SyncthingStatus status);
|
||||
|
@ -88,6 +90,7 @@ private:
|
|||
QActionGroup *m_connectionsActionGroup;
|
||||
Settings::ConnectionSettings *m_selectedConnection;
|
||||
std::vector<Data::SyncthingLogEntry> m_notifications;
|
||||
static std::vector<TrayWidget *> m_instances;
|
||||
};
|
||||
|
||||
inline Data::SyncthingConnection &TrayWidget::connection()
|
||||
|
@ -100,6 +103,11 @@ inline QMenu *TrayWidget::connectionsMenu()
|
|||
return m_connectionsMenu;
|
||||
}
|
||||
|
||||
inline const std::vector<TrayWidget *> &TrayWidget::instances()
|
||||
{
|
||||
return m_instances;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif // TRAY_WIDGET_H
|
||||
|
|
|
@ -4,145 +4,145 @@
|
|||
<context>
|
||||
<name>Data::SyncthingConnection</name>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="172"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="170"/>
|
||||
<source>disconnected</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="174"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="172"/>
|
||||
<source>reconnecting</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="176"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="174"/>
|
||||
<source>connected</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="178"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="176"/>
|
||||
<source>connected, notifications available</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="180"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="178"/>
|
||||
<source>connected, paused</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="182"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="180"/>
|
||||
<source>connected, synchronizing</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="184"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="182"/>
|
||||
<source>unknown</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="196"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="276"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="194"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="274"/>
|
||||
<source>Connection configuration is insufficient.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="556"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="554"/>
|
||||
<source>Unable to parse Syncthing log: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="560"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="558"/>
|
||||
<source>Unable to request system log: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="582"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="580"/>
|
||||
<source>Unable to locate certificate used by Syncthing GUI.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="588"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="586"/>
|
||||
<source>Unable to load certificate used by Syncthing GUI.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="621"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="723"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="619"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="721"/>
|
||||
<source>Unable to parse Syncthing config: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="627"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="729"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="625"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="727"/>
|
||||
<source>Unable to request Syncthing config: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="804"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="802"/>
|
||||
<source>Unable to parse connections: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="810"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="808"/>
|
||||
<source>Unable to request connections: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="865"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="863"/>
|
||||
<source>Unable to parse directory statistics: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="871"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="869"/>
|
||||
<source>Unable to request directory statistics: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="908"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="906"/>
|
||||
<source>Unable to parse device statistics: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="914"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="912"/>
|
||||
<source>Unable to request device statistics: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="949"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="947"/>
|
||||
<source>Unable to parse errors: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="960"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="958"/>
|
||||
<source>Unable to request errors: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="1011"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="1009"/>
|
||||
<source>Unable to parse Syncthing events: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="1030"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="1028"/>
|
||||
<source>Unable to request Syncthing events: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="1272"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="1265"/>
|
||||
<source>Unable to request rescan: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="1287"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="1280"/>
|
||||
<source>Unable to request pause/resume: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="1302"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="1295"/>
|
||||
<source>Unable to request restart: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="527"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="525"/>
|
||||
<source>Unable to request QR-Code: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
@ -769,82 +769,82 @@
|
|||
<context>
|
||||
<name>QtGui::TrayIcon</name>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="34"/>
|
||||
<location filename="../gui/trayicon.cpp" line="35"/>
|
||||
<source>Web UI</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="35"/>
|
||||
<location filename="../gui/trayicon.cpp" line="36"/>
|
||||
<source>Settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="36"/>
|
||||
<location filename="../gui/trayicon.cpp" line="37"/>
|
||||
<source>Rescan all</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="38"/>
|
||||
<location filename="../gui/trayicon.cpp" line="39"/>
|
||||
<source>About</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="40"/>
|
||||
<location filename="../gui/trayicon.cpp" line="41"/>
|
||||
<source>Close</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="85"/>
|
||||
<location filename="../gui/trayicon.cpp" line="86"/>
|
||||
<source>Error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="92"/>
|
||||
<location filename="../gui/trayicon.cpp" line="93"/>
|
||||
<source>Syncthing notification - click to dismiss</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="101"/>
|
||||
<location filename="../gui/trayicon.cpp" line="102"/>
|
||||
<source>Not connected to Syncthing</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="103"/>
|
||||
<location filename="../gui/trayicon.cpp" line="104"/>
|
||||
<source>Disconnected from Syncthing</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="108"/>
|
||||
<location filename="../gui/trayicon.cpp" line="109"/>
|
||||
<source>Reconnecting ...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="112"/>
|
||||
<location filename="../gui/trayicon.cpp" line="113"/>
|
||||
<source>Syncthing is idling</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="116"/>
|
||||
<location filename="../gui/trayicon.cpp" line="117"/>
|
||||
<source>Syncthing is scanning</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="120"/>
|
||||
<location filename="../gui/trayicon.cpp" line="121"/>
|
||||
<source>Notifications available</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="124"/>
|
||||
<location filename="../gui/trayicon.cpp" line="125"/>
|
||||
<source>At least one device is paused</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="128"/>
|
||||
<location filename="../gui/trayicon.cpp" line="129"/>
|
||||
<source>Synchronization is ongoing</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="138"/>
|
||||
<location filename="../gui/trayicon.cpp" line="139"/>
|
||||
<source>Synchronization complete</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
@ -858,7 +858,7 @@
|
|||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.ui" line="107"/>
|
||||
<location filename="../gui/traywidget.cpp" line="235"/>
|
||||
<location filename="../gui/traywidget.cpp" line="264"/>
|
||||
<source>Connect</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
@ -896,7 +896,7 @@ For <i>all</i> notifications, checkout the log</source>
|
|||
<message>
|
||||
<location filename="../gui/traywidget.ui" line="230"/>
|
||||
<location filename="../gui/traywidget.ui" line="250"/>
|
||||
<location filename="../gui/traywidget.cpp" line="371"/>
|
||||
<location filename="../gui/traywidget.cpp" line="400"/>
|
||||
<source>unknown</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
@ -922,7 +922,7 @@ For <i>all</i> notifications, checkout the log</source>
|
|||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.ui" line="80"/>
|
||||
<location filename="../gui/traywidget.cpp" line="145"/>
|
||||
<location filename="../gui/traywidget.cpp" line="159"/>
|
||||
<source>About</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
@ -937,88 +937,88 @@ For <i>all</i> notifications, checkout the log</source>
|
|||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="72"/>
|
||||
<location filename="../gui/traywidget.cpp" line="78"/>
|
||||
<source>View own device ID</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="87"/>
|
||||
<location filename="../gui/traywidget.cpp" line="93"/>
|
||||
<source>Rescan all directories</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="82"/>
|
||||
<location filename="../gui/traywidget.cpp" line="88"/>
|
||||
<source>Show Syncthing log</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="77"/>
|
||||
<location filename="../gui/traywidget.cpp" line="83"/>
|
||||
<source>Restart Syncthing</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="94"/>
|
||||
<location filename="../gui/traywidget.cpp" line="100"/>
|
||||
<source>Connection</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="185"/>
|
||||
<location filename="../gui/traywidget.cpp" line="199"/>
|
||||
<source>device ID is unknown</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="193"/>
|
||||
<location filename="../gui/traywidget.cpp" line="207"/>
|
||||
<source>Copy to clipboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.ui" line="276"/>
|
||||
<location filename="../gui/traywidget.cpp" line="221"/>
|
||||
<location filename="../gui/traywidget.cpp" line="235"/>
|
||||
<source>New notifications</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="236"/>
|
||||
<location filename="../gui/traywidget.cpp" line="265"/>
|
||||
<source>Not connected to Syncthing, click to connect</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="248"/>
|
||||
<location filename="../gui/traywidget.cpp" line="277"/>
|
||||
<source>Pause</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="249"/>
|
||||
<location filename="../gui/traywidget.cpp" line="278"/>
|
||||
<source>Syncthing is running, click to pause all devices</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="255"/>
|
||||
<location filename="../gui/traywidget.cpp" line="284"/>
|
||||
<source>At least one device is paused, click to resume</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="319"/>
|
||||
<location filename="../gui/traywidget.cpp" line="348"/>
|
||||
<source>The directory <i>%1</i> does not exist on the local machine.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="328"/>
|
||||
<location filename="../gui/traywidget.cpp" line="357"/>
|
||||
<source>The file <i>%1</i> does not exist on the local machine.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="254"/>
|
||||
<location filename="../gui/traywidget.cpp" line="283"/>
|
||||
<source>Continue</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="175"/>
|
||||
<location filename="../gui/traywidget.cpp" line="189"/>
|
||||
<source>Own device ID</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="207"/>
|
||||
<location filename="../gui/traywidget.cpp" line="221"/>
|
||||
<source>Log</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
@ -1082,22 +1082,22 @@ The Web UI will be opened in the default web browser instead.</source>
|
|||
<context>
|
||||
<name>main</name>
|
||||
<message>
|
||||
<location filename="../application/main.cpp" line="72"/>
|
||||
<location filename="../application/main.cpp" line="50"/>
|
||||
<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="51"/>
|
||||
<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="79"/>
|
||||
<location filename="../application/main.cpp" line="56"/>
|
||||
<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="83"/>
|
||||
<location filename="../application/main.cpp" line="60"/>
|
||||
<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>
|
||||
|
|
|
@ -4,145 +4,145 @@
|
|||
<context>
|
||||
<name>Data::SyncthingConnection</name>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="172"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="170"/>
|
||||
<source>disconnected</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="174"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="172"/>
|
||||
<source>reconnecting</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="176"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="174"/>
|
||||
<source>connected</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="178"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="176"/>
|
||||
<source>connected, notifications available</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="180"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="178"/>
|
||||
<source>connected, paused</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="182"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="180"/>
|
||||
<source>connected, synchronizing</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="184"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="182"/>
|
||||
<source>unknown</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="196"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="276"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="194"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="274"/>
|
||||
<source>Connection configuration is insufficient.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="556"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="554"/>
|
||||
<source>Unable to parse Syncthing log: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="560"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="558"/>
|
||||
<source>Unable to request system log: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="582"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="580"/>
|
||||
<source>Unable to locate certificate used by Syncthing GUI.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="588"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="586"/>
|
||||
<source>Unable to load certificate used by Syncthing GUI.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="621"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="723"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="619"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="721"/>
|
||||
<source>Unable to parse Syncthing config: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="627"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="729"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="625"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="727"/>
|
||||
<source>Unable to request Syncthing config: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="804"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="802"/>
|
||||
<source>Unable to parse connections: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="810"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="808"/>
|
||||
<source>Unable to request connections: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="865"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="863"/>
|
||||
<source>Unable to parse directory statistics: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="871"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="869"/>
|
||||
<source>Unable to request directory statistics: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="908"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="906"/>
|
||||
<source>Unable to parse device statistics: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="914"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="912"/>
|
||||
<source>Unable to request device statistics: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="949"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="947"/>
|
||||
<source>Unable to parse errors: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="960"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="958"/>
|
||||
<source>Unable to request errors: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="1011"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="1009"/>
|
||||
<source>Unable to parse Syncthing events: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="1030"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="1028"/>
|
||||
<source>Unable to request Syncthing events: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="1272"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="1265"/>
|
||||
<source>Unable to request rescan: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="1287"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="1280"/>
|
||||
<source>Unable to request pause/resume: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="1302"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="1295"/>
|
||||
<source>Unable to request restart: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../data/syncthingconnection.cpp" line="527"/>
|
||||
<location filename="../data/syncthingconnection.cpp" line="525"/>
|
||||
<source>Unable to request QR-Code: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
@ -769,82 +769,82 @@
|
|||
<context>
|
||||
<name>QtGui::TrayIcon</name>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="34"/>
|
||||
<location filename="../gui/trayicon.cpp" line="35"/>
|
||||
<source>Web UI</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="35"/>
|
||||
<location filename="../gui/trayicon.cpp" line="36"/>
|
||||
<source>Settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="36"/>
|
||||
<location filename="../gui/trayicon.cpp" line="37"/>
|
||||
<source>Rescan all</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="38"/>
|
||||
<location filename="../gui/trayicon.cpp" line="39"/>
|
||||
<source>About</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="40"/>
|
||||
<location filename="../gui/trayicon.cpp" line="41"/>
|
||||
<source>Close</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="85"/>
|
||||
<location filename="../gui/trayicon.cpp" line="86"/>
|
||||
<source>Error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="92"/>
|
||||
<location filename="../gui/trayicon.cpp" line="93"/>
|
||||
<source>Syncthing notification - click to dismiss</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="101"/>
|
||||
<location filename="../gui/trayicon.cpp" line="102"/>
|
||||
<source>Not connected to Syncthing</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="103"/>
|
||||
<location filename="../gui/trayicon.cpp" line="104"/>
|
||||
<source>Disconnected from Syncthing</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="108"/>
|
||||
<location filename="../gui/trayicon.cpp" line="109"/>
|
||||
<source>Reconnecting ...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="112"/>
|
||||
<location filename="../gui/trayicon.cpp" line="113"/>
|
||||
<source>Syncthing is idling</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="116"/>
|
||||
<location filename="../gui/trayicon.cpp" line="117"/>
|
||||
<source>Syncthing is scanning</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="120"/>
|
||||
<location filename="../gui/trayicon.cpp" line="121"/>
|
||||
<source>Notifications available</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="124"/>
|
||||
<location filename="../gui/trayicon.cpp" line="125"/>
|
||||
<source>At least one device is paused</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="128"/>
|
||||
<location filename="../gui/trayicon.cpp" line="129"/>
|
||||
<source>Synchronization is ongoing</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/trayicon.cpp" line="138"/>
|
||||
<location filename="../gui/trayicon.cpp" line="139"/>
|
||||
<source>Synchronization complete</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
@ -858,7 +858,7 @@
|
|||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.ui" line="107"/>
|
||||
<location filename="../gui/traywidget.cpp" line="235"/>
|
||||
<location filename="../gui/traywidget.cpp" line="264"/>
|
||||
<source>Connect</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
@ -896,7 +896,7 @@ For <i>all</i> notifications, checkout the log</source>
|
|||
<message>
|
||||
<location filename="../gui/traywidget.ui" line="230"/>
|
||||
<location filename="../gui/traywidget.ui" line="250"/>
|
||||
<location filename="../gui/traywidget.cpp" line="371"/>
|
||||
<location filename="../gui/traywidget.cpp" line="400"/>
|
||||
<source>unknown</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
@ -922,7 +922,7 @@ For <i>all</i> notifications, checkout the log</source>
|
|||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.ui" line="80"/>
|
||||
<location filename="../gui/traywidget.cpp" line="145"/>
|
||||
<location filename="../gui/traywidget.cpp" line="159"/>
|
||||
<source>About</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
@ -937,88 +937,88 @@ For <i>all</i> notifications, checkout the log</source>
|
|||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="72"/>
|
||||
<location filename="../gui/traywidget.cpp" line="78"/>
|
||||
<source>View own device ID</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="87"/>
|
||||
<location filename="../gui/traywidget.cpp" line="93"/>
|
||||
<source>Rescan all directories</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="82"/>
|
||||
<location filename="../gui/traywidget.cpp" line="88"/>
|
||||
<source>Show Syncthing log</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="77"/>
|
||||
<location filename="../gui/traywidget.cpp" line="83"/>
|
||||
<source>Restart Syncthing</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="94"/>
|
||||
<location filename="../gui/traywidget.cpp" line="100"/>
|
||||
<source>Connection</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="185"/>
|
||||
<location filename="../gui/traywidget.cpp" line="199"/>
|
||||
<source>device ID is unknown</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="193"/>
|
||||
<location filename="../gui/traywidget.cpp" line="207"/>
|
||||
<source>Copy to clipboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.ui" line="276"/>
|
||||
<location filename="../gui/traywidget.cpp" line="221"/>
|
||||
<location filename="../gui/traywidget.cpp" line="235"/>
|
||||
<source>New notifications</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="236"/>
|
||||
<location filename="../gui/traywidget.cpp" line="265"/>
|
||||
<source>Not connected to Syncthing, click to connect</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="248"/>
|
||||
<location filename="../gui/traywidget.cpp" line="277"/>
|
||||
<source>Pause</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="249"/>
|
||||
<location filename="../gui/traywidget.cpp" line="278"/>
|
||||
<source>Syncthing is running, click to pause all devices</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="255"/>
|
||||
<location filename="../gui/traywidget.cpp" line="284"/>
|
||||
<source>At least one device is paused, click to resume</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="319"/>
|
||||
<location filename="../gui/traywidget.cpp" line="348"/>
|
||||
<source>The directory <i>%1</i> does not exist on the local machine.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="328"/>
|
||||
<location filename="../gui/traywidget.cpp" line="357"/>
|
||||
<source>The file <i>%1</i> does not exist on the local machine.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="254"/>
|
||||
<location filename="../gui/traywidget.cpp" line="283"/>
|
||||
<source>Continue</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="175"/>
|
||||
<location filename="../gui/traywidget.cpp" line="189"/>
|
||||
<source>Own device ID</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/traywidget.cpp" line="207"/>
|
||||
<location filename="../gui/traywidget.cpp" line="221"/>
|
||||
<source>Log</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
@ -1082,22 +1082,22 @@ The Web UI will be opened in the default web browser instead.</source>
|
|||
<context>
|
||||
<name>main</name>
|
||||
<message>
|
||||
<location filename="../application/main.cpp" line="72"/>
|
||||
<location filename="../application/main.cpp" line="50"/>
|
||||
<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="51"/>
|
||||
<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="79"/>
|
||||
<location filename="../application/main.cpp" line="56"/>
|
||||
<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="83"/>
|
||||
<location filename="../application/main.cpp" line="60"/>
|
||||
<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>
|
||||
|
|
Loading…
Reference in New Issue