Merge branch 'Connection-UI' into Main-UI

# Conflicts:
#	src/main/java/org/to/telegramfinalproject/UI/MainController.java
#	src/main/resources/org/to/telegramfinalproject/CSS/dark_theme.css
#	src/main/resources/org/to/telegramfinalproject/CSS/light_theme.css
This commit is contained in:
Asal Lotfi
2025-09-01 19:11:00 +03:30
31 changed files with 3746 additions and 744 deletions
@@ -14,6 +14,9 @@ import javafx.scene.layout.HBox;
import javafx.scene.layout.Region;
import javafx.scene.layout.VBox;
import javafx.util.Duration;
import org.json.JSONObject;
import org.to.telegramfinalproject.Client.AvatarLocalResolver;
import java.io.IOException;
import java.net.URL;
@@ -22,6 +25,9 @@ public class SidebarMenuController {
private static final String ICON_PATH = "/org/to/telegramfinalproject/Icons/";
@FXML private VBox sidebarRoot;
@FXML private ImageView profileImage;
@FXML private Label usernameLabel;
@@ -46,8 +52,10 @@ public class SidebarMenuController {
@FXML
public void initialize() {
// Load default profile image
Image profile = loadImage("/org/to/telegramfinalproject/Avatars/default_profile.png");
Image profile = loadImage("/org/to/telegramfinalproject/Avatars/default_user_profile.png");
if (profile != null) profileImage.setImage(profile);
AvatarFX.circleClip(profileImage, 56);
setupButtonActions();
setupToggleAction();
@@ -210,4 +218,58 @@ public class SidebarMenuController {
private void openSettings() { System.out.println("Opening Settings..."); }
private void openTelegramFeatures() { System.out.println("Opening Telegram Features..."); }
private void openTelegramQnA() { System.out.println("Opening Telegram Q&A..."); }
public void setUserFromSession(JSONObject user) {
if (user == null) return;
// نام نمایشی (اول profile_name بعد username)
String displayName = user.optString("profile_name",
user.optString("username", ""));
usernameLabel.setText(displayName);
// عکس پروفایل: هم URL اینترنتی هم مسیر ریسورس را پشتیبانی کن
String img = user.optString("image_url", "");
Image pic = tryLoadImage(img);
if (pic == null) {
pic = loadImage("/org/to/telegramfinalproject/Avatars/default_user_profile.png");
}
if (pic != null) profileImage.setImage(pic);
}
// کمک‌کننده: هم URL و هم ریسورس کلاس‌پث را امتحان می‌کند
// private Image tryLoadImage(String src) {
// if (src == null || src.isBlank()) return null;
// try {
// // اگر ریسورس داخل پروژه است (با / شروع شود یا در resources موجود باشد)
// var res = getClass().getResource(src);
// if (res != null) return new Image(res.toExternalForm(), true);
// // در غیر این صورت فرض کن URL است (http/https/file)
// return new Image(src, true);
// } catch (Exception ignored) {
// return null;
// }
// }
private Image tryLoadImage(String src) {
if (src == null || src.isBlank()) return null;
try {
// اگر مسیر داخل resources است
var res = getClass().getResource(src);
if (res != null) return new Image(res.toExternalForm(), true);
// اگر مسیر نسبی سرور (مثل /avatars/...) است
String fileUri = AvatarLocalResolver.resolve(src);
if (fileUri != null) return new Image(fileUri, true);
// در غیر این صورت، فرض URL کامل
return new Image(src, true);
} catch (Exception ignored) {
return null;
}
}
}