Skip to content

Commit fab2fad

Browse files
committed
Refactor: Binds for searching
1 parent cca818f commit fab2fad

6 files changed

Lines changed: 71 additions & 23 deletions

File tree

HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DataPackListPageSkin.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import javafx.animation.PauseTransition;
2626
import javafx.application.Platform;
2727
import javafx.beans.InvalidationListener;
28+
import javafx.beans.binding.Bindings;
2829
import javafx.beans.property.BooleanProperty;
2930
import javafx.beans.property.ObjectProperty;
3031
import javafx.beans.property.SimpleBooleanProperty;
@@ -52,6 +53,7 @@
5253
import org.jackhuang.hmcl.ui.animation.ContainerAnimations;
5354
import org.jackhuang.hmcl.ui.animation.TransitionPane;
5455
import org.jackhuang.hmcl.ui.construct.*;
56+
import org.jackhuang.hmcl.util.StringUtils;
5557
import org.jackhuang.hmcl.util.io.CompressingUtils;
5658
import org.jetbrains.annotations.Nullable;
5759

@@ -83,6 +85,7 @@ final class DataPackListPageSkin extends SkinBase<DataPackListPage> {
8385
private final BooleanProperty isSearching = new SimpleBooleanProperty(false);
8486
private final BooleanProperty isSelecting = new SimpleBooleanProperty(false);
8587
private final JFXTextField searchField;
88+
private final PauseTransition searchPause = new PauseTransition(Duration.millis(100));
8689

8790
private static final AtomicInteger lastShiftClickIndex = new AtomicInteger(-1);
8891
final Consumer<Integer> toggleSelect;
@@ -149,14 +152,17 @@ final class DataPackListPageSkin extends SkinBase<DataPackListPage> {
149152
searchField = new JFXTextField();
150153
searchField.setPromptText(i18n("search"));
151154
HBox.setHgrow(searchField, Priority.ALWAYS);
152-
PauseTransition pause = new PauseTransition(Duration.millis(100));
153-
pause.setOnFinished(e -> filteredList.setPredicate(skinnable.updateSearchPredicate(searchField.getText())));
155+
searchPause.setOnFinished(e -> filteredList.setPredicate(skinnable.updateSearchPredicate(searchField.getText())));
154156
searchField.textProperty().addListener((observable, oldValue, newValue) -> {
155-
pause.setRate(1);
156-
pause.playFromStart();
157+
if (isSearching.get() || !StringUtils.isBlank(newValue)) {
158+
searchPause.setRate(1);
159+
searchPause.playFromStart();
160+
}
157161
});
158162
JFXButton closeSearchBar = createToolbarButton2(null, SVG.CLOSE,
159163
() -> {
164+
searchPause.stop();
165+
160166
isSearching.set(false);
161167
searchField.clear();
162168
});
@@ -198,6 +204,16 @@ final class DataPackListPageSkin extends SkinBase<DataPackListPage> {
198204
StackPane placeholderContainer = new StackPane();
199205
placeholderContainer.getStyleClass().add("notice-pane");
200206
Label placeholderLabel = new Label(i18n("datapack.empty"));
207+
placeholderLabel.textProperty().bind(
208+
Bindings.createStringBinding(() -> {
209+
if (isSearching.get()) {
210+
return i18n("search.no_results_found");
211+
} else {
212+
return i18n("datapack.empty");
213+
}
214+
},
215+
isSearching)
216+
);
201217
placeholderContainer.getChildren().add(placeholderLabel);
202218
listView.setPlaceholder(placeholderContainer);
203219

HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import javafx.beans.binding.Bindings;
2424
import javafx.beans.property.BooleanProperty;
2525
import javafx.beans.property.ObjectProperty;
26+
import javafx.beans.property.SimpleBooleanProperty;
2627
import javafx.collections.ListChangeListener;
2728
import javafx.css.PseudoClass;
2829
import javafx.geometry.Insets;
@@ -88,10 +89,10 @@ final class ModListPageSkin extends SkinBase<ModListPage> {
8889
private final HBox toolbarSelecting;
8990

9091
private final JFXListView<ModInfoObject> listView;
91-
private final JFXTextField searchField;
9292

93-
@FXThread
94-
private boolean isSearching = false;
93+
private final BooleanProperty isSearching = new SimpleBooleanProperty(false);
94+
private final JFXTextField searchField;
95+
private final PauseTransition searchPause = new PauseTransition(Duration.millis(100));
9596

9697
ModListPageSkin(ModListPage skinnable) {
9798
super(skinnable);
@@ -118,18 +119,21 @@ final class ModListPageSkin extends SkinBase<ModListPage> {
118119
searchField = new JFXTextField();
119120
searchField.setPromptText(i18n("search"));
120121
HBox.setHgrow(searchField, Priority.ALWAYS);
121-
PauseTransition pause = new PauseTransition(Duration.millis(100));
122-
pause.setOnFinished(e -> search());
122+
searchPause.setOnFinished(e -> search());
123123
searchField.textProperty().addListener((observable, oldValue, newValue) -> {
124-
pause.setRate(1);
125-
pause.playFromStart();
124+
if (isSearching.get() || !StringUtils.isBlank(newValue)) {
125+
searchPause.setRate(1);
126+
searchPause.playFromStart();
127+
}
126128
});
127129

128130
JFXButton closeSearchBar = createToolbarButton2(null, SVG.CLOSE,
129131
() -> {
130132
changeToolbar(toolbarNormal);
131133

132-
isSearching = false;
134+
searchPause.stop();
135+
136+
isSearching.set(false);
133137
searchField.clear();
134138
Bindings.bindContent(listView.getItems(), getSkinnable().getItems());
135139
});
@@ -192,7 +196,7 @@ final class ModListPageSkin extends SkinBase<ModListPage> {
192196
FXUtils.onChangeAndOperate(listView.getSelectionModel().selectedItemProperty(),
193197
selectedItem -> {
194198
if (selectedItem == null)
195-
changeToolbar(isSearching ? searchBar : toolbarNormal);
199+
changeToolbar(isSearching.get() ? searchBar : toolbarNormal);
196200
else
197201
changeToolbar(toolbarSelecting);
198202
});
@@ -223,12 +227,22 @@ final class ModListPageSkin extends SkinBase<ModListPage> {
223227
StackPane placeholderContainer = new StackPane();
224228
placeholderContainer.getStyleClass().add("notice-pane");
225229
Label placeholderLabel = new Label(i18n("mods.empty"));
230+
placeholderLabel.textProperty().bind(
231+
Bindings.createStringBinding(() -> {
232+
if (isSearching.get()) {
233+
return i18n("search.no_results_found");
234+
} else {
235+
return i18n("mods.empty");
236+
}
237+
},
238+
isSearching)
239+
);
226240
placeholderContainer.getChildren().add(placeholderLabel);
227241
listView.setPlaceholder(placeholderContainer);
228242

229243
Bindings.bindContent(listView.getItems(), skinnable.getItems());
230244
skinnable.getItems().addListener((ListChangeListener<? super ModInfoObject>) c -> {
231-
if (isSearching) {
245+
if (isSearching.get()) {
232246
search();
233247
}
234248
});
@@ -271,7 +285,7 @@ private void changeToolbar(HBox newToolbar) {
271285
}
272286

273287
private void search() {
274-
isSearching = true;
288+
isSearching.set(true);
275289

276290
Bindings.unbindContent(listView.getItems(), getSkinnable().getItems());
277291

HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ResourcePackListPage.java

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,8 @@ private static final class ResourcePackListPageSkin extends SkinBase<ResourcePac
266266
private final HBox toolbarNormal = new HBox();
267267
private final HBox toolbarSelecting = new HBox();
268268

269-
private boolean isSearching;
269+
private final BooleanProperty isSearching = new SimpleBooleanProperty(false);
270+
private final PauseTransition searchPause = new PauseTransition(Duration.millis(100));
270271

271272
private ResourcePackListPageSkin(ResourcePackListPage control) {
272273
super(control);
@@ -309,18 +310,21 @@ private ResourcePackListPageSkin(ResourcePackListPage control) {
309310
searchBar.setPadding(new Insets(0, 5, 0, 5));
310311
searchField.setPromptText(i18n("search"));
311312
HBox.setHgrow(searchField, Priority.ALWAYS);
312-
PauseTransition pause = new PauseTransition(Duration.millis(100));
313-
pause.setOnFinished(e -> search());
313+
searchPause.setOnFinished(e -> search());
314314
FXUtils.onChange(searchField.textProperty(), newValue -> {
315-
pause.setRate(1);
316-
pause.playFromStart();
315+
if (isSearching.get() || !StringUtils.isBlank(newValue)) {
316+
searchPause.setRate(1);
317+
searchPause.playFromStart();
318+
}
317319
});
318320

319321
JFXButton closeSearchBar = createToolbarButton2(null, SVG.CLOSE,
320322
() -> {
321323
changeToolbar(toolbarNormal);
322324

323-
isSearching = false;
325+
searchPause.stop();
326+
327+
isSearching.set(false);
324328
searchField.clear();
325329
Bindings.bindContent(listView.getItems(), getSkinnable().getItems());
326330
});
@@ -346,7 +350,7 @@ private ResourcePackListPageSkin(ResourcePackListPage control) {
346350
FXUtils.onChangeAndOperate(listView.getSelectionModel().selectedItemProperty(),
347351
selectedItem -> {
348352
if (selectedItem == null)
349-
changeToolbar(isSearching ? searchBar : toolbarNormal);
353+
changeToolbar(isSearching.get() ? searchBar : toolbarNormal);
350354
else
351355
changeToolbar(toolbarSelecting);
352356
});
@@ -375,6 +379,16 @@ private ResourcePackListPageSkin(ResourcePackListPage control) {
375379
StackPane placeholderContainer = new StackPane();
376380
placeholderContainer.getStyleClass().add("notice-pane");
377381
Label placeholderLabel = new Label(i18n("resourcepack.empty"));
382+
placeholderLabel.textProperty().bind(
383+
Bindings.createStringBinding(() -> {
384+
if (isSearching.get()) {
385+
return i18n("search.no_results_found");
386+
} else {
387+
return i18n("resourcepack.empty");
388+
}
389+
},
390+
isSearching)
391+
);
378392
placeholderContainer.getChildren().add(placeholderLabel);
379393
listView.setPlaceholder(placeholderContainer);
380394

@@ -410,7 +424,7 @@ private void changeToolbar(HBox newToolbar) {
410424
}
411425

412426
private void search() {
413-
isSearching = true;
427+
isSearching.set(true);
414428

415429
Bindings.unbindContent(listView.getItems(), getSkinnable().getItems());
416430

HMCL/src/main/resources/assets/lang/I18N.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1344,6 +1344,7 @@ search.sort=Sort By
13441344
search.first_page=First
13451345
search.previous_page=Previous
13461346
search.next_page=Next
1347+
search.no_results_found=No results found
13471348
search.last_page=Last
13481349
search.page_n=%1$d / %2$s
13491350

HMCL/src/main/resources/assets/lang/I18N_zh.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1137,6 +1137,7 @@ search.sort=排序
11371137
search.first_page=第一頁
11381138
search.previous_page=上一頁
11391139
search.next_page=下一頁
1140+
search.no_results_found=搜尋無結果
11401141
search.last_page=最後一頁
11411142
search.page_n=%d / %s
11421143

HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -962,6 +962,7 @@ mods.mcmod=MC 百科
962962
mods.mcmod.page=MC 百科页面
963963
mods.mcmod.search=MC 百科搜索
964964
mods.name=名称
965+
mods.no_results_found=搜索无结果
965966
mods.not_modded=你需要先在“自动安装”页面安装 Forge、NeoForge、Fabric、Legacy Fabric、Quilt 或 LiteLoader 才能管理模组。
966967
mods.restore=回退
967968
mods.url=官方页面
@@ -1142,6 +1143,7 @@ search.sort=排序
11421143
search.first_page=第一页
11431144
search.previous_page=上一页
11441145
search.next_page=下一页
1146+
search.no_results_found=搜索无结果
11451147
search.last_page=最后一页
11461148
search.page_n=%d / %s
11471149

0 commit comments

Comments
 (0)