electricalsim 0.0.8.22.dev0__tar.gz → 0.0.8.22.dev1__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.
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/PKG-INFO +1 -2
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/pyproject.toml +1 -2
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/Electrical_Grid_Simulator.py +8 -5
- electricalsim-0.0.8.22.dev1/src/electricalsim/egs_create_shortcut.py +53 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/lib/auxiliary.py +2 -2
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/__init__.py +46 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_color.py +231 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_icon/__init__.py +0 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_icon/icon_engine.py +56 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_icon/svg.py +75 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_main.py +178 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_os_appearance/__init__.py +1 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_os_appearance/_accent/__init__.py +29 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_os_appearance/_accent/_mac_detect.py +61 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_os_appearance/listener.py +59 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_proxy_style.py +34 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_resources/__init__.py +12 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_resources/colors.py +28 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_resources/palette.py +114 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_resources/standard_icons.py +81 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_resources/stylesheets.py +4 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_resources/svg.py +5 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_style_loader.py +302 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_template/__init__.py +0 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_template/engine.py +84 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_template/filter.py +94 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_util.py +82 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/qtpy/QtCore/__init__.py +19 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/qtpy/QtGui/__init__.py +20 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/qtpy/QtSvg/__init__.py +13 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/qtpy/QtWidgets/__init__.py +36 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/qtpy/__init__.py +11 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/qtpy/qt_compat.py +80 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/qtpy/qt_version.py +22 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/__init__.py +8 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/__main__.py +14 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/_ui/__init__.py +1 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/_ui/dock_ui.py +42 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/_ui/frame_ui.py +79 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/_ui/icons_ui.py +42 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/_ui/mdi_ui.py +76 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/_ui/widgets_ui.py +329 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/main_window.py +223 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/announcement_24dp.svg +1 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/branding_watermark_24dp.svg +1 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/circle_24dp.svg +1 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/clear_24dp.svg +1 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/contrast_24dp.svg +1 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/crop_din_24dp.svg +1 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/favorite_border_24dp.svg +1 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/flip_to_front_24dp.svg +1 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/folder_open_24dp.svg +1 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/font_download_24dp.svg +1 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/image_24dp.svg +1 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/palette_24dp.svg +1 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/settings_24dp.svg +1 -0
- electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/widgets_24dp.svg +1 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/dialogs.py +3 -3
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/version.py +1 -1
- electricalsim-0.0.8.22.dev0/src/electricalsim/egs_create_shortcut.py +0 -31
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/.gitignore +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/LICENSE +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/README.md +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/README_PyPI.md +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/10_PF4.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/11_PF_tooltips.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/12_App_settings.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/13_Disabling_nodes.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/14_Context_menu.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/14_Context_menu.svg +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/15_Extension_manager.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/1_Main_Window.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/1_Main_Window_dark.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/2_Dialogs.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/3_Widgets.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/4_Pandapower_DataFrames.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/5_Connections_angle_b.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/5_Connections_curved_b.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/5_Connections_straight_b.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/6_Line_and_transformer_nodes.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/7_PF1.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/7_PF1_2.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/8_PF2.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/9_PF3.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/Export_dialog.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/Logo_CIESE_2021 y UTN_Sta_Fe.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/app_icon.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/dialog_connecting_buses.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/fuzzy_search.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/fuzzy_search2.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/slice_connections.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/__init__.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/base/__init__.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/base/commands.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/base/factory.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/base/graph.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/base/menu.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/base/model.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/base/node.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/base/port.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/constants.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/custom_widgets/__init__.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/custom_widgets/nodes_palette.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/custom_widgets/nodes_tree.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/custom_widgets/properties_bin/__init__.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/custom_widgets/properties_bin/custom_widget_color_picker.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/custom_widgets/properties_bin/custom_widget_file_paths.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/custom_widgets/properties_bin/custom_widget_slider.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/custom_widgets/properties_bin/custom_widget_value_edit.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/custom_widgets/properties_bin/custom_widget_vectors.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/custom_widgets/properties_bin/node_property_factory.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/custom_widgets/properties_bin/node_property_widgets.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/custom_widgets/properties_bin/prop_widgets_abstract.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/custom_widgets/properties_bin/prop_widgets_base.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/errors.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/nodes/__init__.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/nodes/backdrop_node.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/nodes/base_node.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/nodes/base_node_circle.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/nodes/group_node.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/nodes/port_node.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/pkg_info.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/__init__.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/node_abstract.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/node_backdrop.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/node_base.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/node_circle.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/node_group.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/node_overlay_disabled.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/node_port_in.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/node_port_out.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/node_text_item.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/pipe.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/port.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/slicer.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/widgets/__init__.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/widgets/actions.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/widgets/dialogs.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/widgets/icons/node_base.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/widgets/node_graph.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/widgets/node_widgets.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/widgets/scene.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/widgets/tab_search.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/widgets/viewer.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/widgets/viewer_nav.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/__init__.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/config.ini +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/egs_run.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/extensions/extension_classes.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/hotkeys/hotkey_functions.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/hotkeys/hotkeys.json +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/3w-transformer.svg +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/CIESE_UTN_Sta_Fe.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/app_icon.ico +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/app_icon.png +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/app_icon.svg +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/demand.svg +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/ext_grid.svg +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/generator.svg +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/icon_resources.qrc +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/impedance.svg +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/motor.svg +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/rc_icons.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/shunt.svg +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/splash_screen.svg +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/splash_screen_copy.svg +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/ssc.svg +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/storage.svg +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/svc.svg +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/switch_closed.svg +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/switch_opened.svg +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/tcsc.svg +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/transformer.svg +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/ward.svg +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/xward.svg +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/lib/calculations.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/lib/electricalGraph.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/lib/main_components.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/lib/table_widget.py +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/about_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/aload_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/asgen_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/bus_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/choose_bus_switch.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/choose_facts_type.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/choose_generator_type.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/choose_line_type.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/choose_load_type.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/choose_transformer_type.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/connecting_buses_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/dcline_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/export_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/ext_grid_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/extension.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/gen_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/impedance_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/line_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/load_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/main_window.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/motor_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/network_settings_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/pf_settings_widget.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/power_flow_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/search_node_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/settings_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/sgen_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/shunt_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/ssc_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/stdline_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/stdtransformer3w_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/stdtransformer_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/storage_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/svc_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/switch_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/tcsc_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/transformer3w_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/transformer_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/ward_dialog.ui +0 -0
- {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/xward_dialog.ui +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: electricalsim
|
|
3
|
-
Version: 0.0.8.22.
|
|
3
|
+
Version: 0.0.8.22.dev1
|
|
4
4
|
Summary: Graphical user interface for simulating electrical networks based on the pandapower library
|
|
5
5
|
Project-URL: Homepage, https://github.com/aloytag/electrical-grid-simulator
|
|
6
6
|
Project-URL: Bug Tracker, https://github.com/aloytag/electrical-grid-simulator/issues
|
|
@@ -24,7 +24,6 @@ Requires-Dist: platformdirs>=3.0.0
|
|
|
24
24
|
Requires-Dist: pyarrow<19.0.0,>=15.0.0
|
|
25
25
|
Requires-Dist: pynput>=1.7.6
|
|
26
26
|
Requires-Dist: pyqt-toast-notification>=1.3.2
|
|
27
|
-
Requires-Dist: pyqtdarktheme>=2.1.0
|
|
28
27
|
Requires-Dist: pyshortcuts>=1.8.3
|
|
29
28
|
Requires-Dist: pyside6>=6.6.1
|
|
30
29
|
Requires-Dist: qtawesome>=1.3.1
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "electricalsim"
|
|
7
|
-
version = "0.0.8.
|
|
7
|
+
version = "0.0.8.22dev1"
|
|
8
8
|
author = "Dr. Ing. Ariel S. Loyarte"
|
|
9
9
|
authors = [
|
|
10
10
|
{ name="Dr. Ing. Ariel S. Loyarte", email="aloyarte@frsf.utn.edu.ar" },
|
|
@@ -16,7 +16,6 @@ dependencies = [
|
|
|
16
16
|
"PySide6>=6.6.1",
|
|
17
17
|
"pandapower>=3.1.2",
|
|
18
18
|
"numba>=0.56.4",
|
|
19
|
-
"pyqtdarktheme>=2.1.0",
|
|
20
19
|
"qtawesome>=1.3.1",
|
|
21
20
|
"pynput>=1.7.6",
|
|
22
21
|
"lightsim2grid>=0.7.1",
|
|
@@ -7,7 +7,7 @@ import importlib
|
|
|
7
7
|
|
|
8
8
|
from PySide6.QtUiTools import QUiLoader
|
|
9
9
|
from PySide6 import QtWidgets, QtGui, QtCore
|
|
10
|
-
import
|
|
10
|
+
import qdarktheme2 # Always import after Qt
|
|
11
11
|
import qtawesome as qta
|
|
12
12
|
|
|
13
13
|
from lib.electricalGraph import ElectricalGraph
|
|
@@ -24,6 +24,8 @@ if sys.version_info < (3, 10):
|
|
|
24
24
|
else:
|
|
25
25
|
from importlib.metadata import entry_points
|
|
26
26
|
|
|
27
|
+
APP_ID = 'ar.utnfrsf.egs'
|
|
28
|
+
|
|
27
29
|
|
|
28
30
|
def main():
|
|
29
31
|
"""
|
|
@@ -35,11 +37,11 @@ def main():
|
|
|
35
37
|
# Reading the config file:
|
|
36
38
|
config, config_file_path = return_config(directory)
|
|
37
39
|
|
|
38
|
-
#
|
|
40
|
+
# qdarktheme2.enable_hi_dpi()
|
|
39
41
|
# app = QtWidgets.QApplication(sys.argv)
|
|
40
42
|
# theme = config['general']['theme']
|
|
41
43
|
# if theme in ('dark', 'light', 'auto'):
|
|
42
|
-
#
|
|
44
|
+
# qdarktheme2.setup_theme(theme)
|
|
43
45
|
|
|
44
46
|
ui_file = os.path.join(directory, 'ui', 'main_window.ui')
|
|
45
47
|
ui_file_ = QtCore.QFile(ui_file)
|
|
@@ -48,8 +50,9 @@ def main():
|
|
|
48
50
|
# main_window = loader.load(ui_file_)
|
|
49
51
|
# window = QMainWindow2(main_window)
|
|
50
52
|
|
|
51
|
-
|
|
53
|
+
qdarktheme2.enable_hi_dpi()
|
|
52
54
|
app = QtWidgets.QApplication(sys.argv)
|
|
55
|
+
app.setDesktopFileName(APP_ID)
|
|
53
56
|
|
|
54
57
|
# Better font for flatpak app:
|
|
55
58
|
directory_split = directory.split(sep='/')
|
|
@@ -78,7 +81,7 @@ def main():
|
|
|
78
81
|
|
|
79
82
|
theme = config['general']['theme']
|
|
80
83
|
if theme in ('dark', 'light', 'auto'):
|
|
81
|
-
|
|
84
|
+
qdarktheme2.setup_theme(theme, additional_qss="QToolTip { border: 0px; }")
|
|
82
85
|
|
|
83
86
|
main_window = loader.load(ui_file_)
|
|
84
87
|
window = QMainWindow2(main_window)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*
|
|
3
|
+
|
|
4
|
+
import os
|
|
5
|
+
import sys
|
|
6
|
+
|
|
7
|
+
from pyshortcuts import make_shortcut
|
|
8
|
+
import electricalsim
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def create_shortcut():
|
|
12
|
+
"""
|
|
13
|
+
Creates a shortcut for the Electrical Grid Simulator
|
|
14
|
+
on the desktop and startmanu.
|
|
15
|
+
"""
|
|
16
|
+
root_path, _ = os.path.split(electricalsim.__file__)
|
|
17
|
+
executable_path = os.path.join(root_path, 'egs_run.py')
|
|
18
|
+
name = 'EGS'
|
|
19
|
+
if sys.platform.startswith('win'):
|
|
20
|
+
icon_path = os.path.join(root_path, 'icons', 'app_icon.ico')
|
|
21
|
+
else:
|
|
22
|
+
icon_path = os.path.join(root_path, 'icons', 'app_icon.png')
|
|
23
|
+
|
|
24
|
+
sct = make_shortcut(executable_path, name=name,
|
|
25
|
+
description='Electrical Grid Simulator',
|
|
26
|
+
terminal=False, icon=icon_path,
|
|
27
|
+
desktop=True, startmenu=True)
|
|
28
|
+
|
|
29
|
+
# In case of Wayland session:
|
|
30
|
+
session_type = os.environ.get("XDG_SESSION_TYPE")
|
|
31
|
+
if session_type and session_type.lower() == "wayland":
|
|
32
|
+
python_root, _ = sct.full_script.split(sep='lib')
|
|
33
|
+
python_executable = os.path.join(python_root, 'bin', 'python')
|
|
34
|
+
script = python_executable + ' ' + sct.full_script
|
|
35
|
+
|
|
36
|
+
content_desktop = f"""[Desktop Entry]
|
|
37
|
+
Name=EGS
|
|
38
|
+
Type=Application
|
|
39
|
+
Path={sct.working_dir}
|
|
40
|
+
Comment=Electrical Grid Simulator
|
|
41
|
+
Terminal=false
|
|
42
|
+
StartupNotify=false
|
|
43
|
+
StartupWMClass=ar.utnfrsf.egs
|
|
44
|
+
Icon={sct.icon}
|
|
45
|
+
Exec={script}"""
|
|
46
|
+
|
|
47
|
+
os.remove(os.path.join(sct.startmenu_dir, 'EGS.desktop'))
|
|
48
|
+
desktop_file_path = os.path.join(sct.startmenu_dir, 'ar.utnfrsf.egs.desktop')
|
|
49
|
+
with open(desktop_file_path, 'w') as file:
|
|
50
|
+
file.write(content_desktop)
|
|
51
|
+
|
|
52
|
+
if __name__=='__main__':
|
|
53
|
+
create_shortcut()
|
{electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/lib/auxiliary.py
RENAMED
|
@@ -46,7 +46,7 @@ def natsort(s):
|
|
|
46
46
|
|
|
47
47
|
s: List with strings.
|
|
48
48
|
"""
|
|
49
|
-
return [int(t) if t.isdigit() else t.lower() for t in re.split('(
|
|
49
|
+
return [int(t) if t.isdigit() else t.lower() for t in re.split('(\\d+)', s)]
|
|
50
50
|
|
|
51
51
|
|
|
52
52
|
def natsort2(s):
|
|
@@ -55,7 +55,7 @@ def natsort2(s):
|
|
|
55
55
|
|
|
56
56
|
s: List obtained as enumerate(list with strings).
|
|
57
57
|
"""
|
|
58
|
-
return [int(t) if t.isdigit() else t.lower() for t in re.split('(
|
|
58
|
+
return [int(t) if t.isdigit() else t.lower() for t in re.split('(\\d+)', s[1])]
|
|
59
59
|
|
|
60
60
|
|
|
61
61
|
def show_WIP(window_parent):
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"""PyQtDarkTheme - A flat dark theme for PySide and PyQt.
|
|
2
|
+
|
|
3
|
+
- Repository: https://github.com/5yutan5/PyQtDarkTheme
|
|
4
|
+
- Documentation: https://pyqtdarktheme.readthedocs.io
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
License Information
|
|
8
|
+
===================
|
|
9
|
+
|
|
10
|
+
Material design icons
|
|
11
|
+
---------------------
|
|
12
|
+
|
|
13
|
+
All svg files in PyQtDarkTheme is from Material design icons(which uses an Apache 2.0 license).
|
|
14
|
+
|
|
15
|
+
- Author: Google
|
|
16
|
+
- Site: https://fonts.google.com/icons
|
|
17
|
+
- Source: https://github.com/google/material-design-icons
|
|
18
|
+
- License: Apache License Version 2.0 | https://www.apache.org/licenses/LICENSE-2.0.txt
|
|
19
|
+
|
|
20
|
+
Modifications made to each files to change the icon color and angle and remove svg namespace.
|
|
21
|
+
|
|
22
|
+
The current Material design icons license summary can be viewed at:
|
|
23
|
+
https://github.com/google/material-design-icons/blob/master/LICENSE
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
QDarkStyleSheet(Source code)
|
|
27
|
+
----------------------------
|
|
28
|
+
|
|
29
|
+
Qt stylesheets are originally fork of QDarkStyleSheet(MIT License).
|
|
30
|
+
|
|
31
|
+
- Author: Colin Duquesnoy
|
|
32
|
+
- Site: https://github.com/ColinDuquesnoy/QDarkStyleSheet
|
|
33
|
+
- Source: https://github.com/ColinDuquesnoy/QDarkStyleSheet
|
|
34
|
+
- License: MIT License | https://opensource.org/licenses/MIT
|
|
35
|
+
|
|
36
|
+
Modifications made to a file to change the style.
|
|
37
|
+
|
|
38
|
+
The current QDarkStyleSheet license summary can be viewed at:
|
|
39
|
+
https://github.com/ColinDuquesnoy/QDarkStyleSheet/blob/master/LICENSE.rst
|
|
40
|
+
|
|
41
|
+
"""
|
|
42
|
+
# Version of PyQtDarkTheme
|
|
43
|
+
__version__ = "2.1.0"
|
|
44
|
+
|
|
45
|
+
from qdarktheme2._main import enable_hi_dpi, setup_theme, stop_sync
|
|
46
|
+
from qdarktheme2._style_loader import clear_cache, get_themes, load_palette, load_stylesheet
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"""Module for color code."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import colorsys
|
|
5
|
+
import math
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def _round_float(number: float, decimal_points: int = 3) -> float:
|
|
9
|
+
decimal = 10**decimal_points
|
|
10
|
+
return round(number * decimal) / decimal
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class _RGBA:
|
|
14
|
+
"""Class handling RGBA color code."""
|
|
15
|
+
|
|
16
|
+
def __init__(self, r: int, g: int, b: int, a: float = 1) -> None:
|
|
17
|
+
"""Initialize rgba value.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
r: Red(0~255).
|
|
21
|
+
g: Green(0~255).
|
|
22
|
+
b: Blue(0~255).
|
|
23
|
+
a: Alpha(0~1). Defaults to 1.
|
|
24
|
+
"""
|
|
25
|
+
self._r = min(255, max(0, r)) | 0
|
|
26
|
+
self._g = min(255, max(0, g)) | 0
|
|
27
|
+
self._b = min(255, max(0, b)) | 0
|
|
28
|
+
self._a = _round_float(max(min(1, a), 0))
|
|
29
|
+
|
|
30
|
+
def __str__(self) -> str:
|
|
31
|
+
"""Format RGBA class.
|
|
32
|
+
|
|
33
|
+
e.g. rgba(100, 100, 100, 0.5).
|
|
34
|
+
"""
|
|
35
|
+
return f"rgba({self.r}, {self.g}, {self.b}, {self.a:.3f})"
|
|
36
|
+
|
|
37
|
+
def __getitem__(self, item: int) -> int | float:
|
|
38
|
+
"""Unpack to (r, g, b, a)."""
|
|
39
|
+
return [self.r, self.g, self.b, self.a][item]
|
|
40
|
+
|
|
41
|
+
def __eq__(self, other: _RGBA) -> bool:
|
|
42
|
+
"""Returns true if `r`, `g`, `b` and `a` are all the same."""
|
|
43
|
+
return [self.r, self.g, self.b, self.a] == [other.r, other.g, other.b, other.a]
|
|
44
|
+
|
|
45
|
+
@property
|
|
46
|
+
def r(self) -> int:
|
|
47
|
+
return self._r
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def g(self) -> int:
|
|
51
|
+
return self._g
|
|
52
|
+
|
|
53
|
+
@property
|
|
54
|
+
def b(self) -> int:
|
|
55
|
+
return self._b
|
|
56
|
+
|
|
57
|
+
@property
|
|
58
|
+
def a(self) -> float:
|
|
59
|
+
return self._a
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class _HSLA:
|
|
63
|
+
def __init__(self, h: int, s: float, l: float, a: float = 1) -> None: # noqa: E741
|
|
64
|
+
self._h = max(min(360, h), 0) | 0
|
|
65
|
+
self._s = _round_float(max(min(1, s), 0))
|
|
66
|
+
self._l = _round_float(max(min(1, l), 0))
|
|
67
|
+
self._a = _round_float(max(min(1, a), 0))
|
|
68
|
+
|
|
69
|
+
def __eq__(self, other: _HSLA) -> bool:
|
|
70
|
+
"""Returns true if `h`, `s`, `l` and `a` are all the same."""
|
|
71
|
+
return [self.h, self.s, self.l, self.a] == [other.h, other.s, other.l, other.a]
|
|
72
|
+
|
|
73
|
+
@property
|
|
74
|
+
def h(self) -> int:
|
|
75
|
+
return self._h
|
|
76
|
+
|
|
77
|
+
@property
|
|
78
|
+
def s(self) -> float:
|
|
79
|
+
return self._s
|
|
80
|
+
|
|
81
|
+
@property
|
|
82
|
+
def l(self) -> float: # noqa: E741, E743
|
|
83
|
+
return self._l
|
|
84
|
+
|
|
85
|
+
@property
|
|
86
|
+
def a(self) -> float:
|
|
87
|
+
return self._a
|
|
88
|
+
|
|
89
|
+
@staticmethod
|
|
90
|
+
def from_rgba(rgba: _RGBA) -> _HSLA:
|
|
91
|
+
hls = colorsys.rgb_to_hls(rgba.r / 255, rgba.g / 255, rgba.b / 255)
|
|
92
|
+
return _HSLA(int(hls[0] * 360), hls[2], hls[1], rgba.a)
|
|
93
|
+
|
|
94
|
+
def to_rgba(self) -> _RGBA:
|
|
95
|
+
rgb = colorsys.hls_to_rgb(self.h / 360, self.l, self.s)
|
|
96
|
+
return _RGBA(round(rgb[0] * 255), round(rgb[1] * 255), round(rgb[2] * 255), self.a)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class Color:
|
|
100
|
+
"""Class handling color code(RGBA and HSLA)."""
|
|
101
|
+
|
|
102
|
+
def __init__(self, color_code: _RGBA | _HSLA) -> None:
|
|
103
|
+
"""Initialize color code."""
|
|
104
|
+
self._hsla, self._hsva = None, None
|
|
105
|
+
if isinstance(color_code, _RGBA):
|
|
106
|
+
self._rgba = color_code
|
|
107
|
+
elif isinstance(color_code, _HSLA):
|
|
108
|
+
self._hsla = color_code
|
|
109
|
+
self._rgba = self._hsla.to_rgba()
|
|
110
|
+
|
|
111
|
+
@property
|
|
112
|
+
def rgba(self) -> _RGBA:
|
|
113
|
+
"""Return rgba."""
|
|
114
|
+
return self._rgba
|
|
115
|
+
|
|
116
|
+
@property
|
|
117
|
+
def hsla(self) -> _HSLA:
|
|
118
|
+
"""Return hsla."""
|
|
119
|
+
return self._hsla if self._hsla else _HSLA.from_rgba(self.rgba)
|
|
120
|
+
|
|
121
|
+
def __str__(self) -> str:
|
|
122
|
+
"""Format Color class.
|
|
123
|
+
|
|
124
|
+
e.g. rgba(100, 100, 100, 0.5).
|
|
125
|
+
"""
|
|
126
|
+
return str(self.rgba)
|
|
127
|
+
|
|
128
|
+
@staticmethod
|
|
129
|
+
def _check_hex_format(hex_format: str) -> None:
|
|
130
|
+
"""Check if string is hex format."""
|
|
131
|
+
try:
|
|
132
|
+
hex = hex_format.lstrip("#")
|
|
133
|
+
if not len(hex) in (3, 4, 6, 8):
|
|
134
|
+
raise ValueError
|
|
135
|
+
int(hex, 16)
|
|
136
|
+
except ValueError:
|
|
137
|
+
raise ValueError(
|
|
138
|
+
f'invalid hex color format: "{hex_format}". '
|
|
139
|
+
"Only support following hexadecimal notations: #RGB, #RGBA, #RRGGBB and #RRGGBBAA. "
|
|
140
|
+
"R (red), G (green), B (blue), and A (alpha) are hexadecimal characters "
|
|
141
|
+
"(0-9, a-f or A-F)."
|
|
142
|
+
) from None
|
|
143
|
+
|
|
144
|
+
@staticmethod
|
|
145
|
+
def from_rgba(r: int, g: int, b: int, a: int) -> Color:
|
|
146
|
+
"""Convert rgba to Color object."""
|
|
147
|
+
rgba = _RGBA(r, g, b, a / 255)
|
|
148
|
+
return Color(rgba)
|
|
149
|
+
|
|
150
|
+
@staticmethod
|
|
151
|
+
def from_hex(hex: str) -> Color:
|
|
152
|
+
"""Convert hex string to Color object.
|
|
153
|
+
|
|
154
|
+
Args:
|
|
155
|
+
color_hex: Color hex string.
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
Color: Color object converted from hex.
|
|
159
|
+
"""
|
|
160
|
+
Color._check_hex_format(hex)
|
|
161
|
+
hex = hex.lstrip("#")
|
|
162
|
+
r, g, b, a = 255, 0, 0, 1
|
|
163
|
+
if len(hex) == 3: # #RGB format
|
|
164
|
+
r, g, b = (int(char, 16) for char in hex)
|
|
165
|
+
r, g, b = 16 * r + r, 16 * g + g, 16 * b + b
|
|
166
|
+
if len(hex) == 4: # #RGBA format
|
|
167
|
+
r, g, b, a = (int(char, 16) for char in hex)
|
|
168
|
+
r, g, b = 16 * r + r, 16 * g + g, 16 * b + b
|
|
169
|
+
a = (16 * a + a) / 255
|
|
170
|
+
if len(hex) == 6: # #RRGGBB format
|
|
171
|
+
r, g, b = bytes.fromhex(hex)
|
|
172
|
+
a = 1
|
|
173
|
+
elif len(hex) == 8: # #RRGGBBAA format
|
|
174
|
+
r, g, b, a = bytes.fromhex(hex)
|
|
175
|
+
a = a / 255
|
|
176
|
+
return Color(_RGBA(r, g, b, a))
|
|
177
|
+
|
|
178
|
+
def _to_hex(self) -> str:
|
|
179
|
+
"""Convert Color object to hex(#RRGGBBAA).
|
|
180
|
+
|
|
181
|
+
Args:
|
|
182
|
+
color: Color object.
|
|
183
|
+
|
|
184
|
+
Returns:
|
|
185
|
+
str: Hex converted from Color object.
|
|
186
|
+
"""
|
|
187
|
+
r, g, b, a = self.rgba.r, self.rgba.g, self.rgba.b, self.rgba.a
|
|
188
|
+
hex_color = f"{math.floor(r):02x}{math.floor(g):02x}{math.floor(b):02x}"
|
|
189
|
+
if a != 1:
|
|
190
|
+
hex_color += f"{math.floor(a*255):02x}"
|
|
191
|
+
return hex_color
|
|
192
|
+
|
|
193
|
+
def to_hex_argb(self) -> str:
|
|
194
|
+
"""Convert Color object to hex(#AARRGGBB).
|
|
195
|
+
|
|
196
|
+
Args:
|
|
197
|
+
color: Color object.
|
|
198
|
+
|
|
199
|
+
Returns:
|
|
200
|
+
str: Hex converted from Color object.
|
|
201
|
+
"""
|
|
202
|
+
r, g, b, a = self.rgba.r, self.rgba.g, self.rgba.b, self.rgba.a
|
|
203
|
+
hex_color = "" if a == 1 else f"{math.floor(a*255):02x}"
|
|
204
|
+
hex_color += f"{math.floor(r):02x}{math.floor(g):02x}{math.floor(b):02x}"
|
|
205
|
+
return hex_color
|
|
206
|
+
|
|
207
|
+
def to_svg_tiny_color_format(self) -> str:
|
|
208
|
+
"""Convert Color object to string for svg.
|
|
209
|
+
|
|
210
|
+
QtSvg does not support #RRGGBBAA format.
|
|
211
|
+
Therefore, we need to set the alpha value to `fill-opacity` instead.
|
|
212
|
+
|
|
213
|
+
Returns:
|
|
214
|
+
str: RGBA format.
|
|
215
|
+
"""
|
|
216
|
+
r, g, b, a = self.rgba
|
|
217
|
+
if a == 1:
|
|
218
|
+
return f'fill="#{self._to_hex()}"'
|
|
219
|
+
return f'fill="rgb({r},{g},{b})" fill-opacity="{a}"'
|
|
220
|
+
|
|
221
|
+
def lighten(self, factor: float) -> Color:
|
|
222
|
+
"""Lighten color."""
|
|
223
|
+
return Color(_HSLA(self.hsla.h, self.hsla.s, self.hsla.l + self.hsla.l * factor, self.hsla.a))
|
|
224
|
+
|
|
225
|
+
def darken(self, factor: float) -> Color:
|
|
226
|
+
"""Darken color."""
|
|
227
|
+
return Color(_HSLA(self.hsla.h, self.hsla.s, self.hsla.l - self.hsla.l * factor, self.hsla.a))
|
|
228
|
+
|
|
229
|
+
def transparent(self, factor: float) -> Color:
|
|
230
|
+
"""Make color transparent."""
|
|
231
|
+
return Color(_RGBA(self.rgba.r, self.rgba.g, self.rgba.b, self.rgba.a * factor))
|
|
File without changes
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
from qdarktheme2._color import Color
|
|
2
|
+
from qdarktheme2._icon.svg import Svg
|
|
3
|
+
from qdarktheme2.qtpy.QtCore import QPoint, QRect, QRectF, QSize, Qt
|
|
4
|
+
from qdarktheme2.qtpy.QtGui import (
|
|
5
|
+
QGuiApplication,
|
|
6
|
+
QIcon,
|
|
7
|
+
QIconEngine,
|
|
8
|
+
QImage,
|
|
9
|
+
QPainter,
|
|
10
|
+
QPalette,
|
|
11
|
+
QPixmap,
|
|
12
|
+
)
|
|
13
|
+
from qdarktheme2.qtpy.QtSvg import QSvgRenderer
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class SvgIconEngine(QIconEngine):
|
|
17
|
+
"""A custom QIconEngine that can render an SVG buffer."""
|
|
18
|
+
|
|
19
|
+
def __init__(self, svg: Svg) -> None:
|
|
20
|
+
"""Initialize icon engine."""
|
|
21
|
+
super().__init__()
|
|
22
|
+
self._svg = svg
|
|
23
|
+
|
|
24
|
+
def paint(self, painter: QPainter, rect: QRect, mode: QIcon.Mode, state):
|
|
25
|
+
"""Paint the icon int ``rect`` using ``painter``."""
|
|
26
|
+
palette = QGuiApplication.palette()
|
|
27
|
+
|
|
28
|
+
if mode == QIcon.Mode.Disabled:
|
|
29
|
+
rgba = palette.color(QPalette.ColorGroup.Disabled, QPalette.ColorRole.Text).getRgb()
|
|
30
|
+
color = Color.from_rgba(*rgba)
|
|
31
|
+
else:
|
|
32
|
+
rgba = palette.text().color().getRgb()
|
|
33
|
+
color = Color.from_rgba(*rgba)
|
|
34
|
+
self._svg.colored(color)
|
|
35
|
+
|
|
36
|
+
svg_byte = str(self._svg).encode("utf-8")
|
|
37
|
+
renderer = QSvgRenderer(svg_byte) # type: ignore
|
|
38
|
+
renderer.render(painter, QRectF(rect))
|
|
39
|
+
|
|
40
|
+
def clone(self):
|
|
41
|
+
"""Required to subclass abstract QIconEngine."""
|
|
42
|
+
return SvgIconEngine(self._svg)
|
|
43
|
+
|
|
44
|
+
def pixmap(self, size: QSize, mode: QIcon.Mode, state: QIcon.State):
|
|
45
|
+
"""Return the icon as a pixmap with requested size, mode, and state."""
|
|
46
|
+
# Make size to square.
|
|
47
|
+
min_size = min(size.width(), size.height())
|
|
48
|
+
size.setHeight(min_size)
|
|
49
|
+
size.setWidth(min_size)
|
|
50
|
+
|
|
51
|
+
img = QImage(size, QImage.Format.Format_ARGB32)
|
|
52
|
+
img.fill(Qt.GlobalColor.transparent)
|
|
53
|
+
pixmap = QPixmap.fromImage(img, Qt.ImageConversionFlag.NoFormatConversion)
|
|
54
|
+
size.width()
|
|
55
|
+
self.paint(QPainter(pixmap), QRect(QPoint(0, 0), size), mode, state)
|
|
56
|
+
return pixmap
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import re
|
|
5
|
+
from functools import lru_cache
|
|
6
|
+
|
|
7
|
+
from qdarktheme2 import _resources
|
|
8
|
+
from qdarktheme2._color import Color
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@lru_cache()
|
|
12
|
+
def _svg_resources() -> dict[str, str]:
|
|
13
|
+
return json.loads(_resources.svg.SVG_RESOURCES)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class Svg:
|
|
17
|
+
"""Class to manage SVG."""
|
|
18
|
+
|
|
19
|
+
_SVG_FILL_RE = re.compile(r'fill=".*?"')
|
|
20
|
+
_SVG_FILL_OPACITY_RE = re.compile(r'fill-opacity=".*?"')
|
|
21
|
+
_SVG_TRANSFORM_RE = re.compile(r'transform=".*?"')
|
|
22
|
+
|
|
23
|
+
def __init__(self, id: str) -> None:
|
|
24
|
+
"""Initialize svg manager."""
|
|
25
|
+
self._id = id
|
|
26
|
+
self._color = None
|
|
27
|
+
self._rotate = None
|
|
28
|
+
self._source = _svg_resources()[self._id]
|
|
29
|
+
|
|
30
|
+
def __str__(self) -> str:
|
|
31
|
+
"""Return the svg source code."""
|
|
32
|
+
return self._source
|
|
33
|
+
|
|
34
|
+
def colored(self, color: Color) -> Svg:
|
|
35
|
+
"""Add or change svg color."""
|
|
36
|
+
svg_tiny_color_formats = color.to_svg_tiny_color_format().split(" ")
|
|
37
|
+
if len(svg_tiny_color_formats) == 2:
|
|
38
|
+
new_svg_color, new_svg_opacity = svg_tiny_color_formats
|
|
39
|
+
else:
|
|
40
|
+
new_svg_color = svg_tiny_color_formats[0]
|
|
41
|
+
new_svg_opacity = None
|
|
42
|
+
|
|
43
|
+
current_svg_color = Svg._SVG_FILL_RE.search(self._source)
|
|
44
|
+
current_svg_opacity = Svg._SVG_FILL_OPACITY_RE.search(self._source)
|
|
45
|
+
|
|
46
|
+
# Add or change SVG color.
|
|
47
|
+
if current_svg_color is None:
|
|
48
|
+
self._source = self._source.replace("<svg ", f"<svg {new_svg_color} ")
|
|
49
|
+
else:
|
|
50
|
+
self._source = self._source.replace(current_svg_color.group(), new_svg_color)
|
|
51
|
+
|
|
52
|
+
# Add or change SVG opacity.
|
|
53
|
+
if new_svg_opacity is not None and current_svg_opacity is None:
|
|
54
|
+
self._source = self._source.replace("<svg ", f"<svg {new_svg_opacity} ")
|
|
55
|
+
elif new_svg_opacity is not None and current_svg_opacity is not None:
|
|
56
|
+
self._source = self._source.replace(current_svg_opacity.group(), new_svg_opacity)
|
|
57
|
+
|
|
58
|
+
# Remove SVG opacity
|
|
59
|
+
if new_svg_opacity is None and current_svg_opacity is not None:
|
|
60
|
+
self._source = self._source.replace(" " + current_svg_opacity.group(), "")
|
|
61
|
+
return self
|
|
62
|
+
|
|
63
|
+
def rotate(self, rotate: int) -> Svg:
|
|
64
|
+
"""Rotate svg."""
|
|
65
|
+
if rotate == 0:
|
|
66
|
+
return self
|
|
67
|
+
|
|
68
|
+
current_svg_transform = Svg._SVG_TRANSFORM_RE.search(self._source)
|
|
69
|
+
new_svg_transform = f'transform="rotate({rotate}, 12, 12)"'
|
|
70
|
+
if current_svg_transform is None:
|
|
71
|
+
self._source = self._source.replace("<svg ", f"<svg {new_svg_transform} ")
|
|
72
|
+
else:
|
|
73
|
+
self._source = self._source.replace(current_svg_transform.group(), new_svg_transform)
|
|
74
|
+
|
|
75
|
+
return self
|