Refactor TwoLineListItem

This commit is contained in:
yushijinhun
2019-01-26 12:53:49 +08:00
parent 8bb6cb714c
commit d75c3bbf96
10 changed files with 38 additions and 148 deletions

View File

@@ -87,11 +87,8 @@ public final class MainPage extends StackPane implements DecoratorPage {
lblIcon.setGraphic(SVG.update(Theme.whiteFillBinding(), 20, 20)); lblIcon.setGraphic(SVG.update(Theme.whiteFillBinding(), 20, 20));
TwoLineListItem prompt = new TwoLineListItem(); TwoLineListItem prompt = new TwoLineListItem();
prompt.setTitleFill(Color.WHITE);
prompt.setSubtitleFill(Color.WHITE);
prompt.setSubtitle(i18n("update.bubble.subtitle")); prompt.setSubtitle(i18n("update.bubble.subtitle"));
prompt.setPickOnBounds(false); prompt.setPickOnBounds(false);
prompt.setStyle("-jfx-title-font-weight: BOLD;");
prompt.titleProperty().bind(latestVersionProperty()); prompt.titleProperty().bind(latestVersionProperty());
hBox.getChildren().setAll(lblIcon, prompt); hBox.getChildren().setAll(lblIcon, prompt);

View File

@@ -359,7 +359,7 @@ public abstract class SettingsView extends StackPane {
HBox hBox = new HBox(); HBox hBox = new HBox();
hBox.setSpacing(3); hBox.setSpacing(3);
cboFont = new FontComboBox(12, false); cboFont = new FontComboBox(12);
txtFontSize = new JFXTextField(); txtFontSize = new JFXTextField();
FXUtils.setLimitWidth(txtFontSize, 50); FXUtils.setLimitWidth(txtFontSize, 50);
hBox.getChildren().setAll(cboFont, txtFontSize); hBox.getChildren().setAll(cboFont, txtFontSize);

View File

@@ -19,6 +19,7 @@ package org.jackhuang.hmcl.ui.account;
import com.jfoenix.concurrency.JFXUtilities; import com.jfoenix.concurrency.JFXUtilities;
import com.jfoenix.controls.*; import com.jfoenix.controls.*;
import javafx.beans.binding.Bindings; import javafx.beans.binding.Bindings;
import javafx.beans.property.ReadOnlyObjectProperty; import javafx.beans.property.ReadOnlyObjectProperty;
import javafx.fxml.FXML; import javafx.fxml.FXML;

View File

@@ -24,27 +24,27 @@ import static javafx.collections.FXCollections.singletonObservableList;
import org.jackhuang.hmcl.util.javafx.MultiStepBinding; import org.jackhuang.hmcl.util.javafx.MultiStepBinding;
import com.jfoenix.controls.JFXComboBox; import com.jfoenix.controls.JFXComboBox;
import com.jfoenix.controls.JFXListCell;
import javafx.beans.NamedArg; import javafx.beans.NamedArg;
import javafx.beans.binding.Bindings; import javafx.beans.binding.Bindings;
import javafx.scene.control.ListCell;
import javafx.scene.text.Font; import javafx.scene.text.Font;
public class FontComboBox extends JFXComboBox<String> { public class FontComboBox extends JFXComboBox<String> {
private boolean loaded = false; private boolean loaded = false;
public FontComboBox(@NamedArg(value = "fontSize", defaultValue = "12.0") double fontSize, public FontComboBox(@NamedArg(value = "fontSize", defaultValue = "12.0") double fontSize) {
@NamedArg(value = "enableStyle", defaultValue = "false") boolean enableStyle) {
styleProperty().bind(Bindings.concat("-fx-font-family: \"", valueProperty(), "\"")); styleProperty().bind(Bindings.concat("-fx-font-family: \"", valueProperty(), "\""));
setCellFactory(listView -> new ListCell<String>() { setCellFactory(listView -> new JFXListCell<String>() {
@Override @Override
protected void updateItem(String item, boolean empty) { public void updateItem(String item, boolean empty) {
super.updateItem(item, empty); super.updateItem(item, empty);
if (item != null) { if (!empty) {
setText(item); setText(item);
setFont(new Font(item, fontSize)); setGraphic(null);
setStyle("-fx-font-family: \"" + item + "\"");
} }
} }
}); });

View File

@@ -19,32 +19,15 @@ package org.jackhuang.hmcl.ui.construct;
import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty; import javafx.beans.property.StringProperty;
import javafx.css.CssMetaData;
import javafx.css.SimpleStyleableObjectProperty;
import javafx.css.Styleable;
import javafx.css.StyleableObjectProperty;
import javafx.css.StyleablePropertyFactory;
import javafx.scene.control.Label; import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox; import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;
import javafx.scene.text.Font;
import java.util.List; public class TwoLineListItem extends VBox {
public class TwoLineListItem extends StackPane {
private static final String DEFAULT_STYLE_CLASS = "two-line-list-item"; private static final String DEFAULT_STYLE_CLASS = "two-line-list-item";
private final StringProperty title = new SimpleStringProperty(this, "title"); private final StringProperty title = new SimpleStringProperty(this, "title");
private final StringProperty subtitle = new SimpleStringProperty(this, "subtitle"); private final StringProperty subtitle = new SimpleStringProperty(this, "subtitle");
private final StyleableObjectProperty<Font> titleFont = new SimpleStyleableObjectProperty<>(StyleableProperties.TITLE_FONT, this, "title-font", Font.font(15));
private final StyleableObjectProperty<Font> subtitleFont = new SimpleStyleableObjectProperty<>(StyleableProperties.SUBTITLE_FONT, this, "subtitle-font", Font.getDefault());
private final StyleableObjectProperty<Paint> titleFill = new SimpleStyleableObjectProperty<>(StyleableProperties.TITLE_FILL, this, "title-fill", Color.BLACK);
private final StyleableObjectProperty<Paint> subtitleFill = new SimpleStyleableObjectProperty<>(StyleableProperties.SUBTITLE_FILL, this, "subtitle-fill", Color.GRAY);
public TwoLineListItem(String titleString, String subtitleString) { public TwoLineListItem(String titleString, String subtitleString) {
this(); this();
@@ -55,19 +38,14 @@ public class TwoLineListItem extends StackPane {
public TwoLineListItem() { public TwoLineListItem() {
setMouseTransparent(true); setMouseTransparent(true);
Label lblTitle = new Label(); Label lblTitle = new Label();
lblTitle.textFillProperty().bind(titleFill); lblTitle.getStyleClass().add("title");
lblTitle.fontProperty().bind(titleFont);
lblTitle.textProperty().bind(title); lblTitle.textProperty().bind(title);
Label lblSubtitle = new Label(); Label lblSubtitle = new Label();
lblSubtitle.textFillProperty().bind(subtitleFill); lblSubtitle.getStyleClass().add("subtitle");
lblSubtitle.fontProperty().bind(subtitleFont);
lblSubtitle.textProperty().bind(subtitle); lblSubtitle.textProperty().bind(subtitle);
VBox vbox = new VBox(); getChildren().setAll(lblTitle, lblSubtitle);
vbox.getChildren().setAll(lblTitle, lblSubtitle);
getChildren().setAll(vbox);
getStyleClass().add(DEFAULT_STYLE_CLASS); getStyleClass().add(DEFAULT_STYLE_CLASS);
} }
@@ -95,74 +73,8 @@ public class TwoLineListItem extends StackPane {
this.subtitle.set(subtitle); this.subtitle.set(subtitle);
} }
public Font getTitleFont() {
return titleFont.get();
}
public StyleableObjectProperty<Font> titleFontProperty() {
return titleFont;
}
public void setTitleFont(Font titleFont) {
this.titleFont.set(titleFont);
}
public Font getSubtitleFont() {
return subtitleFont.get();
}
public StyleableObjectProperty<Font> subtitleFontProperty() {
return subtitleFont;
}
public void setSubtitleFont(Font subtitleFont) {
this.subtitleFont.set(subtitleFont);
}
public Paint getTitleFill() {
return titleFill.get();
}
public StyleableObjectProperty<Paint> titleFillProperty() {
return titleFill;
}
public void setTitleFill(Paint titleFill) {
this.titleFill.set(titleFill);
}
public Paint getSubtitleFill() {
return subtitleFill.get();
}
public StyleableObjectProperty<Paint> subtitleFillProperty() {
return subtitleFill;
}
public void setSubtitleFill(Paint subtitleFill) {
this.subtitleFill.set(subtitleFill);
}
@Override @Override
public String toString() { public String toString() {
return getTitle(); return getTitle();
} }
@Override
public List<CssMetaData<? extends Styleable, ?>> getCssMetaData() {
return getClassCssMetaData();
}
public static List<CssMetaData<? extends Styleable, ?>> getClassCssMetaData() {
return StyleableProperties.FACTORY.getCssMetaData();
}
private static class StyleableProperties {
private static final StyleablePropertyFactory<TwoLineListItem> FACTORY = new StyleablePropertyFactory<>(StackPane.getClassCssMetaData());
private static final CssMetaData<TwoLineListItem, Font> TITLE_FONT = FACTORY.createFontCssMetaData("-jfx-title-font", s -> s.titleFont, Font.font(15));
private static final CssMetaData<TwoLineListItem, Font> SUBTITLE_FONT = FACTORY.createFontCssMetaData("-jfx-subtitle-font", s -> s.subtitleFont);
private static final CssMetaData<TwoLineListItem, Paint> TITLE_FILL = FACTORY.createPaintCssMetaData("-jfx-title-fill", s -> s.titleFill);
private static final CssMetaData<TwoLineListItem, Paint> SUBTITLE_FILL = FACTORY.createPaintCssMetaData("-jfx-subtitle-fill", s -> s.subtitleFill, Color.GREY);
}
} }

View File

@@ -35,6 +35,7 @@ import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox; import javafx.scene.layout.VBox;
import javafx.stage.FileChooser; import javafx.stage.FileChooser;
import org.jackhuang.hmcl.setting.EnumGameDirectory; import org.jackhuang.hmcl.setting.EnumGameDirectory;
import org.jackhuang.hmcl.setting.LauncherVisibility;
import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.setting.Profile;
import org.jackhuang.hmcl.setting.Profiles; import org.jackhuang.hmcl.setting.Profiles;
import org.jackhuang.hmcl.setting.VersionSetting; import org.jackhuang.hmcl.setting.VersionSetting;
@@ -60,6 +61,7 @@ import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static org.jackhuang.hmcl.ui.FXUtils.stringConverter;
import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import static org.jackhuang.hmcl.util.i18n.I18n.i18n;
public final class VersionSettingsPage extends StackPane implements DecoratorPage { public final class VersionSettingsPage extends StackPane implements DecoratorPage {
@@ -85,7 +87,7 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag
@FXML private ComponentList advancedSettingsPane; @FXML private ComponentList advancedSettingsPane;
@FXML private ComponentList componentList; @FXML private ComponentList componentList;
@FXML private ComponentList iconPickerItemWrapper; @FXML private ComponentList iconPickerItemWrapper;
@FXML private JFXComboBox<?> cboLauncherVisibility; @FXML private JFXComboBox<LauncherVisibility> cboLauncherVisibility;
@FXML private JFXCheckBox chkFullscreen; @FXML private JFXCheckBox chkFullscreen;
@FXML private Label lblPhysicalMemory; @FXML private Label lblPhysicalMemory;
@FXML private JFXToggleButton chkNoJVMArgs; @FXML private JFXToggleButton chkNoJVMArgs;
@@ -100,6 +102,9 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag
public VersionSettingsPage() { public VersionSettingsPage() {
FXUtils.loadFXML(this, "/assets/fxml/version/version-settings.fxml"); FXUtils.loadFXML(this, "/assets/fxml/version/version-settings.fxml");
cboLauncherVisibility.getItems().setAll(LauncherVisibility.values());
cboLauncherVisibility.setConverter(stringConverter(e -> i18n("settings.advanced.launcher_visibility." + e.name().toLowerCase())));
} }
@FXML @FXML

View File

@@ -104,20 +104,24 @@
-fx-padding: 4 0 4 0; -fx-padding: 4 0 4 0;
} }
.two-line-list-item > .title {
-fx-text-fill: black;
-fx-font-size: 15px;
}
.two-line-list-item > .subtitle {
-fx-text-fill: gray;
}
.bubble { .bubble {
-fx-background-color: gray; -fx-background-color: gray;
-fx-background-radius: 2px; -fx-background-radius: 2px;
-fx-text-fill: white;
} }
.bubble .two-line-list-item { .bubble .two-line-list-item > .title,
-jfx-title-fill: white; .bubble .two-line-list-item > .subtitle {
-jfx-subtitle-fill: white; -fx-text-fill: white;
}
.two-line-list-item {
-jfx-title-font-size: 15px;
-jfx-title-fill: black;
-jfx-subtitle-fill: gray;
} }
.window-title-bar .separator { .window-title-bar .separator {
@@ -678,20 +682,12 @@
* * * *
*******************************************************************************/ *******************************************************************************/
.jfx-list-cell:odd, .jfx-list-cell, .list-cell {
.jfx-list-cell:even,
.list-cell:odd,
.list-cell:even {
-fx-background-color: WHITE; -fx-background-color: WHITE;
} }
.list-cell:selected, .jfx-list-cell:selected { .list-cell:selected, .jfx-list-cell:selected,
-fx-background-insets: 0.0; .list-cell:hover, .jfx-list-cell:hover {
-fx-text-fill: BLACK;
}
.jfx-list-cell:filled:hover,
.jfx-list-cell:selected .label {
-fx-text-fill: black; -fx-text-fill: black;
} }
@@ -1109,31 +1105,10 @@
-fx-fill: #D34336; -fx-fill: #D34336;
} }
.combo-box-popup .list-view .jfx-list-cell .label,
.combo-box-popup .list-view .jfx-list-cell:filled:hover .label {
-fx-text-fill: BLACK;
}
.combo-box-popup .list-view .jfx-list-cell .custom-jfx-list-view-icon,
.combo-box-popup .list-view .jfx-list-cell:filled:hover .custom-jfx-list-view-icon,
.combo-box-popup .list-view .jfx-list-cell:selected .custom-jfx-list-view-icon {
-fx-fill: -fx-base-color;
}
.combo-box-popup .list-view .jfx-list-cell:odd:selected > .jfx-rippler > StackPane,
.combo-box-popup .list-view .jfx-list-cell:even:selected > .jfx-rippler > StackPane {
-fx-background-color: rgba(0.0, 0.0, 255.0, 0.2);
}
.combo-box-popup .list-view .jfx-list-cell { .combo-box-popup .list-view .jfx-list-cell {
-fx-background-insets: 0.0; -fx-background-insets: 0.0;
} }
.combo-box-popup .list-view .jfx-list-cell:odd,
.combo-box-popup .list-view .jfx-list-cell:even {
-fx-background-color: WHITE;
}
.combo-box-popup .list-view .jfx-list-cell .jfx-rippler { .combo-box-popup .list-view .jfx-list-cell .jfx-rippler {
-jfx-rippler-fill: -fx-base-color; -jfx-rippler-fill: -fx-base-color;
} }

View File

@@ -307,7 +307,7 @@ settings.advanced.java_permanent_generation_space=PermGen Space/MB
settings.advanced.jvm_args=Java VM Arguments settings.advanced.jvm_args=Java VM Arguments
settings.advanced.launcher_visibility.close=Close the launcher when the game launched. settings.advanced.launcher_visibility.close=Close the launcher when the game launched.
settings.advanced.launcher_visibility.hide=Hide the launcher when the game launched. settings.advanced.launcher_visibility.hide=Hide the launcher when the game launched.
settings.advanced.launcher_visibility.hide_reopen=Hide the launcher and re-open when game closes. settings.advanced.launcher_visibility.hide_and_reopen=Hide the launcher and re-open when game closes.
settings.advanced.launcher_visibility.keep=Keep the launcher visible. settings.advanced.launcher_visibility.keep=Keep the launcher visible.
settings.advanced.launcher_visible=Launcher Visibility settings.advanced.launcher_visible=Launcher Visibility
settings.advanced.minecraft_arguments=Minecraft Arguments settings.advanced.minecraft_arguments=Minecraft Arguments

View File

@@ -306,7 +306,7 @@ settings.advanced.java_permanent_generation_space=記憶體永久儲存區域(
settings.advanced.jvm_args=Java 虛擬機參數(不必填寫) settings.advanced.jvm_args=Java 虛擬機參數(不必填寫)
settings.advanced.launcher_visibility.close=遊戲啟動後結束啟動器 settings.advanced.launcher_visibility.close=遊戲啟動後結束啟動器
settings.advanced.launcher_visibility.hide=遊戲啟動後隱藏啟動器 settings.advanced.launcher_visibility.hide=遊戲啟動後隱藏啟動器
settings.advanced.launcher_visibility.hide_reopen=隱藏啟動器並在遊戲結束後重新開啟 settings.advanced.launcher_visibility.hide_and_reopen=隱藏啟動器並在遊戲結束後重新開啟
settings.advanced.launcher_visibility.keep=不隱藏啟動器 settings.advanced.launcher_visibility.keep=不隱藏啟動器
settings.advanced.launcher_visible=啟動器可見性 settings.advanced.launcher_visible=啟動器可見性
settings.advanced.minecraft_arguments=Minecraft 額外參數(不必填寫) settings.advanced.minecraft_arguments=Minecraft 額外參數(不必填寫)

View File

@@ -306,7 +306,7 @@ settings.advanced.java_permanent_generation_space=内存永久保存区域(不
settings.advanced.jvm_args=Java 虚拟机参数(不必填写) settings.advanced.jvm_args=Java 虚拟机参数(不必填写)
settings.advanced.launcher_visibility.close=游戏启动后结束启动器 settings.advanced.launcher_visibility.close=游戏启动后结束启动器
settings.advanced.launcher_visibility.hide=游戏启动后隐藏启动器 settings.advanced.launcher_visibility.hide=游戏启动后隐藏启动器
settings.advanced.launcher_visibility.hide_reopen=隐藏启动器并在游戏结束后重新打开 settings.advanced.launcher_visibility.hide_and_reopen=隐藏启动器并在游戏结束后重新打开
settings.advanced.launcher_visibility.keep=保持启动器可见 settings.advanced.launcher_visibility.keep=保持启动器可见
settings.advanced.launcher_visible=启动器可见性 settings.advanced.launcher_visible=启动器可见性
settings.advanced.minecraft_arguments=Minecraft 额外参数(不必填写) settings.advanced.minecraft_arguments=Minecraft 额外参数(不必填写)