flow: group add layer null guards

This commit is contained in:
cha0s 2022-04-15 12:36:12 -05:00
parent 875624ed5a
commit 12ffd404d4
6 changed files with 87 additions and 22 deletions

View File

@ -5,5 +5,7 @@
- ~~production build~~ - ~~production build~~
- ~~Split Persea packages~~ - ~~Split Persea packages~~
- ~~Remove @avocado/persea~~ - ~~Remove @avocado/persea~~
- A lot of "topdown" could also be used for side-scroll/platform
- "tiles" should probably be "layer"
Opt: Opt:

View File

@ -7,6 +7,7 @@ import {
} from '@flecks/react'; } from '@flecks/react';
const Vector = ({ const Vector = ({
disabled,
integer, integer,
labels, labels,
onChange, onChange,
@ -17,6 +18,7 @@ const Vector = ({
<label className="inline"> <label className="inline">
<div className="vector__label-text">{labels[0]}</div> <div className="vector__label-text">{labels[0]}</div>
<Number <Number
disabled={disabled}
integer={integer} integer={integer}
onChange={(event, number) => { onChange={(event, number) => {
onChange( onChange(
@ -34,6 +36,7 @@ const Vector = ({
<label className="inline"> <label className="inline">
<div className="vector__label-text">{labels[1]}</div> <div className="vector__label-text">{labels[1]}</div>
<Number <Number
disabled={disabled}
integer={integer} integer={integer}
onChange={(event, number) => { onChange={(event, number) => {
onChange( onChange(
@ -70,6 +73,7 @@ export const vectorPropType = createVectorPropType(false);
vectorPropType.isRequired = createVectorPropType(true); vectorPropType.isRequired = createVectorPropType(true);
Vector.defaultProps = { Vector.defaultProps = {
disabled: false,
integer: false, integer: false,
labels: ['X', 'Y'], labels: ['X', 'Y'],
}; };
@ -77,6 +81,7 @@ Vector.defaultProps = {
Vector.displayName = 'Vector'; Vector.displayName = 'Vector';
Vector.propTypes = { Vector.propTypes = {
disabled: PropTypes.bool,
integer: PropTypes.bool, integer: PropTypes.bool,
onChange: PropTypes.func.isRequired, onChange: PropTypes.func.isRequired,
labels: PropTypes.arrayOf(PropTypes.string), labels: PropTypes.arrayOf(PropTypes.string),

View File

@ -9,6 +9,7 @@ import {
} from '@flecks/react'; } from '@flecks/react';
const Number = ({ const Number = ({
disabled,
integer, integer,
max, max,
min, min,
@ -56,6 +57,7 @@ const Number = ({
<> <>
<input <input
className="number__input" className="number__input"
disabled={disabled}
onChange={(event) => { onChange={(event) => {
changeClamped(event, parser(event.target.value)); changeClamped(event, parser(event.target.value));
}} }}
@ -67,6 +69,7 @@ const Number = ({
/> />
<div className="number__controls"> <div className="number__controls">
<button <button
disabled={disabled}
onClick={(event) => { onClick={(event) => {
increment(event, 1); increment(event, 1);
}} }}
@ -75,6 +78,7 @@ const Number = ({
<span className="number__button-label">+</span> <span className="number__button-label">+</span>
</button> </button>
<button <button
disabled={disabled}
onClick={(event) => { onClick={(event) => {
increment(event, -1); increment(event, -1);
}} }}
@ -89,6 +93,7 @@ const Number = ({
}; };
Number.defaultProps = { Number.defaultProps = {
disabled: false,
integer: false, integer: false,
max: Infinity, max: Infinity,
min: -Infinity, min: -Infinity,
@ -99,6 +104,7 @@ Number.defaultProps = {
Number.displayName = 'Number'; Number.displayName = 'Number';
Number.propTypes = { Number.propTypes = {
disabled: PropTypes.bool,
integer: PropTypes.bool, integer: PropTypes.bool,
max: PropTypes.number, max: PropTypes.number,
min: PropTypes.number, min: PropTypes.number,

View File

@ -15,7 +15,7 @@ export default () => {
...op, ...op,
})); }));
dispatch(patchJsonResource({ dispatch(patchJsonResource({
group: group || patch[0].path, ...(null !== group && {group: group || patch[0].path}),
patch, patch,
project: uuid, project: uuid,
uri, uri,

View File

@ -108,7 +108,7 @@ function TilesPage({
container.addChild(sprite); container.addChild(sprite);
container.addChild(primitives); container.addChild(primitives);
setViewport(image.size); setViewport(image.size);
}, [currentLayer, room]); }, [currentLayer, resource, room]);
// Update primitives with selection. // Update primitives with selection.
useEffect(() => { useEffect(() => {
primitives.anchor = [0, 0]; primitives.anchor = [0, 0];
@ -121,7 +121,7 @@ function TilesPage({
}, [selection]); }, [selection]);
// Map events to tiles updates. // Map events to tiles updates.
useEffect(() => { useEffect(() => {
if (!events) { if (!events || !resource.tiles[currentLayer]) {
return undefined; return undefined;
} }
const {tileSize} = room.tiles[currentLayer]; const {tileSize} = room.tiles[currentLayer];
@ -258,7 +258,7 @@ function TilesPage({
}); });
// Map events to selection updates. // Map events to selection updates.
useEffect(() => { useEffect(() => {
if (!tilesetEvents) { if (!tilesetEvents || !resource.tiles[currentLayer]) {
return undefined; return undefined;
} }
const onValue = ( const onValue = (
@ -306,13 +306,16 @@ function TilesPage({
<ul> <ul>
{ {
resource.tiles.map((tiles, i) => ( resource.tiles.map((tiles, i) => (
// eslint-disable-next-line react/no-array-index-key <li
<li key={i}> className={classnames(styles.layer, {[styles.active]: currentLayer === i})}
// eslint-disable-next-line react/no-array-index-key
key={i}
>
<button <button
className={classnames(styles.layerButton, {[styles.active]: currentLayer === i})} className={styles.layerButton}
onClick={(event) => { onClick={(event) => {
// Bug? .stopPropagation() doesn't work when clicking the child checkboxes. // Bug? .stopPropagation() doesn't work when clicking the child checkboxes.
if (event.target === event.currentTarget) { if ('checkbox' !== event.target.type) {
setCurrentLayer(i); setCurrentLayer(i);
} }
}} }}
@ -381,22 +384,35 @@ function TilesPage({
type="checkbox" type="checkbox"
/> />
</label> </label>
<button
type="button"
>
</button>
</div> </div>
</button> </button>
<button
className={styles.close}
onClick={() => {
patch(
{
op: 'remove',
path: `/tiles/${currentLayer}`,
},
null,
);
}}
type="button"
>
</button>
</li> </li>
)) ))
} }
<li className={styles.layer}>
<button
className={classnames(styles.layerButton, styles.addLayerButton)}
type="button"
>
<span>Add another layer</span>
</button>
</li>
</ul> </ul>
<button
type="button"
>
Add layer
</button>
</div> </div>
<div> <div>
<div className={styles.draw}> <div className={styles.draw}>
@ -431,6 +447,7 @@ function TilesPage({
<label className={styles.area}> <label className={styles.area}>
<span>Area</span> <span>Area</span>
<VectorComponent <VectorComponent
disabled={!resource.tiles[currentLayer]}
onChange={(event, newArea) => { onChange={(event, newArea) => {
const {Tiles} = flecks.get('$avocado/resource.resources'); const {Tiles} = flecks.get('$avocado/resource.resources');
// Create new tiles. // Create new tiles.
@ -460,14 +477,15 @@ function TilesPage({
`/tiles/${currentLayer}/area`, `/tiles/${currentLayer}/area`,
); );
}} }}
value={resource.tiles[currentLayer].area} value={resource.tiles[currentLayer]?.area || [0, 0]}
/> />
</label> </label>
<label className={styles.tileSize}> <label className={styles.tileSize}>
<span>Tile size</span> <span>Tile size</span>
<VectorComponent <VectorComponent
disabled={!resource.tiles[currentLayer]}
onChange={patch.onChange(`/tiles/${currentLayer}/tileSize`)} onChange={patch.onChange(`/tiles/${currentLayer}/tileSize`)}
value={resource.tiles[currentLayer].tileSize} value={resource.tiles[currentLayer]?.tileSize || [0, 0]}
/> />
</label> </label>
<div className={styles.grower} /> <div className={styles.grower} />

View File

@ -32,8 +32,9 @@
justify-content: space-between; justify-content: space-between;
margin: 0; margin: 0;
width: 100%; width: 100%;
&.active { background-color: unset;
background-color: rgb(0, 108, 134); &:hover {
background-color: unset;
} }
.info { .info {
display: flex; display: flex;
@ -70,6 +71,15 @@
} }
} }
.addLayerButton {
color: var(--color-active-light);
padding: 1rem;
text-align: center;
span {
width: 100%;
}
}
.header { .header {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
@ -121,3 +131,27 @@
height: 3rem; height: 3rem;
width: 100%; width: 100%;
} }
.layer {
background-color: rgba(0, 0, 0, 0.25);
&:hover {
background-color: rgba(255, 255, 255, 0.05);
}
&.active {
background-color: rgb(0, 108, 134);
}
padding-right: 3rem;
&:last-child {
padding-right: 0;
}
position: relative;
}
.close {
border-color: transparent;
margin: 0;
padding: 0.125rem;
position: absolute;
right: 0.375rem;
top: 0.375rem;
}