Page MenuHomePhorge

D322.1783456520.diff
No OneTemporary

Size
14 KB
Referenced Files
None
Subscribers
None

D322.1783456520.diff

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -176,6 +176,7 @@
ClosableScrollablePage.qml
ClosableScrollableOverlay.qml
SelfDestroyableOverlaySheet.qml
+ FocusRingBackground.qml
RoomListView.qml
RoomListViewItemDelegate.qml
RoomPage.qml
diff --git a/src/contents/ui/Bubble.qml b/src/contents/ui/Bubble.qml
--- a/src/contents/ui/Bubble.qml
+++ b/src/contents/ui/Bubble.qml
@@ -163,6 +163,8 @@
active: bubbleRootLayout.replyToOrAnnotatedEventId && !compactMode
asynchronous: true
Layout.fillWidth: true
+ // BlockQuote is usable in Qt 6.9 and later
+ Accessible.role: 'BlockQuote' in Accessible ? Accessible.BlockQuote : Accessible.Grouping
property var event: room.messageById(bubbleRootLayout.replyToOrAnnotatedEventId)
property var props: ({
diff --git a/src/contents/ui/EventHistoryView.qml b/src/contents/ui/EventHistoryView.qml
--- a/src/contents/ui/EventHistoryView.qml
+++ b/src/contents/ui/EventHistoryView.qml
@@ -12,6 +12,7 @@
ListView {
id: eventHistoryView
+ Accessible.role: Accessible.List
property var history
model: history
delegate: Kazv.EventViewWrapper {
@@ -19,5 +20,6 @@
width: ListView.view.width
compactMode: true
displayTime: true
+ Accessible.role: Accessible.ListItem
}
}
diff --git a/src/contents/ui/FocusRingBackground.qml b/src/contents/ui/FocusRingBackground.qml
new file mode 100644
--- /dev/null
+++ b/src/contents/ui/FocusRingBackground.qml
@@ -0,0 +1,15 @@
+/*
+ * This file is part of kazv.
+ * SPDX-FileCopyrightText: 2020-2024 tusooa <tusooa@kazv.moe>
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import QtQuick
+import org.kde.kirigami as Kirigami
+
+Rectangle {
+ required property var target
+ radius: Kirigami.Units.cornerRadius
+ border.width: 1
+ border.color: (target.hovered || target.visualFocus) ? Kirigami.Theme.hoverColor : 'transparent'
+}
diff --git a/src/contents/ui/RoomListViewItemDelegate.qml b/src/contents/ui/RoomListViewItemDelegate.qml
--- a/src/contents/ui/RoomListViewItemDelegate.qml
+++ b/src/contents/ui/RoomListViewItemDelegate.qml
@@ -38,9 +38,12 @@
autoExclusive: true
Kirigami.Theme.colorSet: !checked ? Kirigami.Theme.View : Kirigami.Theme.Selection
Kirigami.Theme.inherit: false
+ focusPolicy: Qt.StrongFocus
+ Accessible.focusable: true
+ Accessible.name: roomDisplayName
background: Rectangle {
anchors.fill: parent
- color: hovered ? Kirigami.Theme.hoverColor : Kirigami.Theme.backgroundColor
+ color: (upper.hovered || upper.visualFocus) ? Kirigami.Theme.hoverColor : Kirigami.Theme.backgroundColor
}
contentItem: RowLayout {
diff --git a/src/contents/ui/RoomTimelineView.qml b/src/contents/ui/RoomTimelineView.qml
--- a/src/contents/ui/RoomTimelineView.qml
+++ b/src/contents/ui/RoomTimelineView.qml
@@ -14,6 +14,8 @@
ListView {
id: roomTimelineView
objectName: 'roomTimelineView'
+ Accessible.role: Accessible.List
+
property var timeline
property string selectedEventId
@@ -173,6 +175,7 @@
event: timeline.at(index)
width: ListView.view.width
isSelected: roomTimelineView.selectedEventId && event.eventId === roomTimelineView.selectedEventId
+ Accessible.role: Accessible.ListItem
}
function goToEvent(eventId) {
diff --git a/src/contents/ui/StickerPicker.qml b/src/contents/ui/StickerPicker.qml
--- a/src/contents/ui/StickerPicker.qml
+++ b/src/contents/ui/StickerPicker.qml
@@ -52,53 +52,51 @@
property var stickerSize: Kirigami.Units.iconSizes.enormous
property var stickerMargin: Kirigami.Units.smallSpacing
- GridView {
- id: stickersGridView
- Layout.fillWidth: true
- Layout.minimumHeight: stickerPicker.stickerSize * 5
- Layout.preferredHeight: stickersGridView.height
- model: currentPack
- cellWidth: stickerPicker.stickerSize + stickerPicker.stickerMargin
- cellHeight: stickerPicker.stickerSize + stickerPicker.stickerMargin
- focus: true
- focusPolicy: Qt.StrongFocus
- delegate: AbstractButton {
- id: stickerButton
- objectName: `sticker${index}`
- property var sticker: currentPack.at(index)
- height: stickerPicker.stickerSize + stickerPicker.stickerMargin
- width: stickerPicker.stickerSize + stickerPicker.stickerMargin
- topInset: 0
- bottomInset: 0
- leftInset: 0
- rightInset: 0
- padding: stickerPicker.stickerMargin
+ ColumnLayout {
+ clip: true
+ GridView {
+ id: stickersGridView
+ Layout.fillWidth: true
+ Layout.minimumHeight: stickerPicker.stickerSize * 5
+ Layout.preferredHeight: stickersGridView.height
+ model: currentPack
+ cellWidth: stickerPicker.stickerSize + stickerPicker.stickerMargin
+ cellHeight: stickerPicker.stickerSize + stickerPicker.stickerMargin
+ focus: true
+ focusPolicy: Qt.StrongFocus
+ delegate: AbstractButton {
+ id: stickerButton
+ objectName: `sticker${index}`
+ property var sticker: currentPack.at(index)
+ height: stickerPicker.stickerSize + stickerPicker.stickerMargin
+ width: stickerPicker.stickerSize + stickerPicker.stickerMargin
+ topInset: 0
+ bottomInset: 0
+ leftInset: 0
+ rightInset: 0
+ padding: stickerPicker.stickerMargin
- contentItem: Kazv.ImageAdapter {
- fillMode: Image.PreserveAspectFit
- height: stickerPicker.stickerSize
- width: stickerPicker.stickerSize
- mxcUri: sticker.mxcUri
- }
+ contentItem: Kazv.ImageAdapter {
+ fillMode: Image.PreserveAspectFit
+ height: stickerPicker.stickerSize
+ width: stickerPicker.stickerSize
+ mxcUri: sticker.mxcUri
+ }
- hoverEnabled: true
- background: Rectangle {
- visible: stickerButton.hovered || stickerButton.visualFocus
- color: Kirigami.Theme.activeBackgroundColor
- }
+ hoverEnabled: true
+ background: Kazv.FocusRingBackground {
+ target: stickerButton
+ }
- Accessible.role: Accessible.Button
- Accessible.name: sticker.body
- Accessible.onPressAction: requestSendMessage()
- onClicked: requestSendMessage()
+ Accessible.role: Accessible.Button
+ Accessible.name: sticker.body
+ Accessible.onPressAction: requestSendMessage()
+ onClicked: requestSendMessage()
- function requestSendMessage() {
- stickerPicker.sendMessageRequested(sticker.makeEventJson());
+ function requestSendMessage() {
+ stickerPicker.sendMessageRequested(sticker.makeEventJson());
+ }
}
}
}
-
- Component.onCompleted: {
- console.log('stickerpicker finished', stickerPackList.count);
- }
}
diff --git a/src/contents/ui/UserPage.qml b/src/contents/ui/UserPage.qml
--- a/src/contents/ui/UserPage.qml
+++ b/src/contents/ui/UserPage.qml
@@ -221,6 +221,8 @@
visible: !userPage.editingPowerLevel
Label {
objectName: 'powerLevelLabel'
+ Accessible.focusable: true
+ activeFocusOnTab: true
Layout.fillWidth: true
text: l10n.get('user-page-power-level', { powerLevel: userPage.userPowerLevel })
}
diff --git a/src/contents/ui/device-mgmt/Device.qml b/src/contents/ui/device-mgmt/Device.qml
--- a/src/contents/ui/device-mgmt/Device.qml
+++ b/src/contents/ui/device-mgmt/Device.qml
@@ -17,6 +17,9 @@
property var userId
property bool sendingVerification: false
+ Accessible.name: item.deviceId
+ Accessible.description: item.displayName
+
contentItem: RowLayout {
ColumnLayout {
Label {
diff --git a/src/contents/ui/device-mgmt/DeviceList.qml b/src/contents/ui/device-mgmt/DeviceList.qml
--- a/src/contents/ui/device-mgmt/DeviceList.qml
+++ b/src/contents/ui/device-mgmt/DeviceList.qml
@@ -15,6 +15,8 @@
property var userId
model: devices ? devices.count : 0
+ Accessible.role: Accessible.List
+ Accessible.name: l10n.get('user-devices')
delegate: KazvDM.Device {
userId: deviceList.userId
diff --git a/src/contents/ui/event-types/Simple.qml b/src/contents/ui/event-types/Simple.qml
--- a/src/contents/ui/event-types/Simple.qml
+++ b/src/contents/ui/event-types/Simple.qml
@@ -56,25 +56,39 @@
Layout.topMargin: shouldCollapseSender ? 0 : Kirigami.Units.largeSpacing
Layout.bottomMargin: 0
- Kazv.AvatarAdapter {
- id: avatar
+ AbstractButton {
+ id: avatarButton
objectName: 'senderAvatar'
Layout.alignment: Qt.AlignTop
- mxcUri: sender.avatarMxcUri
- name: senderNickname
visible: !compactMode && !shouldCollapseSender
+ focusPolicy: Qt.StrongFocus
+ onClicked: goToUser()
+ Accessible.name: senderNickname
+ leftInset: 0
+ topInset: 0
+ bottomInset: 0
+ rightInset: 0
+ padding: Kirigami.Units.smallSpacing
+ background: Kazv.FocusRingBackground {
+ target: avatarButton
+ radius: height / 2
+ border.width: avatarButton.padding / 2
+ }
- TapHandler {
- onTapped: {
- activateUserPage(sender, room, event.sender);
- }
+ contentItem: Kazv.AvatarAdapter {
+ id: avatar
+ mxcUri: sender.avatarMxcUri
+ name: senderNickname
+ }
+ function goToUser() {
+ activateUserPage(sender, room, event.sender);
}
}
Item {
objectName: 'senderCollapsedPlaceholder'
visible: shouldCollapseSender
- Layout.preferredWidth: iconSize
+ Layout.preferredWidth: iconSize + avatarButton.padding * 2
Layout.preferredHeight: 1
}
@@ -100,6 +114,7 @@
Layout.fillWidth: !compactMode
property var reasonableWidth: Math.max(contentWidth, Kirigami.Units.gridUnit)
+ Accessible.ignored: true
TapHandler {
enabled: !compactMode
diff --git a/src/contents/ui/settings/CacheSettings.qml b/src/contents/ui/settings/CacheSettings.qml
--- a/src/contents/ui/settings/CacheSettings.qml
+++ b/src/contents/ui/settings/CacheSettings.qml
@@ -6,7 +6,7 @@
*/
import org.kde.kirigami 2.13 as Kirigami
-
+import QtQuick
import QtQuick.Layouts 1.15
import QtQuick.Controls 2.15
@@ -16,29 +16,23 @@
id: cacheSettings
Label {
+ id: cacheDirLabel
+ Accessible.ignored: true
text: l10n.get('settings-cache-directory')
}
TextField {
Layout.fillWidth: true
id: cacheDirectoryEntry
+ Accessible.name: cacheDirLabel.text
text: kazvConfig.cacheDirectory
}
- Kirigami.Action {
- id: selectCacheDirectory
- icon.name: "inode-directory"
- text: 'settings-cache-directory'
- onTriggered: {
- folderDialog.open()
- }
- }
-
ToolButton {
- icon.name: 'inode-directory'
- onClicked: {
- selectCacheDirectory.trigger()
- }
+ display: AbstractButton.IconOnly
+ icon.name: "inode-directory"
+ text: l10n.get('settings-select-cache-directory')
+ onClicked: folderDialog.open()
}
Kazv.FolderDialogAdapter {
diff --git a/src/contents/ui/settings/ProfileSettings.qml b/src/contents/ui/settings/ProfileSettings.qml
--- a/src/contents/ui/settings/ProfileSettings.qml
+++ b/src/contents/ui/settings/ProfileSettings.qml
@@ -59,6 +59,8 @@
RowLayout {
Layout.fillWidth: true
Label {
+ id: displayNameLabel
+ Accessible.ignored: true
text: l10n.get('settings-profile-display-name')
}
@@ -66,6 +68,7 @@
Layout.fillWidth: true
id: displayNameEntry
objectName: 'displayNameEntry'
+ Accessible.name: displayNameLabel.text
text: profileSettings.displayName
enabled: profileSettings.loaded
}
diff --git a/src/l10n/cmn-Hans/100-ui.ftl b/src/l10n/cmn-Hans/100-ui.ftl
--- a/src/l10n/cmn-Hans/100-ui.ftl
+++ b/src/l10n/cmn-Hans/100-ui.ftl
@@ -340,6 +340,7 @@
forget-room-success-prompt = 成功忘记房间 { $room }。
forget-room-failed-prompt = 无法忘记房间 { $room }。错误代码: { $errorCode }。错误讯息: { $errorMsg }。
+user-devices = 设备
device-trust-level-unseen = 未曾见过
device-trust-level-seen = 见过
device-trust-level-verified = 已验证
@@ -352,6 +353,7 @@
device-set-trust-level-dialog-curve25519-key-label = Curve25519公钥:{ $key }
device-set-trust-level-dialog-save = 保存
device-set-trust-level-dialog-cancel = 取消
+device-verify-action = 验证设备...
device-verification-request-failed = 无法发送验证请求。错误码:{ $errorCode }。错误讯息:{ $errorMsg }。
settings-page-title = 设置
@@ -361,6 +363,7 @@
settings-profile-display-name = 显示名:
settings-profile-save-failed-prompt = 无法保存用户资料。错误码:{ $errorCode }。错误讯息:{ $errorMsg }。
settings-cache-directory = 缓存目录:
+settings-select-cache-directory = 选择缓存目录...
settings-security-import-keys-action = 从备份文件导入密钥...
settings-security-import-keys-password-input-title = 输入密码
settings-security-import-keys-password-input-label = 当你创建备份时,提示了你要设置一个用来加密备份文件的密码。输入你当时设置的那个密码:
diff --git a/src/l10n/en/100-ui.ftl b/src/l10n/en/100-ui.ftl
--- a/src/l10n/en/100-ui.ftl
+++ b/src/l10n/en/100-ui.ftl
@@ -362,6 +362,7 @@
forget-room-success-prompt = Successfully forgot room { $room }.
forget-room-failed-prompt = Unable to forget room { $room }. Error code: { $errorCode }. Error message: { $errorMsg }.
+user-devices = Devices
device-trust-level-unseen = Unseen
device-trust-level-seen = Seen
device-trust-level-verified = Verified
@@ -374,6 +375,7 @@
device-set-trust-level-dialog-curve25519-key-label = Curve25519 public key: { $key }
device-set-trust-level-dialog-save = Save
device-set-trust-level-dialog-cancel = Cancel
+device-verify-action = Verify device...
device-verification-request-failed = Unable to send verification request. Error code: { $errorCode }. Error message: { $errorMsg }.
settings-page-title = Settings
@@ -383,6 +385,7 @@
settings-profile-display-name = Display name:
settings-profile-save-failed-prompt = Unable to save profile. Error code: { $errorCode }. Error message: { $errorMsg }.
settings-cache-directory = Cache directory:
+settings-select-cache-directory = Select cache directory...
settings-security-import-keys-action = Import keys from a backup file...
settings-security-import-keys-password-input-title = Enter password
settings-security-import-keys-password-input-label = When you created the backup, you were prompted to set a password to encrypt the backup file. Enter the password you set at that time:

File Metadata

Mime Type
text/plain
Expires
Tue, Jul 7, 1:35 PM (21 h, 52 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1670007
Default Alt Text
D322.1783456520.diff (14 KB)

Event Timeline