From 753c47f02537d3d4d1a0d23147125eac3a8c72eb Mon Sep 17 00:00:00 2001 From: berkaygediz <121058050+berkaygediz@users.noreply.github.com> Date: Sat, 17 Aug 2024 21:43:12 +0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=8D=B1=20PySide6=20upgrade,=20threading?= =?UTF-8?q?=20improvements,=20language=20detection,=20theme=20palette=20fi?= =?UTF-8?q?xes,=20Korean/Japanese/Russian/French/Greek=20language=20suppor?= =?UTF-8?q?t,=20bug=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- RichSpan.py | 120 ++++++--- modules/translations.py | 523 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 604 insertions(+), 39 deletions(-) diff --git a/RichSpan.py b/RichSpan.py index 14d994d..7d1b5aa 100644 --- a/RichSpan.py +++ b/RichSpan.py @@ -8,11 +8,13 @@ import mammoth import psutil import qtawesome as qta -from PyQt5.QtCore import * -from PyQt5.QtGui import * -from PyQt5.QtOpenGL import * -from PyQt5.QtPrintSupport import * -from PyQt5.QtWidgets import * +from langdetect import DetectorFactory, detect +from PySide6.QtCore import * +from PySide6.QtGui import * +from PySide6.QtOpenGL import * +from PySide6.QtOpenGLWidgets import * +from PySide6.QtPrintSupport import * +from PySide6.QtWidgets import * from modules.translations import * @@ -41,19 +43,24 @@ class RS_Threading(QThread): - update_signal = pyqtSignal() + update_signal = Signal() def __init__(self, adaptiveResponse, parent=None): super(RS_Threading, self).__init__(parent) self.adaptiveResponse = float(adaptiveResponse) self.running = False + self.mutex = QMutex() def run(self): if not self.running: + self.mutex.lock() self.running = True + self.mutex.unlock() time.sleep(0.15 * self.adaptiveResponse) self.update_signal.emit() + self.mutex.lock() self.running = False + self.mutex.unlock() class RS_About(QMainWindow): @@ -67,7 +74,7 @@ def __init__(self, parent=None): Qt.LeftToRight, Qt.AlignCenter, self.size(), - QApplication.desktop().availableGeometry(), + QApplication.primaryScreen().availableGeometry(), ) ) self.about_label = QLabel() @@ -96,10 +103,11 @@ def __init__(self, parent=None): if settings.value("adaptiveResponse") == None: settings.setValue("adaptiveResponse", 1) settings.sync() - self.setWindowIcon(QIcon("richspan_icon.png")) + self.setWindowIcon(QIcon("richspan_icon.ico")) self.setWindowModality(Qt.ApplicationModal) + self.setMinimumSize(768, 540) - centralWidget = QGLWidget(self) + centralWidget = QOpenGLWidget(self) layout = QVBoxLayout(centralWidget) self.hardwareAcceleration = QOpenGLWidget() @@ -129,16 +137,19 @@ def __init__(self, parent=None): self.rs_area.setDisabled(True) self.RS_setupActions() self.RS_setupToolbar() + self.adaptiveResponse = settings.value("adaptiveResponse") self.setPalette(self.light_theme) - self.rs_area.textChanged.connect(self.richspan_thread.start) + self.text_changed_timer = QTimer() + self.text_changed_timer.setInterval(150 * self.adaptiveResponse) + self.text_changed_timer.timeout.connect(self.RS_threadStart) + self.rs_area.textChanged.connect(self.RS_textChanged) + self.thread_running = False self.showMaximized() self.rs_area.setFocus() self.rs_area.setAcceptRichText(True) - self.adaptiveResponse = settings.value("adaptiveResponse") - QTimer.singleShot(50 * self.adaptiveResponse, self.RS_restoreTheme) QTimer.singleShot(150 * self.adaptiveResponse, self.RS_restoreState) @@ -147,8 +158,7 @@ def __init__(self, parent=None): endtime = datetime.datetime.now() self.status_bar.showMessage( - str((endtime - starttime).total_seconds()) + " ms", - 2500 * self.adaptiveResponse, + str((endtime - starttime).total_seconds()) + " ms", 2500 ) def closeEvent(self, event): @@ -203,7 +213,18 @@ def RS_updateTitle(self): f"{file}{asterisk}{textMode} — {app.applicationDisplayName()}" ) + def RS_threadStart(self): + if not self.thread_running: + self.richspan_thread.start() + self.thread_running = True + + def RS_textChanged(self): + if not self.text_changed_timer.isActive(): + self.text_changed_timer.start() + def RS_updateStatistics(self): + self.text_changed_timer.stop() + self.thread_running = False settings = QSettings("berkaygediz", "RichSpan") text = self.rs_area.toPlainText() character_count = len(text) @@ -212,11 +233,12 @@ def RS_updateStatistics(self): statistics = f"
" statistics += "{translations[settings.value('appLanguage')]['analysis_message_3'].format(uppercase_count)} | " statistics += f"{translations[settings.value('appLanguage')]['analysis_message_4'].format(lowercase_count)} | " + if word_count > 8: + DetectorFactory.seed = 0 + lang = detect(text) + statistics += f"{translations[settings.value('appLanguage')]['analysis_message_5'].format(lang)} | " + else: self.rs_area.setFontFamily(fallbackValues["fontFamily"]) self.rs_area.setFontPointSize(fallbackValues["fontSize"]) @@ -345,8 +372,9 @@ def RS_themePalette(self): self.light_theme.setColor(QPalette.Window, QColor(3, 65, 135)) self.light_theme.setColor(QPalette.WindowText, QColor(255, 255, 255)) self.light_theme.setColor(QPalette.Base, QColor(255, 255, 255)) - self.light_theme.setColor(QPalette.Text, QColor(230, 230, 230)) + self.light_theme.setColor(QPalette.Text, QColor(0, 0, 0)) self.light_theme.setColor(QPalette.Highlight, QColor(105, 117, 156)) + self.light_theme.setColor(QPalette.Button, QColor(0, 0, 0)) self.light_theme.setColor(QPalette.ButtonText, QColor(255, 255, 255)) self.dark_theme.setColor(QPalette.Window, QColor(35, 39, 52)) @@ -354,6 +382,7 @@ def RS_themePalette(self): self.dark_theme.setColor(QPalette.Base, QColor(80, 85, 122)) self.dark_theme.setColor(QPalette.Text, QColor(255, 255, 255)) self.dark_theme.setColor(QPalette.Highlight, QColor(105, 117, 156)) + self.dark_theme.setColor(QPalette.Button, QColor(0, 0, 0)) self.dark_theme.setColor(QPalette.ButtonText, QColor(255, 255, 255)) def RS_themeAction(self): @@ -468,18 +497,20 @@ def RS_toolbarTranslate(self): ] ) self.dock_widget.setWindowTitle( - translations[settings.value("appLanguage")]["help"] + translations[settings.value("appLanguage")]["help"] + " && AI" ) self.dock_widget.setWidget(self.helpText) self.helpText.setText( "" - "
{translations[settings.value('appLanguage')]['help_shortcut']} | " f"{translations[settings.value('appLanguage')]['help_description']} | " f"
---|---|
Ctrl+N | {translations[settings.value('appLanguage')]['new_message']} |
Ctrl+Shift+L | {translations[settings.value('appLanguage')]['left']} |
Ctrl+Shift+E | {translations[settings.value('appLanguage')]['center']} |
Ctrl+Shift+J | {translations[settings.value('appLanguage')]['justify']} |
NOTE: AI support planned.
{translations[settings.value('appLanguage')]['help_shortcut']} | " f"{translations[settings.value('appLanguage')]['help_description']} | " f"
---|---|
Ctrl+N | {translations[settings.value('appLanguage')]['new_message']} |
Ctrl+Shift+L | {translations[settings.value('appLanguage')]['left']} |
Ctrl+Shift+E | {translations[settings.value('appLanguage')]['center']} |
Ctrl+Shift+J | {translations[settings.value('appLanguage')]['justify']} |
NOTE: LLM support planned.
" + "NOTE: AI support planned.