aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/App.vue48
-rw-r--r--src/components/TileTree.vue55
2 files changed, 73 insertions, 30 deletions
diff --git a/src/App.vue b/src/App.vue
index cf6dd75..7df0803 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -1,16 +1,58 @@
<script lang="ts">
import {defineComponent} from 'vue';
import TileTree from './components/TileTree.vue';
+
+
export default defineComponent({
+ data(){
+ return {
+ width: document.documentElement.clientWidth,
+ height: document.documentElement.clientHeight,
+ tileTreeOffset: 5, // For space between tile-tree and display boundary
+ // For window-resize-handler throttling
+ resizeThrottled: false,
+ resizeDelay: 50, //ms
+ }
+ },
+ computed: {
+ styles(){
+ return {
+ position: 'absolute',
+ left: '0',
+ top: '0',
+ width: this.width + 'px',
+ height: this.height + 'px',
+ backgroundColor: 'black',
+ };
+ }
+ },
+ methods: {
+ onResize(){
+ if (!this.resizeThrottled){
+ this.width = document.documentElement.clientWidth;
+ this.height = document.documentElement.clientHeight;
+ // Prevent re-triggering until after a delay
+ this.resizeThrottled = true;
+ setTimeout(() => {this.resizeThrottled = false;}, this.resizeDelay);
+ }
+ },
+ },
+ created(){
+ window.addEventListener('resize', this.onResize);
+ },
+ unmounted(){
+ window.removeEventListener('resize', this.onResize);
+ },
components: {
TileTree
- }
+ },
})
</script>
<template>
-<div>
- <tile-tree></tile-tree>
+<div :style="styles">
+ <tile-tree :pos="[tileTreeOffset, tileTreeOffset]"
+ :dims="[width - tileTreeOffset*2, height - tileTreeOffset*2]"/>
</div>
</template>
diff --git a/src/components/TileTree.vue b/src/components/TileTree.vue
index 6c63f4f..3b74ddf 100644
--- a/src/components/TileTree.vue
+++ b/src/components/TileTree.vue
@@ -1,5 +1,5 @@
<script lang="ts">
-import {defineComponent} from 'vue';
+import {defineComponent, PropType} from 'vue';
import Tile from './Tile.vue';
import {TolNode, LayoutNode, initLayoutTree, tryLayout} from '../lib';
import type {LayoutOptions} from '../lib';
@@ -31,14 +31,16 @@ const defaultLayoutOptions: LayoutOptions = {
sweepingToParent: true,
};
const defaultOtherOptions = {
- rootOffset: 5, //px (min offset of root tile from display area boundary)
transitionDuration: 300, //ms
- resizeDelay: 100, //ms (delay for non-continous relayout during window-resizing)
};
// Component holds a tree structure representing a subtree of 'tol' to be rendered
// Collects events about tile expansion/collapse and window-resize, and initiates relayout of tiles
export default defineComponent({
+ props: {
+ pos: {type: Array as unknown as PropType<[number,number]>, required: true},
+ dims: {type: Array as unknown as PropType<[number,number]>, required: true},
+ },
data(){
let layoutTree = initLayoutTree(tol, 0);
return {
@@ -46,25 +48,28 @@ export default defineComponent({
activeRoot: layoutTree,
layoutOptions: {...defaultLayoutOptions},
otherOptions: {...defaultOtherOptions},
- width: document.documentElement.clientWidth - (defaultOtherOptions.rootOffset * 2),
- height: document.documentElement.clientHeight - (defaultOtherOptions.rootOffset * 2),
- resizeThrottled: false,
}
},
- methods: {
- onResize(){
- if (!this.resizeThrottled){
- // Update data and relayout tiles
- this.width = document.documentElement.clientWidth - (this.otherOptions.rootOffset * 2);
- this.height = document.documentElement.clientHeight - (this.otherOptions.rootOffset * 2);
- tryLayout(this.activeRoot, [0,0], [this.width,this.height], this.layoutOptions, true);
- // Prevent re-triggering until after a delay
- this.resizeThrottled = true;
- setTimeout(() => {this.resizeThrottled = false;}, this.otherOptions.resizeDelay);
- }
+ watch: {
+ dims(newDims){
+ tryLayout(this.activeRoot, [0,0], newDims, this.layoutOptions, true);
+ },
+ },
+ computed: {
+ styles(){
+ return {
+ position: 'absolute',
+ left: this.pos[0] + 'px',
+ top: this.pos[1] + 'px',
+ width: this.dims[0] + 'px',
+ height: this.dims[1] + 'px',
+ backgroundColor: '#292524',
+ };
},
+ },
+ methods: {
onInnerLeafClicked({layoutNode, domNode}: {layoutNode: LayoutNode, domNode: HTMLElement}){
- let success = tryLayout(this.activeRoot, [0,0], [this.width,this.height], this.layoutOptions, false,
+ let success = tryLayout(this.activeRoot, [0,0], this.dims, this.layoutOptions, false,
{type: 'expand', node: layoutNode});
if (!success){
// Trigger failure animation
@@ -74,7 +79,7 @@ export default defineComponent({
}
},
onInnerHeaderClicked({layoutNode, domNode}: {layoutNode: LayoutNode, domNode: HTMLElement}){
- let success = tryLayout(this.activeRoot, [0,0], [this.width,this.height], this.layoutOptions, false,
+ let success = tryLayout(this.activeRoot, [0,0], this.dims, this.layoutOptions, false,
{type: 'collapse', node: layoutNode});
if (!success){
// Trigger failure animation
@@ -90,7 +95,7 @@ export default defineComponent({
}
LayoutNode.hideUpward(layoutNode);
this.activeRoot = layoutNode;
- tryLayout(layoutNode, [0,0], [this.width,this.height], this.layoutOptions, true,
+ tryLayout(layoutNode, [0,0], this.dims, this.layoutOptions, true,
{type: 'expand', node: layoutNode});
},
onInnerHeaderDblClicked(layoutNode: LayoutNode){
@@ -100,15 +105,11 @@ export default defineComponent({
}
LayoutNode.hideUpward(layoutNode);
this.activeRoot = layoutNode;
- tryLayout(layoutNode, [0,0], [this.width,this.height], this.layoutOptions, true);
+ tryLayout(layoutNode, [0,0], this.dims, this.layoutOptions, true);
},
},
created(){
- window.addEventListener('resize', this.onResize);
- tryLayout(this.activeRoot, [0,0], [this.width,this.height], this.layoutOptions, true);
- },
- unmounted(){
- window.removeEventListener('resize', this.onResize);
+ tryLayout(this.activeRoot, [0,0], this.dims, this.layoutOptions, true);
},
components: {
Tile,
@@ -117,7 +118,7 @@ export default defineComponent({
</script>
<template>
-<div class="h-screen bg-stone-800">
+<div :style="styles">
<tile :layoutNode="layoutTree"
:headerSz="layoutOptions.headerSz" :tileSpacing="layoutOptions.tileSpacing"
:transitionDuration="otherOptions.transitionDuration"