mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-02 15:45:21 +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)
|
||||
: 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<CollaborationDevice *> CollaborationDevModel::devices() const
|
||||
@ -90,17 +86,15 @@ void CollaborationDevModel::onPropertyChanged(const QDBusMessage &msg)
|
||||
|
||||
QVariantMap changedProps = qdbus_cast<QVariantMap>(arguments.at(1).value<QDBusArgument>());
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
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<CollaborationDevice *> 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) {
|
||||
|
@ -43,20 +43,18 @@ signals:
|
||||
void devicesChanged();
|
||||
|
||||
public:
|
||||
void scanDevice();
|
||||
void stopScanDevice();
|
||||
void checkServiceValid();
|
||||
|
||||
QList<CollaborationDevice *> 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<QString, CollaborationDevice *> 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;
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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<QString, QStandardItem *> m_uuidItemMap;
|
||||
QMap<QString, QStandardItem *> m_deviceItemMap;
|
||||
QStringList m_connectingDevices;
|
||||
|
||||
QTimer *m_refreshTimer;
|
||||
|
@ -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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user