预加载页面以减少动画卡顿 (#4779)
This commit is contained in:
@@ -103,7 +103,7 @@ public final class Controllers {
|
|||||||
});
|
});
|
||||||
private static Lazy<RootPage> rootPage = new Lazy<>(RootPage::new);
|
private static Lazy<RootPage> rootPage = new Lazy<>(RootPage::new);
|
||||||
private static DecoratorController decorator;
|
private static DecoratorController decorator;
|
||||||
private static Lazy<DownloadPage> downloadPage = new Lazy<>(DownloadPage::new);
|
private static DownloadPage downloadPage;
|
||||||
private static Lazy<AccountListPage> accountListPage = new Lazy<>(() -> {
|
private static Lazy<AccountListPage> accountListPage = new Lazy<>(() -> {
|
||||||
AccountListPage accountListPage = new AccountListPage();
|
AccountListPage accountListPage = new AccountListPage();
|
||||||
accountListPage.selectedAccountProperty().bindBidirectional(Accounts.selectedAccountProperty());
|
accountListPage.selectedAccountProperty().bindBidirectional(Accounts.selectedAccountProperty());
|
||||||
@@ -111,7 +111,7 @@ public final class Controllers {
|
|||||||
accountListPage.authServersProperty().bindContentBidirectional(config().getAuthlibInjectorServers());
|
accountListPage.authServersProperty().bindContentBidirectional(config().getAuthlibInjectorServers());
|
||||||
return accountListPage;
|
return accountListPage;
|
||||||
});
|
});
|
||||||
private static Lazy<LauncherSettingsPage> settingsPage = new Lazy<>(LauncherSettingsPage::new);
|
private static LauncherSettingsPage settingsPage;
|
||||||
private static Lazy<TerracottaPage> terracottaPage = new Lazy<>(TerracottaPage::new);
|
private static Lazy<TerracottaPage> terracottaPage = new Lazy<>(TerracottaPage::new);
|
||||||
|
|
||||||
private Controllers() {
|
private Controllers() {
|
||||||
@@ -142,7 +142,18 @@ public final class Controllers {
|
|||||||
|
|
||||||
// FXThread
|
// FXThread
|
||||||
public static LauncherSettingsPage getSettingsPage() {
|
public static LauncherSettingsPage getSettingsPage() {
|
||||||
return settingsPage.get();
|
if (settingsPage == null) {
|
||||||
|
settingsPage = new LauncherSettingsPage();
|
||||||
|
}
|
||||||
|
return settingsPage;
|
||||||
|
}
|
||||||
|
|
||||||
|
@FXThread
|
||||||
|
public static void prepareSettingsPage() {
|
||||||
|
if (settingsPage == null) {
|
||||||
|
LOG.info("Prepare the settings page");
|
||||||
|
settingsPage = FXUtils.prepareNode(new LauncherSettingsPage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// FXThread
|
// FXThread
|
||||||
@@ -152,7 +163,18 @@ public final class Controllers {
|
|||||||
|
|
||||||
// FXThread
|
// FXThread
|
||||||
public static DownloadPage getDownloadPage() {
|
public static DownloadPage getDownloadPage() {
|
||||||
return downloadPage.get();
|
if (downloadPage == null) {
|
||||||
|
downloadPage = new DownloadPage();
|
||||||
|
}
|
||||||
|
return downloadPage;
|
||||||
|
}
|
||||||
|
|
||||||
|
@FXThread
|
||||||
|
public static void prepareDownloadPage() {
|
||||||
|
if (downloadPage == null) {
|
||||||
|
LOG.info("Prepare the download page");
|
||||||
|
downloadPage = FXUtils.prepareNode(new DownloadPage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// FXThread
|
// FXThread
|
||||||
@@ -533,6 +555,7 @@ public final class Controllers {
|
|||||||
downloadPage = null;
|
downloadPage = null;
|
||||||
accountListPage = null;
|
accountListPage = null;
|
||||||
settingsPage = null;
|
settingsPage = null;
|
||||||
|
terracottaPage = null;
|
||||||
decorator = null;
|
decorator = null;
|
||||||
stage = null;
|
stage = null;
|
||||||
scene = null;
|
scene = null;
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import javafx.beans.value.*;
|
|||||||
import javafx.collections.ObservableMap;
|
import javafx.collections.ObservableMap;
|
||||||
import javafx.event.Event;
|
import javafx.event.Event;
|
||||||
import javafx.event.EventDispatcher;
|
import javafx.event.EventDispatcher;
|
||||||
|
import javafx.event.EventHandler;
|
||||||
import javafx.event.EventType;
|
import javafx.event.EventType;
|
||||||
import javafx.geometry.Bounds;
|
import javafx.geometry.Bounds;
|
||||||
import javafx.geometry.Pos;
|
import javafx.geometry.Pos;
|
||||||
@@ -54,6 +55,7 @@ import javafx.stage.*;
|
|||||||
import javafx.util.Callback;
|
import javafx.util.Callback;
|
||||||
import javafx.util.Duration;
|
import javafx.util.Duration;
|
||||||
import javafx.util.StringConverter;
|
import javafx.util.StringConverter;
|
||||||
|
import org.jackhuang.hmcl.setting.StyleSheets;
|
||||||
import org.jackhuang.hmcl.setting.Theme;
|
import org.jackhuang.hmcl.setting.Theme;
|
||||||
import org.jackhuang.hmcl.task.CacheFileTask;
|
import org.jackhuang.hmcl.task.CacheFileTask;
|
||||||
import org.jackhuang.hmcl.task.Schedulers;
|
import org.jackhuang.hmcl.task.Schedulers;
|
||||||
@@ -1367,6 +1369,24 @@ public final class FXUtils {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static <N extends Parent> N prepareNode(N node) {
|
||||||
|
Scene dummyScene = new Scene(node);
|
||||||
|
StyleSheets.init(dummyScene);
|
||||||
|
node.applyCss();
|
||||||
|
node.layout();
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void prepareOnMouseEnter(Node node, Runnable action) {
|
||||||
|
node.addEventFilter(MouseEvent.MOUSE_ENTERED, new EventHandler<>() {
|
||||||
|
@Override
|
||||||
|
public void handle(MouseEvent e) {
|
||||||
|
node.removeEventFilter(MouseEvent.MOUSE_ENTERED, this);
|
||||||
|
action.run();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public static <T> void onScroll(Node node, List<T> list,
|
public static <T> void onScroll(Node node, List<T> list,
|
||||||
ToIntFunction<List<T>> finder,
|
ToIntFunction<List<T>> finder,
|
||||||
Consumer<T> updater
|
Consumer<T> updater
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ public interface TabControl {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Tab<T extends Node> {
|
final class Tab<T extends Node> {
|
||||||
private final StringProperty id = new SimpleStringProperty(this, "id");
|
private final StringProperty id = new SimpleStringProperty(this, "id");
|
||||||
private final StringProperty text = new SimpleStringProperty(this, "text");
|
private final StringProperty text = new SimpleStringProperty(this, "text");
|
||||||
private final ReadOnlyBooleanWrapper selected = new ReadOnlyBooleanWrapper(this, "selected");
|
private final ReadOnlyBooleanWrapper selected = new ReadOnlyBooleanWrapper(this, "selected");
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import org.jackhuang.hmcl.ui.Controllers;
|
|||||||
import org.jackhuang.hmcl.ui.FXUtils;
|
import org.jackhuang.hmcl.ui.FXUtils;
|
||||||
import org.jackhuang.hmcl.ui.SVG;
|
import org.jackhuang.hmcl.ui.SVG;
|
||||||
import org.jackhuang.hmcl.ui.account.AccountAdvancedListItem;
|
import org.jackhuang.hmcl.ui.account.AccountAdvancedListItem;
|
||||||
|
import org.jackhuang.hmcl.ui.animation.AnimationUtils;
|
||||||
import org.jackhuang.hmcl.ui.construct.AdvancedListBox;
|
import org.jackhuang.hmcl.ui.construct.AdvancedListBox;
|
||||||
import org.jackhuang.hmcl.ui.construct.AdvancedListItem;
|
import org.jackhuang.hmcl.ui.construct.AdvancedListItem;
|
||||||
import org.jackhuang.hmcl.ui.construct.MessageDialogPane;
|
import org.jackhuang.hmcl.ui.construct.MessageDialogPane;
|
||||||
@@ -175,6 +176,9 @@ public class RootPage extends DecoratorAnimatedPage implements DecoratorPage {
|
|||||||
downloadItem.setTitle(i18n("download"));
|
downloadItem.setTitle(i18n("download"));
|
||||||
downloadItem.setOnAction(e -> Controllers.navigate(Controllers.getDownloadPage()));
|
downloadItem.setOnAction(e -> Controllers.navigate(Controllers.getDownloadPage()));
|
||||||
FXUtils.installFastTooltip(downloadItem, i18n("download.hint"));
|
FXUtils.installFastTooltip(downloadItem, i18n("download.hint"));
|
||||||
|
if (AnimationUtils.isAnimationEnabled()) {
|
||||||
|
FXUtils.prepareOnMouseEnter(downloadItem, Controllers::prepareDownloadPage);
|
||||||
|
}
|
||||||
|
|
||||||
// fifth item in left sidebar
|
// fifth item in left sidebar
|
||||||
AdvancedListItem launcherSettingsItem = new AdvancedListItem();
|
AdvancedListItem launcherSettingsItem = new AdvancedListItem();
|
||||||
@@ -182,13 +186,15 @@ public class RootPage extends DecoratorAnimatedPage implements DecoratorPage {
|
|||||||
launcherSettingsItem.setActionButtonVisible(false);
|
launcherSettingsItem.setActionButtonVisible(false);
|
||||||
launcherSettingsItem.setTitle(i18n("settings"));
|
launcherSettingsItem.setTitle(i18n("settings"));
|
||||||
launcherSettingsItem.setOnAction(e -> Controllers.navigate(Controllers.getSettingsPage()));
|
launcherSettingsItem.setOnAction(e -> Controllers.navigate(Controllers.getSettingsPage()));
|
||||||
|
if (AnimationUtils.isAnimationEnabled()) {
|
||||||
|
FXUtils.prepareOnMouseEnter(launcherSettingsItem, Controllers::prepareSettingsPage);
|
||||||
|
}
|
||||||
|
|
||||||
// sixth item in left sidebar
|
// sixth item in left sidebar
|
||||||
AdvancedListItem terracottaItem = new AdvancedListItem();
|
AdvancedListItem terracottaItem = new AdvancedListItem();
|
||||||
terracottaItem.setLeftGraphic(wrap(SVG.GRAPH2));
|
terracottaItem.setLeftGraphic(wrap(SVG.GRAPH2));
|
||||||
terracottaItem.setActionButtonVisible(false);
|
terracottaItem.setActionButtonVisible(false);
|
||||||
terracottaItem.setTitle(i18n("terracotta"));
|
terracottaItem.setTitle(i18n("terracotta"));
|
||||||
|
|
||||||
terracottaItem.setOnAction(e -> {
|
terracottaItem.setOnAction(e -> {
|
||||||
if (TerracottaMetadata.PROVIDER != null) {
|
if (TerracottaMetadata.PROVIDER != null) {
|
||||||
Controllers.navigate(Controllers.getTerracottaPage());
|
Controllers.navigate(Controllers.getTerracottaPage());
|
||||||
|
|||||||
Reference in New Issue
Block a user