fancydialgos: Add support for text fields

This commit is contained in:
Oliver
2025-06-21 14:52:25 +02:00
parent d5665109e8
commit 450082b6f1
10 changed files with 143 additions and 6 deletions

View File

@@ -5,6 +5,10 @@ order: 1
# FancyDialogs v0.x.x # FancyDialogs v0.x.x
## v0.0.5 [!badge variant="info" text="2025-06-20"]
- Added support for text fields in dialogs
## v0.0.4 [!badge variant="info" text="2025-06-20"] ## v0.0.4 [!badge variant="info" text="2025-06-20"]
- Added fancyanalytics integration - Added fancyanalytics integration

View File

@@ -1 +1 @@
0.0.4 0.0.5

View File

@@ -3,6 +3,7 @@ package com.fancyinnovations.fancydialogs.api;
import com.fancyinnovations.fancydialogs.api.data.DialogBodyData; import com.fancyinnovations.fancydialogs.api.data.DialogBodyData;
import com.fancyinnovations.fancydialogs.api.data.DialogButton; import com.fancyinnovations.fancydialogs.api.data.DialogButton;
import com.fancyinnovations.fancydialogs.api.data.DialogData; import com.fancyinnovations.fancydialogs.api.data.DialogData;
import com.fancyinnovations.fancydialogs.api.data.inputs.DialogInputs;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.List; import java.util.List;
@@ -105,6 +106,7 @@ public class ConfirmationDialog {
title, title,
false, false,
List.of(new DialogBodyData(question)), List.of(new DialogBodyData(question)),
DialogInputs.EMPTY, // TODO add support for confirmation phrases
List.of(confirmBtn, cancelBtn) List.of(confirmBtn, cancelBtn)
); );

View File

@@ -2,6 +2,7 @@ package com.fancyinnovations.fancydialogs.api;
import com.fancyinnovations.fancydialogs.api.data.DialogBodyData; import com.fancyinnovations.fancydialogs.api.data.DialogBodyData;
import com.fancyinnovations.fancydialogs.api.data.DialogData; import com.fancyinnovations.fancydialogs.api.data.DialogData;
import com.fancyinnovations.fancydialogs.api.data.inputs.DialogInputs;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.List; import java.util.List;
@@ -25,6 +26,7 @@ public class NoticeDialog {
List.of( List.of(
new DialogBodyData(this.text) new DialogBodyData(this.text)
), ),
DialogInputs.EMPTY,
List.of() List.of()
); );
} }

View File

@@ -1,5 +1,6 @@
package com.fancyinnovations.fancydialogs.api.data; package com.fancyinnovations.fancydialogs.api.data;
import com.fancyinnovations.fancydialogs.api.data.inputs.DialogInputs;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.List; import java.util.List;
@@ -9,6 +10,7 @@ public record DialogData(
@NotNull String title, @NotNull String title,
boolean canCloseWithEscape, boolean canCloseWithEscape,
@NotNull List<DialogBodyData> body, @NotNull List<DialogBodyData> body,
@NotNull DialogInputs inputs,
@NotNull List<DialogButton> buttons @NotNull List<DialogButton> buttons
) { ) {

View File

@@ -0,0 +1,26 @@
package com.fancyinnovations.fancydialogs.api.data.inputs;
public abstract class DialogInput {
protected final String key;
protected final String label;
protected final int order;
public DialogInput(String key, String label, int order) {
this.key = key;
this.label = label;
this.order = order;
}
public String getKey() {
return key;
}
public String getLabel() {
return label;
}
public int getOrder() {
return order;
}
}

View File

@@ -0,0 +1,28 @@
package com.fancyinnovations.fancydialogs.api.data.inputs;
import java.util.ArrayList;
import java.util.List;
public record DialogInputs(
List<DialogTextField> textFields
) {
public static final DialogInputs EMPTY = new DialogInputs(List.of());
public List<DialogInput> all() {
List<DialogInput> all = new ArrayList<>();
if (textFields != null) {
all.addAll(textFields);
}
all.sort((o1, o2) -> {
if (o1.getOrder() == o2.getOrder()) {
return 0;
}
return o1.getOrder() < o2.getOrder() ? -1 : 1;
});
return all;
}
}

View File

@@ -0,0 +1,27 @@
package com.fancyinnovations.fancydialogs.api.data.inputs;
public class DialogTextField extends DialogInput {
private final String placeholder;
private final int maxLength;
private final int maxLines;
public DialogTextField(String key, String label, int order, String placeholder, int maxLength, int maxLines) {
super(key, label, order);
this.placeholder = placeholder;
this.maxLength = maxLength;
this.maxLines = maxLines;
}
public String getPlaceholder() {
return placeholder;
}
public int getMaxLength() {
return maxLength;
}
public int getMaxLines() {
return maxLines;
}
}

View File

@@ -4,6 +4,8 @@ import com.fancyinnovations.fancydialogs.api.Dialog;
import com.fancyinnovations.fancydialogs.api.data.DialogBodyData; import com.fancyinnovations.fancydialogs.api.data.DialogBodyData;
import com.fancyinnovations.fancydialogs.api.data.DialogButton; import com.fancyinnovations.fancydialogs.api.data.DialogButton;
import com.fancyinnovations.fancydialogs.api.data.DialogData; import com.fancyinnovations.fancydialogs.api.data.DialogData;
import com.fancyinnovations.fancydialogs.api.data.inputs.DialogInput;
import com.fancyinnovations.fancydialogs.api.data.inputs.DialogTextField;
import de.oliver.fancysitula.api.dialogs.FS_CommonDialogData; import de.oliver.fancysitula.api.dialogs.FS_CommonDialogData;
import de.oliver.fancysitula.api.dialogs.FS_DialogAction; import de.oliver.fancysitula.api.dialogs.FS_DialogAction;
import de.oliver.fancysitula.api.dialogs.actions.FS_CommonButtonData; import de.oliver.fancysitula.api.dialogs.actions.FS_CommonButtonData;
@@ -11,6 +13,9 @@ import de.oliver.fancysitula.api.dialogs.actions.FS_DialogActionButton;
import de.oliver.fancysitula.api.dialogs.actions.FS_DialogCustomAction; import de.oliver.fancysitula.api.dialogs.actions.FS_DialogCustomAction;
import de.oliver.fancysitula.api.dialogs.body.FS_DialogBody; import de.oliver.fancysitula.api.dialogs.body.FS_DialogBody;
import de.oliver.fancysitula.api.dialogs.body.FS_DialogTextBody; import de.oliver.fancysitula.api.dialogs.body.FS_DialogTextBody;
import de.oliver.fancysitula.api.dialogs.inputs.FS_DialogInput;
import de.oliver.fancysitula.api.dialogs.inputs.FS_DialogInputControl;
import de.oliver.fancysitula.api.dialogs.inputs.FS_DialogTextInput;
import de.oliver.fancysitula.api.dialogs.types.FS_MultiActionDialog; import de.oliver.fancysitula.api.dialogs.types.FS_MultiActionDialog;
import de.oliver.fancysitula.api.entities.FS_RealPlayer; import de.oliver.fancysitula.api.entities.FS_RealPlayer;
import de.oliver.fancysitula.factories.FancySitula; import de.oliver.fancysitula.factories.FancySitula;
@@ -39,6 +44,30 @@ public class DialogImpl extends Dialog {
body.add(fsDialogTextBody); body.add(fsDialogTextBody);
} }
List<FS_DialogInput> inputs = new ArrayList<>();
for (DialogInput input : data.inputs().all()) {
FS_DialogInputControl control = null;
if (input instanceof DialogTextField textField) {
control = new FS_DialogTextInput(
200, // default width
textField.getLabel(),
!textField.getLabel().isEmpty(),
textField.getPlaceholder(),
textField.getMaxLength(),
textField.getMaxLines() > 0 ?
new FS_DialogTextInput.MultilineOptions(textField.getMaxLines(), null) :
null
);
}
if (control == null) {
throw new IllegalArgumentException("Unsupported input type: " + input.getClass().getSimpleName());
}
FS_DialogInput fsDialogInput = new FS_DialogInput(input.getKey(), control);
inputs.add(fsDialogInput);
}
List<FS_DialogActionButton> actions = new ArrayList<>(); List<FS_DialogActionButton> actions = new ArrayList<>();
for (DialogButton button : data.buttons()) { for (DialogButton button : data.buttons()) {
FS_DialogActionButton fsDialogActionButton = new FS_DialogActionButton( FS_DialogActionButton fsDialogActionButton = new FS_DialogActionButton(
@@ -66,7 +95,8 @@ public class DialogImpl extends Dialog {
false, false,
FS_DialogAction.CLOSE, FS_DialogAction.CLOSE,
body, body,
List.of( inputs
// List.of(
// new FS_DialogInput( // new FS_DialogInput(
// "input1", // "input1",
// new FS_DialogTextInput( // new FS_DialogTextInput(
@@ -112,7 +142,7 @@ public class DialogImpl extends Dialog {
// true // true
// ) // )
// ) // )
) // )
), ),
actions, // actions actions, // actions
null, null,

View File

@@ -4,6 +4,8 @@ import com.fancyinnovations.fancydialogs.FancyDialogsPlugin;
import com.fancyinnovations.fancydialogs.api.data.DialogBodyData; import com.fancyinnovations.fancydialogs.api.data.DialogBodyData;
import com.fancyinnovations.fancydialogs.api.data.DialogButton; import com.fancyinnovations.fancydialogs.api.data.DialogButton;
import com.fancyinnovations.fancydialogs.api.data.DialogData; import com.fancyinnovations.fancydialogs.api.data.DialogData;
import com.fancyinnovations.fancydialogs.api.data.inputs.DialogInputs;
import com.fancyinnovations.fancydialogs.api.data.inputs.DialogTextField;
import com.fancyinnovations.fancydialogs.dialog.DialogImpl; import com.fancyinnovations.fancydialogs.dialog.DialogImpl;
import com.fancyinnovations.fancydialogs.storage.DialogStorage; import com.fancyinnovations.fancydialogs.storage.DialogStorage;
@@ -40,6 +42,18 @@ public class DefaultDialogs {
new DialogBodyData("Explore more features in the documentation (<click:open_url:'https://docs.fancyinnovations.com/fancyholograms/'><u>click here</u></click>)."), new DialogBodyData("Explore more features in the documentation (<click:open_url:'https://docs.fancyinnovations.com/fancyholograms/'><u>click here</u></click>)."),
new DialogBodyData("<gradient:#ff7300:#ffd199:#ff7300>Enjoy using FancyDialogs :D</gradient>") new DialogBodyData("<gradient:#ff7300:#ffd199:#ff7300>Enjoy using FancyDialogs :D</gradient>")
), ),
new DialogInputs(
List.of(
new DialogTextField(
"fav_color",
"<color:#ff7300>What is your favorite color?</color>",
1,
"Gold",
50,
1
)
)
),
List.of( List.of(
new DialogButton( new DialogButton(
"<color:#ff4f19>Close</color>", "<color:#ff4f19>Close</color>",
@@ -47,10 +61,10 @@ public class DefaultDialogs {
List.of() List.of()
), ),
new DialogButton( new DialogButton(
"<color:#ffd000>Run command</color>", "<color:#ffd000>Show favourite color</color>",
"<color:#ff4f19>Click to give yourself an apple :)</color>", "<color:#ff4f19>Click to show your fav color :D</color>",
List.of( List.of(
new DialogButton.DialogAction("console_command", "give @p minecraft:apple 1") new DialogButton.DialogAction("message", "Your favorite color is: {fav_color}")
) )
) )
) )
@@ -70,6 +84,7 @@ public class DefaultDialogs {
new DialogBodyData("We are glad to have you here!"), new DialogBodyData("We are glad to have you here!"),
new DialogBodyData("If you have any questions, feel free to ask our staff members.") new DialogBodyData("If you have any questions, feel free to ask our staff members.")
), ),
DialogInputs.EMPTY,
List.of( List.of(
new DialogButton( new DialogButton(
"<color:red>Read the rules</color>", "<color:red>Read the rules</color>",
@@ -111,6 +126,7 @@ public class DefaultDialogs {
List.of( List.of(
new DialogBodyData("Here you can quickly access some of the most important features of our server.") new DialogBodyData("Here you can quickly access some of the most important features of our server.")
), ),
DialogInputs.EMPTY,
List.of( List.of(
new DialogButton( new DialogButton(
"<color:#ffee00>Visit our website</color>", "<color:#ffee00>Visit our website</color>",