From dd3b15d1aa187376c10cf65a9c0e47b94e9d7eb3 Mon Sep 17 00:00:00 2001 From: wakonig_k Date: Tue, 2 Sep 2025 20:49:05 +0200 Subject: [PATCH] feat: add support to format on save --- .../widgets/editors/monaco/monaco_widget.py | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/bec_widgets/widgets/editors/monaco/monaco_widget.py b/bec_widgets/widgets/editors/monaco/monaco_widget.py index 1f5e757d..efc8bd4e 100644 --- a/bec_widgets/widgets/editors/monaco/monaco_widget.py +++ b/bec_widgets/widgets/editors/monaco/monaco_widget.py @@ -1,7 +1,11 @@ import os +import traceback from typing import Literal +import black +import isort import qtmonaco +from bec_lib.logger import bec_logger from qtpy.QtCore import Signal from qtpy.QtWidgets import QApplication, QVBoxLayout, QWidget @@ -9,6 +13,8 @@ from bec_widgets.utils.bec_widget import BECWidget from bec_widgets.utils.colors import get_theme_name from bec_widgets.utils.error_popups import SafeSlot +logger = bec_logger.logger + class MonacoWidget(BECWidget, QWidget): """ @@ -93,6 +99,32 @@ class MonacoWidget(BECWidget, QWidget): """ return self.editor.get_text() + def format(self) -> None: + """ + Format the current text in the Monaco editor. + """ + if not self.editor: + return + try: + content = self.get_text() + try: + formatted_content = black.format_str(content, mode=black.Mode(line_length=100)) + except black.NothingChanged: + formatted_content = content + + config = isort.Config( + profile="black", + line_length=100, + multi_line_output=3, + include_trailing_comma=False, + known_first_party=["bec_widgets"], + ) + formatted_content = isort.code(formatted_content, config=config) + self.set_text(formatted_content, file_name=self.current_file) + except Exception: + content = traceback.format_exc() + logger.info(content) + def insert_text(self, text: str, line: int | None = None, column: int | None = None) -> None: """ Insert text at the current cursor position or at a specified line and column.