diff --git a/plugins/bluetooth/bluetoothapplet.cpp b/plugins/bluetooth/bluetoothapplet.cpp index 9ef79ca0a..f874cd04a 100644 --- a/plugins/bluetooth/bluetoothapplet.cpp +++ b/plugins/bluetooth/bluetoothapplet.cpp @@ -45,9 +45,16 @@ BluetoothApplet::BluetoothApplet(QWidget *parent) m_appletName->setText(tr("Bluetooth")); m_appletName->setVisible(false); + auto appletNameLayout = new QHBoxLayout; + appletNameLayout->setMargin(0); + appletNameLayout->setSpacing(0); + appletNameLayout->addSpacing(12); + appletNameLayout->addWidget(m_appletName); + appletNameLayout->addStretch(); + m_centrealLayout->setMargin(0); m_centrealLayout->setSpacing(0); - m_centrealLayout->addWidget(m_appletName); + m_centrealLayout->addLayout(appletNameLayout); m_centrealLayout->addWidget(m_line); m_centralWidget->setLayout(m_centrealLayout); m_centralWidget->setFixedWidth(Width); @@ -83,18 +90,71 @@ bool BluetoothApplet::hasAadapter() return m_adaptersManager->adaptersCount(); } +Device::State BluetoothApplet::initDeviceState() +{ + m_initDeviceState = Device::StateUnavailable; + for (auto adapterItem : m_adapterItems) { + if (adapterItem) + if (Device::StateAvailable == adapterItem->initDeviceState()) { + m_initDeviceState = Device::StateAvailable; + continue; + } + if (Device::StateConnected == adapterItem->initDeviceState()) { + m_initDeviceState = Device::StateConnected; + break; + } + } + return m_initDeviceState; +} + +void BluetoothApplet::onPowerChanged(bool state) +{ + Q_UNUSED(state) + bool powerState = false; + for (auto adapterItem : m_adapterItems) { + if (adapterItem->isPowered()) { + powerState = true; + break; + } + } + emit powerChanged(powerState); +} + +void BluetoothApplet::onDeviceStateChanged(const Device::State state) +{ + Q_UNUSED(state) + + Device::State deviceState = Device::StateUnavailable; + for (auto adapterItem : m_adapterItems) { + if (Device::StateAvailable == adapterItem->currentDeviceState()) { + deviceState = Device::StateAvailable; + continue; + } + if (Device::StateConnected == adapterItem->currentDeviceState()) { + deviceState = Device::StateConnected; + break; + } + } + + emit deviceStateChanged(deviceState); +} + void BluetoothApplet::addAdapter(Adapter *adapter) { if (!adapter) return; + if (!m_adapterItems.size()) { + emit justHasAdapter(); + } + auto adapterId = adapter->id(); auto adatpterItem = new AdapterItem(m_adaptersManager, adapter, this); m_adapterItems[adapterId] = adatpterItem; m_centrealLayout->addWidget(adatpterItem); - connect(adatpterItem, &AdapterItem::deviceStateChanged, this, &BluetoothApplet::deviceStateChanged); - connect(adatpterItem, &AdapterItem::powerChanged, this, &BluetoothApplet::powerChanged); + connect(adatpterItem, &AdapterItem::deviceStateChanged, this, &BluetoothApplet::onDeviceStateChanged); + connect(adatpterItem, &AdapterItem::powerChanged, this, &BluetoothApplet::onPowerChanged); connect(adatpterItem, &AdapterItem::sizeChange, this, &BluetoothApplet::updateView); updateView(); @@ -120,13 +180,15 @@ void BluetoothApplet::updateView() int contentHeight = 0; int itemCount = 0; for (auto adapterItem : m_adapterItems) { - if (adapterItem && adapterItem->isPowered()) { - itemCount += adapterItem->deviceCount(); - contentHeight += ControlHeight; + if (adapterItem) { + contentHeight += adapterItem->viewHeight(); + if (adapterItem->isPowered()) + itemCount += adapterItem->deviceCount(); } } - if (m_adapterItems.size() > 1) { + auto adaptersCnt = m_adapterItems.size(); + if (adaptersCnt > 1) { m_line->setVisible(true); m_appletName->setVisible(true); } else { @@ -134,15 +196,18 @@ void BluetoothApplet::updateView() m_appletName->setVisible(false); } - if (itemCount <= 16) { + if (adaptersCnt > 1) + contentHeight += m_appletName->height(); + + if (itemCount <= 10) { contentHeight += itemCount * ItemHeight; m_centralWidget->setFixedHeight(contentHeight); setFixedHeight(contentHeight); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); } else { - contentHeight += 16 * ItemHeight; + contentHeight += itemCount * ItemHeight; m_centralWidget->setFixedHeight(contentHeight); - setFixedHeight(contentHeight); + setFixedHeight(10 * ItemHeight); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); } } diff --git a/plugins/bluetooth/bluetoothapplet.h b/plugins/bluetooth/bluetoothapplet.h index 4e9d146eb..a92aba612 100644 --- a/plugins/bluetooth/bluetoothapplet.h +++ b/plugins/bluetooth/bluetoothapplet.h @@ -41,6 +41,7 @@ public: void setAdapterPowered(bool powered); bool poweredInitState(); bool hasAadapter(); + Device::State initDeviceState(); public slots : void addAdapter(Adapter *constadapter); @@ -50,6 +51,11 @@ signals: void powerChanged(bool state); void deviceStateChanged(const Device::State state); void noAdapter(); + void justHasAdapter(); + +private slots: + void onPowerChanged(bool state); + void onDeviceStateChanged(const Device::State state); private: void updateView(); @@ -63,6 +69,7 @@ private: AdaptersManager *m_adaptersManager; QMap m_adapterItems; + Device::State m_initDeviceState; }; #endif // BLUETOOTHAPPLET_H diff --git a/plugins/bluetooth/bluetoothitem.cpp b/plugins/bluetooth/bluetoothitem.cpp index 4e7fcb0fc..42969a364 100644 --- a/plugins/bluetooth/bluetoothitem.cpp +++ b/plugins/bluetooth/bluetoothitem.cpp @@ -43,10 +43,14 @@ DGUI_USE_NAMESPACE BluetoothItem::BluetoothItem(QWidget *parent) : QWidget(parent) , m_applet(new BluetoothApplet(this)) + , m_timer(new QTimer(this)) { m_applet->setVisible(false); m_adapterPowered = m_applet->poweredInitState(); + m_devState = m_applet->initDeviceState(); + + connect(m_timer, &QTimer::timeout, this, &BluetoothItem::refreshIcon); connect(m_applet, &BluetoothApplet::powerChanged, [&](bool powered) { m_adapterPowered = powered; refreshIcon(); @@ -56,6 +60,7 @@ BluetoothItem::BluetoothItem(QWidget *parent) refreshIcon(); }); connect(m_applet, SIGNAL(noAdapter()), this, SIGNAL(noAdapter())); + connect(m_applet, SIGNAL(justHasAdapter()), this, SIGNAL(justHasAdapter())); } //QWidget *BluetoothItem::tipsWidget() @@ -120,10 +125,37 @@ void BluetoothItem::refreshIcon() return; QString stateString; + QString iconString; - m_adapterPowered ? (m_devState == Device::StateConnected ? stateString = "waiting" : stateString = "active") : stateString = "disable"; + if (m_adapterPowered) { + switch (m_devState) { + case Device::StateConnected: + stateString = "active"; + break; + case Device::StateAvailable: { + m_timer->start(); + stateString = "waiting"; + iconString = QString("bluetooth-%1-symbolic").arg(stateString); + const auto ratio = devicePixelRatioF(); + int iconSize = PLUGIN_ICON_MAX_SIZE; + if (height() <= PLUGIN_BACKGROUND_MIN_SIZE && DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) + iconString.append(PLUGIN_MIN_ICON_NAME); - QString iconString = QString("bluetooth-%1-symbolic").arg(stateString); + m_iconPixmap = ImageUtil::loadSvg(iconString, ":/", iconSize, ratio); + + update(); + return ; + } + case Device::StateUnavailable: { + stateString = "disable"; + } break; + } + } else { + stateString = "disable"; + } + + m_timer->stop(); + iconString = QString("bluetooth-%1-symbolic").arg(stateString); const auto ratio = devicePixelRatioF(); int iconSize = PLUGIN_ICON_MAX_SIZE; @@ -165,5 +197,9 @@ void BluetoothItem::paintEvent(QPaintEvent *e) const QRectF &rf = QRectF(rect()); const QRectF &rfp = QRectF(m_iconPixmap.rect()); painter.drawPixmap(rf.center() - rfp.center() / m_iconPixmap.devicePixelRatioF(), m_iconPixmap); + if (m_devState == Device::StateAvailable) { + QTime time = QTime::currentTime(); + painter.rotate((time.second() + (time.msec() / 1000.0)) * 6.0); + } } diff --git a/plugins/bluetooth/bluetoothitem.h b/plugins/bluetooth/bluetoothitem.h index 479b866f4..7e17bfd6e 100644 --- a/plugins/bluetooth/bluetoothitem.h +++ b/plugins/bluetooth/bluetoothitem.h @@ -55,6 +55,7 @@ protected: signals: void requestContextMenu() const; void noAdapter(); + void justHasAdapter(); private: // TipsWidget *m_tipsLabel; @@ -63,6 +64,7 @@ private: Device::State m_devState; bool m_adapterPowered; + QTimer *m_timer; }; #endif // BLUETOOTHITEM_H diff --git a/plugins/bluetooth/bluetoothplugin.cpp b/plugins/bluetooth/bluetoothplugin.cpp index 2fa81c0ba..0ab3fd2b9 100644 --- a/plugins/bluetooth/bluetoothplugin.cpp +++ b/plugins/bluetooth/bluetoothplugin.cpp @@ -49,9 +49,13 @@ void BluetoothPlugin::init(PluginProxyInterface *proxyInter) m_bluetoothItem = new BluetoothItem; + connect(m_bluetoothItem, &BluetoothItem::justHasAdapter, [&]{ + m_enableState = true; + refreshPluginItemsVisible(); + }); connect(m_bluetoothItem, &BluetoothItem::noAdapter, [&]{ m_enableState = false; - pluginIsDisable(); + refreshPluginItemsVisible(); }); m_enableState = m_bluetoothItem->hasAdapter(); diff --git a/plugins/bluetooth/componments/adapteritem.cpp b/plugins/bluetooth/componments/adapteritem.cpp index f41d7e80f..b11618630 100644 --- a/plugins/bluetooth/componments/adapteritem.cpp +++ b/plugins/bluetooth/componments/adapteritem.cpp @@ -28,6 +28,8 @@ #include +extern const int ItemHeight; +extern const int ControlHeight; const int Width = 200; AdapterItem::AdapterItem(AdaptersManager *adapterManager, Adapter *adapter, QWidget *parent) @@ -45,6 +47,7 @@ AdapterItem::AdapterItem(AdaptersManager *adapterManager, Adapter *adapter, QWid m_deviceLayout->setMargin(0); m_deviceLayout->setSpacing(0); m_openControlCenter->setText("Bluetooth settings"); + m_openControlCenter->setFixedHeight(ItemHeight); m_openControlCenter->setVisible(false); m_switchItem->setTitle(adapter->name()); m_switchItem->setChecked(adapter->powered()); @@ -72,6 +75,21 @@ AdapterItem::AdapterItem(AdaptersManager *adapterManager, Adapter *adapter, QWid } } + m_initDeviceState = Device::StateUnavailable; + for (auto constDevice : myDevices) { + auto device = const_cast(constDevice); + if (device) { + if (device->state() == Device::StateAvailable) { + m_initDeviceState = Device::StateConnected; + continue; + } + if (device->state() == Device::StateConnected) { + m_initDeviceState = Device::StateConnected; + break; + } + } + } + connect(m_switchItem, &SwitchItem::checkedChanged, this, &AdapterItem::showAndConnect); connect(adapter, &Adapter::nameChanged, m_switchItem, &SwitchItem::setTitle); connect(adapter, &Adapter::deviceAdded, this, &AdapterItem::addDeviceItem); @@ -107,7 +125,12 @@ void AdapterItem::setPowered(bool powered) bool AdapterItem::isPowered() { - return m_adapter->powered(); + return m_switchItem->checkState(); +} + +int AdapterItem::viewHeight() +{ + return m_openControlCenter->isVisible() ? ControlHeight + ItemHeight : ControlHeight; } void AdapterItem::deviceItemPaired(const bool paired) @@ -136,21 +159,21 @@ void AdapterItem::removeDeviceItem(const Device *device) m_deviceItems.remove(device->id()); if (device->paired()) { // m_pairedDeviceItems.remove(device->id()); - m_deviceLayout->removeWidget(deviceItem); } + m_deviceLayout->removeWidget(deviceItem); delete deviceItem; - showDevices(m_adapter->powered()); } + showDevices(m_adapter->powered()); } void AdapterItem::showAndConnect(bool change) { - showDevices(change); - m_adaptersManager->setAdapterPowered(m_adapter, change); if (change) { - m_adaptersManager->connectAllPairedDevice(m_adapter); +// m_adaptersManager->connectAllPairedDevice(m_adapter); } + showDevices(change); + emit powerChanged(change); } @@ -178,6 +201,7 @@ void AdapterItem::deviceChangeState(const Device::State state) } } + m_currentDeviceState = state; emit deviceStateChanged(state); } @@ -204,7 +228,8 @@ void AdapterItem::createDeviceItem(Device *device) void AdapterItem::updateView() { - auto contentHeight = m_centralWidget->sizeHint().height(); + auto contentHeight = m_switchItem->height(); + contentHeight += (m_deviceLayout->count() - 3) * ItemHeight; m_centralWidget->setFixedHeight(contentHeight); setFixedHeight(contentHeight); emit sizeChange(); diff --git a/plugins/bluetooth/componments/adapteritem.h b/plugins/bluetooth/componments/adapteritem.h index 67fa587e1..1f66dc2ba 100644 --- a/plugins/bluetooth/componments/adapteritem.h +++ b/plugins/bluetooth/componments/adapteritem.h @@ -45,6 +45,9 @@ public: int deviceCount(); void setPowered(bool powered); bool isPowered(); + int viewHeight(); + inline Device::State initDeviceState() { return m_initDeviceState; } + inline Device::State currentDeviceState() { return m_currentDeviceState; } signals: void deviceStateChanged(const Device::State state); @@ -74,6 +77,8 @@ private: Adapter *m_adapter; SwitchItem *m_switchItem; QMap m_deviceItems; + Device::State m_initDeviceState; + Device::State m_currentDeviceState; // QMap m_pairedDeviceItems; }; diff --git a/plugins/bluetooth/componments/adaptersmanager.cpp b/plugins/bluetooth/componments/adaptersmanager.cpp index d7eea02a5..2340ba1ba 100644 --- a/plugins/bluetooth/componments/adaptersmanager.cpp +++ b/plugins/bluetooth/componments/adaptersmanager.cpp @@ -43,6 +43,7 @@ AdaptersManager::AdaptersManager(QObject *parent) connect(m_bluetoothInter, &DBusBluetooth::DeviceRemoved, this, &AdaptersManager::removeDevice); connect(m_bluetoothInter, &DBusBluetooth::DevicePropertiesChanged, this, &AdaptersManager::onDevicePropertiesChanged); +#ifdef QT_DEBUG connect(m_bluetoothInter, &DBusBluetooth::RequestAuthorization, this, [](const QDBusObjectPath & in0) { qDebug() << "request authorization: " << in0.path(); }); @@ -62,6 +63,7 @@ AdaptersManager::AdaptersManager(QObject *parent) connect(m_bluetoothInter, &DBusBluetooth::DisplayPinCode, this, [](const QDBusObjectPath & in0, const QString & in1) { qDebug() << "request display pincode: " << in0.path() << in1; }); +#endif QDBusInterface *inter = new QDBusInterface("com.deepin.daemon.Bluetooth", "/com/deepin/daemon/Bluetooth", @@ -116,7 +118,7 @@ void AdaptersManager::setAdapterPowered(const Adapter *adapter, const bool &powe void AdaptersManager::connectAllPairedDevice(const Adapter *adapter) { - for (const Device *d : adapter->devices()) { + for (const Device *d : adapter->paredDevices()) { Device *vd = const_cast(d); if (vd) { QDBusObjectPath path(vd->id()); @@ -162,9 +164,13 @@ void AdaptersManager::onAdapterPropertiesChanged(const QString &json) const QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8()); const QJsonObject obj = doc.object(); const QString id = obj["Path"].toString(); + const bool isDiscovering = obj["Discovering"].toBool(); + QDBusObjectPath dPath(id); Adapter *adapter = const_cast(m_adapters[id]); if (adapter) { + if (!isDiscovering) + m_bluetoothInter->SetAdapterDiscovering(dPath, true); inflateAdapter(adapter, obj); } } diff --git a/plugins/bluetooth/componments/deviceitem.cpp b/plugins/bluetooth/componments/deviceitem.cpp index 6e64783ad..7ea1c6ce5 100644 --- a/plugins/bluetooth/componments/deviceitem.cpp +++ b/plugins/bluetooth/componments/deviceitem.cpp @@ -61,12 +61,12 @@ DeviceItem::DeviceItem(const QString &title, QWidget *parent) auto itemLayout = new QHBoxLayout(this); itemLayout->setMargin(0); itemLayout->setSpacing(0); - itemLayout->addSpacing(5); + itemLayout->addSpacing(12); itemLayout->addWidget(m_title); itemLayout->addStretch(); itemLayout->addWidget(m_state); itemLayout->addWidget(m_loadingStat); - itemLayout->addSpacing(5); + itemLayout->addSpacing(12); deviceLayout->addLayout(itemLayout); setLayout(deviceLayout); } diff --git a/plugins/bluetooth/componments/switchitem.cpp b/plugins/bluetooth/componments/switchitem.cpp index 147c24bf1..a738de1b2 100644 --- a/plugins/bluetooth/componments/switchitem.cpp +++ b/plugins/bluetooth/componments/switchitem.cpp @@ -36,14 +36,15 @@ SwitchItem::SwitchItem(QWidget *parent) auto switchLayout = new QHBoxLayout(this); switchLayout->setSpacing(0); switchLayout->setMargin(0); - switchLayout->addSpacing(5); + switchLayout->addSpacing(12); switchLayout->addWidget(m_title); switchLayout->addStretch(); switchLayout->addWidget(m_switchBtn); - switchLayout->addSpacing(5); + switchLayout->addSpacing(12); setLayout(switchLayout); connect(m_switchBtn, &DSwitchButton::toggled, [&](bool change) { + m_checkState = change; emit checkedChanged(change); }); } @@ -51,6 +52,7 @@ SwitchItem::SwitchItem(QWidget *parent) void SwitchItem::setChecked(const bool checked) { m_switchBtn->setChecked(checked); + m_checkState = checked; } void SwitchItem::setTitle(const QString &title) diff --git a/plugins/bluetooth/componments/switchitem.h b/plugins/bluetooth/componments/switchitem.h index 2da856a39..bd7f669a1 100644 --- a/plugins/bluetooth/componments/switchitem.h +++ b/plugins/bluetooth/componments/switchitem.h @@ -36,6 +36,7 @@ public: explicit SwitchItem(QWidget *parent = nullptr); void setChecked(const bool checked = true); void setTitle(const QString &title); + inline bool checkState() { return m_checkState; } inline bool isdefault() { return m_default; } inline void setDefault(bool def) { m_default = def; } @@ -51,6 +52,7 @@ private: QLabel *m_title; DSwitchButton *m_switchBtn; bool m_default; + bool m_checkState; }; #endif // SWITCHITEM_H