diff --git a/cli/application.cpp b/cli/application.cpp index 7913ea1..f5cea6f 100644 --- a/cli/application.cpp +++ b/cli/application.cpp @@ -442,7 +442,7 @@ void Application::printDir(const SyncthingDir *dir) printProperty("Last file time", dir->lastFileTime); printProperty("Last file name", dir->lastFileName); printProperty("Download progress", dir->downloadLabel); - printProperty("Devices", dir->devices); + printProperty("Shared with", dir->deviceNames.isEmpty() ? dir->deviceIds : dir->deviceNames); printProperty("Read-only", dir->readOnly); printProperty("Ignore permissions", dir->ignorePermissions); printProperty("Auto-normalize", dir->autoNormalize); diff --git a/connector/syncthingconnection.cpp b/connector/syncthingconnection.cpp index c59702f..acb52be 100644 --- a/connector/syncthingconnection.cpp +++ b/connector/syncthingconnection.cpp @@ -500,7 +500,7 @@ SyncthingDir *SyncthingConnection::findDirInfo(const QString &dirId, int &row) /*! * \brief Appends a directory info object with the specified \a dirId to \a dirs. * - * If such an object already exists, it is recycled by moving it do \a dirs. + * If such an object already exists, it is recycled by moving it to \a dirs. * Otherwise a new, empty object is created. * * \returns Returns the directory info object or nullptr if \a dirId is invalid. @@ -566,7 +566,7 @@ QStringList SyncthingConnection::deviceIds() const /*! * \brief Appends a device info object with the specified \a devId to \a devs. * - * If such an object already exists, it is recycled by moving it do \a dirs. + * If such an object already exists, it is recycled by moving it to \a devs. * Otherwise a new, empty object is created. * * \returns Returns the device info object or nullptr if \a devId is invalid. @@ -878,8 +878,8 @@ void SyncthingConnection::readConfig() if (jsonError.error == QJsonParseError::NoError) { m_rawConfig = replyDoc.object(); emit newConfig(m_rawConfig); - readDirs(m_rawConfig.value(QStringLiteral("folders")).toArray()); readDevs(m_rawConfig.value(QStringLiteral("devices")).toArray()); + readDirs(m_rawConfig.value(QStringLiteral("folders")).toArray()); m_hasConfig = true; if (!isConnected()) { continueConnecting(); @@ -902,21 +902,28 @@ void SyncthingConnection::readConfig() /*! * \brief Reads directory results of requestConfig(); called by readConfig(). + * \remarks The devs are required to resolve the names of the devices a directory is shared with. + * So when parsing the config, readDevs() should be called first. */ void SyncthingConnection::readDirs(const QJsonArray &dirs) { std::vector newDirs; newDirs.reserve(static_cast(dirs.size())); + int dummy; for (const QJsonValue &dirVal : dirs) { const QJsonObject dirObj(dirVal.toObject()); if (SyncthingDir *dirItem = addDirInfo(newDirs, dirObj.value(QStringLiteral("id")).toString())) { dirItem->label = dirObj.value(QStringLiteral("label")).toString(); dirItem->path = dirObj.value(QStringLiteral("path")).toString(); - dirItem->devices.clear(); + dirItem->deviceIds.clear(); + dirItem->deviceNames.clear(); for (const QJsonValue &dev : dirObj.value(QStringLiteral("devices")).toArray()) { const QString devId = dev.toObject().value(QStringLiteral("deviceID")).toString(); if (!devId.isEmpty()) { - dirItem->devices << devId; + dirItem->deviceIds << devId; + if (const SyncthingDev *const dev = findDevInfo(devId, dummy)) { + dirItem->deviceNames << dev->name; + } } } dirItem->readOnly = dirObj.value(QStringLiteral("readOnly")).toBool(false); diff --git a/connector/syncthingdir.cpp b/connector/syncthingdir.cpp index f0423f2..43461c2 100644 --- a/connector/syncthingdir.cpp +++ b/connector/syncthingdir.cpp @@ -50,7 +50,7 @@ bool SyncthingDir::finalizeStatusUpdate(SyncthingDirStatus newStatus) case SyncthingDirStatus::Unshared: if (!itemErrors.empty()) { newStatus = SyncthingDirStatus::OutOfSync; - } else if (devices.size() < 2) { + } else if (deviceIds.size() < 2) { // FIXME: we can assume only own device is assigned, correct? newStatus = SyncthingDirStatus::Unshared; } diff --git a/connector/syncthingdir.h b/connector/syncthingdir.h index 3a04e9c..71de9ca 100644 --- a/connector/syncthingdir.h +++ b/connector/syncthingdir.h @@ -70,7 +70,8 @@ struct LIB_SYNCTHING_CONNECTOR_EXPORT SyncthingDir { QString id; QString label; QString path; - QStringList devices; + QStringList deviceIds; + QStringList deviceNames; bool readOnly = false; bool ignorePermissions = false; bool autoNormalize = false; diff --git a/connector/tests/connectiontests.cpp b/connector/tests/connectiontests.cpp index 4fa5948..5b9eb49 100644 --- a/connector/tests/connectiontests.cpp +++ b/connector/tests/connectiontests.cpp @@ -96,6 +96,7 @@ private: SyncthingConnection m_connection; QString m_ownDevId; + QString m_ownDevName; }; CPPUNIT_TEST_SUITE_REGISTRATION(ConnectionTests); @@ -342,6 +343,7 @@ void ConnectionTests::checkDevices() && dev.id != QStringLiteral("6EIS2PN-J2IHWGS-AXS3YUL-HC5FT3K-77ZXTLL-AKQLJ4C-7SWVPUS-AZW4RQ4")) { CPPUNIT_ASSERT_EQUAL_MESSAGE("own device", QStringLiteral("own device"), dev.statusString()); m_ownDevId = dev.id; + m_ownDevName = dev.name; } } const SyncthingDev *dev1 = nullptr, *dev2 = nullptr; @@ -388,8 +390,10 @@ void ConnectionTests::checkDirectories() const CPPUNIT_ASSERT_EQUAL(QStringLiteral("idle"), dir1.statusString()); CPPUNIT_ASSERT(!dir1.readOnly); CPPUNIT_ASSERT(!dir1.paused); - CPPUNIT_ASSERT_EQUAL(dir1.devices.toSet(), QSet({ QStringLiteral("MMGUI6U-WUEZQCP-XZZ6VYB-LCT4TVC-ER2HAVX-QYT6X7D-S6ZSG2B-323KLQ7"), - QStringLiteral("6EIS2PN-J2IHWGS-AXS3YUL-HC5FT3K-77ZXTLL-AKQLJ4C-7SWVPUS-AZW4RQ4"), m_ownDevId })); + CPPUNIT_ASSERT_EQUAL(QSet({ QStringLiteral("MMGUI6U-WUEZQCP-XZZ6VYB-LCT4TVC-ER2HAVX-QYT6X7D-S6ZSG2B-323KLQ7"), + QStringLiteral("6EIS2PN-J2IHWGS-AXS3YUL-HC5FT3K-77ZXTLL-AKQLJ4C-7SWVPUS-AZW4RQ4"), m_ownDevId }), + dir1.deviceIds.toSet()); + CPPUNIT_ASSERT_EQUAL(QSet({ QStringLiteral("Test dev 2"), QStringLiteral("Test dev 1"), m_ownDevName }), dir1.deviceNames.toSet()); const SyncthingDir &dir2 = dirInfo.back(); CPPUNIT_ASSERT_EQUAL(QStringLiteral("test2"), dir2.id); CPPUNIT_ASSERT_EQUAL(QStringLiteral("Test dir 2"), dir2.label); @@ -400,7 +404,8 @@ void ConnectionTests::checkDirectories() const CPPUNIT_ASSERT(!dir2.readOnly); CPPUNIT_ASSERT(dir2.paused); CPPUNIT_ASSERT_EQUAL( - dir2.devices.toSet(), QSet({ QStringLiteral("MMGUI6U-WUEZQCP-XZZ6VYB-LCT4TVC-ER2HAVX-QYT6X7D-S6ZSG2B-323KLQ7"), m_ownDevId })); + QSet({ QStringLiteral("MMGUI6U-WUEZQCP-XZZ6VYB-LCT4TVC-ER2HAVX-QYT6X7D-S6ZSG2B-323KLQ7"), m_ownDevId }), dir2.deviceIds.toSet()); + CPPUNIT_ASSERT_EQUAL(QSet({ QStringLiteral("Test dev 2"), m_ownDevName }), dir2.deviceNames.toSet()); } void ConnectionTests::testReconnecting() diff --git a/connector/tests/misctests.cpp b/connector/tests/misctests.cpp index 8041175..8b68e01 100644 --- a/connector/tests/misctests.cpp +++ b/connector/tests/misctests.cpp @@ -152,7 +152,7 @@ void MiscTests::testConnectionSettingsAndLoadingSelfSignedCert() void MiscTests::testSyncthingDir() { SyncthingDir dir; - dir.devices << QStringLiteral("dev1") << QStringLiteral("dev2"); + dir.deviceIds << QStringLiteral("dev1") << QStringLiteral("dev2"); DateTime updateTime(DateTime::fromDate(2005, 2, 3)); CPPUNIT_ASSERT(dir.assignStatus(SyncthingDirStatus::Unshared, updateTime)); @@ -195,7 +195,7 @@ void MiscTests::testSyncthingDir() CPPUNIT_ASSERT_EQUAL(QStringLiteral("out of sync"), dir.statusString()); dir.itemErrors.clear(); - dir.devices.removeLast(); + dir.deviceIds.removeLast(); CPPUNIT_ASSERT(dir.assignStatus(QStringLiteral("idle"), updateTime += TimeSpan::fromMinutes(1.5))); CPPUNIT_ASSERT_EQUAL_MESSAGE("dir considered unshared when only one dev present", QStringLiteral("unshared"), dir.statusString()); CPPUNIT_ASSERT(!dir.assignStatus(SyncthingDirStatus::Idle, updateTime += TimeSpan::fromMinutes(1.5))); diff --git a/connector/translations/syncthingconnector_de_DE.ts b/connector/translations/syncthingconnector_de_DE.ts index efb9e54..88cc413 100644 --- a/connector/translations/syncthingconnector_de_DE.ts +++ b/connector/translations/syncthingconnector_de_DE.ts @@ -95,92 +95,92 @@ Fehler beim Abfragen der Syncthing-Konfiguration: - + Unable to parse Syncthing status: Fehler beim Auslesen des Syncthing-Status: - + Unable to request Syncthing status: Fehler beim Abfragen des Syncthing-Status: - + Unable to parse connections: Fehler beim Auslesen der Verbindungen: - + Unable to request connections: Fehler beim Abfragen der Verbindungen: - + Unable to parse directory statistics: Fehler beim Auslesen der Verzeichnisstatistiken: - + Unable to request directory statistics: Fehler beim Abfragen der Verzeichnisstatistiken: - + Unable to parse device statistics: Fehler beim Auslesen der Gerätestatistiken: - + Unable to request device statistics: Fehler beim Abfragen der Gerätestatistiken: - + Unable to parse errors: Fehler beim Auslesen der Syncthing-Fehlermeldungen: - + Unable to request errors: Fehler beim Abfragen der Syncthing-Fehlermeldungen: - + Unable to request clearing errors: Fehler beim Löschen der Fehlermeldungen: - + Unable to parse Syncthing events: Fehler beim Auslesen der Syncthing-Ereignisse: - + Unable to request Syncthing events: Fehler beim Abfragen der Syncthing-Ereignisse: - + Unable to request rescan: Fehler beim Anfordern eines Verzeichnis-Rescans: - + Unable to request device pause/resume: Fehler beim Anfordern Gerät zu Pausieren/Fortzusetzen: - + Unable to request directory pause/resume: Fehler beim Anfordern Verzeichnis zu Pausieren/Fortzusetzen: - + Unable to request restart: Fehler beim Anfordern eines Neustarts: - + Unable to request shutdown: Fehler beim Anfordern Syncthing zu beenden: diff --git a/connector/translations/syncthingconnector_en_US.ts b/connector/translations/syncthingconnector_en_US.ts index 7806c9e..4425e0d 100644 --- a/connector/translations/syncthingconnector_en_US.ts +++ b/connector/translations/syncthingconnector_en_US.ts @@ -95,92 +95,92 @@ - + Unable to parse Syncthing status: - + Unable to request Syncthing status: - + Unable to parse connections: - + Unable to request connections: - + Unable to parse directory statistics: - + Unable to request directory statistics: - + Unable to parse device statistics: - + Unable to request device statistics: - + Unable to parse errors: - + Unable to request errors: - + Unable to request clearing errors: - + Unable to parse Syncthing events: - + Unable to request Syncthing events: - + Unable to request rescan: - + Unable to request device pause/resume: - + Unable to request directory pause/resume: - + Unable to request restart: - + Unable to request shutdown: diff --git a/model/syncthingdirectorymodel.cpp b/model/syncthingdirectorymodel.cpp index 01898ac..0d53306 100644 --- a/model/syncthingdirectorymodel.cpp +++ b/model/syncthingdirectorymodel.cpp @@ -88,7 +88,7 @@ QVariant SyncthingDirectoryModel::data(const QModelIndex &index, int role) const case 1: return tr("Path"); case 2: - return tr("Devices"); + return tr("Shared with"); case 3: return tr("Read-only"); case 4: @@ -109,7 +109,7 @@ QVariant SyncthingDirectoryModel::data(const QModelIndex &index, int role) const case 1: return dir.path; case 2: - return dir.devices.join(QStringLiteral(", ")); + return (dir.deviceNames.isEmpty() ? dir.deviceIds : dir.deviceNames).join(QStringLiteral(", ")); case 3: return dir.readOnly ? tr("yes") : tr("no"); case 4: @@ -162,6 +162,13 @@ QVariant SyncthingDirectoryModel::data(const QModelIndex &index, int role) const case 1: const SyncthingDir &dir = m_dirs[static_cast(index.parent().row())]; switch (index.row()) { + case 2: + if (dir.deviceNames.isEmpty()) { + return dir.deviceIds.join(QChar('\n')); + } else { + return QString(dir.deviceNames.join(QStringLiteral(", ")) % QChar('\n') % QChar('(') % dir.deviceIds.join(QChar('\n')) + % QChar(')')); + } case 5: if (!dir.lastScanTime.isNull()) { return agoString(dir.lastScanTime); diff --git a/model/translations/syncthingmodel_de_DE.ts b/model/translations/syncthingmodel_de_DE.ts index 7f3d886..80c35a6 100644 --- a/model/translations/syncthingmodel_de_DE.ts +++ b/model/translations/syncthingmodel_de_DE.ts @@ -124,9 +124,8 @@ Pfad - Devices - Geräte + Geräte @@ -191,67 +190,72 @@ - + Deleted at %1 Gelöscht am %1 - + Updated at %1 Aktualisiert am %1 - + Click for details Für details klicken - + Failed items Fehlgeschlagene Elemente - + Unknown status Unbekannter Status - + Idle Leerlauf - + Unshared Nicht geteilt - + + Shared with + Geteilt mit + + + Scanning (%1 %) Scannen (%1 %) - + Scanning Scannen - + Synchronizing (%1 %) Synchronisieren (%1 %) - + Synchronizing Synchronisieren - + Paused Pausiert - + Out of sync Nicht synchronisiert diff --git a/model/translations/syncthingmodel_en_US.ts b/model/translations/syncthingmodel_en_US.ts index e06cb2c..ddf00f5 100644 --- a/model/translations/syncthingmodel_en_US.ts +++ b/model/translations/syncthingmodel_en_US.ts @@ -123,11 +123,6 @@ Path - - - Devices - - Read-only @@ -182,6 +177,11 @@ %1 items out of sync + + + Shared with + + %1 and %2 item(s) out of sync @@ -191,67 +191,67 @@ - + Deleted at %1 - + Updated at %1 - + Failed items - + Click for details - + Paused - + Unknown status - + Unshared - + Idle - + Scanning (%1 %) - + Scanning - + Synchronizing (%1 %) - + Synchronizing - + Out of sync diff --git a/widgets/translations/syncthingwidgets_de_DE.ts b/widgets/translations/syncthingwidgets_de_DE.ts index d9caf6c..f0d8f30 100644 --- a/widgets/translations/syncthingwidgets_de_DE.ts +++ b/widgets/translations/syncthingwidgets_de_DE.ts @@ -329,22 +329,22 @@ QtGui::ErrorViewDialog - + Internal errors Interne Fehler - + Request URL: URL der Anfrage: - + Response: Antwort: - + %1 error(s) occured %1 interner Fehler @@ -352,7 +352,7 @@ - + Clear errors Liste der Fehler löschen diff --git a/widgets/translations/syncthingwidgets_en_US.ts b/widgets/translations/syncthingwidgets_en_US.ts index 95d74ab..fd3697d 100644 --- a/widgets/translations/syncthingwidgets_en_US.ts +++ b/widgets/translations/syncthingwidgets_en_US.ts @@ -329,22 +329,22 @@ QtGui::ErrorViewDialog - + Internal errors - + Request URL: - + Response: - + %1 error(s) occured %1 error occured @@ -352,7 +352,7 @@ - + Clear errors