Make panels collapsible

- Add Panel component with collapse logic
- Use the component in all the necessary panel groups
This commit is contained in:
Gasim Gasimzada 2020-01-07 19:51:43 +04:00
parent 829a65b8cb
commit 0fd29fa761
7 changed files with 56 additions and 14 deletions

30
src/components/Panel.tsx Normal file
View file

@ -0,0 +1,30 @@
import React, { useState } from "react";
interface PanelProps {
title: string;
defaultCollapsed?: boolean;
}
export const Panel: React.FC<PanelProps> = ({
title,
children,
defaultCollapsed = false
}) => {
const [collapsed, setCollapsed] = useState(defaultCollapsed);
return (
<div className="panel">
<h4>{title}</h4>
<button
className="btn-panel-collapse"
type="button"
onClick={e => {
e.preventDefault();
setCollapsed(collapsed => !collapsed);
}}
>
{collapsed ? "▲" : "▼"}
</button>
{!collapsed && <div className="panelColumn">{children}</div>}
</div>
);
};

View file

@ -1,6 +1,7 @@
import React from "react"; import React from "react";
import { ColorPicker } from "../ColorPicker"; import { ColorPicker } from "../ColorPicker";
import { Panel } from "../Panel";
interface PanelCanvasProps { interface PanelCanvasProps {
viewBackgroundColor: string; viewBackgroundColor: string;
@ -14,8 +15,7 @@ export const PanelCanvas: React.FC<PanelCanvasProps> = ({
onClearCanvas onClearCanvas
}) => { }) => {
return ( return (
<> <Panel title="Canvas">
<h4>Canvas</h4>
<div className="panelColumn"> <div className="panelColumn">
<h5>Canvas Background Color</h5> <h5>Canvas Background Color</h5>
<ColorPicker <ColorPicker
@ -30,6 +30,6 @@ export const PanelCanvas: React.FC<PanelCanvasProps> = ({
Clear canvas Clear canvas
</button> </button>
</div> </div>
</> </Panel>
); );
}; };

View file

@ -1,5 +1,6 @@
import React from "react"; import React from "react";
import { EditableText } from "../EditableText"; import { EditableText } from "../EditableText";
import { Panel } from "../Panel";
interface PanelExportProps { interface PanelExportProps {
projectName: string; projectName: string;
@ -21,8 +22,7 @@ export const PanelExport: React.FC<PanelExportProps> = ({
onExportAsPNG onExportAsPNG
}) => { }) => {
return ( return (
<> <Panel title="Export">
<h4>Export</h4>
<div className="panelColumn"> <div className="panelColumn">
<h5>Name</h5> <h5>Name</h5>
{projectName && ( {projectName && (
@ -47,6 +47,6 @@ export const PanelExport: React.FC<PanelExportProps> = ({
<button onClick={onSaveScene}>Save as...</button> <button onClick={onSaveScene}>Save as...</button>
<button onClick={onLoadScene}>Load file...</button> <button onClick={onLoadScene}>Load file...</button>
</div> </div>
</> </Panel>
); );
}; };

View file

@ -1,4 +1,5 @@
import React from "react"; import React from "react";
import { Panel } from "../Panel";
interface PanelSelectionProps { interface PanelSelectionProps {
onBringForward: React.MouseEventHandler; onBringForward: React.MouseEventHandler;
@ -14,8 +15,7 @@ export const PanelSelection: React.FC<PanelSelectionProps> = ({
onSendToBack onSendToBack
}) => { }) => {
return ( return (
<> <div>
<h4>Selection</h4>
<div className="buttonList"> <div className="buttonList">
<button type="button" onClick={onBringForward}> <button type="button" onClick={onBringForward}>
Bring forward Bring forward
@ -30,6 +30,6 @@ export const PanelSelection: React.FC<PanelSelectionProps> = ({
Send to back Send to back
</button> </button>
</div> </div>
</> </div>
); );
}; };

View file

@ -2,6 +2,7 @@ import React from "react";
import { SHAPES } from "../../shapes"; import { SHAPES } from "../../shapes";
import { capitalizeString } from "../../utils"; import { capitalizeString } from "../../utils";
import { Panel } from "../Panel";
interface PanelToolsProps { interface PanelToolsProps {
activeTool: string; activeTool: string;
@ -13,8 +14,7 @@ export const PanelTools: React.FC<PanelToolsProps> = ({
onToolChange onToolChange
}) => { }) => {
return ( return (
<> <Panel title="Shapes">
<h4>Shapes</h4>
<div className="panelTools"> <div className="panelTools">
{SHAPES.map(({ value, icon }) => ( {SHAPES.map(({ value, icon }) => (
<label <label
@ -33,6 +33,6 @@ export const PanelTools: React.FC<PanelToolsProps> = ({
</label> </label>
))} ))}
</div> </div>
</> </Panel>
); );
}; };

View file

@ -43,6 +43,7 @@ import { PanelSelection } from "./components/panels/PanelSelection";
import { PanelColor } from "./components/panels/PanelColor"; import { PanelColor } from "./components/panels/PanelColor";
import { PanelExport } from "./components/panels/PanelExport"; import { PanelExport } from "./components/panels/PanelExport";
import { PanelCanvas } from "./components/panels/PanelCanvas"; import { PanelCanvas } from "./components/panels/PanelCanvas";
import { Panel } from "./components/Panel";
const { elements } = createScene(); const { elements } = createScene();
const { history } = createHistory(); const { history } = createHistory();
@ -381,7 +382,7 @@ class App extends React.Component<{}, AppState> {
}} }}
/> />
{someElementIsSelected(elements) && ( {someElementIsSelected(elements) && (
<div className="panelColumn"> <Panel title="Selection">
<PanelSelection <PanelSelection
onBringForward={this.moveOneRight} onBringForward={this.moveOneRight}
onBringToFront={this.moveAllRight} onBringToFront={this.moveAllRight}
@ -484,7 +485,7 @@ class App extends React.Component<{}, AppState> {
<button onClick={this.deleteSelectedElements}> <button onClick={this.deleteSelectedElements}>
Delete selected Delete selected
</button> </button>
</div> </Panel>
)} )}
<PanelCanvas <PanelCanvas
onClearCanvas={this.clearCanvas} onClearCanvas={this.clearCanvas}

View file

@ -30,6 +30,17 @@ body {
margin: 10px 0 10px 0; margin: 10px 0 10px 0;
} }
.panel {
position: relative;
.btn-panel-collapse {
position: absolute;
top: -2px;
right: 5px;
background: none;
margin: 0px;
}
}
.panelTools { .panelTools {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;