wisemapping-frontend/packages/mindplot/src/components/MainTopic.ts

158 lines
5.0 KiB
TypeScript
Raw Normal View History

/*
2021-12-25 23:39:34 +01:00
* 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.
*/
2021-12-04 01:11:17 +01:00
import { $assert, $defined } from '@wisemapping/core-js';
2022-02-06 06:28:35 +01:00
import { Point, Group, ElementClass } from '@wisemapping/web2d';
import Topic from './Topic';
import { TopicShape } from './model/INodeModel';
import Shape from './util/Shape';
2022-02-06 06:28:35 +01:00
import NodeModel from './model/NodeModel';
import Workspace from './Workspace';
import SizeType from './SizeType';
2021-12-05 00:39:20 +01:00
class MainTopic extends Topic {
2022-02-06 06:28:35 +01:00
private INNER_RECT_ATTRIBUTES: { stroke: string; };
2022-02-10 04:26:44 +01:00
2022-02-06 06:28:35 +01:00
constructor(model: NodeModel, options) {
2021-12-05 00:39:20 +01:00
super(model, options);
this.INNER_RECT_ATTRIBUTES = { stroke: '0.5 solid #009900' };
}
2022-02-06 06:28:35 +01:00
_buildDragShape(): ElementClass {
2021-12-05 00:39:20 +01:00
const innerShape = this._buildShape(this.INNER_RECT_ATTRIBUTES, this.getShapeType());
const size = this.getSize();
innerShape.setSize(size.width, size.height);
innerShape.setPosition(0, 0);
innerShape.setOpacity(0.5);
innerShape.setCursor('default');
innerShape.setVisibility(true);
const brColor = this.getBorderColor();
innerShape.setAttribute('strokeColor', brColor);
const bgColor = this.getBackgroundColor();
innerShape.setAttribute('fillColor', bgColor);
// Create group ...
const groupAttributes = {
width: 100,
height: 100,
coordSizeWidth: 100,
coordSizeHeight: 100,
};
2021-12-19 17:31:29 +01:00
const group = new Group(groupAttributes);
2021-12-05 00:39:20 +01:00
group.append(innerShape);
// Add Text ...
if (this.getShapeType() !== TopicShape.IMAGE) {
const textShape = this._buildTextShape(true);
const text = this.getText();
textShape.setText(text);
textShape.setOpacity(0.5);
2022-02-24 02:52:12 +01:00
// Copy text position of the topic element ...
const textPosition = this.getTextShape().getPosition();
textShape.setPosition(textPosition.x, textPosition.y);
2021-12-05 00:39:20 +01:00
group.append(textShape);
}
return group;
}
2022-02-06 06:28:35 +01:00
updateTopicShape(targetTopic: Topic) {
2021-12-05 00:39:20 +01:00
// Change figure based on the connected topic ...
const model = this.getModel();
let shapeType = model.getShapeType();
if (!targetTopic.isCentralTopic()) {
if (!$defined(shapeType)) {
2021-12-05 00:39:20 +01:00
// Get the real shape type ...
shapeType = this.getShapeType();
2021-12-05 00:39:20 +01:00
this._setShapeType(shapeType, false);
}
2021-12-05 00:39:20 +01:00
}
}
2022-02-06 06:28:35 +01:00
disconnect(workspace: Workspace) {
2021-12-05 18:25:16 +01:00
super.disconnect(workspace);
2021-12-05 00:39:20 +01:00
const model = this.getModel();
let shapeType = model.getShapeType();
if (!$defined(shapeType)) {
// Change figure ...
shapeType = this.getShapeType();
this._setShapeType(TopicShape.ROUNDED_RECT, false);
}
const innerShape = this.getInnerShape();
innerShape.setVisibility(true);
}
2022-02-06 06:28:35 +01:00
_updatePositionOnChangeSize(oldSize: SizeType, newSize: SizeType) {
2021-12-05 00:39:20 +01:00
const xOffset = Math.round((newSize.width - oldSize.width) / 2);
const pos = this.getPosition();
if ($defined(pos)) {
if (pos.x > 0) {
pos.x += xOffset;
} else {
pos.x -= xOffset;
}
2021-12-05 00:39:20 +01:00
this.setPosition(pos);
}
}
2022-02-06 06:28:35 +01:00
workoutIncomingConnectionPoint(sourcePosition: Point) {
2021-12-05 00:39:20 +01:00
return Shape.workoutIncomingConnectionPoint(this, sourcePosition);
}
2022-02-06 06:28:35 +01:00
workoutOutgoingConnectionPoint(targetPosition: Point) {
2021-12-05 00:39:20 +01:00
$assert(targetPosition, 'targetPoint can not be null');
const pos = this.getPosition();
const isAtRight = Shape.isAtRight(targetPosition, pos);
const size = this.getSize();
2022-02-06 06:28:35 +01:00
let result: Point;
2021-12-05 00:39:20 +01:00
if (this.getShapeType() === TopicShape.LINE) {
2021-12-19 17:31:29 +01:00
result = new Point();
2022-02-06 06:28:35 +01:00
const groupPosition = this.get2DElement().getPosition();
2021-12-05 00:39:20 +01:00
const innerShareSize = this.getInnerShape().getSize();
if (innerShareSize) {
const magicCorrectionNumber = 0.3;
if (!isAtRight) {
result.x = groupPosition.x + innerShareSize.width - magicCorrectionNumber;
} else {
2021-12-05 00:39:20 +01:00
result.x = groupPosition.x + magicCorrectionNumber;
}
2021-12-05 00:39:20 +01:00
result.y = groupPosition.y + innerShareSize.height;
} else {
2021-12-05 00:39:20 +01:00
// Hack: When the size has not being defined. This is because the node has not being added.
// Try to do our best ...
if (!isAtRight) {
result.x = pos.x + size.width / 2;
} else {
result.x = pos.x - size.width / 2;
}
result.y = pos.y + size.height / 2;
}
2021-12-05 00:39:20 +01:00
} else {
2022-02-06 06:28:35 +01:00
result = Shape.calculateRectConnectionPoint(pos, size, isAtRight);
2021-12-05 00:39:20 +01:00
}
return result;
}
}
export default MainTopic;