Page MenuHomePhorge

No OneTemporary

Size
9 KB
Referenced Files
None
Subscribers
None
diff --git a/src/contents/ui/device-mgmt/Device.qml b/src/contents/ui/device-mgmt/Device.qml
index fc2e2da..9023048 100644
--- a/src/contents/ui/device-mgmt/Device.qml
+++ b/src/contents/ui/device-mgmt/Device.qml
@@ -1,189 +1,211 @@
/*
* This file is part of kazv.
* SPDX-FileCopyrightText: 2023 tusooa <tusooa@kazv.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import QtQuick 2.2
import QtQuick.Layouts 1.15
-import QtQuick.Controls 2.15
+import QtQuick.Controls
import org.kde.kirigami 2.13 as Kirigami
import '..' as Kazv
-Kirigami.SwipeListItem {
+ItemDelegate {
id: device
property var item
property var userId
property bool sendingVerification: false
property var title: item.deleted ? l10n.get('device-item-title-deleted', { deviceId: item.deviceId }) : item.deviceId
Accessible.name: title
Accessible.description: item.displayName
contentItem: RowLayout {
ColumnLayout {
Label {
objectName: 'deviceIdLabel'
text: device.title
color: item.deleted ? Kirigami.Theme.disabledTextColor : Kirigami.Theme.textColor
}
Label {
objectName: 'displayNameLabel'
text: item.displayName
font: Kirigami.Theme.smallFont
visible: !!item.displayName
color: item.deleted ? Kirigami.Theme.disabledTextColor : Kirigami.Theme.textColor
}
Layout.fillWidth: true
}
RowLayout {
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
Layout.rightMargin: Kirigami.Units.largeSpacing
Kirigami.Icon {
source: device.getTrustLevelIcon(item.trustLevel)
Layout.preferredHeight: Kirigami.Units.iconSizes.sizeForLabels
Layout.preferredWidth: Kirigami.Units.iconSizes.sizeForLabels
Accessible.ignored: true
}
Label {
objectName: 'trustLevelLabel'
text: l10n.get(`device-trust-level-${item.trustLevel}`)
}
}
}
property var sheet: Kirigami.OverlaySheet {
id: popup
title: l10n.get('device-set-trust-level-dialog-title')
parent: applicationWindow().overlay
property var setTrustLevelPromise: null
property var conn: Connections {
target: popup.setTrustLevelPromise
function onResolved(success, data) {
if (!success) {
console.log('Error setting trust level:', JSON.stringify(data));
}
popup.setTrustLevelPromise = null;
popup.close();
}
}
ColumnLayout {
Label {
text: l10n.get('device-set-trust-level-dialog-name-label', { name: item.displayName })
+ Layout.fillWidth: true
+ wrapMode: Text.Wrap
}
Label {
text: l10n.get('device-set-trust-level-dialog-id-label', { id: item.deviceId })
+ Layout.fillWidth: true
+ wrapMode: Text.Wrap
}
Label {
text: l10n.get('device-set-trust-level-dialog-ed25519-key-label', { key: item.ed25519Key })
+ Layout.fillWidth: true
+ wrapMode: Text.Wrap
}
Label {
text: l10n.get('device-set-trust-level-dialog-curve25519-key-label', { key: item.curve25519Key })
+ Layout.fillWidth: true
+ wrapMode: Text.Wrap
}
ButtonGroup {
buttons: trustLevelChoices.children
}
ColumnLayout {
id: trustLevelChoices
objectName: 'trustLevelChoices'
Layout.fillHeight: true
Repeater {
model: ['blocked', 'unseen', 'seen', 'verified']
delegate: RadioButton {
objectName: 'trustLevelChoice_' + modelData
property var level: modelData
autoExclusive: true
checked: item.trustLevel === modelData
text: l10n.get(`device-trust-level-${modelData}`)
icon.name: device.getTrustLevelIcon(modelData)
}
}
}
+ Button {
+ Layout.fillWidth: true
+ text: l10n.get('device-verify-action')
+ onClicked: () => {
+ requestVerify.call();
+ popup.close();
+ }
+ }
+
RowLayout {
+ Layout.alignment: Qt.AlignHCenter
Button {
+ Layout.alignment: Qt.AlignHCenter
text: l10n.get('device-set-trust-level-dialog-save')
onClicked: {
const current = popup.getNewTrustLevel();
popup.setTrustLevelPromise = matrixSession.setDeviceTrustLevel(userId, item.deviceId, current);
}
}
Button {
+ Layout.alignment: Qt.AlignHCenter
text: l10n.get('device-set-trust-level-dialog-cancel')
onClicked: {
popup.close();
}
}
}
}
function getNewTrustLevel() {
for (let i = 0; i < trustLevelChoices.children.length; ++i) {
const curItem = trustLevelChoices.children[i];
if (curItem.checked) {
return curItem.level;
}
}
return 'unknown';
}
}
- actions: [
+ onClicked: popup.open();
+
+ ContextMenu.menu: Menu {
Kirigami.Action {
text: l10n.get('device-set-trust-level')
icon.name: 'settings-configure'
onTriggered: {
popup.open();
}
- },
+ }
Kirigami.Action {
objectName: 'requestVerifyAction'
text: l10n.get('device-verify-action')
enabled: !device.sendingVerification
icon.name: 'emblem-locked'
onTriggered: {
requestVerify.call();
}
}
- ]
+ }
property var requestVerify: Kazv.AsyncHandler {
trigger: () => {
device.sendingVerification = true;
return matrixSession.requestVerifyDevice(userId, item.deviceId);
}
onResolved: (success, data) => {
device.sendingVerification = false;
if (success) {
pushVerificationsPage();
} else {
showPassiveNotification(l10n.get('device-verification-request-failed'));
}
}
}
function getTrustLevelIcon(level)
{
switch (level) {
case 'blocked':
return /* iconName: */ 'emblem-error';
case 'unseen':
return /* iconName: */ 'emblem-warning';
case 'seen':
return /* iconName: */ 'emblem-added';
case 'verified':
return /* iconName: */ 'emblem-checked';
default:
return /* iconName: */ 'emblem-question';
}
}
}
diff --git a/src/contents/ui/device-mgmt/DeviceList.qml b/src/contents/ui/device-mgmt/DeviceList.qml
index 78453c9..1b16e47 100644
--- a/src/contents/ui/device-mgmt/DeviceList.qml
+++ b/src/contents/ui/device-mgmt/DeviceList.qml
@@ -1,25 +1,26 @@
/*
* This file is part of kazv.
* SPDX-FileCopyrightText: 2023 tusooa <tusooa@kazv.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import QtQuick 2.2
import QtQuick.Controls 2.15
import '.' as KazvDM
ListView {
id: deviceList
property var devices
property var userId
model: devices ? devices.count : 0
Accessible.role: Accessible.List
Accessible.name: l10n.get('user-devices')
delegate: KazvDM.Device {
+ width: ListView.view.width
userId: deviceList.userId
item: devices.at(index)
}
}
diff --git a/src/tests/quick-tests/tst_Device.qml b/src/tests/quick-tests/tst_Device.qml
index a1f014d..697c59d 100644
--- a/src/tests/quick-tests/tst_Device.qml
+++ b/src/tests/quick-tests/tst_Device.qml
@@ -1,78 +1,80 @@
/*
* This file is part of kazv.
* SPDX-FileCopyrightText: 2023 tusooa <tusooa@kazv.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import QtQuick 2.3
import QtTest 1.0
import '../../contents/ui/device-mgmt' as KazvDM
import 'test-helpers' as QmlHelpers
QmlHelpers.TestItem {
id: item
property var deviceItem: ({
deviceId: 'some-id',
displayName: 'name',
trustLevel: 'unseen',
deleted: false,
})
property var deletedDeviceItem: ({
deviceId: 'some-id',
displayName: 'name',
trustLevel: 'unseen',
deleted: true,
})
property var pushVerificationsPage: mockHelper.noop();
KazvDM.Device {
id: device
}
TestCase {
id: deviceTest
name: 'DeviceTest'
when: windowShown
function init() {
item.mockHelper.clearAll();
device.item = deviceItem;
}
function test_device() {
verify(findChild(device, 'deviceIdLabel').text === 'some-id');
verify(findChild(device, 'trustLevelLabel').text === l10n.get('device-trust-level-unseen'));
}
function test_deletedDevice() {
device.item = item.deletedDeviceItem;
verify(findChild(device, 'deviceIdLabel').text === l10n.get('device-item-title-deleted', { deviceId: 'some-id' }));
}
function test_verifyRequest() {
+ mouseClick(device, undefined, undefined, Qt.RightButton);
const action = findChild(device, 'requestVerifyAction');
verify(action.enabled);
action.trigger();
verify(!action.enabled);
verify(item.pushVerificationsPage.calledTimes() == 0);
verify(device.sendingVerification);
item.matrixSession.requestVerifyDevice.lastRetVal().resolve(true, {});
verify(item.pushVerificationsPage.calledTimes() == 1);
}
function test_verifyRequestFailed() {
+ mouseClick(device, undefined, undefined, Qt.RightButton);
const action = findChild(device, 'requestVerifyAction');
verify(action.enabled);
action.trigger();
verify(!action.enabled);
verify(item.pushVerificationsPage.calledTimes() == 0);
verify(device.sendingVerification);
item.matrixSession.requestVerifyDevice.lastRetVal().resolve(false, {});
verify(item.pushVerificationsPage.calledTimes() == 0);
verify(action.enabled);
verify(item.showPassiveNotification.calledTimes() == 1);
}
}
}

File Metadata

Mime Type
text/x-diff
Expires
Sun, Aug 9, 10:26 PM (1 d, 16 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1724813
Default Alt Text
(9 KB)

Event Timeline