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:
); } }