Skip to content

Commit 556b1eb

Browse files
committed
#36 handling parent child relationship and moving logic out of meta-diagram
1 parent e216cf9 commit 556b1eb

File tree

10 files changed

+190
-65
lines changed

10 files changed

+190
-65
lines changed

dev_setup.sh

-20
This file was deleted.

installation.sh

+84
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#!/bin/bash
2+
3+
4+
#!/bin/bash
5+
set -e
6+
7+
INSTALL=false
8+
UPDATE=false
9+
10+
function parse() {
11+
for arg in "$@"; do # transform long options to short ones
12+
shift
13+
case "$arg" in
14+
"--install") set -- "$@" "-n" ;;
15+
"--update") set -- "$@" "-v" ;;
16+
*) set -- "$@" "$arg"
17+
esac
18+
done
19+
20+
while getopts "iu" optname
21+
do
22+
case "$optname" in
23+
"i") INSTALL=true ;;
24+
"u") UPDATE=true ;;
25+
esac
26+
done
27+
shift "$((OPTIND-1))" # shift out all the already processed options
28+
}
29+
30+
31+
parse "$@"
32+
33+
echo "=== Install / Update script for PsyNeuLinkViewer and meta-diagram ==="
34+
#echo "Install is"
35+
#echo $INSTALL
36+
#echo "Update is"
37+
#echo $UPDATE
38+
39+
40+
41+
if [ "$INSTALL" = true ]; then
42+
echo " ### re-installing all the packages"
43+
npm -g install yalc
44+
PSYVIEW=`pwd`
45+
46+
if [ -d '../meta-diagram' ]; then
47+
cd ../meta-diagram;
48+
yarn && yarn run build:dev && yalc push --changed
49+
cd $PSYVIEW
50+
else
51+
cd ../
52+
git clone https://github.com/metacell/meta-diagram
53+
cd meta-diagram
54+
yarn && yarn run build:dev && yalc push --changed
55+
cd $PSYVIEW
56+
fi
57+
58+
yalc add @metacell/meta-diagram
59+
rm -rf node_modules/
60+
yarn
61+
yarn run start
62+
elif [ "$UPDATE" = true ]; then
63+
echo " ### Updating meta-diagram"
64+
yarn remove @metacell/meta-diagram
65+
PSYVIEW=`pwd`
66+
67+
if [ -d '../meta-diagram' ]; then
68+
cd ../meta-diagram;
69+
yarn && yarn run build:dev && yalc push --changed
70+
cd $PSYVIEW
71+
else
72+
cd ../
73+
git clone https://github.com/metacell/meta-diagram
74+
cd meta-diagram
75+
yarn && yarn run build:dev && yalc push --changed
76+
cd $PSYVIEW
77+
fi
78+
yalc add @metacell/meta-diagram
79+
yarn
80+
yarn run start
81+
else
82+
echo " - The script can be run in update (-u / --update) or install (-i / --install) mode."
83+
echo " - please use the option desidered to run the script again."
84+
fi

src/App.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { ThemeProvider } from '@mui/material/styles';
33
import CssBaseline from '@mui/material/CssBaseline';
44
import theme from './theme';
55
import Layout from './components/common/Layout';
6-
import Loader from './components/common/Loader';
6+
// import Loader from './components/common/Loader';
77

88
function App() {
99
return (

src/components/Main.js

+49-9
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
import React from 'react';
2-
// import MechanismNode from '../model/nodes/mechanism/MechanismNode';
32
import { withStyles } from '@mui/styles';
43
import { PNLClasses } from '../constants';
5-
import { buildModel } from '../model/utils';
64
import BG from "../assets/svg/bg-dotted.svg";
75
import ModelInterpreter from '../model/Interpreter';
86
import Composition from './views/compositions/Composition';
97
import GenericMechanism from './views/mechanisms/GenericMechanism';
10-
import MetaDiagram, { ComponentsMap } from "@metacell/meta-diagram";
8+
import MetaDiagram, { CallbackTypes, ComponentsMap, EventTypes, Position } from "@metacell/meta-diagram";
119
import CustomLinkWidget from './views/projections/CustomLinkWidget';
1210
const mockModel = require('../resources/model').mockModel;
1311

@@ -24,33 +22,75 @@ const styles = () => ({
2422
class Main extends React.Component {
2523
constructor (props) {
2624
super(props);
25+
// interpreter and model stored in the state will be moved to redux later
2726
this.state = {};
27+
28+
this.mousePos = {x: 0, y: 0};
2829
this.interpreter = new ModelInterpreter(mockModel);
2930
this.model = this.interpreter.getModel();
3031
this.metaModel = this.interpreter.getMetaModel();
32+
this.modelMap = this.interpreter.getModelElementsMap();
3133
this.componentsMap = new ComponentsMap(new Map(), new Map());
32-
3334
this.componentsMap.nodes.set(PNLClasses.COMPOSITION, Composition);
3435
this.componentsMap.nodes.set(PNLClasses.MECHANISM, GenericMechanism);
3536
this.componentsMap.links.set(PNLClasses.PROJECTION, CustomLinkWidget);
3637

38+
// functions bond to this scope
3739
this.metaCallback = this.metaCallback.bind(this);
40+
this.handlePreUpdates = this.handlePreUpdates.bind(this);
41+
this.handlePostUpdates = this.handlePostUpdates.bind(this);
42+
this.mouseMoveCallback = this.mouseMoveCallback.bind(this);
43+
}
44+
45+
calculateDelta(metaNode, metaNodeModel) {
46+
let oldPosition = new Position(metaNode.position.x, metaNode.position.y);
47+
let newPosition = new Position(metaNodeModel.position.x, metaNodeModel.position.y);
48+
return oldPosition.sub(newPosition)
3849
}
3950

40-
shouldComponentUpdate() {
41-
return false;
51+
handlePostUpdates(event) {
52+
switch(event.function) {
53+
case CallbackTypes.POSITION_CHANGED: {
54+
this.interpreter.updateModel(event.entity);
55+
break;
56+
}
57+
default: {
58+
console.log('Function callback type not yet implemented ' + event.function);
59+
break;
60+
}
61+
}
62+
}
63+
64+
handlePreUpdates(event) {
65+
console.log('preUpdates not yet implemented.');
4266
}
4367

4468
metaCallback(event) {
45-
console.log('metacallback');
46-
console.log(event);
69+
switch (event.metaEvent) {
70+
case EventTypes.PRE_UPDATE: {
71+
this.handlePreUpdates(event);
72+
break;
73+
}
74+
case EventTypes.POST_UPDATE: {
75+
this.handlePostUpdates(event);
76+
break;
77+
}
78+
default: {
79+
throw Error('Unknown event type received from meta-diagram.');
80+
}
81+
}
82+
}
83+
84+
mouseMoveCallback(event) {
85+
this.mousePos.x = event.clientX;
86+
this.mousePos.y = event.clientY;
4787
}
4888

4989
render() {
5090
const { classes } = this.props;
5191

5292
return (
53-
<div className={classes.root}>
93+
<div className={classes.root} onMouseMove={this.mouseMoveCallback}>
5494
<MetaDiagram
5595
metaCallback={this.metaCallback}
5696
componentsMap={this.componentsMap}

src/components/views/compositions/Composition.js

+1
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ class Composition extends React.Component {
106106
this.setState({ x: d.x, y: d.y });
107107
}}
108108
onResizeStop={(e, direction, ref, delta, position) => {
109+
this.props.model.updateSize(ref.style.width, ref.style.height);
109110
this.setState({
110111
width: ref.style.width,
111112
height: ref.style.height,

src/components/views/mechanisms/MechSimple.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class MechSimple extends React.Component {
3636
);
3737
default:
3838
// TODO: what to do with other ports?
39-
// console.log('different port found' + port.getName() + ' ' + port.getType());
39+
return (<></>);
4040
}
4141
})}
4242
</Box>

src/model/Interpreter.ts

+40-13
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,27 @@ export default class ModelInterpreter {
1010
jsonModel: Object;
1111
modelMap: { [key: string]: Map<String, CompositionNode|MechanismNode|ProjectionLink|any> };
1212
pnlModel: { [key: string]: Array<CompositionNode|MechanismNode|ProjectionLink|any> };
13+
metaModelMap: { [key: string]: Map<String, CompositionNode|MechanismNode|ProjectionLink|any> };
1314
metaModel: { [key: string]: Array<MetaNode|MetaLink> };
1415
nodeIdsMap: Map<any, any>;
1516
linkIdsMap: Map<any, any>;
1617

1718
constructor(model: any) {
1819
this.modelMap = {
19-
'nodes': new Map(),
20-
'links': new Map()
20+
[PNLClasses.COMPOSITION]: new Map(),
21+
[PNLClasses.MECHANISM]: new Map(),
22+
[PNLClasses.PROJECTION]: new Map(),
2123
};
2224
this.pnlModel = {
2325
[PNLClasses.COMPOSITION]: [],
2426
[PNLClasses.MECHANISM]: [],
2527
[PNLClasses.PROJECTION]: [],
2628
};
29+
this.metaModelMap = {
30+
[PNLClasses.COMPOSITION]: new Map(),
31+
[PNLClasses.MECHANISM]: new Map(),
32+
[PNLClasses.PROJECTION]: new Map(),
33+
};
2734
this.metaModel = {
2835
[PNLClasses.COMPOSITION]: [],
2936
[PNLClasses.MECHANISM]: [],
@@ -48,10 +55,6 @@ export default class ModelInterpreter {
4855
return this.pnlModel;
4956
}
5057

51-
updateModel(newModel: any) {
52-
this.jsonModel = this._convertModel(newModel);
53-
}
54-
5558
getModel() {
5659
return this.jsonModel;
5760
}
@@ -60,12 +63,29 @@ export default class ModelInterpreter {
6063
this.metaModel[PNLClasses.COMPOSITION] = this.pnlModel[PNLClasses.COMPOSITION].map(
6164
(item:CompositionNode) => item.getMetaNode()
6265
);
66+
this.metaModelMap[PNLClasses.COMPOSITION] = new Map(
67+
this.metaModel[PNLClasses.COMPOSITION].map(object => {
68+
return [object.getId(), object];
69+
})
70+
);
71+
6372
this.metaModel[PNLClasses.MECHANISM] = this.pnlModel[PNLClasses.MECHANISM].map(
6473
(item:MechanismNode) => item.getMetaNode()
6574
);
75+
this.metaModelMap[PNLClasses.MECHANISM] = new Map(
76+
this.metaModel[PNLClasses.MECHANISM].map(object => {
77+
return [object.getId(), object];
78+
})
79+
);
80+
6681
this.metaModel[PNLClasses.PROJECTION] = this.pnlModel[PNLClasses.PROJECTION].map(
6782
(item:ProjectionLink) => item.getMetaLink()
6883
);
84+
this.metaModelMap[PNLClasses.PROJECTION] = new Map(
85+
this.metaModel[PNLClasses.PROJECTION].map(object => {
86+
return [object.getId(), object];
87+
})
88+
);
6989
}
7090

7191
getMetaModel() {
@@ -80,6 +100,13 @@ export default class ModelInterpreter {
80100
return this.modelMap;
81101
}
82102

103+
updateModel(item: MetaNode|MetaLink) {
104+
// if (this.metaModelMap[item.getShape()].has(item.getId())) {
105+
console.log('this is where I update the node');
106+
console.log(item);
107+
// }
108+
}
109+
83110
parseNodePorts(name: string, type: string): { [key: string]: any } {
84111
let ports: { [key: string]: any[] } = {
85112
[PortTypes.INPUT_PORT]: [],
@@ -136,7 +163,7 @@ export default class ModelInterpreter {
136163
}
137164
extra['isExpanded'] = false;
138165
newNode = new CompositionNode(item?.name, parent, ports, extra);
139-
modelMap['nodes'].set(newNode.getName(), newNode);
166+
modelMap[PNLClasses.COMPOSITION].set(newNode.getName(), newNode);
140167
// temp array to host all the nested compositions
141168
let childrenCompositions: Array<any> = [];
142169

@@ -147,7 +174,7 @@ export default class ModelInterpreter {
147174
// we park for now nested compositions
148175
childrenCompositions.push(child)
149176
} else {
150-
newChild = this.castMechanism(child, newNode, this.modelMap);
177+
newChild = this.castMechanism(child, newNode, modelMap);
151178
newChild.setParent(newNode);
152179
newNode.addChild(newChild);
153180
}
@@ -159,7 +186,7 @@ export default class ModelInterpreter {
159186
// Now da we have all the mechanisms in the idsMap we continue with the compositions
160187
childrenCompositions.forEach((child: any) => {
161188
let newChild = undefined;
162-
newChild = this.nestedComposition(child, newNode, this.modelMap);
189+
newChild = this.nestedComposition(child, newNode, modelMap);
163190
newNode.addChild(newChild);
164191

165192
if (newChild && !this.nodeIdsMap.has(child?._gvid)) {
@@ -170,7 +197,7 @@ export default class ModelInterpreter {
170197
item.edges.forEach((edge: any) => {
171198
let tail = this.nodeIdsMap.get(edge.tail);
172199
let head = this.nodeIdsMap.get(edge.head);
173-
let newChild = this.castEdge(edge, tail, head, newNode, this.modelMap);
200+
let newChild = this.castEdge(edge, tail, head, newNode, modelMap);
174201
if (newChild && !this.linkIdsMap.has(edge?._gvid)) {
175202
this.linkIdsMap.set(edge?._gvid, newChild);
176203
}
@@ -209,7 +236,7 @@ export default class ModelInterpreter {
209236
}
210237
extra['isExpanded'] = false;
211238
newNode = new CompositionNode(item?.name, parent, ports, extra);
212-
modelMap['nodes'].set(newNode.getName(), newNode);
239+
modelMap[PNLClasses.COMPOSITION].set(newNode.getName(), newNode);
213240

214241
// Iterates nodes of the nested composition to fill the children map/array
215242
item.nodes.forEach((id: any) => {
@@ -240,7 +267,7 @@ export default class ModelInterpreter {
240267
}
241268
};
242269
newNode = new MechanismNode(item?.name, parent, ports, extra,);
243-
modelMap['nodes'].set(newNode.getName(), newNode);
270+
modelMap[PNLClasses.MECHANISM].set(newNode.getName(), newNode);
244271
this.pnlModel[PNLClasses.MECHANISM].push(newNode);
245272
return newNode;
246273
}
@@ -267,7 +294,7 @@ export default class ModelInterpreter {
267294
false,
268295
extra
269296
);
270-
modelMap['links'].set(newNode.getName(), newNode);
297+
modelMap[PNLClasses.PROJECTION].set(newNode.getName(), newNode);
271298
this.pnlModel[PNLClasses.PROJECTION].push(newNode);
272299
return newNode;
273300
}

src/model/links/ProjectionLink.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,15 @@ export default class ProjectionLink implements IMetaLinkConverter {
6464
return new MetaLink(
6565
this.name,
6666
this.name,
67-
'projection',
67+
PNLClasses.PROJECTION,
6868
this.sender,
6969
this.senderPort,
7070
this.receiver,
7171
this.receiverPort,
7272
'undefined',
7373
new Map(
7474
Object.entries({
75-
color: 'rgb(255,192,0)'
75+
pnlClass: PNLClasses.PROJECTION,
7676
})
7777
)
7878
);

0 commit comments

Comments
 (0)