From 16f8d73a7c44067e23e88268fa49657a6bd546bf Mon Sep 17 00:00:00 2001 From: delvh Date: Fri, 10 Jul 2020 20:53:28 +0200 Subject: [PATCH] Added image preview when an image is used as attachment additionally: - added search icons - solved problem of Scrollbars being shown too far from the right side (all praise FX, Swing did not offer such a simple solution) - relocated infoLabel into the highest row, is now located above the messageList --- .../envoy/client/ui/controller/ChatScene.java | 42 +++++++++++++----- src/main/resources/fxml/ChatScene.fxml | 17 ++++--- src/main/resources/icons/dark/search.png | Bin 0 -> 10426 bytes src/main/resources/icons/light/search.png | Bin 0 -> 8548 bytes 4 files changed, 42 insertions(+), 17 deletions(-) create mode 100644 src/main/resources/icons/dark/search.png create mode 100644 src/main/resources/icons/light/search.png diff --git a/src/main/java/envoy/client/ui/controller/ChatScene.java b/src/main/java/envoy/client/ui/controller/ChatScene.java index 2c2b5eb..a8598e1 100644 --- a/src/main/java/envoy/client/ui/controller/ChatScene.java +++ b/src/main/java/envoy/client/ui/controller/ChatScene.java @@ -2,6 +2,7 @@ package envoy.client.ui.controller; import java.awt.Toolkit; import java.awt.datatransfer.StringSelection; +import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -14,6 +15,7 @@ import javafx.collections.FXCollections; import javafx.fxml.FXML; import javafx.scene.control.*; import javafx.scene.control.Alert.AlertType; +import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; @@ -95,11 +97,13 @@ public final class ChatScene implements Restorable { private Attachment pendingAttachment; private boolean postingPermanentlyDisabled; - private static final Settings settings = Settings.getInstance(); - private static final EventBus eventBus = EventBus.getInstance(); - private static final Logger logger = EnvoyLog.getLogger(ChatScene.class); - private static final int MAX_MESSAGE_LENGTH = 255; - private static final int DEFAULT_ICON_SIZE = 16; + private static final Settings settings = Settings.getInstance(); + private static final EventBus eventBus = EventBus.getInstance(); + private static final Logger logger = EnvoyLog.getLogger(ChatScene.class); + + private static final Image DEFAULT_ATTACHMENT_VIEW_IMAGE = IconUtil.loadIconThemeSensitive("attachment_present", 20); + private static final int MAX_MESSAGE_LENGTH = 255; + private static final int DEFAULT_ICON_SIZE = 16; /** * Initializes the appearance of certain visual components. @@ -116,7 +120,7 @@ public final class ChatScene implements Restorable { settingsButton.setGraphic(new ImageView(IconUtil.loadIconThemeSensitive("settings", DEFAULT_ICON_SIZE))); voiceButton.setGraphic(new ImageView(IconUtil.loadIconThemeSensitive("microphone", DEFAULT_ICON_SIZE))); attachmentButton.setGraphic(new ImageView(IconUtil.loadIconThemeSensitive("attachment", DEFAULT_ICON_SIZE))); - attachmentView.setImage(IconUtil.loadIconThemeSensitive("attachment_present", 20)); + attachmentView.setImage(DEFAULT_ATTACHMENT_VIEW_IMAGE); // Listen to received messages eventBus.register(MessageCreationEvent.class, e -> { @@ -235,7 +239,7 @@ public final class ChatScene implements Restorable { recording = false; } pendingAttachment = null; - attachmentView.setVisible(false); + updateAttachmentView(false); remainingChars.setVisible(true); remainingChars @@ -286,7 +290,7 @@ public final class ChatScene implements Restorable { voiceButton.setGraphic(new ImageView(IconUtil.loadIconThemeSensitive("microphone", DEFAULT_ICON_SIZE))); voiceButton.setText(null); checkPostConditions(false); - attachmentView.setVisible(true); + updateAttachmentView(true); }); } } catch (final EnvoyException e) { @@ -330,7 +334,11 @@ public final class ChatScene implements Restorable { // Create the pending attachment try { - pendingAttachment = new Attachment(Files.readAllBytes(file.toPath()), type); + final var fileBytes = Files.readAllBytes(file.toPath()); + pendingAttachment = new Attachment(fileBytes, type); + // Setting the preview image as image of the attachmentView + if (type == AttachmentType.PICTURE) + attachmentView.setImage(new Image(new ByteArrayInputStream(fileBytes), DEFAULT_ICON_SIZE, DEFAULT_ICON_SIZE, true, true)); attachmentView.setVisible(true); } catch (final IOException e) { new Alert(AlertType.ERROR, "The selected file could not be loaded!").showAndWait(); @@ -430,7 +438,7 @@ public final class ChatScene implements Restorable { if (pendingAttachment != null) { builder.setAttachment(pendingAttachment); pendingAttachment = null; - attachmentView.setVisible(false); + updateAttachmentView(false); } // Building the final message final var message = currentChat.getRecipient() instanceof Group ? builder.buildGroupMessage((Group) currentChat.getRecipient()) @@ -479,6 +487,20 @@ public final class ChatScene implements Restorable { infoLabel.setVisible(true); } + /** + * Updates he {@code attachmentView} in terms of visibility.
+ * Additionally resets the shown image to + * {@code DEFAULT_ATTACHMENT_VIEW_IMAGE} if another image is currently + * present. + * + * @param visible whether the {@code attachmentView} should be displayed + * @since Envoy Client v0.1-beta + */ + private void updateAttachmentView(boolean visible) { + if (!attachmentView.getImage().equals(DEFAULT_ATTACHMENT_VIEW_IMAGE)) attachmentView.setImage(DEFAULT_ATTACHMENT_VIEW_IMAGE); + attachmentView.setVisible(visible); + } + // Context menu actions @FXML diff --git a/src/main/resources/fxml/ChatScene.fxml b/src/main/resources/fxml/ChatScene.fxml index 7918c4a..fd48b75 100644 --- a/src/main/resources/fxml/ChatScene.fxml +++ b/src/main/resources/fxml/ChatScene.fxml @@ -51,7 +51,7 @@ - + @@ -82,18 +82,17 @@ - - + - @@ -101,7 +100,11 @@