webgme-dss
Version:
Design Studio for Dynamic Systems with Modelica as backend
138 lines (121 loc) • 4.64 kB
JSX
import React, {Component} from 'react';
import PropTypes from 'prop-types';
import ZLEVELS from '../../gme/utils/zLevels';
export default class CanvasItemPort extends Component {
static propTypes = {
gmeClient: PropTypes.object.isRequired,
connectionManager: PropTypes.object.isRequired,
activeNode: PropTypes.string.isRequired,
contextNode: PropTypes.string.isRequired,
position: PropTypes.object,
dimensions: PropTypes.object,
hidden: PropTypes.bool.isRequired,
absolutePosition: PropTypes.object.isRequired,
validTypes: PropTypes.object.isRequired,
};
static defaultProps = {
position: {
x: 0,
y: 0,
},
dimensions: {
x: 20,
y: 20,
},
};
state = {
freeze: false,
mouseOver: false,
};
onClick = (event) => {
const self = this;
const {
connectionManager, activeNode, absolutePosition, dimensions, validTypes,
} = this.props;
event.stopPropagation();
event.preventDefault();
if (connectionManager.isConnecting) {
const connectionParams = connectionManager.endConnection();
if (connectionParams.source !== activeNode) {
this.createConnection(connectionParams.source, connectionParams.type);
}
this.setState({freeze: false});
} else {
connectionManager.startConnection(activeNode, validTypes.src, {
x: absolutePosition.x + (dimensions.x / 2),
y: absolutePosition.y + (dimensions.y / 2),
}, () => {
self.setState({freeze: false});
});
this.setState({freeze: true});
}
};
onMouseEnter = () => {
this.setState({mouseOver: true});
};
onMouseLeave = () => {
this.setState({mouseOver: false});
};
createConnection = (source, type) => {
const {gmeClient, activeNode, contextNode} = this.props;
gmeClient.startTransaction('creating a connection');
const connectionId = gmeClient.createNode({
baseId: type,
parentId: contextNode,
});
gmeClient.setPointer(connectionId, 'src', source);
gmeClient.setPointer(connectionId, 'dst', activeNode);
gmeClient.completeTransaction('connection created');
};
render() {
const {
hidden, position, dimensions, validTypes, connectionManager,
} = this.props;
const {freeze, mouseOver} = this.state;
let background;
if (freeze) {
background = 'lightblue';
} else {
if (hidden) {
return null;
}
if (connectionManager.isConnecting) {
// It's connecting - is it a valid destination?
if (validTypes.dst !== connectionManager.type) {
return null;
}
background = 'lightgreen';
} else if (validTypes.src === undefined) {
// It's NOT connecting - is it a valid source?
return null;
} else if (mouseOver) {
background = 'lightgreen';
}
}
const left = mouseOver ? `${position ? position.x - 5 : 0}px` : `${position ? position.x : 0}px`;
const top = mouseOver ? `${position ? position.y - 5 : 0}px` : `${position ? position.y : 0}px`;
const width = mouseOver ? `${dimensions ? dimensions.x + 8 : 13}px` : `${dimensions ? dimensions.x : 5}px`;
const height = mouseOver ? `${dimensions ? dimensions.y + 8 : 13}px` : `${dimensions ? dimensions.y : 5}px`;
const border = mouseOver ? '2px solid #000000' : '1px solid #000000';
return (
<div
role="presentation"
style={{
position: 'absolute',
backgroundColor: background,
opacity: 0.5,
left,
top,
width,
height,
border: background ? border : null,
zIndex: ZLEVELS.port,
}}
onMouseEnter={this.onMouseEnter}
onMouseLeave={this.onMouseLeave}
onClick={this.onClick}
onKeyPress={() => {
}}
/>);
}
}