Skip to content

Commit a6ee1c8

Browse files
authored
Merge pull request #62 from projectstorm/simplify_layout_directives
Simplify layout directives
2 parents 9ffbadd + 08103ef commit a6ee1c8

File tree

9 files changed

+52
-54
lines changed

9 files changed

+52
-54
lines changed

.changeset/forty-mails-act.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@projectstorm/react-workspaces-core': patch
3+
---
4+
5+
Improved node normalization by updating the size of the child to the parent before completely removing the parent

.changeset/rich-carrots-taste.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@projectstorm/react-workspaces-core': major
3+
---
4+
5+
Layout directives have been removed in favor of simple expand booleans

demo/stories/helpers/tools.tsx

+13-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as React from 'react';
2-
import * as _ from 'lodash';
32
import { useEffect, useState } from 'react';
3+
import * as _ from 'lodash';
44
import styled from '@emotion/styled';
55
import 'typeface-open-sans';
66
import {
@@ -31,12 +31,18 @@ import { ConvertToTrayZone, getDirectiveForTrayModel } from '@projectstorm/react
3131
import { css, Global } from '@storybook/theming';
3232

3333
export const genVerticalNode = () => {
34-
const node = new ExpandNodeModel()
35-
.setExpand(false, true)
36-
.setVertical(true)
37-
.addModel(new DefaultWorkspacePanelModel('Panel 1'))
38-
.addModel(new DefaultWorkspacePanelModel('Panel 2'));
39-
return node;
34+
const m1 = new DefaultWorkspacePanelModel('Panel 1');
35+
m1.minimumSize.update({
36+
width: 10,
37+
height: 100
38+
});
39+
40+
const m2 = new DefaultWorkspacePanelModel('Panel 2');
41+
m2.minimumSize.update({
42+
width: 10,
43+
height: 100
44+
});
45+
return new ExpandNodeModel().setExpand(false, true).setVertical(true).addModel(m1).addModel(m2);
4046
};
4147

4248
export enum DebugOptions {

packages/behavior-resize/src/ResizeDividerWidget.tsx

+13-11
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ export interface ResizeDividerWidgetProps {
2020
}
2121

2222
const isAligned = (divider: ResizeDivision, aligned: Alignment, parent: WorkspaceNodeModel) => {
23-
let beforeDirective = parent.getPanelDirective(divider.before);
24-
const afterDirective = parent.getPanelDirective(divider.after);
25-
if (beforeDirective.expand !== afterDirective.expand) {
23+
let beforeDirective = parent.shouldChildExpand(divider.before);
24+
const afterDirective = parent.shouldChildExpand(divider.after);
25+
if (beforeDirective !== afterDirective) {
2626
return false;
2727
}
2828
let before = divider.before;
@@ -31,8 +31,8 @@ const isAligned = (divider: ResizeDivision, aligned: Alignment, parent: Workspac
3131
if (!before) {
3232
return true;
3333
}
34-
let beforeDirective = parent.getPanelDirective(before);
35-
if (beforeDirective.expand) {
34+
let beforeDirective = parent.shouldChildExpand(before);
35+
if (beforeDirective) {
3636
return false;
3737
}
3838
} while (before);
@@ -66,10 +66,6 @@ const getResizeStrategy = (
6666
): Pick<UseMouseDragDistanceProps, 'startMove' | 'moved'> => {
6767
let sizeSnapshot = new Map<WorkspaceModel, number>();
6868

69-
const isExpand = (model: WorkspaceModel) => {
70-
return parent.getPanelDirective(model).expand;
71-
};
72-
7369
const setSize = (model: WorkspaceModel, val: number) => {
7470
if (divider.vertical) {
7571
model.setWidth(val);
@@ -96,12 +92,18 @@ const getResizeStrategy = (
9692
let { before, after } = divider;
9793

9894
// shrink|expand OR left aligned
99-
if ((!isExpand(before) && isExpand(after)) || isAligned(divider, alignment, parent)) {
95+
if (
96+
(!parent.shouldChildExpand(before) && parent.shouldChildExpand(after)) ||
97+
isAligned(divider, alignment, parent)
98+
) {
10099
before = getAvailableElement(before, alignment);
101100
setSize(before, sizeSnapshot.get(before) + distance);
102101
}
103102
// expand|shrink OR right aligned
104-
if ((isExpand(before) && !isExpand(after)) || !isAligned(divider, alignment, parent)) {
103+
if (
104+
(parent.shouldChildExpand(before) && !parent.shouldChildExpand(after)) ||
105+
!isAligned(divider, alignment, parent)
106+
) {
105107
after = getAvailableElement(after, getAlignmentInverted(alignment));
106108
setSize(after, sizeSnapshot.get(after) - distance);
107109
}

packages/core/src/entities/node/ExpandNodeModel.ts

+4-16
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
1-
import { DirectionLayoutChildDirective } from '../../widgets/layouts/DirectionalChildWidget';
21
import { ResizeDivision, WorkspaceNodeModel, WorkspaceNodeModelSerialized } from './WorkspaceNodeModel';
32
import { WorkspaceModel } from '../../core-models/WorkspaceModel';
43
import * as _ from 'lodash';
54
import { WorkspaceEngine } from '../../core/WorkspaceEngine';
65

7-
export interface ExpandNodeModelChild {
8-
originalWidth: number;
9-
originalHeight: number;
10-
}
11-
126
export interface ExpandNodeModelSerialized extends WorkspaceNodeModelSerialized {}
137

148
/**
@@ -99,25 +93,19 @@ export class ExpandNodeModel<
9993
});
10094
}
10195

102-
getPanelDirective(child: WorkspaceModel): DirectionLayoutChildDirective {
96+
shouldChildExpand(child: WorkspaceModel): boolean {
10397
const expandNodes = this.getExpandNodes();
10498

10599
//no expand nodes, so treat the last one as the expand node
106100
if (expandNodes.length === 0 && this.children.indexOf(child) === this.children.length - 1) {
107-
return {
108-
...super.getPanelDirective(child),
109-
expand: true
110-
};
101+
return true;
111102
}
112103

113104
// only expand the last one if there are multiple
114105
if (expandNodes.length > 1) {
115-
return {
116-
...super.getPanelDirective(child),
117-
expand: expandNodes.indexOf(child) === expandNodes.length - 1
118-
};
106+
return expandNodes.indexOf(child) === expandNodes.length - 1;
119107
}
120108

121-
return super.getPanelDirective(child);
109+
return super.shouldChildExpand(child);
122110
}
123111
}

packages/core/src/entities/node/WorkspaceNodeModel.ts

+3-6
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import { WorkspaceEngine } from '../../core/WorkspaceEngine';
77
import { WorkspaceModel } from '../../core-models/WorkspaceModel';
88
import { Alignment } from '../../core/tools';
99
import { DimensionContainer } from '../../core/dimensions/DimensionContainer';
10-
import { DirectionLayoutChildDirective } from '../../widgets/layouts/DirectionalChildWidget';
1110
import { ResizeDimensionContainer } from './ResizeDimensionContainer';
1211

1312
export interface ResizeDivision {
@@ -47,6 +46,7 @@ export class WorkspaceNodeModel<
4746
super.normalize();
4847
if (this.parent && this.parent instanceof WorkspaceCollectionModel) {
4948
if (this.children.length === 1) {
49+
this.children[0].size.update(this.size.value);
5050
this.parent.replaceModel(this, this.children[0]);
5151
}
5252
}
@@ -101,11 +101,8 @@ export class WorkspaceNodeModel<
101101
return divs;
102102
}
103103

104-
getPanelDirective(child: WorkspaceModel): DirectionLayoutChildDirective {
105-
return {
106-
expand: this.vertical ? child.expandVertical : child.expandHorizontal,
107-
size: this.vertical ? child.size.height : child.size.width
108-
};
104+
shouldChildExpand(child: WorkspaceModel): boolean {
105+
return this.vertical ? child.expandVertical : child.expandHorizontal;
109106
}
110107

111108
getAllRenderDimensions(): DimensionContainer[] {

packages/core/src/entities/node/WorkspaceNodeWidget.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ export const WorkspaceNodeWidget: React.FC<WorkspaceNodeWidgetProps> = (props) =
4040
dimensionContainerForDivider={(index: number) => {
4141
return props.model.r_divisions[index];
4242
}}
43-
getChildSizeDirective={(model) => {
44-
return props.model.getPanelDirective(model);
43+
shouldModelExpand={(model) => {
44+
return props.model.shouldChildExpand(model);
4545
}}
4646
className={props.className}
4747
data={props.model.children}

packages/core/src/widgets/layouts/DirectionalChildWidget.tsx

+2-7
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,6 @@ import { WorkspaceModel } from '../../core-models/WorkspaceModel';
44
import styled from '@emotion/styled';
55
import { useForceUpdate } from '../../widgets/hooks/useForceUpdate';
66

7-
export interface DirectionLayoutChildDirective {
8-
expand: boolean;
9-
size: number;
10-
}
11-
127
namespace S {
138
export const ChildContainer = styled.div<{ width: number; height: number; expand: boolean }>`
149
${(p) => (p.width ? `min-width: ${p.width}px; width: ${p.width}px` : '')};
@@ -21,14 +16,14 @@ namespace S {
2116
export interface DirectionChildWidgetProps {
2217
vertical: boolean;
2318
model: WorkspaceModel;
24-
directive: DirectionLayoutChildDirective;
19+
expand: boolean;
2520
generateElement: (model: WorkspaceModel) => JSX.Element;
2621
}
2722

2823
export const DirectionChildWidget: React.FC<DirectionChildWidgetProps> = (props) => {
2924
let width = null;
3025
let height = null;
31-
let expand = props.directive.expand;
26+
let expand = props.expand;
3227

3328
if (!expand && props.vertical) {
3429
height = props.model.size.height;

packages/core/src/widgets/layouts/DirectionalLayoutWidget.tsx

+5-5
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@ import { WorkspaceModel } from '../../core-models/WorkspaceModel';
55
import { WorkspaceEngine } from '../../core/WorkspaceEngine';
66
import styled from '@emotion/styled';
77
import { DividerWidget } from '../../widgets/primitives/DividerWidget';
8-
import { DirectionChildWidget, DirectionLayoutChildDirective } from './DirectionalChildWidget';
8+
import { DirectionChildWidget } from './DirectionalChildWidget';
99
import { ResizeDimensionContainer } from '../../entities/node/ResizeDimensionContainer';
1010

1111
export interface DirectionalLayoutWidgetProps {
1212
vertical: boolean;
1313
engine: WorkspaceEngine;
1414
data: WorkspaceModel[];
15-
getChildSizeDirective: (model: WorkspaceModel) => DirectionLayoutChildDirective;
16-
generateElement: (model: WorkspaceModel) => JSX.Element;
17-
generateDivider: (divider: ResizeDimensionContainer) => JSX.Element;
15+
shouldModelExpand: (model: WorkspaceModel) => boolean;
16+
generateElement: (model: WorkspaceModel) => React.JSX.Element;
17+
generateDivider: (divider: ResizeDimensionContainer) => React.JSX.Element;
1818
dimensionContainerForDivider: (index: number) => ResizeDimensionContainer;
1919
forwardRef: React.RefObject<HTMLDivElement>;
2020
className?: any;
@@ -51,7 +51,7 @@ export const DirectionalLayoutWidget: React.FC<DirectionalLayoutWidgetProps> = (
5151
const dimension = props.dimensionContainerForDivider(index + 1);
5252
return (
5353
<React.Fragment key={model.id}>
54-
<DirectionChildWidget {...props} directive={props.getChildSizeDirective(model)} model={model} />
54+
<DirectionChildWidget {...props} expand={props.shouldModelExpand(model)} model={model} />
5555
<React.Fragment key={dimension.id}>{generateDivider(dimension)}</React.Fragment>
5656
</React.Fragment>
5757
);

0 commit comments

Comments
 (0)