Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F85630841
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Size
9 KB
Referenced Files
None
Subscribers
None
View Options
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
Details
Attached
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)
Attached To
Mode
rK kazv
Attached
Detach File
Event Timeline
Log In to Comment