from datetime import datetime from PyQt6.QtCore import Qt, QTimer from PyQt6.QtGui import QTextCursor from PyQt6.QtWidgets import ( QCheckBox, QDialog, QHBoxLayout, QLineEdit, QListWidget, QListWidgetItem, QPlainTextEdit, QPushButton, QScrollArea, QVBoxLayout, QWidget, ) from raveos_center import beallitasok, diagnosztika, jegyek_api from raveos_center.elemek import Csillagok, Fulsor, Kartya, Oldal, Verem, cimke, gomb from raveos_center.hatter import gyorsitott, hatterben AZON = "visszajelzes" MENU = "Visszajelzés" IKON = "visszajelzes" ALLAPOT = { "uj": ("Beküldve", ""), "folyamatban": ("Folyamatban", "sarga"), "tervezett": ("Tervezett", "sarga"), "megoldva": ("Megoldva", "zold"), "kesz": ("Elkészült", "zold"), "lezarva": ("Lezárva", ""), "elutasitva": ("Elutasítva", ""), } def ido(t): return datetime.fromtimestamp(t).strftime("%Y.%m.%d %H:%M") def allapotcimke(allapot): szoveg, szin = ALLAPOT.get(allapot, (allapot, "")) c = cimke(szoveg.upper(), "allapotcimke") if szin: c.setProperty("szin", szin) return c def uzenetsav(uzenet): sav = cimke(uzenet, "figyelem", True) sav.hide() return sav class JegySor(QWidget): def __init__(self, jegy): super().__init__() doboz = QVBoxLayout(self) doboz.setContentsMargins(14, 12, 14, 12) doboz.setSpacing(6) felso = QHBoxLayout() felso.setSpacing(8) tipus = "HIBA" if jegy["tipus"] == "hiba" else "ÖTLET" felso.addWidget(cimke(tipus, "monozold")) felso.addStretch(1) if jegy["uj_valasz"]: felso.addWidget(cimke("ÚJ VÁLASZ", "jelveny")) felso.addWidget(allapotcimke(jegy["allapot"])) doboz.addLayout(felso) cim = cimke(jegy["cim"]) cim.setStyleSheet("font-weight: 600;") cim.setText(cim.fontMetrics().elidedText(jegy["cim"], Qt.TextElideMode.ElideRight, 300)) cim.setToolTip(jegy["cim"]) doboz.addWidget(cim) doboz.addWidget(cimke(ido(jegy["frissitve"]), "halvany")) for w in self.findChildren(QWidget): w.setAttribute(Qt.WidgetAttribute.WA_TransparentForMouseEvents) class Uzenet(QWidget): def __init__(self, uzenet): super().__init__() self.setObjectName("uzenet") self.setAttribute(Qt.WidgetAttribute.WA_StyledBackground, True) csapat = uzenet["szerzo"] == "admin" self.setProperty("csapat", csapat) doboz = QVBoxLayout(self) doboz.setContentsMargins(14, 12, 14, 12) doboz.setSpacing(6) ki = "RaveOS csapat" if csapat else "Te" doboz.addWidget(cimke(f"{ki} · {ido(uzenet['ido'])}", "halvany")) szoveg = cimke(uzenet["szoveg"], tordel=True) szoveg.setTextInteractionFlags(Qt.TextInteractionFlag.TextSelectableByMouse) doboz.addWidget(szoveg) class JelentesAblak(QDialog): def __init__(self, szulo, szoveg): super().__init__(szulo) self.setWindowTitle("A csatolt diagnosztika tartalma") self.resize(820, 600) doboz = QVBoxLayout(self) doboz.setContentsMargins(20, 20, 20, 20) doboz.setSpacing(12) doboz.addWidget(cimke("Pontosan ez kerül feltöltésre, ha bejelölöd a csatolást:", "masodlagos")) mezo = QPlainTextEdit(szoveg) mezo.setReadOnly(True) mezo.setObjectName("mono") doboz.addWidget(mezo, 1) bezar = gomb("Bezárás", fo=True) bezar.clicked.connect(self.accept) doboz.addWidget(bezar, 0, Qt.AlignmentFlag.AlignRight) class Urlap(QWidget): def __init__(self, oldal): super().__init__() self.oldal = oldal self.tipus = "hiba" doboz = QVBoxLayout(self) doboz.setContentsMargins(0, 0, 0, 0) doboz.setSpacing(12) self.cim = cimke("", "h2") doboz.addWidget(self.cim) self.leiras = cimke("", "masodlagos", True) doboz.addWidget(self.leiras) doboz.addWidget(cimke("Cím", "kartyacim")) self.cim_mezo = QLineEdit() self.cim_mezo.setMaxLength(120) doboz.addWidget(self.cim_mezo) doboz.addWidget(cimke("Leírás", "kartyacim")) self.szoveg_mezo = QPlainTextEdit() self.szoveg_mezo.setMinimumHeight(160) doboz.addWidget(self.szoveg_mezo) self.diag = Kartya(terkoz=8, margo=16) self.diag_jelolo = QCheckBox("Diagnosztika csatolása (ajánlott, segít megtalálni a hibát)") self.diag.elrendezes.addWidget(self.diag_jelolo) lista = "\n".join(f" - {t}" for t in diagnosztika.TARTALOM) self.diag.elrendezes.addWidget( cimke( f"Ha bejelölöd, egy jelentést is csatolunk a gépedről:\n{lista}\n\n" f"Feltöltés előtt kitakarjuk: {diagnosztika.KITAKARAS}. Jelszó nem kerül bele. " "Titkosított kapcsolaton megy el, csak a RaveOS fejlesztői látják, és 30 nap után törlődik.", "halvany", True, ) ) self.megnez = gomb("Megnézem, mi kerül bele", kicsi=True) self.megnez.clicked.connect(self._megnez) self.diag.elrendezes.addWidget(self.megnez, 0, Qt.AlignmentFlag.AlignLeft) doboz.addWidget(self.diag) doboz.addWidget( cimke( "A jegyhez mindig csatoljuk a RaveOS-verziót, a kernelt, az asztali környezetet és a videokártya nevét.", "halvany", True, ) ) self.hiba = uzenetsav("") doboz.addWidget(self.hiba) gombok = QHBoxLayout() gombok.addStretch(1) self.megse = gomb("Mégse") self.megse.clicked.connect(self.oldal.urlap_bezar) self.kuld = gomb("Beküldés", fo=True) self.kuld.clicked.connect(self._kuld) gombok.addWidget(self.megse) gombok.addWidget(self.kuld) doboz.addLayout(gombok) doboz.addStretch(1) def nyit(self, tipus): self.tipus = tipus self.cim_mezo.clear() self.szoveg_mezo.clear() self.diag_jelolo.setChecked(False) self.hiba.hide() self.kuld.setEnabled(True) if tipus == "hiba": self.cim.setText("ÚJ HIBAJEGY") self.leiras.setText("Írd le, mi történt, és mit csináltál előtte. Ha válaszolunk, itt fogod látni.") self.cim_mezo.setPlaceholderText("Például: Nem indul a Steam a frissítés után") self.szoveg_mezo.setPlaceholderText("Mi a hiba, mikor jelentkezik, mit próbáltál már?") self.diag.show() else: self.cim.setText("ÚJ ÖTLET") self.leiras.setText( "Mi hiányzik a RaveOS-ből? Az ötleted a jóváhagyásunk után jelenik meg a közös listában, " "ahol mások is támogathatják." ) self.cim_mezo.setPlaceholderText("Például: Sötét és világos téma váltó") self.szoveg_mezo.setPlaceholderText("Mit szeretnél, és miért lenne hasznos?") self.diag.hide() self.cim_mezo.setFocus() def _megnez(self): self.megnez.setEnabled(False) self.megnez.setText("Összeállítás...") def kesz(szoveg): self.megnez.setEnabled(True) self.megnez.setText("Megnézem, mi kerül bele") JelentesAblak(self, szoveg).exec() hatterben(diagnosztika.jelentes, kesz=kesz) def _kuld(self): cim = self.cim_mezo.text().strip() szoveg = self.szoveg_mezo.toPlainText().strip() if len(cim) < 3 or len(szoveg) < 10: self.hiba.setText("Adj meg egy legalább 3 karakteres címet és egy legalább 10 karakteres leírást.") self.hiba.show() return self.hiba.hide() self.kuld.setEnabled(False) self.kuld.setText("Küldés...") csatol = self.tipus == "hiba" and self.diag_jelolo.isChecked() tipus = self.tipus def munka(): naplo = jegyek_api.naplo_feltolt(diagnosztika.jelentes()) if csatol else None return jegyek_api.uj_jegy(tipus, cim, szoveg, diagnosztika.rendszer_osszegzes(), naplo) hatterben(munka, kesz=self._kuldve, hiba=self._kuldes_hiba) def _kuldve(self, jegy): self.kuld.setText("Beküldés") self.oldal.bekuldve(jegy) def _kuldes_hiba(self, uzenet): self.kuld.setEnabled(True) self.kuld.setText("Beküldés") self.hiba.setText(jegyek_api.HIBAUZENETEK.get(uzenet, f"A beküldés nem sikerült: {uzenet}")) self.hiba.show() class Reszletek(QWidget): def __init__(self, oldal): super().__init__() self.oldal = oldal self.jegy_id = None doboz = QVBoxLayout(self) doboz.setContentsMargins(0, 0, 0, 0) doboz.setSpacing(12) self.cim = cimke("", "h2", True) doboz.addWidget(self.cim) self.meta = QHBoxLayout() self.meta.setSpacing(10) doboz.addLayout(self.meta) self.lezart = uzenetsav("") doboz.addWidget(self.lezart) gorgeto = QScrollArea() gorgeto.setWidgetResizable(True) self.szal_doboz = QWidget() self.szal = QVBoxLayout(self.szal_doboz) self.szal.setContentsMargins(0, 0, 8, 0) self.szal.setSpacing(10) gorgeto.setWidget(self.szal_doboz) self.gorgeto = gorgeto doboz.addWidget(gorgeto, 1) self.valasz_doboz = QWidget() vd = QVBoxLayout(self.valasz_doboz) vd.setContentsMargins(0, 0, 0, 0) vd.setSpacing(8) self.valasz_mezo = QPlainTextEdit() self.valasz_mezo.setPlaceholderText("Válasz a RaveOS csapatnak") self.valasz_mezo.setFixedHeight(96) vd.addWidget(self.valasz_mezo) self.hiba = uzenetsav("") vd.addWidget(self.hiba) sor = QHBoxLayout() sor.addStretch(1) self.kuld = gomb("Válasz küldése", fo=True) self.kuld.clicked.connect(self._kuld) sor.addWidget(self.kuld) vd.addLayout(sor) doboz.addWidget(self.valasz_doboz) def betolt(self, jegy): self.jegy_id = jegy["id"] self.cim.setText(jegy["cim"]) while self.meta.count(): w = self.meta.takeAt(0).widget() if w: w.deleteLater() self.meta.addWidget(cimke("HIBAJEGY" if jegy["tipus"] == "hiba" else "ÖTLET", "monozold")) self.meta.addWidget(allapotcimke(jegy["allapot"])) self.meta.addWidget(cimke(f"#{jegy['id']} · {ido(jegy['letrehozva'])}", "halvany")) if jegy["tipus"] == "otlet": self.meta.addWidget(cimke("nyilvános" if jegy["nyilvanos"] else "jóváhagyásra vár", "halvany")) self.meta.addStretch(1) if jegy.get("torles"): self.lezart.setText( f"Ez a jegy le van zárva, és {ido(jegy['torles'])} után automatikusan törlődik. " "Ha a hiba újra jelentkezik, nyiss új jegyet." ) self.lezart.show() self.valasz_doboz.hide() else: self.lezart.hide() self.valasz_doboz.show() while self.szal.count(): w = self.szal.takeAt(0).widget() if w: w.deleteLater() for u in jegy.get("uzenetek", []): self.szal.addWidget(Uzenet(u)) self.szal.addStretch(1) self.hiba.hide() self.valasz_mezo.clear() def _kuld(self): szoveg = self.valasz_mezo.toPlainText().strip() if not szoveg: return self.kuld.setEnabled(False) jegy_id = self.jegy_id def munka(): jegyek_api.valasz(jegy_id, szoveg) return jegyek_api.jegy(jegy_id) def kesz(jegy): self.kuld.setEnabled(True) self.betolt(jegy) self.oldal.lista_frissit() def hiba(uzenet): self.kuld.setEnabled(True) if uzenet == "nincs_jegy": self.oldal.jegy_eltunt() return self.hiba.setText(jegyek_api.HIBAUZENETEK.get(uzenet, f"A küldés nem sikerült: {uzenet}")) self.hiba.show() hatterben(munka, kesz=kesz, hiba=hiba) class ErtekelesLap(QWidget): SZINTEK = {1: "Nagyon rossz", 2: "Rossz", 3: "Elmegy", 4: "Jó", 5: "Kiváló"} MAX = 500 def __init__(self, oldal): super().__init__() self.oldal = oldal self.mentett = None self.szerkesztve = False self.kuldes = False doboz = QVBoxLayout(self) doboz.setContentsMargins(0, 0, 12, 0) doboz.setSpacing(16) osszesito = Kartya("A RaveOS értékelése", terkoz=8, margo=20) sor = QHBoxLayout() sor.setSpacing(16) self.atlag = cimke("-", "nagyszam") sor.addWidget(self.atlag) jobb = QVBoxLayout() jobb.setSpacing(4) self.atlag_csillag = Csillagok(24) jobb.addWidget(self.atlag_csillag) self.darab = cimke("", "halvany") jobb.addWidget(self.darab) sor.addLayout(jobb) sor.addStretch(1) osszesito.elrendezes.addLayout(sor) doboz.addWidget(osszesito) sajat = Kartya("A te értékelésed", terkoz=10, margo=20) valaszto = QHBoxLayout() valaszto.setSpacing(14) self.csillagok = Csillagok(34, valaszthato=True) self.csillagok.valasztva.connect(self._valasztva) valaszto.addWidget(self.csillagok) self.szint = cimke("Kattints a csillagokra", "masodlagos") valaszto.addWidget(self.szint) valaszto.addStretch(1) sajat.elrendezes.addLayout(valaszto) self.szoveg = QPlainTextEdit() self.szoveg.setPlaceholderText("Röviden: mi tetszik, mi nem? (nem kötelező)") self.szoveg.setFixedHeight(96) self.szoveg.textChanged.connect(self._szoveg_valtozott) sajat.elrendezes.addWidget(self.szoveg) self.szamlalo = cimke(f"0 / {self.MAX}", "monohalvany") sajat.elrendezes.addWidget(self.szamlalo, 0, Qt.AlignmentFlag.AlignRight) sajat.elrendezes.addWidget( cimke( "A szöveges véleményt csak a RaveOS fejlesztői látják, nyilvánosan csak a csillagok átlaga jelenik meg. " "Gépenként egy értékelés számít, bármikor módosíthatod.", "halvany", True, ) ) self.hiba = uzenetsav("") sajat.elrendezes.addWidget(self.hiba) gombok = QHBoxLayout() self.allapot = cimke("", "monozold") gombok.addWidget(self.allapot) gombok.addStretch(1) self.kuld = gomb("Értékelés küldése", fo=True) self.kuld.setEnabled(False) self.kuld.clicked.connect(self._kuld) gombok.addWidget(self.kuld) sajat.elrendezes.addLayout(gombok) doboz.addWidget(sajat) doboz.addStretch(1) def betolt(self, adat): self.atlag.setText(f"{adat['atlag']:.1f}".replace(".", ",") if adat["darab"] else "-") self.atlag_csillag.beallit(adat["atlag"]) self.darab.setText( f"{adat['darab']} értékelés alapján" if adat["darab"] else "Még nincs értékelés. Legyél te az első!" ) sajat = adat.get("sajat") if sajat == self.mentett: return self.mentett = sajat self.allapot.setText(f"ELKÜLDVE: {ido(sajat['ido'])}" if sajat else "") if not self.szerkesztve: self.csillagok.beallit(sajat["csillag"] if sajat else 0) self.szint.setText(self.SZINTEK[sajat["csillag"]] if sajat else "Kattints a csillagokra") self.szoveg.blockSignals(True) self.szoveg.setPlainText(sajat["szoveg"] if sajat else "") self.szoveg.blockSignals(False) self.szamlalo.setText(f"{len(self.szoveg.toPlainText())} / {self.MAX}") self._gomb_frissit() def _valasztva(self, csillag): self.szerkesztve = True self.szint.setText(self.SZINTEK[csillag]) self._gomb_frissit() def _szoveg_valtozott(self): self.szerkesztve = True szoveg = self.szoveg.toPlainText() if len(szoveg) > self.MAX: self.szoveg.blockSignals(True) self.szoveg.setPlainText(szoveg[: self.MAX]) self.szoveg.moveCursor(QTextCursor.MoveOperation.End) self.szoveg.blockSignals(False) szoveg = szoveg[: self.MAX] self.szamlalo.setText(f"{len(szoveg)} / {self.MAX}") self._gomb_frissit() def _valtozott(self): if not self.mentett: return True return int(self.csillagok.ertek) != self.mentett["csillag"] or ( self.szoveg.toPlainText().strip() != self.mentett["szoveg"] ) def _gomb_frissit(self): self.kuld.setText("Értékelés módosítása" if self.mentett else "Értékelés küldése") szabad = self.oldal.szabad() and not self.kuldes self.csillagok.setEnabled(szabad) self.szoveg.setEnabled(szabad) self.kuld.setEnabled(szabad and self.csillagok.ertek >= 1 and self._valtozott()) def _kuld(self): csillag = int(self.csillagok.ertek) szoveg = self.szoveg.toPlainText().strip() self.hiba.hide() self.kuldes = True self._gomb_frissit() self.kuld.setText("Küldés...") def kesz(adat): self.kuldes = False self.szerkesztve = False self.mentett = None self.betolt(adat) self.allapot.setText("KÖSZÖNJÜK, ELMENTETTÜK") def hiba(uzenet): self.kuldes = False self.hiba.setText(jegyek_api.HIBAUZENETEK.get(uzenet, f"A küldés nem sikerült: {uzenet}")) self.hiba.show() self._gomb_frissit() hatterben(jegyek_api.ertekel, csillag, szoveg, kesz=kesz, hiba=hiba) ELFOGADAS_VERZIO = 3 ISMERTETO = [ ("Mire jó?", "", [ "Itt közvetlenül a RaveOS fejlesztőinek jelezhetsz hibát, és küldhetsz ötletet. " "Minden jegyet elolvasunk, és itt, a Centerben válaszolunk.", ]), ("Hogyan működik?", "szam", [ "Hibajegy: írd le, mi történt. Ha bejelölöd, a géped diagnosztikáját is csatoljuk, ami sokat segít; " "előtte megnézheted, mi kerül bele.", "Válasz: ha válaszolunk, a Visszajelzés menüpont mellett szám jelenik meg, és a jegyben vissza is írhatsz.", "Ötlet: a jóváhagyott ötletek felkerülnek a közös listára, ahol mások is támogathatják. " "A legtöbbet támogatottakkal foglalkozunk először.", "Értékelés: 1-5 csillaggal értékelheted a RaveOS-t, és röviden leírhatod a véleményed. A szöveget csak " "a fejlesztők látják, a többiek csak a csillagok átlagát. Gépenként egy értékelés számít, bármikor " "módosíthatod.", ]), ("Miért így?", "szam", [ "Nem kell fiók: a géped egy névtelen azonosítót kap, ezzel látod a saját jegyeidet. " "Újratelepítés után a régi jegyeid nem látszanak.", "Csak azt küldjük el, amit beírsz, vagy amihez hozzájárulsz. A diagnosztikából kitakarjuk a személyes " "adatokat, és 30 nap után törlődik.", "A lezárt jegyek 7 nap után maguktól törlődnek.", ]), ("Szabályok", "szam", [ "A Visszajelzés csak hibák jelzésére és ötletek beküldésére való.", "Egy hibáról egy jegyet nyiss. Ha már van róla jegyed, abba írj, ne nyiss újat.", "Ötlet beküldése előtt nézd meg az Ötletek listát. Ha van hasonló, támogasd azt, ne küldj újat.", "Ne írj a jegybe vagy az értékelésbe személyes vagy titkos adatot: jelszót, e-mail-címet, telefonszámot vagy más emberek " "adatait. A diagnosztikát kitakarjuk, a beírt szöveget nem.", "Kulturált hangnemet kérünk. Sértő, fenyegető vagy trágár üzenet tiltással jár.", "Reklámot és nem ide illő linkeket ne küldj.", "A jegyekre nem azonnal válaszolunk, ezért kérünk, légy türelmes, és ne küldd el többször ugyanazt.", "Visszaélés, spam, sértő vagy nem ide illő tartalom esetén a géped kitiltható a Visszajelzésből, " "ideiglenesen vagy véglegesen. A Center minden más része ettől ugyanúgy működik.", "Két óránként legfeljebb 4 jegyet küldhetsz. Ennél több beküldés automatikusan 24 órás tiltással jár.", ]), ] HOZZAJARULAS = ( "Az Elfogadom gombbal elfogadod a fenti szabályokat, és hozzájárulsz, hogy a beírt szöveget, a géped " "alapadatait (RaveOS-verzió, kernel, asztali környezet, videokártya) és, ha bejelölöd, a diagnosztikát " "elküldjük a RaveOS fejlesztőinek." ) class IsmertetoAblak(QDialog): def __init__(self, szulo, elfogadva): super().__init__(szulo) self.setWindowTitle("Visszajelzés") kepernyo = szulo.screen().availableGeometry() if szulo and szulo.screen() else None magassag = min(860, kepernyo.height() - 80) if kepernyo else 760 self.resize(700, magassag) kulso = QVBoxLayout(self) kulso.setContentsMargins(0, 0, 0, 20) kulso.setSpacing(12) gorgeto = QScrollArea() gorgeto.setWidgetResizable(True) tartalom = QWidget() gorgeto.setWidget(tartalom) kulso.addWidget(gorgeto, 1) doboz = QVBoxLayout(tartalom) doboz.setContentsMargins(32, 28, 32, 8) doboz.setSpacing(12) doboz.addWidget(cimke("ISMERTETŐ ÉS SZABÁLYOK", "eyebrow")) doboz.addWidget(cimke("HOGYAN MŰKÖDIK A VISSZAJELZÉS?", "h2", True)) sorszam = 0 for cim, jeloles, pontok in ISMERTETO: doboz.addSpacing(4) fejlec = cimke(cim) fejlec.setStyleSheet("font-size: 15px; font-weight: 600;") doboz.addWidget(fejlec) for pont in pontok: if not jeloles: doboz.addWidget(cimke(pont, "masodlagos", True)) continue sorszam += 1 sor = QHBoxLayout() sor.setSpacing(10) jel = cimke(f"{sorszam}.", "monozold") jel.setFixedWidth(26) sor.addWidget(jel, 0, Qt.AlignmentFlag.AlignTop) sor.addWidget(cimke(pont, "masodlagos", True), 1) doboz.addLayout(sor) doboz.addStretch(1) also = QVBoxLayout() also.setContentsMargins(32, 0, 32, 0) also.setSpacing(12) kulso.addLayout(also) gombok = QHBoxLayout() gombok.addStretch(1) if elfogadva: also.addWidget(cimke("A szabályokat már elfogadtad.", "halvany")) ok = gomb("Bezárás", fo=True) ok.clicked.connect(self.accept) gombok.addWidget(ok) else: also.addWidget(cimke(HOZZAJARULAS, "figyelem", True)) nem = gomb("Most nem") nem.clicked.connect(self.reject) igen = gomb("Elfogadom", fo=True) igen.clicked.connect(self.accept) gombok.addWidget(nem) gombok.addWidget(igen) also.addLayout(gombok) class OtletKartya(Kartya): def __init__(self, otlet, szavaz): super().__init__(terkoz=8, margo=18) felso = QHBoxLayout() cim = cimke(otlet["cim"], tordel=True) cim.setStyleSheet("font-size: 15px; font-weight: 600;") felso.addWidget(cim, 1) felso.addWidget(allapotcimke(otlet["allapot"]), 0, Qt.AlignmentFlag.AlignTop) self.elrendezes.addLayout(felso) self.elrendezes.addWidget(cimke(otlet.get("leiras") or "", "masodlagos", True)) also = QHBoxLayout() also.addWidget(cimke(f"{otlet['szavazat']} támogató", "monohalvany")) if otlet.get("sajat"): also.addWidget(cimke("· a te ötleted", "monohalvany")) also.addStretch(1) tamogatva = otlet["sajat_szavazat"] g = gomb("Támogatva" if tamogatva else "Támogatom", fo=not tamogatva, kicsi=True) g.clicked.connect(lambda: szavaz(otlet["id"], not tamogatva, g)) also.addWidget(g) self.elrendezes.addLayout(also) class Visszajelzes(Oldal): def __init__(self, kozpont): super().__init__(kozpont, "HIBÁK ÉS ÖTLETEK", "Visszajelzés", kitolt=True) self.uj_hiba = self.fejlec_gomb(gomb("Új hibajegy", fo=True)) self.uj_hiba.clicked.connect(lambda: self.urlap_nyit("hiba")) self.uj_otlet = self.fejlec_gomb(gomb("Új ötlet")) self.uj_otlet.clicked.connect(lambda: self.urlap_nyit("otlet")) sugo = self.fejlec_gomb(gomb("Hogyan működik?")) sugo.clicked.connect(self.ismerteto) self.elfogadas_sav = QWidget() es = QHBoxLayout(self.elfogadas_sav) es.setContentsMargins(0, 0, 0, 0) es.setSpacing(12) es.addWidget(cimke("A Visszajelzés használatához el kell fogadnod a szabályokat.", "figyelem", True), 1) elolvas = gomb("Szabályok elolvasása", fo=True) elolvas.clicked.connect(self.ismerteto) es.addWidget(elolvas) self.elfogadas_sav.hide() self.torzs.addWidget(self.elfogadas_sav) self.tiltas_sav = cimke("", "figyelem", True) self.tiltas_sav.hide() self.torzs.addWidget(self.tiltas_sav) self.kitiltva = False self.fulsor = Fulsor([("jegyeim", "Jegyeim"), ("otletek", "Ötletek"), ("ertekeles", "Értékelés")], self.ful) self.torzs.addWidget(self.fulsor) self.hiba = uzenetsav("") self.torzs.addWidget(self.hiba) self.fulek = Verem() self.torzs.addWidget(self.fulek, 1) self.tolto = QWidget() self.tolto.hide() self.torzs.addWidget(self.tolto, 1) jegyeim = QWidget() sor = QHBoxLayout(jegyeim) sor.setContentsMargins(0, 0, 0, 0) sor.setSpacing(24) bal = QVBoxLayout() bal.setSpacing(8) self.lista = QListWidget() self.lista.setFixedWidth(340) self.lista.setMinimumHeight(160) self.lista.setVerticalScrollMode(QListWidget.ScrollMode.ScrollPerPixel) self.lista.currentItemChanged.connect(self._kivalaszt) bal.addWidget(self.lista, 1) sor.addLayout(bal) self.jobb = Verem() self.ures = QWidget() ud = QVBoxLayout(self.ures) ud.setContentsMargins(0, 0, 0, 0) self.ures_szoveg = cimke("", "masodlagos", True) ud.addWidget(self.ures_szoveg) ud.addStretch(1) self.reszletek = Reszletek(self) self.urlap = Urlap(self) self.urlap_gorgeto = QScrollArea() self.urlap_gorgeto.setWidgetResizable(True) self.urlap_gorgeto.setWidget(self.urlap) self.urlap.setContentsMargins(0, 0, 12, 0) for w in (self.ures, self.reszletek, self.urlap_gorgeto): self.jobb.addWidget(w) sor.addWidget(self.jobb, 1) self.fulek.addWidget(jegyeim) otletek_gorgeto = QScrollArea() otletek_gorgeto.setWidgetResizable(True) otletek = QWidget() otletek_gorgeto.setWidget(otletek) od = QVBoxLayout(otletek) od.setContentsMargins(0, 0, 12, 0) od.setSpacing(12) od.addWidget( cimke( "Mások ötletei, amelyeket jóváhagytunk. Támogasd, amit te is szeretnél, így látjuk, mi a legfontosabb.", "masodlagos", True, ) ) self.otlet_doboz = QVBoxLayout() self.otlet_doboz.setSpacing(12) od.addLayout(self.otlet_doboz) od.addStretch(1) self.fulek.addWidget(otletek_gorgeto) ertekeles_gorgeto = QScrollArea() ertekeles_gorgeto.setWidgetResizable(True) self.ertekeles_lap = ErtekelesLap(self) ertekeles_gorgeto.setWidget(self.ertekeles_lap) self.fulek.addWidget(ertekeles_gorgeto) self.jegyek = [] self.lista_betoltve = False self.ful("jegyeim") def indulaskor(self): hatterben(jegyek_api.jegyeim, kesz=self._jelveny_frissit) def elfogadva(self): return (beallitasok.ertek("visszajelzes_elfogadva", 0) or 0) >= ELFOGADAS_VERZIO def szabad(self): return self.elfogadva() and not self.kitiltva def ismerteto(self): if IsmertetoAblak(self, self.elfogadva()).exec() and not self.elfogadva(): beallitasok.beallit("visszajelzes_elfogadva", ELFOGADAS_VERZIO) self._allapot_frissit() def _allapot_frissit(self): self.elfogadas_sav.setVisible(not self.elfogadva() and not self.kitiltva) self.tiltas_sav.setVisible(self.kitiltva) self.fulsor.setVisible(not self.kitiltva) self.fulek.setVisible(not self.kitiltva) self.tolto.setVisible(self.kitiltva) for g in (self.uj_hiba, self.uj_otlet): g.setEnabled(self.szabad()) self.reszletek.valasz_doboz.setEnabled(self.szabad()) for g in self.fulek.widget(1).findChildren(QPushButton): g.setEnabled(self.szabad()) self.ertekeles_lap._gomb_frissit() def _tiltas_kesz(self, adat): self.kitiltva = bool(adat.get("kitiltva")) if self.kitiltva: meddig = f"eddig: {ido(adat['lejar'])}" if adat.get("lejar") else "véglegesen" self.tiltas_sav.setText( f"Ez a gép {meddig} ki van tiltva a Visszajelzés használatából a szabályok megsértése miatt. " f"Ok: {adat.get('ok') or '-'}\n\nA RaveOS Center minden más része ugyanúgy működik." ) self._allapot_frissit() if not self.kitiltva: self.lista_frissit() if self.fulek.currentIndex() == 1: self._otletek_frissit() elif self.fulek.currentIndex() == 2: self._ertekeles_frissit() def megjelenik(self, *_): self._allapot_frissit() if not self.elfogadva(): QTimer.singleShot(200, self.ismerteto) gyorsitott("jegy_allapot", jegyek_api.allapot, kesz=self._tiltas_kesz, hiba=self._hibat_mutat, kor=60) def ful(self, azon): self.fulsor.aktiv(azon) self.fulek.setCurrentIndex({"jegyeim": 0, "otletek": 1, "ertekeles": 2}[azon]) if azon == "otletek": self._otletek_frissit() elif azon == "ertekeles": self._ertekeles_frissit() def _ertekeles_frissit(self): def kesz(adat): self.hiba.hide() self.ertekeles_lap.betolt(adat) hatterben(jegyek_api.ertekeles, kesz=kesz, hiba=self._hibat_mutat) def jegy_eltunt(self): self.reszletek.jegy_id = None self.lista.setCurrentRow(-1) self.jobb.setCurrentWidget(self.ures) self.lista_frissit() def _jegy_hiba(self, uzenet): if uzenet == "nincs_jegy": self.jegy_eltunt() else: self._hibat_mutat(uzenet) def _hibat_mutat(self, uzenet): self.hiba.setText(jegyek_api.HIBAUZENETEK.get(uzenet, f"Hiba történt: {uzenet}")) self.hiba.show() def _jelveny_frissit(self, jegyek): self.kozpont.jelveny(AZON, sum(1 for j in jegyek if j["uj_valasz"])) def lista_frissit(self, kivalaszt=None): def kesz(jegyek): self.hiba.hide() self._jelveny_frissit(jegyek) aktualis = kivalaszt or self.reszletek.jegy_id if jegyek == self.jegyek and self.lista_betoltve and not kivalaszt: return self.jegyek = jegyek self.lista_betoltve = True self.lista.blockSignals(True) self.lista.clear() for j in jegyek: elem = QListWidgetItem() elem.setData(Qt.ItemDataRole.UserRole, j["id"]) sor = JegySor(j) elem.setSizeHint(sor.sizeHint()) self.lista.addItem(elem) self.lista.setItemWidget(elem, sor) if j["id"] == aktualis: self.lista.setCurrentItem(elem) self.lista.blockSignals(False) if self.jobb.currentWidget() is not self.urlap_gorgeto and not self.lista.currentItem(): self.ures_szoveg.setText( "Még nincs jegyed. Ha hibát találtál, vagy ötleted van, írj nekünk a fenti gombokkal." if not jegyek else "Válassz egy jegyet a listából." ) self.jobb.setCurrentWidget(self.ures) hatterben(jegyek_api.jegyeim, kesz=kesz, hiba=self._hibat_mutat) def _kivalaszt(self, elem, _elozo=None): if not elem: return jegy_id = elem.data(Qt.ItemDataRole.UserRole) def kesz(jegy): aktualis = self.lista.currentItem() if not aktualis or aktualis.data(Qt.ItemDataRole.UserRole) != jegy_id: return self.reszletek.betolt(jegy) self.jobb.setCurrentWidget(self.reszletek) self.lista_frissit_csendben(jegy_id) hatterben(jegyek_api.jegy, jegy_id, kesz=kesz, hiba=self._jegy_hiba) def lista_frissit_csendben(self, jegy_id): for j in self.jegyek: if j["id"] == jegy_id and j["uj_valasz"]: self.lista_frissit(jegy_id) return def urlap_nyit(self, tipus): self.ful("jegyeim") self.lista.setCurrentRow(-1) self.urlap.nyit(tipus) self.jobb.setCurrentWidget(self.urlap_gorgeto) def urlap_bezar(self): self.jobb.setCurrentWidget(self.ures) self.lista_frissit() def bekuldve(self, jegy): self.lista_frissit(jegy["id"]) self._kivalaszt_id(jegy["id"]) def _kivalaszt_id(self, jegy_id): hatterben( jegyek_api.jegy, jegy_id, kesz=lambda j: (self.reszletek.betolt(j), self.jobb.setCurrentWidget(self.reszletek)), hiba=self._jegy_hiba, ) def _otletek_frissit(self): def kesz(otletek): self.hiba.hide() while self.otlet_doboz.count(): w = self.otlet_doboz.takeAt(0).widget() if w: w.deleteLater() if not otletek: self.otlet_doboz.addWidget(cimke("Még nincs közzétett ötlet.", "halvany")) for o in otletek: kartya = OtletKartya(o, self._szavaz) for g in kartya.findChildren(QPushButton): g.setEnabled(self.szabad()) self.otlet_doboz.addWidget(kartya) hatterben(jegyek_api.otletek, kesz=kesz, hiba=self._hibat_mutat) def _szavaz(self, jegy_id, tamogat, g): g.setEnabled(False) hatterben(jegyek_api.szavaz, jegy_id, tamogat, kesz=lambda _: self._otletek_frissit(), hiba=self._hibat_mutat) OLDAL = Visszajelzes