mirror of
https://bitbucket.org/wisemapping/wisemapping-frontend.git
synced 2024-11-24 23:37:57 +01:00
Introduce shape type.
This commit is contained in:
parent
57a8af58c2
commit
5f4784e561
@ -47,7 +47,7 @@ class CentralTopic extends Topic {
|
|||||||
// Overwite behaviour ...
|
// Overwite behaviour ...
|
||||||
}
|
}
|
||||||
|
|
||||||
_updatePositionOnChangeSize(): void {
|
updatePositionOnChangeSize(): void {
|
||||||
// Center main topic ...
|
// Center main topic ...
|
||||||
const zeroPoint = { x: 0, y: 0 };
|
const zeroPoint = { x: 0, y: 0 };
|
||||||
this.setPosition(zeroPoint);
|
this.setPosition(zeroPoint);
|
||||||
|
@ -22,7 +22,7 @@ import PositionType from './PositionType';
|
|||||||
import Topic from './Topic';
|
import Topic from './Topic';
|
||||||
import TopicConfig from './TopicConfig';
|
import TopicConfig from './TopicConfig';
|
||||||
import Canvas from './Canvas';
|
import Canvas from './Canvas';
|
||||||
import ArcLine from './widget/ArcLine';
|
import ArcLine from './model/ArcLine';
|
||||||
|
|
||||||
// eslint-disable-next-line no-shadow
|
// eslint-disable-next-line no-shadow
|
||||||
export enum LineType {
|
export enum LineType {
|
||||||
|
@ -45,7 +45,7 @@ import EventBusDispatcher from './layout/EventBusDispatcher';
|
|||||||
|
|
||||||
import LayoutManager from './layout/LayoutManager';
|
import LayoutManager from './layout/LayoutManager';
|
||||||
|
|
||||||
import { $notify } from './widget/ToolbarNotifier';
|
import { $notify } from './model/ToolbarNotifier';
|
||||||
import RelationshipModel from './model/RelationshipModel';
|
import RelationshipModel from './model/RelationshipModel';
|
||||||
import Mindmap from './model/Mindmap';
|
import Mindmap from './model/Mindmap';
|
||||||
import NodeModel from './model/NodeModel';
|
import NodeModel from './model/NodeModel';
|
||||||
|
@ -21,7 +21,7 @@ import { DesignerOptions } from './DesignerOptionsBuilder';
|
|||||||
import Events from './Events';
|
import Events from './Events';
|
||||||
import Relationship from './Relationship';
|
import Relationship from './Relationship';
|
||||||
import Topic from './Topic';
|
import Topic from './Topic';
|
||||||
import { $notify } from './widget/ToolbarNotifier';
|
import { $notify } from './model/ToolbarNotifier';
|
||||||
|
|
||||||
class DesignerModel extends Events {
|
class DesignerModel extends Events {
|
||||||
private _zoom: number;
|
private _zoom: number;
|
||||||
|
@ -23,11 +23,12 @@ import Shape from './util/Shape';
|
|||||||
import Canvas from './Canvas';
|
import Canvas from './Canvas';
|
||||||
import SizeType from './SizeType';
|
import SizeType from './SizeType';
|
||||||
import PositionType from './PositionType';
|
import PositionType from './PositionType';
|
||||||
|
import TopicShapeFactory from './shape/TopicShapeFactory';
|
||||||
|
|
||||||
class MainTopic extends Topic {
|
class MainTopic extends Topic {
|
||||||
buildDragShape(): ElementClass<ElementPeer> {
|
buildDragShape(): ElementClass<ElementPeer> {
|
||||||
const shapeType = this.getShapeType();
|
const shapeType = this.getShapeType();
|
||||||
const innerShape = this._buildShape(shapeType);
|
const innerShape = TopicShapeFactory.create(shapeType, this);
|
||||||
const size = this.getSize();
|
const size = this.getSize();
|
||||||
innerShape.setSize(size.width, size.height);
|
innerShape.setSize(size.width, size.height);
|
||||||
innerShape.setPosition(0, 0);
|
innerShape.setPosition(0, 0);
|
||||||
@ -36,10 +37,10 @@ class MainTopic extends Topic {
|
|||||||
innerShape.setVisibility(true);
|
innerShape.setVisibility(true);
|
||||||
|
|
||||||
const brColor = this.getBorderColor();
|
const brColor = this.getBorderColor();
|
||||||
innerShape.setAttribute('strokeColor', brColor);
|
innerShape.setStroke(null, null, brColor);
|
||||||
|
|
||||||
const bgColor = this.getBackgroundColor();
|
const bgColor = this.getBackgroundColor();
|
||||||
innerShape.setAttribute('fillColor', bgColor);
|
innerShape.setFill(bgColor);
|
||||||
|
|
||||||
// Create group ...
|
// Create group ...
|
||||||
const groupAttributes = {
|
const groupAttributes = {
|
||||||
@ -49,9 +50,9 @@ class MainTopic extends Topic {
|
|||||||
coordSizeHeight: 100,
|
coordSizeHeight: 100,
|
||||||
};
|
};
|
||||||
const group = new Group(groupAttributes);
|
const group = new Group(groupAttributes);
|
||||||
group.append(innerShape);
|
innerShape.appendTo(group);
|
||||||
|
|
||||||
const textShape = this._buildTextShape(true);
|
const textShape = this.buildTextShape(true);
|
||||||
const text = this.getText();
|
const text = this.getText();
|
||||||
textShape.setText(text);
|
textShape.setText(text);
|
||||||
textShape.setOpacity(0.5);
|
textShape.setOpacity(0.5);
|
||||||
@ -75,7 +76,7 @@ class MainTopic extends Topic {
|
|||||||
innerShape.setVisibility(true);
|
innerShape.setVisibility(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
_updatePositionOnChangeSize(oldSize: SizeType, newSize: SizeType) {
|
updatePositionOnChangeSize(oldSize: SizeType, newSize: SizeType) {
|
||||||
const xOffset = Math.round((newSize.width - oldSize.width) / 2);
|
const xOffset = Math.round((newSize.width - oldSize.width) / 2);
|
||||||
const pos = this.getPosition();
|
const pos = this.getPosition();
|
||||||
if ($defined(pos)) {
|
if ($defined(pos)) {
|
||||||
|
@ -23,7 +23,7 @@ import EditorRenderMode from './EditorRenderMode';
|
|||||||
import PersistenceManager from './PersistenceManager';
|
import PersistenceManager from './PersistenceManager';
|
||||||
import WidgetManager from './WidgetManager';
|
import WidgetManager from './WidgetManager';
|
||||||
import mindplotStyles from './styles/mindplot-styles';
|
import mindplotStyles from './styles/mindplot-styles';
|
||||||
import { $notify } from './widget/ToolbarNotifier';
|
import { $notify } from './model/ToolbarNotifier';
|
||||||
import { $msg } from './Messages';
|
import { $msg } from './Messages';
|
||||||
import DesignerKeyboard from './DesignerKeyboard';
|
import DesignerKeyboard from './DesignerKeyboard';
|
||||||
import LocalStorageManager from './LocalStorageManager';
|
import LocalStorageManager from './LocalStorageManager';
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
import { ElementClass, ElementPeer, Group } from '@wisemapping/web2d';
|
import { Group, Rect } from '@wisemapping/web2d';
|
||||||
import { $assert } from '@wisemapping/core-js';
|
import { $assert } from '@wisemapping/core-js';
|
||||||
import NodeModel from './model/NodeModel';
|
import NodeModel from './model/NodeModel';
|
||||||
import Canvas from './Canvas';
|
import Canvas from './Canvas';
|
||||||
@ -140,7 +140,7 @@ abstract class NodeGraph implements CanvasElement {
|
|||||||
|
|
||||||
abstract setCursor(type: string): void;
|
abstract setCursor(type: string): void;
|
||||||
|
|
||||||
abstract getOuterShape(): ElementClass<ElementPeer>;
|
abstract getOuterShape(): Rect;
|
||||||
|
|
||||||
isOnFocus(): boolean {
|
isOnFocus(): boolean {
|
||||||
return this._onFocus;
|
return this._onFocus;
|
||||||
@ -163,6 +163,10 @@ abstract class NodeGraph implements CanvasElement {
|
|||||||
const model = this.getModel();
|
const model = this.getModel();
|
||||||
return model.getPosition();
|
return model.getPosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isCentralTopic(): boolean {
|
||||||
|
return this.getModel().getType() === 'CentralTopic';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default NodeGraph;
|
export default NodeGraph;
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
import { $assert, $defined } from '@wisemapping/core-js';
|
import { $assert, $defined } from '@wisemapping/core-js';
|
||||||
|
|
||||||
import { Rect, Text, Group, ElementClass, ElementPeer } from '@wisemapping/web2d';
|
import { Text, Group, ElementClass, ElementPeer, Rect } from '@wisemapping/web2d';
|
||||||
|
|
||||||
import NodeGraph, { NodeOption } from './NodeGraph';
|
import NodeGraph, { NodeOption } from './NodeGraph';
|
||||||
import TopicFeatureFactory from './TopicFeature';
|
import TopicFeatureFactory from './TopicFeature';
|
||||||
@ -38,20 +38,18 @@ import LinkModel from './model/LinkModel';
|
|||||||
import SizeType from './SizeType';
|
import SizeType from './SizeType';
|
||||||
import FeatureModel from './model/FeatureModel';
|
import FeatureModel from './model/FeatureModel';
|
||||||
import PositionType from './PositionType';
|
import PositionType from './PositionType';
|
||||||
import LineTopicShape from './widget/LineTopicShape';
|
|
||||||
import Icon from './Icon';
|
import Icon from './Icon';
|
||||||
import { FontStyleType } from './FontStyleType';
|
import { FontStyleType } from './FontStyleType';
|
||||||
import { FontWeightType } from './FontWeightType';
|
import { FontWeightType } from './FontWeightType';
|
||||||
import DragTopic from './DragTopic';
|
import DragTopic from './DragTopic';
|
||||||
import ThemeFactory from './theme/ThemeFactory';
|
import ThemeFactory from './theme/ThemeFactory';
|
||||||
import NoneTopicShape from './widget/NoneTopicShape';
|
import TopicShape from './shape/TopicShape';
|
||||||
|
import TopicShapeFactory from './shape/TopicShapeFactory';
|
||||||
|
|
||||||
const ICON_SCALING_FACTOR = 1.3;
|
const ICON_SCALING_FACTOR = 1.3;
|
||||||
|
|
||||||
abstract class Topic extends NodeGraph {
|
abstract class Topic extends NodeGraph {
|
||||||
private _innerShape: LineTopicShape | Rect | LineTopicShape | NoneTopicShape | null;
|
private _innerShape: TopicShape | null;
|
||||||
|
|
||||||
private _innerShapeType: TopicShapeType | undefined;
|
|
||||||
|
|
||||||
private _relationships: Relationship[];
|
private _relationships: Relationship[];
|
||||||
|
|
||||||
@ -63,7 +61,7 @@ abstract class Topic extends NodeGraph {
|
|||||||
// eslint-disable-next-line no-use-before-define
|
// eslint-disable-next-line no-use-before-define
|
||||||
private _parent: Topic | null;
|
private _parent: Topic | null;
|
||||||
|
|
||||||
private _outerShape: ElementClass<ElementPeer> | undefined;
|
private _outerShape: Rect | undefined;
|
||||||
|
|
||||||
private _text: Text | undefined;
|
private _text: Text | undefined;
|
||||||
|
|
||||||
@ -80,7 +78,7 @@ abstract class Topic extends NodeGraph {
|
|||||||
this._relationships = [];
|
this._relationships = [];
|
||||||
this._isInWorkspace = false;
|
this._isInWorkspace = false;
|
||||||
this._innerShape = null;
|
this._innerShape = null;
|
||||||
this._buildTopicShape();
|
this.buildTopicShape();
|
||||||
|
|
||||||
// Position a topic ....
|
// Position a topic ....
|
||||||
const pos = model.getPosition();
|
const pos = model.getPosition();
|
||||||
@ -120,7 +118,7 @@ abstract class Topic extends NodeGraph {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected redrawShapeType() {
|
protected redrawShapeType() {
|
||||||
this._removeInnerShape();
|
this.removeInnerShape();
|
||||||
|
|
||||||
// Create a new one ...
|
// Create a new one ...
|
||||||
const innerShape = this.getInnerShape();
|
const innerShape = this.getInnerShape();
|
||||||
@ -130,7 +128,7 @@ abstract class Topic extends NodeGraph {
|
|||||||
this.setSize(size, true);
|
this.setSize(size, true);
|
||||||
|
|
||||||
const group = this.get2DElement();
|
const group = this.get2DElement();
|
||||||
group.append(innerShape);
|
innerShape.appendTo(group);
|
||||||
|
|
||||||
// Move text to the front ...
|
// Move text to the front ...
|
||||||
const text = this.getOrBuildTextShape();
|
const text = this.getOrBuildTextShape();
|
||||||
@ -167,19 +165,21 @@ abstract class Topic extends NodeGraph {
|
|||||||
return theme.getConnectionColor(this);
|
return theme.getConnectionColor(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
private _removeInnerShape(): ElementClass<ElementPeer> {
|
private removeInnerShape(): TopicShape {
|
||||||
const group = this.get2DElement();
|
const group = this.get2DElement();
|
||||||
const innerShape = this.getInnerShape();
|
const innerShape = this.getInnerShape();
|
||||||
|
|
||||||
group.removeChild(innerShape);
|
innerShape.removeFrom(group);
|
||||||
this._innerShape = null;
|
this._innerShape = null;
|
||||||
|
|
||||||
return innerShape;
|
return innerShape;
|
||||||
}
|
}
|
||||||
|
|
||||||
getInnerShape(): LineTopicShape | Rect | LineTopicShape | NoneTopicShape {
|
getInnerShape(): TopicShape {
|
||||||
if (!this._innerShape) {
|
if (!this._innerShape) {
|
||||||
// Create inner box.
|
// Create inner box.
|
||||||
this._innerShape = this._buildShape(this.getShapeType());
|
const shapeType = this.getShapeType();
|
||||||
|
this._innerShape = TopicShapeFactory.create(shapeType, this);
|
||||||
|
|
||||||
// Define the pointer ...
|
// Define the pointer ...
|
||||||
if (!this.isCentralTopic() && !this.isReadOnly()) {
|
if (!this.isCentralTopic() && !this.isReadOnly()) {
|
||||||
@ -191,39 +191,6 @@ abstract class Topic extends NodeGraph {
|
|||||||
return this._innerShape;
|
return this._innerShape;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected _buildShape(
|
|
||||||
shapeType: TopicShapeType,
|
|
||||||
): LineTopicShape | Rect | LineTopicShape | NoneTopicShape {
|
|
||||||
let result: LineTopicShape | Rect | LineTopicShape | NoneTopicShape;
|
|
||||||
switch (shapeType) {
|
|
||||||
case 'rectangle':
|
|
||||||
result = new Rect(0, { strokeWidth: 2 });
|
|
||||||
break;
|
|
||||||
case 'elipse':
|
|
||||||
result = new Rect(0.9, { strokeWidth: 2 });
|
|
||||||
break;
|
|
||||||
case 'rounded rectangle':
|
|
||||||
result = new Rect(0.6, { strokeWidth: 2 });
|
|
||||||
break;
|
|
||||||
case 'line':
|
|
||||||
result = new LineTopicShape(this, { strokeWidth: 2 });
|
|
||||||
break;
|
|
||||||
case 'none':
|
|
||||||
result = new NoneTopicShape();
|
|
||||||
break;
|
|
||||||
case 'image':
|
|
||||||
result = new LineTopicShape(this);
|
|
||||||
break;
|
|
||||||
default: {
|
|
||||||
const exhaustiveCheck: never = shapeType;
|
|
||||||
throw new Error(exhaustiveCheck);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this._innerShapeType = shapeType;
|
|
||||||
result.setPosition(0, 0);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
setCursor(type: string): void {
|
setCursor(type: string): void {
|
||||||
const innerShape = this.getInnerShape();
|
const innerShape = this.getInnerShape();
|
||||||
innerShape.setCursor(type);
|
innerShape.setCursor(type);
|
||||||
@ -235,9 +202,9 @@ abstract class Topic extends NodeGraph {
|
|||||||
textShape.setCursor(type);
|
textShape.setCursor(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
getOuterShape(): ElementClass<ElementPeer> {
|
getOuterShape(): Rect {
|
||||||
if (!this._outerShape) {
|
if (!this._outerShape) {
|
||||||
const rect = this._buildShape('rounded rectangle');
|
const rect = new Rect(0.6);
|
||||||
|
|
||||||
rect.setPosition(-3, -3);
|
rect.setPosition(-3, -3);
|
||||||
rect.setOpacity(0);
|
rect.setOpacity(0);
|
||||||
@ -249,7 +216,7 @@ abstract class Topic extends NodeGraph {
|
|||||||
|
|
||||||
getOrBuildTextShape(): Text {
|
getOrBuildTextShape(): Text {
|
||||||
if (!this._text) {
|
if (!this._text) {
|
||||||
this._text = this._buildTextShape(false);
|
this._text = this.buildTextShape(false);
|
||||||
|
|
||||||
// @todo: Review this. Get should not modify the state ....
|
// @todo: Review this. Get should not modify the state ....
|
||||||
const text = this.getText();
|
const text = this.getText();
|
||||||
@ -261,7 +228,7 @@ abstract class Topic extends NodeGraph {
|
|||||||
|
|
||||||
private getOrBuildIconGroup(): IconGroup {
|
private getOrBuildIconGroup(): IconGroup {
|
||||||
if (!this._iconsGroup) {
|
if (!this._iconsGroup) {
|
||||||
const iconGroup = this._buildIconGroup();
|
const iconGroup = this.buildIconGroup();
|
||||||
const group = this.get2DElement();
|
const group = this.get2DElement();
|
||||||
|
|
||||||
iconGroup.appendTo(group);
|
iconGroup.appendTo(group);
|
||||||
@ -274,7 +241,7 @@ abstract class Topic extends NodeGraph {
|
|||||||
return this._iconsGroup;
|
return this._iconsGroup;
|
||||||
}
|
}
|
||||||
|
|
||||||
private _buildIconGroup(): IconGroup {
|
private buildIconGroup(): IconGroup {
|
||||||
const model = this.getModel();
|
const model = this.getModel();
|
||||||
const theme = ThemeFactory.create(model);
|
const theme = ThemeFactory.create(model);
|
||||||
|
|
||||||
@ -319,7 +286,6 @@ abstract class Topic extends NodeGraph {
|
|||||||
return model.findFeatureById(id);
|
return model.findFeatureById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** */
|
|
||||||
removeFeature(featureModel: FeatureModel): void {
|
removeFeature(featureModel: FeatureModel): void {
|
||||||
$assert(featureModel, 'featureModel could not be null');
|
$assert(featureModel, 'featureModel could not be null');
|
||||||
|
|
||||||
@ -347,7 +313,7 @@ abstract class Topic extends NodeGraph {
|
|||||||
return this._relationships;
|
return this._relationships;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected _buildTextShape(readOnly: boolean): Text {
|
protected buildTextShape(readOnly: boolean): Text {
|
||||||
const result = new Text();
|
const result = new Text();
|
||||||
const family = this.getFontFamily();
|
const family = this.getFontFamily();
|
||||||
const size = this.getFontSize();
|
const size = this.getFontSize();
|
||||||
@ -493,7 +459,7 @@ abstract class Topic extends NodeGraph {
|
|||||||
return theme.getBorderColor(this);
|
return theme.getBorderColor(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
_buildTopicShape(): void {
|
private buildTopicShape(): void {
|
||||||
const groupAttributes = {
|
const groupAttributes = {
|
||||||
width: 100,
|
width: 100,
|
||||||
height: 100,
|
height: 100,
|
||||||
@ -510,7 +476,7 @@ abstract class Topic extends NodeGraph {
|
|||||||
|
|
||||||
// Add to the group ...
|
// Add to the group ...
|
||||||
group.append(outerShape);
|
group.append(outerShape);
|
||||||
group.append(innerShape);
|
innerShape.appendTo(group);
|
||||||
group.append(textShape);
|
group.append(textShape);
|
||||||
|
|
||||||
// Update figure size ...
|
// Update figure size ...
|
||||||
@ -525,13 +491,13 @@ abstract class Topic extends NodeGraph {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Register listeners ...
|
// Register listeners ...
|
||||||
this._registerDefaultListenersToElement(group, this);
|
this.registerDefaultListenersToElement(group, this);
|
||||||
|
|
||||||
// Set test id
|
// Set test id
|
||||||
group.setTestId(String(model.getId()));
|
group.setTestId(String(model.getId()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private _registerDefaultListenersToElement(elem: ElementClass<ElementPeer>, topic: Topic) {
|
private registerDefaultListenersToElement(elem: ElementClass<ElementPeer>, topic: Topic) {
|
||||||
const mouseOver = function mouseOver() {
|
const mouseOver = function mouseOver() {
|
||||||
if (topic.isMouseEventsEnabled()) {
|
if (topic.isMouseEventsEnabled()) {
|
||||||
topic.handleMouseOver();
|
topic.handleMouseOver();
|
||||||
@ -618,7 +584,7 @@ abstract class Topic extends NodeGraph {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Do some fancy animation ....
|
// Do some fancy animation ....
|
||||||
const elements = this._flatten2DElements(this);
|
const elements = this.flatten2DElements(this);
|
||||||
elements.forEach((elem) => {
|
elements.forEach((elem) => {
|
||||||
elem.setVisibility(!value, 250);
|
elem.setVisibility(!value, 250);
|
||||||
});
|
});
|
||||||
@ -935,7 +901,7 @@ abstract class Topic extends NodeGraph {
|
|||||||
innerShape.setSize(size.width, size.height);
|
innerShape.setSize(size.width, size.height);
|
||||||
|
|
||||||
// Update the figure position(ej: central topic must be centered) and children position.
|
// Update the figure position(ej: central topic must be centered) and children position.
|
||||||
this._updatePositionOnChangeSize(oldSize, size);
|
this.updatePositionOnChangeSize(oldSize, size);
|
||||||
|
|
||||||
if (hasSizeChanged) {
|
if (hasSizeChanged) {
|
||||||
EventBus.instance.fireEvent('topicResize', {
|
EventBus.instance.fireEvent('topicResize', {
|
||||||
@ -946,8 +912,6 @@ abstract class Topic extends NodeGraph {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract _updatePositionOnChangeSize(oldSize: SizeType, roundedSize: SizeType): void;
|
|
||||||
|
|
||||||
disconnect(workspace: Canvas): void {
|
disconnect(workspace: Canvas): void {
|
||||||
const outgoingLine = this.getOutgoingLine();
|
const outgoingLine = this.getOutgoingLine();
|
||||||
if (outgoingLine) {
|
if (outgoingLine) {
|
||||||
@ -1022,7 +986,7 @@ abstract class Topic extends NodeGraph {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Fire connection event ...
|
// Fire connection event ...
|
||||||
if (this.isInWorkspace()) {
|
if (this._isInWorkspace) {
|
||||||
EventBus.instance.fireEvent('topicConnected', {
|
EventBus.instance.fireEvent('topicConnected', {
|
||||||
parentNode: targetTopic.getModel(),
|
parentNode: targetTopic.getModel(),
|
||||||
childNode: this.getModel(),
|
childNode: this.getModel(),
|
||||||
@ -1070,7 +1034,7 @@ abstract class Topic extends NodeGraph {
|
|||||||
addToWorkspace(workspace: Canvas): void {
|
addToWorkspace(workspace: Canvas): void {
|
||||||
const elem = this.get2DElement();
|
const elem = this.get2DElement();
|
||||||
workspace.append(elem);
|
workspace.append(elem);
|
||||||
if (!this.isInWorkspace()) {
|
if (!this._isInWorkspace) {
|
||||||
if (!this.isCentralTopic()) {
|
if (!this.isCentralTopic()) {
|
||||||
EventBus.instance.fireEvent('topicAdded', this.getModel());
|
EventBus.instance.fireEvent('topicAdded', this.getModel());
|
||||||
}
|
}
|
||||||
@ -1087,10 +1051,6 @@ abstract class Topic extends NodeGraph {
|
|||||||
this.redraw();
|
this.redraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
isInWorkspace(): boolean {
|
|
||||||
return this._isInWorkspace;
|
|
||||||
}
|
|
||||||
|
|
||||||
createDragNode(layoutManager: LayoutManager): DragTopic {
|
createDragNode(layoutManager: LayoutManager): DragTopic {
|
||||||
const result = super.createDragNode(layoutManager);
|
const result = super.createDragNode(layoutManager);
|
||||||
|
|
||||||
@ -1143,7 +1103,7 @@ abstract class Topic extends NodeGraph {
|
|||||||
|
|
||||||
// Needs to update inner shape ...
|
// Needs to update inner shape ...
|
||||||
const shapeType = this.getShapeType();
|
const shapeType = this.getShapeType();
|
||||||
if (shapeType !== this._innerShapeType) {
|
if (shapeType !== this._innerShape?.getShapeType()) {
|
||||||
this.redrawShapeType();
|
this.redrawShapeType();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1222,7 +1182,7 @@ abstract class Topic extends NodeGraph {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private _flatten2DElements(topic: Topic): (Topic | Relationship | ConnectionLine)[] {
|
private flatten2DElements(topic: Topic): (Topic | Relationship | ConnectionLine)[] {
|
||||||
const result: (Topic | Relationship | ConnectionLine)[] = [];
|
const result: (Topic | Relationship | ConnectionLine)[] = [];
|
||||||
const children = topic.getChildren();
|
const children = topic.getChildren();
|
||||||
children.forEach((child) => {
|
children.forEach((child) => {
|
||||||
@ -1235,17 +1195,13 @@ abstract class Topic extends NodeGraph {
|
|||||||
result.push(...relationships);
|
result.push(...relationships);
|
||||||
|
|
||||||
if (!child.areChildrenShrunken()) {
|
if (!child.areChildrenShrunken()) {
|
||||||
const innerChilds = this._flatten2DElements(child);
|
const innerChilds = this.flatten2DElements(child);
|
||||||
result.push(...innerChilds);
|
result.push(...innerChilds);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract workoutOutgoingConnectionPoint(position: PositionType): PositionType;
|
|
||||||
|
|
||||||
abstract workoutIncomingConnectionPoint(position: PositionType): PositionType;
|
|
||||||
|
|
||||||
isChildTopic(childTopic: Topic): boolean {
|
isChildTopic(childTopic: Topic): boolean {
|
||||||
let result = this.getId() === childTopic.getId();
|
let result = this.getId() === childTopic.getId();
|
||||||
if (!result) {
|
if (!result) {
|
||||||
@ -1261,9 +1217,11 @@ abstract class Topic extends NodeGraph {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
isCentralTopic(): boolean {
|
abstract workoutOutgoingConnectionPoint(position: PositionType): PositionType;
|
||||||
return this.getModel().getType() === 'CentralTopic';
|
|
||||||
}
|
abstract workoutIncomingConnectionPoint(position: PositionType): PositionType;
|
||||||
|
|
||||||
|
protected abstract updatePositionOnChangeSize(oldSize: SizeType, roundedSize: SizeType): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Topic;
|
export default Topic;
|
||||||
|
76
packages/mindplot/src/components/shape/DefaultShape.ts
Normal file
76
packages/mindplot/src/components/shape/DefaultShape.ts
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* Copyright [2021] [wisemapping]
|
||||||
|
*
|
||||||
|
* Licensed under WiseMapping Public License, Version 1.0 (the "License").
|
||||||
|
* It is basically the Apache License, Version 2.0 (the "License") plus the
|
||||||
|
* "powered by wisemapping" text requirement on every single page;
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the license at
|
||||||
|
*
|
||||||
|
* http://www.wisemapping.org/license
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { ElementClass, ElementPeer, Group } from '@wisemapping/web2d';
|
||||||
|
import { TopicShapeType } from '../model/INodeModel';
|
||||||
|
import SizeType from '../SizeType';
|
||||||
|
import TopicShape from './TopicShape';
|
||||||
|
|
||||||
|
abstract class DefaultTopicShape<T extends ElementClass<ElementPeer>> implements TopicShape {
|
||||||
|
private _shape: T;
|
||||||
|
|
||||||
|
private _type: TopicShapeType;
|
||||||
|
|
||||||
|
constructor(shape: T, type: TopicShapeType) {
|
||||||
|
this._shape = shape;
|
||||||
|
this._type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
getShapeType(): TopicShapeType {
|
||||||
|
return this._type;
|
||||||
|
}
|
||||||
|
|
||||||
|
setStroke(width: number | null, style: string, color: string): void {
|
||||||
|
this._shape.setStroke(width, style, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
setOpacity(value: number): void {
|
||||||
|
this._shape.setOpacity(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
setFill(value: string, opacity?: number): void {
|
||||||
|
this._shape.setFill(value, opacity);
|
||||||
|
}
|
||||||
|
|
||||||
|
setVisibility(value: boolean, fade?: number): void {
|
||||||
|
this._shape.setVisibility(value, fade);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected getShape(): T {
|
||||||
|
return this._shape;
|
||||||
|
}
|
||||||
|
|
||||||
|
setCursor(value: string): void {
|
||||||
|
this._shape.setCursor(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
appendTo(group: Group): void {
|
||||||
|
group.append(this.getShape());
|
||||||
|
}
|
||||||
|
|
||||||
|
removeFrom(group: Group): void {
|
||||||
|
group.removeChild(this.getShape());
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract setSize(width: number, height: number): void;
|
||||||
|
|
||||||
|
abstract getSize(): SizeType | null;
|
||||||
|
|
||||||
|
abstract setPosition(x: number, y: number): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default DefaultTopicShape;
|
@ -15,23 +15,23 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
import { StraightLine, StyleAttributes } from '@wisemapping/web2d';
|
import { StraightLine } from '@wisemapping/web2d';
|
||||||
import SizeType from '../SizeType';
|
import SizeType from '../SizeType';
|
||||||
import Topic from '../Topic';
|
import DefaultTopicShape from './DefaultShape';
|
||||||
|
|
||||||
class LineTopicShape extends StraightLine {
|
class LineTopicShape extends DefaultTopicShape<StraightLine> {
|
||||||
private _size: SizeType | null;
|
private _size: SizeType | null;
|
||||||
|
|
||||||
constructor(topic: Topic, attributes?: StyleAttributes) {
|
constructor(borderColor: string) {
|
||||||
const stokeColor = topic.getBorderColor();
|
const shape = new StraightLine({ strokeWidth: 2, strokeColor: borderColor });
|
||||||
super({ ...attributes, strokeColor: stokeColor });
|
super(shape, 'image');
|
||||||
this._size = null;
|
this._size = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
setSize(width: number, height: number): void {
|
setSize(width: number, height: number): void {
|
||||||
this._size = { width, height };
|
this._size = { width, height };
|
||||||
super.setFrom(0, height);
|
this.getShape().setFrom(0, height);
|
||||||
super.setTo(width, height);
|
this.getShape().setTo(width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
getSize(): SizeType | null {
|
getSize(): SizeType | null {
|
71
packages/mindplot/src/components/shape/NoneTopicShape.ts
Normal file
71
packages/mindplot/src/components/shape/NoneTopicShape.ts
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* Copyright [2021] [wisemapping]
|
||||||
|
*
|
||||||
|
* Licensed under WiseMapping Public License, Version 1.0 (the "License").
|
||||||
|
* It is basically the Apache License, Version 2.0 (the "License") plus the
|
||||||
|
* "powered by wisemapping" text requirement on every single page;
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the license at
|
||||||
|
*
|
||||||
|
* http://www.wisemapping.org/license
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { TopicShapeType } from '../model/INodeModel';
|
||||||
|
import SizeType from '../SizeType';
|
||||||
|
import TopicShape from './TopicShape';
|
||||||
|
|
||||||
|
class NoneTopicShape implements TopicShape {
|
||||||
|
private _size: SizeType | undefined;
|
||||||
|
|
||||||
|
setSize(width: number, height: number): void {
|
||||||
|
// Ignore ...
|
||||||
|
this._size = { width, height };
|
||||||
|
}
|
||||||
|
|
||||||
|
getSize(): SizeType | null {
|
||||||
|
return this._size || null;
|
||||||
|
}
|
||||||
|
|
||||||
|
setPosition(): void {
|
||||||
|
// Ignore ...
|
||||||
|
}
|
||||||
|
|
||||||
|
setFill(): void {
|
||||||
|
// Ignore ...
|
||||||
|
}
|
||||||
|
|
||||||
|
setVisibility(): void {
|
||||||
|
// Ignore ...
|
||||||
|
}
|
||||||
|
|
||||||
|
setOpacity(): void {
|
||||||
|
// Ignore ...
|
||||||
|
}
|
||||||
|
|
||||||
|
setCursor(): void {
|
||||||
|
// Ignore ...
|
||||||
|
}
|
||||||
|
|
||||||
|
appendTo(): void {
|
||||||
|
// Ignore ...
|
||||||
|
}
|
||||||
|
|
||||||
|
removeFrom(): void {
|
||||||
|
// Ignore ...
|
||||||
|
}
|
||||||
|
|
||||||
|
setStroke(): void {
|
||||||
|
// Ignore ...
|
||||||
|
}
|
||||||
|
|
||||||
|
getShapeType(): TopicShapeType {
|
||||||
|
return 'none';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default NoneTopicShape;
|
@ -15,34 +15,27 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
import { StraightLine } from '@wisemapping/web2d';
|
import { Rect } from '@wisemapping/web2d';
|
||||||
import SizeType from '../SizeType';
|
import SizeType from '../SizeType';
|
||||||
|
import DefaultTopicShape from './DefaultShape';
|
||||||
|
|
||||||
class NoneTopicShape extends StraightLine {
|
class RectTopicShape extends DefaultTopicShape<Rect> {
|
||||||
private _size: SizeType | null;
|
constructor(arc: number, type: 'rectangle' | 'rounded rectangle' | 'elipse') {
|
||||||
|
const shape = new Rect(arc, { strokeWidth: 2 });
|
||||||
constructor() {
|
super(shape, type);
|
||||||
super({});
|
|
||||||
this._size = null;
|
|
||||||
this.setVisibility(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setSize(): void {
|
setSize(width: number, height: number): void {
|
||||||
super.setFrom(0, 0);
|
this.getShape().setSize(width, height);
|
||||||
super.setTo(0, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getSize(): SizeType | null {
|
getSize(): SizeType | null {
|
||||||
return this._size;
|
return this.getShape().getSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
setPosition() {
|
setPosition(x: number, y: number) {
|
||||||
// Overwrite behaviour ...
|
this.getShape().setPosition(x, y);
|
||||||
}
|
|
||||||
|
|
||||||
setFill() {
|
|
||||||
// Overwrite behaviour ...
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default NoneTopicShape;
|
export default RectTopicShape;
|
47
packages/mindplot/src/components/shape/TopicShape.ts
Normal file
47
packages/mindplot/src/components/shape/TopicShape.ts
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* Copyright [2021] [wisemapping]
|
||||||
|
*
|
||||||
|
* Licensed under WiseMapping Public License, Version 1.0 (the "License").
|
||||||
|
* It is basically the Apache License, Version 2.0 (the "License") plus the
|
||||||
|
* "powered by wisemapping" text requirement on every single page;
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the license at
|
||||||
|
*
|
||||||
|
* http://www.wisemapping.org/license
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { Group } from '@wisemapping/web2d';
|
||||||
|
import { TopicShapeType } from '../model/INodeModel';
|
||||||
|
import SizeType from '../SizeType';
|
||||||
|
|
||||||
|
interface TopicShape {
|
||||||
|
setSize(width: number, height: number): void;
|
||||||
|
|
||||||
|
getSize(): SizeType | null;
|
||||||
|
|
||||||
|
setPosition(x: number, y: number): void;
|
||||||
|
|
||||||
|
setFill(value: string, opacity?: number): void;
|
||||||
|
|
||||||
|
setVisibility(value: boolean, fade?: number): void;
|
||||||
|
|
||||||
|
setOpacity(value: number): void;
|
||||||
|
|
||||||
|
setCursor(value: string): void;
|
||||||
|
|
||||||
|
appendTo(group: Group): void;
|
||||||
|
|
||||||
|
removeFrom(group: Group): void;
|
||||||
|
|
||||||
|
setStroke(width: number | null, style: string | null, color: string): void;
|
||||||
|
|
||||||
|
getShapeType(): TopicShapeType;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default TopicShape;
|
58
packages/mindplot/src/components/shape/TopicShapeFactory.ts
Normal file
58
packages/mindplot/src/components/shape/TopicShapeFactory.ts
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* Copyright [2021] [wisemapping]
|
||||||
|
*
|
||||||
|
* Licensed under WiseMapping Public License, Version 1.0 (the "License").
|
||||||
|
* It is basically the Apache License, Version 2.0 (the "License") plus the
|
||||||
|
* "powered by wisemapping" text requirement on every single page;
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the license at
|
||||||
|
*
|
||||||
|
* http://www.wisemapping.org/license
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { TopicShapeType } from '../model/INodeModel';
|
||||||
|
import Topic from '../Topic';
|
||||||
|
import LineTopicShape from './LineTopicShape';
|
||||||
|
import NoneTopicShape from './NoneTopicShape';
|
||||||
|
import RectTopicShape from './RectTopicShape';
|
||||||
|
import TopicShape from './TopicShape';
|
||||||
|
|
||||||
|
class TopicShapeFactory {
|
||||||
|
static create(value: TopicShapeType, topic: Topic): TopicShape {
|
||||||
|
let result: TopicShape;
|
||||||
|
switch (value) {
|
||||||
|
case 'rectangle':
|
||||||
|
result = new RectTopicShape(0, value);
|
||||||
|
break;
|
||||||
|
case 'elipse':
|
||||||
|
result = new RectTopicShape(0.9, value);
|
||||||
|
break;
|
||||||
|
case 'rounded rectangle':
|
||||||
|
result = new RectTopicShape(0.6, value);
|
||||||
|
break;
|
||||||
|
case 'line':
|
||||||
|
result = new LineTopicShape(topic.getBorderColor());
|
||||||
|
break;
|
||||||
|
case 'none':
|
||||||
|
result = new NoneTopicShape();
|
||||||
|
break;
|
||||||
|
case 'image':
|
||||||
|
result = new NoneTopicShape();
|
||||||
|
break;
|
||||||
|
default: {
|
||||||
|
const exhaustiveCheck: never = value;
|
||||||
|
throw new Error(exhaustiveCheck);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.setPosition(0, 0);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default TopicShapeFactory;
|
@ -48,7 +48,7 @@ import WidgetManager from './components/WidgetManager';
|
|||||||
|
|
||||||
import { buildDesigner } from './components/DesignerBuilder';
|
import { buildDesigner } from './components/DesignerBuilder';
|
||||||
|
|
||||||
import { $notify } from './components/widget/ToolbarNotifier';
|
import { $notify } from './components/model/ToolbarNotifier';
|
||||||
import XMLSerializerFactory from './components/persistence/XMLSerializerFactory';
|
import XMLSerializerFactory from './components/persistence/XMLSerializerFactory';
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
|
@ -14,7 +14,7 @@ export default {
|
|||||||
fontSize: { control: { type: 'number', min: 0, max: 20, step: 2 } },
|
fontSize: { control: { type: 'number', min: 0, max: 20, step: 2 } },
|
||||||
fontColor: { control: 'color' },
|
fontColor: { control: 'color' },
|
||||||
shapeType: {
|
shapeType: {
|
||||||
options: ['rectangle', 'rounded rectangle', 'elipse', 'line'],
|
options: ['none', 'rectangle', 'rounded rectangle', 'elipse', 'line'],
|
||||||
control: { type: 'select' },
|
control: { type: 'select' },
|
||||||
},
|
},
|
||||||
text: { control: 'text' },
|
text: { control: 'text' },
|
||||||
@ -77,3 +77,9 @@ ShapeEllipse.args = {
|
|||||||
eicon: ['🌈'],
|
eicon: ['🌈'],
|
||||||
shapeType: 'elipse',
|
shapeType: 'elipse',
|
||||||
};
|
};
|
||||||
|
export const ShapeNone = Template.bind({});
|
||||||
|
ShapeNone.args = {
|
||||||
|
text: 'Shape None',
|
||||||
|
eicon: ['🌈'],
|
||||||
|
shapeType: 'none',
|
||||||
|
};
|
||||||
|
@ -7,6 +7,7 @@ import Canvas from '../../../src/components/Canvas';
|
|||||||
import ScreenManager from '../../../src/components/ScreenManager';
|
import ScreenManager from '../../../src/components/ScreenManager';
|
||||||
import EmojiIconModel from '../../../src/components/model/EmojiIconModel';
|
import EmojiIconModel from '../../../src/components/model/EmojiIconModel';
|
||||||
import TopicEventDispatcher from '../../../src/components/TopicEventDispatcher';
|
import TopicEventDispatcher from '../../../src/components/TopicEventDispatcher';
|
||||||
|
import { TopicShapeType } from '../../../src/components/model/INodeModel';
|
||||||
|
|
||||||
const registerRefreshHook = (topic: Topic) => {
|
const registerRefreshHook = (topic: Topic) => {
|
||||||
// Trigger a redraw after the node is added ...
|
// Trigger a redraw after the node is added ...
|
||||||
@ -28,7 +29,7 @@ export type TopicArgs = {
|
|||||||
borderColor?: string;
|
borderColor?: string;
|
||||||
fontSize?: number;
|
fontSize?: number;
|
||||||
fontColor?: string;
|
fontColor?: string;
|
||||||
shapeType?: 'rectangle' | 'rounded rectangle' | 'elipse' | 'line';
|
shapeType?: TopicShapeType;
|
||||||
text?: string;
|
text?: string;
|
||||||
noteText?: string;
|
noteText?: string;
|
||||||
linkText?: string;
|
linkText?: string;
|
||||||
|
Loading…
Reference in New Issue
Block a user