From 1c4fb5137e79e6846f1d8e383874c9fdf9e74d24 Mon Sep 17 00:00:00 2001 From: Yann Lebrun Date: Thu, 28 Aug 2025 16:56:58 +0200 Subject: [PATCH] Add Git status to listfile --- main2.pb | 241 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 213 insertions(+), 28 deletions(-) diff --git a/main2.pb b/main2.pb index 1fb2430..d94f0ba 100644 --- a/main2.pb +++ b/main2.pb @@ -449,6 +449,36 @@ Enumeration GadgetsIDs #GID_LblScope #GID_CbScope #GID_BtnSaveCfg + + ; --- App settings (langue) --- + #GID_FrmApp + #GID_LblAppLang + #GID_CbAppLang + + #GID_FrmProxy + #GID_ChkProxy + + ; HTTP + #GID_LblHttpSrv + #GID_EdHttpSrv + #GID_LblHttpPort + #GID_EdHttpPort + #GID_LblHttpUser + #GID_EdHttpUser + #GID_LblHttpPass + #GID_EdHttpPass + + ; HTTPS + #GID_LblHttpsSrv + #GID_EdHttpsSrv + #GID_LblHttpsPort + #GID_EdHttpsPort + #GID_LblHttpsUser + #GID_EdHttpsUser + #GID_LblHttpsPass + #GID_EdHttpsPass + + #GID_BtnApplyProxy EndEnumeration ; ----------------------------------------------------------------------------- @@ -573,6 +603,25 @@ Procedure ApplyToolTips() GadgetToolTip(#GID_CbScope, T("tip.cfg.scope", "Portée de la configuration (Local/Global/System)")) GadgetToolTip(#GID_BtnSaveCfg, T("tip.cfg.save", "Enregistrer la configuration Git")) + ; --- Langue --- + GadgetToolTip(#GID_CbAppLang, T("tip.app.lang", "Langue de l’application")) + + ; --- Proxy --- + GadgetToolTip(#GID_ChkProxy, T("tip.proxy.enable", "Activer/désactiver la configuration proxy")) + GadgetToolTip(#GID_EdHttpSrv, T("tip.proxy.http.server", "Serveur HTTP proxy")) + GadgetToolTip(#GID_EdHttpPort, T("tip.proxy.http.port", "Port HTTP proxy")) + GadgetToolTip(#GID_EdHttpUser, T("tip.proxy.http.user", "Login HTTP proxy")) + GadgetToolTip(#GID_EdHttpPass, T("tip.proxy.http.pass", "Mot de passe HTTP proxy")) + GadgetToolTip(#GID_EdHttpsSrv, T("tip.proxy.https.server", "Serveur HTTPS proxy")) + GadgetToolTip(#GID_EdHttpsPort, T("tip.proxy.https.port", "Port HTTPS proxy")) + GadgetToolTip(#GID_EdHttpsUser, T("tip.proxy.https.user", "Login HTTPS proxy")) + GadgetToolTip(#GID_EdHttpsPass, T("tip.proxy.https.pass", "Mot de passe HTTPS proxy")) + GadgetToolTip(#GID_BtnApplyProxy,T("tip.proxy.apply", "Appliquer la configuration proxy dans Git")) + + + + + ; --- Help (optionnel) --- GadgetToolTip(#GID_HelpWeb, T("tip.help.web", "Zone d’aide (documentation / rendu HTML)")) EndProcedure @@ -680,7 +729,19 @@ Procedure OpenGUI() ; TAB 4: CONFIG ; =========================================================================== AddGadgetItem(#GID_Panel, -1, T("Tabs.Config","Config")) - FrameGadget(#GID_FrmConfig, #UI_Inset, #UI_Inset, GadgetWidth(#GID_Panel) - #UI_Inset*2, 170, T("Config.FrameTitle","Configuration Git"), #PB_Frame_Container) + + ; --- Frame: Paramètres de l’application (LANGUE, etc.) --- + FrameGadget(#GID_FrmApp, #UI_Inset, #UI_Inset, GadgetWidth(#GID_Panel) - #UI_Inset*2, 90, T("App.FrameTitle","Paramètres de l’application"), #PB_Frame_Container) + TextGadget(#GID_LblAppLang, #UI_Inset + 10, #UI_Inset + 35, 120, 22, T("App.Label.Lang","Langue")) + ComboBoxGadget(#GID_CbAppLang, #UI_Inset + 140, #UI_Inset + 33, 220, #UI_RowH) + AddGadgetItem(#GID_CbAppLang, -1, "Français (fr)") + AddGadgetItem(#GID_CbAppLang, -1, "English (en)") + SetGadgetState(#GID_CbAppLang, 0) ; défaut: fr + CloseGadgetList() + + ; --- Frame: Configuration Git (identité + portée) --- + Define yCfg = BottomOf(#GID_FrmApp) + #UI_Inset + FrameGadget(#GID_FrmConfig, #UI_Inset, yCfg, GadgetWidth(#GID_Panel) - #UI_Inset*2, 170, T("Config.FrameTitle","Configuration Git"), #PB_Frame_Container) TextGadget(#GID_LblUserName, #UI_Inset + 10, #UI_Inset + 35, 90, 22, "user.name") StringGadget(#GID_EdUserName, #UI_Inset + 110, #UI_Inset + 33, GadgetWidth(#GID_FrmConfig) - (#UI_Inset*2) - 120, #UI_RowH, "") TextGadget(#GID_LblUserEmail, #UI_Inset + 10, #UI_Inset + 70, 90, 22, "user.email") @@ -691,9 +752,47 @@ Procedure OpenGUI() AddGadgetItem(#GID_CbScope, -1, "System") AddGadgetItem(#GID_CbScope, -1, "Global") SetGadgetState(#GID_CbScope, 0) - ; GetGitIdentity() ; Uncomment if you implement it ButtonGadget(#GID_BtnSaveCfg, GadgetWidth(#GID_FrmConfig) - #UI_Inset - 110, #UI_Inset + 100, 110, #UI_RowH, T("Config.Button.Save","Enregistrer")) CloseGadgetList() + + ; --- Frame: Proxy HTTP(S) --- + Define yProxy = BottomOf(#GID_FrmConfig) + #UI_Inset + FrameGadget(#GID_FrmProxy, #UI_Inset, yProxy, GadgetWidth(#GID_Panel) - #UI_Inset*2, 260, T("Proxy.FrameTitle","Proxy HTTP / HTTPS"), #PB_Frame_Container) + + ; Activation + CheckBoxGadget(#GID_ChkProxy, #UI_Inset + 10, #UI_Inset + 30, 280, #UI_RowH, T("Proxy.Enable","Activer le proxy")) + SetGadgetState(#GID_ChkProxy, 0) + + ; --- HTTP row 1 (server/port) + TextGadget(#GID_LblHttpSrv, #UI_Inset + 10, #UI_Inset + 70, 100, #UI_RowH, "HTTP serveur") + StringGadget(#GID_EdHttpSrv, #UI_Inset + 110, #UI_Inset + 68, 260, #UI_RowH, "") + TextGadget(#GID_LblHttpPort, RightOf(#GID_EdHttpSrv) + #UI_Inset, #UI_Inset + 70, 40, #UI_RowH, "Port") + StringGadget(#GID_EdHttpPort, RightOf(#GID_LblHttpPort) + #UI_Inset, #UI_Inset + 68, 80, #UI_RowH, "") + + ; --- HTTP row 2 (user/pass) + TextGadget(#GID_LblHttpUser, #UI_Inset + 10, #UI_Inset + 105, 100, #UI_RowH, "HTTP login") + StringGadget(#GID_EdHttpUser, #UI_Inset + 110, #UI_Inset + 103, 260, #UI_RowH, "") + TextGadget(#GID_LblHttpPass, RightOf(#GID_EdHttpUser) + #UI_Inset, #UI_Inset + 105, 70, #UI_RowH, "Password") + StringGadget(#GID_EdHttpPass, RightOf(#GID_LblHttpPass) + #UI_Inset, #UI_Inset + 103, 180, #UI_RowH, "") + SetGadgetAttribute(#GID_EdHttpPass, #PB_String_Password, #True) + + ; --- HTTPS row 1 (server/port) + TextGadget(#GID_LblHttpsSrv, #UI_Inset + 10, #UI_Inset + 145, 100, #UI_RowH, "HTTPS serveur") + StringGadget(#GID_EdHttpsSrv, #UI_Inset + 110, #UI_Inset + 143, 260, #UI_RowH, "") + TextGadget(#GID_LblHttpsPort, RightOf(#GID_EdHttpsSrv) + #UI_Inset, #UI_Inset + 145, 40, #UI_RowH, "Port") + StringGadget(#GID_EdHttpsPort, RightOf(#GID_LblHttpsPort) + #UI_Inset, #UI_Inset + 143, 80, #UI_RowH, "") + + ; --- HTTPS row 2 (user/pass) + TextGadget(#GID_LblHttpsUser, #UI_Inset + 10, #UI_Inset + 180, 100, #UI_RowH, "HTTPS login") + StringGadget(#GID_EdHttpsUser, #UI_Inset + 110, #UI_Inset + 178, 260, #UI_RowH, "") + TextGadget(#GID_LblHttpsPass, RightOf(#GID_EdHttpsUser) + #UI_Inset, #UI_Inset + 180, 70, #UI_RowH, "Password") + StringGadget(#GID_EdHttpsPass, RightOf(#GID_LblHttpsPass) + #UI_Inset, #UI_Inset + 178, 180, #UI_RowH, "") + SetGadgetAttribute(#GID_EdHttpsPass, #PB_String_Password, #True) + + ; Bouton Appliquer + ButtonGadget(#GID_BtnApplyProxy, GadgetWidth(#GID_FrmProxy) - #UI_Inset - 140, #UI_Inset + 215, 140, #UI_RowH, T("Proxy.Apply","Appliquer proxy")) + CloseGadgetList() + ; --- End tabs --- CloseGadgetList() @@ -733,22 +832,6 @@ Procedure.i GetGitVersion() ProcedureReturn #False EndProcedure -Procedure GetGitStatusPocelaine() - If Git("status --porcelain --ignored") = 0 - ProcedureReturn #True - EndIf - ProcedureReturn #False -EndProcedure - - -Procedure IsGitRepository() - If Git("status") <> 0 - ProcedureReturn #False - Else - ProcedureReturn #True - EndIf -EndProcedure - Procedure.s GetStatusDescription(status.s) Select status Case " " @@ -800,6 +883,107 @@ Procedure.s GetStatusDescription(status.s) EndSelect EndProcedure +Procedure GetGitStatusPocelaine() + If Git("status --porcelain --ignored") = 0 + ProcedureReturn #True + EndIf + ProcedureReturn #False +EndProcedure + +Procedure ParseStatusPorcelaine(output$) + ; Ne PAS vider la liste ici : on veut pouvoir mettre à jour des entrées existantes + ; ClearList(main\Files()) ; <-- laissé intentionnellement commenté + + ; Diviser en lignes + Dim lines.s(0) + Protected lineCount.l = 0 + Protected currentPos.l = 1 + Protected i.l,lineIndex,startPos + ; Compter les lignes + For i = 1 To Len(output$) + If Mid(output$, i, 1) = #LF$ Or Mid(output$, i, 1) = #CR$ + lineCount + 1 + EndIf + Next + + ; Redimensionner le tableau + If lineCount > 0 + ReDim lines.s(lineCount) + + ; Remplir le tableau avec les lignes + lineIndex = 0 + startPos = 1 + + For i = 1 To Len(output$) + If Mid(output$, i, 1) = #LF$ Or Mid(output$, i, 1) = #CR$ + If i > startPos + lines(lineIndex) = Mid(output$, startPos, i - startPos) + lineIndex + 1 + EndIf + startPos = i + 1 + ; Gérer CRLF + If Mid(output$, i, 1) = #CR$ And i < Len(output$) And Mid(output$, i + 1, 1) = #LF$ + i + 1 + startPos = i + 1 + EndIf + EndIf + Next + + ; Traiter la dernière ligne si elle n'a pas de retour à la ligne + If startPos <= Len(output$) + lines(lineIndex) = Mid(output$, startPos) + EndIf + EndIf + Protected line$,status$,name$ + ; Parser chaque ligne + For i = 0 To ArraySize(lines()) + line$ = lines(i) + If line$ <> "" + ; Le format est : XY␠ + ; X = index status, Y = working tree status + If Len(line$) >= 3 + status$ = Left(line$, 2) + name$ = Mid(line$, 4) ; chemin tel que renvoyé par Git + name$ = ReplaceString(name$, "\", "/") ; normalisation (par sécurité) + + ; ----- MODIF: chercher si l'entrée existe déjà ----- + Protected found.b = #False + ForEach main\Files() + If main\Files()\name = name$ + found = #True + ; Mise à jour uniquement + main\Files()\status = status$ + main\Files()\statusDescription = GetStatusDescription(status$) + Break + EndIf + Next + + ; Si non trouvée, on l'ajoute + If Not found + AddElement(main\Files()) + main\Files()\name = name$ + main\Files()\status = status$ + main\Files()\statusDescription = GetStatusDescription(status$) + EndIf + ; ----- FIN MODIF ----- + EndIf + EndIf + Next + + Debug "Récupération des status Git réussie. " + Str(ListSize(main\Files())) + " fichiers (maj/ajout)." + ProcedureReturn #True +EndProcedure + + + +Procedure IsGitRepository() + If Git("status") <> 0 + ProcedureReturn #False + Else + ProcedureReturn #True + EndIf +EndProcedure + ; --- Helper interne : scanne un dossier et alimente la liste Procedure _ScanFiles(path$, root$="") If root$="":root$=path$:EndIf @@ -850,7 +1034,9 @@ Procedure RefreshFiles() ClearGadgetItems(#GID_ListStatus) ClearList(main\Files()) readDirectory() - + If main\IsRepository And GetGitVersion() + ParseStatusPorcelaine(main\gitCall\output) + EndIf Protected n.l=n-1 ForEach main\Files() n=n+1 @@ -913,12 +1099,12 @@ Procedure Main() If OpenGUI() ;refresh - main\IsRepository=IsRepository() + main\IsRepository=IsGitRepository() SetWindowTitle(#WinMain,#AppTitle$+" (with "+main\gitVersion$+")") SetGadgetText(#GID_EdRepo, GetCurrentDirectory()) - If main\IsRepository - RefreshFiles() - EndIf + + RefreshFiles() + ; ----------------------------------------------------------------------------- ;-EVENT LOOP / BOUCLE D'ÉVÉNEMENTS ; ----------------------------------------------------------------------------- @@ -941,7 +1127,7 @@ Procedure Main() main\GitCall\workdir=path$ SetGadgetText(#GID_EdRepo, path$) SetCurrentDirectory(path$) - main\IsRepository=IsRepository() + main\IsRepository=IsGitRepository() If main\IsRepository=#True RefreshFiles() EndIf @@ -953,8 +1139,7 @@ Procedure Main() ; TODO: call your Git init logic Case #GID_BtnRefresh - SetGadgetText(#GID_TxtAction, T("Action.Refresh","Rafraîchir l’état")) - ; TODO: refresh repo status + RefreshFiles() Case #GID_BtnClone SetGadgetText(#GID_TxtAction, T("Action.Clone","Clone demandé")) @@ -1001,8 +1186,8 @@ EndProcedure Main() ; IDE Options = PureBasic 6.21 (Windows - x64) -; CursorPosition = 735 -; FirstLine = 711 +; CursorPosition = 883 +; FirstLine = 813 ; Folding = ----- ; EnableXP ; DPIAware \ No newline at end of file