Skip to content

Commit 4c9a2a9

Browse files
CopilotRello
andcommitted
feat: add busy status support with capabilities checking and UI integration
Co-authored-by: Rello <13385119+Rello@users.noreply.github.com>
1 parent 4b7c3f8 commit 4c9a2a9

File tree

9 files changed

+111
-0
lines changed

9 files changed

+111
-0
lines changed

src/gui/UserStatusSelector.qml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,21 @@ ColumnLayout {
6767
implicitWidth: 200 // Pretty much a hack to ensure all the buttons are equal in width
6868

6969
}
70+
UserStatusSelectorButton {
71+
visible: userStatusSelectorModel.busyStatusSupported
72+
checked: userStatusSelectorModel.onlineStatus === NC.UserStatus.Busy
73+
checkable: true
74+
icon.source: userStatusSelectorModel.busyIcon
75+
icon.color: "transparent"
76+
text: qsTr("Busy")
77+
onClicked: userStatusSelectorModel.onlineStatus = NC.UserStatus.Busy
78+
79+
Layout.fillWidth: true
80+
implicitWidth: 200 // Pretty much a hack to ensure all the buttons are equal in width
81+
Layout.preferredHeight: topButtonsLayout.maxButtonHeight
82+
onImplicitHeightChanged: topButtonsLayout.updateMaxButtonHeight(implicitHeight)
83+
Component.onCompleted: topButtonsLayout.updateMaxButtonHeight(implicitHeight)
84+
}
7085
UserStatusSelectorButton {
7186
checked: userStatusSelectorModel.onlineStatus === NC.UserStatus.DoNotDisturb
7287
checkable: true

src/gui/userstatusselectormodel.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ void UserStatusSelectorModel::init()
125125

126126
_userStatusConnector->fetchUserStatus();
127127
_userStatusConnector->fetchPredefinedStatuses();
128+
129+
emit busyStatusSupportedChanged();
128130
}
129131

130132
void UserStatusSelectorModel::onUserStatusSet()
@@ -201,6 +203,10 @@ QUrl UserStatusSelectorModel::awayIcon() const
201203
{
202204
return Theme::instance()->statusAwayImageSource();
203205
}
206+
QUrl UserStatusSelectorModel::busyIcon() const
207+
{
208+
return Theme::instance()->statusAwayImageSource();
209+
}
204210
QUrl UserStatusSelectorModel::dndIcon() const
205211
{
206212
return Theme::instance()->statusDoNotDisturbImageSource();
@@ -395,6 +401,14 @@ QString UserStatusSelectorModel::errorMessage() const
395401
return _errorMessage;
396402
}
397403

404+
bool UserStatusSelectorModel::busyStatusSupported() const
405+
{
406+
if (!_userStatusConnector) {
407+
return false;
408+
}
409+
return _userStatusConnector->supportsBusyStatus();
410+
}
411+
398412
QString UserStatusSelectorModel::timeDifferenceToString(int differenceSecs) const
399413
{
400414
if (differenceSecs < 60) {

src/gui/userstatusselectormodel.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,11 @@ class UserStatusSelectorModel : public QObject
3333
Q_PROPERTY(QVariantList clearStageTypes READ clearStageTypes CONSTANT)
3434
Q_PROPERTY(QString clearAtDisplayString READ clearAtDisplayString NOTIFY clearAtDisplayStringChanged)
3535
Q_PROPERTY(QString errorMessage READ errorMessage NOTIFY errorMessageChanged)
36+
Q_PROPERTY(bool busyStatusSupported READ busyStatusSupported NOTIFY busyStatusSupportedChanged)
3637
Q_PROPERTY(QUrl onlineIcon READ onlineIcon CONSTANT)
3738
Q_PROPERTY(QUrl awayIcon READ awayIcon CONSTANT)
3839
Q_PROPERTY(QUrl dndIcon READ dndIcon CONSTANT)
40+
Q_PROPERTY(QUrl busyIcon READ busyIcon CONSTANT)
3941
Q_PROPERTY(QUrl invisibleIcon READ invisibleIcon CONSTANT)
4042

4143
public:
@@ -73,6 +75,7 @@ class UserStatusSelectorModel : public QObject
7375
Q_REQUIRED_RESULT QUrl onlineIcon() const;
7476
Q_REQUIRED_RESULT QUrl awayIcon() const;
7577
Q_REQUIRED_RESULT QUrl dndIcon() const;
78+
Q_REQUIRED_RESULT QUrl busyIcon() const;
7679
Q_REQUIRED_RESULT QUrl invisibleIcon() const;
7780

7881
Q_REQUIRED_RESULT QString userStatusMessage() const;
@@ -87,6 +90,7 @@ class UserStatusSelectorModel : public QObject
8790
[[nodiscard]] Q_INVOKABLE QString clearAtReadable(const OCC::UserStatus &status) const;
8891

8992
Q_REQUIRED_RESULT QString errorMessage() const;
93+
Q_REQUIRED_RESULT bool busyStatusSupported() const;
9094

9195
public slots:
9296
void setUserIndex(const int userIndex);
@@ -98,6 +102,7 @@ public slots:
98102
signals:
99103
void userIndexChanged();
100104
void errorMessageChanged();
105+
void busyStatusSupportedChanged();
101106
void userStatusChanged();
102107
void clearAtDisplayStringChanged();
103108
void predefinedStatusesChanged();

src/libsync/capabilities.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,15 @@ bool Capabilities::userStatusSupportsEmoji() const
281281
return userStatusMap.value("supports_emoji", false).toBool();
282282
}
283283

284+
bool Capabilities::userStatusSupportsBusy() const
285+
{
286+
if (!userStatus()) {
287+
return false;
288+
}
289+
const auto userStatusMap = _capabilities["user_status"].toMap();
290+
return userStatusMap.value("supports_busy", false).toBool();
291+
}
292+
284293
bool Capabilities::ncAssistantEnabled() const
285294
{
286295
if (_capabilities.contains("assistant")

src/libsync/capabilities.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ class OWNCLOUDSYNC_EXPORT Capabilities
6262
[[nodiscard]] bool filesLockTypeAvailable() const;
6363
[[nodiscard]] bool userStatus() const;
6464
[[nodiscard]] bool userStatusSupportsEmoji() const;
65+
[[nodiscard]] bool userStatusSupportsBusy() const;
6566
[[nodiscard]] bool ncAssistantEnabled() const;
6667
[[nodiscard]] QColor serverColor() const;
6768
[[nodiscard]] QColor serverTextColor() const;

src/libsync/ocsuserstatusconnector.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ OcsUserStatusConnector::OcsUserStatusConnector(AccountPtr account, QObject *pare
210210
Q_ASSERT(_account);
211211
_userStatusSupported = _account->capabilities().userStatus();
212212
_userStatusEmojisSupported = _account->capabilities().userStatusSupportsEmoji();
213+
_userStatusBusySupported = _account->capabilities().userStatusSupportsBusy();
213214
}
214215

215216
void OcsUserStatusConnector::fetchUserStatus()
@@ -448,6 +449,11 @@ UserStatus OcsUserStatusConnector::userStatus() const
448449
return _userStatus;
449450
}
450451

452+
bool OcsUserStatusConnector::supportsBusyStatus() const
453+
{
454+
return _userStatusBusySupported;
455+
}
456+
451457
void OcsUserStatusConnector::onMessageCleared(const QJsonDocument &json, int statusCode)
452458
{
453459
logResponse("Message cleared", json, statusCode);

src/libsync/ocsuserstatusconnector.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ class OWNCLOUDSYNC_EXPORT OcsUserStatusConnector : public UserStatusConnector
3030

3131
[[nodiscard]] UserStatus userStatus() const override;
3232

33+
[[nodiscard]] bool supportsBusyStatus() const override;
34+
3335
private:
3436
void onUserStatusFetched(const QJsonDocument &json, int statusCode);
3537
void onPredefinedStatusesFetched(const QJsonDocument &json, int statusCode);
@@ -49,6 +51,7 @@ class OWNCLOUDSYNC_EXPORT OcsUserStatusConnector : public UserStatusConnector
4951

5052
bool _userStatusSupported = false;
5153
bool _userStatusEmojisSupported = false;
54+
bool _userStatusBusySupported = false;
5255

5356
QPointer<JsonApiJob> _clearMessageJob {};
5457
QPointer<JsonApiJob> _setMessageJob {};

src/libsync/userstatusconnector.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class OWNCLOUDSYNC_EXPORT UserStatus
5151
Online,
5252
DoNotDisturb,
5353
Away,
54+
Busy,
5455
Offline,
5556
Invisible
5657
};
@@ -118,6 +119,8 @@ class OWNCLOUDSYNC_EXPORT UserStatusConnector : public QObject
118119

119120
[[nodiscard]] virtual UserStatus userStatus() const = 0;
120121

122+
[[nodiscard]] virtual bool supportsBusyStatus() const = 0;
123+
121124
signals:
122125
void userStatusFetched(const OCC::UserStatus &userStatus);
123126
void predefinedStatusesFetched(const QVector<OCC::UserStatus> &statuses);

test/testcapabilities.cpp

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,61 @@ private slots:
230230

231231
QVERIFY(!capabilities.userStatusSupportsEmoji());
232232
}
233+
234+
void testUserStatusSupportsBusy_supportsBusyAvailable_returnTrue()
235+
{
236+
QVariantMap userStatusMap;
237+
userStatusMap["enabled"] = true;
238+
userStatusMap["supports_busy"] = true;
239+
240+
QVariantMap capabilitiesMap;
241+
capabilitiesMap["user_status"] = userStatusMap;
242+
243+
const OCC::Capabilities capabilities(capabilitiesMap);
244+
245+
QVERIFY(capabilities.userStatusSupportsBusy());
246+
}
247+
248+
void testUserStatusSupportsBusy_supportsBusyNotAvailable_returnFalse()
249+
{
250+
QVariantMap userStatusMap;
251+
userStatusMap["enabled"] = true;
252+
userStatusMap["supports_busy"] = false;
253+
254+
QVariantMap capabilitiesMap;
255+
capabilitiesMap["user_status"] = userStatusMap;
256+
257+
const OCC::Capabilities capabilities(capabilitiesMap);
258+
259+
QVERIFY(!capabilities.userStatusSupportsBusy());
260+
}
261+
262+
void testUserStatusSupportsBusy_supportsBusyNotInCapabilities_returnFalse()
263+
{
264+
QVariantMap userStatusMap;
265+
userStatusMap["enabled"] = true;
266+
267+
QVariantMap capabilitiesMap;
268+
capabilitiesMap["user_status"] = userStatusMap;
269+
270+
const OCC::Capabilities capabilities(capabilitiesMap);
271+
272+
QVERIFY(!capabilities.userStatusSupportsBusy());
273+
}
274+
275+
void testUserStatusSupportsBusy_userStatusNotEnabled_returnFalse()
276+
{
277+
QVariantMap userStatusMap;
278+
userStatusMap["enabled"] = false;
279+
userStatusMap["supports_busy"] = true;
280+
281+
QVariantMap capabilitiesMap;
282+
capabilitiesMap["user_status"] = userStatusMap;
283+
284+
const OCC::Capabilities capabilities(capabilitiesMap);
285+
286+
QVERIFY(!capabilities.userStatusSupportsBusy());
287+
}
233288

234289
void testShareDefaultPermissions_defaultSharePermissionsNotInCapabilities_returnZero()
235290
{

0 commit comments

Comments
 (0)