Skip to content

Commit

Permalink
simplify dockable panels management
Browse files Browse the repository at this point in the history
  • Loading branch information
hlorenzi committed Oct 18, 2020
1 parent 826bf18 commit 8d4ffc8
Show file tree
Hide file tree
Showing 108 changed files with 2,516 additions and 3,661 deletions.
2 changes: 1 addition & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
margin: 0;
padding: 0;
border: 0;
font-family: 'Lexend Deca', Verdana, sans-serif;
font-family: system-ui, 'Lexend Deca', Verdana, sans-serif;
font-size: 0.9em;
}

Expand Down
26 changes: 14 additions & 12 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,24 +17,26 @@
"not ie 11"
],
"dependencies": {
"@babel/core": "^7.9.6",
"@babel/plugin-proposal-class-properties": "^7.8.3",
"@babel/preset-env": "^7.9.6",
"@babel/preset-react": "^7.9.4",
"@types/node": "^13.13.4",
"@types/react": "^16.9.34",
"@babel/core": "^7.11.6",
"@babel/plugin-proposal-class-properties": "^7.10.4",
"@babel/preset-env": "^7.11.5",
"@babel/preset-react": "^7.10.4",
"@types/node": "^14.11.8",
"@types/react": "^16.9.52",
"@types/styled-components": "^5.1.4",
"awesome-typescript-loader": "^5.2.1",
"babel-loader": "^8.1.0",
"core-js": "^3.6.5",
"immutable": "^4.0.0-rc.12",
"pako": "^1.0.11",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"regenerator-runtime": "^0.13.5",
"source-map-loader": "^0.2.4",
"ts-loader": "^7.0.2",
"typescript": "^3.8.3",
"webpack": "^4.43.0",
"webpack-cli": "^3.3.11"
"regenerator-runtime": "^0.13.7",
"source-map-loader": "^1.1.1",
"styled-components": "^5.2.0",
"ts-loader": "^8.0.4",
"typescript": "^4.0.3",
"webpack": "^5.0.0",
"webpack-cli": "^4.0.0"
}
}
173 changes: 30 additions & 143 deletions src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,155 +1,42 @@
import React from "react"
import DockableRoot from "./dockable/DockableRoot"
import DockableData, { DockingMode, Root, Content } from "./dockable/DockableData"
import { EditorContent } from "./editor2/EditorContent"
import { AppState, AppReducer, ContentManager, AppManager } from "./AppState"
import { AppContext } from "./AppContext"
import EditorState from "./editor2/editor"
import Project from "./project/project2"
import Immutable from "immutable"
import Rect from "./util/rect"
import MenuBar from "./popup/MenuBar"
import Popup from "./popup/Popup"
import InspectorContent from "./editor2/InspectorContent"
import TrackInstrumentContent from "./editor2/TrackInstrumentContent"
import { usePlaybackController } from "./playback/PlaybackController"
import { useSoundfontLibrary } from "./playback/library"
import React, { useRef } from "react"
import * as Dockable from "./dockable"
import * as Project from "./project"
import * as Prefs from "./prefs"
import { useRefState } from "./util/refState"
import EditorWindow from "./windows/EditorWindow"
import WindowTest from "./windows/WindowTest"


const initialAppState = AppReducer.makeNew()


export default function App(props: {})
export default function App()
{
const rootRef = React.useRef<HTMLDivElement>(null)

const [, setDummy] = React.useState(0)
const appStateRef = React.useRef<AppState>(initialAppState)
const appDispatch = React.useCallback((newState: AppState) =>
const [dockableState, setDockableState] = React.useState(() =>
{
//console.log(newState)
appStateRef.current = newState
setDummy(dummy => dummy + 1)

}, [])
let root = Dockable.makeRoot()
root = Dockable.addPanel(root, 1, Dockable.DockMode.Full, 1)
root = Dockable.addPanel(root, 1, Dockable.DockMode.Full, 2)
root = Dockable.addPanel(root, 1, Dockable.DockMode.Full, 3)
root = Dockable.addPanel(root, 1, Dockable.DockMode.Full, 4)

const setDockableRoot = (newRoot: Root) => appDispatch({
...appStateRef.current,
dockableRoot: newRoot,
return root
})

const appManager = new AppManager(
() => appStateRef.current,
(newState) => appStateRef.current = newState,
(newState) => appDispatch(newState))

const playbackController = usePlaybackController(appManager)
const soundfontLibrary = useSoundfontLibrary(appManager)

React.useEffect(() =>
const contentIdToComponent = (id: Dockable.WindowId) =>
{
if (!rootRef.current)
return

const onResize = () =>
{
const elemRect = rootRef.current!.getBoundingClientRect()

appDispatch({
...appStateRef.current,
dockableRect: new Rect(
elemRect.x,
elemRect.y,
elemRect.width,
elemRect.height),
})
}

onResize()

window.addEventListener("resize", onResize)

return () =>
{
window.removeEventListener("resize", onResize)
}

}, [rootRef.current])


return <AppContext.Provider value={{ appManager }}>
<div style={{
position: "absolute",
top: "0px",
left: "0px",
width: "100vw",
height: "100vh",
display: "grid",
gridTemplate: "auto 1fr / 1fr",
}}>
<MenuBar/>

<div ref={ rootRef } style={{
width: "100%",
height: "100%",
pointerEvents: "none",
zIndex: -1000,
}}/>

<DockableRoot
root={ appStateRef.current.dockableRoot }
rect={ appStateRef.current.dockableRect }
setRoot={ setDockableRoot }
contents={ appStateRef.current.dockableContents }
contentTypeToComponent={ contentTypeToComponent }
contentTypeToTitle={ contentTypeToTitle }
/>

{ !appStateRef.current.popup ? null :
<Popup
rect={ appStateRef.current.popup.rect }
isSub={ false }
popupElem={ appStateRef.current.popup.elem }
popupProps={ appStateRef.current.popup.props }
/>
}

<input
id="gInputFileOpen"
type="file"
accept=".mid,.json,.txt"
style={{ display: "none" }}
/>
</div>
</AppContext.Provider>
}


function contentTypeToComponent(type: string): any
{
switch (type)
{
case "editor": return EditorContent
case "editorNotes": return EditorContent
case "inspector": return InspectorContent
case "trackInstrument": return TrackInstrumentContent

default:
throw "invalid content type"
return EditorWindow
}
}


function contentTypeToTitle(type: string): any
{
switch (type)
{
case "editor": return "Project"
case "editorNotes": return "Note Track"
case "inspector": return "Inspector"
case "trackInstrument": return "Instrument Select"
const projectCtx = useRefState(() => Project.Root.getDefault())
const prefsCtx = useRefState(() => Prefs.getDefault())

default:
throw "invalid content type"
}
return <>
<Project.ProjectContext.Provider value={ projectCtx }>
<Prefs.PrefsContext.Provider value={ prefsCtx }>
<Dockable.Container
state={ dockableState }
setState={ (state: Dockable.State) => setDockableState(state) }
contentIdToComponent={ contentIdToComponent }
/>
</Prefs.PrefsContext.Provider>
</Project.ProjectContext.Provider>
</>
}
Loading

0 comments on commit 8d4ffc8

Please sign in to comment.