151 lines
5.9 KiB
Java
151 lines
5.9 KiB
Java
package org.to.telegramfinalproject.UI;
|
|
|
|
import javafx.fxml.FXML;
|
|
import javafx.scene.control.Label;
|
|
import javafx.scene.image.Image;
|
|
import javafx.scene.image.ImageView;
|
|
import javafx.scene.layout.StackPane;
|
|
import javafx.scene.shape.Circle;
|
|
import org.to.telegramfinalproject.Client.AvatarLocalResolver;
|
|
import org.to.telegramfinalproject.Models.ChatEntry;
|
|
|
|
import java.util.Objects;
|
|
|
|
public class ChatItemController {
|
|
|
|
@FXML private ImageView profileImage;
|
|
@FXML private Label chatName;
|
|
@FXML private Label lastMessage;
|
|
@FXML private Label chatTime;
|
|
@FXML private Label unreadCount;
|
|
@FXML private StackPane systemAvatar;
|
|
@FXML private ImageView profileImageUser;
|
|
@FXML private ImageView profileImageSystem;
|
|
@FXML private Circle systemCircle;
|
|
|
|
/**
|
|
* Set chat item data, including a profile image (or default).
|
|
*
|
|
* @param name Chat name
|
|
* @param lastMsg Last message text
|
|
* @param time Last message time
|
|
* @param unread Unread message count
|
|
* @param imageUrl Path/URL of profile image (can be null/empty)
|
|
*/
|
|
public void setChatData(String name, String lastMsg, String time, int unread, String imageUrl, String chatType) {
|
|
chatName.setText(name);
|
|
lastMessage.setText(lastMsg);
|
|
chatTime.setText(time);
|
|
|
|
// Unread count
|
|
if (unread > 0) {
|
|
unreadCount.setVisible(true);
|
|
unreadCount.setText(String.valueOf(unread));
|
|
} else {
|
|
unreadCount.setVisible(false);
|
|
}
|
|
|
|
// Reset all avatar states
|
|
profileImageUser.setVisible(false);
|
|
profileImageUser.setManaged(false);
|
|
systemAvatar.setVisible(false);
|
|
systemAvatar.setManaged(false);
|
|
|
|
if ("Saved Messages".equals(name)) {
|
|
systemCircle.setFill(javafx.scene.paint.Color.web("#2ca4ff")); // Telegram blue
|
|
profileImageSystem.setImage(new Image(
|
|
Objects.requireNonNull(getClass().getResourceAsStream(
|
|
"/org/to/telegramfinalproject/Icons/saved_messages_light.png"))
|
|
));
|
|
systemAvatar.setVisible(true);
|
|
systemAvatar.setManaged(true);
|
|
|
|
} else if ("Archived Chats".equals(name)) {
|
|
systemCircle.setFill(javafx.scene.paint.Color.web("#808080")); // gray
|
|
profileImageSystem.setImage(new Image(
|
|
Objects.requireNonNull(getClass().getResourceAsStream(
|
|
"/org/to/telegramfinalproject/Icons/archived_chats_light.png"))
|
|
));
|
|
systemAvatar.setVisible(true);
|
|
systemAvatar.setManaged(true);
|
|
|
|
} else if (imageUrl != null && !imageUrl.isEmpty()) {
|
|
// profileImageUser.setImage(new Image(imageUrl, true));
|
|
// profileImageUser.setVisible(true);
|
|
// profileImageUser.setManaged(true);
|
|
|
|
Image img = AvatarLocalResolver.load(imageUrl);
|
|
if (img != null) {
|
|
profileImageUser.setImage(img);
|
|
AvatarFX.circleClip(profileImageUser, 40);
|
|
} else {
|
|
String path;
|
|
if ("group".equalsIgnoreCase(chatType)) {
|
|
path = "/org/to/telegramfinalproject/Avatars/default_group_profile.png";
|
|
} else if ("channel".equalsIgnoreCase(chatType)) {
|
|
path = "/org/to/telegramfinalproject/Avatars/default_channel_profile.png";
|
|
} else {
|
|
path = "/org/to/telegramfinalproject/Avatars/default_user_profile.png";
|
|
}
|
|
profileImageUser.setImage(new Image(
|
|
java.util.Objects.requireNonNull(getClass().getResourceAsStream(path))
|
|
));
|
|
}
|
|
profileImageUser.setVisible(true);
|
|
profileImageUser.setManaged(true);
|
|
|
|
} else {
|
|
String path;
|
|
if ("group".equalsIgnoreCase(chatType)) {
|
|
path = "/org/to/telegramfinalproject/Avatars/default_group_profile.png";
|
|
} else if ("channel".equalsIgnoreCase(chatType)) {
|
|
path = "/org/to/telegramfinalproject/Avatars/default_channel_profile.png";
|
|
} else {
|
|
path = "/org/to/telegramfinalproject/Avatars/default_user_profile.png";
|
|
}
|
|
|
|
profileImageUser.setImage(new Image(
|
|
Objects.requireNonNull(getClass().getResourceAsStream(path))
|
|
));
|
|
profileImageUser.setVisible(true);
|
|
profileImageUser.setManaged(true);
|
|
}
|
|
}
|
|
|
|
public void setUnread(int unread) {
|
|
boolean show = unread > 0;
|
|
unreadCount.setVisible(show);
|
|
unreadCount.setManaged(show);
|
|
if (show) unreadCount.setText(String.valueOf(unread));
|
|
}
|
|
|
|
// ChatItemController.java
|
|
@FXML private ImageView avatarImage;
|
|
private String chatType;
|
|
|
|
public void updateAvatar(String url) {
|
|
try {
|
|
if (url == null || url.isBlank()) {
|
|
String def = switch (chatType == null ? "" : chatType.toLowerCase()) {
|
|
case "group" -> "/org/to/telegramfinalproject/Avatars/default_group_profile.png";
|
|
case "channel" -> "/org/to/telegramfinalproject/Avatars/default_channel_profile.png";
|
|
default -> "/org/to/telegramfinalproject/Avatars/default_user_profile.png";
|
|
};
|
|
avatarImage.setImage(new Image(Objects.requireNonNull(
|
|
getClass().getResourceAsStream(def))));
|
|
} else {
|
|
avatarImage.setImage(new Image(url, true)); // true = لود غیرهمزمان
|
|
}
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
private String safeTitle(ChatEntry e) {
|
|
if (e.getName() != null && !e.getName().isBlank()) return e.getName();
|
|
if (e.getDisplayId() != null && !e.getDisplayId().isBlank()) return e.getDisplayId();
|
|
return "Unknown";
|
|
}
|
|
|
|
}
|