new actions menu
This commit is contained in:
parent
05fb68ed14
commit
42e78dab52
2 changed files with 124 additions and 9 deletions
117
src/App.tsx
117
src/App.tsx
|
|
@ -78,6 +78,8 @@ function EditorPanel({className, style}: {className?: string, style?: CSSPropert
|
||||||
const model = useContext(ModelContext);
|
const model = useContext(ModelContext);
|
||||||
if (!model) throw new Error('No model');
|
if (!model) throw new Error('No model');
|
||||||
|
|
||||||
|
const menu = useRef<Menu>(null);
|
||||||
|
|
||||||
const state = model.state;
|
const state = model.state;
|
||||||
|
|
||||||
const fs = useContext(FSContext);
|
const fs = useContext(FSContext);
|
||||||
|
|
@ -141,13 +143,121 @@ function EditorPanel({className, style}: {className?: string, style?: CSSPropert
|
||||||
...(style ?? {})
|
...(style ?? {})
|
||||||
}}>
|
}}>
|
||||||
{/* <BreadCrumb model={breadCrumbsItems} home={breadCrumbsHome}/> */}
|
{/* <BreadCrumb model={breadCrumbsItems} home={breadCrumbsHome}/> */}
|
||||||
|
<div className='flex flex-row gap-2' style={{
|
||||||
|
margin: '5px',
|
||||||
|
}}>
|
||||||
|
|
||||||
|
<Menu model={[
|
||||||
|
{
|
||||||
|
label: "New project",
|
||||||
|
icon: 'pi pi-plus-circle',
|
||||||
|
// disabled: true,
|
||||||
|
command: () => window.open(buildUrlForStateParams(blankProjectState), '_blank'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// TODO: share text, title and rendering image
|
||||||
|
// https://developer.mozilla.org/en-US/docs/Web/API/Navigator/share
|
||||||
|
label: 'Share project',
|
||||||
|
icon: 'pi pi-share-alt',
|
||||||
|
disabled: true,
|
||||||
|
command: () => window.open('http://openscad.org/cheatsheet/', '_blank'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
separator: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// TODO: popup to ask for file name
|
||||||
|
label: "New file",
|
||||||
|
icon: 'pi pi-plus',
|
||||||
|
disabled: true,
|
||||||
|
command: () => window.open('https://github.com/openscad/openscad-playground/tree/rewrite1', '_blank'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Copy to new file",
|
||||||
|
icon: 'pi pi-clone',
|
||||||
|
disabled: true,
|
||||||
|
command: () => window.open('https://github.com/openscad/openscad-playground/tree/rewrite1', '_blank'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Upload file(s)",
|
||||||
|
icon: 'pi pi-upload',
|
||||||
|
disabled: true,
|
||||||
|
command: () => window.open('https://github.com/openscad/openscad-playground/tree/rewrite1', '_blank'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Download sources',
|
||||||
|
icon: 'pi pi-download',
|
||||||
|
disabled: true,
|
||||||
|
command: () => window.open('https://github.com/revarbat/BOSL2/wiki/CheatSheet', '_blank'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
separator: true
|
||||||
|
},
|
||||||
|
// https://vscode-docs.readthedocs.io/en/stable/customization/keybindings/
|
||||||
|
// {
|
||||||
|
// label: 'Undo',
|
||||||
|
// icon: 'pi pi-undo',
|
||||||
|
// // disabled: true,
|
||||||
|
// command: () => editor?.trigger(state.params.sourcePath, 'editor.action.undoAction', null),
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// label: 'Redo',
|
||||||
|
// icon: 'pi pi-reply',
|
||||||
|
// // disabled: true,
|
||||||
|
// command: () => editor?.trigger(state.params.sourcePath, 'editor.action.redoAction', null),
|
||||||
|
// },
|
||||||
|
{
|
||||||
|
separator: true
|
||||||
|
},
|
||||||
|
// {
|
||||||
|
// label: 'Copy',
|
||||||
|
// icon: 'pi pi-copy',
|
||||||
|
// // disabled: true,
|
||||||
|
// command: () => editor?.trigger(state.params.sourcePath, 'editor.action.clipboardCopyAction', null),
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// label: 'Cut',
|
||||||
|
// icon: 'pi pi-eraser',
|
||||||
|
// // disabled: true,
|
||||||
|
// command: () => editor?.trigger(state.params.sourcePath, 'editor.action.clipboardCutAction', null),
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// label: 'Paste',
|
||||||
|
// icon: 'pi pi-images',
|
||||||
|
// // disabled: true,
|
||||||
|
// command: () => editor?.trigger(state.params.sourcePath, 'editor.action.clipboardPasteAction', null),
|
||||||
|
// },
|
||||||
|
{
|
||||||
|
label: 'Select All',
|
||||||
|
icon: 'pi pi-info-circle',
|
||||||
|
// disabled: true,
|
||||||
|
command: () => editor?.trigger(state.params.sourcePath, 'editor.action.selectAll', null),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
separator: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Find',
|
||||||
|
icon: 'pi pi-search',
|
||||||
|
// disabled: true,
|
||||||
|
command: () => editor?.trigger(state.params.sourcePath, 'actions.find', null),
|
||||||
|
},
|
||||||
|
] as MenuItem[]} popup ref={menu} />
|
||||||
|
<Button title="Editor menu" rounded text icon="pi pi-ellipsis-h" onClick={(e) => menu.current && menu.current.toggle(e)} />
|
||||||
|
|
||||||
<TreeSelect
|
<TreeSelect
|
||||||
title='OpenSCAD Playground Files'
|
title='OpenSCAD Playground Files'
|
||||||
value={state.params.sourcePath}
|
value={state.params.sourcePath}
|
||||||
onChange={(e) => model.openFile(String(e.value))}
|
onChange={(e) => model.openFile(String(e.value))}
|
||||||
|
// dropdownIcon="pi pi-folder-open"
|
||||||
filter
|
filter
|
||||||
|
style={{
|
||||||
|
flex: 1,
|
||||||
|
}}
|
||||||
options={fsItems} />
|
options={fsItems} />
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
{/* <SplitPane type="vertical"> */}
|
{/* <SplitPane type="vertical"> */}
|
||||||
{/* <div className='flex flex-column'> */}
|
{/* <div className='flex flex-column'> */}
|
||||||
{/* <Splitter style={{
|
{/* <Splitter style={{
|
||||||
|
|
@ -279,6 +389,7 @@ function Footer({style}: {style?: CSSProperties}) {
|
||||||
if (!model) throw new Error('No model');
|
if (!model) throw new Error('No model');
|
||||||
|
|
||||||
const menu = useRef<Menu>(null);
|
const menu = useRef<Menu>(null);
|
||||||
|
const toast = useRef<Toast>(null);
|
||||||
|
|
||||||
const state = model.state;
|
const state = model.state;
|
||||||
|
|
||||||
|
|
@ -321,6 +432,7 @@ function Footer({style}: {style?: CSSProperties}) {
|
||||||
<Button onClick={() => model.render({isPreview: false, now: true})}
|
<Button onClick={() => model.render({isPreview: false, now: true})}
|
||||||
loading={state.rendering}
|
loading={state.rendering}
|
||||||
icon="pi pi-refresh"
|
icon="pi pi-refresh"
|
||||||
|
title="Render the model (F6 / Ctrl+Enter). Models can test $preview to enable more detail in renders only."
|
||||||
label="Render" />
|
label="Render" />
|
||||||
|
|
||||||
{/* {state.error != null &&
|
{/* {state.error != null &&
|
||||||
|
|
@ -358,6 +470,8 @@ function Footer({style}: {style?: CSSProperties}) {
|
||||||
|
|
||||||
<ConfirmDialog />
|
<ConfirmDialog />
|
||||||
|
|
||||||
|
<Toast ref={toast} />
|
||||||
|
|
||||||
{state.output && (
|
{state.output && (
|
||||||
<Button icon='pi pi-download'
|
<Button icon='pi pi-download'
|
||||||
title={`Download ${state.output.isPreview ? "preview.stl" : "render.stl"} (${state.output.formattedStlFileSize})`}
|
title={`Download ${state.output.isPreview ? "preview.stl" : "render.stl"} (${state.output.formattedStlFileSize})`}
|
||||||
|
|
@ -435,7 +549,8 @@ export function App({initialState, fs}: {initialState: State, fs: FS}) {
|
||||||
const singleTargets: {id: SingleLayoutComponentId, icon: string, label: string}[] = [
|
const singleTargets: {id: SingleLayoutComponentId, icon: string, label: string}[] = [
|
||||||
{ id: 'editor', icon: 'pi pi-pencil', label: 'Edit' },
|
{ id: 'editor', icon: 'pi pi-pencil', label: 'Edit' },
|
||||||
{ id: 'viewer', icon: 'pi pi-box', label: 'View' },
|
{ id: 'viewer', icon: 'pi pi-box', label: 'View' },
|
||||||
{ id: 'customizer', icon: 'pi pi-cog', label: 'Customize' },
|
{ id: 'customizer', icon: 'pi pi-sliders-h', label: 'Customize' },
|
||||||
|
// { id: 'customizer', icon: 'pi pi-cog', label: 'Customize' },
|
||||||
];
|
];
|
||||||
const multiTargets = singleTargets;
|
const multiTargets = singleTargets;
|
||||||
// const multiTargets: {id: MultiLayoutComponentId, icon: string, label: string}[] = [
|
// const multiTargets: {id: MultiLayoutComponentId, icon: string, label: string}[] = [
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ export const render =
|
||||||
turnIntoDelayableExecution(renderDelay, (params: RenderArgs) => {
|
turnIntoDelayableExecution(renderDelay, (params: RenderArgs) => {
|
||||||
const args = [
|
const args = [
|
||||||
params.sourcePath,
|
params.sourcePath,
|
||||||
"-o", "out.stl",
|
"-o", "/home/out.stl",
|
||||||
"--export-format=binstl",
|
"--export-format=binstl",
|
||||||
...(params.features ?? []).map(f => `--enable=${f}`),
|
...(params.features ?? []).map(f => `--enable=${f}`),
|
||||||
...(params.extraArgs ?? [])
|
...(params.extraArgs ?? [])
|
||||||
|
|
@ -70,7 +70,7 @@ export const render =
|
||||||
workingDir: getParentDir(params.sourcePath),
|
workingDir: getParentDir(params.sourcePath),
|
||||||
inputs: [[params.sourcePath, source]],
|
inputs: [[params.sourcePath, source]],
|
||||||
args,
|
args,
|
||||||
outputPaths: ['out.stl']
|
outputPaths: ['/home/out.stl']
|
||||||
});
|
});
|
||||||
|
|
||||||
return AbortablePromise<RenderOutput>((resolve, reject) => {
|
return AbortablePromise<RenderOutput>((resolve, reject) => {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue