soiz1's picture
Upload 2891 files
6bcb42f verified
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);