diff --git a/client/src/main/java/envoy/client/ui/settings/UserSettingsPane.java b/client/src/main/java/envoy/client/ui/settings/UserSettingsPane.java
index 993b6bf..2ea37f4 100644
--- a/client/src/main/java/envoy/client/ui/settings/UserSettingsPane.java
+++ b/client/src/main/java/envoy/client/ui/settings/UserSettingsPane.java
@@ -1,13 +1,23 @@
package envoy.client.ui.settings;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+
import javafx.event.EventHandler;
+import javafx.scene.Cursor;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.TextField;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
import javafx.scene.input.InputEvent;
import javafx.scene.layout.HBox;
+import javafx.stage.FileChooser;
import envoy.client.event.SendEvent;
+import envoy.client.ui.IconUtil;
import envoy.client.ui.SceneContext;
import envoy.data.User;
import envoy.event.*;
@@ -35,8 +45,40 @@ public class UserSettingsPane extends SettingsPane {
* @since Envoy Client v0.2-beta
*/
public UserSettingsPane(SceneContext sceneContext, User user) {
- super("User"); // Display of profile picture change mechanism
+ super("User");
+
+ // Display of profile pic change mechanism
final var hbox = new HBox();
+ // TODO: display current profile pic
+ final var profilePic = new ImageView(IconUtil.loadIcon("envoy_logo", 50));
+ profilePic.setCursor(Cursor.HAND);
+ profilePic.setOnMouseClicked(e -> {
+ final var pictureChooser = new FileChooser();
+
+ pictureChooser.setTitle("Select a new picture");
+ pictureChooser.setInitialDirectory(new File(System.getProperty("user.home")));
+ pictureChooser.setSelectedExtensionFilter(new FileChooser.ExtensionFilter("Pictures", "*.png", "*.jpg", "*.bmp", "*.gif"));
+
+ final var file = pictureChooser.showOpenDialog(sceneContext.getStage());
+
+ if (file != null) {
+
+ // Check max file size
+ if (file.length() > 5E6) {
+ new Alert(AlertType.WARNING, "The selected file exceeds the size limit of 5MB!").showAndWait();
+ return;
+ }
+
+ try {
+ currentImageBytes = Files.readAllBytes(file.toPath());
+ profilePic.setImage(new Image(new ByteArrayInputStream(currentImageBytes)));
+ profilePicChanged = true;
+ } catch (final IOException e1) {
+ e1.printStackTrace();
+ }
+ }
+ });
+ hbox.getChildren().add(profilePic);
// Displaying the username change mechanism
final var username = user.getName();
diff --git a/common/src/main/java/envoy/event/ProfilePicChange.java b/common/src/main/java/envoy/event/ProfilePicChange.java
new file mode 100644
index 0000000..52c5941
--- /dev/null
+++ b/common/src/main/java/envoy/event/ProfilePicChange.java
@@ -0,0 +1,33 @@
+package envoy.event;
+
+/**
+ * Project: envoy-common
+ * File: ProfilePicChange.java
+ * Created: 31.07.2020
+ *
+ * @author Leon Hofmeister
+ * @since Envoy Common v0.2-beta
+ */
+public class ProfilePicChange extends Event {
+
+ private final long id;
+
+ private static final long serialVersionUID = 0L;
+
+ /**
+ * @param value the byte[] of the new image
+ * @param userID the ID of the user who changed his profile pic
+ * @since Envoy Common v0.2-beta
+ */
+ public ProfilePicChange(byte[] value, long userID) {
+ super(value);
+ id = userID;
+ }
+
+ /**
+ * @return the id
+ * @since Envoy Common v0.2-beta
+ */
+ public long getId() { return id; }
+
+}
diff --git a/server/src/main/java/envoy/server/processors/ProfilePicChangeProcessor.java b/server/src/main/java/envoy/server/processors/ProfilePicChangeProcessor.java
new file mode 100644
index 0000000..10069a8
--- /dev/null
+++ b/server/src/main/java/envoy/server/processors/ProfilePicChangeProcessor.java
@@ -0,0 +1,20 @@
+package envoy.server.processors;
+
+import java.io.IOException;
+
+import envoy.event.ProfilePicChange;
+import envoy.server.net.ObjectWriteProxy;
+
+/**
+ * Project: envoy-server-standalone
+ * File: ProfilePicChangeProcessor.java
+ * Created: 01.08.2020
+ *
+ * @author Leon Hofmeister
+ * @since Envoy Server v0.2-beta
+ */
+public class ProfilePicChangeProcessor implements ObjectProcessor {
+
+ @Override
+ public void process(ProfilePicChange event, long socketID, ObjectWriteProxy writeProxy) throws IOException {}
+}