diff --git a/src/components/views/VersionsView.tsx b/src/components/views/VersionsView.tsx
index 4be1c52..94f8ead 100644
--- a/src/components/views/VersionsView.tsx
+++ b/src/components/views/VersionsView.tsx
@@ -1,4 +1,11 @@
-import { useState, useEffect, useRef, memo } from "react";
+import {
+ useState,
+ useEffect,
+ useLayoutEffect,
+ useRef,
+ useCallback,
+ memo,
+} from "react";
import { useTranslation } from "react-i18next";
import { motion } from "framer-motion";
import { TauriService, PlaytimeResponse } from "../../services/TauriService";
@@ -54,6 +61,9 @@ const DeleteConfirmButton = memo(function DeleteConfirmButton({
);
});
+const ROW_ESTIMATE = 52;
+const ROW_GAP = 4;
+
function formatPlaytime(seconds: number): string {
const h = Math.floor(seconds / 3600);
const m = Math.floor((seconds % 3600) / 60);
@@ -66,7 +76,6 @@ const VersionsView = memo(function VersionsView() {
const { t } = useTranslation();
const { setActiveView } = useUI();
const {
- profile: selectedProfile,
setProfile: setSelectedProfile,
animationsEnabled,
instanceLaunchArgs,
@@ -83,7 +92,6 @@ const VersionsView = memo(function VersionsView() {
addCustomEdition: onAddEdition,
updateCustomEdition: onUpdateEdition,
downloadingIds,
- downloadProgress,
updatesAvailable,
addToSteam,
cycleBranch,
@@ -138,7 +146,106 @@ const VersionsView = memo(function VersionsView() {
const [argsSchemas, setArgsSchemas] = useState
>({});
const containerRef = useRef(null);
const listRef = useRef(null);
+ const menuRef = useRef(null);
+ const [menuDir, setMenuDir] = useState<"down" | "up">("down");
const ITEM_COUNT = visibleEditions.length + 3;
+ const [visibleRange, setVisibleRange] = useState<{
+ start: number;
+ end: number;
+ }>({
+ start: 0,
+ end: visibleEditions.length ? visibleEditions.length - 1 : 0,
+ });
+ const itemHeightsRef = useRef([]);
+ const observersRef = useRef