Spaces:
Running
Running
import classNames from 'classnames'; | |
import PropTypes from 'prop-types'; | |
import React from 'react'; | |
import Box from '../box/box.jsx'; | |
import Label from '../forms/label.jsx'; | |
import Input from '../forms/input.jsx'; | |
import BufferedInputHOC from '../forms/buffered-input-hoc.jsx'; | |
import DirectionPicker from '../../containers/direction-picker.jsx'; | |
import {injectIntl, intlShape, defineMessages, FormattedMessage} from 'react-intl'; | |
import {STAGE_DISPLAY_SIZES} from '../../lib/layout-constants.js'; | |
import {isWideLocale} from '../../lib/locale-utils.js'; | |
import styles from './sprite-info.css'; | |
import xIcon from './icon--x.svg'; | |
import yIcon from './icon--y.svg'; | |
import showIcon from './icon--show.svg'; | |
import hideIcon from './icon--hide.svg'; | |
const BufferedInput = BufferedInputHOC(Input); | |
const messages = defineMessages({ | |
spritePlaceholder: { | |
id: 'gui.SpriteInfo.spritePlaceholder', | |
defaultMessage: 'Name', | |
description: 'Placeholder text for sprite name' | |
} | |
}); | |
class SpriteInfo extends React.Component { | |
shouldComponentUpdate (nextProps) { | |
return ( | |
this.props.rotationStyle !== nextProps.rotationStyle || | |
this.props.disabled !== nextProps.disabled || | |
this.props.name !== nextProps.name || | |
this.props.stageSize !== nextProps.stageSize || | |
this.props.visible !== nextProps.visible || | |
// Only update these if rounded value has changed | |
Math.round(this.props.direction) !== Math.round(nextProps.direction) || | |
Math.round(this.props.size) !== Math.round(nextProps.size) || | |
Math.round(this.props.x) !== Math.round(nextProps.x) || | |
Math.round(this.props.y) !== Math.round(nextProps.y) | |
); | |
} | |
render () { | |
const { | |
stageSize | |
} = this.props; | |
const sprite = ( | |
<FormattedMessage | |
defaultMessage="Sprite" | |
description="Sprite info label" | |
id="gui.SpriteInfo.sprite" | |
/> | |
); | |
const showLabel = ( | |
<FormattedMessage | |
defaultMessage="Show" | |
description="Sprite info show label" | |
id="gui.SpriteInfo.show" | |
/> | |
); | |
const sizeLabel = ( | |
<FormattedMessage | |
defaultMessage="Size" | |
description="Sprite info size label" | |
id="gui.SpriteInfo.size" | |
/> | |
); | |
const labelAbove = isWideLocale(this.props.intl.locale); | |
const spriteNameInput = ( | |
<BufferedInput | |
className={classNames( | |
styles.spriteInput, | |
{ | |
[styles.columnInput]: labelAbove | |
} | |
)} | |
disabled={this.props.disabled} | |
placeholder={this.props.intl.formatMessage(messages.spritePlaceholder)} | |
tabIndex="0" | |
type="text" | |
value={this.props.disabled ? '' : this.props.name} | |
onSubmit={this.props.onChangeName} | |
/> | |
); | |
const xPosition = ( | |
<div className={styles.group}> | |
{ | |
(stageSize === STAGE_DISPLAY_SIZES.large) ? | |
<div className={styles.iconWrapper}> | |
<img | |
aria-hidden="true" | |
className={classNames(styles.xIcon, styles.icon)} | |
src={xIcon} | |
/> | |
</div> : | |
null | |
} | |
<Label text="x"> | |
<BufferedInput | |
small | |
disabled={this.props.disabled} | |
placeholder="x" | |
tabIndex="0" | |
type="text" | |
value={this.props.disabled ? '' : Math.round(this.props.x)} | |
onSubmit={this.props.onChangeX} | |
/> | |
</Label> | |
</div> | |
); | |
const yPosition = ( | |
<div className={styles.group}> | |
{ | |
(stageSize === STAGE_DISPLAY_SIZES.large) ? | |
<div className={styles.iconWrapper}> | |
<img | |
aria-hidden="true" | |
className={classNames(styles.yIcon, styles.icon)} | |
src={yIcon} | |
/> | |
</div> : | |
null | |
} | |
<Label text="y"> | |
<BufferedInput | |
small | |
disabled={this.props.disabled} | |
placeholder="y" | |
tabIndex="0" | |
type="text" | |
value={this.props.disabled ? '' : Math.round(this.props.y)} | |
onSubmit={this.props.onChangeY} | |
/> | |
</Label> | |
</div> | |
); | |
if (stageSize === STAGE_DISPLAY_SIZES.small) { | |
return ( | |
<Box className={styles.spriteInfo}> | |
<div className={classNames(styles.row, styles.rowPrimary)}> | |
<div className={styles.group}> | |
{spriteNameInput} | |
</div> | |
</div> | |
<div className={classNames(styles.row, styles.rowSecondary)}> | |
{xPosition} | |
{yPosition} | |
</div> | |
</Box> | |
); | |
} | |
return ( | |
<Box className={styles.spriteInfo}> | |
<div className={classNames(styles.row, styles.rowPrimary)}> | |
<div className={styles.group}> | |
<Label | |
above={labelAbove} | |
text={sprite} | |
> | |
{spriteNameInput} | |
</Label> | |
</div> | |
{xPosition} | |
{yPosition} | |
</div> | |
<div className={classNames(styles.row, styles.rowSecondary)}> | |
<div className={labelAbove ? styles.column : styles.group}> | |
{ | |
stageSize === STAGE_DISPLAY_SIZES.large ? | |
<Label | |
secondary | |
text={showLabel} | |
/> : | |
null | |
} | |
<div className={styles.radioWrapper}> | |
<div | |
className={classNames( | |
styles.radio, | |
styles.radioFirst, | |
styles.iconWrapper, | |
{ | |
[styles.isActive]: this.props.visible && !this.props.disabled, | |
[styles.isDisabled]: this.props.disabled | |
} | |
)} | |
tabIndex="0" | |
onClick={this.props.onClickVisible} | |
onKeyPress={this.props.onPressVisible} | |
> | |
<img | |
className={styles.icon} | |
src={showIcon} | |
/> | |
</div> | |
<div | |
className={classNames( | |
styles.radio, | |
styles.radioLast, | |
styles.iconWrapper, | |
{ | |
[styles.isActive]: !this.props.visible && !this.props.disabled, | |
[styles.isDisabled]: this.props.disabled | |
} | |
)} | |
tabIndex="0" | |
onClick={this.props.onClickNotVisible} | |
onKeyPress={this.props.onPressNotVisible} | |
> | |
<img | |
className={styles.icon} | |
src={hideIcon} | |
/> | |
</div> | |
</div> | |
</div> | |
<div className={classNames(styles.group, styles.largerInput)}> | |
<Label | |
secondary | |
above={labelAbove} | |
text={sizeLabel} | |
> | |
<BufferedInput | |
small | |
disabled={this.props.disabled} | |
label={sizeLabel} | |
tabIndex="0" | |
type="text" | |
value={this.props.disabled ? '' : Math.round(this.props.size)} | |
onSubmit={this.props.onChangeSize} | |
/> | |
</Label> | |
</div> | |
<div className={classNames(styles.group, styles.largerInput)}> | |
<DirectionPicker | |
direction={Math.round(this.props.direction)} | |
disabled={this.props.disabled} | |
labelAbove={labelAbove} | |
rotationStyle={this.props.rotationStyle} | |
onChangeDirection={this.props.onChangeDirection} | |
onChangeRotationStyle={this.props.onChangeRotationStyle} | |
/> | |
</div> | |
</div> | |
</Box> | |
); | |
} | |
} | |
SpriteInfo.propTypes = { | |
direction: PropTypes.oneOfType([ | |
PropTypes.string, | |
PropTypes.number | |
]), | |
disabled: PropTypes.bool, | |
intl: intlShape, | |
name: PropTypes.string, | |
onChangeDirection: PropTypes.func, | |
onChangeName: PropTypes.func, | |
onChangeRotationStyle: PropTypes.func, | |
onChangeSize: PropTypes.func, | |
onChangeX: PropTypes.func, | |
onChangeY: PropTypes.func, | |
onClickNotVisible: PropTypes.func, | |
onClickVisible: PropTypes.func, | |
onPressNotVisible: PropTypes.func, | |
onPressVisible: PropTypes.func, | |
rotationStyle: PropTypes.string, | |
size: PropTypes.oneOfType([ | |
PropTypes.string, | |
PropTypes.number | |
]), | |
stageSize: PropTypes.oneOf(Object.keys(STAGE_DISPLAY_SIZES)).isRequired, | |
visible: PropTypes.bool, | |
x: PropTypes.oneOfType([ | |
PropTypes.string, | |
PropTypes.number | |
]), | |
y: PropTypes.oneOfType([ | |
PropTypes.string, | |
PropTypes.number | |
]) | |
}; | |
export default injectIntl(SpriteInfo); | |