diff --git a/src/lib/Icon.svelte b/src/lib/Icon.svelte index ac34fdc..bae3011 100644 --- a/src/lib/Icon.svelte +++ b/src/lib/Icon.svelte @@ -2,19 +2,22 @@ export let icon; export let info; export let activity; - import { createEventDispatcher } from 'svelte'; - const dispatch = createEventDispatcher(); + const dispatch = createEventDispatcher(); function handleMouseover() { dispatch('mouseover', info); } + function handleClick() { + dispatch('click', { icon, info }); + }
- + on:click={handleClick} +> +
diff --git a/src/lib/SideBar.svelte b/src/lib/SideBar.svelte index 8d7ee33..4efd626 100644 --- a/src/lib/SideBar.svelte +++ b/src/lib/SideBar.svelte @@ -8,8 +8,7 @@ import PostsTab from './PostsTab.svelte'; import DiscordTab from './DiscordTab.svelte'; import GitHubTab from './GitHubTab.svelte'; - import { cpuActivity, diskActivity, aiActivity } from './activities.js' - + import { cpuActivity, diskActivity, aiActivity } from './activities.js'; const icons = [ { icon: 'fas fa-info-circle', info: 'Information', activity: null }, { icon: 'fas fa-wifi', info: 'Networking', activity: null }, @@ -21,21 +20,40 @@ { icon: 'fab fa-discord', info: 'Discord', activity: null }, { icon: 'fab fa-github', info: 'GitHub', activity: null }, ]; - - let activeInfo = null; + let activeInfo = null; // Tracks currently visible info. + let hideTimeout = 0; // Timeout for hiding info panel. function showInfo(info) { + clearTimeout(hideTimeout); + hideTimeout = 0; activeInfo = info; } - function hideInfo() { - activeInfo = null; + // Prevents multiple timers and hides the info panel after 400ms unless interrupted. + clearTimeout(hideTimeout); + hideTimeout = setTimeout(() => { + activeInfo = null; + hideTimeout = 0; + }, 400); + } + function handleMouseEnterPanel() { + clearTimeout(hideTimeout); + hideTimeout = 0; + } + // Toggles the info panel for the clicked icon. + function handleClick(icon) { + // Hides the panel if the icon is active. Otherwise, shows the panel with info. + if (activeInfo === icon.info) { + activeInfo = null; + } else { + activeInfo = icon.info; + } } export let handleTool; -
+
{#each icons as i} {#if i} @@ -44,13 +62,19 @@ info={i.info} activity={i.activity} on:mouseover={(e) => showInfo(e.detail)} + on:click={() => handleClick(i)} /> {:else} -
showInfo(null)}>
+
{/if} {/each}
-
+
{#if activeInfo === 'Information'} @@ -72,6 +96,7 @@ {:else}

TODO: {activeInfo}

{/if} +