Files
bruno b47bf61386 feat(web): éditeur de périodes modifiables dans les réglages
La page Réglages permet maintenant de créer, modifier et supprimer ses propres périodes (profils) : nom, travail, pause courte, pause longue et nombre de cycles, avec bouton radio ★ pour choisir la période active. Enregistrement via profiles_json + active_profile (index). Repli automatique sur la première période si l'active est supprimée ; noms vides/doublons ignorés. La page Aide affiche le tableau des périodes réelles de la configuration. Tests : parsing, édition, repli du profil actif et intégration HTTP.
2026-08-14 23:37:23 -04:00

223 lines
10 KiB
Markdown

# NimPulse
Timer **Pomodoro nouvelle génération** pour Windows, écrit entièrement en
**Nim**. Il vit discrètement dans la zone de notification (system tray) et
prend soin de votre santé autant que de votre productivité, dans une interface
**simple et intuitive** pour tous : non-techniciens, étudiants, développeurs.
## Fonctionnalités
- **Icône tray** : démarre minimisé, menu contextuel complet, icône colorée
dynamique selon l'état (travail / pause courte / pause longue / en pause),
tooltip avec le temps restant.
- **Assistant de premier lancement** : en quelques étapes (langue, profil,
rappels santé), l'application est prête sans toucher à un fichier.
- **Panneau de réglages graphique** : durées, objectif journalier, son, mode
« Ne pas déranger », démarrage avec Windows, langue, rappels santé. Plus
besoin d'éditer le JSON à la main.
- **Internationalisation** : français et anglais (détection automatique de la
langue système ou choix manuel).
- **Timer personnalisable** : durées de travail / pause courte / pause longue,
nombre de cycles avant pause longue, et **profils** (« Classique »,
« Deep Work » 50/10, « Sprint » 15/3).
- **Contrôle des pauses** : sauter la pause, la prolonger de 5 minutes.
- **Objectif journalier** : définissez un nombre de pomodoros par jour et
recevez une notification quand il est atteint.
- **Rappels santé intelligents** (le différenciateur) : notifications rotatives
pendant les pauses (« Lève-toi et marche », « Bois un verre d'eau »,
« Fais 10 push-ups », règle 20-20-20, étirements…), **entièrement modifiables**
(ajouter / modifier / supprimer / activer-désactiver vos propres activités),
sans répéter deux fois le même rappel.
- **Notifications Windows natives** (toast via `Shell_NotifyIcon` + `NIF_INFO`)
et son optionnel en fin de période.
- **Statistiques enrichies** : pomodoros complétés (jour / semaine / total),
streak de jours consécutifs, historique des 7 derniers jours, **export CSV**.
- **Raccourci global** `Ctrl+Alt+P` (configurable) pour démarrer/mettre en
pause, sans toucher la souris.
- **Fenêtre flottante** : un petit panneau toujours au-dessus, draggable, qui
affiche la phase et le temps restant en grand (pratique et lisible d'un coup
d'œil).
- **Mono-instance** : lancer le programme une seconde fois ne crée pas de
doublon.
- **Mode portable** : placez un fichier vide `portable` à côté de l'exécutable
et la configuration est stockée au même endroit (pratique sur clé USB).
- **Mise à jour automatique** (optionnelle) : vérification en arrière-plan,
notification si une version plus récente est disponible.
- **Pages web locales** : aide, statistiques et réglages présentés sous forme de
pages HTML servies localement par l'application (127.0.0.1) et ouvertes dans
le navigateur par défaut — aucune donnée ne quitte l'ordinateur.
## Prérequis
- [Nim](https://nim-lang.org) ≥ 2.0 (testé avec 2.2.10)
- La bibliothèque [winim](https://github.com/khchen/winim) :
```bash
nimble install winim
```
- Le framework GUI [wNim](https://github.com/khchen/wNim) :
```bash
nimble install wnim
```
> **Important (Nim 2.2.x)** : wNim 1.0.0 contient deux bugs de compilation
> avec Nim 2.2.x. Appliquez ces deux correctifs dans
> `~/.nimble/pkgs2/wnim-*/wnim/` :
> 1. `private/kiwi/strength.nim` : remplacer les 4 `const X = createStrength(...)`
> par des littéraux (`REQUIRED = 1000.0`, `STRONG = 1000000.0`,
> `MEDIUM = 1000.0`, `WEAK = 1.0`).
> 2. `private/wResizer.nim` : remplacer `initHashSet[wResizable]()` par
> `HashSet[wTypes.wResizable]()`.
> Voir les issues wNim [#125](https://github.com/khchen/wNim/issues/125) et
> [#133](https://github.com/khchen/wNim/issues/133).
## Compilation
```bash
nim c -d:release --app:gui src/nimpulse.nim
```
Le binaire résultant `src/nimpulse.exe` est autonome (aucune dépendance
externe à installer) et pèse environ 1,4 Mo.
> **Note** : à l'édition de liens, `winim` injecte son propre fichier de
> ressources (styles visuels / manifeste), ce qui peut produire l'avertissement
> bénin `ld.exe: .rsrc merge failure: multiple non-default manifests`. Il est
> sans effet sur le fonctionnement. Pour le supprimer, compilez avec
> `-d:noRes` (vous perdrez alors les styles visuels des boîtes de dialogue).
## Distribution
- **Binaire autonome** : `src\nimpulse.exe` (ou `build\nimpulse.exe`).
- **Installeur une-ligne (Windows)** :
```powershell
irm https://git.dracodev.net/Projets/NimPulse/-/raw/main/install.ps1 | iex
```
Le script [`install.ps1`](install.ps1) télécharge le binaire et crée un
raccourci sur le bureau.
- **Archive portable** : lancez [`release.cmd`](release.cmd) pour compiler et
créer `build\NimPulse-portable.zip` (version prête à copier sur une clé USB).
- **Installeur classique** : un script [Inno Setup](installer/nimpulse.iss) est
fourni. Compilez-le avec [Inno Setup 6](https://jrsoftware.org/isinfo.php).
## Configuration
Au premier lancement (et à la sortie), l'application crée :
```
%APPDATA%\NimPulse\
├── config.json # réglages, profils, rappels santé
└── stats.json # statistiques
```
En **mode portable**, ces fichiers sont créés à côté de l'exécutable.
Un exemple de configuration est fourni dans
[`config.example.json`](config.example.json).
### Structure de `config.json`
| Clé | Type | Description |
|-------------------------|---------|--------------------------------------------------|
| `workMin` | int | Durée de travail (défaut 25) |
| `shortBreakMin` | int | Pause courte (défaut 5) |
| `longBreakMin` | int | Pause longue (défaut 15) |
| `cyclesBeforeLongBreak` | int | Cycles avant pause longue (défaut 4) |
| `soundEnabled` | bool | Son en fin de période |
| `doNotDisturb` | bool | Mode « Ne pas déranger » |
| `autoStart` | bool | Démarrage avec Windows |
| `activeProfile` | string | Nom du profil actif |
| `lang` | string | `"auto"`, `"fr"` ou `"en"` |
| `dailyGoal` | int | Objectif de pomodoros par jour (0 = aucun) |
| `hotkeyModifiers` | int | Modificateurs du raccourci global (Ctrl+Alt = 3) |
| `hotkeyVk` | int | Code de touche virtuelle du raccourci (`P` = 80) |
| `soundName` | string | Alias sonore système (fin de période) |
| `floatingWindow` | bool | Affiche la fenêtre flottante |
| `profiles` | array | Liste des profils (`name`, durées, `cycles`) |
| `healthReminders` | array | Rappels santé (`text`, `enabled`) |
## Architecture du code
```
src/
├── nimpulse.nim # point d'entrée : fenêtre cachée, boucle de messages,
│ # WM_TIMER, raccourci global, mono-instance, câblage
├── config.nim # Config/Profile/HealthReminder/Lang, JSON, registre (Run)
├── timer.nim # machine à états Pomodoro (aucune dépendance Win32)
├── tray.nim # Shell_NotifyIcon, icône dynamique (GDI), menu contextuel
├── notifications.nim # toast (NIF_INFO), son, rotation des rappels santé
├── stats.nim # compteurs jour/semaine/total, streak, CSV, JSON
├── i18n.nim # chaînes localisées (français / anglais), détection langue
├── dialogs.nim # réglages, rappels santé, assistant, stats (wNim)
├── floating.nim # fenêtre flottante compacte (toujours au-dessus)
├── updater.nim # comparaison de versions + récupération distante
└── webserver.nim # serveur HTTP local (127.0.0.1) : pages aide / stats /
# réglages, routage, rendu HTML, formulaire de sauvegarde
```
Séparation des responsabilités : `timer`, `stats` et `updater` sont purs
(aucune dépendance à l'API Win32), ce qui les rend testables ; `config`,
`tray`, `notifications`, `dialogs` et `nimpulse` gèrent l'interaction avec
Windows.
## Raccourcis
| Action | Raccourci |
|-------------------------------|----------------|
| Démarrer / mettre en pause | `Ctrl+Alt+P` |
| Menu contextuel | Clic droit |
| Démarrer / mettre en pause | Double-clic |
## Pages web locales (aide, statistiques, réglages)
Depuis le menu de l'icône, « Aide », « Statistiques » et « Réglages » ouvrent
des pages HTML **servies localement** par l'application elle-même :
- Le menu **Aide** explique le fonctionnement de l'application (périodes,
pauses, rappels santé, raccourcis, astuces).
- **Statistiques** affiche les pomodoros du jour / semaine, la série de jours
consécutifs, le total et l'historique des 7 derniers jours.
- **Réglages** présente un formulaire complet (durées, objectif, son, langue,
rappels santé) avec un **éditeur de périodes** : créez, modifiez ou supprimez
vos propres profils (nom, travail, pauses, cycles) et choisissez la période
active. L'enregistrement est appliqué immédiatement par l'application.
L'application lance un petit serveur sur `127.0.0.1` (premier port libre à
partir de `38943`), uniquement accessible en local. Aucune donnée ne quitte
l'ordinateur. Si le serveur est indisponible, les menus retombent sur les
dialogues natifs.
## Tests
Les modules purs (`timer`, `stats`, `config`, `notifications`, `updater`,
`webserver`) sont testés unitairement, ainsi que l'intégration Win32
(`tray`). Un exécutable unique les lance toutes et affiche un résumé :
```bash
run_tests.cmd
```
Ou individuellement :
```bash
nim c -r tests/test_timer.nim
nim c -r tests/test_stats.nim
nim c -r tests/test_config.nim
nim c -r tests/test_notifications.nim
nim c -r tests/test_tray_integration.nim
nim c -r tests/test_updater.nim
nim c -r tests/test_floating.nim
nim c -r tests/test_webserver.nim
```
La correspondance exigence → contrôle → résultat est détaillée dans
[`VERIFICATION.md`](VERIFICATION.md).
## Licence
MIT