diff --git a/src/clangformat.py b/src/clangformat.py index 4706664..ba46920 100644 --- a/src/clangformat.py +++ b/src/clangformat.py @@ -5,7 +5,7 @@ import sys from src.errors import ClangError -def clang_format(file_path) -> str: +def clang_format(file_path) -> tuple[str, str]: command = ["clang-format", "--dry-run", file_path] try: output = subprocess.check_output(command, stderr=subprocess.STDOUT, text=True) @@ -20,10 +20,11 @@ def clang_format(file_path) -> str: ) exit(1) - return output + return file_path, output -def parse_clang_format_output(output) -> list[ClangError]: +def parse_clang_format_output(data) -> list[ClangError]: + filename, output = data error_pattern = ( r"(?P.+):(?P\d+):(?P\d+)" r": warning: code should be clang-formatted \[(?P.+)\]" @@ -49,4 +50,7 @@ def parse_clang_format_output(output) -> list[ClangError]: ) ) + if not errors: + return [ClangError(filename)] + return errors diff --git a/src/errors.py b/src/errors.py index 2e49042..fcc6051 100644 --- a/src/errors.py +++ b/src/errors.py @@ -1,11 +1,14 @@ +from typing import Union + + class ClangError: def __init__( self, filename: str, - line_number: int, - column_number: int, - warning_message: str, - warning_content: str, + line_number: Union[int, None] = None, + column_number: Union[int, None] = None, + warning_message: Union[str, None] = None, + warning_content: Union[str, None] = None, ) -> None: self._filename = filename self._line_number = line_number @@ -19,21 +22,26 @@ class ClangError: return self._filename @property - def line_number(self) -> int: + def line_number(self) -> Union[int, None]: """Sur quelle ligne se situe l'erreur""" return self._line_number @property - def column_number(self) -> int: + def column_number(self) -> Union[int, None]: """Où se situe l'erreur sur la ligne""" return self._column_number @property - def warning_message(self) -> str: + def warning_message(self) -> Union[str, None]: """Quelle est le nom de l'erreur""" return self._warning_message @property - def warning_content(self) -> str: + def warning_content(self) -> Union[str, None]: """Quelle est le contenu de l'erreur""" return self._warning_content + + @property + def clean(self) -> bool: + """Vérifie s'il y a des erreurs""" + return self._warning_message is None diff --git a/src/gui.py b/src/gui.py index 653b4cc..7adebf6 100644 --- a/src/gui.py +++ b/src/gui.py @@ -3,6 +3,7 @@ from tkinter import Button, Frame, Label, Tk, Toplevel from tkinter.filedialog import askdirectory, askopenfile from src.clangformat import clang_format, parse_clang_format_output +from src.errors import ClangError from src.utils import analyze_args, exts_list @@ -97,7 +98,7 @@ class GUI: data = [] for file in files: clang_format_output = clang_format(file) - data.append((file, parse_clang_format_output(clang_format_output))) + data += parse_clang_format_output(clang_format_output) self._pager(1, data, start_row) def _reset_frame(self) -> None: @@ -106,47 +107,46 @@ class GUI: self.f = Frame(self.parent) self.f.grid(columnspan=self.columnspan) - def _pager(self, num_page: int, errors: list, start_row: int) -> None: + def _pager(self, num_page: int, errors: list[ClangError], start_row: int) -> None: self._reset_frame() idx = start_row - elem_per_page = 5 - for file, error in errors: - if error: - for error in error[ - elem_per_page * (num_page - 1) : elem_per_page * num_page - ]: - Button( - self.f, - text=f"Avertissement dans {error.filename} " - f"à la ligne {error.line_number}, " - f"caractère {error.column_number}.", - borderwidth=0, - bg="SandyBrown", - activebackground="Goldenrod", - command=lambda: self._show_info( - error.warning_message, error.warning_content - ), - ).grid(column=0, row=idx, columnspan=self.columnspan) - idx += 1 + elem_per_page = 10 + for error in errors[elem_per_page * (num_page - 1) : elem_per_page * num_page]: + if not error.clean: + Button( + self.f, + text=f"Avertissement dans {error.filename} " + f"à la ligne {error.line_number}, " + f"caractère {error.column_number}.", + borderwidth=0, + bg="SandyBrown", + activebackground="Goldenrod", + command=lambda: self._show_info( + str(error.warning_message), str(error.warning_content) + ), + ).grid(column=0, row=idx, columnspan=self.columnspan) + idx += 1 else: Label( self.f, bg="MediumSpringGreen", - text=f"Aucun avertissement trouvé dans {file}.", + text=f"Aucun avertissement trouvé dans {error.filename}.", ).grid(column=0, row=idx, columnspan=self.columnspan) idx += 1 - Button( - self.f, - text="< Page précédente", - command=lambda: print("avant"), - ).grid(column=0, row=idx) - Label(self.f, text=f"Page {num_page}/{1 + len(errors) // elem_per_page}").grid( - column=1, row=idx - ) - Button( - self.f, - text="Page suivante >", - command=lambda: print("apres"), - ).grid(column=2, row=idx) + page_max = 1 + len(errors) // elem_per_page + if page_max > 1: + Button( + self.f, + text="< Page précédente", + state="disabled" if num_page <= 1 else "normal", + command=lambda: self._pager(num_page - 1, errors, start_row), + ).grid(column=0, row=idx) + Label(self.f, text=f"Page {num_page}/{page_max}").grid(column=1, row=idx) + Button( + self.f, + text="Page suivante >", + state="disabled" if num_page >= page_max else "normal", + command=lambda: self._pager(num_page + 1, errors, start_row), + ).grid(column=2, row=idx)