Skip to content

Commit b5053d7

Browse files
author
rodriguez-facundo
committed
#139 Hide python console on border
1 parent 2b196bf commit b5053d7

12 files changed

Lines changed: 310 additions & 260 deletions

File tree

webapp/components/NetPyNE.js

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import {
77
} from "netpyne/components";
88

99
import { withStyles } from '@material-ui/core/styles'
10-
import { NetPyNEPythonConsole } from 'netpyne/components'
1110

1211
const styles = ({ zIndex, palette, spacing }) => ({
1312
root: { height: '100%', overflow: 'hidden' },
@@ -17,14 +16,6 @@ const styles = ({ zIndex, palette, spacing }) => ({
1716
display: "flex",
1817
flexDirection: "column"
1918
},
20-
console: { marginTop: 12, width: 0, height: 0 },
21-
views: {
22-
display: "flex",
23-
flexFlow: "rows",
24-
width: "100%",
25-
marginRight: spacing(-1)
26-
},
27-
drawer: { marginLeft: spacing(-1) },
2819
topbar: { position: "relative", zIndex: zIndex.drawer + 1 },
2920
content: { flexGrow:1, display: 'flex', flexDirection: 'row', position: 'relative' }
3021
})
@@ -47,7 +38,6 @@ class NetPyNE extends React.Component {
4738

4839
render () {
4940
const { classes } = this.props
50-
5141
return (
5242
<div className={classes.root}>
5343
<div className={classes.container}>

webapp/components/general/NetPyNEIcons.js

Lines changed: 119 additions & 119 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

webapp/components/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export const Dimensions = connect(
7979

8080
import _NetPyNE from "./NetPyNE";
8181
export const NetPyNE = connect(
82-
state => ({ editMode: state.general.editMode, pythonConsoleWidget: state.flexlayout.widgets['python'] }),
82+
state => ({ editMode: state.general.editMode }),
8383
pythonCallErrorDispatch
8484
)(_NetPyNE);
8585

@@ -213,6 +213,7 @@ export const Drawer = connect(
213213
editMode: state.general.editMode
214214
}),
215215
dispatch => ({
216+
updateWidget: newConf => dispatch(updateWidget(newConf)),
216217
newWidget: widget => dispatch(newWidget(widget)),
217218
activateWidget: widgetId => dispatch(activateWidget(widgetId))
218219
})

webapp/components/layout/LayoutManager.js

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@ import * as FlexLayout from 'geppetto-client/js/components/interface/flexLayout2
33
import Actions from '@geppettoengine/geppetto-client/js/components/interface/flexLayout2/src/model/Actions';
44

55

6-
import { WidgetStatus } from '../../constants';
6+
import { WidgetStatus, WIDGETS_IDS } from '../../constants';
77
import { isEqual } from '../../Utils';
88
import WidgetFactory from './WidgetFactory';
99
import TabsetIconFactory from './TabsetIconFactory'
1010
import defaultLayoutConfiguration from './layoutConf.json';
1111

1212
import { withStyles } from '@material-ui/core/styles'
1313
import onAction from './OnLayoutAction';
14+
import { getPythonDefaultConsoleWidget } from '../../redux/reducers/flexlayout';
1415

1516
/**
1617
* Transforms a widget configutation into a flexlayout node descriptor
@@ -77,18 +78,18 @@ class LayoutManager extends Component {
7778

7879
const { widgets } = this.props;
7980
const oldWidgets = prevProps.widgets;
81+
8082
const newWidgets = this.findNewWidgets(widgets, oldWidgets);
8183
if (newWidgets.length > 0) {
8284
this.addWidgets(newWidgets);
8385
}
8486

8587
const updatedWidgets = this.findUpdatedWidgets(widgets, oldWidgets);
8688
if (updatedWidgets) {
87-
this.updateWidgets(updatedWidgets);
89+
this.updateWidgets(updatedWidgets, oldWidgets);
8890
}
8991

9092
const deletedWidgets = this.findDeletedWidgets(widgets, oldWidgets);
91-
9293
if (deletedWidgets) {
9394
this.deleteWidgets(deletedWidgets);
9495
}
@@ -170,19 +171,23 @@ class LayoutManager extends Component {
170171
}
171172
}
172173

173-
updateWidgets (widgets) {
174+
updateWidgets (widgets, oldWidgets) {
174175
const model = this.getModel()
175176
for (let widget of widgets) {
176177

177178
this.updateWidget(widget);
178179

179-
// This updates plotly.js plots to new panel sizes
180-
if (widget.status == WidgetStatus.ACTIVE) {
181-
model.doAction(FlexLayout.Actions.selectTab(widget.id));
180+
if (oldWidgets[widget.id].status === WidgetStatus.BORDER && widget.status !== WidgetStatus.BORDER) {
181+
this.restoreWidgetFromBottom(widget)
182+
} else if (oldWidgets[widget.id].status !== WidgetStatus.BORDER && widget.status === WidgetStatus.BORDER){
183+
this.moveWidget(widget)
184+
} else {
185+
// update plotly.js plots to new panel sizes
186+
if (widget.status == WidgetStatus.ACTIVE) {
187+
model.doAction(FlexLayout.Actions.selectTab(widget.id));
188+
}
182189
}
183-
184190
}
185-
// window.dispatchEvent(new Event('resize'));
186191
}
187192

188193
updateWidget (widget) {
@@ -228,31 +233,40 @@ class LayoutManager extends Component {
228233
}
229234

230235

231-
clickOnBordersAction (node) {
236+
restoreWidgetFromBottom (widget) {
232237
const model = this.getModel()
233-
let tabset = model.getNodeById('consolePanel')
238+
// We only allow python console to be send to the bottom
239+
const panelName = getPythonDefaultConsoleWidget(this.props.editMode).panelName
240+
let tabset = model.getNodeById(panelName)
234241
if (tabset === undefined) {
235-
this.createTabSet('consolePanel')
242+
this.createTabSet(panelName)
236243
}
237-
model.doAction(FlexLayout.Actions.moveNode(node.getId(), 'consolePanel', FlexLayout.DockLocation.CENTER, 0));
244+
this.moveWidget(widget)
238245
}
239246

247+
248+
moveWidget (widget) {
249+
const model = this.getModel()
250+
model.doAction(FlexLayout.Actions.moveNode(widget.id, widget.panelName, FlexLayout.DockLocation.CENTER, 0));
251+
// Resize of canvas and SVG images
252+
window.dispatchEvent(new Event('resize'));
253+
}
254+
240255
onRenderTab (node,renderValues) {
241-
console.log('pepe')
242256
}
243257
render () {
244258
const { classes, widgets } = this.props
259+
const model = this.getModel()
245260
return (
246261
<div className={classes.container}>
247262
<div className={classes.spacer}/>
248263
<div className={classes.flexlayout}>
249264
<FlexLayout.Layout
250265
ref="layout"
251-
model={this.getModel()}
266+
model={model}
252267
factory={this.factory.bind(this)}
253268
iconFactory={this.iconFactory.bind(this)}
254-
onAction={action => onAction(action, widgets, this.getModel(), this.props.updateWidget, this.activateWidget, this.destroyWidget, this.maximizeWidget, this.minimizeWidget)}
255-
clickOnBordersAction={node => this.clickOnBordersAction(node)}
269+
onAction={action => onAction(action, widgets, model, this.props.updateWidget, this.activateWidget, this.destroyWidget, this.maximizeWidget, this.minimizeWidget)}
256270
onRenderTab={(node,renderValues) => this.onRenderTab(node,renderValues)}
257271
/>
258272
</div>

webapp/components/layout/OnLayoutAction.js

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
import Actions from '@geppettoengine/geppetto-client/js/components/interface/flexLayout2/src/model/Actions';
2-
import { WidgetStatus } from '../../constants';
2+
import { WidgetStatus, WIDGETS_IDS } from '../../constants';
33

4-
const onAction = (action, widgets, model, udpateWidget, activateWidget, destroyWidget, maximizeWidget, minimizeWidget) => {
4+
const onAction = (action, widgets, model, updateWidget, activateWidget, destroyWidget, maximizeWidget, minimizeWidget) => {
55
switch (action.type){
66
case Actions.SET_ACTIVE_TABSET:
77
break;
88
case Actions.SELECT_TAB:
99
activateWidget(action.data.tabNode);
1010
break;
11-
case Actions.DELETE_TAB:
12-
onActionDeleteWidget(action, widgets, model, destroyWidget);
11+
case Actions.DELETE_TAB:{
12+
onActionDeleteWidget(action, widgets, model, updateWidget, destroyWidget);
13+
if (action.data.node.includes('python')) {
14+
// prevent python widget from been destroyed
15+
return
16+
}
1317
break;
18+
}
1419
case Actions.MAXIMIZE_TOGGLE:
1520
onActionMaximizeWidget(action, widgets, model, maximizeWidget);
1621
break;
@@ -35,7 +40,7 @@ const onAction = (action, widgets, model, udpateWidget, activateWidget, destroyW
3540

3641
// Flexlayout needs to create a tabset before we can update the panelName for the moved widget
3742
if (action.type === Actions.MOVE_NODE){
38-
moveNode(action, widgets, model, fromTabsetId, udpateWidget, activateWidget)
43+
moveNode(action, widgets, model, fromTabsetId, updateWidget, activateWidget)
3944
}
4045
window.dispatchEvent(new Event('resize'));
4146
}
@@ -93,13 +98,21 @@ const findWidgetInsertionIndex = (action, widgets, model) => {
9398

9499
const findMaximizedWidget = widgets => Object.values(widgets).find(widget => widget && widget.status == WidgetStatus.MAXIMIZED)
95100

96-
const onActionDeleteWidget = (action, widgets, model, destroyWidget) => {
97-
const maximizedWidget = findMaximizedWidget(widgets);
101+
const onActionDeleteWidget = (action, widgets, model, updateWidget, destroyWidget) => {
102+
if (action.data.node === WIDGETS_IDS.EDIT_MODE.PYTHON_CONSOLE_EDIT || action.data.node === WIDGETS_IDS.EXPLORE_MODE.PYTHON_CONSOLE_EXPLORE){
103+
moveWidgetToBorder(action, widgets, updateWidget)
104+
} else {
105+
destroyWidget(action.data.node);
106+
}
98107
// change widget status
99-
destroyWidget(action.data.node);
108+
updateMaximizedWidget(action, widgets, model)
109+
}
110+
111+
const updateMaximizedWidget = (action, widgets, model) => {
112+
const maximizedWidget = findMaximizedWidget(widgets);
100113
// check if the current maximized widget is the same than in the action dispatched
101114
if (maximizedWidget && maximizedWidget.id == action.data.node) {
102-
// find if there exists another widget in the maximized panel that could take its place
115+
// find if there exists another widget in the maximized panel that could take its place
103116
const panelChildren = model.getActiveTabset().getChildren();
104117
const index = panelChildren.findIndex(child => child.getId() == action.data.node);
105118
// Understand if the tab to the left or right of the destroyed tab will be the next one to be maximized
@@ -113,6 +126,16 @@ const onActionDeleteWidget = (action, widgets, model, destroyWidget) => {
113126
}
114127
}
115128

129+
const moveWidgetToBorder = (action, widgets, udpateWidget) => {
130+
var updatedWidget = { ...widgets[action.data.node] }
131+
if (updatedWidget === undefined) {
132+
return
133+
}
134+
updatedWidget.status = WidgetStatus.BORDER
135+
updatedWidget.panelName = "border_bottom"
136+
udpateWidget(updatedWidget)
137+
}
138+
116139
const onActionMaximizeWidget = (action, widgets, model, activateWidget, maximizeWidget) => {
117140
const panel2maximize = model.getNodeById(action.data.node);
118141

webapp/components/layout/WidgetFactory.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
import React, { lazy, Suspense } from 'react';
2-
3-
import PythonConsole from '@geppettoengine/geppetto-client/js/components/interface/pythonConsole/PythonConsole';
1+
import React, { lazy, Suspense } from 'react'
42

53
import { NetPyNEInstantiated, HTMLViewer } from 'netpyne/components';
64

webapp/components/layout/layoutConf.json

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,20 @@
44
"tabSetHeaderHeight": 26,
55
"tabSetTabStripHeight": 26,
66
"enableEdgeDock": false,
7-
"borderBarSize": "0px"
7+
"borderBarSize": 0
88
},
9+
"borders": [
10+
{
11+
"type":"border",
12+
"location": "bottom",
13+
"children": []
14+
}
15+
],
916
"layout": {
1017
"type": "tabset",
1118
"weight": 100,
1219
"id": "root",
13-
"children": [
14-
15-
]
20+
"children": []
1621
}
1722
}
1823

0 commit comments

Comments
 (0)