diff --git a/packages/base/src/commands.ts b/packages/base/src/commands.ts index 492116e6..97bd1df6 100644 --- a/packages/base/src/commands.ts +++ b/packages/base/src/commands.ts @@ -428,7 +428,11 @@ export function addCommands( commands.addCommand(CommandIDs.redo, { label: trans.__('Redo'), - isEnabled: () => Boolean(tracker.currentWidget), + isEnabled: () => { + return tracker.currentWidget + ? tracker.currentWidget.context.model.sharedModel.editable + : false; + }, execute: args => { const current = tracker.currentWidget; @@ -441,7 +445,11 @@ export function addCommands( commands.addCommand(CommandIDs.undo, { label: trans.__('Undo'), - isEnabled: () => Boolean(tracker.currentWidget), + isEnabled: () => { + return tracker.currentWidget + ? tracker.currentWidget.context.model.sharedModel.editable + : false; + }, execute: args => { const current = tracker.currentWidget; @@ -454,7 +462,11 @@ export function addCommands( commands.addCommand(CommandIDs.newSketch, { label: trans.__('New Sketch'), iconClass: 'fa fa-pencil', - isEnabled: () => Boolean(tracker.currentWidget), + isEnabled: () => { + return tracker.currentWidget + ? tracker.currentWidget.context.model.sharedModel.editable + : false; + }, execute: async args => { const current = tracker.currentWidget; @@ -478,63 +490,99 @@ export function addCommands( commands.addCommand(CommandIDs.newBox, { label: trans.__('New Box'), - isEnabled: () => Boolean(tracker.currentWidget), + isEnabled: () => { + return tracker.currentWidget + ? tracker.currentWidget.context.model.sharedModel.editable + : false; + }, icon: boxIcon, execute: Private.createPart('box', tracker) }); commands.addCommand(CommandIDs.newCylinder, { label: trans.__('New Cylinder'), - isEnabled: () => Boolean(tracker.currentWidget), + isEnabled: () => { + return tracker.currentWidget + ? tracker.currentWidget.context.model.sharedModel.editable + : false; + }, icon: cylinderIcon, execute: Private.createPart('cylinder', tracker) }); commands.addCommand(CommandIDs.newSphere, { label: trans.__('New Sphere'), - isEnabled: () => Boolean(tracker.currentWidget), + isEnabled: () => { + return tracker.currentWidget + ? tracker.currentWidget.context.model.sharedModel.editable + : false; + }, icon: sphereIcon, execute: Private.createPart('sphere', tracker) }); commands.addCommand(CommandIDs.newCone, { label: trans.__('New Cone'), - isEnabled: () => Boolean(tracker.currentWidget), + isEnabled: () => { + return tracker.currentWidget + ? tracker.currentWidget.context.model.sharedModel.editable + : false; + }, icon: coneIcon, execute: Private.createPart('cone', tracker) }); commands.addCommand(CommandIDs.newTorus, { label: trans.__('New Torus'), - isEnabled: () => Boolean(tracker.currentWidget), + isEnabled: () => { + return tracker.currentWidget + ? tracker.currentWidget.context.model.sharedModel.editable + : false; + }, icon: torusIcon, execute: Private.createPart('torus', tracker) }); commands.addCommand(CommandIDs.extrusion, { label: trans.__('Extrusion'), - isEnabled: () => Boolean(tracker.currentWidget), + isEnabled: () => { + return tracker.currentWidget + ? tracker.currentWidget.context.model.sharedModel.editable + : false; + }, icon: extrusionIcon, execute: Private.executeOperator('extrusion', tracker) }); commands.addCommand(CommandIDs.cut, { label: trans.__('Cut'), - isEnabled: () => Boolean(tracker.currentWidget), + isEnabled: () => { + return tracker.currentWidget + ? tracker.currentWidget.context.model.sharedModel.editable + : false; + }, icon: cutIcon, execute: Private.executeOperator('cut', tracker) }); commands.addCommand(CommandIDs.union, { label: trans.__('Union'), - isEnabled: () => Boolean(tracker.currentWidget), + isEnabled: () => { + return tracker.currentWidget + ? tracker.currentWidget.context.model.sharedModel.editable + : false; + }, icon: unionIcon, execute: Private.executeOperator('union', tracker) }); commands.addCommand(CommandIDs.intersection, { label: trans.__('Intersection'), - isEnabled: () => Boolean(tracker.currentWidget), + isEnabled: () => { + return tracker.currentWidget + ? tracker.currentWidget.context.model.sharedModel.editable + : false; + }, icon: intersectionIcon, execute: Private.executeOperator('intersection', tracker) }); diff --git a/packages/schema/src/interfaces.ts b/packages/schema/src/interfaces.ts index b676b5c1..0125aeaa 100644 --- a/packages/schema/src/interfaces.ts +++ b/packages/schema/src/interfaces.ts @@ -78,6 +78,7 @@ export interface IJupyterCadDoc extends YDocument { objects: Array; options: JSONObject; metadata: JSONObject; + readonly editable: boolean; objectExists(name: string): boolean; getObjectByName(name: string): IJCadObject | undefined; diff --git a/packages/schema/src/model.ts b/packages/schema/src/model.ts index c5ffd317..2edfe925 100644 --- a/packages/schema/src/model.ts +++ b/packages/schema/src/model.ts @@ -26,7 +26,6 @@ import { Pointer } from './interfaces'; -// import { IJCadContent, IJCadModel, IJCadObject, IJCadOptions } from './index'; export class JupyterCadModel implements IJupyterCadModel { constructor(options: JupyterCadModel.IOptions) { const { annotationModel, sharedModel } = options; @@ -428,6 +427,8 @@ export class JupyterCadDoc return new JupyterCadDoc(); } + editable = true; + private _getObjectAsYMapByName(name: string): Y.Map | undefined { for (const obj of this._objects) { if (obj.get('name') === name) { @@ -485,7 +486,6 @@ export class JupyterCadDoc ); } -// TODO Change the IJupyterCadDoc interface to add an "editable" property allowing to make read-only docs? export class JupyterCadStepDoc extends JupyterCadDoc { constructor() { super(); @@ -527,6 +527,8 @@ export class JupyterCadStepDoc extends JupyterCadDoc { return new JupyterCadStepDoc(); } + editable = false; + private _sourceObserver = (events: Y.YEvent[]): void => { const changes: Array<{ name: string;