From 736323f78620514f3e0094a5ae6a577026bcfd5a Mon Sep 17 00:00:00 2001
From: Matthew Rodgers <48635776+AxisMaen@users.noreply.github.com>
Date: Sat, 6 Jul 2024 18:51:38 -0400
Subject: [PATCH] add sorting for replay folders and their subdirectories
---
.../replay_browser/folder_tree_node.tsx | 38 +++++++++++++-----
.../replays/replay_browser/replay_browser.tsx | 40 +++++++++++++------
2 files changed, 55 insertions(+), 23 deletions(-)
diff --git a/src/renderer/pages/replays/replay_browser/folder_tree_node.tsx b/src/renderer/pages/replays/replay_browser/folder_tree_node.tsx
index 38f22eb1c..1fc9b196d 100644
--- a/src/renderer/pages/replays/replay_browser/folder_tree_node.tsx
+++ b/src/renderer/pages/replays/replay_browser/folder_tree_node.tsx
@@ -15,16 +15,41 @@ type FolderTreeNodeProps = {
nestLevel?: number;
folder: FolderResult;
collapsedFolders: readonly string[];
+ isReversed: boolean;
onClick: (fullPath: string) => void;
onToggle: (fullPath: string) => void;
};
-export const FolderTreeNode = ({ nestLevel = 0, folder, collapsedFolders, onClick, onToggle }: FolderTreeNodeProps) => {
+export const FolderTreeNode = ({
+ nestLevel = 0,
+ folder,
+ collapsedFolders,
+ isReversed,
+ onClick,
+ onToggle,
+}: FolderTreeNodeProps) => {
const currentFolder = useReplays((store) => store.currentFolder);
const hasChildren = folder.subdirectories.length > 0;
const isCollapsed = collapsedFolders.includes(folder.fullPath);
const isSelected = currentFolder === folder.fullPath;
const labelColor = isSelected ? colors.grayDark : "rgba(255, 255, 255, 0.5)";
+
+ const getSubdirectoryNodes = () => {
+ const subdirectories = folder.subdirectories.map((f) => (
+
+ ));
+
+ return isReversed ? subdirectories.reverse() : subdirectories;
+ };
+
return (
{folder.subdirectories.length === 0 || isCollapsed ? null : (
- {folder.subdirectories.map((f) => (
-
- ))}
+ {getSubdirectoryNodes()}
)}
diff --git a/src/renderer/pages/replays/replay_browser/replay_browser.tsx b/src/renderer/pages/replays/replay_browser/replay_browser.tsx
index 171d1b723..f18847730 100644
--- a/src/renderer/pages/replays/replay_browser/replay_browser.tsx
+++ b/src/renderer/pages/replays/replay_browser/replay_browser.tsx
@@ -1,6 +1,7 @@
import { exists } from "@common/exists";
import { css } from "@emotion/react";
import styled from "@emotion/styled";
+import { ArrowDownward, ArrowUpward } from "@mui/icons-material";
import FolderIcon from "@mui/icons-material/Folder";
import SearchIcon from "@mui/icons-material/Search";
import Button from "@mui/material/Button";
@@ -8,7 +9,7 @@ import IconButton from "@mui/material/IconButton";
import List from "@mui/material/List";
import Tooltip from "@mui/material/Tooltip";
import Typography from "@mui/material/Typography";
-import React from "react";
+import React, { useState } from "react";
import { DualPane } from "@/components/dual_pane";
import { BasicFooter } from "@/components/footer/footer";
@@ -50,6 +51,8 @@ export const ReplayBrowser = React.memo(() => {
const { files: filteredFiles, hiddenFileCount } = useReplayBrowserList();
const { goToReplayStatsPage } = useReplayBrowserNavigation();
+ const [isFolderTreeReversed, setIsFolderTreeReversed] = useState(true);
+
const setSelectedItem = (index: number | null) => {
if (index === null) {
void presenter.current.clearSelectedFile();
@@ -84,6 +87,23 @@ export const ReplayBrowser = React.memo(() => {
[showError, showSuccess],
);
+ const onFolderTreeSortClick = () => {
+ setIsFolderTreeReversed(!isFolderTreeReversed);
+ };
+
+ const folderTreeNodes = folderTree.map((folder) => {
+ return (
+ presenter.current.toggleFolder(folder)}
+ />
+ );
+ });
+
return (
{
leftSide={
- {folderTree.map((folder) => {
- return (
-
presenter.current.toggleFolder(folder)}
- />
- );
- })}
+ : }
+ >
+ Sort
+
+ {isFolderTreeReversed ? folderTreeNodes.reverse() : folderTreeNodes}
{loading && (