Files
NimPulse/README.md
T

7.8 KiB

TrayTempo

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…), activables/désactivables individuellement, 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.

Prérequis

  • Nim ≥ 2.0 (testé avec 2.2.10)

  • La bibliothèque winim :

    nimble install winim
    

Compilation

nim c -d:release --app:gui src/traytempo.nim

Le binaire résultant src/traytempo.exe est autonome (aucune dépendance externe à installer) et pèse moins de 1 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\traytempo.exe (ou build\traytempo.exe).
  • Archive portable : lancez release.cmd pour compiler et créer build\TrayTempo-portable.zip (version prête à copier sur une clé USB).
  • Installeur : un script Inno Setup est fourni. Compilez-le avec Inno Setup 6.

Configuration

Au premier lancement (et à la sortie), l'application crée :

%APPDATA%\TrayTempo\
├── 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.

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/
├── traytempo.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, statistiques (Win32)
├── floating.nim       # fenêtre flottante compacte (toujours au-dessus)
└── updater.nim        # comparaison de versions + récupération distante

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 traytempo 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

Tests

Les modules purs (timer, stats, config, notifications, updater) sont testés unitairement, ainsi que l'intégration Win32 (tray). Un exécutable unique les lance toutes et affiche un résumé :

run_tests.cmd

Ou individuellement :

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_dialogs.nim

La correspondance exigence → contrôle → résultat est détaillée dans VERIFICATION.md.

Licence

MIT