Page MenuHomePhorge

No OneTemporary

Size
14 KB
Referenced Files
None
Subscribers
None
diff --git a/src/contents/ui/shortcuts/ActionItem.qml b/src/contents/ui/shortcuts/ActionItem.qml
index 67277da..3af411a 100644
--- a/src/contents/ui/shortcuts/ActionItem.qml
+++ b/src/contents/ui/shortcuts/ActionItem.qml
@@ -1,63 +1,111 @@
/*
* This file is part of kazv.
* SPDX-FileCopyrightText: 2020-2022 Tusooa Zhu <tusooa@kazv.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import org.kde.kirigami 2.13 as Kirigami
import '.' as KazvShortcuts
Kirigami.BasicListItem {
+ id: actionItem
property var action
icon: action.iconName || action.iconSource
label: action.text
subtitle: l10n.get(
'action-settings-shortcut-prompt', {
shortcut: action.shortcut || l10n.get('action-settings-shortcut-none')
}
)
+ property var sheet: Kirigami.OverlaySheet {
+ id: popup
+ property var shortcut: ''
+ property var conflictsName: []
+ property var conflictingActions: []
+ title: l10n.get('action-settings-shortcut-conflict-modal-title')
+
+ ColumnLayout {
+ Label {
+ text: l10n.get('action-settings-shortcut-conflict', {
+ shortcut: popup.shortcut,
+ conflictingAction: popup.conflictsName.join('<br>'),
+ })
+ Layout.fillWidth: true
+ }
+
+ RowLayout {
+ Button {
+ text: l10n.get('action-settings-shortcut-conflict-continue')
+ onClicked: {
+ console.log('accepted');
+ actionItem.setShortcut(popup.shortcut);
+ actionSettings.purgeShortcutForActions(popup.conflictingActions);
+ popup.close();
+ }
+ }
+
+ Button {
+ text: l10n.get('action-settings-shortcut-conflict-cancel')
+ onClicked: {
+ console.log('cancelled');
+ popup.close();
+ }
+ }
+ }
+ }
+ }
+
RowLayout {
Button {
id: editButton
text: checked ? shortcutInput.partialResult : l10n.get('action-settings-shortcut-edit-action')
checkable: true
onClicked: {
if (checked) {
console.log('not in edit mode');
shortcutInput.startRecording();
} else {
console.log('in edit mode');
shortcutInput.cancel();
}
}
}
Button {
text: l10n.get('action-settings-shortcut-remove-action')
onClicked: {
setShortcut("");
}
}
}
KazvShortcuts.ShortcutInput {
id: shortcutInput
onFinalResult: {
console.log('final:', sequence);
editButton.checked = false;
- setShortcut(sequence);
+ const conflicts = actionSettings
+ .findConflicts(sequence)
+ .filter(a => a.objectName !== action.objectName);
+ if (!conflicts.length) {
+ setShortcut(sequence);
+ } else {
+ const names = conflicts.map(a => a.objectName);
+ popup.shortcut = sequence;
+ popup.conflictingActions = conflicts;
+ popup.conflictsName = conflicts.map(a => a.text);
+ console.log('has conflicts with:', popup.conflictsName);
+ popup.open();
+ }
}
}
function setShortcut(shortcut) {
- console.log("Setting shortcut for ", action.objectName, " to ", text);
- action.shortcut = shortcut;
- shortcutsConfig.setShortcutForAction(action.objectName, [action.shortcut]);
- console.log("Done");
+ actionSettings.setShortcutFor(action, shortcut);
}
}
diff --git a/src/contents/ui/shortcuts/ActionSettings.qml b/src/contents/ui/shortcuts/ActionSettings.qml
index bbc308b..54682bf 100644
--- a/src/contents/ui/shortcuts/ActionSettings.qml
+++ b/src/contents/ui/shortcuts/ActionSettings.qml
@@ -1,24 +1,64 @@
/*
* This file is part of kazv.
* SPDX-FileCopyrightText: 2020-2022 Tusooa Zhu <tusooa@kazv.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import QtQuick 2.15
import '.' as KazvShortcuts
ListView {
+ id: actionSettings
property var actions
/// shortcutsConfig: {
/// QStringList shortcutForAction(QString actionName)
/// void setShortcutForAction(QString actionName, QStringList shortcut)
/// }
property var shortcutsConfig
model: actions.length
delegate: KazvShortcuts.ActionItem {
action: actions[index]
}
+
+ function shortcutToSequence(str) {
+ return str.split(',');
+ }
+
+ function findConflicts(shortcut) {
+ const sequence = shortcutToSequence(shortcut);
+ return actions.filter(a => {
+ console.log('processing ', a.objectName);
+ const thoseShortcuts = shortcutsConfig.shortcutForAction(a.objectName);
+ console.log('shortcuts:', thoseShortcuts);
+ for (let i = 0; i < thoseShortcuts.length; ++i) {
+ const thatShortcut = thoseShortcuts[i];
+ if (hasConflicts(sequence, shortcutToSequence(thatShortcut))) {
+ return true;
+ }
+ }
+ return false;
+ });
+ }
+
+ function hasConflicts(first, second) {
+ const smallerLen = Math.min(first.length, second.length);
+ for (let i = 0; i < smallerLen; ++i) {
+ if (first[i] !== second[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function setShortcutFor(action, shortcut) {
+ action.shortcut = shortcut;
+ shortcutsConfig.setShortcutForAction(action.objectName, [action.shortcut]);
+ }
+
+ function purgeShortcutForActions(actions, shortcut) {
+ actions.forEach(a => setShortcutFor(a, ""));
+ }
}
diff --git a/src/l10n/cmn-Hans/100-ui.ftl b/src/l10n/cmn-Hans/100-ui.ftl
index 948ffcb..c77cd0c 100644
--- a/src/l10n/cmn-Hans/100-ui.ftl
+++ b/src/l10n/cmn-Hans/100-ui.ftl
@@ -1,87 +1,93 @@
### This file is part of kazv.
### SPDX-FileCopyrightText: 2020-2021 Tusooa Zhu <tusooa@kazv.moe>
### SPDX-License-Identifier: AGPL-3.0-or-later
app-title = { -kt-app-name }
global-drawer-title = { -kt-app-name }
global-drawer-action-switch-account = 切换账号
global-drawer-action-hard-logout = 登出
global-drawer-action-save-session = 保存当前会话
global-drawer-action-configure-shortcuts = 配置快捷键
action-settings-page-title = 配置快捷键
action-settings-shortcut-prompt = 快捷键:{ $shortcut }
action-settings-shortcut-none = (无)
+action-settings-shortcut-edit-action = 编辑
+action-settings-shortcut-remove-action = 清除
+action-settings-shortcut-conflict-modal-title = 冲突的快捷键
+action-settings-shortcut-conflict = 快捷键 { $shortcut } 跟别的指令有冲突。<br>若要继续,别的指令的快捷键会被清除。<br><br>冲突的指令有:<br>{ $conflictingAction }
+action-settings-shortcut-conflict-continue = 继续
+action-settings-shortcut-conflict-cancel = 取消
empty-room-page-title = 没有选中房间
empty-room-page-description = 当前没有选中的房间。
login-page-title = 登录
login-page-userid-prompt = 用户 id:
login-page-userid-input-placeholder = 例如: @foo:example.org
login-page-password-prompt = 密码:
login-page-login-button = 登录
login-page-close-button = 关闭
login-page-existing-sessions-prompt = 从已有会话中选一个:
login-page-alternative-password-login-prompt = 或者用用户 id 和密码启动新会话:
login-page-restore-session-button = 恢复会话
login-page-request-failed-prompt = 登录失败。错误代码:{ $errorCode }。错误讯息:{ $errorMsg }。
login-page-discover-failed-prompt = 不能检测此用户所在的服务器,或者服务器不可用。错误代码:{ $errorCode }。错误讯息:{ $errorMsg }。
main-page-title = { -kt-app-name } - { $userId }
main-page-recent-tab-title = 最近
main-page-people-tab-title = 人们
main-page-rooms-tab-title = 房间
room-list-view-room-item-title-name = { $name }
room-list-view-room-item-title-heroes = { $hero } { $otherNum ->
[0] { "" }
[1] 和 { $secondHero }
*[other] 和别的 { $otherNum } 个人
}
room-list-view-room-item-title-id = 未命名房间({ $roomId })
room-list-view-room-item-fav-action = 设为最爱
room-list-view-room-item-fav-action-notification = 把 { $name } 设为了最爱
send-message-box-input-placeholder = 在此输入您的讯息...
## 状态事件
## 通用参数:
## gender = 发送者的性别(male/female/neutral)
## stateKeyUser = state key 用户的名字
## stateKeyUserGender = state key 用户的性别
member-state-joined-room = 加入了房间。
member-state-changed-name-and-avatar = 修改了名字和头像。
member-state-changed-name = 修改了名字。
member-state-changed-avatar = 修改了头像。
member-state-invited = 把 { $stateKeyUser } 邀请到了本房间。
member-state-left = 离开了房间。
member-state-kicked = 踢出了 { $stateKeyUser }。
member-state-banned = 封禁了 { $stateKeyUser }。
member-state-unbanned = 解封了 { $stateKeyUser }。
state-room-created = 创建了房间。
state-room-name-changed = 把房间名字改成了 { $newName }。
state-room-topic-changed = 把房间话题改成了 { $newTopic }。
state-room-avatar-changed = 修改了房间头像。
state-room-pinned-events-changed = 修改了房间的置顶讯息。
state-room-alias-changed = 修改了房间的别名。
state-room-join-rules-changed = 修改了房间的加入规则。
state-room-power-levels-changed = 修改了房间的权限。
state-room-encryption-activated = 对本房间启用了加密。
event-message-image-sent = 发送了图片「{ $body }」。
event-message-file-sent = 发送了文件「{ $body }」。
event-message-video-sent = 发送了视频「{ $body }」。
event-message-audio-sent = 发送了音频「{ $body }」。
event-message-audio-play-audio = 播放音频
media-file-menu-option-view = 查看
media-file-menu-option-save-as = 保存为
media-file-download-success-prompt = 下载成功
media-file-download-failure-prompt = 下载失败
media-file-download-prompt-close = 好的
media-file-download-pause = 暂停
media-file-download-resume = 继续
media-file-download-cancel = 取消
diff --git a/src/l10n/en/100-ui.ftl b/src/l10n/en/100-ui.ftl
index 6a3336e..36e257b 100644
--- a/src/l10n/en/100-ui.ftl
+++ b/src/l10n/en/100-ui.ftl
@@ -1,101 +1,105 @@
### This file is part of kazv.
### SPDX-FileCopyrightText: 2020-2021 Tusooa Zhu <tusooa@kazv.moe>
### SPDX-License-Identifier: AGPL-3.0-or-later
app-title = { -kt-app-name }
global-drawer-title = { -kt-app-name }
global-drawer-action-switch-account = Switch account
global-drawer-action-hard-logout = Logout
global-drawer-action-save-session = Save current session
global-drawer-action-configure-shortcuts = Configure shortcuts
action-settings-page-title = Configure shortcuts
action-settings-shortcut-prompt = Shortcut: { $shortcut }
action-settings-shortcut-none = (none)
action-settings-shortcut-edit-action = Edit
action-settings-shortcut-remove-action = Clear
+action-settings-shortcut-conflict-modal-title = Conflicting shortcuts
+action-settings-shortcut-conflict = The shortcut { $shortcut } has conflicts with other actions. <br>If you continue, the shortcuts for other actions will be cleared. <br><br>Conflicting actions: <br>{ $conflictingAction }
+action-settings-shortcut-conflict-continue = Continue
+action-settings-shortcut-conflict-cancel = Cancel
empty-room-page-title = No rooms selected
empty-room-page-description = There is no room selected now.
login-page-title = Log in
login-page-userid-prompt = User id:
login-page-userid-input-placeholder = E.g.: @foo:example.org
login-page-password-prompt = Password:
login-page-login-button = Log in
login-page-close-button = Close
login-page-existing-sessions-prompt = Choose from one of the existing sessions:
login-page-alternative-password-login-prompt = Or start a new session with user id and password:
login-page-restore-session-button = Restore session
login-page-request-failed-prompt = Login failed. Error code: { $errorCode }. Error message: { $errorMsg }.
login-page-discover-failed-prompt = Unable to detect the server this user is on, or the server is unavailable. Error code: { $errorCode }. Error message: { $errorMsg }.
main-page-title = { -kt-app-name } - { $userId }
main-page-recent-tab-title = Recent
main-page-people-tab-title = People
main-page-rooms-tab-title = Rooms
room-list-view-room-item-title-name = { $name }
room-list-view-room-item-title-heroes = { $hero } { $otherNum ->
[0] { "" }
[1] and { $secondHero }
*[other] and { $otherNum } others
}
room-list-view-room-item-title-id = Unnamed room ({ $roomId })
room-list-view-room-item-fav-action = Set as favourite
room-list-view-room-item-fav-action-notification = Set { $name } as favourite
send-message-box-input-placeholder = Type your message here...
## State events
## Common parameters:
## gender = gender of the sender (male/female/neutral)
## stateKeyUser = name of the state key user
## stateKeyUserGender = gender of the state key user
member-state-joined-room = joined the room.
member-state-changed-name-and-avatar = changed { $gender ->
[male] his
[female] her
*[neutral] their
} name and avatar.
member-state-changed-name = changed { $gender ->
[male] his
[female] her
*[neutral] their
} name.
member-state-changed-avatar = changed { $gender ->
[male] his
[female] her
*[neutral] their
} avatar.
member-state-invited = invited { $stateKeyUser } to the room.
member-state-left = left the room.
member-state-kicked = kicked { $stateKeyUser }.
member-state-banned = banned { $stateKeyUser }.
member-state-unbanned = unbanned { $stateKeyUser }.
state-room-created = created the room.
state-room-name-changed = changed the name of the room to { $newName }.
state-room-topic-changed = changed the topic of the room to { $newTopic }.
state-room-avatar-changed = changed the avatar of the room.
state-room-pinned-events-changed = changed the pinned events of the room.
state-room-alias-changed = changed the aliases of the room.
state-room-join-rules-changed = changed join rules of the room.
state-room-power-levels-changed = changed power levels of the room.
state-room-encryption-activated = enabled encryption for this room.
event-message-image-sent = sent an image "{ $body }".
event-message-file-sent = sent a file "{ $body }".
event-message-video-sent = sent a video "{ $body }".
event-message-audio-sent = sent an audio "{ $body }".
event-message-audio-play-audio = Play audio
media-file-menu-option-view = View
media-file-menu-option-save-as = Save as
media-file-download-success-prompt = Download successful
media-file-download-failure-prompt = Download failure
media-file-download-prompt-close = Got it
media-file-download-pause = Pause
media-file-download-resume = Resume
media-file-download-cancel = Cancel

File Metadata

Mime Type
text/x-diff
Expires
Sun, Jan 19, 11:30 AM (4 h, 9 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
55130
Default Alt Text
(14 KB)

Event Timeline