Add fallback icons, show traffic

This commit is contained in:
Martchus 2016-08-29 20:51:30 +02:00
parent 2630e51887
commit b3760eb494
38 changed files with 906 additions and 200 deletions

View File

@ -55,6 +55,7 @@ set(WIDGETS_UI_FILES
gui/traywidget.ui
gui/connectionoptionpage.ui
gui/notificationsoptionpage.ui
gui/appearanceoptionpage.ui
gui/launcheroptionpage.ui
gui/webviewoptionpage.ui
)
@ -77,6 +78,24 @@ set(DOC_FILES
README.md
)
set(REQUIRED_ICONS
network-card
window-close
edit-copy
preferences-other
view-barcode
folder-open
media-playback-start
text-plain
help-about
media-playback-pause
view-refresh
folder
network-server
folder-sync
internet-web-browser
)
# find c++utilities
find_package(c++utilities 4.0.0 REQUIRED)
use_cpp_utilities()

View File

@ -31,7 +31,7 @@ I will provide packages for Arch Linux and Windows when releasing. For more info
## Build instructions
The application depends on [c++utilities](https://github.com/Martchus/cpp-utilities) and [qtutilities](https://github.com/Martchus/qtutilities) and is built the same way as these libaries. For basic instructions checkout the README file of [c++utilities](https://github.com/Martchus/cpp-utilities).
The following Qt 5 modules are requried: core network gui network widgets webenginewidgets/webkitwidgets
The following Qt 5 modules are requried: core network gui widgets webenginewidgets/webkitwidgets
#### Select Qt modules for WebView
* If Qt WebKitWidgets is installed on the system, the tray will link against it. Otherwise it will link against Qt WebEngineWidgets.

View File

@ -56,6 +56,11 @@ bool &showSyncthingNotifications()
static bool v = true;
return v;
}
bool &showTraffic()
{
static bool v = true;
return v;
}
bool &launchSynchting()
{
static bool v = false;
@ -111,7 +116,8 @@ void restore()
notifyOnDisconnect() = settings.value(QStringLiteral("notifyOnDisconnect"), true).toBool();
notifyOnErrors() = settings.value(QStringLiteral("notifyOnErrors"), true).toBool();
notifyOnSyncComplete() = settings.value(QStringLiteral("notifyOnSyncComplete"), true).toBool();
notifyOnSyncComplete() = settings.value(QStringLiteral("showSyncthingNotifications"), true).toBool();
showSyncthingNotifications() = settings.value(QStringLiteral("showSyncthingNotifications"), true).toBool();
showTraffic() = settings.value(QStringLiteral("showTraffic"), true).toBool();
launchSynchting() = settings.value(QStringLiteral("launchSynchting"), false).toBool();
syncthingCommand() = settings.value(QStringLiteral("syncthingCommand"), QStringLiteral("syncthing")).toString();
settings.endGroup();
@ -142,6 +148,7 @@ void save()
settings.setValue(QStringLiteral("notifyOnErrors"), notifyOnErrors());
settings.setValue(QStringLiteral("notifyOnSyncComplete"), notifyOnSyncComplete());
settings.setValue(QStringLiteral("showSyncthingNotifications"), showSyncthingNotifications());
settings.setValue(QStringLiteral("showTraffic"), showTraffic());
settings.setValue(QStringLiteral("launchSynchting"), launchSynchting());
settings.setValue(QStringLiteral("syncthingCommand"), syncthingCommand());
settings.endGroup();

View File

@ -29,6 +29,7 @@ bool &notifyOnDisconnect();
bool &notifyOnErrors();
bool &notifyOnSyncComplete();
bool &showSyncthingNotifications();
bool &showTraffic();
bool &launchSynchting();
QString &syncthingCommand();

View File

@ -26,6 +26,37 @@ QNetworkAccessManager &networkAccessManager()
return networkAccessManager;
}
/*!
* \brief Assigns the status from the specified status string.
* \returns Returns whether the status has actually changed.
*/
bool SyncthingDir::assignStatus(const QString &statusStr)
{
DirStatus newStatus;
if(statusStr == QLatin1String("idle")) {
progressPercentage = 0;
newStatus = DirStatus::Idle;
} else if(statusStr == QLatin1String("scanning")) {
newStatus = DirStatus::Scanning;
} else if(statusStr == QLatin1String("syncing")) {
if(!errors.empty()) {
errors.clear(); // errors become obsolete
status = DirStatus::Unknown; // ensure status changed signal is emitted
}
newStatus = DirStatus::Synchronizing;
} else if(statusStr == QLatin1String("error")) {
progressPercentage = 0;
newStatus = DirStatus::OutOfSync;
} else {
newStatus = DirStatus::Unknown;
}
if(newStatus != status) {
status = newStatus;
return true;
}
return false;
}
/*!
* \class SyncthingConnection
* \brief The SyncthingConnection class allows Qt applications to access Syncthing.
@ -418,8 +449,6 @@ void SyncthingConnection::readDirs(const QJsonArray &dirs)
dirItem.ignorePermissions = dirObj.value(QStringLiteral("ignorePerms")).toBool(false);
dirItem.autoNormalize = dirObj.value(QStringLiteral("autoNormalize")).toBool(false);
dirItem.minDiskFreePercentage = dirObj.value(QStringLiteral("minDiskFreePct")).toInt(-1);
dirItem.status = DirStatus::Unknown;
dirItem.progressPercentage = 0;
m_dirs.emplace_back(move(dirItem));
}
}
@ -446,9 +475,6 @@ void SyncthingConnection::readDevs(const QJsonArray &devs)
devItem.certName = devObj.value(QStringLiteral("certName")).toString();
devItem.introducer = devObj.value(QStringLiteral("introducer")).toBool(false);
devItem.status = devItem.id == m_myId ? DevStatus::OwnDevice : DevStatus::Unknown;
devItem.progressPercentage = 0;
devItem.paused = false;
devItem.totalIncomingTraffic = devItem.totalOutgoingTraffic = 0;
m_devs.push_back(move(devItem));
}
}
@ -518,6 +544,7 @@ void SyncthingConnection::readConnections()
const QJsonObject totalObj(replyObj.value(QStringLiteral("total")).toObject());
m_totalIncomingTraffic = totalObj.value(QStringLiteral("inBytesTotal")).toInt(0);
m_totalOutgoingTraffic = totalObj.value(QStringLiteral("outBytesTotal")).toInt(0);
emit trafficChanged(m_totalIncomingTraffic, m_totalOutgoingTraffic);
const QJsonObject connectionsObj(replyObj.value(QStringLiteral("connections")).toObject());
int index = 0;
for(SyncthingDev &dev : m_devs) {
@ -587,6 +614,10 @@ void SyncthingConnection::readEvents()
readStartingEvent(eventData);
} else if(eventType == QLatin1String("StateChanged")) {
readStatusChangedEvent(eventData);
} else if(eventType == QLatin1String("DownloadProgress")) {
readDownloadProgressEvent(eventData);
} else if(eventType.startsWith(QLatin1String("Folder"))) {
readDirEvent(eventType, eventData);
} else if(eventType.startsWith(QLatin1String("Device"))) {
readDeviceEvent(eventType, eventData);
}
@ -651,24 +682,65 @@ void SyncthingConnection::readStatusChangedEvent(const QJsonObject &eventData)
const QString dir(eventData.value(QStringLiteral("folder")).toString());
if(!dir.isEmpty()) {
// dir status changed
int row;
if(SyncthingDir *dirInfo = findDirInfo(dir, row)) {
const QString statusStr(eventData.value(QStringLiteral("to")).toString());
DirStatus status;
if(statusStr == QLatin1String("idle")) {
status = DirStatus::Idle;
} else if(statusStr == QLatin1String("scanning")) {
status = DirStatus::Scanning;
} else if(statusStr == QLatin1String("syncing")) {
status = DirStatus::Synchronizing;
} else if(statusStr == QLatin1String("error")) {
status = DirStatus::OutOfSync;
} else {
status = DirStatus::Unknown;
int index;
if(SyncthingDir *dirInfo = findDirInfo(dir, index)) {
if(dirInfo->assignStatus(eventData.value(QStringLiteral("to")).toString())) {
emit dirStatusChanged(*dirInfo, index);
}
if(dirInfo->status != status) {
dirInfo->status = status;
emit dirStatusChanged(*dirInfo, row);
}
}
}
/*!
* \brief Reads results of requestEvents().
* \remarks TODO
*/
void SyncthingConnection::readDownloadProgressEvent(const QJsonObject &eventData)
{}
void SyncthingConnection::readDirEvent(const QString &eventType, const QJsonObject &eventData)
{
const QString dir(eventData.value(QStringLiteral("folder")).toString());
if(!dir.isEmpty()) {
int index;
if(SyncthingDir *dirInfo = findDirInfo(dir, index)) {
if(eventType == QLatin1String("FolderErrors")) {
// check for errors
const QJsonArray errors(eventData.value(QStringLiteral("errors")).toArray());
if(!errors.isEmpty()) {
for(const QJsonValue &errorVal : errors) {
const QJsonObject error(errorVal.toObject());
if(!error.isEmpty()) {
dirInfo->errors.emplace_back(error.value(QStringLiteral("error")).toString(), error.value(QStringLiteral("path")).toString());
emit newNotification(dirInfo->errors.back().message);
}
}
emit dirStatusChanged(*dirInfo, index);
}
} else if(eventType == QLatin1String("FolderSummary")) {
// check for summary
const QJsonObject summary(eventData.value(QStringLiteral("summary")).toObject());
if(!summary.isEmpty()) {
dirInfo->globalBytes = summary.value(QStringLiteral("globalBytes")).toInt();
dirInfo->globalDeleted = summary.value(QStringLiteral("globalDeleted")).toInt();
dirInfo->globalFiles = summary.value(QStringLiteral("globalFiles")).toInt();
dirInfo->localBytes = summary.value(QStringLiteral("localBytes")).toInt();
dirInfo->localDeleted = summary.value(QStringLiteral("localDeleted")).toInt();
dirInfo->localFiles = summary.value(QStringLiteral("localFiles")).toInt();
dirInfo->neededByted = summary.value(QStringLiteral("needByted")).toInt();
dirInfo->neededFiles = summary.value(QStringLiteral("needFiles")).toInt();
//dirInfo->assignStatus(summary.value(QStringLiteral("state")).toString());
emit dirStatusChanged(*dirInfo, index);
}
} else if(eventType == QLatin1String("FolderCompletion")) {
// check for progress percentage
//const QString device(eventData.value(QStringLiteral("device")).toString());
int percentage = eventData.value(QStringLiteral("completion")).toInt();
if(percentage > 0 && percentage < 100 && (dirInfo->progressPercentage <= 0 || percentage < dirInfo->progressPercentage)) {
// Syncthing provides progress percentage for each device
// just show the smallest percentage for now
dirInfo->progressPercentage = percentage;
}
}
}
}
@ -681,9 +753,9 @@ void SyncthingConnection::readDeviceEvent(const QString &eventType, const QJsonO
{
const QString dev(eventData.value(QStringLiteral("device")).toString());
if(!dev.isEmpty()) {
// dev status changed
int row;
if(SyncthingDev *devInfo = findDevInfo(dev, row)) {
// dev status changed, depending on event type
int index;
if(SyncthingDev *devInfo = findDevInfo(dev, index)) {
DevStatus status = devInfo->status;
bool paused = devInfo->paused;
if(eventType == QLatin1String("DeviceConnected")) {
@ -707,7 +779,7 @@ void SyncthingConnection::readDeviceEvent(const QString &eventType, const QJsonO
devInfo->status = status;
}
devInfo->paused = paused;
emit devStatusChanged(*devInfo, row);
emit devStatusChanged(*devInfo, index);
}
}
}

View File

@ -36,19 +36,35 @@ enum class DirStatus
OutOfSync
};
struct SyncthingDir
struct DirErrors
{
DirErrors(const QString &message, const QString &path) :
message(message),
path(path)
{}
QString message;
QString path;
};
struct SyncthingDir
{
QString id;
QString label;
QString path;
QStringList devices;
bool readOnly;
bool ignorePermissions;
bool autoNormalize;
int rescanInterval;
int minDiskFreePercentage;
DirStatus status;
int progressPercentage;
bool readOnly = false;
bool ignorePermissions = false;
bool autoNormalize = false;
int rescanInterval = 0;
int minDiskFreePercentage = 0;
DirStatus status = DirStatus::Unknown;
int progressPercentage = 0;
std::vector<DirErrors> errors;
int globalBytes = 0, globalDeleted = 0, globalFiles = 0;
int localBytes = 0, localDeleted = 0, localFiles = 0;
int neededByted = 0, neededFiles = 0;
bool assignStatus(const QString &statusStr);
};
enum class DevStatus
@ -70,11 +86,11 @@ struct SyncthingDev
QString compression;
QString certName;
DevStatus status;
int progressPercentage;
bool introducer;
bool paused;
int totalIncomingTraffic;
int totalOutgoingTraffic;
int progressPercentage = 0;
bool introducer = false;
bool paused = false;
int totalIncomingTraffic = 0;
int totalOutgoingTraffic = 0;
QString connectionAddress;
QString connectionType;
QString clientVersion;
@ -94,6 +110,8 @@ class SyncthingConnection : public QObject
Q_PROPERTY(SyncthingStatus status READ status NOTIFY statusChanged)
Q_PROPERTY(QString configDir READ configDir NOTIFY configDirChanged)
Q_PROPERTY(QString myId READ myId NOTIFY myIdChanged)
Q_PROPERTY(int totalIncomingTraffic READ totalIncomingTraffic NOTIFY trafficChanged)
Q_PROPERTY(int totalOutgoingTraffic READ totalOutgoingTraffic NOTIFY trafficChanged)
public:
explicit SyncthingConnection(const QString &syncthingUrl = QStringLiteral("http://localhost:8080"), const QByteArray &apiKey = QByteArray(), QObject *parent = nullptr);
@ -111,6 +129,8 @@ public:
bool isConnected() const;
const QString &configDir() const;
const QString &myId() const;
int totalIncomingTraffic() const;
int totalOutgoingTraffic() const;
const std::vector<SyncthingDir> &dirInfo() const;
const std::vector<SyncthingDev> &devInfo() const;
void requestQrCode(const QString &text, std::function<void (const QPixmap &)> callback);
@ -191,6 +211,11 @@ Q_SIGNALS:
*/
void myIdChanged(const QString &myNewId);
/*!
* \brief Indicates totalIncomingTraffic() or totalOutgoingTraffic() has changed.
*/
void trafficChanged(int totalIncomingTraffic, int totalOutgoingTraffic);
private Q_SLOTS:
void requestConfig();
void requestStatus();
@ -206,6 +231,8 @@ private Q_SLOTS:
void readEvents();
void readStartingEvent(const QJsonObject &eventData);
void readStatusChangedEvent(const QJsonObject &eventData);
void readDownloadProgressEvent(const QJsonObject &eventData);
void readDirEvent(const QString &eventType, const QJsonObject &eventData);
void readDeviceEvent(const QString &eventType, const QJsonObject &eventData);
void readRescan();
void readPauseResume();
@ -331,6 +358,22 @@ inline const QString &SyncthingConnection::myId() const
return m_myId;
}
/*!
* \brief Returns the total incoming traffic.
*/
inline int SyncthingConnection::totalIncomingTraffic() const
{
return m_totalIncomingTraffic;
}
/*!
* \brief Returns the total outgoing traffic.
*/
inline int SyncthingConnection::totalOutgoingTraffic() const
{
return m_totalOutgoingTraffic;
}
/*!
* \brief Returns all available directory info.
* \remarks The returned object container object is persistent. However, the contained

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>QtGui::AppearanceOptionPage</class>
<widget class="QWidget" name="QtGui::AppearanceOptionPage">
<property name="windowTitle">
<string>Appearance</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QCheckBox" name="showTrafficCheckBox">
<property name="text">
<string>Show traffic</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -23,8 +23,8 @@ inline int centerObj(int avail, int size)
DevButtonsItemDelegate::DevButtonsItemDelegate(QObject* parent) :
QStyledItemDelegate(parent),
m_pauseIcon(QIcon::fromTheme(QStringLiteral("media-playback-pause")).pixmap(QSize(16, 16))),
m_resumeIcon(QIcon::fromTheme(QStringLiteral("media-playback-start")).pixmap(QSize(16, 16)))
m_pauseIcon(QIcon::fromTheme(QStringLiteral("media-playback-pause"), QIcon(QStringLiteral(":/icons/hicolor/scalable/actions/media-playback-pause.svg"))).pixmap(QSize(16, 16))),
m_resumeIcon(QIcon::fromTheme(QStringLiteral("media-playback-start"), QIcon(QStringLiteral(":/icons/hicolor/scalable/actions/media-playback-start.svg"))).pixmap(QSize(16, 16)))
{}
void DevButtonsItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const

View File

@ -41,7 +41,7 @@ void DevView::showContextMenu()
{
if(selectionModel() && selectionModel()->selectedRows(0).size() == 1) {
QMenu menu;
connect(menu.addAction(QIcon::fromTheme(QStringLiteral("edit-copy")), tr("Copy")), &QAction::triggered, this, &DevView::copySelectedItem);
connect(menu.addAction(QIcon::fromTheme(QStringLiteral("edit-copy"), QIcon(QStringLiteral(":/icons/hicolor/scalable/actions/edit-copy.svg"))), tr("Copy")), &QAction::triggered, this, &DevView::copySelectedItem);
menu.exec(QCursor::pos());
}
}

View File

@ -18,8 +18,8 @@ inline int centerObj(int avail, int size)
DirButtonsItemDelegate::DirButtonsItemDelegate(QObject* parent) :
QStyledItemDelegate(parent),
m_refreshIcon(QIcon::fromTheme(QStringLiteral("view-refresh")).pixmap(QSize(16, 16))),
m_folderIcon(QIcon::fromTheme(QStringLiteral("folder-open")).pixmap(QSize(16, 16)))
m_refreshIcon(QIcon::fromTheme(QStringLiteral("view-refresh"), QIcon(QStringLiteral(":/icons/hicolor/scalable/actions/view-refresh.svg"))).pixmap(QSize(16, 16))),
m_folderIcon(QIcon::fromTheme(QStringLiteral("folder-open"), QIcon(QStringLiteral(":/icons/hicolor/scalable/places/folder-open.svg"))).pixmap(QSize(16, 16)))
{}
void DirButtonsItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const

View File

@ -41,7 +41,7 @@ void DirView::showContextMenu()
{
if(selectionModel() && selectionModel()->selectedRows(0).size() == 1) {
QMenu menu;
connect(menu.addAction(QIcon::fromTheme(QStringLiteral("edit-copy")), tr("Copy")), &QAction::triggered, this, &DirView::copySelectedItem);
connect(menu.addAction(QIcon::fromTheme(QStringLiteral("edit-copy"), QIcon(QStringLiteral(":/icons/hicolor/scalable/actions/edit-copy.svg"))), tr("Copy")), &QAction::triggered, this, &DirView::copySelectedItem);
menu.exec(QCursor::pos());
}
}

View File

@ -13,7 +13,15 @@
<property name="windowTitle">
<string>Launcher</string>
</property>
<layout class="QFormLayout" name="formLayout"/>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Not implemented yet.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This will allow launching Syncthing when the tray is started.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>

View File

@ -2,6 +2,14 @@
<ui version="4.0">
<class>QtGui::NotificationsOptionPage</class>
<widget class="QWidget" name="QtGui::NotificationsOptionPage">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>175</width>
<height>156</height>
</rect>
</property>
<property name="windowTitle">
<string>Notifications</string>
</property>
@ -16,7 +24,14 @@
<item>
<widget class="QCheckBox" name="notifyOnErrorsCheckBox">
<property name="text">
<string>Notify on errors</string>
<string>Notify on internal errors</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="showSyncthingNotificationsCheckBox">
<property name="text">
<string>Notify on Syncthing errors</string>
</property>
</widget>
</item>
@ -27,13 +42,6 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="showSyncthingNotificationsCheckBox">
<property name="text">
<string>Show Syncthing notifications</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">

View File

@ -5,6 +5,7 @@
#include "ui_connectionoptionpage.h"
#include "ui_notificationsoptionpage.h"
#include "ui_appearanceoptionpage.h"
#include "ui_launcheroptionpage.h"
#include "ui_webviewoptionpage.h"
@ -113,6 +114,29 @@ void NotificationsOptionPage::reset()
}
}
// AppearanceOptionPage
AppearanceOptionPage::AppearanceOptionPage(QWidget *parentWidget) :
AppearanceOptionPageBase(parentWidget)
{}
AppearanceOptionPage::~AppearanceOptionPage()
{}
bool AppearanceOptionPage::apply()
{
if(hasBeenShown()) {
showTraffic() = ui()->showTrafficCheckBox->isChecked();
}
return true;
}
void AppearanceOptionPage::reset()
{
if(hasBeenShown()) {
ui()->showTrafficCheckBox->setChecked(showTraffic());
}
}
// LauncherOptionPage
LauncherOptionPage::LauncherOptionPage(QWidget *parentWidget) :
LauncherOptionPageBase(parentWidget)
@ -187,14 +211,14 @@ SettingsDialog::SettingsDialog(Data::SyncthingConnection *connection, QWidget *p
category->setDisplayName(tr("Tray"));
category->assignPages(QList<Dialogs::OptionPage *>()
<< new ConnectionOptionPage(connection) << new NotificationsOptionPage
<< new LauncherOptionPage);
<< new AppearanceOptionPage << new LauncherOptionPage);
category->setIcon(QIcon(QStringLiteral(":/icons/hicolor/scalable/app/syncthingtray.svg")));
categories << category;
category = new OptionCategory(this);
category->setDisplayName(tr("Web view"));
category->assignPages(QList<Dialogs::OptionPage *>() << new WebViewOptionPage);
category->setIcon(QIcon::fromTheme(QStringLiteral("internet-web-browser"), QIcon(QStringLiteral(":/icons/hicolor/scalable/app/"))));
category->setIcon(QIcon::fromTheme(QStringLiteral("internet-web-browser"), QIcon(QStringLiteral(":/icons/hicolor/scalable/apps/internet-web-browser.svg"))));
categories << category;
categories << Settings::qtSettings().category();
@ -202,7 +226,7 @@ SettingsDialog::SettingsDialog(Data::SyncthingConnection *connection, QWidget *p
categoryModel()->setCategories(categories);
setMinimumSize(800, 450);
setWindowIcon(QIcon::fromTheme(QStringLiteral("preferences-other")));
setWindowIcon(QIcon::fromTheme(QStringLiteral("preferences-other"), QIcon(QStringLiteral(":/icons/hicolor/scalable/apps/preferences-other.svg"))));
// some settings could be applied without restarting the application, good idea?
//connect(this, &Dialogs::SettingsDialog::applied, bind(&Dialogs::QtSettings::apply, &Settings::qtSettings()));

View File

@ -30,6 +30,8 @@ END_DECLARE_OPTION_PAGE
DECLARE_UI_FILE_BASED_OPTION_PAGE(NotificationsOptionPage)
DECLARE_UI_FILE_BASED_OPTION_PAGE(AppearanceOptionPage)
DECLARE_UI_FILE_BASED_OPTION_PAGE(LauncherOptionPage)
#if defined(SYNCTHINGTRAY_USE_WEBENGINE) || defined(SYNCTHINGTRAY_USE_WEBKIT)

View File

@ -17,6 +17,8 @@
#include <qtutilities/misc/dialogutils.h>
#include <qtutilities/misc/desktoputils.h>
#include <c++utilities/conversion/stringconversion.h>
#include <QApplication>
#include <QSvgRenderer>
#include <QPainter>
@ -25,8 +27,6 @@
#include <QDesktopServices>
#include <QMainWindow>
#include <QMessageBox>
#include <QCursor>
#include <QDesktopWidget>
#include <QLabel>
#include <QClipboard>
#include <QUrl>
@ -37,6 +37,7 @@
#include <functional>
using namespace ApplicationUtilities;
using namespace ConversionUtilities;
using namespace Dialogs;
using namespace Data;
using namespace std;
@ -76,30 +77,33 @@ TrayWidget::TrayWidget(TrayMenu *parent) :
cornerFrame->setLayout(cornerFrameLayout);
auto *viewIdButton = new QPushButton(cornerFrame);
viewIdButton->setToolTip(tr("View own device ID"));
viewIdButton->setIcon(QIcon::fromTheme(QStringLiteral("view-barcode")));
viewIdButton->setIcon(QIcon::fromTheme(QStringLiteral("view-barcode"), QIcon(QStringLiteral(":/icons/hicolor/scalable/actions/view-barcode.svg"))));
viewIdButton->setFlat(true);
cornerFrameLayout->addWidget(viewIdButton);
auto *showLogButton = new QPushButton(cornerFrame);
showLogButton->setToolTip(tr("Show Syncthing log"));
showLogButton->setIcon(QIcon::fromTheme(QStringLiteral("text-plain")));
showLogButton->setIcon(QIcon::fromTheme(QStringLiteral("text-x-generic"), QIcon(QStringLiteral(":/icons/hicolor/scalable/actions/text-x-generic.svg"))));
showLogButton->setFlat(true);
connect(showLogButton, &QPushButton::clicked, this, &TrayWidget::showLog);
cornerFrameLayout->addWidget(showLogButton);
auto *scanAllButton = new QPushButton(cornerFrame);
scanAllButton->setToolTip(tr("Rescan all directories"));
scanAllButton->setIcon(QIcon::fromTheme(QStringLiteral("folder-sync")));
scanAllButton->setIcon(QIcon::fromTheme(QStringLiteral("folder-sync"), QIcon(QStringLiteral(":/icons/hicolor/scalable/actions/folder-sync.svg"))));
scanAllButton->setFlat(true);
cornerFrameLayout->addWidget(scanAllButton);
m_ui->tabWidget->setCornerWidget(cornerFrame, Qt::BottomRightCorner);
m_ui->trafficIconLabel->setPixmap(QIcon::fromTheme(QStringLiteral("network-card"), QIcon(QStringLiteral(":/icons/hicolor/scalable/devices/network-card.svg"))).pixmap(32));
// connect signals and slots
connect(m_ui->statusPushButton, &QPushButton::clicked, this, &TrayWidget::handleStatusButtonClicked);
connect(m_ui->statusPushButton, &QPushButton::clicked, this, &TrayWidget::changeStatus);
connect(m_ui->closePushButton, &QPushButton::clicked, &QApplication::quit);
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);
connect(&m_connection, &SyncthingConnection::statusChanged, this, &TrayWidget::updateStatusButton);
connect(&m_connection, &SyncthingConnection::trafficChanged, this, &TrayWidget::updateTraffic);
connect(m_ui->dirsTreeView, &DirView::openDir, this, &TrayWidget::openDir);
connect(m_ui->dirsTreeView, &DirView::scanDir, this, &TrayWidget::scanDir);
connect(m_ui->devsTreeView, &DevView::pauseResumeDev, this, &TrayWidget::pauseResumeDev);
@ -133,7 +137,7 @@ void TrayWidget::showSettingsDialog()
void TrayWidget::showAboutDialog()
{
if(!m_aboutDlg) {
m_aboutDlg = new AboutDialog(this, tr("Tray application for Syncthing"), QImage(QStringLiteral(":/icons/hicolor/scalable/app/syncthingtray.svg")));
m_aboutDlg = new AboutDialog(this, QString(), QStringLiteral(APP_AUTHOR "\nfallback icons from KDE/Breeze project\nSyncthing icons from Syncthing project"), QString(), QString(), tr("Tray application for Syncthing"), QImage(QStringLiteral(":/icons/hicolor/scalable/app/syncthingtray.svg")));
m_aboutDlg->setWindowTitle(tr("About - Syncthing Tray"));
m_aboutDlg->setWindowIcon(QIcon(QStringLiteral(":/icons/hicolor/scalable/app/syncthingtray.svg")));
}
@ -234,19 +238,19 @@ void TrayWidget::updateStatusButton(SyncthingStatus status)
case SyncthingStatus::Disconnected:
m_ui->statusPushButton->setText(tr("Connect"));
m_ui->statusPushButton->setToolTip(tr("Not connected to Syncthing, click to connect"));
m_ui->statusPushButton->setIcon(QIcon::fromTheme(QStringLiteral("view-refresh")));
m_ui->statusPushButton->setIcon(QIcon::fromTheme(QStringLiteral("view-refresh"), QIcon(QStringLiteral(":/icons/hicolor/scalable/actions/view-refresh.svg"))));
break;
case SyncthingStatus::Default:
case SyncthingStatus::NotificationsAvailable:
case SyncthingStatus::Synchronizing:
m_ui->statusPushButton->setText(tr("Pause"));
m_ui->statusPushButton->setToolTip(tr("Syncthing is running, click to pause all devices"));
m_ui->statusPushButton->setIcon(QIcon::fromTheme(QStringLiteral("media-playback-pause")));
m_ui->statusPushButton->setIcon(QIcon::fromTheme(QStringLiteral("media-playback-pause"), QIcon(QStringLiteral(":/icons/hicolor/scalable/actions/media-playback-pause.svg"))));
break;
case SyncthingStatus::Paused:
m_ui->statusPushButton->setText(tr("Continue"));
m_ui->statusPushButton->setToolTip(tr("At least one device is paused, click to resume"));
m_ui->statusPushButton->setIcon(QIcon::fromTheme(QStringLiteral("media-playback-start")));
m_ui->statusPushButton->setIcon(QIcon::fromTheme(QStringLiteral("media-playback-start"), QIcon(QStringLiteral(":/icons/hicolor/scalable/actions/media-playback-resume.svg"))));
break;
}
}
@ -261,6 +265,7 @@ void TrayWidget::applySettings()
m_connection.setCredentials(QString(), QString());
}
m_connection.reconnect();
m_ui->trafficFrame->setVisible(Settings::showTraffic());
}
void TrayWidget::openDir(const QModelIndex &dirIndex)
@ -292,7 +297,7 @@ void TrayWidget::pauseResumeDev(const QModelIndex &devIndex)
}
}
void TrayWidget::handleStatusButtonClicked()
void TrayWidget::changeStatus()
{
switch(m_connection.status()) {
case SyncthingStatus::Disconnected:
@ -309,6 +314,12 @@ void TrayWidget::handleStatusButtonClicked()
}
}
void TrayWidget::updateTraffic(int totalIncomingTraffic, int totalOutgoingTraffic)
{
m_ui->inTrafficLabel->setText(totalIncomingTraffic >= 0 ? QString::fromUtf8(dataSizeToString(totalIncomingTraffic).data()) : tr("unknown"));
m_ui->outTrafficLabel->setText(totalOutgoingTraffic >= 0 ? QString::fromUtf8(dataSizeToString(totalOutgoingTraffic).data()) : tr("unknown"));
}
void TrayWidget::handleWebViewDeleted()
{
m_webViewDlg = nullptr;
@ -343,11 +354,11 @@ TrayIcon::TrayIcon(QObject *parent) :
m_status(SyncthingStatus::Disconnected)
{
// set context menu
connect(m_contextMenu.addAction(QIcon::fromTheme(QStringLiteral("internet-web-browser")), tr("Web UI")), &QAction::triggered, m_trayMenu.widget(), &TrayWidget::showWebUi);
connect(m_contextMenu.addAction(QIcon::fromTheme(QStringLiteral("preferences-other")), tr("Settings")), &QAction::triggered, m_trayMenu.widget(), &TrayWidget::showSettingsDialog);
connect(m_contextMenu.addAction(QIcon::fromTheme(QStringLiteral("help-about")), tr("About")), &QAction::triggered, m_trayMenu.widget(), &TrayWidget::showAboutDialog);
connect(m_contextMenu.addAction(QIcon::fromTheme(QStringLiteral("internet-web-browser"), QIcon(QStringLiteral(":/icons/hicolor/scalable/apps/internet-web-browser.svg"))), tr("Web UI")), &QAction::triggered, m_trayMenu.widget(), &TrayWidget::showWebUi);
connect(m_contextMenu.addAction(QIcon::fromTheme(QStringLiteral("preferences-other"), QIcon(QStringLiteral(":/icons/hicolor/scalable/apps/preferences-other.svg"))), tr("Settings")), &QAction::triggered, m_trayMenu.widget(), &TrayWidget::showSettingsDialog);
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")), 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, &QCoreApplication::quit);
setContextMenu(&m_contextMenu);
// set initial status
@ -372,22 +383,11 @@ void TrayIcon::handleActivated(QSystemTrayIcon::ActivationReason reason)
if(false) {
m_trayMenu.widget()->showWebUi();
} else {
m_trayMenu.resize(m_trayMenu.sizeHint());
// when showing the menu manually
// move the menu to the closest of the currently available screen
// this implies that the tray icon is located near the edge of the screen; otherwise this behavior makes no sense
const QPoint cursorPos(QCursor::pos());
const QRect availableGeometry(QApplication::desktop()->availableGeometry(cursorPos));
Qt::Alignment alignment = 0;
alignment |= (cursorPos.x() - availableGeometry.left() < availableGeometry.right() - cursorPos.x() ? Qt::AlignLeft : Qt::AlignRight);
alignment |= (cursorPos.y() - availableGeometry.top() < availableGeometry.bottom() - cursorPos.y() ? Qt::AlignTop : Qt::AlignBottom);
m_trayMenu.setGeometry(
QStyle::alignedRect(
Qt::LeftToRight,
alignment,
m_trayMenu.sizeHint(),
availableGeometry
)
);
cornerWidget(&m_trayMenu);
m_trayMenu.show();
}
break;

View File

@ -54,7 +54,8 @@ private slots:
void openDir(const QModelIndex &dirIndex);
void scanDir(const QModelIndex &dirIndex);
void pauseResumeDev(const QModelIndex &devIndex);
void handleStatusButtonClicked();
void changeStatus();
void updateTraffic(int totalIncomingTraffic, int totalOutgoingTraffic);
void handleWebViewDeleted();
private:

View File

@ -155,6 +155,98 @@
</layout>
</widget>
</item>
<item>
<widget class="QFrame" name="trafficFrame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>3</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>3</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="trafficIconLabel">
<property name="maximumSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="toolTip">
<string>Traffic</string>
</property>
</widget>
</item>
<item>
<widget class="QWidget" name="trafficFormWidget" native="true">
<layout class="QFormLayout" name="formLayout">
<property name="verticalSpacing">
<number>2</number>
</property>
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="trafficInTextLabel">
<property name="text">
<string>In</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="inTrafficLabel">
<property name="text">
<string>unknown</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="trafficOutTextLabel">
<property name="text">
<string>Out</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="outTrafficLabel">
<property name="text">
<string>unknown</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="tabPosition">

View File

@ -8,5 +8,22 @@
<file>icons/hicolor/scalable/status/syncthing-disconnected.svg</file>
<file>icons/hicolor/scalable/status/syncthing-ok.svg</file>
<file>icons/hicolor/scalable/status/syncthing-error.svg</file>
<file>icons/hicolor/scalable/actions/application-menu.svg</file>
<file>icons/hicolor/scalable/actions/edit-copy.svg</file>
<file>icons/hicolor/scalable/actions/folder-sync.svg</file>
<file>icons/hicolor/scalable/actions/help-about.svg</file>
<file>icons/hicolor/scalable/actions/media-playback-pause.svg</file>
<file>icons/hicolor/scalable/actions/media-playback-start.svg</file>
<file>icons/hicolor/scalable/actions/view-barcode.svg</file>
<file>icons/hicolor/scalable/actions/view-refresh.svg</file>
<file>icons/hicolor/scalable/actions/window-close.svg</file>
<file>icons/hicolor/scalable/apps/help-about.svg</file>
<file>icons/hicolor/scalable/apps/internet-web-browser.svg</file>
<file>icons/hicolor/scalable/apps/preferences-other.svg</file>
<file>icons/hicolor/scalable/devices/network-card.svg</file>
<file>icons/hicolor/scalable/mimetypes/text-x-generic.svg</file>
<file>icons/hicolor/scalable/places/folder-open.svg</file>
<file>icons/hicolor/scalable/places/folder.svg</file>
<file>icons/hicolor/scalable/places/network-workgroup.svg</file>
</qresource>
</RCC>

View File

@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path style="fill:currentColor;fill-opacity:1;stroke:none"
d="M 2 3 L 2 5 L 14 5 L 14 3 L 2 3 z M 2 7 L 2 9 L 14 9 L 14 7 L 2 7 z M 2 11 L 2 13 L 14 13 L 14 11 L 2 11 z "
class="ColorScheme-Text"
/>
</svg>

After

Width:  |  Height:  |  Size: 443 B

View File

@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path style="fill:currentColor;fill-opacity:1;stroke:none"
d="M 3 2 L 3 13 L 6 13 L 6 14 L 11 14 L 14 11 L 14 4 L 13 4 L 13 2 L 3.7851562 2 L 3 2 z M 4 3 L 12 3 L 12 4 L 6 4 L 6 12 L 4 12 L 4 3 z M 7 5 L 13 5 L 13 10 L 10 10 L 10 13 L 7 13 L 7 5 z "
class="ColorScheme-Text"
/>
</svg>

After

Width:  |  Height:  |  Size: 522 B

View File

@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path style="fill:currentColor;fill-opacity:1;stroke:none"
d="M 2 2 L 2 3 L 2 6 L 2 7 L 2 13 L 2 14 L 9 14 L 9 13 L 3 13 L 3 7 L 13 7 L 13 9 L 14 9 L 14 6 L 14 5 L 14 4 L 9.0078125 4 L 7.0078125 2 L 7 2.0078125 L 7 2 L 3 2 L 2 2 z M 3 3 L 6.5917969 3 L 7.59375 4 L 7 4 L 7 4.0078125 L 6.9921875 4 L 4.9921875 6 L 3 6 L 3 3 z M 11.5 9 A 2.4999997 2.5000003 0 0 0 9 11.5 A 2.4999997 2.5000003 0 0 0 9.4160156 12.876953 L 10.148438 12.144531 A 1.5 1.5 0 0 1 10 11.5 A 1.5 1.5 0 0 1 11.5 10 A 1.5 1.5 0 0 1 12.144531 10.148438 L 12.876953 9.4160156 A 2.4999997 2.5000003 0 0 0 11.5 9 z M 13.583984 10.123047 L 12.851562 10.855469 A 1.5 1.5 0 0 1 13 11.5 A 1.5 1.5 0 0 1 11.5 13 A 1.5 1.5 0 0 1 10.855469 12.851562 L 10.123047 13.583984 A 2.4999997 2.5000003 0 0 0 11.5 14 A 2.4999997 2.5000003 0 0 0 14 11.5 A 2.4999997 2.5000003 0 0 0 13.583984 10.123047 z "
class="ColorScheme-Text"
/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path style="fill:currentColor;fill-opacity:1;stroke:none"
d="m7.5 3c-3.038 0-5.5 2.462-5.5 5.5 0 3.038 2.462 5.5 5.5 5.5 3.038 0 5.5-2.462 5.5-5.5 0-3.038-2.462-5.5-5.5-5.5m0 1c2.485 0 4.5 2.01 4.5 4.5 0 2.485-2.01 4.5-4.5 4.5-2.485 0-4.5-2.01-4.5-4.5 0-2.485 2.01-4.5 4.5-4.5m-.5 1v1h1v-1zm0 2v5h1v-5z"
class="ColorScheme-Text"
/>
</svg>

After

Width:  |  Height:  |  Size: 577 B

View File

@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path style="fill:currentColor;fill-opacity:1;stroke:none"
d="M 2 2 L 2 14 L 14 14 L 14 2 L 2 2 z M 3 3 L 13 3 L 13 13 L 3 13 L 3 3 z M 5 5 L 5 11 L 7 11 L 7 5 L 5 5 z M 9 5 L 9 11 L 11 11 L 11 5 L 9 5 z "
class="ColorScheme-Text"
/>
</svg>

After

Width:  |  Height:  |  Size: 480 B

View File

@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path style="fill:currentColor;fill-opacity:1;stroke:none"
d="M 2 2 L 2 14 L 14 14 L 14 2 L 2 2 z M 3 3 L 13 3 L 13 13 L 3 13 L 3 3 z M 6 5 L 6 11 L 10 8 L 6 5 z "
class="ColorScheme-Text"
/>
</svg>

After

Width:  |  Height:  |  Size: 438 B

View File

@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path style="fill:currentColor;fill-opacity:1;stroke:none"
d="M 2 2 L 2 14 L 3 14 L 3 2 L 2 2 z M 4 2 L 4 7 L 5 7 L 5 2 L 4 2 z M 6 2 L 6 14 L 7 14 L 7 2 L 6 2 z M 8 2 L 8 14 L 9 14 L 9 2 L 8 2 z M 10 2 L 10 8 L 11 8 L 11 2 L 10 2 z M 12 2 L 12 14 L 14 14 L 14 2 L 12 2 z "
class="ColorScheme-Text"
/>
</svg>

After

Width:  |  Height:  |  Size: 546 B

View File

@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path style="fill:currentColor;fill-opacity:1;stroke:none"
d="M 8 2 C 6.8911827 2 5.8599294 2.3193334 4.96875 2.84375 L 5.53125 3.40625 L 5.71875 3.59375 L 7.65625 5.53125 L 8.375 4.8125 L 6.75 3.1875 C 6.94534 3.1364099 7.1398623 3.0897842 7.34375 3.0625 C 7.3961563 3.0547113 7.4470287 3.0373165 7.5 3.03125 C 7.6680854 3.01418 7.827411 3 8 3 C 10.761424 3 13 5.2385759 13 8 C 13 8.243024 12.97155 8.4855082 12.9375 8.71875 C 12.917545 8.8549993 12.905714 8.9925532 12.875 9.125 C 12.80805 9.4115815 12.708353 9.672624 12.59375 9.9375 C 12.580478 9.9681753 12.576374 10.000899 12.5625 10.03125 C 12.521539 10.122908 12.454245 10.194583 12.40625 10.28125 C 12.401797 10.289291 12.410582 10.304303 12.40625 10.3125 L 13.15625 11.03125 C 13.680667 10.140071 14 9.108818 14 8 C 14 4.6862909 11.313707 2 8 2 z M 2.84375 4.96875 C 2.3193332 5.8599294 2 6.891182 2 8 C 2 11.313709 4.6862934 14 8 14 C 9.1088173 14 10.140071 13.680667 11.03125 13.15625 L 10.46875 12.59375 L 10.28125 12.40625 L 8.34375 10.5 L 7.65625 11.1875 L 9.25 12.8125 C 9.05466 12.86359 8.8601377 12.910216 8.65625 12.9375 C 8.6038437 12.945289 8.5529713 12.962684 8.5 12.96875 C 8.3319146 12.98582 8.172589 13 8 13 C 7.827411 13 7.6680854 12.98582 7.5 12.96875 C 7.3319147 12.95168 7.162744 12.939552 7 12.90625 C 4.7215847 12.440019 3 10.416246 3 8 C 3 7.7517374 3.0275593 7.5198138 3.0625 7.28125 C 3.0824555 7.1450007 3.0942865 7.0074468 3.125 6.875 C 3.1919502 6.5884185 3.2916465 6.327376 3.40625 6.0625 C 3.4192426 6.031782 3.4239145 5.9991506 3.4375 5.96875 C 3.4781185 5.8798895 3.5461122 5.8040145 3.59375 5.71875 L 3.59375 5.6875 L 2.84375 4.96875 z "
class="ColorScheme-Text"
/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1,17 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
.ColorScheme-NegativeText {
color:#da4453;
}
</style>
</defs>
<path
style="fill:currentColor;fill-opacity:1;stroke:none"
class="ColorScheme-NegativeText"
d="M 8,2 A 6,6 0 0 0 2,8 6,6 0 0 0 8,14 6,6 0 0 0 14,8 6,6 0 0 0 8,2 Z M 5.70703,5 8,7.29297 10.29297,5 11,5.70703 8.70703,8 11,10.29297 10.29297,11 8,8.70703 5.70703,11 5,10.29297 7.29297,8 5,5.70703 5.70703,5 Z"
/>
</svg>

After

Width:  |  Height:  |  Size: 626 B

View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg width="32" version="1.1" xmlns="http://www.w3.org/2000/svg" height="32" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
<defs id="defs5455">
<linearGradient inkscape:collect="always" id="linearGradient4143">
<stop style="stop-color:#197cf1" id="stop4145"/>
<stop offset="1" style="stop-color:#20bcfa" id="stop4147"/>
</linearGradient>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient4143" id="linearGradient4149" y1="545.79797" y2="517.79797" x2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.92857108 0 0 0.92857057 28.612354 37.986142)"/>
<linearGradient inkscape:collect="always" id="linearGradient4290">
<stop style="stop-color:#7cbaf8" id="stop4292"/>
<stop offset="1" style="stop-color:#f4fcff" id="stop4294"/>
</linearGradient>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient4290" id="linearGradient4144" y1="29.999973" y2="2" x2="0" gradientUnits="userSpaceOnUse"/>
<linearGradient inkscape:collect="always" id="linearGradient4227">
<stop style="stop-color:#292c2f" id="stop4229"/>
<stop offset="1" style="stop-opacity:0" id="stop4231"/>
</linearGradient>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient4227" id="linearGradient4191" y1="9" x1="9.00001" y2="23" x2="23.00004" gradientUnits="userSpaceOnUse"/>
</defs>
<metadata id="metadata5458"/>
<g inkscape:label="Capa 1" inkscape:groupmode="layer" id="layer1" transform="matrix(1 0 0 1 -384.57143 -515.798)">
<rect width="26" x="387.57144" y="518.79797" rx="12.999993" height="26" style="fill:url(#linearGradient4149)" id="rect4130"/>
<path style="fill:url(#linearGradient4191);opacity:0.2;fill-rule:evenodd" id="path4184" d="M 17 9 L 15 11 L 17 13 L 15 23 L 23 31 L 26 31 L 29 31 L 31 31 L 31 27 L 31 23 L 17 9 z " transform="matrix(1 0 0 1 384.57143 515.798)"/>
<path inkscape:connector-curvature="0" style="fill:url(#linearGradient4144)" id="rect4133" d="M 16,2 C 8.4128491,2 2.2891329,7.9794391 2.0253906,15.5 2.0195214,15.66736 2,15.831158 2,16 c 0,7.756003 6.2439968,14 14,14 7.756003,0 14,-6.243997 14,-14 0,-0.168842 -0.01952,-0.33264 -0.02539,-0.5 C 29.710867,7.9794391 23.587151,2 16,2 Z m 0,1 C 23.201993,3 29,8.7980074 29,16 29,23.201993 23.201993,29 16,29 8.7980074,29 3,23.201993 3,16 3,8.7980074 8.7980074,3 16,3 Z m -1,6 0,2 2,0 0,-2 z m 0,4 0,10 2,0 0,-10 z" transform="matrix(1 0 0 1 384.57143 515.798)"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -0,0 +1,17 @@
<svg width="48" xmlns="http://www.w3.org/2000/svg" height="48">
<defs>
<linearGradient id="a" y1="543.8" y2="503.8" gradientUnits="userSpaceOnUse" x2="0">
<stop stop-color="#197cf1"/>
<stop offset="1" stop-color="#20bcfa"/>
</linearGradient>
<linearGradient id="b" y1="503.8" y2="543.8" x2="0" gradientUnits="userSpaceOnUse">
<stop stop-color="#abf9c7"/>
<stop offset="1" stop-color="#54d883"/>
</linearGradient>
</defs>
<g transform="translate(-384.57-499.8)">
<rect width="40" x="388.57" y="503.8" fill="url(#a)" rx="20" height="40"/>
<path fill="url(#b)" fill-rule="evenodd" d="m408.57 503.8c-1.452 0-2.864.16-4.227.451l-1.773 3.549-2.68-2.01c-4.806 2.311-8.529 6.472-10.254 11.584l3.934-1.574 3 2 1-3 13-7-.793-3.961c-.4-.024-.801-.039-1.207-.039m14.811 6.568l-.811 2.432 1 1-4 6 2 7 6.633.83c.239-1.239.367-2.519.367-3.83 0-3.425-.857-6.641-2.361-9.453l-1.639-.547.596-1.193c-.535-.794-1.144-1.531-1.785-2.238m-34.414 9.432c-.221 1.096-.346 2.227-.381 3.381l6.984 2.619-1-3-2-3zm6.604 6l5 12v4.338c2.449 1.065 5.151 1.662 8 1.662.199 0 .395-.008.592-.014l6.408-10.986-16-9z"/>
<path opacity=".2" d="m4.051 23.5c-.004.17-.051.329-.051.5 0 11.08 8.92 20 20 20 11.08 0 20-8.92 20-20 0-.171-.047-.33-.051-.5-.03 1.206-.121 2.398-.354 3.541-.266 1.304-.657 2.561-1.162 3.758-.505 1.197-1.122 2.335-1.84 3.398-.717 1.064-1.536 2.053-2.439 2.957-.904.904-1.893 1.722-2.957 2.439-1.064.717-2.201 1.335-3.398 1.84-1.197.505-2.454.897-3.758 1.162-1.304.266-2.656.404-4.04.404-1.385 0-2.737-.139-4.04-.404-1.304-.266-2.561-.657-3.758-1.162-.599-.252-1.183-.533-1.75-.84-.567-.307-1.117-.641-1.648-1-1.064-.717-2.053-1.536-2.957-2.439-.904-.904-1.722-1.893-2.439-2.957-.717-1.064-1.335-2.201-1.84-3.398-.505-1.197-.897-2.454-1.162-3.758-.233-1.143-.323-2.335-.354-3.541" transform="translate(384.57 499.8)"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg width="32" version="1.1" xmlns="http://www.w3.org/2000/svg" height="32" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
<defs id="defs5455">
<linearGradient inkscape:collect="always" xlink:href="#linearGradient4303" id="linearGradient4238" y1="545.79797" y2="517.79797" x2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1 0 0 1 -0.000006 0)"/>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient4159" id="linearGradient4370" y1="30" y2="1.999974" x2="0" gradientUnits="userSpaceOnUse"/>
<linearGradient inkscape:collect="always" id="linearGradient4303">
<stop style="stop-color:#c6cdd1" id="stop4305"/>
<stop offset="1" style="stop-color:#e0e5e7" id="stop4307"/>
</linearGradient>
<linearGradient inkscape:collect="always" id="linearGradient4159">
<stop style="stop-color:#2a2c2f" id="stop4161"/>
<stop offset="1" style="stop-color:#424649" id="stop4163"/>
</linearGradient>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient4227" id="linearGradient4198" y1="9" x1="9.00001" y2="22.999973" x2="23" gradientUnits="userSpaceOnUse"/>
<linearGradient inkscape:collect="always" id="linearGradient4227">
<stop style="stop-color:#292c2f" id="stop4229"/>
<stop offset="1" style="stop-opacity:0" id="stop4231"/>
</linearGradient>
</defs>
<metadata id="metadata5458"/>
<g inkscape:label="Capa 1" inkscape:groupmode="layer" id="layer1" transform="matrix(1 0 0 1 -384.57143 -515.798)">
<rect width="27.999989" x="386.57144" y="517.79797" rx="13.999994" height="28" style="fill:url(#linearGradient4238)" id="rect4175"/>
<path inkscape:connector-curvature="0" style="fill:url(#linearGradient4198);opacity:0.2;fill-rule:evenodd" id="path4175" d="m 9.4003906,15 -0.099609,2 0.9999998,1 10.970703,10.970703 c 3.4891,-1.412467 6.267011,-4.183045 7.6875,-7.667969 L 22.706,14.95 22.191,14.6 19.400391,15 19.318359,16.662109 17.706,14.95 17.191,14.6 14.400391,15 14.318359,16.662109 12.706,14.95 12.191,14.6 Z" transform="matrix(1 0 0 1 384.57143 515.798)"/>
<path inkscape:connector-curvature="0" style="fill:url(#linearGradient4370)" id="rect4176" d="m 16,14 c -1.108,0 -2,0.892 -2,2 0,1.108 0.892,2 2,2 1.108,0 2,-0.892 2,-2 0,-1.108 -0.892,-2 -2,-2 z m -5,0 c -1.108,0 -2,0.892 -2,2 0,1.108 0.892,2 2,2 1.108,0 2,-0.892 2,-2 0,-1.108 -0.892,-2 -2,-2 z m 10,0 c -1.108,0 -2,0.892 -2,2 0,1.108 0.892,2 2,2 1.108,0 2,-0.892 2,-2 0,-1.108 -0.892,-2 -2,-2 z" transform="matrix(1 0 0 1 384.57143 515.798)"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg width="64" version="1.1" xmlns="http://www.w3.org/2000/svg" height="64" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
<defs id="defs5455">
<linearGradient inkscape:collect="always" id="linearGradient4251-0">
<stop style="stop-color:#63984b" id="stop4253-4"/>
<stop offset="1" style="stop-color:#8fc278" id="stop4255-2"/>
</linearGradient>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient4251-0" id="linearGradient4232" y1="54" y2="12" x2="0" gradientUnits="userSpaceOnUse"/>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient4159" id="linearGradient4384" y1="1043.3622" y2="1012.3622" x2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.625 0 0 0.54839315 437.17147 -33.374703)"/>
<linearGradient inkscape:collect="always" id="linearGradient4159">
<stop style="stop-color:#2a2c2f" id="stop4161"/>
<stop offset="1" style="stop-color:#424649" id="stop4163"/>
</linearGradient>
<linearGradient inkscape:collect="always" id="linearGradient4300-2">
<stop style="stop-color:#22a7f0" id="stop4302-4"/>
<stop offset="1" style="stop-color:#19b5fe" id="stop4304-7"/>
</linearGradient>
<linearGradient id="linearGradient4300-2-3">
<stop style="stop-color:#f9b425" id="stop4302-4-0"/>
<stop offset="1" style="stop-color:#f9bf3b" id="stop4304-1"/>
</linearGradient>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient4300-2" id="linearGradient4824" y1="523.79797" y2="516.79797" gradientUnits="userSpaceOnUse" x2="0" gradientTransform="matrix(1 0 0 1 -376.5722 -485.79797)"/>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient4300-2" id="linearGradient4830" y1="523.79797" y2="516.79797" gradientUnits="userSpaceOnUse" x2="0" gradientTransform="matrix(1 0 0 1 -376.5722 -479.79797)"/>
<linearGradient inkscape:collect="always" id="linearGradient4227">
<stop style="stop-color:#292c2f" id="stop4229"/>
<stop offset="1" style="stop-opacity:0" id="stop4231"/>
</linearGradient>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient4227" id="linearGradient4864" y1="20" x1="20" y2="48" x2="48" gradientUnits="userSpaceOnUse"/>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient4227" id="linearGradient4936" y1="6" x1="-6" y2="36" gradientUnits="userSpaceOnUse" x2="24" gradientTransform="matrix(1 0 0 1 0 12)"/>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient4227" id="linearGradient4940" y1="6" x1="-6" y2="36" gradientUnits="userSpaceOnUse" x2="24" gradientTransform="matrix(1 0 0 1 0 18)"/>
</defs>
<metadata id="metadata5458"/>
<g inkscape:label="Capa 1" inkscape:groupmode="layer" id="layer1" transform="matrix(1 0 0 1 -376.57144 -491.79797)">
<path inkscape:connector-curvature="0" style="fill:url(#linearGradient4232)" id="rect4200" d="m 6,12 0,42 4,0 0,-4 12,0 0,4 30,0 0,-4 6,0 0,-26 -18,0 -30,0 0,-10 0,-2 z" transform="matrix(1 0 0 1 376.57144 491.79797)"/>
<path style="fill:url(#linearGradient4940);opacity:0.2;fill-rule:evenodd" id="path4938" d="M 15 40 L 10 44 L 16 50 L 22 50 L 22 54 L 29 54 L 15 40 z " transform="matrix(1 0 0 1 376.57144 491.79797)"/>
<path style="fill:url(#linearGradient4936);opacity:0.2;fill-rule:evenodd" id="path4934" d="M 15 34 L 10 38 L 22 50 L 26 54 L 35 54 L 15 34 z " transform="matrix(1 0 0 1 376.57144 491.79797)"/>
<path inkscape:connector-curvature="0" style="fill:url(#linearGradient4864);opacity:0.2;fill-rule:evenodd" id="path4842" d="m 48,30 -20,17 6,7 18,0 0,-4 6,0 0,-10 z" transform="matrix(1 0 0 1 376.57144 491.79797)"/>
<rect width="29.999998" x="398.57144" y="544.79797" height="0.999996" style="fill:#dce269" id="rect4234"/>
<path inkscape:connector-curvature="0" style="color:#000000" id="path4303" d="m 406.57144,539.79797 0,1 1,0 0,-1 -1,0 z m 1,1 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,-1 -1,0 0,1 z m 1,0 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,-1 -1,0 0,1 z m 1,0 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,-1 -1,0 0,1 z m 1,0 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,-1 -1,0 0,1 z m 1,0 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,-1 -1,0 0,1 z m 1,0 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,-1 -1,0 0,1 z m 1,0 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,-1 -1,0 0,1 z m 1,0 0,1 1,0 0,-1 -1,0 z"/>
<path inkscape:connector-curvature="0" style="color:#000000" id="path4313" d="m 390.57144,538.79797 0,1 1,0 0,-1 -1,0 z m 1,1 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,-1 -1,0 0,1 z m 1,0 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,-1 -1,0 0,1 z m -4,0 -1,0 0,1 1,0 0,-1 z"/>
<rect width="20" x="404.67142" y="521.79797" height="17.00019" style="fill:url(#linearGradient4384);fill-rule:evenodd" id="rect4241"/>
<rect width="4" x="382.57144" y="503.79797" height="42" style="fill:#afc0c6" id="rect4487"/>
<rect width="1" x="382.57144" y="503.79797" height="42" style="fill:#96aab5" id="rect4489"/>
<path inkscape:connector-curvature="0" style="color:#000000" id="path4497" d="m 422.57144,518.79797 0,1 -1,0 0,-1 1,0 z m -1,1 0,1 -1,0 0,-1 1,0 z m -1,0 -1,0 0,-1 1,0 0,1 z m -1,0 0,1 -1,0 0,-1 1,0 z m -1,0 -1,0 0,-1 1,0 0,1 z m -1,0 0,1 -1,0 0,-1 1,0 z m -1,0 -1,0 0,-1 1,0 0,1 z m -1,0 0,1 -1,0 0,-1 1,0 z m -1,0 -1,0 0,-1 1,0 0,1 z m -1,0 0,1 -1,0 0,-1 1,0 z m -1,0 -1,0 0,-1 1,0 0,1 z m -1,0 0,1 -1,0 0,-1 1,0 z m -1,0 -1,0 0,-1 1,0 0,1 z m -1,0 0,1 -1,0 0,-1 1,0 z m -1,0 -1,0 0,-1 1,0 0,1 z m -1,0 0,1 -1,0 0,-1 1,0 z"/>
<path inkscape:connector-curvature="0" style="fill:url(#linearGradient4824)" id="path4822" d="m 386.57145,525.79797 0,4 3.90039,0 c 0.0355,0 0.0651,-0.016 0.0996,-0.0195 l 0,0.0195 1,0 0,-4 -1,0 0,0.0195 c -0.0345,-0.004 -0.0641,-0.0195 -0.0996,-0.0195 l -3.90039,0 z"/>
<path inkscape:connector-curvature="0" style="fill:url(#linearGradient4830)" id="path4828" d="m 386.57145,531.79797 0,4 3.90039,0 c 0.0355,0 0.0651,-0.016 0.0996,-0.0195 l 0,0.0195 1,0 0,-4 -1,0 0,0.0195 c -0.0345,-0.004 -0.0641,-0.0195 -0.0996,-0.0195 l -3.90039,0 z"/>
<rect width="5" x="386.57144" y="534.79797" height="1" style="opacity:0.09" id="rect4832"/>
<rect width="5" x="386.57144" y="528.79797" height="1" style="opacity:0.09" id="rect4834"/>
<rect width="2" x="381.57144" y="525.79797" height="4" style="fill:#afc0c6" id="rect4197-7"/>
<rect width="2" x="381.57144" y="531.79797" height="4" style="fill:#afc0c6" id="rect4197-5"/>
<path inkscape:connector-curvature="0" style="fill:#afc0c6" id="rect4161" d="m 413.67142,524.29807 0,1 6,0 0,7 -6,0 0,2 0,1 -1,0 c -0.55401,0 -1,-0.44599 -1,-1 l 0,-2 0,-2 0,-1 1,0 0,-4 -3,0 0,4 1,0 0,1 0,2 0,2 c 0,1.108 0.892,2 2,2 l 1,0 2,0 2,0 0,-1 -2,0 0,-1 5,0 0,-1 0,-1 0,-8 -7,0 z m -3,3 1,0 0,1 -1,0 0,-1 z m -2,3 0,4 1,0 0,-2 0,-2 -1,0 z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg width="16" version="1.1" xmlns="http://www.w3.org/2000/svg" height="16" viewBox="0 0 16 16" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
<defs id="defs4"/>
<metadata id="metadata7"/>
<path inkscape:label="Capa 1" inkscape:groupmode="layer" style="fill:#6c7a89;color:#000000;stroke-width:1.4" id="rect4020" d="M 2 2 L 2 3 L 8 3 L 8 2 L 2 2 z M 2 5 L 2 6 L 14 6 L 14 5 L 2 5 z M 2 8 L 2 9 L 8 9 L 8 8 L 2 8 z M 2 10 L 2 11 L 14 11 L 14 10 L 2 10 z M 2 13 L 2 14 L 11 14 L 11 13 L 2 13 z "/>
</svg>

After

Width:  |  Height:  |  Size: 635 B

View File

@ -0,0 +1,14 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path
style="opacity:1;fill:currentColor;fill-opacity:1;stroke:none"
d="M 3 3 L 3 4 L 3 19 L 4 19 L 19 19 L 19 18 L 19 5 L 12.007812 5 L 10.007812 3 L 10 3.0078125 L 10 3 L 4 3 L 3 3 z M 9.0078125 8 L 18 8 L 18 18 L 4 18 L 4 10 L 7 10 L 7 9.9921875 L 7.0078125 10 L 9.0078125 8 z "
id="rect4069"
class="ColorScheme-Text" />
</svg>

After

Width:  |  Height:  |  Size: 585 B

View File

@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d
}
</style>
</defs>
<path
style="fill:currentColor;fill-opacity:1;stroke:none"
d="M 3 3 L 3 4 L 3 19 L 4 19 L 19 19 L 19 18 L 19 5 L 12.007812 5 L 10.007812 3 L 10 3.0078125 L 10 3 L 4 3 L 3 3 z M 4 4 L 7 4 L 9.5859375 4 L 10.589844 5.0039062 L 6.5703125 9 L 6.5683594 9 L 4 9 L 4 4 z M 9.0078125 8 L 18 8 L 18 18 L 4 18 L 4 10 L 5.5625 10 L 7 10 L 7 9.9921875 L 7.0078125 10 L 9.0078125 8 z "
class="ColorScheme-Text" />
</svg>

After

Width:  |  Height:  |  Size: 654 B

View File

@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d
}
</style>
</defs>
<path
style="fill:currentColor;fill-opacity:1;stroke:none"
d="M 3 3 L 3 19 L 19 19 L 19 3 L 3 3 z M 14 4 L 18 4 L 18 5 L 14 5 L 14 4 z M 4 7 L 18 7 L 18 8 L 4 8 L 4 7 z M 14 10 L 18 10 L 18 11 L 14 11 L 14 10 z M 4 13 L 18 13 L 18 14 L 4 14 L 4 13 z M 14 16 L 18 16 L 18 17 L 14 17 L 14 16 z "
class="ColorScheme-Text" />
</svg>

After

Width:  |  Height:  |  Size: 574 B

View File

@ -4,89 +4,89 @@
<context>
<name>Data::SyncthingConnection</name>
<message>
<location filename="../data/syncthingconnection.cpp" line="70"/>
<location filename="../data/syncthingconnection.cpp" line="101"/>
<source>disconnected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="72"/>
<location filename="../data/syncthingconnection.cpp" line="103"/>
<source>connected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="74"/>
<location filename="../data/syncthingconnection.cpp" line="105"/>
<source>connected, notifications available</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="76"/>
<location filename="../data/syncthingconnection.cpp" line="107"/>
<source>connected, paused</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="78"/>
<location filename="../data/syncthingconnection.cpp" line="109"/>
<source>connected, synchronizing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="80"/>
<location filename="../data/syncthingconnection.cpp" line="111"/>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="355"/>
<location filename="../data/syncthingconnection.cpp" line="386"/>
<source>Unable to parse Syncthing log: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="359"/>
<location filename="../data/syncthingconnection.cpp" line="390"/>
<source>Unable to request system log: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="387"/>
<location filename="../data/syncthingconnection.cpp" line="492"/>
<location filename="../data/syncthingconnection.cpp" line="418"/>
<location filename="../data/syncthingconnection.cpp" line="518"/>
<source>Unable to parse Syncthing config: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="392"/>
<location filename="../data/syncthingconnection.cpp" line="497"/>
<location filename="../data/syncthingconnection.cpp" line="423"/>
<location filename="../data/syncthingconnection.cpp" line="523"/>
<source>Unable to request Syncthing config: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="553"/>
<location filename="../data/syncthingconnection.cpp" line="580"/>
<source>Unable to parse connections: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="558"/>
<location filename="../data/syncthingconnection.cpp" line="585"/>
<source>Unable to request connections: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="595"/>
<location filename="../data/syncthingconnection.cpp" line="626"/>
<source>Unable to parse Syncthing events: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="617"/>
<location filename="../data/syncthingconnection.cpp" line="648"/>
<source>Unable to request Syncthing events: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="727"/>
<location filename="../data/syncthingconnection.cpp" line="799"/>
<source>Unable to request rescan: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="742"/>
<location filename="../data/syncthingconnection.cpp" line="814"/>
<source>Unable to request pause/resume: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="323"/>
<location filename="../data/syncthingconnection.cpp" line="354"/>
<source>Unable to request QR-Code: </source>
<translation type="unfinished"></translation>
</message>
@ -269,6 +269,19 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>QtGui::AppearanceOptionPage</name>
<message>
<location filename="../gui/appearanceoptionpage.ui" line="6"/>
<source>Appearance</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/appearanceoptionpage.ui" line="12"/>
<source>Show traffic</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>QtGui::ConnectionOptionPage</name>
<message>
@ -340,44 +353,49 @@
<source>Launcher</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/launcheroptionpage.ui" line="20"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Not implemented yet.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This will allow launching Syncthing when the tray is started.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>QtGui::NotificationsOptionPage</name>
<message>
<location filename="../gui/notificationsoptionpage.ui" line="6"/>
<location filename="../gui/notificationsoptionpage.ui" line="14"/>
<source>Notifications</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/notificationsoptionpage.ui" line="12"/>
<location filename="../gui/notificationsoptionpage.ui" line="20"/>
<source>Notify on disconnect</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/notificationsoptionpage.ui" line="19"/>
<source>Notify on errors</source>
<location filename="../gui/notificationsoptionpage.ui" line="27"/>
<source>Notify on internal errors</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/notificationsoptionpage.ui" line="26"/>
<location filename="../gui/notificationsoptionpage.ui" line="34"/>
<source>Notify on Syncthing errors</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/notificationsoptionpage.ui" line="41"/>
<source>Notify on sync complete</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/notificationsoptionpage.ui" line="33"/>
<source>Show Syncthing notifications</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>QtGui::SettingsDialog</name>
<message>
<location filename="../gui/settingsdialog.cpp" line="187"/>
<location filename="../gui/settingsdialog.cpp" line="211"/>
<source>Tray</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="195"/>
<location filename="../gui/settingsdialog.cpp" line="219"/>
<source>Web view</source>
<translation type="unfinished"></translation>
</message>
@ -385,22 +403,22 @@
<context>
<name>QtGui::TrayIcon</name>
<message>
<location filename="../gui/tray.cpp" line="346"/>
<location filename="../gui/tray.cpp" line="357"/>
<source>Web UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="347"/>
<location filename="../gui/tray.cpp" line="358"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="348"/>
<location filename="../gui/tray.cpp" line="359"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="350"/>
<location filename="../gui/tray.cpp" line="361"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@ -464,17 +482,40 @@
</message>
<message>
<location filename="../gui/traywidget.ui" line="103"/>
<location filename="../gui/tray.cpp" line="235"/>
<location filename="../gui/tray.cpp" line="239"/>
<source>Connect</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="178"/>
<location filename="../gui/traywidget.ui" line="191"/>
<source>Traffic</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="216"/>
<source>In</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="223"/>
<location filename="../gui/traywidget.ui" line="240"/>
<location filename="../gui/tray.cpp" line="319"/>
<location filename="../gui/tray.cpp" line="320"/>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="230"/>
<source>Out</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="270"/>
<source>Directories</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="207"/>
<location filename="../gui/traywidget.ui" line="299"/>
<source>Devices</source>
<translation type="unfinished"></translation>
</message>
@ -494,82 +535,82 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="78"/>
<location filename="../gui/tray.cpp" line="79"/>
<source>View own device ID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="117"/>
<location filename="../gui/tray.cpp" line="121"/>
<source>Settings - Syncthing tray</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="136"/>
<location filename="../gui/tray.cpp" line="140"/>
<source>Tray application for Syncthing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="89"/>
<location filename="../gui/tray.cpp" line="90"/>
<source>Rescan all directories</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="83"/>
<location filename="../gui/tray.cpp" line="84"/>
<source>Show Syncthing log</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="137"/>
<location filename="../gui/tray.cpp" line="141"/>
<source>About - Syncthing Tray</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="175"/>
<location filename="../gui/tray.cpp" line="179"/>
<source>Own device ID - Syncthing Tray</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="185"/>
<location filename="../gui/tray.cpp" line="189"/>
<source>device ID is unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="193"/>
<location filename="../gui/tray.cpp" line="197"/>
<source>Copy to clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="209"/>
<location filename="../gui/tray.cpp" line="213"/>
<source>Log - Syncthing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="236"/>
<location filename="../gui/tray.cpp" line="240"/>
<source>Not connected to Syncthing, click to connect</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="242"/>
<location filename="../gui/tray.cpp" line="246"/>
<source>Pause</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="243"/>
<location filename="../gui/tray.cpp" line="247"/>
<source>Syncthing is running, click to pause all devices</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="248"/>
<location filename="../gui/tray.cpp" line="252"/>
<source>At least one device is paused, click to resume</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="247"/>
<location filename="../gui/tray.cpp" line="251"/>
<source>Continue</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="272"/>
<location filename="../gui/tray.cpp" line="277"/>
<source>The directly &lt;i&gt;%1&lt;/i&gt; does not exist on the local machine.</source>
<translation type="unfinished"></translation>
</message>
@ -586,7 +627,7 @@
<name>QtGui::WebViewOptionPage</name>
<message>
<location filename="../gui/webviewoptionpage.ui" line="14"/>
<location filename="../gui/settingsdialog.cpp" line="149"/>
<location filename="../gui/settingsdialog.cpp" line="173"/>
<source>General</source>
<translation type="unfinished"></translation>
</message>
@ -616,7 +657,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="151"/>
<location filename="../gui/settingsdialog.cpp" line="175"/>
<source>Syncthing Tray has not been built with vieb view support utilizing either Qt WebKit or Qt WebEngine.
The Web UI will be opened in the default web browser instead.</source>
<translation type="unfinished"></translation>

View File

@ -4,89 +4,89 @@
<context>
<name>Data::SyncthingConnection</name>
<message>
<location filename="../data/syncthingconnection.cpp" line="70"/>
<location filename="../data/syncthingconnection.cpp" line="101"/>
<source>disconnected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="72"/>
<location filename="../data/syncthingconnection.cpp" line="103"/>
<source>connected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="74"/>
<location filename="../data/syncthingconnection.cpp" line="105"/>
<source>connected, notifications available</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="76"/>
<location filename="../data/syncthingconnection.cpp" line="107"/>
<source>connected, paused</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="78"/>
<location filename="../data/syncthingconnection.cpp" line="109"/>
<source>connected, synchronizing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="80"/>
<location filename="../data/syncthingconnection.cpp" line="111"/>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="355"/>
<location filename="../data/syncthingconnection.cpp" line="386"/>
<source>Unable to parse Syncthing log: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="359"/>
<location filename="../data/syncthingconnection.cpp" line="390"/>
<source>Unable to request system log: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="387"/>
<location filename="../data/syncthingconnection.cpp" line="492"/>
<location filename="../data/syncthingconnection.cpp" line="418"/>
<location filename="../data/syncthingconnection.cpp" line="518"/>
<source>Unable to parse Syncthing config: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="392"/>
<location filename="../data/syncthingconnection.cpp" line="497"/>
<location filename="../data/syncthingconnection.cpp" line="423"/>
<location filename="../data/syncthingconnection.cpp" line="523"/>
<source>Unable to request Syncthing config: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="553"/>
<location filename="../data/syncthingconnection.cpp" line="580"/>
<source>Unable to parse connections: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="558"/>
<location filename="../data/syncthingconnection.cpp" line="585"/>
<source>Unable to request connections: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="595"/>
<location filename="../data/syncthingconnection.cpp" line="626"/>
<source>Unable to parse Syncthing events: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="617"/>
<location filename="../data/syncthingconnection.cpp" line="648"/>
<source>Unable to request Syncthing events: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="727"/>
<location filename="../data/syncthingconnection.cpp" line="799"/>
<source>Unable to request rescan: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="742"/>
<location filename="../data/syncthingconnection.cpp" line="814"/>
<source>Unable to request pause/resume: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../data/syncthingconnection.cpp" line="323"/>
<location filename="../data/syncthingconnection.cpp" line="354"/>
<source>Unable to request QR-Code: </source>
<translation type="unfinished"></translation>
</message>
@ -269,6 +269,19 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>QtGui::AppearanceOptionPage</name>
<message>
<location filename="../gui/appearanceoptionpage.ui" line="6"/>
<source>Appearance</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/appearanceoptionpage.ui" line="12"/>
<source>Show traffic</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>QtGui::ConnectionOptionPage</name>
<message>
@ -340,44 +353,49 @@
<source>Launcher</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/launcheroptionpage.ui" line="20"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Not implemented yet.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This will allow launching Syncthing when the tray is started.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>QtGui::NotificationsOptionPage</name>
<message>
<location filename="../gui/notificationsoptionpage.ui" line="6"/>
<location filename="../gui/notificationsoptionpage.ui" line="14"/>
<source>Notifications</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/notificationsoptionpage.ui" line="12"/>
<location filename="../gui/notificationsoptionpage.ui" line="20"/>
<source>Notify on disconnect</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/notificationsoptionpage.ui" line="19"/>
<source>Notify on errors</source>
<location filename="../gui/notificationsoptionpage.ui" line="27"/>
<source>Notify on internal errors</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/notificationsoptionpage.ui" line="26"/>
<location filename="../gui/notificationsoptionpage.ui" line="34"/>
<source>Notify on Syncthing errors</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/notificationsoptionpage.ui" line="41"/>
<source>Notify on sync complete</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/notificationsoptionpage.ui" line="33"/>
<source>Show Syncthing notifications</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>QtGui::SettingsDialog</name>
<message>
<location filename="../gui/settingsdialog.cpp" line="187"/>
<location filename="../gui/settingsdialog.cpp" line="211"/>
<source>Tray</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="195"/>
<location filename="../gui/settingsdialog.cpp" line="219"/>
<source>Web view</source>
<translation type="unfinished"></translation>
</message>
@ -385,22 +403,22 @@
<context>
<name>QtGui::TrayIcon</name>
<message>
<location filename="../gui/tray.cpp" line="346"/>
<location filename="../gui/tray.cpp" line="357"/>
<source>Web UI</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="347"/>
<location filename="../gui/tray.cpp" line="358"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="348"/>
<location filename="../gui/tray.cpp" line="359"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="350"/>
<location filename="../gui/tray.cpp" line="361"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@ -464,17 +482,40 @@
</message>
<message>
<location filename="../gui/traywidget.ui" line="103"/>
<location filename="../gui/tray.cpp" line="235"/>
<location filename="../gui/tray.cpp" line="239"/>
<source>Connect</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="178"/>
<location filename="../gui/traywidget.ui" line="191"/>
<source>Traffic</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="216"/>
<source>In</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="223"/>
<location filename="../gui/traywidget.ui" line="240"/>
<location filename="../gui/tray.cpp" line="319"/>
<location filename="../gui/tray.cpp" line="320"/>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="230"/>
<source>Out</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="270"/>
<source>Directories</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="207"/>
<location filename="../gui/traywidget.ui" line="299"/>
<source>Devices</source>
<translation type="unfinished"></translation>
</message>
@ -494,82 +535,82 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="78"/>
<location filename="../gui/tray.cpp" line="79"/>
<source>View own device ID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="117"/>
<location filename="../gui/tray.cpp" line="121"/>
<source>Settings - Syncthing tray</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="136"/>
<location filename="../gui/tray.cpp" line="140"/>
<source>Tray application for Syncthing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="89"/>
<location filename="../gui/tray.cpp" line="90"/>
<source>Rescan all directories</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="83"/>
<location filename="../gui/tray.cpp" line="84"/>
<source>Show Syncthing log</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="137"/>
<location filename="../gui/tray.cpp" line="141"/>
<source>About - Syncthing Tray</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="175"/>
<location filename="../gui/tray.cpp" line="179"/>
<source>Own device ID - Syncthing Tray</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="185"/>
<location filename="../gui/tray.cpp" line="189"/>
<source>device ID is unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="193"/>
<location filename="../gui/tray.cpp" line="197"/>
<source>Copy to clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="209"/>
<location filename="../gui/tray.cpp" line="213"/>
<source>Log - Syncthing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="236"/>
<location filename="../gui/tray.cpp" line="240"/>
<source>Not connected to Syncthing, click to connect</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="242"/>
<location filename="../gui/tray.cpp" line="246"/>
<source>Pause</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="243"/>
<location filename="../gui/tray.cpp" line="247"/>
<source>Syncthing is running, click to pause all devices</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="248"/>
<location filename="../gui/tray.cpp" line="252"/>
<source>At least one device is paused, click to resume</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="247"/>
<location filename="../gui/tray.cpp" line="251"/>
<source>Continue</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/tray.cpp" line="272"/>
<location filename="../gui/tray.cpp" line="277"/>
<source>The directly &lt;i&gt;%1&lt;/i&gt; does not exist on the local machine.</source>
<translation type="unfinished"></translation>
</message>
@ -586,7 +627,7 @@
<name>QtGui::WebViewOptionPage</name>
<message>
<location filename="../gui/webviewoptionpage.ui" line="14"/>
<location filename="../gui/settingsdialog.cpp" line="149"/>
<location filename="../gui/settingsdialog.cpp" line="173"/>
<source>General</source>
<translation type="unfinished"></translation>
</message>
@ -616,7 +657,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="151"/>
<location filename="../gui/settingsdialog.cpp" line="175"/>
<source>Syncthing Tray has not been built with vieb view support utilizing either Qt WebKit or Qt WebEngine.
The Web UI will be opened in the default web browser instead.</source>
<translation type="unfinished"></translation>