├── stuff ├── add.png ├── db.png ├── del.png ├── books.png ├── check.png ├── copy.png ├── exec.png ├── font.ttf ├── info.png ├── logo.png ├── prefs.png ├── quit.png ├── sort.png ├── sync.png ├── trash.png ├── wait.gif ├── calendar.png ├── db_add.png ├── db_open.png ├── delete.png ├── filter.png ├── logo64.png ├── paypal.png ├── paypal76.png ├── trans32.png ├── db_compact.png ├── file_edit.png ├── file_save.png ├── files_add.png ├── files_view.png ├── power32red.png ├── refresh16.png ├── show_pages.png ├── view-sync.png ├── view_books.png ├── description.png ├── file_exists.png ├── file_missing.png ├── files_delete.png ├── files_merge.png ├── folder_open.png ├── folder_reader.png ├── label_green.png ├── power32gray.png └── view-highlights.png ├── docs └── images │ ├── 11.png │ ├── 10_2.png │ ├── 1_2.png │ ├── 2_2.png │ ├── 3_2.png │ ├── 4_2.png │ ├── 8_2.png │ ├── 9_2.png │ ├── image5.png │ ├── image6.png │ └── image7.png ├── screens ├── screen d1.png ├── screen d2.png ├── screen d3.png ├── screen d4.png ├── screen l1.png ├── screen l2.png ├── screen l3.png └── screen l4.png ├── requirements.txt ├── pyproject.toml ├── LICENSE ├── gui_auto_info.ui ├── images.qrc ├── gui_auto_info.py ├── gui_status.ui ├── gui_edit.py ├── gui_edit.ui ├── gui_status.py ├── gui_sync_item.ui ├── gui_sync_item.py ├── gui_filter.ui ├── gui_filter.py ├── README.md ├── boot_config.py ├── gui_about.py ├── gui_about.ui ├── slppu.py ├── gui_sync_group.py ├── gui_edit_template.ui ├── gui_edit_template.py ├── gui_prefs.py ├── gui_sync_group.ui ├── gui_prefs.ui ├── gui_main.py └── gui_toolbar.py /stuff/add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/add.png -------------------------------------------------------------------------------- /stuff/db.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/db.png -------------------------------------------------------------------------------- /stuff/del.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/del.png -------------------------------------------------------------------------------- /stuff/books.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/books.png -------------------------------------------------------------------------------- /stuff/check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/check.png -------------------------------------------------------------------------------- /stuff/copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/copy.png -------------------------------------------------------------------------------- /stuff/exec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/exec.png -------------------------------------------------------------------------------- /stuff/font.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/font.ttf -------------------------------------------------------------------------------- /stuff/info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/info.png -------------------------------------------------------------------------------- /stuff/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/logo.png -------------------------------------------------------------------------------- /stuff/prefs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/prefs.png -------------------------------------------------------------------------------- /stuff/quit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/quit.png -------------------------------------------------------------------------------- /stuff/sort.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/sort.png -------------------------------------------------------------------------------- /stuff/sync.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/sync.png -------------------------------------------------------------------------------- /stuff/trash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/trash.png -------------------------------------------------------------------------------- /stuff/wait.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/wait.gif -------------------------------------------------------------------------------- /docs/images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/docs/images/11.png -------------------------------------------------------------------------------- /stuff/calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/calendar.png -------------------------------------------------------------------------------- /stuff/db_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/db_add.png -------------------------------------------------------------------------------- /stuff/db_open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/db_open.png -------------------------------------------------------------------------------- /stuff/delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/delete.png -------------------------------------------------------------------------------- /stuff/filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/filter.png -------------------------------------------------------------------------------- /stuff/logo64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/logo64.png -------------------------------------------------------------------------------- /stuff/paypal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/paypal.png -------------------------------------------------------------------------------- /stuff/paypal76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/paypal76.png -------------------------------------------------------------------------------- /stuff/trans32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/trans32.png -------------------------------------------------------------------------------- /docs/images/10_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/docs/images/10_2.png -------------------------------------------------------------------------------- /docs/images/1_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/docs/images/1_2.png -------------------------------------------------------------------------------- /docs/images/2_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/docs/images/2_2.png -------------------------------------------------------------------------------- /docs/images/3_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/docs/images/3_2.png -------------------------------------------------------------------------------- /docs/images/4_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/docs/images/4_2.png -------------------------------------------------------------------------------- /docs/images/8_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/docs/images/8_2.png -------------------------------------------------------------------------------- /docs/images/9_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/docs/images/9_2.png -------------------------------------------------------------------------------- /stuff/db_compact.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/db_compact.png -------------------------------------------------------------------------------- /stuff/file_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/file_edit.png -------------------------------------------------------------------------------- /stuff/file_save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/file_save.png -------------------------------------------------------------------------------- /stuff/files_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/files_add.png -------------------------------------------------------------------------------- /stuff/files_view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/files_view.png -------------------------------------------------------------------------------- /stuff/power32red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/power32red.png -------------------------------------------------------------------------------- /stuff/refresh16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/refresh16.png -------------------------------------------------------------------------------- /stuff/show_pages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/show_pages.png -------------------------------------------------------------------------------- /stuff/view-sync.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/view-sync.png -------------------------------------------------------------------------------- /stuff/view_books.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/view_books.png -------------------------------------------------------------------------------- /docs/images/image5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/docs/images/image5.png -------------------------------------------------------------------------------- /docs/images/image6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/docs/images/image6.png -------------------------------------------------------------------------------- /docs/images/image7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/docs/images/image7.png -------------------------------------------------------------------------------- /screens/screen d1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/screens/screen d1.png -------------------------------------------------------------------------------- /screens/screen d2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/screens/screen d2.png -------------------------------------------------------------------------------- /screens/screen d3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/screens/screen d3.png -------------------------------------------------------------------------------- /screens/screen d4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/screens/screen d4.png -------------------------------------------------------------------------------- /screens/screen l1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/screens/screen l1.png -------------------------------------------------------------------------------- /screens/screen l2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/screens/screen l2.png -------------------------------------------------------------------------------- /screens/screen l3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/screens/screen l3.png -------------------------------------------------------------------------------- /screens/screen l4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/screens/screen l4.png -------------------------------------------------------------------------------- /stuff/description.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/description.png -------------------------------------------------------------------------------- /stuff/file_exists.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/file_exists.png -------------------------------------------------------------------------------- /stuff/file_missing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/file_missing.png -------------------------------------------------------------------------------- /stuff/files_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/files_delete.png -------------------------------------------------------------------------------- /stuff/files_merge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/files_merge.png -------------------------------------------------------------------------------- /stuff/folder_open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/folder_open.png -------------------------------------------------------------------------------- /stuff/folder_reader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/folder_reader.png -------------------------------------------------------------------------------- /stuff/label_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/label_green.png -------------------------------------------------------------------------------- /stuff/power32gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/power32gray.png -------------------------------------------------------------------------------- /stuff/view-highlights.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noembryo/KoHighlights/HEAD/stuff/view-highlights.png -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | beautifulsoup4 2 | future 3 | PySide2 4 | requests 5 | packaging 6 | pypiwin32; sys_platform == 'win32' 7 | pywin32; sys_platform == 'win32' -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "KoHighlights" 3 | version = "2.3.1.0" 4 | description = "KOHighlights is a utility for viewing KOReader's highlights and/or export them to simple text, html, csv or markdown files." 5 | readme = "README.md" 6 | requires-python = ">=3.7" 7 | dependencies = [ 8 | "beautifulsoup4", 9 | "future", 10 | "packaging", 11 | "PySide2", 12 | "requests", 13 | "pypiwin32; os_name == 'nt'", 14 | "pywin32; os_name == 'nt'" 15 | ] -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016-2019 noEmbryo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /gui_auto_info.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | AutoInfo 4 | 5 | 6 | Qt::NonModal 7 | 8 | 9 | 10 | 0 11 | 0 12 | 300 13 | 100 14 | 15 | 16 | 17 | 18 | 0 19 | 0 20 | 21 | 22 | 23 | Info 24 | 25 | 26 | 27 | 28 | 29 | true 30 | 31 | 32 | 33 | 0 34 | 35 | 36 | 37 | 38 | 39 | 0 40 | 0 41 | 42 | 43 | 44 | QFrame::Box 45 | 46 | 47 | QFrame::Raised 48 | 49 | 50 | 51 | 52 | 53 | Qt::AutoText 54 | 55 | 56 | Qt::AlignCenter 57 | 58 | 59 | 6 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /images.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | stuff/db_add.png 4 | stuff/logo64.png 5 | stuff/folder_open.png 6 | stuff/file_exists.png 7 | stuff/files_view.png 8 | stuff/file_missing.png 9 | stuff/calendar.png 10 | stuff/db.png 11 | stuff/power32red.png 12 | stuff/file_edit.png 13 | stuff/refresh16.png 14 | stuff/trash.png 15 | stuff/trans32.png 16 | stuff/files_merge.png 17 | stuff/delete.png 18 | stuff/file_save.png 19 | stuff/sync.png 20 | stuff/files_delete.png 21 | stuff/view_books.png 22 | stuff/label_green.png 23 | stuff/wait.gif 24 | stuff/copy.png 25 | stuff/books.png 26 | stuff/filter.png 27 | stuff/db_compact.png 28 | stuff/view-highlights.png 29 | stuff/prefs.png 30 | stuff/description.png 31 | stuff/power32gray.png 32 | stuff/paypal.png 33 | stuff/folder_reader.png 34 | stuff/files_add.png 35 | stuff/del.png 36 | stuff/sort.png 37 | stuff/paypal76.png 38 | stuff/logo.png 39 | stuff/add.png 40 | stuff/font.ttf 41 | stuff/db_open.png 42 | stuff/view-sync.png 43 | 44 | -------------------------------------------------------------------------------- /gui_auto_info.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'D:\Apps\DEV\PROJECTS\KoHighlights\gui_auto_info.ui', 4 | # licensing of 'D:\Apps\DEV\PROJECTS\KoHighlights\gui_auto_info.ui' applies. 5 | # 6 | # Created: Thu May 2 17:29:33 2024 7 | # by: pyside2-uic running on PySide2 5.13.2 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_AutoInfo(object): 14 | def setupUi(self, AutoInfo): 15 | AutoInfo.setObjectName("AutoInfo") 16 | AutoInfo.setWindowModality(QtCore.Qt.NonModal) 17 | AutoInfo.resize(300, 100) 18 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) 19 | sizePolicy.setHorizontalStretch(0) 20 | sizePolicy.setVerticalStretch(0) 21 | sizePolicy.setHeightForWidth(AutoInfo.sizePolicy().hasHeightForWidth()) 22 | AutoInfo.setSizePolicy(sizePolicy) 23 | AutoInfo.setLocale(QtCore.QLocale(QtCore.QLocale.English, QtCore.QLocale.UnitedStates)) 24 | AutoInfo.setModal(True) 25 | self.verticalLayout = QtWidgets.QVBoxLayout(AutoInfo) 26 | self.verticalLayout.setContentsMargins(0, 0, 0, 0) 27 | self.verticalLayout.setObjectName("verticalLayout") 28 | self.label = QtWidgets.QLabel(AutoInfo) 29 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) 30 | sizePolicy.setHorizontalStretch(0) 31 | sizePolicy.setVerticalStretch(0) 32 | sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth()) 33 | self.label.setSizePolicy(sizePolicy) 34 | self.label.setFrameShape(QtWidgets.QFrame.Box) 35 | self.label.setFrameShadow(QtWidgets.QFrame.Raised) 36 | self.label.setText("") 37 | self.label.setTextFormat(QtCore.Qt.AutoText) 38 | self.label.setAlignment(QtCore.Qt.AlignCenter) 39 | self.label.setMargin(6) 40 | self.label.setObjectName("label") 41 | self.verticalLayout.addWidget(self.label) 42 | 43 | self.retranslateUi(AutoInfo) 44 | QtCore.QMetaObject.connectSlotsByName(AutoInfo) 45 | 46 | def retranslateUi(self, AutoInfo): 47 | AutoInfo.setWindowTitle(QtWidgets.QApplication.translate("AutoInfo", "Info", None, -1)) 48 | 49 | import images_rc 50 | -------------------------------------------------------------------------------- /gui_status.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Status 4 | 5 | 6 | 7 | 0 8 | 0 9 | 188 10 | 38 11 | 12 | 13 | 14 | 15 | 0 16 | 17 | 18 | 19 | 20 | QFrame::StyledPanel 21 | 22 | 23 | QFrame::Raised 24 | 25 | 26 | 27 | 0 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | true 43 | 44 | 45 | Page 46 | 47 | 48 | Show the highlight's page number 49 | 50 | 51 | 52 | 53 | true 54 | 55 | 56 | Date 57 | 58 | 59 | Show the highlight's date 60 | 61 | 62 | 63 | 64 | true 65 | 66 | 67 | Highlight 68 | 69 | 70 | Show the highlight's text 71 | 72 | 73 | 74 | 75 | true 76 | 77 | 78 | Comment 79 | 80 | 81 | Show the highlight's comment 82 | 83 | 84 | 85 | 86 | true 87 | 88 | 89 | Chapter 90 | 91 | 92 | Show the highlight's chapter 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /gui_edit.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'D:\Apps\DEV\PROJECTS\KoHighlights\gui_edit.ui', 4 | # licensing of 'D:\Apps\DEV\PROJECTS\KoHighlights\gui_edit.ui' applies. 5 | # 6 | # Created: Thu May 2 17:29:33 2024 7 | # by: pyside2-uic running on PySide2 5.13.2 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_TextDialog(object): 14 | def setupUi(self, TextDialog): 15 | TextDialog.setObjectName("TextDialog") 16 | TextDialog.setWindowModality(QtCore.Qt.ApplicationModal) 17 | TextDialog.resize(360, 180) 18 | TextDialog.setLocale(QtCore.QLocale(QtCore.QLocale.English, QtCore.QLocale.UnitedStates)) 19 | TextDialog.setModal(False) 20 | self.verticalLayout = QtWidgets.QVBoxLayout(TextDialog) 21 | self.verticalLayout.setObjectName("verticalLayout") 22 | self.high_edit_txt = QtWidgets.QTextEdit(TextDialog) 23 | self.high_edit_txt.setFrameShape(QtWidgets.QFrame.WinPanel) 24 | self.high_edit_txt.setAcceptRichText(False) 25 | self.high_edit_txt.setObjectName("high_edit_txt") 26 | self.verticalLayout.addWidget(self.high_edit_txt) 27 | self.btn_box = QtWidgets.QFrame(TextDialog) 28 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) 29 | sizePolicy.setHorizontalStretch(0) 30 | sizePolicy.setVerticalStretch(0) 31 | sizePolicy.setHeightForWidth(self.btn_box.sizePolicy().hasHeightForWidth()) 32 | self.btn_box.setSizePolicy(sizePolicy) 33 | self.btn_box.setObjectName("btn_box") 34 | self.horizontalLayout = QtWidgets.QHBoxLayout(self.btn_box) 35 | self.horizontalLayout.setContentsMargins(0, 0, 0, 0) 36 | self.horizontalLayout.setObjectName("horizontalLayout") 37 | spacerItem = QtWidgets.QSpacerItem(175, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 38 | self.horizontalLayout.addItem(spacerItem) 39 | self.ok_btn = QtWidgets.QPushButton(self.btn_box) 40 | self.ok_btn.setObjectName("ok_btn") 41 | self.horizontalLayout.addWidget(self.ok_btn) 42 | self.cancel_btn = QtWidgets.QPushButton(self.btn_box) 43 | self.cancel_btn.setObjectName("cancel_btn") 44 | self.horizontalLayout.addWidget(self.cancel_btn) 45 | self.verticalLayout.addWidget(self.btn_box) 46 | 47 | self.retranslateUi(TextDialog) 48 | QtCore.QObject.connect(self.cancel_btn, QtCore.SIGNAL("clicked()"), TextDialog.close) 49 | QtCore.QObject.connect(self.ok_btn, QtCore.SIGNAL("clicked()"), TextDialog.close) 50 | QtCore.QMetaObject.connectSlotsByName(TextDialog) 51 | 52 | def retranslateUi(self, TextDialog): 53 | self.ok_btn.setToolTip(QtWidgets.QApplication.translate("TextDialog", "Check online for an updated version", None, -1)) 54 | self.ok_btn.setText(QtWidgets.QApplication.translate("TextDialog", "OK", None, -1)) 55 | self.cancel_btn.setText(QtWidgets.QApplication.translate("TextDialog", "Cancel", None, -1)) 56 | 57 | import images_rc 58 | -------------------------------------------------------------------------------- /gui_edit.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | TextDialog 4 | 5 | 6 | Qt::ApplicationModal 7 | 8 | 9 | 10 | 0 11 | 0 12 | 360 13 | 180 14 | 15 | 16 | 17 | 18 | 19 | 20 | false 21 | 22 | 23 | 24 | 25 | 26 | QFrame::WinPanel 27 | 28 | 29 | false 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 0 38 | 0 39 | 40 | 41 | 42 | 43 | 0 44 | 45 | 46 | 47 | 48 | Qt::Horizontal 49 | 50 | 51 | 52 | 175 53 | 20 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | Check online for an updated version 62 | 63 | 64 | OK 65 | 66 | 67 | 68 | 69 | 70 | 71 | Cancel 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | cancel_btn 86 | clicked() 87 | TextDialog 88 | close() 89 | 90 | 91 | 169 92 | 116 93 | 94 | 95 | 168 96 | 75 97 | 98 | 99 | 100 | 101 | ok_btn 102 | clicked() 103 | TextDialog 104 | close() 105 | 106 | 107 | 351 108 | 279 109 | 110 | 111 | 239 112 | 279 113 | 114 | 115 | 116 | 117 | 118 | -------------------------------------------------------------------------------- /gui_status.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'D:\Apps\DEV\PROJECTS\KoHighlights\gui_status.ui', 4 | # licensing of 'D:\Apps\DEV\PROJECTS\KoHighlights\gui_status.ui' applies. 5 | # 6 | # Created: Fri Oct 4 21:42:43 2024 7 | # by: pyside2-uic running on PySide2 5.13.2 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_Status(object): 14 | def setupUi(self, Status): 15 | Status.setObjectName("Status") 16 | Status.resize(188, 38) 17 | self.horizontalLayout_2 = QtWidgets.QHBoxLayout(Status) 18 | self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) 19 | self.horizontalLayout_2.setObjectName("horizontalLayout_2") 20 | self.frame = QtWidgets.QFrame(Status) 21 | self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) 22 | self.frame.setFrameShadow(QtWidgets.QFrame.Raised) 23 | self.frame.setObjectName("frame") 24 | self.horizontalLayout = QtWidgets.QHBoxLayout(self.frame) 25 | self.horizontalLayout.setContentsMargins(0, 0, 0, 0) 26 | self.horizontalLayout.setObjectName("horizontalLayout") 27 | self.anim_lbl = QtWidgets.QLabel(self.frame) 28 | self.anim_lbl.setText("") 29 | self.anim_lbl.setObjectName("anim_lbl") 30 | self.horizontalLayout.addWidget(self.anim_lbl) 31 | self.horizontalLayout_2.addWidget(self.frame) 32 | self.act_page = QtWidgets.QAction(Status) 33 | self.act_page.setCheckable(True) 34 | self.act_page.setObjectName("act_page") 35 | self.act_date = QtWidgets.QAction(Status) 36 | self.act_date.setCheckable(True) 37 | self.act_date.setObjectName("act_date") 38 | self.act_text = QtWidgets.QAction(Status) 39 | self.act_text.setCheckable(True) 40 | self.act_text.setObjectName("act_text") 41 | self.act_comment = QtWidgets.QAction(Status) 42 | self.act_comment.setCheckable(True) 43 | self.act_comment.setObjectName("act_comment") 44 | self.act_chapter = QtWidgets.QAction(Status) 45 | self.act_chapter.setCheckable(True) 46 | self.act_chapter.setObjectName("act_chapter") 47 | 48 | self.retranslateUi(Status) 49 | QtCore.QMetaObject.connectSlotsByName(Status) 50 | 51 | def retranslateUi(self, Status): 52 | self.act_page.setText(QtWidgets.QApplication.translate("Status", "Page", None, -1)) 53 | self.act_page.setToolTip(QtWidgets.QApplication.translate("Status", "Show the highlight\'s page number", None, -1)) 54 | self.act_date.setText(QtWidgets.QApplication.translate("Status", "Date", None, -1)) 55 | self.act_date.setToolTip(QtWidgets.QApplication.translate("Status", "Show the highlight\'s date", None, -1)) 56 | self.act_text.setText(QtWidgets.QApplication.translate("Status", "Highlight", None, -1)) 57 | self.act_text.setToolTip(QtWidgets.QApplication.translate("Status", "Show the highlight\'s text", None, -1)) 58 | self.act_comment.setText(QtWidgets.QApplication.translate("Status", "Comment", None, -1)) 59 | self.act_comment.setToolTip(QtWidgets.QApplication.translate("Status", "Show the highlight\'s comment", None, -1)) 60 | self.act_chapter.setText(QtWidgets.QApplication.translate("Status", "Chapter", None, -1)) 61 | self.act_chapter.setToolTip(QtWidgets.QApplication.translate("Status", "Show the highlight\'s chapter", None, -1)) 62 | 63 | import images_rc 64 | -------------------------------------------------------------------------------- /gui_sync_item.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | SyncItem 4 | 5 | 6 | 7 | 0 8 | 0 9 | 446 10 | 25 11 | 12 | 13 | 14 | 15 | 4 16 | 17 | 18 | 0 19 | 20 | 21 | 2 22 | 23 | 24 | 0 25 | 26 | 27 | 28 | 29 | Sync path 30 | 31 | 32 | 33 | 34 | 35 | 36 | Qt::CustomContextMenu 37 | 38 | 39 | The path to the book's metadata file 40 | 41 | 42 | The path to the book's metadata file 43 | 44 | 45 | true 46 | 47 | 48 | Select metadata file to sync 49 | 50 | 51 | 52 | 53 | 54 | 55 | Select/Change the metadata file path 56 | 57 | 58 | Select/Change the metadata file path 59 | 60 | 61 | Select 62 | 63 | 64 | 65 | 66 | 67 | 68 | QFrame::StyledPanel 69 | 70 | 71 | QFrame::Raised 72 | 73 | 74 | 75 | 0 76 | 77 | 78 | 79 | 80 | Add a new Sync path 81 | 82 | 83 | Add a new Sync path 84 | 85 | 86 | 87 | 88 | 89 | 90 | :/stuff/add.png:/stuff/add.png 91 | 92 | 93 | 94 | 10 95 | 10 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | Remove this Sync path 104 | 105 | 106 | Remove this Sync path 107 | 108 | 109 | 110 | 111 | 112 | 113 | :/stuff/del.png:/stuff/del.png 114 | 115 | 116 | 117 | 10 118 | 10 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | -------------------------------------------------------------------------------- /gui_sync_item.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'D:\Apps\DEV\PROJECTS\KoHighlights\gui_sync_item.ui', 4 | # licensing of 'D:\Apps\DEV\PROJECTS\KoHighlights\gui_sync_item.ui' applies. 5 | # 6 | # Created: Fri Oct 4 21:42:42 2024 7 | # by: pyside2-uic running on PySide2 5.13.2 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_SyncItem(object): 14 | def setupUi(self, SyncItem): 15 | SyncItem.setObjectName("SyncItem") 16 | SyncItem.resize(446, 25) 17 | self.horizontalLayout_2 = QtWidgets.QHBoxLayout(SyncItem) 18 | self.horizontalLayout_2.setContentsMargins(4, 0, 2, 0) 19 | self.horizontalLayout_2.setObjectName("horizontalLayout_2") 20 | self.label = QtWidgets.QLabel(SyncItem) 21 | self.label.setObjectName("label") 22 | self.horizontalLayout_2.addWidget(self.label) 23 | self.sync_path_txt = QtWidgets.QLineEdit(SyncItem) 24 | self.sync_path_txt.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) 25 | self.sync_path_txt.setReadOnly(True) 26 | self.sync_path_txt.setObjectName("sync_path_txt") 27 | self.horizontalLayout_2.addWidget(self.sync_path_txt) 28 | self.sync_path_btn = QtWidgets.QPushButton(SyncItem) 29 | self.sync_path_btn.setObjectName("sync_path_btn") 30 | self.horizontalLayout_2.addWidget(self.sync_path_btn) 31 | self.frame = QtWidgets.QFrame(SyncItem) 32 | self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) 33 | self.frame.setFrameShadow(QtWidgets.QFrame.Raised) 34 | self.frame.setObjectName("frame") 35 | self.horizontalLayout = QtWidgets.QHBoxLayout(self.frame) 36 | self.horizontalLayout.setContentsMargins(0, 0, 0, 0) 37 | self.horizontalLayout.setObjectName("horizontalLayout") 38 | self.add_btn = QtWidgets.QToolButton(self.frame) 39 | self.add_btn.setText("") 40 | icon = QtGui.QIcon() 41 | icon.addPixmap(QtGui.QPixmap(":/stuff/add.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 42 | self.add_btn.setIcon(icon) 43 | self.add_btn.setIconSize(QtCore.QSize(10, 10)) 44 | self.add_btn.setObjectName("add_btn") 45 | self.horizontalLayout.addWidget(self.add_btn) 46 | self.del_btn = QtWidgets.QToolButton(self.frame) 47 | self.del_btn.setText("") 48 | icon1 = QtGui.QIcon() 49 | icon1.addPixmap(QtGui.QPixmap(":/stuff/del.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 50 | self.del_btn.setIcon(icon1) 51 | self.del_btn.setIconSize(QtCore.QSize(10, 10)) 52 | self.del_btn.setObjectName("del_btn") 53 | self.horizontalLayout.addWidget(self.del_btn) 54 | self.horizontalLayout_2.addWidget(self.frame) 55 | 56 | self.retranslateUi(SyncItem) 57 | QtCore.QMetaObject.connectSlotsByName(SyncItem) 58 | 59 | def retranslateUi(self, SyncItem): 60 | self.label.setText(QtWidgets.QApplication.translate("SyncItem", "Sync path", None, -1)) 61 | self.sync_path_txt.setToolTip(QtWidgets.QApplication.translate("SyncItem", "The path to the book\'s metadata file", None, -1)) 62 | self.sync_path_txt.setStatusTip(QtWidgets.QApplication.translate("SyncItem", "The path to the book\'s metadata file", None, -1)) 63 | self.sync_path_txt.setPlaceholderText(QtWidgets.QApplication.translate("SyncItem", "Select metadata file to sync", None, -1)) 64 | self.sync_path_btn.setToolTip(QtWidgets.QApplication.translate("SyncItem", "Select/Change the metadata file path", None, -1)) 65 | self.sync_path_btn.setStatusTip(QtWidgets.QApplication.translate("SyncItem", "Select/Change the metadata file path", None, -1)) 66 | self.sync_path_btn.setText(QtWidgets.QApplication.translate("SyncItem", "Select", None, -1)) 67 | self.add_btn.setToolTip(QtWidgets.QApplication.translate("SyncItem", "Add a new Sync path", None, -1)) 68 | self.add_btn.setStatusTip(QtWidgets.QApplication.translate("SyncItem", "Add a new Sync path", None, -1)) 69 | self.del_btn.setToolTip(QtWidgets.QApplication.translate("SyncItem", "Remove this Sync path", None, -1)) 70 | self.del_btn.setStatusTip(QtWidgets.QApplication.translate("SyncItem", "Remove this Sync path", None, -1)) 71 | 72 | import images_rc 73 | -------------------------------------------------------------------------------- /gui_filter.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Filter 4 | 5 | 6 | 7 | 0 8 | 0 9 | 215 10 | 66 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 4 19 | 20 | 21 | 22 | 23 | QFrame::StyledPanel 24 | 25 | 26 | QFrame::Raised 27 | 28 | 29 | 30 | 0 31 | 32 | 33 | 34 | 35 | 36 | 0 37 | 0 38 | 39 | 40 | 41 | Type the keywords to filter the visible items 42 | 43 | 44 | 45 | 46 | 47 | Type here to filter... 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 0 56 | 0 57 | 58 | 59 | 60 | Set filter 61 | 62 | 63 | Filter 64 | 65 | 66 | 67 | :/stuff/filter.png:/stuff/filter.png 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | QFrame::StyledPanel 78 | 79 | 80 | QFrame::Raised 81 | 82 | 83 | 84 | 0 85 | 86 | 87 | 88 | 89 | Select where to search for the keywords 90 | 91 | 92 | 0 93 | 94 | 95 | 96 | Filter All: 97 | 98 | 99 | 100 | 101 | Filter Highlights: 102 | 103 | 104 | 105 | 106 | Filter Comments: 107 | 108 | 109 | 110 | 111 | Filter Book Titles: 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | Qt::Horizontal 127 | 128 | 129 | 130 | 40 131 | 20 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 0 141 | 0 142 | 143 | 144 | 145 | Clear the filter field 146 | 147 | 148 | Clears the filter field 149 | 150 | 151 | Clear 152 | 153 | 154 | 155 | :/stuff/trash.png:/stuff/trash.png 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | -------------------------------------------------------------------------------- /gui_filter.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'D:\Apps\DEV\PROJECTS\KoHighlights\gui_filter.ui', 4 | # licensing of 'D:\Apps\DEV\PROJECTS\KoHighlights\gui_filter.ui' applies. 5 | # 6 | # Created: Thu May 2 17:29:33 2024 7 | # by: pyside2-uic running on PySide2 5.13.2 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_Filter(object): 14 | def setupUi(self, Filter): 15 | Filter.setObjectName("Filter") 16 | Filter.resize(215, 66) 17 | Filter.setLocale(QtCore.QLocale(QtCore.QLocale.English, QtCore.QLocale.UnitedStates)) 18 | self.verticalLayout = QtWidgets.QVBoxLayout(Filter) 19 | self.verticalLayout.setContentsMargins(4, 4, 4, 4) 20 | self.verticalLayout.setObjectName("verticalLayout") 21 | self.filter_frm1 = QtWidgets.QFrame(Filter) 22 | self.filter_frm1.setFrameShape(QtWidgets.QFrame.StyledPanel) 23 | self.filter_frm1.setFrameShadow(QtWidgets.QFrame.Raised) 24 | self.filter_frm1.setObjectName("filter_frm1") 25 | self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.filter_frm1) 26 | self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0) 27 | self.horizontalLayout_4.setObjectName("horizontalLayout_4") 28 | self.filter_txt = QtWidgets.QLineEdit(self.filter_frm1) 29 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) 30 | sizePolicy.setHorizontalStretch(0) 31 | sizePolicy.setVerticalStretch(0) 32 | sizePolicy.setHeightForWidth(self.filter_txt.sizePolicy().hasHeightForWidth()) 33 | self.filter_txt.setSizePolicy(sizePolicy) 34 | self.filter_txt.setText("") 35 | self.filter_txt.setObjectName("filter_txt") 36 | self.horizontalLayout_4.addWidget(self.filter_txt) 37 | self.filter_btn = QtWidgets.QPushButton(self.filter_frm1) 38 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) 39 | sizePolicy.setHorizontalStretch(0) 40 | sizePolicy.setVerticalStretch(0) 41 | sizePolicy.setHeightForWidth(self.filter_btn.sizePolicy().hasHeightForWidth()) 42 | self.filter_btn.setSizePolicy(sizePolicy) 43 | icon = QtGui.QIcon() 44 | icon.addPixmap(QtGui.QPixmap(":/stuff/filter.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 45 | self.filter_btn.setIcon(icon) 46 | self.filter_btn.setObjectName("filter_btn") 47 | self.horizontalLayout_4.addWidget(self.filter_btn) 48 | self.verticalLayout.addWidget(self.filter_frm1) 49 | self.filter_frm2 = QtWidgets.QFrame(Filter) 50 | self.filter_frm2.setFrameShape(QtWidgets.QFrame.StyledPanel) 51 | self.filter_frm2.setFrameShadow(QtWidgets.QFrame.Raised) 52 | self.filter_frm2.setObjectName("filter_frm2") 53 | self.horizontalLayout = QtWidgets.QHBoxLayout(self.filter_frm2) 54 | self.horizontalLayout.setContentsMargins(0, 0, 0, 0) 55 | self.horizontalLayout.setObjectName("horizontalLayout") 56 | self.filter_box = QtWidgets.QComboBox(self.filter_frm2) 57 | self.filter_box.setObjectName("filter_box") 58 | self.filter_box.addItem("") 59 | self.filter_box.addItem("") 60 | self.filter_box.addItem("") 61 | self.filter_box.addItem("") 62 | self.horizontalLayout.addWidget(self.filter_box) 63 | self.filtered_lbl = QtWidgets.QLabel(self.filter_frm2) 64 | self.filtered_lbl.setText("") 65 | self.filtered_lbl.setObjectName("filtered_lbl") 66 | self.horizontalLayout.addWidget(self.filtered_lbl) 67 | spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 68 | self.horizontalLayout.addItem(spacerItem) 69 | self.clear_filter_btn = QtWidgets.QPushButton(self.filter_frm2) 70 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) 71 | sizePolicy.setHorizontalStretch(0) 72 | sizePolicy.setVerticalStretch(0) 73 | sizePolicy.setHeightForWidth(self.clear_filter_btn.sizePolicy().hasHeightForWidth()) 74 | self.clear_filter_btn.setSizePolicy(sizePolicy) 75 | icon1 = QtGui.QIcon() 76 | icon1.addPixmap(QtGui.QPixmap(":/stuff/trash.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 77 | self.clear_filter_btn.setIcon(icon1) 78 | self.clear_filter_btn.setObjectName("clear_filter_btn") 79 | self.horizontalLayout.addWidget(self.clear_filter_btn) 80 | self.verticalLayout.addWidget(self.filter_frm2) 81 | 82 | self.retranslateUi(Filter) 83 | self.filter_box.setCurrentIndex(0) 84 | QtCore.QMetaObject.connectSlotsByName(Filter) 85 | 86 | def retranslateUi(self, Filter): 87 | self.filter_txt.setToolTip(QtWidgets.QApplication.translate("Filter", "Type the keywords to filter the visible items", None, -1)) 88 | self.filter_txt.setPlaceholderText(QtWidgets.QApplication.translate("Filter", "Type here to filter...", None, -1)) 89 | self.filter_btn.setToolTip(QtWidgets.QApplication.translate("Filter", "Set filter", None, -1)) 90 | self.filter_btn.setText(QtWidgets.QApplication.translate("Filter", "Filter", None, -1)) 91 | self.filter_box.setToolTip(QtWidgets.QApplication.translate("Filter", "Select where to search for the keywords", None, -1)) 92 | self.filter_box.setItemText(0, QtWidgets.QApplication.translate("Filter", "Filter All:", None, -1)) 93 | self.filter_box.setItemText(1, QtWidgets.QApplication.translate("Filter", "Filter Highlights:", None, -1)) 94 | self.filter_box.setItemText(2, QtWidgets.QApplication.translate("Filter", "Filter Comments:", None, -1)) 95 | self.filter_box.setItemText(3, QtWidgets.QApplication.translate("Filter", "Filter Book Titles:", None, -1)) 96 | self.clear_filter_btn.setToolTip(QtWidgets.QApplication.translate("Filter", "Clear the filter field", None, -1)) 97 | self.clear_filter_btn.setStatusTip(QtWidgets.QApplication.translate("Filter", "Clears the filter field", None, -1)) 98 | self.clear_filter_btn.setText(QtWidgets.QApplication.translate("Filter", "Clear", None, -1)) 99 | 100 | import images_rc 101 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## General 2 | ![kohighlights128w](https://user-images.githubusercontent.com/24675403/234561476-97283ff8-5437-49cd-b4c5-3929886cf182.png) 3 | 4 | [![made-with-python][Python]](https://www.python.org/) 5 | [![Generic badge][OS]][ReleaseLink] 6 | [![License: MIT][MIT]](LICENSE) 7 | [![GitHub release][Release]][ReleaseLink] 8 | 9 | 10 | 11 | 12 | **KOHighlights** is a utility for viewing and exporting the 13 | [Koreader](https://github.com/koreader/koreader)'s highlights to simple text, html, csv or markdown files. 14 | 15 | ___ 16 | #### Screenshots 17 |

18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 |

38 | 39 | 40 | 41 | 42 | ___ 43 | 44 | # [Full User Guide and Documentation](https://noembryo.github.io/KoHighlights/) 45 | ___ 46 | 47 | ## Usage/Features at a glance 48 | 49 | 50 | * Load items by: 51 | * Selecting the reader's drive or any folder that contains books that where opened with Koreader. This will automatically load all the metadata files from all subdirectories. 52 | * Drag and drop files or folders. This will load the files and/or all the files inside the folders. 53 | * Export the highlights of the selected books to individual files or to one merged file. 54 | * Supported formats for exporting: 55 | * Plain text files (.txt) 56 | * Hypertext document files (.html) 57 | * Comma-separated values files (.csv) 58 | * Markdown files (.md) 59 | * View the highlights and various info for a book by selecting it in the list. 60 | * Save the highlights to the "Archive" database and view them, even if your reader is not connected. 61 | * Merge highlights/Sync position from the same book that is read in different devices and/or sync its reading position. 62 | * Merge highlights/Sync position of a book with its archived version. 63 | * Show/hide the page, date, chapter or even the highlight (!) text while viewing or exporting the highlights of the books. 64 | * Double click or press the Open Book button to view the book in your system's reader. 65 | * Delete some or all the highlights of any book. 66 | * Clear/reset the .sdr folders with the metadata or the books in the eReader. 67 | 68 | ### Prerequisites 69 | The progress sync plugin must be enabled in KOReader 70 | 71 | ### Portable 72 | In Windows, KOHighlights can run in Portable mode using a `portable_settings` directory to store its settings, that is located inside the installation directory of the app. 73 | Because of this, it is advised to not install the app inside the default `Program Files` folder if you indent to use it as portable. 74 | There are two ways to start the app in Portable mode: 75 | * Run the `KoHighlights Portable.exe` that is located next to the `KoHighlights.exe`. 76 | * Run `KoHighlights.exe` with a `-p` argument. 77 | E.g. create a shortcut for the `KoHighlights.exe` and add a space and a `-p` argument at the end of the target filename. 78 | 79 | ## Downloads 80 | Check the latest release on the [Downloads Page][ReleaseLink]. 81 | Read the version history at [App's Page](http://www.noembryo.com/apps.php?kohighlights). 82 | 83 | ## Dependencies 84 | * **Source code:** 85 | Should run in any system with Python 3.6+ (more testing required) 86 | It needs the [PySide2](https://pypi.org/project/PySide2/), 87 | [BeautifulSoup4](https://pypi.org/project/beautifulsoup4/), 88 | [packaging](https://pypi.org/project/packaging/) and 89 | [requests](https://pypi.org/project/requests/) libraries. 90 | In Windows, it might also need the [PyWin32](https://pypi.org/project/PyWin32/) and the [Pypiwin32](https://pypi.org/project/pypiwin32/) libraries. 91 | PySide6 is also supported (download the archive from the releases) 92 | * **Compiled binaries:** 93 | * ***Windows***: 94 | From version 2.x, KOHighlights dropped support for Windows XP. 95 | Can run on any version of Windows from Windows 7 upwards. 96 | For Windows 7, Microsoft Visual C++ 14.0 is required. Get it 97 | [here](https://aka.ms/vs/17/release/vc_redist.x86.exe). 98 | The Windows 7 32bit version also needs the KB2533623 update that is included in [KB3063858](https://www.microsoft.com/en-us/download/details.aspx?id=47409) ([direct link](https://download.microsoft.com/download/C/9/6/C96CD606-3E05-4E1C-B201-51211AE80B1E/Windows6.1-KB3063858-x86.msu)). 99 | * ***Linux***: 100 | The binary is compiled using Xubuntu 18.04. 101 | Any newer version should work. 102 | 103 | 104 | 105 | 106 | ## Extra 107 | KOHighlights includes SLPPU (a converter between python and lua objects). 108 | If you want it to be globally available, get it from its 109 | [GitHub's page](https://github.com/noembryo/slppu) or install it with: 110 | `pip install git+https://github.com/noembryo/slppu` 111 | 112 | 113 | 116 | 117 | [Release]:https://img.shields.io/github/release/noembryo/KoHighlights.svg 118 | [ReleaseLink]:https://GitHub.com/noembryo/KoHighlights/releases/ 119 | [TotalDown]:https://img.shields.io/github/downloads/noembryo/KoHighlights/total.svg 120 | [VersionDown]:https://img.shields.io/github/downloads/noembryo/KoHighlights/v1.2.2.0/total.svg 121 | [Python]:https://img.shields.io/badge/Made%20with-Python-1f425f.svg 122 | [OS]:https://img.shields.io/badge/OS-Windows / Linux-darkgreen.svg 123 | [MIT]:https://img.shields.io/badge/License-MIT-green.svg 124 | -------------------------------------------------------------------------------- /boot_config.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | import time 3 | import sys, os 4 | import traceback 5 | import gzip, json 6 | from os.path import dirname, join, isdir, expanduser, abspath 7 | 8 | __author__ = "noEmbryo" 9 | 10 | 11 | def _(text): # for future gettext support 12 | return text 13 | 14 | 15 | APP_NAME = "KOHighlights" 16 | APP_DIR = dirname(abspath(__file__)) 17 | try: 18 | # noinspection PyUnresolvedReferences,PyProtectedMember 19 | BASE_DIR = sys._MEIPASS 20 | except AttributeError: # loading from py, not an exe 21 | BASE_DIR = APP_DIR 22 | os.chdir(BASE_DIR) # Set the current working directory to the app's directory 23 | 24 | USE_QT6 = False # select between PySide2/Qt5 and Pyside6/Qt6 if both are installed 25 | 26 | if USE_QT6: 27 | from PySide6.QtCore import qVersion 28 | else: 29 | from PySide2.QtCore import qVersion 30 | 31 | # noinspection PyTypeChecker 32 | qt_version = qVersion().split(".")[0] 33 | QT5 = qt_version == "5" 34 | QT6 = qt_version == "6" 35 | if QT6 and QT5 and USE_QT6: 36 | QT5 = False 37 | 38 | PORTABLE = False 39 | if sys.platform == "win32": # Windows 40 | import win32api 41 | import win32event 42 | from winerror import ERROR_ALREADY_EXISTS 43 | 44 | class SingleInstance: 45 | """ Limits application to single instance 46 | """ 47 | def __init__(self, name): 48 | self.mutex = win32event.CreateMutex(None, False, name) 49 | self.lasterror = win32api.GetLastError() 50 | 51 | def already_running(self): 52 | return self.lasterror == ERROR_ALREADY_EXISTS 53 | 54 | def __del__(self): 55 | import win32api # needed otherwise raises Exception AttributeError 56 | win32api.CloseHandle(self.mutex) if self.mutex else None 57 | 58 | my_app = SingleInstance(APP_NAME) 59 | if my_app.already_running(): # another instance is running 60 | sys.exit(0) 61 | try: 62 | # noinspection PyUnresolvedReferences 63 | portable_arg = sys.argv[1] 64 | PORTABLE = portable_arg == "-p" 65 | except IndexError: # no arguments in the call 66 | pass 67 | PROFILE_DIR = join(os.environ[str("APPDATA")], APP_NAME) 68 | PORTABLE_DIR = join(APP_DIR, "portable_settings") 69 | SETTINGS_DIR = PORTABLE_DIR if PORTABLE else PROFILE_DIR 70 | elif sys.platform == "darwin": # MacOS 2check: needs to be tested 71 | import socket 72 | app_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 73 | try: 74 | app_socket.bind(("127.0.0.1", 42001)) # use a specific port 75 | # app_socket.listen(1) 76 | except socket.error: # port in use - another instance is running 77 | sys.exit(0) 78 | SETTINGS_DIR = join(expanduser("~"), "Library", "Application Support", APP_NAME) 79 | else: # Linux+ 80 | try: 81 | import socket 82 | app_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 83 | # Create an abstract socket, by prefixing it with null. 84 | app_socket.bind(str(f"\0{APP_NAME}_lock_port")) 85 | except socket.error: # port in use - another instance is running 86 | sys.exit(0) 87 | SETTINGS_DIR = join(expanduser("~"), ".config", APP_NAME) 88 | os.makedirs(SETTINGS_DIR) if not isdir(SETTINGS_DIR) else None 89 | 90 | 91 | def except_hook(class_type, value, trace_back): 92 | """ Print the error to a log file 93 | """ 94 | name = join(SETTINGS_DIR, f"error_log_{time.strftime(str('%Y-%m-%d'))}.txt") 95 | with open(name, "a", encoding="utf8") as log: 96 | log.write(f"\nCrash@{time.strftime(str('%Y-%m-%d %H:%M:%S'))}\n") 97 | traceback.print_exception(class_type, value, trace_back, file=open(name, str("a"))) 98 | sys.__excepthook__(class_type, value, trace_back) 99 | 100 | 101 | sys.excepthook = except_hook 102 | FIRST_RUN = False 103 | # noinspection PyBroadException 104 | try: 105 | with gzip.GzipFile(join(SETTINGS_DIR, "settings.json.gz")) as settings: 106 | app_config = json.loads(settings.read().decode("utf8")) 107 | except Exception: # IOError on first run or everything else 108 | app_config = {} 109 | FIRST_RUN = True 110 | 111 | 112 | BOOKS_VIEW, HIGHLIGHTS_VIEW, SYNC_VIEW = range(3) # app views 113 | CHANGE_DB, NEW_DB, RELOAD_DB = range(3) # db change mode 114 | (TITLE, AUTHOR, TYPE, PERCENT, RATING, 115 | HIGH_COUNT, MODIFIED, PATH) = range(8) # file_table columns 116 | PAGE, HIGHLIGHT_TEXT, DATE, PAGE_ID, COMMENT = range(5) # high_list item data 117 | (HIGHLIGHT_H, COMMENT_H, DATE_H, TITLE_H, 118 | AUTHOR_H, PAGE_H, CHAPTER_H, PATH_H) = range(8) # high_table columns 119 | (MANY_TEXT, ONE_TEXT, MANY_HTML, ONE_HTML, 120 | MANY_CSV, ONE_CSV, MANY_MD, ONE_MD) = range(8) # save_actions 121 | DB_MD5, DB_DATE, DB_PATH, DB_DATA = range(4) # db data (columns) 122 | FILTER_ALL, FILTER_HIGH, FILTER_COMM, FILTER_TITLES = range(4) # filter type 123 | (THEME_NONE_OLD, THEME_NONE_NEW, THEME_DARK_OLD, THEME_DARK_NEW, 124 | THEME_LIGHT_OLD, THEME_LIGHT_NEW) = range(6) # theme idx 125 | ACT_PAGE, ACT_DATE, ACT_TEXT, ACT_CHAPTER, ACT_COMMENT = range(5) # show items actions 126 | HI_DATE, HI_COMMENT, HI_TEXT, HI_PAGE, HI_CHAPTER = range(5) # highlight items 127 | DEL_META, DEL_BOOKS, DEL_MISSING = range(3) 128 | 129 | 130 | NO_TITLE = _("NO TITLE FOUND") 131 | NO_AUTHOR = _("NO AUTHOR FOUND") 132 | OLD_TYPE = _("OLD TYPE FILE") 133 | DO_NOT_SHOW = _("Don't show this again") 134 | DB_VERSION = 0 135 | DATE_FORMAT = "%Y-%m-%d %H:%M:%S" 136 | TOOLTIP_MERGE = _("Merge the highlights from the same book in two different\ndevices, " 137 | "and/or sync their reading position.\nActivated only if two entries " 138 | "of the same book are selected.") 139 | TOOLTIP_SYNC = _("Start the sync process for all enabled groups") 140 | HIGH_COL_NAMES = ["Highlight", "Comment", "Date", "Title", 141 | "Author", "Page", "Chapter", "Path"] 142 | SYNC_FILE = join(SETTINGS_DIR, "sync_groups.json") 143 | SPLITTER = " ▸ " 144 | 145 | CSV_HEAD = "Title\tAuthors\tPage\tDate\tChapter\tHighlight\tComment\n" 146 | CSV_KEYS = ["title", "authors", "page", "date", "chapter", "text", "comment"] 147 | MD_HEAD = "\n---\n## {0} \n##### {1} \n---\n" 148 | MD_HIGH = "*Page {3} [{0}]:* \n***{4}*** \n \n{2} \n● {1} \n  \n\n" 149 | HTML_HEAD = """ 150 | 151 | 152 | 153 | 169 | KoHighlights 170 | 171 | 172 | """ 173 | BOOK_BLOCK = """ 174 |
175 | 176 |
177 |

%(title)s


178 |

%(authors)s

179 |
180 | """ 181 | HIGH_BLOCK = """ 182 |
183 |

%(page)s

184 |

%(date)s

185 |
186 |

%(chapter)s

187 |

%(highlight)s

188 |

%(comment)s

189 |
190 | """ 191 | -------------------------------------------------------------------------------- /gui_about.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'D:\Apps\DEV\PROJECTS\KoHighlights\gui_about.ui', 4 | # licensing of 'D:\Apps\DEV\PROJECTS\KoHighlights\gui_about.ui' applies. 5 | # 6 | # Created: Mon Nov 4 00:35:07 2024 7 | # by: pyside2-uic running on PySide2 5.13.2 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_About(object): 14 | def setupUi(self, About): 15 | About.setObjectName("About") 16 | About.setWindowModality(QtCore.Qt.ApplicationModal) 17 | About.resize(480, 560) 18 | About.setLocale(QtCore.QLocale(QtCore.QLocale.English, QtCore.QLocale.UnitedStates)) 19 | About.setModal(False) 20 | self.verticalLayout = QtWidgets.QVBoxLayout(About) 21 | self.verticalLayout.setObjectName("verticalLayout") 22 | self.about_tabs = QtWidgets.QTabWidget(About) 23 | self.about_tabs.setTabShape(QtWidgets.QTabWidget.Rounded) 24 | self.about_tabs.setDocumentMode(True) 25 | self.about_tabs.setObjectName("about_tabs") 26 | self.info_tab = QtWidgets.QWidget() 27 | self.info_tab.setObjectName("info_tab") 28 | self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.info_tab) 29 | self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) 30 | self.verticalLayout_2.setObjectName("verticalLayout_2") 31 | self.scrollArea_2 = QtWidgets.QScrollArea(self.info_tab) 32 | self.scrollArea_2.setStyleSheet("QScrollArea {background-color:transparent;}") 33 | self.scrollArea_2.setWidgetResizable(True) 34 | self.scrollArea_2.setObjectName("scrollArea_2") 35 | self.scrollAreaWidgetContents_2 = QtWidgets.QWidget() 36 | self.scrollAreaWidgetContents_2.setGeometry(QtCore.QRect(0, 0, 460, 490)) 37 | self.scrollAreaWidgetContents_2.setStyleSheet("background-color:transparent;") 38 | self.scrollAreaWidgetContents_2.setObjectName("scrollAreaWidgetContents_2") 39 | self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents_2) 40 | self.verticalLayout_6.setContentsMargins(6, 0, 6, 0) 41 | self.verticalLayout_6.setObjectName("verticalLayout_6") 42 | self.text_lbl = QtWidgets.QLabel(self.scrollAreaWidgetContents_2) 43 | self.text_lbl.setText("") 44 | self.text_lbl.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) 45 | self.text_lbl.setWordWrap(True) 46 | self.text_lbl.setOpenExternalLinks(True) 47 | self.text_lbl.setObjectName("text_lbl") 48 | self.verticalLayout_6.addWidget(self.text_lbl) 49 | self.scrollArea_2.setWidget(self.scrollAreaWidgetContents_2) 50 | self.verticalLayout_2.addWidget(self.scrollArea_2) 51 | self.about_tabs.addTab(self.info_tab, "") 52 | self.system_tab = QtWidgets.QWidget() 53 | self.system_tab.setObjectName("system_tab") 54 | self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.system_tab) 55 | self.verticalLayout_4.setContentsMargins(0, 0, 0, 0) 56 | self.verticalLayout_4.setObjectName("verticalLayout_4") 57 | self.system_txt = QtWidgets.QTextEdit(self.system_tab) 58 | self.system_txt.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse) 59 | self.system_txt.setObjectName("system_txt") 60 | self.verticalLayout_4.addWidget(self.system_txt) 61 | self.about_tabs.addTab(self.system_tab, "") 62 | self.usage_tab = QtWidgets.QWidget() 63 | self.usage_tab.setObjectName("usage_tab") 64 | self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.usage_tab) 65 | self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) 66 | self.verticalLayout_3.setObjectName("verticalLayout_3") 67 | self.usage_txt = QtWidgets.QTextBrowser(self.usage_tab) 68 | self.usage_txt.setFrameShape(QtWidgets.QFrame.WinPanel) 69 | self.usage_txt.setTextInteractionFlags(QtCore.Qt.TextBrowserInteraction) 70 | self.usage_txt.setOpenLinks(False) 71 | self.usage_txt.setObjectName("usage_txt") 72 | self.verticalLayout_3.addWidget(self.usage_txt) 73 | self.about_tabs.addTab(self.usage_tab, "") 74 | self.log_tab = QtWidgets.QWidget() 75 | self.log_tab.setObjectName("log_tab") 76 | self.verticalLayout_8 = QtWidgets.QVBoxLayout(self.log_tab) 77 | self.verticalLayout_8.setContentsMargins(0, 0, 0, 0) 78 | self.verticalLayout_8.setObjectName("verticalLayout_8") 79 | self.log_txt = QtWidgets.QPlainTextEdit(self.log_tab) 80 | self.log_txt.setFrameShape(QtWidgets.QFrame.WinPanel) 81 | self.log_txt.setUndoRedoEnabled(False) 82 | self.log_txt.setReadOnly(True) 83 | self.log_txt.setPlainText("") 84 | self.log_txt.setObjectName("log_txt") 85 | self.verticalLayout_8.addWidget(self.log_txt) 86 | self.about_tabs.addTab(self.log_tab, "") 87 | self.verticalLayout.addWidget(self.about_tabs) 88 | self.btn_box = QtWidgets.QFrame(About) 89 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) 90 | sizePolicy.setHorizontalStretch(0) 91 | sizePolicy.setVerticalStretch(0) 92 | sizePolicy.setHeightForWidth(self.btn_box.sizePolicy().hasHeightForWidth()) 93 | self.btn_box.setSizePolicy(sizePolicy) 94 | self.btn_box.setObjectName("btn_box") 95 | self.horizontalLayout = QtWidgets.QHBoxLayout(self.btn_box) 96 | self.horizontalLayout.setContentsMargins(0, 0, 0, 0) 97 | self.horizontalLayout.setObjectName("horizontalLayout") 98 | self.usage_btn = QtWidgets.QPushButton(self.btn_box) 99 | self.usage_btn.setAutoDefault(False) 100 | self.usage_btn.setObjectName("usage_btn") 101 | self.horizontalLayout.addWidget(self.usage_btn) 102 | spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 103 | self.horizontalLayout.addItem(spacerItem) 104 | self.updates_btn = QtWidgets.QPushButton(self.btn_box) 105 | self.updates_btn.setAutoDefault(False) 106 | self.updates_btn.setObjectName("updates_btn") 107 | self.horizontalLayout.addWidget(self.updates_btn) 108 | spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 109 | self.horizontalLayout.addItem(spacerItem1) 110 | self.close_btn = QtWidgets.QPushButton(self.btn_box) 111 | self.close_btn.setObjectName("close_btn") 112 | self.horizontalLayout.addWidget(self.close_btn) 113 | self.verticalLayout.addWidget(self.btn_box) 114 | 115 | self.retranslateUi(About) 116 | self.about_tabs.setCurrentIndex(0) 117 | QtCore.QObject.connect(self.close_btn, QtCore.SIGNAL("clicked()"), About.close) 118 | QtCore.QMetaObject.connectSlotsByName(About) 119 | 120 | def retranslateUi(self, About): 121 | self.about_tabs.setTabText(self.about_tabs.indexOf(self.info_tab), QtWidgets.QApplication.translate("About", "Information", None, -1)) 122 | self.about_tabs.setTabText(self.about_tabs.indexOf(self.system_tab), QtWidgets.QApplication.translate("About", "System", None, -1)) 123 | self.about_tabs.setTabText(self.about_tabs.indexOf(self.usage_tab), QtWidgets.QApplication.translate("About", "User Guide", None, -1)) 124 | self.about_tabs.setTabText(self.about_tabs.indexOf(self.log_tab), QtWidgets.QApplication.translate("About", "Log", None, -1)) 125 | self.usage_btn.setToolTip(QtWidgets.QApplication.translate("About", "View the User Guide online", None, -1)) 126 | self.usage_btn.setText(QtWidgets.QApplication.translate("About", "Online Guide", None, -1)) 127 | self.updates_btn.setToolTip(QtWidgets.QApplication.translate("About", "Check online for an updated version", None, -1)) 128 | self.updates_btn.setText(QtWidgets.QApplication.translate("About", "Check for Updates", None, -1)) 129 | self.close_btn.setText(QtWidgets.QApplication.translate("About", "Close", None, -1)) 130 | 131 | import images_rc 132 | -------------------------------------------------------------------------------- /gui_about.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | About 4 | 5 | 6 | Qt::ApplicationModal 7 | 8 | 9 | 10 | 0 11 | 0 12 | 480 13 | 560 14 | 15 | 16 | 17 | 18 | 19 | 20 | false 21 | 22 | 23 | 24 | 25 | 26 | QTabWidget::Rounded 27 | 28 | 29 | 0 30 | 31 | 32 | true 33 | 34 | 35 | 36 | Information 37 | 38 | 39 | 40 | 0 41 | 42 | 43 | 44 | 45 | QScrollArea {background-color:transparent;} 46 | 47 | 48 | true 49 | 50 | 51 | 52 | 53 | 0 54 | 0 55 | 460 56 | 490 57 | 58 | 59 | 60 | background-color:transparent; 61 | 62 | 63 | 64 | 6 65 | 66 | 67 | 0 68 | 69 | 70 | 6 71 | 72 | 73 | 0 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop 82 | 83 | 84 | true 85 | 86 | 87 | true 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | System 100 | 101 | 102 | 103 | 0 104 | 105 | 106 | 107 | 108 | Qt::TextSelectableByMouse 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | User Guide 117 | 118 | 119 | 120 | 0 121 | 122 | 123 | 124 | 125 | QFrame::WinPanel 126 | 127 | 128 | Qt::TextBrowserInteraction 129 | 130 | 131 | false 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | Log 140 | 141 | 142 | 143 | 0 144 | 145 | 146 | 147 | 148 | QFrame::WinPanel 149 | 150 | 151 | false 152 | 153 | 154 | true 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 0 170 | 0 171 | 172 | 173 | 174 | 175 | 0 176 | 177 | 178 | 179 | 180 | View the User Guide online 181 | 182 | 183 | Online Guide 184 | 185 | 186 | false 187 | 188 | 189 | 190 | 191 | 192 | 193 | Qt::Horizontal 194 | 195 | 196 | 197 | 40 198 | 20 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | Check online for an updated version 207 | 208 | 209 | Check for Updates 210 | 211 | 212 | false 213 | 214 | 215 | 216 | 217 | 218 | 219 | Qt::Horizontal 220 | 221 | 222 | 223 | 40 224 | 20 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | Close 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | close_btn 247 | clicked() 248 | About 249 | close() 250 | 251 | 252 | 169 253 | 116 254 | 255 | 256 | 168 257 | 75 258 | 259 | 260 | 261 | 262 | 263 | -------------------------------------------------------------------------------- /slppu.py: -------------------------------------------------------------------------------- 1 | import re 2 | import sys 3 | 4 | # https://github.com/noembryo/slppu 5 | 6 | ERRORS = {'unexp_end_string': u'Unexpected end of string while parsing Lua string.', 7 | 'unexp_end_table': u'Unexpected end of table while parsing Lua string.', 8 | 'mfnumber_minus': u'Malformed number (no digits after initial minus).', 9 | 'mfnumber_dec_point': u'Malformed number (no digits after decimal point).', 10 | 'mfnumber_sci': u'Malformed number (bad scientific format).'} 11 | 12 | 13 | class ParseError(Exception): 14 | pass 15 | 16 | 17 | class SLPPU(object): 18 | 19 | def __init__(self): 20 | self.text = '' 21 | self.ch = '' 22 | self.at = 0 23 | self.len = 0 24 | self.depth = 0 25 | self.space = re.compile(r'\s', re.M) 26 | self.alnum = re.compile(r'\w', re.M) 27 | self.newline = '\n' 28 | self.tab = ' ' # or '\t' 29 | 30 | def decode(self, text): 31 | if not text or not isinstance(text, str): 32 | return 33 | # FIXME: only short comments removed 34 | reg = re.compile('--.*$', re.M) 35 | text = reg.sub('', text, 0) 36 | self.text = text 37 | self.at, self.ch, self.depth = 0, '', 0 38 | self.len = len(text) 39 | self.next_chr() 40 | result = self.value() 41 | return result 42 | 43 | def encode(self, obj): 44 | self.depth = 0 45 | return self.__encode(obj) 46 | 47 | def __encode(self, obj): 48 | s = '' 49 | tab = self.tab 50 | newline = self.newline 51 | tp = type(obj) 52 | if tp == str: 53 | s += '"%s"' % obj.replace(r'"', r'\"') 54 | elif tp in [int, float, complex]: 55 | s += str(obj) 56 | elif tp is bool: 57 | s += str(obj).lower() 58 | elif obj is None: 59 | s += 'nil' 60 | elif tp in [list, tuple, dict]: 61 | self.depth += 1 62 | if len(obj) == 0 or (tp is not dict and 63 | len(filter(lambda x: type(x) in (int, float, str) or 64 | (isinstance(x, str) and 65 | len(x) < 10), obj)) == len(obj)): 66 | newline = tab = '' 67 | dp = tab * self.depth 68 | s += "%s{%s" % (tab * (self.depth - 2), newline) 69 | if tp is dict: 70 | contents = [] 71 | for k, v in obj.items(): 72 | k = ('[{}]'.format(k) if type(k) in [int, float, complex] 73 | else '["{}"]'.format(k)) 74 | contents.append(dp + '%s = %s' % (k, (self.__encode(v)))) 75 | s += (',%s' % newline).join(contents) 76 | 77 | else: 78 | s += (',%s' % newline).join( 79 | [dp + self.__encode(el) for el in obj]) 80 | self.depth -= 1 81 | s += "%s%s}" % (newline, tab * self.depth) 82 | return s 83 | 84 | def white(self): 85 | while self.ch: 86 | if self.space.match(self.ch): 87 | self.next_chr() 88 | else: 89 | break 90 | 91 | def next_chr(self): 92 | if self.at >= self.len: 93 | self.ch = None 94 | return None 95 | self.ch = self.text[self.at] 96 | self.at += 1 97 | return True 98 | 99 | def value(self): 100 | self.white() 101 | if not self.ch: 102 | return 103 | if self.ch == '{': 104 | return self.object() 105 | if self.ch == "[": 106 | self.next_chr() 107 | if self.ch in ['"', "'", '[']: 108 | return self.string(self.ch) 109 | if self.ch.isdigit() or self.ch == '-': 110 | return self.number() 111 | return self.word() 112 | 113 | def string(self, end=None): 114 | s = '' 115 | start = self.ch 116 | if end == '[': 117 | end = ']' 118 | if start in ['"', "'", '[']: 119 | while self.next_chr(): 120 | if self.ch == end: 121 | self.next_chr() 122 | if start != "[" or self.ch == ']': 123 | return s 124 | if self.ch == '\\' and start == end: 125 | self.next_chr() 126 | if self.ch != end: 127 | s += '\\' 128 | s += self.ch 129 | print(ERRORS['unexp_end_string']) 130 | 131 | def object(self): 132 | o = {} 133 | k = None 134 | idx = 0 135 | numeric_keys = False 136 | self.depth += 1 137 | self.next_chr() 138 | self.white() 139 | if self.ch and self.ch == '}': 140 | self.depth -= 1 141 | self.next_chr() 142 | return o # Exit here 143 | else: 144 | while self.ch: 145 | self.white() 146 | if self.ch == '{': 147 | o[idx] = self.object() 148 | idx += 1 149 | continue 150 | elif self.ch == '}': 151 | self.depth -= 1 152 | self.next_chr() 153 | if k is not None: 154 | o[idx] = k 155 | if not numeric_keys and len([key for key in o 156 | if isinstance(key, (str, float, bool, 157 | tuple))]) == 0: 158 | ar = [] 159 | for key in o: 160 | ar.insert(key, o[key]) 161 | o = ar 162 | return o # or here 163 | else: 164 | if self.ch == ',': 165 | self.next_chr() 166 | continue 167 | else: 168 | k = self.value() 169 | if self.ch == ']': 170 | numeric_keys = True 171 | self.next_chr() 172 | self.white() 173 | ch = self.ch 174 | if ch in ('=', ','): 175 | self.next_chr() 176 | self.white() 177 | if ch == '=': 178 | o[k] = self.value() 179 | else: 180 | o[idx] = k 181 | idx += 1 182 | k = None 183 | print(ERRORS['unexp_end_table']) # Bad exit here 184 | 185 | words = {'true': True, 'false': False, 'nil': None} 186 | 187 | def word(self): 188 | s = '' 189 | if self.ch != '\n': 190 | s = self.ch 191 | self.next_chr() 192 | while self.ch is not None and self.alnum.match(self.ch) and s not in self.words: 193 | s += self.ch 194 | self.next_chr() 195 | return self.words.get(s, s) 196 | 197 | def number(self): 198 | def next_digit(err): 199 | num = self.ch 200 | self.next_chr() 201 | if not self.ch or not self.ch.isdigit(): 202 | raise ParseError(err) 203 | return num 204 | n = '' 205 | try: 206 | if self.ch == '-': 207 | n += next_digit(ERRORS['mfnumber_minus']) 208 | n += self.digit() 209 | if n == '0' and self.ch in ['x', 'X']: 210 | n += self.ch 211 | self.next_chr() 212 | n += self.hex() 213 | else: 214 | if self.ch and self.ch == '.': 215 | n += next_digit(ERRORS['mfnumber_dec_point']) 216 | n += self.digit() 217 | if self.ch and self.ch in ['e', 'E']: 218 | n += self.ch 219 | self.next_chr() 220 | if not self.ch or self.ch not in ('+', '-'): 221 | raise ParseError(ERRORS['mfnumber_sci']) 222 | n += next_digit(ERRORS['mfnumber_sci']) 223 | n += self.digit() 224 | except ParseError: 225 | t, e = sys.exc_info()[:2] 226 | print(e) 227 | return 0 228 | # noinspection PyBroadException 229 | try: 230 | return int(n, 0) 231 | except Exception: 232 | pass 233 | return float(n) 234 | 235 | def digit(self): 236 | n = '' 237 | while self.ch and self.ch.isdigit(): 238 | n += self.ch 239 | self.next_chr() 240 | return n 241 | 242 | def hex(self): 243 | n = '' 244 | while self.ch and (self.ch in 'ABCDEFabcdef' or self.ch.isdigit()): 245 | n += self.ch 246 | self.next_chr() 247 | return n 248 | 249 | 250 | slppu = SLPPU() 251 | 252 | __all__ = ['slppu'] 253 | -------------------------------------------------------------------------------- /gui_sync_group.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'D:\Apps\DEV\PROJECTS\KoHighlights\gui_sync_group.ui', 4 | # licensing of 'D:\Apps\DEV\PROJECTS\KoHighlights\gui_sync_group.ui' applies. 5 | # 6 | # Created: Tue May 7 14:53:08 2024 7 | # by: pyside2-uic running on PySide2 5.13.2 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_SyncGroup(object): 14 | def setupUi(self, SyncGroup): 15 | SyncGroup.setObjectName("SyncGroup") 16 | SyncGroup.resize(672, 50) 17 | self.horizontalLayout_5 = QtWidgets.QHBoxLayout(SyncGroup) 18 | self.horizontalLayout_5.setSpacing(0) 19 | self.horizontalLayout_5.setContentsMargins(0, 0, 0, 0) 20 | self.horizontalLayout_5.setObjectName("horizontalLayout_5") 21 | self.frame = QtWidgets.QFrame(SyncGroup) 22 | self.frame.setObjectName("frame") 23 | self.verticalLayout = QtWidgets.QVBoxLayout(self.frame) 24 | self.verticalLayout.setSpacing(0) 25 | self.verticalLayout.setContentsMargins(0, 0, 1, 0) 26 | self.verticalLayout.setObjectName("verticalLayout") 27 | spacerItem = QtWidgets.QSpacerItem(20, 30, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 28 | self.verticalLayout.addItem(spacerItem) 29 | self.power_btn = QtWidgets.QToolButton(self.frame) 30 | self.power_btn.setText("") 31 | icon = QtGui.QIcon() 32 | icon.addPixmap(QtGui.QPixmap(":/stuff/power32gray.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 33 | icon.addPixmap(QtGui.QPixmap(":/stuff/power32red.png"), QtGui.QIcon.Normal, QtGui.QIcon.On) 34 | self.power_btn.setIcon(icon) 35 | self.power_btn.setIconSize(QtCore.QSize(16, 16)) 36 | self.power_btn.setCheckable(True) 37 | self.power_btn.setChecked(True) 38 | self.power_btn.setAutoRaise(True) 39 | self.power_btn.setObjectName("power_btn") 40 | self.verticalLayout.addWidget(self.power_btn) 41 | spacerItem1 = QtWidgets.QSpacerItem(20, 28, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 42 | self.verticalLayout.addItem(spacerItem1) 43 | self.horizontalLayout_5.addWidget(self.frame) 44 | self.group_frm = QtWidgets.QFrame(SyncGroup) 45 | self.group_frm.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) 46 | self.group_frm.setFrameShape(QtWidgets.QFrame.Box) 47 | self.group_frm.setFrameShadow(QtWidgets.QFrame.Plain) 48 | self.group_frm.setLineWidth(1) 49 | self.group_frm.setObjectName("group_frm") 50 | self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.group_frm) 51 | self.verticalLayout_2.setSpacing(0) 52 | self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) 53 | self.verticalLayout_2.setObjectName("verticalLayout_2") 54 | self.title_frm = QtWidgets.QFrame(self.group_frm) 55 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) 56 | sizePolicy.setHorizontalStretch(0) 57 | sizePolicy.setVerticalStretch(0) 58 | sizePolicy.setHeightForWidth(self.title_frm.sizePolicy().hasHeightForWidth()) 59 | self.title_frm.setSizePolicy(sizePolicy) 60 | self.title_frm.setFrameShape(QtWidgets.QFrame.StyledPanel) 61 | self.title_frm.setFrameShadow(QtWidgets.QFrame.Raised) 62 | self.title_frm.setObjectName("title_frm") 63 | self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.title_frm) 64 | self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0) 65 | self.horizontalLayout_4.setObjectName("horizontalLayout_4") 66 | self.refresh_btn = QtWidgets.QToolButton(self.title_frm) 67 | self.refresh_btn.setText("") 68 | icon1 = QtGui.QIcon() 69 | icon1.addPixmap(QtGui.QPixmap(":/stuff/refresh16.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 70 | self.refresh_btn.setIcon(icon1) 71 | self.refresh_btn.setIconSize(QtCore.QSize(16, 16)) 72 | self.refresh_btn.setChecked(False) 73 | self.refresh_btn.setAutoRaise(True) 74 | self.refresh_btn.setObjectName("refresh_btn") 75 | self.horizontalLayout_4.addWidget(self.refresh_btn) 76 | spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 77 | self.horizontalLayout_4.addItem(spacerItem2) 78 | self.title_lbl = QtWidgets.QLabel(self.title_frm) 79 | self.title_lbl.setAutoFillBackground(True) 80 | self.title_lbl.setText("") 81 | self.title_lbl.setAlignment(QtCore.Qt.AlignCenter) 82 | self.title_lbl.setObjectName("title_lbl") 83 | self.horizontalLayout_4.addWidget(self.title_lbl) 84 | spacerItem3 = QtWidgets.QSpacerItem(161, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 85 | self.horizontalLayout_4.addItem(spacerItem3) 86 | self.sync_btn = QtWidgets.QToolButton(self.title_frm) 87 | icon2 = QtGui.QIcon() 88 | icon2.addPixmap(QtGui.QPixmap(":/stuff/sync.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 89 | self.sync_btn.setIcon(icon2) 90 | self.sync_btn.setChecked(False) 91 | self.sync_btn.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) 92 | self.sync_btn.setAutoRaise(True) 93 | self.sync_btn.setObjectName("sync_btn") 94 | self.horizontalLayout_4.addWidget(self.sync_btn) 95 | self.verticalLayout_2.addWidget(self.title_frm) 96 | self.checks_frm = QtWidgets.QFrame(self.group_frm) 97 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) 98 | sizePolicy.setHorizontalStretch(0) 99 | sizePolicy.setVerticalStretch(0) 100 | sizePolicy.setHeightForWidth(self.checks_frm.sizePolicy().hasHeightForWidth()) 101 | self.checks_frm.setSizePolicy(sizePolicy) 102 | self.checks_frm.setFrameShape(QtWidgets.QFrame.StyledPanel) 103 | self.checks_frm.setFrameShadow(QtWidgets.QFrame.Raised) 104 | self.checks_frm.setObjectName("checks_frm") 105 | self.horizontalLayout = QtWidgets.QHBoxLayout(self.checks_frm) 106 | self.horizontalLayout.setContentsMargins(4, 0, 2, 0) 107 | self.horizontalLayout.setObjectName("horizontalLayout") 108 | self.sync_pos_chk = QtWidgets.QCheckBox(self.checks_frm) 109 | self.sync_pos_chk.setObjectName("sync_pos_chk") 110 | self.horizontalLayout.addWidget(self.sync_pos_chk) 111 | self.merge_chk = QtWidgets.QCheckBox(self.checks_frm) 112 | self.merge_chk.setObjectName("merge_chk") 113 | self.horizontalLayout.addWidget(self.merge_chk) 114 | self.sync_db_chk = QtWidgets.QCheckBox(self.checks_frm) 115 | self.sync_db_chk.setObjectName("sync_db_chk") 116 | self.horizontalLayout.addWidget(self.sync_db_chk) 117 | spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 118 | self.horizontalLayout.addItem(spacerItem4) 119 | self.fold_btn = QtWidgets.QToolButton(self.checks_frm) 120 | self.fold_btn.setStyleSheet("QToolButton{border:none;}") 121 | self.fold_btn.setCheckable(True) 122 | self.fold_btn.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) 123 | self.fold_btn.setArrowType(QtCore.Qt.DownArrow) 124 | self.fold_btn.setObjectName("fold_btn") 125 | self.horizontalLayout.addWidget(self.fold_btn) 126 | self.verticalLayout_2.addWidget(self.checks_frm) 127 | self.items_frm = QtWidgets.QFrame(self.group_frm) 128 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding) 129 | sizePolicy.setHorizontalStretch(0) 130 | sizePolicy.setVerticalStretch(0) 131 | sizePolicy.setHeightForWidth(self.items_frm.sizePolicy().hasHeightForWidth()) 132 | self.items_frm.setSizePolicy(sizePolicy) 133 | self.items_frm.setFrameShape(QtWidgets.QFrame.StyledPanel) 134 | self.items_frm.setFrameShadow(QtWidgets.QFrame.Raised) 135 | self.items_frm.setObjectName("items_frm") 136 | self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.items_frm) 137 | self.verticalLayout_3.setSpacing(0) 138 | self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) 139 | self.verticalLayout_3.setObjectName("verticalLayout_3") 140 | self.verticalLayout_2.addWidget(self.items_frm) 141 | self.horizontalLayout_5.addWidget(self.group_frm) 142 | 143 | self.retranslateUi(SyncGroup) 144 | QtCore.QObject.connect(self.power_btn, QtCore.SIGNAL("toggled(bool)"), self.group_frm.setEnabled) 145 | QtCore.QMetaObject.connectSlotsByName(SyncGroup) 146 | 147 | def retranslateUi(self, SyncGroup): 148 | self.power_btn.setToolTip(QtWidgets.QApplication.translate("SyncGroup", "Enable or disable this Sync Group", None, -1)) 149 | self.power_btn.setStatusTip(QtWidgets.QApplication.translate("SyncGroup", "Enable or disable this Sync Group", None, -1)) 150 | self.refresh_btn.setToolTip(QtWidgets.QApplication.translate("SyncGroup", "Reload the Group and check the paths for errors", None, -1)) 151 | self.refresh_btn.setStatusTip(QtWidgets.QApplication.translate("SyncGroup", "Reload the Group and check the paths for errors", None, -1)) 152 | self.sync_btn.setToolTip(QtWidgets.QApplication.translate("SyncGroup", "Start the sync/merge process for this group", None, -1)) 153 | self.sync_btn.setStatusTip(QtWidgets.QApplication.translate("SyncGroup", "Start the sync/merge process for this group", None, -1)) 154 | self.sync_btn.setText(QtWidgets.QApplication.translate("SyncGroup", "Sync this group", None, -1)) 155 | self.sync_pos_chk.setToolTip(QtWidgets.QApplication.translate("SyncGroup", "Sync the current position and read percent of the books", None, -1)) 156 | self.sync_pos_chk.setStatusTip(QtWidgets.QApplication.translate("SyncGroup", "Sync the current position and read percent of the books", None, -1)) 157 | self.sync_pos_chk.setText(QtWidgets.QApplication.translate("SyncGroup", "Sync position", None, -1)) 158 | self.merge_chk.setToolTip(QtWidgets.QApplication.translate("SyncGroup", "Merge the highlights from both books\\n(and/or the archived version)", None, -1)) 159 | self.merge_chk.setStatusTip(QtWidgets.QApplication.translate("SyncGroup", "Merge the highlights from both books\\\\n(and/or the archived version)", None, -1)) 160 | self.merge_chk.setText(QtWidgets.QApplication.translate("SyncGroup", "Merge Highlights", None, -1)) 161 | self.sync_db_chk.setToolTip(QtWidgets.QApplication.translate("SyncGroup", "Keep a synced version of the book in the archived database", None, -1)) 162 | self.sync_db_chk.setStatusTip(QtWidgets.QApplication.translate("SyncGroup", "Keep a synced version of the book in the archived database", None, -1)) 163 | self.sync_db_chk.setText(QtWidgets.QApplication.translate("SyncGroup", "Sync with archived", None, -1)) 164 | self.fold_btn.setText(QtWidgets.QApplication.translate("SyncGroup", "Hide sync paths", None, -1)) 165 | 166 | import images_rc 167 | -------------------------------------------------------------------------------- /gui_edit_template.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | EditTemplate 4 | 5 | 6 | 7 | 0 8 | 0 9 | 500 10 | 500 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | false 21 | 22 | 23 | 24 | 25 | 26 | 27 | 0 28 | 200 29 | 30 | 31 | 32 | Qt::Vertical 33 | 34 | 35 | false 36 | 37 | 38 | 39 | 40 | 41 | 42 | Title - Authors 43 | 44 | 45 | 46 | 0 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | true 55 | 56 | 57 | 58 | 59 | 60 | 61 | QFrame::StyledPanel 62 | 63 | 64 | QFrame::Raised 65 | 66 | 67 | 68 | 0 69 | 70 | 71 | 72 | 73 | 74 | 0 75 | 0 76 | 77 | 78 | 79 | Qt::Horizontal 80 | 81 | 82 | 83 | QFrame::WinPanel 84 | 85 | 86 | false 87 | 88 | 89 | 90 | 91 | QFrame::WinPanel 92 | 93 | 94 | true 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | Highlight 107 | 108 | 109 | 110 | 0 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | true 119 | 120 | 121 | 122 | 123 | 124 | 125 | QFrame::StyledPanel 126 | 127 | 128 | QFrame::Raised 129 | 130 | 131 | 132 | 0 133 | 134 | 135 | 136 | 137 | 138 | 0 139 | 0 140 | 141 | 142 | 143 | Qt::Horizontal 144 | 145 | 146 | 147 | QFrame::WinPanel 148 | 149 | 150 | false 151 | 152 | 153 | 154 | 155 | QFrame::WinPanel 156 | 157 | 158 | true 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 0 175 | 176 | 177 | 178 | 179 | 180 | 0 181 | 0 182 | 183 | 184 | 185 | Split Chapters 186 | 187 | 188 | 189 | 190 | 191 | 192 | using 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | Heading L1 201 | 202 | 203 | 204 | 205 | Heading L2 206 | 207 | 208 | 209 | 210 | Heading L3 211 | 212 | 213 | 214 | 215 | Heading L4 216 | 217 | 218 | 219 | 220 | Heading L5 221 | 222 | 223 | 224 | 225 | Heading L6 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | to 234 | 235 | 236 | 237 | 238 | 239 | 240 | 5 241 | 242 | 243 | 244 | Heading L1 245 | 246 | 247 | 248 | 249 | Heading L2 250 | 251 | 252 | 253 | 254 | Heading L3 255 | 256 | 257 | 258 | 259 | Heading L4 260 | 261 | 262 | 263 | 264 | Heading L5 265 | 266 | 267 | 268 | 269 | Heading L6 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | Qt::Horizontal 278 | 279 | 280 | 281 | 40 282 | 20 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 0 295 | 0 296 | 297 | 298 | 299 | 300 | 0 301 | 302 | 303 | 304 | 305 | Default 306 | 307 | 308 | 309 | 310 | 311 | 312 | Qt::Horizontal 313 | 314 | 315 | 316 | 175 317 | 20 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | Check online for an updated version 326 | 327 | 328 | OK 329 | 330 | 331 | 332 | 333 | 334 | 335 | Cancel 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | -------------------------------------------------------------------------------- /gui_edit_template.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'D:\Apps\DEV\PROJECTS\KoHighlights\gui_edit_template.ui', 4 | # licensing of 'D:\Apps\DEV\PROJECTS\KoHighlights\gui_edit_template.ui' applies. 5 | # 6 | # Created: Mon Nov 4 00:35:08 2024 7 | # by: pyside2-uic running on PySide2 5.13.2 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_EditTemplate(object): 14 | def setupUi(self, EditTemplate): 15 | EditTemplate.setObjectName("EditTemplate") 16 | EditTemplate.resize(500, 500) 17 | EditTemplate.setStyleSheet("") 18 | EditTemplate.setLocale(QtCore.QLocale(QtCore.QLocale.English, QtCore.QLocale.UnitedStates)) 19 | EditTemplate.setModal(False) 20 | self.verticalLayout_3 = QtWidgets.QVBoxLayout(EditTemplate) 21 | self.verticalLayout_3.setObjectName("verticalLayout_3") 22 | self.splitter = QtWidgets.QSplitter(EditTemplate) 23 | self.splitter.setMinimumSize(QtCore.QSize(0, 200)) 24 | self.splitter.setOrientation(QtCore.Qt.Vertical) 25 | self.splitter.setChildrenCollapsible(False) 26 | self.splitter.setObjectName("splitter") 27 | self.groupBox = QtWidgets.QGroupBox(self.splitter) 28 | self.groupBox.setStyleSheet("") 29 | self.groupBox.setObjectName("groupBox") 30 | self.verticalLayout = QtWidgets.QVBoxLayout(self.groupBox) 31 | self.verticalLayout.setContentsMargins(0, 0, 0, 0) 32 | self.verticalLayout.setObjectName("verticalLayout") 33 | self.head_help_lbl = QtWidgets.QLabel(self.groupBox) 34 | self.head_help_lbl.setText("") 35 | self.head_help_lbl.setWordWrap(True) 36 | self.head_help_lbl.setObjectName("head_help_lbl") 37 | self.verticalLayout.addWidget(self.head_help_lbl) 38 | self.frame_2 = QtWidgets.QFrame(self.groupBox) 39 | self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel) 40 | self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised) 41 | self.frame_2.setObjectName("frame_2") 42 | self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.frame_2) 43 | self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) 44 | self.horizontalLayout_2.setObjectName("horizontalLayout_2") 45 | self.head_split = QtWidgets.QSplitter(self.frame_2) 46 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) 47 | sizePolicy.setHorizontalStretch(0) 48 | sizePolicy.setVerticalStretch(0) 49 | sizePolicy.setHeightForWidth(self.head_split.sizePolicy().hasHeightForWidth()) 50 | self.head_split.setSizePolicy(sizePolicy) 51 | self.head_split.setOrientation(QtCore.Qt.Horizontal) 52 | self.head_split.setObjectName("head_split") 53 | self.head_edit_txt = QtWidgets.QTextEdit(self.head_split) 54 | self.head_edit_txt.setFrameShape(QtWidgets.QFrame.WinPanel) 55 | self.head_edit_txt.setAcceptRichText(False) 56 | self.head_edit_txt.setObjectName("head_edit_txt") 57 | self.head_preview_txt = QtWidgets.QTextEdit(self.head_split) 58 | self.head_preview_txt.setFrameShape(QtWidgets.QFrame.WinPanel) 59 | self.head_preview_txt.setReadOnly(True) 60 | self.head_preview_txt.setObjectName("head_preview_txt") 61 | self.horizontalLayout_2.addWidget(self.head_split) 62 | self.verticalLayout.addWidget(self.frame_2) 63 | self.groupBox_2 = QtWidgets.QGroupBox(self.splitter) 64 | self.groupBox_2.setObjectName("groupBox_2") 65 | self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBox_2) 66 | self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) 67 | self.verticalLayout_2.setObjectName("verticalLayout_2") 68 | self.body_help_lbl = QtWidgets.QLabel(self.groupBox_2) 69 | self.body_help_lbl.setText("") 70 | self.body_help_lbl.setWordWrap(True) 71 | self.body_help_lbl.setObjectName("body_help_lbl") 72 | self.verticalLayout_2.addWidget(self.body_help_lbl) 73 | self.frame = QtWidgets.QFrame(self.groupBox_2) 74 | self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) 75 | self.frame.setFrameShadow(QtWidgets.QFrame.Raised) 76 | self.frame.setObjectName("frame") 77 | self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.frame) 78 | self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0) 79 | self.horizontalLayout_3.setObjectName("horizontalLayout_3") 80 | self.body_split = QtWidgets.QSplitter(self.frame) 81 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) 82 | sizePolicy.setHorizontalStretch(0) 83 | sizePolicy.setVerticalStretch(0) 84 | sizePolicy.setHeightForWidth(self.body_split.sizePolicy().hasHeightForWidth()) 85 | self.body_split.setSizePolicy(sizePolicy) 86 | self.body_split.setOrientation(QtCore.Qt.Horizontal) 87 | self.body_split.setObjectName("body_split") 88 | self.body_edit_txt = QtWidgets.QTextEdit(self.body_split) 89 | self.body_edit_txt.setFrameShape(QtWidgets.QFrame.WinPanel) 90 | self.body_edit_txt.setAcceptRichText(False) 91 | self.body_edit_txt.setObjectName("body_edit_txt") 92 | self.body_preview_txt = QtWidgets.QTextEdit(self.body_split) 93 | self.body_preview_txt.setFrameShape(QtWidgets.QFrame.WinPanel) 94 | self.body_preview_txt.setReadOnly(True) 95 | self.body_preview_txt.setObjectName("body_preview_txt") 96 | self.horizontalLayout_3.addWidget(self.body_split) 97 | self.verticalLayout_2.addWidget(self.frame) 98 | self.verticalLayout_3.addWidget(self.splitter) 99 | self.split_chapters_frm = QtWidgets.QFrame(EditTemplate) 100 | self.split_chapters_frm.setObjectName("split_chapters_frm") 101 | self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.split_chapters_frm) 102 | self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0) 103 | self.horizontalLayout_4.setObjectName("horizontalLayout_4") 104 | self.split_chapters_chk = QtWidgets.QCheckBox(self.split_chapters_frm) 105 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) 106 | sizePolicy.setHorizontalStretch(0) 107 | sizePolicy.setVerticalStretch(0) 108 | sizePolicy.setHeightForWidth(self.split_chapters_chk.sizePolicy().hasHeightForWidth()) 109 | self.split_chapters_chk.setSizePolicy(sizePolicy) 110 | self.split_chapters_chk.setObjectName("split_chapters_chk") 111 | self.horizontalLayout_4.addWidget(self.split_chapters_chk) 112 | self.label = QtWidgets.QLabel(self.split_chapters_frm) 113 | self.label.setObjectName("label") 114 | self.horizontalLayout_4.addWidget(self.label) 115 | self.head_min_box = QtWidgets.QComboBox(self.split_chapters_frm) 116 | self.head_min_box.setObjectName("head_min_box") 117 | self.head_min_box.addItem("") 118 | self.head_min_box.addItem("") 119 | self.head_min_box.addItem("") 120 | self.head_min_box.addItem("") 121 | self.head_min_box.addItem("") 122 | self.head_min_box.addItem("") 123 | self.horizontalLayout_4.addWidget(self.head_min_box) 124 | self.label_2 = QtWidgets.QLabel(self.split_chapters_frm) 125 | self.label_2.setObjectName("label_2") 126 | self.horizontalLayout_4.addWidget(self.label_2) 127 | self.head_max_box = QtWidgets.QComboBox(self.split_chapters_frm) 128 | self.head_max_box.setObjectName("head_max_box") 129 | self.head_max_box.addItem("") 130 | self.head_max_box.addItem("") 131 | self.head_max_box.addItem("") 132 | self.head_max_box.addItem("") 133 | self.head_max_box.addItem("") 134 | self.head_max_box.addItem("") 135 | self.horizontalLayout_4.addWidget(self.head_max_box) 136 | spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 137 | self.horizontalLayout_4.addItem(spacerItem) 138 | self.verticalLayout_3.addWidget(self.split_chapters_frm) 139 | self.btn_box = QtWidgets.QFrame(EditTemplate) 140 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) 141 | sizePolicy.setHorizontalStretch(0) 142 | sizePolicy.setVerticalStretch(0) 143 | sizePolicy.setHeightForWidth(self.btn_box.sizePolicy().hasHeightForWidth()) 144 | self.btn_box.setSizePolicy(sizePolicy) 145 | self.btn_box.setObjectName("btn_box") 146 | self.horizontalLayout = QtWidgets.QHBoxLayout(self.btn_box) 147 | self.horizontalLayout.setContentsMargins(0, 0, 0, 0) 148 | self.horizontalLayout.setObjectName("horizontalLayout") 149 | self.default_btn = QtWidgets.QPushButton(self.btn_box) 150 | self.default_btn.setObjectName("default_btn") 151 | self.horizontalLayout.addWidget(self.default_btn) 152 | spacerItem1 = QtWidgets.QSpacerItem(175, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 153 | self.horizontalLayout.addItem(spacerItem1) 154 | self.ok_btn = QtWidgets.QPushButton(self.btn_box) 155 | self.ok_btn.setObjectName("ok_btn") 156 | self.horizontalLayout.addWidget(self.ok_btn) 157 | self.cancel_btn = QtWidgets.QPushButton(self.btn_box) 158 | self.cancel_btn.setObjectName("cancel_btn") 159 | self.horizontalLayout.addWidget(self.cancel_btn) 160 | self.verticalLayout_3.addWidget(self.btn_box) 161 | 162 | self.retranslateUi(EditTemplate) 163 | self.head_max_box.setCurrentIndex(5) 164 | QtCore.QMetaObject.connectSlotsByName(EditTemplate) 165 | 166 | def retranslateUi(self, EditTemplate): 167 | self.groupBox.setTitle(QtWidgets.QApplication.translate("EditTemplate", "Title - Authors", None, -1)) 168 | self.groupBox_2.setTitle(QtWidgets.QApplication.translate("EditTemplate", "Highlight", None, -1)) 169 | self.split_chapters_chk.setText(QtWidgets.QApplication.translate("EditTemplate", "Split Chapters", None, -1)) 170 | self.label.setText(QtWidgets.QApplication.translate("EditTemplate", "using", None, -1)) 171 | self.head_min_box.setItemText(0, QtWidgets.QApplication.translate("EditTemplate", "Heading L1", None, -1)) 172 | self.head_min_box.setItemText(1, QtWidgets.QApplication.translate("EditTemplate", "Heading L2", None, -1)) 173 | self.head_min_box.setItemText(2, QtWidgets.QApplication.translate("EditTemplate", "Heading L3", None, -1)) 174 | self.head_min_box.setItemText(3, QtWidgets.QApplication.translate("EditTemplate", "Heading L4", None, -1)) 175 | self.head_min_box.setItemText(4, QtWidgets.QApplication.translate("EditTemplate", "Heading L5", None, -1)) 176 | self.head_min_box.setItemText(5, QtWidgets.QApplication.translate("EditTemplate", "Heading L6", None, -1)) 177 | self.label_2.setText(QtWidgets.QApplication.translate("EditTemplate", "to", None, -1)) 178 | self.head_max_box.setItemText(0, QtWidgets.QApplication.translate("EditTemplate", "Heading L1", None, -1)) 179 | self.head_max_box.setItemText(1, QtWidgets.QApplication.translate("EditTemplate", "Heading L2", None, -1)) 180 | self.head_max_box.setItemText(2, QtWidgets.QApplication.translate("EditTemplate", "Heading L3", None, -1)) 181 | self.head_max_box.setItemText(3, QtWidgets.QApplication.translate("EditTemplate", "Heading L4", None, -1)) 182 | self.head_max_box.setItemText(4, QtWidgets.QApplication.translate("EditTemplate", "Heading L5", None, -1)) 183 | self.head_max_box.setItemText(5, QtWidgets.QApplication.translate("EditTemplate", "Heading L6", None, -1)) 184 | self.default_btn.setText(QtWidgets.QApplication.translate("EditTemplate", "Default", None, -1)) 185 | self.ok_btn.setToolTip(QtWidgets.QApplication.translate("EditTemplate", "Check online for an updated version", None, -1)) 186 | self.ok_btn.setText(QtWidgets.QApplication.translate("EditTemplate", "OK", None, -1)) 187 | self.cancel_btn.setText(QtWidgets.QApplication.translate("EditTemplate", "Cancel", None, -1)) 188 | 189 | import images_rc 190 | -------------------------------------------------------------------------------- /gui_prefs.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'D:\Apps\DEV\PROJECTS\KoHighlights\gui_prefs.ui', 4 | # licensing of 'D:\Apps\DEV\PROJECTS\KoHighlights\gui_prefs.ui' applies. 5 | # 6 | # Created: Mon Nov 4 00:35:07 2024 7 | # by: pyside2-uic running on PySide2 5.13.2 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_Prefs(object): 14 | def setupUi(self, Prefs): 15 | Prefs.setObjectName("Prefs") 16 | Prefs.resize(232, 373) 17 | Prefs.setToolTip("") 18 | Prefs.setLocale(QtCore.QLocale(QtCore.QLocale.English, QtCore.QLocale.UnitedStates)) 19 | self.verticalLayout_2 = QtWidgets.QVBoxLayout(Prefs) 20 | self.verticalLayout_2.setObjectName("verticalLayout_2") 21 | self.gridLayout = QtWidgets.QGridLayout() 22 | self.gridLayout.setObjectName("gridLayout") 23 | self.label = QtWidgets.QLabel(Prefs) 24 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Preferred) 25 | sizePolicy.setHorizontalStretch(0) 26 | sizePolicy.setVerticalStretch(0) 27 | sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth()) 28 | self.label.setSizePolicy(sizePolicy) 29 | self.label.setObjectName("label") 30 | self.gridLayout.addWidget(self.label, 0, 0, 1, 1) 31 | self.frame = QtWidgets.QFrame(Prefs) 32 | self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) 33 | self.frame.setFrameShadow(QtWidgets.QFrame.Raised) 34 | self.frame.setObjectName("frame") 35 | self.horizontalLayout = QtWidgets.QHBoxLayout(self.frame) 36 | self.horizontalLayout.setContentsMargins(0, 0, 0, 0) 37 | self.horizontalLayout.setObjectName("horizontalLayout") 38 | self.theme_box = QtWidgets.QComboBox(self.frame) 39 | self.theme_box.setObjectName("theme_box") 40 | self.theme_box.addItem("") 41 | self.theme_box.addItem("") 42 | self.theme_box.addItem("") 43 | self.theme_box.addItem("") 44 | self.theme_box.addItem("") 45 | self.theme_box.addItem("") 46 | self.horizontalLayout.addWidget(self.theme_box) 47 | spacerItem = QtWidgets.QSpacerItem(9, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 48 | self.horizontalLayout.addItem(spacerItem) 49 | self.gridLayout.addWidget(self.frame, 0, 1, 1, 1) 50 | self.alt_title_sort_chk = QtWidgets.QCheckBox(Prefs) 51 | self.alt_title_sort_chk.setObjectName("alt_title_sort_chk") 52 | self.gridLayout.addWidget(self.alt_title_sort_chk, 1, 0, 1, 2) 53 | self.verticalLayout_2.addLayout(self.gridLayout) 54 | self.frame_4 = QtWidgets.QFrame(Prefs) 55 | self.frame_4.setFrameShape(QtWidgets.QFrame.HLine) 56 | self.frame_4.setFrameShadow(QtWidgets.QFrame.Raised) 57 | self.frame_4.setObjectName("frame_4") 58 | self.verticalLayout_2.addWidget(self.frame_4) 59 | self.groupBox = QtWidgets.QGroupBox(Prefs) 60 | self.groupBox.setObjectName("groupBox") 61 | self.verticalLayout = QtWidgets.QVBoxLayout(self.groupBox) 62 | self.verticalLayout.setContentsMargins(0, 0, 0, 0) 63 | self.verticalLayout.setObjectName("verticalLayout") 64 | self.show_page_chk = QtWidgets.QCheckBox(self.groupBox) 65 | self.show_page_chk.setCheckable(True) 66 | self.show_page_chk.setChecked(True) 67 | self.show_page_chk.setObjectName("show_page_chk") 68 | self.verticalLayout.addWidget(self.show_page_chk) 69 | self.show_date_chk = QtWidgets.QCheckBox(self.groupBox) 70 | self.show_date_chk.setChecked(True) 71 | self.show_date_chk.setObjectName("show_date_chk") 72 | self.verticalLayout.addWidget(self.show_date_chk) 73 | self.show_high_chk = QtWidgets.QCheckBox(self.groupBox) 74 | self.show_high_chk.setChecked(True) 75 | self.show_high_chk.setObjectName("show_high_chk") 76 | self.verticalLayout.addWidget(self.show_high_chk) 77 | self.show_chap_chk = QtWidgets.QCheckBox(self.groupBox) 78 | self.show_chap_chk.setChecked(True) 79 | self.show_chap_chk.setObjectName("show_chap_chk") 80 | self.verticalLayout.addWidget(self.show_chap_chk) 81 | self.show_comm_chk = QtWidgets.QCheckBox(self.groupBox) 82 | self.show_comm_chk.setChecked(True) 83 | self.show_comm_chk.setObjectName("show_comm_chk") 84 | self.verticalLayout.addWidget(self.show_comm_chk) 85 | self.show_ref_pg_chk = QtWidgets.QCheckBox(self.groupBox) 86 | self.show_ref_pg_chk.setChecked(True) 87 | self.show_ref_pg_chk.setObjectName("show_ref_pg_chk") 88 | self.verticalLayout.addWidget(self.show_ref_pg_chk) 89 | self.custom_date_btn = QtWidgets.QToolButton(self.groupBox) 90 | icon = QtGui.QIcon() 91 | icon.addPixmap(QtGui.QPixmap(":/stuff/calendar.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 92 | self.custom_date_btn.setIcon(icon) 93 | self.custom_date_btn.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) 94 | self.custom_date_btn.setObjectName("custom_date_btn") 95 | self.verticalLayout.addWidget(self.custom_date_btn) 96 | self.frame_6 = QtWidgets.QFrame(self.groupBox) 97 | self.frame_6.setFrameShape(QtWidgets.QFrame.StyledPanel) 98 | self.frame_6.setFrameShadow(QtWidgets.QFrame.Raised) 99 | self.frame_6.setObjectName("frame_6") 100 | self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.frame_6) 101 | self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0) 102 | self.horizontalLayout_3.setObjectName("horizontalLayout_3") 103 | self.custom_template_chk = QtWidgets.QCheckBox(self.frame_6) 104 | self.custom_template_chk.setObjectName("custom_template_chk") 105 | self.horizontalLayout_3.addWidget(self.custom_template_chk) 106 | self.custom_template_btn = QtWidgets.QToolButton(self.frame_6) 107 | self.custom_template_btn.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) 108 | icon1 = QtGui.QIcon() 109 | icon1.addPixmap(QtGui.QPixmap(":/stuff/file_edit.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 110 | self.custom_template_btn.setIcon(icon1) 111 | self.custom_template_btn.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) 112 | self.custom_template_btn.setObjectName("custom_template_btn") 113 | self.horizontalLayout_3.addWidget(self.custom_template_btn) 114 | self.verticalLayout.addWidget(self.frame_6) 115 | self.frame_3 = QtWidgets.QFrame(self.groupBox) 116 | self.frame_3.setFrameShape(QtWidgets.QFrame.StyledPanel) 117 | self.frame_3.setFrameShadow(QtWidgets.QFrame.Raised) 118 | self.frame_3.setObjectName("frame_3") 119 | self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.frame_3) 120 | self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0) 121 | self.horizontalLayout_4.setObjectName("horizontalLayout_4") 122 | self.sort_box = QtWidgets.QComboBox(self.frame_3) 123 | self.sort_box.setObjectName("sort_box") 124 | self.sort_box.addItem("") 125 | self.sort_box.addItem("") 126 | self.horizontalLayout_4.addWidget(self.sort_box) 127 | spacerItem1 = QtWidgets.QSpacerItem(76, 9, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 128 | self.horizontalLayout_4.addItem(spacerItem1) 129 | self.verticalLayout.addWidget(self.frame_3) 130 | self.verticalLayout_2.addWidget(self.groupBox) 131 | spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 132 | self.verticalLayout_2.addItem(spacerItem2) 133 | self.frame_5 = QtWidgets.QFrame(Prefs) 134 | self.frame_5.setFrameShape(QtWidgets.QFrame.HLine) 135 | self.frame_5.setFrameShadow(QtWidgets.QFrame.Raised) 136 | self.frame_5.setObjectName("frame_5") 137 | self.verticalLayout_2.addWidget(self.frame_5) 138 | self.frame_2 = QtWidgets.QFrame(Prefs) 139 | self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel) 140 | self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised) 141 | self.frame_2.setObjectName("frame_2") 142 | self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.frame_2) 143 | self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) 144 | self.horizontalLayout_2.setObjectName("horizontalLayout_2") 145 | spacerItem3 = QtWidgets.QSpacerItem(79, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 146 | self.horizontalLayout_2.addItem(spacerItem3) 147 | self.close_btn = QtWidgets.QPushButton(self.frame_2) 148 | self.close_btn.setObjectName("close_btn") 149 | self.horizontalLayout_2.addWidget(self.close_btn) 150 | spacerItem4 = QtWidgets.QSpacerItem(79, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 151 | self.horizontalLayout_2.addItem(spacerItem4) 152 | self.verticalLayout_2.addWidget(self.frame_2) 153 | 154 | self.retranslateUi(Prefs) 155 | QtCore.QObject.connect(self.close_btn, QtCore.SIGNAL("clicked()"), Prefs.close) 156 | QtCore.QMetaObject.connectSlotsByName(Prefs) 157 | 158 | def retranslateUi(self, Prefs): 159 | Prefs.setWindowTitle(QtWidgets.QApplication.translate("Prefs", "Preferences", None, -1)) 160 | self.label.setToolTip(QtWidgets.QApplication.translate("Prefs", "Change the application\'s appearance", None, -1)) 161 | self.label.setText(QtWidgets.QApplication.translate("Prefs", "Appearance", None, -1)) 162 | self.theme_box.setToolTip(QtWidgets.QApplication.translate("Prefs", "Change the application\'s appearance", None, -1)) 163 | self.theme_box.setItemText(0, QtWidgets.QApplication.translate("Prefs", "No theme - Old icons", None, -1)) 164 | self.theme_box.setItemText(1, QtWidgets.QApplication.translate("Prefs", "No theme - New icons", None, -1)) 165 | self.theme_box.setItemText(2, QtWidgets.QApplication.translate("Prefs", "Dark theme - Old icons", None, -1)) 166 | self.theme_box.setItemText(3, QtWidgets.QApplication.translate("Prefs", "Dark theme - New icons", None, -1)) 167 | self.theme_box.setItemText(4, QtWidgets.QApplication.translate("Prefs", "Light theme - Old icons", None, -1)) 168 | self.theme_box.setItemText(5, QtWidgets.QApplication.translate("Prefs", "Light theme - New icons", None, -1)) 169 | self.alt_title_sort_chk.setToolTip(QtWidgets.QApplication.translate("Prefs", "Ignore the english articles \"A\" and \"The\" when sorting by Title", None, -1)) 170 | self.alt_title_sort_chk.setText(QtWidgets.QApplication.translate("Prefs", "Ignore english articles", None, -1)) 171 | self.groupBox.setTitle(QtWidgets.QApplication.translate("Prefs", "Highlight Options", None, -1)) 172 | self.show_page_chk.setToolTip(QtWidgets.QApplication.translate("Prefs", "Show the highlight\'s page number", None, -1)) 173 | self.show_page_chk.setText(QtWidgets.QApplication.translate("Prefs", "Show page", None, -1)) 174 | self.show_date_chk.setToolTip(QtWidgets.QApplication.translate("Prefs", "Show the highlight\'s date", None, -1)) 175 | self.show_date_chk.setText(QtWidgets.QApplication.translate("Prefs", "Show date", None, -1)) 176 | self.show_high_chk.setToolTip(QtWidgets.QApplication.translate("Prefs", "Show the highlight\'s text", None, -1)) 177 | self.show_high_chk.setText(QtWidgets.QApplication.translate("Prefs", "Show highlight", None, -1)) 178 | self.show_chap_chk.setToolTip(QtWidgets.QApplication.translate("Prefs", "Show the highlight\'s chapter", None, -1)) 179 | self.show_chap_chk.setText(QtWidgets.QApplication.translate("Prefs", "Show chapter", None, -1)) 180 | self.show_comm_chk.setToolTip(QtWidgets.QApplication.translate("Prefs", "Show the highlight\'s comment", None, -1)) 181 | self.show_comm_chk.setText(QtWidgets.QApplication.translate("Prefs", "Show comment", None, -1)) 182 | self.show_ref_pg_chk.setToolTip(QtWidgets.QApplication.translate("Prefs", "Prefer reference page numbers if exists", None, -1)) 183 | self.show_ref_pg_chk.setText(QtWidgets.QApplication.translate("Prefs", "Use Reference page numbers", None, -1)) 184 | self.custom_date_btn.setToolTip(QtWidgets.QApplication.translate("Prefs", "Change the way date is displayed", None, -1)) 185 | self.custom_date_btn.setText(QtWidgets.QApplication.translate("Prefs", "Custom Date format", None, -1)) 186 | self.custom_template_chk.setToolTip(QtWidgets.QApplication.translate("Prefs", "Use a custom template for Markdown export", None, -1)) 187 | self.custom_template_chk.setText(QtWidgets.QApplication.translate("Prefs", "Custom Markdown", None, -1)) 188 | self.custom_template_btn.setToolTip(QtWidgets.QApplication.translate("Prefs", "Edit the Markdown export template", None, -1)) 189 | self.custom_template_btn.setText(QtWidgets.QApplication.translate("Prefs", "Edit", None, -1)) 190 | self.sort_box.setToolTip(QtWidgets.QApplication.translate("Prefs", "Change the sorting method of the highlights", None, -1)) 191 | self.sort_box.setItemText(0, QtWidgets.QApplication.translate("Prefs", "Sort Highlights by Date", None, -1)) 192 | self.sort_box.setItemText(1, QtWidgets.QApplication.translate("Prefs", "Sort Highlights by Page", None, -1)) 193 | self.close_btn.setText(QtWidgets.QApplication.translate("Prefs", "Close", None, -1)) 194 | 195 | import images_rc 196 | -------------------------------------------------------------------------------- /gui_sync_group.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | SyncGroup 4 | 5 | 6 | 7 | 0 8 | 0 9 | 672 10 | 50 11 | 12 | 13 | 14 | 15 | 0 16 | 17 | 18 | 0 19 | 20 | 21 | 22 | 23 | 24 | 0 25 | 26 | 27 | 0 28 | 29 | 30 | 0 31 | 32 | 33 | 1 34 | 35 | 36 | 0 37 | 38 | 39 | 40 | 41 | Qt::Vertical 42 | 43 | 44 | 45 | 20 46 | 30 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | Enable or disable this Sync Group 55 | 56 | 57 | Enable or disable this Sync Group 58 | 59 | 60 | 61 | 62 | 63 | 64 | :/stuff/power32gray.png 65 | :/stuff/power32red.png:/stuff/power32gray.png 66 | 67 | 68 | 69 | 16 70 | 16 71 | 72 | 73 | 74 | true 75 | 76 | 77 | true 78 | 79 | 80 | true 81 | 82 | 83 | 84 | 85 | 86 | 87 | Qt::Vertical 88 | 89 | 90 | 91 | 20 92 | 28 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | Qt::CustomContextMenu 104 | 105 | 106 | QFrame::Box 107 | 108 | 109 | QFrame::Plain 110 | 111 | 112 | 1 113 | 114 | 115 | 116 | 0 117 | 118 | 119 | 0 120 | 121 | 122 | 123 | 124 | 125 | 0 126 | 0 127 | 128 | 129 | 130 | QFrame::StyledPanel 131 | 132 | 133 | QFrame::Raised 134 | 135 | 136 | 137 | 0 138 | 139 | 140 | 141 | 142 | Reload the Group and check the paths for errors 143 | 144 | 145 | Reload the Group and check the paths for errors 146 | 147 | 148 | 149 | 150 | 151 | 152 | :/stuff/refresh16.png:/stuff/refresh16.png 153 | 154 | 155 | 156 | 16 157 | 16 158 | 159 | 160 | 161 | false 162 | 163 | 164 | true 165 | 166 | 167 | 168 | 169 | 170 | 171 | Qt::Horizontal 172 | 173 | 174 | 175 | 40 176 | 20 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | true 185 | 186 | 187 | 188 | 189 | 190 | Qt::AlignCenter 191 | 192 | 193 | 194 | 195 | 196 | 197 | Qt::Horizontal 198 | 199 | 200 | 201 | 161 202 | 20 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | Start the sync/merge process for this group 211 | 212 | 213 | Start the sync/merge process for this group 214 | 215 | 216 | Sync this group 217 | 218 | 219 | 220 | :/stuff/sync.png:/stuff/sync.png 221 | 222 | 223 | false 224 | 225 | 226 | Qt::ToolButtonTextBesideIcon 227 | 228 | 229 | true 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 0 241 | 0 242 | 243 | 244 | 245 | QFrame::StyledPanel 246 | 247 | 248 | QFrame::Raised 249 | 250 | 251 | 252 | 4 253 | 254 | 255 | 0 256 | 257 | 258 | 2 259 | 260 | 261 | 0 262 | 263 | 264 | 265 | 266 | Sync the current position and read percent of the books 267 | 268 | 269 | Sync the current position and read percent of the books 270 | 271 | 272 | Sync position 273 | 274 | 275 | 276 | 277 | 278 | 279 | Merge the highlights from both books\n(and/or the archived version) 280 | 281 | 282 | Merge the highlights from both books\\n(and/or the archived version) 283 | 284 | 285 | Merge Highlights 286 | 287 | 288 | 289 | 290 | 291 | 292 | Keep a synced version of the book in the archived database 293 | 294 | 295 | Keep a synced version of the book in the archived database 296 | 297 | 298 | Sync with archived 299 | 300 | 301 | 302 | 303 | 304 | 305 | Qt::Horizontal 306 | 307 | 308 | 309 | 40 310 | 20 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | QToolButton{border:none;} 319 | 320 | 321 | Hide sync paths 322 | 323 | 324 | true 325 | 326 | 327 | Qt::ToolButtonTextBesideIcon 328 | 329 | 330 | Qt::DownArrow 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 0 342 | 0 343 | 344 | 345 | 346 | QFrame::StyledPanel 347 | 348 | 349 | QFrame::Raised 350 | 351 | 352 | 353 | 0 354 | 355 | 356 | 0 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | power_btn 372 | toggled(bool) 373 | group_frm 374 | setEnabled(bool) 375 | 376 | 377 | 22 378 | 21 379 | 380 | 381 | 81 382 | 83 383 | 384 | 385 | 386 | 387 | 388 | -------------------------------------------------------------------------------- /gui_prefs.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Prefs 4 | 5 | 6 | 7 | 0 8 | 0 9 | 232 10 | 373 11 | 12 | 13 | 14 | Preferences 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 0 30 | 0 31 | 32 | 33 | 34 | Change the application's appearance 35 | 36 | 37 | Appearance 38 | 39 | 40 | 41 | 42 | 43 | 44 | QFrame::StyledPanel 45 | 46 | 47 | QFrame::Raised 48 | 49 | 50 | 51 | 0 52 | 53 | 54 | 55 | 56 | Change the application's appearance 57 | 58 | 59 | 60 | No theme - Old icons 61 | 62 | 63 | 64 | 65 | No theme - New icons 66 | 67 | 68 | 69 | 70 | Dark theme - Old icons 71 | 72 | 73 | 74 | 75 | Dark theme - New icons 76 | 77 | 78 | 79 | 80 | Light theme - Old icons 81 | 82 | 83 | 84 | 85 | Light theme - New icons 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | Qt::Horizontal 94 | 95 | 96 | 97 | 9 98 | 20 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | Ignore the english articles "A" and "The" when sorting by Title 110 | 111 | 112 | Ignore english articles 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | QFrame::HLine 122 | 123 | 124 | QFrame::Raised 125 | 126 | 127 | 128 | 129 | 130 | 131 | Highlight Options 132 | 133 | 134 | 135 | 0 136 | 137 | 138 | 139 | 140 | Show the highlight's page number 141 | 142 | 143 | Show page 144 | 145 | 146 | true 147 | 148 | 149 | true 150 | 151 | 152 | 153 | 154 | 155 | 156 | Show the highlight's date 157 | 158 | 159 | Show date 160 | 161 | 162 | true 163 | 164 | 165 | 166 | 167 | 168 | 169 | Show the highlight's text 170 | 171 | 172 | Show highlight 173 | 174 | 175 | true 176 | 177 | 178 | 179 | 180 | 181 | 182 | Show the highlight's chapter 183 | 184 | 185 | Show chapter 186 | 187 | 188 | true 189 | 190 | 191 | 192 | 193 | 194 | 195 | Show the highlight's comment 196 | 197 | 198 | Show comment 199 | 200 | 201 | true 202 | 203 | 204 | 205 | 206 | 207 | 208 | Prefer reference page numbers if exists 209 | 210 | 211 | Use Reference page numbers 212 | 213 | 214 | true 215 | 216 | 217 | 218 | 219 | 220 | 221 | Change the way date is displayed 222 | 223 | 224 | Custom Date format 225 | 226 | 227 | 228 | :/stuff/calendar.png:/stuff/calendar.png 229 | 230 | 231 | Qt::ToolButtonTextBesideIcon 232 | 233 | 234 | 235 | 236 | 237 | 238 | QFrame::StyledPanel 239 | 240 | 241 | QFrame::Raised 242 | 243 | 244 | 245 | 0 246 | 247 | 248 | 249 | 250 | Use a custom template for Markdown export 251 | 252 | 253 | Custom Markdown 254 | 255 | 256 | 257 | 258 | 259 | 260 | Qt::CustomContextMenu 261 | 262 | 263 | Edit the Markdown export template 264 | 265 | 266 | Edit 267 | 268 | 269 | 270 | :/stuff/file_edit.png:/stuff/file_edit.png 271 | 272 | 273 | Qt::ToolButtonTextBesideIcon 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | QFrame::StyledPanel 284 | 285 | 286 | QFrame::Raised 287 | 288 | 289 | 290 | 0 291 | 292 | 293 | 294 | 295 | Change the sorting method of the highlights 296 | 297 | 298 | 299 | Sort Highlights by Date 300 | 301 | 302 | 303 | 304 | Sort Highlights by Page 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | Qt::Horizontal 313 | 314 | 315 | 316 | 76 317 | 9 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | Qt::Vertical 332 | 333 | 334 | 335 | 20 336 | 40 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | QFrame::HLine 345 | 346 | 347 | QFrame::Raised 348 | 349 | 350 | 351 | 352 | 353 | 354 | QFrame::StyledPanel 355 | 356 | 357 | QFrame::Raised 358 | 359 | 360 | 361 | 0 362 | 363 | 364 | 365 | 366 | Qt::Horizontal 367 | 368 | 369 | 370 | 79 371 | 20 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | Close 380 | 381 | 382 | 383 | 384 | 385 | 386 | Qt::Horizontal 387 | 388 | 389 | 390 | 79 391 | 20 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | close_btn 403 | 404 | 405 | 406 | 407 | 408 | 409 | close_btn 410 | clicked() 411 | Prefs 412 | close() 413 | 414 | 415 | 156 416 | 169 417 | 418 | 419 | 239 420 | 179 421 | 422 | 423 | 424 | 425 | 426 | -------------------------------------------------------------------------------- /gui_main.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'D:\Apps\DEV\PROJECTS\KoHighlights\gui_main.ui', 4 | # licensing of 'D:\Apps\DEV\PROJECTS\KoHighlights\gui_main.ui' applies. 5 | # 6 | # Created: Mon Nov 4 00:35:07 2024 7 | # by: pyside2-uic running on PySide2 5.13.2 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_Base(object): 14 | def setupUi(self, Base): 15 | Base.setObjectName("Base") 16 | Base.resize(640, 512) 17 | icon = QtGui.QIcon() 18 | icon.addPixmap(QtGui.QPixmap(":/stuff/logo64.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 19 | Base.setWindowIcon(icon) 20 | Base.setLocale(QtCore.QLocale(QtCore.QLocale.English, QtCore.QLocale.UnitedStates)) 21 | Base.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly) 22 | self.centralwidget = QtWidgets.QWidget(Base) 23 | self.centralwidget.setObjectName("centralwidget") 24 | self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.centralwidget) 25 | self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) 26 | self.verticalLayout_2.setObjectName("verticalLayout_2") 27 | self.views = QtWidgets.QStackedWidget(self.centralwidget) 28 | self.views.setObjectName("views") 29 | self.books_pg = QtWidgets.QWidget() 30 | self.books_pg.setObjectName("books_pg") 31 | self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.books_pg) 32 | self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) 33 | self.verticalLayout_3.setObjectName("verticalLayout_3") 34 | self.splitter = QtWidgets.QSplitter(self.books_pg) 35 | self.splitter.setOrientation(QtCore.Qt.Horizontal) 36 | self.splitter.setObjectName("splitter") 37 | self.file_table = DropTableWidget(self.splitter) 38 | self.file_table.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) 39 | self.file_table.setAcceptDrops(True) 40 | self.file_table.setFrameShape(QtWidgets.QFrame.WinPanel) 41 | self.file_table.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) 42 | self.file_table.setDragDropMode(QtWidgets.QAbstractItemView.DropOnly) 43 | self.file_table.setDefaultDropAction(QtCore.Qt.CopyAction) 44 | self.file_table.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) 45 | self.file_table.setHorizontalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel) 46 | self.file_table.setWordWrap(False) 47 | self.file_table.setCornerButtonEnabled(False) 48 | self.file_table.setColumnCount(8) 49 | self.file_table.setObjectName("file_table") 50 | self.file_table.setColumnCount(8) 51 | self.file_table.setRowCount(0) 52 | item = QtWidgets.QTableWidgetItem() 53 | self.file_table.setHorizontalHeaderItem(0, item) 54 | item = QtWidgets.QTableWidgetItem() 55 | self.file_table.setHorizontalHeaderItem(1, item) 56 | item = QtWidgets.QTableWidgetItem() 57 | self.file_table.setHorizontalHeaderItem(2, item) 58 | item = QtWidgets.QTableWidgetItem() 59 | self.file_table.setHorizontalHeaderItem(3, item) 60 | item = QtWidgets.QTableWidgetItem() 61 | self.file_table.setHorizontalHeaderItem(4, item) 62 | item = QtWidgets.QTableWidgetItem() 63 | self.file_table.setHorizontalHeaderItem(5, item) 64 | item = QtWidgets.QTableWidgetItem() 65 | self.file_table.setHorizontalHeaderItem(6, item) 66 | item = QtWidgets.QTableWidgetItem() 67 | self.file_table.setHorizontalHeaderItem(7, item) 68 | self.file_table.horizontalHeader().setDefaultSectionSize(22) 69 | self.file_table.horizontalHeader().setHighlightSections(False) 70 | self.file_table.horizontalHeader().setMinimumSectionSize(22) 71 | self.file_table.horizontalHeader().setSortIndicatorShown(True) 72 | self.file_table.verticalHeader().setDefaultSectionSize(22) 73 | self.file_table.verticalHeader().setHighlightSections(True) 74 | self.file_table.verticalHeader().setMinimumSectionSize(22) 75 | self.frame = QtWidgets.QFrame(self.splitter) 76 | self.frame.setFrameShape(QtWidgets.QFrame.WinPanel) 77 | self.frame.setFrameShadow(QtWidgets.QFrame.Sunken) 78 | self.frame.setObjectName("frame") 79 | self.verticalLayout = QtWidgets.QVBoxLayout(self.frame) 80 | self.verticalLayout.setSpacing(3) 81 | self.verticalLayout.setContentsMargins(0, 0, 0, 0) 82 | self.verticalLayout.setObjectName("verticalLayout") 83 | self.header = QtWidgets.QWidget(self.frame) 84 | self.header.setObjectName("header") 85 | self.horizontalLayout = QtWidgets.QHBoxLayout(self.header) 86 | self.horizontalLayout.setContentsMargins(0, 0, -1, 0) 87 | self.horizontalLayout.setObjectName("horizontalLayout") 88 | self.fold_btn = QtWidgets.QToolButton(self.header) 89 | self.fold_btn.setStyleSheet("QToolButton{border:none;}") 90 | self.fold_btn.setCheckable(True) 91 | self.fold_btn.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) 92 | self.fold_btn.setArrowType(QtCore.Qt.DownArrow) 93 | self.fold_btn.setObjectName("fold_btn") 94 | self.horizontalLayout.addWidget(self.fold_btn) 95 | self.frame_2 = QtWidgets.QFrame(self.header) 96 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) 97 | sizePolicy.setHorizontalStretch(0) 98 | sizePolicy.setVerticalStretch(0) 99 | sizePolicy.setHeightForWidth(self.frame_2.sizePolicy().hasHeightForWidth()) 100 | self.frame_2.setSizePolicy(sizePolicy) 101 | self.frame_2.setFrameShape(QtWidgets.QFrame.HLine) 102 | self.frame_2.setFrameShadow(QtWidgets.QFrame.Sunken) 103 | self.frame_2.setLineWidth(1) 104 | self.frame_2.setObjectName("frame_2") 105 | self.horizontalLayout.addWidget(self.frame_2) 106 | self.verticalLayout.addWidget(self.header) 107 | self.book_info = QtWidgets.QFrame(self.frame) 108 | self.book_info.setFrameShape(QtWidgets.QFrame.StyledPanel) 109 | self.book_info.setFrameShadow(QtWidgets.QFrame.Raised) 110 | self.book_info.setObjectName("book_info") 111 | self.gridLayout = QtWidgets.QGridLayout(self.book_info) 112 | self.gridLayout.setContentsMargins(6, 0, 6, 0) 113 | self.gridLayout.setObjectName("gridLayout") 114 | self.pages_txt = QtWidgets.QLineEdit(self.book_info) 115 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) 116 | sizePolicy.setHorizontalStretch(0) 117 | sizePolicy.setVerticalStretch(0) 118 | sizePolicy.setHeightForWidth(self.pages_txt.sizePolicy().hasHeightForWidth()) 119 | self.pages_txt.setSizePolicy(sizePolicy) 120 | self.pages_txt.setMaximumSize(QtCore.QSize(40, 16777215)) 121 | self.pages_txt.setReadOnly(True) 122 | self.pages_txt.setObjectName("pages_txt") 123 | self.gridLayout.addWidget(self.pages_txt, 4, 3, 1, 1) 124 | self.lang_lbl = QtWidgets.QLabel(self.book_info) 125 | self.lang_lbl.setObjectName("lang_lbl") 126 | self.gridLayout.addWidget(self.lang_lbl, 4, 0, 1, 1) 127 | self.title_lbl = QtWidgets.QLabel(self.book_info) 128 | self.title_lbl.setObjectName("title_lbl") 129 | self.gridLayout.addWidget(self.title_lbl, 0, 0, 1, 1) 130 | self.series_lbl = QtWidgets.QLabel(self.book_info) 131 | self.series_lbl.setObjectName("series_lbl") 132 | self.gridLayout.addWidget(self.series_lbl, 2, 0, 1, 1) 133 | self.author_txt = QtWidgets.QLineEdit(self.book_info) 134 | self.author_txt.setReadOnly(True) 135 | self.author_txt.setObjectName("author_txt") 136 | self.gridLayout.addWidget(self.author_txt, 1, 1, 1, 6) 137 | self.author_lbl = QtWidgets.QLabel(self.book_info) 138 | self.author_lbl.setObjectName("author_lbl") 139 | self.gridLayout.addWidget(self.author_lbl, 1, 0, 1, 1) 140 | self.description_btn = QtWidgets.QToolButton(self.book_info) 141 | icon1 = QtGui.QIcon() 142 | icon1.addPixmap(QtGui.QPixmap(":/stuff/description.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 143 | self.description_btn.setIcon(icon1) 144 | self.description_btn.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) 145 | self.description_btn.setObjectName("description_btn") 146 | self.gridLayout.addWidget(self.description_btn, 4, 6, 1, 1) 147 | self.pages_lbl = QtWidgets.QLabel(self.book_info) 148 | self.pages_lbl.setObjectName("pages_lbl") 149 | self.gridLayout.addWidget(self.pages_lbl, 4, 2, 1, 1) 150 | self.lang_txt = QtWidgets.QLineEdit(self.book_info) 151 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) 152 | sizePolicy.setHorizontalStretch(0) 153 | sizePolicy.setVerticalStretch(0) 154 | sizePolicy.setHeightForWidth(self.lang_txt.sizePolicy().hasHeightForWidth()) 155 | self.lang_txt.setSizePolicy(sizePolicy) 156 | self.lang_txt.setMaximumSize(QtCore.QSize(25, 16777215)) 157 | self.lang_txt.setReadOnly(True) 158 | self.lang_txt.setObjectName("lang_txt") 159 | self.gridLayout.addWidget(self.lang_txt, 4, 1, 1, 1) 160 | self.tags_lbl = QtWidgets.QLabel(self.book_info) 161 | self.tags_lbl.setObjectName("tags_lbl") 162 | self.gridLayout.addWidget(self.tags_lbl, 3, 0, 1, 1) 163 | self.tags_txt = QtWidgets.QLineEdit(self.book_info) 164 | self.tags_txt.setReadOnly(True) 165 | self.tags_txt.setObjectName("tags_txt") 166 | self.gridLayout.addWidget(self.tags_txt, 3, 1, 1, 6) 167 | self.series_txt = QtWidgets.QLineEdit(self.book_info) 168 | self.series_txt.setReadOnly(True) 169 | self.series_txt.setObjectName("series_txt") 170 | self.gridLayout.addWidget(self.series_txt, 2, 1, 1, 6) 171 | self.review_txt = QtWidgets.QLabel(self.book_info) 172 | self.review_txt.setFrameShape(QtWidgets.QFrame.NoFrame) 173 | self.review_txt.setText("") 174 | self.review_txt.setWordWrap(True) 175 | self.review_txt.setObjectName("review_txt") 176 | self.gridLayout.addWidget(self.review_txt, 5, 1, 1, 6) 177 | self.title_txt = QtWidgets.QLineEdit(self.book_info) 178 | self.title_txt.setReadOnly(True) 179 | self.title_txt.setObjectName("title_txt") 180 | self.gridLayout.addWidget(self.title_txt, 0, 1, 1, 6) 181 | self.review_lbl = QtWidgets.QLabel(self.book_info) 182 | self.review_lbl.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) 183 | self.review_lbl.setObjectName("review_lbl") 184 | self.gridLayout.addWidget(self.review_lbl, 5, 0, 1, 1) 185 | self.custom_btn = QtWidgets.QToolButton(self.book_info) 186 | self.custom_btn.setEnabled(False) 187 | self.custom_btn.setText("") 188 | icon2 = QtGui.QIcon() 189 | icon2.addPixmap(QtGui.QPixmap(":/stuff/file_edit.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 190 | self.custom_btn.setIcon(icon2) 191 | self.custom_btn.setCheckable(True) 192 | self.custom_btn.setObjectName("custom_btn") 193 | self.gridLayout.addWidget(self.custom_btn, 4, 5, 1, 1) 194 | spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 195 | self.gridLayout.addItem(spacerItem, 4, 4, 1, 1) 196 | self.verticalLayout.addWidget(self.book_info) 197 | self.high_list = QtWidgets.QListWidget(self.frame) 198 | self.high_list.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) 199 | self.high_list.setFrameShape(QtWidgets.QFrame.WinPanel) 200 | self.high_list.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) 201 | self.high_list.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) 202 | self.high_list.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) 203 | self.high_list.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel) 204 | self.high_list.setWordWrap(True) 205 | self.high_list.setObjectName("high_list") 206 | self.verticalLayout.addWidget(self.high_list) 207 | self.verticalLayout_3.addWidget(self.splitter) 208 | self.views.addWidget(self.books_pg) 209 | self.highlights_pg = QtWidgets.QWidget() 210 | self.highlights_pg.setObjectName("highlights_pg") 211 | self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.highlights_pg) 212 | self.verticalLayout_4.setContentsMargins(0, 0, 0, 0) 213 | self.verticalLayout_4.setObjectName("verticalLayout_4") 214 | self.high_table = QtWidgets.QTableWidget(self.highlights_pg) 215 | self.high_table.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) 216 | self.high_table.setFrameShape(QtWidgets.QFrame.WinPanel) 217 | self.high_table.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) 218 | self.high_table.setDragDropMode(QtWidgets.QAbstractItemView.DropOnly) 219 | self.high_table.setDefaultDropAction(QtCore.Qt.CopyAction) 220 | self.high_table.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) 221 | self.high_table.setHorizontalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel) 222 | self.high_table.setWordWrap(False) 223 | self.high_table.setCornerButtonEnabled(False) 224 | self.high_table.setColumnCount(8) 225 | self.high_table.setObjectName("high_table") 226 | self.high_table.setColumnCount(8) 227 | self.high_table.setRowCount(0) 228 | item = QtWidgets.QTableWidgetItem() 229 | self.high_table.setHorizontalHeaderItem(0, item) 230 | item = QtWidgets.QTableWidgetItem() 231 | self.high_table.setHorizontalHeaderItem(1, item) 232 | item = QtWidgets.QTableWidgetItem() 233 | self.high_table.setHorizontalHeaderItem(2, item) 234 | item = QtWidgets.QTableWidgetItem() 235 | self.high_table.setHorizontalHeaderItem(3, item) 236 | item = QtWidgets.QTableWidgetItem() 237 | self.high_table.setHorizontalHeaderItem(4, item) 238 | item = QtWidgets.QTableWidgetItem() 239 | self.high_table.setHorizontalHeaderItem(5, item) 240 | item = QtWidgets.QTableWidgetItem() 241 | self.high_table.setHorizontalHeaderItem(6, item) 242 | item = QtWidgets.QTableWidgetItem() 243 | self.high_table.setHorizontalHeaderItem(7, item) 244 | self.high_table.horizontalHeader().setHighlightSections(False) 245 | self.high_table.horizontalHeader().setMinimumSectionSize(22) 246 | self.high_table.horizontalHeader().setSortIndicatorShown(True) 247 | self.high_table.horizontalHeader().setStretchLastSection(True) 248 | self.high_table.verticalHeader().setDefaultSectionSize(22) 249 | self.high_table.verticalHeader().setHighlightSections(True) 250 | self.high_table.verticalHeader().setMinimumSectionSize(22) 251 | self.verticalLayout_4.addWidget(self.high_table) 252 | self.views.addWidget(self.highlights_pg) 253 | self.sync_pg = QtWidgets.QWidget() 254 | self.sync_pg.setObjectName("sync_pg") 255 | self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.sync_pg) 256 | self.verticalLayout_5.setContentsMargins(0, 0, 0, 0) 257 | self.verticalLayout_5.setObjectName("verticalLayout_5") 258 | self.sync_table = XTableWidget(self.sync_pg) 259 | self.sync_table.setAcceptDrops(True) 260 | self.sync_table.setDragEnabled(True) 261 | self.sync_table.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove) 262 | self.sync_table.setDefaultDropAction(QtCore.Qt.MoveAction) 263 | self.sync_table.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) 264 | self.sync_table.setObjectName("sync_table") 265 | self.sync_table.setColumnCount(1) 266 | self.sync_table.setRowCount(0) 267 | item = QtWidgets.QTableWidgetItem() 268 | self.sync_table.setHorizontalHeaderItem(0, item) 269 | self.sync_table.horizontalHeader().setVisible(False) 270 | self.sync_table.horizontalHeader().setStretchLastSection(True) 271 | self.sync_table.verticalHeader().setDefaultSectionSize(90) 272 | self.sync_table.verticalHeader().setMinimumSectionSize(90) 273 | self.verticalLayout_5.addWidget(self.sync_table) 274 | self.views.addWidget(self.sync_pg) 275 | self.verticalLayout_2.addWidget(self.views) 276 | Base.setCentralWidget(self.centralwidget) 277 | self.statusbar = QtWidgets.QStatusBar(Base) 278 | self.statusbar.setStyleSheet("QStatusBar{padding-left:8px;font-weight:bold;}") 279 | self.statusbar.setObjectName("statusbar") 280 | Base.setStatusBar(self.statusbar) 281 | self.tool_bar = QtWidgets.QToolBar(Base) 282 | self.tool_bar.setWindowTitle("toolBar") 283 | self.tool_bar.setMovable(True) 284 | self.tool_bar.setAllowedAreas(QtCore.Qt.BottomToolBarArea|QtCore.Qt.TopToolBarArea) 285 | self.tool_bar.setIconSize(QtCore.QSize(32, 32)) 286 | self.tool_bar.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) 287 | self.tool_bar.setObjectName("tool_bar") 288 | Base.addToolBar(QtCore.Qt.TopToolBarArea, self.tool_bar) 289 | self.act_english = QtWidgets.QAction(Base) 290 | self.act_english.setCheckable(True) 291 | self.act_english.setChecked(False) 292 | self.act_english.setObjectName("act_english") 293 | self.act_greek = QtWidgets.QAction(Base) 294 | self.act_greek.setCheckable(True) 295 | self.act_greek.setChecked(False) 296 | self.act_greek.setObjectName("act_greek") 297 | self.act_view_book = QtWidgets.QAction(Base) 298 | icon3 = QtGui.QIcon() 299 | icon3.addPixmap(QtGui.QPixmap(":/stuff/files_view.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 300 | self.act_view_book.setIcon(icon3) 301 | self.act_view_book.setObjectName("act_view_book") 302 | 303 | self.retranslateUi(Base) 304 | self.views.setCurrentIndex(0) 305 | QtCore.QMetaObject.connectSlotsByName(Base) 306 | 307 | def retranslateUi(self, Base): 308 | self.file_table.setSortingEnabled(True) 309 | self.file_table.horizontalHeaderItem(0).setText(QtWidgets.QApplication.translate("Base", "Title", None, -1)) 310 | self.file_table.horizontalHeaderItem(1).setText(QtWidgets.QApplication.translate("Base", "Author", None, -1)) 311 | self.file_table.horizontalHeaderItem(2).setText(QtWidgets.QApplication.translate("Base", "Type", None, -1)) 312 | self.file_table.horizontalHeaderItem(3).setText(QtWidgets.QApplication.translate("Base", "Percent", None, -1)) 313 | self.file_table.horizontalHeaderItem(4).setText(QtWidgets.QApplication.translate("Base", "Rating", None, -1)) 314 | self.file_table.horizontalHeaderItem(5).setText(QtWidgets.QApplication.translate("Base", "Highlights", None, -1)) 315 | self.file_table.horizontalHeaderItem(6).setText(QtWidgets.QApplication.translate("Base", "Modified", None, -1)) 316 | self.file_table.horizontalHeaderItem(7).setText(QtWidgets.QApplication.translate("Base", "Path", None, -1)) 317 | self.fold_btn.setText(QtWidgets.QApplication.translate("Base", "Hide Book Info", None, -1)) 318 | self.lang_lbl.setText(QtWidgets.QApplication.translate("Base", "Language", None, -1)) 319 | self.title_lbl.setText(QtWidgets.QApplication.translate("Base", "Title", None, -1)) 320 | self.series_lbl.setText(QtWidgets.QApplication.translate("Base", "Series", None, -1)) 321 | self.author_lbl.setText(QtWidgets.QApplication.translate("Base", "Author", None, -1)) 322 | self.description_btn.setText(QtWidgets.QApplication.translate("Base", "Description", None, -1)) 323 | self.pages_lbl.setText(QtWidgets.QApplication.translate("Base", "Pages", None, -1)) 324 | self.tags_lbl.setText(QtWidgets.QApplication.translate("Base", "Tags", None, -1)) 325 | self.review_lbl.setText(QtWidgets.QApplication.translate("Base", "Review", None, -1)) 326 | self.custom_btn.setToolTip(QtWidgets.QApplication.translate("Base", "Show the custom properties of the book", None, -1)) 327 | self.custom_btn.setStatusTip(QtWidgets.QApplication.translate("Base", "Show the custom properties of the book", None, -1)) 328 | self.high_table.setSortingEnabled(True) 329 | self.high_table.horizontalHeaderItem(0).setText(QtWidgets.QApplication.translate("Base", "Highlight", None, -1)) 330 | self.high_table.horizontalHeaderItem(1).setText(QtWidgets.QApplication.translate("Base", "Comment", None, -1)) 331 | self.high_table.horizontalHeaderItem(2).setText(QtWidgets.QApplication.translate("Base", "Date", None, -1)) 332 | self.high_table.horizontalHeaderItem(3).setText(QtWidgets.QApplication.translate("Base", "Title", None, -1)) 333 | self.high_table.horizontalHeaderItem(4).setText(QtWidgets.QApplication.translate("Base", "Author", None, -1)) 334 | self.high_table.horizontalHeaderItem(5).setText(QtWidgets.QApplication.translate("Base", "Page", None, -1)) 335 | self.high_table.horizontalHeaderItem(6).setText(QtWidgets.QApplication.translate("Base", "Chapter", None, -1)) 336 | self.high_table.horizontalHeaderItem(7).setText(QtWidgets.QApplication.translate("Base", "Path", None, -1)) 337 | self.sync_table.horizontalHeaderItem(0).setText(QtWidgets.QApplication.translate("Base", "Sync Groups", None, -1)) 338 | self.act_english.setText(QtWidgets.QApplication.translate("Base", "English", None, -1)) 339 | self.act_greek.setText(QtWidgets.QApplication.translate("Base", "Greek", None, -1)) 340 | self.act_view_book.setText(QtWidgets.QApplication.translate("Base", "View Book", None, -1)) 341 | self.act_view_book.setShortcut(QtWidgets.QApplication.translate("Base", "Ctrl+B", None, -1)) 342 | 343 | from secondary import DropTableWidget, XTableWidget 344 | import images_rc 345 | -------------------------------------------------------------------------------- /gui_toolbar.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'D:\Apps\DEV\PROJECTS\KoHighlights\gui_toolbar.ui', 4 | # licensing of 'D:\Apps\DEV\PROJECTS\KoHighlights\gui_toolbar.ui' applies. 5 | # 6 | # Created: Fri Oct 4 21:42:42 2024 7 | # by: pyside2-uic running on PySide2 5.13.2 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_ToolBar(object): 14 | def setupUi(self, ToolBar): 15 | ToolBar.setObjectName("ToolBar") 16 | ToolBar.resize(1107, 91) 17 | ToolBar.setContextMenuPolicy(QtCore.Qt.PreventContextMenu) 18 | ToolBar.setWindowTitle("") 19 | ToolBar.setLocale(QtCore.QLocale(QtCore.QLocale.English, QtCore.QLocale.UnitedStates)) 20 | self.verticalLayout_2 = QtWidgets.QVBoxLayout(ToolBar) 21 | self.verticalLayout_2.setSpacing(0) 22 | self.verticalLayout_2.setContentsMargins(0, 0, 2, 0) 23 | self.verticalLayout_2.setObjectName("verticalLayout_2") 24 | self.tool_frame = QtWidgets.QFrame(ToolBar) 25 | self.tool_frame.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) 26 | self.tool_frame.setObjectName("tool_frame") 27 | self.horizontalLayout = QtWidgets.QHBoxLayout(self.tool_frame) 28 | self.horizontalLayout.setContentsMargins(0, 0, 0, 0) 29 | self.horizontalLayout.setObjectName("horizontalLayout") 30 | self.scan_btn = QtWidgets.QToolButton(self.tool_frame) 31 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) 32 | sizePolicy.setHorizontalStretch(0) 33 | sizePolicy.setVerticalStretch(0) 34 | sizePolicy.setHeightForWidth(self.scan_btn.sizePolicy().hasHeightForWidth()) 35 | self.scan_btn.setSizePolicy(sizePolicy) 36 | self.scan_btn.setMinimumSize(QtCore.QSize(80, 0)) 37 | icon = QtGui.QIcon() 38 | icon.addPixmap(QtGui.QPixmap(":/stuff/folder_reader.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 39 | self.scan_btn.setIcon(icon) 40 | self.scan_btn.setIconSize(QtCore.QSize(48, 48)) 41 | self.scan_btn.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) 42 | self.scan_btn.setAutoRaise(True) 43 | self.scan_btn.setObjectName("scan_btn") 44 | self.horizontalLayout.addWidget(self.scan_btn) 45 | self.export_btn = QtWidgets.QToolButton(self.tool_frame) 46 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) 47 | sizePolicy.setHorizontalStretch(0) 48 | sizePolicy.setVerticalStretch(0) 49 | sizePolicy.setHeightForWidth(self.export_btn.sizePolicy().hasHeightForWidth()) 50 | self.export_btn.setSizePolicy(sizePolicy) 51 | self.export_btn.setMinimumSize(QtCore.QSize(80, 0)) 52 | icon1 = QtGui.QIcon() 53 | icon1.addPixmap(QtGui.QPixmap(":/stuff/file_save.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 54 | self.export_btn.setIcon(icon1) 55 | self.export_btn.setIconSize(QtCore.QSize(48, 48)) 56 | self.export_btn.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup) 57 | self.export_btn.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) 58 | self.export_btn.setAutoRaise(True) 59 | self.export_btn.setObjectName("export_btn") 60 | self.horizontalLayout.addWidget(self.export_btn) 61 | self.open_btn = QtWidgets.QToolButton(self.tool_frame) 62 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) 63 | sizePolicy.setHorizontalStretch(0) 64 | sizePolicy.setVerticalStretch(0) 65 | sizePolicy.setHeightForWidth(self.open_btn.sizePolicy().hasHeightForWidth()) 66 | self.open_btn.setSizePolicy(sizePolicy) 67 | self.open_btn.setMinimumSize(QtCore.QSize(80, 0)) 68 | icon2 = QtGui.QIcon() 69 | icon2.addPixmap(QtGui.QPixmap(":/stuff/files_view.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 70 | self.open_btn.setIcon(icon2) 71 | self.open_btn.setIconSize(QtCore.QSize(48, 48)) 72 | self.open_btn.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) 73 | self.open_btn.setAutoRaise(True) 74 | self.open_btn.setObjectName("open_btn") 75 | self.horizontalLayout.addWidget(self.open_btn) 76 | self.add_btn = QtWidgets.QToolButton(self.tool_frame) 77 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) 78 | sizePolicy.setHorizontalStretch(0) 79 | sizePolicy.setVerticalStretch(0) 80 | sizePolicy.setHeightForWidth(self.add_btn.sizePolicy().hasHeightForWidth()) 81 | self.add_btn.setSizePolicy(sizePolicy) 82 | icon3 = QtGui.QIcon() 83 | icon3.addPixmap(QtGui.QPixmap(":/stuff/files_add.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 84 | self.add_btn.setIcon(icon3) 85 | self.add_btn.setIconSize(QtCore.QSize(48, 48)) 86 | self.add_btn.setChecked(False) 87 | self.add_btn.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) 88 | self.add_btn.setAutoRaise(True) 89 | self.add_btn.setObjectName("add_btn") 90 | self.horizontalLayout.addWidget(self.add_btn) 91 | self.filter_btn = QtWidgets.QToolButton(self.tool_frame) 92 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) 93 | sizePolicy.setHorizontalStretch(0) 94 | sizePolicy.setVerticalStretch(0) 95 | sizePolicy.setHeightForWidth(self.filter_btn.sizePolicy().hasHeightForWidth()) 96 | self.filter_btn.setSizePolicy(sizePolicy) 97 | icon4 = QtGui.QIcon() 98 | icon4.addPixmap(QtGui.QPixmap(":/stuff/filter.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 99 | self.filter_btn.setIcon(icon4) 100 | self.filter_btn.setIconSize(QtCore.QSize(48, 48)) 101 | self.filter_btn.setCheckable(True) 102 | self.filter_btn.setChecked(False) 103 | self.filter_btn.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) 104 | self.filter_btn.setAutoRaise(True) 105 | self.filter_btn.setObjectName("filter_btn") 106 | self.horizontalLayout.addWidget(self.filter_btn) 107 | self.merge_btn = QtWidgets.QToolButton(self.tool_frame) 108 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) 109 | sizePolicy.setHorizontalStretch(0) 110 | sizePolicy.setVerticalStretch(0) 111 | sizePolicy.setHeightForWidth(self.merge_btn.sizePolicy().hasHeightForWidth()) 112 | self.merge_btn.setSizePolicy(sizePolicy) 113 | self.merge_btn.setMinimumSize(QtCore.QSize(80, 0)) 114 | icon5 = QtGui.QIcon() 115 | icon5.addPixmap(QtGui.QPixmap(":/stuff/files_merge.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 116 | self.merge_btn.setIcon(icon5) 117 | self.merge_btn.setIconSize(QtCore.QSize(48, 48)) 118 | self.merge_btn.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup) 119 | self.merge_btn.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) 120 | self.merge_btn.setAutoRaise(True) 121 | self.merge_btn.setObjectName("merge_btn") 122 | self.horizontalLayout.addWidget(self.merge_btn) 123 | self.delete_btn = QtWidgets.QToolButton(self.tool_frame) 124 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) 125 | sizePolicy.setHorizontalStretch(0) 126 | sizePolicy.setVerticalStretch(0) 127 | sizePolicy.setHeightForWidth(self.delete_btn.sizePolicy().hasHeightForWidth()) 128 | self.delete_btn.setSizePolicy(sizePolicy) 129 | self.delete_btn.setMinimumSize(QtCore.QSize(80, 0)) 130 | icon6 = QtGui.QIcon() 131 | icon6.addPixmap(QtGui.QPixmap(":/stuff/files_delete.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 132 | self.delete_btn.setIcon(icon6) 133 | self.delete_btn.setIconSize(QtCore.QSize(48, 48)) 134 | self.delete_btn.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup) 135 | self.delete_btn.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) 136 | self.delete_btn.setAutoRaise(True) 137 | self.delete_btn.setObjectName("delete_btn") 138 | self.horizontalLayout.addWidget(self.delete_btn) 139 | self.clear_btn = QtWidgets.QToolButton(self.tool_frame) 140 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) 141 | sizePolicy.setHorizontalStretch(0) 142 | sizePolicy.setVerticalStretch(0) 143 | sizePolicy.setHeightForWidth(self.clear_btn.sizePolicy().hasHeightForWidth()) 144 | self.clear_btn.setSizePolicy(sizePolicy) 145 | self.clear_btn.setMinimumSize(QtCore.QSize(80, 0)) 146 | icon7 = QtGui.QIcon() 147 | icon7.addPixmap(QtGui.QPixmap(":/stuff/trash.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 148 | self.clear_btn.setIcon(icon7) 149 | self.clear_btn.setIconSize(QtCore.QSize(48, 48)) 150 | self.clear_btn.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) 151 | self.clear_btn.setAutoRaise(True) 152 | self.clear_btn.setObjectName("clear_btn") 153 | self.horizontalLayout.addWidget(self.clear_btn) 154 | spacerItem = QtWidgets.QSpacerItem(86, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 155 | self.horizontalLayout.addItem(spacerItem) 156 | self.view_grp = QtWidgets.QGroupBox(self.tool_frame) 157 | self.view_grp.setObjectName("view_grp") 158 | self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.view_grp) 159 | self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0) 160 | self.horizontalLayout_3.setObjectName("horizontalLayout_3") 161 | self.books_view_btn = QtWidgets.QToolButton(self.view_grp) 162 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) 163 | sizePolicy.setHorizontalStretch(0) 164 | sizePolicy.setVerticalStretch(0) 165 | sizePolicy.setHeightForWidth(self.books_view_btn.sizePolicy().hasHeightForWidth()) 166 | self.books_view_btn.setSizePolicy(sizePolicy) 167 | icon8 = QtGui.QIcon() 168 | icon8.addPixmap(QtGui.QPixmap(":/stuff/view_books.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 169 | self.books_view_btn.setIcon(icon8) 170 | self.books_view_btn.setIconSize(QtCore.QSize(48, 48)) 171 | self.books_view_btn.setCheckable(True) 172 | self.books_view_btn.setChecked(True) 173 | self.books_view_btn.setAutoExclusive(True) 174 | self.books_view_btn.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) 175 | self.books_view_btn.setAutoRaise(True) 176 | self.books_view_btn.setObjectName("books_view_btn") 177 | self.horizontalLayout_3.addWidget(self.books_view_btn) 178 | self.high_view_btn = QtWidgets.QToolButton(self.view_grp) 179 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) 180 | sizePolicy.setHorizontalStretch(0) 181 | sizePolicy.setVerticalStretch(0) 182 | sizePolicy.setHeightForWidth(self.high_view_btn.sizePolicy().hasHeightForWidth()) 183 | self.high_view_btn.setSizePolicy(sizePolicy) 184 | icon9 = QtGui.QIcon() 185 | icon9.addPixmap(QtGui.QPixmap(":/stuff/view-highlights.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 186 | self.high_view_btn.setIcon(icon9) 187 | self.high_view_btn.setIconSize(QtCore.QSize(48, 48)) 188 | self.high_view_btn.setCheckable(True) 189 | self.high_view_btn.setAutoExclusive(True) 190 | self.high_view_btn.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) 191 | self.high_view_btn.setAutoRaise(True) 192 | self.high_view_btn.setObjectName("high_view_btn") 193 | self.horizontalLayout_3.addWidget(self.high_view_btn) 194 | self.sync_view_btn = QtWidgets.QToolButton(self.view_grp) 195 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) 196 | sizePolicy.setHorizontalStretch(0) 197 | sizePolicy.setVerticalStretch(0) 198 | sizePolicy.setHeightForWidth(self.sync_view_btn.sizePolicy().hasHeightForWidth()) 199 | self.sync_view_btn.setSizePolicy(sizePolicy) 200 | icon10 = QtGui.QIcon() 201 | icon10.addPixmap(QtGui.QPixmap(":/stuff/view-sync.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 202 | self.sync_view_btn.setIcon(icon10) 203 | self.sync_view_btn.setIconSize(QtCore.QSize(48, 48)) 204 | self.sync_view_btn.setCheckable(True) 205 | self.sync_view_btn.setAutoExclusive(True) 206 | self.sync_view_btn.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) 207 | self.sync_view_btn.setAutoRaise(True) 208 | self.sync_view_btn.setObjectName("sync_view_btn") 209 | self.horizontalLayout_3.addWidget(self.sync_view_btn) 210 | self.horizontalLayout.addWidget(self.view_grp) 211 | self.mode_grp = QtWidgets.QGroupBox(self.tool_frame) 212 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) 213 | sizePolicy.setHorizontalStretch(0) 214 | sizePolicy.setVerticalStretch(0) 215 | sizePolicy.setHeightForWidth(self.mode_grp.sizePolicy().hasHeightForWidth()) 216 | self.mode_grp.setSizePolicy(sizePolicy) 217 | self.mode_grp.setObjectName("mode_grp") 218 | self.verticalLayout = QtWidgets.QVBoxLayout(self.mode_grp) 219 | self.verticalLayout.setSpacing(0) 220 | self.verticalLayout.setContentsMargins(0, 0, 0, 0) 221 | self.verticalLayout.setObjectName("verticalLayout") 222 | self.loaded_btn = QtWidgets.QToolButton(self.mode_grp) 223 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) 224 | sizePolicy.setHorizontalStretch(0) 225 | sizePolicy.setVerticalStretch(0) 226 | sizePolicy.setHeightForWidth(self.loaded_btn.sizePolicy().hasHeightForWidth()) 227 | self.loaded_btn.setSizePolicy(sizePolicy) 228 | self.loaded_btn.setMinimumSize(QtCore.QSize(80, 0)) 229 | icon11 = QtGui.QIcon() 230 | icon11.addPixmap(QtGui.QPixmap(":/stuff/books.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 231 | self.loaded_btn.setIcon(icon11) 232 | self.loaded_btn.setIconSize(QtCore.QSize(24, 24)) 233 | self.loaded_btn.setCheckable(True) 234 | self.loaded_btn.setChecked(True) 235 | self.loaded_btn.setAutoExclusive(True) 236 | self.loaded_btn.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) 237 | self.loaded_btn.setAutoRaise(True) 238 | self.loaded_btn.setObjectName("loaded_btn") 239 | self.verticalLayout.addWidget(self.loaded_btn) 240 | self.db_btn = XToolButton(self.mode_grp) 241 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) 242 | sizePolicy.setHorizontalStretch(0) 243 | sizePolicy.setVerticalStretch(0) 244 | sizePolicy.setHeightForWidth(self.db_btn.sizePolicy().hasHeightForWidth()) 245 | self.db_btn.setSizePolicy(sizePolicy) 246 | self.db_btn.setMinimumSize(QtCore.QSize(80, 0)) 247 | icon12 = QtGui.QIcon() 248 | icon12.addPixmap(QtGui.QPixmap(":/stuff/db.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 249 | self.db_btn.setIcon(icon12) 250 | self.db_btn.setIconSize(QtCore.QSize(24, 24)) 251 | self.db_btn.setCheckable(True) 252 | self.db_btn.setAutoExclusive(True) 253 | self.db_btn.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup) 254 | self.db_btn.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) 255 | self.db_btn.setAutoRaise(True) 256 | self.db_btn.setObjectName("db_btn") 257 | self.verticalLayout.addWidget(self.db_btn) 258 | self.horizontalLayout.addWidget(self.mode_grp) 259 | self.prefs_btn = QtWidgets.QToolButton(self.tool_frame) 260 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) 261 | sizePolicy.setHorizontalStretch(0) 262 | sizePolicy.setVerticalStretch(0) 263 | sizePolicy.setHeightForWidth(self.prefs_btn.sizePolicy().hasHeightForWidth()) 264 | self.prefs_btn.setSizePolicy(sizePolicy) 265 | self.prefs_btn.setMinimumSize(QtCore.QSize(80, 0)) 266 | icon13 = QtGui.QIcon() 267 | icon13.addPixmap(QtGui.QPixmap(":/stuff/prefs.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 268 | self.prefs_btn.setIcon(icon13) 269 | self.prefs_btn.setIconSize(QtCore.QSize(48, 48)) 270 | self.prefs_btn.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) 271 | self.prefs_btn.setAutoRaise(True) 272 | self.prefs_btn.setObjectName("prefs_btn") 273 | self.horizontalLayout.addWidget(self.prefs_btn) 274 | self.about_btn = QtWidgets.QToolButton(self.tool_frame) 275 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) 276 | sizePolicy.setHorizontalStretch(0) 277 | sizePolicy.setVerticalStretch(0) 278 | sizePolicy.setHeightForWidth(self.about_btn.sizePolicy().hasHeightForWidth()) 279 | self.about_btn.setSizePolicy(sizePolicy) 280 | self.about_btn.setMinimumSize(QtCore.QSize(80, 0)) 281 | icon14 = QtGui.QIcon() 282 | icon14.addPixmap(QtGui.QPixmap(":/stuff/logo64.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 283 | self.about_btn.setIcon(icon14) 284 | self.about_btn.setIconSize(QtCore.QSize(48, 48)) 285 | self.about_btn.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) 286 | self.about_btn.setAutoRaise(True) 287 | self.about_btn.setObjectName("about_btn") 288 | self.horizontalLayout.addWidget(self.about_btn) 289 | self.verticalLayout_2.addWidget(self.tool_frame) 290 | 291 | self.retranslateUi(ToolBar) 292 | QtCore.QMetaObject.connectSlotsByName(ToolBar) 293 | 294 | def retranslateUi(self, ToolBar): 295 | self.tool_frame.setToolTip(QtWidgets.QApplication.translate("ToolBar", "Right-click to change icon size", None, -1)) 296 | self.tool_frame.setStatusTip(QtWidgets.QApplication.translate("ToolBar", "Right-click to change icon size", None, -1)) 297 | self.scan_btn.setToolTip(QtWidgets.QApplication.translate("ToolBar", "Scans a directory for Koreader metadata files\n" 298 | "Can also be the eReader\'s root directory (Ctrl+L)", None, -1)) 299 | self.scan_btn.setStatusTip(QtWidgets.QApplication.translate("ToolBar", "Scans a directory for Koreader metadata files. Can also be the eReader\'s root directory (Ctrl+L)", None, -1)) 300 | self.scan_btn.setText(QtWidgets.QApplication.translate("ToolBar", "Scan Directory", None, -1)) 301 | self.export_btn.setToolTip(QtWidgets.QApplication.translate("ToolBar", "Export selected highlights (Ctrl+S)", None, -1)) 302 | self.export_btn.setStatusTip(QtWidgets.QApplication.translate("ToolBar", "Export selected highlights (Ctrl+S)", None, -1)) 303 | self.export_btn.setText(QtWidgets.QApplication.translate("ToolBar", "Export", None, -1)) 304 | self.open_btn.setToolTip(QtWidgets.QApplication.translate("ToolBar", "View the selected book (Ctrl+B)", None, -1)) 305 | self.open_btn.setStatusTip(QtWidgets.QApplication.translate("ToolBar", "View the selected book (Ctrl+B)", None, -1)) 306 | self.open_btn.setText(QtWidgets.QApplication.translate("ToolBar", "View", None, -1)) 307 | self.add_btn.setToolTip(QtWidgets.QApplication.translate("ToolBar", "Add a sync group", None, -1)) 308 | self.add_btn.setStatusTip(QtWidgets.QApplication.translate("ToolBar", "Add a sync group", None, -1)) 309 | self.add_btn.setText(QtWidgets.QApplication.translate("ToolBar", "Add", None, -1)) 310 | self.filter_btn.setToolTip(QtWidgets.QApplication.translate("ToolBar", "Open the filtering popup (Alt+F)", None, -1)) 311 | self.filter_btn.setStatusTip(QtWidgets.QApplication.translate("ToolBar", "Open the filtering popup (Alt+F)", None, -1)) 312 | self.filter_btn.setText(QtWidgets.QApplication.translate("ToolBar", "Filter", None, -1)) 313 | self.filter_btn.setShortcut(QtWidgets.QApplication.translate("ToolBar", "Alt+F", None, -1)) 314 | self.merge_btn.setToolTip(QtWidgets.QApplication.translate("ToolBar", "Merge the highlights from the same book in two different\n" 315 | "devices, and/or sync their reading position.\n" 316 | "Activated only if two entries of the same book are selected.", None, -1)) 317 | self.merge_btn.setStatusTip(QtWidgets.QApplication.translate("ToolBar", "Merge the highlights from the same book in two different devices, and/or sync their reading position. Activated only if two entries of the same book are selected.", None, -1)) 318 | self.merge_btn.setText(QtWidgets.QApplication.translate("ToolBar", "Merge/Sync", None, -1)) 319 | self.delete_btn.setToolTip(QtWidgets.QApplication.translate("ToolBar", "Delete selected", None, -1)) 320 | self.delete_btn.setText(QtWidgets.QApplication.translate("ToolBar", "Delete", None, -1)) 321 | self.clear_btn.setToolTip(QtWidgets.QApplication.translate("ToolBar", "Clear the list\'s entries (Ctrl+Backspace)", None, -1)) 322 | self.clear_btn.setStatusTip(QtWidgets.QApplication.translate("ToolBar", "Clear the list\'s entries (Ctrl+Backspace)", None, -1)) 323 | self.clear_btn.setText(QtWidgets.QApplication.translate("ToolBar", "Clear List", None, -1)) 324 | self.books_view_btn.setToolTip(QtWidgets.QApplication.translate("ToolBar", "Books View", None, -1)) 325 | self.books_view_btn.setStatusTip(QtWidgets.QApplication.translate("ToolBar", "Books View", None, -1)) 326 | self.books_view_btn.setText(QtWidgets.QApplication.translate("ToolBar", "Books", None, -1)) 327 | self.high_view_btn.setToolTip(QtWidgets.QApplication.translate("ToolBar", "Highlights View", None, -1)) 328 | self.high_view_btn.setStatusTip(QtWidgets.QApplication.translate("ToolBar", "Highlights View", None, -1)) 329 | self.high_view_btn.setText(QtWidgets.QApplication.translate("ToolBar", "Highlights", None, -1)) 330 | self.sync_view_btn.setToolTip(QtWidgets.QApplication.translate("ToolBar", "Sync Groups View", None, -1)) 331 | self.sync_view_btn.setStatusTip(QtWidgets.QApplication.translate("ToolBar", "Sync Groups View", None, -1)) 332 | self.sync_view_btn.setText(QtWidgets.QApplication.translate("ToolBar", "Sync Groups", None, -1)) 333 | self.loaded_btn.setToolTip(QtWidgets.QApplication.translate("ToolBar", "Show the loaded files", None, -1)) 334 | self.loaded_btn.setStatusTip(QtWidgets.QApplication.translate("ToolBar", "Show the loaded files", None, -1)) 335 | self.loaded_btn.setText(QtWidgets.QApplication.translate("ToolBar", "Loaded", None, -1)) 336 | self.db_btn.setToolTip(QtWidgets.QApplication.translate("ToolBar", "Show the archived files in the database\n" 337 | "(Right click for database actions menu)", None, -1)) 338 | self.db_btn.setStatusTip(QtWidgets.QApplication.translate("ToolBar", "Show the archived files in the database (Right click for database actions menu)", None, -1)) 339 | self.db_btn.setText(QtWidgets.QApplication.translate("ToolBar", "Archived", None, -1)) 340 | self.prefs_btn.setToolTip(QtWidgets.QApplication.translate("ToolBar", "User Preferences (Ctrl+P)", None, -1)) 341 | self.prefs_btn.setStatusTip(QtWidgets.QApplication.translate("ToolBar", "User Preferences (Ctrl+P)", None, -1)) 342 | self.prefs_btn.setText(QtWidgets.QApplication.translate("ToolBar", "Preferences", None, -1)) 343 | self.prefs_btn.setShortcut(QtWidgets.QApplication.translate("ToolBar", "Ctrl+P", None, -1)) 344 | self.about_btn.setToolTip(QtWidgets.QApplication.translate("ToolBar", "Info about KoHighlights (Ctrl+I)", None, -1)) 345 | self.about_btn.setStatusTip(QtWidgets.QApplication.translate("ToolBar", "Info about KoHighlights (Ctrl+I)", None, -1)) 346 | self.about_btn.setText(QtWidgets.QApplication.translate("ToolBar", "About", None, -1)) 347 | 348 | from secondary import XToolButton 349 | import images_rc 350 | --------------------------------------------------------------------------------