mirror of
https://github.com/google/blockly.git
synced 2026-01-07 00:50:27 +01:00
Fix circular dependencies in shortcut + contextmenu registries (#4681)
* Fix circular dependencies in shortcut and contextmenu registries
This commit is contained in:
@@ -38,8 +38,8 @@ goog.addDependency('../../core/connection_db.js', ['Blockly.ConnectionDB'], ['Bl
|
||||
goog.addDependency('../../core/connection_types.js', ['Blockly.connectionTypes'], [], {});
|
||||
goog.addDependency('../../core/constants.js', ['Blockly.constants'], ['Blockly.connectionTypes'], {});
|
||||
goog.addDependency('../../core/contextmenu.js', ['Blockly.ContextMenu'], ['Blockly.Events', 'Blockly.Events.BlockCreate', 'Blockly.Menu', 'Blockly.MenuItem', 'Blockly.Msg', 'Blockly.WidgetDiv', 'Blockly.Xml', 'Blockly.browserEvents', 'Blockly.constants', 'Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.Rect', 'Blockly.utils.aria', 'Blockly.utils.dom', 'Blockly.utils.userAgent'], {});
|
||||
goog.addDependency('../../core/contextmenu_items.js', ['Blockly.ContextMenuItems'], ['Blockly.Events', 'Blockly.constants', 'Blockly.inputTypes'], {'lang': 'es5'});
|
||||
goog.addDependency('../../core/contextmenu_registry.js', ['Blockly.ContextMenuRegistry'], ['Blockly.ContextMenuItems'], {'lang': 'es5'});
|
||||
goog.addDependency('../../core/contextmenu_items.js', ['Blockly.ContextMenuItems'], ['Blockly.ContextMenuRegistry', 'Blockly.Events', 'Blockly.constants', 'Blockly.inputTypes'], {'lang': 'es5'});
|
||||
goog.addDependency('../../core/contextmenu_registry.js', ['Blockly.ContextMenuRegistry'], [], {'lang': 'es5'});
|
||||
goog.addDependency('../../core/css.js', ['Blockly.Css'], [], {'lang': 'es5'});
|
||||
goog.addDependency('../../core/dropdowndiv.js', ['Blockly.DropDownDiv'], ['Blockly.utils.Rect', 'Blockly.utils.dom', 'Blockly.utils.math', 'Blockly.utils.style'], {});
|
||||
goog.addDependency('../../core/events/block_events.js', ['Blockly.Events.BlockBase', 'Blockly.Events.BlockChange', 'Blockly.Events.BlockCreate', 'Blockly.Events.BlockDelete', 'Blockly.Events.BlockMove', 'Blockly.Events.Change', 'Blockly.Events.Create', 'Blockly.Events.Delete', 'Blockly.Events.Move'], ['Blockly.Events', 'Blockly.Events.Abstract', 'Blockly.Xml', 'Blockly.connectionTypes', 'Blockly.registry', 'Blockly.utils.Coordinate', 'Blockly.utils.object', 'Blockly.utils.xml'], {});
|
||||
@@ -159,10 +159,10 @@ goog.addDependency('../../core/renderers/zelos/measurables/row_elements.js', ['B
|
||||
goog.addDependency('../../core/renderers/zelos/measurables/rows.js', ['Blockly.zelos.BottomRow', 'Blockly.zelos.TopRow'], ['Blockly.blockRendering.BottomRow', 'Blockly.blockRendering.TopRow', 'Blockly.utils.object'], {});
|
||||
goog.addDependency('../../core/renderers/zelos/path_object.js', ['Blockly.zelos.PathObject'], ['Blockly.blockRendering.PathObject', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.object', 'Blockly.zelos.ConstantProvider'], {});
|
||||
goog.addDependency('../../core/renderers/zelos/renderer.js', ['Blockly.zelos.Renderer'], ['Blockly.InsertionMarkerManager', 'Blockly.blockRendering', 'Blockly.blockRendering.Renderer', 'Blockly.connectionTypes', 'Blockly.constants', 'Blockly.utils.object', 'Blockly.zelos.ConstantProvider', 'Blockly.zelos.Drawer', 'Blockly.zelos.MarkerSvg', 'Blockly.zelos.PathObject', 'Blockly.zelos.RenderInfo'], {});
|
||||
goog.addDependency('../../core/requires.js', ['Blockly.requires'], ['Blockly', 'Blockly.Comment', 'Blockly.FieldAngle', 'Blockly.FieldCheckbox', 'Blockly.FieldColour', 'Blockly.FieldDropdown', 'Blockly.FieldImage', 'Blockly.FieldLabelSerializable', 'Blockly.FieldMultilineInput', 'Blockly.FieldNumber', 'Blockly.FieldTextInput', 'Blockly.FieldVariable', 'Blockly.FlyoutButton', 'Blockly.Generator', 'Blockly.HorizontalFlyout', 'Blockly.Mutator', 'Blockly.Themes.Classic', 'Blockly.Themes.Dark', 'Blockly.Themes.Deuteranopia', 'Blockly.Themes.HighContrast', 'Blockly.Themes.Tritanopia', 'Blockly.Toolbox', 'Blockly.Trashcan', 'Blockly.VariablesDynamic', 'Blockly.VerticalFlyout', 'Blockly.Warning', 'Blockly.ZoomControls', 'Blockly.geras.Renderer', 'Blockly.thrasos.Renderer', 'Blockly.zelos.Renderer'], {});
|
||||
goog.addDependency('../../core/requires.js', ['Blockly.requires'], ['Blockly', 'Blockly.Comment', 'Blockly.ContextMenuItems', 'Blockly.FieldAngle', 'Blockly.FieldCheckbox', 'Blockly.FieldColour', 'Blockly.FieldDropdown', 'Blockly.FieldImage', 'Blockly.FieldLabelSerializable', 'Blockly.FieldMultilineInput', 'Blockly.FieldNumber', 'Blockly.FieldTextInput', 'Blockly.FieldVariable', 'Blockly.FlyoutButton', 'Blockly.Generator', 'Blockly.HorizontalFlyout', 'Blockly.Mutator', 'Blockly.ShortcutItems', 'Blockly.Themes.Classic', 'Blockly.Themes.Dark', 'Blockly.Themes.Deuteranopia', 'Blockly.Themes.HighContrast', 'Blockly.Themes.Tritanopia', 'Blockly.Toolbox', 'Blockly.Trashcan', 'Blockly.VariablesDynamic', 'Blockly.VerticalFlyout', 'Blockly.Warning', 'Blockly.ZoomControls', 'Blockly.geras.Renderer', 'Blockly.thrasos.Renderer', 'Blockly.zelos.Renderer'], {});
|
||||
goog.addDependency('../../core/scrollbar.js', ['Blockly.Scrollbar', 'Blockly.ScrollbarPair'], ['Blockly.Events', 'Blockly.Touch', 'Blockly.browserEvents', 'Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.Metrics', 'Blockly.utils.Svg', 'Blockly.utils.dom'], {});
|
||||
goog.addDependency('../../core/shortcut_items.js', ['Blockly.ShortcutItems'], ['Blockly.utils.KeyCodes'], {});
|
||||
goog.addDependency('../../core/shortcut_registry.js', ['Blockly.ShortcutRegistry'], ['Blockly.ShortcutItems', 'Blockly.utils.object'], {});
|
||||
goog.addDependency('../../core/shortcut_items.js', ['Blockly.ShortcutItems'], ['Blockly.Gesture', 'Blockly.ShortcutRegistry', 'Blockly.utils.KeyCodes'], {});
|
||||
goog.addDependency('../../core/shortcut_registry.js', ['Blockly.ShortcutRegistry'], ['Blockly.utils.KeyCodes', 'Blockly.utils.object'], {});
|
||||
goog.addDependency('../../core/theme.js', ['Blockly.Theme'], ['Blockly.registry', 'Blockly.utils', 'Blockly.utils.object'], {});
|
||||
goog.addDependency('../../core/theme/classic.js', ['Blockly.Themes.Classic'], ['Blockly.Theme'], {});
|
||||
goog.addDependency('../../core/theme/dark.js', ['Blockly.Themes.Dark'], ['Blockly.Theme'], {});
|
||||
|
||||
@@ -18,6 +18,7 @@ goog.provide('Blockly.ContextMenuItems');
|
||||
|
||||
/** @suppress {extraRequire} */
|
||||
goog.require('Blockly.constants');
|
||||
goog.require('Blockly.ContextMenuRegistry');
|
||||
goog.require('Blockly.Events');
|
||||
goog.require('Blockly.inputTypes');
|
||||
|
||||
@@ -538,3 +539,4 @@ Blockly.ContextMenuItems.registerDefaultOptions = function() {
|
||||
Blockly.ContextMenuItems.registerBlockOptions_();
|
||||
};
|
||||
|
||||
Blockly.ContextMenuItems.registerDefaultOptions();
|
||||
|
||||
@@ -16,15 +16,17 @@
|
||||
*/
|
||||
goog.provide('Blockly.ContextMenuRegistry');
|
||||
|
||||
goog.require('Blockly.ContextMenuItems');
|
||||
goog.requireType('Blockly.BlockSvg');
|
||||
goog.requireType('Blockly.WorkspaceSvg');
|
||||
|
||||
|
||||
/**
|
||||
* Class for the registry of context menu items. This is intended to be a singleton. You should
|
||||
* not create a new instance, and only access this class from Blockly.ContextMenuRegistry.registry.
|
||||
* Class for the registry of context menu items. This is intended to be a
|
||||
* singleton. You should not create a new instance, and only access this class
|
||||
* from Blockly.ContextMenuRegistry.registry.
|
||||
* @constructor
|
||||
*/
|
||||
Blockly.ContextMenuRegistry = function() {
|
||||
|
||||
// Singleton instance should be registered once.
|
||||
Blockly.ContextMenuRegistry.registry = this;
|
||||
|
||||
@@ -34,7 +36,6 @@ Blockly.ContextMenuRegistry = function() {
|
||||
* @private
|
||||
*/
|
||||
this.registry_ = {};
|
||||
Blockly.ContextMenuItems.registerDefaultOptions();
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -83,7 +84,8 @@ Blockly.ContextMenuRegistry.RegistryItem;
|
||||
Blockly.ContextMenuRegistry.ContextMenuOption;
|
||||
|
||||
/**
|
||||
* Singleton instance of this class. All interactions with this class should be done on this object.
|
||||
* Singleton instance of this class. All interactions with this class should be
|
||||
* done on this object.
|
||||
* @type {?Blockly.ContextMenuRegistry}
|
||||
*/
|
||||
Blockly.ContextMenuRegistry.registry = null;
|
||||
|
||||
@@ -46,6 +46,10 @@ goog.require('Blockly.VariablesDynamic');
|
||||
// If zoom controls aren't required, then Blockly.inject's
|
||||
// "zoom"/"controls" configuration must be false.
|
||||
goog.require('Blockly.ZoomControls');
|
||||
// This registers default keyboard shortcuts.
|
||||
goog.require('Blockly.ShortcutItems');
|
||||
// This registers default contextmenu options.
|
||||
goog.require('Blockly.ContextMenuItems');
|
||||
|
||||
|
||||
// Block dependencies.
|
||||
|
||||
@@ -16,11 +16,12 @@
|
||||
*/
|
||||
goog.provide('Blockly.ShortcutItems');
|
||||
|
||||
goog.require('Blockly.Gesture');
|
||||
goog.require('Blockly.ShortcutRegistry');
|
||||
goog.require('Blockly.utils.KeyCodes');
|
||||
|
||||
goog.requireType('Blockly.BlockSvg');
|
||||
goog.requireType('Blockly.ICopyable');
|
||||
goog.requireType('Blockly.ShortcutRegistry');
|
||||
|
||||
|
||||
/**
|
||||
@@ -231,19 +232,21 @@ Blockly.ShortcutItems.registerRedo = function() {
|
||||
Blockly.ShortcutRegistry.registry.register(redoShortcut);
|
||||
|
||||
var ctrlShiftZ = Blockly.ShortcutRegistry.registry.createSerializedKey(
|
||||
Blockly.utils.KeyCodes.Z, [Blockly.utils.KeyCodes.SHIFT,
|
||||
Blockly.utils.KeyCodes.CTRL]);
|
||||
Blockly.ShortcutRegistry.registry.addKeyMapping(ctrlShiftZ, redoShortcut.name);
|
||||
Blockly.utils.KeyCodes.Z,
|
||||
[Blockly.utils.KeyCodes.SHIFT, Blockly.utils.KeyCodes.CTRL]);
|
||||
Blockly.ShortcutRegistry.registry.addKeyMapping(
|
||||
ctrlShiftZ, redoShortcut.name);
|
||||
|
||||
var altShiftZ = Blockly.ShortcutRegistry.registry.createSerializedKey(
|
||||
Blockly.utils.KeyCodes.Z, [Blockly.utils.KeyCodes.SHIFT,
|
||||
Blockly.utils.KeyCodes.ALT]);
|
||||
Blockly.utils.KeyCodes.Z,
|
||||
[Blockly.utils.KeyCodes.SHIFT, Blockly.utils.KeyCodes.ALT]);
|
||||
Blockly.ShortcutRegistry.registry.addKeyMapping(altShiftZ, redoShortcut.name);
|
||||
|
||||
var metaShiftZ = Blockly.ShortcutRegistry.registry.createSerializedKey(
|
||||
Blockly.utils.KeyCodes.Z, [Blockly.utils.KeyCodes.SHIFT,
|
||||
Blockly.utils.KeyCodes.META]);
|
||||
Blockly.ShortcutRegistry.registry.addKeyMapping(metaShiftZ, redoShortcut.name);
|
||||
Blockly.utils.KeyCodes.Z,
|
||||
[Blockly.utils.KeyCodes.SHIFT, Blockly.utils.KeyCodes.META]);
|
||||
Blockly.ShortcutRegistry.registry.addKeyMapping(
|
||||
metaShiftZ, redoShortcut.name);
|
||||
|
||||
// Ctrl-y is redo in Windows. Command-y is never valid on Macs.
|
||||
var ctrlY = Blockly.ShortcutRegistry.registry.createSerializedKey(
|
||||
@@ -265,3 +268,5 @@ Blockly.ShortcutItems.registerDefaultShortcuts = function() {
|
||||
Blockly.ShortcutItems.registerUndo();
|
||||
Blockly.ShortcutItems.registerRedo();
|
||||
};
|
||||
|
||||
Blockly.ShortcutItems.registerDefaultShortcuts();
|
||||
|
||||
@@ -13,10 +13,9 @@
|
||||
|
||||
goog.provide('Blockly.ShortcutRegistry');
|
||||
|
||||
goog.require('Blockly.ShortcutItems');
|
||||
goog.require('Blockly.utils.KeyCodes');
|
||||
goog.require('Blockly.utils.object');
|
||||
|
||||
goog.requireType('Blockly.utils.KeyCodes');
|
||||
goog.requireType('Blockly.Workspace');
|
||||
|
||||
|
||||
@@ -43,8 +42,6 @@ Blockly.ShortcutRegistry = function() {
|
||||
* @private
|
||||
*/
|
||||
this.keyMap_ = Object.create(null);
|
||||
|
||||
Blockly.ShortcutItems.registerDefaultShortcuts();
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -113,8 +110,8 @@ Blockly.ShortcutRegistry.prototype.unregister = function(shortcutName) {
|
||||
|
||||
/**
|
||||
* Adds a mapping between a keycode and a keyboard shortcut.
|
||||
* @param {string} keyCode The key code for the keyboard shortcut. If
|
||||
* registering a key code with a modifier (ex: ctrl+c) use
|
||||
* @param {string|Blockly.utils.KeyCodes} keyCode The key code for the keyboard
|
||||
* shortcut. If registering a key code with a modifier (ex: ctrl+c) use
|
||||
* Blockly.ShortcutRegistry.registry.createSerializedKey;
|
||||
* @param {string} shortcutName The name of the shortcut to execute when the
|
||||
* given keycode is pressed.
|
||||
@@ -125,6 +122,7 @@ Blockly.ShortcutRegistry.prototype.unregister = function(shortcutName) {
|
||||
*/
|
||||
Blockly.ShortcutRegistry.prototype.addKeyMapping = function(
|
||||
keyCode, shortcutName, opt_allowCollision) {
|
||||
keyCode = String(keyCode);
|
||||
var shortcutNames = this.keyMap_[keyCode];
|
||||
if (shortcutNames && !opt_allowCollision) {
|
||||
throw new Error(
|
||||
|
||||
@@ -14,6 +14,7 @@ suite('Context Menu Items', function() {
|
||||
|
||||
// Declare a new registry to ensure default options are called.
|
||||
new Blockly.ContextMenuRegistry();
|
||||
Blockly.ContextMenuItems.registerDefaultOptions();
|
||||
this.registry = Blockly.ContextMenuRegistry.registry;
|
||||
});
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ suite('Keyboard Shortcut Registry Test', function() {
|
||||
setup(function() {
|
||||
sharedTestSetup.call(this);
|
||||
this.registry = new Blockly.ShortcutRegistry();
|
||||
Blockly.ShortcutItems.registerDefaultShortcuts();
|
||||
});
|
||||
teardown(function() {
|
||||
sharedTestTeardown.call(this);
|
||||
|
||||
Reference in New Issue
Block a user