# -*- coding: utf-8 -*- # # errorPrompt.py # # Copyright © 2021 JezerM # # This file is part of Web Greeter. # # Web Greeter is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # Web Greeter is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # The following additional terms are in effect as per Section 7 of the license: # # The preservation of all legal notices and author attributions in # the material or in the Appropriate Legal Notices displayed # by works containing it is required. # # You should have received a copy of the GNU General Public License # along with Web Greeter; If not, see . from whither.toolkits.bootstrap import WebPage from PyQt5.QtWidgets import QDialogButtonBox, QDialog, QVBoxLayout, QLabel, QPushButton from logging import ( getLogger, DEBUG, ERROR, Formatter, StreamHandler, ) import globals log_format = ''.join([ '%(asctime)s [ %(levelname)s ] %(filename)s %(', 'lineno)d: %(message)s' ]) formatter = Formatter(fmt=log_format, datefmt="%Y-%m-%d %H:%M:%S") logger = getLogger("javascript") logger.propagate = False stream_handler = StreamHandler() stream_handler.setLevel(DEBUG) stream_handler.setFormatter(formatter) logger.setLevel(DEBUG) logger.addHandler(stream_handler) def javaScriptConsoleMessage(self, level: WebPage.JavaScriptConsoleMessageLevel, message: str, lineNumber: int, sourceID: str): if sourceID == "": sourceID = "console" logLevel = 0 if level == WebPage.JavaScriptConsoleMessageLevel.ErrorMessageLevel: logLevel = 40 elif level == WebPage.JavaScriptConsoleMessageLevel.WarningMessageLevel: logLevel = 30 elif level == WebPage.JavaScriptConsoleMessageLevel.InfoMessageLevel: return else: return record = logger.makeRecord( name="javascript", level=logLevel, fn="", lno=lineNumber, msg=message, args=(), exc_info=None ) record.filename = sourceID logger.handle(record) if logLevel == 40: errorMessage = "{source} {line}: {msg}".format(source = sourceID, line = lineNumber, msg = message) errorPrompt(errorMessage) class ErrorDialog(QDialog): def __init__(self, parent=None, err=""): super().__init__(parent) self.setWindowTitle("Error") self.buttonBox = QDialogButtonBox() cancelBtn = QPushButton("Cancel") defaultBtn = QPushButton("Set default theme") reloadBtn = QPushButton("Reload theme") reloadBtn.clicked.connect(self.handle_reload) self.buttonBox.addButton(defaultBtn, QDialogButtonBox.ButtonRole.AcceptRole) self.buttonBox.addButton(reloadBtn, QDialogButtonBox.ButtonRole.ResetRole) self.buttonBox.addButton(cancelBtn, QDialogButtonBox.ButtonRole.RejectRole) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) self.layout = QVBoxLayout() message = QLabel("An error ocurred. Do you want to change to default theme?") err = QLabel(err) self.layout.addWidget(message) self.layout.addWidget(err) self.layout.addWidget(self.buttonBox) self.setLayout(self.layout) def handle_reload(self, value: bool): self.done(2) def errorPrompt(err): if not globals.greeter.config.greeter.detect_theme_errors: return dia = ErrorDialog(globals.greeter._main_window.widget.centralWidget(), err) dia.exec() result = dia.result() if result == 0: # Cancel return elif result == 1: # Default theme globals.custom_config["theme"] = "default" globals.greeter.get_and_apply_user_config() globals.greeter.load_theme() return elif result == 2: # Reload globals.greeter.load_theme() return return WebPage.javaScriptConsoleMessage = javaScriptConsoleMessage