diff --git a/__main__.py b/__main__.py index 106ed08..1b7adf5 100644 --- a/__main__.py +++ b/__main__.py @@ -6,6 +6,7 @@ import god.interactive import god.cli as cli import god.log as log +import god.version as version import god.quotes as quotes import god.config as config import god.updater as updater @@ -60,6 +61,7 @@ def load_phrases(): def main(): """Procedimento principal""" + cli.title(f"God {version.current()}") cli.clear() cli.header() diff --git a/god/cli.py b/god/cli.py index 3223a07..957feba 100644 --- a/god/cli.py +++ b/god/cli.py @@ -11,6 +11,8 @@ from colorama import init as color_init from pyfiglet import Figlet +import win32console + import god import god.config as config import god.quotes as quotes @@ -23,6 +25,12 @@ color_init(autoreset=True) +def title(text): + """Define o título da janela""" + + win32console.SetConsoleTitle(text) + + def width(): """Obtém a largura da janela do terminal""" diff --git a/god/gui.py b/god/gui.py new file mode 100644 index 0000000..1cdcc9b --- /dev/null +++ b/god/gui.py @@ -0,0 +1,88 @@ +"""Gerenciador de interface do usuário + +Esse módulo tem funções para gerenciar a interface com o usuário, incluindo CLI +e GUI. + +""" + +import win32con +import win32console +from win32gui import MessageBox + + +def confirm(text, title="God"): + """Pede confirmação para o usuário na forma de popup + + Parâmetros + ---------- + text : str + Texto da caixa de mensagem + + title : str + Título da caixa de mensagem (Padrão: God) + + + Retorno + ------- + True caso o usuário confirme, False se não + + """ + + res = MessageBox(win32console.GetConsoleWindow(), + text, title, + win32con.MB_YESNO | win32con.MB_ICONINFORMATION) + return res == win32con.IDYES + + +def info(text, title="God"): + """Mostra uma caixa de mensagem de informação + + Parâmetros + ---------- + text : str + Texto da caixa de mensagem + + title : str + Título da caixa de mensagem (Padrão: God) + + """ + + MessageBox(win32console.GetConsoleWindow(), + text, title, + win32con.MB_OK | win32con.MB_ICONINFORMATION) + + +def error(text, title="God"): + """Mostra uma caixa de mensagem de erro + + Parâmetros + ---------- + text : str + Texto da caixa de mensagem + + title : str + Título da caixa de mensagem (Padrão: God) + + """ + + MessageBox(win32console.GetConsoleWindow(), + text, title, + win32con.MB_OK | win32con.MB_ICONERROR) + + +def warning(text, title="God"): + """Mostra uma caixa de mensagem de aviso + + Parâmetros + ---------- + text : str + Texto da caixa de mensagem + + title : str + Título da caixa de mensagem (Padrão: God) + + """ + + MessageBox(win32console.GetConsoleWindow(), + text, title, + win32con.MB_OK | win32con.MB_ICONWARNING) diff --git a/god/updater.py b/god/updater.py index f552397..b734ee8 100644 --- a/god/updater.py +++ b/god/updater.py @@ -1,6 +1,6 @@ """Gerenciador de atualização -Esse módulo faz o pareamento com a última versão disponível no GitHub, +Esse módulo faz o pareamento com a última versão disponível no GitHub, e faz a atualização de forma automática. """ @@ -16,6 +16,7 @@ import requests import god.cli as cli +import god.gui as gui import god.log as log import god.version as version @@ -32,8 +33,9 @@ def check_updates(): try: latest_release = _fetch_latest_release() except RuntimeError as ex: + gui.error("Falha na atualização." + + "Verifique sua conexão com a internet.") log.error("fetch-releases", ex) - cli.error("Falha. Verifique sua conexão com a internet.") return cli.info("Encontrado: " + latest_release['tag_name']) @@ -44,7 +46,7 @@ def check_updates(): cli.error("O god está desatualizado!") - if cli.yesno("Atualizar?"): + if _confirm(latest_release): update_dir = _download_update(latest_release) _install_update(update_dir) @@ -55,6 +57,9 @@ def check_updates(): os.system("start python apply_update.py") sys.exit(0) + else: + cli.warning("Ignorando atualização. " + + "Cuidado, isso geralmente dá ruim.") def _fetch_latest_release(): @@ -95,6 +100,21 @@ def _download_update(release): return tmp_dir +def _confirm(latest_release): + """Faz a confirmação de atualização via janela de mensagem""" + + return gui.confirm( + f"Versão atual: {version.current()}\r\n" + + f"Versão encontrada: {latest_release['tag_name']}\r\n" + + "\r\n" + + "Changelog\r\n" + + "--------------\r\n" + + latest_release['body'] + "\r\n" + + "\r\n" + + "Atualizar?", + title="Atualização disponível") + + def _install_update(update_dir): """Faz a instalação de uma atualização @@ -111,7 +131,9 @@ def _install_update(update_dir): if result == 0: cli.success("OK") else: - cli.error("Falha na instalação. Abortando atualização...") + gui.error("Falha na instalação. Abortando atualização...\r\n" + + "\r\n" + + "Veja o arquivo `error.log' para mais informações.") log.error("update", "Falha na instação das dependências") return