On branch main
Your branch is up to date with 'origin/main'. Changes to be committed: modified: main.py modified: mainWindow.py new file: qt_markdown/__init__.py new file: qt_markdown/__pycache__/__init__.cpython-39.pyc new file: qt_markdown/__pycache__/qt_markdown.cpython-39.pyc new file: qt_markdown/qt_markdown.py new file: qt_markdown/text_formatter/__init__.py new file: qt_markdown/text_formatter/__pycache__/__init__.cpython-39.pyc new file: qt_markdown/text_formatter/__pycache__/header_formatter.cpython-39.pyc new file: qt_markdown/text_formatter/__pycache__/text_formatter.cpython-39.pyc new file: qt_markdown/text_formatter/__pycache__/text_style_formatter.cpython-39.pyc new file: qt_markdown/text_formatter/header_formatter.py new file: qt_markdown/text_formatter/text_formatter.py new file: qt_markdown/text_formatter/text_style_formatter.py new file: qt_markdown/toolbar/__init__.py new file: qt_markdown/toolbar/__pycache__/__init__.cpython-39.pyc new file: qt_markdown/toolbar/__pycache__/toolbar.cpython-39.pyc new file: qt_markdown/toolbar/toolbar.py modified: startWindow.py
This commit is contained in:
parent
15163b606e
commit
62aa63f62f
40
main.py
40
main.py
|
@ -1,10 +1,13 @@
|
|||
import sys
|
||||
import os
|
||||
import json
|
||||
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QListWidgetItem, QLabel, QDesktopWidget
|
||||
from PyQt5.QtCore import QDir, QFileSystemWatcher
|
||||
from PyQt6.QtWidgets import QApplication, QMainWindow, QFileDialog, QListWidgetItem, QLabel
|
||||
from PyQt6.QtCore import QDir, QFileSystemWatcher, Qt
|
||||
from PyQt6.QtGui import QGuiApplication
|
||||
from startWindow import Ui_startWindow as Ui_StartWindow
|
||||
from mainWindow import Ui_MainWindow as Ui_MainWindow2
|
||||
from qt_markdown.qt_markdown import QtMarkDown
|
||||
|
||||
|
||||
CONFIG_FILE = "catalogs.json"
|
||||
|
||||
|
@ -23,10 +26,11 @@ class StartWindow(QMainWindow):
|
|||
self.load_catalogs()
|
||||
|
||||
def window_center(self):
|
||||
qr = self.frameGeometry()
|
||||
cp = QDesktopWidget().availableGeometry().center()
|
||||
qr.moveCenter(cp)
|
||||
self.move(qr.topLeft())
|
||||
screen = QGuiApplication.primaryScreen()
|
||||
screen_geometry = screen.geometry()
|
||||
window_geometry = self.frameGeometry()
|
||||
window_geometry.moveCenter(screen_geometry.center())
|
||||
self.move(window_geometry.topLeft())
|
||||
|
||||
def create_catalog(self):
|
||||
folder_path = QFileDialog.getSaveFileName(self, "Create New Catalog", "", "All Files (*);;Directory")[0]
|
||||
|
@ -88,6 +92,7 @@ class MainWindow(QMainWindow):
|
|||
self.create_file()
|
||||
self.ui.noteTitleEdit.textChanged.connect(self.save_note_title)
|
||||
self.ui.noteEdit.textChanged.connect(self.save_note_content)
|
||||
self.show_note_edit_and_toolbar()
|
||||
else:
|
||||
self.show_default_label()
|
||||
|
||||
|
@ -97,6 +102,9 @@ class MainWindow(QMainWindow):
|
|||
self.file_watcher.addPath(self.folder_path)
|
||||
self.file_watcher.directoryChanged.connect(self.show_directory_files)
|
||||
|
||||
self.qt_markdown = QtMarkDown(self.ui.noteEdit)
|
||||
|
||||
|
||||
def load_selected_note(self, item):
|
||||
note_name = item.text()
|
||||
self.default_note_path = os.path.join(self.folder_path, note_name)
|
||||
|
@ -104,9 +112,23 @@ class MainWindow(QMainWindow):
|
|||
self.ui.noteTitleEdit.setPlainText(note_name)
|
||||
self.ui.noteTitleEdit.show()
|
||||
self.ui.noteEdit.show()
|
||||
self.show_note_edit_and_toolbar()
|
||||
|
||||
if hasattr(self, 'static_label'):
|
||||
self.static_label.hide()
|
||||
|
||||
# Подключаем сигналы для автосохранения
|
||||
self.ui.noteTitleEdit.textChanged.connect(self.save_note_title)
|
||||
self.ui.noteEdit.textChanged.connect(self.save_note_content)
|
||||
|
||||
def show_note_edit_and_toolbar(self):
|
||||
if not hasattr(self, 'toolbar'):
|
||||
self.qt_markdown = QtMarkDown(self.ui.noteEdit)
|
||||
self.toolbar = self.qt_markdown.get_toolbar()
|
||||
|
||||
self.ui.noteEdit.show()
|
||||
self.ui.verticalLayout.insertWidget(0, self.toolbar)
|
||||
|
||||
def create_file(self):
|
||||
base_name = "Без_Имени"
|
||||
extension = ".md"
|
||||
|
@ -152,7 +174,7 @@ class MainWindow(QMainWindow):
|
|||
def show_directory_files(self):
|
||||
if os.path.exists(self.folder_path):
|
||||
self.ui.mainList.clear()
|
||||
dir_content = QDir(self.folder_path).entryList(QDir.Files)
|
||||
dir_content = QDir(self.folder_path).entryList(QDir.Filter.Files)
|
||||
for file_name in dir_content:
|
||||
item = QListWidgetItem(file_name)
|
||||
self.ui.mainList.addItem(item)
|
||||
|
@ -160,6 +182,8 @@ class MainWindow(QMainWindow):
|
|||
def show_default_label(self):
|
||||
self.ui.noteTitleEdit.hide()
|
||||
self.ui.noteEdit.hide()
|
||||
if hasattr(self, 'toolbar'):
|
||||
self.toolbar.hide()
|
||||
|
||||
if not hasattr(self, 'static_label'):
|
||||
self.static_label = QLabel("Выберите файл из списка или создайте новый")
|
||||
|
@ -176,4 +200,4 @@ if __name__ == "__main__":
|
|||
app = QApplication(sys.argv)
|
||||
start_window = StartWindow()
|
||||
start_window.show()
|
||||
sys.exit(app.exec_())
|
||||
sys.exit(app.exec())
|
||||
|
|
|
@ -1,30 +1,28 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Form implementation generated from reading ui file '/home/merelden/Документы/NoteQt/mainWindow.ui'
|
||||
# Form implementation generated from reading ui file '/home/evgeniy/Документы/Note_Qt/mainWindow.ui'
|
||||
#
|
||||
# Created by: PyQt5 UI code generator 5.15.10
|
||||
# Created by: PyQt6 UI code generator 6.7.0
|
||||
#
|
||||
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
|
||||
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
|
||||
# run again. Do not edit this file unless you know what you are doing.
|
||||
|
||||
|
||||
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||
from PyQt6 import QtCore, QtGui, QtWidgets
|
||||
|
||||
|
||||
class Ui_MainWindow(object):
|
||||
def setupUi(self, MainWindow):
|
||||
MainWindow.setObjectName("MainWindow")
|
||||
MainWindow.resize(800, 600)
|
||||
self.centralwidget = QtWidgets.QWidget(MainWindow)
|
||||
self.centralwidget = QtWidgets.QWidget(parent=MainWindow)
|
||||
self.centralwidget.setObjectName("centralwidget")
|
||||
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.centralwidget)
|
||||
self.verticalLayout_2.setObjectName("verticalLayout_2")
|
||||
self.horizontalLayout = QtWidgets.QHBoxLayout()
|
||||
self.horizontalLayout.setObjectName("horizontalLayout")
|
||||
self.back = QtWidgets.QPushButton(self.centralwidget)
|
||||
self.back = QtWidgets.QPushButton(parent=self.centralwidget)
|
||||
self.back.setObjectName("back")
|
||||
self.horizontalLayout.addWidget(self.back)
|
||||
self.createFile = QtWidgets.QPushButton(self.centralwidget)
|
||||
self.createFile = QtWidgets.QPushButton(parent=self.centralwidget)
|
||||
font = QtGui.QFont()
|
||||
font.setPointSize(10)
|
||||
self.createFile.setFont(font)
|
||||
|
@ -33,17 +31,17 @@ class Ui_MainWindow(object):
|
|||
self.verticalLayout_2.addLayout(self.horizontalLayout)
|
||||
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
|
||||
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
|
||||
self.mainList = QtWidgets.QListWidget(self.centralwidget)
|
||||
self.mainList = QtWidgets.QListWidget(parent=self.centralwidget)
|
||||
self.mainList.setMaximumSize(QtCore.QSize(150, 16777215))
|
||||
self.mainList.setObjectName("mainList")
|
||||
self.horizontalLayout_2.addWidget(self.mainList)
|
||||
self.verticalLayout = QtWidgets.QVBoxLayout()
|
||||
self.verticalLayout.setObjectName("verticalLayout")
|
||||
self.noteTitleEdit = QtWidgets.QTextEdit(self.centralwidget)
|
||||
self.noteTitleEdit = QtWidgets.QTextEdit(parent=self.centralwidget)
|
||||
self.noteTitleEdit.setMaximumSize(QtCore.QSize(16777215, 30))
|
||||
self.noteTitleEdit.setObjectName("noteTitleEdit")
|
||||
self.verticalLayout.addWidget(self.noteTitleEdit)
|
||||
self.noteEdit = QtWidgets.QTextEdit(self.centralwidget)
|
||||
self.noteEdit = QtWidgets.QTextEdit(parent=self.centralwidget)
|
||||
self.noteEdit.setObjectName("noteEdit")
|
||||
self.verticalLayout.addWidget(self.noteEdit)
|
||||
self.horizontalLayout_2.addLayout(self.verticalLayout)
|
||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,10 @@
|
|||
from .text_formatter.text_formatter import TextFormatter
|
||||
from .toolbar.toolbar import FormattingToolbar
|
||||
|
||||
class QtMarkDown:
|
||||
def __init__(self, text_edit):
|
||||
self.text_formatter = TextFormatter(text_edit)
|
||||
self.toolbar = FormattingToolbar(self.text_formatter)
|
||||
|
||||
def get_toolbar(self):
|
||||
return self.toolbar
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,45 @@
|
|||
from PyQt6.QtGui import QTextCharFormat, QFont, QTextCursor
|
||||
from PyQt6.QtCore import QRegularExpression
|
||||
|
||||
class HeaderFormatter:
|
||||
def __init__(self):
|
||||
self.regex_h1 = QRegularExpression(r'^#\s(.+)$')
|
||||
self.regex_h2 = QRegularExpression(r'^##\s(.+)$')
|
||||
self.regex_h3 = QRegularExpression(r'^###\s(.+)$')
|
||||
self.regex_h4 = QRegularExpression(r'^####\s(.+)$')
|
||||
self.regex_h5 = QRegularExpression(r'^#####\s(.+)$')
|
||||
self.regex_h6 = QRegularExpression(r'^######\s(.+)$')
|
||||
|
||||
def apply_header_format(self, block, font_size, font_weight):
|
||||
cursor = QTextCursor(block)
|
||||
char_format = QTextCharFormat()
|
||||
char_format.setFontWeight(font_weight)
|
||||
char_format.setFontPointSize(font_size * 16)
|
||||
cursor.select(QTextCursor.SelectionType.BlockUnderCursor)
|
||||
cursor.setCharFormat(char_format)
|
||||
|
||||
def clear_header_format(self, block):
|
||||
cursor = QTextCursor(block)
|
||||
char_format = QTextCharFormat()
|
||||
cursor.select(QTextCursor.SelectionType.BlockUnderCursor)
|
||||
cursor.setCharFormat(char_format)
|
||||
|
||||
def process_headers(self, text_edit):
|
||||
block = text_edit.document().firstBlock()
|
||||
while block.isValid():
|
||||
text = block.text()
|
||||
if self.regex_h1.match(text).hasMatch():
|
||||
self.apply_header_format(block, 2.0, QFont.Weight.Bold)
|
||||
elif self.regex_h2.match(text).hasMatch():
|
||||
self.apply_header_format(block, 1.5, QFont.Weight.Bold)
|
||||
elif self.regex_h3.match(text).hasMatch():
|
||||
self.apply_header_format(block, 1.25, QFont.Weight.Bold)
|
||||
elif self.regex_h4.match(text).hasMatch():
|
||||
self.apply_header_format(block, 1.0, QFont.Weight.Bold)
|
||||
elif self.regex_h5.match(text).hasMatch():
|
||||
self.apply_header_format(block, 0.875, QFont.Weight.Bold)
|
||||
elif self.regex_h6.match(text).hasMatch():
|
||||
self.apply_header_format(block, 0.85, QFont.Weight.Bold)
|
||||
else:
|
||||
self.clear_header_format(block)
|
||||
block = block.next()
|
|
@ -0,0 +1,69 @@
|
|||
from PyQt6.QtWidgets import QTextEdit
|
||||
from PyQt6.QtCore import QTimer, QDir, QUrl, QVariant, Qt
|
||||
from PyQt6.QtGui import QTextCharFormat, QFont, QTextCursor, QTextImageFormat, QImage, QTextDocument, QTextBlockFormat
|
||||
from .header_formatter import HeaderFormatter
|
||||
from .text_style_formatter import TextStyleFormatter
|
||||
|
||||
class TextFormatter:
|
||||
def __init__(self, text_edit: QTextEdit):
|
||||
self.text_edit = text_edit
|
||||
self.timer = QTimer()
|
||||
self.timer.setSingleShot(True)
|
||||
self.timer.timeout.connect(self.process_text_changes)
|
||||
self.text_edit.textChanged.connect(self.delay_text)
|
||||
|
||||
self.header_formatter = HeaderFormatter()
|
||||
self.text_style_formatter = TextStyleFormatter()
|
||||
|
||||
def delay_text(self):
|
||||
self.timer.start(500)
|
||||
|
||||
def process_text_changes(self):
|
||||
cursor = self.text_edit.textCursor()
|
||||
cursor.beginEditBlock()
|
||||
cursor.select(QTextCursor.SelectionType.Document)
|
||||
cursor.setCharFormat(QTextCharFormat())
|
||||
|
||||
self.header_formatter.process_headers(self.text_edit)
|
||||
self.text_style_formatter.apply_text_formatting(cursor, self.text_edit.toPlainText())
|
||||
self.process_markdown_images(cursor, self.text_edit.toPlainText())
|
||||
|
||||
cursor.endEditBlock()
|
||||
|
||||
def toggle_special_symbols(self, symbol_start, symbol_end=None):
|
||||
cursor = self.text_edit.textCursor()
|
||||
if cursor.hasSelection():
|
||||
selected_text = cursor.selectedText()
|
||||
full_text = self.text_edit.toPlainText()
|
||||
start = cursor.selectionStart()
|
||||
end = cursor.selectionEnd()
|
||||
corrected_text, new_start, new_end = self._toggle_special_symbols_in_selection(full_text, start, end, symbol_start, symbol_end)
|
||||
self.text_edit.setPlainText(corrected_text)
|
||||
cursor.setPosition(new_start)
|
||||
cursor.setPosition(new_end, QTextCursor.MoveMode.KeepAnchor)
|
||||
self.text_edit.setTextCursor(cursor)
|
||||
else:
|
||||
cursor.select(QTextCursor.SelectionType.WordUnderCursor)
|
||||
word = cursor.selectedText()
|
||||
full_text = self.text_edit.toPlainText()
|
||||
start = cursor.selectionStart()
|
||||
end = cursor.selectionEnd()
|
||||
corrected_text, new_start, new_end = self._toggle_special_symbols_in_selection(full_text, start, end, symbol_start, symbol_end)
|
||||
self.text_edit.setPlainText(corrected_text)
|
||||
cursor.setPosition(new_start)
|
||||
cursor.setPosition(new_end, QTextCursor.MoveMode.KeepAnchor)
|
||||
self.text_edit.setTextCursor(cursor)
|
||||
|
||||
def _toggle_special_symbols_in_selection(self, text, start, end, symbol_start, symbol_end=None):
|
||||
if symbol_end is None:
|
||||
symbol_end = symbol_start
|
||||
if text[start - len(symbol_start):start] == symbol_start and text[end:end + len(symbol_end)] == symbol_end:
|
||||
corrected_text = text[:start - len(symbol_start)] + text[start:end] + text[end + len(symbol_end):]
|
||||
new_start = start - len(symbol_start)
|
||||
new_end = end - len(symbol_start)
|
||||
return corrected_text, new_start, new_end
|
||||
else:
|
||||
corrected_text = text[:start] + symbol_start + text[start:end] + symbol_end + text[end:]
|
||||
new_start = start + len(symbol_start)
|
||||
new_end = end + len(symbol_end)
|
||||
return corrected_text, new_start, new_end
|
|
@ -0,0 +1,92 @@
|
|||
from PyQt6.QtGui import QTextCharFormat, QFont, QTextCursor
|
||||
from PyQt6.QtCore import QRegularExpression
|
||||
|
||||
class TextStyleFormatter:
|
||||
def __init__(self):
|
||||
self.regex_bold_italic = QRegularExpression(r'\*{3}([^\*]+)\*{3}')
|
||||
self.regex_bold = QRegularExpression(r'\*{2}([^\*]+?)\*{2}')
|
||||
self.regex_italic = QRegularExpression(r'\*([^\*]+?)\*')
|
||||
self.regex_stroke = QRegularExpression(r'~~([^\~]+?)~~')
|
||||
self.regex_underline = QRegularExpression(r'<u>([^<]+?)</u>')
|
||||
|
||||
def apply_text_formatting(self, cursor, text):
|
||||
# Process bold and italic text
|
||||
pos = 0
|
||||
bold_italic_positions = []
|
||||
while (match := self.regex_bold_italic.match(text, pos)).hasMatch():
|
||||
match_len = match.capturedLength()
|
||||
start = match.capturedStart(0) + 3 # Start of text between asterisks
|
||||
end = start + match_len - 6 # End of text between asterisks
|
||||
|
||||
bold_italic_positions.append((start, end))
|
||||
|
||||
cursor.setPosition(start)
|
||||
cursor.movePosition(QTextCursor.MoveOperation.Right, QTextCursor.MoveMode.KeepAnchor, match_len - 6)
|
||||
|
||||
char_format = QTextCharFormat()
|
||||
char_format.setFontWeight(QFont.Weight.Bold)
|
||||
char_format.setFontItalic(True)
|
||||
cursor.mergeCharFormat(char_format)
|
||||
|
||||
pos = match.capturedEnd(0)
|
||||
|
||||
# Process bold text
|
||||
pos = 0
|
||||
bold_positions = []
|
||||
while (match := self.regex_bold.match(text, pos)).hasMatch():
|
||||
match_len = match.capturedLength()
|
||||
start = match.capturedStart(0) + 2 # Start of text between asterisks
|
||||
end = start + match_len - 4 # End of text between asterisks
|
||||
|
||||
if not any(start < bi_end and end > bi_start for bi_start, bi_end in bold_italic_positions):
|
||||
bold_positions.append((start, end))
|
||||
|
||||
cursor.setPosition(start)
|
||||
cursor.movePosition(QTextCursor.MoveOperation.Right, QTextCursor.MoveMode.KeepAnchor, match_len - 4)
|
||||
|
||||
char_format = QTextCharFormat()
|
||||
char_format.setFontWeight(QFont.Weight.Bold)
|
||||
cursor.mergeCharFormat(char_format)
|
||||
|
||||
pos = match.capturedEnd(0)
|
||||
|
||||
# Process italic text
|
||||
pos = 0
|
||||
while (match := self.regex_italic.match(text, pos)).hasMatch():
|
||||
match_len = match.capturedLength()
|
||||
start = match.capturedStart(0) + 1 # Start of text between asterisks
|
||||
end = start + match_len - 2 # End of text between asterisks
|
||||
|
||||
# Check for overlap with bold or bold and italic text
|
||||
if not any(start < b_end and end > b_start for b_start, b_end in bold_positions) and \
|
||||
not any(start < bi_end and end > bi_start for bi_start, bi_end in bold_italic_positions):
|
||||
cursor.setPosition(start)
|
||||
cursor.movePosition(QTextCursor.MoveOperation.Right, QTextCursor.MoveMode.KeepAnchor, match_len - 2)
|
||||
|
||||
char_format = QTextCharFormat()
|
||||
char_format.setFontItalic(True)
|
||||
cursor.mergeCharFormat(char_format)
|
||||
|
||||
pos = match.capturedEnd(0)
|
||||
|
||||
pos = 0
|
||||
while (match := self.regex_stroke.match(text, pos)).hasMatch():
|
||||
start = match.capturedStart(1)
|
||||
end = match.capturedEnd(1)
|
||||
cursor.setPosition(start)
|
||||
cursor.movePosition(QTextCursor.MoveOperation.Right, QTextCursor.MoveMode.KeepAnchor, end - start)
|
||||
char_format = QTextCharFormat()
|
||||
char_format.setFontStrikeOut(True)
|
||||
cursor.mergeCharFormat(char_format)
|
||||
pos = match.capturedEnd(0)
|
||||
|
||||
pos = 0
|
||||
while (match := self.regex_underline.match(text, pos)).hasMatch():
|
||||
start = match.capturedStart(1)
|
||||
end = match.capturedEnd(1)
|
||||
cursor.setPosition(start)
|
||||
cursor.movePosition(QTextCursor.MoveOperation.Right, QTextCursor.MoveMode.KeepAnchor, end - start)
|
||||
char_format = QTextCharFormat()
|
||||
char_format.setFontUnderline(True)
|
||||
cursor.mergeCharFormat(char_format)
|
||||
pos = match.capturedEnd(0)
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,94 @@
|
|||
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)
|
|
@ -1,21 +1,19 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Form implementation generated from reading ui file '/home/merelden/Документы/NoteQt/startWindow.ui'
|
||||
# Form implementation generated from reading ui file '/home/evgeniy/Документы/Note_Qt/startWindow.ui'
|
||||
#
|
||||
# Created by: PyQt5 UI code generator 5.15.10
|
||||
# Created by: PyQt6 UI code generator 6.7.0
|
||||
#
|
||||
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
|
||||
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
|
||||
# run again. Do not edit this file unless you know what you are doing.
|
||||
|
||||
|
||||
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||
from PyQt6 import QtCore, QtGui, QtWidgets
|
||||
|
||||
|
||||
class Ui_startWindow(object):
|
||||
def setupUi(self, startWindow):
|
||||
startWindow.setObjectName("startWindow")
|
||||
startWindow.resize(800, 600)
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(startWindow.sizePolicy().hasHeightForWidth())
|
||||
|
@ -24,32 +22,32 @@ class Ui_startWindow(object):
|
|||
startWindow.setMaximumSize(QtCore.QSize(800, 600))
|
||||
startWindow.setBaseSize(QtCore.QSize(800, 600))
|
||||
startWindow.setAutoFillBackground(False)
|
||||
self.centralwidget = QtWidgets.QWidget(startWindow)
|
||||
self.centralwidget = QtWidgets.QWidget(parent=startWindow)
|
||||
self.centralwidget.setObjectName("centralwidget")
|
||||
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.centralwidget)
|
||||
self.verticalLayout_2.setObjectName("verticalLayout_2")
|
||||
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
|
||||
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
|
||||
self.startWindowList = QtWidgets.QListWidget(self.centralwidget)
|
||||
self.startWindowList = QtWidgets.QListWidget(parent=self.centralwidget)
|
||||
self.startWindowList.setMinimumSize(QtCore.QSize(250, 0))
|
||||
self.startWindowList.setMaximumSize(QtCore.QSize(252, 16777215))
|
||||
self.startWindowList.setStyleSheet("max-width: 250")
|
||||
self.startWindowList.setObjectName("startWindowList")
|
||||
self.horizontalLayout_3.addWidget(self.startWindowList)
|
||||
self.verticalLayout = QtWidgets.QVBoxLayout()
|
||||
self.verticalLayout.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize)
|
||||
self.verticalLayout.setSizeConstraint(QtWidgets.QLayout.SizeConstraint.SetMinimumSize)
|
||||
self.verticalLayout.setSpacing(0)
|
||||
self.verticalLayout.setObjectName("verticalLayout")
|
||||
self.horizontalLayout = QtWidgets.QHBoxLayout()
|
||||
self.horizontalLayout.setObjectName("horizontalLayout")
|
||||
self.label = QtWidgets.QLabel(self.centralwidget)
|
||||
self.label = QtWidgets.QLabel(parent=self.centralwidget)
|
||||
self.label.setMaximumSize(QtCore.QSize(16777215, 16777215))
|
||||
font = QtGui.QFont()
|
||||
font.setPointSize(14)
|
||||
self.label.setFont(font)
|
||||
self.label.setObjectName("label")
|
||||
self.horizontalLayout.addWidget(self.label)
|
||||
self.createCatalog = QtWidgets.QPushButton(self.centralwidget)
|
||||
self.createCatalog = QtWidgets.QPushButton(parent=self.centralwidget)
|
||||
font = QtGui.QFont()
|
||||
font.setPointSize(14)
|
||||
self.createCatalog.setFont(font)
|
||||
|
@ -58,8 +56,8 @@ class Ui_startWindow(object):
|
|||
self.verticalLayout.addLayout(self.horizontalLayout)
|
||||
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
|
||||
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
|
||||
self.label_2 = QtWidgets.QLabel(self.centralwidget)
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
|
||||
self.label_2 = QtWidgets.QLabel(parent=self.centralwidget)
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth())
|
||||
|
@ -70,7 +68,7 @@ class Ui_startWindow(object):
|
|||
self.label_2.setFont(font)
|
||||
self.label_2.setObjectName("label_2")
|
||||
self.horizontalLayout_2.addWidget(self.label_2)
|
||||
self.openCatalog = QtWidgets.QPushButton(self.centralwidget)
|
||||
self.openCatalog = QtWidgets.QPushButton(parent=self.centralwidget)
|
||||
font = QtGui.QFont()
|
||||
font.setPointSize(14)
|
||||
self.openCatalog.setFont(font)
|
||||
|
|
Loading…
Reference in New Issue