from PyQt6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QComboBox from PyQt6.QtGui import QTextCharFormat, QFont, QTextCursor class FormattingToolbar(QWidget): def __init__(self, formatter): super().__init__() self.formatter = formatter self.init_ui() def init_ui(self): layout = QVBoxLayout() toolbar_layout = QHBoxLayout() self.button_bold = QPushButton("Ж") self.button_bold.setStyleSheet("font-weight: bold;") self.button_bold.clicked.connect(lambda: self.formatter.toggle_special_symbols('**')) self.button_italic = QPushButton("К") self.button_italic.setStyleSheet("font-style: italic;") self.button_italic.clicked.connect(lambda: self.formatter.toggle_special_symbols('*')) self.button_strike = QPushButton("abc") self.button_strike.setStyleSheet("text-decoration: line-through;") self.button_strike.clicked.connect(lambda: self.formatter.toggle_special_symbols('~~')) self.button_underline = QPushButton("Ч") self.button_underline.setStyleSheet("text-decoration: underline;") self.button_underline.clicked.connect(lambda: self.formatter.toggle_special_symbols('', '')) self.button_header1 = QPushButton("H1") self.button_header1.clicked.connect(self.insert_header1) self.button_header2 = QPushButton("H2") self.button_header2.clicked.connect(self.insert_header2) self.header_drop = QComboBox() self.header_drop.addItems(["H1", "H2", "H3", "H4", "H5", "H6"]) self.header_drop.currentIndexChanged.connect(self.handle_header_drop) toolbar_layout.addWidget(self.button_bold) toolbar_layout.addWidget(self.button_italic) toolbar_layout.addWidget(self.button_strike) toolbar_layout.addWidget(self.button_underline) toolbar_layout.addWidget(self.button_header1) toolbar_layout.addWidget(self.button_header2) toolbar_layout.addWidget(self.header_drop) layout.addLayout(toolbar_layout) self.setLayout(layout) def insert_header1(self): self.insert_header('# ') def insert_header2(self): self.insert_header('## ') def insert_header(self, header_symbol): cursor = self.formatter.text_edit.textCursor() cursor.beginEditBlock() # Get selected text or word under cursor cursor.select(QTextCursor.SelectionType.WordUnderCursor) selected_text = cursor.selectedText() # Check if there's already a header symbol at the beginning cursor.movePosition(QTextCursor.MoveOperation.StartOfLine) cursor.select(QTextCursor.SelectionType.LineUnderCursor) line_text = cursor.selectedText().strip() if line_text.startswith('#'): # Remove existing header symbol and space line_text = line_text.replace('#', '', 1).lstrip() if selected_text: # Replace the selected text with the header symbol + selected text cursor.removeSelectedText() cursor.insertText(header_symbol + selected_text) else: # If no word is selected, just insert the header symbol cursor.insertText(header_symbol) cursor.endEditBlock() def handle_header_drop(self, index): header_level = index + 1 # Since index starts from 0, but header levels start from 1 header_symbol = '#' * header_level + ' ' # Set the correct index in the headerDrop ComboBox self.header_drop.setCurrentIndex(index) # Call insert_header with the header_symbol self.insert_header(header_symbol)