parent
3810fdef02
commit
e8202e0c94
@ -293,6 +293,9 @@ public final class LocalDB implements EventListener {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Event(priority = 500)
|
||||||
|
private void onOwnStatusChange(OwnStatusChange statusChange) { user.setStatus(statusChange.get()); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return a {@code Map<String, User>} of all users stored locally with their
|
* @return a {@code Map<String, User>} of all users stored locally with their
|
||||||
* user names as keys
|
* user names as keys
|
||||||
|
23
client/src/main/java/envoy/client/event/OwnStatusChange.java
Normal file
23
client/src/main/java/envoy/client/event/OwnStatusChange.java
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package envoy.client.event;
|
||||||
|
|
||||||
|
import envoy.data.User;
|
||||||
|
import envoy.data.User.UserStatus;
|
||||||
|
import envoy.event.Event;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Conveys the action that the currently logged in {@link User} has changed his
|
||||||
|
* status (manually).
|
||||||
|
*
|
||||||
|
* @author Leon Hofmeister
|
||||||
|
* @since Envoy Client v0.3-beta
|
||||||
|
*/
|
||||||
|
public class OwnStatusChange extends Event<UserStatus> {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param value the new user status of the currently logged in user
|
||||||
|
* @since Envoy Client v0.3-beta
|
||||||
|
*/
|
||||||
|
public OwnStatusChange(UserStatus value) { super(value); }
|
||||||
|
}
|
@ -1,15 +1,8 @@
|
|||||||
package envoy.client.helper;
|
package envoy.client.helper;
|
||||||
|
|
||||||
import java.util.logging.Level;
|
|
||||||
|
|
||||||
import javafx.scene.control.Alert;
|
|
||||||
import javafx.scene.control.Alert.AlertType;
|
|
||||||
|
|
||||||
import envoy.client.data.*;
|
import envoy.client.data.*;
|
||||||
import envoy.client.event.*;
|
import envoy.client.event.EnvoyCloseEvent;
|
||||||
import envoy.client.ui.SceneContext.SceneInfo;
|
|
||||||
import envoy.client.ui.StatusTrayIcon;
|
import envoy.client.ui.StatusTrayIcon;
|
||||||
import envoy.util.EnvoyLog;
|
|
||||||
|
|
||||||
import dev.kske.eventbus.EventBus;
|
import dev.kske.eventbus.EventBus;
|
||||||
|
|
||||||
@ -36,23 +29,4 @@ public final class ShutdownHelper {
|
|||||||
System.exit(0);
|
System.exit(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Logs the current user out and reopens
|
|
||||||
* {@link envoy.client.ui.controller.LoginScene}.
|
|
||||||
*
|
|
||||||
* @since Envoy Client v0.2-beta
|
|
||||||
*/
|
|
||||||
public static void logout() {
|
|
||||||
final var alert = new Alert(AlertType.CONFIRMATION);
|
|
||||||
alert.setTitle("Logout?");
|
|
||||||
alert.setContentText("Are you sure you want to log out?");
|
|
||||||
|
|
||||||
AlertHelper.confirmAction(alert, () -> {
|
|
||||||
EnvoyLog.getLogger(ShutdownHelper.class).log(Level.INFO, "A logout was requested");
|
|
||||||
EventBus.getInstance().dispatch(new EnvoyCloseEvent());
|
|
||||||
EventBus.getInstance().dispatch(new Logout());
|
|
||||||
Context.getInstance().getSceneContext().load(SceneInfo.LOGIN_SCENE);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@ import javafx.stage.Stage;
|
|||||||
import envoy.client.data.Settings;
|
import envoy.client.data.Settings;
|
||||||
import envoy.client.event.*;
|
import envoy.client.event.*;
|
||||||
import envoy.client.helper.ShutdownHelper;
|
import envoy.client.helper.ShutdownHelper;
|
||||||
|
import envoy.client.util.UserUtil;
|
||||||
import envoy.util.EnvoyLog;
|
import envoy.util.EnvoyLog;
|
||||||
|
|
||||||
import dev.kske.eventbus.*;
|
import dev.kske.eventbus.*;
|
||||||
@ -128,7 +129,7 @@ public final class SceneContext implements EventListener {
|
|||||||
|
|
||||||
// Add the option to logout using "Control"+"Shift"+"L" if not in login scene
|
// Add the option to logout using "Control"+"Shift"+"L" if not in login scene
|
||||||
if (sceneInfo != SceneInfo.LOGIN_SCENE)
|
if (sceneInfo != SceneInfo.LOGIN_SCENE)
|
||||||
accelerators.put(new KeyCodeCombination(KeyCode.L, KeyCombination.CONTROL_DOWN, KeyCombination.SHIFT_DOWN), ShutdownHelper::logout);
|
accelerators.put(new KeyCodeCombination(KeyCode.L, KeyCombination.CONTROL_DOWN, KeyCombination.SHIFT_DOWN), UserUtil::logout);
|
||||||
|
|
||||||
// Add the option to open the settings scene with "Control"+"S", if being in
|
// Add the option to open the settings scene with "Control"+"S", if being in
|
||||||
// chat scene
|
// chat scene
|
||||||
|
@ -12,7 +12,7 @@ import envoy.client.data.commands.*;
|
|||||||
import envoy.client.helper.ShutdownHelper;
|
import envoy.client.helper.ShutdownHelper;
|
||||||
import envoy.client.ui.SceneContext.SceneInfo;
|
import envoy.client.ui.SceneContext.SceneInfo;
|
||||||
import envoy.client.ui.controller.ChatScene;
|
import envoy.client.ui.controller.ChatScene;
|
||||||
import envoy.client.util.MessageUtil;
|
import envoy.client.util.*;
|
||||||
import envoy.data.Message;
|
import envoy.data.Message;
|
||||||
import envoy.util.EnvoyLog;
|
import envoy.util.EnvoyLog;
|
||||||
|
|
||||||
@ -52,7 +52,7 @@ public final class ChatSceneCommands {
|
|||||||
.build("dabr");
|
.build("dabr");
|
||||||
|
|
||||||
// Logout initialization
|
// Logout initialization
|
||||||
builder.setAction(text -> ShutdownHelper.logout()).setDescription("Logs you out.").buildNoArg("logout");
|
builder.setAction(text -> UserUtil.logout()).setDescription("Logs you out.").buildNoArg("logout");
|
||||||
|
|
||||||
// Exit initialization
|
// Exit initialization
|
||||||
builder.setAction(text -> ShutdownHelper.exit()).setNumberOfArguments(0).setDescription("Exits the program.").build("exit", false);
|
builder.setAction(text -> ShutdownHelper.exit()).setNumberOfArguments(0).setDescription("Exits the program.").build("exit", false);
|
||||||
|
@ -13,6 +13,7 @@ import javafx.application.Platform;
|
|||||||
import javafx.collections.ObservableList;
|
import javafx.collections.ObservableList;
|
||||||
import javafx.collections.transformation.FilteredList;
|
import javafx.collections.transformation.FilteredList;
|
||||||
import javafx.fxml.*;
|
import javafx.fxml.*;
|
||||||
|
import javafx.geometry.Pos;
|
||||||
import javafx.scene.control.*;
|
import javafx.scene.control.*;
|
||||||
import javafx.scene.control.Alert.AlertType;
|
import javafx.scene.control.Alert.AlertType;
|
||||||
import javafx.scene.image.*;
|
import javafx.scene.image.*;
|
||||||
@ -29,7 +30,7 @@ import envoy.client.event.*;
|
|||||||
import envoy.client.net.*;
|
import envoy.client.net.*;
|
||||||
import envoy.client.ui.*;
|
import envoy.client.ui.*;
|
||||||
import envoy.client.ui.chatscene.*;
|
import envoy.client.ui.chatscene.*;
|
||||||
import envoy.client.ui.control.ChatControl;
|
import envoy.client.ui.control.*;
|
||||||
import envoy.client.ui.listcell.*;
|
import envoy.client.ui.listcell.*;
|
||||||
import envoy.client.util.*;
|
import envoy.client.util.*;
|
||||||
import envoy.data.*;
|
import envoy.data.*;
|
||||||
@ -78,9 +79,6 @@ public final class ChatScene implements EventListener, Restorable {
|
|||||||
@FXML
|
@FXML
|
||||||
private Button newContactButton;
|
private Button newContactButton;
|
||||||
|
|
||||||
@FXML
|
|
||||||
private Label contactLabel;
|
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
private Label remainingChars;
|
private Label remainingChars;
|
||||||
|
|
||||||
@ -126,6 +124,12 @@ public final class ChatScene implements EventListener, Restorable {
|
|||||||
@FXML
|
@FXML
|
||||||
private HBox contactSpecificOnlineOperations;
|
private HBox contactSpecificOnlineOperations;
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
private HBox ownContactControl;
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
private Region spaceBetweenUserAndSettingsButton;
|
||||||
|
|
||||||
private Chat currentChat;
|
private Chat currentChat;
|
||||||
private FilteredList<Chat> chats;
|
private FilteredList<Chat> chats;
|
||||||
private boolean recording;
|
private boolean recording;
|
||||||
@ -185,10 +189,16 @@ public final class ChatScene implements EventListener, Restorable {
|
|||||||
clientProfilePic.setClip(clip);
|
clientProfilePic.setClip(clip);
|
||||||
|
|
||||||
chatList.setItems(chats = new FilteredList<>(localDB.getChats()));
|
chatList.setItems(chats = new FilteredList<>(localDB.getChats()));
|
||||||
contactLabel.setText(localDB.getUser().getName());
|
|
||||||
|
// Set the design of the box in the upper-left corner
|
||||||
|
settingsButton.setAlignment(Pos.BOTTOM_RIGHT);
|
||||||
|
HBox.setHgrow(spaceBetweenUserAndSettingsButton, Priority.ALWAYS);
|
||||||
|
generateOwnStatusControl();
|
||||||
|
System.out.println(ownContactControl.getChildren());
|
||||||
|
|
||||||
Platform.runLater(() -> {
|
Platform.runLater(() -> {
|
||||||
final var online = client.isOnline();
|
final var online = client.isOnline();
|
||||||
|
|
||||||
// no check will be performed in case it has already been disabled - a negative
|
// no check will be performed in case it has already been disabled - a negative
|
||||||
// GroupCreationResult might have been returned
|
// GroupCreationResult might have been returned
|
||||||
if (!newGroupButton.isDisabled()) newGroupButton.setDisable(!online);
|
if (!newGroupButton.isDisabled()) newGroupButton.setDisable(!online);
|
||||||
@ -260,6 +270,9 @@ public final class ChatScene implements EventListener, Restorable {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Event(eventType = OwnStatusChange.class, priority = 50)
|
||||||
|
private void onOwnStatusChange() { generateOwnStatusControl(); }
|
||||||
|
|
||||||
@Event
|
@Event
|
||||||
private void onContactOperation(ContactOperation operation) {
|
private void onContactOperation(ContactOperation operation) {
|
||||||
final var contact = operation.get();
|
final var contact = operation.get();
|
||||||
@ -706,6 +719,13 @@ public final class ChatScene implements EventListener, Restorable {
|
|||||||
attachmentView.setVisible(visible);
|
attachmentView.setVisible(visible);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void generateOwnStatusControl() {
|
||||||
|
final var ownUserControl = new ContactControl(localDB.getUser());
|
||||||
|
ownUserControl.setAlignment(Pos.CENTER_LEFT);
|
||||||
|
if (ownContactControl.getChildren().get(0) instanceof ContactControl) ownContactControl.getChildren().set(0, ownUserControl);
|
||||||
|
else ownContactControl.getChildren().add(0, ownUserControl);
|
||||||
|
}
|
||||||
|
|
||||||
// Context menu actions
|
// Context menu actions
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
|
@ -4,10 +4,9 @@ import javafx.scene.control.*;
|
|||||||
|
|
||||||
import envoy.client.data.SettingsItem;
|
import envoy.client.data.SettingsItem;
|
||||||
import envoy.client.event.ThemeChangeEvent;
|
import envoy.client.event.ThemeChangeEvent;
|
||||||
import envoy.client.helper.ShutdownHelper;
|
|
||||||
import envoy.client.ui.StatusTrayIcon;
|
import envoy.client.ui.StatusTrayIcon;
|
||||||
|
import envoy.client.util.UserUtil;
|
||||||
import envoy.data.User.UserStatus;
|
import envoy.data.User.UserStatus;
|
||||||
import envoy.event.UserStatusChange;
|
|
||||||
|
|
||||||
import dev.kske.eventbus.EventBus;
|
import dev.kske.eventbus.EventBus;
|
||||||
|
|
||||||
@ -64,18 +63,13 @@ public final class GeneralSettingsPane extends SettingsPane {
|
|||||||
statusComboBox.setOnAction(e -> {
|
statusComboBox.setOnAction(e -> {
|
||||||
final var status = statusComboBox.getValue();
|
final var status = statusComboBox.getValue();
|
||||||
if (status == null) return;
|
if (status == null) return;
|
||||||
else {
|
else UserUtil.changeStatus(status);
|
||||||
final var user = context.getLocalDB().getUser();
|
|
||||||
user.setStatus(status);
|
|
||||||
// TODO update status in ChatScene
|
|
||||||
context.getClient().send(new UserStatusChange(user.getID(), status));
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
getChildren().add(statusComboBox);
|
getChildren().add(statusComboBox);
|
||||||
}
|
}
|
||||||
|
|
||||||
final var logoutButton = new Button("Logout");
|
final var logoutButton = new Button("Logout");
|
||||||
logoutButton.setOnAction(e -> ShutdownHelper.logout());
|
logoutButton.setOnAction(e -> UserUtil.logout());
|
||||||
final var logoutTooltip = new Tooltip("Brings you back to the login screen and removes \"remember me\" status from this account");
|
final var logoutTooltip = new Tooltip("Brings you back to the login screen and removes \"remember me\" status from this account");
|
||||||
logoutTooltip.setWrapText(true);
|
logoutTooltip.setWrapText(true);
|
||||||
logoutButton.setTooltip(logoutTooltip);
|
logoutButton.setTooltip(logoutTooltip);
|
||||||
|
58
client/src/main/java/envoy/client/util/UserUtil.java
Normal file
58
client/src/main/java/envoy/client/util/UserUtil.java
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
package envoy.client.util;
|
||||||
|
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
import javafx.scene.control.Alert;
|
||||||
|
import javafx.scene.control.Alert.AlertType;
|
||||||
|
|
||||||
|
import envoy.client.data.Context;
|
||||||
|
import envoy.client.event.*;
|
||||||
|
import envoy.client.helper.*;
|
||||||
|
import envoy.client.ui.SceneContext.SceneInfo;
|
||||||
|
import envoy.data.User.UserStatus;
|
||||||
|
import envoy.event.UserStatusChange;
|
||||||
|
import envoy.util.EnvoyLog;
|
||||||
|
|
||||||
|
import dev.kske.eventbus.EventBus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains methods that change something about the currently logged in user.
|
||||||
|
*
|
||||||
|
* @author Leon Hofmeister
|
||||||
|
* @since Envoy Client v0.3-beta
|
||||||
|
*/
|
||||||
|
public final class UserUtil {
|
||||||
|
|
||||||
|
private UserUtil() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Logs the current user out and reopens
|
||||||
|
* {@link envoy.client.ui.controller.LoginScene}.
|
||||||
|
*
|
||||||
|
* @since Envoy Client v0.2-beta
|
||||||
|
*/
|
||||||
|
public static void logout() {
|
||||||
|
final var alert = new Alert(AlertType.CONFIRMATION);
|
||||||
|
alert.setTitle("Logout?");
|
||||||
|
alert.setContentText("Are you sure you want to log out?");
|
||||||
|
|
||||||
|
AlertHelper.confirmAction(alert, () -> {
|
||||||
|
EnvoyLog.getLogger(ShutdownHelper.class).log(Level.INFO, "A logout was requested");
|
||||||
|
EventBus.getInstance().dispatch(new EnvoyCloseEvent());
|
||||||
|
EventBus.getInstance().dispatch(new Logout());
|
||||||
|
Context.getInstance().getSceneContext().load(SceneInfo.LOGIN_SCENE);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notifies the application that the status of the currently logged in user has
|
||||||
|
* changed
|
||||||
|
*
|
||||||
|
* @param newStatus the new status
|
||||||
|
* @since Envoy Client v0.3-beta
|
||||||
|
*/
|
||||||
|
public static void changeStatus(UserStatus newStatus) {
|
||||||
|
EventBus.getInstance().dispatch(new OwnStatusChange(newStatus));
|
||||||
|
Context.getInstance().getClient().send(new UserStatusChange(Context.getInstance().getLocalDB().getUser().getID(), newStatus));
|
||||||
|
}
|
||||||
|
}
|
@ -161,44 +161,25 @@
|
|||||||
fitHeight="43.0" fitWidth="43.0" pickOnBounds="true"
|
fitHeight="43.0" fitWidth="43.0" pickOnBounds="true"
|
||||||
preserveRatio="true">
|
preserveRatio="true">
|
||||||
<HBox.margin>
|
<HBox.margin>
|
||||||
<Insets left="15.0" top="5.0" />
|
<Insets left="15.0" top="5.0" right="10.0" />
|
||||||
</HBox.margin>
|
</HBox.margin>
|
||||||
</ImageView>
|
</ImageView>
|
||||||
<Label id="transparent-background" fx:id="contactLabel"
|
<HBox id="transparent-background" fx:id="ownContactControl">
|
||||||
prefHeight="27.0" prefWidth="134.0">
|
|
||||||
<padding>
|
|
||||||
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
|
|
||||||
</padding>
|
|
||||||
<font>
|
|
||||||
<Font size="18.0" />
|
|
||||||
</font>
|
|
||||||
<HBox.margin>
|
|
||||||
<Insets left="10.0" top="5.0" />
|
|
||||||
</HBox.margin>
|
|
||||||
</Label>
|
|
||||||
<Region id="transparent-background" prefHeight="77.0"
|
|
||||||
prefWidth="115.0" />
|
|
||||||
<VBox id="transparent-background" alignment="CENTER_RIGHT"
|
|
||||||
prefHeight="200.0" prefWidth="100.0" spacing="5.0">
|
|
||||||
<children>
|
<children>
|
||||||
<Button fx:id="settingsButton" mnemonicParsing="true"
|
<Region id="transparent-background" prefWidth="120"
|
||||||
|
fx:id="spaceBetweenUserAndSettingsButton" />
|
||||||
|
<Button fx:id="settingsButton" mnemonicParsing="false"
|
||||||
onAction="#settingsButtonClicked" prefHeight="30.0"
|
onAction="#settingsButtonClicked" prefHeight="30.0"
|
||||||
prefWidth="30.0" text="">
|
prefWidth="30.0" text="" alignment="CENTER">
|
||||||
<padding>
|
<padding>
|
||||||
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
|
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
|
||||||
</padding>
|
</padding>
|
||||||
<VBox.margin>
|
<HBox.margin>
|
||||||
<Insets />
|
<Insets bottom="35.0" left="5.0" top="35.0"/>
|
||||||
</VBox.margin>
|
</HBox.margin>
|
||||||
</Button>
|
</Button>
|
||||||
</children>
|
</children>
|
||||||
<HBox.margin>
|
</HBox>
|
||||||
<Insets right="10.0" />
|
|
||||||
</HBox.margin>
|
|
||||||
<opaqueInsets>
|
|
||||||
<Insets />
|
|
||||||
</opaqueInsets>
|
|
||||||
</VBox>
|
|
||||||
</children>
|
</children>
|
||||||
<GridPane.margin>
|
<GridPane.margin>
|
||||||
<Insets bottom="1.0" right="1.0" />
|
<Insets bottom="1.0" right="1.0" />
|
||||||
|
Reference in New Issue
Block a user