import PropTypes from 'prop-types'; import React from 'react'; import VM from 'scratch-vm'; import SpriteLibrary from '../../containers/sprite-library.jsx'; import SpriteSelectorComponent from '../sprite-selector/sprite-selector.jsx'; import StageSelector from '../../containers/stage-selector.jsx'; import {STAGE_DISPLAY_SIZES} from '../../lib/layout-constants'; import styles from './target-pane.css'; /* * Pane that contains the sprite selector, sprite info, stage selector, * and the new sprite, costume and backdrop buttons * @param {object} props Props for the component * @returns {React.Component} rendered component */ const TargetPane = ({ editingTarget, fileInputRef, hoveredTarget, spriteLibraryVisible, onActivateBlocksTab, onChangeSpriteDirection, onChangeSpriteName, onChangeSpriteRotationStyle, onChangeSpriteSize, onChangeSpriteVisibility, onChangeSpriteX, onChangeSpriteY, onDeleteSprite, onDrop, onDuplicateSprite, onExportSprite, onFileUploadClick, onNewSpriteClick, onPaintSpriteClick, onRequestCloseSpriteLibrary, onSelectSprite, onSpriteUpload, onSurpriseSpriteClick, raiseSprites, stage, stageSize, sprites, vm, ...componentProps }) => ( <div className={styles.targetPane} {...componentProps} > <SpriteSelectorComponent editingTarget={editingTarget} hoveredTarget={hoveredTarget} raised={raiseSprites} selectedId={editingTarget} spriteFileInput={fileInputRef} sprites={sprites} stageSize={stageSize} onChangeSpriteDirection={onChangeSpriteDirection} onChangeSpriteName={onChangeSpriteName} onChangeSpriteRotationStyle={onChangeSpriteRotationStyle} onChangeSpriteSize={onChangeSpriteSize} onChangeSpriteVisibility={onChangeSpriteVisibility} onChangeSpriteX={onChangeSpriteX} onChangeSpriteY={onChangeSpriteY} onDeleteSprite={onDeleteSprite} onDrop={onDrop} onDuplicateSprite={onDuplicateSprite} onExportSprite={onExportSprite} onFileUploadClick={onFileUploadClick} onNewSpriteClick={onNewSpriteClick} onPaintSpriteClick={onPaintSpriteClick} onSelectSprite={onSelectSprite} onSpriteUpload={onSpriteUpload} onSurpriseSpriteClick={onSurpriseSpriteClick} /> <div className={styles.stageSelectorWrapper}> {stage.id && <StageSelector asset={ stage.costume && stage.costume.asset } backdropCount={stage.costumeCount} id={stage.id} selected={stage.id === editingTarget} onSelect={onSelectSprite} />} <div> {spriteLibraryVisible ? ( <SpriteLibrary vm={vm} onActivateBlocksTab={onActivateBlocksTab} onRequestClose={onRequestCloseSpriteLibrary} /> ) : null} </div> </div> </div> ); const spriteShape = PropTypes.shape({ costume: PropTypes.shape({ url: PropTypes.string, name: PropTypes.string.isRequired, // The following are optional because costumes uploaded from disk // will not have these properties available bitmapResolution: PropTypes.number, rotationCenterX: PropTypes.number, rotationCenterY: PropTypes.number }), direction: PropTypes.number, id: PropTypes.string, name: PropTypes.string, order: PropTypes.number, size: PropTypes.number, visibility: PropTypes.bool, x: PropTypes.number, y: PropTypes.number }); TargetPane.propTypes = { editingTarget: PropTypes.string, extensionLibraryVisible: PropTypes.bool, fileInputRef: PropTypes.func, hoveredTarget: PropTypes.shape({ hoveredSprite: PropTypes.string, receivedBlocks: PropTypes.bool }), onActivateBlocksTab: PropTypes.func.isRequired, onChangeSpriteDirection: PropTypes.func, onChangeSpriteName: PropTypes.func, onChangeSpriteRotationStyle: PropTypes.func, onChangeSpriteSize: PropTypes.func, onChangeSpriteVisibility: PropTypes.func, onChangeSpriteX: PropTypes.func, onChangeSpriteY: PropTypes.func, onDeleteSprite: PropTypes.func, onDrop: PropTypes.func, onDuplicateSprite: PropTypes.func, onExportSprite: PropTypes.func, onFileUploadClick: PropTypes.func, onNewSpriteClick: PropTypes.func, onPaintSpriteClick: PropTypes.func, onRequestCloseExtensionLibrary: PropTypes.func, onRequestCloseSpriteLibrary: PropTypes.func, onSelectSprite: PropTypes.func, onSpriteUpload: PropTypes.func, onSurpriseSpriteClick: PropTypes.func, raiseSprites: PropTypes.bool, spriteLibraryVisible: PropTypes.bool, sprites: PropTypes.objectOf(spriteShape), stage: spriteShape, stageSize: PropTypes.oneOf(Object.keys(STAGE_DISPLAY_SIZES)).isRequired, vm: PropTypes.instanceOf(VM) }; export default TargetPane;