mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Show tooltip with hotbar name manually
Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com>
This commit is contained in:
parent
d40071a9d5
commit
8638de7263
@ -20,12 +20,12 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import "./hotbar-selector.scss";
|
import "./hotbar-selector.scss";
|
||||||
import React from "react";
|
import React, { useRef, useState } from "react";
|
||||||
import { Icon } from "../icon";
|
import { Icon } from "../icon";
|
||||||
import { Badge } from "../badge";
|
import { Badge } from "../badge";
|
||||||
import hotbarManagerInjectable from "../../../common/hotbar-store.injectable";
|
import hotbarManagerInjectable from "../../../common/hotbar-store.injectable";
|
||||||
import { HotbarSwitchCommand } from "./hotbar-switch-command";
|
import { HotbarSwitchCommand } from "./hotbar-switch-command";
|
||||||
import { TooltipPosition } from "../tooltip";
|
import { Tooltip, TooltipPosition } from "../tooltip";
|
||||||
import { observer } from "mobx-react";
|
import { observer } from "mobx-react";
|
||||||
import type { Hotbar } from "../../../common/hotbar-types";
|
import type { Hotbar } from "../../../common/hotbar-types";
|
||||||
import { withInjectables } from "@ogre-tools/injectable-react";
|
import { withInjectables } from "@ogre-tools/injectable-react";
|
||||||
@ -45,25 +45,55 @@ interface Dependencies {
|
|||||||
openCommandOverlay: (component: React.ReactElement) => void;
|
openCommandOverlay: (component: React.ReactElement) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
const NonInjectedHotbarSelector = observer(({ hotbar, hotbarManager, openCommandOverlay }: HotbarSelectorProps & Dependencies) => (
|
const NonInjectedHotbarSelector = observer(({ hotbar, hotbarManager, openCommandOverlay }: HotbarSelectorProps & Dependencies) => {
|
||||||
<div className="HotbarSelector flex align-center">
|
const [tooltipVisible, setTooltipVisible] = useState(false);
|
||||||
<Icon material="play_arrow" className="previous box" onClick={() => hotbarManager.switchToPrevious()} />
|
const tooltipTimeout = useRef<NodeJS.Timeout>();
|
||||||
<div className="box grow flex align-center">
|
|
||||||
<Badge
|
const clearTimer = () => {
|
||||||
id="hotbarIndex"
|
clearTimeout(tooltipTimeout.current);
|
||||||
small
|
}
|
||||||
label={hotbarManager.getDisplayIndex(hotbarManager.getActive())}
|
|
||||||
onClick={() => openCommandOverlay(<HotbarSwitchCommand />)}
|
const onTooltipShow = () => {
|
||||||
tooltip={{
|
setTooltipVisible(true);
|
||||||
preferredPositions: [TooltipPosition.TOP, TooltipPosition.TOP_LEFT],
|
clearTimer();
|
||||||
children: hotbar.name,
|
tooltipTimeout.current = setTimeout(() => setTooltipVisible(false), 1500);
|
||||||
}}
|
};
|
||||||
className="SelectorIndex"
|
|
||||||
/>
|
const onArrowClick = (switchTo: () => void) => {
|
||||||
|
onTooltipShow();
|
||||||
|
switchTo();
|
||||||
|
};
|
||||||
|
|
||||||
|
const onMouseEvent = (event: React.MouseEvent) => {
|
||||||
|
clearTimer();
|
||||||
|
setTooltipVisible(event.type == "mouseenter");
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="HotbarSelector flex align-center">
|
||||||
|
<Icon material="play_arrow" className="previous box" onClick={() => onArrowClick(hotbarManager.switchToPrevious)} />
|
||||||
|
<div className="box grow flex align-center">
|
||||||
|
<Badge
|
||||||
|
id="hotbarIndex"
|
||||||
|
small
|
||||||
|
label={hotbarManager.getDisplayIndex(hotbarManager.getActive())}
|
||||||
|
onClick={() => openCommandOverlay(<HotbarSwitchCommand />)}
|
||||||
|
className="SelectorIndex"
|
||||||
|
onMouseEnter={onMouseEvent}
|
||||||
|
onMouseLeave={onMouseEvent}
|
||||||
|
/>
|
||||||
|
<Tooltip
|
||||||
|
visible={tooltipVisible}
|
||||||
|
targetId="hotbarIndex"
|
||||||
|
preferredPositions={[TooltipPosition.TOP, TooltipPosition.TOP_LEFT]}
|
||||||
|
>
|
||||||
|
{hotbar.name}
|
||||||
|
</Tooltip>
|
||||||
|
</div>
|
||||||
|
<Icon material="play_arrow" className="next box" onClick={() => onArrowClick(hotbarManager.switchToNext)} />
|
||||||
</div>
|
</div>
|
||||||
<Icon material="play_arrow" className="next box" onClick={() => hotbarManager.switchToNext()} />
|
);
|
||||||
</div>
|
});
|
||||||
));
|
|
||||||
|
|
||||||
export const HotbarSelector = withInjectables<Dependencies, HotbarSelectorProps>(NonInjectedHotbarSelector, {
|
export const HotbarSelector = withInjectables<Dependencies, HotbarSelectorProps>(NonInjectedHotbarSelector, {
|
||||||
getProps: (di, props) => ({
|
getProps: (di, props) => ({
|
||||||
|
|||||||
@ -70,7 +70,7 @@ export class Tooltip extends React.Component<TooltipProps> {
|
|||||||
|
|
||||||
@observable.ref elem: HTMLElement;
|
@observable.ref elem: HTMLElement;
|
||||||
@observable activePosition: TooltipPosition;
|
@observable activePosition: TooltipPosition;
|
||||||
@observable isVisible = !!this.props.visible;
|
@observable isVisible = false;
|
||||||
|
|
||||||
constructor(props: TooltipProps) {
|
constructor(props: TooltipProps) {
|
||||||
super(props);
|
super(props);
|
||||||
@ -92,6 +92,11 @@ export class Tooltip extends React.Component<TooltipProps> {
|
|||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
this.hoverTarget.addEventListener("mouseenter", this.onEnterTarget);
|
this.hoverTarget.addEventListener("mouseenter", this.onEnterTarget);
|
||||||
this.hoverTarget.addEventListener("mouseleave", this.onLeaveTarget);
|
this.hoverTarget.addEventListener("mouseleave", this.onLeaveTarget);
|
||||||
|
this.refreshPosition();
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidUpdate() {
|
||||||
|
this.refreshPosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillUnmount() {
|
componentWillUnmount() {
|
||||||
@ -226,9 +231,9 @@ export class Tooltip extends React.Component<TooltipProps> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { style, formatters, usePortal, children } = this.props;
|
const { style, formatters, usePortal, children, visible } = this.props;
|
||||||
const className = cssNames("Tooltip", this.props.className, formatters, this.activePosition, {
|
const className = cssNames("Tooltip", this.props.className, formatters, this.activePosition, {
|
||||||
invisible: !this.isVisible,
|
invisible: visible === undefined ? !this.isVisible : !visible,
|
||||||
formatter: !!formatters,
|
formatter: !!formatters,
|
||||||
});
|
});
|
||||||
const tooltip = (
|
const tooltip = (
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user