94 lines
3.6 KiB
Python
94 lines
3.6 KiB
Python
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('<u>', '</u>'))
|
||
|
||
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) |