diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModDownloadPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModDownloadPage.java index a8d3ac470..cb879a019 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModDownloadPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModDownloadPage.java @@ -46,7 +46,12 @@ import org.jackhuang.hmcl.util.StringUtils; import org.jetbrains.annotations.Nullable; import java.io.File; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.time.format.FormatStyle; +import java.util.Comparator; import java.util.List; +import java.util.Locale; import java.util.Optional; import java.util.stream.Collectors; @@ -82,6 +87,7 @@ public class ModDownloadPage extends Control implements DecoratorPage { } } List files = CurseModManager.getFiles(addon); + files.sort(Comparator.comparing(CurseAddon.LatestFile::getParsedFileDate).reversed()); items.setAll(files); }).start(); @@ -208,6 +214,7 @@ public class ModDownloadPage extends Control implements DecoratorPage { protected void updateControl(CurseAddon.LatestFile dataItem, boolean empty) { if (empty) return; content.setTitle(dataItem.getDisplayName()); + content.setSubtitle(FORMATTER.format(dataItem.getParsedFileDate())); content.getTags().setAll(dataItem.getGameVersion()); switch (dataItem.getReleaseType()) { @@ -239,6 +246,8 @@ public class ModDownloadPage extends Control implements DecoratorPage { } } + private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).withLocale(Locale.getDefault()).withZone(ZoneId.systemDefault()); + public interface DownloadCallback { void download(Profile profile, @Nullable String version, CurseAddon.LatestFile file); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseAddon.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseAddon.java index 54863c5d3..abbb3432f 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseAddon.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseAddon.java @@ -2,6 +2,7 @@ package org.jackhuang.hmcl.mod.curse; import org.jackhuang.hmcl.util.Immutable; +import java.time.Instant; import java.util.List; @Immutable @@ -293,6 +294,8 @@ public class CurseAddon { private final boolean isServerPack; private final int serverPackFileId; + private transient Instant fileDataInstant; + public LatestFile(int id, String displayName, String fileName, String fileDate, int fileLength, int releaseType, int fileStatus, String downloadUrl, boolean isAlternate, int alternateFileId, List dependencies, boolean isAvailable, List gameVersion, boolean hasInstallScript, boolean isCompatibleWIthClient, int categorySectionPackageType, int restrictProjectFileAccess, int projectStatus, int projectId, boolean isServerPack, int serverPackFileId) { this.id = id; this.displayName = displayName; @@ -400,6 +403,13 @@ public class CurseAddon { public int getServerPackFileId() { return serverPackFileId; } + + public Instant getParsedFileDate() { + if (fileDataInstant == null) { + fileDataInstant = Instant.parse(fileDate); + } + return fileDataInstant; + } } @Immutable