from PyQt6.QtCore import Qt from PyQt6.QtWidgets import QDialog, QHBoxLayout, QListWidget, QListWidgetItem, QVBoxLayout, QWidget from raveos_center import karbantartas, muveletek from raveos_center.elemek import Kartya, Racs, cimke, gomb from raveos_center.folyamat import FolyamatAblak from raveos_center.forditas import tr from raveos_center.hatter import gyorsitott, tarolt AZON = "karbantartas" CIM = tr("Karbantartás") MUVELETEK = [ ("cache", "paccache -rk2", tr("Csomag cache ürítése"), tr("Minden csomagból csak az utolsó két verzió marad, az eltávolított csomagok fájljai törlődnek."), True), ("arva", "pacman -Qdtq", tr("Árva csomagok"), tr("Már semmi által nem használt függőségek eltávolítása. Az előnézetben egyenként kiveheted, amit megtartanál."), True), ("naplo", "journalctl --vacuum", tr("Naplók takarítása"), tr("A két hétnél régebbi rendszernaplók törlése, legfeljebb 100 MB marad."), True), ("tukrok", "reflector", tr("Tükrök frissítése"), tr("A leggyorsabb közeli letöltési szerverek kiválasztása. A régi lista biztonsági másolatként megmarad."), False), ("kulcsok", "pacman-key --populate", tr("Kulcsok frissítése"), tr("A csomagaláíró kulcsok újratöltése. Segít, ha a frissítés aláírási hibával áll le."), False), ("flatpak", "flatpak uninstall --unused", tr("Flatpak takarítás"), tr("A már egyik alkalmazás által sem használt runtime-ok eltávolítása."), True), ] class ElonezetAblak(QDialog): def __init__(self, szulo, cim, szoveg, elemek, valaszthato, gomb_szoveg): super().__init__(szulo) self.setWindowTitle(cim) self.resize(640, 480) doboz = QVBoxLayout(self) doboz.setContentsMargins(28, 24, 28, 20) doboz.setSpacing(12) doboz.addWidget(cimke(tr("ELŐNÉZET"), "eyebrow")) doboz.addWidget(cimke(cim.upper(), "h2", True)) doboz.addWidget(cimke(szoveg, "masodlagos", True)) self.lista = QListWidget() for elem in elemek: sor = QListWidgetItem(elem) if valaszthato: sor.setFlags(sor.flags() | Qt.ItemFlag.ItemIsUserCheckable) sor.setCheckState(Qt.CheckState.Checked) self.lista.addItem(sor) self.lista.setVisible(bool(elemek)) doboz.addWidget(self.lista, 1) if not elemek: doboz.addStretch(1) gombok = QHBoxLayout() gombok.addStretch(1) megse = gomb(tr("Mégse")) megse.clicked.connect(self.reject) gombok.addWidget(megse) self.mehet = gomb(gomb_szoveg, fo=True) self.mehet.clicked.connect(self.accept) gombok.addWidget(self.mehet) doboz.addLayout(gombok) if valaszthato: self.lista.itemChanged.connect(lambda _: self.mehet.setEnabled(bool(self.kivalasztott()))) def kivalasztott(self): return [ self.lista.item(i).text() for i in range(self.lista.count()) if self.lista.item(i).checkState() == Qt.CheckState.Checked ] class MuveletKartya(Kartya): def __init__(self, parancs, nev, leiras, futtat): super().__init__(terkoz=8, margo=20) self.elrendezes.addWidget(cimke(parancs, "monohalvany")) cim = cimke(nev) cim.setStyleSheet("font-size: 15px; font-weight: 600;") self.elrendezes.addWidget(cim) self.elrendezes.addWidget(cimke(leiras, "halvany", True)) self.elrendezes.addStretch(1) self.osszegzes = cimke(tr("Ellenőrzés..."), "monozold", True) self.elrendezes.addWidget(self.osszegzes) sor = QHBoxLayout() self.gomb = gomb(tr("Futtatás"), kicsi=True) self.gomb.clicked.connect(futtat) sor.addWidget(self.gomb) sor.addStretch(1) self.elrendezes.addLayout(sor) class Karbantartas(QWidget): def __init__(self, kozpont): super().__init__() self.kozpont = kozpont self.adat = {} doboz = QVBoxLayout(self) doboz.setContentsMargins(0, 20, 0, 0) doboz.setSpacing(16) doboz.addWidget( cimke( tr("Rendszeres takarítás és javítás. A törléssel járó műveletek előtt megmutatjuk, mi kerülne törlésre, " "és csak a megerősítésed után futnak."), "masodlagos", True, ) ) self.figyelem = cimke("", "figyelem", True) self.figyelem.hide() doboz.addWidget(self.figyelem) self.racs = Racs(260, 12) self.kartyak = {} for azon, parancs, nev, leiras, _ in MUVELETEK: kartya = MuveletKartya(parancs, nev, leiras, lambda _=False, a=azon: self._futtat(a)) self.kartyak[azon] = kartya self.racs.hozzaad(kartya) doboz.addWidget(self.racs) doboz.addStretch(1) def megjelenik(self, *_): helper = muveletek.helper_elerheto() self.figyelem.setText(tr("A RaveOS Center rendszerhelpere nincs telepítve, a műveletek nem futtathatók.")) self.figyelem.setVisible(not helper) for azon in self.kartyak: self._ellenoriz(azon) def _ellenoriz(self, azon): kartya = self.kartyak[azon] if tarolt(f"karbantartas_{azon}") is None: kartya.gomb.setEnabled(False) kartya.osszegzes.setText(tr("Ellenőrzés...")) gyorsitott( f"karbantartas_{azon}", karbantartas.ELONEZETEK[azon], kesz=lambda adat, a=azon: self._kesz(a, adat), hiba=lambda uzenet, a=azon: self._kesz(a, {"elerheto": False, "osszegzes": uzenet, "elemek": []}), kor=60, ) def _kesz(self, azon, adat): self.adat[azon] = adat kartya = self.kartyak[azon] kartya.osszegzes.setText(adat["osszegzes"]) torlo = next(m[4] for m in MUVELETEK if m[0] == azon) teendo = not torlo or azon == "naplo" or bool(adat["elemek"]) kartya.gomb.setEnabled(adat["elerheto"] and teendo and muveletek.helper_elerheto()) def _futtat(self, azon): adat = self.adat.get(azon) if not adat: return nev = next(m[2] for m in MUVELETEK if m[0] == azon) kivalasztott = None if azon == "cache": szoveg = tr( "Ezek a csomagfájlok törlődnek a cache-ből ({0}). A telepített programokat nem érinti.", adat['osszegzes'], ) elif azon == "arva": szoveg = ( tr("Pontosan ezek a csomagok törlődnek, más nem. Vedd ki a pipát annál, amit megtartanál. " "Utána újabb árva függőségek jelenhetnek meg, ezeket a kártya újra megmutatja.") ) elif azon == "naplo": szoveg = tr( "{0}. A két hétnél régebbi naplók törlődnek, és legfeljebb 100 MB marad.", adat['osszegzes'], ) elif azon == "flatpak": szoveg = tr("Ezek a runtime-ok törlődnek. Az alkalmazásaid továbbra is működnek.") else: szoveg = "" if szoveg: ablak = ElonezetAblak(self, nev, szoveg, adat["elemek"], azon == "arva", tr("Törlés")) if ablak.exec() != QDialog.DialogCode.Accepted: return if azon == "arva": kivalasztott = ablak.kivalasztott() lepesek = karbantartas.lepesek(azon, adat, kivalasztott) if not lepesek: return FolyamatAblak(self, nev, lepesek, tr("A művelet elkészült.")).exec() self._ellenoriz(azon) FUL = Karbantartas