feat: 设置快捷键.

This commit is contained in:
lijiahang
2024-01-16 18:52:07 +08:00
parent 220a0d4035
commit c750ce8ed2
20 changed files with 203 additions and 11 deletions

View File

@@ -47,6 +47,9 @@ public class TerminalPreferenceModel implements PreferenceModel {
@Schema(description = "会话设置")
private JSONObject sessionSetting;
@Schema(description = "快捷键设置")
private JSONObject shortcutSetting;
@Data
@Builder
@NoArgsConstructor
@@ -145,4 +148,44 @@ public class TerminalPreferenceModel implements PreferenceModel {
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class ShortcutSettingModel implements IJsonObject {
@Schema(description = "是否启用")
private Boolean enabled;
@Schema(description = "快捷键定义")
private List<ShortcutKeysModel> keys;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class ShortcutKeysModel implements IJsonObject {
@Schema(description = "快捷键操作")
private String item;
@Schema(description = "ctrl 按键")
private Boolean ctrlKey;
@Schema(description = "shift 按键")
private Boolean shiftKey;
@Schema(description = "alt 按键")
private Boolean altKey;
@Schema(description = "实际按键")
private String code;
@Schema(description = "是否启用")
private Boolean enabled;
}
}

View File

@@ -58,6 +58,27 @@ public class TerminalPreferenceStrategy implements IPreferenceStrategy<TerminalP
.scrollBackLine(1000)
.build()
.toJsonString();
// 默认快捷键设置
String shortcutSetting = TerminalPreferenceModel.ShortcutSettingModel.builder()
.enabled(true)
.keys(Lists.of(
new TerminalPreferenceModel.ShortcutKeysModel("copy", true, true, false, "KeyC", true),
new TerminalPreferenceModel.ShortcutKeysModel("paste", true, true, false, "KeyV", true),
new TerminalPreferenceModel.ShortcutKeysModel("toTop", true, true, false, "ArrowUp", true),
new TerminalPreferenceModel.ShortcutKeysModel("toBottom", true, true, false, "ArrowDown", true),
new TerminalPreferenceModel.ShortcutKeysModel("selectAll", true, true, false, "KeyA", true),
new TerminalPreferenceModel.ShortcutKeysModel("search", true, true, false, "KeyF", true),
new TerminalPreferenceModel.ShortcutKeysModel("commandEditor", true, false, true, "KeyE", true),
new TerminalPreferenceModel.ShortcutKeysModel("fontSizePlus", true, false, true, "Equal", true),
new TerminalPreferenceModel.ShortcutKeysModel("fontSizeSubtract", true, false, true, "Minus", true),
new TerminalPreferenceModel.ShortcutKeysModel("closeTab", true, false, true, "KeyW", true),
new TerminalPreferenceModel.ShortcutKeysModel("changeToPrevTab", true, false, true, "ArrowLeft", true),
new TerminalPreferenceModel.ShortcutKeysModel("changeToNextTab", true, false, true, "ArrowRight", true),
new TerminalPreferenceModel.ShortcutKeysModel("openCopyTerminalTab", true, false, true, "KeyO", true),
new TerminalPreferenceModel.ShortcutKeysModel("openNewConnectTab", true, false, true, "KeyN", true)
))
.build()
.toJsonString();
// 默认配置
return TerminalPreferenceModel.builder()
.newConnectionType("group")
@@ -68,6 +89,7 @@ public class TerminalPreferenceStrategy implements IPreferenceStrategy<TerminalP
.interactSetting(JSONObject.parseObject(defaultInteractSetting))
.pluginsSetting(JSONObject.parseObject(defaultPluginsSetting))
.sessionSetting(JSONObject.parseObject(defaultSessionSetting))
.shortcutSetting(JSONObject.parseObject(shortcutSetting))
.build();
}

View File

@@ -27,8 +27,6 @@ export const TerminalPreferenceItem = {
NEW_CONNECTION_TYPE: 'newConnectionType',
// 终端主题
THEME: 'theme',
// 快捷键设置
SHORTCUT_SETTING: 'shortcutSetting',
// 显示设置
DISPLAY_SETTING: 'displaySetting',
// 操作栏设置
@@ -41,6 +39,8 @@ export const TerminalPreferenceItem = {
PLUGINS_SETTING: 'pluginsSetting',
// 会话设置
SESSION_SETTING: 'sessionSetting',
// 快捷键设置
SHORTCUT_SETTING: 'shortcutSetting',
};
export default defineStore('terminal', {

View File

@@ -16,6 +16,8 @@
<terminal-theme-setting v-else-if="tab.key === InnerTabs.THEME_SETTING.key" />
<!-- 终端设置 -->
<terminal-general-setting v-else-if="tab.key === InnerTabs.TERMINAL_SETTING.key" />
<!-- 快捷键设置 -->
<terminal-shortcut-setting v-else-if="tab.key === InnerTabs.SHORTCUT_SETTING.key" />
</template>
<!-- 终端 -->
<template v-else-if="tab.type === TerminalTabType.TERMINAL">
@@ -41,9 +43,10 @@
import { addEventListen, removeEventListen } from '@/utils/event';
import EmptyRecommend from './empty-recommend.vue';
import NewConnectionView from '../new-connection/new-connection-view.vue';
import TerminalDisplaySetting from '../view-setting/terminal-display-setting.vue';
import TerminalThemeSetting from '../view-setting/terminal-theme-setting.vue';
import TerminalGeneralSetting from '../view-setting/terminal-general-setting.vue';
import TerminalDisplaySetting from '../setting/terminal-display-setting.vue';
import TerminalThemeSetting from '../setting/terminal-theme-setting.vue';
import TerminalGeneralSetting from '../setting/terminal-general-setting.vue';
import TerminalShortcutSetting from '../setting/terminal-shortcut-setting.vue';
import TerminalView from '../xterm/terminal-view.vue';
const { preference, tabManager, sessionManager } = useTerminalStore();

View File

@@ -103,7 +103,7 @@
import { fontFamilyKey, fontSizeKey, fontWeightKey, fontFamilySuffix, cursorStyleKey } from '../../types/terminal.const';
import { labelFilter } from '@/types/form';
import { TerminalPreferenceItem } from '@/store/modules/terminal';
import TerminalExample from '../view-setting/terminal-example.vue';
import TerminalExample from '../setting/terminal-example.vue';
const { toOptions, toRadioOptions } = useDictStore();
const { preference, updateTerminalPreference } = useTerminalStore();

View File

@@ -0,0 +1,99 @@
<template>
<div class="terminal-setting-block">
<!-- 顶部 -->
<div class="terminal-setting-subtitle-wrapper">
<h3 class="terminal-setting-subtitle">
终端快捷键
</h3>
</div>
<!-- 加载中 -->
<a-skeleton v-if="loading"
class="skeleton-wrapper"
:animation="true">
<a-skeleton-line :rows="8" />
</a-skeleton>
<!-- 内容区域 -->
<div v-else class="terminal-setting-body terminal-shortcut-container">
<!-- 提示 -->
<a-alert class="mb16">选择后会立刻保存, 刷新页面后生效 (设置时需要避免浏览器内置快捷键)</a-alert>
<div class="shortcut-row">
<a-space>
<a-tag checkable :default-checked="true">ctrl</a-tag>
<a-tag checkable :default-checked="true">shift</a-tag>
<a-tag checkable :default-checked="true">alt</a-tag>
<icon-plus />
<a-tag :default-checked="true">alt</a-tag>
</a-space>
</div>
<div class="shortcut-row">2</div>
<div class="shortcut-row">3</div>
</div>
</div>
</template>
<script lang="ts">
export default {
name: 'TerminalShortcutBlock'
};
</script>
<script lang="ts" setup>
import { useTerminalStore } from '@/store';
import { TerminalPreferenceItem } from '@/store/modules/terminal';
import { onMounted, ref } from 'vue';
import { getPreference } from '@/api/user/preference';
import useLoading from '@/hooks/loading';
const { updateTerminalPreference } = useTerminalStore();
const { loading, setLoading } = useLoading();
// 加载用户快捷键
onMounted(async () => {
try {
const { data } = await getPreference<Record<string, any>>('TERMINAL', [TerminalPreferenceItem.SHORTCUT_SETTING]);
} catch (e) {
}
});
</script>
<style lang="less" scoped>
@terminal-width: 458px;
@terminal-height: 138px;
.terminal-shortcut-container {
flex-direction: column;
.shortcut-row {
display: flex;
align-items: center;
margin-bottom: 8px;
background: var(--color-fill-2);
height: 48px;
padding: 8px;
border-radius: 4px;
transition: .3s;
&:hover {
background: var(--color-fill-3);
}
}
:deep(.arco-tag) {
background: #FFFFFF;
width: 44px;
display: flex;
justify-content: center;
height: 26px;
font-size: 14px;
user-select: none;
}
:deep(.arco-tag-checked) {
color: #FFFFFF;
background: rgb(var(--arcoblue-5));
}
}
</style>

View File

@@ -0,0 +1,25 @@
<template>
<div class="terminal-setting-container">
<div class="terminal-setting-wrapper">
<!-- 主标题 -->
<h2 class="terminal-setting-title">快捷键设置</h2>
<!-- 快捷键设置 -->
<terminal-shortcut-block />
</div>
</div>
</template>
<script lang="ts">
export default {
name: 'terminalShortcutSetting'
};
</script>
<script lang="ts" setup>
import TerminalShortcutBlock from './terminal-shortcut-block.vue';
</script>
<style lang="less" scoped>
</style>

View File

@@ -93,9 +93,9 @@
const session = ref<ITerminalSession>();
// TODO
// 设置快捷键
// 截屏
// sftp
// 代码片段
// 发送命令
const writeCommandInput = async (e: KeyboardEvent) => {

View File

@@ -10,10 +10,10 @@ export default class TerminalTabManager implements ITerminalTabManager {
constructor() {
// fixme
// this.active = InnerTabs.SHORTCUT_SETTING.key;
// this.items = [InnerTabs.SHORTCUT_SETTING];
this.active = InnerTabs.NEW_CONNECTION.key;
this.items = [InnerTabs.NEW_CONNECTION];
this.active = InnerTabs.SHORTCUT_SETTING.key;
this.items = [InnerTabs.SHORTCUT_SETTING];
// this.active = InnerTabs.NEW_CONNECTION.key;
// this.items = [InnerTabs.NEW_CONNECTION];
}
// 点击 tab