PyDMConverter 1.0.3__tar.gz → 1.0.5__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 (180) hide show
  1. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/.github/workflows/gh-pages.yml +6 -3
  2. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/.github/workflows/lint.yml +2 -2
  3. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/.github/workflows/pypi_release.yml +3 -3
  4. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/.github/workflows/tests.yml +4 -4
  5. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/.gitignore +8 -0
  6. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/PKG-INFO +8 -3
  7. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/PyDMConverter.egg-info/PKG-INFO +8 -3
  8. pydmconverter-1.0.5/PyDMConverter.egg-info/SOURCES.txt +177 -0
  9. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/PyDMConverter.egg-info/requires.txt +8 -2
  10. pydmconverter-1.0.5/PyDMConverter.egg-info/scm_file_list.json +173 -0
  11. pydmconverter-1.0.5/PyDMConverter.egg-info/scm_version.json +8 -0
  12. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/app/src/model/options_model.py +6 -0
  13. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/app/src/view/main_window.py +20 -3
  14. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/app/src/view/options_window.py +9 -0
  15. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/pydmconverter/__main__.py +76 -7
  16. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/pydmconverter/custom_types.py +3 -2
  17. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/pydmconverter/edm/converter.py +3 -2
  18. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/pydmconverter/edm/converter_helpers.py +47 -85
  19. pydmconverter-1.0.5/pydmconverter/edm/edm_qt.py +142 -0
  20. pydmconverter-1.0.5/pydmconverter/edm/ir_adapter.py +570 -0
  21. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/pydmconverter/edm/parser.py +70 -43
  22. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/pydmconverter/edm/parser_helpers.py +219 -25
  23. pydmconverter-1.0.5/pydmconverter/ir/__init__.py +42 -0
  24. pydmconverter-1.0.5/pydmconverter/ir/base.py +27 -0
  25. pydmconverter-1.0.5/pydmconverter/ir/builder.py +198 -0
  26. pydmconverter-1.0.5/pydmconverter/ir/data/VENDORED_SCHEMA.md +25 -0
  27. pydmconverter-1.0.5/pydmconverter/ir/data/screen-ir.schema.json +163 -0
  28. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/.beaver-snapshot-sha +1 -0
  29. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/absolute-canvas.json +35 -0
  30. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/arc.json +69 -0
  31. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/ellipse.json +63 -0
  32. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/embedded-display.json +55 -0
  33. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/frame.json +52 -0
  34. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/group-box.json +44 -0
  35. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/group.json +41 -0
  36. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/image-view.json +51 -0
  37. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/line.json +78 -0
  38. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/pv-button.json +57 -0
  39. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/pv-byte-led.json +58 -0
  40. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/pv-checkbox.json +55 -0
  41. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/pv-enum-combobox.json +49 -0
  42. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/pv-label.json +77 -0
  43. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/pv-led.json +50 -0
  44. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/pv-meter.json +56 -0
  45. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/pv-progress-bar.json +62 -0
  46. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/pv-radio-group.json +53 -0
  47. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/pv-slider.json +58 -0
  48. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/pv-text-input.json +57 -0
  49. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/qwidget-container.json +44 -0
  50. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/rectangle.json +64 -0
  51. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/regular-button.json +62 -0
  52. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/related-display-button.json +60 -0
  53. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/scroll-area.json +52 -0
  54. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/shell-command-button.json +59 -0
  55. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/tabs.json +50 -0
  56. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/text-label.json +60 -0
  57. pydmconverter-1.0.5/pydmconverter/ir/data/widget-registry/waveform-plot.json +62 -0
  58. pydmconverter-1.0.5/pydmconverter/ir/emit.py +56 -0
  59. pydmconverter-1.0.5/pydmconverter/ir/fox.py +65 -0
  60. pydmconverter-1.0.5/pydmconverter/ir/ids.py +73 -0
  61. pydmconverter-1.0.5/pydmconverter/ir/macros.py +34 -0
  62. pydmconverter-1.0.5/pydmconverter/ir/model.py +177 -0
  63. pydmconverter-1.0.5/pydmconverter/ir/registry.py +120 -0
  64. pydmconverter-1.0.5/pydmconverter/ir/schema.py +38 -0
  65. pydmconverter-1.0.5/pydmconverter/ir/source.py +80 -0
  66. pydmconverter-1.0.5/pydmconverter/ir/transforms.py +200 -0
  67. pydmconverter-1.0.5/pydmconverter/react.py +146 -0
  68. pydmconverter-1.0.5/pydmconverter/ui/__init__.py +6 -0
  69. pydmconverter-1.0.5/pydmconverter/ui/ir_adapter.py +181 -0
  70. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/pydmconverter/widgets.py +38 -0
  71. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/pydmconverter/widgets_helpers.py +29 -11
  72. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/pyproject.toml +13 -4
  73. pydmconverter-1.0.5/tests/edm/fixtures/basic_widgets.edl +74 -0
  74. pydmconverter-1.0.5/tests/edm/fixtures/byte_and_related.edl +47 -0
  75. pydmconverter-1.0.5/tests/edm/fixtures/colors.edl +83 -0
  76. pydmconverter-1.0.5/tests/edm/fixtures/colors.list +12 -0
  77. pydmconverter-1.0.5/tests/edm/fixtures/exit_button.edl +49 -0
  78. pydmconverter-1.0.5/tests/edm/fixtures/graphics_arc.edl +61 -0
  79. pydmconverter-1.0.5/tests/edm/fixtures/graphics_bars.edl +64 -0
  80. pydmconverter-1.0.5/tests/edm/fixtures/graphics_circle.edl +29 -0
  81. pydmconverter-1.0.5/tests/edm/fixtures/graphics_group.edl +93 -0
  82. pydmconverter-1.0.5/tests/edm/fixtures/graphics_line.edl +90 -0
  83. pydmconverter-1.0.5/tests/edm/fixtures/graphics_rect.edl +62 -0
  84. pydmconverter-1.0.5/tests/edm/fixtures/indicator.edl +34 -0
  85. pydmconverter-1.0.5/tests/edm/fixtures/integration_combined.edl +242 -0
  86. pydmconverter-1.0.5/tests/edm/fixtures/integration_combined.screen.json +285 -0
  87. pydmconverter-1.0.5/tests/edm/fixtures/meter.edl +43 -0
  88. pydmconverter-1.0.5/tests/edm/fixtures/misc_buttons.edl +83 -0
  89. pydmconverter-1.0.5/tests/edm/fixtures/mmv_multiline.edl +52 -0
  90. pydmconverter-1.0.5/tests/edm/fixtures/png.edl +27 -0
  91. pydmconverter-1.0.5/tests/edm/fixtures/radio.edl +30 -0
  92. pydmconverter-1.0.5/tests/edm/fixtures/shell_cmd.edl +38 -0
  93. pydmconverter-1.0.5/tests/edm/fixtures/textdsp.edl +60 -0
  94. pydmconverter-1.0.5/tests/edm/fixtures/unknown.edl +29 -0
  95. pydmconverter-1.0.5/tests/edm/fixtures/visibility.edl +62 -0
  96. pydmconverter-1.0.5/tests/edm/test_byte_and_related.py +26 -0
  97. pydmconverter-1.0.5/tests/edm/test_colors.py +135 -0
  98. pydmconverter-1.0.5/tests/edm/test_control_widgets.py +213 -0
  99. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/tests/edm/test_converter.py +92 -0
  100. pydmconverter-1.0.5/tests/edm/test_graphics_widgets.py +219 -0
  101. pydmconverter-1.0.5/tests/edm/test_integration_combined.py +82 -0
  102. pydmconverter-1.0.5/tests/edm/test_ir_adapter.py +71 -0
  103. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/tests/edm/test_parser.py +81 -0
  104. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/tests/edm/test_parser_helpers.py +104 -4
  105. pydmconverter-1.0.5/tests/edm/test_visibility_rules.py +54 -0
  106. pydmconverter-1.0.5/tests/ir/__init__.py +0 -0
  107. pydmconverter-1.0.5/tests/ir/conftest.py +69 -0
  108. pydmconverter-1.0.5/tests/ir/test_ir_builder.py +224 -0
  109. pydmconverter-1.0.5/tests/ir/test_ir_emit.py +50 -0
  110. pydmconverter-1.0.5/tests/ir/test_ir_fox.py +41 -0
  111. pydmconverter-1.0.5/tests/ir/test_ir_ids.py +38 -0
  112. pydmconverter-1.0.5/tests/ir/test_ir_model.py +88 -0
  113. pydmconverter-1.0.5/tests/ir/test_ir_registry.py +139 -0
  114. pydmconverter-1.0.5/tests/ir/test_ir_schema.py +82 -0
  115. pydmconverter-1.0.5/tests/ir/test_ir_transforms.py +106 -0
  116. pydmconverter-1.0.5/tests/test_headless_import.py +35 -0
  117. pydmconverter-1.0.5/tests/test_options_model.py +38 -0
  118. pydmconverter-1.0.5/tests/test_react.py +72 -0
  119. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/tests/test_widgets.py +41 -0
  120. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/tests/test_widgets_helpers.py +56 -0
  121. pydmconverter-1.0.5/tests/ui/__init__.py +0 -0
  122. pydmconverter-1.0.5/tests/ui/fixtures/basic_widgets.ui +75 -0
  123. pydmconverter-1.0.5/tests/ui/fixtures/byte_and_related.ui +46 -0
  124. pydmconverter-1.0.5/tests/ui/fixtures/newly_supported.ui +88 -0
  125. pydmconverter-1.0.5/tests/ui/test_byte_and_related.py +50 -0
  126. pydmconverter-1.0.5/tests/ui/test_ir_adapter.py +153 -0
  127. pydmconverter-1.0.3/PyDMConverter.egg-info/SOURCES.txt +0 -77
  128. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  129. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
  130. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/.pre-commit-config.yaml +0 -0
  131. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/LICENSE +0 -0
  132. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/PyDMConverter.egg-info/dependency_links.txt +0 -0
  133. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/PyDMConverter.egg-info/entry_points.txt +0 -0
  134. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/PyDMConverter.egg-info/top_level.txt +0 -0
  135. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/README.md +0 -0
  136. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/app/resources/file_minus.png +0 -0
  137. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/app/resources/file_plus.png +0 -0
  138. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/app/resources/file_x.png +0 -0
  139. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/app/resources/folder_plus.png +0 -0
  140. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/app/resources/folder_search.png +0 -0
  141. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/app/resources/play_circle_outline.png +0 -0
  142. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/app/resources/settings.png +0 -0
  143. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/app/src/model/__init__.py +0 -0
  144. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/app/src/model/app_model.py +0 -0
  145. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/app/src/view/__init__.py +0 -0
  146. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/app/src/view/file_select_widget.py +0 -0
  147. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/app/src/view/main_window.ui +0 -0
  148. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/app/src/view/output_select_dialog.py +0 -0
  149. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/docs/arguments.md +0 -0
  150. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/docs/images/pydmconverter.png +0 -0
  151. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/docs/index.md +0 -0
  152. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/docs/reference/custom_types.md +0 -0
  153. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/docs/reference/edm/converter.md +0 -0
  154. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/docs/reference/edm/converter_helpers.md +0 -0
  155. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/docs/reference/edm/menumux.md +0 -0
  156. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/docs/reference/edm/parser.md +0 -0
  157. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/docs/reference/edm/parser_helpers.md +0 -0
  158. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/docs/reference/index.md +0 -0
  159. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/docs/reference/pydm-converter-tool.md +0 -0
  160. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/docs/reference/widgets.md +0 -0
  161. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/docs/reference/widgets_helpers.md +0 -0
  162. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/docs/user_guide.md +0 -0
  163. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/environment.yml +0 -0
  164. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/examples/TEM_mapping.edl +0 -0
  165. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/examples/all_bsy0_main.edl +0 -0
  166. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/examples/all_bsy0_main_with_groups.edl +0 -0
  167. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/examples/prosilica.edl +0 -0
  168. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/mkdocs.yml +0 -0
  169. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/pydmconverter/__init__.py +0 -0
  170. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/pydmconverter/edm/__init__.py +0 -0
  171. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/pydmconverter/edm/menumux.py +0 -0
  172. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/pydmconverter/exceptions.py +0 -0
  173. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/pydmconverter/launch_gui.sh +0 -0
  174. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/pydmconverter/sites/__init__.py +0 -0
  175. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/pydmconverter/sites/slac.py +0 -0
  176. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/setup.cfg +0 -0
  177. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/tests/__init__.py +0 -0
  178. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/tests/edm/test_converter_helpers.py +0 -0
  179. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/tests/test_main.py +0 -0
  180. {pydmconverter-1.0.3 → pydmconverter-1.0.5}/tests/test_sites.py +0 -0
@@ -7,6 +7,9 @@ on:
7
7
  branches:
8
8
  - main
9
9
 
10
+ permissions:
11
+ contents: write
12
+
10
13
  jobs:
11
14
  deploy:
12
15
  if: ${{ github.repository == 'slaclab/pydm-converter-tool' }}
@@ -16,8 +19,8 @@ jobs:
16
19
  os: [ubuntu-latest]
17
20
  python-version: [3.9]
18
21
  steps:
19
- - uses: actions/checkout@v4
20
- - uses: conda-incubator/setup-miniconda@v3
22
+ - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
23
+ - uses: conda-incubator/setup-miniconda@fc2d68f6413eb2d87b895e92f8584b5b94a10167 # v3
21
24
  with:
22
25
  miniforge-version: latest
23
26
  use-mamba: true
@@ -32,7 +35,7 @@ jobs:
32
35
  mkdocs build
33
36
 
34
37
  - name: Deploy to gh-pages
35
- uses: peaceiris/actions-gh-pages@v4
38
+ uses: peaceiris/actions-gh-pages@84c30a85c19949d7eee79c4ff27748b70285e453 # v4
36
39
  with:
37
40
  github_token: ${{ secrets.GITHUB_TOKEN }}
38
41
  publish_dir: ./site/
@@ -8,11 +8,11 @@ jobs:
8
8
  lint:
9
9
  runs-on: ubuntu-latest
10
10
  steps:
11
- - uses: actions/checkout@v4
11
+ - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
12
12
  with:
13
13
  fetch-depth: 1
14
14
  - name: Install Python
15
- uses: actions/setup-python@v5
15
+ uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
16
16
  with:
17
17
  python-version: "3.12"
18
18
  - name: Install dependencies
@@ -11,11 +11,11 @@ jobs:
11
11
  permissions:
12
12
  id-token: write # IMPORTANT: this permission is mandatory for trusted publishing
13
13
  steps:
14
- - uses: actions/checkout@v4
14
+ - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
15
15
  with:
16
16
  fetch-depth: 0
17
17
  - name: Set up Python 3.12
18
- uses: actions/setup-python@v5
18
+ uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
19
19
  with:
20
20
  python-version: 3.12
21
21
  - name: Install pypa/build
@@ -25,4 +25,4 @@ jobs:
25
25
  run: |
26
26
  python -m build --sdist --outdir dist/ .
27
27
  - name: Publish package distributions to PyPI
28
- uses: pypa/gh-action-pypi-publish@release/v1
28
+ uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # release/v1
@@ -20,10 +20,10 @@ jobs:
20
20
  DISPLAY: ':99.0'
21
21
  QT_MAC_WANTS_LAYER: 1 # PyQT gui tests involving qtbot interaction on macOS will fail without this
22
22
  steps:
23
- - uses: actions/checkout@v4
23
+ - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
24
24
 
25
25
  - name: Setup Miniforge
26
- uses: conda-incubator/setup-miniconda@v3
26
+ uses: conda-incubator/setup-miniconda@fc2d68f6413eb2d87b895e92f8584b5b94a10167 # v3
27
27
  with:
28
28
  miniforge-version: latest
29
29
  activate-environment: pydm-converter-tool-dev
@@ -54,11 +54,11 @@ jobs:
54
54
  test-pypi-build:
55
55
  runs-on: ubuntu-latest
56
56
  steps:
57
- - uses: actions/checkout@v4
57
+ - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
58
58
  with:
59
59
  fetch-depth: 0
60
60
  - name: Set up Python 3.10
61
- uses: actions/setup-python@v5
61
+ uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
62
62
  with:
63
63
  python-version: '3.10'
64
64
  - name: Install pypa/build
@@ -119,3 +119,11 @@ ENV/
119
119
  .vscode/
120
120
 
121
121
  *.json
122
+
123
+ # Canopy IR data files (generated schema + vendored widget registry) are tracked assets
124
+ !pydmconverter/ir/data/*.json
125
+ !pydmconverter/ir/data/widget-registry/*.json
126
+
127
+ # EDM->IR combined integration snapshot (committed regression fixture;
128
+ # see tests/edm/test_integration_combined.py for how to regenerate it deliberately)
129
+ !tests/edm/fixtures/integration_combined.screen.json
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyDMConverter
3
- Version: 1.0.3
3
+ Version: 1.0.5
4
4
  Summary: converter to generate pydm .ui files from other display managers.
5
5
  Author: Devan Agrawal, Zach Domke, Ryan McClanahan, Alexander Ng, Logan Somoza, Alexandria Ikuma
6
6
  Author-email: Yekta Yazar <yazar@slac.stanford.edu>
@@ -692,13 +692,18 @@ Classifier: Topic :: Scientific/Engineering
692
692
  Requires-Python: >=3.10
693
693
  Description-Content-Type: text/markdown
694
694
  License-File: LICENSE
695
- Requires-Dist: pydm
696
- Requires-Dist: pyqt5
695
+ Requires-Dist: pydantic>=2
696
+ Requires-Dist: jsonschema>=4
697
+ Provides-Extra: gui
698
+ Requires-Dist: pydm; extra == "gui"
699
+ Requires-Dist: pyqt5; extra == "gui"
697
700
  Provides-Extra: dev
698
701
  Requires-Dist: pytest; extra == "dev"
699
702
  Requires-Dist: pytest-cov; extra == "dev"
700
703
  Requires-Dist: pytest-qt; extra == "dev"
701
704
  Requires-Dist: pytest-mock; extra == "dev"
705
+ Requires-Dist: pydm; extra == "dev"
706
+ Requires-Dist: pyqt5; extra == "dev"
702
707
  Dynamic: license-file
703
708
 
704
709
  # PyDM Converter
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyDMConverter
3
- Version: 1.0.3
3
+ Version: 1.0.5
4
4
  Summary: converter to generate pydm .ui files from other display managers.
5
5
  Author: Devan Agrawal, Zach Domke, Ryan McClanahan, Alexander Ng, Logan Somoza, Alexandria Ikuma
6
6
  Author-email: Yekta Yazar <yazar@slac.stanford.edu>
@@ -692,13 +692,18 @@ Classifier: Topic :: Scientific/Engineering
692
692
  Requires-Python: >=3.10
693
693
  Description-Content-Type: text/markdown
694
694
  License-File: LICENSE
695
- Requires-Dist: pydm
696
- Requires-Dist: pyqt5
695
+ Requires-Dist: pydantic>=2
696
+ Requires-Dist: jsonschema>=4
697
+ Provides-Extra: gui
698
+ Requires-Dist: pydm; extra == "gui"
699
+ Requires-Dist: pyqt5; extra == "gui"
697
700
  Provides-Extra: dev
698
701
  Requires-Dist: pytest; extra == "dev"
699
702
  Requires-Dist: pytest-cov; extra == "dev"
700
703
  Requires-Dist: pytest-qt; extra == "dev"
701
704
  Requires-Dist: pytest-mock; extra == "dev"
705
+ Requires-Dist: pydm; extra == "dev"
706
+ Requires-Dist: pyqt5; extra == "dev"
702
707
  Dynamic: license-file
703
708
 
704
709
  # PyDM Converter
@@ -0,0 +1,177 @@
1
+ .gitignore
2
+ .pre-commit-config.yaml
3
+ LICENSE
4
+ README.md
5
+ environment.yml
6
+ mkdocs.yml
7
+ pyproject.toml
8
+ .github/ISSUE_TEMPLATE/bug-report.yml
9
+ .github/ISSUE_TEMPLATE/feature-request.yml
10
+ .github/workflows/gh-pages.yml
11
+ .github/workflows/lint.yml
12
+ .github/workflows/pypi_release.yml
13
+ .github/workflows/tests.yml
14
+ PyDMConverter.egg-info/PKG-INFO
15
+ PyDMConverter.egg-info/SOURCES.txt
16
+ PyDMConverter.egg-info/dependency_links.txt
17
+ PyDMConverter.egg-info/entry_points.txt
18
+ PyDMConverter.egg-info/requires.txt
19
+ PyDMConverter.egg-info/scm_file_list.json
20
+ PyDMConverter.egg-info/scm_version.json
21
+ PyDMConverter.egg-info/top_level.txt
22
+ app/resources/file_minus.png
23
+ app/resources/file_plus.png
24
+ app/resources/file_x.png
25
+ app/resources/folder_plus.png
26
+ app/resources/folder_search.png
27
+ app/resources/play_circle_outline.png
28
+ app/resources/settings.png
29
+ app/src/model/__init__.py
30
+ app/src/model/app_model.py
31
+ app/src/model/options_model.py
32
+ app/src/view/__init__.py
33
+ app/src/view/file_select_widget.py
34
+ app/src/view/main_window.py
35
+ app/src/view/main_window.ui
36
+ app/src/view/options_window.py
37
+ app/src/view/output_select_dialog.py
38
+ docs/arguments.md
39
+ docs/index.md
40
+ docs/user_guide.md
41
+ docs/images/pydmconverter.png
42
+ docs/reference/custom_types.md
43
+ docs/reference/index.md
44
+ docs/reference/pydm-converter-tool.md
45
+ docs/reference/widgets.md
46
+ docs/reference/widgets_helpers.md
47
+ docs/reference/edm/converter.md
48
+ docs/reference/edm/converter_helpers.md
49
+ docs/reference/edm/menumux.md
50
+ docs/reference/edm/parser.md
51
+ docs/reference/edm/parser_helpers.md
52
+ examples/TEM_mapping.edl
53
+ examples/all_bsy0_main.edl
54
+ examples/all_bsy0_main_with_groups.edl
55
+ examples/prosilica.edl
56
+ pydmconverter/__init__.py
57
+ pydmconverter/__main__.py
58
+ pydmconverter/custom_types.py
59
+ pydmconverter/exceptions.py
60
+ pydmconverter/launch_gui.sh
61
+ pydmconverter/react.py
62
+ pydmconverter/widgets.py
63
+ pydmconverter/widgets_helpers.py
64
+ pydmconverter/edm/__init__.py
65
+ pydmconverter/edm/converter.py
66
+ pydmconverter/edm/converter_helpers.py
67
+ pydmconverter/edm/edm_qt.py
68
+ pydmconverter/edm/ir_adapter.py
69
+ pydmconverter/edm/menumux.py
70
+ pydmconverter/edm/parser.py
71
+ pydmconverter/edm/parser_helpers.py
72
+ pydmconverter/ir/__init__.py
73
+ pydmconverter/ir/base.py
74
+ pydmconverter/ir/builder.py
75
+ pydmconverter/ir/emit.py
76
+ pydmconverter/ir/fox.py
77
+ pydmconverter/ir/ids.py
78
+ pydmconverter/ir/macros.py
79
+ pydmconverter/ir/model.py
80
+ pydmconverter/ir/registry.py
81
+ pydmconverter/ir/schema.py
82
+ pydmconverter/ir/source.py
83
+ pydmconverter/ir/transforms.py
84
+ pydmconverter/ir/data/VENDORED_SCHEMA.md
85
+ pydmconverter/ir/data/screen-ir.schema.json
86
+ pydmconverter/ir/data/widget-registry/.beaver-snapshot-sha
87
+ pydmconverter/ir/data/widget-registry/absolute-canvas.json
88
+ pydmconverter/ir/data/widget-registry/arc.json
89
+ pydmconverter/ir/data/widget-registry/ellipse.json
90
+ pydmconverter/ir/data/widget-registry/embedded-display.json
91
+ pydmconverter/ir/data/widget-registry/frame.json
92
+ pydmconverter/ir/data/widget-registry/group-box.json
93
+ pydmconverter/ir/data/widget-registry/group.json
94
+ pydmconverter/ir/data/widget-registry/image-view.json
95
+ pydmconverter/ir/data/widget-registry/line.json
96
+ pydmconverter/ir/data/widget-registry/pv-button.json
97
+ pydmconverter/ir/data/widget-registry/pv-byte-led.json
98
+ pydmconverter/ir/data/widget-registry/pv-checkbox.json
99
+ pydmconverter/ir/data/widget-registry/pv-enum-combobox.json
100
+ pydmconverter/ir/data/widget-registry/pv-label.json
101
+ pydmconverter/ir/data/widget-registry/pv-led.json
102
+ pydmconverter/ir/data/widget-registry/pv-meter.json
103
+ pydmconverter/ir/data/widget-registry/pv-progress-bar.json
104
+ pydmconverter/ir/data/widget-registry/pv-radio-group.json
105
+ pydmconverter/ir/data/widget-registry/pv-slider.json
106
+ pydmconverter/ir/data/widget-registry/pv-text-input.json
107
+ pydmconverter/ir/data/widget-registry/qwidget-container.json
108
+ pydmconverter/ir/data/widget-registry/rectangle.json
109
+ pydmconverter/ir/data/widget-registry/regular-button.json
110
+ pydmconverter/ir/data/widget-registry/related-display-button.json
111
+ pydmconverter/ir/data/widget-registry/scroll-area.json
112
+ pydmconverter/ir/data/widget-registry/shell-command-button.json
113
+ pydmconverter/ir/data/widget-registry/tabs.json
114
+ pydmconverter/ir/data/widget-registry/text-label.json
115
+ pydmconverter/ir/data/widget-registry/waveform-plot.json
116
+ pydmconverter/sites/__init__.py
117
+ pydmconverter/sites/slac.py
118
+ pydmconverter/ui/__init__.py
119
+ pydmconverter/ui/ir_adapter.py
120
+ tests/__init__.py
121
+ tests/test_headless_import.py
122
+ tests/test_main.py
123
+ tests/test_options_model.py
124
+ tests/test_react.py
125
+ tests/test_sites.py
126
+ tests/test_widgets.py
127
+ tests/test_widgets_helpers.py
128
+ tests/edm/test_byte_and_related.py
129
+ tests/edm/test_colors.py
130
+ tests/edm/test_control_widgets.py
131
+ tests/edm/test_converter.py
132
+ tests/edm/test_converter_helpers.py
133
+ tests/edm/test_graphics_widgets.py
134
+ tests/edm/test_integration_combined.py
135
+ tests/edm/test_ir_adapter.py
136
+ tests/edm/test_parser.py
137
+ tests/edm/test_parser_helpers.py
138
+ tests/edm/test_visibility_rules.py
139
+ tests/edm/fixtures/basic_widgets.edl
140
+ tests/edm/fixtures/byte_and_related.edl
141
+ tests/edm/fixtures/colors.edl
142
+ tests/edm/fixtures/colors.list
143
+ tests/edm/fixtures/exit_button.edl
144
+ tests/edm/fixtures/graphics_arc.edl
145
+ tests/edm/fixtures/graphics_bars.edl
146
+ tests/edm/fixtures/graphics_circle.edl
147
+ tests/edm/fixtures/graphics_group.edl
148
+ tests/edm/fixtures/graphics_line.edl
149
+ tests/edm/fixtures/graphics_rect.edl
150
+ tests/edm/fixtures/indicator.edl
151
+ tests/edm/fixtures/integration_combined.edl
152
+ tests/edm/fixtures/integration_combined.screen.json
153
+ tests/edm/fixtures/meter.edl
154
+ tests/edm/fixtures/misc_buttons.edl
155
+ tests/edm/fixtures/mmv_multiline.edl
156
+ tests/edm/fixtures/png.edl
157
+ tests/edm/fixtures/radio.edl
158
+ tests/edm/fixtures/shell_cmd.edl
159
+ tests/edm/fixtures/textdsp.edl
160
+ tests/edm/fixtures/unknown.edl
161
+ tests/edm/fixtures/visibility.edl
162
+ tests/ir/__init__.py
163
+ tests/ir/conftest.py
164
+ tests/ir/test_ir_builder.py
165
+ tests/ir/test_ir_emit.py
166
+ tests/ir/test_ir_fox.py
167
+ tests/ir/test_ir_ids.py
168
+ tests/ir/test_ir_model.py
169
+ tests/ir/test_ir_registry.py
170
+ tests/ir/test_ir_schema.py
171
+ tests/ir/test_ir_transforms.py
172
+ tests/ui/__init__.py
173
+ tests/ui/test_byte_and_related.py
174
+ tests/ui/test_ir_adapter.py
175
+ tests/ui/fixtures/basic_widgets.ui
176
+ tests/ui/fixtures/byte_and_related.ui
177
+ tests/ui/fixtures/newly_supported.ui
@@ -1,8 +1,14 @@
1
- pydm
2
- pyqt5
1
+ pydantic>=2
2
+ jsonschema>=4
3
3
 
4
4
  [dev]
5
5
  pytest
6
6
  pytest-cov
7
7
  pytest-qt
8
8
  pytest-mock
9
+ pydm
10
+ pyqt5
11
+
12
+ [gui]
13
+ pydm
14
+ pyqt5
@@ -0,0 +1,173 @@
1
+ {
2
+ "files": [
3
+ ".pre-commit-config.yaml",
4
+ "README.md",
5
+ "environment.yml",
6
+ "LICENSE",
7
+ "pyproject.toml",
8
+ "mkdocs.yml",
9
+ ".gitignore",
10
+ "docs/arguments.md",
11
+ "docs/user_guide.md",
12
+ "docs/index.md",
13
+ "docs/images/pydmconverter.png",
14
+ "docs/reference/widgets_helpers.md",
15
+ "docs/reference/widgets.md",
16
+ "docs/reference/custom_types.md",
17
+ "docs/reference/pydm-converter-tool.md",
18
+ "docs/reference/index.md",
19
+ "docs/reference/edm/parser_helpers.md",
20
+ "docs/reference/edm/parser.md",
21
+ "docs/reference/edm/menumux.md",
22
+ "docs/reference/edm/converter.md",
23
+ "docs/reference/edm/converter_helpers.md",
24
+ "tests/test_react.py",
25
+ "tests/test_headless_import.py",
26
+ "tests/__init__.py",
27
+ "tests/test_widgets_helpers.py",
28
+ "tests/test_widgets.py",
29
+ "tests/test_sites.py",
30
+ "tests/test_options_model.py",
31
+ "tests/test_main.py",
32
+ "tests/ir/test_ir_transforms.py",
33
+ "tests/ir/test_ir_fox.py",
34
+ "tests/ir/test_ir_ids.py",
35
+ "tests/ir/__init__.py",
36
+ "tests/ir/test_ir_model.py",
37
+ "tests/ir/test_ir_builder.py",
38
+ "tests/ir/conftest.py",
39
+ "tests/ir/test_ir_registry.py",
40
+ "tests/ir/test_ir_emit.py",
41
+ "tests/ir/test_ir_schema.py",
42
+ "tests/ui/__init__.py",
43
+ "tests/ui/test_ir_adapter.py",
44
+ "tests/ui/test_byte_and_related.py",
45
+ "tests/ui/fixtures/byte_and_related.ui",
46
+ "tests/ui/fixtures/basic_widgets.ui",
47
+ "tests/ui/fixtures/newly_supported.ui",
48
+ "tests/edm/test_converter_helpers.py",
49
+ "tests/edm/test_ir_adapter.py",
50
+ "tests/edm/test_parser_helpers.py",
51
+ "tests/edm/test_integration_combined.py",
52
+ "tests/edm/test_parser.py",
53
+ "tests/edm/test_converter.py",
54
+ "tests/edm/test_byte_and_related.py",
55
+ "tests/edm/test_graphics_widgets.py",
56
+ "tests/edm/test_control_widgets.py",
57
+ "tests/edm/test_colors.py",
58
+ "tests/edm/test_visibility_rules.py",
59
+ "tests/edm/fixtures/graphics_arc.edl",
60
+ "tests/edm/fixtures/textdsp.edl",
61
+ "tests/edm/fixtures/graphics_rect.edl",
62
+ "tests/edm/fixtures/unknown.edl",
63
+ "tests/edm/fixtures/exit_button.edl",
64
+ "tests/edm/fixtures/basic_widgets.edl",
65
+ "tests/edm/fixtures/integration_combined.edl",
66
+ "tests/edm/fixtures/visibility.edl",
67
+ "tests/edm/fixtures/shell_cmd.edl",
68
+ "tests/edm/fixtures/colors.list",
69
+ "tests/edm/fixtures/graphics_bars.edl",
70
+ "tests/edm/fixtures/mmv_multiline.edl",
71
+ "tests/edm/fixtures/misc_buttons.edl",
72
+ "tests/edm/fixtures/colors.edl",
73
+ "tests/edm/fixtures/graphics_line.edl",
74
+ "tests/edm/fixtures/radio.edl",
75
+ "tests/edm/fixtures/indicator.edl",
76
+ "tests/edm/fixtures/byte_and_related.edl",
77
+ "tests/edm/fixtures/png.edl",
78
+ "tests/edm/fixtures/integration_combined.screen.json",
79
+ "tests/edm/fixtures/graphics_circle.edl",
80
+ "tests/edm/fixtures/meter.edl",
81
+ "tests/edm/fixtures/graphics_group.edl",
82
+ "app/resources/file_minus.png",
83
+ "app/resources/folder_search.png",
84
+ "app/resources/play_circle_outline.png",
85
+ "app/resources/settings.png",
86
+ "app/resources/file_plus.png",
87
+ "app/resources/file_x.png",
88
+ "app/resources/folder_plus.png",
89
+ "app/src/view/output_select_dialog.py",
90
+ "app/src/view/main_window.ui",
91
+ "app/src/view/__init__.py",
92
+ "app/src/view/main_window.py",
93
+ "app/src/view/file_select_widget.py",
94
+ "app/src/view/options_window.py",
95
+ "app/src/model/__init__.py",
96
+ "app/src/model/app_model.py",
97
+ "app/src/model/options_model.py",
98
+ "pydmconverter/react.py",
99
+ "pydmconverter/widgets.py",
100
+ "pydmconverter/__init__.py",
101
+ "pydmconverter/exceptions.py",
102
+ "pydmconverter/launch_gui.sh",
103
+ "pydmconverter/widgets_helpers.py",
104
+ "pydmconverter/custom_types.py",
105
+ "pydmconverter/__main__.py",
106
+ "pydmconverter/ir/model.py",
107
+ "pydmconverter/ir/__init__.py",
108
+ "pydmconverter/ir/source.py",
109
+ "pydmconverter/ir/schema.py",
110
+ "pydmconverter/ir/fox.py",
111
+ "pydmconverter/ir/emit.py",
112
+ "pydmconverter/ir/transforms.py",
113
+ "pydmconverter/ir/ids.py",
114
+ "pydmconverter/ir/builder.py",
115
+ "pydmconverter/ir/macros.py",
116
+ "pydmconverter/ir/registry.py",
117
+ "pydmconverter/ir/base.py",
118
+ "pydmconverter/ir/data/screen-ir.schema.json",
119
+ "pydmconverter/ir/data/VENDORED_SCHEMA.md",
120
+ "pydmconverter/ir/data/widget-registry/qwidget-container.json",
121
+ "pydmconverter/ir/data/widget-registry/rectangle.json",
122
+ "pydmconverter/ir/data/widget-registry/pv-byte-led.json",
123
+ "pydmconverter/ir/data/widget-registry/pv-label.json",
124
+ "pydmconverter/ir/data/widget-registry/pv-button.json",
125
+ "pydmconverter/ir/data/widget-registry/regular-button.json",
126
+ "pydmconverter/ir/data/widget-registry/pv-progress-bar.json",
127
+ "pydmconverter/ir/data/widget-registry/text-label.json",
128
+ "pydmconverter/ir/data/widget-registry/pv-slider.json",
129
+ "pydmconverter/ir/data/widget-registry/tabs.json",
130
+ "pydmconverter/ir/data/widget-registry/ellipse.json",
131
+ "pydmconverter/ir/data/widget-registry/pv-checkbox.json",
132
+ "pydmconverter/ir/data/widget-registry/group-box.json",
133
+ "pydmconverter/ir/data/widget-registry/image-view.json",
134
+ "pydmconverter/ir/data/widget-registry/group.json",
135
+ "pydmconverter/ir/data/widget-registry/pv-enum-combobox.json",
136
+ "pydmconverter/ir/data/widget-registry/line.json",
137
+ "pydmconverter/ir/data/widget-registry/pv-text-input.json",
138
+ "pydmconverter/ir/data/widget-registry/.beaver-snapshot-sha",
139
+ "pydmconverter/ir/data/widget-registry/scroll-area.json",
140
+ "pydmconverter/ir/data/widget-registry/absolute-canvas.json",
141
+ "pydmconverter/ir/data/widget-registry/frame.json",
142
+ "pydmconverter/ir/data/widget-registry/pv-meter.json",
143
+ "pydmconverter/ir/data/widget-registry/arc.json",
144
+ "pydmconverter/ir/data/widget-registry/embedded-display.json",
145
+ "pydmconverter/ir/data/widget-registry/waveform-plot.json",
146
+ "pydmconverter/ir/data/widget-registry/shell-command-button.json",
147
+ "pydmconverter/ir/data/widget-registry/related-display-button.json",
148
+ "pydmconverter/ir/data/widget-registry/pv-radio-group.json",
149
+ "pydmconverter/ir/data/widget-registry/pv-led.json",
150
+ "pydmconverter/ui/__init__.py",
151
+ "pydmconverter/ui/ir_adapter.py",
152
+ "pydmconverter/sites/__init__.py",
153
+ "pydmconverter/sites/slac.py",
154
+ "pydmconverter/edm/__init__.py",
155
+ "pydmconverter/edm/ir_adapter.py",
156
+ "pydmconverter/edm/converter_helpers.py",
157
+ "pydmconverter/edm/menumux.py",
158
+ "pydmconverter/edm/parser.py",
159
+ "pydmconverter/edm/converter.py",
160
+ "pydmconverter/edm/edm_qt.py",
161
+ "pydmconverter/edm/parser_helpers.py",
162
+ "examples/prosilica.edl",
163
+ "examples/TEM_mapping.edl",
164
+ "examples/all_bsy0_main.edl",
165
+ "examples/all_bsy0_main_with_groups.edl",
166
+ ".github/ISSUE_TEMPLATE/feature-request.yml",
167
+ ".github/ISSUE_TEMPLATE/bug-report.yml",
168
+ ".github/workflows/pypi_release.yml",
169
+ ".github/workflows/tests.yml",
170
+ ".github/workflows/lint.yml",
171
+ ".github/workflows/gh-pages.yml"
172
+ ]
173
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "1.0.5",
3
+ "distance": 0,
4
+ "node": "g7cbd6b5e2dea4189905b196980ab68efcb1ec455",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-07-10"
8
+ }
@@ -13,6 +13,7 @@ class OptionsModel:
13
13
  def __init__(self):
14
14
  # General options
15
15
  self.output_folder = None
16
+ self.override_existing = False
16
17
 
17
18
  # EDM options
18
19
  self.edm_override_def_colors = False
@@ -39,6 +40,9 @@ class OptionsModel:
39
40
  output_folder = data.get("output_folder", None)
40
41
  if output_folder is not None and os.path.exists(output_folder):
41
42
  self.output_folder = output_folder
43
+ override_existing = data.get("override_existing", None)
44
+ if override_existing is not None:
45
+ self.override_existing = override_existing
42
46
 
43
47
  # EDM options
44
48
  edm_override_def_colors = data.get("edm_override_def_colors", None)
@@ -61,6 +65,8 @@ class OptionsModel:
61
65
  # General options
62
66
  if self.output_folder is not None:
63
67
  data["output_folder"] = self.output_folder
68
+ if self.override_existing is not False:
69
+ data["override_existing"] = self.override_existing
64
70
 
65
71
  # EDM options
66
72
  if self.edm_override_def_colors is not False:
@@ -10,6 +10,7 @@ from time import sleep
10
10
  from typing import List
11
11
  from pydm import Display
12
12
  from qtpy.QtCore import Slot, QCoreApplication
13
+ from qtpy.QtGui import QBrush, QColor
13
14
  from qtpy.QtWidgets import (
14
15
  QFileDialog,
15
16
  QTableWidget,
@@ -27,6 +28,9 @@ import logging
27
28
  logging.basicConfig(level=logging.INFO)
28
29
  logger = logging.getLogger(__name__)
29
30
 
31
+ CONVERTED_ROW_COLOR = QColor(200, 230, 201)
32
+ FAILED_ROW_COLOR = QColor(255, 205, 210)
33
+
30
34
 
31
35
  class MainWindow(Display):
32
36
  def __init__(self, parent=None, args=None, macros=None, ui_filename=None):
@@ -174,6 +178,17 @@ class MainWindow(Display):
174
178
  if conversion_status == "Converted":
175
179
  table_widget.removeRow(i)
176
180
 
181
+ def set_row_status(self, row: int, status: str, color: QColor, tooltip: str = "") -> None:
182
+ """Sets the status cell of a row and colors the whole row"""
183
+ table_widget: QTableWidget = self.ui.table_widget
184
+ status_item = QTableWidgetItem(status)
185
+ status_item.setToolTip(tooltip)
186
+ table_widget.setItem(row, 2, status_item)
187
+ for col in range(table_widget.columnCount()):
188
+ item = table_widget.item(row, col)
189
+ if item is not None:
190
+ item.setBackground(QBrush(color))
191
+
177
192
  @Slot()
178
193
  def on_convert_button_clicked(self) -> None:
179
194
  table_widget: QTableWidget = self.ui.table_widget
@@ -182,12 +197,14 @@ class MainWindow(Display):
182
197
  output_file = table_widget.item(row, 1).text()
183
198
  file_type = os.path.splitext(input_file)[1].lower()
184
199
  try:
185
- pydmconverter.__main__.run(input_file, output_file, file_type, override=True)
200
+ pydmconverter.__main__.run(
201
+ input_file, output_file, file_type, override=self.options_model.override_existing
202
+ )
186
203
  logger.debug(f"converted {input_file} to {output_file}")
187
- table_widget.setItem(row, 2, QTableWidgetItem("Converted"))
204
+ self.set_row_status(row, "Converted", CONVERTED_ROW_COLOR)
188
205
  except Exception as msg:
189
206
  logger.debug(msg)
190
- table_widget.setItem(row, 2, QTableWidgetItem("Failed"))
207
+ self.set_row_status(row, "Failed", FAILED_ROW_COLOR, tooltip=str(msg))
191
208
  QCoreApplication.processEvents()
192
209
 
193
210
  """parser = self.app_model.parsers[file_type](input_file)
@@ -47,12 +47,20 @@ class OptionsWindow(QWidget):
47
47
  self.output_folder_select = FileSelectWidget(path=self.options_model.output_folder, select_dir=False)
48
48
  output_folder_group_layout.addWidget(self.output_folder_select)
49
49
 
50
+ conversion_group = QGroupBox("Conversion")
51
+ conversion_group_layout = QVBoxLayout()
52
+ conversion_group.setLayout(conversion_group_layout)
53
+ self.override_existing_checkbox = QCheckBox("Overwrite existing output files")
54
+ self.override_existing_checkbox.setChecked(self.options_model.override_existing)
55
+ conversion_group_layout.addWidget(self.override_existing_checkbox)
56
+
50
57
  self.general_group_view = QWidget()
51
58
  general_group_layout = QVBoxLayout()
52
59
  self.general_group_view.setLayout(general_group_layout)
53
60
  general_group_label = QLabel("General")
54
61
  general_group_layout.addWidget(general_group_label)
55
62
  general_group_layout.addWidget(output_folder_group)
63
+ general_group_layout.addWidget(conversion_group)
56
64
  general_group_layout.addStretch()
57
65
 
58
66
  edm_colors_group = QGroupBox("colors.list")
@@ -122,6 +130,7 @@ class OptionsWindow(QWidget):
122
130
  else:
123
131
  QMessageBox.critical(self, "Invalid Path", "The entered output folder path is not valid.")
124
132
  return False
133
+ self.options_model.override_existing = self.override_existing_checkbox.isChecked()
125
134
 
126
135
  # EDM options
127
136
  colors_path = self.edm_override_file_select.get_path()