Skip to content

Commit

Permalink
feat: add headless workspace comment class (#7916)
Browse files Browse the repository at this point in the history
* feat: add empty definitions for comment class

* feat: implement constructor

* feat: add method implementations

* feat: add own properties

* chore: add tsdoc

* fix: typos

* chore: cleanup TODOs
  • Loading branch information
BeksOmega authored Mar 15, 2024
1 parent b70da6d commit 8fc439f
Show file tree
Hide file tree
Showing 2 changed files with 169 additions and 0 deletions.
1 change: 1 addition & 0 deletions core/comments.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@
*/

export {CommentView} from './comments/comment_view.js';
export {WorkspaceComment} from './comments/workspace_comment.js';
168 changes: 168 additions & 0 deletions core/comments/workspace_comment.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
/**
* @license
* Copyright 2024 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/

import {Workspace} from '../workspace.js';
import {Size} from '../utils/size.js';
import {Coordinate} from '../utils/coordinate.js';
import * as idGenerator from '../utils/idgenerator.js';

export class WorkspaceComment {
/** The unique identifier for this comment. */
public readonly id: string;

/** The text of the comment. */
private text = '';

/** The size of the comment in workspace units. */
private size = new Size(120, 100);

/** Whether the comment is collapsed or not. */
private collapsed = false;

/** Whether the comment is editable or not. */
private editable = true;

/** Whether the comment is movable or not. */
private movable = true;

/** Whether the comment is deletable or not. */
private deletable = true;

/** The location of the comment in workspace coordinates. */
private location = new Coordinate(0, 0);

/** Whether this comment has been disposed or not. */
private disposed = false;

/**
* Constructs the comment.
*
* @param workspace The workspace to construct the comment in.
* @param id An optional ID to give to the comment. If not provided, one will
* be generated.
*/
constructor(
protected readonly workspace: Workspace,
id?: string,
) {
this.id = id && !workspace.getCommentById(id) ? id : idGenerator.genUid();

// TODO(7909): Fire events.
}

/** Sets the text of the comment. */
setText(text: string) {
this.text = text;
}

/** Returns the text of the comment. */
getText(): string {
return this.text;
}

/** Sets the comment's size in workspace units. */
setSize(size: Size) {
this.size = size;
}

/** Returns the comment's size in workspace units. */
getSize(): Size {
return this.size;
}

/** Sets whether the comment is collapsed or not. */
setCollapsed(collapsed: boolean) {
this.collapsed = collapsed;
}

/** Returns whether the comment is collapsed or not. */
isCollapsed(): boolean {
return this.collapsed;
}

/** Sets whether the comment is editable or not. */
setEditable(editable: boolean) {
this.editable = editable;
}

/**
* Returns whether the comment is editable or not, respecting whether the
* workspace is read-only.
*/
isEditable(): boolean {
return this.isOwnEditable() && !this.workspace.options.readOnly;
}

/**
* Returns whether the comment is editable or not, only examining its own
* state and ignoring the state of the workspace.
*/
isOwnEditable(): boolean {
return this.editable;
}

/** Sets whether the comment is movable or not. */
setMovable(movable: boolean) {
this.movable = movable;
}

/**
* Returns whether the comment is movable or not, respecting whether the
* workspace is read-only.
*/
isMovable() {
return this.isOwnMovable() && !this.workspace.options.readOnly;
}

/**
* Returns whether the comment is movable or not, only examining its own
* state and ignoring the state of the workspace.
*/
isOwnMovable() {
return this.movable;
}

/** Sets whether the comment is deletable or not. */
setDeletable(deletable: boolean) {
this.deletable = deletable;
}

/**
* Returns whether the comment is deletable or not, respecting whether the
* workspace is read-only.
*/
isDeletable(): boolean {
return this.isOwnDeletable() && !this.workspace.options.readOnly;
}

/**
* Returns whether the comment is deletable or not, only examining its own
* state and ignoring the state of the workspace.
*/
isOwnDeletable(): boolean {
return this.deletable;
}

/** Moves the comment to the given location in workspace coordinates. */
moveTo(location: Coordinate) {
this.location = location;
}

/** Returns the position of the comment in workspace coordinates. */
getRelativeToSurfaceXY(): Coordinate {
return this.location;
}

/** Disposes of this comment. */
dispose() {
this.disposed = true;
}

/** Returns whether the comment has been disposed or not. */
isDisposed() {
return this.disposed;
}
}

0 comments on commit 8fc439f

Please sign in to comment.