sli-ui-toolkit 0.2.7__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.
- sli_ui_toolkit-0.2.7/PKG-INFO +156 -0
- sli_ui_toolkit-0.2.7/README.md +140 -0
- sli_ui_toolkit-0.2.7/pyproject.toml +38 -0
- sli_ui_toolkit-0.2.7/setup.cfg +4 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/__init__.py +72 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/_version.py +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/config.py +63 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/core/__init__.py +7 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/core/logging.py +99 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/i18n.py +253 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/icons.py +56 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/managers.py +13 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/palettes.py +176 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/add.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/add_circle.svg +5 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/calendar.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/chart.svg +5 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/check.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/chevron-down.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/delete.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/download.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/edit.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/folder_open.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/help.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/incognito.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/photo.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/quick_save.svg +55 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/remove.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/save.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/settings.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/sync.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/dark/text-manipulator.svg +76 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/add.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/add_circle.svg +5 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/calendar.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/chart.svg +5 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/check.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/chevron-down.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/delete.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/download.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/edit.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/folder_open.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/help.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/incognito.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/photo.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/quick_save.svg +16 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/remove.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/save.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/settings.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/sync.svg +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/resources/assets/icons/light/text-manipulator.svg +76 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/services.py +12 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/style.py +20 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/theme.py +4 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/__init__.py +2 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/dialogs/__init__.py +13 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/dialogs/dialog_helpers.py +115 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/in_window_surface.py +205 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/managers/__init__.py +13 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/managers/flyout_manager.py +259 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/managers/flyout_timer_service.py +102 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/managers/icon_manager.py +44 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/managers/theme_manager.py +220 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/services/__init__.py +19 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/services/dragdrop_service.py +213 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/services/icon_service.py +100 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/services/window_prewarm.py +47 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/__init__.py +2 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/__init__.py +57 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/checkbox.py +344 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/combobox.py +5 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/comboboxes.py +5 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/custom_group_widget.py +148 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/custom_line_edit.py +218 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/drop_zone_label.py +147 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/instances_counter_button.py +256 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/loading_spinner.py +59 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/minimalist_scrollbar.py +270 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/radio.py +244 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/slider.py +227 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/spinbox.py +132 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/switch.py +301 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/text_labels.py +350 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/time_line_edit.py +377 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/atomic/tooltips.py +311 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/__init__.py +4 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/_dropdown_menu.py +307 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/button.py +811 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/button_group.py +97 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/capabilities/__init__.py +17 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/capabilities/base.py +27 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/capabilities/long_press.py +61 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/capabilities/menu.py +57 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/capabilities/scroll.py +203 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/content.py +255 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/context.py +41 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/layers/__init__.py +18 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/layers/_base.py +17 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/layers/background.py +87 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/layers/badge.py +107 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/layers/content.py +16 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/layers/strikethrough.py +22 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/layers/underline.py +81 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/painter.py +132 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/state.py +17 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/buttons/variants.py +178 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/comboboxes/__init__.py +4 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/comboboxes/_models.py +15 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/comboboxes/_overlay.py +323 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/comboboxes/_search.py +78 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/comboboxes/combo_box.py +671 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/comboboxes/scrollable_combobox.py +261 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/__init__.py +103 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/base_flyout.py +407 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/calendar_widget/__init__.py +21 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/calendar_widget/day_button.py +128 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/calendar_widget/models.py +94 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/calendar_widget/widget.py +574 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/color_swatch.py +79 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/dialog_shell.py +64 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/drag_ghost_widget.py +45 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/help_sections.py +83 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/icon_action_flyout.py +185 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/indexed_toggle_flyout.py +120 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/log_console_widget.py +204 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/markdown_help_dialog.py +527 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/preview_panel.py +115 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/process_console_widget.py +250 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/sidebar_nav_list.py +105 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/simple_options_flyout.py +429 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/sunburst_chart/__init__.py +17 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/sunburst_chart/chart_widget.py +205 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/sunburst_chart/models.py +23 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/sunburst_chart/segment_item.py +115 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/timeline_widget/__init__.py +11 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/timeline_widget/i18n.py +28 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/timeline_widget/interaction.py +171 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/timeline_widget/layout.py +553 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/timeline_widget/models.py +72 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/timeline_widget/primitives.py +161 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/timeline_widget/render.py +704 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/timeline_widget/theme.py +137 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/timeline_widget/viewport.py +397 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/timeline_widget/widget.py +503 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/toast.py +498 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/__init__.py +109 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/bootstrap.py +157 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/common.py +32 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/content.py +48 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/delegate.py +362 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/dragdrop.py +43 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/layout.py +462 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/model.py +120 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/overlay_list_view.py +122 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/panel.py +622 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/refresh.py +121 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/session.py +116 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/simple_adapter.py +139 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/composite/unified_flyout/style.py +100 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/helpers/__init__.py +31 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/helpers/editable_text.py +41 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/helpers/hover_coordinator.py +131 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/helpers/icon_pixmap.py +111 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/helpers/overlay_geometry.py +52 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/helpers/shadow_painter.py +20 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/helpers/underline_painter.py +151 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/helpers/wheel_scroll_policy.py +41 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/list_items/__init__.py +4 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/list_items/editable_list_item.py +64 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/list_items/rating_item.py +450 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/overlays/__init__.py +4 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/overlays/drag_drop_overlay.py +131 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/overlays/paste_direction_overlay.py +276 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/ui/widgets/style_bridge.py +129 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/utils/__init__.py +4 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/utils/file_utils.py +28 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/utils/paths.py +12 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/widgets.py +151 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/workers/__init__.py +3 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit/workers/generic_worker.py +48 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit.egg-info/PKG-INFO +156 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit.egg-info/SOURCES.txt +194 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit.egg-info/dependency_links.txt +1 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit.egg-info/requires.txt +6 -0
- sli_ui_toolkit-0.2.7/src/sli_ui_toolkit.egg-info/top_level.txt +1 -0
- sli_ui_toolkit-0.2.7/tests/test_button_custom_bg.py +67 -0
- sli_ui_toolkit-0.2.7/tests/test_button_underline.py +61 -0
- sli_ui_toolkit-0.2.7/tests/test_contrast.py +106 -0
- sli_ui_toolkit-0.2.7/tests/test_hover_coordinator.py +44 -0
- sli_ui_toolkit-0.2.7/tests/test_i18n.py +28 -0
- sli_ui_toolkit-0.2.7/tests/test_icons.py +22 -0
- sli_ui_toolkit-0.2.7/tests/test_keyboard.py +131 -0
- sli_ui_toolkit-0.2.7/tests/test_public_api.py +40 -0
- sli_ui_toolkit-0.2.7/tests/test_theme.py +27 -0
- sli_ui_toolkit-0.2.7/tests/test_version.py +14 -0
- sli_ui_toolkit-0.2.7/tests/test_widgets_smoke.py +51 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: sli-ui-toolkit
|
|
3
|
+
Version: 0.2.7
|
|
4
|
+
Summary: Reusable PyQt UI toolkit primitives for SLI desktop tools.
|
|
5
|
+
Author: Loganavter
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Repository, https://github.com/Loganavter/sli-ui-toolkit
|
|
8
|
+
Project-URL: Issues, https://github.com/Loganavter/sli-ui-toolkit/issues
|
|
9
|
+
Requires-Python: >=3.10
|
|
10
|
+
Description-Content-Type: text/markdown
|
|
11
|
+
Requires-Dist: PyQt6>=6.6
|
|
12
|
+
Requires-Dist: markdown>=3.4
|
|
13
|
+
Provides-Extra: dev
|
|
14
|
+
Requires-Dist: pytest>=7; extra == "dev"
|
|
15
|
+
Requires-Dist: pytest-qt>=4.2; extra == "dev"
|
|
16
|
+
|
|
17
|
+
# SLI UI Toolkit
|
|
18
|
+
|
|
19
|
+
`sli-ui-toolkit` is a reusable PyQt6 widget and UI-support library.
|
|
20
|
+
SLI stands for **Shared Lightweight Interface**.
|
|
21
|
+
|
|
22
|
+
It was extracted from two production apps, Improve-ImgSLI and Tkonverter.
|
|
23
|
+
That history is still visible in some widget choices and naming, but the
|
|
24
|
+
package is maintained as a general-purpose toolkit: host-specific behavior is
|
|
25
|
+
kept outside the library and injected through configuration hooks.
|
|
26
|
+
|
|
27
|
+
Use it when you want:
|
|
28
|
+
|
|
29
|
+
- custom-painted compact controls;
|
|
30
|
+
- a unified button system;
|
|
31
|
+
- theme-aware widgets and flyouts;
|
|
32
|
+
- app-injected icons, translations, and overlay behavior.
|
|
33
|
+
|
|
34
|
+
## Start Here
|
|
35
|
+
|
|
36
|
+
This file is the integration entry point, not the full reference.
|
|
37
|
+
|
|
38
|
+
- Full public API: [docs/API_CATALOG.md](docs/API_CATALOG.md)
|
|
39
|
+
- Internal structure: [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)
|
|
40
|
+
- Visual conventions: [docs/DESIGN_LANGUAGE.md](docs/DESIGN_LANGUAGE.md)
|
|
41
|
+
- Docs index: [docs/README.md](docs/README.md)
|
|
42
|
+
|
|
43
|
+
## Import Layers
|
|
44
|
+
|
|
45
|
+
Use these import layers on purpose:
|
|
46
|
+
|
|
47
|
+
- `sli_ui_toolkit`
|
|
48
|
+
Small top-level bootstrap surface.
|
|
49
|
+
- `sli_ui_toolkit.widgets`
|
|
50
|
+
Main public widget catalog.
|
|
51
|
+
- `sli_ui_toolkit.i18n`
|
|
52
|
+
Translation manager and helpers.
|
|
53
|
+
- `sli_ui_toolkit.icons`
|
|
54
|
+
Icon resolver configuration.
|
|
55
|
+
- `sli_ui_toolkit.theme`
|
|
56
|
+
Theme manager.
|
|
57
|
+
- `sli_ui_toolkit.managers`
|
|
58
|
+
Flyout and timer helpers.
|
|
59
|
+
- `sli_ui_toolkit.services`
|
|
60
|
+
Utility services such as prewarm helpers.
|
|
61
|
+
|
|
62
|
+
If you are building app UI, most of the time you want `sli_ui_toolkit.widgets`.
|
|
63
|
+
|
|
64
|
+
## Configuration Hooks
|
|
65
|
+
|
|
66
|
+
App-specific behavior is injected at startup:
|
|
67
|
+
|
|
68
|
+
- `configure_icon_resolver(...)`
|
|
69
|
+
- `configure_toolkit(...)`
|
|
70
|
+
- `configure_i18n(...)`
|
|
71
|
+
|
|
72
|
+
These hooks keep the toolkit reusable while letting the host app supply:
|
|
73
|
+
|
|
74
|
+
- icon lookup;
|
|
75
|
+
- translation roots;
|
|
76
|
+
- overlay-layer resolution;
|
|
77
|
+
- timing constants.
|
|
78
|
+
|
|
79
|
+
## Quick Start
|
|
80
|
+
|
|
81
|
+
```python
|
|
82
|
+
from pathlib import Path
|
|
83
|
+
|
|
84
|
+
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout
|
|
85
|
+
|
|
86
|
+
from sli_ui_toolkit import FlyoutTimingConfig, configure_i18n, configure_toolkit
|
|
87
|
+
from sli_ui_toolkit.icons import configure_icon_resolver
|
|
88
|
+
from sli_ui_toolkit.theme import ThemeManager
|
|
89
|
+
from sli_ui_toolkit.widgets import Button, ComboBox, install_application_tooltips
|
|
90
|
+
|
|
91
|
+
app = QApplication([])
|
|
92
|
+
|
|
93
|
+
theme = ThemeManager.get_instance()
|
|
94
|
+
theme.register_palettes(light_palette={...}, dark_palette={...})
|
|
95
|
+
theme.register_qss_path(str(Path("resources/qss/app.qss")))
|
|
96
|
+
theme.set_theme("light", app)
|
|
97
|
+
|
|
98
|
+
configure_icon_resolver(resolver=my_icon_lookup)
|
|
99
|
+
|
|
100
|
+
configure_toolkit(
|
|
101
|
+
timings=FlyoutTimingConfig(
|
|
102
|
+
transient_auto_hide_delay_ms=300,
|
|
103
|
+
flyout_animation_duration_ms=150,
|
|
104
|
+
text_settings_flyout_animation_duration_ms=150,
|
|
105
|
+
),
|
|
106
|
+
overlay_resolver=lambda widget: getattr(widget.window(), "overlay_layer", None),
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
configure_i18n(i18n_root=Path("resources/i18n"))
|
|
110
|
+
install_application_tooltips(app)
|
|
111
|
+
|
|
112
|
+
window = QWidget()
|
|
113
|
+
layout = QVBoxLayout(window)
|
|
114
|
+
|
|
115
|
+
save_button = Button("save", text="Save", variant="primary")
|
|
116
|
+
mode_combo = ComboBox()
|
|
117
|
+
mode_combo.addItems(["Fast", "Balanced", "Quality"])
|
|
118
|
+
|
|
119
|
+
layout.addWidget(save_button)
|
|
120
|
+
layout.addWidget(mode_combo)
|
|
121
|
+
window.show()
|
|
122
|
+
|
|
123
|
+
app.exec()
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Flyouts, button dropdown menus, and similar in-window surfaces use
|
|
127
|
+
`overlay_resolver` when a host app provides an overlay layer. The resolved
|
|
128
|
+
object should expose `host`, `attach(widget)`, `anchor_rect(anchor)`, and
|
|
129
|
+
`clamp_rect(rect, margin=...)`. If no overlay layer is resolved, button dropdown
|
|
130
|
+
menus fall back to the top-level window and position themselves in window
|
|
131
|
+
coordinates. Menu surfaces are painted from `flyout.background` /
|
|
132
|
+
`flyout.border`; individual rows only use `list_item.background.hover` for the
|
|
133
|
+
hovered or current item.
|
|
134
|
+
|
|
135
|
+
## First Widgets To Reach For
|
|
136
|
+
|
|
137
|
+
- `Button`
|
|
138
|
+
Unified icon/text/toggle/menu/scrollable button system.
|
|
139
|
+
- `ComboBox`
|
|
140
|
+
Custom-painted combo box with popup, search, and keyboard navigation.
|
|
141
|
+
- `CustomLineEdit`
|
|
142
|
+
Themed editable text field.
|
|
143
|
+
- `SidebarDialogShell`
|
|
144
|
+
Settings/help style dialog shell.
|
|
145
|
+
- `ScrollableDialogPage`
|
|
146
|
+
Scrollable dialog page container.
|
|
147
|
+
- `MarkdownHelpDialog`
|
|
148
|
+
Reusable markdown help/documentation dialog.
|
|
149
|
+
|
|
150
|
+
Usage details live in [docs/API_CATALOG.md](docs/API_CATALOG.md).
|
|
151
|
+
|
|
152
|
+
## Notes
|
|
153
|
+
|
|
154
|
+
- `ComboBox` is a custom widget, not a full `QComboBox` drop-in replacement.
|
|
155
|
+
- The toolkit is designed around custom-painted controls, not QSS-skinned stock widgets.
|
|
156
|
+
- App-specific icons and translations should stay outside the toolkit and be injected through configuration.
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# SLI UI Toolkit
|
|
2
|
+
|
|
3
|
+
`sli-ui-toolkit` is a reusable PyQt6 widget and UI-support library.
|
|
4
|
+
SLI stands for **Shared Lightweight Interface**.
|
|
5
|
+
|
|
6
|
+
It was extracted from two production apps, Improve-ImgSLI and Tkonverter.
|
|
7
|
+
That history is still visible in some widget choices and naming, but the
|
|
8
|
+
package is maintained as a general-purpose toolkit: host-specific behavior is
|
|
9
|
+
kept outside the library and injected through configuration hooks.
|
|
10
|
+
|
|
11
|
+
Use it when you want:
|
|
12
|
+
|
|
13
|
+
- custom-painted compact controls;
|
|
14
|
+
- a unified button system;
|
|
15
|
+
- theme-aware widgets and flyouts;
|
|
16
|
+
- app-injected icons, translations, and overlay behavior.
|
|
17
|
+
|
|
18
|
+
## Start Here
|
|
19
|
+
|
|
20
|
+
This file is the integration entry point, not the full reference.
|
|
21
|
+
|
|
22
|
+
- Full public API: [docs/API_CATALOG.md](docs/API_CATALOG.md)
|
|
23
|
+
- Internal structure: [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)
|
|
24
|
+
- Visual conventions: [docs/DESIGN_LANGUAGE.md](docs/DESIGN_LANGUAGE.md)
|
|
25
|
+
- Docs index: [docs/README.md](docs/README.md)
|
|
26
|
+
|
|
27
|
+
## Import Layers
|
|
28
|
+
|
|
29
|
+
Use these import layers on purpose:
|
|
30
|
+
|
|
31
|
+
- `sli_ui_toolkit`
|
|
32
|
+
Small top-level bootstrap surface.
|
|
33
|
+
- `sli_ui_toolkit.widgets`
|
|
34
|
+
Main public widget catalog.
|
|
35
|
+
- `sli_ui_toolkit.i18n`
|
|
36
|
+
Translation manager and helpers.
|
|
37
|
+
- `sli_ui_toolkit.icons`
|
|
38
|
+
Icon resolver configuration.
|
|
39
|
+
- `sli_ui_toolkit.theme`
|
|
40
|
+
Theme manager.
|
|
41
|
+
- `sli_ui_toolkit.managers`
|
|
42
|
+
Flyout and timer helpers.
|
|
43
|
+
- `sli_ui_toolkit.services`
|
|
44
|
+
Utility services such as prewarm helpers.
|
|
45
|
+
|
|
46
|
+
If you are building app UI, most of the time you want `sli_ui_toolkit.widgets`.
|
|
47
|
+
|
|
48
|
+
## Configuration Hooks
|
|
49
|
+
|
|
50
|
+
App-specific behavior is injected at startup:
|
|
51
|
+
|
|
52
|
+
- `configure_icon_resolver(...)`
|
|
53
|
+
- `configure_toolkit(...)`
|
|
54
|
+
- `configure_i18n(...)`
|
|
55
|
+
|
|
56
|
+
These hooks keep the toolkit reusable while letting the host app supply:
|
|
57
|
+
|
|
58
|
+
- icon lookup;
|
|
59
|
+
- translation roots;
|
|
60
|
+
- overlay-layer resolution;
|
|
61
|
+
- timing constants.
|
|
62
|
+
|
|
63
|
+
## Quick Start
|
|
64
|
+
|
|
65
|
+
```python
|
|
66
|
+
from pathlib import Path
|
|
67
|
+
|
|
68
|
+
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout
|
|
69
|
+
|
|
70
|
+
from sli_ui_toolkit import FlyoutTimingConfig, configure_i18n, configure_toolkit
|
|
71
|
+
from sli_ui_toolkit.icons import configure_icon_resolver
|
|
72
|
+
from sli_ui_toolkit.theme import ThemeManager
|
|
73
|
+
from sli_ui_toolkit.widgets import Button, ComboBox, install_application_tooltips
|
|
74
|
+
|
|
75
|
+
app = QApplication([])
|
|
76
|
+
|
|
77
|
+
theme = ThemeManager.get_instance()
|
|
78
|
+
theme.register_palettes(light_palette={...}, dark_palette={...})
|
|
79
|
+
theme.register_qss_path(str(Path("resources/qss/app.qss")))
|
|
80
|
+
theme.set_theme("light", app)
|
|
81
|
+
|
|
82
|
+
configure_icon_resolver(resolver=my_icon_lookup)
|
|
83
|
+
|
|
84
|
+
configure_toolkit(
|
|
85
|
+
timings=FlyoutTimingConfig(
|
|
86
|
+
transient_auto_hide_delay_ms=300,
|
|
87
|
+
flyout_animation_duration_ms=150,
|
|
88
|
+
text_settings_flyout_animation_duration_ms=150,
|
|
89
|
+
),
|
|
90
|
+
overlay_resolver=lambda widget: getattr(widget.window(), "overlay_layer", None),
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
configure_i18n(i18n_root=Path("resources/i18n"))
|
|
94
|
+
install_application_tooltips(app)
|
|
95
|
+
|
|
96
|
+
window = QWidget()
|
|
97
|
+
layout = QVBoxLayout(window)
|
|
98
|
+
|
|
99
|
+
save_button = Button("save", text="Save", variant="primary")
|
|
100
|
+
mode_combo = ComboBox()
|
|
101
|
+
mode_combo.addItems(["Fast", "Balanced", "Quality"])
|
|
102
|
+
|
|
103
|
+
layout.addWidget(save_button)
|
|
104
|
+
layout.addWidget(mode_combo)
|
|
105
|
+
window.show()
|
|
106
|
+
|
|
107
|
+
app.exec()
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Flyouts, button dropdown menus, and similar in-window surfaces use
|
|
111
|
+
`overlay_resolver` when a host app provides an overlay layer. The resolved
|
|
112
|
+
object should expose `host`, `attach(widget)`, `anchor_rect(anchor)`, and
|
|
113
|
+
`clamp_rect(rect, margin=...)`. If no overlay layer is resolved, button dropdown
|
|
114
|
+
menus fall back to the top-level window and position themselves in window
|
|
115
|
+
coordinates. Menu surfaces are painted from `flyout.background` /
|
|
116
|
+
`flyout.border`; individual rows only use `list_item.background.hover` for the
|
|
117
|
+
hovered or current item.
|
|
118
|
+
|
|
119
|
+
## First Widgets To Reach For
|
|
120
|
+
|
|
121
|
+
- `Button`
|
|
122
|
+
Unified icon/text/toggle/menu/scrollable button system.
|
|
123
|
+
- `ComboBox`
|
|
124
|
+
Custom-painted combo box with popup, search, and keyboard navigation.
|
|
125
|
+
- `CustomLineEdit`
|
|
126
|
+
Themed editable text field.
|
|
127
|
+
- `SidebarDialogShell`
|
|
128
|
+
Settings/help style dialog shell.
|
|
129
|
+
- `ScrollableDialogPage`
|
|
130
|
+
Scrollable dialog page container.
|
|
131
|
+
- `MarkdownHelpDialog`
|
|
132
|
+
Reusable markdown help/documentation dialog.
|
|
133
|
+
|
|
134
|
+
Usage details live in [docs/API_CATALOG.md](docs/API_CATALOG.md).
|
|
135
|
+
|
|
136
|
+
## Notes
|
|
137
|
+
|
|
138
|
+
- `ComboBox` is a custom widget, not a full `QComboBox` drop-in replacement.
|
|
139
|
+
- The toolkit is designed around custom-painted controls, not QSS-skinned stock widgets.
|
|
140
|
+
- App-specific icons and translations should stay outside the toolkit and be injected through configuration.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=69", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "sli-ui-toolkit"
|
|
7
|
+
version = "0.2.7"
|
|
8
|
+
description = "Reusable PyQt UI toolkit primitives for SLI desktop tools."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
dependencies = [
|
|
12
|
+
"PyQt6>=6.6",
|
|
13
|
+
"markdown>=3.4",
|
|
14
|
+
]
|
|
15
|
+
license = { text = "MIT" }
|
|
16
|
+
authors = [
|
|
17
|
+
{ name = "Loganavter" },
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
[project.optional-dependencies]
|
|
21
|
+
dev = [
|
|
22
|
+
"pytest>=7",
|
|
23
|
+
"pytest-qt>=4.2",
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
[project.urls]
|
|
27
|
+
Repository = "https://github.com/Loganavter/sli-ui-toolkit"
|
|
28
|
+
Issues = "https://github.com/Loganavter/sli-ui-toolkit/issues"
|
|
29
|
+
|
|
30
|
+
[tool.setuptools.packages.find]
|
|
31
|
+
where = ["src"]
|
|
32
|
+
|
|
33
|
+
[tool.setuptools.package-data]
|
|
34
|
+
"sli_ui_toolkit" = ["resources/assets/icons/*.svg", "resources/assets/icons/light/*.svg", "resources/assets/icons/dark/*.svg"]
|
|
35
|
+
|
|
36
|
+
[tool.pytest.ini_options]
|
|
37
|
+
testpaths = ["tests"]
|
|
38
|
+
addopts = "-q"
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"""Reusable PyQt toolkit primitives."""
|
|
2
|
+
|
|
3
|
+
from sli_ui_toolkit._version import __version__
|
|
4
|
+
from sli_ui_toolkit.config import FlyoutTimingConfig, configure_toolkit
|
|
5
|
+
from sli_ui_toolkit.palettes import FLUENT_LIGHT, FLUENT_DARK
|
|
6
|
+
from sli_ui_toolkit.core.logging import (
|
|
7
|
+
get_log_directory,
|
|
8
|
+
setup_logging,
|
|
9
|
+
setup_simple_logging,
|
|
10
|
+
)
|
|
11
|
+
from sli_ui_toolkit.i18n import (
|
|
12
|
+
ToolkitTranslationEvents,
|
|
13
|
+
TranslationManager,
|
|
14
|
+
configure_i18n,
|
|
15
|
+
emit_language_changed,
|
|
16
|
+
get_current_language,
|
|
17
|
+
tr,
|
|
18
|
+
translation_events,
|
|
19
|
+
)
|
|
20
|
+
from sli_ui_toolkit.utils.file_utils import get_unique_filepath
|
|
21
|
+
from sli_ui_toolkit.utils.paths import resource_path
|
|
22
|
+
from sli_ui_toolkit.workers.generic_worker import GenericWorker, WorkerSignals
|
|
23
|
+
from sli_ui_toolkit.theme import ThemeManager
|
|
24
|
+
from sli_ui_toolkit.widgets import (
|
|
25
|
+
Label,
|
|
26
|
+
LabelConfig,
|
|
27
|
+
LabelVariantSpec,
|
|
28
|
+
application_tooltips_enabled,
|
|
29
|
+
get_label_variant,
|
|
30
|
+
install_application_tooltips,
|
|
31
|
+
register_label_variant,
|
|
32
|
+
set_application_tooltips_enabled,
|
|
33
|
+
)
|
|
34
|
+
from sli_ui_toolkit.style import (
|
|
35
|
+
WidgetStyleTokens,
|
|
36
|
+
read_widget_style,
|
|
37
|
+
update_widget_style,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
__all__ = [
|
|
41
|
+
"__version__",
|
|
42
|
+
"GenericWorker",
|
|
43
|
+
"WorkerSignals",
|
|
44
|
+
"ThemeManager",
|
|
45
|
+
"Label",
|
|
46
|
+
"LabelConfig",
|
|
47
|
+
"LabelVariantSpec",
|
|
48
|
+
"get_label_variant",
|
|
49
|
+
"register_label_variant",
|
|
50
|
+
"application_tooltips_enabled",
|
|
51
|
+
"install_application_tooltips",
|
|
52
|
+
"set_application_tooltips_enabled",
|
|
53
|
+
"WidgetStyleTokens",
|
|
54
|
+
"read_widget_style",
|
|
55
|
+
"update_widget_style",
|
|
56
|
+
"FlyoutTimingConfig",
|
|
57
|
+
"ToolkitTranslationEvents",
|
|
58
|
+
"TranslationManager",
|
|
59
|
+
"configure_i18n",
|
|
60
|
+
"configure_toolkit",
|
|
61
|
+
"emit_language_changed",
|
|
62
|
+
"get_log_directory",
|
|
63
|
+
"get_current_language",
|
|
64
|
+
"get_unique_filepath",
|
|
65
|
+
"resource_path",
|
|
66
|
+
"setup_logging",
|
|
67
|
+
"setup_simple_logging",
|
|
68
|
+
"tr",
|
|
69
|
+
"translation_events",
|
|
70
|
+
"FLUENT_LIGHT",
|
|
71
|
+
"FLUENT_DARK",
|
|
72
|
+
]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.2.7"
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import Callable
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
|
|
6
|
+
@dataclass(slots=True)
|
|
7
|
+
class FlyoutTimingConfig:
|
|
8
|
+
transient_auto_hide_delay_ms: int = 180
|
|
9
|
+
flyout_animation_duration_ms: int = 160
|
|
10
|
+
text_settings_flyout_animation_duration_ms: int = 180
|
|
11
|
+
|
|
12
|
+
_timings = FlyoutTimingConfig()
|
|
13
|
+
_overlay_resolver: Callable[[object | None], object | None] | None = None
|
|
14
|
+
_rating_gesture_factory: Callable[..., object] | None = None
|
|
15
|
+
_dragdrop_service_getter: Callable[[], object | None] | None = None
|
|
16
|
+
|
|
17
|
+
def configure_toolkit(
|
|
18
|
+
*,
|
|
19
|
+
timings: FlyoutTimingConfig | None = None,
|
|
20
|
+
overlay_resolver: Callable[[object | None], object | None] | None = None,
|
|
21
|
+
rating_gesture_factory: Callable[..., object] | None = None,
|
|
22
|
+
dragdrop_service_getter: Callable[[], object | None] | None = None,
|
|
23
|
+
) -> None:
|
|
24
|
+
global _timings, _overlay_resolver, _rating_gesture_factory, _dragdrop_service_getter
|
|
25
|
+
if timings is not None:
|
|
26
|
+
_timings = timings
|
|
27
|
+
if overlay_resolver is not None:
|
|
28
|
+
_overlay_resolver = overlay_resolver
|
|
29
|
+
if rating_gesture_factory is not None:
|
|
30
|
+
_rating_gesture_factory = rating_gesture_factory
|
|
31
|
+
if dragdrop_service_getter is not None:
|
|
32
|
+
_dragdrop_service_getter = dragdrop_service_getter
|
|
33
|
+
|
|
34
|
+
def get_flyout_timings() -> FlyoutTimingConfig:
|
|
35
|
+
return _timings
|
|
36
|
+
|
|
37
|
+
def resolve_overlay_layer(widget: object | None):
|
|
38
|
+
if _overlay_resolver is None:
|
|
39
|
+
return None
|
|
40
|
+
try:
|
|
41
|
+
return _overlay_resolver(widget)
|
|
42
|
+
except Exception:
|
|
43
|
+
return None
|
|
44
|
+
|
|
45
|
+
def create_rating_gesture(**kwargs):
|
|
46
|
+
if _rating_gesture_factory is None:
|
|
47
|
+
return None
|
|
48
|
+
try:
|
|
49
|
+
return _rating_gesture_factory(**kwargs)
|
|
50
|
+
except Exception:
|
|
51
|
+
return None
|
|
52
|
+
|
|
53
|
+
def get_dragdrop_service():
|
|
54
|
+
if _dragdrop_service_getter is None:
|
|
55
|
+
from sli_ui_toolkit.ui.services.dragdrop_service import ToolkitDragDropService
|
|
56
|
+
|
|
57
|
+
return ToolkitDragDropService.get_instance()
|
|
58
|
+
try:
|
|
59
|
+
return _dragdrop_service_getter()
|
|
60
|
+
except Exception:
|
|
61
|
+
from sli_ui_toolkit.ui.services.dragdrop_service import ToolkitDragDropService
|
|
62
|
+
|
|
63
|
+
return ToolkitDragDropService.get_instance()
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
import sys
|
|
4
|
+
|
|
5
|
+
def get_log_directory(app_name: str) -> str:
|
|
6
|
+
logger = logging.getLogger(app_name)
|
|
7
|
+
|
|
8
|
+
if sys.platform == "win32":
|
|
9
|
+
app_data_dir = os.getenv("APPDATA")
|
|
10
|
+
if not app_data_dir:
|
|
11
|
+
app_data_dir = os.path.expanduser("~")
|
|
12
|
+
logger.warning(
|
|
13
|
+
"Could not find APPDATA env variable, falling back to home directory."
|
|
14
|
+
)
|
|
15
|
+
return os.path.join(app_data_dir, app_name)
|
|
16
|
+
|
|
17
|
+
if sys.platform == "darwin":
|
|
18
|
+
return os.path.join(
|
|
19
|
+
os.path.expanduser("~/Library/Application Support"), app_name
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
xdg_data_home = os.getenv("XDG_DATA_HOME", os.path.expanduser("~/.local/share"))
|
|
23
|
+
return os.path.join(xdg_data_home, app_name)
|
|
24
|
+
|
|
25
|
+
def setup_logging(
|
|
26
|
+
app_name: str, debug_enabled: bool = False, debug_env_var: str | None = None
|
|
27
|
+
) -> None:
|
|
28
|
+
logger = logging.getLogger(app_name)
|
|
29
|
+
|
|
30
|
+
if debug_env_var:
|
|
31
|
+
suppress_debug = (
|
|
32
|
+
os.getenv(f"{debug_env_var.replace('_DEBUG', '_SUPPRESS_DEBUG')}", "0")
|
|
33
|
+
== "1"
|
|
34
|
+
)
|
|
35
|
+
if suppress_debug:
|
|
36
|
+
debug_enabled = False
|
|
37
|
+
elif os.getenv(debug_env_var, "0") == "1":
|
|
38
|
+
debug_enabled = True
|
|
39
|
+
|
|
40
|
+
level = logging.DEBUG if debug_enabled else logging.INFO
|
|
41
|
+
|
|
42
|
+
if logger.handlers:
|
|
43
|
+
logger.setLevel(level)
|
|
44
|
+
for handler in logger.handlers:
|
|
45
|
+
handler.setLevel(level)
|
|
46
|
+
return
|
|
47
|
+
|
|
48
|
+
logger.setLevel(level)
|
|
49
|
+
formatter = logging.Formatter(
|
|
50
|
+
"%(asctime)s - [%(levelname)s] - (%(filename)s:%(lineno)d) - %(message)s"
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
stream_handler = logging.StreamHandler(sys.stdout)
|
|
54
|
+
stream_handler.setFormatter(formatter)
|
|
55
|
+
stream_handler.setLevel(level)
|
|
56
|
+
logger.addHandler(stream_handler)
|
|
57
|
+
|
|
58
|
+
try:
|
|
59
|
+
log_dir = get_log_directory(app_name)
|
|
60
|
+
os.makedirs(log_dir, exist_ok=True)
|
|
61
|
+
log_file_path = os.path.join(log_dir, "log.txt")
|
|
62
|
+
|
|
63
|
+
file_handler = logging.FileHandler(log_file_path, mode="w", encoding="utf-8")
|
|
64
|
+
file_handler.setFormatter(formatter)
|
|
65
|
+
file_handler.setLevel(level)
|
|
66
|
+
logger.addHandler(file_handler)
|
|
67
|
+
|
|
68
|
+
logging.getLogger("markdown").setLevel(logging.WARNING)
|
|
69
|
+
logging.getLogger("markdown.extensions").setLevel(logging.WARNING)
|
|
70
|
+
except Exception:
|
|
71
|
+
logger.error(
|
|
72
|
+
"FATAL: Failed to set up file logger. Continuing with console-only logging.",
|
|
73
|
+
exc_info=True,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
def setup_simple_logging(app_name: str, level: int = logging.WARNING) -> None:
|
|
77
|
+
root_logger = logging.getLogger()
|
|
78
|
+
root_logger.setLevel(level)
|
|
79
|
+
|
|
80
|
+
for handler in root_logger.handlers[:]:
|
|
81
|
+
root_logger.removeHandler(handler)
|
|
82
|
+
|
|
83
|
+
formatter = logging.Formatter(
|
|
84
|
+
"%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
|
85
|
+
datefmt="%Y-%m-%d %H:%M:%S",
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
console_handler = logging.StreamHandler()
|
|
89
|
+
console_handler.setLevel(level)
|
|
90
|
+
console_handler.setFormatter(formatter)
|
|
91
|
+
|
|
92
|
+
root_logger.addHandler(console_handler)
|
|
93
|
+
|
|
94
|
+
app_logger = logging.getLogger(app_name)
|
|
95
|
+
app_logger.setLevel(level)
|
|
96
|
+
|
|
97
|
+
logging.getLogger("markdown").setLevel(logging.WARNING)
|
|
98
|
+
logging.getLogger("markdown.extensions").setLevel(logging.WARNING)
|
|
99
|
+
|