gui-utilities 1.3.44__py3-none-any.whl → 1.3.49__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- gui_utilities/gui_utilities.py +113 -22
- {gui_utilities-1.3.44.dist-info → gui_utilities-1.3.49.dist-info}/METADATA +1 -1
- {gui_utilities-1.3.44.dist-info → gui_utilities-1.3.49.dist-info}/RECORD +6 -6
- {gui_utilities-1.3.44.dist-info → gui_utilities-1.3.49.dist-info}/WHEEL +0 -0
- {gui_utilities-1.3.44.dist-info → gui_utilities-1.3.49.dist-info}/licenses/LICENSE +0 -0
- {gui_utilities-1.3.44.dist-info → gui_utilities-1.3.49.dist-info}/top_level.txt +0 -0
gui_utilities/gui_utilities.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from PyQt6.QtCore import Qt, QObject, QEvent, QSize
|
|
2
|
-
from PyQt6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QLineEdit, QComboBox, QDialog, QToolButton, QWidgetAction, QCheckBox, QTableWidget, QHeaderView
|
|
3
|
-
from PyQt6.QtGui import QIcon
|
|
2
|
+
from PyQt6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QLineEdit, QComboBox, QDialog, QToolButton, QWidgetAction, QCheckBox, QTableWidget, QHeaderView, QApplication, QStyle, QStyledItemDelegate
|
|
3
|
+
from PyQt6.QtGui import QIcon, QTextDocument
|
|
4
4
|
import re
|
|
5
5
|
import requests
|
|
6
6
|
import importlib.resources
|
|
@@ -9,6 +9,16 @@ main_dir = importlib.resources.files("gui_utilities")
|
|
|
9
9
|
icons_dir = main_dir / "icons"
|
|
10
10
|
tlds_path = main_dir / "tlds"
|
|
11
11
|
|
|
12
|
+
def latex_to_html(expression):
|
|
13
|
+
html_expression = expression
|
|
14
|
+
html_expression = re.sub(r"\\frac\{(.*?)\}\{(.*?)\}", r"<span style='font-size:90%;'>\1⁄\2</span>", html_expression)
|
|
15
|
+
html_expression = re.sub(r"_\{([^}]+)\}", r"<sub>\1</sub>", html_expression)
|
|
16
|
+
html_expression = re.sub(r"\^\{([^}]+)\}", r"<sup>\1</sup>", html_expression)
|
|
17
|
+
html_expression = re.sub(r"_([a-zA-Z0-9]+)", r"<sub>\1</sub>", html_expression)
|
|
18
|
+
html_expression = re.sub(r"\^([a-zA-Z0-9]+)", r"<sup>\1</sup>", html_expression)
|
|
19
|
+
html_expression = html_expression.replace(" ", " ")
|
|
20
|
+
return html_expression
|
|
21
|
+
|
|
12
22
|
def create_window(title, background_color = "#1e1e1e", parent = None):
|
|
13
23
|
window = QWidget(parent)
|
|
14
24
|
window.setObjectName("window")
|
|
@@ -201,16 +211,6 @@ def create_label(
|
|
|
201
211
|
word_wrap = False,
|
|
202
212
|
parent = None
|
|
203
213
|
):
|
|
204
|
-
def latex_to_html(expression):
|
|
205
|
-
html_expression = expression
|
|
206
|
-
html_expression = re.sub(r"\\frac\{(.*?)\}\{(.*?)\}", r"<span style='font-size:90%;'>\1⁄\2</span>", html_expression)
|
|
207
|
-
html_expression = re.sub(r"_\{([^}]+)\}", r"<sub>\1</sub>", html_expression)
|
|
208
|
-
html_expression = re.sub(r"\^\{([^}]+)\}", r"<sup>\1</sup>", html_expression)
|
|
209
|
-
html_expression = re.sub(r"_([a-zA-Z0-9]+)", r"<sub>\1</sub>", html_expression)
|
|
210
|
-
html_expression = re.sub(r"\^([a-zA-Z0-9]+)", r"<sup>\1</sup>", html_expression)
|
|
211
|
-
html_expression = html_expression.replace(" ", " ")
|
|
212
|
-
return html_expression
|
|
213
|
-
|
|
214
214
|
if math_expression:
|
|
215
215
|
label = QLabel(latex_to_html(text), parent)
|
|
216
216
|
label.setTextFormat(Qt.TextFormat.RichText)
|
|
@@ -524,21 +524,107 @@ def create_combo_box(
|
|
|
524
524
|
dropdown_selection_background_color = "#0078d7",
|
|
525
525
|
dropdown_border_width = 1,
|
|
526
526
|
dropdown_border_color = "#5c5c5c",
|
|
527
|
+
math_expression = False,
|
|
527
528
|
parent = None
|
|
528
529
|
):
|
|
529
530
|
combo_box = QComboBox(parent)
|
|
530
|
-
combo_box.
|
|
531
|
-
combo_box.addItems(items)
|
|
532
|
-
combo_box.setCurrentIndex(-1)
|
|
533
|
-
|
|
531
|
+
combo_box.setAccessibleName("combo_box")
|
|
534
532
|
padding_left_value = padding_left if padding_left is not None else padding
|
|
535
533
|
padding_top_value = padding_top if padding_top is not None else padding
|
|
536
534
|
padding_right_value = padding_right if padding_right is not None else padding
|
|
537
535
|
padding_bottom_value = padding_bottom if padding_bottom is not None else padding
|
|
536
|
+
if math_expression:
|
|
537
|
+
placeholder_label = create_label(
|
|
538
|
+
text = placeholder_text,
|
|
539
|
+
font_family = font_family,
|
|
540
|
+
font_size = font_size,
|
|
541
|
+
font_color = placeholder_font_color,
|
|
542
|
+
padding = padding,
|
|
543
|
+
padding_left = padding_left,
|
|
544
|
+
padding_top = padding_top,
|
|
545
|
+
padding_right = padding_right,
|
|
546
|
+
padding_bottom = padding_bottom,
|
|
547
|
+
math_expression = True,
|
|
548
|
+
transparent_for_mouse = True,
|
|
549
|
+
parent = combo_box
|
|
550
|
+
)
|
|
551
|
+
placeholder_label.move(0, 2)
|
|
552
|
+
|
|
553
|
+
def update_placeholder_visibility():
|
|
554
|
+
has_selection = combo_box.currentIndex() != -1
|
|
555
|
+
placeholder_label.setVisible(not has_selection)
|
|
556
|
+
|
|
557
|
+
combo_box.currentIndexChanged.connect(update_placeholder_visibility)
|
|
558
|
+
update_placeholder_visibility()
|
|
538
559
|
|
|
560
|
+
class RichTextDelegate(QStyledItemDelegate):
|
|
561
|
+
def __init__(
|
|
562
|
+
self,
|
|
563
|
+
parent = None,
|
|
564
|
+
font_color = "#ffffff",
|
|
565
|
+
selection_font_color = "#ffffff"
|
|
566
|
+
):
|
|
567
|
+
super().__init__(parent)
|
|
568
|
+
self.font_color = font_color
|
|
569
|
+
self.selection_font_color = selection_font_color
|
|
570
|
+
|
|
571
|
+
def paint(self, painter, option, index):
|
|
572
|
+
if option.state & QStyle.StateFlag.State_Selected: text_color = self.selection_font_color
|
|
573
|
+
else: text_color = self.font_color
|
|
574
|
+
document = QTextDocument()
|
|
575
|
+
html = f"<span style = \"color:{text_color};\">{index.data(Qt.ItemDataRole.DisplayRole)}</span>"
|
|
576
|
+
document.setHtml(html)
|
|
577
|
+
option.text = ""
|
|
578
|
+
QApplication.style().drawControl(QStyle.ControlElement.CE_ItemViewItem, option, painter)
|
|
579
|
+
painter.save()
|
|
580
|
+
painter.translate(option.rect.left(), option.rect.top() + (option.rect.height() - document.size().height()) / 2)
|
|
581
|
+
document.drawContents(painter)
|
|
582
|
+
painter.restore()
|
|
583
|
+
|
|
584
|
+
delegate = RichTextDelegate(
|
|
585
|
+
parent = combo_box,
|
|
586
|
+
font_color = dropdown_font_color,
|
|
587
|
+
selection_font_color = font_color
|
|
588
|
+
)
|
|
589
|
+
combo_box.setItemDelegate(delegate)
|
|
590
|
+
combo_box.clear()
|
|
591
|
+
for item in items: combo_box.addItem(latex_to_html(item))
|
|
592
|
+
combo_box.view().setTextElideMode(Qt.TextElideMode.ElideNone)
|
|
593
|
+
else:
|
|
594
|
+
combo_box.setPlaceholderText(placeholder_text)
|
|
595
|
+
combo_box.addItems(items)
|
|
596
|
+
combo_box.setCurrentIndex(-1)
|
|
597
|
+
if math_expression:
|
|
598
|
+
selected_item_label = create_label(
|
|
599
|
+
text = "",
|
|
600
|
+
font_family = font_family,
|
|
601
|
+
font_size = font_size,
|
|
602
|
+
font_color = font_color,
|
|
603
|
+
padding = padding,
|
|
604
|
+
padding_left = padding_left,
|
|
605
|
+
padding_top = padding_top,
|
|
606
|
+
padding_right = padding_right,
|
|
607
|
+
padding_bottom = padding_bottom,
|
|
608
|
+
math_expression = True,
|
|
609
|
+
transparent_for_mouse = True,
|
|
610
|
+
alignment = Qt.AlignmentFlag.AlignCenter,
|
|
611
|
+
parent = combo_box
|
|
612
|
+
)
|
|
613
|
+
selected_item_label.setVisible(False)
|
|
614
|
+
|
|
615
|
+
def update_selected_item_display(index):
|
|
616
|
+
if index != -1:
|
|
617
|
+
html_text = combo_box.itemText(index)
|
|
618
|
+
selected_item_label.setText(html_text)
|
|
619
|
+
selected_item_label.setVisible(True)
|
|
620
|
+
else:
|
|
621
|
+
selected_item_label.setVisible(False)
|
|
622
|
+
|
|
623
|
+
combo_box.currentIndexChanged.connect(update_selected_item_display)
|
|
624
|
+
|
|
539
625
|
def get_stylesheet(font_color):
|
|
540
626
|
return f"""
|
|
541
|
-
QComboBox {{
|
|
627
|
+
QComboBox[accessibleName="combo_box"] {{
|
|
542
628
|
font-family: {font_family};
|
|
543
629
|
font-size: {font_size}px;
|
|
544
630
|
color: {font_color};
|
|
@@ -550,12 +636,12 @@ def create_combo_box(
|
|
|
550
636
|
border: {border_width}px solid {border_color};
|
|
551
637
|
border-radius: {border_radius}px;
|
|
552
638
|
}}
|
|
553
|
-
QComboBox:hover {{
|
|
639
|
+
QComboBox[accessibleName="combo_box"]:hover {{
|
|
554
640
|
background-color: {hover_background_color};
|
|
555
641
|
border: {hover_border_width}px solid {hover_border_color};
|
|
556
642
|
}}
|
|
557
|
-
QComboBox:on {{
|
|
558
|
-
color: {on_font_color};
|
|
643
|
+
QComboBox[accessibleName="combo_box"]:on {{
|
|
644
|
+
color: {"transparent" if math_expression else on_font_color};
|
|
559
645
|
background-color: {on_background_color};
|
|
560
646
|
border: {on_border_width}px solid {on_border_color};
|
|
561
647
|
}}
|
|
@@ -564,6 +650,7 @@ def create_combo_box(
|
|
|
564
650
|
background-color: {dropdown_background_color};
|
|
565
651
|
selection-background-color: {dropdown_selection_background_color};
|
|
566
652
|
border: {dropdown_border_width}px solid {dropdown_border_color};
|
|
653
|
+
outline: none;
|
|
567
654
|
}}
|
|
568
655
|
QComboBox::drop-down {{
|
|
569
656
|
border: none;
|
|
@@ -571,8 +658,12 @@ def create_combo_box(
|
|
|
571
658
|
"""
|
|
572
659
|
|
|
573
660
|
def change_color(index):
|
|
574
|
-
if index == -1:
|
|
575
|
-
|
|
661
|
+
if index == -1:
|
|
662
|
+
text_color = "transparent" if math_expression else placeholder_font_color
|
|
663
|
+
combo_box.setStyleSheet(get_stylesheet(text_color))
|
|
664
|
+
else:
|
|
665
|
+
text_color = "transparent" if math_expression else font_color
|
|
666
|
+
combo_box.setStyleSheet(get_stylesheet(text_color))
|
|
576
667
|
|
|
577
668
|
combo_box.currentIndexChanged.connect(change_color)
|
|
578
669
|
change_color(-1)
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
gui_utilities/gui_utilities.py,sha256=
|
|
1
|
+
gui_utilities/gui_utilities.py,sha256=QbleCgOLya9TDIoADbM-uY42psMSXskxAD68Ts0T3cE,52535
|
|
2
2
|
gui_utilities/icons/focused_hide_text_icon.png,sha256=0Ysx7vC-mEVfuSBWx1Zw-UhpqvrTCcIvnQ926wFmuK4,13084
|
|
3
3
|
gui_utilities/icons/focused_show_text_icon.png,sha256=gmZU7RR4FN-9VSzpD00ZkQ8UGbihO2y808Kh3b_TaEg,6739
|
|
4
4
|
gui_utilities/icons/hide_text_icon.png,sha256=f5jq6KaAygWNjzP_Ah6dw6eu8q5ml3m56JTeNSTSgEU,7207
|
|
5
5
|
gui_utilities/icons/show_text_icon.png,sha256=8Vdp2XickPEM-eTb1-qBXf3qmHldSzllMZZfObir9p8,5376
|
|
6
6
|
gui_utilities/tlds/tlds_list.txt,sha256=wIWmAQGVNsY0ZJy7qPW8kItDTCE4PTq8wcUhC2hpjkw,10916
|
|
7
|
-
gui_utilities-1.3.
|
|
8
|
-
gui_utilities-1.3.
|
|
9
|
-
gui_utilities-1.3.
|
|
10
|
-
gui_utilities-1.3.
|
|
11
|
-
gui_utilities-1.3.
|
|
7
|
+
gui_utilities-1.3.49.dist-info/licenses/LICENSE,sha256=NNoMFs43kWl1J-aqq7_EsPlBjL5XTccWjZlwrlCR-Xc,1093
|
|
8
|
+
gui_utilities-1.3.49.dist-info/METADATA,sha256=5P5GUF9xkEHS_Ibx0CBdKG_QzolDjVJ0w0ne-_PxIpA,266
|
|
9
|
+
gui_utilities-1.3.49.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
10
|
+
gui_utilities-1.3.49.dist-info/top_level.txt,sha256=c4C84nMT41keiX9b1AJJZDBU3kA38c7vOmP9kDie8Lk,14
|
|
11
|
+
gui_utilities-1.3.49.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|