summaryrefslogtreecommitdiff
path: root/raveos-center/raveos_center/oldalak/visszajelzes.py
diff options
context:
space:
mode:
Diffstat (limited to 'raveos-center/raveos_center/oldalak/visszajelzes.py')
-rw-r--r--raveos-center/raveos_center/oldalak/visszajelzes.py887
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