From 7ffb1e0188627326afb2d194dfc3a2a2428c6e2e Mon Sep 17 00:00:00 2001 From: zhaoyingzhen Date: Mon, 17 Oct 2022 14:08:46 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=B7=A8=E7=AB=AF?= =?UTF-8?q?=E5=8D=8F=E5=90=8C=E8=AE=BE=E5=A4=87=E5=88=97=E8=A1=A8=E6=95=B0?= =?UTF-8?q?=E9=87=8F=E6=98=BE=E7=A4=BA=E4=B8=8D=E5=AF=B9=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.原有获取设备数错误,已修复。 2.修改设备列表以设备uuid为标识一台设备方案,改为使用MachinePath,避免服务挂掉重启后,设备列表不更新导致设备连接异常。 3.增加页面显示判断后端服务valid,如果invalid,则清空设备列表数据。 4.去掉自动扫描功能,后端已提供定时发送扫描的全量设备。 Log: 修复跨端协同设备列表数量显示不对的问题。 Bug: https://pms.uniontech.com/task-view-203831.html Influence: 跨端协同设备数量,及设备协同连接。 Change-Id: I3a2cb2f5f77f36df89db53e135838c79df8498ed --- frame/model/collaborationdevmodel.cpp | 50 ++++++-------- frame/model/collaborationdevmodel.h | 9 ++- .../components/devcollaborationwidget.cpp | 65 +++++++++---------- .../components/devcollaborationwidget.h | 3 +- frame/window/components/devitemdelegate.h | 8 +-- 5 files changed, 61 insertions(+), 74 deletions(-) diff --git a/frame/model/collaborationdevmodel.cpp b/frame/model/collaborationdevmodel.cpp index 81be2d560..a987e1b00 100644 --- a/frame/model/collaborationdevmodel.cpp +++ b/frame/model/collaborationdevmodel.cpp @@ -39,7 +39,6 @@ static const QString ColPropertiesInterface = "org.freedesktop.DBus.Properties"; CollaborationDevModel::CollaborationDevModel(QObject *parent) : QObject(parent) - , m_timer(new QTimer(this)) , m_colDbusInter(new QDBusInterface(CollaborationService, CollaborationPath, CollaborationInterface, QDBusConnection::sessionBus(), this)) { if (m_colDbusInter->isValid()) { @@ -56,21 +55,18 @@ CollaborationDevModel::CollaborationDevModel(QObject *parent) } m_colDbusInter->connection().connect(CollaborationService, CollaborationPath, ColPropertiesInterface, - "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(QDBusMessage))); - - connect(m_timer, &QTimer::timeout, this, &CollaborationDevModel::callScanMethod); + "PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(QDBusMessage))); } -void CollaborationDevModel::scanDevice() +void CollaborationDevModel::checkServiceValid() { - callScanMethod(); - m_timer->start(30 * 1000); // 30s -} - -void CollaborationDevModel::stopScanDevice() -{ - if (m_timer->isActive()) - m_timer->stop(); + if (!m_colDbusInter->isValid()) { + for (CollaborationDevice *device : m_devices) { + device->deleteLater(); + } + m_devices.clear(); + Q_EMIT devicesChanged(); + } } QList CollaborationDevModel::devices() const @@ -90,17 +86,15 @@ void CollaborationDevModel::onPropertyChanged(const QDBusMessage &msg) QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); if (changedProps.contains("Machines")) { - QStringList devPaths = changedProps.value("Machines").toStringList(); + QList paths = m_colDbusInter->property("Machines").value>(); + QStringList devPaths; + for (const QDBusObjectPath& path : paths) { + devPaths << path.path(); + } updateDevice(devPaths); } } -void CollaborationDevModel::callScanMethod() -{ - // TODO 该功能目前不可用 - // m_dbusInter->asyncCall("Scan"); -} - void CollaborationDevModel::updateDevice(const QStringList &devPaths) { if (devPaths.isEmpty()) { @@ -132,16 +126,9 @@ void CollaborationDevModel::updateDevice(const QStringList &devPaths) emit devicesChanged(); } -const CollaborationDevice *CollaborationDevModel::getDevice(const QString &uuid) +const CollaborationDevice *CollaborationDevModel::getDevice(const QString &machinePath) { - QList devices = m_devices.values(); - for (const CollaborationDevice *device : devices) { - if (device->uuid() == uuid) { - return device; - } - } - - return nullptr; + return m_devices.value(machinePath, nullptr); } CollaborationDevice::CollaborationDevice(const QString &devPath, QObject *parent) @@ -184,6 +171,11 @@ QString CollaborationDevice::uuid() const return m_uuid; } +QString CollaborationDevice::machinePath() const +{ + return m_path; +} + QString CollaborationDevice::deviceIcon() const { switch (m_OS) { diff --git a/frame/model/collaborationdevmodel.h b/frame/model/collaborationdevmodel.h index 8a2ca1487..cab4b4db2 100644 --- a/frame/model/collaborationdevmodel.h +++ b/frame/model/collaborationdevmodel.h @@ -43,20 +43,18 @@ signals: void devicesChanged(); public: - void scanDevice(); - void stopScanDevice(); + void checkServiceValid(); + QList devices() const; - const CollaborationDevice *getDevice(const QString &uuid); + const CollaborationDevice *getDevice(const QString &machinePath); private slots: void onPropertyChanged(const QDBusMessage &msg); private: - void callScanMethod(); void updateDevice(const QStringList &devPaths); private: - QTimer *m_timer; // 定时扫描设备 QDBusInterface *m_colDbusInter; // machine path : device object QMap m_devices; @@ -84,6 +82,7 @@ public: QString name() const; QString uuid() const; + QString machinePath() const; QString deviceIcon() const; bool isPaired() const; bool isCooperated() const; diff --git a/frame/window/components/devcollaborationwidget.cpp b/frame/window/components/devcollaborationwidget.cpp index e9855f322..0da6ab4ae 100644 --- a/frame/window/components/devcollaborationwidget.cpp +++ b/frame/window/components/devcollaborationwidget.cpp @@ -54,18 +54,11 @@ DevCollaborationWidget::DevCollaborationWidget(QWidget *parent) void DevCollaborationWidget::showEvent(QShowEvent *event) { - m_deviceModel->scanDevice(); + m_deviceModel->checkServiceValid(); QWidget::showEvent(event); } -void DevCollaborationWidget::hideEvent(QHideEvent *event) -{ - m_deviceModel->stopScanDevice(); - - QWidget::hideEvent(event); -} - void DevCollaborationWidget::initUI() { m_deviceListView->setModel(m_viewItemModel); @@ -133,12 +126,12 @@ void DevCollaborationWidget::addItem(const CollaborationDevice *device) int resultState = device->isCooperated() ? DevItemDelegate::Connected : DevItemDelegate::None; item->setData(QVariant::fromValue(data), DevItemDelegate::StaticDataRole); - item->setData(device->uuid(), DevItemDelegate::UUIDDataRole); + item->setData(device->machinePath(), DevItemDelegate::MachinePathDataRole); item->setData(0, DevItemDelegate::DegreeDataRole); item->setData(resultState, DevItemDelegate::ResultDataRole); m_viewItemModel->appendRow(item); - m_uuidItemMap[device->uuid()] = item; + m_deviceItemMap[device->machinePath()] = item; connect(device, &CollaborationDevice::pairedStateChanged, this, &DevCollaborationWidget::itemStatusChanged); } @@ -157,24 +150,24 @@ void DevCollaborationWidget::updateDeviceListView() if (!item) continue; - QString uuid = item->data(DevItemDelegate::UUIDDataRole).toString(); - if (m_deviceModel->getDevice(uuid)) + QString machinePath = item->data(DevItemDelegate::MachinePathDataRole).toString(); + if (m_deviceModel->getDevice(machinePath)) continue; m_deviceListView->removeItem(row); - if (m_uuidItemMap.contains(uuid)) { - m_uuidItemMap.remove(uuid); + if (m_deviceItemMap.contains(machinePath)) { + m_deviceItemMap.remove(machinePath); } - if (m_connectingDevices.contains(uuid)) { - m_connectingDevices.removeAll(uuid); + if (m_connectingDevices.contains(machinePath)) { + m_connectingDevices.removeAll(machinePath); } } // 处理新增 for (CollaborationDevice *device : devices) { - if (!m_uuidItemMap.contains(device->uuid())) { + if (!m_deviceItemMap.contains(device->machinePath())) { addItem(device); } } @@ -189,19 +182,23 @@ void DevCollaborationWidget::resetWidgetSize() void DevCollaborationWidget::itemClicked(const QModelIndex &index) { - QString uuid = index.data(DevItemDelegate::UUIDDataRole).toString(); - const CollaborationDevice *device = m_deviceModel->getDevice(uuid); + QString machinePath = index.data(DevItemDelegate::MachinePathDataRole).toString(); + const CollaborationDevice *device = m_deviceModel->getDevice(machinePath); if (!device) return; if (!device->isPaired()) { device->pair(); - m_connectingDevices.append(uuid); + if (!m_connectingDevices.contains(machinePath)) + m_connectingDevices.append(machinePath); } else if (!device->isCooperated()) { device->requestCooperate(); - m_connectingDevices.append(uuid); + if (!m_connectingDevices.contains(machinePath)) + m_connectingDevices.append(machinePath); } else if (device->isCooperated()) { device->disconnectDevice(); + if (m_connectingDevices.contains(machinePath)) + m_connectingDevices.removeOne(machinePath); } if (!m_connectingDevices.isEmpty() && !m_refreshTimer->isActive()) @@ -214,18 +211,18 @@ void DevCollaborationWidget::itemStatusChanged() if (!device) return; - QString uuid = device->uuid(); - if (m_uuidItemMap.contains(uuid) && m_uuidItemMap[uuid]) { + QString machinePath = device->machinePath(); + if (m_deviceItemMap.contains(machinePath) && m_deviceItemMap[machinePath]) { // 更新item的连接状态 int resultState = device->isCooperated() ? DevItemDelegate::Connected : DevItemDelegate::None; - m_uuidItemMap[uuid]->setData(resultState, DevItemDelegate::ResultDataRole); + m_deviceItemMap[machinePath]->setData(resultState, DevItemDelegate::ResultDataRole); if (device->isCooperated()) - m_uuidItemMap[uuid]->setData(0, DevItemDelegate::DegreeDataRole); + m_deviceItemMap[machinePath]->setData(0, DevItemDelegate::DegreeDataRole); - m_deviceListView->update(m_uuidItemMap[uuid]->index()); + m_deviceListView->update(m_deviceItemMap[machinePath]->index()); - if (resultState == DevItemDelegate::Connected && m_connectingDevices.contains(uuid)) { - m_connectingDevices.removeAll(uuid); + if (resultState == DevItemDelegate::Connected && m_connectingDevices.contains(machinePath)) { + m_connectingDevices.removeAll(machinePath); } } } @@ -237,13 +234,13 @@ void DevCollaborationWidget::refreshViewItem() return; } - for (const QString &uuid : m_connectingDevices) { - if (m_uuidItemMap.contains(uuid) && m_uuidItemMap[uuid]) { - int degree = m_uuidItemMap[uuid]->data(DevItemDelegate::DegreeDataRole).toInt(); + for (const QString &machinePath : m_connectingDevices) { + if (m_deviceItemMap.contains(machinePath) && m_deviceItemMap[machinePath]) { + int degree = m_deviceItemMap[machinePath]->data(DevItemDelegate::DegreeDataRole).toInt(); degree += PER_DEGREE; // 递进值 - m_uuidItemMap[uuid]->setData(DevItemDelegate::Connecting, DevItemDelegate::ResultDataRole); - m_uuidItemMap[uuid]->setData(degree, DevItemDelegate::DegreeDataRole); - m_deviceListView->update(m_uuidItemMap[uuid]->index()); + m_deviceItemMap[machinePath]->setData(DevItemDelegate::Connecting, DevItemDelegate::ResultDataRole); + m_deviceItemMap[machinePath]->setData(degree, DevItemDelegate::DegreeDataRole); + m_deviceListView->update(m_deviceItemMap[machinePath]->index()); } } } diff --git a/frame/window/components/devcollaborationwidget.h b/frame/window/components/devcollaborationwidget.h index bef33c479..c7dd90aeb 100644 --- a/frame/window/components/devcollaborationwidget.h +++ b/frame/window/components/devcollaborationwidget.h @@ -41,7 +41,6 @@ public: protected: void showEvent(QShowEvent *event) override; - void hideEvent(QHideEvent *event) override; private slots: void loadDevice(); @@ -60,7 +59,7 @@ private: CollaborationDevModel *m_deviceModel; DListView *m_deviceListView; QStandardItemModel *m_viewItemModel; - QMap m_uuidItemMap; + QMap m_deviceItemMap; QStringList m_connectingDevices; QTimer *m_refreshTimer; diff --git a/frame/window/components/devitemdelegate.h b/frame/window/components/devitemdelegate.h index 266d07a2a..e97d3455a 100644 --- a/frame/window/components/devitemdelegate.h +++ b/frame/window/components/devitemdelegate.h @@ -31,10 +31,10 @@ class DevItemDelegate : public QStyledItemDelegate Q_OBJECT public: enum DevItemDataRole { - StaticDataRole = Qt::UserRole + 1, // 静态信息 - UUIDDataRole = Qt::UserRole + 2, // uuid, 可唯一代表一个设备 - DegreeDataRole = Qt::UserRole + 3, // degree 绘制waiting使用的参数 - ResultDataRole = Qt::UserRole + 4 // 连接结果 + StaticDataRole = Qt::UserRole + 1, // 静态信息 + MachinePathDataRole = Qt::UserRole + 2, // machinePath, 可唯一代表一个设备 + DegreeDataRole = Qt::UserRole + 3, // degree 绘制waiting使用的参数 + ResultDataRole = Qt::UserRole + 4 // 连接结果 }; enum ResultState {