Skip to content

Commit

Permalink
feat: add custom Scratch variable model and creation event classes (s…
Browse files Browse the repository at this point in the history
…cratchfoundation#86)

* feat: add a custom Scratch variable model

* feat: add a custom Scratch variable creation event

* chore: format index.js

* feat: import and register the Scratch variable model and creation event classes

* feat: add serialization/running support to the Scratch variable creation event

* chore: add license headers

* refactor: replace repeated variableMap accesses with a variable
  • Loading branch information
gonfunko authored Jul 26, 2024
1 parent c12de22 commit 2598ede
Show file tree
Hide file tree
Showing 3 changed files with 144 additions and 50 deletions.
67 changes: 67 additions & 0 deletions src/events_scratch_variable_create.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
/**
* @license
* Copyright 2024 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/

import * as Blockly from "blockly/core";

class ScratchVariableCreate extends Blockly.Events.VarCreate {
constructor(variable) {
super(variable);
if (!variable) return;

this.isLocal = variable.isLocal;
this.isCloud = variable.isCloud;
}

toJson() {
const json = super.toJson();
json["isLocal"] = this.isLocal;
json["isCloud"] = this.isCloud;
return json;
}

static fromJson(json, workspace, event) {
const newEvent = super.fromJson(json, workspace, event);
newEvent.isLocal = json["isLocal"];
newEvent.isCloud = json["isCloud"];
return newEvent;
}

run(forward) {
const workspace = this.getEventWorkspace_();
const variableMap = workspace.getVariableMap();
if (forward) {
const VariableModel = Blockly.registry.getObject(
Blockly.registry.Type.VARIABLE_MODEL,
Blockly.registry.DEFAULT,
true
);
const variable = new VariableModel(
workspace,
this.varName,
this.varType,
this.varId,
this.isLocal,
this.isCloud
);
variableMap.addVariable(variable);
Blockly.Events.fire(
new (Blockly.Events.get(Blockly.Events.VAR_CREATE))(variable)
);
} else {
const variable = variableMap.getVariableById(this.varId);
if (variable) {
variableMap.deleteVariable(variable);
}
}
}
}

Blockly.registry.register(
Blockly.registry.Type.EVENT,
Blockly.Events.VAR_CREATE,
ScratchVariableCreate,
true
);
103 changes: 53 additions & 50 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,58 +4,60 @@
* SPDX-License-Identifier: Apache-2.0
*/

import * as Blockly from 'blockly/core';
import {registerFieldAngle} from '@blockly/field-angle';
import * as Blockly from "blockly/core";
import { registerFieldAngle } from "@blockly/field-angle";
registerFieldAngle();
import '../blocks_common/colour.js';
import '../blocks_common/math.js';
import '../blocks_common/matrix.js';
import '../blocks_common/note.js';
import '../blocks_common/text.js';
import '../blocks_vertical/vertical_extensions.js';
import '../blocks_vertical/control.js';
import '../blocks_vertical/data.js';
import '../blocks_vertical/event.js';
import '../blocks_vertical/looks.js';
import '../blocks_vertical/motion.js';
import '../blocks_vertical/operators.js';
import '../blocks_vertical/procedures.js';
import '../blocks_vertical/sensing.js';
import '../blocks_vertical/sound.js';
import * as scratchBlocksUtils from '../core/scratch_blocks_utils.js';
import '../core/css.js';
import '../core/field_vertical_separator.js';
import "../blocks_common/colour.js";
import "../blocks_common/math.js";
import "../blocks_common/matrix.js";
import "../blocks_common/note.js";
import "../blocks_common/text.js";
import "../blocks_vertical/vertical_extensions.js";
import "../blocks_vertical/control.js";
import "../blocks_vertical/data.js";
import "../blocks_vertical/event.js";
import "../blocks_vertical/looks.js";
import "../blocks_vertical/motion.js";
import "../blocks_vertical/operators.js";
import "../blocks_vertical/procedures.js";
import "../blocks_vertical/sensing.js";
import "../blocks_vertical/sound.js";
import * as scratchBlocksUtils from "../core/scratch_blocks_utils.js";
import "../core/css.js";
import "../core/field_vertical_separator.js";
import {
ContinuousToolbox,
ContinuousFlyout,
ContinuousMetrics,
} from '@blockly/continuous-toolbox';
import {CheckableContinuousFlyout} from './checkable_continuous_flyout.js';
import {buildGlowFilter, glowStack} from './glows.js';
import {ScratchContinuousToolbox} from './scratch_continuous_toolbox.js';
import './scratch_continuous_category.js';
import './scratch_comment_icon.js';
import './events_block_comment_change.js';
import './events_block_comment_collapse.js';
import './events_block_comment_create.js';
import './events_block_comment_delete.js';
import './events_block_comment_move.js';
import './events_block_comment_resize.js';
import {buildShadowFilter} from './shadows.js';
} from "@blockly/continuous-toolbox";
import { CheckableContinuousFlyout } from "./checkable_continuous_flyout.js";
import { buildGlowFilter, glowStack } from "./glows.js";
import { ScratchContinuousToolbox } from "./scratch_continuous_toolbox.js";
import "./scratch_continuous_category.js";
import "./scratch_comment_icon.js";
import "./scratch_variable_model.js";
import "./events_block_comment_change.js";
import "./events_block_comment_collapse.js";
import "./events_block_comment_create.js";
import "./events_block_comment_delete.js";
import "./events_block_comment_move.js";
import "./events_block_comment_resize.js";
import "./events_scratch_variable_create.js";
import { buildShadowFilter } from "./shadows.js";

export * from 'blockly';
export * from './block_reporting.js';
export * from './categories.js';
export * from './procedures.js';
export * from '../core/colours.js';
export * from '../core/field_colour_slider.js';
export * from '../core/field_matrix.js';
export * from '../core/field_note.js';
export * from '../core/field_number.js';
export * from '../msg/scratch_msgs.js';
export {glowStack};
export {scratchBlocksUtils};
export {CheckableContinuousFlyout};
export * from "blockly";
export * from "./block_reporting.js";
export * from "./categories.js";
export * from "./procedures.js";
export * from "../core/colours.js";
export * from "../core/field_colour_slider.js";
export * from "../core/field_matrix.js";
export * from "../core/field_note.js";
export * from "../core/field_number.js";
export * from "../msg/scratch_msgs.js";
export { glowStack };
export { scratchBlocksUtils };
export { CheckableContinuousFlyout };

export function inject(container, options) {
Object.assign(options, {
Expand All @@ -66,11 +68,12 @@ export function inject(container, options) {
},
});
const workspace = Blockly.inject(container, options);
workspace.getRenderer().getConstants().selectedGlowFilterId = '';
workspace.getRenderer().getConstants().selectedGlowFilterId = "";

const flyout = workspace.getFlyout();
if (flyout) {
flyout.getWorkspace().getRenderer().getConstants().selectedGlowFilterId = '';
flyout.getWorkspace().getRenderer().getConstants().selectedGlowFilterId =
"";
}

buildGlowFilter(workspace);
Expand All @@ -88,6 +91,6 @@ export function inject(container, options) {
Blockly.Scrollbar.scrollbarThickness = Blockly.Touch.TOUCH_ENABLED ? 14 : 11;
Blockly.FlyoutButton.TEXT_MARGIN_X = 40;
Blockly.FlyoutButton.TEXT_MARGIN_Y = 10;
Blockly.ContextMenuRegistry.registry.unregister('blockDisable');
Blockly.ContextMenuRegistry.registry.unregister('blockInline');
Blockly.ContextMenuRegistry.registry.unregister("blockDisable");
Blockly.ContextMenuRegistry.registry.unregister("blockInline");
Blockly.ContextMenuItems.registerCommentOptions();
24 changes: 24 additions & 0 deletions src/scratch_variable_model.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/**
* @license
* Copyright 2024 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/

import * as Blockly from "blockly/core";

class ScratchVariableModel extends Blockly.VariableModel {
constructor(workspace, name, type, id, isLocal, isCloud) {
super(workspace, name, type, id);
// isLocal and isCloud may not be passed when creating broadcast message
// variables, which conveniently are neither local nor cloud.
this.isLocal = !!isLocal;
this.isCloud = !!isCloud;
}
}

Blockly.registry.register(
Blockly.registry.Type.VARIABLE_MODEL,
Blockly.registry.DEFAULT,
ScratchVariableModel,
true
);

0 comments on commit 2598ede

Please sign in to comment.