From c406a5d226ae3bf773f6dce175b78d143c719b1e Mon Sep 17 00:00:00 2001 From: DieGurke <55625494+DieGurke@users.noreply.github.com> Date: Wed, 15 Jul 2020 14:05:47 +0200 Subject: [PATCH 01/33] Replaced custom clearableTextField with normal TextField --- .../java/envoy/client/ui/controller/LoginScene.java | 11 +++++------ client/src/main/resources/fxml/LoginScene.fxml | 6 +++--- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/client/src/main/java/envoy/client/ui/controller/LoginScene.java b/client/src/main/java/envoy/client/ui/controller/LoginScene.java index 3f0df5b..fe05578 100644 --- a/client/src/main/java/envoy/client/ui/controller/LoginScene.java +++ b/client/src/main/java/envoy/client/ui/controller/LoginScene.java @@ -14,7 +14,6 @@ import javafx.scene.control.Alert.AlertType; import envoy.client.data.*; import envoy.client.net.Client; import envoy.client.net.WriteProxy; -import envoy.client.ui.ClearableTextField; import envoy.client.ui.SceneContext; import envoy.client.ui.Startup; import envoy.data.LoginCredentials; @@ -38,7 +37,7 @@ import envoy.util.EnvoyLog; public final class LoginScene { @FXML - private ClearableTextField userTextField; + private TextField userTextField; @FXML private PasswordField passwordField; @@ -104,16 +103,16 @@ public final class LoginScene { if (registerCheckBox.isSelected() && !passwordField.getText().equals(repeatPasswordField.getText())) { new Alert(AlertType.ERROR, "The entered password is unequal to the repeated one").showAndWait(); repeatPasswordField.clear(); - } else if (!Bounds.isValidContactName(userTextField.getTextField().getText())) { + } else if (!Bounds.isValidContactName(userTextField.getText())) { new Alert(AlertType.ERROR, "The entered user name is not valid (" + Bounds.CONTACT_NAME_PATTERN + ")").showAndWait(); - userTextField.getTextField().clear(); - } else performHandshake(new LoginCredentials(userTextField.getTextField().getText(), passwordField.getText(), registerCheckBox.isSelected(), + userTextField.clear(); + } else performHandshake(new LoginCredentials(userTextField.getText(), passwordField.getText(), registerCheckBox.isSelected(), Startup.VERSION)); } @FXML private void offlineModeButtonPressed() { - attemptOfflineMode(new LoginCredentials(userTextField.getTextField().getText(), passwordField.getText(), false, Startup.VERSION)); + attemptOfflineMode(new LoginCredentials(userTextField.getText(), passwordField.getText(), false, Startup.VERSION)); } @FXML diff --git a/client/src/main/resources/fxml/LoginScene.fxml b/client/src/main/resources/fxml/LoginScene.fxml index 1e915a2..04c144a 100644 --- a/client/src/main/resources/fxml/LoginScene.fxml +++ b/client/src/main/resources/fxml/LoginScene.fxml @@ -1,11 +1,11 @@ - + @@ -70,12 +70,12 @@ - - + From 88afb77a2c3453dda5f16997d7310eeea99f0d5e Mon Sep 17 00:00:00 2001 From: DieGurke <55625494+DieGurke@users.noreply.github.com> Date: Wed, 15 Jul 2020 18:45:55 +0200 Subject: [PATCH 02/33] Implemented completely new UI for the login scene --- .../client/ui/controller/LoginScene.java | 40 ++++- client/src/main/resources/css/base.css | 18 +- client/src/main/resources/css/dark.css | 8 + client/src/main/resources/css/light.css | 4 + .../src/main/resources/fxml/LoginScene.fxml | 156 +++++++----------- 5 files changed, 121 insertions(+), 105 deletions(-) diff --git a/client/src/main/java/envoy/client/ui/controller/LoginScene.java b/client/src/main/java/envoy/client/ui/controller/LoginScene.java index fe05578..4a18200 100644 --- a/client/src/main/java/envoy/client/ui/controller/LoginScene.java +++ b/client/src/main/java/envoy/client/ui/controller/LoginScene.java @@ -8,6 +8,7 @@ import java.util.logging.Logger; import javafx.application.Platform; import javafx.fxml.FXML; +import javafx.geometry.Insets; import javafx.scene.control.*; import javafx.scene.control.Alert.AlertType; @@ -46,19 +47,27 @@ public final class LoginScene { private PasswordField repeatPasswordField; @FXML - private Label repeatPasswordLabel; - - @FXML - private CheckBox registerCheckBox; + private Button registerSwitch; @FXML private Label connectionLabel; + @FXML + private Button loginButton; + + @FXML + private Button offlineModeButton; + + @FXML + private Label registerTextLabel; + private Client client; private LocalDB localDB; private CacheMap cacheMap; private SceneContext sceneContext; + private boolean registration = false; + private static final Logger logger = EnvoyLog.getLogger(LoginScene.class); private static final EventBus eventBus = EventBus.getInstance(); private static final ClientConfig config = ClientConfig.getInstance(); @@ -100,13 +109,13 @@ public final class LoginScene { private void loginButtonPressed() { // Prevent registration with unequal passwords - if (registerCheckBox.isSelected() && !passwordField.getText().equals(repeatPasswordField.getText())) { + if (registration && !passwordField.getText().equals(repeatPasswordField.getText())) { new Alert(AlertType.ERROR, "The entered password is unequal to the repeated one").showAndWait(); repeatPasswordField.clear(); } else if (!Bounds.isValidContactName(userTextField.getText())) { new Alert(AlertType.ERROR, "The entered user name is not valid (" + Bounds.CONTACT_NAME_PATTERN + ")").showAndWait(); userTextField.clear(); - } else performHandshake(new LoginCredentials(userTextField.getText(), passwordField.getText(), registerCheckBox.isSelected(), + } else performHandshake(new LoginCredentials(userTextField.getText(), passwordField.getText(), registration, Startup.VERSION)); } @@ -116,11 +125,24 @@ public final class LoginScene { } @FXML - private void registerCheckboxChanged() { + private void registerSwitchPressed() { + registration = !registration; // Make repeat password field and label visible / invisible - repeatPasswordField.setVisible(registerCheckBox.isSelected()); - repeatPasswordLabel.setVisible(registerCheckBox.isSelected()); + repeatPasswordField.setVisible(registration); + if (loginButton.getText().equals("Login")) { + loginButton.setText("Register"); + loginButton.setPadding(new Insets(2, 116, 2, 116)); + registerTextLabel.setText("Already an account?"); + registerSwitch.setText("Login"); + offlineModeButton.setDisable(true); + } else { + loginButton.setText("Login"); + loginButton.setPadding(new Insets(2, 125, 2, 125)); + registerTextLabel.setText("No account yet?"); + registerSwitch.setText("Register"); + offlineModeButton.setDisable(false); + } } @FXML diff --git a/client/src/main/resources/css/base.css b/client/src/main/resources/css/base.css index 78fff9e..013ef59 100644 --- a/client/src/main/resources/css/base.css +++ b/client/src/main/resources/css/base.css @@ -1,5 +1,5 @@ .button, .list-cell, .progress-bar * { - -fx-background-radius: 5.0em; + -fx-background-radius: 0.3em; } .context-menu, .context-menu > * { @@ -65,6 +65,22 @@ -fx-text-alignment: center; } +#loginButton { + -fx-background-radius: 1em; +} + +#registerSwitch { + -fx-background-color: transparent; + -fx-text-fill: orange; +} + +#loginInputField { + -fx-background-color: transparent; + -fx-border: solid; + -fx-border-width: 0 0 1 0; + +} + #remainingCharsLabel { -fx-text-fill: #00FF00; -fx-background-color: transparent; diff --git a/client/src/main/resources/css/dark.css b/client/src/main/resources/css/dark.css index eaad3a9..d97369e 100644 --- a/client/src/main/resources/css/dark.css +++ b/client/src/main/resources/css/dark.css @@ -37,3 +37,11 @@ .alert.information.dialog-pane, .alert.warning.dialog-pane, .alert.error.dialog-pane { -fx-background-color: black; } + +#loginInputField { + -fx-border-color: white; +} + +#loginBackground { + -fx-background-color: rgb(25, 25, 25); +} diff --git a/client/src/main/resources/css/light.css b/client/src/main/resources/css/light.css index 066de55..8486dcb 100644 --- a/client/src/main/resources/css/light.css +++ b/client/src/main/resources/css/light.css @@ -14,3 +14,7 @@ .own-message { -fx-background-color: lightgreen; } + +#loginInputField { + -fx-border-color: black; +} diff --git a/client/src/main/resources/fxml/LoginScene.fxml b/client/src/main/resources/fxml/LoginScene.fxml index 04c144a..5f0b872 100644 --- a/client/src/main/resources/fxml/LoginScene.fxml +++ b/client/src/main/resources/fxml/LoginScene.fxml @@ -2,93 +2,73 @@ - - + + + - + - From c963b9bdccf88e32da0420843c1047b2f93e4def Mon Sep 17 00:00:00 2001 From: delvh Date: Wed, 15 Jul 2020 21:44:57 +0200 Subject: [PATCH 03/33] Fixed bug not scrolling to the correct message --- .../src/main/java/envoy/client/ui/controller/ChatScene.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/main/java/envoy/client/ui/controller/ChatScene.java b/client/src/main/java/envoy/client/ui/controller/ChatScene.java index 920d93f..e5c1931 100644 --- a/client/src/main/java/envoy/client/ui/controller/ChatScene.java +++ b/client/src/main/java/envoy/client/ui/controller/ChatScene.java @@ -184,7 +184,7 @@ public final class ChatScene implements Restorable { switch (e.getOperationType()) { case ADD: localDB.getUsers().put(contact.getName(), contact); - Chat chat = contact instanceof User ? new Chat(contact) : new GroupChat(client.getSender(), contact); + final Chat chat = contact instanceof User ? new Chat(contact) : new GroupChat(client.getSender(), contact); Platform.runLater(() -> chatList.getItems().add(chat)); break; case REMOVE: @@ -240,7 +240,7 @@ public final class ChatScene implements Restorable { currentChat = localDB.getChat(user.getID()).get(); messageList.setItems(FXCollections.observableList(currentChat.getMessages())); - final var scrollIndex = messageList.getItems().size() - currentChat.getUnreadAmount() - 1; + final var scrollIndex = messageList.getItems().size() - currentChat.getUnreadAmount(); messageList.scrollTo(scrollIndex); logger.log(Level.FINEST, "Loading chat with " + user + " at index " + scrollIndex); deleteContactMenuItem.setText("Delete " + user.getName()); From c0676984e6d872e2e0884b240b7eb8eac300ecef Mon Sep 17 00:00:00 2001 From: delvh Date: Wed, 15 Jul 2020 21:48:06 +0200 Subject: [PATCH 04/33] Persisted really important statement forever in comment --- common/src/main/java/envoy/util/Bounds.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/src/main/java/envoy/util/Bounds.java b/common/src/main/java/envoy/util/Bounds.java index 315e047..7540b88 100644 --- a/common/src/main/java/envoy/util/Bounds.java +++ b/common/src/main/java/envoy/util/Bounds.java @@ -23,6 +23,8 @@ public class Bounds { */ public static final Pattern CONTACT_NAME_PATTERN = Pattern.compile("^\\w[a-zA-Z0-9-]{2,15}$"); + // KAI: Trust of Chain - das berühmte Konzept aus der Kryptographie + /** * @param contactName the contact name to validate * @return {@code true} if the given contact name is valid From bb6d6b19f768a8073bd7117fee1ca98292a09d4c Mon Sep 17 00:00:00 2001 From: DieGurke <55625494+DieGurke@users.noreply.github.com> Date: Thu, 16 Jul 2020 16:02:03 +0200 Subject: [PATCH 05/33] Login Scene is not resizable, logo gets loaded correctly --- client/src/main/java/envoy/client/ui/SceneContext.java | 2 ++ .../main/java/envoy/client/ui/controller/LoginScene.java | 7 +++++++ client/src/main/resources/fxml/LoginScene.fxml | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/client/src/main/java/envoy/client/ui/SceneContext.java b/client/src/main/java/envoy/client/ui/SceneContext.java index a027395..dff69be 100644 --- a/client/src/main/java/envoy/client/ui/SceneContext.java +++ b/client/src/main/java/envoy/client/ui/SceneContext.java @@ -125,6 +125,8 @@ public final class SceneContext { sceneStack.push(scene); stage.setScene(scene); + if (sceneInfo == SceneInfo.LOGIN_SCENE) stage.setResizable(false); + else stage.setResizable(true); applyCSS(); stage.sizeToScene(); stage.show(); diff --git a/client/src/main/java/envoy/client/ui/controller/LoginScene.java b/client/src/main/java/envoy/client/ui/controller/LoginScene.java index 4a18200..808212d 100644 --- a/client/src/main/java/envoy/client/ui/controller/LoginScene.java +++ b/client/src/main/java/envoy/client/ui/controller/LoginScene.java @@ -11,10 +11,12 @@ import javafx.fxml.FXML; import javafx.geometry.Insets; import javafx.scene.control.*; import javafx.scene.control.Alert.AlertType; +import javafx.scene.image.ImageView; import envoy.client.data.*; import envoy.client.net.Client; import envoy.client.net.WriteProxy; +import envoy.client.ui.IconUtil; import envoy.client.ui.SceneContext; import envoy.client.ui.Startup; import envoy.data.LoginCredentials; @@ -61,6 +63,9 @@ public final class LoginScene { @FXML private Label registerTextLabel; + @FXML + private ImageView logo; + private Client client; private LocalDB localDB; private CacheMap cacheMap; @@ -78,6 +83,8 @@ public final class LoginScene { // Show an alert after an unsuccessful handshake eventBus.register(HandshakeRejection.class, e -> Platform.runLater(() -> { new Alert(AlertType.ERROR, e.get()).showAndWait(); })); + + logo.setImage(IconUtil.loadIcon("envoy_logo")); } /** diff --git a/client/src/main/resources/fxml/LoginScene.fxml b/client/src/main/resources/fxml/LoginScene.fxml index 5f0b872..b4f475f 100644 --- a/client/src/main/resources/fxml/LoginScene.fxml +++ b/client/src/main/resources/fxml/LoginScene.fxml @@ -16,7 +16,7 @@ - + From 057f4688135359757eaf00c9ce94ad5914a8d791 Mon Sep 17 00:00:00 2001 From: DieGurke <55625494+DieGurke@users.noreply.github.com> Date: Thu, 16 Jul 2020 17:28:00 +0200 Subject: [PATCH 06/33] Relocated existing Components of chatScene and adjusted them a bit --- client/src/main/resources/fxml/ChatScene.fxml | 187 +++++++----------- 1 file changed, 66 insertions(+), 121 deletions(-) diff --git a/client/src/main/resources/fxml/ChatScene.fxml b/client/src/main/resources/fxml/ChatScene.fxml index 11c4c3e..86e2518 100644 --- a/client/src/main/resources/fxml/ChatScene.fxml +++ b/client/src/main/resources/fxml/ChatScene.fxml @@ -13,43 +13,24 @@ + - + - - - + + - - - - - - + + + + - + - + @@ -57,14 +38,12 @@ - + - + + + + + - + + + + + + + + + + + + + + From 6ea17acb213d54053c3d03095a960d8c5aa40f22 Mon Sep 17 00:00:00 2001 From: DieGurke <55625494+DieGurke@users.noreply.github.com> Date: Thu, 16 Jul 2020 21:52:07 +0200 Subject: [PATCH 10/33] Fixed some issues --- client/src/main/resources/fxml/ChatScene.fxml | 10 +++++----- client/src/main/resources/fxml/LoginScene.fxml | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/client/src/main/resources/fxml/ChatScene.fxml b/client/src/main/resources/fxml/ChatScene.fxml index 068927a..9cd5d1f 100644 --- a/client/src/main/resources/fxml/ChatScene.fxml +++ b/client/src/main/resources/fxml/ChatScene.fxml @@ -31,9 +31,9 @@ - + - + @@ -82,10 +82,10 @@ - + - + @@ -192,7 +192,7 @@ - From e72a410e0bc78ed324d2e9f2837c5747324b305c Mon Sep 17 00:00:00 2001 From: DieGurke <55625494+DieGurke@users.noreply.github.com> Date: Thu, 16 Jul 2020 22:10:04 +0200 Subject: [PATCH 11/33] Changed color of messageList background --- client/src/main/resources/css/dark.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/main/resources/css/dark.css b/client/src/main/resources/css/dark.css index 0db8841..1202fe4 100644 --- a/client/src/main/resources/css/dark.css +++ b/client/src/main/resources/css/dark.css @@ -19,7 +19,7 @@ } #messageList, .text-field, .password-field, .tooltip, .pane, .pane .content, .vbox, .titled-pane > .title, .titled-pane > *.content, .context-menu, .menu-item { - -fx-background-color: #262626; + -fx-background-color: #222222; } .list-cell:selected, .list-cell:selected > *, .menu-item:hover { From ef198f653b9e035b96256d87550f329b3ae39717 Mon Sep 17 00:00:00 2001 From: DieGurke <55625494+DieGurke@users.noreply.github.com> Date: Fri, 17 Jul 2020 13:56:36 +0200 Subject: [PATCH 12/33] Implemented ProfilePics UI mechanism --- .../envoy/client/ui/controller/ChatScene.java | 44 ++++++++++--- .../envoy/client/ui/listcell/ChatControl.java | 25 +++++++- client/src/main/resources/css/base.css | 4 ++ client/src/main/resources/fxml/ChatScene.fxml | 59 +++++++++++------- .../main/resources/icons/dark/group_icon.png | Bin 0 -> 52894 bytes .../main/resources/icons/dark/user_icon.png | Bin 0 -> 39602 bytes 6 files changed, 97 insertions(+), 35 deletions(-) create mode 100644 client/src/main/resources/icons/dark/group_icon.png create mode 100644 client/src/main/resources/icons/dark/user_icon.png diff --git a/client/src/main/java/envoy/client/ui/controller/ChatScene.java b/client/src/main/java/envoy/client/ui/controller/ChatScene.java index 469c39a..c57d736 100644 --- a/client/src/main/java/envoy/client/ui/controller/ChatScene.java +++ b/client/src/main/java/envoy/client/ui/controller/ChatScene.java @@ -23,6 +23,7 @@ import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.layout.GridPane; import javafx.scene.paint.Color; +import javafx.scene.shape.Rectangle; import javafx.stage.FileChooser; import javafx.util.Duration; @@ -103,6 +104,12 @@ public final class ChatScene implements Restorable { @FXML private Button messageSearchButton; + @FXML + private ImageView clientProfilePic; + + @FXML + private ImageView recipientProfilePic; + private LocalDB localDB; private Client client; private WriteProxy writeProxy; @@ -140,6 +147,13 @@ public final class ChatScene implements Restorable { attachmentView.setImage(DEFAULT_ATTACHMENT_VIEW_IMAGE); rotateButton.setGraphic(new ImageView(IconUtil.loadIconThemeSensitive("rotate", (int) (DEFAULT_ICON_SIZE * 1.5)))); messageSearchButton.setGraphic(new ImageView(IconUtil.loadIconThemeSensitive("search", DEFAULT_ICON_SIZE))); + clientProfilePic.setImage(IconUtil.loadIconThemeSensitive("user_icon", 43)); + Rectangle clip = new Rectangle(); + clip.setWidth(43); + clip.setHeight(43); + clip.setArcHeight(43); + clip.setArcWidth(43); + clientProfilePic.setClip(clip); // Listen to received messages eventBus.register(MessageCreationEvent.class, e -> { @@ -278,16 +292,26 @@ public final class ChatScene implements Restorable { attachmentButton.setDisable(false); chatList.refresh(); - topBarContactLabel.setText(currentChat.getRecipient().getName()); - if (currentChat.getRecipient() instanceof User) { - String status = ((User) currentChat.getRecipient()).getStatus().toString(); - topBarStatusLabel.setText(status); - topBarStatusLabel.getStyleClass().add(status.toLowerCase()); - } - else topBarStatusLabel.setText(currentChat.getRecipient().getContacts().size() + " members"); - - if (currentChat != null) - messageSearchButton.setVisible(true); + if (currentChat != null) { + topBarContactLabel.setText(currentChat.getRecipient().getName()); + if (currentChat.getRecipient() instanceof User) { + String status = ((User) currentChat.getRecipient()).getStatus().toString(); + topBarStatusLabel.setText(status); + topBarStatusLabel.getStyleClass().add(status.toLowerCase()); + recipientProfilePic.setImage(IconUtil.loadIconThemeSensitive("user_icon", 43)); + } else { + topBarStatusLabel.setText(currentChat.getRecipient().getContacts().size() + " members"); + recipientProfilePic.setImage(IconUtil.loadIconThemeSensitive("group_icon", 43)); + } + Rectangle clip = new Rectangle(); + clip.setWidth(43); + clip.setHeight(43); + clip.setArcHeight(43); + clip.setArcWidth(43); + recipientProfilePic.setClip(clip); + + messageSearchButton.setVisible(true); + } } /** diff --git a/client/src/main/java/envoy/client/ui/listcell/ChatControl.java b/client/src/main/java/envoy/client/ui/listcell/ChatControl.java index a0bd640..39086ca 100644 --- a/client/src/main/java/envoy/client/ui/listcell/ChatControl.java +++ b/client/src/main/java/envoy/client/ui/listcell/ChatControl.java @@ -1,10 +1,15 @@ package envoy.client.ui.listcell; +import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.Label; +import javafx.scene.image.ImageView; import javafx.scene.layout.*; +import javafx.scene.shape.Rectangle; import envoy.client.data.Chat; +import envoy.client.ui.IconUtil; +import envoy.data.Group; /** * Displays a chat using a contact control for the recipient and a label for the @@ -25,7 +30,25 @@ public class ChatControl extends HBox { * @since Envoy Client v0.1-beta */ public ChatControl(Chat chat) { - + setAlignment(Pos.CENTER_LEFT); + setPadding(new Insets(0, 0, 3, 0)); + // profile pic + ImageView contactProfilePic; + if (chat.getRecipient() instanceof Group) contactProfilePic = new ImageView(IconUtil.loadIconThemeSensitive("group_icon", 32)); + else contactProfilePic = new ImageView(IconUtil.loadIconThemeSensitive("user_icon", 32)); + Rectangle clip = new Rectangle(); + clip.setWidth(32); + clip.setHeight(32); + clip.setArcHeight(32); + clip.setArcWidth(32); + contactProfilePic.setClip(clip); + getChildren().add(contactProfilePic); + // spacing + Region leftSpacing = new Region(); + leftSpacing.setPrefSize(8, 0); + leftSpacing.setMinSize(8, 0); + leftSpacing.setMaxSize(8, 0); + getChildren().add(leftSpacing); // Contact control getChildren().add(new ContactControl(chat.getRecipient())); // Unread messages diff --git a/client/src/main/resources/css/base.css b/client/src/main/resources/css/base.css index cbfd244..3549824 100644 --- a/client/src/main/resources/css/base.css +++ b/client/src/main/resources/css/base.css @@ -127,3 +127,7 @@ #transparentBackground { -fx-background-color: transparent; } + +#profilePic { + -fx-radius: 1em; +} diff --git a/client/src/main/resources/fxml/ChatScene.fxml b/client/src/main/resources/fxml/ChatScene.fxml index 9cd5d1f..8541cc2 100644 --- a/client/src/main/resources/fxml/ChatScene.fxml +++ b/client/src/main/resources/fxml/ChatScene.fxml @@ -48,6 +48,11 @@ + + + + + @@ -143,31 +151,29 @@ - + - - + + + + + + @@ -178,6 +184,11 @@ + + + + + - + diff --git a/client/src/main/resources/icons/dark/group_icon.png b/client/src/main/resources/icons/dark/group_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5b1660e5028b2fb29f6f60c31478dbdfab3cfaff GIT binary patch literal 52894 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 W)N-v8=nrRNI!zW;<~r6*tPBhc>$J5F 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 NKWBB$WSzbi_&=T!Pg4K@ literal 0 HcmV?d00001 From b1fbad059ea6190ede5924fc84f3ed575e77bc2b Mon Sep 17 00:00:00 2001 From: DieGurke <55625494+DieGurke@users.noreply.github.com> Date: Fri, 17 Jul 2020 17:02:58 +0200 Subject: [PATCH 13/33] Fixed scaling problems (especially on lower res displays) Still a problem with max width of column 1 and max size of stage due to sizeToScene property on the stage --- .../envoy/client/ui/controller/ChatScene.java | 1 - client/src/main/resources/fxml/ChatScene.fxml | 36 ++++++++++--------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/client/src/main/java/envoy/client/ui/controller/ChatScene.java b/client/src/main/java/envoy/client/ui/controller/ChatScene.java index c57d736..99de9d4 100644 --- a/client/src/main/java/envoy/client/ui/controller/ChatScene.java +++ b/client/src/main/java/envoy/client/ui/controller/ChatScene.java @@ -136,7 +136,6 @@ public final class ChatScene implements Restorable { */ @FXML private void initialize() { - // Initialize message and user rendering messageList.setCellFactory(new ListCellFactory<>(MessageControl::new)); chatList.setCellFactory(new ListCellFactory<>(ChatControl::new)); diff --git a/client/src/main/resources/fxml/ChatScene.fxml b/client/src/main/resources/fxml/ChatScene.fxml index 8541cc2..5f6d226 100644 --- a/client/src/main/resources/fxml/ChatScene.fxml +++ b/client/src/main/resources/fxml/ChatScene.fxml @@ -3,7 +3,6 @@ - @@ -19,16 +18,16 @@ - + - - + + - + @@ -101,11 +100,11 @@ - + - + + + + - + From 5183d3dfa60aac77ff1c0a439e498ffb2dc49b69 Mon Sep 17 00:00:00 2001 From: CyB3RC0nN0R Date: Sat, 18 Jul 2020 11:50:49 +0200 Subject: [PATCH 14/33] Reworked list cell framework to be more extensible --- .../envoy/client/ui/controller/ChatScene.java | 6 +- .../client/ui/listcell/AbstractListCell.java | 48 +++ .../client/ui/listcell/GenericListCell.java | 36 ++ .../client/ui/listcell/ListCellFactory.java | 34 +- .../client/ui/listcell/MessageListCell.java | 31 ++ client/src/main/resources/css/base.css | 18 +- client/src/main/resources/css/dark.css | 4 - client/src/main/resources/fxml/ChatScene.fxml | 388 ++++++++++-------- 8 files changed, 361 insertions(+), 204 deletions(-) create mode 100644 client/src/main/java/envoy/client/ui/listcell/AbstractListCell.java create mode 100644 client/src/main/java/envoy/client/ui/listcell/GenericListCell.java create mode 100644 client/src/main/java/envoy/client/ui/listcell/MessageListCell.java diff --git a/client/src/main/java/envoy/client/ui/controller/ChatScene.java b/client/src/main/java/envoy/client/ui/controller/ChatScene.java index 385fd3f..afc56a8 100644 --- a/client/src/main/java/envoy/client/ui/controller/ChatScene.java +++ b/client/src/main/java/envoy/client/ui/controller/ChatScene.java @@ -35,9 +35,7 @@ import envoy.client.event.MessageCreationEvent; import envoy.client.net.Client; import envoy.client.net.WriteProxy; import envoy.client.ui.*; -import envoy.client.ui.listcell.ChatControl; -import envoy.client.ui.listcell.ListCellFactory; -import envoy.client.ui.listcell.MessageControl; +import envoy.client.ui.listcell.*; import envoy.data.*; import envoy.data.Attachment.AttachmentType; import envoy.event.*; @@ -139,7 +137,7 @@ public final class ChatScene implements Restorable { @FXML private void initialize() { // Initialize message and user rendering - messageList.setCellFactory(new ListCellFactory<>(MessageControl::new)); + messageList.setCellFactory(MessageListCell::new); chatList.setCellFactory(new ListCellFactory<>(ChatControl::new)); settingsButton.setGraphic(new ImageView(IconUtil.loadIconThemeSensitive("settings", DEFAULT_ICON_SIZE))); diff --git a/client/src/main/java/envoy/client/ui/listcell/AbstractListCell.java b/client/src/main/java/envoy/client/ui/listcell/AbstractListCell.java new file mode 100644 index 0000000..e294b15 --- /dev/null +++ b/client/src/main/java/envoy/client/ui/listcell/AbstractListCell.java @@ -0,0 +1,48 @@ +package envoy.client.ui.listcell; + +import javafx.scene.Node; +import javafx.scene.control.ContentDisplay; +import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; + +/** + * Provides a convenience frame for list cell creation. + *

+ * Project: envoy-client
+ * File: AbstractListCell.java
+ * Created: 18.07.2020
+ * + * @author Kai S. K. Engelbart + * @param the type of element displayed by the list cell + * @param the type of node as which the list element will be displayed + * @since Envoy Client v0.1-beta + */ +public abstract class AbstractListCell extends ListCell { + + protected ListView listView; + + /** + * @param listView the list view inside of which the cell will be displayed + * @since Envoy Client v0.1-beta + */ + public AbstractListCell(ListView listView) { + this.listView = listView; + setContentDisplay(ContentDisplay.GRAPHIC_ONLY); + getStyleClass().add("listElement"); + } + + @Override + protected final void updateItem(T item, boolean empty) { + super.updateItem(item, empty); + setGraphic(empty || item == null ? null : renderItem(item)); + } + + /** + * Converts a list item to a node. This can have side effects on the list cell. + * + * @param item the item to render + * @return a node representing the item + * @since Envoy Client v0.1-beta + */ + protected abstract U renderItem(T item); +} diff --git a/client/src/main/java/envoy/client/ui/listcell/GenericListCell.java b/client/src/main/java/envoy/client/ui/listcell/GenericListCell.java new file mode 100644 index 0000000..ad2b364 --- /dev/null +++ b/client/src/main/java/envoy/client/ui/listcell/GenericListCell.java @@ -0,0 +1,36 @@ +package envoy.client.ui.listcell; + +import java.util.function.Function; + +import javafx.scene.Node; +import javafx.scene.control.ListView; + +/** + * A generic list cell rendering an item using a provided render function. + *

+ * Project: envoy-client
+ * File: GenericListCell.java
+ * Created: 18.07.2020
+ * + * @author Kai S. K. Engelbart + * @param the type of element displayed by the list cell + * @param the type of node as which the list element will be displayed + * @since Envoy Client v0.2-beta + */ +public final class GenericListCell extends AbstractListCell { + + private Function renderer; + + /** + * @param listView the list view inside of which the cell will be displayed + * @param renderer a function converting a list item to a node + * @since Envoy Client v0.1-beta + */ + public GenericListCell(ListView listView, Function renderer) { + super(listView); + this.renderer = renderer; + } + + @Override + protected U renderItem(T item) { return renderer.apply(item); } +} diff --git a/client/src/main/java/envoy/client/ui/listcell/ListCellFactory.java b/client/src/main/java/envoy/client/ui/listcell/ListCellFactory.java index db7483f..018a0ba 100644 --- a/client/src/main/java/envoy/client/ui/listcell/ListCellFactory.java +++ b/client/src/main/java/envoy/client/ui/listcell/ListCellFactory.java @@ -17,41 +17,19 @@ import javafx.util.Callback; * * @author Kai S. K. Engelbart * @param the type of object to display + * @param the type of node displayed * @since Envoy Client v0.1-beta */ -public final class ListCellFactory implements Callback, ListCell> { +public final class ListCellFactory implements Callback, ListCell> { - private final class GenericListCell extends ListCell { - - private ListView listView; - - private GenericListCell(ListView listView) { - this.listView = listView; - getStyleClass().add("listElement"); - } - - @Override - protected void updateItem(T item, boolean empty) { - super.updateItem(item, empty); - if (empty || item == null) { - setText(null); - setGraphic(null); - } else { - final var control = converter.apply(item); - prefWidthProperty().bind(listView.widthProperty().subtract(40)); - setGraphic(control); - } - } - } - - private final Function converter; + private final Function renderer; /** - * @param converter a function converting the type to display into a node + * @param renderer a function converting the type to display into a node * @since Envoy Client v0.1-beta */ - public ListCellFactory(Function converter) { this.converter = converter; } + public ListCellFactory(Function renderer) { this.renderer = renderer; } @Override - public ListCell call(ListView listView) { return new GenericListCell(listView); } + public ListCell call(ListView listView) { return new GenericListCell<>(listView, renderer); } } diff --git a/client/src/main/java/envoy/client/ui/listcell/MessageListCell.java b/client/src/main/java/envoy/client/ui/listcell/MessageListCell.java new file mode 100644 index 0000000..71c2ae2 --- /dev/null +++ b/client/src/main/java/envoy/client/ui/listcell/MessageListCell.java @@ -0,0 +1,31 @@ +package envoy.client.ui.listcell; + +import javafx.scene.control.ListView; + +import envoy.data.Message; + +/** + * A list cell containing messages represented as message controls. + *

+ * Project: envoy-client
+ * File: MessageListCell.java
+ * Created: 18.07.2020
+ * + * @author Kai S. K. Engelbart + * @since Envoy Client v0.1-beta + */ +public final class MessageListCell extends AbstractListCell { + + /** + * @param listView the list view inside of which the cell will be displayed + * @since Envoy Client v0.1-beta + */ + public MessageListCell(ListView listView) { super(listView); } + + @Override + protected MessageControl renderItem(Message message) { + final var control = new MessageControl(message); + prefWidthProperty().bind(listView.widthProperty().multiply(0.6)); + return control; + } +} diff --git a/client/src/main/resources/css/base.css b/client/src/main/resources/css/base.css index 3549824..66e9f8b 100644 --- a/client/src/main/resources/css/base.css +++ b/client/src/main/resources/css/base.css @@ -9,11 +9,11 @@ } #messageEnterContainer { - -fx-background-radius: 5em; + -fx-background-radius: 5.0em; } #roundButton { - -fx-background-radius: 5em; + -fx-background-radius: 5.0em; } .text-area { @@ -88,7 +88,7 @@ } #loginButton { - -fx-background-radius: 1em; + -fx-background-radius: 1.0em; } #registerSwitch { @@ -99,7 +99,7 @@ #loginInputField { -fx-background-color: transparent; -fx-border: solid; - -fx-border-width: 0 0 1 0; + -fx-border-width: 0.0 0.0 1.0 0.0; } @@ -129,5 +129,13 @@ } #profilePic { - -fx-radius: 1em; + -fx-radius: 1.0em; } + +.listElement { + -fx-background-color: transparent; +} + +.listElement { + -fx-background-color: transparent; +} \ No newline at end of file diff --git a/client/src/main/resources/css/dark.css b/client/src/main/resources/css/dark.css index 1202fe4..21beed5 100644 --- a/client/src/main/resources/css/dark.css +++ b/client/src/main/resources/css/dark.css @@ -50,10 +50,6 @@ -fx-background-color: #303030; } -.listElement { - -fx-background-color: transparent; -} - #messageEnterContainer { -fx-background-color: #363636; } diff --git a/client/src/main/resources/fxml/ChatScene.fxml b/client/src/main/resources/fxml/ChatScene.fxml index 5f6d226..0fc9428 100644 --- a/client/src/main/resources/fxml/ChatScene.fxml +++ b/client/src/main/resources/fxml/ChatScene.fxml @@ -18,19 +18,33 @@ - + - - + + - - - - + + + + - + @@ -40,143 +54,184 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -184,33 +239,40 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + From 2db5e4e85bcdd6771654fd305a0c08e43d76bb80 Mon Sep 17 00:00:00 2001 From: DieGurke <55625494+DieGurke@users.noreply.github.com> Date: Sat, 18 Jul 2020 14:41:25 +0200 Subject: [PATCH 15/33] Fixed resize problems and some other stuff --- .../client/ui/controller/LoginScene.java | 2 +- .../client/ui/listcell/MessageControl.java | 9 +- .../client/ui/listcell/MessageListCell.java | 6 +- client/src/main/resources/css/base.css | 4 - client/src/main/resources/fxml/ChatScene.fxml | 137 +++++------------- .../icons/dark/.user_icon.png-autosave.kra | Bin 0 -> 216069 bytes .../main/resources/icons/dark/user_icon.png | Bin 39602 -> 39949 bytes 7 files changed, 52 insertions(+), 106 deletions(-) create mode 100644 client/src/main/resources/icons/dark/.user_icon.png-autosave.kra diff --git a/client/src/main/java/envoy/client/ui/controller/LoginScene.java b/client/src/main/java/envoy/client/ui/controller/LoginScene.java index 9a894b4..6140223 100644 --- a/client/src/main/java/envoy/client/ui/controller/LoginScene.java +++ b/client/src/main/java/envoy/client/ui/controller/LoginScene.java @@ -235,7 +235,7 @@ public final class LoginScene { // Load ChatScene sceneContext.pop(); sceneContext.getStage().setMinHeight(400); - sceneContext.getStage().setMinWidth(350); + sceneContext.getStage().setMinWidth(843); sceneContext.load(SceneContext.SceneInfo.CHAT_SCENE); sceneContext.getController().initializeData(sceneContext, localDB, client, writeProxy); } diff --git a/client/src/main/java/envoy/client/ui/listcell/MessageControl.java b/client/src/main/java/envoy/client/ui/listcell/MessageControl.java index a6ecae5..d2a70f8 100644 --- a/client/src/main/java/envoy/client/ui/listcell/MessageControl.java +++ b/client/src/main/java/envoy/client/ui/listcell/MessageControl.java @@ -37,6 +37,7 @@ import envoy.util.EnvoyLog; public class MessageControl extends Label { private static User client; + private boolean ownMessage; private static final DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss") .withZone(ZoneId.systemDefault()); @@ -95,7 +96,11 @@ public class MessageControl extends Label { statusIcon.setPreserveRatio(true); vbox.getChildren().add(statusIcon); getStyleClass().add("own-message"); - } else getStyleClass().add("received-message"); + ownMessage = true; + } else { + getStyleClass().add("received-message"); + ownMessage = false; + } // Adjusting height and weight of the cell to the corresponding ListView paddingProperty().setValue(new Insets(5, 20, 5, 20)); setContextMenu(contextMenu); @@ -123,4 +128,6 @@ public class MessageControl extends Label { * @since Envoy Client v0.1-beta */ public static void setUser(User client) { MessageControl.client = client; } + + public boolean isOwnMessage() { return ownMessage; } } diff --git a/client/src/main/java/envoy/client/ui/listcell/MessageListCell.java b/client/src/main/java/envoy/client/ui/listcell/MessageListCell.java index 71c2ae2..44c51bb 100644 --- a/client/src/main/java/envoy/client/ui/listcell/MessageListCell.java +++ b/client/src/main/java/envoy/client/ui/listcell/MessageListCell.java @@ -1,5 +1,6 @@ package envoy.client.ui.listcell; +import javafx.geometry.Pos; import javafx.scene.control.ListView; import envoy.data.Message; @@ -15,7 +16,6 @@ import envoy.data.Message; * @since Envoy Client v0.1-beta */ public final class MessageListCell extends AbstractListCell { - /** * @param listView the list view inside of which the cell will be displayed * @since Envoy Client v0.1-beta @@ -25,7 +25,9 @@ public final class MessageListCell extends AbstractListCell - + - - + + - - - - + + + + - + @@ -54,23 +40,19 @@ - + - + - @@ -90,11 +119,6 @@ - @@ -118,7 +142,7 @@ -