diff options
Diffstat (limited to 'raveos-center/raveos_center/oldalak/visszajelzes.py')
| -rw-r--r-- | raveos-center/raveos_center/oldalak/visszajelzes.py | 887 |
1 files changed, 887 insertions, 0 deletions
diff --git a/raveos-center/raveos_center/oldalak/visszajelzes.py b/raveos-center/raveos_center/oldalak/visszajelzes.py new file mode 100644 index 0000000..56664ab --- /dev/null +++ b/raveos-center/raveos_center/oldalak/visszajelzes.py @@ -0,0 +1,887 @@ +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 |