mirror of
https://github.com/google/blockly.git
synced 2026-01-07 09:00:11 +01:00
Comments v3 (#1817)
* Add skeleton for workspace comments * XML parsing and encoding of workspace comments. * Minor fix: piping the height and width from xml to newWorkspaceComment * Move height and width into workspace_comment_svg * rename newWorkspaceComment to newComment * minor refactoring. PR changes * Functions for managing the comment's lifecycle * Add initial tests * Add another test * Add basic rendering of a comment. * Cleanup remaining highlighting steps from render * Fix lint * Fix aslant * Add basic comment translate * Simplify render code into one setPath method * Move steps to setPath_ * Remove svg elements when disposing of a comment; some code cleanup * Add a workspace comment on context menu click and position it where the initial context menu was clicked. * Minor rendering changes, fixes RTL. Fix positioning of new (context menu) comments while workspace is scaled. * PR feedback * Gesture code for dragging comments * Add comment (block drag) surface methods * minor comment fix * Comment fixes * Add comment dragger * Making rendered private * Require CommentDragger * Make basic comment dragging work * Increase the border around the comment to make a bigger drag handle * Remove typo * Allow comments to be selected. Highlight selected comment. Only edit comment on click. Updated comment rendering. * minor refactor: remove commented out code * PR comments * lint and rebuild * Fix renamed function call * Fix workspace getMetrics by storing comment size as a number, not a string * Enable comment deletion when dragging over the toolbox or trash can * Give issue references to some todos * Create a helper function for workspace comment creation * Integrate sam's workspace comments, using the bubble dragger * Remove comment_dragger references * Remove comment dragger.js * Remove pointer handling * Fix lint * Move comment XML functions into the comment files. * Fix tests * Fix type annotations * Fix comments on comments * Fix compiler errors related to visibility. * Fix merge issues and add an issue number to a TODO * Add a new message for default text on workspace comments, and rebuild * Add support for a context menu on workspace comment showing delete and duplication options. Add copy and paste support. * PR comment feedback * Show a delete icon on the comment when selected. Delete icon deletes the comment. Comment can be deleted if dragged onto the toolbox or the trash icon. A normal bubble cannot be deleted that way. * use isDeletable instead * Support drag of the comment during editing mode using the top handle. * Add skeletons for all workspace comment events * Rebuild with new comments * Get rid of confused TODO * JSDoc on a function * Fix broken tests * More PR feedback * Fix lint * Delete comment on mouse out, highlight on mouse down. * Fix lint. * Show delete hand cursor when dragging a comment to delete over the toolbox * Focus textarea on select * Add delete events * Remove workspace comment create event, and add TODO placeholder * Provide default values if comment height and width are missing in XML * Set comment handle fill to none by default * Rebuild * Comment de/serialization should include location. * Add comment move events, with undo and redo * Add comment change events * Move files up to core * Add package/private annotations wherever possible * Move the workspace comment events up to core and into a single file * Mark things package or private where possible * Get rid of unnecessary changes to messge files * Fix lint * Fix some review feedback * Make changes to the comment db happen in addTopComment and removeTopComment * Add css classes for toggling comment focus * Clean up css for comment focus * Rebuild
This commit is contained in:
@@ -27,6 +27,7 @@
|
||||
goog.provide('Blockly.Workspace');
|
||||
|
||||
goog.require('Blockly.VariableMap');
|
||||
goog.require('Blockly.WorkspaceComment');
|
||||
goog.require('goog.array');
|
||||
goog.require('goog.math');
|
||||
|
||||
@@ -55,6 +56,16 @@ Blockly.Workspace = function(opt_options) {
|
||||
* @private
|
||||
*/
|
||||
this.topBlocks_ = [];
|
||||
/**
|
||||
* @type {!Array.<!Blockly.WorkspaceComment>}
|
||||
* @private
|
||||
*/
|
||||
this.topComments_ = [];
|
||||
/**
|
||||
* @type {!Object}
|
||||
* @private
|
||||
*/
|
||||
this.commentDB_ = Object.create(null);
|
||||
/**
|
||||
* @type {!Array.<!Function>}
|
||||
* @private
|
||||
@@ -170,6 +181,61 @@ Blockly.Workspace.prototype.getTopBlocks = function(ordered) {
|
||||
return blocks;
|
||||
};
|
||||
|
||||
/**
|
||||
* Add a comment to the list of top comments.
|
||||
* @param {!Blockly.WorkspaceComment} comment comment to add.
|
||||
* @package
|
||||
*/
|
||||
Blockly.Workspace.prototype.addTopComment = function(comment) {
|
||||
this.topComments_.push(comment);
|
||||
|
||||
// Note: If the comment database starts to hold block comments, this may need
|
||||
// to move to a separate function.
|
||||
if (this.commentDB_[comment.id]) {
|
||||
console.warn('Overriding an existing comment on this workspace, with id "' +
|
||||
comment.id + '"');
|
||||
}
|
||||
this.commentDB_[comment.id] = comment;
|
||||
};
|
||||
|
||||
/**
|
||||
* Remove a comment from the list of top comments.
|
||||
* @param {!Blockly.WorkspaceComment} comment comment to remove.
|
||||
* @package
|
||||
*/
|
||||
Blockly.Workspace.prototype.removeTopComment = function(comment) {
|
||||
if (!goog.array.remove(this.topComments_, comment)) {
|
||||
throw 'Comment not present in workspace\'s list of top-most comments.';
|
||||
}
|
||||
// Note: If the comment database starts to hold block comments, this may need
|
||||
// to move to a separate function.
|
||||
delete this.commentDB_[comment.id];
|
||||
};
|
||||
|
||||
/**
|
||||
* Finds the top-level comments and returns them. Comments are optionally sorted
|
||||
* by position; top to bottom (with slight LTR or RTL bias).
|
||||
* @param {boolean} ordered Sort the list if true.
|
||||
* @return {!Array.<!Blockly.WorkspaceComment>} The top-level comment objects.
|
||||
* @package
|
||||
*/
|
||||
Blockly.Workspace.prototype.getTopComments = function(ordered) {
|
||||
// Copy the topComments_ list.
|
||||
var comments = [].concat(this.topComments_);
|
||||
if (ordered && comments.length > 1) {
|
||||
var offset = Math.sin(goog.math.toRadians(Blockly.Workspace.SCAN_ANGLE));
|
||||
if (this.RTL) {
|
||||
offset *= -1;
|
||||
}
|
||||
comments.sort(function(a, b) {
|
||||
var aXY = a.getRelativeToSurfaceXY();
|
||||
var bXY = b.getRelativeToSurfaceXY();
|
||||
return (aXY.y + offset * aXY.x) - (bXY.y + offset * bXY.x);
|
||||
});
|
||||
}
|
||||
return comments;
|
||||
};
|
||||
|
||||
/**
|
||||
* Find all blocks in workspace. Blocks are optionally sorted
|
||||
* by position; top to bottom (with slight LTR or RTL bias).
|
||||
@@ -195,7 +261,7 @@ Blockly.Workspace.prototype.getAllBlocks = function(ordered) {
|
||||
};
|
||||
|
||||
/**
|
||||
* Dispose of all blocks in workspace.
|
||||
* Dispose of all blocks and comments in workspace.
|
||||
*/
|
||||
Blockly.Workspace.prototype.clear = function() {
|
||||
var existingGroup = Blockly.Events.getGroup();
|
||||
@@ -205,6 +271,9 @@ Blockly.Workspace.prototype.clear = function() {
|
||||
while (this.topBlocks_.length) {
|
||||
this.topBlocks_[0].dispose();
|
||||
}
|
||||
while (this.topComments_.length) {
|
||||
this.topComments_[this.topComments_.length - 1].dispose();
|
||||
}
|
||||
if (!existingGroup) {
|
||||
Blockly.Events.setGroup(false);
|
||||
}
|
||||
@@ -458,6 +527,17 @@ Blockly.Workspace.prototype.getBlockById = function(id) {
|
||||
return this.blockDB_[id] || null;
|
||||
};
|
||||
|
||||
/**
|
||||
* Find the comment on this workspace with the specified ID.
|
||||
* @param {string} id ID of comment to find.
|
||||
* @return {Blockly.WorkspaceComment} The sought after comment or null if not
|
||||
* found.
|
||||
* @package
|
||||
*/
|
||||
Blockly.Workspace.prototype.getCommentById = function(id) {
|
||||
return this.commentDB_[id] || null;
|
||||
};
|
||||
|
||||
/**
|
||||
* Checks whether all value and statement inputs in the workspace are filled
|
||||
* with blocks.
|
||||
|
||||
Reference in New Issue
Block a user