diff --git a/public/Skins/700.png b/public/Skins/700.png new file mode 100644 index 0000000..b6b61ed Binary files /dev/null and b/public/Skins/700.png differ diff --git a/src/components/views/ScreenshotsView.tsx b/src/components/views/ScreenshotsView.tsx index d215569..c0aa53a 100644 --- a/src/components/views/ScreenshotsView.tsx +++ b/src/components/views/ScreenshotsView.tsx @@ -1,14 +1,23 @@ import { useState, useEffect, memo } from "react"; import { motion, AnimatePresence } from "framer-motion"; -import { useUI, useAudio, useGame, useConfig } from "../../context/LauncherContext"; -import { ScreenshotService, ScreenshotInfo } from "../../services/ScreenshotService"; +import { + useUI, + useAudio, + useGame, + useConfig, +} from "../../context/LauncherContext"; +import { + ScreenshotService, + ScreenshotInfo, +} from "../../services/ScreenshotService"; const ScreenshotsView = memo(function ScreenshotsView() { const { setActiveView } = useUI(); const { playPressSound, playBackSound } = useAudio(); const { editions } = useGame(); const { animationsEnabled } = useConfig(); const [screenshots, setScreenshots] = useState([]); - const [selectedScreenshot, setSelectedScreenshot] = useState(null); + const [selectedScreenshot, setSelectedScreenshot] = + useState(null); const [loading, setLoading] = useState(true); const [gridFocusIndex, setGridFocusIndex] = useState(0); const [modalFocusIndex, setModalFocusIndex] = useState(0); @@ -35,7 +44,9 @@ const ScreenshotsView = memo(function ScreenshotsView() { if (!selectedScreenshot) return; playPressSound(); await ScreenshotService.deleteScreenshot(selectedScreenshot.path); - setScreenshots((prev) => prev.filter((s) => s.path !== selectedScreenshot.path)); + setScreenshots((prev) => + prev.filter((s) => s.path !== selectedScreenshot.path), + ); setSelectedScreenshot(null); setShowDeleteConfirm(false); }; @@ -47,7 +58,11 @@ const ScreenshotsView = memo(function ScreenshotsView() { if (e.key === "Escape" || e.key === "Backspace") { playBackSound(); setShowDeleteConfirm(false); - } else if (e.key === "ArrowLeft" || e.key === "ArrowRight" || e.key === "Tab") { + } else if ( + e.key === "ArrowLeft" || + e.key === "ArrowRight" || + e.key === "Tab" + ) { e.preventDefault(); playPressSound(); setDeleteConfirmFocusIndex((prev) => (prev === 0 ? 1 : 0)); @@ -78,8 +93,7 @@ const ScreenshotsView = memo(function ScreenshotsView() { playPressSound(); setDeleteConfirmFocusIndex(0); setShowDeleteConfirm(true); - } - else if (modalFocusIndex === 2) { + } else if (modalFocusIndex === 2) { playBackSound(); setSelectedScreenshot(null); } @@ -87,17 +101,22 @@ const ScreenshotsView = memo(function ScreenshotsView() { return; } - const cols = window.innerWidth >= 1024 ? 4 : window.innerWidth >= 768 ? 3 : 2; + const cols = + window.innerWidth >= 1024 ? 4 : window.innerWidth >= 768 ? 3 : 2; if (e.key === "Escape" || e.key === "Backspace") { handleBack(); } else if (e.key === "ArrowLeft") { setGridFocusIndex((prev) => (prev > 0 ? prev - 1 : prev)); } else if (e.key === "ArrowRight") { - setGridFocusIndex((prev) => (prev < screenshots.length - 1 ? prev + 1 : prev)); + setGridFocusIndex((prev) => + prev < screenshots.length - 1 ? prev + 1 : prev, + ); } else if (e.key === "ArrowUp") { setGridFocusIndex((prev) => (prev >= cols ? prev - cols : prev)); } else if (e.key === "ArrowDown") { - setGridFocusIndex((prev) => (prev <= screenshots.length - 1 - cols ? prev + cols : prev)); + setGridFocusIndex((prev) => + prev <= screenshots.length - 1 - cols ? prev + cols : prev, + ); } else if (e.key === "Enter") { if (screenshots[gridFocusIndex]) { playPressSound(); @@ -109,7 +128,15 @@ const ScreenshotsView = memo(function ScreenshotsView() { window.addEventListener("keydown", handleKeyDown); return () => window.removeEventListener("keydown", handleKeyDown); - }, [loading, selectedScreenshot, gridFocusIndex, modalFocusIndex, screenshots, showDeleteConfirm, deleteConfirmFocusIndex]); + }, [ + loading, + selectedScreenshot, + gridFocusIndex, + modalFocusIndex, + screenshots, + showDeleteConfirm, + deleteConfirmFocusIndex, + ]); useEffect(() => { if (!selectedScreenshot) { @@ -139,12 +166,18 @@ const ScreenshotsView = memo(function ScreenshotsView() {
{loading ? (
- Scanning Archives... + + Scanning Archives... +
) : screenshots.length === 0 ? (
- No screenshots found - Take some in-game with F2 + + No screenshots found + + + Take some in-game with F2 +
) : (
@@ -165,19 +198,23 @@ const ScreenshotsView = memo(function ScreenshotsView() { `} style={{ backgroundImage: "url('/images/frame_background.png')", - backgroundSize: '100% 100%', - imageRendering: 'pixelated', - boxShadow: gridFocusIndex === index ? '0 0 20px rgba(255, 255, 85, 0.2)' : 'none', + backgroundSize: "100% 100%", + imageRendering: "pixelated", + boxShadow: + gridFocusIndex === index + ? "0 0 20px rgba(255, 255, 85, 0.2)" + : "none", }} >
{ss.name} { - (e.target as HTMLImageElement).src = "/images/Folder_Icon.png"; + (e.target as HTMLImageElement).src = + "/images/Folder_Icon.png"; }} />
@@ -212,11 +249,17 @@ const ScreenshotsView = memo(function ScreenshotsView() { `} style={{ backgroundImage: "url('/images/Button_Background.png')", - backgroundSize: '100% 100%', - imageRendering: 'pixelated' + backgroundSize: "100% 100%", + imageRendering: "pixelated", + }} + onMouseEnter={(e) => { + (e.currentTarget as HTMLButtonElement).style.backgroundImage = + "url('/images/button_highlighted.png')"; + }} + onMouseLeave={(e) => { + (e.currentTarget as HTMLButtonElement).style.backgroundImage = + "url('/images/Button_Background.png')"; }} - onMouseEnter={(e) => { (e.currentTarget as HTMLButtonElement).style.backgroundImage = "url('/images/button_highlighted.png')"; }} - onMouseLeave={(e) => { (e.currentTarget as HTMLButtonElement).style.backgroundImage = "url('/images/Button_Background.png')"; }} > Back @@ -239,17 +282,18 @@ const ScreenshotsView = memo(function ScreenshotsView() { className="relative max-w-5xl w-full flex flex-col items-center border-2 border-[#555] rounded-sm p-2" style={{ backgroundImage: "url('/images/frame_background.png')", - backgroundSize: '100% 100%', - imageRendering: 'pixelated', + backgroundSize: "100% 100%", + imageRendering: "pixelated", }} onClick={(e) => e.stopPropagation()} >
{ - (e.target as HTMLImageElement).src = "/images/Pack_Icon.png"; + (e.target as HTMLImageElement).src = + "/images/Pack_Icon.png"; }} />
@@ -258,7 +302,10 @@ const ScreenshotsView = memo(function ScreenshotsView() { {selectedScreenshot.name} - Captured on {new Date(selectedScreenshot.date * 1000).toLocaleString()} + Captured on{" "} + {new Date( + selectedScreenshot.date * 1000, + ).toLocaleString()}
{getEditionLogo(selectedScreenshot.instanceId) && ( @@ -280,9 +327,12 @@ const ScreenshotsView = memo(function ScreenshotsView() { ${modalFocusIndex === 0 ? "text-[#FFFF55] scale-105" : "text-white"} `} style={{ - backgroundImage: modalFocusIndex === 0 ? "url('/images/button_highlighted.png')" : "url('/images/Button_Background.png')", - backgroundSize: '100% 100%', - imageRendering: 'pixelated', + backgroundImage: + modalFocusIndex === 0 + ? "url('/images/button_highlighted.png')" + : "url('/images/Button_Background.png')", + backgroundSize: "100% 100%", + imageRendering: "pixelated", }} > OPEN FOLDER @@ -299,9 +349,12 @@ const ScreenshotsView = memo(function ScreenshotsView() { ${modalFocusIndex === 1 ? "text-[#FF5555] scale-105" : "text-white"} `} style={{ - backgroundImage: modalFocusIndex === 1 ? "url('/images/button_highlighted.png')" : "url('/images/Button_Background.png')", - backgroundSize: '100% 100%', - imageRendering: 'pixelated', + backgroundImage: + modalFocusIndex === 1 + ? "url('/images/button_highlighted.png')" + : "url('/images/Button_Background.png')", + backgroundSize: "100% 100%", + imageRendering: "pixelated", }} > DELETE @@ -314,9 +367,12 @@ const ScreenshotsView = memo(function ScreenshotsView() { ${modalFocusIndex === 2 ? "text-[#FFFF55] scale-105" : "text-white"} `} style={{ - backgroundImage: modalFocusIndex === 2 ? "url('/images/button_highlighted.png')" : "url('/images/Button_Background.png')", - backgroundSize: '100% 100%', - imageRendering: 'pixelated', + backgroundImage: + modalFocusIndex === 2 + ? "url('/images/button_highlighted.png')" + : "url('/images/Button_Background.png')", + backgroundSize: "100% 100%", + imageRendering: "pixelated", }} > CLOSE @@ -342,8 +398,8 @@ const ScreenshotsView = memo(function ScreenshotsView() { className="w-[420px] p-6 border-2 border-[#555] rounded-sm flex flex-col items-center" style={{ backgroundImage: "url('/images/frame_background.png')", - backgroundSize: '100% 100%', - imageRendering: 'pixelated', + backgroundSize: "100% 100%", + imageRendering: "pixelated", }} onClick={(e) => e.stopPropagation()} > @@ -354,15 +410,21 @@ const ScreenshotsView = memo(function ScreenshotsView() {
@@ -314,18 +361,31 @@ const VersionsView = memo(function VersionsView() { e.stopPropagation(); handleCancelDownload(); }} - onMouseEnter={() => setHoveredBtn({ row: i, btn: 'cancel' })} + onMouseEnter={() => + setHoveredBtn({ row: i, btn: "cancel" }) + } onMouseLeave={() => setHoveredBtn(null)} className="w-8 h-8 flex items-center justify-center text-red-600" style={{ - backgroundImage: (hoveredBtn?.row === i && hoveredBtn?.btn === 'cancel') || (focusIndex === i && focusBtn === 1) - ? "url('/images/Button_Square_Highlighted.png')" - : "url('/images/Button_Square.png')", + backgroundImage: + (hoveredBtn?.row === i && + hoveredBtn?.btn === "cancel") || + (focusIndex === i && focusBtn === 1) + ? "url('/images/Button_Square_Highlighted.png')" + : "url('/images/Button_Square.png')", backgroundSize: "100% 100%", imageRendering: "pixelated", }} > - + @@ -337,13 +397,18 @@ const VersionsView = memo(function VersionsView() { e.stopPropagation(); if (!downloadingId) toggleInstall(edition.id); }} - onMouseEnter={() => setHoveredBtn({ row: i, btn: 'download' })} + onMouseEnter={() => + setHoveredBtn({ row: i, btn: "download" }) + } onMouseLeave={() => setHoveredBtn(null)} className={`w-8 h-8 flex items-center justify-center ${downloadingId ? "text-gray-400 cursor-not-allowed" : "text-[#3a3a3a]"}`} style={{ - backgroundImage: (hoveredBtn?.row === i && hoveredBtn?.btn === 'download') || (focusIndex === i && focusBtn === 1) - ? "url('/images/Button_Square_Highlighted.png')" - : "url('/images/Button_Square.png')", + backgroundImage: + (hoveredBtn?.row === i && + hoveredBtn?.btn === "download") || + (focusIndex === i && focusBtn === 1) + ? "url('/images/Button_Square_Highlighted.png')" + : "url('/images/Button_Square.png')", backgroundSize: "100% 100%", imageRendering: "pixelated", opacity: downloadingId ? 0.5 : 1, @@ -366,18 +431,31 @@ const VersionsView = memo(function VersionsView() { e.stopPropagation(); handleCancelDownload(); }} - onMouseEnter={() => setHoveredBtn({ row: i, btn: 'cancel' })} + onMouseEnter={() => + setHoveredBtn({ row: i, btn: "cancel" }) + } onMouseLeave={() => setHoveredBtn(null)} className="w-8 h-8 flex items-center justify-center text-red-600" style={{ - backgroundImage: (hoveredBtn?.row === i && hoveredBtn?.btn === 'cancel') || (focusIndex === i && focusBtn === 1) - ? "url('/images/Button_Square_Highlighted.png')" - : "url('/images/Button_Square.png')", + backgroundImage: + (hoveredBtn?.row === i && + hoveredBtn?.btn === "cancel") || + (focusIndex === i && focusBtn === 1) + ? "url('/images/Button_Square_Highlighted.png')" + : "url('/images/Button_Square.png')", backgroundSize: "100% 100%", imageRendering: "pixelated", }} > - + @@ -388,13 +466,18 @@ const VersionsView = memo(function VersionsView() { e.stopPropagation(); if (!downloadingId) toggleInstall(edition.id); }} - onMouseEnter={() => setHoveredBtn({ row: i, btn: 'update' })} + onMouseEnter={() => + setHoveredBtn({ row: i, btn: "update" }) + } onMouseLeave={() => setHoveredBtn(null)} className={`w-8 h-8 flex items-center justify-center ${downloadingId ? "text-gray-400 cursor-not-allowed" : "text-[#3a3a3a]"}`} style={{ - backgroundImage: (hoveredBtn?.row === i && hoveredBtn?.btn === 'update') || (focusIndex === i && focusBtn === 1) - ? "url('/images/Button_Square_Highlighted.png')" - : "url('/images/Button_Square.png')", + backgroundImage: + (hoveredBtn?.row === i && + hoveredBtn?.btn === "update") || + (focusIndex === i && focusBtn === 1) + ? "url('/images/Button_Square_Highlighted.png')" + : "url('/images/Button_Square.png')", backgroundSize: "100% 100%", imageRendering: "pixelated", opacity: downloadingId ? 0.5 : 1, @@ -414,13 +497,18 @@ const VersionsView = memo(function VersionsView() { playPressSound(); TauriService.openInstanceFolder(edition.id); }} - onMouseEnter={() => setHoveredBtn({ row: i, btn: 'folder' })} + onMouseEnter={() => + setHoveredBtn({ row: i, btn: "folder" }) + } onMouseLeave={() => setHoveredBtn(null)} className="w-8 h-8 flex items-center justify-center text-[#3a3a3a]" style={{ - backgroundImage: (hoveredBtn?.row === i && hoveredBtn?.btn === 'folder') || (focusIndex === i && focusBtn === 2) - ? "url('/images/Button_Square_Highlighted.png')" - : "url('/images/Button_Square.png')", + backgroundImage: + (hoveredBtn?.row === i && + hoveredBtn?.btn === "folder") || + (focusIndex === i && focusBtn === 2) + ? "url('/images/Button_Square_Highlighted.png')" + : "url('/images/Button_Square.png')", backgroundSize: "100% 100%", imageRendering: "pixelated", }} @@ -438,13 +526,18 @@ const VersionsView = memo(function VersionsView() { playBackSound(); setDeleteConfirmEdition(edition); }} - onMouseEnter={() => setHoveredBtn({ row: i, btn: 'delete' })} + onMouseEnter={() => + setHoveredBtn({ row: i, btn: "delete" }) + } onMouseLeave={() => setHoveredBtn(null)} className="w-8 h-8 flex items-center justify-center text-[#3a3a3a]" style={{ - backgroundImage: (hoveredBtn?.row === i && hoveredBtn?.btn === 'delete') || (focusIndex === i && focusBtn === 3) - ? "url('/images/Button_Square_Highlighted.png')" - : "url('/images/Button_Square.png')", + backgroundImage: + (hoveredBtn?.row === i && + hoveredBtn?.btn === "delete") || + (focusIndex === i && focusBtn === 3) + ? "url('/images/Button_Square_Highlighted.png')" + : "url('/images/Button_Square.png')", backgroundSize: "100% 100%", imageRendering: "pixelated", }} @@ -465,18 +558,31 @@ const VersionsView = memo(function VersionsView() { setEditingEdition(edition); setIsImportModalOpen(true); }} - onMouseEnter={() => setHoveredBtn({ row: i, btn: 'edit' })} + onMouseEnter={() => + setHoveredBtn({ row: i, btn: "edit" }) + } onMouseLeave={() => setHoveredBtn(null)} className="w-8 h-8 flex items-center justify-center text-[#3a3a3a]" style={{ - backgroundImage: (hoveredBtn?.row === i && hoveredBtn?.btn === 'edit') || (focusIndex === i && focusBtn === 4) - ? "url('/images/Button_Square_Highlighted.png')" - : "url('/images/Button_Square.png')", + backgroundImage: + (hoveredBtn?.row === i && + hoveredBtn?.btn === "edit") || + (focusIndex === i && focusBtn === 4) + ? "url('/images/Button_Square_Highlighted.png')" + : "url('/images/Button_Square.png')", backgroundSize: "100% 100%", imageRendering: "pixelated", }} > - + @@ -487,18 +593,31 @@ const VersionsView = memo(function VersionsView() { playBackSound(); onDeleteEdition(edition.id); }} - onMouseEnter={() => setHoveredBtn({ row: i, btn: 'delete' })} + onMouseEnter={() => + setHoveredBtn({ row: i, btn: "delete" }) + } onMouseLeave={() => setHoveredBtn(null)} className="w-8 h-8 flex items-center justify-center text-red-600" style={{ - backgroundImage: (hoveredBtn?.row === i && hoveredBtn?.btn === 'delete') || (focusIndex === i && focusBtn === 3) - ? "url('/images/Button_Square_Highlighted.png')" - : "url('/images/Button_Square.png')", + backgroundImage: + (hoveredBtn?.row === i && + hoveredBtn?.btn === "delete") || + (focusIndex === i && focusBtn === 3) + ? "url('/images/Button_Square_Highlighted.png')" + : "url('/images/Button_Square.png')", backgroundSize: "100% 100%", imageRendering: "pixelated", }} > - + @@ -525,14 +644,25 @@ const VersionsView = memo(function VersionsView() { onMouseLeave={() => setHoveredBtn(null)} className="w-8 h-8 flex items-center justify-center text-[#3a3a3a]" style={{ - backgroundImage: (hoveredBtn?.row === editions.length && hoveredBtn?.btn === 'add') || focusIndex === editions.length - ? "url('/images/Button_Square_Highlighted.png')" - : "url('/images/Button_Square.png')", + backgroundImage: + (hoveredBtn?.row === editions.length && + hoveredBtn?.btn === "add") || + focusIndex === editions.length + ? "url('/images/Button_Square_Highlighted.png')" + : "url('/images/Button_Square.png')", backgroundSize: "100% 100%", imageRendering: "pixelated", }} > - + @@ -547,9 +677,12 @@ const VersionsView = memo(function VersionsView() { title="Import Custom TU" className="w-8 h-8 flex items-center justify-center text-[#3a3a3a]" style={{ - backgroundImage: (hoveredBtn?.row === editions.length && hoveredBtn?.btn === 'folder_import') || focusIndex === editions.length + 1 - ? "url('/images/Button_Square_Highlighted.png')" - : "url('/images/Button_Square.png')", + backgroundImage: + (hoveredBtn?.row === editions.length && + hoveredBtn?.btn === "folder_import") || + focusIndex === editions.length + 1 + ? "url('/images/Button_Square_Highlighted.png')" + : "url('/images/Button_Square.png')", backgroundSize: "100% 100%", imageRendering: "pixelated", }} @@ -576,9 +709,10 @@ const VersionsView = memo(function VersionsView() { }} className="w-48 h-10 flex items-center justify-center text-xl mc-text-shadow outline-none border-none text-white" style={{ - backgroundImage: focusIndex === editions.length + 2 - ? "url('/images/button_highlighted.png')" - : "url('/images/Button_Background.png')", + backgroundImage: + focusIndex === editions.length + 2 + ? "url('/images/button_highlighted.png')" + : "url('/images/Button_Background.png')", backgroundSize: "100% 100%", imageRendering: "pixelated", }} @@ -623,7 +757,8 @@ const VersionsView = memo(function VersionsView() { Delete {deleteConfirmEdition.name}?

- Warning: All your saves and worlds for this version will be permanently deleted! + Warning: All your saves and worlds for this version will be + permanently deleted!