Determine systemd unit activation timestamp

This commit is contained in:
Martchus 2017-01-13 10:25:50 +01:00
parent bbac12f9e9
commit d1b61ba24a
9 changed files with 198 additions and 120 deletions

View File

@ -36,6 +36,8 @@ set(TS_FILES
# find c++utilities
find_package(c++utilities 4.0.0 REQUIRED)
use_cpp_utilities()
set(META_PUBLIC_SHARED_LIB_DEPENDS c++utilities)
set(META_PUBLIC_STATIC_LIB_DEPENDS c++utilities_static)
# find qtutilities (only headers and CMake modules used)
find_package(qtutilities 5.0.0 REQUIRED)

View File

@ -17,6 +17,7 @@
using namespace std;
using namespace std::placeholders;
using namespace ChronoUtilities;
namespace Data {
@ -36,6 +37,11 @@ const QDBusArgument &operator>>(const QDBusArgument &argument, ManagerDBusUnitFi
return argument;
}
constexpr DateTime dateTimeFromSystemdTimeStamp(qulonglong timeStamp)
{
return DateTime(621355968000000000 + timeStamp * 10);
}
OrgFreedesktopSystemd1ManagerInterface *SyncthingService::s_manager = nullptr;
SyncthingService::SyncthingService(QObject *parent) :
@ -140,10 +146,12 @@ void SyncthingService::handleUnitGet(QDBusPendingCallWatcher *watcher)
void SyncthingService::handlePropertiesChanged(const QString &interface, const QVariantMap &changedProperties, const QStringList &invalidatedProperties)
{
if(interface == m_unit->interface()) {
handlePropertyChanged(m_activeSince, QStringLiteral("ActiveEnterTimestamp"), changedProperties, invalidatedProperties);
const bool wasRunningBefore = isRunning();
if(handlePropertyChanged(m_activeState, &SyncthingService::activeStateChanged, QStringLiteral("ActiveState"), changedProperties, invalidatedProperties)
| handlePropertyChanged(m_subState, &SyncthingService::subStateChanged, QStringLiteral("SubState"), changedProperties, invalidatedProperties)) {
emit stateChanged(m_activeState, m_subState);
emit stateChanged(m_activeState, m_subState, m_activeSince);
}
const bool currentlyRunning = isRunning();
if(currentlyRunning) {
@ -196,6 +204,23 @@ bool SyncthingService::handlePropertyChanged(QString &variable, void (SyncthingS
return false;
}
bool SyncthingService::handlePropertyChanged(DateTime &variable, const QString &propertyName, const QVariantMap &changedProperties, const QStringList &invalidatedProperties)
{
const QVariant valueVariant(changedProperties[propertyName]);
if(valueVariant.isValid()) {
bool ok;
const qulonglong valueInt = valueVariant.toULongLong(&ok);
if(ok) {
variable = dateTimeFromSystemdTimeStamp(valueInt);
return true;
}
} else if(invalidatedProperties.contains(propertyName) && !variable.isNull()) {
variable = DateTime();
return true;
}
return false;
}
void SyncthingService::registerErrorHandler(const QDBusPendingCall &call, const char *context)
{
connect(new QDBusPendingCallWatcher(call, this), &QDBusPendingCallWatcher::finished, bind(&SyncthingService::handleError, this, context, _1));
@ -215,6 +240,7 @@ void SyncthingService::setUnit(const QDBusObjectPath &objectPath)
// init unit
m_unit = new OrgFreedesktopSystemd1UnitInterface(s_manager->service(), path, s_manager->connection());
m_activeSince = dateTimeFromSystemdTimeStamp(m_unit->activeEnterTimestamp());
setProperties(m_unit->activeState(), m_unit->subState(), m_unit->unitFileState(), m_unit->description());
// init properties
@ -235,7 +261,7 @@ void SyncthingService::setProperties(const QString &activeState, const QString &
anyStateChanged = true;
}
if(anyStateChanged) {
emit stateChanged(m_activeState, m_subState);
emit stateChanged(m_activeState, m_subState, m_activeSince);
}
if(running != isRunning()) {
emit runningChanged(isRunning());

View File

@ -1,6 +1,8 @@
#ifndef DATA_SYNCTHINGSERVICE_H
#define DATA_SYNCTHINGSERVICE_H
#include <c++utilities/chrono/datetime.h>
#include <QObject>
#include <QVariantMap>
@ -36,6 +38,7 @@ class SyncthingService : public QObject
Q_PROPERTY(bool unitAvailable READ isUnitAvailable)
Q_PROPERTY(QString activeState READ activeState NOTIFY activeStateChanged)
Q_PROPERTY(QString subState READ subState NOTIFY subStateChanged)
Q_PROPERTY(ChronoUtilities::DateTime activeSince READ activeSince NOTIFY activeStateChanged)
Q_PROPERTY(QString unitFileState READ unitFileState NOTIFY unitFileStateChanged)
Q_PROPERTY(QString description READ description NOTIFY descriptionChanged)
Q_PROPERTY(bool running READ isRunning WRITE setRunning NOTIFY runningChanged)
@ -50,6 +53,8 @@ public:
bool isUnitAvailable() const;
const QString &activeState() const;
const QString &subState() const;
ChronoUtilities::DateTime activeSince() const;
bool isActiveFor(unsigned int atleastSeconds) const;
const QString &unitFileState() const;
const QString &description() const;
bool isRunning() const;
@ -68,7 +73,7 @@ public Q_SLOTS:
Q_SIGNALS:
void systemdAvailableChanged(bool available);
void stateChanged(const QString &activeState, const QString &subState);
void stateChanged(const QString &activeState, const QString &subState, ChronoUtilities::DateTime activeSince);
void activeStateChanged(const QString &activeState);
void subStateChanged(const QString &subState);
void unitFileStateChanged(const QString &unitFileState);
@ -89,6 +94,7 @@ private Q_SLOTS:
private:
bool handlePropertyChanged(QString &variable, void(SyncthingService::*signal)(const QString &), const QString &propertyName, const QVariantMap &changedProperties, const QStringList &invalidatedProperties);
bool handlePropertyChanged(ChronoUtilities::DateTime &variable, const QString &propertyName, const QVariantMap &changedProperties, const QStringList &invalidatedProperties);
void registerErrorHandler(const QDBusPendingCall &call, const char *context);
static OrgFreedesktopSystemd1ManagerInterface *s_manager;
@ -102,6 +108,7 @@ private:
QString m_subState;
QString m_unitFileState;
bool m_manuallyStopped;
ChronoUtilities::DateTime m_activeSince;
};
inline const QString &SyncthingService::unitName() const
@ -159,6 +166,16 @@ inline bool SyncthingService::isManuallyStopped() const
return m_manuallyStopped;
}
inline ChronoUtilities::DateTime SyncthingService::activeSince() const
{
return m_activeSince;
}
inline bool SyncthingService::isActiveFor(unsigned int atleastSeconds) const
{
return !m_activeSince.isNull() && (ChronoUtilities::DateTime::now() - m_activeSince).totalSeconds() > atleastSeconds;
}
inline void SyncthingService::enable()
{
setEnabled(true);

View File

@ -4,153 +4,158 @@
<context>
<name>Data::SyncthingConnection</name>
<message>
<location filename="../syncthingconnection.cpp" line="95"/>
<location filename="../syncthingconnection.cpp" line="104"/>
<source>disconnected</source>
<translation>Verbindung getrennt</translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="97"/>
<location filename="../syncthingconnection.cpp" line="106"/>
<source>reconnecting</source>
<translation>Verbindung wird hergestellt</translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="99"/>
<location filename="../syncthingconnection.cpp" line="108"/>
<source>connected</source>
<translation>verbunden</translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="101"/>
<location filename="../syncthingconnection.cpp" line="110"/>
<source>connected, paused</source>
<translation>verbunden, pausiert</translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="103"/>
<location filename="../syncthingconnection.cpp" line="112"/>
<source>connected, synchronizing</source>
<translation>verbunden, am Synchronisieren</translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="105"/>
<location filename="../syncthingconnection.cpp" line="114"/>
<source>unknown</source>
<translation>Verbindungsstatus unbekannt</translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="132"/>
<location filename="../syncthingconnection.cpp" line="219"/>
<location filename="../syncthingconnection.cpp" line="141"/>
<location filename="../syncthingconnection.cpp" line="228"/>
<source>Connection configuration is insufficient.</source>
<translation>Verbindungskonfiguration is ungenügend</translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="589"/>
<location filename="../syncthingconnection.cpp" line="608"/>
<source>Unable to request QR-Code: </source>
<translation>Fehler beim Abfragen des QR-Codes: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="618"/>
<location filename="../syncthingconnection.cpp" line="637"/>
<source>Unable to parse Syncthing log: </source>
<translation>Fehler beim Auslesen des Syncthing-Logs: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="622"/>
<location filename="../syncthingconnection.cpp" line="641"/>
<source>Unable to request Syncthing log: </source>
<translation>Fehler beim Abfragen des Syncthing-Logs: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="656"/>
<location filename="../syncthingconnection.cpp" line="675"/>
<source>Unable to locate certificate used by Syncthing.</source>
<translation>Das SSL-Zertifikat von Syncthing kann nicht gefunden werden.</translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="662"/>
<location filename="../syncthingconnection.cpp" line="681"/>
<source>Unable to load certificate used by Syncthing.</source>
<translation>Das SSL-Zertifikat von Syncthing kann nicht ausgelesen werden.</translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="746"/>
<location filename="../syncthingconnection.cpp" line="766"/>
<source>Unable to parse Syncthing config: </source>
<translation>Fehler beim Auslesen der Syncthing-Konfiguration: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="752"/>
<location filename="../syncthingconnection.cpp" line="772"/>
<source>Unable to request Syncthing config: </source>
<translation>Fehler beim Abfragen der Syncthing-Konfiguration: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="850"/>
<location filename="../syncthingconnection.cpp" line="870"/>
<source>Unable to parse Syncthing status: </source>
<translation>Fehler beim Auslesen des Syncthing-Status: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="856"/>
<location filename="../syncthingconnection.cpp" line="876"/>
<source>Unable to request Syncthing status: </source>
<translation>Fehler beim Abfragen des Syncthing-Status: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="931"/>
<location filename="../syncthingconnection.cpp" line="951"/>
<source>Unable to parse connections: </source>
<translation>Fehler beim Auslesen der Verbindungen: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="937"/>
<location filename="../syncthingconnection.cpp" line="957"/>
<source>Unable to request connections: </source>
<translation>Fehler beim Abfragen der Verbindungen: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="991"/>
<location filename="../syncthingconnection.cpp" line="1011"/>
<source>Unable to parse directory statistics: </source>
<translation>Fehler beim Auslesen der Verzeichnisstatistiken: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="997"/>
<location filename="../syncthingconnection.cpp" line="1017"/>
<source>Unable to request directory statistics: </source>
<translation>Fehler beim Abfragen der Verzeichnisstatistiken: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1033"/>
<location filename="../syncthingconnection.cpp" line="1053"/>
<source>Unable to parse device statistics: </source>
<translation>Fehler beim Auslesen der Gerätestatistiken: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1039"/>
<location filename="../syncthingconnection.cpp" line="1059"/>
<source>Unable to request device statistics: </source>
<translation>Fehler beim Abfragen der Gerätestatistiken: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1077"/>
<location filename="../syncthingconnection.cpp" line="1097"/>
<source>Unable to parse errors: </source>
<translation>Fehler beim Auslesen der Syncthing-Fehlermeldungen: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1088"/>
<location filename="../syncthingconnection.cpp" line="1108"/>
<source>Unable to request errors: </source>
<translation>Fehler beim Abfragen der Syncthing-Fehlermeldungen: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1141"/>
<location filename="../syncthingconnection.cpp" line="1124"/>
<source>Unable to request clearing errors: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1177"/>
<source>Unable to parse Syncthing events: </source>
<translation>Fehler beim Auslesen der Syncthing-Ereignisse: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1163"/>
<location filename="../syncthingconnection.cpp" line="1199"/>
<source>Unable to request Syncthing events: </source>
<translation>Fehler beim Abfragen der Syncthing-Ereignisse: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1426"/>
<location filename="../syncthingconnection.cpp" line="1462"/>
<source>Unable to request rescan: </source>
<translation>Fehler beim Anfordern eines Verzeichnis-Rescans: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1446"/>
<location filename="../syncthingconnection.cpp" line="1482"/>
<source>Unable to request pause/resume: </source>
<translation>Fehler beim Anfordern Gerät zu Pausieren/Fortzusetzen: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1462"/>
<location filename="../syncthingconnection.cpp" line="1498"/>
<source>Unable to request restart: </source>
<translation>Fehler beim Anfordern eines Neustarts: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1478"/>
<location filename="../syncthingconnection.cpp" line="1514"/>
<source>Unable to request shutdown: </source>
<translation>Fehler beim Anfordern Syncthing zu beenden: </translation>
</message>
@ -158,22 +163,22 @@
<context>
<name>Data::SyncthingService</name>
<message>
<location filename="../syncthingservice.cpp" line="96"/>
<location filename="../syncthingservice.cpp" line="104"/>
<source>start unit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingservice.cpp" line="98"/>
<location filename="../syncthingservice.cpp" line="106"/>
<source>stop unit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingservice.cpp" line="105"/>
<location filename="../syncthingservice.cpp" line="113"/>
<source>enable unit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingservice.cpp" line="107"/>
<location filename="../syncthingservice.cpp" line="115"/>
<source>disable unit</source>
<translation type="unfinished"></translation>
</message>

View File

@ -4,153 +4,158 @@
<context>
<name>Data::SyncthingConnection</name>
<message>
<location filename="../syncthingconnection.cpp" line="95"/>
<location filename="../syncthingconnection.cpp" line="104"/>
<source>disconnected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="97"/>
<location filename="../syncthingconnection.cpp" line="106"/>
<source>reconnecting</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="99"/>
<location filename="../syncthingconnection.cpp" line="108"/>
<source>connected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="101"/>
<location filename="../syncthingconnection.cpp" line="110"/>
<source>connected, paused</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="103"/>
<location filename="../syncthingconnection.cpp" line="112"/>
<source>connected, synchronizing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="105"/>
<location filename="../syncthingconnection.cpp" line="114"/>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="132"/>
<location filename="../syncthingconnection.cpp" line="219"/>
<location filename="../syncthingconnection.cpp" line="141"/>
<location filename="../syncthingconnection.cpp" line="228"/>
<source>Connection configuration is insufficient.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="589"/>
<location filename="../syncthingconnection.cpp" line="608"/>
<source>Unable to request QR-Code: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="618"/>
<location filename="../syncthingconnection.cpp" line="637"/>
<source>Unable to parse Syncthing log: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="622"/>
<location filename="../syncthingconnection.cpp" line="641"/>
<source>Unable to request Syncthing log: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="656"/>
<location filename="../syncthingconnection.cpp" line="675"/>
<source>Unable to locate certificate used by Syncthing.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="662"/>
<location filename="../syncthingconnection.cpp" line="681"/>
<source>Unable to load certificate used by Syncthing.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="746"/>
<location filename="../syncthingconnection.cpp" line="766"/>
<source>Unable to parse Syncthing config: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="752"/>
<location filename="../syncthingconnection.cpp" line="772"/>
<source>Unable to request Syncthing config: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="850"/>
<location filename="../syncthingconnection.cpp" line="870"/>
<source>Unable to parse Syncthing status: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="856"/>
<location filename="../syncthingconnection.cpp" line="876"/>
<source>Unable to request Syncthing status: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="931"/>
<location filename="../syncthingconnection.cpp" line="951"/>
<source>Unable to parse connections: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="937"/>
<location filename="../syncthingconnection.cpp" line="957"/>
<source>Unable to request connections: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="991"/>
<location filename="../syncthingconnection.cpp" line="1011"/>
<source>Unable to parse directory statistics: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="997"/>
<location filename="../syncthingconnection.cpp" line="1017"/>
<source>Unable to request directory statistics: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1033"/>
<location filename="../syncthingconnection.cpp" line="1053"/>
<source>Unable to parse device statistics: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1039"/>
<location filename="../syncthingconnection.cpp" line="1059"/>
<source>Unable to request device statistics: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1077"/>
<location filename="../syncthingconnection.cpp" line="1097"/>
<source>Unable to parse errors: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1088"/>
<location filename="../syncthingconnection.cpp" line="1108"/>
<source>Unable to request errors: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1141"/>
<location filename="../syncthingconnection.cpp" line="1124"/>
<source>Unable to request clearing errors: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1177"/>
<source>Unable to parse Syncthing events: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1163"/>
<location filename="../syncthingconnection.cpp" line="1199"/>
<source>Unable to request Syncthing events: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1426"/>
<location filename="../syncthingconnection.cpp" line="1462"/>
<source>Unable to request rescan: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1446"/>
<location filename="../syncthingconnection.cpp" line="1482"/>
<source>Unable to request pause/resume: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1462"/>
<location filename="../syncthingconnection.cpp" line="1498"/>
<source>Unable to request restart: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1478"/>
<location filename="../syncthingconnection.cpp" line="1514"/>
<source>Unable to request shutdown: </source>
<translation type="unfinished"></translation>
</message>
@ -158,22 +163,22 @@
<context>
<name>Data::SyncthingService</name>
<message>
<location filename="../syncthingservice.cpp" line="96"/>
<location filename="../syncthingservice.cpp" line="104"/>
<source>start unit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingservice.cpp" line="98"/>
<location filename="../syncthingservice.cpp" line="106"/>
<source>stop unit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingservice.cpp" line="105"/>
<location filename="../syncthingservice.cpp" line="113"/>
<source>enable unit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingservice.cpp" line="107"/>
<location filename="../syncthingservice.cpp" line="115"/>
<source>disable unit</source>
<translation type="unfinished"></translation>
</message>

View File

@ -27,6 +27,7 @@
# include <qtutilities/misc/dbusnotification.h>
#endif
#ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD
# include <c++utilities/chrono/datetime.h>
# include <qtutilities/misc/dialogutils.h>
#endif
@ -42,6 +43,7 @@
#include <QTextCursor>
#include <QApplication>
#include <QStyle>
#include <QStringBuilder>
#include <functional>
@ -590,7 +592,7 @@ QWidget *SystemdOptionPage::setupWidget()
QObject::connect(ui()->enablePushButton, &QPushButton::clicked, &m_service, &SyncthingService::enable);
QObject::connect(ui()->disablePushButton, &QPushButton::clicked, &m_service, &SyncthingService::disable);
QObject::connect(&m_service, &SyncthingService::descriptionChanged, bind(&SystemdOptionPage::handleDescriptionChanged, this, _1));
QObject::connect(&m_service, &SyncthingService::stateChanged, bind(&SystemdOptionPage::handleStatusChanged, this, _1, _2));
QObject::connect(&m_service, &SyncthingService::stateChanged, bind(&SystemdOptionPage::handleStatusChanged, this, _1, _2, _3));
QObject::connect(&m_service, &SyncthingService::unitFileStateChanged, bind(&SystemdOptionPage::handleEnabledChanged, this, _1));
return widget;
}
@ -614,7 +616,7 @@ void SystemdOptionPage::reset()
ui()->showButtonCheckBox->setChecked(settings.showButton);
ui()->considerForReconnectCheckBox->setChecked(settings.considerForReconnect);
handleDescriptionChanged(m_service.description());
handleStatusChanged(m_service.activeState(), m_service.subState());
handleStatusChanged(m_service.activeState(), m_service.subState(), m_service.activeSince());
handleEnabledChanged(m_service.unitFileState());
}
}
@ -629,7 +631,7 @@ void setIndicatorColor(QWidget *indicator, const QColor &color)
indicator->setStyleSheet(QStringLiteral("border-radius:8px;background-color:") + color.name());
}
void SystemdOptionPage::handleStatusChanged(const QString &activeState, const QString &subState)
void SystemdOptionPage::handleStatusChanged(const QString &activeState, const QString &subState, ChronoUtilities::DateTime activeSince)
{
QStringList status;
if(!activeState.isEmpty()) {
@ -638,11 +640,18 @@ void SystemdOptionPage::handleStatusChanged(const QString &activeState, const QS
if(!subState.isEmpty()) {
status << subState;
}
const bool isRunning = m_service.isRunning();
QString timeStamp;
if(isRunning && !activeSince.isNull()) {
timeStamp = QLatin1Char('\n')
% QCoreApplication::translate("QtGui::SystemdOptionPage", "since ")
% QString::fromUtf8(activeSince.toString(ChronoUtilities::DateTimeOutputFormat::DateAndTime).data());
}
ui()->statusValueLabel->setText(status.isEmpty()
? QCoreApplication::translate("QtGui::SystemdOptionPage", "unknown")
: status.join(QStringLiteral(" - ")));
: status.join(QStringLiteral(" - ")) + timeStamp);
setIndicatorColor(ui()->statusIndicator, status.isEmpty()
? Colors::gray(values().appearance.brightTextColors)
: (isRunning

View File

@ -10,6 +10,10 @@
#include <QWidget>
#include <QProcess>
namespace ChronoUtilities {
class DateTime;
}
namespace Data {
class SyncthingConnection;
class SyncthingService;
@ -58,7 +62,7 @@ BEGIN_DECLARE_UI_FILE_BASED_OPTION_PAGE(SystemdOptionPage)
private:
DECLARE_SETUP_WIDGETS
void handleDescriptionChanged(const QString &description);
void handleStatusChanged(const QString &activeState, const QString &subState);
void handleStatusChanged(const QString &activeState, const QString &subState, ChronoUtilities::DateTime activeSince);
void handleEnabledChanged(const QString &unitFileState);
Data::SyncthingService &m_service;
END_DECLARE_OPTION_PAGE

View File

@ -127,22 +127,22 @@
<translation>Tray-Icon beim Starten der Desktopumgebung automatisch starten</translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="363"/>
<location filename="../gui/settingsdialog.cpp" line="365"/>
<source>This is achieved by adding a *.desktop file under &lt;i&gt;~/.config/autostart&lt;/i&gt; so the setting only affects the current user.</source>
<translation>Durch das Hinzufügen einer *.desktop-Datei unter &lt;i&gt;~/.config/autostart&lt;/i&gt; realisiert - betrifft also nur den aktuellen Benutzer.</translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="365"/>
<location filename="../gui/settingsdialog.cpp" line="367"/>
<source>This is achieved by adding a registry key under &lt;i&gt;HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run&lt;/i&gt; so the setting only affects the current user. Note that the startup entry is invalidated when moving &lt;i&gt;syncthingtray.exe&lt;/i&gt;.</source>
<translation>Durch das Hinzufügen eines Registry-Schlüssels unter &lt;i&gt;HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run&lt;/i&gt; realisiert - betrifft also nur den aktuellen Benutzer.</translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="367"/>
<location filename="../gui/settingsdialog.cpp" line="369"/>
<source>This feature has not been implemented for your platform (yet).</source>
<translation>Diese Funktion wurde für die aktuelle Plattform nicht nicht implementiert.</translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="454"/>
<location filename="../gui/settingsdialog.cpp" line="456"/>
<source>unable to modify startup entry</source>
<translation>Fehler beim aktualisieren des Auto-Start-Eintrags</translation>
</message>
@ -263,27 +263,27 @@
<translation>nicht neu verbinden</translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="73"/>
<location filename="../gui/settingsdialog.cpp" line="75"/>
<source>Auto-detected for local instance</source>
<translation>Kann für lokale Instanz automatisch ermittelt werden</translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="91"/>
<location filename="../gui/settingsdialog.cpp" line="93"/>
<source>Select Syncthing config file</source>
<translation>Wähle die Syncthing-Konfigurationsdatei</translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="98"/>
<location filename="../gui/settingsdialog.cpp" line="100"/>
<source>Unable to parse the Syncthing config file.</source>
<translation>Fehler beim Auslesen der Syncthing-Konfigurationsdatei.</translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="169"/>
<location filename="../gui/settingsdialog.cpp" line="171"/>
<source>Unable to load specified certificate &quot;%1&quot;.</source>
<translation>Fehler beim Auslesen des angegebenen Zertifikats: %1</translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="193"/>
<location filename="../gui/settingsdialog.cpp" line="195"/>
<source>Instance %1</source>
<translation>Instanz %1</translation>
</message>
@ -390,13 +390,13 @@
<translation>Log folgen</translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="536"/>
<location filename="../gui/settingsdialog.cpp" line="538"/>
<source>Syncthing exited with exit code %1
</source>
<translation>Syncthing wurde mit dem Statuscode %1 beendet</translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="539"/>
<location filename="../gui/settingsdialog.cpp" line="541"/>
<source>Syncthing crashed with exit code %1
</source>
<translation>Syncthing ist mit dem Statuscode %1 abgestürzt</translation>
@ -450,7 +450,7 @@
<translation>Methode die von Qt verwendet wird (kann vom QPA-Plugin überschrieben werden)</translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="265"/>
<location filename="../gui/settingsdialog.cpp" line="267"/>
<source>Configured to use D-Bus notifications but D-Bus notification daemon seems unavailabe.</source>
<translation>Benachrichtigungen via D-Bus wurden eingestellt, aber es scheint kein Daemon zu laufen der den Dienst bereitstellt.</translation>
</message>
@ -458,22 +458,22 @@
<context>
<name>QtGui::SettingsDialog</name>
<message>
<location filename="../gui/settingsdialog.cpp" line="720"/>
<location filename="../gui/settingsdialog.cpp" line="729"/>
<source>Tray</source>
<translation></translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="726"/>
<location filename="../gui/settingsdialog.cpp" line="735"/>
<source>Web view</source>
<translation>Weboberfläche</translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="732"/>
<location filename="../gui/settingsdialog.cpp" line="741"/>
<source>Startup</source>
<translation>Starten</translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="746"/>
<location filename="../gui/settingsdialog.cpp" line="755"/>
<source>Settings</source>
<translation>Einstellungen</translation>
</message>
@ -514,8 +514,8 @@
<location filename="../gui/systemdoptionpage.ui" line="99"/>
<location filename="../gui/systemdoptionpage.ui" line="154"/>
<location filename="../gui/systemdoptionpage.ui" line="231"/>
<location filename="../gui/settingsdialog.cpp" line="644"/>
<location filename="../gui/settingsdialog.cpp" line="659"/>
<location filename="../gui/settingsdialog.cpp" line="653"/>
<location filename="../gui/settingsdialog.cpp" line="668"/>
<source>unknown</source>
<translation>unbekannt</translation>
</message>
@ -549,10 +549,15 @@
<translation>Stoppen</translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="624"/>
<location filename="../gui/settingsdialog.cpp" line="626"/>
<source>specified unit is either inactive or doesn&apos;t exist</source>
<translation>angegebene Unit ist entweder nicht geladen oder existiert nicht</translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="648"/>
<source>since </source>
<translation>seit </translation>
</message>
</context>
<context>
<name>QtGui::TrayIcon</name>
@ -904,7 +909,7 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
<name>QtGui::WebViewOptionPage</name>
<message>
<location filename="../gui/webviewoptionpage.ui" line="14"/>
<location filename="../gui/settingsdialog.cpp" line="680"/>
<location filename="../gui/settingsdialog.cpp" line="689"/>
<source>General</source>
<translation>Allgemein</translation>
</message>
@ -934,7 +939,7 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
<translation>Lasse Weboberfläche im Hintgergrund weiter offen, wenn Fenster nicht offen</translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="682"/>
<location filename="../gui/settingsdialog.cpp" line="691"/>
<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>Syncthing Tray wurde nicht mit Unterstützung für die eingebaute Anzeige der Weboberfläche unter Verwendung von Qt WebKit oder Qt WebEngine gebaut.

View File

@ -127,22 +127,22 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="363"/>
<location filename="../gui/settingsdialog.cpp" line="365"/>
<source>This is achieved by adding a *.desktop file under &lt;i&gt;~/.config/autostart&lt;/i&gt; so the setting only affects the current user.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="365"/>
<location filename="../gui/settingsdialog.cpp" line="367"/>
<source>This is achieved by adding a registry key under &lt;i&gt;HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run&lt;/i&gt; so the setting only affects the current user. Note that the startup entry is invalidated when moving &lt;i&gt;syncthingtray.exe&lt;/i&gt;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="367"/>
<location filename="../gui/settingsdialog.cpp" line="369"/>
<source>This feature has not been implemented for your platform (yet).</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="454"/>
<location filename="../gui/settingsdialog.cpp" line="456"/>
<source>unable to modify startup entry</source>
<translation type="unfinished"></translation>
</message>
@ -263,27 +263,27 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="73"/>
<location filename="../gui/settingsdialog.cpp" line="75"/>
<source>Auto-detected for local instance</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="91"/>
<location filename="../gui/settingsdialog.cpp" line="93"/>
<source>Select Syncthing config file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="98"/>
<location filename="../gui/settingsdialog.cpp" line="100"/>
<source>Unable to parse the Syncthing config file.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="169"/>
<location filename="../gui/settingsdialog.cpp" line="171"/>
<source>Unable to load specified certificate &quot;%1&quot;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="193"/>
<location filename="../gui/settingsdialog.cpp" line="195"/>
<source>Instance %1</source>
<translation type="unfinished"></translation>
</message>
@ -390,13 +390,13 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="536"/>
<location filename="../gui/settingsdialog.cpp" line="538"/>
<source>Syncthing exited with exit code %1
</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="539"/>
<location filename="../gui/settingsdialog.cpp" line="541"/>
<source>Syncthing crashed with exit code %1
</source>
<translation type="unfinished"></translation>
@ -450,7 +450,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="265"/>
<location filename="../gui/settingsdialog.cpp" line="267"/>
<source>Configured to use D-Bus notifications but D-Bus notification daemon seems unavailabe.</source>
<translation type="unfinished"></translation>
</message>
@ -458,22 +458,22 @@
<context>
<name>QtGui::SettingsDialog</name>
<message>
<location filename="../gui/settingsdialog.cpp" line="720"/>
<location filename="../gui/settingsdialog.cpp" line="729"/>
<source>Tray</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="726"/>
<location filename="../gui/settingsdialog.cpp" line="735"/>
<source>Web view</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="732"/>
<location filename="../gui/settingsdialog.cpp" line="741"/>
<source>Startup</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="746"/>
<location filename="../gui/settingsdialog.cpp" line="755"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
@ -514,8 +514,8 @@
<location filename="../gui/systemdoptionpage.ui" line="99"/>
<location filename="../gui/systemdoptionpage.ui" line="154"/>
<location filename="../gui/systemdoptionpage.ui" line="231"/>
<location filename="../gui/settingsdialog.cpp" line="644"/>
<location filename="../gui/settingsdialog.cpp" line="659"/>
<location filename="../gui/settingsdialog.cpp" line="653"/>
<location filename="../gui/settingsdialog.cpp" line="668"/>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
@ -547,10 +547,15 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="624"/>
<location filename="../gui/settingsdialog.cpp" line="626"/>
<source>specified unit is either inactive or doesn&apos;t exist</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="648"/>
<source>since </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>QtGui::TrayIcon</name>
@ -900,7 +905,7 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
<name>QtGui::WebViewOptionPage</name>
<message>
<location filename="../gui/webviewoptionpage.ui" line="14"/>
<location filename="../gui/settingsdialog.cpp" line="680"/>
<location filename="../gui/settingsdialog.cpp" line="689"/>
<source>General</source>
<translation type="unfinished"></translation>
</message>
@ -930,7 +935,7 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="682"/>
<location filename="../gui/settingsdialog.cpp" line="691"/>
<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>