Skip to content

Commit 336dc33

Browse files
feat(Topology): Add option to fit layout to screen upon layout completion
1 parent 60f9853 commit 336dc33

3 files changed

Lines changed: 25 additions & 2 deletions

File tree

packages/react-integration/demo-app-ts/src/components/demos/TopologyDemo/PipelineLayout.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ import {
1313
PipelineDagreLayout,
1414
PipelineNodeModel,
1515
getSpacerNodes,
16-
getEdgesFromNodes
16+
getEdgesFromNodes,
17+
useVisualizationController
1718
} from '@patternfly/react-topology';
1819
import '@patternfly/react-styles/css/components/Topology/topology-components.css';
1920
import withTopologySetup from './utils/withTopologySetup';
@@ -77,6 +78,9 @@ const getModel = (layout: string): Model => {
7778
export const PipelineLayout = withTopologySetup(() => {
7879
useLayoutFactory((type: string, graph: Graph): Layout | undefined => new PipelineDagreLayout(graph, { nodesep: 95 }));
7980
useComponentFactory(pipelineComponentFactory);
81+
const controller = useVisualizationController();
82+
controller.setFitToScreenOnLayout(true);
83+
8084
// support pan zoom and drag
8185
useComponentFactory(
8286
React.useCallback<ComponentFactory>(kind => {

packages/react-topology/src/Visualization.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ import {
1717
ModelKind,
1818
LayoutFactory,
1919
Layout,
20-
ViewPaddingSettings
20+
ViewPaddingSettings,
21+
GRAPH_LAYOUT_END_EVENT,
22+
GraphLayoutEndEventListener
2123
} from './types';
2224
import defaultElementFactory from './elements/defaultElementFactory';
2325
import Stateful from './utils/Stateful';
@@ -59,6 +61,8 @@ export class Visualization extends Stateful implements Controller {
5961

6062
private eventListeners: { [type: string]: EventListener[] } = {};
6163

64+
private fitToScreenListener: GraphLayoutEndEventListener;
65+
6266
@observable.shallow
6367
private readonly store = {};
6468

@@ -254,6 +258,20 @@ export class Visualization extends Stateful implements Controller {
254258
}
255259
}
256260

261+
setFitToScreenOnLayout(fitToScreen: boolean, padding: number = 80): void {
262+
if (this.fitToScreenListener) {
263+
this.removeEventListener(GRAPH_LAYOUT_END_EVENT, this.fitToScreenListener);
264+
}
265+
266+
if (fitToScreen) {
267+
this.fitToScreenListener = ({ graph }): void => {
268+
graph.fit(padding);
269+
};
270+
this.addEventListener(GRAPH_LAYOUT_END_EVENT, this.fitToScreenListener);
271+
return;
272+
}
273+
}
274+
257275
shouldRenderNode(node: Node): boolean {
258276
if (!this.viewConstraintsEnabled) {
259277
return true;

packages/react-topology/src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,7 @@ export interface Controller extends WithState {
313313
getGraph(): Graph;
314314
setGraph(graph: Graph): void;
315315
getLayout(type: string | undefined): Layout | undefined;
316+
setFitToScreenOnLayout(fitToScreen: boolean, padding?: number): void;
316317
getElementById(id: string): GraphElement | undefined;
317318
getNodeById(id: string): Node | undefined;
318319
getEdgeById(id: string): Edge | undefined;

0 commit comments

Comments
 (0)