scratch-gui
Version:
GraphicaL User Interface for creating and running Scratch 3.0 projects
146 lines (137 loc) • 4.66 kB
JSX
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 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,
onChangeSpriteDirection,
onChangeSpriteName,
onChangeSpriteSize,
onChangeSpriteVisibility,
onChangeSpriteX,
onChangeSpriteY,
onDeleteSprite,
onDuplicateSprite,
onFileUploadClick,
onNewSpriteClick,
onPaintSpriteClick,
onRequestCloseSpriteLibrary,
onSelectSprite,
onSpriteUpload,
onSurpriseSpriteClick,
raiseSprites,
stage,
sprites,
vm,
...componentProps
}) => (
<div
className={styles.targetPane}
{...componentProps}
>
<SpriteSelectorComponent
editingTarget={editingTarget}
hoveredTarget={hoveredTarget}
raised={raiseSprites}
selectedId={editingTarget}
spriteFileInput={fileInputRef}
sprites={sprites}
onChangeSpriteDirection={onChangeSpriteDirection}
onChangeSpriteName={onChangeSpriteName}
onChangeSpriteSize={onChangeSpriteSize}
onChangeSpriteVisibility={onChangeSpriteVisibility}
onChangeSpriteX={onChangeSpriteX}
onChangeSpriteY={onChangeSpriteY}
onDeleteSprite={onDeleteSprite}
onDuplicateSprite={onDuplicateSprite}
onFileUploadClick={onFileUploadClick}
onNewSpriteClick={onNewSpriteClick}
onPaintSpriteClick={onPaintSpriteClick}
onSelectSprite={onSelectSprite}
onSpriteUpload={onSpriteUpload}
onSurpriseSpriteClick={onSurpriseSpriteClick}
/>
<div className={styles.stageSelectorWrapper}>
{stage.id && <StageSelector
assetId={
stage.costume &&
stage.costume.assetId
}
backdropCount={stage.costumeCount}
id={stage.id}
selected={stage.id === editingTarget}
onSelect={onSelectSprite}
/>}
<div>
{spriteLibraryVisible ? (
<SpriteLibrary
vm={vm}
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
}),
onChangeSpriteDirection: PropTypes.func,
onChangeSpriteName: PropTypes.func,
onChangeSpriteSize: PropTypes.func,
onChangeSpriteVisibility: PropTypes.func,
onChangeSpriteX: PropTypes.func,
onChangeSpriteY: PropTypes.func,
onDeleteSprite: PropTypes.func,
onDuplicateSprite: 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,
vm: PropTypes.instanceOf(VM)
};
export default TargetPane;