import { Classes, HTMLSelect } from '@blueprintjs/core';
import { IconNames } from '@blueprintjs/icons';
import classNames from 'classnames';
import dropRight from 'lodash/dropRight';
import React from 'react';
import {
Corner,
createBalancedTreeFromLeaves,
getLeaves,
getNodeAtPath,
getOtherDirection,
getPathToCorner,
Mosaic,
MosaicDirection,
MosaicNode,
MosaicParent,
MosaicWindow,
MosaicZeroState,
updateTree,
} from '../src';
import { CloseAdditionalControlsButton } from './CloseAdditionalControlsButton';
import '@blueprintjs/core/lib/css/blueprint.css';
import '@blueprintjs/icons/lib/css/blueprint-icons.css';
import '../styles/index.less';
import './example.less';
// tslint:disable no-console
// tslint:disable-next-line no-var-requires
const gitHubLogo = require('./GitHub-Mark-Light-32px.png');
// tslint:disable-next-line no-var-requires
const { version } = require('../package.json');
let windowCount = 3;
export const THEMES = {
['Blueprint']: 'mosaic-blueprint-theme',
['Blueprint Dark']: classNames('mosaic-blueprint-theme', Classes.DARK),
['None']: '',
};
export type Theme = keyof typeof THEMES;
const additionalControls = React.Children.toArray([]);
const EMPTY_ARRAY: any[] = [];
export interface ExampleAppState {
currentNode: MosaicNode | null;
currentTheme: Theme;
}
export class ExampleApp extends React.PureComponent<{}, ExampleAppState> {
state: ExampleAppState = {
currentNode: {
direction: 'row',
first: 1,
second: {
direction: 'column',
first: 2,
second: 3,
},
splitPercentage: 40,
},
currentTheme: 'Blueprint',
};
render() {
return (
{this.renderNavBar()}
renderTile={(count, path) => (
additionalControls={count === 3 ? additionalControls : EMPTY_ARRAY}
title={`Window ${count}`}
createNode={this.createNode}
path={path}
onDragStart={() => console.log('MosaicWindow.onDragStart')}
onDragEnd={(type) => console.log('MosaicWindow.onDragEnd', type)}
renderToolbar={count === 2 ? () => Custom Toolbar
: null}
>
{`Window ${count}`}
)}
zeroStateView={}
value={this.state.currentNode}
onChange={this.onChange}
onRelease={this.onRelease}
className={THEMES[this.state.currentTheme]}
/>
);
}
private onChange = (currentNode: MosaicNode | null) => {
this.setState({ currentNode });
};
private onRelease = (currentNode: MosaicNode | null) => {
console.log('Mosaic.onRelease():', currentNode);
};
private createNode = () => ++windowCount;
private autoArrange = () => {
const leaves = getLeaves(this.state.currentNode);
this.setState({
currentNode: createBalancedTreeFromLeaves(leaves),
});
};
private addToTopRight = () => {
let { currentNode } = this.state;
if (currentNode) {
const path = getPathToCorner(currentNode, Corner.TOP_RIGHT);
const parent = getNodeAtPath(currentNode, dropRight(path)) as MosaicParent;
const destination = getNodeAtPath(currentNode, path) as MosaicNode;
const direction: MosaicDirection = parent ? getOtherDirection(parent.direction) : 'row';
let first: MosaicNode;
let second: MosaicNode;
if (direction === 'row') {
first = destination;
second = ++windowCount;
} else {
first = ++windowCount;
second = destination;
}
currentNode = updateTree(currentNode, [
{
path,
spec: {
$set: {
direction,
first,
second,
},
},
},
]);
} else {
currentNode = ++windowCount;
}
this.setState({ currentNode });
};
private renderNavBar() {
return (
Example Actions:
);
}
}