new actions menu

This commit is contained in:
ochafik 2023-03-26 15:29:18 +01:00
commit 42e78dab52
2 changed files with 124 additions and 9 deletions

View file

@ -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,12 +143,120 @@ function EditorPanel({className, style}: {className?: string, style?: CSSPropert
...(style ?? {}) ...(style ?? {})
}}> }}>
{/* <BreadCrumb model={breadCrumbsItems} home={breadCrumbsHome}/> */} {/* <BreadCrumb model={breadCrumbsItems} home={breadCrumbsHome}/> */}
<TreeSelect <div className='flex flex-row gap-2' style={{
title='OpenSCAD Playground Files' margin: '5px',
value={state.params.sourcePath} }}>
onChange={(e) => model.openFile(String(e.value))}
filter <Menu model={[
options={fsItems} /> {
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
title='OpenSCAD Playground Files'
value={state.params.sourcePath}
onChange={(e) => model.openFile(String(e.value))}
// dropdownIcon="pi pi-folder-open"
filter
style={{
flex: 1,
}}
options={fsItems} />
</div>
{/* <SplitPane type="vertical"> */} {/* <SplitPane type="vertical"> */}
{/* <div className='flex flex-column'> */} {/* <div className='flex flex-column'> */}
@ -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}[] = [

View file

@ -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) => {