diff --git a/brain/app/main.py b/brain/app/main.py index 529987a..38b3e58 100644 --- a/brain/app/main.py +++ b/brain/app/main.py @@ -26,7 +26,7 @@ from app.infrastructure.ollama_model_installer import ensure_ollama_embedding_mo app = FastAPI( title="LoreMind Brain", description="Backend IA pour la génération de contenu narratif.", - version="0.16.3", + version="0.17.0", ) logger = logging.getLogger(__name__) diff --git a/core/pom.xml b/core/pom.xml index 5b9a17c..df90bbe 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -14,7 +14,7 @@ com.loremind loremind-core - 0.16.3 + 0.17.0 LoreMind Core Backend Core - Architecture Hexagonale diff --git a/core/src/main/java/com/loremind/infrastructure/desktop/SystemTrayManager.java b/core/src/main/java/com/loremind/infrastructure/desktop/SystemTrayManager.java index 4dc2f1b..679ec8e 100644 --- a/core/src/main/java/com/loremind/infrastructure/desktop/SystemTrayManager.java +++ b/core/src/main/java/com/loremind/infrastructure/desktop/SystemTrayManager.java @@ -20,6 +20,9 @@ import java.awt.RenderingHints; import java.awt.SystemTray; import java.awt.TrayIcon; import java.awt.image.BufferedImage; +import java.io.IOException; +import java.io.InputStream; +import javax.imageio.ImageIO; /** * Icone dans la zone de notification (barre des taches) en mode bureau @@ -63,7 +66,7 @@ public class SystemTrayManager { try { popup = new PopupMenu(); - MenuItem open = new MenuItem("Ouvrir LoreMind"); + MenuItem open = new MenuItem("Ouvrir DM Loremind"); open.addActionListener(e -> DesktopSingleInstance.openAppInBrowser()); popup.add(open); @@ -79,17 +82,17 @@ public class SystemTrayManager { popup.add(editConfig); // Acces au dossier de donnees (~/.loremind : base, images, config…). - MenuItem openFolder = new MenuItem("Ouvrir le dossier LoreMind"); + MenuItem openFolder = new MenuItem("Ouvrir le dossier DM Loremind"); openFolder.addActionListener(e -> DesktopSingleInstance.openFolder(DesktopUserConfig.getHomeDir())); popup.add(openFolder); popup.addSeparator(); - MenuItem quit = new MenuItem("Quitter LoreMind"); + MenuItem quit = new MenuItem("Quitter DM Loremind"); quit.addActionListener(e -> quit()); popup.add(quit); - trayIcon = new TrayIcon(createIcon(), "LoreMind", popup); + trayIcon = new TrayIcon(createIcon(), "DM Loremind", popup); trayIcon.setImageAutoSize(true); // Double-clic sur l'icone : ouvre l'application dans le navigateur. trayIcon.addActionListener(e -> DesktopSingleInstance.openAppInBrowser()); @@ -122,7 +125,7 @@ public class SystemTrayManager { popup.insertSeparator(1); trayIcon.displayMessage( - "LoreMind — mise a jour disponible", + "DM Loremind — mise a jour disponible", "Version " + info.latestVersion() + " disponible (vous avez " + info.currentVersion() + "). Menu de l'icone → Telecharger.", TrayIcon.MessageType.INFO); @@ -151,19 +154,35 @@ public class SystemTrayManager { } /** - * Genere une petite icone (carre arrondi violet « L ») sans dependre d'un - * fichier image — robuste quel que soit l'empaquetage. + * Icone du systray : charge l'image de marque {@code /tray-icon.png} depuis le + * classpath (embarquee dans le jar). Repli sur une icone dessinee si le fichier + * est absent ou illisible — l'application reste fonctionnelle dans tous les cas. */ private Image createIcon() { + try (InputStream in = getClass().getResourceAsStream("/tray-icon.png")) { + if (in != null) { + BufferedImage loaded = ImageIO.read(in); + if (loaded != null) { + return loaded; + } + } + } catch (IOException e) { + // ignore : on retombe sur l'icone dessinee ci-dessous + } + return drawFallbackIcon(); + } + + /** Icone de repli (carre arrondi violet « DM ») si l'image embarquee manque. */ + private Image drawFallbackIcon() { int size = 16; BufferedImage img = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB); Graphics2D g = img.createGraphics(); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g.setColor(new Color(0x8B, 0x5C, 0xF6)); // violet de marque LoreMind + g.setColor(new Color(0x8B, 0x5C, 0xF6)); // violet de marque g.fillRoundRect(0, 0, size, size, 5, 5); g.setColor(Color.WHITE); - g.setFont(new Font("SansSerif", Font.BOLD, 12)); - g.drawString("L", 4, 13); + g.setFont(new Font("SansSerif", Font.BOLD, 9)); + g.drawString("DM", 1, 12); g.dispose(); return img; } diff --git a/core/src/main/resources/tray-icon.png b/core/src/main/resources/tray-icon.png new file mode 100644 index 0000000..d99f931 Binary files /dev/null and b/core/src/main/resources/tray-icon.png differ diff --git a/installers/desktop/app-icon.ico b/installers/desktop/app-icon.ico new file mode 100644 index 0000000..8d0c3ad Binary files /dev/null and b/installers/desktop/app-icon.ico differ diff --git a/installers/desktop/build-windows.ps1 b/installers/desktop/build-windows.ps1 index f27daef..8952491 100644 --- a/installers/desktop/build-windows.ps1 +++ b/installers/desktop/build-windows.ps1 @@ -57,6 +57,7 @@ $BrainDir = Join-Path $RepoRoot 'brain' $CoreDir = Join-Path $RepoRoot 'core' $StageDir = Join-Path $CoreDir 'target\dist-input' # charge utile jpackage $OutDir = Join-Path $CoreDir 'target\dist-out' # .msi produit +$IconFile = Join-Path $PSScriptRoot 'app-icon.ico' # icone de l'app (.msi + raccourcis) # --- Version (numerique pour MSI) ------------------------------------------ if (-not $Version) { @@ -213,11 +214,21 @@ $brainCmd = '$APPDIR\brain\python\python.exe,$APPDIR\brain\run_local.py' # # Note : pas de --win-console (app de bureau). Les logs Spring/Brain peuvent # etre rediriges vers un fichier via une option ulterieure si besoin de debug. +# Icone de l'application (.msi, raccourcis bureau/menu). Doit etre un .ico Windows +# multi-resolution (16/32/48/256). Absente -> jpackage retomberait sur l'icone Java +# par defaut : on echoue tot avec un message clair plutot que de livrer ca. +if (-not (Test-Path $IconFile)) { + Write-Err "Icone manquante : $IconFile" + Write-Err "Depose l'icone de l'app (image DM, .ico multi-resolution) a cet emplacement." + exit 1 +} + jpackage ` --type msi ` - --name LoreMind ` + --name 'DM Loremind' ` --app-version $Version ` --vendor 'IGML Creation' ` + --icon $IconFile ` --input $StageDir ` --main-jar loremind-core.jar ` --main-class org.springframework.boot.loader.launch.JarLauncher ` @@ -226,7 +237,7 @@ jpackage ` --java-options "-Dbrain.sidecar.command=$brainCmd" ` --win-per-user-install ` --win-upgrade-uuid 'a7c4e1d2-9b3f-4e6a-8d05-1f2c3b4a5e6d' ` - --win-menu --win-menu-group 'LoreMind' ` + --win-menu --win-menu-group 'DM Loremind' ` --win-shortcut --win-dir-chooser if ($LASTEXITCODE -ne 0) { diff --git a/web/package-lock.json b/web/package-lock.json index e8c463b..84dcf3f 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,12 +1,12 @@ { "name": "loremind-web", - "version": "0.16.3", + "version": "0.17.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "loremind-web", - "version": "0.16.3", + "version": "0.17.0", "dependencies": { "@angular/animations": "^21.2.16", "@angular/common": "^21.2.16", diff --git a/web/package.json b/web/package.json index eda8e21..55e01d4 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "loremind-web", - "version": "0.16.3", + "version": "0.17.0", "description": "LoreMind Frontend - Angular", "scripts": { "ng": "ng", diff --git a/web/src/app/sidebar/sidebar.component.html b/web/src/app/sidebar/sidebar.component.html index 45fbeca..88b8424 100644 --- a/web/src/app/sidebar/sidebar.component.html +++ b/web/src/app/sidebar/sidebar.component.html @@ -2,8 +2,8 @@ diff --git a/web/src/app/sidebar/sidebar.component.scss b/web/src/app/sidebar/sidebar.component.scss index 7a0d315..b733d20 100644 --- a/web/src/app/sidebar/sidebar.component.scss +++ b/web/src/app/sidebar/sidebar.component.scss @@ -18,6 +18,7 @@ } .logo-icon { font-size: 1.2rem; color: #6c63ff; } +.logo-img { width: 1.75rem; height: 1.75rem; border-radius: 6px; object-fit: contain; flex: 0 0 auto; } .logo-text { font-size: 1.25rem; font-weight: 700; color: white; } .logo-subtitle { diff --git a/web/src/assets/logo.png b/web/src/assets/logo.png new file mode 100644 index 0000000..5949a8c Binary files /dev/null and b/web/src/assets/logo.png differ diff --git a/web/src/favicon.ico b/web/src/favicon.ico new file mode 100644 index 0000000..3c393e0 Binary files /dev/null and b/web/src/favicon.ico differ diff --git a/web/src/index.html b/web/src/index.html index fa6f1b0..401e981 100644 --- a/web/src/index.html +++ b/web/src/index.html @@ -2,7 +2,7 @@ - LoreMind + DM Loremind