mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-04 09:23:03 +00:00
fix: 修复跨端协同设备列表数量显示不对的问题。
1.原有获取设备数错误,已修复。 2.修改设备列表以设备uuid为标识一台设备方案,改为使用MachinePath,避免服务挂掉重启后,设备列表不更新导致设备连接异常。 3.增加页面显示判断后端服务valid,如果invalid,则清空设备列表数据。 4.去掉自动扫描功能,后端已提供定时发送扫描的全量设备。 Log: 修复跨端协同设备列表数量显示不对的问题。 Bug: https://pms.uniontech.com/task-view-203831.html Influence: 跨端协同设备数量,及设备协同连接。 Change-Id: I3a2cb2f5f77f36df89db53e135838c79df8498ed
This commit is contained in:
parent
480f621fbf
commit
7ffb1e0188
@ -39,7 +39,6 @@ static const QString ColPropertiesInterface = "org.freedesktop.DBus.Properties";
|
|||||||
|
|
||||||
CollaborationDevModel::CollaborationDevModel(QObject *parent)
|
CollaborationDevModel::CollaborationDevModel(QObject *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
, m_timer(new QTimer(this))
|
|
||||||
, m_colDbusInter(new QDBusInterface(CollaborationService, CollaborationPath, CollaborationInterface, QDBusConnection::sessionBus(), this))
|
, m_colDbusInter(new QDBusInterface(CollaborationService, CollaborationPath, CollaborationInterface, QDBusConnection::sessionBus(), this))
|
||||||
{
|
{
|
||||||
if (m_colDbusInter->isValid()) {
|
if (m_colDbusInter->isValid()) {
|
||||||
@ -56,21 +55,18 @@ CollaborationDevModel::CollaborationDevModel(QObject *parent)
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_colDbusInter->connection().connect(CollaborationService, CollaborationPath, ColPropertiesInterface,
|
m_colDbusInter->connection().connect(CollaborationService, CollaborationPath, ColPropertiesInterface,
|
||||||
"PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(QDBusMessage)));
|
"PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(QDBusMessage)));
|
||||||
|
|
||||||
connect(m_timer, &QTimer::timeout, this, &CollaborationDevModel::callScanMethod);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CollaborationDevModel::scanDevice()
|
void CollaborationDevModel::checkServiceValid()
|
||||||
{
|
{
|
||||||
callScanMethod();
|
if (!m_colDbusInter->isValid()) {
|
||||||
m_timer->start(30 * 1000); // 30s
|
for (CollaborationDevice *device : m_devices) {
|
||||||
}
|
device->deleteLater();
|
||||||
|
}
|
||||||
void CollaborationDevModel::stopScanDevice()
|
m_devices.clear();
|
||||||
{
|
Q_EMIT devicesChanged();
|
||||||
if (m_timer->isActive())
|
}
|
||||||
m_timer->stop();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<CollaborationDevice *> CollaborationDevModel::devices() const
|
QList<CollaborationDevice *> CollaborationDevModel::devices() const
|
||||||
@ -90,17 +86,15 @@ void CollaborationDevModel::onPropertyChanged(const QDBusMessage &msg)
|
|||||||
|
|
||||||
QVariantMap changedProps = qdbus_cast<QVariantMap>(arguments.at(1).value<QDBusArgument>());
|
QVariantMap changedProps = qdbus_cast<QVariantMap>(arguments.at(1).value<QDBusArgument>());
|
||||||
if (changedProps.contains("Machines")) {
|
if (changedProps.contains("Machines")) {
|
||||||
QStringList devPaths = changedProps.value("Machines").toStringList();
|
QList<QDBusObjectPath> paths = m_colDbusInter->property("Machines").value<QList<QDBusObjectPath>>();
|
||||||
|
QStringList devPaths;
|
||||||
|
for (const QDBusObjectPath& path : paths) {
|
||||||
|
devPaths << path.path();
|
||||||
|
}
|
||||||
updateDevice(devPaths);
|
updateDevice(devPaths);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CollaborationDevModel::callScanMethod()
|
|
||||||
{
|
|
||||||
// TODO 该功能目前不可用
|
|
||||||
// m_dbusInter->asyncCall("Scan");
|
|
||||||
}
|
|
||||||
|
|
||||||
void CollaborationDevModel::updateDevice(const QStringList &devPaths)
|
void CollaborationDevModel::updateDevice(const QStringList &devPaths)
|
||||||
{
|
{
|
||||||
if (devPaths.isEmpty()) {
|
if (devPaths.isEmpty()) {
|
||||||
@ -132,16 +126,9 @@ void CollaborationDevModel::updateDevice(const QStringList &devPaths)
|
|||||||
emit devicesChanged();
|
emit devicesChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
const CollaborationDevice *CollaborationDevModel::getDevice(const QString &uuid)
|
const CollaborationDevice *CollaborationDevModel::getDevice(const QString &machinePath)
|
||||||
{
|
{
|
||||||
QList<CollaborationDevice *> devices = m_devices.values();
|
return m_devices.value(machinePath, nullptr);
|
||||||
for (const CollaborationDevice *device : devices) {
|
|
||||||
if (device->uuid() == uuid) {
|
|
||||||
return device;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CollaborationDevice::CollaborationDevice(const QString &devPath, QObject *parent)
|
CollaborationDevice::CollaborationDevice(const QString &devPath, QObject *parent)
|
||||||
@ -184,6 +171,11 @@ QString CollaborationDevice::uuid() const
|
|||||||
return m_uuid;
|
return m_uuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString CollaborationDevice::machinePath() const
|
||||||
|
{
|
||||||
|
return m_path;
|
||||||
|
}
|
||||||
|
|
||||||
QString CollaborationDevice::deviceIcon() const
|
QString CollaborationDevice::deviceIcon() const
|
||||||
{
|
{
|
||||||
switch (m_OS) {
|
switch (m_OS) {
|
||||||
|
@ -43,20 +43,18 @@ signals:
|
|||||||
void devicesChanged();
|
void devicesChanged();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void scanDevice();
|
void checkServiceValid();
|
||||||
void stopScanDevice();
|
|
||||||
QList<CollaborationDevice *> devices() const;
|
QList<CollaborationDevice *> devices() const;
|
||||||
const CollaborationDevice *getDevice(const QString &uuid);
|
const CollaborationDevice *getDevice(const QString &machinePath);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onPropertyChanged(const QDBusMessage &msg);
|
void onPropertyChanged(const QDBusMessage &msg);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void callScanMethod();
|
|
||||||
void updateDevice(const QStringList &devPaths);
|
void updateDevice(const QStringList &devPaths);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QTimer *m_timer; // 定时扫描设备
|
|
||||||
QDBusInterface *m_colDbusInter;
|
QDBusInterface *m_colDbusInter;
|
||||||
// machine path : device object
|
// machine path : device object
|
||||||
QMap<QString, CollaborationDevice *> m_devices;
|
QMap<QString, CollaborationDevice *> m_devices;
|
||||||
@ -84,6 +82,7 @@ public:
|
|||||||
|
|
||||||
QString name() const;
|
QString name() const;
|
||||||
QString uuid() const;
|
QString uuid() const;
|
||||||
|
QString machinePath() const;
|
||||||
QString deviceIcon() const;
|
QString deviceIcon() const;
|
||||||
bool isPaired() const;
|
bool isPaired() const;
|
||||||
bool isCooperated() const;
|
bool isCooperated() const;
|
||||||
|
@ -54,18 +54,11 @@ DevCollaborationWidget::DevCollaborationWidget(QWidget *parent)
|
|||||||
|
|
||||||
void DevCollaborationWidget::showEvent(QShowEvent *event)
|
void DevCollaborationWidget::showEvent(QShowEvent *event)
|
||||||
{
|
{
|
||||||
m_deviceModel->scanDevice();
|
m_deviceModel->checkServiceValid();
|
||||||
|
|
||||||
QWidget::showEvent(event);
|
QWidget::showEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DevCollaborationWidget::hideEvent(QHideEvent *event)
|
|
||||||
{
|
|
||||||
m_deviceModel->stopScanDevice();
|
|
||||||
|
|
||||||
QWidget::hideEvent(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DevCollaborationWidget::initUI()
|
void DevCollaborationWidget::initUI()
|
||||||
{
|
{
|
||||||
m_deviceListView->setModel(m_viewItemModel);
|
m_deviceListView->setModel(m_viewItemModel);
|
||||||
@ -133,12 +126,12 @@ void DevCollaborationWidget::addItem(const CollaborationDevice *device)
|
|||||||
int resultState = device->isCooperated() ? DevItemDelegate::Connected : DevItemDelegate::None;
|
int resultState = device->isCooperated() ? DevItemDelegate::Connected : DevItemDelegate::None;
|
||||||
|
|
||||||
item->setData(QVariant::fromValue(data), DevItemDelegate::StaticDataRole);
|
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(0, DevItemDelegate::DegreeDataRole);
|
||||||
item->setData(resultState, DevItemDelegate::ResultDataRole);
|
item->setData(resultState, DevItemDelegate::ResultDataRole);
|
||||||
|
|
||||||
m_viewItemModel->appendRow(item);
|
m_viewItemModel->appendRow(item);
|
||||||
m_uuidItemMap[device->uuid()] = item;
|
m_deviceItemMap[device->machinePath()] = item;
|
||||||
|
|
||||||
connect(device, &CollaborationDevice::pairedStateChanged, this, &DevCollaborationWidget::itemStatusChanged);
|
connect(device, &CollaborationDevice::pairedStateChanged, this, &DevCollaborationWidget::itemStatusChanged);
|
||||||
}
|
}
|
||||||
@ -157,24 +150,24 @@ void DevCollaborationWidget::updateDeviceListView()
|
|||||||
if (!item)
|
if (!item)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
QString uuid = item->data(DevItemDelegate::UUIDDataRole).toString();
|
QString machinePath = item->data(DevItemDelegate::MachinePathDataRole).toString();
|
||||||
if (m_deviceModel->getDevice(uuid))
|
if (m_deviceModel->getDevice(machinePath))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
m_deviceListView->removeItem(row);
|
m_deviceListView->removeItem(row);
|
||||||
|
|
||||||
if (m_uuidItemMap.contains(uuid)) {
|
if (m_deviceItemMap.contains(machinePath)) {
|
||||||
m_uuidItemMap.remove(uuid);
|
m_deviceItemMap.remove(machinePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_connectingDevices.contains(uuid)) {
|
if (m_connectingDevices.contains(machinePath)) {
|
||||||
m_connectingDevices.removeAll(uuid);
|
m_connectingDevices.removeAll(machinePath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理新增
|
// 处理新增
|
||||||
for (CollaborationDevice *device : devices) {
|
for (CollaborationDevice *device : devices) {
|
||||||
if (!m_uuidItemMap.contains(device->uuid())) {
|
if (!m_deviceItemMap.contains(device->machinePath())) {
|
||||||
addItem(device);
|
addItem(device);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -189,19 +182,23 @@ void DevCollaborationWidget::resetWidgetSize()
|
|||||||
|
|
||||||
void DevCollaborationWidget::itemClicked(const QModelIndex &index)
|
void DevCollaborationWidget::itemClicked(const QModelIndex &index)
|
||||||
{
|
{
|
||||||
QString uuid = index.data(DevItemDelegate::UUIDDataRole).toString();
|
QString machinePath = index.data(DevItemDelegate::MachinePathDataRole).toString();
|
||||||
const CollaborationDevice *device = m_deviceModel->getDevice(uuid);
|
const CollaborationDevice *device = m_deviceModel->getDevice(machinePath);
|
||||||
if (!device)
|
if (!device)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!device->isPaired()) {
|
if (!device->isPaired()) {
|
||||||
device->pair();
|
device->pair();
|
||||||
m_connectingDevices.append(uuid);
|
if (!m_connectingDevices.contains(machinePath))
|
||||||
|
m_connectingDevices.append(machinePath);
|
||||||
} else if (!device->isCooperated()) {
|
} else if (!device->isCooperated()) {
|
||||||
device->requestCooperate();
|
device->requestCooperate();
|
||||||
m_connectingDevices.append(uuid);
|
if (!m_connectingDevices.contains(machinePath))
|
||||||
|
m_connectingDevices.append(machinePath);
|
||||||
} else if (device->isCooperated()) {
|
} else if (device->isCooperated()) {
|
||||||
device->disconnectDevice();
|
device->disconnectDevice();
|
||||||
|
if (m_connectingDevices.contains(machinePath))
|
||||||
|
m_connectingDevices.removeOne(machinePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_connectingDevices.isEmpty() && !m_refreshTimer->isActive())
|
if (!m_connectingDevices.isEmpty() && !m_refreshTimer->isActive())
|
||||||
@ -214,18 +211,18 @@ void DevCollaborationWidget::itemStatusChanged()
|
|||||||
if (!device)
|
if (!device)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QString uuid = device->uuid();
|
QString machinePath = device->machinePath();
|
||||||
if (m_uuidItemMap.contains(uuid) && m_uuidItemMap[uuid]) {
|
if (m_deviceItemMap.contains(machinePath) && m_deviceItemMap[machinePath]) {
|
||||||
// 更新item的连接状态
|
// 更新item的连接状态
|
||||||
int resultState = device->isCooperated() ? DevItemDelegate::Connected : DevItemDelegate::None;
|
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())
|
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)) {
|
if (resultState == DevItemDelegate::Connected && m_connectingDevices.contains(machinePath)) {
|
||||||
m_connectingDevices.removeAll(uuid);
|
m_connectingDevices.removeAll(machinePath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -237,13 +234,13 @@ void DevCollaborationWidget::refreshViewItem()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const QString &uuid : m_connectingDevices) {
|
for (const QString &machinePath : m_connectingDevices) {
|
||||||
if (m_uuidItemMap.contains(uuid) && m_uuidItemMap[uuid]) {
|
if (m_deviceItemMap.contains(machinePath) && m_deviceItemMap[machinePath]) {
|
||||||
int degree = m_uuidItemMap[uuid]->data(DevItemDelegate::DegreeDataRole).toInt();
|
int degree = m_deviceItemMap[machinePath]->data(DevItemDelegate::DegreeDataRole).toInt();
|
||||||
degree += PER_DEGREE; // 递进值
|
degree += PER_DEGREE; // 递进值
|
||||||
m_uuidItemMap[uuid]->setData(DevItemDelegate::Connecting, DevItemDelegate::ResultDataRole);
|
m_deviceItemMap[machinePath]->setData(DevItemDelegate::Connecting, DevItemDelegate::ResultDataRole);
|
||||||
m_uuidItemMap[uuid]->setData(degree, DevItemDelegate::DegreeDataRole);
|
m_deviceItemMap[machinePath]->setData(degree, DevItemDelegate::DegreeDataRole);
|
||||||
m_deviceListView->update(m_uuidItemMap[uuid]->index());
|
m_deviceListView->update(m_deviceItemMap[machinePath]->index());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,6 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
void showEvent(QShowEvent *event) override;
|
void showEvent(QShowEvent *event) override;
|
||||||
void hideEvent(QHideEvent *event) override;
|
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void loadDevice();
|
void loadDevice();
|
||||||
@ -60,7 +59,7 @@ private:
|
|||||||
CollaborationDevModel *m_deviceModel;
|
CollaborationDevModel *m_deviceModel;
|
||||||
DListView *m_deviceListView;
|
DListView *m_deviceListView;
|
||||||
QStandardItemModel *m_viewItemModel;
|
QStandardItemModel *m_viewItemModel;
|
||||||
QMap<QString, QStandardItem *> m_uuidItemMap;
|
QMap<QString, QStandardItem *> m_deviceItemMap;
|
||||||
QStringList m_connectingDevices;
|
QStringList m_connectingDevices;
|
||||||
|
|
||||||
QTimer *m_refreshTimer;
|
QTimer *m_refreshTimer;
|
||||||
|
@ -31,10 +31,10 @@ class DevItemDelegate : public QStyledItemDelegate
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
enum DevItemDataRole {
|
enum DevItemDataRole {
|
||||||
StaticDataRole = Qt::UserRole + 1, // 静态信息
|
StaticDataRole = Qt::UserRole + 1, // 静态信息
|
||||||
UUIDDataRole = Qt::UserRole + 2, // uuid, 可唯一代表一个设备
|
MachinePathDataRole = Qt::UserRole + 2, // machinePath, 可唯一代表一个设备
|
||||||
DegreeDataRole = Qt::UserRole + 3, // degree 绘制waiting使用的参数
|
DegreeDataRole = Qt::UserRole + 3, // degree 绘制waiting使用的参数
|
||||||
ResultDataRole = Qt::UserRole + 4 // 连接结果
|
ResultDataRole = Qt::UserRole + 4 // 连接结果
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ResultState {
|
enum ResultState {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user