UNPKG

terriajs

Version:

Geospatial data visualization platform.

139 lines (118 loc) 5.61 kB
'use strict'; import React from 'react'; import createReactClass from 'create-react-class'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import ViewerMode from '../../../Models/ViewerMode'; import ObserveModelMixin from '../../ObserveModelMixin'; import MenuPanel from '../../StandardUserInterface/customizable/MenuPanel.jsx'; import Icon from "../../Icon.jsx"; import Styles from './setting-panel.scss'; import DropdownStyles from './panel.scss'; // The basemap and viewer setting panel const SettingPanel = createReactClass({ displayName: 'SettingPanel', mixins: [ObserveModelMixin], propTypes: { terria: PropTypes.object.isRequired, allBaseMaps: PropTypes.array.isRequired, viewState: PropTypes.object.isRequired }, getInitialState() { return { activeMap: this.props.terria.baseMap ? this.props.terria.baseMap.name : '(None)' }; }, selectBaseMap(baseMap, event) { event.stopPropagation(); this.props.terria.baseMap = baseMap.catalogItem; this.props.terria.baseMapContrastColor = baseMap.contrastColor; // We store the user's chosen basemap for future use, but it's up to the instance to decide // whether to use that at start up. this.props.terria.setLocalProperty('basemap', baseMap.catalogItem.name); }, mouseEnterBaseMap(baseMap) { this.setState({ activeMap: baseMap.catalogItem.name }); }, mouseLeaveBaseMap() { this.setState({ activeMap: this.props.terria.baseMap ? this.props.terria.baseMap.name : '(None)' }); }, selectViewer(viewer, event) { event.stopPropagation(); let newViewerMode; switch (viewer) { case 0: newViewerMode = ViewerMode.CesiumTerrain; break; case 1: newViewerMode = ViewerMode.CesiumEllipsoid; break; case 2: newViewerMode = ViewerMode.Leaflet; break; default: return; } this.props.terria.viewerMode = newViewerMode; // We store the user's chosen viewer mode for future use. this.props.terria.setLocalProperty('viewermode', newViewerMode); }, render() { const that = this; const currentViewer = this.props.terria.viewerMode; const currentBaseMap = this.props.terria.baseMap ? this.props.terria.baseMap.name : '(None)'; const dropdownTheme = { outer: Styles.settingPanel, inner: Styles.dropdownInner, btn: Styles.btnDropdown, icon: 'sphere' }; const viewerModes = []; if (this.props.terria.configParameters.useCesiumIonTerrain || this.props.terria.configParameters.cesiumTerrainUrl) { viewerModes.push('3D Terrain'); } viewerModes.push('3D Smooth', '2D'); return ( <MenuPanel theme={dropdownTheme} btnTitle="Change view" btnText="Map" viewState={this.props.viewState} smallScreen={this.props.viewState.useSmallScreenInterface}> <div className={classNames(Styles.viewer, DropdownStyles.section)}> <label className={DropdownStyles.heading}> Map View </label> <ul className={Styles.viewerSelector}> <For each="viewerMode" of={viewerModes} index="i"> <li key={i} className={Styles.listItem}> <button onClick={that.selectViewer.bind(this, i)} className={classNames(Styles.btnViewer, {[Styles.isActive]: i === currentViewer})}> {viewerMode} </button> </li> </For> </ul> </div> <div className={classNames(Styles.baseMap, DropdownStyles.section)}> <label className={DropdownStyles.heading}> Base Map </label> <label className={DropdownStyles.subHeading}>{this.state.activeMap}</label> <ul className={Styles.baseMapSelector}> <For each="baseMap" index="i" of={this.props.allBaseMaps}> <li key={i} className={Styles.listItem}> <button className={classNames(Styles.btnBaseMap, {[Styles.isActive]: baseMap.catalogItem.name === currentBaseMap })} onClick={that.selectBaseMap.bind(this, baseMap)} onMouseEnter={that.mouseEnterBaseMap.bind(this, baseMap)} onMouseLeave={that.mouseLeaveBaseMap.bind(this, baseMap)} onFocus={that.mouseEnterBaseMap.bind(this, baseMap)}> {baseMap.catalogItem.name === currentBaseMap ? <Icon glyph={Icon.GLYPHS.selected }/>: null } <img alt={baseMap.catalogItem.name} src={baseMap.image}/> </button> </li> </For> </ul> </div> </MenuPanel> ); }, }); module.exports = SettingPanel;