任意视图展开隐藏的实现方法 #2573
-
已经看过切换面板案例:https://github.com/opensumi/opensumi-module-samples/tree/main/modules/toggle-panel https://github.com/opensumi/core/blob/main/packages/main-layout/README.md Layout Readme 里了解到 toggleSlot 只能控制「多视图、可折叠展开的 Slot」然后 isView 目前也只默认支持 left / bottom / right 的 slot。 目前拓展了左面板,想实现左边面板(slot = simulator),主编辑器区域,bottom 插槽任意展开隐藏,保证至少展开一个面板的功能,有什么实现建议么? 其实就是如下视频的效果: CleanShot.2023-04-11.at.17.16.47.mp4目前自定义布局代码 import * as React from 'react';
import {
BoxPanel,
getStorageValue,
SplitPanel,
} from '@opensumi/ide-core-browser/lib/components';
import { SlotRenderer } from '@opensumi/ide-core-browser';
// 基于 https://github.com/opensumi/core/blob/c6ccc2f51bf153a9382865e8a94b157353f8c016/packages/core-browser/src/components/layout/default-layout.tsx 修改
export function CustomToolbarLayout() {
const { colors, layout } = getStorageValue();
return (
<BoxPanel direction="top-to-bottom">
<SlotRenderer
backgroundColor={colors.menuBarBackground}
defaultSize={82}
slot="top"
z-index={3}
flexGrow={0}
/>
<SplitPanel id="main-horizontal" flexGrow={1}>
<SlotRenderer
color={colors.sideBarBackground}
defaultSize={500}
minResize={450}
slot="simulator"
/>
<BoxPanel direction="top-to-bottom" flex={1} className="main-box-panel">
<SplitPanel
id="main-view"
flex={1}
direction="left-to-right"
>
<SlotRenderer
backgroundColor={colors.sideBarBackground}
slot="left"
isTabbar={true}
defaultSize={layout.left?.currentId ? layout.left?.size || 310 : 49}
minResize={204}
minSize={49}
/>
<SplitPanel
id="main-vertical"
minResize={300}
flexGrow={1}
direction="top-to-bottom"
>
<SlotRenderer
backgroundColor={colors.editorBackground}
flex={2}
flexGrow={1}
minResize={200}
slot="main"
/>
<SlotRenderer
backgroundColor={colors.panelBackground}
flex={1}
defaultSize={layout.bottom?.size}
minResize={160}
slot="bottom"
isTabbar={true}
/>
</SplitPanel>
</SplitPanel>
<SlotRenderer
backgroundColor={colors.statusBarBackground}
defaultSize={24}
flex={0}
slot="statusBar"
/>
</BoxPanel>
</SplitPanel>
</BoxPanel>
);
} |
Beta Was this translation helpful? Give feedback.
Replies: 2 comments 3 replies
-
@bytemain 看一下是不是能提供一些小程序开发者工具这块的开发建议? |
Beta Was this translation helpful? Give feedback.
-
用语言来描述有点复杂,我写了一个例子你可以参考下,控制界面的 API 几乎都在 MainLayoutService 里,这个例子只是使用了三个按钮,你可以自己根据实际情况优化下。 代码: 演示: 2023-04-11.20.53.31.mov |
Beta Was this translation helpful? Give feedback.
嗯,你理解的没错:在例子中 mainLayoutService 控制右边的显隐是利用它是一个 tabbarHandler 来实现的,整个 OpenSumi 的视图控制还是没有那么自由,没有那么强。
要实现你的需求的话应该得额外写一部分代码。
所以在我们支付宝的小程序 IDE 的实践里,模拟器它所在的位置还是一个 Tabbar,但是我们隐藏了它的 tab 选择栏。我们重写了这个类:
TabbarViewBase https://github.com/opensumi/core/blob/fix/extension/nls-config/packages/main-layout/src/browser/tabbar/bar.view.tsx#L261
所以我的建议是,把模拟器的区域也当成一个 tabbar 来使用,可以自己根据 TabbarViewBase 实现一个 SimulatorView,然后把 tabbar 的 tab 栏隐藏掉。
这样就可以通过 tabbarService 来控制该区域了。
拿到 tabbarService 后,可以通过 tabbarService.resizeHandle?.xxx 来更精确的控制这个区域的长宽: