refactor: 引入 workspaceEvents 并迁移核心组件事件处理
This commit is contained in:
@@ -68,13 +68,14 @@ import { storeToRefs } from 'pinia'; // Import storeToRefs
|
||||
import { useCommandHistoryStore, CommandHistoryEntryFE } from '../stores/commandHistory.store';
|
||||
import { useUiNotificationsStore } from '../stores/uiNotifications.store';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import PaneTitleBar from '../components/PaneTitleBar.vue'; // 导入标题栏
|
||||
import { useFocusSwitcherStore } from '../stores/focusSwitcher.store'; // +++ 导入焦点切换 Store +++
|
||||
import { useWorkspaceEventEmitter } from '../composables/workspaceEvents'; // +++ 新增导入 +++
|
||||
|
||||
const commandHistoryStore = useCommandHistoryStore();
|
||||
const uiNotificationsStore = useUiNotificationsStore();
|
||||
const { t } = useI18n();
|
||||
const focusSwitcherStore = useFocusSwitcherStore(); // +++ 实例化焦点切换 Store +++
|
||||
const emitWorkspaceEvent = useWorkspaceEventEmitter(); // +++ 获取事件发射器 +++
|
||||
const hoveredItemId = ref<number | null>(null);
|
||||
// const selectedIndex = ref<number>(-1); // REMOVED: Use store's selectedIndex
|
||||
const historyListRef = ref<HTMLUListElement | null>(null); // Ref for the history list UL
|
||||
@@ -88,11 +89,6 @@ const filteredHistory = computed(() => commandHistoryStore.filteredHistory);
|
||||
const isLoading = computed(() => commandHistoryStore.isLoading);
|
||||
const { selectedIndex: storeSelectedIndex } = storeToRefs(commandHistoryStore); // Get selectedIndex reactively
|
||||
|
||||
// --- 事件定义 ---
|
||||
// 定义组件发出的事件
|
||||
const emit = defineEmits<{
|
||||
(e: 'execute-command', command: string): void; // 定义新事件
|
||||
}>();
|
||||
|
||||
// --- 生命周期钩子 ---
|
||||
onMounted(() => {
|
||||
@@ -207,7 +203,7 @@ const deleteSingleCommand = (id: number) => {
|
||||
|
||||
// 新增:执行命令 (发出事件)
|
||||
const executeCommand = (command: string) => {
|
||||
emit('execute-command', command);
|
||||
emitWorkspaceEvent('terminal:sendCommand', { command });
|
||||
// Optionally reset selection after execution
|
||||
// selectedIndex.value = -1; // REMOVED: Store handles index
|
||||
};
|
||||
|
||||
@@ -166,6 +166,7 @@ import { useI18n } from 'vue-i18n';
|
||||
import AddEditQuickCommandForm from '../components/AddEditQuickCommandForm.vue'; // 导入表单组件
|
||||
import { useFocusSwitcherStore } from '../stores/focusSwitcher.store'; // +++ 导入焦点切换 Store +++
|
||||
import { useSettingsStore } from '../stores/settings.store'; // 新增:导入设置 store
|
||||
import { useWorkspaceEventEmitter } from '../composables/workspaceEvents'; // +++ 新增导入 +++
|
||||
|
||||
const quickCommandsStore = useQuickCommandsStore();
|
||||
const quickCommandTagsStore = useQuickCommandTagsStore(); // +++ Instantiate the new tag store +++
|
||||
@@ -173,6 +174,7 @@ const uiNotificationsStore = useUiNotificationsStore(); // 如果需要显示通
|
||||
const { t } = useI18n();
|
||||
const focusSwitcherStore = useFocusSwitcherStore(); // +++ 实例化焦点切换 Store +++
|
||||
const settingsStore = useSettingsStore(); // 新增:实例化设置 store
|
||||
const emitWorkspaceEvent = useWorkspaceEventEmitter(); // +++ 获取事件发射器 +++
|
||||
|
||||
const hoveredItemId = ref<number | null>(null);
|
||||
const isFormVisible = ref(false);
|
||||
@@ -213,10 +215,7 @@ const isCommandSelected = (commandId: number): boolean => {
|
||||
return flatVisibleCommands.value[storeSelectedIndex.value].id === commandId;
|
||||
};
|
||||
|
||||
// --- 事件定义 ---
|
||||
const emit = defineEmits<{
|
||||
(e: 'execute-command', command: string): void; // 用于通知 WorkspaceView 执行命令
|
||||
}>();
|
||||
|
||||
|
||||
// --- 生命周期钩子 ---
|
||||
onMounted(async () => { // Make onMounted async
|
||||
@@ -399,7 +398,7 @@ const executeCommand = (command: QuickCommandFE) => {
|
||||
// 1. 增加使用次数 (后台操作,不阻塞执行)
|
||||
quickCommandsStore.incrementUsage(command.id);
|
||||
// 2. 发出执行事件给父组件
|
||||
emit('execute-command', command.command);
|
||||
emitWorkspaceEvent('terminal:sendCommand', { command: command.command });
|
||||
// Optionally reset selection after execution
|
||||
// selectedIndex.value = -1; // REMOVED: Store handles index
|
||||
};
|
||||
|
||||
@@ -20,6 +20,11 @@ import { useFileEditorStore, type FileTab } from '../stores/fileEditor.store';
|
||||
import { useCommandHistoryStore } from '../stores/commandHistory.store';
|
||||
import type { Terminal as XtermTerminal } from 'xterm'; // --- 重命名避免冲突 ---
|
||||
import type { ISearchOptions } from '@xterm/addon-search';
|
||||
import {
|
||||
useWorkspaceEventSubscriber,
|
||||
useWorkspaceEventOff,
|
||||
type WorkspaceEventPayloads
|
||||
} from '../composables/workspaceEvents'; // +++ 新增导入 +++
|
||||
|
||||
// --- Setup ---
|
||||
const { t } = useI18n();
|
||||
@@ -112,6 +117,40 @@ onMounted(() => {
|
||||
// 添加键盘事件监听器
|
||||
window.addEventListener('keydown', handleGlobalKeyDown);
|
||||
// 确保布局已初始化 (layoutStore 内部会处理)
|
||||
|
||||
// +++ 订阅工作区事件 +++
|
||||
subscribeToWorkspaceEvents('terminal:sendCommand', (payload) => handleSendCommand(payload.command));
|
||||
subscribeToWorkspaceEvents('terminal:input', handleTerminalInput);
|
||||
subscribeToWorkspaceEvents('terminal:resize', handleTerminalResize);
|
||||
subscribeToWorkspaceEvents('terminal:ready', handleTerminalReady);
|
||||
subscribeToWorkspaceEvents('terminal:clear', handleClearTerminal);
|
||||
|
||||
subscribeToWorkspaceEvents('editor:closeTab', (payload) => handleCloseEditorTab(payload.tabId));
|
||||
subscribeToWorkspaceEvents('editor:activateTab', (payload) => handleActivateEditorTab(payload.tabId));
|
||||
subscribeToWorkspaceEvents('editor:updateContent', handleUpdateEditorContent);
|
||||
subscribeToWorkspaceEvents('editor:saveTab', (payload) => handleSaveEditorTab(payload.tabId));
|
||||
subscribeToWorkspaceEvents('editor:changeEncoding', handleChangeEncoding);
|
||||
subscribeToWorkspaceEvents('editor:closeOtherTabs', (payload) => handleCloseOtherEditorTabs(payload.tabId));
|
||||
subscribeToWorkspaceEvents('editor:closeTabsToRight', (payload) => handleCloseEditorTabsToRight(payload.tabId));
|
||||
subscribeToWorkspaceEvents('editor:closeTabsToLeft', (payload) => handleCloseEditorTabsToLeft(payload.tabId));
|
||||
|
||||
subscribeToWorkspaceEvents('connection:connect', (payload) => handleConnectRequest(payload.connectionId));
|
||||
subscribeToWorkspaceEvents('connection:openNewSession', (payload) => handleOpenNewSession(payload.connectionId));
|
||||
subscribeToWorkspaceEvents('connection:requestAdd', handleRequestAddConnection);
|
||||
subscribeToWorkspaceEvents('connection:requestEdit', (payload) => handleRequestEditConnection(payload.connectionInfo));
|
||||
|
||||
subscribeToWorkspaceEvents('search:start', (payload) => handleSearch(payload.term));
|
||||
subscribeToWorkspaceEvents('search:findNext', handleFindNext);
|
||||
subscribeToWorkspaceEvents('search:findPrevious', handleFindPrevious);
|
||||
subscribeToWorkspaceEvents('search:close', handleCloseSearch);
|
||||
|
||||
// 来自 TerminalTabBar 的事件
|
||||
subscribeToWorkspaceEvents('session:activate', (payload) => sessionStore.activateSession(payload.sessionId));
|
||||
subscribeToWorkspaceEvents('session:close', (payload) => sessionStore.closeSession(payload.sessionId));
|
||||
subscribeToWorkspaceEvents('session:closeOthers', (payload) => handleCloseOtherSessions(payload.targetSessionId));
|
||||
subscribeToWorkspaceEvents('session:closeToRight', (payload) => handleCloseSessionsToRight(payload.targetSessionId));
|
||||
subscribeToWorkspaceEvents('session:closeToLeft', (payload) => handleCloseSessionsToLeft(payload.targetSessionId));
|
||||
subscribeToWorkspaceEvents('ui:openLayoutConfigurator', handleOpenLayoutConfigurator);
|
||||
});
|
||||
|
||||
onBeforeUnmount(() => {
|
||||
@@ -119,8 +158,44 @@ onBeforeUnmount(() => {
|
||||
// 移除键盘事件监听器
|
||||
window.removeEventListener('keydown', handleGlobalKeyDown);
|
||||
sessionStore.cleanupAllSessions();
|
||||
|
||||
// +++ 取消订阅工作区事件 +++
|
||||
unsubscribeFromWorkspaceEvents('terminal:sendCommand', (payload) => handleSendCommand(payload.command));
|
||||
unsubscribeFromWorkspaceEvents('terminal:input', handleTerminalInput);
|
||||
unsubscribeFromWorkspaceEvents('terminal:resize', handleTerminalResize);
|
||||
unsubscribeFromWorkspaceEvents('terminal:ready', handleTerminalReady);
|
||||
unsubscribeFromWorkspaceEvents('terminal:clear', handleClearTerminal);
|
||||
|
||||
unsubscribeFromWorkspaceEvents('editor:closeTab', (payload) => handleCloseEditorTab(payload.tabId));
|
||||
unsubscribeFromWorkspaceEvents('editor:activateTab', (payload) => handleActivateEditorTab(payload.tabId));
|
||||
unsubscribeFromWorkspaceEvents('editor:updateContent', handleUpdateEditorContent);
|
||||
unsubscribeFromWorkspaceEvents('editor:saveTab', (payload) => handleSaveEditorTab(payload.tabId));
|
||||
unsubscribeFromWorkspaceEvents('editor:changeEncoding', handleChangeEncoding);
|
||||
unsubscribeFromWorkspaceEvents('editor:closeOtherTabs', (payload) => handleCloseOtherEditorTabs(payload.tabId));
|
||||
unsubscribeFromWorkspaceEvents('editor:closeTabsToRight', (payload) => handleCloseEditorTabsToRight(payload.tabId));
|
||||
unsubscribeFromWorkspaceEvents('editor:closeTabsToLeft', (payload) => handleCloseEditorTabsToLeft(payload.tabId));
|
||||
|
||||
unsubscribeFromWorkspaceEvents('connection:connect', (payload) => handleConnectRequest(payload.connectionId));
|
||||
unsubscribeFromWorkspaceEvents('connection:openNewSession', (payload) => handleOpenNewSession(payload.connectionId));
|
||||
unsubscribeFromWorkspaceEvents('connection:requestAdd', handleRequestAddConnection);
|
||||
unsubscribeFromWorkspaceEvents('connection:requestEdit', (payload) => handleRequestEditConnection(payload.connectionInfo));
|
||||
|
||||
unsubscribeFromWorkspaceEvents('search:start', (payload) => handleSearch(payload.term));
|
||||
unsubscribeFromWorkspaceEvents('search:findNext', handleFindNext);
|
||||
unsubscribeFromWorkspaceEvents('search:findPrevious', handleFindPrevious);
|
||||
unsubscribeFromWorkspaceEvents('search:close', handleCloseSearch);
|
||||
|
||||
unsubscribeFromWorkspaceEvents('session:activate', (payload) => sessionStore.activateSession(payload.sessionId));
|
||||
unsubscribeFromWorkspaceEvents('session:close', (payload) => sessionStore.closeSession(payload.sessionId));
|
||||
unsubscribeFromWorkspaceEvents('session:closeOthers', (payload) => handleCloseOtherSessions(payload.targetSessionId));
|
||||
unsubscribeFromWorkspaceEvents('session:closeToRight', (payload) => handleCloseSessionsToRight(payload.targetSessionId));
|
||||
unsubscribeFromWorkspaceEvents('session:closeToLeft', (payload) => handleCloseSessionsToLeft(payload.targetSessionId));
|
||||
unsubscribeFromWorkspaceEvents('ui:openLayoutConfigurator', handleOpenLayoutConfigurator);
|
||||
});
|
||||
|
||||
const subscribeToWorkspaceEvents = useWorkspaceEventSubscriber(); // +++ 定义订阅和取消订阅函数 +++
|
||||
const unsubscribeFromWorkspaceEvents = useWorkspaceEventOff();
|
||||
|
||||
// --- 本地方法 (仅处理 UI 状态) ---
|
||||
const handleRequestAddConnection = () => {
|
||||
console.log('[WorkspaceView] handleRequestAddConnection 被调用!'); // 添加日志确认事件到达
|
||||
@@ -571,27 +646,6 @@ const toggleVirtualKeyboard = () => {
|
||||
class="layout-renderer-wrapper"
|
||||
:editor-tabs="editorTabs"
|
||||
:active-editor-tab-id="activeEditorTabId"
|
||||
@send-command="handleSendCommand"
|
||||
@terminal-input="handleTerminalInput"
|
||||
@terminal-resize="handleTerminalResize"
|
||||
@terminal-ready="handleTerminalReady"
|
||||
@close-editor-tab="handleCloseEditorTab"
|
||||
@activate-editor-tab="handleActivateEditorTab"
|
||||
@update-editor-content="handleUpdateEditorContent"
|
||||
@save-editor-tab="handleSaveEditorTab"
|
||||
@connect-request="handleConnectRequest"
|
||||
@open-new-session="handleOpenNewSession"
|
||||
@request-add-connection="handleRequestAddConnection"
|
||||
@request-edit-connection="handleRequestEditConnection"
|
||||
@search="handleSearch"
|
||||
@find-next="handleFindNext"
|
||||
@find-previous="handleFindPrevious"
|
||||
@close-search="handleCloseSearch"
|
||||
@clear-terminal="handleClearTerminal"
|
||||
@change-encoding="handleChangeEncoding"
|
||||
@close-other-tabs="handleCloseOtherEditorTabs"
|
||||
@close-tabs-to-right="handleCloseEditorTabsToRight"
|
||||
@close-tabs-to-left="handleCloseEditorTabsToLeft"
|
||||
></LayoutRenderer>
|
||||
<div v-else class="pane-placeholder">
|
||||
{{ t('layout.loading', '加载布局中...') }}
|
||||
|
||||
Reference in New Issue
Block a user