-
Notifications
You must be signed in to change notification settings - Fork 858
feat: 下载页面折叠快照 Minecraft 版本 #5601
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
9963f37
41b0b8f
281c1c5
abd9eb8
fe3ad4f
880ca03
7bf2c31
77516d4
e02c5a8
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -27,16 +27,8 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import javafx.geometry.Insets; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import javafx.geometry.Pos; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import javafx.scene.Node; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import javafx.scene.control.Control; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import javafx.scene.control.Label; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import javafx.scene.control.ScrollPane; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import javafx.scene.control.Skin; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import javafx.scene.control.SkinBase; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import javafx.scene.layout.HBox; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import javafx.scene.layout.Priority; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import javafx.scene.layout.Region; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import javafx.scene.layout.StackPane; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import javafx.scene.layout.VBox; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import javafx.scene.control.*; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import javafx.scene.layout.*; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import javafx.stage.FileChooser; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.jackhuang.hmcl.download.DownloadProvider; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.jackhuang.hmcl.download.LibraryAnalyzer; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -54,26 +46,15 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.jackhuang.hmcl.ui.SVG; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.jackhuang.hmcl.ui.construct.*; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.jackhuang.hmcl.ui.decorator.DecoratorPage; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.jackhuang.hmcl.util.Lang; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.jackhuang.hmcl.util.Pair; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.jackhuang.hmcl.util.SimpleMultimap; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.jackhuang.hmcl.util.StringUtils; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.jackhuang.hmcl.util.TaskCancellationAction; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.jackhuang.hmcl.util.*; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.jackhuang.hmcl.util.i18n.I18n; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.jackhuang.hmcl.util.io.FileUtils; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.jackhuang.hmcl.util.javafx.BindingMapping; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.jackhuang.hmcl.util.versioning.GameVersionNumber; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.jetbrains.annotations.Nullable; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.nio.file.Path; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.util.ArrayList; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.util.Collection; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.util.Collections; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.util.Comparator; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.util.EnumMap; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.util.HashMap; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.util.List; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.util.Set; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.util.*; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.util.stream.Collectors; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.util.stream.Stream; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -313,25 +294,55 @@ protected ModDownloadPageSkin(DownloadPage control) { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for (String gameVersion : control.versions.keys().stream() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .sorted(Collections.reverseOrder(GameVersionNumber::compare)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .toList()) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| List<RemoteMod.Version> versions = control.versions.get(gameVersion); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (versions == null || versions.isEmpty()) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| continue; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| final class Versions { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| static ComponentSublist createSublist(DownloadPage control, String title, List<String> target) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| var sublist = new ComponentSublist(() -> { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ArrayList<ModItem> items = new ArrayList<>(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for (String gv : target) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| List<RemoteMod.Version> versions = control.versions.get(gv); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (versions != null) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for (RemoteMod.Version v : versions) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| items.add(new ModItem(control.addon, v, control)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+299
to
+308
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for (String gv : target) { | |
| List<RemoteMod.Version> versions = control.versions.get(gv); | |
| if (versions != null) { | |
| for (RemoteMod.Version v : versions) { | |
| items.add(new ModItem(control.addon, v, control)); | |
| } | |
| } | |
| } | |
| // Merge versions from all matching game-version buckets, de-duplicating | |
| // by a stable identifier (e.g., the "self" URL), then sort by datePublished. | |
| Map<Object, RemoteMod.Version> uniqueVersions = new LinkedHashMap<>(); | |
| for (String gv : target) { | |
| List<RemoteMod.Version> versions = control.versions.get(gv); | |
| if (versions != null) { | |
| for (RemoteMod.Version v : versions) { | |
| if (v == null) continue; | |
| Object key = v.getSelf() != null ? v.getSelf() : v; | |
| uniqueVersions.putIfAbsent(key, v); | |
| } | |
| } | |
| } | |
| List<RemoteMod.Version> sortedVersions = new ArrayList<>(uniqueVersions.values()); | |
| sortedVersions.sort(Comparator.comparing( | |
| RemoteMod.Version::getDatePublished, | |
| Comparator.nullsLast(Comparator.naturalOrder()) | |
| ).reversed()); | |
| for (RemoteMod.Version v : sortedVersions) { | |
| items.add(new ModItem(control.addon, v, control)); | |
| } |
| Original file line number | Diff line number | Diff line change | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -19,6 +19,7 @@ | |||||||||
|
|
||||||||||
| import org.jackhuang.hmcl.util.ToStringBuilder; | ||||||||||
| import org.jetbrains.annotations.NotNull; | ||||||||||
| import org.jetbrains.annotations.Nullable; | ||||||||||
|
|
||||||||||
| import java.io.BufferedReader; | ||||||||||
| import java.io.IOException; | ||||||||||
|
|
@@ -189,6 +190,32 @@ public final String toDebugString() { | |||||||||
| return buildDebugString().toString(); | ||||||||||
| } | ||||||||||
|
|
||||||||||
| public static @Nullable GameVersionNumber getReleaseOfSnapshot(GameVersionNumber gameVersion) { | ||||||||||
| if (gameVersion instanceof Release release) { | ||||||||||
| if (release.getEaType() == Release.ReleaseType.GA) { | ||||||||||
| return null; | ||||||||||
| } | ||||||||||
| if (release.getPatch() > 0) { | ||||||||||
| return asGameVersion(release.getMajor() + "." + release.getMinor() + "." + release.getPatch()); | ||||||||||
| } else { | ||||||||||
| return asGameVersion(release.getMajor() + "." + release.getMinor()); | ||||||||||
| } | ||||||||||
| } | ||||||||||
|
|
||||||||||
| if (gameVersion instanceof LegacySnapshot snapshot) { | ||||||||||
| String[] defaultVersions = Versions.DEFAULT_GAME_VERSIONS; | ||||||||||
| for (int i = defaultVersions.length - 1; i >= 0; i--) { | ||||||||||
| Release gaRelease = (Release) asGameVersion(defaultVersions[i]); | ||||||||||
|
|
||||||||||
| if (gaRelease.compareToSnapshot(snapshot) > 0) { | ||||||||||
| return gaRelease; | ||||||||||
| } | ||||||||||
| } | ||||||||||
| } | ||||||||||
|
|
||||||||||
|
||||||||||
| // Special or non-standard versions (e.g. April Fools snapshots like "20w14infinite") | |
| // are intentionally not mapped to a GA release and will fall through to return null. |
Uh oh!
There was an error while loading. Please reload this page.