@opensumi/ide-main-layout 3.9.1-next-1748425167.0 → 3.9.1-next-1748425792.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +31 -30
  2. package/lib/browser/accordion/accordion.service.d.ts +1 -9
  3. package/lib/browser/accordion/accordion.service.d.ts.map +1 -1
  4. package/lib/browser/accordion/accordion.service.js +33 -120
  5. package/lib/browser/accordion/accordion.service.js.map +1 -1
  6. package/lib/browser/accordion/accordion.view.d.ts.map +1 -1
  7. package/lib/browser/accordion/accordion.view.js +1 -4
  8. package/lib/browser/accordion/accordion.view.js.map +1 -1
  9. package/lib/browser/accordion/section.view.d.ts.map +1 -1
  10. package/lib/browser/accordion/section.view.js +1 -1
  11. package/lib/browser/accordion/section.view.js.map +1 -1
  12. package/lib/browser/accordion/styles.module.less +0 -61
  13. package/lib/browser/default-config.d.ts.map +1 -1
  14. package/lib/browser/default-config.js +6 -7
  15. package/lib/browser/default-config.js.map +1 -1
  16. package/lib/browser/drop-area/drop-area.d.ts +2 -3
  17. package/lib/browser/drop-area/drop-area.d.ts.map +1 -1
  18. package/lib/browser/drop-area/drop-area.js +5 -8
  19. package/lib/browser/drop-area/drop-area.js.map +1 -1
  20. package/lib/browser/index.d.ts.map +1 -1
  21. package/lib/browser/index.js.map +1 -1
  22. package/lib/browser/layout.service.d.ts +0 -3
  23. package/lib/browser/layout.service.d.ts.map +1 -1
  24. package/lib/browser/layout.service.js +78 -120
  25. package/lib/browser/layout.service.js.map +1 -1
  26. package/lib/browser/main-layout.contribution.d.ts +18 -2
  27. package/lib/browser/main-layout.contribution.d.ts.map +1 -1
  28. package/lib/browser/main-layout.contribution.js +131 -75
  29. package/lib/browser/main-layout.contribution.js.map +1 -1
  30. package/lib/browser/tabbar/bar.view.d.ts.map +1 -1
  31. package/lib/browser/tabbar/bar.view.js +10 -5
  32. package/lib/browser/tabbar/bar.view.js.map +1 -1
  33. package/lib/browser/tabbar/panel.view.js +1 -1
  34. package/lib/browser/tabbar/panel.view.js.map +1 -1
  35. package/lib/browser/tabbar/renderer.view.js +4 -4
  36. package/lib/browser/tabbar/renderer.view.js.map +1 -1
  37. package/lib/browser/tabbar/tabbar.service.d.ts +19 -8
  38. package/lib/browser/tabbar/tabbar.service.d.ts.map +1 -1
  39. package/lib/browser/tabbar/tabbar.service.js +146 -37
  40. package/lib/browser/tabbar/tabbar.service.js.map +1 -1
  41. package/lib/common/main-layout.definition.d.ts +3 -4
  42. package/lib/common/main-layout.definition.d.ts.map +1 -1
  43. package/lib/common/main-layout.definition.js +4 -5
  44. package/lib/common/main-layout.definition.js.map +1 -1
  45. package/package.json +8 -8
  46. package/src/browser/accordion/accordion.service.ts +35 -152
  47. package/src/browser/accordion/accordion.view.tsx +2 -4
  48. package/src/browser/accordion/section.view.tsx +1 -5
  49. package/src/browser/accordion/styles.module.less +0 -61
  50. package/src/browser/default-config.ts +7 -8
  51. package/src/browser/drop-area/drop-area.tsx +3 -6
  52. package/src/browser/index.ts +0 -1
  53. package/src/browser/layout.service.ts +66 -134
  54. package/src/browser/main-layout.contribution.ts +138 -93
  55. package/src/browser/tabbar/bar.view.tsx +15 -9
  56. package/src/browser/tabbar/panel.view.tsx +2 -2
  57. package/src/browser/tabbar/renderer.view.tsx +4 -4
  58. package/src/browser/tabbar/tabbar.service.ts +161 -52
  59. package/src/common/main-layout.definition.ts +4 -6
  60. package/lib/browser/command.d.ts +0 -29
  61. package/lib/browser/command.d.ts.map +0 -1
  62. package/lib/browser/command.js +0 -84
  63. package/lib/browser/command.js.map +0 -1
  64. package/lib/browser/tabbar/TABBAR_CONFIG_USAGE.md +0 -141
  65. package/lib/browser/tabbar/tabbar-behavior-handler.d.ts +0 -71
  66. package/lib/browser/tabbar/tabbar-behavior-handler.d.ts.map +0 -1
  67. package/lib/browser/tabbar/tabbar-behavior-handler.js +0 -210
  68. package/lib/browser/tabbar/tabbar-behavior-handler.js.map +0 -1
  69. package/src/browser/command.ts +0 -99
  70. package/src/browser/tabbar/TABBAR_CONFIG_USAGE.md +0 -141
  71. package/src/browser/tabbar/tabbar-behavior-handler.ts +0 -260
@@ -1,141 +0,0 @@
1
- # Tabbar 配置使用指南
2
-
3
- ## 概述
4
-
5
- 现在支持在注册插槽渲染器时传入 `tabbarConfig` 配置,用于控制 tabbar 的布局行为。这样不同的插槽渲染器可以根据自己的实现特点提供相应的配置。
6
-
7
- ## 配置接口
8
-
9
- ```typescript
10
- export interface TabbarConfig {
11
- /** 是否为后置位置(bar 在 panel 右侧或底下) */
12
- isLatter: boolean;
13
- /** 支持的操作类型 */
14
- supportedActions?: {
15
- expand?: boolean;
16
- toggle?: boolean;
17
- accordion?: boolean;
18
- };
19
- }
20
- ```
21
-
22
- ## 使用方式
23
-
24
- ### 1. 注册带配置的插槽渲染器
25
-
26
- ```typescript
27
- import { SlotLocation } from '@opensumi/ide-core-browser';
28
- import { slotRendererRegistry } from '@opensumi/ide-core-browser/lib/react-providers';
29
-
30
- // 注册左侧面板渲染器(bar 在 panel 左侧)
31
- slotRendererRegistry.registerSlotRenderer(SlotLocation.view, LeftTabRenderer, {
32
- isLatter: false, // bar 在 panel 左侧
33
- supportedActions: {
34
- accordion: true, // 支持手风琴
35
- },
36
- });
37
-
38
- // 注册右侧面板渲染器(bar 在 panel 右侧)
39
- slotRendererRegistry.registerSlotRenderer(SlotLocation.extendView, RightTabRenderer, {
40
- isLatter: true, // bar 在 panel 右侧
41
- supportedActions: {
42
- accordion: true,
43
- },
44
- });
45
-
46
- // 注册底部面板渲染器(bar 在 panel 底下)
47
- slotRendererRegistry.registerSlotRenderer(SlotLocation.panel, BottomTabRenderer, {
48
- isLatter: true, // bar 在 panel 底下
49
- supportedActions: {
50
- expand: true, // 支持展开/收缩
51
- toggle: true, // 支持 toggle 行为
52
- },
53
- });
54
- ```
55
-
56
- ### 2. 自定义插槽渲染器的配置
57
-
58
- 如果你有自定义的插槽渲染器,可以根据具体的布局实现来设置配置:
59
-
60
- ```typescript
61
- // 自定义的水平布局渲染器
62
- class HorizontalTabRenderer extends React.Component {
63
- // 实现水平布局,bar 在左侧
64
- }
65
-
66
- // 注册时指定配置
67
- slotRendererRegistry.registerSlotRenderer('customLocation', HorizontalTabRenderer, {
68
- isLatter: false, // bar 在左侧
69
- supportedActions: {
70
- accordion: false, // 不支持手风琴
71
- expand: false, // 不支持展开
72
- },
73
- });
74
- ```
75
-
76
- ### 3. 配置的优先级
77
-
78
- 配置采用以下优先级:
79
-
80
- 1. **插槽渲染器配置**:通过 `registerSlotRenderer` 传入的 `tabbarConfig`
81
- 2. **默认配置**:基于 location 的默认配置
82
-
83
- ```typescript
84
- // 在策略中获取配置的逻辑
85
- protected getIsLatter(): boolean {
86
- if (this.tabbarConfig?.isLatter !== undefined) {
87
- return this.tabbarConfig.isLatter; // 优先使用渲染器配置
88
- }
89
- // 默认配置:扩展视图和底部面板为后置位置
90
- return this.location === 'extendView' || this.location === 'panel';
91
- }
92
- ```
93
-
94
- ## 实际应用场景
95
-
96
- ### 场景 1:自定义右侧面板布局
97
-
98
- 如果你的右侧面板采用了特殊的布局,bar 实际在左侧:
99
-
100
- ```typescript
101
- slotRendererRegistry.registerSlotRenderer(SlotLocation.extendView, CustomRightRenderer, {
102
- isLatter: false, // 虽然是右侧面板,但 bar 在左侧
103
- });
104
- ```
105
-
106
- ### 场景 2:底部面板的变体
107
-
108
- 底部面板的不同实现可能有不同的布局:
109
-
110
- ```typescript
111
- // 传统底部面板:bar 在上方
112
- slotRendererRegistry.registerSlotRenderer(SlotLocation.panel, TraditionalBottomRenderer, {
113
- isLatter: false, // bar 在 panel 上方
114
- supportedActions: {
115
- expand: true,
116
- toggle: true,
117
- },
118
- });
119
-
120
- // 现代底部面板:bar 在下方
121
- slotRendererRegistry.registerSlotRenderer(SlotLocation.panel, ModernBottomRenderer, {
122
- isLatter: true, // bar 在 panel 下方
123
- supportedActions: {
124
- expand: true,
125
- toggle: true,
126
- },
127
- });
128
- ```
129
-
130
- ## 注意事项
131
-
132
- 1. **向后兼容**:如果不提供 `tabbarConfig`,会使用默认配置
133
- 2. **配置验证**:确保 `isLatter` 的值与实际的渲染器布局一致
134
- 3. **动态更新**:目前配置在注册时确定,不支持运行时动态修改
135
-
136
- ## 好处
137
-
138
- - **灵活性**:不同的渲染器可以有不同的布局配置
139
- - **解耦合**:策略不再硬编码位置相关的配置
140
- - **可扩展**:新的渲染器可以轻松定义自己的配置
141
- - **清晰性**:配置意图明确,便于理解和维护
@@ -1,71 +0,0 @@
1
- import { ComponentRegistryProvider, DisposableCollection } from '@opensumi/ide-core-browser';
2
- import { ResizeHandle } from '@opensumi/ide-core-browser/lib/components';
3
- import { AbstractContextMenuService, IContextMenu, IMenuRegistry } from '@opensumi/ide-core-browser/lib/menu/next';
4
- import { TabbarBehaviorConfig } from '@opensumi/ide-core-browser/lib/react-providers';
5
- import { IMainLayoutService } from '../../common';
6
- export interface ITabbarResizeOptions {
7
- setSize: (targetSize?: number) => void;
8
- setRelativeSize: (prev: number, next: number) => void;
9
- getSize: () => number;
10
- getRelativeSize: () => number[];
11
- lockSize: (lock: boolean | undefined) => void;
12
- setMaxSize: (lock: boolean | undefined) => void;
13
- hidePanel: (show?: boolean) => void;
14
- }
15
- /**
16
- * 基于配置的 Tabbar 行为处理器
17
- * 通过配置驱动,替代复杂的策略模式
18
- */
19
- export declare class TabbarBehaviorHandler {
20
- private location;
21
- private config?;
22
- private accordionRestored;
23
- constructor(location: string, config?: TabbarBehaviorConfig | undefined);
24
- /**
25
- * 获取 isLatter 配置
26
- */
27
- getIsLatter(): boolean;
28
- /**
29
- * 包装 resize handle
30
- */
31
- wrapResizeHandle(resizeHandle: ResizeHandle): ITabbarResizeOptions;
32
- /**
33
- * 注册特定位置的命令(基于配置)
34
- */
35
- registerLocationSpecificCommands(context: {
36
- commandRegistry: any;
37
- layoutService: IMainLayoutService;
38
- }): DisposableCollection;
39
- /**
40
- * 注册特定位置的菜单(基于配置)
41
- */
42
- registerLocationSpecificMenus(context: {
43
- menuRegistry: IMenuRegistry;
44
- ctxMenuService: AbstractContextMenuService;
45
- }): IContextMenu | undefined;
46
- /**
47
- * 处理展开/收缩逻辑(基于配置)
48
- */
49
- doExpand(expand: boolean, resizeHandle?: ITabbarResizeOptions): void;
50
- /**
51
- * 判断是否处于展开状态(基于配置)
52
- */
53
- isExpanded(resizeHandle?: ITabbarResizeOptions): boolean;
54
- /**
55
- * 激活快捷键的处理逻辑(基于配置)
56
- */
57
- handleActivateKeyBinding(containerId: string, currentContainerId: string, updateCurrentContainerId: (id: string) => void, forceShow?: boolean): void;
58
- /**
59
- * 处理全展开状态(基于配置)
60
- */
61
- handleFullExpanded(currentId: string, isCurrentExpanded: boolean, resizeHandle: ITabbarResizeOptions, options: {
62
- barSize: number;
63
- panelSize: number;
64
- prevSize?: number;
65
- }): void;
66
- /**
67
- * 尝试恢复手风琴尺寸(基于配置)
68
- */
69
- tryRestoreAccordionSize(containerInfo: ComponentRegistryProvider, layoutService: IMainLayoutService): void;
70
- }
71
- //# sourceMappingURL=tabbar-behavior-handler.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tabbar-behavior-handler.d.ts","sourceRoot":"","sources":["../../../src/browser/tabbar/tabbar-behavior-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAE7F,OAAO,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AACnH,OAAO,EAAE,oBAAoB,EAAE,MAAM,gDAAgD,CAAC;AAEtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGlD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,OAAO,EAAE,MAAM,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,MAAM,EAAE,CAAC;IAChC,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,KAAK,IAAI,CAAC;IAC9C,UAAU,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,KAAK,IAAI,CAAC;IAChD,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CACrC;AAED;;;GAGG;AACH,qBAAa,qBAAqB;IAGpB,OAAO,CAAC,QAAQ;IAAU,OAAO,CAAC,MAAM,CAAC;IAFrD,OAAO,CAAC,iBAAiB,CAA0B;gBAE/B,QAAQ,EAAE,MAAM,EAAU,MAAM,CAAC,EAAE,oBAAoB,YAAA;IAE3E;;OAEG;IACH,WAAW,IAAI,OAAO;IAQtB;;OAEG;IACH,gBAAgB,CAAC,YAAY,EAAE,YAAY,GAAG,oBAAoB;IAelE;;OAEG;IACH,gCAAgC,CAAC,OAAO,EAAE;QACxC,eAAe,EAAE,GAAG,CAAC;QACrB,aAAa,EAAE,kBAAkB,CAAC;KACnC,GAAG,oBAAoB;IAqCxB;;OAEG;IACH,6BAA6B,CAAC,OAAO,EAAE;QACrC,YAAY,EAAE,aAAa,CAAC;QAC5B,cAAc,EAAE,0BAA0B,CAAC;KAC5C,GAAG,YAAY,GAAG,SAAS;IAwC5B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,oBAAoB,GAAG,IAAI;IAsBpE;;OAEG;IACH,UAAU,CAAC,YAAY,CAAC,EAAE,oBAAoB,GAAG,OAAO;IAYxD;;OAEG;IACH,wBAAwB,CACtB,WAAW,EAAE,MAAM,EACnB,kBAAkB,EAAE,MAAM,EAC1B,wBAAwB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,EAC9C,SAAS,CAAC,EAAE,OAAO,GAClB,IAAI;IAUP;;OAEG;IACH,kBAAkB,CAChB,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,OAAO,EAC1B,YAAY,EAAE,oBAAoB,EAClC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GACjE,IAAI;IAoBP;;OAEG;IACH,uBAAuB,CAAC,aAAa,EAAE,yBAAyB,EAAE,aAAa,EAAE,kBAAkB,GAAG,IAAI;CAwB3G"}
@@ -1,210 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TabbarBehaviorHandler = void 0;
4
- const ide_core_browser_1 = require("@opensumi/ide-core-browser");
5
- const container_id_1 = require("@opensumi/ide-core-browser/lib/common/container-id");
6
- const command_1 = require("../command");
7
- /**
8
- * 基于配置的 Tabbar 行为处理器
9
- * 通过配置驱动,替代复杂的策略模式
10
- */
11
- class TabbarBehaviorHandler {
12
- constructor(location, config) {
13
- this.location = location;
14
- this.config = config;
15
- this.accordionRestored = new Set();
16
- }
17
- /**
18
- * 获取 isLatter 配置
19
- */
20
- getIsLatter() {
21
- var _a;
22
- if (((_a = this.config) === null || _a === void 0 ? void 0 : _a.isLatter) !== undefined) {
23
- return this.config.isLatter;
24
- }
25
- // 默认配置:扩展视图和底部面板为后置位置
26
- return this.location === 'extendView' || this.location === 'panel';
27
- }
28
- /**
29
- * 包装 resize handle
30
- */
31
- wrapResizeHandle(resizeHandle) {
32
- const { setSize, setRelativeSize, getSize, getRelativeSize, lockSize, setMaxSize, hidePanel } = resizeHandle;
33
- const isLatter = this.getIsLatter();
34
- return {
35
- setSize: (size) => setSize(size, isLatter),
36
- setRelativeSize: (prev, next) => setRelativeSize(prev, next, isLatter),
37
- getSize: () => getSize(isLatter),
38
- getRelativeSize: () => getRelativeSize(isLatter),
39
- setMaxSize: (lock) => setMaxSize(lock, isLatter),
40
- lockSize: (lock) => lockSize(lock, isLatter),
41
- hidePanel: (show) => hidePanel(show),
42
- };
43
- }
44
- /**
45
- * 注册特定位置的命令(基于配置)
46
- */
47
- registerLocationSpecificCommands(context) {
48
- const disposables = new ide_core_browser_1.DisposableCollection();
49
- const { supportedActions } = this.config || {};
50
- // 如果支持展开操作,注册相关命令
51
- if (supportedActions === null || supportedActions === void 0 ? void 0 : supportedActions.expand) {
52
- disposables.push(context.commandRegistry.registerCommand(command_1.EXPAND_PANEL_COMMAND, {
53
- execute: () => {
54
- context.layoutService.expandBottom(true);
55
- },
56
- }));
57
- disposables.push(context.commandRegistry.registerCommand(command_1.RETRACT_PANEL_COMMAND, {
58
- execute: () => {
59
- context.layoutService.expandBottom(false);
60
- },
61
- }));
62
- }
63
- // 如果支持 toggle 操作,注册相关命令
64
- if (supportedActions === null || supportedActions === void 0 ? void 0 : supportedActions.toggle) {
65
- disposables.push(context.commandRegistry.registerCommand(command_1.TOGGLE_PANEL_COMMAND, {
66
- execute: (show, size) => {
67
- context.layoutService.toggleSlot(this.location, show, size);
68
- },
69
- }));
70
- }
71
- return disposables;
72
- }
73
- /**
74
- * 注册特定位置的菜单(基于配置)
75
- */
76
- registerLocationSpecificMenus(context) {
77
- var _a, _b, _c, _d;
78
- // 如果支持展开操作,注册相关菜单
79
- const menuItems = [];
80
- if ((_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.supportedActions) === null || _b === void 0 ? void 0 : _b.expand) {
81
- menuItems.push({
82
- command: command_1.EXPAND_PANEL_COMMAND.id,
83
- group: 'navigation',
84
- when: '!bottomFullExpanded',
85
- order: 1,
86
- }, {
87
- command: command_1.RETRACT_PANEL_COMMAND.id,
88
- group: 'navigation',
89
- when: 'bottomFullExpanded',
90
- order: 1,
91
- });
92
- }
93
- if ((_d = (_c = this.config) === null || _c === void 0 ? void 0 : _c.supportedActions) === null || _d === void 0 ? void 0 : _d.toggle) {
94
- menuItems.push({
95
- command: command_1.TOGGLE_PANEL_COMMAND.id,
96
- group: 'navigation',
97
- order: 2,
98
- });
99
- }
100
- if (menuItems.length > 0) {
101
- context.menuRegistry.registerMenuItems(`tabbar/${this.location}/common`, menuItems);
102
- return context.ctxMenuService.createMenu({
103
- id: `tabbar/${this.location}/common`,
104
- });
105
- }
106
- return undefined;
107
- }
108
- /**
109
- * 处理展开/收缩逻辑(基于配置)
110
- */
111
- doExpand(expand, resizeHandle) {
112
- var _a, _b;
113
- if (!((_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.supportedActions) === null || _b === void 0 ? void 0 : _b.expand) || !resizeHandle) {
114
- return;
115
- }
116
- const { setRelativeSize } = resizeHandle;
117
- const isLatter = this.getIsLatter();
118
- if (expand) {
119
- if (isLatter) {
120
- // 后置位置:完全展开
121
- setRelativeSize(0, 1);
122
- }
123
- else {
124
- // 前置位置:完全展开
125
- setRelativeSize(1, 0);
126
- }
127
- }
128
- else {
129
- // 恢复正常尺寸
130
- setRelativeSize(2, 1);
131
- }
132
- }
133
- /**
134
- * 判断是否处于展开状态(基于配置)
135
- */
136
- isExpanded(resizeHandle) {
137
- var _a, _b;
138
- if (!((_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.supportedActions) === null || _b === void 0 ? void 0 : _b.expand) || !resizeHandle) {
139
- return false;
140
- }
141
- const { getRelativeSize } = resizeHandle;
142
- const relativeSizes = getRelativeSize().join(',');
143
- const isLatter = this.getIsLatter();
144
- return isLatter ? relativeSizes === '0,1' : relativeSizes === '1,0';
145
- }
146
- /**
147
- * 激活快捷键的处理逻辑(基于配置)
148
- */
149
- handleActivateKeyBinding(containerId, currentContainerId, updateCurrentContainerId, forceShow) {
150
- var _a, _b;
151
- // 如果支持 toggle,根据当前状态切换
152
- if (((_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.supportedActions) === null || _b === void 0 ? void 0 : _b.toggle) && !forceShow) {
153
- updateCurrentContainerId(currentContainerId === containerId ? '' : containerId);
154
- }
155
- else {
156
- // 否则直接激活
157
- updateCurrentContainerId(containerId);
158
- }
159
- }
160
- /**
161
- * 处理全展开状态(基于配置)
162
- */
163
- handleFullExpanded(currentId, isCurrentExpanded, resizeHandle, options) {
164
- var _a, _b;
165
- const { barSize, panelSize, prevSize } = options;
166
- const { setRelativeSize, setSize } = resizeHandle;
167
- if (currentId) {
168
- if (isCurrentExpanded && ((_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.supportedActions) === null || _b === void 0 ? void 0 : _b.expand)) {
169
- const isLatter = this.getIsLatter();
170
- if (isLatter) {
171
- setRelativeSize(0, 1);
172
- }
173
- else {
174
- setRelativeSize(1, 0);
175
- }
176
- }
177
- else {
178
- setSize(prevSize || panelSize + barSize);
179
- }
180
- }
181
- else {
182
- setSize(barSize);
183
- }
184
- }
185
- /**
186
- * 尝试恢复手风琴尺寸(基于配置)
187
- */
188
- tryRestoreAccordionSize(containerInfo, layoutService) {
189
- var _a, _b, _c, _d;
190
- // 如果不支持手风琴,直接返回
191
- if (!((_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.supportedActions) === null || _b === void 0 ? void 0 : _b.accordion)) {
192
- return;
193
- }
194
- const { containerId } = containerInfo.options || {};
195
- if (!containerId || this.accordionRestored.has(containerId)) {
196
- return;
197
- }
198
- // 使用自定义视图取代手风琴的面板不需要 restore
199
- // scm 视图例外,因为在新版本 Gitlens 中可以将自己注册到 scm 中
200
- if ((!containerInfo || ((_c = containerInfo.options) === null || _c === void 0 ? void 0 : _c.component)) &&
201
- ((_d = containerInfo === null || containerInfo === void 0 ? void 0 : containerInfo.options) === null || _d === void 0 ? void 0 : _d.containerId) !== container_id_1.SCM_CONTAINER_ID) {
202
- return;
203
- }
204
- const accordionService = layoutService.getAccordionService(containerId);
205
- accordionService.restoreState();
206
- this.accordionRestored.add(containerId);
207
- }
208
- }
209
- exports.TabbarBehaviorHandler = TabbarBehaviorHandler;
210
- //# sourceMappingURL=tabbar-behavior-handler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tabbar-behavior-handler.js","sourceRoot":"","sources":["../../../src/browser/tabbar/tabbar-behavior-handler.ts"],"names":[],"mappings":"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"}
@@ -1,99 +0,0 @@
1
- import { Command, getIcon } from '@opensumi/ide-core-browser';
2
- import { MenuCommandDesc } from '@opensumi/ide-core-browser/lib/menu/next';
3
-
4
- /** @deprecated 请使用 main-layout.view.toggle */
5
- export const TOGGLE_LEFT_PANEL_COMMAND: Command = {
6
- id: 'main-layout.left-panel.toggle',
7
- delegate: 'main-layout.view.toggle',
8
- };
9
-
10
- /** @deprecated 请使用 main-layout.extendView.toggle */
11
- export const TOGGLE_RIGHT_PANEL_COMMAND: Command = {
12
- id: 'main-layout.right-panel.toggle',
13
- delegate: 'main-layout.extend-view.toggle',
14
- };
15
-
16
- /** @deprecated 请使用 main-layout.panel.toggle */
17
- export const TOGGLE_BOTTOM_PANEL_COMMAND: Command = {
18
- id: 'main-layout.bottom-panel.toggle',
19
- delegate: 'main-layout.panel.toggle',
20
- };
21
-
22
- /** @deprecated 请使用 main-layout.panel.is-visible */
23
- export const IS_VISIBLE_BOTTOM_PANEL_COMMAND: Command = {
24
- id: 'main-layout.bottom-panel.is-visible',
25
- delegate: 'main-layout.panel.is-visible',
26
- };
27
-
28
- /** @deprecated 请使用 main-layout.view.is-visible */
29
- export const IS_VISIBLE_LEFT_PANEL_COMMAND: Command = {
30
- id: 'main-layout.left-panel.is-visible',
31
- delegate: 'main-layout.view.is-visible',
32
- };
33
-
34
- /** @deprecated 请使用 main-layout.extend-view.is-visible */
35
- export const IS_VISIBLE_RIGHT_PANEL_COMMAND: Command = {
36
- id: 'main-layout.right-panel.is-visible',
37
- delegate: 'main-layout.extend-view.is-visible',
38
- };
39
-
40
- /** @deprecated 请使用 main-layout.panel.expand */
41
- export const EXPAND_BOTTOM_PANEL: Command = {
42
- id: 'main-layout.bottom-panel.expand',
43
- delegate: 'main-layout.panel.expand',
44
- };
45
-
46
- /** @deprecated 请使用 main-layout.panel.retract */
47
- export const RETRACT_BOTTOM_PANEL: Command = {
48
- id: 'main-layout.bottom-panel.retract',
49
- delegate: 'main-layout.panel.retract',
50
- };
51
-
52
- export const WORKBENCH_ACTION_CLOSESIDECAR: Command = {
53
- id: 'workbench.action.closeSidebar',
54
- label: '%main-layout.sidebar.hide%',
55
- };
56
-
57
- export const WORKBENCH_ACTION_CLOSEPANEL: Command = {
58
- id: 'workbench.action.closePanel',
59
- };
60
-
61
- export const TOGGLE_VIEW_COMMAND: MenuCommandDesc = {
62
- id: 'main-layout.view.toggle',
63
- label: '%main-layout.view.toggle%',
64
- };
65
-
66
- export const TOGGLE_EXTEND_VIEW_COMMAND: MenuCommandDesc = {
67
- id: 'main-layout.extend-view.toggle',
68
- label: '%main-layout.extend-view.toggle%',
69
- };
70
-
71
- export const TOGGLE_PANEL_COMMAND: Command = {
72
- id: 'main-layout.panel.toggle',
73
- iconClass: getIcon('minus'),
74
- label: '%main-layout.panel.toggle%',
75
- };
76
-
77
- export const IS_VISIBLE_VIEW_COMMAND: Command = {
78
- id: 'main-layout.view.is-visible',
79
- };
80
-
81
- export const IS_VISIBLE_EXTEND_VIEW_COMMAND: Command = {
82
- id: 'main-layout.extend-view.is-visible',
83
- };
84
-
85
- export const IS_VISIBLE_PANEL_COMMAND: Command = {
86
- id: 'main-layout.panel.is-visible',
87
- };
88
-
89
- export const EXPAND_PANEL_COMMAND: Command = {
90
- id: 'main-layout.panel.expand',
91
- label: '%layout.tabbar.expand%',
92
- iconClass: getIcon('expand'),
93
- };
94
-
95
- export const RETRACT_PANEL_COMMAND: Command = {
96
- id: 'main-layout.panel.retract',
97
- label: '%layout.tabbar.retract%',
98
- iconClass: getIcon('shrink'),
99
- };
@@ -1,141 +0,0 @@
1
- # Tabbar 配置使用指南
2
-
3
- ## 概述
4
-
5
- 现在支持在注册插槽渲染器时传入 `tabbarConfig` 配置,用于控制 tabbar 的布局行为。这样不同的插槽渲染器可以根据自己的实现特点提供相应的配置。
6
-
7
- ## 配置接口
8
-
9
- ```typescript
10
- export interface TabbarConfig {
11
- /** 是否为后置位置(bar 在 panel 右侧或底下) */
12
- isLatter: boolean;
13
- /** 支持的操作类型 */
14
- supportedActions?: {
15
- expand?: boolean;
16
- toggle?: boolean;
17
- accordion?: boolean;
18
- };
19
- }
20
- ```
21
-
22
- ## 使用方式
23
-
24
- ### 1. 注册带配置的插槽渲染器
25
-
26
- ```typescript
27
- import { SlotLocation } from '@opensumi/ide-core-browser';
28
- import { slotRendererRegistry } from '@opensumi/ide-core-browser/lib/react-providers';
29
-
30
- // 注册左侧面板渲染器(bar 在 panel 左侧)
31
- slotRendererRegistry.registerSlotRenderer(SlotLocation.view, LeftTabRenderer, {
32
- isLatter: false, // bar 在 panel 左侧
33
- supportedActions: {
34
- accordion: true, // 支持手风琴
35
- },
36
- });
37
-
38
- // 注册右侧面板渲染器(bar 在 panel 右侧)
39
- slotRendererRegistry.registerSlotRenderer(SlotLocation.extendView, RightTabRenderer, {
40
- isLatter: true, // bar 在 panel 右侧
41
- supportedActions: {
42
- accordion: true,
43
- },
44
- });
45
-
46
- // 注册底部面板渲染器(bar 在 panel 底下)
47
- slotRendererRegistry.registerSlotRenderer(SlotLocation.panel, BottomTabRenderer, {
48
- isLatter: true, // bar 在 panel 底下
49
- supportedActions: {
50
- expand: true, // 支持展开/收缩
51
- toggle: true, // 支持 toggle 行为
52
- },
53
- });
54
- ```
55
-
56
- ### 2. 自定义插槽渲染器的配置
57
-
58
- 如果你有自定义的插槽渲染器,可以根据具体的布局实现来设置配置:
59
-
60
- ```typescript
61
- // 自定义的水平布局渲染器
62
- class HorizontalTabRenderer extends React.Component {
63
- // 实现水平布局,bar 在左侧
64
- }
65
-
66
- // 注册时指定配置
67
- slotRendererRegistry.registerSlotRenderer('customLocation', HorizontalTabRenderer, {
68
- isLatter: false, // bar 在左侧
69
- supportedActions: {
70
- accordion: false, // 不支持手风琴
71
- expand: false, // 不支持展开
72
- },
73
- });
74
- ```
75
-
76
- ### 3. 配置的优先级
77
-
78
- 配置采用以下优先级:
79
-
80
- 1. **插槽渲染器配置**:通过 `registerSlotRenderer` 传入的 `tabbarConfig`
81
- 2. **默认配置**:基于 location 的默认配置
82
-
83
- ```typescript
84
- // 在策略中获取配置的逻辑
85
- protected getIsLatter(): boolean {
86
- if (this.tabbarConfig?.isLatter !== undefined) {
87
- return this.tabbarConfig.isLatter; // 优先使用渲染器配置
88
- }
89
- // 默认配置:扩展视图和底部面板为后置位置
90
- return this.location === 'extendView' || this.location === 'panel';
91
- }
92
- ```
93
-
94
- ## 实际应用场景
95
-
96
- ### 场景 1:自定义右侧面板布局
97
-
98
- 如果你的右侧面板采用了特殊的布局,bar 实际在左侧:
99
-
100
- ```typescript
101
- slotRendererRegistry.registerSlotRenderer(SlotLocation.extendView, CustomRightRenderer, {
102
- isLatter: false, // 虽然是右侧面板,但 bar 在左侧
103
- });
104
- ```
105
-
106
- ### 场景 2:底部面板的变体
107
-
108
- 底部面板的不同实现可能有不同的布局:
109
-
110
- ```typescript
111
- // 传统底部面板:bar 在上方
112
- slotRendererRegistry.registerSlotRenderer(SlotLocation.panel, TraditionalBottomRenderer, {
113
- isLatter: false, // bar 在 panel 上方
114
- supportedActions: {
115
- expand: true,
116
- toggle: true,
117
- },
118
- });
119
-
120
- // 现代底部面板:bar 在下方
121
- slotRendererRegistry.registerSlotRenderer(SlotLocation.panel, ModernBottomRenderer, {
122
- isLatter: true, // bar 在 panel 下方
123
- supportedActions: {
124
- expand: true,
125
- toggle: true,
126
- },
127
- });
128
- ```
129
-
130
- ## 注意事项
131
-
132
- 1. **向后兼容**:如果不提供 `tabbarConfig`,会使用默认配置
133
- 2. **配置验证**:确保 `isLatter` 的值与实际的渲染器布局一致
134
- 3. **动态更新**:目前配置在注册时确定,不支持运行时动态修改
135
-
136
- ## 好处
137
-
138
- - **灵活性**:不同的渲染器可以有不同的布局配置
139
- - **解耦合**:策略不再硬编码位置相关的配置
140
- - **可扩展**:新的渲染器可以轻松定义自己的配置
141
- - **清晰性**:配置意图明确,便于理解和维护