diff --git a/src/renderer/components/hotbar/hotbar-selector.tsx b/src/renderer/components/hotbar/hotbar-selector.tsx
index 34f0ecf847..d0e25bf437 100644
--- a/src/renderer/components/hotbar/hotbar-selector.tsx
+++ b/src/renderer/components/hotbar/hotbar-selector.tsx
@@ -20,12 +20,12 @@
*/
import "./hotbar-selector.scss";
-import React from "react";
+import React, { useRef, useState } from "react";
import { Icon } from "../icon";
import { Badge } from "../badge";
import hotbarManagerInjectable from "../../../common/hotbar-store.injectable";
import { HotbarSwitchCommand } from "./hotbar-switch-command";
-import { TooltipPosition } from "../tooltip";
+import { Tooltip, TooltipPosition } from "../tooltip";
import { observer } from "mobx-react";
import type { Hotbar } from "../../../common/hotbar-types";
import { withInjectables } from "@ogre-tools/injectable-react";
@@ -45,25 +45,55 @@ interface Dependencies {
openCommandOverlay: (component: React.ReactElement) => void;
}
-const NonInjectedHotbarSelector = observer(({ hotbar, hotbarManager, openCommandOverlay }: HotbarSelectorProps & Dependencies) => (
-
-
hotbarManager.switchToPrevious()} />
-
-
openCommandOverlay()}
- tooltip={{
- preferredPositions: [TooltipPosition.TOP, TooltipPosition.TOP_LEFT],
- children: hotbar.name,
- }}
- className="SelectorIndex"
- />
+const NonInjectedHotbarSelector = observer(({ hotbar, hotbarManager, openCommandOverlay }: HotbarSelectorProps & Dependencies) => {
+ const [tooltipVisible, setTooltipVisible] = useState(false);
+ const tooltipTimeout = useRef();
+
+ const clearTimer = () => {
+ clearTimeout(tooltipTimeout.current);
+ }
+
+ const onTooltipShow = () => {
+ setTooltipVisible(true);
+ clearTimer();
+ tooltipTimeout.current = setTimeout(() => setTooltipVisible(false), 1500);
+ };
+
+ const onArrowClick = (switchTo: () => void) => {
+ onTooltipShow();
+ switchTo();
+ };
+
+ const onMouseEvent = (event: React.MouseEvent) => {
+ clearTimer();
+ setTooltipVisible(event.type == "mouseenter");
+ };
+
+ return (
+
+
onArrowClick(hotbarManager.switchToPrevious)} />
+
+ openCommandOverlay()}
+ className="SelectorIndex"
+ onMouseEnter={onMouseEvent}
+ onMouseLeave={onMouseEvent}
+ />
+
+ {hotbar.name}
+
+
+ onArrowClick(hotbarManager.switchToNext)} />
- hotbarManager.switchToNext()} />
-
-));
+ );
+});
export const HotbarSelector = withInjectables(NonInjectedHotbarSelector, {
getProps: (di, props) => ({
diff --git a/src/renderer/components/tooltip/tooltip.tsx b/src/renderer/components/tooltip/tooltip.tsx
index 179224ee32..de41b09623 100644
--- a/src/renderer/components/tooltip/tooltip.tsx
+++ b/src/renderer/components/tooltip/tooltip.tsx
@@ -70,7 +70,7 @@ export class Tooltip extends React.Component {
@observable.ref elem: HTMLElement;
@observable activePosition: TooltipPosition;
- @observable isVisible = !!this.props.visible;
+ @observable isVisible = false;
constructor(props: TooltipProps) {
super(props);
@@ -92,6 +92,11 @@ export class Tooltip extends React.Component {
componentDidMount() {
this.hoverTarget.addEventListener("mouseenter", this.onEnterTarget);
this.hoverTarget.addEventListener("mouseleave", this.onLeaveTarget);
+ this.refreshPosition();
+ }
+
+ componentDidUpdate() {
+ this.refreshPosition();
}
componentWillUnmount() {
@@ -226,9 +231,9 @@ export class Tooltip extends React.Component {
}
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, {
- invisible: !this.isVisible,
+ invisible: visible === undefined ? !this.isVisible : !visible,
formatter: !!formatters,
});
const tooltip = (