From 5b90665a3dfdb674f248d165da7a9e18818d4271 Mon Sep 17 00:00:00 2001 From: Rachieru Gabriel Date: Sun, 10 May 2026 22:42:27 +0300 Subject: [PATCH 1/2] feat: connect real UI buttons to file_manager, undo_manager & quarantine_db - scan_tab: replaced MockScanThread with real ScanThread that walks source dir, categorizes files by extension, adds to quarantine_db - quarantine_tab: rewritten to read from quarantine_db, Approve calls file_manager.move_and_rename_file(), Reject removes from DB - history_tab: new Activity History tab (US 10) with per-row Undo buttons connected to undo_manager - app_window: added History tab + auto-refresh on tab change - undo_manager: added undo_action(index) and get_history() methods - Eliminated all mock/hardcoded data from UI --- core/__pycache__/file_manager.cpython-312.pyc | Bin 1229 -> 1450 bytes core/undo_manager.py | 32 ++++ .../test_core.cpython-312-pytest-9.0.3.pyc | Bin 4260 -> 4190 bytes ui/app_window.py | 18 +- ui/tabs/history_tab.py | 147 ++++++++++++++ ui/tabs/quarantine_tab.py | 179 +++++++++++++++--- ui/tabs/scan_tab.py | 130 +++++++++++-- 7 files changed, 456 insertions(+), 50 deletions(-) diff --git a/core/__pycache__/file_manager.cpython-312.pyc b/core/__pycache__/file_manager.cpython-312.pyc index 013d21c020532c4500daa06ba5e9dbf84e878d6a..21d3320447b9f836e2c10f53a5da80bf3fbffe00 100644 GIT binary patch delta 569 zcmX@hxr&?bG%qg~0}!-dWyo@2naC%>7&B2_t)3x;C5JVaEsBkiA%!)SC6zsuDUC@I zs4j&Kg~y)Cp27i?<4ECbVTt0XWYpw(2{O)4lkpZyKw?P-kY)|d%goOMGI&b!Qu5<- z6Y~<&Q;Tjf7Z)YpVo6CYF1f{#ms%d5mzbM+i>)ZNq_ik+;s#!BHlQ)gK>S&XapH+x zb|t(Zb3venc{L-1g(Sub6I;y$kz-^i;fJso7_tN=7ciEgc4s>rxQ4uT9$XmQcU?buox;5E~ zKu#@U2N4{Tt(Y4GC4fv0ATDkJ5)BMr5&|kJ0$H?@ zp$HT)MdCo>7l%!5eoARhs$G#BkP8Z?Vh?Oik{_5s0*Y!2idVQSsJy6X2obOqb^tRTuyTH31*!mB1pp^9lfeK0 delta 335 zcmZ3*eU_8&G%qg~0}w2B{F6DIc_N<#W57gpH8+-2mQ>bMrZgr=pj-+o3Xd(7HH950 z$C1L(!V<++$*9Ts5@dv*CgUxZfW(pvAk7+@mzke8alIBd3s8m`h(DiVnD}JZOY#@St@_pt8K~W$RBvzaWBpMjL zNK7tZi4dE>F+=+bi`oNju?s9>pMf$An(RgVlYg?vmogWZ6cvGVtz;+?15!mIK;jpN zO>TZlX-=wLku;FY2*kzCK;i>4BO~K&2Hv|25 bool: return False + def undo_action(self, index: int) -> bool: + """ + Anulează o acțiune specifică din istoric (după index). + Necesar pentru butoanele de Undo pe fiecare rând din Activity History (US 10). + + Returns: + True dacă s-a făcut undo cu succes, False altfel. + """ + if index < 0 or index >= len(self.history): + return False + + action = self.history[index] + old_path = action["old_path"] + new_path = action["new_path"] + + if new_path.exists(): + old_path.parent.mkdir(parents=True, exist_ok=True) + shutil.move(str(new_path), str(old_path)) + del self.history[index] + return True + + return False + + def get_history(self) -> list[dict]: + """ + Returnează istoricul acțiunilor ca o listă de dicționare (pentru UI). + """ + return [ + {"old_path": str(a["old_path"]), "new_path": str(a["new_path"])} + for a in self.history + ] + # O instanță globală pe care o vom folosi în restul aplicației (pentru integrare ușoară) undo_manager = UndoManager() diff --git a/tests/__pycache__/test_core.cpython-312-pytest-9.0.3.pyc b/tests/__pycache__/test_core.cpython-312-pytest-9.0.3.pyc index f05b8ebf774c0cb0b846c87d698d8325f26948af..dc251657306e1c6c577608837e7805bea9c52fcd 100644 GIT binary patch delta 211 zcmZ3Ycu#@%G%qg~0}!-dWys2%$ScWcFi~AemMMoVmpzJ|ks*b-g&~Tgl2Mc8B}kQ@ zCgUxU$%?!p8|TGyadQGiia@%HxF>UPw=gnK?&aPoAOsTN2NAp=f@5+R&jVInAd_XY zHScOBUd~$_Nu`-NC7F4}MPidb^BXftOm-9ycVPyp2B}-gP^1T9>i~&g95%W6DWy57 jc15N@E+Y^ZgDm*K%*e=ipMjx;;VOgCXEq^5MX(+K5>_oq delta 291 zcmcboutbsfG%qg~0}$+V{FAwIBCjN)&qQ@4TgDu=D7F-a6viC(D0U#tl*5tB8O6!S z0Aw@gaOHAGaRb>bEeugSm5iFKFF_{wX)@ko2}mr-*qBt##SJpFh#N%kOn$=E!pJf? zlY6ItFi1cEMDT$K&dEkR4_NhpOt#J9ysMdbd2ewfm1gFYWabqYiBCSyZ(Jt{l)S~1 zUwn(LIHR;AGv^k20nmz^%%mb_kc?n*eo?AkT4qjad~RZ1VtQ&(5evv 0: + self.log_area.append( + f"\n💡 Mergi la tab-ul 'Quarantine' pentru a aproba sau respinge fișierele." + ) From cb4d9a9fdd0cc3e26b6c2adfaf9ef823d266dea6 Mon Sep 17 00:00:00 2001 From: Rachieru Gabriel Date: Sun, 10 May 2026 22:50:24 +0300 Subject: [PATCH 2/2] fix: remove f-string without placeholders (ruff F541) --- ui/tabs/scan_tab.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/tabs/scan_tab.py b/ui/tabs/scan_tab.py index fd8cbaa..9b5e775 100644 --- a/ui/tabs/scan_tab.py +++ b/ui/tabs/scan_tab.py @@ -222,5 +222,5 @@ def scan_complete(self, added_count): self.start_btn.setEnabled(True) if added_count > 0: self.log_area.append( - f"\n💡 Mergi la tab-ul 'Quarantine' pentru a aproba sau respinge fișierele." + "\n💡 Mergi la tab-ul 'Quarantine' pentru a aproba sau respinge fișierele." )