Skip to content

Commit 145188a

Browse files
authored
Merge pull request #63 from Jaffe2718/architectury-1.21
Add file chooser for String field in 1.6.0
2 parents 9cce0ff + 7deccf4 commit 145188a

File tree

7 files changed

+137
-58
lines changed

7 files changed

+137
-58
lines changed

common/src/main/java/eu/midnightdust/core/MidnightLib.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,26 @@
55
import eu.midnightdust.lib.config.MidnightConfig;
66
import net.fabricmc.api.EnvType;
77
import net.fabricmc.api.Environment;
8+
import org.slf4j.Logger;
9+
import org.slf4j.LoggerFactory;
810

11+
import javax.swing.*;
912
import java.lang.reflect.Field;
1013
import java.util.ArrayList;
1114
import java.util.List;
1215

1316
public class MidnightLib {
1417
public static List<String> hiddenMods = new ArrayList<>();
18+
public static final Logger LOGGER = LoggerFactory.getLogger("midnightlib");
1519

1620
@Environment(EnvType.CLIENT)
1721
public static void onInitializeClient() {
22+
System.setProperty("java.awt.headless", "false");
23+
try {
24+
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
25+
} catch (Exception e) {
26+
LOGGER.error("Error setting system look and feel", e);
27+
}
1828
MidnightLibConfig.init("midnightlib", MidnightLibConfig.class);
1929
}
2030
@Environment(EnvType.SERVER)

common/src/main/java/eu/midnightdust/core/config/MidnightLibConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ public class MidnightLibConfig extends MidnightConfig {
1010
public static ConfigButton config_screen_list = (PlatformFunctions.isModLoaded("modmenu") || Objects.equals(PlatformFunctions.getPlatformName(), "neoforge")) ? ConfigButton.MODMENU : ConfigButton.TRUE;
1111

1212
public enum ConfigButton {
13-
TRUE,FALSE,MODMENU
13+
TRUE, FALSE, MODMENU
1414
}
1515
}

common/src/main/java/eu/midnightdust/lib/config/MidnightConfig.java

Lines changed: 69 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import net.minecraft.util.Formatting;
2929
import net.minecraft.util.Identifier;
3030

31+
import javax.swing.JFileChooser;
32+
import javax.swing.filechooser.FileNameExtensionFilter;
3133
import java.awt.Color;
3234
import java.lang.annotation.ElementType;
3335
import java.lang.annotation.Retention;
@@ -70,7 +72,7 @@ public static class EntryInfo {
7072
String id;
7173
Text name;
7274
int index;
73-
ClickableWidget colorButton;
75+
ClickableWidget functionButton; // color picker button / explorer button
7476
Tab tab;
7577
}
7678

@@ -175,7 +177,7 @@ else if (inLimits) {
175177
if (!s.contains("#")) s = '#' + s;
176178
if (!HEXADECIMAL_ONLY.matcher(s).matches()) return false;
177179
try {
178-
info.colorButton.setMessage(Text.literal("⬛").setStyle(Style.EMPTY.withColor(Color.decode(info.tempValue).getRGB())));
180+
info.functionButton.setMessage(Text.literal("⬛").setStyle(Style.EMPTY.withColor(Color.decode(info.tempValue).getRGB())));
179181
} catch (Exception ignored) {}
180182
}
181183
return true;
@@ -353,7 +355,9 @@ public void fillList() {
353355
if (e.isSlider())
354356
widget = new MidnightSliderWidget(width - 160, 0, 150, 20, Text.of(info.tempValue), (Double.parseDouble(info.tempValue) - e.min()) / (e.max() - e.min()), info);
355357
else
356-
widget = new TextFieldWidget(textRenderer, width - 160, 0, 150, 20, null, Text.of(info.tempValue));
358+
widget = new TextFieldWidget(textRenderer,
359+
width - (160 + (e.selectionMode() > -1 ? 20 : 0)),
360+
0, 150, 20, null, Text.of(info.tempValue));
357361
if (widget instanceof TextFieldWidget textField) {
358362
textField.setMaxLength(info.width);
359363
textField.setText(info.tempValue);
@@ -363,15 +367,43 @@ public void fillList() {
363367
widget.setTooltip(getTooltip(info));
364368
if (e.isColor()) {
365369
resetButton.setWidth(20);
366-
ButtonWidget colorButton = ButtonWidget.builder(Text.literal("⬛"), (button -> {
367-
})).dimensions(width - 185, 0, 20, 20).build();
370+
ButtonWidget colorButton = ButtonWidget.builder(Text.literal("⬛"), (button -> {})).dimensions(width - 185, 0, 20, 20).build();
368371
try {
369372
colorButton.setMessage(Text.literal("⬛").setStyle(Style.EMPTY.withColor(Color.decode(info.tempValue).getRGB())));
370373
} catch (Exception ignored) {}
371-
info.colorButton = colorButton;
374+
info.functionButton = colorButton;
372375
colorButton.active = false;
373376
this.list.addButton(List.of(widget, resetButton, colorButton), name, info);
374-
} else this.list.addButton(List.of(widget, resetButton), name, info);
377+
} else if (e.selectionMode() > -1) {
378+
ButtonWidget explorerButton = TextIconButtonWidget.builder(
379+
Text.of(""),
380+
button -> {
381+
JFileChooser fileChooser = new JFileChooser();
382+
fileChooser.setFileSelectionMode(e.selectionMode());
383+
fileChooser.setDialogType(e.fileChooserType());
384+
fileChooser.setDialogTitle(Text.translatable(translationPrefix + info.field.getName() + ".fileChooser.title").getString());
385+
if ((e.selectionMode() == JFileChooser.FILES_ONLY || e.selectionMode() == JFileChooser.FILES_AND_DIRECTORIES) &&
386+
Arrays.stream(e.fileExtensions()).noneMatch("*"::equals)) {
387+
fileChooser.setFileFilter(new FileNameExtensionFilter(
388+
Text.translatable(translationPrefix + info.field.getName() + ".fileFilter.description").getString(),
389+
e.fileExtensions()));
390+
}
391+
if (fileChooser.showDialog(null, null) == JFileChooser.APPROVE_OPTION) {
392+
info.value = fileChooser.getSelectedFile().getAbsolutePath();
393+
info.tempValue = info.value.toString();
394+
list.clear();
395+
fillList();
396+
}
397+
},
398+
true
399+
).texture(Identifier.of("midnightlib","icon/explorer"), 12, 12).dimension(20, 20).build();
400+
explorerButton.setPosition(width - 25, 0);
401+
resetButton.setWidth(20);
402+
info.functionButton = explorerButton;
403+
this.list.addButton(List.of(widget, resetButton, explorerButton), name, info);
404+
} else {
405+
this.list.addButton(List.of(widget, resetButton), name, info);
406+
}
375407
} else {
376408
this.list.addButton(List.of(), name, info);
377409
}
@@ -463,16 +495,44 @@ protected void applyValue() {
463495
info.tempValue = String.valueOf(info.value);
464496
}
465497
}
466-
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Entry {
467-
int width() default 100;
498+
499+
/**
500+
* Entry Annotation<br>
501+
* - <b>width</b>: The maximum character length of the {@link String} or {@link List<String>} field<br>
502+
* - <b>min</b>: The minimum value of the <code>int</code>, <code>float</code> or <code>double</code> field<br>
503+
* - <b>max</b>: The maximum value of the <code>int</code>, <code>float</code> or <code>double</code> field<br>
504+
* - <b>name</b>: The name of the field in the config screen<br>
505+
* - <b>selectionMode</b>: The selection mode of the file picker button for {@link String} fields,
506+
* -1 for none, {@link JFileChooser#FILES_ONLY} for files, {@link JFileChooser#DIRECTORIES_ONLY} for directories,
507+
* {@link JFileChooser#FILES_AND_DIRECTORIES} for both (default: -1). Remember to set the translation key
508+
* <code>[modid].midnightconfig.[fieldName].fileChooser.title</code> for the file picker dialog title<br>
509+
* - <b>fileChooserType</b>: The type of the file picker button for {@link String} fields,
510+
* can be {@link JFileChooser#OPEN_DIALOG} or {@link JFileChooser#SAVE_DIALOG} (default: {@link JFileChooser#OPEN_DIALOG}).
511+
* Remember to set the translation key <code>[modid].midnightconfig.[fieldName].fileFilter.description</code> for the file filter description
512+
* if <code>"*"</code> is not used as file extension<br>
513+
* - <b>fileExtensions</b>: The file extensions for the file picker button for {@link String} fields (default: <code>{"*"}</code>),
514+
* only works if selectionMode is {@link JFileChooser#FILES_ONLY} or {@link JFileChooser#FILES_AND_DIRECTORIES}<br>
515+
* - <b>isColor</b>: If the field is a hexadecimal color code (default: false)<br>
516+
* - <b>isSlider</b>: If the field is a slider (default: false)<br>
517+
* - <b>precision</b>: The precision of the <code>float</code> or <code>double</code> field (default: 100)<br>
518+
* - <b>category</b>: The category of the field in the config screen (default: "default")<br>
519+
* */
520+
@Retention(RetentionPolicy.RUNTIME)
521+
@Target(ElementType.FIELD)
522+
public @interface Entry {
523+
int width() default 400;
468524
double min() default Double.MIN_NORMAL;
469525
double max() default Double.MAX_VALUE;
470526
String name() default "";
527+
int selectionMode() default -1; // -1 for none, 0 for file, 1 for firectory, 2 for both
528+
int fileChooserType() default JFileChooser.OPEN_DIALOG;
529+
String[] fileExtensions() default {"*"};
471530
boolean isColor() default false;
472531
boolean isSlider() default false;
473532
int precision() default 100;
474533
String category() default "default";
475534
}
535+
476536
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Client {}
477537
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Server {}
478538
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Hidden {}
197 Bytes
Loading
Lines changed: 55 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,63 @@
11
{
2-
"schemaVersion": 1,
3-
"id": "midnightlib",
4-
"version": "${version}",
2+
"schemaVersion": 1,
3+
"id": "midnightlib",
4+
"version": "${version}",
55

6-
"name": "MidnightLib",
7-
"description": "Common Library for Team MidnightDust's mods.",
8-
"authors": [
9-
"Motschen",
10-
"TeamMidnightDust"
11-
],
12-
"contact": {
13-
"homepage": "https://www.midnightdust.eu/",
14-
"sources": "https://github.com/TeamMidnightDust/MidnightLib",
15-
"issues": "https://github.com/TeamMidnightDust/MidnightLib/issues"
16-
},
17-
18-
"license": "MIT",
19-
"icon": "assets/midnightlib/icon.png",
20-
21-
"environment": "*",
22-
"entrypoints": {
23-
"client": [
24-
"eu.midnightdust.fabric.core.MidnightLibFabric"
6+
"name": "MidnightLib",
7+
"description": "Common Library for Team MidnightDust's mods.",
8+
"authors": [
9+
"Motschen",
10+
"TeamMidnightDust"
2511
],
26-
"server": [
27-
"eu.midnightdust.fabric.core.MidnightLibFabric"
12+
"contributors": [
13+
{
14+
"name": "Jaffe2718",
15+
"contact": {
16+
"email": "[email protected]",
17+
"homepage": "https://space.bilibili.com/1671742926"
18+
}
19+
}
2820
],
29-
"modmenu": [
30-
"eu.midnightdust.lib.config.AutoModMenu"
31-
]
32-
},
33-
"depends": {
34-
"fabric-resource-loader-v0": "*",
35-
"minecraft": ">=1.20.4"
36-
},
21+
"contact": {
22+
"homepage": "https://www.midnightdust.eu/",
23+
"sources": "https://github.com/TeamMidnightDust/MidnightLib",
24+
"issues": "https://github.com/TeamMidnightDust/MidnightLib/issues"
25+
},
26+
27+
"license": "MIT",
28+
"icon": "assets/midnightlib/icon.png",
3729

38-
"mixins": [
39-
"midnightlib.mixins.json"
40-
],
30+
"environment": "*",
31+
"entrypoints": {
32+
"client": [
33+
"eu.midnightdust.fabric.core.MidnightLibFabric"
34+
],
35+
"server": [
36+
"eu.midnightdust.fabric.core.MidnightLibFabric"
37+
],
38+
"modmenu": [
39+
"eu.midnightdust.lib.config.AutoModMenu"
40+
]
41+
},
42+
"depends": {
43+
"fabric-resource-loader-v0": "*",
44+
"minecraft": ">=1.20.4"
45+
},
46+
47+
"mixins": [
48+
"midnightlib.mixins.json"
49+
],
4150

42-
"custom": {
43-
"modmenu": {
44-
"links": {
45-
"modmenu.discord": "https://discord.midnightdust.eu/",
46-
"modmenu.website": "https://www.midnightdust.eu/",
47-
"midnightlib.curseforge": "https://www.curseforge.com/minecraft/mc-mods/midnightlib",
48-
"midnightlib.modrinth": "https://modrinth.com/mod/midnightlib",
49-
"midnightlib.wiki": "https://github.com/TeamMidnightDust/MidnightLib/wiki"
50-
},
51-
"badges": [ "library" ]
51+
"custom": {
52+
"modmenu": {
53+
"links": {
54+
"modmenu.discord": "https://discord.midnightdust.eu/",
55+
"modmenu.website": "https://www.midnightdust.eu/",
56+
"midnightlib.curseforge": "https://www.curseforge.com/minecraft/mc-mods/midnightlib",
57+
"midnightlib.modrinth": "https://modrinth.com/mod/midnightlib",
58+
"midnightlib.wiki": "https://github.com/TeamMidnightDust/MidnightLib/wiki"
59+
},
60+
"badges": [ "library" ]
61+
}
5262
}
53-
}
5463
}

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ yarn_mappings=1.21+build.1
55
enabled_platforms=fabric,neoforge
66

77
archives_base_name=midnightlib
8-
mod_version=1.5.8
8+
mod_version=1.6.0
99
maven_group=eu.midnightdust
1010
release_type=release
1111
curseforge_id=488090
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists

0 commit comments

Comments
 (0)