Skip to content

Commit c9f70e0

Browse files
committed
feat: move synced properties to bindables
- Prefer bindables over connections for synced properties - Remove lambdas from ready and disappeared signal connections - Add namespaces to Q_PROPERTY definitions - Remove Network.wifi.defaultDevice (easy to add in userspace) - Add all devices to a ListView in network.qml
1 parent 434f9ee commit c9f70e0

File tree

11 files changed

+210
-319
lines changed

11 files changed

+210
-319
lines changed

src/network/device.cpp

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,36 +13,12 @@ QS_LOGGING_CATEGORY(logNetworkDevice, "quickshell.network.device", QtWarningMsg)
1313

1414
NetworkDevice::NetworkDevice(QObject* parent): QObject(parent) {};
1515

16-
void NetworkDevice::setName(const QString& name) {
17-
if (name == this->mName) return;
18-
this->mName = name;
19-
emit this->nameChanged();
20-
}
21-
22-
void NetworkDevice::setAddress(const QString& address) {
23-
if (address == this->mAddress) return;
24-
this->mAddress = address;
25-
emit this->addressChanged();
26-
}
27-
28-
void NetworkDevice::setState(NetworkConnectionState::Enum state) {
29-
if (state == this->mState) return;
30-
this->mState = state;
31-
emit this->stateChanged();
32-
}
33-
34-
void NetworkDevice::setNmState(NMDeviceState::Enum nmState) {
35-
if (nmState == this->mNmState) return;
36-
this->mNmState = nmState;
37-
emit this->nmStateChanged();
38-
}
39-
4016
void NetworkDevice::disconnect() {
41-
if (this->mState == NetworkConnectionState::Disconnected) {
17+
if (this->bState == NetworkConnectionState::Disconnected) {
4218
qCCritical(logNetworkDevice) << "Device" << this << "is already disconnected";
4319
return;
4420
}
45-
if (this->mState == NetworkConnectionState::Disconnecting) {
21+
if (this->bState == NetworkConnectionState::Disconnecting) {
4622
qCCritical(logNetworkDevice) << "Device" << this << "is already disconnecting";
4723
return;
4824
}

src/network/device.hpp

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,16 @@ class NetworkDevice: public QObject {
3232
Q_OBJECT;
3333
QML_ELEMENT;
3434
QML_UNCREATABLE("Devices can only be acquired through Network");
35-
35+
// clang-format off
3636
/// The name of the device's control interface.
37-
Q_PROPERTY(QString name READ name NOTIFY nameChanged);
37+
Q_PROPERTY(QString name READ name NOTIFY nameChanged BINDABLE bindableName);
3838
/// The hardware address of the device in the XX:XX:XX:XX:XX:XX format.
39-
Q_PROPERTY(QString address READ address NOTIFY addressChanged);
39+
Q_PROPERTY(QString address READ address NOTIFY addressChanged BINDABLE bindableAddress);
4040
/// Connection state of the device.
41-
Q_PROPERTY(NetworkConnectionState::Enum state READ state NOTIFY stateChanged);
41+
Q_PROPERTY(qs::network::NetworkConnectionState::Enum state READ state NOTIFY stateChanged BINDABLE bindableState);
4242
/// A more specific device state when the backend is NetworkManager.
43-
Q_PROPERTY(NMDeviceState::Enum nmState READ nmState NOTIFY nmStateChanged);
43+
Q_PROPERTY(qs::network::NMDeviceState::Enum nmState READ nmState NOTIFY nmStateChanged BINDABLE bindableNmState);
44+
// clang-format on
4445

4546
signals:
4647
void nameChanged();
@@ -49,28 +50,28 @@ class NetworkDevice: public QObject {
4950
void nmStateChanged();
5051
void requestDisconnect();
5152

52-
public slots:
53-
void setName(const QString& name);
54-
void setAddress(const QString& address);
55-
void setState(NetworkConnectionState::Enum state);
56-
void setNmState(NMDeviceState::Enum state);
57-
5853
public:
5954
explicit NetworkDevice(QObject* parent = nullptr);
6055

61-
[[nodiscard]] QString name() const { return this->mName; };
62-
[[nodiscard]] QString address() const { return this->mAddress; };
63-
[[nodiscard]] NetworkConnectionState::Enum state() const { return this->mState; };
64-
[[nodiscard]] NMDeviceState::Enum nmState() const { return this->mNmState; };
65-
6656
/// Disconnects the device and prevents it from automatically activating further connections.
6757
Q_INVOKABLE void disconnect();
6858

59+
[[nodiscard]] QString name() const { return this->bName; };
60+
[[nodiscard]] QString address() const { return this->bAddress; };
61+
[[nodiscard]] NetworkConnectionState::Enum state() const { return this->bState; };
62+
[[nodiscard]] NMDeviceState::Enum nmState() const { return this->bNmState; };
63+
QBindable<QString> bindableName() { return &this->bName; };
64+
QBindable<QString> bindableAddress() { return &this->bAddress; };
65+
QBindable<NetworkConnectionState::Enum> bindableState() { return &this->bState; };
66+
QBindable<NMDeviceState::Enum> bindableNmState() { return &this->bNmState; };
67+
6968
private:
70-
QString mName;
71-
QString mAddress;
72-
NetworkConnectionState::Enum mState = NetworkConnectionState::Unknown;
73-
NMDeviceState::Enum mNmState = NMDeviceState::Unknown;
69+
// clang-format off
70+
Q_OBJECT_BINDABLE_PROPERTY(NetworkDevice, QString, bName, &NetworkDevice::nameChanged);
71+
Q_OBJECT_BINDABLE_PROPERTY(NetworkDevice, QString, bAddress, &NetworkDevice::addressChanged);
72+
Q_OBJECT_BINDABLE_PROPERTY(NetworkDevice, NetworkConnectionState::Enum, bState, &NetworkDevice::stateChanged);
73+
Q_OBJECT_BINDABLE_PROPERTY(NetworkDevice, NMDeviceState::Enum, bNmState, &NetworkDevice::nmStateChanged);
74+
// clang-format on
7475
};
7576

7677
} // namespace qs::network

src/network/network.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include "network.hpp"
22

3-
#include <qloggingcategory.h>
43
#include <qlogging.h>
4+
#include <qloggingcategory.h>
55

66
#include "../core/logcat.hpp"
77
#include "nm/backend.hpp"
@@ -19,8 +19,8 @@ Network::Network(QObject* parent): QObject(parent), mWifi(new Wifi(this)) {
1919
// clang-format off
2020
QObject::connect(nm, &NetworkManager::wifiDeviceAdded, this->wifi(), &Wifi::onDeviceAdded);
2121
QObject::connect(nm, &NetworkManager::wifiDeviceRemoved, this->wifi(), &Wifi::onDeviceRemoved);
22-
QObject::connect(nm, &NetworkManager::wifiEnabledChanged, this->wifi(), &Wifi::onEnabledSet);
23-
QObject::connect(nm, &NetworkManager::wifiHardwareEnabledChanged, this->wifi(), &Wifi::onHardwareEnabledSet);
22+
this->wifi()->bindableEnabled().setBinding([nm]() { return nm->wifiEnabled(); });
23+
this->wifi()->bindableHardwareEnabled().setBinding([nm]() { return nm->wifiHardwareEnabled(); });
2424
QObject::connect(this->wifi(), &Wifi::requestSetEnabled, nm, &NetworkManager::setWifiEnabled);
2525
// clang-format on
2626
this->mBackend = nm;

src/network/network.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ class Network: public QObject {
4949
public:
5050
explicit Network(QObject* parent = nullptr);
5151

52-
[[nodiscard]] Wifi* wifi() { return this->mWifi; };
53-
[[nodiscard]] NetworkBackendType::Enum backend() { return this->mBackendType; };
52+
[[nodiscard]] Wifi* wifi() const { return this->mWifi; };
53+
[[nodiscard]] NetworkBackendType::Enum backend() const { return this->mBackendType; };
5454

5555
private:
5656
Wifi* mWifi;

src/network/nm/backend.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -143,12 +143,17 @@ void NetworkManager::registerWifiDevice(const QString& path) {
143143
wireless->setParent(device);
144144
this->mDeviceHash.insert(path, device);
145145

146+
device->bindableName().setBinding([wireless]() { return wireless->interface(); });
147+
device->bindableAddress().setBinding([wireless]() { return wireless->hwAddress(); });
148+
device->bindableNmState().setBinding([wireless]() { return wireless->state(); });
149+
device->bindableState().setBinding([wireless]() {
150+
return qs::network::NetworkManager::toNetworkDeviceState(wireless->state());
151+
});
152+
device->bindableScanning().setBinding([wireless]() {
153+
(void)wireless->lastScan();
154+
return false;
155+
});
146156
// clang-format off
147-
QObject::connect(wireless, &NMWirelessDevice::interfaceChanged, device, &WifiDevice::setName);
148-
QObject::connect(wireless, &NMWirelessDevice::hwAddressChanged, device, &WifiDevice::setAddress);
149-
QObject::connect(wireless, &NMWirelessDevice::stateChanged, device, &WifiDevice::setNmState);
150-
QObject::connect(wireless, &NMWirelessDevice::stateChanged, device, [device](NMDeviceState::Enum state) { device->setState(qs::network::NetworkManager::toNetworkDeviceState(state));});
151-
QObject::connect(wireless, &NMWirelessDevice::lastScanChanged, device, &WifiDevice::scanComplete);
152157
QObject::connect(wireless, &NMWirelessDevice::addAndActivateConnection, this, &NetworkManager::addAndActivateConnection);
153158
QObject::connect(wireless, &NMWirelessDevice::activateConnection, this, &NetworkManager::activateConnection);
154159
QObject::connect(wireless, &NMWirelessDevice::wifiNetworkAdded, device, &WifiDevice::networkAdded);

src/network/nm/backend.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ class NetworkManager: public NetworkBackend {
2626
public:
2727
explicit NetworkManager(QObject* parent = nullptr);
2828
[[nodiscard]] bool isAvailable() const override;
29+
[[nodiscard]] bool wifiEnabled() const { return this->bWifiEnabled; };
30+
[[nodiscard]] bool wifiHardwareEnabled() const { return this->bWifiHardwareEnabled; };
2931

3032
public slots:
3133
void setWifiEnabled(bool enabled);

src/network/nm/wireless.cpp

Lines changed: 20 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -59,33 +59,13 @@ void NMWirelessNetwork::updateReferenceConnection() {
5959
}
6060
}
6161

62-
void NMWirelessNetwork::setActiveApPath(const QDBusObjectPath& path) {
63-
if (this->mActiveApPath == path) return;
64-
this->mActiveApPath = path;
65-
}
66-
67-
void NMWirelessNetwork::setState(NMConnectionState::Enum state) {
68-
if (this->bState == state) return;
69-
this->bState = state;
70-
}
71-
72-
void NMWirelessNetwork::setReason(NMConnectionStateReason::Enum reason) {
73-
if (this->bReason == reason) return;
74-
this->bReason = reason;
75-
};
76-
77-
void NMWirelessNetwork::setCaps(NMWirelessCapabilities::Enum caps) {
78-
if (this->mCaps == caps) return;
79-
this->mCaps = caps;
80-
}
81-
8262
void NMWirelessNetwork::updateReferenceAp() {
8363
quint8 selectedStrength = 0;
8464
NMAccessPoint* selectedAp = nullptr;
8565

8666
for (auto* ap: this->mAccessPoints.values()) {
8767
// Always prefer the active AP if found.
88-
if (ap->path() == this->mActiveApPath.path()) {
68+
if (ap->path() == this->bActiveApPath) {
8969
selectedStrength = ap->signalStrength();
9070
selectedAp = ap;
9171
break;
@@ -108,7 +88,7 @@ void NMWirelessNetwork::updateReferenceAp() {
10888
// Reference AP is used for security when there's no connection settings.
10989
if (this->mReferenceConn) return;
11090
auto security = findBestWirelessSecurity(
111-
this->mCaps,
91+
this->bCaps,
11292
this->mReferenceAp->mode() == NM80211Mode::Adhoc,
11393
this->mReferenceAp->flags(),
11494
this->mReferenceAp->wpaFlags(),
@@ -123,12 +103,13 @@ void NMWirelessNetwork::addAccessPoint(NMAccessPoint* ap) {
123103
this->mAccessPoints.insert(ap->path(), ap);
124104
// clang-format off
125105
QObject::connect(ap, &NMAccessPoint::signalStrengthChanged, this, &NMWirelessNetwork::updateReferenceAp);
126-
QObject::connect(ap, &NMAccessPoint::disappeared, this, [this, ap] { this->removeAccessPoint(ap); });
106+
QObject::connect(ap, &NMAccessPoint::disappeared, this, &NMWirelessNetwork::removeAccessPoint);
127107
// clang-format on
128108
this->updateReferenceAp();
129109
};
130110

131-
void NMWirelessNetwork::removeAccessPoint(NMAccessPoint* ap) {
111+
void NMWirelessNetwork::removeAccessPoint() {
112+
auto* ap = qobject_cast<NMAccessPoint*>(sender());
132113
if (this->mAccessPoints.take(ap->path())) {
133114
if (this->mAccessPoints.isEmpty()) {
134115
emit this->disappeared();
@@ -143,13 +124,14 @@ void NMWirelessNetwork::addConnectionSettings(NMConnectionSettings* conn) {
143124
if (this->mConnections.contains(conn->path())) return;
144125
this->mConnections.insert(conn->path(), conn);
145126
// clang-format off
146-
QObject::connect(conn, &NMConnectionSettings::disappeared, this, [this, conn]() { this->removeConnectionSettings(conn); });
127+
QObject::connect(conn, &NMConnectionSettings::disappeared, this, &NMWirelessNetwork::removeConnectionSettings);
147128
// clang-format on
148129
this->updateReferenceConnection();
149130
this->bKnown = true;
150131
};
151132

152-
void NMWirelessNetwork::removeConnectionSettings(NMConnectionSettings* conn) {
133+
void NMWirelessNetwork::removeConnectionSettings() {
134+
auto* conn = qobject_cast<NMConnectionSettings*>(sender());
153135
if (this->mConnections.take(conn->path())) {
154136
QObject::disconnect(conn, nullptr, this, nullptr);
155137
this->updateReferenceConnection();
@@ -161,18 +143,16 @@ void NMWirelessNetwork::removeConnectionSettings(NMConnectionSettings* conn) {
161143

162144
void NMWirelessNetwork::addActiveConnection(NMActiveConnection* active) {
163145
if (this->mActiveConnection) return;
164-
165-
this->bState = active->state();
166-
this->bReason = active->stateReason();
167146
this->mActiveConnection = active;
147+
this->bState.setBinding([active]() { return active->state(); });
148+
this->bReason.setBinding([active]() { return active->stateReason(); });
168149
// clang-format off
169-
QObject::connect(active, &NMActiveConnection::stateChanged, this, &NMWirelessNetwork::setState);
170-
QObject::connect(active, &NMActiveConnection::stateReasonChanged, this, &NMWirelessNetwork::setReason);
171-
QObject::connect(active, &NMActiveConnection::disappeared, this, [this, active] { this->removeActiveConnection(active); });
150+
QObject::connect(active, &NMActiveConnection::disappeared, this, &NMWirelessNetwork::removeActiveConnection);
172151
// clang-format on
173152
};
174153

175-
void NMWirelessNetwork::removeActiveConnection(NMActiveConnection* active) {
154+
void NMWirelessNetwork::removeActiveConnection() {
155+
auto* active = qobject_cast<NMActiveConnection*>(sender());
176156
if (this->mActiveConnection && this->mActiveConnection == active) {
177157
QObject::disconnect(active, nullptr, this, nullptr);
178158
this->bState = NMConnectionState::Deactivated;
@@ -281,25 +261,15 @@ void NMWirelessDevice::registerAccessPoint(const QString& path) {
281261
NMWirelessNetwork* NMWirelessDevice::registerNetwork(const QString& ssid) {
282262
// clang-format off
283263
auto* backend = new NMWirelessNetwork(ssid, this);
284-
backend->setActiveApPath(this->activeApPath());
285-
backend->setCaps(this->capabilities());
286-
QObject::connect(this, &NMWirelessDevice::activeAccessPointChanged, backend, &NMWirelessNetwork::setActiveApPath);
287-
QObject::connect(this, &NMWirelessDevice::capabilitiesChanged, backend, &NMWirelessNetwork::setCaps);
264+
backend->bindableActiveApPath().setBinding([this]() { return this->activeApPath().path(); });
265+
backend->bindableCapabilities().setBinding([this]() { return this->capabilities(); });
288266

289267
auto* frontend = new WifiNetwork(ssid, this);
290-
frontend->setSignalStrength(backend->signalStrength());
291-
frontend->setConnected(backend->state() != NMConnectionState::Deactivated);
292-
frontend->setKnown(backend->known());
293-
frontend->setNmReason(backend->reason());
294-
frontend->setNmSecurity(backend->security());
295-
QObject::connect(backend, &NMWirelessNetwork::signalStrengthChanged, frontend, &WifiNetwork::setSignalStrength);
296-
QObject::connect(backend, &NMWirelessNetwork::knownChanged, frontend, &WifiNetwork::setKnown);
297-
QObject::connect(backend, &NMWirelessNetwork::reasonChanged, frontend, &WifiNetwork::setNmReason);
298-
QObject::connect(backend, &NMWirelessNetwork::securityChanged, frontend, &WifiNetwork::setNmSecurity);
299-
QObject::connect(backend, &NMWirelessNetwork::stateChanged, frontend,
300-
[frontend](NMConnectionState::Enum state) { frontend->setConnected(state != NMConnectionState::Deactivated ); }
301-
);
302-
// clang-format on
268+
frontend->bindableSignalStrength().setBinding([backend]() { return backend->signalStrength(); });
269+
frontend->bindableConnected().setBinding([backend]() { return backend->state() != NMConnectionState::Deactivated; });
270+
frontend->bindableKnown().setBinding([backend]() { return backend->known(); });
271+
frontend->bindableNmReason().setBinding([backend]() { return backend->reason(); });
272+
frontend->bindableNmSecurity().setBinding([backend]() { return backend->security(); });
303273
QObject::connect(backend, &NMWirelessNetwork::disappeared, this, [this, frontend, backend]() {
304274
QObject::disconnect(backend, nullptr, nullptr, nullptr);
305275
emit this->wifiNetworkRemoved(frontend);

src/network/nm/wireless.hpp

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,25 +44,21 @@ class NMWirelessNetwork: public QObject {
4444
[[nodiscard]] NMConnectionSettings* referenceConnection() const { return this->mReferenceConn; };
4545
[[nodiscard]] QList<NMAccessPoint*> accessPoints() const { return this->mAccessPoints.values(); };
4646
[[nodiscard]] QList<NMConnectionSettings*> connections() const { return this->mConnections.values(); };
47+
[[nodiscard]] QBindable<QString> bindableActiveApPath() { return &this->bActiveApPath; };
48+
[[nodiscard]] QBindable<NMWirelessCapabilities::Enum> bindableCapabilities() { return &this->bCaps; };
4749

48-
public slots:
49-
void setActiveApPath(const QDBusObjectPath& path);
50-
void setState(NMConnectionState::Enum state);
51-
void setReason(NMConnectionStateReason::Enum reason);
52-
void setCaps(NMWirelessCapabilities::Enum caps);
53-
5450
signals:
5551
void signalStrengthChanged(quint8 signal);
5652
void stateChanged(NMConnectionState::Enum state);
5753
void knownChanged(bool known);
5854
void reasonChanged(NMConnectionStateReason::Enum reason);
5955
void securityChanged(NMWirelessSecurityType::Enum security);
56+
void capabilitiesChanged(NMWirelessCapabilities::Enum caps);
57+
void activeApPathChanged(QString path);
6058
void disappeared();
6159

6260
private:
6361
QString mSsid;
64-
QDBusObjectPath mActiveApPath;
65-
NMWirelessCapabilities::Enum mCaps = NMWirelessCapabilities::None;
6662
QHash<QString, NMAccessPoint*> mAccessPoints;
6763
QHash<QString, NMConnectionSettings*> mConnections;
6864
NMActiveConnection* mActiveConnection = nullptr;
@@ -75,13 +71,15 @@ public slots:
7571
Q_OBJECT_BINDABLE_PROPERTY(NMWirelessNetwork, NMConnectionState::Enum, bState, &NMWirelessNetwork::stateChanged);
7672
Q_OBJECT_BINDABLE_PROPERTY(NMWirelessNetwork, NMWirelessSecurityType::Enum, bSecurity, &NMWirelessNetwork::securityChanged);
7773
Q_OBJECT_BINDABLE_PROPERTY(NMWirelessNetwork, quint8, bSignalStrength, &NMWirelessNetwork::signalStrengthChanged);
74+
Q_OBJECT_BINDABLE_PROPERTY(NMWirelessNetwork, NMWirelessCapabilities::Enum, bCaps, &NMWirelessNetwork::capabilitiesChanged);
75+
Q_OBJECT_BINDABLE_PROPERTY(NMWirelessNetwork, QString, bActiveApPath, &NMWirelessNetwork::activeApPathChanged);
7876
// clang-format on
7977

8078
void updateReferenceAp();
8179
void updateReferenceConnection();
82-
void removeAccessPoint(NMAccessPoint* ap);
83-
void removeConnectionSettings(NMConnectionSettings* conn);
84-
void removeActiveConnection(NMActiveConnection* active);
80+
void removeAccessPoint();
81+
void removeConnectionSettings();
82+
void removeActiveConnection();
8583
};
8684

8785
// Proxy of a /org/freedesktop/NetworkManager/Device/* object.
@@ -94,7 +92,7 @@ class NMWirelessDevice: public NMDevice {
9492
explicit NMWirelessDevice(const QString& path, QObject* parent = nullptr);
9593

9694
[[nodiscard]] bool isWirelessValid() const;
97-
[[nodiscard]] qint64 getLastScan() { return this->bLastScan; };
95+
[[nodiscard]] qint64 lastScan() { return this->bLastScan; };
9896
[[nodiscard]] NMWirelessCapabilities::Enum capabilities() { return this->bCapabilities; };
9997
[[nodiscard]] const QDBusObjectPath& activeApPath() { return this->bActiveAccessPoint; };
10098

0 commit comments

Comments
 (0)