improve client server guis

This commit is contained in:
Sen 2025-05-29 13:52:36 +02:00
parent 18f37874fa
commit 3d0cc9665a
Signed by: sen
GPG key ID: 3AC50A6F47D1B722
4 changed files with 57 additions and 19 deletions

View file

@ -2,12 +2,14 @@ package client.gui;
import java.security.KeyPair; import java.security.KeyPair;
import java.security.PublicKey; import java.security.PublicKey;
import java.util.Base64;
import client.gui.GuiConnect.ServerInfo; import client.gui.GuiConnect.ServerInfo;
import client.gui.element.ActButton; import client.gui.element.ActButton;
import client.gui.element.ButtonCallback; import client.gui.element.ButtonCallback;
import client.gui.element.Label; import client.gui.element.Label;
import client.gui.element.NavButton; import client.gui.element.NavButton;
import client.gui.element.PasswordField;
import client.gui.element.PressType; import client.gui.element.PressType;
import client.gui.element.Toggle; import client.gui.element.Toggle;
import client.gui.element.FieldAction; import client.gui.element.FieldAction;
@ -15,6 +17,7 @@ import client.gui.element.Field;
import client.gui.element.FieldCallback; import client.gui.element.FieldCallback;
import client.vars.CVarCategory; import client.vars.CVarCategory;
import client.vars.Variable; import client.vars.Variable;
import client.window.Window;
import common.color.TextColor; import common.color.TextColor;
import common.network.IPlayer; import common.network.IPlayer;
import common.util.EncryptUtil; import common.util.EncryptUtil;
@ -28,8 +31,8 @@ public class GuiServer extends Gui implements FieldCallback {
private Field addrBox; private Field addrBox;
private Field portBox; private Field portBox;
private Field userBox; private Field userBox;
private Field passBox; private PasswordField passBox;
private Field accBox; private PasswordField accBox;
private Label nameLabel; private Label nameLabel;
private Label addrLabel; private Label addrLabel;
private Label portLabel; private Label portLabel;
@ -42,6 +45,8 @@ public class GuiServer extends Gui implements FieldCallback {
private Toggle encToggle; private Toggle encToggle;
private ActButton keyButton; private ActButton keyButton;
private ActButton resetButton; private ActButton resetButton;
private ActButton copyKeyButton;
private ActButton copyIdButton;
private KeyPair keypair; private KeyPair keypair;
private String keyDigest; private String keyDigest;
private PublicKey serverKey; private PublicKey serverKey;
@ -72,8 +77,8 @@ public class GuiServer extends Gui implements FieldCallback {
int port = this.server == null ? this.lastPort : this.server.getPort(); int port = this.server == null ? this.lastPort : this.server.getPort();
this.portBox = this.add(new Field(404, 20, 76, 24, 5, this, port < 0 ? "" : "" + port)); this.portBox = this.add(new Field(404, 20, 76, 24, 5, this, port < 0 ? "" : "" + port));
this.userBox = this.add(new Field(0, 70, 220, 24, IPlayer.MAX_USER_LENGTH, this, IPlayer.VALID_USER, this.server == null ? this.lastUser : this.server.getUser())); this.userBox = this.add(new Field(0, 70, 220, 24, IPlayer.MAX_USER_LENGTH, this, IPlayer.VALID_USER, this.server == null ? this.lastUser : this.server.getUser()));
this.passBox = this.add(new Field(0, this.server == null ? 120 : 170, 480, 24, IPlayer.MAX_PASS_LENGTH, this, this.server == null ? this.lastPass : this.server.getPassword())); this.passBox = this.add(new PasswordField(0, this.server == null ? 120 : 170, 480, 24, IPlayer.MAX_PASS_LENGTH, this, this.server == null ? this.lastPass : this.server.getPassword()));
this.accBox = this.add(new Field(0, this.server == null ? 170 : 220, 480, 24, IPlayer.MAX_PASS_LENGTH, this, this.server == null ? this.lastAcc : this.server.getAccess())); this.accBox = this.add(new PasswordField(0, this.server == null ? 170 : 220, 480, 24, IPlayer.MAX_PASS_LENGTH, this, this.server == null ? this.lastAcc : this.server.getAccess()));
this.add(new ActButton(0, this.server == null ? 220 : 350, 480, 24, new ButtonCallback() { this.add(new ActButton(0, this.server == null ? 220 : 350, 480, 24, new ButtonCallback() {
public void use(ActButton elem, PressType action) { public void use(ActButton elem, PressType action) {
GuiServer.this.connect(); GuiServer.this.connect();
@ -89,7 +94,7 @@ public class GuiServer extends Gui implements FieldCallback {
this.passLabel = this.add(new Label(0, this.server == null ? 100 : 150, 480, 20, (this.keypair == null ? "Anmelde" : "Ersatz") + "-Passwort (mind. 8 Zeichen)", true)); this.passLabel = this.add(new Label(0, this.server == null ? 100 : 150, 480, 20, (this.keypair == null ? "Anmelde" : "Ersatz") + "-Passwort (mind. 8 Zeichen)", true));
this.accLabel = this.add(new Label(0, this.server == null ? 150 : 200, 480, 20, "Server-Passwort (mind. 8 Zeichen)", true)); this.accLabel = this.add(new Label(0, this.server == null ? 150 : 200, 480, 20, "Server-Passwort (mind. 8 Zeichen)", true));
if(this.server != null) { if(this.server != null) {
this.keyButton = this.add(new ActButton(0, 120, 480, 24, new ButtonCallback() { this.keyButton = this.add(new ActButton(0, 120, 391, 24, new ButtonCallback() {
public void use(ActButton elem, PressType action) { public void use(ActButton elem, PressType action) {
if(GuiServer.this.keypair == null) { if(GuiServer.this.keypair == null) {
GuiServer.this.keypair = EncryptUtil.generateKeyPair(); GuiServer.this.keypair = EncryptUtil.generateKeyPair();
@ -97,6 +102,7 @@ public class GuiServer extends Gui implements FieldCallback {
GuiServer.this.keyLabel.setText("Anmelde-Pubkey: RSA-2048 " + GuiServer.this.keyDigest); GuiServer.this.keyLabel.setText("Anmelde-Pubkey: RSA-2048 " + GuiServer.this.keyDigest);
GuiServer.this.keyButton.setText("Schlüsselpaar entfernen"); GuiServer.this.keyButton.setText("Schlüsselpaar entfernen");
GuiServer.this.passLabel.setText("Ersatz-Passwort (mind. 8 Zeichen)"); GuiServer.this.passLabel.setText("Ersatz-Passwort (mind. 8 Zeichen)");
GuiServer.this.copyKeyButton.enabled = true;
} }
else { else {
final String name = GuiServer.this.nameBox.getText(); final String name = GuiServer.this.nameBox.getText();
@ -122,6 +128,8 @@ public class GuiServer extends Gui implements FieldCallback {
GuiServer.this.serverDigest = sdigest; GuiServer.this.serverDigest = sdigest;
GuiServer.this.idLabel.setText("Server-Pubkey: " + (key != null ? "RSA-2048 " + GuiServer.this.serverDigest : "nicht vorhanden")); GuiServer.this.idLabel.setText("Server-Pubkey: " + (key != null ? "RSA-2048 " + GuiServer.this.serverDigest : "nicht vorhanden"));
GuiServer.this.resetButton.enabled = key != null; GuiServer.this.resetButton.enabled = key != null;
GuiServer.this.copyIdButton.enabled = key != null;
GuiServer.this.copyKeyButton.enabled = !confirmed;
if(confirmed) { if(confirmed) {
GuiServer.this.keypair = null; GuiServer.this.keypair = null;
GuiServer.this.keyDigest = null; GuiServer.this.keyDigest = null;
@ -141,22 +149,37 @@ public class GuiServer extends Gui implements FieldCallback {
} }
} }
}, this.keypair == null ? "Neues Schlüsselpaar generieren" : "Schlüsselpaar entfernen")); }, this.keypair == null ? "Neues Schlüsselpaar generieren" : "Schlüsselpaar entfernen"));
this.copyKeyButton = this.add(new ActButton(395, 120, 85, 24, new ButtonCallback() {
public void use(ActButton elem, PressType action) {
if(GuiServer.this.keypair != null)
Window.setClipboard(Base64.getEncoder().encodeToString(GuiServer.this.keypair.getPublic().getEncoded()));
}
}, "Kopieren"));
this.copyKeyButton.enabled = this.keypair != null;
this.keyLabel = this.add(new Label(0, 100, 480, 20, "Anmelde-Pubkey: " + (this.keypair != null ? "RSA-2048 " + this.keyDigest : "nicht vorhanden"), true)); this.keyLabel = this.add(new Label(0, 100, 480, 20, "Anmelde-Pubkey: " + (this.keypair != null ? "RSA-2048 " + this.keyDigest : "nicht vorhanden"), true));
this.encToggle = this.add(new Toggle(0, 250, 480, 24, false, this.server.requiresEncryption(), null, "Nur Verschlüsselte Verbindung akzeptieren")); this.encToggle = this.add(new Toggle(0, 250, 480, 24, false, this.server.requiresEncryption(), null, "Nur Verschlüsselte Verbindung akzeptieren"));
this.serverKey = this.server.getServerKey(); this.serverKey = this.server.getServerKey();
this.serverDigest = this.serverKey == null ? null : EncryptUtil.getXorSha512Hash(this.serverKey.getEncoded()); this.serverDigest = this.serverKey == null ? null : EncryptUtil.getXorSha512Hash(this.serverKey.getEncoded());
this.idLabel = this.add(new Label(0, 280, 480, 20, "Server-Pubkey: " + (this.serverKey != null ? "RSA-2048 " + this.serverDigest : "nicht vorhanden"), true)); this.idLabel = this.add(new Label(0, 280, 480, 20, "Server-Pubkey: " + (this.serverKey != null ? "RSA-2048 " + this.serverDigest : "nicht vorhanden"), true));
this.resetButton = this.add(new ActButton(0, 300, 480, 24, new ButtonCallback() { this.resetButton = this.add(new ActButton(0, 300, 391, 24, new ButtonCallback() {
public void use(ActButton elem, PressType action) { public void use(ActButton elem, PressType action) {
if(GuiServer.this.serverKey != null) { if(GuiServer.this.serverKey != null) {
GuiServer.this.serverKey = null; GuiServer.this.serverKey = null;
GuiServer.this.serverDigest = null; GuiServer.this.serverDigest = null;
GuiServer.this.idLabel.setText("Server-Pubkey: nicht vorhanden"); GuiServer.this.idLabel.setText("Server-Pubkey: nicht vorhanden");
GuiServer.this.resetButton.enabled = false; GuiServer.this.resetButton.enabled = false;
GuiServer.this.copyIdButton.enabled = false;
} }
} }
}, "Server-Identifizierung / Pubkey zurücksetzen")); }, "Server-Identifizierung / Pubkey zurücksetzen"));
this.resetButton.enabled = this.serverKey != null; this.resetButton.enabled = this.serverKey != null;
this.copyIdButton = this.add(new ActButton(395, 300, 85, 24, new ButtonCallback() {
public void use(ActButton elem, PressType action) {
if(GuiServer.this.serverKey != null)
Window.setClipboard(Base64.getEncoder().encodeToString(GuiServer.this.serverKey.getEncoded()));
}
}, "Kopieren"));
this.copyIdButton.enabled = this.serverKey != null;
} }
this.shift(); this.shift();
} }

View file

@ -34,7 +34,7 @@ public class Field extends Textbox {
public void updateText() { public void updateText() {
this.textWidth = Drawing.txt_size(this.pos_x + this.margin_x1, this.pos_y + this.margin_y1, this.textWidth = Drawing.txt_size(this.pos_x + this.margin_x1, this.pos_y + this.margin_y1,
this.pos_x + this.margin_x1, this.pos_y + this.margin_y1, this.pos_x + this.margin_x1, this.pos_y + this.margin_y1,
Integer.MAX_VALUE, Integer.MAX_VALUE, this.text).xpos; Integer.MAX_VALUE, Integer.MAX_VALUE, this.getDrawnText()).xpos;
} }
public void mouserel() { public void mouserel() {
@ -95,7 +95,7 @@ public class Field extends Textbox {
protected void updateCursor(int offset, boolean shift, int x1, int y1, int x2, int y2) { protected void updateCursor(int offset, boolean shift, int x1, int y1, int x2, int y2) {
Vec2i coord = Drawing.txt_coord(offset, x1 + this.text_x, y1 + this.text_y, Vec2i coord = Drawing.txt_coord(offset, x1 + this.text_x, y1 + this.text_y,
x1 + this.text_x, y1 + this.text_y, 0x7fffffff, 0x7fffffff, this.text); x1 + this.text_x, y1 + this.text_y, 0x7fffffff, 0x7fffffff, this.getDrawnText());
this.cursorPos = coord.xpos; this.cursorPos = coord.xpos;
if(shift) { if(shift) {
if(this.cursorPos < x1) if(this.cursorPos < x1)
@ -108,7 +108,7 @@ public class Field extends Textbox {
protected int onCursorOffset(int x, int y, int x1, int y1, int x2, int y2) { protected int onCursorOffset(int x, int y, int x1, int y1, int x2, int y2) {
Offset off = Drawing.txt_offset(x, y, x1 + this.text_x, y1 + this.text_y, Offset off = Drawing.txt_offset(x, y, x1 + this.text_x, y1 + this.text_y,
x1 + this.text_x, y1 + this.text_y, 0x7fffffff, 0x7fffffff, this.text); x1 + this.text_x, y1 + this.text_y, 0x7fffffff, 0x7fffffff, this.getDrawnText());
if(off != null) { if(off != null) {
this.cursorPos = off.xpos; this.cursorPos = off.xpos;
} }
@ -130,17 +130,21 @@ public class Field extends Textbox {
protected void drawForeground(int x1, int y1, int x2, int y2) { protected void drawForeground(int x1, int y1, int x2, int y2) {
Drawing.txt_draw(x1 + this.text_x, y1 + this.text_y, Drawing.txt_draw(x1 + this.text_x, y1 + this.text_y,
x1 + this.text_x, y1 + this.text_y, x1 + this.text_x, y1 + this.text_y,
Integer.MAX_VALUE, Integer.MAX_VALUE, this.enabled ? this.gm.style.text_field : Util.mulColor(this.gm.style.text_field, 0.5f), this.text); Integer.MAX_VALUE, Integer.MAX_VALUE, this.enabled ? this.gm.style.text_field : Util.mulColor(this.gm.style.text_field, 0.5f), this.getDrawnText());
if(this.sel_start >= 0 && this.sel_end != this.sel_start) if(this.sel_start >= 0 && this.sel_end != this.sel_start)
Drawing.txt_overlay(this.sel_start, this.sel_end, x1 + this.text_x, y1 + this.text_y, Drawing.txt_overlay(this.sel_start, this.sel_end, x1 + this.text_x, y1 + this.text_y,
x1 + this.text_x, y1 + this.text_y, x1 + this.text_x, y1 + this.text_y,
Integer.MAX_VALUE, Integer.MAX_VALUE, this.enabled ? 0x808080ff : 0x80404040, this.text); Integer.MAX_VALUE, Integer.MAX_VALUE, this.enabled ? 0x808080ff : 0x80404040, this.getDrawnText());
} }
protected char getNewline() { protected char getNewline() {
return ' '; return ' ';
} }
protected String getDrawnText() {
return this.text;
}

View file

@ -1,6 +1,5 @@
package client.gui.element; package client.gui.element;
import client.renderer.Drawing;
import common.util.Util; import common.util.Util;
public class PasswordField extends Field { public class PasswordField extends Field {
@ -8,13 +7,21 @@ public class PasswordField extends Field {
super(x, y, w, h, cap, callback, text); super(x, y, w, h, cap, callback, text);
} }
protected void drawForeground(int x1, int y1, int x2, int y2) { // protected void drawForeground(int x1, int y1, int x2, int y2) {
Drawing.txt_draw(x1 + this.text_x, y1 + this.text_y, // Drawing.txt_draw(x1 + this.text_x, y1 + this.text_y,
x1 + this.text_x, y1 + this.text_y, // x1 + this.text_x, y1 + this.text_y,
Integer.MAX_VALUE, Integer.MAX_VALUE, this.enabled ? this.gm.style.text_field : Util.mulColor(this.gm.style.text_field, 0.5f), this.text.isEmpty() ? "" : "****"); // Integer.MAX_VALUE, Integer.MAX_VALUE, this.enabled ? this.gm.style.text_field : Util.mulColor(this.gm.style.text_field, 0.5f), this.text.isEmpty() ? "" : "****");
// }
// protected int getCursorX(int x1, int x2) {
// return x1;
// }
protected String getDrawnText() {
return Util.repeatString("*", this.text.length());
} }
protected int getCursorX(int x1, int x2) { protected boolean canCopy() {
return x1; return false;
} }
} }

View file

@ -51,6 +51,10 @@ abstract class Textbox extends Element {
return 4; return 4;
} }
protected boolean canCopy() {
return true;
}
public void setText(String str) { public void setText(String str) {
if(this.validator != null) if(this.validator != null)
str = this.validator.filter(str); str = this.validator.filter(str);
@ -91,7 +95,7 @@ abstract class Textbox extends Element {
this.sel_end = this.text.length(); this.sel_end = this.text.length();
} }
else if(ctrl && (key == Keysym.C) || (this.editable && (key == Keysym.X))) { else if(ctrl && (key == Keysym.C) || (this.editable && (key == Keysym.X))) {
if(this.sel_start >= 0 && this.sel_start != this.sel_end) { // fix empty if(this.canCopy() && this.sel_start >= 0 && this.sel_start != this.sel_end) { // fix empty
String str = Util.strip(this.text, this.sel_start, this.sel_end - this.sel_start, '\n', (char)0, '?'); String str = Util.strip(this.text, this.sel_start, this.sel_end - this.sel_start, '\n', (char)0, '?');
Window.setClipboard(str); Window.setClipboard(str);
if(key == Keysym.X) if(key == Keysym.X)