From f071527d159131fa9b3bc308312c435e38b22c52 Mon Sep 17 00:00:00 2001 From: grayTerminal-sh Date: Mon, 13 Jul 2026 17:27:45 +0200 Subject: [PATCH] feat(gui): connect investigation model to sidebar --- docs/tickets/closed/TICKET-011.md | 240 ++++++++++++++++++++++++++++++ include/views/main_window.h | 16 ++ include/widgets/sidebar.h | 18 +++ labfy-investigation | Bin 58664 -> 63696 bytes src/core/application.c | 58 +++++--- src/views/main_window.c | 16 ++ src/widgets/sidebar.c | 54 +++++++ 7 files changed, 382 insertions(+), 20 deletions(-) create mode 100644 docs/tickets/closed/TICKET-011.md diff --git a/docs/tickets/closed/TICKET-011.md b/docs/tickets/closed/TICKET-011.md new file mode 100644 index 0000000..cc14b62 --- /dev/null +++ b/docs/tickets/closed/TICKET-011.md @@ -0,0 +1,240 @@ +# Ticket #011 + +## Titre + +Connecter le modèle d'arborescence à la `Sidebar`. + +--- + +## Objectif + +Relier l'enquête sélectionnée au panneau latéral. + +Après la sélection d'un dossier, l'application doit : + +1. créer l'objet `Investigation` ; +2. construire son `InvestigationTreeModel` ; +3. transmettre le modèle à la `Sidebar` ; +4. afficher temporairement le nom du nœud racine dans le panneau latéral. + +Ce ticket valide la communication entre le Core et l'interface graphique. + +--- + +## Architecture + +```text +FolderDialog + │ + ▼ +Application + │ + ├── Investigation + │ + └── InvestigationTreeModel + │ + ▼ + Sidebar +``` + +Le module `Application` reste responsable de la coordination. + +La `Sidebar` ne parcourt jamais directement le système de fichiers. + +--- + +## Responsabilités + +### Application + +Le module `Application` doit : + +- recevoir le dossier sélectionné ; +- créer l'objet `Investigation` ; +- construire le modèle avec `InvestigationTreeBuilder` ; +- conserver le modèle pendant toute la durée de l'enquête ; +- transmettre le modèle à `MainWindow` ; +- libérer l'ancien modèle avant d'en ouvrir un nouveau ; +- libérer le modèle à la fermeture de l'application. + +### MainWindow + +Le module `MainWindow` doit : + +- recevoir un modèle d'arborescence ; +- le transmettre au composant `Sidebar`. + +### Sidebar + +Le module `Sidebar` doit : + +- recevoir un `InvestigationTreeModel` en lecture seule ; +- lire le nœud racine ; +- afficher temporairement son nom dans le titre du panneau ; +- ne jamais détruire le modèle reçu. + +--- + +## Principe de propriété + +`Application` est propriétaire de : + +```text +Investigation +InvestigationTreeModel +MainWindow +``` + +La `Sidebar` reçoit uniquement une référence non propriétaire vers le modèle. + +Elle ne doit jamais appeler : + +```c +investigation_tree_model_free(tree_model); +``` + +Le modèle est libéré uniquement par `Application`. + +--- + +## Fichiers concernés + +```text +src/core/application.c + +include/views/main_window.h +src/views/main_window.c + +include/widgets/sidebar.h +src/widgets/sidebar.c +``` + +Aucun nouveau module n'est nécessaire. + +--- + +## Interfaces publiques à ajouter + +### MainWindow + +```c +void main_window_set_tree_model( + MainWindow *main_window, + const InvestigationTreeModel *tree_model +); +``` + +### Sidebar + +```c +void sidebar_set_tree_model( + Sidebar *sidebar, + const InvestigationTreeModel *tree_model +); +``` + +--- + +## Comportement attendu + +Avant l'ouverture d'une enquête, la `Sidebar` affiche : + +```text +Dossier d'enquête +``` + +Après la sélection du dossier : + +```text +Template +``` + +ou le nom réel du dossier racine sélectionné. + +À ce stade, les enfants ne sont pas encore affichés. + +--- + +## Hors périmètre + +Ce ticket ne doit pas : + +- afficher les enfants du nœud racine ; +- utiliser `GtkTreeListModel` ; +- créer un explorateur de fichiers complet ; +- permettre de sélectionner un nœud ; +- ouvrir un fichier ; +- rafraîchir automatiquement le modèle ; +- modifier le système de fichiers ; +- communiquer avec SQLite. + +--- + +## Gestion des erreurs + +Si la construction du modèle échoue : + +- l'application ne doit pas planter ; +- l'ancien modèle doit rester valide jusqu'à son remplacement explicite ; +- un message d'erreur doit être affiché dans le terminal ; +- la `Sidebar` ne doit recevoir aucun pointeur invalide. + +Si une nouvelle enquête est ouverte avec succès : + +1. créer la nouvelle enquête ; +2. construire le nouveau modèle ; +3. seulement ensuite libérer l'ancienne enquête et l'ancien modèle ; +4. installer les nouveaux objets. + +Cette séquence évite de perdre l'enquête actuellement ouverte en cas d'échec. + +--- + +## Contraintes techniques + +- C17 ; +- aucun état global ; +- aucune lecture du système de fichiers dans `Sidebar` ; +- aucun transfert de propriété vers `Sidebar` ; +- documentation Doxygen ; +- compilation sans warning ; +- absence de `Gtk-CRITICAL` ; +- respect des conventions de nommage. + +--- + +## Critères d'acceptation + +- [ ] Le projet compile sans warning. +- [ ] `make test` reste valide. +- [ ] La sélection d'un dossier construit un modèle. +- [ ] `Application` conserve le modèle. +- [ ] `MainWindow` transmet le modèle à `Sidebar`. +- [ ] La `Sidebar` affiche le nom du nœud racine. +- [ ] L'ouverture successive de deux dossiers fonctionne. +- [ ] L'ancien modèle est correctement libéré. +- [ ] Une erreur de construction ne provoque pas de crash. +- [ ] La fermeture de l'application libère le modèle. +- [ ] Aucun code de parcours du disque n'apparaît dans `Sidebar`. +- [ ] Aucun enfant n'est encore affiché. + +--- + +## Tests manuels + +1. Lancer l'application. +2. Sélectionner le dossier `Template`. +3. Vérifier que la `Sidebar` affiche `Template`. +4. Fermer l'application. +5. Vérifier l'absence de warning critique. +6. Ouvrir successivement deux dossiers différents. +7. Vérifier que le titre de la `Sidebar` est mis à jour. +8. Vérifier que `make test` reste entièrement valide. + +--- + +## Commit attendu + +```text +feat(gui): connect investigation model to sidebar +``` diff --git a/include/views/main_window.h b/include/views/main_window.h index e67c781..0d3e65f 100644 --- a/include/views/main_window.h +++ b/include/views/main_window.h @@ -6,6 +6,8 @@ #ifndef LABFY_INVESTIGATION_MAIN_WINDOW_H #define LABFY_INVESTIGATION_MAIN_WINDOW_H +#include "core/investigation_tree_model.h" + #include /** @@ -40,6 +42,20 @@ GtkWindow *main_window_get_window( const MainWindow *main_window ); +/** + * @brief Transmet un modèle d'arborescence à la fenêtre principale. + * + * La fenêtre principale ne devient pas propriétaire du modèle. + * Elle le transmet uniquement à la Sidebar. + * + * @param main_window Fenêtre principale à mettre à jour. + * @param tree_model Modèle d'arborescence en lecture seule. + */ +void main_window_set_tree_model( + MainWindow *main_window, + const InvestigationTreeModel *tree_model +); + /** * @brief Libère les ressources de la fenêtre. * diff --git a/include/widgets/sidebar.h b/include/widgets/sidebar.h index 65d08b7..8171f99 100644 --- a/include/widgets/sidebar.h +++ b/include/widgets/sidebar.h @@ -6,6 +6,8 @@ #ifndef LABFY_INVESTIGATION_SIDEBAR_H #define LABFY_INVESTIGATION_SIDEBAR_H +#include "core/investigation_tree_model.h" + #include /** @@ -37,6 +39,22 @@ GtkWidget *sidebar_get_widget( const Sidebar *sidebar ); +/** + * @brief Associe un modèle d'arborescence à la barre latérale. + * + * La barre latérale ne devient pas propriétaire du modèle. + * Le modèle doit rester valide pendant toute la durée de son utilisation. + * + * Pour ce ticket, seul le nom du nœud racine est affiché dans le titre. + * + * @param sidebar Barre latérale à mettre à jour. + * @param tree_model Modèle d'arborescence en lecture seule. + */ +void sidebar_set_tree_model( + Sidebar *sidebar, + const InvestigationTreeModel *tree_model +); + /** * @brief Libère la structure d'encapsulation du panneau latéral. * diff --git a/labfy-investigation b/labfy-investigation index 6a7dc5b1a3069519e700542a95303197009905df..4674c74d27b3ab9bcca762be6fcd8b16df7f3cb1 100755 GIT binary patch literal 63696 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 literal 58664 zcmeIb37A|}wLf}JRh_ESRn^_qV>)vsWMW8XBm^YV89M0>oxu!D0+k*rohF^`&|Mu8 z1PO#GM3kT)dUF-7iiju?m5X68f)a3yUM}DqF=#iS#y`l7sO0^AYwvyPRCN`4?|bil z?|Yx8zdn1fwbx#I?X}ikdpM`6u4!yp8nA84TtVyI7NOOX6sAEJ-1k$RLDFE&x5{y! zVokQffJ1^)vX*%O{zRU{eVJSCN=$g59*2ibot*)w3}ILbbH0@ zZfX0NREsS(s750!Ubb?*_1ufMY`^aPXSH2^D0urzpPu|$`b6j3GrGIl=FOea-7&qp zt7l;Q^zHNKO`kWnzQ4DAwv1WwGW`CYyr%p*D5}x`zVtEV3*k?L{}sY_z>f>ze^!Lg z=Znx^fDR;ma+vJ6B77!*&qPDyOGkrGA$hhJ;q&7ndbkA!Da7ZiMfluSq+ibzp?|sv z{h}iBTvP=Aw<2=xD?&e`h&*oYVEW+nsi?n-A z5k99D@xv`e@a0AL&n+U)mx|E8T|}OyB6g1#;r}_{li-zq{kaJJ<3;qGDMnvJ59uO& zjuz=}ph&+~L-0az>=Q-!|GtPkzbHcgRFQtYP(+^UBK$`b;cs=OTDNZP?rLw%boKV6 zI@6g{X2;ev(A~YAxVH^-b$6sTc6FzFTDK6*tdMPO&1~|+?VCUeM1Q8QV_+*XTQhyB z*1o>h9jTu56{#z_GMiEx`_k#u#(|!8(sgzAw05W3dwY7)?U__ZYo-<0bYEX@UusKh zrhQYoAFwoc`9QjFhstW<$jFpt()}5er~GZL{YKcWeO*0XSy#`-UXfgQYDVqd>DE5g zDtPp^T}D|3div5E0d8sS?(S`$nd%{Xir(LKWtx2y4(!!N2&)y5?QUyFhm~qxw<6V% z?n`%e^=Hz3>sBo8?(IphYi;ZHD^L*SvR${v9}u? zmD0A}?LHUEZ9(%&_dtOKOESIi8kBUmwxzr2GXnX&)8PC)%6crSZf)&JcSt9d9<@*A zHn%O?RYh;uQhGF3KtkF*)t81J($&DuFVz)YJsrJQcmii-*xK9Q#Ze_S{4)2aeTsv9 zdb;{Cl)%r0CqkS~?(Shl!-6TE%1_Mj{QdzH&8M`hYE)VRBRptWzaNaAy- zZRzc3WSG@9`OsM*a)r~X*$T5E2F>P;={cit=&SN<*a)@+^`7Ict>Auzs z!a`4aJH`g0CF=OyrEfsO3B#zNPAgUPrM(g_Hgxr;`gd%>z655G$PChS`{q@&6tYt0Dix#J5*Uy>jWwW{2^{3}A zI{;$=kaJ<;{9m~+apSVFQ~ghDkj=jLD|_z*6taG)an)U2rQFTFqTzv2T{tNTSZ@H9 zOP_0){dU7-g?97s$0jL!U7IdfiDlq}DTN^0h%RIDj1RAmXr%P853i4k1plHBKVLBF zcEpEo^x>@y3SgU9`goVSL1l^eTPWef`z=-H!z<0I`bi%iODOM}=EECRvT&vkZ*)rh zd>=kaguWU!s0`(dX&jTL4GJJWuCj7py+HxQ!?50U!3LEjzRbf~)&?KG+=t)f!yDgW z@m3$cf(U(W-=H$&?_a;}^x>-%iQI4Y;d!27uG==K9Qo83B+|P!D1i7{m6iM58x%nN z2$hxleH#=&Jojqm+P^{Nh#zH;NFUjt0OCihtlST7Pyq4fjFXsWHt?=|d92FH{qP0_ zke+8D=6Z31$`L=_Adw!~pa9~NDl7NF4GJKBg38MM*aig6O1-_p!w>m?23;b_{xy2c}P2i6c z=GJCtr@*%p<}^FBRp46)bBi;yLE!5MbBi~$THq@QbE`AdAaEby7~z=$Uq+Z)o1vt@ zZG^d{8A=Fz5n*m+hAe^C5at$U=-AspOkPfyTbH3D0xu%WEz8hhfzKk$t;*0rfoBu0 zBD`PVQwVcwGIY1V6A5!mGIX23qX=^=GPG0RO2XWN3~d!SN|;-Zp$!5D2y-htv|8Y| zux#4IEyz%V!2gFZw;n??1%8Dvw;V%BfnOrbt;SG7;GYm4N7xehM})@{KK3{E|J#I< zgpUaPB;g5!4-0&N@I=A~1%8Myw+=)51-_p!w+usf3;b_{xm6gtP2i6c<`!XSr@*%p z=GI_ntH8Gq=9XY+gTU7j=2l>6wZK;r<`!V6LEt{ZT>1~q6!G5ffo_xQhw;Lz-JNW5`O5Qz_ST+={~ey;8O^5 z$v$+qz!M2`sXla@z@rFri9WPb;7Y<=nh$LiI7*mD6hj*X4iM%NeQ347Z(%vTiA(dL z27&(%VJ^vsW(xcYVJ^jok^;X(82{+Mz&{}jp6I{8KOzhtL;wFG_9xsx_=vzy5?)C7 zFkr@$S-)%E{liO}cE8lL>*%r7>l$Yrob_zetqb19pgK{r8KS(gvA%r#^{9e?bL)bS zfkD%)&h1RjJf5jRD4GHyhN6-aN6N?VB;8Xw1$~#$pWepg) zu4DG~2QyJ=V(3#Se1akA>#RKZ3^+FJZahxs3}s<=0d8 zrb7qOr4voNj-SYkX*%?z0EXf2=h^3@@U2(1*k}cqi4?$Badb{a^jYdXz;`vt|M3XP)ZIErTF6&?RCzeabxrks5Dz!A_N5y$2DDZl<-l*q=f zGL^!QP6ib`fhqUZtAUXr@i1Hs3V~}c@>Fhm`79<+cz%8_+i2Ib{VX?wr62wv;oXM> zb!+L_w8icxn|6PH@D3~=vM#|vuWk1Pda4KEVsujaa;q}{0labeUizO%8c=P?Ae`^_ zTq>aNQ^8xb{OTEo2RYul;PaI6*3&1T!G$th7YbR^?jJVoev4Xr{7ts* z8;aEZ@!bP&H0_2rQSBMkii!;piAJy158fcXQKKD2YMeBX+3s)95%)B{u^YDk!C)M? z0^>Z>qXboM{U;1C4T~+8z_}GHLEArEAEO)jMtK3{b6wVWe@E7_IkKkEYF5_#*pU}n^f=i) zaMX(!>`f*H2?o{tqNjs<(XA(vUf;gc}b z-V_1Up~01?r5vvj;iG{(fOW;G)`MbE9eAQvL!Friq#E2&S1V)rp7lp}%ZzcXfJV!& z{{Y#l=ub9W5I{cge1fwZ8$6%Z@;OD}(ElZB*Y8WmUeB#oz?ZJh)dbK0fnN z&R4~J2v%O?PjILq^3xC)XAxx&y-G;2lb}X_HD-l$`(2I4jK4BgQMU}=hG?3?G4QPx z9~Is2p)F+k`yG1VUs2>pfEABYERCgGmDLKFK$hJHo6c-J)~8EGdem?Vw(yOYu;Mxl z7s;FZxRM&i*TV_lyc(u)6S@+ z=TsdVy1+;H3JZ2)q~?$IvE*s0f5cyXim&>+(9zwE&+WSUxxhflp~l1P*Q*g^Kx6G$ z5BoI^Dqp#iQQ3=uIo#*@xj%!7GK1}DgjvMRMqxdoR-`9`ADr>f;7M3-`UQNQ3fG1k zx&bV9U47UZxRjFzs=&s=XoWJ1j#Z=l3?A|^cy*cBch3s7`q=$_w)iZBxViBM;0EtM zGh8Sy2Qc_Z%#;|~VmO)d#0V=@og=Kj2>J4d8-L)%sMYkvj;1}K$=rQX zQ?m}59w9vfWFgNHjiVj7DMR%mIidPFWhrzY%X)YOxN2w8ar(>Jln2P&3xM;E(Wu|u zb@g`xnOf6H)>l6KexLnE|3SDaM;8f>C<&JNBd9MFqVr;kKC~fA4$;O}exKFmG_Ro= z)lhaotl{d0&gzTK1$fuy@VD>cfU%mwb)t85;)m!POE9fXNlNkGFa8~7U7Xf>i zA#t{35MQw5Ok=N!rAhvpuZPOGmFsTU7fqmsEFZVYqD&3M<)-OZ&r_?dy{3ZIkv%J31J~oK>x(em?rwa82=?PPfLMNcZkpgUGq_I7uD54m&)Z+~ zi6BHpj0CPy;c}QIyXO2ds+&#FuGcsgo~-`( znj2k}bq|8hShrR=t%`Z&H++abpsl=Qa5p63sj9F}okSQP7i&c67 zAGi#ZpgN+Wvjkw|6AHz>#nWF0SL?)&jH8THt}nyjafFSbohSym*nJFyLFZs_kK<^S zcU7VmI!dJ{epp21$F$1d1~*YT5QhdEUd?*wSB%ua&*v&1)`x?sSOf=K0$R@nX2Lp< z4j#69{fkg{&LrkLDEQSLTvF6=yg&#`rVvl|yROE7K@FlR&4z(5sC-cRl^aKH!k3h-UaJuX2 zXT0hC2^=OrF%zX~>HZV)MA#ghMHTIS3eBR;LxXM9-tJ#8`%!6@o#LJg4k@eJY_I`C z6>Qp(GZeShd>W_7+Aw!0!CCddE%3T021yCl7o!)l98khME_z{0i(GM|!5DQY3SC6y zfVtz~@qEq?f%u8H=rj=VTckT!knR@JiF1K& z1?lc8NY_R>#%19L`3AQZq&v$`H=T4%1?ejNbnDsQTb=V<#r|GuMHwTh6_)hcewOT% z7L&4Nr9d5IkdOQWn(&Z(ghI;u3n6Pfo);trH?j5IMxU;>RNHTemGN`F$KrzI;8_K! z=Vqx-_NXQH!TOLxW|R*}H|YF#m`5Vg57N%v!~zLHzc& zYILK8hH2EywOqXvUZ@<`5^q6YvS$kqzU-5OK?_S8HJAB<>T(cqboipeXO(&3!~w{I z!05#vpbicG8J1Eb^V_tUqBy`qP|u(5ActF>cgx5-G`Nl0=E`~ZB2F{l*x-8p@-d}< zg~S{vUNBdwJ{S3QifXDG$}0;YUzP^h&;{<`e6cnC1+cO0oTKcvxXUz;gJ)*n<`@F$ z%`qx_8@&WqEm%`wV?5{Y*yP7xpS8(owCnjsu1&a1S7G_#UsJdon^cLGsKSCac@(~( zZ1MqmiR!AS;)lH+X4m8|K`T#CiK@vj7ch|t;9~U)y%tXKT7VVdqhhfC@S5-;%gFRr zXO%?wLxa84xpIR9&@CE$K^9#H^m{aVVHV9GLt7>WyNQ&sFRr28e&b8TiZS0y)hX(_ z!FLy=o}ZCJItVv(zV;RlME7m&8VSUiI@|d4l}NBmRHIt9GIJtXF*t?TS}< z&&Rzd;;_&Ek1iW;DL3}u10$Jqy?Qs@nmIGI2p>&al3v1(JmJ$#yw*PTIer!dpAt#7 z_Vf&NKlQnEJ(fpS^A>!1q`wOv7fN=dlkI)L_a(chror;5`!ng}Q+Fq~;*&yMeaVi2 zWCux6-tRH%dFpfZ))I~GYi;l9Nhi-rPVSFd6oD)|AOx89YjolET9X^oJ!r2lo#aQU z+Pk*4cBkvD_TDY^_>|7Z9hu(V?*96&o^AMCOjoCTgv@G1Z??5&($YPPpHk>(?dv$} zEPhPlv@FQaU-`hU{^{m(4pK2so?d+1p>LoIa&%8^?Q84Bhe6uY`1pfJ&kDKpK1EP% z?5)xebs+q+dhY?nK#xb!;py0FVHcClIlWsr&^`cNdUog?*p}`?XN|6X)uo;P4i8rF z%XMY4cR-o`N=TS(lyvs!;Jf&le8%E~KRCTH()*C!hV&Vvhmj5=XZO|F#q{%6l>Z6k zKh3HCyjP#wuKgGr_vVz}+f<$O8Dv)>jeR`y5vAj*^ea=-m``3I1C^@BGB$U*FnvAYgqx;dwOiC2C$ z%CE*)zSPe@aG@vP#VCIi<&*v88?y3Uh4O0dS<@7qpB+3_H!=56Ur7x+1z}{F{RKR;(Sy#mOjd&S_^!PCMTP z&2rHEKEIu#*>;YBrWz-lh1#Lb6Nr~pC@4DuL?uxB+7$}=SP!X;2!J5 z2?k28WeiLm@{#4-pQ>_+r-12J_)MD{LXIL^!9>^!)&;BzeheUhx8=ci=fPjegTIvr^Rv3Vct9anQYCyv zk5}>>m5x-2WxlU$w1%++lxviMWs#)Tg+!V1KfQgTmoV4UytLY^`xszxX)!FWvw3N> z_u*Z>sLiWRB{`qfBuZDa&SYFiUlM zo=!LFbem3Z)aji%y;r9X>-1@zKCjc?==4pUh9_8Z)#`MLPUq=#sZP(+=|-Jy)9H;m zy;G<6>hxiqKCRQ|b^05fzNypjMBTnlr|5K^PM7NRJe_XT={B9-sM9-jdaq6&*6Gta zeO{-((dnBy4WFdj*Xb0U&eQ2qot~%DjXK??(;Ibqr%vzH>BBmGTBpzJ^fx+vQ>Woc zx_zBa(dj&$F4d``!uV@bxn+wNpOu`3mBz`*S@Y^=)z3=Ko;iEo%z3j+dMfP6P%;e^`!XE2xLR#`;+{QnHn^p2B+>*??Xu;tdQ^Gm;@`(2VX}ghS zNXkMEzZVGv_kh4ogvLQs+YY~%B({4YlYsLY%L0*3LZL_tl3)wyLTiOpxf}YPkcZol zxXg#1BMq(X%uNvC{(^}2fsb=W;yUKvWPX0)56Ii0&?3xYwi`MLT!W|J=4>f{8YQ7u zcw=42y9h}l68bWdaHE}K{g1H3c^uh*a{~8}b0sjY6CtS;_EVb!5v1*xq-Esng@tsXP-nyEWW11r)fb3|{s=K3Zyp(T+W#W)7Dt zPA~#sV#O^0Tt~z`sro|z5>{A^2{vzGOx%Pdtj5GBH6}p7F%ec{BCN(lSdEFW8WUkP zCcM zFw^7agCu+kjW}nIB(uN+kltA^^6Shu5r0m_DvGSeQ{ZhDH&jqvVKue_rx3NJoWlyo zdbnMK+Zc3w5qYdYo8c)FJ`7x03-VPCn~co=DG;I0paDC?ml^`0zo0M_>IE}5vV-vfmEdHZCJ>T-Swr~9CNatswq z`AvWBLfW!qmrKWR)&MBEG0OO3IXl6&Jt{2}|~2Bg(@qT^9e z@)KnD#Li$gjO+(uJSi>tS1`LZek!vi$bPWmY49vLfb54Ve#C48vbV(-li)OD_m-Z= z>;Y)#_OdQyt?_rD#Y%8Y-UJAbjQ$L==!!ApfO3x`pNxLN{SJUg8`QU-0+d^k31IML z=I!!GGy3)w$tNQBfbgr#2Pz^pz(35qTNPP@M*dxBMn`@Hnnxr*CQ<=D2P8i>QV#x) zNq$`9A<#cA`SDIA@X@c2nMHkyDWcyRN6{0`r@<+DXez%qwayBBkaR02zW}6rEAolx zXWbJ3RGrUNN_QR3h|&8iW8`K9P9TY1TyZ5O{vbP^t{4GSa13shr{QL^md%_Mq?Us7 zSi%+sY3~6$TLit0IiZ$@g49`6gd-&O&G&;obQCgKp|L>Qq3O5>tiWf1iak@ELUDlK zvKv2m%ALr&?a0@~|5`$ycYc9e{OwBmh*d!&#BIBhO}Z5ivM69z{+8;n0*uA+Cxyj? zNQh0Bjtbkfd+6J^VNyf0R;U|1>`*I32z?U<2!$%K5O712flq{929son&oUZ97lQxJ ziSm5Hw#x4VZRyG3YJQ(?U@mTD@0!sFI(H88$?|%43jpVO0Ohk{w;-{c$HA<8PTl)a z01F*OQhw@!9Z1T4ja!fvf@kvf8mM*jFcITQa7dgp?XxI$cd&(uF82ojq=kyjHB^pj zp`y1Y0@={QXm+7t+D}<$6!OW++3uUBPUYOve?cC?KL@cY=1vQsQrUkXA0$nH-(OWV zWhx)fxUb`utUB3cFqa0aPEAly(8hrZQjox-XrX#^qM3-5xK(oJZ~qNM;s{U@vNefu zy+D_;tc-}j>8M*n6V``oirD4`86X6)LsvC>>;~^F=Q6{ zqg;3Zkj=rPK#mrhPHe@e;x=M=Y_TD=;#|&*Xo+5AFg90tR`f97s^yhb-~fw6E%Zez z%7x2_jZu!1+gK#aEZ(g64QR7^TKEB?=Tqzjyvc})?nSnCYMkgNSQWgh3Z}VmaFC&XXEILh!l3r2#<4{ket6~8$ zq7=?Zk{e;w+yKT{YE`_)l#Z~XT*=goN^q+0B$`cGajuAJP73cJhDFw-iB#!B;q&yy z=X#RiviIE!npg!Se`pf3Tq6a!Myh)caCghR_~(;_)|}&@(tnvs_tff2u{R;yzm>|& zy|*J)3W851=o(l)S#{5$@P;yyzFYHpRIvoFsaO*wD8NmXMu5rOr`VU4UOi1weZwQ( z3gQ?SJ}FuEfO+hFfHuhF64<+17`1zhru3on_RLbVu#(4pU}o=&RY0~`6;xMXZ<8>Y zt(i0klhZYm3ldz!&C`?{65MT^p`lHd^)~Fo72N?y;bvEKi(mk*=<+w3mx0W`NeR3> zVkyY<3+>4Yw!}W_$8Oi`Y@A2e<%ic$9I1P%$Cw-9h zxO3=1NoWsliPKqicDP{<0o2qTK}jOKpJcTO29-K)F`olTXq3$) z-h-iK#m~dt_Pi?!2ulby@lJbX<2~$1h3nLUy>=m&d1owcvPlllO%UNuC4!6n@EM6U zs3e=@@chJl;loj4-Z0ZkuytwK*}n7$FmhVt8_I07oLp7Aq(x_&PR!$vP<@p+mSe*n+K@A zfV5OX-*=bC${@1F(D&Vz=wyRYz8@W8{m0{MwSh&#V+kOu`XGt|W9(W=cRtJ56DxWK zYkVwD!Y#yZ6D&uJyD`ev`QA!^u-vT3Vp#gCqaFcvdp#K7O3EGG*+*<>D25gCIA-bj zjs%oeRQjAa-%?#^wpZzQrqcahrN|V}e?%I2Wx67iNA$?r`%Xo0lSb|^^r2s)6L-ex z+kw3stkMqyygb|mx(;3YMz1wuL-f`@aaM>Jx*z2I8rlGtl1+5v_b_031iiaaGsy;q zyNw7NjR;ocEpWN8bRrZrWf=WoLw}J+U&AnEFAncKO^J4|Cn0|rLHf7ENNANN!F*&j zN0%As6pWX>Z!?B^h$C}U1zSh(2ytkRmXR6QyRMc7vB#MXju3j?YPn)!*{4<3aWzVd zStDzqp1|q0&2b(ah4;ef;cwh-chFzjyi>K)G36cP9XwkLW$0qwPY+u4tn0IaYL^Gg{o~x zDwq$wP8vEkA`cO2;?|L81qX)^|z~U0VGu@C!YNTb!p9F`QET7`)>=YryLKX7-ufrbYBVll-kxv(MzYqg!hB znKdX&XiqAAwCn|d!84#i9I#*@;PBvqQq+B-n*2sYLbO}ywRRczyunfwS;1eEF4zD? z2Z9TM2?ozYJ{0@~?oROc;1#yw*OJR_JNRp`30w@IY}$-@;1PQ-^2zek+)DvOWTROh zyAni*OoiFO-|%{Y%EFGx_iH!$+I0CutLYmmlr??5Lj>w_a{olhIIO`F>E zP|N)R8M-5%Ko|- zbafn;+(bB@+ z)eiU9@k$Y8?}HjelWW@vRQTC52@)qwoPrUc=-ub>KkgE!&BSv@?Z;{B}4Sv_)U z9e1*&9Mo!Rk4$$rumMi(kr^_ZTMno8$V_Q6HYKeUNl<9$^9YwkHG4wozEiToZ6$9+PTjF5vTUA*tICBR1^D55>3JgjACLZ z0M5T5d)AiOJ$CSvrO2z`7q}Jc~R>m9fPcG8v6TUZ&*uv>BggBQhnIp62oxRSrr^>tn2?PG(DI)p6Ful+5Wh zzI+BhsT!5(^-gkqB5@3e;Gb}-ih|JIjhrnx1{5p!K^A|KH#Q&>Z|NzMCxbM~i8nYB zxsX~K8YkkpaoIW3no$yybK~+Z_i_LtUHRr3szXUv-dpoI6zFr~vW96_vyPk_CuX~M znL3HNr3;Wp^E@{$pF2&SJIJ{)X@X>45urO*oc<%^!{0?;t?zh>@#5juxsv92ogYa0_#~twvioKH~uXW3-N#>rmB-&;?7nDtKOQhk&s;G$l92 zN|d0H$bUxJm-QszGhLh82%AyIDz8Q>6=%D|Bral~`YYMawWJkYiQB1$rlLaC^4N!2 zCNf62wyJ80-fu8!Z8etX)q(ehzkfQLz%wzGVCpYNH(lON$@Ded0CRUe5 zyi{z6iM3=Zgm0~;7?|8keh#Q@6j^Ya8Kei))B`td=3Lc)yoQdfz3EuAVYarT#{>UC31($oyy)anv01!k5q_+d^i34raaIF$tP zOL#y#J4PGv=%D6Q^k&SlIZB=el|Y^!P#(%ZW`U7^TsJ^CKYM59uE}17@%WJ`mQu~K zseS{&iL>8Xkfl01`(2CLTnFU8I`cv3xcJ_`O zew>1GZVUP5w$S{7FsZpb5(&IYiLV3M~r`0=}eix6YQAGIz!0G3=zf#@CE_E zFN_V~NVHd>Hh?@#E9Wc`#w>9HM0%D8V*}VgGBrwac(98kda=xjb(+b;w%tuGzpntx$Tqxb zZ(C&zU=#hC9bAo)0B4TaIn!=HUOjP)ce!5xAiaohuAzcdFXFv5ub@EB9I=LJUt=Aa zIZ9`{oF=4B>Dom`oo(CYFyK%ce~I3-ao*W7)}WEu39Al%1OR zGF!ERe?WPV(gf~C2g>Uwp9UKDlgKB_XSvHvh4MM3$s|w#zN?y;I_d)CW1mGn*g`A= zXhqrRe&kEraC3>6X-{;yf5tl*P|c*oXymQ%mr%)`oM4yS@I%n5Jw<>-xP}^>n)nOI z>cXF4$uucRhCj+WCzn}J=QJzu0&G-SQFjD%rQ{zYBCraIuc{dJCb2IQOGJ>lAc;bZ zz}3rRd>U`dt3V+};OdrWy}_sm9I8dV${FDXqS>Mq+D+Co!W<$trL#h>LAuh%qaDOZ zw?Z!v^IG(M24k~>R%iqyFW*plJJD3BLdSnjbYm$8Tgge_erZ5vKi08V0BMyx4t^H~ zzRh|*>|fB+b%7&!*k1y>D)43=_B&8#V;~MgC=T>^E9#=Pn$t#*=R_7U{Nhy~$dfp? zln&qB5_XX>OAyi;E`x7m2I()x|K}kl*+c)hb}=+5^GEE@R&#kL;N1c z#F?cJcxa`ti;1o;eJU3n50UpNqOj<7$X88@lm2Cr@n!}82(jb$(o%JC8Y%isx``s= z6Ly<7EBI5A9Y-UTbx~Tkrv>;R-iM9O12%D5DO*mlh{NBC zE<*>)mkIVtgH=`xO@XMTFGTrsSK=pv)@8TRV>ZOU;FXCfMsnE`#Zy?R?ry^uYEd8yX}(lLBcZvQ#_K3!#w zSLKr+t721so?==W%V+KOX{ChCTr8hzLnV7(6*so0O=nNJ6iKjdeTAyqlsJH{&yXO& zN5dDw`ZG0jfo0u+4s+h;X>vt&-lx?$@8`b)8v|Lu_uNjOi3ilKw^GgfAmFYypwGnB zt~a1|y#clB4d`93@AXnW?^n42y~+JB+7EpkH+dGO=l6hq*-hgU5ze9#aB<8LX z^ZU<{m$%wNKSa*u4$#c+F86?(-)%@)uIBgA$d;J-{kN!rI@|?vexF7%HNP(+nVH`S zK*TqAWBsU{>|##e1;EVdEU-$wcXT4nj)1Eph}m=euyIb3FNVpB&H?G&#ena%~&x`GO-P%Cy1sLws4a-b{I*Pp>G_( zHZ!(3zz9x2vBpvY5j6ot-%S$MRPiaIW}xW$JhYmEqTP9DH3vm^<)PIi6#ck|rnRj& zXQ8swMzFR0ERxU{`7W^GK>WKNF=q-TO`JhCwycyje#>&&TNiN;S-LSw6$M~TU(BoH zTyA%Suhnm_H-m(iy>A8x6I@nwjA53MD@5arh#erA@61tC^Krw}WyN zClq^3l&nlxIgK5awnoeHWn7tR2!ZKeLB_yTg0_5tiN}cyO!@EHpM~Ad|9)WdZAj$d zz21=gj{+7qBr0HWLlW@^tcVF%+>q#i#l3=S0v4w=)G+~z8xkF`xCe1fz)~BM5H}t6uKVU^j0xF%r9Cd7RZTF-7mOu*v)qFBKCJ<7rou)-3s!V<8;60pJ&u)-3s z!npzKtElD+SUiCXOTY@NfE6(T>n#wPfHebDB_?2<4?qr`5U|)Sb?AhE#n%TAu;eob zI$&)AN(C%_Qr`qDe(hR`30NNkAnXvZSQVP>iK7PbVe zssv@RoVPf>ss(TziC#4VBpg}4*9uVQ43cbw07);d@k{B{O5DV?sRol9*Ca4eSX&zP z;u;r57qLoqg=FFyoyG(iR=SF05@e#`YJ5^5z^87)&Zaf3sESkf9UKmI&LlOtHUq6o1F2aMEGT}u!j`r+*qh;qcCZQTafU+l9 zvDmv~K?WYjYDV2)E#9&}EB3C~nK6Q)aw|5$WzLy~f-yK*!8sc!CfJH3P=`@fZ=W;L z)S5c7x$5kZHfp$2gkuRlT%qYFfaiR$i0TRxB4jdkq@s@*ELl$|C8G+vGSX0YrLc=v z*pthuVz=3`y>>V_e)M=2CPu(_tL$J|ET)8J!)3Zxc)C#z`O#n^WWPHWL+e?h3J8v; zm^qTG=B|?Fs&b2rEUK`2u1`x;K}|hmP|UM(D_XoODtZXyYBuO;He@vGh^Dmesi$z( zJQ1bEC{=UUe#$~IX=3(u@&V#7=r&+V-;NU1VlSrs~aHYTic-2+GY zMnaU}cZ3Sv0U=-qDr@YiN}FPU2_bEP2{!FiE#gmb&zj)A%Qv0!;VT6J9w_(X1@Un>>4McKg#m&+fT|A4B7 z4F|^?oZIM;~siZa|Y13#mqLzF8|fOv1v$AFfnP_4V8>-18FS?s*ne zW*t5Ta>FEEUy`XoWT$?MjfG)esEp?YO^GlSYLr%bp_6)3ZUcoEo*=8U{!pWgUu%Ng zh~Y7;j!_k68Xks6c}Veq?5Jbt8|@EN*&>)SX0OLAU1%73qby|lJ|Rjcprbg$%oQ%y zzew)Pian>Aulx}!S9EQ;T%>XIc%j&BhN3rkO*mrD{@w(ib;99OyzyBRS9AkPLRaY} zpav(^Qlix2!~FeV?0KG<&_!PpqV$}TIpoR<^*As58tqgRn#r^7C`@H0uQGFg@p!^@ zA$!8bp3x_LskWGZ3NKkfaT+XY7Dai%$k-=lyuYv;>m^-oh$_zyQ3aNEUcd=^ z0jJW8T5&LXXO+QtimEPV%9^YxYn3Veu?Y3)2zA55Q(j~;-Ok1)2$Sngd9Gk$lbW!{ zRrX78#Cmy2K@&%PDPgz95miy*Uhz!TGH#;k<&-iw_Xq>nSE1ET9=L+=|&WaLuP@m zyXUu1))&xJcImGyoArpCLYi;1UQVDOZ#e%W_RKe9*o<5=51~(ts&4+MD#^E;8NwOT0KS0G4&k_o8s_P0K@CTXX?QXew;2DI;C~zbMdNiNkhA5+2RZo~ zzaBW}L%i`oH2f*v9^mcYdHV)$-@z@y#}1KS@pcS1_b}15Wkzn#Z$_Gs`*kPmXh~*x~`` zKG+4b+rcrQuH5BRUGGeSQ;6x^vz_W4$|;IiE)j+sT;aq6b4J1|PIp{)hI1-uGtO9* zBrbAFwoC2noOsx6#s_moDDTX&V?mxxp9yM_^2)TKHjp!Eo&$9na*I1?Tmet`qhKYox|MdtDN{3(Q$Yy^sr;F zcn@}<2h)sG*V4nKGjt?&rWK+TbZRebFjV+EBu-rNNp?nVUqMbeF?$qZXB@_kz(E$U zM*)c)=EG*eF}73pGJB*ARjciVsBsVMI1~ND>(&>4vK_of6|#e`UVYRl^~Z@T zoN5*Td!zC&L=X7G-9{;;o;x~@yP}|e-YG5w`)T~@o zf}nealepU{19+VS|Es#faUOHx?q&o-RCzR~$3g*vB(HPa3!KCziJ9(=(x6{6q`Sfy zbsczQg;9~|CTN&Oyc_B+XhhdUCcgn`P!pNNnAJZ5A6srkJ(KTNIot6Vz{v|xc@gP2 z=pqr&MZ}l+@^NGWZ{h>ygBQWcwo{7;li1}%cR6m0GuqQ-C43+-ZIqMvqEquJCvm+q zW|vcQ1C)5PlekhvhXl>f#VyXhki)E{?OIW^m|g=Lpw>k58uz2bW|`PP81sU5%68MVntz^Eg)IThzR zqaQ^Sbr4!g-8-F<$DOK2RmI?kuDK3hcr+3LHTX*_iID0zk2~?l=%5Fj_{&c0dZ%ue zGjG9}}@-?q2HspyJl6m!KO zU2#4JhKn%r%o!37e-WR^smpDWg8 z3EMo6Z6XT!mp;b*y-B%dDP`G!TR?Jo%b<7mewm8J@i`R-I28vt6$kj;egRI!Zgwz8 zFU>o?!3p*OG0b&GLxJ$gj`L`~nebli%MRYw427mU_Mv|@S#W1u$ywKF}oFMqsY3`+`#jcevfX#0B?JAi>u$**0I|q#OKuF_Xwz zi6$vz4zo`B81=^0>4-hZ*>aP}#K}dzq$|WI6ygfWk(rDp2>*&Veq2G8L=oB{LOVpb zB#L~61&{N_C6W6KawYtTfh>;Xn~bi#X_(e6x9)pfWB z4mcx`1j7$F)!VbHSmz%1CTDCgj%h%~^HFDfu;e-w{y*V3HzMYY2}a%J_}U2!+zY%_ z630~azd5znI_?vCSdP2L8B>s`&PP=88IpvrbDXeyzEko_4iqdonuVuhQ2WJayTmP-ht@X#hEa7t>#?fl>E)HCz*B1 z2u`wUu@;PFUVlTF<}dfTe9u{+@gq-kzMG0UpG=3fq2bO)$Mc-7JPrz5Ztv`LbhR*t ze3-5#pK1!ztz_yGj|z)3nHOld@+sTP5i|y?95MY-C!yE5G`#~`Bhc#-x{3K4rp@tA z{7cZ~X1#SmZ1fZsrJ@SV22|H}u4+oudiIw8htwsn8_Vs#uPzS2e07<}`S=W)li2H2 zTbt-ezU zz?Jh+dG@IB*`wqg>>;ajnaujTu1u#g*0R*n=9b3Py2iEZQjHfhuU)s+>P&6yOQ%yL z=+J=G*}kc@&&vJLo9^D8&ZOK1diuLMd(s_Aet)P3NR|Fgy?q({PK}Si-(>SzwA#3M z{knyVS{ieNLCKoNW$RlOuCa1{NhsBmzQS6zw5vP44nHrHSJs)%r22Y$GpVhunN0=C zI$ATWZTP7pRos&X`!gL2+Gm{s6}Am@b$6sTLT3Klk=02x z<#x&wI@Q&m+Sc0L)nR4TJB&PEQEM+;(bBx~T(s2Q+SA+9)eZ)*uGgS40@-x7;kTL6 zt>~}M?ojoT<~1}mBur(fR%yJWcL2XMWp!@tMb&hlm0E<#d4khbtWNq03Q}D?y_v3! zJFI2RJzbeDD0j#Dp580q8ECI%75*E~Yivm^Uemm;dGW#)v`DvT?M}7xx3AhWDcT3v z?%qx-wQL=J3uZ{j@`9C8{PnK9<`%ZJtU4bfd3DRe#f>W(SFZC}$--}yL1470n^zoC?VHl=n>{Ri z8V-56xQ1V(-ky~Aqhd-i>{4p!!gboj7gGKXHvUuUj)T;9u*Q{w? z(nudkH7~K2E$;5^ALvW3RO1IG6u5Uc~k%Ojd8v;jnYp1m(ooPjY?Calz0ov0Gr$r6F0T^tx#j|d?V&U3z z^ZKieZ~5!Ocv|1e=@B9PBZ{om;IjNaw-j=5ESP|l>)A~US1xI3T$@_8x^X2$@X6G; zcJ0Dt)JJBs--CTEGI;5}Y6s=W&g;n9#+6G_jVsSlHe>$ea>!P>?(=QS@z7)tR6^fF+OV}Hes@ehunLZf2YDPFNuqQ(*l z8lD^Hg)lWudSOhDdaJdsvpq*QaKlw=h-N(XOKG&Zc-4v(P;3elOk-Z`#}5FeQ(JmF z(%mXPz7boi=+6qc$ZI!^0TV2?C z?%VADDL;xWiZ4)uD-T#K)0b-P>ucRXdEup*O=`WgaiFK&YF>FBR#MH&%!Gpx&h=Fx zJf>VsFss&FXmt#1P4SDW3N+c;(SdM?)k99hzyd}U)U=i@!Gzt{yF-VL)Uwr?zJ-(z z{5sOxb1F*cE6@yep_V3^D*gGviPm)zLfr`ETsuftTaV%7SUYQ5dj%MfU3 zIxbDK4d?+&WCwm>vmH9#p(&+RzjCv#?8mNM-MF|JbFor!Gt_9L^i-NvORg^s*MM?4 z_zl=Kiq5vA`}$)5mm{r=NWN%5zt)I)A01 z&bqtmhgyuznT>F%c24vzxay)+SZ6Xyo|`L?)j!bQ4pEJk8PU|NxfI5eP$OEPPE4El zf!MwsJ|`7le-Dw=qM8cQ+q*IttgV@WerwsfbFqS7$Qe)KITk?(I!i1p2nV{c=*Q|- z+9{LF8=`VwYS3jg**uSHveT}NCs+h%*W>8@E=G@8-saeVD?;YrCPwNGS$S2BD zLKYARD~YZQeA%?!+OZ>NX3G^n!&#@bdl(Frzblf8mQCfy;EHHj3&Ho(BlRXKQRRF|*|tJX9_d^JO2 z8LYR0sN!EB`nOiO+%{pwv|07U*PLHg?0!3Y@_VpN_rU1P*jvf(c@DeO*1MguP$5bU zvdd!^JJK6lF{0#b#HR}u^((oGDFH)~TXMfHJZ1asr^Ul4%xqrNyIs=NRJd9nLp0Co zs>^;6hxNikk;?c%C)Uk$$l;28QZzj{b#R7v>eO=hTsuP3ry^)hOtIt5$QKB6o>nB-ywK4Vd zj@?FfK#Fvt6s-+eR`^=*4FK`9zBFbLIUvL8a6o=bT-UrJ-Ho5>PSefv70J^T44wYI z_8IN?HSHNWvvPgAHDePh&e*u)^fPBH>21f_t0&VxL;s+8|BQ9%EnB;B>@oxT+_+8+oyN-49u7{4?;)< zA1x|OpItvQx5V)6G^Nbsu0rcK;g`odFo=<1DMItqwiG!&I zB-5@=4v15yY0N1pnCt50dPk~u^?Kd(cLhY5&0a}nv+^X?WuCE5<#X%gOo|}zZKeTv zI?Hi_RCeD61?CoUnTm?JNFRMso>H+LozL`f3no34{n_6ULocu)NT*EmAn(NSsaZ)9 zq%)Y+VsD?pn3O9vEjyK4UJA z#E@8_tA7#-{U-EVJl!gG;fWBwOyZB~6Usg!c|Xvqvi3JCWKx&m<CNwunp(?|v8_>7vQ1$qAFuQ9Z{yc7UA|1Zt7il%5c zGB$rDK9BxB;0yKl5zWWE@3=}c`f(9@e(M0+HE-8dX+gtCiO>I4h;hIdYWK_{_?1QQ zn>By)Ud;#aWSiF=Md;;X_|FSiHZ&jgwg&|iVe4+?` zOcDGP;B9;h$IqHnKmGSY{Q0Ec#s|sG@1+|0<$|xZ@_!d}E%5l1h_zvnp;Rf~Y~xVM zzjhYE(+-u;r+J&@QeAOx5qf?yy%7IzXg>L0-0+;n=YO9rza_E|pT8Bs*WvMNMPQ^i zzD)mW5F;r6YCTS;=z>Y0PZ}a$+5mi^cHblTxRw8P6_*kpDD{4K*Rbl)^f#WWFy?dM zHv&J=5c$%3gx-hH*)J5qKUD<(ViEjnMewf+K0fT*{L7)Y1itbj(UvQd{8&~lN+5nd zoqEpy2BRk7lZ|_(>N=q}P&VD9`Q-n8$c;tlzZ_BR=Kr+KJw@ohRs{bg@vFF%|8qOv zEkgfm!N-UFssVpwtdRdCox=E;f{zdTB}D#IWg$M_0X~6wWLlnG_&s2S=u^Nav+DJ7 zJw@nmE`tAL5&XkN@P~`wj}*bbRRqr;jiXRg6Z6dxQQ8n%{#q z6`n7`|255L`BX)j)D_}bKo`>U^dk60MevsjK0fR#nJ&}#Q+2!Eyjg_L=QVx)58^zd z@%i80@h0n41iU5gXco>!H7}&C92delW zJgmgC5cNz}k>;Et3_EHl@UoR}7YuSAlq&G7Bd^$d3ni!3zkAk^e*oft<~2-Yf1!Sz zOpZ4BKujM#zaOy_LlBnqR}RmgYr^Q?u)5 z*Po6Cvad82dAqLAIeWgw<>83(ja;YZVVgXz;CUeg;UT4Ys-$e=J=^s?0{6L(Vwy^| z_2UV-dK#tbv3K6n{oF>gr+}t5YT^yC_D%4U)~;?(19Qb6vS;ntLw0shKV2|S0EjB^ zurIf1ufOW;2vo^(FYrhw|Iu9@Grm9Ku`myyaB63sHlDkm-Ulp`yM z_sk~O->FeClj?l_a||d4?vj0*MZHuap6Z0QA1N+zsikEInPneQ&P{}L~yUW*(W;eygy)TFHlludk+{6lJhQ4fxb~T{d$Xf zOVta2-t$nJGe`4TJ1M*BM^fU-<|S*-DZH98r)7_A{f`LqAK0^p`QcJMKFjaB>a@_Z zA^*cM&pZ52dbO_jJgy+EeyXgWh!uJTC0{nLf4T3!=&Hu=@B&Nr^%lQxcw;yB)x{J; zZoz$akeJO${dfPTeOB>yP#s`KSR}`t5i}D3{anT&j4trplTUUCPeNC=Fq37z^x6V?{s~}tl-iW|!tvOHm zvknR&IF^k-J_pHpnIe_qgG3#(sWNXinxm#8Uq$l{LY}^Jp4VFScySDVhBVWs(oH6Z z_rcTkcq&>itBC3NkU%}&9!>XcwFJAV6?U)h*wF(HD#c5MQnC&2kn^FwA4s9BFWueB z3OctHFAITV7w+=Juea8x`KBY+;F~&7*FX?duvWb%-qya}t?9nZ4vkv4 zsChcK3c^~g(=B0b@{pi)OIJI@!|H~&dXYr6ij{&@kL>~)is4mi@lGY)m#jPqMwCY_`} z?{4;c22qcUjek@B0bSpuV+^5AN$bDn0eJJoiC$BmpAzF`Qd8fwi(`bGs{s(UfL{B9 zy1q#d;{1yjjsrzbQ=eZ0#j6SbtYX@~5BpMHCKcr>Uk&UDpZxsI3|=O^O@VmE zqb}2qN%`3AZC`!)u3_Lz+MucplV78)Ze+;Y@Y}98&n7*n2~GR?{okhRFVb}L`QQ?l zNoQ*Pu|9Q{Uwb5w~*@hzY^SDrZ5?I>k^qkpSGlk1dUitoRS{tS*k4B)SC zp0Am-g@wK=zy14A=C8khu_87pp9lD_{PrJ0;Tt~xJJO`6O}f=z8TtJB2Y~a(kFCwB zf=L?`=-u<{e-9=8`sO*hNt0epmC5fv&+l;>C1Y49%yaA&iax(R1Do`>Aj4O)d-ct8 zb9^y|T!v0T+5Q{+>nNb_>#*ZJH(dnI z-A#Ry+NkWWZ=UB4n)*fj&(x3R)i=-Q zSB-9erXPvCsh=M|OnsB`eF2mAvv`+o|43e89%xN3Qh&5QIQ{+{KiA=H@x6q6o~$u+ zldAWVJO$>{E-O<1sk>DDXXu>1E5H6)T|Zxcd+t+}#^BWs|7Gf%lwXp?e184U@;jYy zos~D>Og)qK==zE}d;irzm9NdBBxmXwG~qlKm7?PZ6~!|;08auq5&y=Y%>0exbkFxx j4Rt^GeU-Lzap1f1+vjv`eAh>2o%9n0y+5x)9%%hvt=&+$ diff --git a/src/core/application.c b/src/core/application.c index 5a16e74..d4c0243 100644 --- a/src/core/application.c +++ b/src/core/application.c @@ -7,6 +7,8 @@ #include "views/folder_dialog.h" #include "core/investigation.h" #include "views/main_window.h" +#include "core/investigation_tree_builder.h" +#include "core/investigation_tree_model.h" #include @@ -33,6 +35,7 @@ struct Application GtkApplication *gtk_application; MainWindow *main_window; Investigation *investigation; + InvestigationTreeModel *tree_model; }; /** @@ -51,17 +54,8 @@ static void application_on_folder_selected( ) { Application *application = user_data; - const char *root_path = NULL; - const char *database_path = NULL; - - /* - * Une éventuelle enquête précédemment ouverte doit être libérée avant - * d'en créer une nouvelle. - */ - investigation_free(application->investigation); - application->investigation = NULL; - - application->investigation = investigation_new(folder_path); + Investigation *new_investigation = NULL; + InvestigationTreeModel *new_tree_model = NULL; if (application == NULL) { @@ -74,23 +68,47 @@ static void application_on_folder_selected( return; } - if (application->investigation == NULL) + new_investigation = investigation_new(folder_path); + + if (new_investigation == NULL) { g_warning( "Impossible de créer l'enquête à partir du dossier sélectionné." ); return; } - root_path = investigation_get_root_path( - application->investigation - ); - database_path = investigation_get_database_path( - application->investigation + + new_tree_model = investigation_tree_builder_build( + investigation_get_root_path(new_investigation) ); - g_print("Dossier racine : %s\n", root_path); - g_print("Base de données : %s\n", database_path); + if (new_tree_model == NULL) + { + g_warning( + "Impossible de construire l'arborescence de l'enquête." + ); + + investigation_free(new_investigation); + return; + } + + /* + * Les nouveaux objets sont valides. + * On peut maintenant remplacer les anciens sans perdre l'enquête + * déjà ouverte en cas d'échec. + */ + investigation_tree_model_free(application->tree_model); + investigation_free(application->investigation); + + application->tree_model = new_tree_model; + application->investigation = new_investigation; + + main_window_set_tree_model( + application->main_window, + application->tree_model + ); } + static void application_on_activate( GtkApplication *gtk_application, gpointer user_data @@ -182,8 +200,8 @@ void application_free(Application *application) return; } + investigation_tree_model_free(application->tree_model); investigation_free(application->investigation); - main_window_free(application->main_window); if (application->gtk_application != NULL) diff --git a/src/views/main_window.c b/src/views/main_window.c index ee5d0f9..c1c00aa 100644 --- a/src/views/main_window.c +++ b/src/views/main_window.c @@ -268,6 +268,22 @@ GtkWindow *main_window_get_window( return main_window->window; } +void main_window_set_tree_model( + MainWindow *main_window, + const InvestigationTreeModel *tree_model +) +{ + if (main_window == NULL) + { + return; + } + + sidebar_set_tree_model( + main_window->sidebar, + tree_model + ); +} + void main_window_free(MainWindow *main_window) { if (main_window == NULL) diff --git a/src/widgets/sidebar.c b/src/widgets/sidebar.c index b8ed4a2..78f3651 100644 --- a/src/widgets/sidebar.c +++ b/src/widgets/sidebar.c @@ -4,6 +4,7 @@ ******************************************************************************/ #include "widgets/sidebar.h" +#include "core/investigation_node.h" #include @@ -97,6 +98,59 @@ GtkWidget *sidebar_get_widget( return sidebar->root_widget; } +void sidebar_set_tree_model( + Sidebar *sidebar, + const InvestigationTreeModel *tree_model +) +{ + const InvestigationNode *root_node = NULL; + const char *root_name = NULL; + + if (sidebar == NULL) + { + return; + } + + if (tree_model == NULL) + { + gtk_label_set_text( + GTK_LABEL(sidebar->title_label), + "Dossier d'enquête" + ); + + return; + } + + root_node = investigation_tree_model_get_root(tree_model); + + if (root_node == NULL) + { + gtk_label_set_text( + GTK_LABEL(sidebar->title_label), + "Dossier d'enquête" + ); + + return; + } + + root_name = investigation_node_get_name(root_node); + + if (root_name == NULL || root_name[0] == '\0') + { + gtk_label_set_text( + GTK_LABEL(sidebar->title_label), + "Dossier d'enquête" + ); + + return; + } + + gtk_label_set_text( + GTK_LABEL(sidebar->title_label), + root_name + ); +} + void sidebar_free(Sidebar *sidebar) { if (sidebar == NULL)