Tooltip UX fixes (#202)

Fixes #102
This commit is contained in:
Nejc Zdovc
2016-11-29 20:53:24 +01:00
committed by József Farkas
parent 95187afe6a
commit 01214e58b5
4 changed files with 22 additions and 30 deletions

View File

@@ -6,6 +6,6 @@
[attr.transform]="'translate(' + key.x + ' ' + key.y + ')'" [attr.transform]="'translate(' + key.x + ' ' + key.y + ')'"
[keyAction]="keyActions[i]" [keyAction]="keyActions[i]"
(click)="onKeyClick(i)" (click)="onKeyClick(i)"
(mouseover)="onKeyHover(i, $event, true)" (mouseenter)="onKeyHover(i, $event, true)"
(mouseleave)="onKeyHover(i, $event, false)" (mouseleave)="onKeyHover(i, $event, false)"
/> />

Before

Width:  |  Height:  |  Size: 483 B

After

Width:  |  Height:  |  Size: 484 B

View File

@@ -1,6 +1,6 @@
<template ngIf="layers"> <template ngIf="layers">
<layers [class.disabled]="popoverShown" (select)="selectLayer($event.oldIndex, $event.index)" [current]="currentLayer"></layers> <layers [class.disabled]="popoverShown" (select)="selectLayer($event.oldIndex, $event.index)" [current]="currentLayer"></layers>
<div class="keyboard-slider" (mouseout)="hideTooltip($event)"> <div class="keyboard-slider">
<svg-keyboard *ngFor="let layer of layers; trackBy: trackKeyboard" <svg-keyboard *ngFor="let layer of layers; trackBy: trackKeyboard"
[@layerState]="layer.animation" [@layerState]="layer.animation"
[moduleConfig]="layer.modules" [moduleConfig]="layer.modules"
@@ -10,8 +10,8 @@
</svg-keyboard> </svg-keyboard>
</div> </div>
<popover *ngIf="popoverShown" [defaultKeyAction]="popoverInitKeyAction" [currentKeymap]="keymap" (cancel)="hidePopover()" (remap)="onRemap($event)"></popover> <popover *ngIf="popoverShown" [defaultKeyAction]="popoverInitKeyAction" [currentKeymap]="keymap" (cancel)="hidePopover()" (remap)="onRemap($event)"></popover>
<div class="tooltip top fade" role="tooltip" <div class="tooltip bottom"
[class.in]="tooltipData.shown" [class.in]="tooltipData.show"
[style.top.px]="tooltipData.posTop" [style.top.px]="tooltipData.posTop"
[style.left.px]="tooltipData.posLeft" [style.left.px]="tooltipData.posLeft"
> >

View File

@@ -22,7 +22,8 @@ svg-keyboard {
} }
.tooltip { .tooltip {
position: fixed; position: fixed;
transform: translate(-50%, -85%); transform: translate(-50%, -6px);
display: none;
&-inner { &-inner {
background: #fff; background: #fff;
@@ -39,13 +40,15 @@ svg-keyboard {
} }
} }
&.top { &.bottom {
.tooltip-arrow { .tooltip-arrow {
border-top-color: #fff; border-bottom-color: #fff;
top: 1px;
} }
} }
&.in { &.in {
display: block;
opacity: 1; opacity: 1;
} }
} }

View File

@@ -97,7 +97,7 @@ export class SvgKeyboardWrapComponent implements OnChanges {
private keyEditConfig: { moduleId: number, keyId: number }; private keyEditConfig: { moduleId: number, keyId: number };
private popoverInitKeyAction: KeyAction; private popoverInitKeyAction: KeyAction;
private currentLayer: number = 0; private currentLayer: number = 0;
private tooltipData: { posTop: number, posLeft: number, content: { name: string, value: string }[], shown: boolean }; private tooltipData: { posTop: number, posLeft: number, content: { name: string, value: string }[], show: boolean };
private layers: Layer[]; private layers: Layer[];
constructor(private store: Store<AppState>, private mapper: MapperService) { constructor(private store: Store<AppState>, private mapper: MapperService) {
@@ -110,7 +110,7 @@ export class SvgKeyboardWrapComponent implements OnChanges {
posTop: 0, posTop: 0,
posLeft: 0, posLeft: 0,
content: [], content: [],
shown: false show: false
}; };
} }
@@ -142,13 +142,13 @@ export class SvgKeyboardWrapComponent implements OnChanges {
} }
onKeyHover(moduleId: number, event: MouseEvent, over: boolean, keyId: number): void { onKeyHover(moduleId: number, event: MouseEvent, over: boolean, keyId: number): void {
let keyActionToEdit: KeyAction = this.layers[this.currentLayer].modules[moduleId].keyActions[keyId];
if (this.tooltipEnabled) { if (this.tooltipEnabled) {
const keyActionToEdit: KeyAction = this.layers[this.currentLayer].modules[moduleId].keyActions[keyId];
if (over) { if (over) {
this.showTooltip(keyActionToEdit, event); this.showTooltip(keyActionToEdit, event);
} else { } else {
this.hideTooltip(event); this.hideTooltip();
} }
} }
} }
@@ -171,19 +171,18 @@ export class SvgKeyboardWrapComponent implements OnChanges {
} }
showTooltip(keyAction: KeyAction, event: MouseEvent): void { showTooltip(keyAction: KeyAction, event: MouseEvent): void {
if (keyAction === undefined) { if (keyAction === undefined) {
return; return;
} }
let el: Element = event.target as Element || event.srcElement; const el: Element = event.target as Element || event.srcElement;
let position: ClientRect = el.getBoundingClientRect(); const position: ClientRect = el.getBoundingClientRect();
let posLeft: number = this.tooltipData.posLeft; let posLeft: number = this.tooltipData.posLeft;
let posTop: number = this.tooltipData.posTop; let posTop: number = this.tooltipData.posTop;
if (el.tagName === 'rect') { if (el.tagName === 'g') {
posLeft = position.left + (position.width / 2); posLeft = position.left + (position.width / 2);
posTop = position.top; posTop = position.top + position.height;
} }
let content: { let content: {
@@ -294,22 +293,12 @@ export class SvgKeyboardWrapComponent implements OnChanges {
posLeft: posLeft, posLeft: posLeft,
posTop: posTop, posTop: posTop,
content, content,
shown: true show: true
}; };
} }
hideTooltip(event: MouseEvent) { hideTooltip() {
let target: HTMLElement = event.relatedTarget as HTMLElement; this.tooltipData.show = false;
if (!target) {
this.tooltipData.shown = false;
return;
}
// Check if we are hovering tooltip
let list: DOMTokenList = target.classList;
if (!list.contains('tooltip') && !list.contains('tooltip-inner')) {
this.tooltipData.shown = false;
}
} }
hidePopover(): void { hidePopover(): void {