From d19e4e971f737b491742e8b77e411ae5fbc73bb4 Mon Sep 17 00:00:00 2001 From: Terry Truong Date: Thu, 24 Mar 2022 14:57:45 +1100 Subject: Add TileInfoModal and associated events --- src/components/ParentBar.vue | 7 +++++- src/components/Tile.vue | 11 +++++++--- src/components/TileImg.vue | 3 ++- src/components/TileInfoModal.vue | 46 ++++++++++++++++++++++++++++++++++++++++ src/components/TileTree.vue | 19 ++++++++++++++--- 5 files changed, 78 insertions(+), 8 deletions(-) create mode 100644 src/components/TileInfoModal.vue (limited to 'src') diff --git a/src/components/ParentBar.vue b/src/components/ParentBar.vue index 26061b7..0f73008 100644 --- a/src/components/ParentBar.vue +++ b/src/components/ParentBar.vue @@ -54,16 +54,21 @@ export default defineComponent({ onClick(node: LayoutNode){ this.$emit('sepd-parent-clicked', node); }, + onInnerInfoIconClicked(data: LayoutNode){ + this.$emit('info-icon-clicked', data); + } }, components: { TileImg, }, + emits: ['sepd-parent-clicked', 'info-icon-clicked'], }); diff --git a/src/components/Tile.vue b/src/components/Tile.vue index 579e880..7722101 100644 --- a/src/components/Tile.vue +++ b/src/components/Tile.vue @@ -181,19 +181,23 @@ export default defineComponent({ onNonLeafMouseLeave(evt: Event){ this.nonLeafHighlight = false; }, + // For child event propagation + onInnerInfoIconClicked(data: LayoutNode){ + this.$emit('info-icon-clicked', data); + } }, name: 'tile', // Need this to use self in template components: { TileImg, }, - emits: ['leaf-clicked', 'header-clicked', 'leaf-dbl-clicked', 'header-dbl-clicked'], + emits: ['leaf-clicked', 'header-clicked', 'leaf-dbl-clicked', 'header-dbl-clicked', 'info-icon-clicked'], }); diff --git a/src/components/TileImg.vue b/src/components/TileImg.vue index 5a3a2f8..2445f98 100644 --- a/src/components/TileImg.vue +++ b/src/components/TileImg.vue @@ -86,9 +86,10 @@ export default defineComponent({ this.infoMouseOver = false; }, onInfoClick(evt: Event){ - console.log('Clicked on info icon: ' + this.layoutNode.tolNode.name); + this.$emit('info-icon-clicked', this.layoutNode); }, }, + emits: ['info-icon-clicked'], }); diff --git a/src/components/TileInfoModal.vue b/src/components/TileInfoModal.vue new file mode 100644 index 0000000..6e0e99c --- /dev/null +++ b/src/components/TileInfoModal.vue @@ -0,0 +1,46 @@ + + + diff --git a/src/components/TileTree.vue b/src/components/TileTree.vue index d42dd24..0b1cc58 100644 --- a/src/components/TileTree.vue +++ b/src/components/TileTree.vue @@ -2,6 +2,7 @@ import {defineComponent, PropType} from 'vue'; import Tile from './Tile.vue'; import ParentBar from './ParentBar.vue'; +import TileInfoModal from './TileInfoModal.vue'; import {TolNode, LayoutNode, initLayoutTree, tryLayout} from '../lib'; import type {LayoutOptions} from '../lib'; // Import paths lack a .ts or .js extension because .ts makes vue-tsc complain, and .js makes vite complain @@ -67,6 +68,7 @@ export default defineComponent({ return { layoutTree: layoutTree, activeRoot: layoutTree, + infoModalNode: null as TolNode | null, // Hides/unhides info modal, and provides the node to display // Options layoutOptions: {...defaultLayoutOptions}, componentOptions: {...defaultComponentOptions}, @@ -148,7 +150,7 @@ export default defineComponent({ setTimeout(() => {this.resizeThrottled = false;}, this.resizeDelay); } }, - // For click events + // For tile expand/collapse events onInnerLeafClicked({layoutNode, domNode}: {layoutNode: LayoutNode, domNode: HTMLElement}){ let success = tryLayout(this.activeRoot, this.tileAreaPos, this.tileAreaDims, this.layoutOptions, false, {type: 'expand', node: layoutNode}); @@ -169,6 +171,7 @@ export default defineComponent({ domNode.classList.add('animate-shrink-expand'); } }, + // For expand-to-view events onInnerLeafDblClicked(layoutNode: LayoutNode){ if (layoutNode == this.activeRoot){ console.log('Ignored expand-to-view on root node'); @@ -193,6 +196,13 @@ export default defineComponent({ this.activeRoot = layoutNode; tryLayout(layoutNode, this.tileAreaPos, this.tileAreaDims, this.layoutOptions, true); }, + // For info modal events + onInnerInfoIconClicked(node: LayoutNode){ + this.infoModalNode = node.tolNode; + }, + onInfoModalClose(){ + this.infoModalNode = null; + }, // For preventing double-clicks from highlighting text onMouseDown(evt: UIEvent){ if (evt.detail == 2){ @@ -210,6 +220,7 @@ export default defineComponent({ components: { Tile, ParentBar, + TileInfoModal, }, }); @@ -219,10 +230,12 @@ export default defineComponent({ + @leaf-dbl-clicked="onInnerLeafDblClicked" @header-dbl-clicked="onInnerHeaderDblClicked" + @info-icon-clicked="onInnerInfoIconClicked"/> + @sepd-parent-clicked="onSepdParentClicked" @info-icon-clicked="onInnerInfoIconClicked"/> + -- cgit v1.2.3