Skip to content

Commit 3fe62df

Browse files
author
rodriguez-facundo
committed
#135 Use multiple flexlayout configurations and switch between them
1 parent 66fd8d4 commit 3fe62df

15 files changed

Lines changed: 171 additions & 117 deletions

File tree

webapp/components/definition/cellRules/NetPyNECellRules.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ export default class NetPyNECellRules extends React.Component {
308308
this.setState({ selectedMechanism: newMechanismName });
309309
}
310310

311-
if (Object.keys(this.state.value).length === 0) {
311+
if (this.state.value && Object.keys(this.state.value).length === 0) {
312312
this.setState({
313313
selectedCellRule: undefined,
314314
selectedSection: undefined,

webapp/components/general/HTMLViewer.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,13 @@ class CustomHTMLViewer extends Component {
5151

5252
adjustSVGSize () {
5353
const svg = this.getSvgComponent()
54-
svg.removeAttribute('width');
55-
svg.removeAttribute('height');
56-
svg.setAttribute('width', `${this.dimensions.width}px`);
57-
svg.setAttribute('height', `${this.dimensions.height}px`);
54+
if (svg) {
55+
svg.removeAttribute('width');
56+
svg.removeAttribute('height');
57+
svg.setAttribute('width', `${this.dimensions.width - 20}px`);
58+
svg.setAttribute('height', `${this.dimensions.height - 20}px`);
59+
}
60+
5861
}
5962

6063
resizeIfNeeded (){

webapp/components/general/NetPyNEPythonConsole.js

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,43 +3,36 @@ import Utils from '../../Utils'
33

44
import PythonConsole from '@geppettoengine/geppetto-client/js/components/interface/pythonConsole/PythonConsole';
55

6-
import { EDIT_MODE_INITIAL_WIDGET_STATE } from '../../redux/reducers/flexlayout';
7-
86
export default class NetPyNEPythonConsole extends Component {
97

108
addMetadataToWindow (data) {
119
console.log("Initialising NetPyNE Tabs");
1210
window.metadata = data.metadata;
1311
window.currentFolder = data.currentFolder;
1412
window.isDocker = data.isDocker;
15-
13+
window.pythonConsoleLoaded = true
1614
}
1715

18-
addWidgets () {
19-
Object.keys(EDIT_MODE_INITIAL_WIDGET_STATE).forEach(widgetId => {
20-
this.props.newWidget(EDIT_MODE_INITIAL_WIDGET_STATE[widgetId])
21-
})
16+
componentWillUnmount () {
17+
console.log("unmounting python console")
2218
}
2319

24-
2520
componentDidMount () {
26-
GEPPETTO.on('jupyter_geppetto_extension_ready', data => {
27-
let project = { id: 1, name: 'Project', experiments: [{ "id": 1, "name": 'Experiment', "status": 'DESIGN' }] }
28-
GEPPETTO.Manager.loadProject(project, false);
29-
GEPPETTO.Manager.loadExperiment(1, [], []);
30-
Utils.execPythonMessage('from netpyne_ui.netpyne_geppetto import netpyne_geppetto');
31-
Utils.evalPythonMessage('netpyne_geppetto.getData',[]).then(response => {
32-
const data = Utils.convertToJSON(response);
33-
this.addMetadataToWindow(data)
34-
this.props.modelLoaded();
35-
36-
37-
GEPPETTO.on(GEPPETTO.Events.Model_loaded, () => {
38-
this.addWidgets()
39-
});
40-
GEPPETTO.trigger("spinner:hide");
41-
})
42-
});
21+
if (!window.pythonConsoleLoaded) {
22+
GEPPETTO.on('jupyter_geppetto_extension_ready', data => {
23+
let project = { id: 1, name: 'Project', experiments: [{ "id": 1, "name": 'Experiment', "status": 'DESIGN' }] }
24+
GEPPETTO.Manager.loadProject(project, false);
25+
GEPPETTO.Manager.loadExperiment(1, [], []);
26+
Utils.execPythonMessage('from netpyne_ui.netpyne_geppetto import netpyne_geppetto');
27+
Utils.evalPythonMessage('netpyne_geppetto.getData',[]).then(response => {
28+
const data = Utils.convertToJSON(response);
29+
this.addMetadataToWindow(data)
30+
this.props.modelLoaded();
31+
GEPPETTO.trigger("spinner:hide");
32+
})
33+
});
34+
}
35+
4336
}
4437
render () {
4538
return <PythonConsole pythonNotebookPath={"notebooks/notebook.ipynb"} />

webapp/components/index.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ export const NetPyNECellRule = connect((state, ownProps) => ({
8989

9090
import _LayoutManager from "./layout/LayoutManager";
9191
export const LayoutManager = connect(
92-
state => state.flexlayout,
92+
state => ({ ...state.flexlayout, editMode: state.general.editMode }),
9393
dispatch => ({
9494
minimizeWidget: id => dispatch(minimizeWidget(id)),
9595
destroyWidget: id => dispatch(destroyWidget(id)),
@@ -227,7 +227,11 @@ export const PlotButtons = connect(
227227
import _NetPyNEPythonConsole from './general/NetPyNEPythonConsole'
228228
export const NetPyNEPythonConsole = connect(
229229
null,
230-
dispatch => ({ modelLoaded: () => dispatch(modelLoaded) })
230+
dispatch => ({
231+
modelLoaded: () => dispatch(modelLoaded),
232+
newWidget: widget => dispatch(newWidget(widget)),
233+
activateWidget: widgetId => dispatch(activateWidget(widgetId))
234+
})
231235
)(_NetPyNEPythonConsole)
232236

233237
// ---------------------------------------------------------------------------------------- //

webapp/components/instantiation/NetPyNEInstantiated.js

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,14 @@ const styles = {
1212
backgroundColor: 'rgba(0, 0, 0, 0.6)',
1313
zIndex: '999',
1414
height: '100%',
15-
width: '100%',
15+
width: '98%',
1616
overflow: 'hidden'
1717
},
1818

1919
instantiatedContainer: {
2020
height: '100%',
2121
width: '100%',
2222
},
23-
controlpanelBtn: {
24-
position: 'absolute',
25-
left: 34,
26-
top: 280
27-
},
2823
};
2924

3025
export default class NetPyNEInstantiated extends React.Component {
@@ -122,15 +117,6 @@ export default class NetPyNEInstantiated extends React.Component {
122117
</ControlPanel>
123118
</div>
124119

125-
<IconButton style={styles.controlpanelBtn}
126-
onClick={() => {
127-
$('#controlpanel').show()
128-
this.setState({ bringItToFront: 1 })
129-
}}
130-
icon={"fa-list"}
131-
id="ControlPanelButton"
132-
/>
133-
134120
<NetWorkControlButtons/>
135121

136122
</div>

webapp/components/instantiation/NetWorkControlButtons.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { PlotButtons } from 'netpyne/components'
99
const styles = ({ spacing }) => ({
1010
container: {
1111
position: 'absolute',
12-
top: spacing(3),
12+
top: spacing(2),
1313
right: spacing(2)
1414
},
1515
innerContainer: { position: 'relative' },
@@ -26,6 +26,21 @@ class NetWorkControlButtons extends React.Component {
2626
return (
2727
<div className={classes.container}>
2828
<div style={{ position: 'relative' }}>
29+
30+
<Tooltip
31+
title={"Control panel"}
32+
placement="left"
33+
>
34+
<div>
35+
<IconButton
36+
className={classes.buttons}
37+
onClick={() => $('#controlpanel').show()}
38+
icon={"fa-list"}
39+
id="ControlPanelButton"
40+
/>
41+
</div>
42+
</Tooltip>
43+
2944
<Tooltip
3045
title={disableRefreshInstance ? "Your network is in sync" : "Synchronise network"}
3146
placement="left"

webapp/components/instantiation/PlotButtons.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ class PlotButtons extends React.Component {
6363
this.props.newWidget({
6464
path: pathName,
6565
component: 'Plot',
66-
panelName: 'rightPanel'
66+
panelName: 'plotPanel'
6767
})
6868

6969
if (i < total) {

webapp/components/layout/LayoutManager.js

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { isEqual } from '../../Utils';
88
import WidgetFactory from './WidgetFactory';
99
import TabsetIconFactory from './TabsetIconFactory'
1010
import defaultLayoutConfiguration from './layoutConf.json';
11+
import simulateLayoutConfiguration from './simulateLayoutConf.json';
1112

1213
/**
1314
* Transforms a widget configutation into a flexlayout node descriptor
@@ -33,7 +34,6 @@ export default class LayoutManager extends Component {
3334
constructor (props) {
3435
super(props);
3536
const layout = this.props.layout ? this.props.layout : defaultLayoutConfiguration;
36-
this.model = FlexLayout.Model.fromJson(layout);
3737
this.destroyWidget = this.props.destroyWidget ? this.props.destroyWidget : () => console.debug('destroyWidget not defined');
3838
this.activateWidget = this.props.activateWidget ? this.props.activateWidget : () => console.debug('activateWidget not defined');
3939
this.maximizeWidget = this.props.maximizeWidget ? this.props.maximizeWidget : () => console.debug('maximizeWidget not defined');
@@ -42,19 +42,34 @@ export default class LayoutManager extends Component {
4242

4343
this.widgetFactory = this.props.widgetFactory ? this.props.widgetFactory : new WidgetFactory();
4444
this.tabsetIconFactory = this.props.TabsetIconFactory ? this.props.TabsetIconFactory : new TabsetIconFactory();
45+
46+
this.cacheModels = {
47+
edit: FlexLayout.Model.fromJson(layout),
48+
simulate: FlexLayout.Model.fromJson(simulateLayoutConfiguration)
49+
}
4550
}
51+
52+
4653
componentDidMount () {
4754
const { widgets } = this.props;
4855
this.addWidgets(Object.values(widgets));
4956
}
5057

5158
componentDidUpdate (prevProps, prevState) {
59+
if (prevProps.editMode !== this.props.editMode) {
60+
return
61+
}
62+
5263
const { widgets } = this.props;
5364
const oldWidgets = prevProps.widgets;
5465
const newWidgets = this.findNewWidgets(widgets, oldWidgets);
55-
if (newWidgets) {
66+
if (newWidgets.length > 0) {
5667
this.addWidgets(newWidgets);
5768
}
69+
70+
if (!this.props.editMode && !this.cacheModels.simulate.getNodeById(widgets.python.id)) {
71+
this.addWidgets([widgets.python]);
72+
}
5873

5974
const updatedWidgets = this.findUpdatedWidgets(widgets, oldWidgets);
6075
if (updatedWidgets) {
@@ -68,8 +83,15 @@ export default class LayoutManager extends Component {
6883
}
6984
}
7085

86+
getModel () {
87+
if (this.props.editMode) {
88+
return this.cacheModels.edit
89+
}
90+
return this.cacheModels.simulate
91+
}
92+
7193
addWidgets (widgets) {
72-
const { model } = this;
94+
const model = this.getModel()
7395
for (let newWidgetDescriptor of widgets) {
7496

7597
if (!model.getNodeById(newWidgetDescriptor.id)) {
@@ -82,16 +104,17 @@ export default class LayoutManager extends Component {
82104
for (let widget of widgets) {
83105

84106
if (widget.status == WidgetStatus.ACTIVE) {
85-
this.model.doAction(FlexLayout.Actions.selectTab(widget.id));
107+
model.doAction(FlexLayout.Actions.selectTab(widget.id));
86108
}
87109

88110
}
89111
// window.dispatchEvent(new Event('resize'));
90112
}
91113

92114
deleteWidgets (widgets) {
115+
const model = this.getModel()
93116
for (let widget of widgets) {
94-
this.model.doAction(FlexLayout.Actions.deleteTab(widget.id));
117+
model.doAction(FlexLayout.Actions.deleteTab(widget.id));
95118
}
96119
}
97120

@@ -100,24 +123,25 @@ export default class LayoutManager extends Component {
100123
}
101124

102125
updateWidgets (widgets) {
103-
126+
const model = this.getModel()
104127
for (let widget of widgets) {
105128

106129
this.updateWidget(widget);
107130

108131
// This updates plotly.js plots to new panel sizes
109132
if (widget.status == WidgetStatus.ACTIVE) {
110-
this.model.doAction(FlexLayout.Actions.selectTab(widget.id));
133+
model.doAction(FlexLayout.Actions.selectTab(widget.id));
111134
}
112135

113136
}
114137
// window.dispatchEvent(new Event('resize'));
115138
}
116139

117140
updateWidget (widget) {
141+
const model = this.getModel()
118142
if (widget) {
119143
this.widgetFactory.updateWidget(widget);
120-
this.model.doAction(Actions.updateNodeAttributes(widget.id, widget2Node(widget)));
144+
model.doAction(Actions.updateNodeAttributes(widget.id, widget2Node(widget)));
121145
}
122146

123147
}
@@ -128,6 +152,7 @@ export default class LayoutManager extends Component {
128152
}
129153

130154
iconFactory (node) {
155+
// TODO move to newest flexlayout-react to add this functionality
131156
return this.tabsetIconFactory.factory(node.getConfig());
132157
}
133158

@@ -152,6 +177,7 @@ export default class LayoutManager extends Component {
152177

153178

154179
onAction (action) {
180+
const model = this.getModel()
155181
switch (action.type){
156182
case Actions.SET_ACTIVE_TABSET:
157183
break;
@@ -173,11 +199,11 @@ export default class LayoutManager extends Component {
173199
break;
174200
}
175201

176-
this.model.doAction(action);
202+
model.doAction(action);
177203
}
178204

179205
onActionMaximizeWidget (action) {
180-
const { model } = this;
206+
const model = this.getModel()
181207
const { widgets } = this.props;
182208
const { maximizeWidget, activateWidget } = this;
183209
const panel2maximize = model.getNodeById(action.data.node);
@@ -203,7 +229,7 @@ export default class LayoutManager extends Component {
203229
}
204230

205231
onActionDeleteWidget (action) {
206-
const { model } = this;
232+
const model = this.getModel()
207233
const { widgets } = this.props;
208234
const maximizedWidget = this.findMaximizedWidget(widgets);
209235
// change widget status
@@ -226,14 +252,16 @@ export default class LayoutManager extends Component {
226252

227253

228254
clickOnBordersAction (node) {
229-
this.model.doAction(FlexLayout.Actions.moveNode(node.getId(), 'bottomPanel', FlexLayout.DockLocation.CENTER, 0));
255+
const model = this.getModel()
256+
model.doAction(FlexLayout.Actions.moveNode(node.getId(), 'bottomPanel', FlexLayout.DockLocation.CENTER, 0));
230257
}
231258

232259
onRenderTabSet (panel, renderValues) {
260+
const model = this.getModel()
233261
if (panel.getType() === "tabset") {
234262
if (panel.getId() != 'leftPanel' && panel.getChildren().length > 0){
235263
renderValues.buttons.push(<div key={panel.getId()} className="fa fa-window-minimize customIconFlexLayout" onClick={() => {
236-
this.model.doAction(FlexLayout.Actions.moveNode(panel.getSelectedNode().getId(), "border_bottom", FlexLayout.DockLocation.CENTER, 0));
264+
model.doAction(FlexLayout.Actions.moveNode(panel.getSelectedNode().getId(), "border_bottom", FlexLayout.DockLocation.CENTER, 0));
237265
}} />);
238266
}
239267
}
@@ -244,7 +272,7 @@ export default class LayoutManager extends Component {
244272
<div style={{ position: 'relative', flexGrow: 1 }}>
245273
<FlexLayout.Layout
246274
ref="layout"
247-
model={this.model}
275+
model={this.getModel()}
248276
factory={this.factory.bind(this)}
249277
iconFactory={this.iconFactory.bind(this)}
250278
onAction={action => this.onAction(action)}

webapp/components/layout/layoutConf.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
{
3535
"type": "tabset",
3636
"weight": 100,
37-
"id": "rightPanel",
37+
"id": "hlsPanel",
3838
"enableDeleteWhenEmpty": false,
3939
"children": [
4040
]

0 commit comments

Comments
 (0)