gui-utilities 1.3.35__tar.gz → 1.4.2__tar.gz
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.
Potentially problematic release.
This version of gui-utilities might be problematic. Click here for more details.
- {gui_utilities-1.3.35 → gui_utilities-1.4.2}/PKG-INFO +1 -1
- {gui_utilities-1.3.35 → gui_utilities-1.4.2}/gui_utilities/gui_utilities.py +239 -89
- {gui_utilities-1.3.35 → gui_utilities-1.4.2}/gui_utilities.egg-info/PKG-INFO +1 -1
- {gui_utilities-1.3.35 → gui_utilities-1.4.2}/pyproject.toml +1 -1
- {gui_utilities-1.3.35 → gui_utilities-1.4.2}/LICENSE +0 -0
- {gui_utilities-1.3.35 → gui_utilities-1.4.2}/README.md +0 -0
- {gui_utilities-1.3.35 → gui_utilities-1.4.2}/gui_utilities/icons/focused_hide_text_icon.png +0 -0
- {gui_utilities-1.3.35 → gui_utilities-1.4.2}/gui_utilities/icons/focused_show_text_icon.png +0 -0
- {gui_utilities-1.3.35 → gui_utilities-1.4.2}/gui_utilities/icons/hide_text_icon.png +0 -0
- {gui_utilities-1.3.35 → gui_utilities-1.4.2}/gui_utilities/icons/show_text_icon.png +0 -0
- {gui_utilities-1.3.35 → gui_utilities-1.4.2}/gui_utilities/tlds/tlds_list.txt +0 -0
- {gui_utilities-1.3.35 → gui_utilities-1.4.2}/gui_utilities.egg-info/SOURCES.txt +0 -0
- {gui_utilities-1.3.35 → gui_utilities-1.4.2}/gui_utilities.egg-info/dependency_links.txt +0 -0
- {gui_utilities-1.3.35 → gui_utilities-1.4.2}/gui_utilities.egg-info/requires.txt +0 -0
- {gui_utilities-1.3.35 → gui_utilities-1.4.2}/gui_utilities.egg-info/top_level.txt +0 -0
- {gui_utilities-1.3.35 → gui_utilities-1.4.2}/setup.cfg +0 -0
|
@@ -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,8 +9,18 @@ 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
|
|
13
|
-
|
|
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
|
+
|
|
22
|
+
def create_window(title, background_color = "#1e1e1e", parent = None):
|
|
23
|
+
window = QWidget(parent)
|
|
14
24
|
window.setObjectName("window")
|
|
15
25
|
window.setWindowTitle(title)
|
|
16
26
|
window.setStyleSheet(f"#window {{background-color: {background_color};}}")
|
|
@@ -33,7 +43,9 @@ def create_menu(
|
|
|
33
43
|
title_padding_bottom = None,
|
|
34
44
|
title_border_width = 0,
|
|
35
45
|
title_border_color = "#ffffff",
|
|
36
|
-
title_border_radius = 0
|
|
46
|
+
title_border_radius = 0,
|
|
47
|
+
math_expression = False,
|
|
48
|
+
title_alignment = Qt.AlignmentFlag.AlignCenter
|
|
37
49
|
):
|
|
38
50
|
main_layout = QVBoxLayout()
|
|
39
51
|
main_layout.setContentsMargins(25, 25, 25, 25)
|
|
@@ -50,7 +62,9 @@ def create_menu(
|
|
|
50
62
|
padding_bottom = title_padding_bottom,
|
|
51
63
|
border_width = title_border_width,
|
|
52
64
|
border_color = title_border_color,
|
|
53
|
-
border_radius = title_border_radius
|
|
65
|
+
border_radius = title_border_radius,
|
|
66
|
+
math_expression = math_expression,
|
|
67
|
+
alignment = title_alignment
|
|
54
68
|
))
|
|
55
69
|
body_layout = QHBoxLayout()
|
|
56
70
|
main_layout.addLayout(body_layout)
|
|
@@ -102,7 +116,9 @@ def create_header(
|
|
|
102
116
|
title_padding_bottom = None,
|
|
103
117
|
title_border_width = 0,
|
|
104
118
|
title_border_color = "#ffffff",
|
|
105
|
-
title_border_radius = 0
|
|
119
|
+
title_border_radius = 0,
|
|
120
|
+
math_expression = False,
|
|
121
|
+
title_alignment = Qt.AlignmentFlag.AlignCenter
|
|
106
122
|
):
|
|
107
123
|
main_layout = QVBoxLayout()
|
|
108
124
|
main_layout.setContentsMargins(margin_left, margin_top, margin_right, margin_bottom)
|
|
@@ -119,7 +135,9 @@ def create_header(
|
|
|
119
135
|
padding_bottom = title_padding_bottom,
|
|
120
136
|
border_width = title_border_width,
|
|
121
137
|
border_color = title_border_color,
|
|
122
|
-
border_radius = title_border_radius
|
|
138
|
+
border_radius = title_border_radius,
|
|
139
|
+
math_expression = math_expression,
|
|
140
|
+
alignment = title_alignment
|
|
123
141
|
)
|
|
124
142
|
main_layout.addLayout(title_layout)
|
|
125
143
|
main_layout.addStretch()
|
|
@@ -138,11 +156,12 @@ def create_title(
|
|
|
138
156
|
padding_bottom = None,
|
|
139
157
|
border_width = 0,
|
|
140
158
|
border_color = "#ffffff",
|
|
141
|
-
border_radius = 0
|
|
159
|
+
border_radius = 0,
|
|
160
|
+
math_expression = False,
|
|
161
|
+
alignment = Qt.AlignmentFlag.AlignCenter
|
|
142
162
|
):
|
|
143
163
|
title_layout = QHBoxLayout()
|
|
144
164
|
title_layout.setContentsMargins(0, 0, 0, 25)
|
|
145
|
-
title_layout.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
|
146
165
|
title_label = create_label(
|
|
147
166
|
text = text,
|
|
148
167
|
font_family = font_family,
|
|
@@ -157,7 +176,9 @@ def create_title(
|
|
|
157
176
|
padding_bottom = padding_bottom,
|
|
158
177
|
border_width = border_width,
|
|
159
178
|
border_color = border_color,
|
|
160
|
-
border_radius = border_radius
|
|
179
|
+
border_radius = border_radius,
|
|
180
|
+
math_expression = math_expression,
|
|
181
|
+
alignment = alignment
|
|
161
182
|
)
|
|
162
183
|
title_layout.addWidget(title_label)
|
|
163
184
|
return title_layout
|
|
@@ -184,9 +205,19 @@ def create_label(
|
|
|
184
205
|
disabled_background_color = "transparent",
|
|
185
206
|
disabled_border_width = 0,
|
|
186
207
|
disabled_border_color = "#4a4a4a",
|
|
208
|
+
math_expression = False,
|
|
209
|
+
transparent_for_mouse = False,
|
|
210
|
+
alignment = None,
|
|
211
|
+
word_wrap = False,
|
|
187
212
|
parent = None
|
|
188
213
|
):
|
|
189
|
-
|
|
214
|
+
if math_expression:
|
|
215
|
+
label = QLabel(latex_to_html(text), parent)
|
|
216
|
+
label.setTextFormat(Qt.TextFormat.RichText)
|
|
217
|
+
else: label = QLabel(text, parent)
|
|
218
|
+
if transparent_for_mouse: label.setAttribute(Qt.WidgetAttribute.WA_TransparentForMouseEvents, True)
|
|
219
|
+
if alignment: label.setAlignment(alignment)
|
|
220
|
+
if word_wrap: label.setWordWrap(True)
|
|
190
221
|
padding_left_value = padding_left if padding_left is not None else padding
|
|
191
222
|
padding_top_value = padding_top if padding_top is not None else padding
|
|
192
223
|
padding_right_value = padding_right if padding_right is not None else padding
|
|
@@ -243,10 +274,12 @@ def create_button(
|
|
|
243
274
|
disabled_background_color = "#2d2d2d",
|
|
244
275
|
disabled_border_width = 2,
|
|
245
276
|
disabled_border_color = "#4a4a4a",
|
|
246
|
-
maximum_width = 360
|
|
277
|
+
maximum_width = 360,
|
|
278
|
+
math_expression = False,
|
|
279
|
+
parent = None
|
|
247
280
|
):
|
|
248
|
-
button = QPushButton()
|
|
249
|
-
button.setMaximumWidth(maximum_width)
|
|
281
|
+
button = QPushButton(parent)
|
|
282
|
+
if maximum_width is not None: button.setMaximumWidth(maximum_width)
|
|
250
283
|
main_layout = QVBoxLayout()
|
|
251
284
|
button.setLayout(main_layout)
|
|
252
285
|
main_layout.setContentsMargins(0, 0, 0, 0)
|
|
@@ -260,9 +293,11 @@ def create_button(
|
|
|
260
293
|
padding_top = padding_top,
|
|
261
294
|
padding_right = padding_right,
|
|
262
295
|
padding_bottom = padding_bottom,
|
|
263
|
-
disabled_border_width = disabled_border_width
|
|
296
|
+
disabled_border_width = disabled_border_width,
|
|
297
|
+
transparent_for_mouse = True,
|
|
298
|
+
alignment = Qt.AlignmentFlag.AlignCenter,
|
|
299
|
+
math_expression = math_expression
|
|
264
300
|
)
|
|
265
|
-
label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
|
266
301
|
label.setWordWrap(True)
|
|
267
302
|
main_layout.addWidget(label)
|
|
268
303
|
button.setFixedHeight(main_layout.sizeHint().height() + 2 * border_width)
|
|
@@ -332,9 +367,10 @@ def create_text_box(
|
|
|
332
367
|
focused_show_text_icon_url = str(icons_dir / "focused_show_text_icon.png"),
|
|
333
368
|
focused_hide_text_icon_url = str(icons_dir / "focused_hide_text_icon.png"),
|
|
334
369
|
hide_text = False,
|
|
335
|
-
math_expression = False
|
|
370
|
+
math_expression = False,
|
|
371
|
+
parent = None
|
|
336
372
|
):
|
|
337
|
-
text_box = QLineEdit()
|
|
373
|
+
text_box = QLineEdit(parent)
|
|
338
374
|
padding_left_value = padding_left if padding_left is not None else padding
|
|
339
375
|
padding_top_value = padding_top if padding_top is not None else padding
|
|
340
376
|
padding_right_value = padding_right if padding_right is not None else padding
|
|
@@ -368,36 +404,6 @@ def create_text_box(
|
|
|
368
404
|
}}
|
|
369
405
|
"""
|
|
370
406
|
text_box.setStyleSheet(style_sheet)
|
|
371
|
-
|
|
372
|
-
def latex_to_html(expression):
|
|
373
|
-
html_expression = expression
|
|
374
|
-
html_expression = re.sub(r"\\frac\{(.*?)\}\{(.*?)\}", r"<span style='font-size:90%;'>\1⁄\2</span>", html_expression)
|
|
375
|
-
html_expression = re.sub(r"([a-zA-Z])_(\d+)", r"\1<sub>\2</sub>", html_expression)
|
|
376
|
-
html_expression = re.sub(r"([a-zA-Z0-9])\^(\d+)", r"\1<sup>\2</sup>", html_expression)
|
|
377
|
-
html_expression = html_expression.replace(" ", " ")
|
|
378
|
-
return html_expression
|
|
379
|
-
|
|
380
|
-
if not math_expression: text_box.setPlaceholderText(placeholder_text)
|
|
381
|
-
else:
|
|
382
|
-
html_placeholder = latex_to_html(placeholder_text)
|
|
383
|
-
placeholder_label = create_label(
|
|
384
|
-
text = html_placeholder,
|
|
385
|
-
font_color = placeholder_font_color,
|
|
386
|
-
font_family = font_family,
|
|
387
|
-
font_size = font_size,
|
|
388
|
-
background_color = "transparent",
|
|
389
|
-
hover_background_color = "transparent",
|
|
390
|
-
disabled_background_color = "transparent",
|
|
391
|
-
parent = text_box
|
|
392
|
-
)
|
|
393
|
-
placeholder_label.setTextFormat(Qt.TextFormat.RichText)
|
|
394
|
-
placeholder_label.show()
|
|
395
|
-
|
|
396
|
-
def update_placeholder_visibility():
|
|
397
|
-
placeholder_label.setVisible(text_box.text() == "")
|
|
398
|
-
|
|
399
|
-
text_box.textChanged.connect(update_placeholder_visibility)
|
|
400
|
-
update_placeholder_visibility()
|
|
401
407
|
if hide_text:
|
|
402
408
|
show_text_icon = QIcon(show_text_icon_url)
|
|
403
409
|
hide_text_icon = QIcon(hide_text_icon_url)
|
|
@@ -411,38 +417,81 @@ def create_text_box(
|
|
|
411
417
|
toggle_text_visibility_button.setIconSize(QSize(25, 25))
|
|
412
418
|
toggle_text_visibility_action = QWidgetAction(text_box)
|
|
413
419
|
toggle_text_visibility_action.setDefaultWidget(toggle_text_visibility_button)
|
|
414
|
-
|
|
415
|
-
|
|
420
|
+
text_box.addAction(toggle_text_visibility_action, QLineEdit.ActionPosition.TrailingPosition)
|
|
421
|
+
toggle_text_visibility_button.setStyleSheet("""
|
|
422
|
+
QToolButton {
|
|
416
423
|
background-color: transparent;
|
|
417
424
|
border: none;
|
|
418
425
|
margin-right: 10px;
|
|
419
|
-
}
|
|
420
|
-
"""
|
|
421
|
-
|
|
422
|
-
text_box.addAction(toggle_text_visibility_action, QLineEdit.ActionPosition.TrailingPosition)
|
|
423
|
-
|
|
426
|
+
}
|
|
427
|
+
""")
|
|
428
|
+
|
|
424
429
|
def update_icon():
|
|
425
430
|
is_password = text_box.echoMode() == QLineEdit.EchoMode.Password
|
|
426
431
|
if text_box.hasFocus(): icon = focused_hide_text_icon if is_password else focused_show_text_icon
|
|
427
432
|
else: icon = hide_text_icon if is_password else show_text_icon
|
|
428
433
|
toggle_text_visibility_button.setIcon(icon)
|
|
429
|
-
|
|
434
|
+
|
|
430
435
|
def toggle_visibility():
|
|
431
436
|
if text_box.echoMode() == QLineEdit.EchoMode.Password: text_box.setEchoMode(QLineEdit.EchoMode.Normal)
|
|
432
437
|
else: text_box.setEchoMode(QLineEdit.EchoMode.Password)
|
|
433
438
|
update_icon()
|
|
434
|
-
|
|
439
|
+
|
|
435
440
|
toggle_text_visibility_button.clicked.connect(toggle_visibility)
|
|
436
441
|
|
|
437
|
-
class
|
|
442
|
+
class _IconFocusWatcher(QObject):
|
|
443
|
+
def __init__(self, watched, on_focus_change):
|
|
444
|
+
super().__init__(watched)
|
|
445
|
+
self._watched = watched
|
|
446
|
+
self._on_focus_change = on_focus_change
|
|
447
|
+
|
|
438
448
|
def eventFilter(self, watched, event):
|
|
439
|
-
if event.type() in (QEvent.Type.FocusIn, QEvent.Type.FocusOut):
|
|
449
|
+
if watched is self._watched and event.type() in (QEvent.Type.FocusIn, QEvent.Type.FocusOut):
|
|
450
|
+
if callable(self._on_focus_change): self._on_focus_change()
|
|
440
451
|
return super().eventFilter(watched, event)
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
text_box.installEventFilter(
|
|
444
|
-
setattr(text_box, "
|
|
445
|
-
|
|
452
|
+
|
|
453
|
+
icon_focus_watcher = _IconFocusWatcher(text_box, update_icon)
|
|
454
|
+
text_box.installEventFilter(icon_focus_watcher)
|
|
455
|
+
setattr(text_box, "_icon_focus_watcher", icon_focus_watcher)
|
|
456
|
+
|
|
457
|
+
placeholder_label = create_label(
|
|
458
|
+
text = placeholder_text,
|
|
459
|
+
font_family = font_family,
|
|
460
|
+
font_size = font_size,
|
|
461
|
+
font_color = placeholder_font_color,
|
|
462
|
+
font_weight = font_weight,
|
|
463
|
+
padding = padding,
|
|
464
|
+
padding_left = padding_left,
|
|
465
|
+
padding_top = padding_top,
|
|
466
|
+
padding_right = padding_right,
|
|
467
|
+
padding_bottom = padding_bottom,
|
|
468
|
+
math_expression = math_expression,
|
|
469
|
+
transparent_for_mouse = True,
|
|
470
|
+
parent = text_box
|
|
471
|
+
)
|
|
472
|
+
placeholder_label.move(0, 2)
|
|
473
|
+
|
|
474
|
+
def update_placeholder_visibility():
|
|
475
|
+
has_text = bool(text_box.text().strip())
|
|
476
|
+
has_focus = text_box.hasFocus()
|
|
477
|
+
placeholder_label.setVisible(not has_text and not has_focus)
|
|
478
|
+
if hide_text: update_icon()
|
|
479
|
+
|
|
480
|
+
class _PlaceholderFocusWatcher(QObject):
|
|
481
|
+
def __init__(self, watched, on_focus_change):
|
|
482
|
+
super().__init__(watched)
|
|
483
|
+
self._watched = watched
|
|
484
|
+
self._on_focus_change = on_focus_change
|
|
485
|
+
|
|
486
|
+
def eventFilter(self, watched, event):
|
|
487
|
+
if watched is self._watched and event.type() in (QEvent.Type.FocusIn, QEvent.Type.FocusOut):
|
|
488
|
+
if callable(self._on_focus_change): self._on_focus_change()
|
|
489
|
+
return super().eventFilter(watched, event)
|
|
490
|
+
|
|
491
|
+
placeholder_focus_watcher = _PlaceholderFocusWatcher(text_box, update_placeholder_visibility)
|
|
492
|
+
text_box.installEventFilter(placeholder_focus_watcher)
|
|
493
|
+
setattr(text_box, "_placeholder_focus_watcher", placeholder_focus_watcher)
|
|
494
|
+
update_placeholder_visibility()
|
|
446
495
|
return text_box
|
|
447
496
|
|
|
448
497
|
def create_combo_box(
|
|
@@ -472,21 +521,108 @@ def create_combo_box(
|
|
|
472
521
|
dropdown_background_color = "#1e1e1e",
|
|
473
522
|
dropdown_selection_background_color = "#0078d7",
|
|
474
523
|
dropdown_border_width = 1,
|
|
475
|
-
dropdown_border_color = "#5c5c5c"
|
|
524
|
+
dropdown_border_color = "#5c5c5c",
|
|
525
|
+
math_expression = False,
|
|
526
|
+
parent = None
|
|
476
527
|
):
|
|
477
|
-
combo_box = QComboBox()
|
|
478
|
-
combo_box.
|
|
479
|
-
combo_box.addItems(items)
|
|
480
|
-
combo_box.setCurrentIndex(-1)
|
|
481
|
-
|
|
528
|
+
combo_box = QComboBox(parent)
|
|
529
|
+
combo_box.setAccessibleName("combo_box")
|
|
482
530
|
padding_left_value = padding_left if padding_left is not None else padding
|
|
483
531
|
padding_top_value = padding_top if padding_top is not None else padding
|
|
484
532
|
padding_right_value = padding_right if padding_right is not None else padding
|
|
485
533
|
padding_bottom_value = padding_bottom if padding_bottom is not None else padding
|
|
534
|
+
if math_expression:
|
|
535
|
+
placeholder_label = create_label(
|
|
536
|
+
text = placeholder_text,
|
|
537
|
+
font_family = font_family,
|
|
538
|
+
font_size = font_size,
|
|
539
|
+
font_color = placeholder_font_color,
|
|
540
|
+
padding = padding,
|
|
541
|
+
padding_left = padding_left,
|
|
542
|
+
padding_top = padding_top,
|
|
543
|
+
padding_right = padding_right,
|
|
544
|
+
padding_bottom = padding_bottom,
|
|
545
|
+
math_expression = True,
|
|
546
|
+
transparent_for_mouse = True,
|
|
547
|
+
parent = combo_box
|
|
548
|
+
)
|
|
549
|
+
placeholder_label.move(0, 2)
|
|
550
|
+
|
|
551
|
+
def update_placeholder_visibility():
|
|
552
|
+
has_selection = combo_box.currentIndex() != -1
|
|
553
|
+
placeholder_label.setVisible(not has_selection)
|
|
486
554
|
|
|
555
|
+
combo_box.currentIndexChanged.connect(update_placeholder_visibility)
|
|
556
|
+
update_placeholder_visibility()
|
|
557
|
+
|
|
558
|
+
class RichTextDelegate(QStyledItemDelegate):
|
|
559
|
+
def __init__(
|
|
560
|
+
self,
|
|
561
|
+
parent = None,
|
|
562
|
+
font_color = "#ffffff",
|
|
563
|
+
selection_font_color = "#ffffff"
|
|
564
|
+
):
|
|
565
|
+
super().__init__(parent)
|
|
566
|
+
self.font_color = font_color
|
|
567
|
+
self.selection_font_color = selection_font_color
|
|
568
|
+
|
|
569
|
+
def paint(self, painter, option, index):
|
|
570
|
+
if option.state & QStyle.StateFlag.State_Selected: text_color = self.selection_font_color
|
|
571
|
+
else: text_color = self.font_color
|
|
572
|
+
document = QTextDocument()
|
|
573
|
+
html = f"<span style = \"color:{text_color};\">{index.data(Qt.ItemDataRole.DisplayRole)}</span>"
|
|
574
|
+
document.setHtml(html)
|
|
575
|
+
option.text = ""
|
|
576
|
+
QApplication.style().drawControl(QStyle.ControlElement.CE_ItemViewItem, option, painter)
|
|
577
|
+
painter.save()
|
|
578
|
+
painter.translate(option.rect.left(), option.rect.top() + (option.rect.height() - document.size().height()) / 2)
|
|
579
|
+
document.drawContents(painter)
|
|
580
|
+
painter.restore()
|
|
581
|
+
|
|
582
|
+
delegate = RichTextDelegate(
|
|
583
|
+
parent = combo_box,
|
|
584
|
+
font_color = dropdown_font_color,
|
|
585
|
+
selection_font_color = font_color
|
|
586
|
+
)
|
|
587
|
+
combo_box.setItemDelegate(delegate)
|
|
588
|
+
combo_box.clear()
|
|
589
|
+
for item in items: combo_box.addItem(latex_to_html(item))
|
|
590
|
+
combo_box.view().setTextElideMode(Qt.TextElideMode.ElideNone)
|
|
591
|
+
else:
|
|
592
|
+
combo_box.setPlaceholderText(placeholder_text)
|
|
593
|
+
combo_box.addItems(items)
|
|
594
|
+
combo_box.setCurrentIndex(-1)
|
|
595
|
+
if math_expression:
|
|
596
|
+
selected_item_label = create_label(
|
|
597
|
+
text = "",
|
|
598
|
+
font_family = font_family,
|
|
599
|
+
font_size = font_size,
|
|
600
|
+
font_color = font_color,
|
|
601
|
+
padding = padding,
|
|
602
|
+
padding_left = padding_left,
|
|
603
|
+
padding_top = padding_top,
|
|
604
|
+
padding_right = padding_right,
|
|
605
|
+
padding_bottom = padding_bottom,
|
|
606
|
+
math_expression = True,
|
|
607
|
+
transparent_for_mouse = True,
|
|
608
|
+
alignment = Qt.AlignmentFlag.AlignCenter,
|
|
609
|
+
parent = combo_box
|
|
610
|
+
)
|
|
611
|
+
selected_item_label.setVisible(False)
|
|
612
|
+
|
|
613
|
+
def update_selected_item_display(index):
|
|
614
|
+
if index != -1:
|
|
615
|
+
html_text = combo_box.itemText(index)
|
|
616
|
+
selected_item_label.setText(html_text)
|
|
617
|
+
selected_item_label.setVisible(True)
|
|
618
|
+
else:
|
|
619
|
+
selected_item_label.setVisible(False)
|
|
620
|
+
|
|
621
|
+
combo_box.currentIndexChanged.connect(update_selected_item_display)
|
|
622
|
+
|
|
487
623
|
def get_stylesheet(font_color):
|
|
488
624
|
return f"""
|
|
489
|
-
QComboBox {{
|
|
625
|
+
QComboBox[accessibleName="combo_box"] {{
|
|
490
626
|
font-family: {font_family};
|
|
491
627
|
font-size: {font_size}px;
|
|
492
628
|
color: {font_color};
|
|
@@ -498,12 +634,12 @@ def create_combo_box(
|
|
|
498
634
|
border: {border_width}px solid {border_color};
|
|
499
635
|
border-radius: {border_radius}px;
|
|
500
636
|
}}
|
|
501
|
-
QComboBox:hover {{
|
|
637
|
+
QComboBox[accessibleName="combo_box"]:hover {{
|
|
502
638
|
background-color: {hover_background_color};
|
|
503
639
|
border: {hover_border_width}px solid {hover_border_color};
|
|
504
640
|
}}
|
|
505
|
-
QComboBox:on {{
|
|
506
|
-
color: {on_font_color};
|
|
641
|
+
QComboBox[accessibleName="combo_box"]:on {{
|
|
642
|
+
color: {"transparent" if math_expression else on_font_color};
|
|
507
643
|
background-color: {on_background_color};
|
|
508
644
|
border: {on_border_width}px solid {on_border_color};
|
|
509
645
|
}}
|
|
@@ -519,8 +655,12 @@ def create_combo_box(
|
|
|
519
655
|
"""
|
|
520
656
|
|
|
521
657
|
def change_color(index):
|
|
522
|
-
if index == -1:
|
|
523
|
-
|
|
658
|
+
if index == -1:
|
|
659
|
+
text_color = "transparent" if math_expression else placeholder_font_color
|
|
660
|
+
combo_box.setStyleSheet(get_stylesheet(text_color))
|
|
661
|
+
else:
|
|
662
|
+
text_color = "transparent" if math_expression else font_color
|
|
663
|
+
combo_box.setStyleSheet(get_stylesheet(text_color))
|
|
524
664
|
|
|
525
665
|
combo_box.currentIndexChanged.connect(change_color)
|
|
526
666
|
change_color(-1)
|
|
@@ -553,9 +693,10 @@ def create_checkbox(
|
|
|
553
693
|
disabled_font_color = "#888888",
|
|
554
694
|
disabled_background_color = "#2d2d2d",
|
|
555
695
|
disabled_border_width = 1,
|
|
556
|
-
disabled_border_color = "#4a4a4a"
|
|
696
|
+
disabled_border_color = "#4a4a4a",
|
|
697
|
+
parent = None
|
|
557
698
|
):
|
|
558
|
-
check_box = QCheckBox(text)
|
|
699
|
+
check_box = QCheckBox(text, parent)
|
|
559
700
|
padding_left_value = padding_left if padding_left is not None else padding
|
|
560
701
|
padding_top_value = padding_top if padding_top is not None else padding
|
|
561
702
|
padding_right_value = padding_right if padding_right is not None else padding
|
|
@@ -646,9 +787,10 @@ def create_information_message_box(
|
|
|
646
787
|
button_disabled_font_color = "#888888",
|
|
647
788
|
button_disabled_background_color = "#2d2d2d",
|
|
648
789
|
button_disabled_border_width = 2,
|
|
649
|
-
button_disabled_border_color = "#4a4a4a"
|
|
790
|
+
button_disabled_border_color = "#4a4a4a",
|
|
791
|
+
parent = None
|
|
650
792
|
):
|
|
651
|
-
message_box = QDialog()
|
|
793
|
+
message_box = QDialog(parent)
|
|
652
794
|
message_box.setObjectName("message_box")
|
|
653
795
|
message_box.setWindowFlags(Qt.WindowType.FramelessWindowHint)
|
|
654
796
|
message_box.setFixedWidth(360)
|
|
@@ -677,10 +819,10 @@ def create_information_message_box(
|
|
|
677
819
|
padding_bottom = label_padding_bottom,
|
|
678
820
|
border_width = label_border_width,
|
|
679
821
|
border_color = label_border_color,
|
|
680
|
-
border_radius = label_border_radius
|
|
822
|
+
border_radius = label_border_radius,
|
|
823
|
+
alignment = Qt.AlignmentFlag.AlignCenter
|
|
681
824
|
)
|
|
682
825
|
main_layout.addWidget(text_label)
|
|
683
|
-
text_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
|
684
826
|
text_label.setWordWrap(True)
|
|
685
827
|
accept_button = create_button(
|
|
686
828
|
text = button_text,
|
|
@@ -755,9 +897,10 @@ def create_confirmation_message_box(
|
|
|
755
897
|
button_disabled_font_color = "#888888",
|
|
756
898
|
button_disabled_background_color = "#2d2d2d",
|
|
757
899
|
button_disabled_border_width = 2,
|
|
758
|
-
button_disabled_border_color = "#4a4a4a"
|
|
900
|
+
button_disabled_border_color = "#4a4a4a",
|
|
901
|
+
parent = None
|
|
759
902
|
):
|
|
760
|
-
confirm_message_box = QDialog()
|
|
903
|
+
confirm_message_box = QDialog(parent)
|
|
761
904
|
confirm_message_box.setObjectName("confirm_message_box")
|
|
762
905
|
confirm_message_box.setWindowFlags(Qt.WindowType.FramelessWindowHint)
|
|
763
906
|
confirm_message_box.setFixedWidth(360)
|
|
@@ -786,10 +929,10 @@ def create_confirmation_message_box(
|
|
|
786
929
|
padding_bottom = label_padding_bottom,
|
|
787
930
|
border_width = label_border_width,
|
|
788
931
|
border_color = label_border_color,
|
|
789
|
-
border_radius = label_border_radius
|
|
932
|
+
border_radius = label_border_radius,
|
|
933
|
+
alignment = Qt.AlignmentFlag.AlignCenter
|
|
790
934
|
)
|
|
791
935
|
main_layout.addWidget(text_label)
|
|
792
|
-
text_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
|
793
936
|
text_label.setWordWrap(True)
|
|
794
937
|
buttons_layout = QHBoxLayout()
|
|
795
938
|
main_layout.addLayout(buttons_layout)
|
|
@@ -884,9 +1027,10 @@ def create_list_table(
|
|
|
884
1027
|
hover_scrollbar_handle_border_color = "#777777",
|
|
885
1028
|
pressed_scrollbar_handle_background_color = "#4a4a4a",
|
|
886
1029
|
pressed_scrollbar_handle_border_width = 3,
|
|
887
|
-
pressed_scrollbar_handle_border_color = "#0078d7"
|
|
1030
|
+
pressed_scrollbar_handle_border_color = "#0078d7",
|
|
1031
|
+
parent = None
|
|
888
1032
|
):
|
|
889
|
-
list_table = QTableWidget()
|
|
1033
|
+
list_table = QTableWidget(parent)
|
|
890
1034
|
list_table.verticalHeader().setVisible(False)
|
|
891
1035
|
list_table.setColumnCount(len(column_headers))
|
|
892
1036
|
list_table.setHorizontalHeaderLabels(column_headers)
|
|
@@ -1096,6 +1240,12 @@ def validate_integer(integer, suffix = "El", field = "campo"):
|
|
|
1096
1240
|
if pattern.match(unformatted_integer): return None
|
|
1097
1241
|
return f"No ha ingresado {"un" if suffix == "El" else "una"} {field} {"válido" if suffix == "El" else "válida"}."
|
|
1098
1242
|
|
|
1243
|
+
def validate_float(decimal, suffix = "El", field = "campo"):
|
|
1244
|
+
if not decimal or not decimal.strip(): return f"{suffix} {field} no puede dejarse {"vacío" if suffix == "El" else "vacía"}."
|
|
1245
|
+
pattern = re.compile(r"^-?\d{1,3}(?:\.\d{3})*(?:,\d+)?$|^-?\d+(?:,\d+)?$")
|
|
1246
|
+
if not pattern.match(decimal): return f"No ha ingresado {"un" if suffix == "El" else "una"} {field} {"válido" if suffix == "El" else "válida"}."
|
|
1247
|
+
return None
|
|
1248
|
+
|
|
1099
1249
|
def validate_id(id_str):
|
|
1100
1250
|
if not id_str or not id_str.strip(): return "El D.N.I. no puede dejarse vacio."
|
|
1101
1251
|
pattern = re.compile(r"^(?:\d{8}|(?:\d{1,2}\.\d{3}\.\d{3}))$")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|