mirror of
https://github.com/projectstorm/react-diagrams.git
synced 2026-03-13 09:50:09 +08:00
Fixed #73
This commit is contained in:
@@ -7,42 +7,41 @@ export class BaseListener{
|
||||
}
|
||||
|
||||
export class BaseEntity<T extends BaseListener>{
|
||||
|
||||
|
||||
public listeners:{[s: string]: T};
|
||||
public id: string;
|
||||
public locked: boolean;
|
||||
|
||||
|
||||
constructor(id?:string){
|
||||
this.listeners = {};
|
||||
this.id = id || Toolkit.UID();
|
||||
this.locked = false;
|
||||
}
|
||||
|
||||
|
||||
getID(){
|
||||
return this.id;
|
||||
}
|
||||
|
||||
|
||||
clearListeners(){
|
||||
this.listeners = {};
|
||||
}
|
||||
|
||||
|
||||
public deSerialize(data){
|
||||
this.id = data.id;
|
||||
}
|
||||
|
||||
|
||||
public serialize(){
|
||||
return {
|
||||
id: this.id,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public iterateListeners(cb: (t: T) => any){
|
||||
|
||||
for (var i in this.listeners){
|
||||
cb(this.listeners[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public removeListener(listener: string){
|
||||
if (this.listeners[listener]){
|
||||
delete this.listeners[listener];
|
||||
@@ -50,17 +49,17 @@ export class BaseEntity<T extends BaseListener>{
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
public addListener(listener: T): string{
|
||||
var uid = Toolkit.UID();
|
||||
this.listeners[uid] = listener;
|
||||
return uid;
|
||||
}
|
||||
|
||||
|
||||
public isLocked(): boolean{
|
||||
return this.locked;
|
||||
}
|
||||
|
||||
|
||||
public setLocked(locked: boolean = true){
|
||||
this.locked = locked;
|
||||
this.iterateListeners((listener) => {
|
||||
|
||||
@@ -8,11 +8,11 @@ import * as _ from "lodash";
|
||||
* @author Dylan Vorster
|
||||
*/
|
||||
export interface DiagramEngineListener extends BaseListener{
|
||||
|
||||
|
||||
nodeFactoriesUpdated?(): void;
|
||||
|
||||
|
||||
linkFactoriesUpdated?(): void;
|
||||
|
||||
|
||||
repaintCanvas?(): void;
|
||||
}
|
||||
|
||||
@@ -20,15 +20,15 @@ export interface DiagramEngineListener extends BaseListener{
|
||||
* Passed as a parameter to the DiagramWidget
|
||||
*/
|
||||
export class DiagramEngine extends BaseEntity<DiagramEngineListener>{
|
||||
|
||||
|
||||
nodeFactories: {[s: string]:NodeWidgetFactory};
|
||||
linkFactories: {[s: string]:LinkWidgetFactory};
|
||||
instanceFactories: {[s: string]: AbstractInstanceFactory<BaseEntity<BaseListener>>};
|
||||
|
||||
|
||||
diagramModel: DiagramModel;
|
||||
canvas: Element;
|
||||
paintableWidgets: {};
|
||||
|
||||
|
||||
constructor(){
|
||||
super();
|
||||
this.diagramModel = new DiagramModel();
|
||||
@@ -38,21 +38,21 @@ export class DiagramEngine extends BaseEntity<DiagramEngineListener>{
|
||||
this.canvas = null;
|
||||
this.paintableWidgets = null;
|
||||
}
|
||||
|
||||
|
||||
repaintCanvas(){
|
||||
this.iterateListeners((listener) => {
|
||||
listener.repaintCanvas && listener.repaintCanvas();
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
clearRepaintEntities(){
|
||||
this.paintableWidgets = null;
|
||||
}
|
||||
|
||||
|
||||
enableRepaintEntities(entities: BaseModel<BaseModelListener>[]){
|
||||
this.paintableWidgets = {};
|
||||
entities.forEach((entity) => {
|
||||
|
||||
|
||||
//if a node is requested to repaint, add all of its links
|
||||
if (entity instanceof NodeModel){
|
||||
_.forEach(entity.getPorts(),(port) => {
|
||||
@@ -61,87 +61,94 @@ export class DiagramEngine extends BaseEntity<DiagramEngineListener>{
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
if (entity instanceof PointModel){
|
||||
this.paintableWidgets[entity.getLink().getID()] = true;
|
||||
}
|
||||
|
||||
|
||||
this.paintableWidgets[entity.getID()] = true;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Checks to see if a model is locked by running through
|
||||
* its parents to see if they are locked first
|
||||
*/
|
||||
isModelLocked(model: BaseEntity<BaseListener>){
|
||||
|
||||
|
||||
//always check the diagram model
|
||||
if (this.diagramModel.isLocked()){
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
//a point is locked, if its model is locked
|
||||
if (model instanceof PortModel){
|
||||
if (model.getParent().isLocked()){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
//a point is locked, if its model is locked
|
||||
if (model instanceof PointModel){
|
||||
if (model.getLink().isLocked()){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return model.isLocked();
|
||||
}
|
||||
|
||||
|
||||
canEntityRepaint(baseModel: BaseModel<BaseModelListener>){
|
||||
//no rules applied, allow repaint
|
||||
if(this.paintableWidgets === null){
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
return this.paintableWidgets[baseModel.getID()] !== undefined;
|
||||
}
|
||||
|
||||
|
||||
setCanvas(canvas: Element| null){
|
||||
this.canvas = canvas;
|
||||
}
|
||||
|
||||
|
||||
setDiagramModel(model: DiagramModel){
|
||||
this.diagramModel = model;
|
||||
}
|
||||
|
||||
|
||||
getDiagramModel(): DiagramModel{
|
||||
return this.diagramModel;
|
||||
}
|
||||
|
||||
|
||||
getNodeFactories(): {[s: string]:NodeWidgetFactory}{
|
||||
return this.nodeFactories;
|
||||
}
|
||||
|
||||
|
||||
getLinkFactories(): {[s: string]:LinkWidgetFactory}{
|
||||
return this.linkFactories;
|
||||
}
|
||||
|
||||
|
||||
getInstanceFactory(className: string): AbstractInstanceFactory<BaseEntity<BaseListener>>{
|
||||
return this.instanceFactories[className];
|
||||
}
|
||||
|
||||
|
||||
registerInstanceFactory(factory: AbstractInstanceFactory<BaseEntity<BaseListener>>){
|
||||
this.instanceFactories[factory.getName()] = factory;
|
||||
}
|
||||
|
||||
|
||||
registerNodeFactory(factory: NodeWidgetFactory){
|
||||
this.nodeFactories[factory.getType()] = factory;
|
||||
this.iterateListeners((listener) => {
|
||||
if(listener.nodeFactoriesUpdated) listener.nodeFactoriesUpdated();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
registerLinkFactory(factory: LinkWidgetFactory){
|
||||
this.linkFactories[factory.getType()] = factory;
|
||||
this.iterateListeners((listener) => {
|
||||
if(listener.linkFactoriesUpdated) listener.linkFactoriesUpdated();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
getFactoryForNode(node: NodeModel): NodeWidgetFactory | null{
|
||||
if (this.nodeFactories[node.getType()]){
|
||||
return this.nodeFactories[node.getType()];
|
||||
@@ -149,7 +156,7 @@ export class DiagramEngine extends BaseEntity<DiagramEngineListener>{
|
||||
console.log("cannot find widget factory for node of type: [" + node.getType()+"]");
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
getFactoryForLink(link: LinkModel): LinkWidgetFactory | null{
|
||||
if (this.linkFactories[link.getType()]){
|
||||
return this.linkFactories[link.getType()];
|
||||
@@ -157,7 +164,7 @@ export class DiagramEngine extends BaseEntity<DiagramEngineListener>{
|
||||
console.log("cannot find widget factory for link of type: [" + link.getType()+"]");
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
generateWidgetForLink(link: LinkModel): JSX.Element|null{
|
||||
var linkFactory = this.getFactoryForLink(link);
|
||||
if(!linkFactory){
|
||||
@@ -165,7 +172,7 @@ export class DiagramEngine extends BaseEntity<DiagramEngineListener>{
|
||||
}
|
||||
return linkFactory.generateReactWidget(this,link);
|
||||
}
|
||||
|
||||
|
||||
generateWidgetForNode(node: NodeModel): JSX.Element|null{
|
||||
var nodeFactory = this.getFactoryForNode(node);
|
||||
if(!nodeFactory){
|
||||
@@ -173,7 +180,7 @@ export class DiagramEngine extends BaseEntity<DiagramEngineListener>{
|
||||
}
|
||||
return nodeFactory.generateReactWidget(this,node);
|
||||
}
|
||||
|
||||
|
||||
getRelativeMousePoint(event): {x:number,y:number}{
|
||||
var point = this.getRelativePoint(event.clientX,event.clientY);
|
||||
return {
|
||||
@@ -186,7 +193,7 @@ export class DiagramEngine extends BaseEntity<DiagramEngineListener>{
|
||||
var canvasRect = this.canvas.getBoundingClientRect();
|
||||
return {x: x-canvasRect.left,y:y-canvasRect.top};
|
||||
}
|
||||
|
||||
|
||||
getNodePortElement(port: PortModel): any{
|
||||
var selector = this.canvas.querySelector('.port[data-name="' + port.getName() + '"][data-nodeid="' + port.getParent().getID()+'"]');
|
||||
if(selector === null){
|
||||
@@ -194,7 +201,7 @@ export class DiagramEngine extends BaseEntity<DiagramEngineListener>{
|
||||
}
|
||||
return selector;
|
||||
}
|
||||
|
||||
|
||||
getPortCenter(port: PortModel){
|
||||
var sourceElement = this.getNodePortElement(port);
|
||||
var sourceRect = sourceElement.getBoundingClientRect();
|
||||
@@ -206,5 +213,5 @@ export class DiagramEngine extends BaseEntity<DiagramEngineListener>{
|
||||
y: ((sourceElement.offsetHeight/2)+rel.y/(this.diagramModel.getZoomLevel()/100.0)) - this.diagramModel.getOffsetY()
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -33,8 +33,10 @@ export class DefaultNodeWidget extends React.Component<DefaultNodeProps, Default
|
||||
<div className="title">
|
||||
<div className="name">{this.props.node.name}</div>
|
||||
<div className="fa fa-close" onClick={() => {
|
||||
this.props.node.remove();
|
||||
this.props.diagramEngine.repaintCanvas();
|
||||
if(!this.props.diagramEngine.isModelLocked(this.props.node)){
|
||||
this.props.node.remove();
|
||||
this.props.diagramEngine.repaintCanvas();
|
||||
}
|
||||
}} />
|
||||
</div>
|
||||
<div className="ports">
|
||||
|
||||
@@ -274,7 +274,7 @@ export class DiagramWidget extends React.Component<DiagramProps, DiagramState> {
|
||||
return;
|
||||
}
|
||||
|
||||
if (element && element.model instanceof PortModel) {
|
||||
if (element && element.model instanceof PortModel && !diagramEngine.isModelLocked(element.model)) {
|
||||
linkConnected = true;
|
||||
let link = model.model.getLink();
|
||||
link.setTargetPort(element.model);
|
||||
@@ -369,18 +369,23 @@ export class DiagramWidget extends React.Component<DiagramProps, DiagramState> {
|
||||
|
||||
//its a port element, we want to drag a link
|
||||
else if (model.model instanceof PortModel) {
|
||||
var relative = diagramEngine.getRelativeMousePoint(event);
|
||||
var link = new LinkModel();
|
||||
link.setSourcePort(model.model);
|
||||
if(!this.props.diagramEngine.isModelLocked(model.model)) {
|
||||
|
||||
link.getFirstPoint().updateLocation(relative)
|
||||
link.getLastPoint().updateLocation(relative);
|
||||
var relative = diagramEngine.getRelativeMousePoint(event);
|
||||
var link = new LinkModel();
|
||||
link.setSourcePort(model.model);
|
||||
|
||||
diagramModel.clearSelection();
|
||||
link.getLastPoint().setSelected(true);
|
||||
diagramModel.addLink(link);
|
||||
link.getFirstPoint().updateLocation(relative)
|
||||
link.getLastPoint().updateLocation(relative);
|
||||
|
||||
this.startFiringAction(new MoveItemsAction(event.clientX, event.clientY, diagramEngine));
|
||||
diagramModel.clearSelection();
|
||||
link.getLastPoint().setSelected(true);
|
||||
diagramModel.addLink(link);
|
||||
|
||||
this.startFiringAction(new MoveItemsAction(event.clientX, event.clientY, diagramEngine));
|
||||
}else{
|
||||
diagramModel.clearSelection();
|
||||
}
|
||||
}
|
||||
//its some or other element, probably want to move it
|
||||
else {
|
||||
|
||||
Reference in New Issue
Block a user