diff --git a/src/bluetooth/bluez.cpp b/src/bluetooth/bluez.cpp index 3c8bf949..6ff2e307 100644 --- a/src/bluetooth/bluez.cpp +++ b/src/bluetooth/bluez.cpp @@ -26,6 +26,11 @@ Bluez* Bluez::instance() { Bluez::Bluez() { this->init(); } +void Bluez::updateDefaultAdapter() { + const auto& adapters = this->mAdapters.valueList(); + this->bDefaultAdapter = adapters.empty() ? nullptr : adapters.first(); +} + void Bluez::init() { qCDebug(logBluetooth) << "Connecting to BlueZ"; @@ -95,6 +100,7 @@ void Bluez::onInterfacesAdded( this->mAdapterMap.insert(path.path(), adapter); this->mAdapters.insertObject(adapter); + this->updateDefaultAdapter(); } else if (interfaces.contains("org.bluez.Device1")) { auto* device = new BluetoothDevice(path.path(), this); @@ -127,6 +133,7 @@ void Bluez::onInterfacesRemoved(const QDBusObjectPath& path, const QStringList& this->mAdapterMap.remove(path.path()); this->mAdapters.removeObject(adapter); + this->updateDefaultAdapter(); delete adapter; } } else if (auto* device = this->mDeviceMap.value(path.path())) { @@ -148,9 +155,8 @@ void Bluez::onInterfacesRemoved(const QDBusObjectPath& path, const QStringList& } } -BluetoothAdapter* Bluez::defaultAdapter() const { - const auto& adapters = this->mAdapters.valueList(); - return adapters.isEmpty() ? nullptr : adapters.first(); +BluezQml::BluezQml() { + QObject::connect(Bluez::instance(), &Bluez::defaultAdapterChanged, this, &BluezQml::defaultAdapterChanged); } } // namespace qs::bluetooth diff --git a/src/bluetooth/bluez.hpp b/src/bluetooth/bluez.hpp index d888e8fe..a0c12679 100644 --- a/src/bluetooth/bluez.hpp +++ b/src/bluetooth/bluez.hpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -22,7 +23,6 @@ class Bluez: public QObject { public: [[nodiscard]] ObjectModel* adapters() { return &this->mAdapters; } [[nodiscard]] ObjectModel* devices() { return &this->mDevices; } - [[nodiscard]] BluetoothAdapter* defaultAdapter() const; [[nodiscard]] BluetoothAdapter* adapter(const QString& path) { return this->mAdapterMap.value(path); @@ -30,10 +30,14 @@ public: static Bluez* instance(); +signals: + void defaultAdapterChanged(); + private slots: void onInterfacesAdded(const QDBusObjectPath& path, const DBusObjectManagerInterfaces& interfaces); void onInterfacesRemoved(const QDBusObjectPath& path, const QStringList& interfaces); + void updateDefaultAdapter(); private: explicit Bluez(); @@ -44,6 +48,9 @@ private: QHash mDeviceMap; ObjectModel mAdapters {this}; ObjectModel mDevices {this}; + +public: + Q_OBJECT_BINDABLE_PROPERTY(Bluez, BluetoothAdapter*, bDefaultAdapter, &Bluez::defaultAdapterChanged); }; ///! Bluetooth manager @@ -51,7 +58,7 @@ private: class BluezQml: public QObject { Q_OBJECT; /// The default bluetooth adapter. Usually there is only one. - Q_PROPERTY(BluetoothAdapter* defaultAdapter READ defaultAdapter CONSTANT); + Q_PROPERTY(BluetoothAdapter* defaultAdapter READ default NOTIFY defaultAdapterChanged BINDABLE bindableDefaultAdapter); QSDOC_TYPE_OVERRIDE(ObjectModel*); /// A list of all bluetooth adapters. See @@defaultAdapter for the default. Q_PROPERTY(UntypedObjectModel* adapters READ adapters CONSTANT); @@ -62,8 +69,11 @@ class BluezQml: public QObject { QML_NAMED_ELEMENT(Bluetooth); QML_SINGLETON; +signals: + void defaultAdapterChanged(); + public: - explicit BluezQml(QObject* parent = nullptr): QObject(parent) {} + explicit BluezQml(); [[nodiscard]] static ObjectModel* adapters() { return Bluez::instance()->adapters(); @@ -73,8 +83,8 @@ public: return Bluez::instance()->devices(); } - [[nodiscard]] static BluetoothAdapter* defaultAdapter() { - return Bluez::instance()->defaultAdapter(); + [[nodiscard]] static QBindable bindableDefaultAdapter() { + return &Bluez::instance()->bDefaultAdapter; } };