2021-01-08 14:33:08 +08:00
|
|
|
|
/*
|
|
|
|
|
* Copyright (C) 2016 ~ 2018 Deepin Technology Co., Ltd.
|
|
|
|
|
*
|
|
|
|
|
* Author: chenwei <chenwei@uniontech.com>
|
|
|
|
|
*
|
|
|
|
|
* Maintainer: chenwei <chenwei@uniontech.com>
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
|
* any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include "bluetoothadapteritem.h"
|
2021-08-25 21:03:30 +08:00
|
|
|
|
#include "adapter.h"
|
2021-01-08 14:33:08 +08:00
|
|
|
|
#include "bluetoothconstants.h"
|
2021-01-12 16:07:03 +08:00
|
|
|
|
#include "refreshbutton.h"
|
2021-08-25 21:03:30 +08:00
|
|
|
|
#include "horizontalseperator.h"
|
2021-10-14 09:09:47 +08:00
|
|
|
|
#include "statebutton.h"
|
2021-01-08 14:33:08 +08:00
|
|
|
|
|
|
|
|
|
#include <DFontSizeManager>
|
|
|
|
|
#include <DLabel>
|
|
|
|
|
#include <DSwitchButton>
|
|
|
|
|
#include <DListView>
|
|
|
|
|
#include <DSpinner>
|
|
|
|
|
#include <DApplicationHelper>
|
|
|
|
|
|
2021-05-21 17:11:12 +08:00
|
|
|
|
#include <QBoxLayout>
|
|
|
|
|
#include <QStandardItemModel>
|
|
|
|
|
|
2021-01-08 14:33:08 +08:00
|
|
|
|
BluetoothDeviceItem::BluetoothDeviceItem(QStyle *style, const Device *device, DListView *parent)
|
|
|
|
|
: m_style(style)
|
|
|
|
|
, m_device(device)
|
|
|
|
|
, m_standarditem(new DStandardItem())
|
2021-05-25 13:05:45 +08:00
|
|
|
|
, m_labelAction(nullptr)
|
|
|
|
|
, m_stateAction(nullptr)
|
2021-10-14 09:09:47 +08:00
|
|
|
|
, m_connAction(nullptr)
|
2021-01-08 14:33:08 +08:00
|
|
|
|
, m_loading(new DSpinner(parent))
|
2021-10-14 09:09:47 +08:00
|
|
|
|
, m_iconWidget(new QWidget(parent->viewport()))
|
|
|
|
|
, m_connButton(new StateButton(m_iconWidget))
|
2021-01-08 14:33:08 +08:00
|
|
|
|
{
|
|
|
|
|
initActionList();
|
|
|
|
|
initConnect();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BluetoothDeviceItem::~BluetoothDeviceItem()
|
|
|
|
|
{
|
|
|
|
|
if (m_loading != nullptr) {
|
|
|
|
|
delete m_loading;
|
|
|
|
|
m_loading = nullptr;
|
|
|
|
|
}
|
2021-10-14 09:09:47 +08:00
|
|
|
|
if (m_iconWidget != nullptr) {
|
|
|
|
|
delete m_iconWidget;
|
|
|
|
|
m_iconWidget = nullptr;
|
|
|
|
|
m_connButton = nullptr;
|
|
|
|
|
}
|
2021-01-08 14:33:08 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BluetoothDeviceItem::initActionList()
|
|
|
|
|
{
|
|
|
|
|
m_labelAction = new DViewItemAction(Qt::AlignLeft | Qt::AlignVCenter, QSize(), QSize(), false);
|
|
|
|
|
m_stateAction = new DViewItemAction(Qt::AlignLeft | Qt::AlignVCenter, QSize(), QSize(), true);
|
2021-10-14 09:09:47 +08:00
|
|
|
|
m_connAction = new DViewItemAction(Qt::AlignRight | Qt::AlignVCenter, QSize(16, 16), QSize(16, 16), false);
|
|
|
|
|
|
|
|
|
|
m_connButton->setType(StateButton::Check);
|
2021-11-16 16:42:56 +08:00
|
|
|
|
m_connButton->setSwitchFork(true);
|
2021-10-14 09:09:47 +08:00
|
|
|
|
m_connButton->setFixedSize(16, 16);
|
2021-11-16 16:42:56 +08:00
|
|
|
|
connect(m_connButton, &StateButton::click, this, &BluetoothDeviceItem::disconnectDevice);
|
2021-11-11 16:30:54 +08:00
|
|
|
|
m_iconWidget->setFixedSize(18, 16);
|
2021-10-14 09:09:47 +08:00
|
|
|
|
QHBoxLayout *layout = new QHBoxLayout(m_iconWidget);
|
|
|
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
|
|
|
layout->addWidget(m_connButton);
|
|
|
|
|
layout->addStretch();
|
2021-01-08 14:33:08 +08:00
|
|
|
|
|
|
|
|
|
m_loading->setFixedSize(QSize(24, 24));
|
|
|
|
|
m_stateAction->setWidget(m_loading);
|
2021-10-14 09:09:47 +08:00
|
|
|
|
m_connAction->setWidget(m_iconWidget);
|
2021-01-08 14:33:08 +08:00
|
|
|
|
|
2021-03-01 10:35:26 +08:00
|
|
|
|
m_standarditem->setAccessibleText(m_device->alias());
|
2021-10-14 09:09:47 +08:00
|
|
|
|
m_standarditem->setActionList(Qt::RightEdge, { m_stateAction, m_connAction });
|
|
|
|
|
m_standarditem->setActionList(Qt::LeftEdge, { m_labelAction });
|
2021-01-08 14:33:08 +08:00
|
|
|
|
|
2021-05-19 17:41:06 +09:00
|
|
|
|
//蓝牙列表可用蓝牙设备信息文字显示高亮
|
2021-04-29 15:17:03 +09:00
|
|
|
|
m_labelAction->setTextColorRole(DPalette::BrightText);
|
2021-03-01 10:35:26 +08:00
|
|
|
|
m_labelAction->setText(m_device->alias());
|
2021-01-08 14:33:08 +08:00
|
|
|
|
updateDeviceState(m_device->state());
|
|
|
|
|
updateIconTheme(DGuiApplicationHelper::instance()->themeType());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BluetoothDeviceItem::initConnect()
|
|
|
|
|
{
|
|
|
|
|
connect(DApplicationHelper::instance(), &DApplicationHelper::themeTypeChanged, this, &BluetoothDeviceItem::updateIconTheme);
|
|
|
|
|
connect(m_device, &Device::stateChanged, this, &BluetoothDeviceItem::updateDeviceState);
|
2021-10-14 09:09:47 +08:00
|
|
|
|
connect(m_iconWidget, &QWidget::destroyed, [ this ] { this->m_iconWidget = nullptr; });
|
2021-01-08 14:33:08 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BluetoothDeviceItem::updateIconTheme(DGuiApplicationHelper::ColorType type)
|
|
|
|
|
{
|
|
|
|
|
if (type == DGuiApplicationHelper::LightType) {
|
|
|
|
|
if (!m_device->deviceType().isEmpty()) {
|
|
|
|
|
m_deviceIcon = LightString.arg(m_device->deviceType());
|
|
|
|
|
} else {
|
|
|
|
|
m_deviceIcon = LightString.arg("other");
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if (!m_device->deviceType().isEmpty()) {
|
|
|
|
|
m_deviceIcon = DarkString.arg(m_device->deviceType());
|
|
|
|
|
} else {
|
|
|
|
|
m_deviceIcon = DarkString.arg("other");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
m_labelAction->setIcon(QIcon(m_deviceIcon));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BluetoothDeviceItem::updateDeviceState(Device::State state)
|
|
|
|
|
{
|
2021-03-01 10:35:26 +08:00
|
|
|
|
m_labelAction->setText(m_device->alias());
|
2021-01-08 14:33:08 +08:00
|
|
|
|
if (state == Device::StateAvailable) {
|
|
|
|
|
m_loading->start();
|
|
|
|
|
m_stateAction->setVisible(true);
|
2021-10-14 09:09:47 +08:00
|
|
|
|
m_connAction->setVisible(false);
|
2021-03-04 09:58:05 +08:00
|
|
|
|
} else if (state == Device::StateConnected) {
|
2021-01-08 14:33:08 +08:00
|
|
|
|
m_loading->stop();
|
|
|
|
|
m_stateAction->setVisible(false);
|
2021-10-14 09:09:47 +08:00
|
|
|
|
m_connAction->setVisible(true);
|
2021-01-08 14:33:08 +08:00
|
|
|
|
emit requestTopDeviceItem(m_standarditem);
|
|
|
|
|
} else {
|
|
|
|
|
m_loading->stop();
|
|
|
|
|
m_stateAction->setVisible(false);
|
2021-10-14 09:09:47 +08:00
|
|
|
|
m_connAction->setVisible(false);
|
2021-01-08 14:33:08 +08:00
|
|
|
|
}
|
|
|
|
|
emit deviceStateChanged(m_device);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BluetoothAdapterItem::BluetoothAdapterItem(Adapter *adapter, QWidget *parent)
|
|
|
|
|
: QWidget(parent)
|
|
|
|
|
, m_adapter(adapter)
|
|
|
|
|
, m_adapterLabel(new SettingLabel(adapter->name(), this))
|
|
|
|
|
, m_adapterStateBtn(new DSwitchButton(this))
|
|
|
|
|
, m_deviceListview(new DListView(this))
|
2021-05-27 21:22:45 +08:00
|
|
|
|
, m_itemDelegate(new DStyledItemDelegate(m_deviceListview))
|
2021-01-08 14:33:08 +08:00
|
|
|
|
, m_deviceModel(new QStandardItemModel(m_deviceListview))
|
2021-01-12 16:07:03 +08:00
|
|
|
|
, m_refreshBtn(new RefreshButton(this))
|
2022-11-18 17:08:32 +08:00
|
|
|
|
, m_bluetoothInter(new DBusBluetooth("org.deepin.dde.Bluetooth1", "/org/deepin/dde/Bluetooth1", QDBusConnection::sessionBus(), this))
|
2021-03-01 10:35:26 +08:00
|
|
|
|
, m_showUnnamedDevices(false)
|
2021-05-21 17:11:12 +08:00
|
|
|
|
, m_seperator(new HorizontalSeperator(this))
|
2021-01-08 14:33:08 +08:00
|
|
|
|
{
|
|
|
|
|
initData();
|
|
|
|
|
initUi();
|
|
|
|
|
initConnect();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BluetoothAdapterItem::~BluetoothAdapterItem()
|
|
|
|
|
{
|
|
|
|
|
qDeleteAll(m_deviceItems);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BluetoothAdapterItem::onConnectDevice(const QModelIndex &index)
|
|
|
|
|
{
|
|
|
|
|
const QStandardItemModel *deviceModel = dynamic_cast<const QStandardItemModel *>(index.model());
|
|
|
|
|
if (!deviceModel)
|
|
|
|
|
return;
|
|
|
|
|
DStandardItem *deviceitem = dynamic_cast<DStandardItem *>(deviceModel->item(index.row()));
|
|
|
|
|
|
2021-03-04 09:58:05 +08:00
|
|
|
|
foreach (const auto item, m_deviceItems) {
|
2021-11-16 16:42:56 +08:00
|
|
|
|
// 只有非连接状态才发送connectDevice信号(connectDevice信号连接的槽为取反操作,而非仅仅连接)
|
|
|
|
|
if (!(item->device()->state() == Device::StateUnavailable))
|
|
|
|
|
continue;
|
|
|
|
|
|
2021-01-08 14:33:08 +08:00
|
|
|
|
if (item->standardItem() == deviceitem) {
|
|
|
|
|
emit connectDevice(item->device(), m_adapter);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BluetoothAdapterItem::onTopDeviceItem(DStandardItem *item)
|
|
|
|
|
{
|
|
|
|
|
if (!item || item->row() == -1 || item->row() == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
int index1 = item->row();
|
|
|
|
|
QStandardItem *index = m_deviceModel->takeItem(index1, 0);
|
|
|
|
|
m_deviceModel->removeRow(index1);
|
|
|
|
|
m_deviceModel->insertRow(0, index);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BluetoothAdapterItem::onAdapterNameChanged(const QString name)
|
|
|
|
|
{
|
|
|
|
|
m_adapterLabel->label()->setText(name);
|
|
|
|
|
}
|
|
|
|
|
|
2021-01-12 16:07:03 +08:00
|
|
|
|
void BluetoothAdapterItem::updateIconTheme(DGuiApplicationHelper::ColorType type)
|
|
|
|
|
{
|
2021-05-21 17:11:12 +08:00
|
|
|
|
if (type == DGuiApplicationHelper::LightType)
|
2021-01-12 16:07:03 +08:00
|
|
|
|
m_refreshBtn->setRotateIcon(":/wireless/resources/wireless/refresh_dark.svg");
|
2021-05-21 17:11:12 +08:00
|
|
|
|
else
|
2021-01-12 16:07:03 +08:00
|
|
|
|
m_refreshBtn->setRotateIcon(":/wireless/resources/wireless/refresh.svg");
|
|
|
|
|
}
|
|
|
|
|
|
2021-06-10 18:11:12 +08:00
|
|
|
|
QSize BluetoothAdapterItem::sizeHint() const
|
|
|
|
|
{
|
2021-06-11 13:55:54 +08:00
|
|
|
|
int visualHeight = 0;
|
|
|
|
|
for (int i = 0; i < m_deviceListview->count(); i++)
|
|
|
|
|
visualHeight += m_deviceListview->visualRect(m_deviceModel->index(i, 0)).height();
|
|
|
|
|
|
|
|
|
|
int listMargin = m_deviceListview->contentsMargins().top() + m_deviceListview->contentsMargins().bottom();
|
|
|
|
|
//显示声音设备列表高度 = 设备的高度 + 间隔 + 边距
|
|
|
|
|
int viewHeight = visualHeight + m_deviceListview->spacing() * (m_deviceListview->count() - 1) + listMargin;
|
|
|
|
|
|
|
|
|
|
return QSize(ItemWidth, m_adapterLabel->height() + (m_adapter->powered() ? m_seperator->sizeHint().height() + viewHeight : 0));// 加上分割线的高度
|
2021-06-10 18:11:12 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-01-08 14:33:08 +08:00
|
|
|
|
QStringList BluetoothAdapterItem::connectedDevicesName()
|
|
|
|
|
{
|
|
|
|
|
QStringList devsName;
|
|
|
|
|
for (BluetoothDeviceItem *devItem : m_deviceItems) {
|
|
|
|
|
if (devItem && devItem->device()->state() == Device::StateConnected) {
|
2021-03-01 10:35:26 +08:00
|
|
|
|
devsName << devItem->device()->alias();
|
2021-01-08 14:33:08 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return devsName;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BluetoothAdapterItem::initData()
|
|
|
|
|
{
|
2021-03-01 10:35:26 +08:00
|
|
|
|
m_showUnnamedDevices = m_bluetoothInter->displaySwitch();
|
2021-01-08 14:33:08 +08:00
|
|
|
|
if (!m_adapter->powered())
|
|
|
|
|
return;
|
|
|
|
|
|
2021-03-04 09:58:05 +08:00
|
|
|
|
foreach (const auto device, m_adapter->devices()) {
|
2021-01-08 14:33:08 +08:00
|
|
|
|
if (!m_deviceItems.contains(device->id()))
|
|
|
|
|
onDeviceAdded(device);
|
|
|
|
|
}
|
2021-03-01 10:35:26 +08:00
|
|
|
|
setUnnamedDevicesVisible(m_showUnnamedDevices);
|
2021-01-08 14:33:08 +08:00
|
|
|
|
emit deviceCountChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BluetoothAdapterItem::onDeviceAdded(const Device *device)
|
|
|
|
|
{
|
|
|
|
|
int insertRow = 0;
|
2021-03-04 09:58:05 +08:00
|
|
|
|
foreach (const auto item, m_deviceItems) {
|
2021-01-08 14:33:08 +08:00
|
|
|
|
if (item->device()->connectState()) {
|
|
|
|
|
insertRow++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BluetoothDeviceItem *item = new BluetoothDeviceItem(style(), device, m_deviceListview);
|
|
|
|
|
connect(item, &BluetoothDeviceItem::requestTopDeviceItem, this, &BluetoothAdapterItem::onTopDeviceItem);
|
|
|
|
|
connect(item, &BluetoothDeviceItem::deviceStateChanged, this, &BluetoothAdapterItem::deviceStateChanged);
|
2021-11-16 16:42:56 +08:00
|
|
|
|
connect(item, &BluetoothDeviceItem::disconnectDevice, this, [this, item](){
|
|
|
|
|
// 只有已连接状态才发送connectDevice信号(connectDevice信号连接的槽为取反操作,而非仅仅连接)
|
|
|
|
|
if (item->device()->state() == Device::StateConnected) {
|
|
|
|
|
emit connectDevice(item->device(), m_adapter);
|
|
|
|
|
}
|
|
|
|
|
});
|
2021-01-08 14:33:08 +08:00
|
|
|
|
|
|
|
|
|
m_deviceItems.insert(device->id(), item);
|
2021-03-01 10:35:26 +08:00
|
|
|
|
if (!m_showUnnamedDevices && device->name().isEmpty() && Device::StateConnected != device->state())
|
|
|
|
|
return;
|
|
|
|
|
|
2021-01-08 14:33:08 +08:00
|
|
|
|
m_deviceModel->insertRow(insertRow, item->standardItem());
|
|
|
|
|
emit deviceCountChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BluetoothAdapterItem::onDeviceRemoved(const Device *device)
|
|
|
|
|
{
|
2021-03-04 09:58:05 +08:00
|
|
|
|
if (m_deviceItems.isEmpty())
|
2021-01-08 14:33:08 +08:00
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
m_deviceModel->removeRow(m_deviceItems.value(device->id())->standardItem()->row());
|
|
|
|
|
m_deviceItems.value(device->id())->deleteLater();
|
|
|
|
|
m_deviceItems.remove(device->id());
|
|
|
|
|
emit deviceCountChanged();
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-04 09:58:05 +08:00
|
|
|
|
void BluetoothAdapterItem::onDeviceNameUpdated(const Device *device)
|
|
|
|
|
{
|
|
|
|
|
if (m_deviceItems.isEmpty())
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// 修复蓝牙设备列表中,设备名称更新后未实时刷新的问题
|
|
|
|
|
if (m_deviceItems.contains(device->id())) {
|
|
|
|
|
BluetoothDeviceItem *item = m_deviceItems[device->id()];
|
|
|
|
|
if (item && !item->device()->alias().isEmpty()) {
|
|
|
|
|
item->updateDeviceState(item->device()->state());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-01-08 14:33:08 +08:00
|
|
|
|
void BluetoothAdapterItem::initUi()
|
|
|
|
|
{
|
2021-01-12 16:07:03 +08:00
|
|
|
|
m_refreshBtn->setFixedSize(24, 24);
|
|
|
|
|
m_refreshBtn->setVisible(m_adapter->powered());
|
|
|
|
|
|
2021-01-08 14:33:08 +08:00
|
|
|
|
setAccessibleName(m_adapter->name());
|
|
|
|
|
setContentsMargins(0, 0, 0, 0);
|
|
|
|
|
m_adapterLabel->setFixedSize(ItemWidth, TitleHeight);
|
2021-01-12 16:07:03 +08:00
|
|
|
|
m_adapterLabel->addButton(m_refreshBtn, 0);
|
2021-06-10 09:52:37 +08:00
|
|
|
|
m_adapterLabel->addButton(m_adapterStateBtn, 0);
|
2021-01-08 14:33:08 +08:00
|
|
|
|
DFontSizeManager::instance()->bind(m_adapterLabel->label(), DFontSizeManager::T4);
|
|
|
|
|
|
|
|
|
|
m_adapterStateBtn->setChecked(m_adapter->powered());
|
|
|
|
|
|
|
|
|
|
QVBoxLayout *mainLayout = new QVBoxLayout(this);
|
|
|
|
|
mainLayout->setMargin(0);
|
|
|
|
|
mainLayout->setSpacing(0);
|
2021-06-10 09:52:37 +08:00
|
|
|
|
mainLayout->setContentsMargins(0, 0, 0, 0);
|
2021-01-08 14:33:08 +08:00
|
|
|
|
|
|
|
|
|
m_deviceListview->setAccessibleName("DeviceItemList");
|
2021-06-11 13:55:54 +08:00
|
|
|
|
m_deviceListview->setContentsMargins(0, 0, 0, 0);
|
2021-01-08 14:33:08 +08:00
|
|
|
|
m_deviceListview->setBackgroundType(DStyledItemDelegate::ClipCornerBackground);
|
|
|
|
|
m_deviceListview->setItemRadius(0);
|
2021-06-11 13:55:54 +08:00
|
|
|
|
m_deviceListview->setFrameShape(QFrame::NoFrame);
|
2021-01-08 14:33:08 +08:00
|
|
|
|
m_deviceListview->setEditTriggers(QAbstractItemView::NoEditTriggers);
|
|
|
|
|
m_deviceListview->setSelectionMode(QAbstractItemView::NoSelection);
|
|
|
|
|
m_deviceListview->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
|
|
|
|
m_deviceListview->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
|
|
|
|
m_deviceListview->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
|
|
|
|
|
m_deviceListview->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
|
2021-06-11 13:55:54 +08:00
|
|
|
|
m_deviceListview->setItemSize(QSize(ItemWidth, DeviceItemHeight));
|
|
|
|
|
m_deviceListview->setItemMargins(QMargins(0, 0, 0, 0));
|
|
|
|
|
m_deviceListview->setModel(m_deviceModel);
|
2021-01-08 14:33:08 +08:00
|
|
|
|
|
|
|
|
|
mainLayout->addWidget(m_adapterLabel);
|
2021-05-21 17:11:12 +08:00
|
|
|
|
mainLayout->addWidget(m_seperator);
|
2021-01-08 14:33:08 +08:00
|
|
|
|
mainLayout->addWidget(m_deviceListview);
|
2021-01-12 16:07:03 +08:00
|
|
|
|
|
2021-06-10 09:52:37 +08:00
|
|
|
|
m_seperator->setVisible(m_deviceListview->count() != 0);
|
|
|
|
|
connect(m_deviceListview, &DListView::rowCountChanged, this, [ = ] {
|
|
|
|
|
m_seperator->setVisible(m_deviceListview->count() != 0);
|
|
|
|
|
});
|
|
|
|
|
|
2021-05-28 15:05:35 +08:00
|
|
|
|
m_deviceListview->setItemDelegate(m_itemDelegate);
|
|
|
|
|
|
2021-01-12 16:07:03 +08:00
|
|
|
|
updateIconTheme(DGuiApplicationHelper::instance()->themeType());
|
|
|
|
|
if (m_adapter->discover()) {
|
|
|
|
|
m_refreshBtn->startRotate();
|
|
|
|
|
}
|
2021-01-08 14:33:08 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BluetoothAdapterItem::initConnect()
|
|
|
|
|
{
|
2021-01-12 16:07:03 +08:00
|
|
|
|
connect(DApplicationHelper::instance(), &DApplicationHelper::themeTypeChanged, this, &BluetoothAdapterItem::updateIconTheme);
|
2021-01-08 14:33:08 +08:00
|
|
|
|
connect(m_adapter, &Adapter::deviceAdded, this, &BluetoothAdapterItem::onDeviceAdded);
|
|
|
|
|
connect(m_adapter, &Adapter::deviceRemoved, this, &BluetoothAdapterItem::onDeviceRemoved);
|
2021-03-04 09:58:05 +08:00
|
|
|
|
connect(m_adapter, &Adapter::deviceNameUpdated, this, &BluetoothAdapterItem::onDeviceNameUpdated);
|
2021-01-08 14:33:08 +08:00
|
|
|
|
connect(m_adapter, &Adapter::nameChanged, this, &BluetoothAdapterItem::onAdapterNameChanged);
|
|
|
|
|
connect(m_deviceListview, &DListView::clicked, this, &BluetoothAdapterItem::onConnectDevice);
|
2021-03-04 09:58:05 +08:00
|
|
|
|
connect(m_adapter, &Adapter::discoveringChanged, this, [ = ](bool state) {
|
2021-01-12 16:07:03 +08:00
|
|
|
|
if (state) {
|
|
|
|
|
m_refreshBtn->startRotate();
|
|
|
|
|
} else {
|
|
|
|
|
m_refreshBtn->stopRotate();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
connect(m_refreshBtn, &RefreshButton::clicked, this, [ = ] {
|
|
|
|
|
emit requestRefreshAdapter(m_adapter);
|
|
|
|
|
});
|
|
|
|
|
|
2021-03-04 09:58:05 +08:00
|
|
|
|
connect(m_adapter, &Adapter::poweredChanged, this, [ = ](bool state) {
|
2021-01-08 14:33:08 +08:00
|
|
|
|
initData();
|
2021-01-19 14:06:10 +08:00
|
|
|
|
m_refreshBtn->setVisible(state);
|
2021-01-08 14:33:08 +08:00
|
|
|
|
m_deviceListview->setVisible(state);
|
2021-05-21 17:11:12 +08:00
|
|
|
|
m_seperator->setVisible(state);
|
2021-01-08 14:33:08 +08:00
|
|
|
|
m_adapterStateBtn->setChecked(state);
|
|
|
|
|
m_adapterStateBtn->setEnabled(true);
|
|
|
|
|
emit adapterPowerChanged();
|
|
|
|
|
});
|
2021-03-04 09:58:05 +08:00
|
|
|
|
connect(m_adapterStateBtn, &DSwitchButton::clicked, this, [ = ](bool state) {
|
2021-01-08 14:33:08 +08:00
|
|
|
|
qDeleteAll(m_deviceItems);
|
|
|
|
|
m_deviceItems.clear();
|
|
|
|
|
m_deviceModel->clear();
|
|
|
|
|
m_deviceListview->setVisible(false);
|
2021-05-21 17:11:12 +08:00
|
|
|
|
m_seperator->setVisible(false);
|
2021-01-08 14:33:08 +08:00
|
|
|
|
m_adapterStateBtn->setEnabled(false);
|
2021-01-12 16:07:03 +08:00
|
|
|
|
m_refreshBtn->setVisible(state);
|
2021-01-08 14:33:08 +08:00
|
|
|
|
emit requestSetAdapterPower(m_adapter, state);
|
|
|
|
|
});
|
2021-03-01 10:35:26 +08:00
|
|
|
|
connect(m_bluetoothInter, &DBusBluetooth::DisplaySwitchChanged, this, [ = ](bool value) {
|
|
|
|
|
m_showUnnamedDevices = value;
|
|
|
|
|
setUnnamedDevicesVisible(value);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BluetoothAdapterItem::setUnnamedDevicesVisible(bool isShow)
|
|
|
|
|
{
|
|
|
|
|
QMap<QString, BluetoothDeviceItem *>::iterator i;
|
|
|
|
|
|
|
|
|
|
if (isShow) {
|
|
|
|
|
// 计算已连接蓝牙设备数
|
|
|
|
|
int connectCount = 0;
|
2021-05-31 17:37:21 +08:00
|
|
|
|
for (i = m_deviceItems.begin(); i != m_deviceItems.end(); ++i) {
|
2021-03-01 10:35:26 +08:00
|
|
|
|
BluetoothDeviceItem *deviceItem = i.value();
|
|
|
|
|
|
|
|
|
|
if (deviceItem && deviceItem->device() && deviceItem->device()->paired()
|
|
|
|
|
&& (Device::StateConnected == deviceItem->device()->state() || deviceItem->device()->connecting()))
|
|
|
|
|
connectCount++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 显示所有蓝牙设备
|
2021-05-31 17:37:21 +08:00
|
|
|
|
for (i = m_deviceItems.begin(); i != m_deviceItems.end(); ++i) {
|
2021-03-01 10:35:26 +08:00
|
|
|
|
BluetoothDeviceItem *deviceItem = i.value();
|
|
|
|
|
|
|
|
|
|
if (deviceItem && deviceItem->device() && deviceItem->device()->name().isEmpty()) {
|
|
|
|
|
DStandardItem *dListItem = deviceItem->standardItem();
|
|
|
|
|
QModelIndex index = m_deviceModel->indexFromItem(dListItem);
|
|
|
|
|
if (!index.isValid()) {
|
|
|
|
|
m_deviceModel->insertRow(((connectCount > -1 && connectCount < m_deviceItems.count()) ? connectCount : 0), dListItem);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2021-05-31 17:37:21 +08:00
|
|
|
|
for (i = m_deviceItems.begin(); i != m_deviceItems.end(); ++i) {
|
2021-03-01 10:35:26 +08:00
|
|
|
|
BluetoothDeviceItem *deviceItem = i.value();
|
|
|
|
|
|
|
|
|
|
// 将名称为空的蓝牙设备过滤,如果蓝牙正在连接或者已连接不过滤
|
|
|
|
|
if (deviceItem && deviceItem->device() && deviceItem->device()->name().isEmpty()
|
|
|
|
|
&& (Device::StateConnected != deviceItem->device()->state() || !deviceItem->device()->connecting())) {
|
|
|
|
|
DStandardItem *dListItem = deviceItem->standardItem();
|
|
|
|
|
QModelIndex index = m_deviceModel->indexFromItem(dListItem);
|
|
|
|
|
if (index.isValid()) {
|
|
|
|
|
m_deviceModel->takeRow(index.row());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-01-08 14:33:08 +08:00
|
|
|
|
}
|