display statistics as menu, if screen is too small

This commit is contained in:
Delucse 2020-09-15 17:05:22 +02:00
parent 28fb2c3bab
commit 1c29dd2109
3 changed files with 116 additions and 55 deletions

View File

@ -72,8 +72,8 @@ class Home extends Component {
render() { render() {
return ( return (
<div> <div>
<div style={{float: 'left'}}><WorkspaceStats /></div> <div style={{float: 'right', height: '40px', marginBottom: '20px'}}><WorkspaceFunc /></div>
<div style={{float: 'right'}}><WorkspaceFunc /></div> <div style={{float: 'left', height: '40px', position: 'relative'}}><WorkspaceStats /></div>
<Grid container spacing={2}> <Grid container spacing={2}>
<Grid item xs={12} md={this.state.codeOn ? 6 : 12} style={{ position: 'relative' }}> <Grid item xs={12} md={this.state.codeOn ? 6 : 12} style={{ position: 'relative' }}>
<Tooltip title={this.state.codeOn ? 'Code ausblenden' : 'Code anzeigen'} > <Tooltip title={this.state.codeOn ? 'Code ausblenden' : 'Code anzeigen'} >

View File

@ -102,7 +102,7 @@ class WorkspaceFunc extends Component {
render() { render() {
return ( return (
<div style={{ marginBottom: '20px', width: 'max-content', display: 'flex'}}> <div style={{width: 'max-content', display: 'flex'}}>
<Compile iconButton /> <Compile iconButton />
<Tooltip title='Blöcke speichern' arrow style={{marginRight: '5px'}}> <Tooltip title='Blöcke speichern' arrow style={{marginRight: '5px'}}>
<IconButton <IconButton

View File

@ -4,12 +4,15 @@ import { connect } from 'react-redux';
import * as Blockly from 'blockly/core'; import * as Blockly from 'blockly/core';
import withWidth, { isWidthDown } from '@material-ui/core/withWidth';
import { withStyles } from '@material-ui/core/styles'; import { withStyles } from '@material-ui/core/styles';
import Tooltip from '@material-ui/core/Tooltip'; import Tooltip from '@material-ui/core/Tooltip';
import IconButton from '@material-ui/core/IconButton';
import Chip from '@material-ui/core/Chip'; import Chip from '@material-ui/core/Chip';
import Avatar from '@material-ui/core/Avatar'; import Avatar from '@material-ui/core/Avatar';
import Popover from '@material-ui/core/Popover';
import { faPuzzlePiece, faTrash, faPlus, faPen, faArrowsAlt } from "@fortawesome/free-solid-svg-icons"; import { faPuzzlePiece, faTrash, faPlus, faPen, faArrowsAlt, faEllipsisH } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
const styles = (theme) => ({ const styles = (theme) => ({
@ -19,65 +22,123 @@ const styles = (theme) => ({
marginLeft: '50px', marginLeft: '50px',
padding: '3px 10px', padding: '3px 10px',
// borderRadius: '25%' // borderRadius: '25%'
},
menu: {
backgroundColor: theme.palette.secondary.main,
color: theme.palette.secondary.contrastText,
width: '40px',
height: '40px',
'&:hover': {
backgroundColor: theme.palette.secondary.main,
color: theme.palette.primary.main,
}
} }
}); });
class WorkspaceStats extends Component { class WorkspaceStats extends Component {
state={
anchor: null
}
handleClose = () => {
this.setState({ anchor: null });
}
handleClick = (event) => {
this.setState({ anchor: event.currentTarget });
};
render() { render() {
const bigDisplay = !isWidthDown('xs', this.props.width);
const workspace = Blockly.getMainWorkspace(); const workspace = Blockly.getMainWorkspace();
const remainingBlocksInfinity = workspace ? workspace.remainingCapacity() !== Infinity : null; const remainingBlocksInfinity = workspace ? workspace.remainingCapacity() !== Infinity : null;
const stats = <div style={bigDisplay ? {display: 'flex'} : {display: 'inline'}}>
<Tooltip title="Anzahl aktueller Blöcke" arrow>
<Chip
style={bigDisplay ? {marginRight: '1rem'} : {marginRight: '1rem', marginBottom: '5px'}}
color="primary"
avatar={<Avatar><FontAwesomeIcon icon={faPuzzlePiece} /></Avatar>}
label={workspace ? workspace.getAllBlocks().length : 0}>
</Chip>
</Tooltip>
<Tooltip title="Anzahl neuer Blöcke" arrow>
<Chip
style={bigDisplay ? {marginRight: '1rem'} : {marginRight: '1rem', marginBottom: '5px'}}
color="primary"
avatar={<Avatar><FontAwesomeIcon icon={faPlus} /></Avatar>}
label={this.props.create > 0 ? this.props.create : 0}> {/* initialXML is created automatically, Block is not part of the statistics */}
</Chip>
</Tooltip>
<Tooltip title="Anzahl veränderter Blöcke" arrow>
<Chip
style={bigDisplay ? {marginRight: '1rem'} : {marginRight: '1rem', marginBottom: '5px'}}
color="primary"
avatar={<Avatar><FontAwesomeIcon icon={faPen} /></Avatar>}
label={this.props.change}>
</Chip>
</Tooltip>
<Tooltip title="Anzahl bewegter Blöcke" arrow>
<Chip
style={bigDisplay ? {marginRight: '1rem'} : {marginRight: '1rem', marginBottom: '5px'}}
color="primary"
avatar={<Avatar><FontAwesomeIcon icon={faArrowsAlt} /></Avatar>}
label={this.props.move > 0 ? this.props.move : 0}> {/* initialXML is moved automatically, Block is not part of the statistics */}
</Chip>
</Tooltip>
<Tooltip title="Anzahl gelöschter Blöcke" arrow>
<Chip
style={remainingBlocksInfinity ? bigDisplay ? {marginRight: '1rem'} : {marginRight: '1rem', marginBottom: '5px'} : {}}
color="primary"
avatar={<Avatar><FontAwesomeIcon icon={faTrash} /></Avatar>}
label={this.props.delete}>
</Chip>
</Tooltip>
{remainingBlocksInfinity ?
<Tooltip title="Verbleibende Blöcke" arrow>
<Chip
style={bigDisplay ? {marginRight: '1rem'} : {marginRight: '1rem', marginBottom: '5px'}}
color="primary"
label={workspace.remainingCapacity()}>
</Chip>
</Tooltip> : null}
</div>
return ( return (
<div style={{ marginBottom: '20px' }}> bigDisplay ?
<Tooltip title="Anzahl aktueller Blöcke" > <div style={{bottom: 0, position: 'absolute'}}>
<Chip {stats}
style={{ marginRight: '1rem' }} </div>
color="primary" :
avatar={<Avatar><FontAwesomeIcon icon={faPuzzlePiece} /></Avatar>} <div>
label={workspace ? workspace.getAllBlocks().length : 0}> <Tooltip title='Statistiken anzeigen' arrow>
</Chip> <IconButton
</Tooltip> className={this.props.classes.menu}
<Tooltip title="Anzahl neuer Blöcke" > onClick={(event) => this.handleClick(event)}
<Chip >
style={{ marginRight: '1rem' }} <FontAwesomeIcon icon={faEllipsisH} size="xs"/>
color="primary" </IconButton>
avatar={<Avatar><FontAwesomeIcon icon={faPlus} /></Avatar>} </Tooltip>
label={this.props.create > 0 ? this.props.create : 0}> {/* initialXML is created automatically, Block is not part of the statistics */} <Popover
</Chip> open={Boolean(this.state.anchor)}
</Tooltip> anchorEl={this.state.anchor}
<Tooltip title="Anzahl veränderter Blöcke" > onClose={this.handleClose}
<Chip anchorOrigin={{
style={{ marginRight: '1rem' }} vertical: 'bottom',
color="primary" horizontal: 'center',
avatar={<Avatar><FontAwesomeIcon icon={faPen} /></Avatar>} }}
label={this.props.change}> transformOrigin={{
</Chip> vertical: 'top',
</Tooltip> horizontal: 'center',
<Tooltip title="Anzahl bewegter Blöcke" > }}
<Chip PaperProps={{
style={{ marginRight: '1rem' }} style: {margin: '5px'}
color="primary" }}
avatar={<Avatar><FontAwesomeIcon icon={faArrowsAlt} /></Avatar>} >
label={this.props.move > 0 ? this.props.move : 0}> {/* initialXML is moved automatically, Block is not part of the statistics */} <div style={{margin: '10px'}}>
</Chip> {stats}
</Tooltip> </div>
<Tooltip title="Anzahl gelöschter Blöcke" > </Popover>
<Chip </div>
style={{ marginRight: '1rem' }}
color="primary"
avatar={<Avatar><FontAwesomeIcon icon={faTrash} /></Avatar>}
label={this.props.delete}>
</Chip>
</Tooltip>
{remainingBlocksInfinity ?
<Tooltip title="Verbleibende Blöcke" >
<Chip
style={{ marginRight: '1rem' }}
color="primary"
label={workspace.remainingCapacity()}>
</Chip>
</Tooltip> : null}
</div>
); );
}; };
} }
@ -98,4 +159,4 @@ const mapStateToProps = state => ({
workspaceChange: state.workspace.change workspaceChange: state.workspace.change
}); });
export default connect(mapStateToProps, null)(withStyles(styles, { withTheme: true })(WorkspaceStats)); export default connect(mapStateToProps, null)(withStyles(styles, { withTheme: true })(withWidth()(WorkspaceStats)));