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.
Files changed (219) hide show
  1. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/PKG-INFO +1 -2
  2. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/pyproject.toml +1 -2
  3. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/Electrical_Grid_Simulator.py +8 -5
  4. electricalsim-0.0.8.22.dev1/src/electricalsim/egs_create_shortcut.py +53 -0
  5. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/lib/auxiliary.py +2 -2
  6. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/__init__.py +46 -0
  7. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_color.py +231 -0
  8. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_icon/__init__.py +0 -0
  9. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_icon/icon_engine.py +56 -0
  10. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_icon/svg.py +75 -0
  11. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_main.py +178 -0
  12. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_os_appearance/__init__.py +1 -0
  13. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_os_appearance/_accent/__init__.py +29 -0
  14. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_os_appearance/_accent/_mac_detect.py +61 -0
  15. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_os_appearance/listener.py +59 -0
  16. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_proxy_style.py +34 -0
  17. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_resources/__init__.py +12 -0
  18. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_resources/colors.py +28 -0
  19. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_resources/palette.py +114 -0
  20. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_resources/standard_icons.py +81 -0
  21. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_resources/stylesheets.py +4 -0
  22. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_resources/svg.py +5 -0
  23. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_style_loader.py +302 -0
  24. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_template/__init__.py +0 -0
  25. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_template/engine.py +84 -0
  26. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_template/filter.py +94 -0
  27. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/_util.py +82 -0
  28. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/qtpy/QtCore/__init__.py +19 -0
  29. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/qtpy/QtGui/__init__.py +20 -0
  30. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/qtpy/QtSvg/__init__.py +13 -0
  31. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/qtpy/QtWidgets/__init__.py +36 -0
  32. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/qtpy/__init__.py +11 -0
  33. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/qtpy/qt_compat.py +80 -0
  34. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/qtpy/qt_version.py +22 -0
  35. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/__init__.py +8 -0
  36. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/__main__.py +14 -0
  37. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/_ui/__init__.py +1 -0
  38. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/_ui/dock_ui.py +42 -0
  39. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/_ui/frame_ui.py +79 -0
  40. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/_ui/icons_ui.py +42 -0
  41. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/_ui/mdi_ui.py +76 -0
  42. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/_ui/widgets_ui.py +329 -0
  43. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/main_window.py +223 -0
  44. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/announcement_24dp.svg +1 -0
  45. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/branding_watermark_24dp.svg +1 -0
  46. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/circle_24dp.svg +1 -0
  47. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/clear_24dp.svg +1 -0
  48. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/contrast_24dp.svg +1 -0
  49. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/crop_din_24dp.svg +1 -0
  50. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/favorite_border_24dp.svg +1 -0
  51. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/flip_to_front_24dp.svg +1 -0
  52. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/folder_open_24dp.svg +1 -0
  53. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/font_download_24dp.svg +1 -0
  54. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/image_24dp.svg +1 -0
  55. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/palette_24dp.svg +1 -0
  56. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/settings_24dp.svg +1 -0
  57. electricalsim-0.0.8.22.dev1/src/electricalsim/qdarktheme2/widget_gallery/svg/widgets_24dp.svg +1 -0
  58. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/dialogs.py +3 -3
  59. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/version.py +1 -1
  60. electricalsim-0.0.8.22.dev0/src/electricalsim/egs_create_shortcut.py +0 -31
  61. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/.gitignore +0 -0
  62. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/LICENSE +0 -0
  63. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/README.md +0 -0
  64. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/README_PyPI.md +0 -0
  65. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/10_PF4.png +0 -0
  66. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/11_PF_tooltips.png +0 -0
  67. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/12_App_settings.png +0 -0
  68. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/13_Disabling_nodes.png +0 -0
  69. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/14_Context_menu.png +0 -0
  70. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/14_Context_menu.svg +0 -0
  71. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/15_Extension_manager.png +0 -0
  72. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/1_Main_Window.png +0 -0
  73. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/1_Main_Window_dark.png +0 -0
  74. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/2_Dialogs.png +0 -0
  75. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/3_Widgets.png +0 -0
  76. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/4_Pandapower_DataFrames.png +0 -0
  77. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/5_Connections_angle_b.png +0 -0
  78. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/5_Connections_curved_b.png +0 -0
  79. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/5_Connections_straight_b.png +0 -0
  80. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/6_Line_and_transformer_nodes.png +0 -0
  81. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/7_PF1.png +0 -0
  82. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/7_PF1_2.png +0 -0
  83. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/8_PF2.png +0 -0
  84. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/9_PF3.png +0 -0
  85. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/Export_dialog.png +0 -0
  86. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/Logo_CIESE_2021 y UTN_Sta_Fe.png +0 -0
  87. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/app_icon.png +0 -0
  88. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/dialog_connecting_buses.png +0 -0
  89. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/fuzzy_search.png +0 -0
  90. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/fuzzy_search2.png +0 -0
  91. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/img/slice_connections.png +0 -0
  92. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/__init__.py +0 -0
  93. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/base/__init__.py +0 -0
  94. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/base/commands.py +0 -0
  95. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/base/factory.py +0 -0
  96. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/base/graph.py +0 -0
  97. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/base/menu.py +0 -0
  98. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/base/model.py +0 -0
  99. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/base/node.py +0 -0
  100. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/base/port.py +0 -0
  101. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/constants.py +0 -0
  102. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/custom_widgets/__init__.py +0 -0
  103. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/custom_widgets/nodes_palette.py +0 -0
  104. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/custom_widgets/nodes_tree.py +0 -0
  105. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/custom_widgets/properties_bin/__init__.py +0 -0
  106. {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
  107. {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
  108. {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
  109. {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
  110. {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
  111. {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
  112. {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
  113. {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
  114. {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
  115. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/errors.py +0 -0
  116. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/nodes/__init__.py +0 -0
  117. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/nodes/backdrop_node.py +0 -0
  118. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/nodes/base_node.py +0 -0
  119. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/nodes/base_node_circle.py +0 -0
  120. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/nodes/group_node.py +0 -0
  121. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/nodes/port_node.py +0 -0
  122. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/pkg_info.py +0 -0
  123. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/__init__.py +0 -0
  124. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/node_abstract.py +0 -0
  125. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/node_backdrop.py +0 -0
  126. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/node_base.py +0 -0
  127. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/node_circle.py +0 -0
  128. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/node_group.py +0 -0
  129. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/node_overlay_disabled.py +0 -0
  130. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/node_port_in.py +0 -0
  131. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/node_port_out.py +0 -0
  132. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/node_text_item.py +0 -0
  133. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/pipe.py +0 -0
  134. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/port.py +0 -0
  135. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/qgraphics/slicer.py +0 -0
  136. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/widgets/__init__.py +0 -0
  137. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/widgets/actions.py +0 -0
  138. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/widgets/dialogs.py +0 -0
  139. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/widgets/icons/node_base.png +0 -0
  140. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/widgets/node_graph.py +0 -0
  141. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/widgets/node_widgets.py +0 -0
  142. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/widgets/scene.py +0 -0
  143. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/widgets/tab_search.py +0 -0
  144. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/widgets/viewer.py +0 -0
  145. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/NodeGraphQt6/widgets/viewer_nav.py +0 -0
  146. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/__init__.py +0 -0
  147. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/config.ini +0 -0
  148. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/egs_run.py +0 -0
  149. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/extensions/extension_classes.py +0 -0
  150. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/hotkeys/hotkey_functions.py +0 -0
  151. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/hotkeys/hotkeys.json +0 -0
  152. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/3w-transformer.svg +0 -0
  153. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/CIESE_UTN_Sta_Fe.png +0 -0
  154. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/app_icon.ico +0 -0
  155. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/app_icon.png +0 -0
  156. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/app_icon.svg +0 -0
  157. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/demand.svg +0 -0
  158. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/ext_grid.svg +0 -0
  159. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/generator.svg +0 -0
  160. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/icon_resources.qrc +0 -0
  161. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/impedance.svg +0 -0
  162. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/motor.svg +0 -0
  163. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/rc_icons.py +0 -0
  164. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/shunt.svg +0 -0
  165. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/splash_screen.svg +0 -0
  166. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/splash_screen_copy.svg +0 -0
  167. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/ssc.svg +0 -0
  168. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/storage.svg +0 -0
  169. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/svc.svg +0 -0
  170. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/switch_closed.svg +0 -0
  171. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/switch_opened.svg +0 -0
  172. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/tcsc.svg +0 -0
  173. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/transformer.svg +0 -0
  174. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/ward.svg +0 -0
  175. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/icons/xward.svg +0 -0
  176. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/lib/calculations.py +0 -0
  177. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/lib/electricalGraph.py +0 -0
  178. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/lib/main_components.py +0 -0
  179. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/lib/table_widget.py +0 -0
  180. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/about_dialog.ui +0 -0
  181. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/aload_dialog.ui +0 -0
  182. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/asgen_dialog.ui +0 -0
  183. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/bus_dialog.ui +0 -0
  184. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/choose_bus_switch.ui +0 -0
  185. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/choose_facts_type.ui +0 -0
  186. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/choose_generator_type.ui +0 -0
  187. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/choose_line_type.ui +0 -0
  188. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/choose_load_type.ui +0 -0
  189. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/choose_transformer_type.ui +0 -0
  190. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/connecting_buses_dialog.ui +0 -0
  191. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/dcline_dialog.ui +0 -0
  192. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/export_dialog.ui +0 -0
  193. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/ext_grid_dialog.ui +0 -0
  194. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/extension.ui +0 -0
  195. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/gen_dialog.ui +0 -0
  196. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/impedance_dialog.ui +0 -0
  197. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/line_dialog.ui +0 -0
  198. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/load_dialog.ui +0 -0
  199. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/main_window.ui +0 -0
  200. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/motor_dialog.ui +0 -0
  201. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/network_settings_dialog.ui +0 -0
  202. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/pf_settings_widget.ui +0 -0
  203. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/power_flow_dialog.ui +0 -0
  204. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/search_node_dialog.ui +0 -0
  205. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/settings_dialog.ui +0 -0
  206. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/sgen_dialog.ui +0 -0
  207. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/shunt_dialog.ui +0 -0
  208. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/ssc_dialog.ui +0 -0
  209. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/stdline_dialog.ui +0 -0
  210. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/stdtransformer3w_dialog.ui +0 -0
  211. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/stdtransformer_dialog.ui +0 -0
  212. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/storage_dialog.ui +0 -0
  213. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/svc_dialog.ui +0 -0
  214. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/switch_dialog.ui +0 -0
  215. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/tcsc_dialog.ui +0 -0
  216. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/transformer3w_dialog.ui +0 -0
  217. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/transformer_dialog.ui +0 -0
  218. {electricalsim-0.0.8.22.dev0 → electricalsim-0.0.8.22.dev1}/src/electricalsim/ui/ward_dialog.ui +0 -0
  219. {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.dev0
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.22dev0"
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 qdarktheme # Always import after Qt
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
- # qdarktheme.enable_hi_dpi()
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
- # qdarktheme.setup_theme(theme)
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
- qdarktheme.enable_hi_dpi()
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
- qdarktheme.setup_theme(theme, additional_qss="QToolTip { border: 0px; }")
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()
@@ -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('(\d+)', s)]
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('(\d+)', s[1])]
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))
@@ -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