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 eae592a..d2b2184 100644 --- a/client/src/main/java/envoy/client/ui/controller/ChatScene.java +++ b/client/src/main/java/envoy/client/ui/controller/ChatScene.java @@ -4,32 +4,23 @@ import static envoy.data.Message.MessageStatus.RECEIVED; import java.awt.Toolkit; import java.awt.datatransfer.StringSelection; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.nio.file.Files; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Random; -import java.util.logging.Level; -import java.util.logging.Logger; +import java.util.logging.*; import javafx.animation.RotateTransition; import javafx.application.Platform; -import javafx.collections.FXCollections; -import javafx.collections.ObservableList; +import javafx.collections.*; import javafx.collections.transformation.FilteredList; -import javafx.fxml.FXML; -import javafx.fxml.FXMLLoader; +import javafx.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; -import javafx.scene.layout.GridPane; -import javafx.scene.layout.HBox; -import javafx.scene.layout.VBox; +import javafx.scene.image.*; +import javafx.scene.input.*; +import javafx.scene.layout.*; import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; import javafx.stage.FileChooser; @@ -37,17 +28,11 @@ import javafx.util.Duration; import envoy.client.data.*; import envoy.client.data.audio.AudioRecorder; -import envoy.client.data.commands.SystemCommandBuilder; -import envoy.client.data.commands.SystemCommandsMap; -import envoy.client.event.BackEvent; -import envoy.client.event.MessageCreationEvent; -import envoy.client.event.SendEvent; -import envoy.client.net.Client; -import envoy.client.net.WriteProxy; +import envoy.client.data.commands.*; +import envoy.client.event.*; +import envoy.client.net.*; import envoy.client.ui.*; -import envoy.client.ui.listcell.ChatControl; -import envoy.client.ui.listcell.ListCellFactory; -import envoy.client.ui.listcell.MessageListCell; +import envoy.client.ui.listcell.*; import envoy.client.util.ReflectionUtil; import envoy.data.*; import envoy.data.Attachment.AttachmentType; @@ -144,6 +129,13 @@ public final class ChatScene implements Restorable { @FXML private HBox contactSpecificOnlineOperations; + private Chat currentChat; + private FilteredList chats; + private boolean recording; + private Attachment pendingAttachment; + private boolean postingPermanentlyDisabled; + private boolean isCustomAttachmentImage; + private final LocalDB localDB = context.getLocalDB(); private final Client client = context.getClient(); private final WriteProxy writeProxy = context.getWriteProxy(); @@ -152,20 +144,14 @@ public final class ChatScene implements Restorable { private final SystemCommandsMap messageTextAreaCommands = new SystemCommandsMap(); private final Tooltip onlyIfOnlineTooltip = new Tooltip("You need to be online to do this"); - private Chat currentChat; - private FilteredList chats; - private boolean recording; - private Attachment pendingAttachment; - private boolean postingPermanentlyDisabled; + private static Image DEFAULT_ATTACHMENT_VIEW_IMAGE = IconUtil.loadIconThemeSensitive("attachment_present", 20); - 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 Context context = Context.getInstance(); - - 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; + 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 Context context = Context.getInstance(); + private static final int MAX_MESSAGE_LENGTH = 255; + private static final int DEFAULT_ICON_SIZE = 16; /** * Initializes the appearance of certain visual components. @@ -303,6 +289,20 @@ public final class ChatScene implements Restorable { }); eventBus.register(GroupCreationResult.class, e -> Platform.runLater(() -> { newGroupButton.setDisable(!e.get()); })); + + eventBus.register(ThemeChangeEvent.class, e -> { + 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))); + DEFAULT_ATTACHMENT_VIEW_IMAGE = IconUtil.loadIconThemeSensitive("attachment_present", 20); + attachmentView.setImage(isCustomAttachmentImage ? attachmentView.getImage() : DEFAULT_ATTACHMENT_VIEW_IMAGE); + messageSearchButton.setGraphic(new ImageView(IconUtil.loadIconThemeSensitive("search", DEFAULT_ICON_SIZE))); + clientProfilePic.setImage(IconUtil.loadIconThemeSensitive("user_icon", 43)); + chatList.setCellFactory(new ListCellFactory<>(ChatControl::new)); + messageList.setCellFactory(MessageListCell::new); + if (currentChat.getRecipient() instanceof User) recipientProfilePic.setImage(IconUtil.loadIconThemeSensitive("user_icon", 43)); + else recipientProfilePic.setImage(IconUtil.loadIconThemeSensitive("group_icon", 43)); + }); } /** @@ -480,8 +480,10 @@ public final class ChatScene implements Restorable { pendingAttachment = new Attachment(fileBytes, file.getName(), type); checkPostConditions(false); // Setting the preview image as image of the attachmentView - if (type == AttachmentType.PICTURE) + if (type == AttachmentType.PICTURE) { attachmentView.setImage(new Image(new ByteArrayInputStream(fileBytes), DEFAULT_ICON_SIZE, DEFAULT_ICON_SIZE, true, true)); + isCustomAttachmentImage = true; + } attachmentView.setVisible(true); } catch (final IOException e) { new Alert(AlertType.ERROR, "The selected file could not be loaded!").showAndWait(); @@ -662,6 +664,7 @@ public final class ChatScene implements Restorable { messageTextArea.setText(""); postButton.setDisable(true); updateRemainingCharsLabel(); + isCustomAttachmentImage = false; } /**