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 + ')'"
[keyAction]="keyActions[i]"
(click)="onKeyClick(i)"
(mouseover)="onKeyHover(i, $event, true)"
(mouseenter)="onKeyHover(i, $event, true)"
(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">
<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"
[@layerState]="layer.animation"
[moduleConfig]="layer.modules"
@@ -10,8 +10,8 @@
</svg-keyboard>
</div>
<popover *ngIf="popoverShown" [defaultKeyAction]="popoverInitKeyAction" [currentKeymap]="keymap" (cancel)="hidePopover()" (remap)="onRemap($event)"></popover>
<div class="tooltip top fade" role="tooltip"
[class.in]="tooltipData.shown"
<div class="tooltip bottom"
[class.in]="tooltipData.show"
[style.top.px]="tooltipData.posTop"
[style.left.px]="tooltipData.posLeft"
>

View File

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

View File

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