gui-utilities 1.3.37__tar.gz → 1.3.53__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.
- {gui_utilities-1.3.37 → gui_utilities-1.3.53}/PKG-INFO +1 -1
- {gui_utilities-1.3.37 → gui_utilities-1.3.53}/gui_utilities/gui_utilities.py +244 -84
- {gui_utilities-1.3.37 → gui_utilities-1.3.53}/gui_utilities.egg-info/PKG-INFO +1 -1
- {gui_utilities-1.3.37 → gui_utilities-1.3.53}/pyproject.toml +1 -1
- {gui_utilities-1.3.37 → gui_utilities-1.3.53}/LICENSE +0 -0
- {gui_utilities-1.3.37 → gui_utilities-1.3.53}/README.md +0 -0
- {gui_utilities-1.3.37 → gui_utilities-1.3.53}/gui_utilities/icons/focused_hide_text_icon.png +0 -0
- {gui_utilities-1.3.37 → gui_utilities-1.3.53}/gui_utilities/icons/focused_show_text_icon.png +0 -0
- {gui_utilities-1.3.37 → gui_utilities-1.3.53}/gui_utilities/icons/hide_text_icon.png +0 -0
- {gui_utilities-1.3.37 → gui_utilities-1.3.53}/gui_utilities/icons/show_text_icon.png +0 -0
- {gui_utilities-1.3.37 → gui_utilities-1.3.53}/gui_utilities/tlds/tlds_list.txt +0 -0
- {gui_utilities-1.3.37 → gui_utilities-1.3.53}/gui_utilities.egg-info/SOURCES.txt +0 -0
- {gui_utilities-1.3.37 → gui_utilities-1.3.53}/gui_utilities.egg-info/dependency_links.txt +0 -0
- {gui_utilities-1.3.37 → gui_utilities-1.3.53}/gui_utilities.egg-info/requires.txt +0 -0
- {gui_utilities-1.3.37 → gui_utilities-1.3.53}/gui_utilities.egg-info/top_level.txt +0 -0
- {gui_utilities-1.3.37 → gui_utilities-1.3.53}/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,6 +417,7 @@ 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)
|
|
420
|
+
text_box.addAction(toggle_text_visibility_action, QLineEdit.ActionPosition.TrailingPosition)
|
|
414
421
|
toggle_text_visibility_button.setStyleSheet("""
|
|
415
422
|
QToolButton {
|
|
416
423
|
background-color: transparent;
|
|
@@ -418,8 +425,7 @@ def create_text_box(
|
|
|
418
425
|
margin-right: 10px;
|
|
419
426
|
}
|
|
420
427
|
""")
|
|
421
|
-
|
|
422
|
-
|
|
428
|
+
|
|
423
429
|
def update_icon():
|
|
424
430
|
is_password = text_box.echoMode() == QLineEdit.EchoMode.Password
|
|
425
431
|
if text_box.hasFocus(): icon = focused_hide_text_icon if is_password else focused_show_text_icon
|
|
@@ -433,16 +439,61 @@ def create_text_box(
|
|
|
433
439
|
|
|
434
440
|
toggle_text_visibility_button.clicked.connect(toggle_visibility)
|
|
435
441
|
|
|
436
|
-
class
|
|
442
|
+
class _IconFocusWatcher(QObject):
|
|
437
443
|
|
|
444
|
+
def __init__(self, watched, on_focus_change):
|
|
445
|
+
super().__init__(watched)
|
|
446
|
+
self._watched = watched
|
|
447
|
+
self._on_focus_change = on_focus_change
|
|
448
|
+
|
|
438
449
|
def eventFilter(self, watched, event):
|
|
439
|
-
if event.type() in (QEvent.Type.FocusIn, QEvent.Type.FocusOut):
|
|
450
|
+
if watched is self._watched and event.type() in (QEvent.Type.FocusIn, QEvent.Type.FocusOut):
|
|
451
|
+
if callable(self._on_focus_change): self._on_focus_change()
|
|
440
452
|
return super().eventFilter(watched, event)
|
|
441
453
|
|
|
442
|
-
|
|
443
|
-
text_box.installEventFilter(
|
|
444
|
-
setattr(text_box, "
|
|
445
|
-
|
|
454
|
+
icon_focus_watcher = _IconFocusWatcher(text_box, update_icon)
|
|
455
|
+
text_box.installEventFilter(icon_focus_watcher)
|
|
456
|
+
setattr(text_box, "_icon_focus_watcher", icon_focus_watcher)
|
|
457
|
+
|
|
458
|
+
placeholder_label = create_label(
|
|
459
|
+
text = placeholder_text,
|
|
460
|
+
font_family = font_family,
|
|
461
|
+
font_size = font_size,
|
|
462
|
+
font_color = placeholder_font_color,
|
|
463
|
+
font_weight = font_weight,
|
|
464
|
+
padding = padding,
|
|
465
|
+
padding_left = padding_left,
|
|
466
|
+
padding_top = padding_top,
|
|
467
|
+
padding_right = padding_right,
|
|
468
|
+
padding_bottom = padding_bottom,
|
|
469
|
+
math_expression = math_expression,
|
|
470
|
+
transparent_for_mouse = True,
|
|
471
|
+
parent = text_box
|
|
472
|
+
)
|
|
473
|
+
placeholder_label.move(0, 2)
|
|
474
|
+
|
|
475
|
+
def update_placeholder_visibility():
|
|
476
|
+
has_text = bool(text_box.text().strip())
|
|
477
|
+
has_focus = text_box.hasFocus()
|
|
478
|
+
placeholder_label.setVisible(not has_text and not has_focus)
|
|
479
|
+
if hide_text: update_icon()
|
|
480
|
+
|
|
481
|
+
class _PlaceholderFocusWatcher(QObject):
|
|
482
|
+
|
|
483
|
+
def __init__(self, watched, on_focus_change):
|
|
484
|
+
super().__init__(watched)
|
|
485
|
+
self._watched = watched
|
|
486
|
+
self._on_focus_change = on_focus_change
|
|
487
|
+
|
|
488
|
+
def eventFilter(self, watched, event):
|
|
489
|
+
if watched is self._watched and event.type() in (QEvent.Type.FocusIn, QEvent.Type.FocusOut):
|
|
490
|
+
if callable(self._on_focus_change): self._on_focus_change()
|
|
491
|
+
return super().eventFilter(watched, event)
|
|
492
|
+
|
|
493
|
+
placeholder_focus_watcher = _PlaceholderFocusWatcher(text_box, update_placeholder_visibility)
|
|
494
|
+
text_box.installEventFilter(placeholder_focus_watcher)
|
|
495
|
+
setattr(text_box, "_placeholder_focus_watcher", placeholder_focus_watcher)
|
|
496
|
+
update_placeholder_visibility()
|
|
446
497
|
return text_box
|
|
447
498
|
|
|
448
499
|
def create_combo_box(
|
|
@@ -472,21 +523,108 @@ def create_combo_box(
|
|
|
472
523
|
dropdown_background_color = "#1e1e1e",
|
|
473
524
|
dropdown_selection_background_color = "#0078d7",
|
|
474
525
|
dropdown_border_width = 1,
|
|
475
|
-
dropdown_border_color = "#5c5c5c"
|
|
526
|
+
dropdown_border_color = "#5c5c5c",
|
|
527
|
+
math_expression = False,
|
|
528
|
+
parent = None
|
|
476
529
|
):
|
|
477
|
-
combo_box = QComboBox()
|
|
478
|
-
combo_box.
|
|
479
|
-
combo_box.addItems(items)
|
|
480
|
-
combo_box.setCurrentIndex(-1)
|
|
481
|
-
|
|
530
|
+
combo_box = QComboBox(parent)
|
|
531
|
+
combo_box.setAccessibleName("combo_box")
|
|
482
532
|
padding_left_value = padding_left if padding_left is not None else padding
|
|
483
533
|
padding_top_value = padding_top if padding_top is not None else padding
|
|
484
534
|
padding_right_value = padding_right if padding_right is not None else padding
|
|
485
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()
|
|
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
|
|
486
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
|
+
|
|
487
625
|
def get_stylesheet(font_color):
|
|
488
626
|
return f"""
|
|
489
|
-
QComboBox {{
|
|
627
|
+
QComboBox[accessibleName="combo_box"] {{
|
|
490
628
|
font-family: {font_family};
|
|
491
629
|
font-size: {font_size}px;
|
|
492
630
|
color: {font_color};
|
|
@@ -498,12 +636,12 @@ def create_combo_box(
|
|
|
498
636
|
border: {border_width}px solid {border_color};
|
|
499
637
|
border-radius: {border_radius}px;
|
|
500
638
|
}}
|
|
501
|
-
QComboBox:hover {{
|
|
639
|
+
QComboBox[accessibleName="combo_box"]:hover {{
|
|
502
640
|
background-color: {hover_background_color};
|
|
503
641
|
border: {hover_border_width}px solid {hover_border_color};
|
|
504
642
|
}}
|
|
505
|
-
QComboBox:on {{
|
|
506
|
-
color: {on_font_color};
|
|
643
|
+
QComboBox[accessibleName="combo_box"]:on {{
|
|
644
|
+
color: {"transparent" if math_expression else on_font_color};
|
|
507
645
|
background-color: {on_background_color};
|
|
508
646
|
border: {on_border_width}px solid {on_border_color};
|
|
509
647
|
}}
|
|
@@ -519,8 +657,12 @@ def create_combo_box(
|
|
|
519
657
|
"""
|
|
520
658
|
|
|
521
659
|
def change_color(index):
|
|
522
|
-
if index == -1:
|
|
523
|
-
|
|
660
|
+
if index == -1:
|
|
661
|
+
text_color = "transparent" if math_expression else placeholder_font_color
|
|
662
|
+
combo_box.setStyleSheet(get_stylesheet(text_color))
|
|
663
|
+
else:
|
|
664
|
+
text_color = "transparent" if math_expression else font_color
|
|
665
|
+
combo_box.setStyleSheet(get_stylesheet(text_color))
|
|
524
666
|
|
|
525
667
|
combo_box.currentIndexChanged.connect(change_color)
|
|
526
668
|
change_color(-1)
|
|
@@ -553,9 +695,10 @@ def create_checkbox(
|
|
|
553
695
|
disabled_font_color = "#888888",
|
|
554
696
|
disabled_background_color = "#2d2d2d",
|
|
555
697
|
disabled_border_width = 1,
|
|
556
|
-
disabled_border_color = "#4a4a4a"
|
|
698
|
+
disabled_border_color = "#4a4a4a",
|
|
699
|
+
parent = None
|
|
557
700
|
):
|
|
558
|
-
check_box = QCheckBox(text)
|
|
701
|
+
check_box = QCheckBox(text, parent)
|
|
559
702
|
padding_left_value = padding_left if padding_left is not None else padding
|
|
560
703
|
padding_top_value = padding_top if padding_top is not None else padding
|
|
561
704
|
padding_right_value = padding_right if padding_right is not None else padding
|
|
@@ -646,9 +789,10 @@ def create_information_message_box(
|
|
|
646
789
|
button_disabled_font_color = "#888888",
|
|
647
790
|
button_disabled_background_color = "#2d2d2d",
|
|
648
791
|
button_disabled_border_width = 2,
|
|
649
|
-
button_disabled_border_color = "#4a4a4a"
|
|
792
|
+
button_disabled_border_color = "#4a4a4a",
|
|
793
|
+
parent = None
|
|
650
794
|
):
|
|
651
|
-
message_box = QDialog()
|
|
795
|
+
message_box = QDialog(parent)
|
|
652
796
|
message_box.setObjectName("message_box")
|
|
653
797
|
message_box.setWindowFlags(Qt.WindowType.FramelessWindowHint)
|
|
654
798
|
message_box.setFixedWidth(360)
|
|
@@ -677,10 +821,10 @@ def create_information_message_box(
|
|
|
677
821
|
padding_bottom = label_padding_bottom,
|
|
678
822
|
border_width = label_border_width,
|
|
679
823
|
border_color = label_border_color,
|
|
680
|
-
border_radius = label_border_radius
|
|
824
|
+
border_radius = label_border_radius,
|
|
825
|
+
alignment = Qt.AlignmentFlag.AlignCenter
|
|
681
826
|
)
|
|
682
827
|
main_layout.addWidget(text_label)
|
|
683
|
-
text_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
|
684
828
|
text_label.setWordWrap(True)
|
|
685
829
|
accept_button = create_button(
|
|
686
830
|
text = button_text,
|
|
@@ -755,9 +899,10 @@ def create_confirmation_message_box(
|
|
|
755
899
|
button_disabled_font_color = "#888888",
|
|
756
900
|
button_disabled_background_color = "#2d2d2d",
|
|
757
901
|
button_disabled_border_width = 2,
|
|
758
|
-
button_disabled_border_color = "#4a4a4a"
|
|
902
|
+
button_disabled_border_color = "#4a4a4a",
|
|
903
|
+
parent = None
|
|
759
904
|
):
|
|
760
|
-
confirm_message_box = QDialog()
|
|
905
|
+
confirm_message_box = QDialog(parent)
|
|
761
906
|
confirm_message_box.setObjectName("confirm_message_box")
|
|
762
907
|
confirm_message_box.setWindowFlags(Qt.WindowType.FramelessWindowHint)
|
|
763
908
|
confirm_message_box.setFixedWidth(360)
|
|
@@ -786,10 +931,10 @@ def create_confirmation_message_box(
|
|
|
786
931
|
padding_bottom = label_padding_bottom,
|
|
787
932
|
border_width = label_border_width,
|
|
788
933
|
border_color = label_border_color,
|
|
789
|
-
border_radius = label_border_radius
|
|
934
|
+
border_radius = label_border_radius,
|
|
935
|
+
alignment = Qt.AlignmentFlag.AlignCenter
|
|
790
936
|
)
|
|
791
937
|
main_layout.addWidget(text_label)
|
|
792
|
-
text_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
|
793
938
|
text_label.setWordWrap(True)
|
|
794
939
|
buttons_layout = QHBoxLayout()
|
|
795
940
|
main_layout.addLayout(buttons_layout)
|
|
@@ -884,9 +1029,10 @@ def create_list_table(
|
|
|
884
1029
|
hover_scrollbar_handle_border_color = "#777777",
|
|
885
1030
|
pressed_scrollbar_handle_background_color = "#4a4a4a",
|
|
886
1031
|
pressed_scrollbar_handle_border_width = 3,
|
|
887
|
-
pressed_scrollbar_handle_border_color = "#0078d7"
|
|
1032
|
+
pressed_scrollbar_handle_border_color = "#0078d7",
|
|
1033
|
+
parent = None
|
|
888
1034
|
):
|
|
889
|
-
list_table = QTableWidget()
|
|
1035
|
+
list_table = QTableWidget(parent)
|
|
890
1036
|
list_table.verticalHeader().setVisible(False)
|
|
891
1037
|
list_table.setColumnCount(len(column_headers))
|
|
892
1038
|
list_table.setHorizontalHeaderLabels(column_headers)
|
|
@@ -1096,6 +1242,15 @@ def validate_integer(integer, suffix = "El", field = "campo"):
|
|
|
1096
1242
|
if pattern.match(unformatted_integer): return None
|
|
1097
1243
|
return f"No ha ingresado {"un" if suffix == "El" else "una"} {field} {"válido" if suffix == "El" else "válida"}."
|
|
1098
1244
|
|
|
1245
|
+
def validate_float(number_str, suffix = "El", field = "campo"):
|
|
1246
|
+
if not number_str or not number_str.strip():
|
|
1247
|
+
return f"{suffix} {field} no puede dejarse {"vacío" if suffix == "El" else "vacía"}."
|
|
1248
|
+
try:
|
|
1249
|
+
float(number_str.replace(",", "."))
|
|
1250
|
+
return None
|
|
1251
|
+
except ValueError:
|
|
1252
|
+
return f"No ha ingresado {"un" if suffix == "El" else "una"} {field} {"válido" if suffix == "El" else "válida"}."
|
|
1253
|
+
|
|
1099
1254
|
def validate_id(id_str):
|
|
1100
1255
|
if not id_str or not id_str.strip(): return "El D.N.I. no puede dejarse vacio."
|
|
1101
1256
|
pattern = re.compile(r"^(?:\d{8}|(?:\d{1,2}\.\d{3}\.\d{3}))$")
|
|
@@ -1154,9 +1309,14 @@ def validate_email(email):
|
|
|
1154
1309
|
if email_pattern.match(email): return None
|
|
1155
1310
|
return "No ha ingresado un correo electrónico válido."
|
|
1156
1311
|
|
|
1157
|
-
def decimal_format(number):
|
|
1158
|
-
if isinstance(number,
|
|
1159
|
-
|
|
1312
|
+
def decimal_format(number, decimal_places = None):
|
|
1313
|
+
if isinstance(number, int):
|
|
1314
|
+
return f"{number:,}".replace(",", "X").replace(".", ",").replace("X", ".")
|
|
1315
|
+
elif isinstance(number, float):
|
|
1316
|
+
if not decimal_places: formatted_str = f"{number:,}"
|
|
1317
|
+
else: formatted_str = f"{number:,.{decimal_places}f}"
|
|
1318
|
+
return formatted_str.replace(",", "X").replace(".", ",").replace("X", ".")
|
|
1319
|
+
return str(number)
|
|
1160
1320
|
|
|
1161
1321
|
def format_id(id_string):
|
|
1162
1322
|
clean_id = id_string.replace(".", "")
|
|
File without changes
|
|
File without changes
|
{gui_utilities-1.3.37 → gui_utilities-1.3.53}/gui_utilities/icons/focused_hide_text_icon.png
RENAMED
|
File without changes
|
{gui_utilities-1.3.37 → gui_utilities-1.3.53}/gui_utilities/icons/focused_show_text_icon.png
RENAMED
|
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
|