Skip to content
Snippets Groups Projects
costume-tab.jsx 6 KiB
Newer Older
  • Learn to ignore specific revisions
  • Paul Kaplan's avatar
    Paul Kaplan committed
    import PropTypes from 'prop-types';
    import React from 'react';
    import bindAll from 'lodash.bindall';
    
    chrisgarrity's avatar
    chrisgarrity committed
    import {FormattedMessage} from 'react-intl';
    
    Paul Kaplan's avatar
    Paul Kaplan committed
    import VM from 'scratch-vm';
    
    Paul Kaplan's avatar
    Paul Kaplan committed
    import AssetPanel from '../components/asset-panel/asset-panel.jsx';
    import addCostumeIcon from '../components/asset-panel/icon--add-costume-lib.svg';
    
    import PaintEditorWrapper from './paint-editor-wrapper.jsx';
    
    import CostumeLibrary from './costume-library.jsx';
    import BackdropLibrary from './backdrop-library.jsx';
    
    Paul Kaplan's avatar
    Paul Kaplan committed
    import {connect} from 'react-redux';
    
        closeCostumeLibrary,
        closeBackdropLibrary,
    
        openCostumeLibrary,
        openBackdropLibrary
    
    } from '../reducers/modals';
    
    Paul Kaplan's avatar
    Paul Kaplan committed
    
    class CostumeTab extends React.Component {
        constructor (props) {
            super(props);
            bindAll(this, [
                'handleSelectCostume',
    
                'handleDeleteCostume',
                'handleNewCostume'
    
    Paul Kaplan's avatar
    Paul Kaplan committed
            ]);
            this.state = {selectedCostumeIndex: 0};
        }
    
    
        componentWillReceiveProps (nextProps) {
            const {
                editingTarget,
                sprites,
                stage
            } = nextProps;
    
            const target = editingTarget && sprites[editingTarget] ? sprites[editingTarget] : stage;
            if (target && target.costumes && this.state.selectedCostumeIndex > target.costumes.length - 1) {
                this.setState({selectedCostumeIndex: target.costumes.length - 1});
            }
        }
    
    
        handleSelectCostume (costumeIndex) {
    
            this.props.vm.editingTarget.setCostume(costumeIndex);
    
            this.setState({selectedCostumeIndex: costumeIndex});
    
        handleDeleteCostume (costumeIndex) {
    
            this.props.vm.deleteCostume(costumeIndex);
    
        handleNewCostume () {
            if (!this.props.vm.editingTarget) return;
            const costumes = this.props.vm.editingTarget.sprite.costumes || [];
            this.setState({selectedCostumeIndex: Math.max(costumes.length - 1, 0)});
        }
    
    
    Paul Kaplan's avatar
    Paul Kaplan committed
        render () {
    
    Paul Kaplan's avatar
    Paul Kaplan committed
            const {
    
                onNewCostumeClick,
    
                costumeLibraryVisible,
                backdropLibraryVisible,
                onRequestCloseCostumeLibrary,
                onRequestCloseBackdropLibrary,
    
    Paul Kaplan's avatar
    Paul Kaplan committed
            } = this.props;
    
    
            const target = editingTarget && sprites[editingTarget] ? sprites[editingTarget] : stage;
    
            if (!target) {
                return null;
            }
    
    
    chrisgarrity's avatar
    chrisgarrity committed
            const addBackdropMsg = (
                <FormattedMessage
                    defaultMessage="Add Backdrop"
                    description="Button to add a backdrop in the editor tab"
    
                    id="gui.costumeTab.addBackdrop"
    
    chrisgarrity's avatar
    chrisgarrity committed
                />
            );
            const addCostumeMsg = (
                <FormattedMessage
                    defaultMessage="Add Costume"
                    description="Button to add a costume in the editor tab"
    
                    id="gui.costumeTab.addCostume"
    
    chrisgarrity's avatar
    chrisgarrity committed
            const addMessage = target.isStage ? addBackdropMsg : addCostumeMsg;
    
            const addFunc = target.isStage ? onNewBackdropClick : onNewCostumeClick;
    
    Paul Kaplan's avatar
    Paul Kaplan committed
    
            return (
                <AssetPanel
    
    Paul Kaplan's avatar
    Paul Kaplan committed
                    buttons={[{
    
    chrisgarrity's avatar
    chrisgarrity committed
                        message: addMessage,
    
    Paul Kaplan's avatar
    Paul Kaplan committed
                        img: addCostumeIcon,
                        onClick: addFunc
                    }]}
    
                    items={target.costumes || []}
    
    Paul Kaplan's avatar
    Paul Kaplan committed
                    selectedItemIndex={this.state.selectedCostumeIndex}
    
    DD Liu's avatar
    DD Liu committed
                    onDeleteClick={target.costumes.length > 1 ? this.handleDeleteCostume : null}
    
    Paul Kaplan's avatar
    Paul Kaplan committed
                    onItemClick={this.handleSelectCostume}
    
    DD's avatar
    DD committed
                    {target.costumes ?
    
                        <PaintEditorWrapper
                            {...props}
                            selectedCostumeIndex={this.state.selectedCostumeIndex}
    
    DD's avatar
    DD committed
                        /> :
                        null
                    }
    
                    {costumeLibraryVisible ? (
                        <CostumeLibrary
                            vm={vm}
                            onNewCostume={this.handleNewCostume}
                            onRequestClose={onRequestCloseCostumeLibrary}
                        />
                    ) : null}
                    {backdropLibraryVisible ? (
                        <BackdropLibrary
                            vm={vm}
                            onNewBackdrop={this.handleNewCostume}
                            onRequestClose={onRequestCloseBackdropLibrary}
                        />
                    ) : null}
    
                </AssetPanel>
    
    Paul Kaplan's avatar
    Paul Kaplan committed
            );
        }
    }
    
    CostumeTab.propTypes = {
    
        backdropLibraryVisible: PropTypes.bool,
        costumeLibraryVisible: PropTypes.bool,
    
        editingTarget: PropTypes.string,
        onNewBackdropClick: PropTypes.func.isRequired,
        onNewCostumeClick: PropTypes.func.isRequired,
    
        onRequestCloseBackdropLibrary: PropTypes.func.isRequired,
        onRequestCloseCostumeLibrary: PropTypes.func.isRequired,
    
        sprites: PropTypes.shape({
            id: PropTypes.shape({
                costumes: PropTypes.arrayOf(PropTypes.shape({
                    url: PropTypes.string,
                    name: PropTypes.string.isRequired
    
        stage: PropTypes.shape({
            sounds: PropTypes.arrayOf(PropTypes.shape({
                name: PropTypes.string.isRequired
    
        vm: PropTypes.instanceOf(VM)
    
    Paul Kaplan's avatar
    Paul Kaplan committed
    };
    
    const mapStateToProps = state => ({
        editingTarget: state.targets.editingTarget,
        sprites: state.targets.sprites,
    
        stage: state.targets.stage,
    
        costumeLibraryVisible: state.modals.costumeLibrary,
        backdropLibraryVisible: state.modals.backdropLibrary
    
    Paul Kaplan's avatar
    Paul Kaplan committed
    });
    
    const mapDispatchToProps = dispatch => ({
    
        onNewBackdropClick: e => {
            e.preventDefault();
            dispatch(openBackdropLibrary());
        },
    
    Paul Kaplan's avatar
    Paul Kaplan committed
        onNewCostumeClick: e => {
            e.preventDefault();
            dispatch(openCostumeLibrary());
    
        },
        onRequestCloseBackdropLibrary: () => {
            dispatch(closeBackdropLibrary());
        },
        onRequestCloseCostumeLibrary: () => {
            dispatch(closeCostumeLibrary());
    
    export default connect(
    
    Paul Kaplan's avatar
    Paul Kaplan committed
        mapStateToProps,
        mapDispatchToProps
    )(CostumeTab);