MDANSE-GUI 2.0.0__tar.gz → 2.0.2__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 (189) hide show
  1. mdanse_gui-2.0.2/PKG-INFO +203 -0
  2. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/README.md +49 -11
  3. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/ElementsDatabaseEditor.py +36 -33
  4. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Icons/__init__.py +4 -1
  5. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/AseInputFileWidget.py +4 -1
  6. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/AtomMappingWidget.py +1 -0
  7. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/AtomSelectionWidget.py +3 -0
  8. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/FloatWidget.py +6 -1
  9. mdanse_gui-2.0.2/Src/MDANSE_GUI/InputWidgets/HDFTrajectoryWidget.py +174 -0
  10. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/MDAnalysisCoordinateFileWidget.py +8 -9
  11. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/MDAnalysisMDTrajTimeStepWidget.py +27 -20
  12. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/MDAnalysisTopologyFileWidget.py +6 -2
  13. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/MoleculeAndAxisWidget.py +1 -0
  14. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/MoleculeWidget.py +2 -2
  15. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/MultiInputFileWidget.py +12 -15
  16. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/OutputFilesWidget.py +3 -2
  17. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/OutputStructureWidget.py +3 -2
  18. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/OutputTrajectoryWidget.py +66 -21
  19. mdanse_gui-2.0.2/Src/MDANSE_GUI/InputWidgets/QVectors3DWidget.py +112 -0
  20. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/QVectorsWidget.py +67 -41
  21. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/TrajectoryFilterWidget.py +49 -79
  22. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/UnitCellWidget.py +8 -3
  23. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/WidgetBase.py +7 -7
  24. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/__init__.py +1 -0
  25. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/MolecularViewer/AtomProperties.py +17 -8
  26. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/MolecularViewer/Controls.py +15 -4
  27. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/MolecularViewer/MolecularViewer.py +52 -14
  28. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/MolecularViewer/MolecularViewerExtended.py +32 -6
  29. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/MolecularViewer/MolecularViewerWithPicking.py +5 -4
  30. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/MolecularViewer/PropertyWidget.py +9 -5
  31. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/MolecularViewer/readers/hdf5wrapper.py +3 -2
  32. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/MolecularViewer/readers/i_reader.py +3 -1
  33. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/PeriodicTableViewer.py +5 -1
  34. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Resources/InstrumentDefinitions.toml +6 -0
  35. mdanse_gui-2.0.2/Src/MDANSE_GUI/Resources/splash.png +0 -0
  36. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Resources.py +3 -2
  37. mdanse_gui-2.0.2/Src/MDANSE_GUI/Scripts/create_mdanse_link.py +48 -0
  38. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Session/RecentFiles.py +4 -1
  39. mdanse_gui-2.0.2/Src/MDANSE_GUI/Session/Session.py +77 -0
  40. mdanse_gui-2.0.2/Src/MDANSE_GUI/Session/Settings.py +144 -0
  41. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Subprocess/JobStatusProcess.py +8 -9
  42. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/TabbedWindow.py +308 -118
  43. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/ConverterTab.py +13 -8
  44. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/GeneralTab.py +44 -87
  45. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/InstrumentTab.py +12 -7
  46. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/JobTab.py +21 -22
  47. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Layouts/DoublePanel.py +4 -1
  48. mdanse_gui-2.0.2/Src/MDANSE_GUI/Tabs/LoggingTab.py +204 -0
  49. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Models/JobHolder.py +51 -51
  50. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Models/JobTree.py +24 -8
  51. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Models/PlotDataModel.py +12 -9
  52. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Models/PlottingContext.py +337 -182
  53. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Models/TrajectoryModel.py +24 -20
  54. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/PlotSelectionTab.py +9 -5
  55. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/PlotTab.py +21 -8
  56. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Plotters/Grid.py +113 -95
  57. mdanse_gui-2.0.2/Src/MDANSE_GUI/Tabs/Plotters/Grouped.py +322 -0
  58. mdanse_gui-2.0.2/Src/MDANSE_GUI/Tabs/Plotters/Heatmap.py +388 -0
  59. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Plotters/Plotter.py +198 -50
  60. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Plotters/Single.py +126 -123
  61. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Plotters/Text.py +45 -39
  62. mdanse_gui-2.0.2/Src/MDANSE_GUI/Tabs/Plotters/Vectors.py +250 -0
  63. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Plotters/Vectors3D.py +90 -95
  64. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Plotters/__init__.py +1 -0
  65. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/RunTab.py +11 -8
  66. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/TrajectoryTab.py +11 -5
  67. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Views/ActionsTree.py +13 -3
  68. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Views/Delegates.py +25 -9
  69. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Views/InstrumentList.py +5 -2
  70. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Views/PlotDataView.py +71 -57
  71. mdanse_gui-2.0.2/Src/MDANSE_GUI/Tabs/Views/PlotDetailsView.py +83 -0
  72. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Views/RunTable.py +7 -2
  73. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Views/TrajectoryView.py +5 -1
  74. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Visualisers/Action.py +53 -19
  75. mdanse_gui-2.0.2/Src/MDANSE_GUI/Tabs/Visualisers/DataPlotter.py +224 -0
  76. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Visualisers/InstrumentInfo.py +19 -7
  77. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Visualisers/JobLogInfo.py +4 -2
  78. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Visualisers/PlotHolder.py +34 -14
  79. mdanse_gui-2.0.2/Src/MDANSE_GUI/Tabs/Visualisers/PlotSettings.py +163 -0
  80. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Visualisers/PlotWidget.py +16 -7
  81. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Visualisers/View3D.py +9 -1
  82. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/UnitsEditor.py +3 -0
  83. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/UserSettingsEditor.py +17 -23
  84. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Utils.py +3 -1
  85. mdanse_gui-2.0.2/Src/MDANSE_GUI/Widgets/GeneralWidgets.py +256 -0
  86. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Widgets/PlotSettingsDialog.py +2 -2
  87. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Widgets/ResolutionDialog.py +1 -0
  88. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Widgets/SelectionWidgets.py +15 -15
  89. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Widgets/StyleDialog.py +4 -1
  90. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/__init__.py +2 -2
  91. mdanse_gui-2.0.2/Src/MDANSE_GUI/_version.py +36 -0
  92. mdanse_gui-2.0.2/Src/MDANSE_GUI/main.py +228 -0
  93. mdanse_gui-2.0.2/Src/MDANSE_GUI.egg-info/PKG-INFO +203 -0
  94. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI.egg-info/SOURCES.txt +4 -1
  95. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI.egg-info/entry_points.txt +3 -0
  96. mdanse_gui-2.0.2/Src/MDANSE_GUI.egg-info/requires.txt +17 -0
  97. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Tests/UnitTests/test_PlottingContext.py +13 -15
  98. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Tests/UnitTests/test_hdf5wrapper.py +2 -3
  99. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/pyproject.toml +30 -11
  100. mdanse_gui-2.0.0/PKG-INFO +0 -841
  101. mdanse_gui-2.0.0/Src/MDANSE_GUI/InputWidgets/HDFTrajectoryWidget.py +0 -79
  102. mdanse_gui-2.0.0/Src/MDANSE_GUI/Resources/splash.png +0 -0
  103. mdanse_gui-2.0.0/Src/MDANSE_GUI/Session/Session.py +0 -239
  104. mdanse_gui-2.0.0/Src/MDANSE_GUI/Session/Settings.py +0 -409
  105. mdanse_gui-2.0.0/Src/MDANSE_GUI/Tabs/LoggingTab.py +0 -119
  106. mdanse_gui-2.0.0/Src/MDANSE_GUI/Tabs/Plotters/Heatmap.py +0 -422
  107. mdanse_gui-2.0.0/Src/MDANSE_GUI/Tabs/Plotters/Vectors.py +0 -273
  108. mdanse_gui-2.0.0/Src/MDANSE_GUI/Tabs/Views/PlotDetailsView.py +0 -54
  109. mdanse_gui-2.0.0/Src/MDANSE_GUI/Tabs/Visualisers/DataPlotter.py +0 -172
  110. mdanse_gui-2.0.0/Src/MDANSE_GUI/Tabs/Visualisers/PlotSettings.py +0 -239
  111. mdanse_gui-2.0.0/Src/MDANSE_GUI/Widgets/GeneralWidgets.py +0 -710
  112. mdanse_gui-2.0.0/Src/MDANSE_GUI/main.py +0 -124
  113. mdanse_gui-2.0.0/Src/MDANSE_GUI.egg-info/PKG-INFO +0 -841
  114. mdanse_gui-2.0.0/Src/MDANSE_GUI.egg-info/requires.txt +0 -15
  115. mdanse_gui-2.0.0/Tests/UnitTests/test_SettingsFile.py +0 -42
  116. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/AUTHORS +0 -0
  117. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/LICENSE +0 -0
  118. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Icons/MDANSE.ico +0 -0
  119. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Icons/MDANSE.png +0 -0
  120. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Icons/blue_sphere.stl +0 -0
  121. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Icons/center_sphere.stl +0 -0
  122. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Icons/element.png +0 -0
  123. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Icons/periodic_table.png +0 -0
  124. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Icons/red_sphere.stl +0 -0
  125. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Icons/units.png +0 -0
  126. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Icons/user_definitions.png +0 -0
  127. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Icons/yellow_sphere.stl +0 -0
  128. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/AtomTransmutationWidget.py +0 -0
  129. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/BackupWidget.py +0 -0
  130. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/BooleanWidget.py +0 -0
  131. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/CheckableComboBox.py +0 -0
  132. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/ComboWidget.py +0 -0
  133. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/CorrelationFramesWidget.py +0 -0
  134. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/DerivativeOrderWidget.py +0 -0
  135. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/DistHistCutoffWidget.py +0 -0
  136. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/FramesWidget.py +0 -0
  137. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/InputFileWidget.py +0 -0
  138. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/InstrumentResolutionWidget.py +0 -0
  139. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/IntegerWidget.py +0 -0
  140. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/InterpolationOrderWidget.py +0 -0
  141. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/MDTrajTopologyFileWidget.py +0 -0
  142. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/MoleculePreviewWidget.py +0 -0
  143. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/MultipleCombosWidget.py +0 -0
  144. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/OptionalFloatWidget.py +0 -0
  145. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/PartialChargeWidget.py +0 -0
  146. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/ProjectionWidget.py +0 -0
  147. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/RangeWidget.py +0 -0
  148. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/RunningModeWidget.py +0 -0
  149. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/VectorWidget.py +0 -0
  150. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/InputWidgets/WeightsWidget.py +0 -0
  151. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/MolecularViewer/TraceWidget.py +0 -0
  152. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/MolecularViewer/__init__.py +0 -0
  153. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/MolecularViewer/readers/__init__.py +0 -0
  154. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/PlotUtils.py +0 -0
  155. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Scripts/__init__.py +0 -0
  156. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Scripts/mdanse_elements_database.py +0 -0
  157. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Scripts/mdanse_gui.py +0 -0
  158. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Scripts/mdanse_periodic_table.py +0 -0
  159. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Scripts/mdanse_units_editor.py +0 -0
  160. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Session/Logger.py +0 -0
  161. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Session/__init__.py +0 -0
  162. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Subprocess/Subprocess.py +0 -0
  163. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Subprocess/__init__.py +0 -0
  164. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Layouts/MultiPanel.py +0 -0
  165. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Layouts/SinglePanel.py +0 -0
  166. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Layouts/__init__.py +0 -0
  167. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Models/GeneralModel.py +0 -0
  168. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Models/__init__.py +0 -0
  169. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Views/__init__.py +0 -0
  170. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Visualisers/DataWidget.py +0 -0
  171. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Visualisers/InstrumentDetails.py +0 -0
  172. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Visualisers/TextInfo.py +0 -0
  173. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Visualisers/TrajectoryInfo.py +0 -0
  174. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/Visualisers/__init__.py +0 -0
  175. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Tabs/__init__.py +0 -0
  176. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Widgets/DefaultCombobox.py +0 -0
  177. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Widgets/DelayedButton.py +0 -0
  178. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Widgets/NormalisationWidget.py +0 -0
  179. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Widgets/NotificationTabWidget.py +0 -0
  180. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Widgets/ResolutionWidget.py +0 -0
  181. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Widgets/RestrictedSlider.py +0 -0
  182. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Widgets/StepValidator.py +0 -0
  183. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Widgets/VectorWidget.py +0 -0
  184. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI/Widgets/__init__.py +0 -0
  185. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI.egg-info/dependency_links.txt +0 -0
  186. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Src/MDANSE_GUI.egg-info/top_level.txt +0 -0
  187. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Tests/UnitTests/test_GeneralModel.py +0 -0
  188. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/Tests/UnitTests/test_JobState.py +0 -0
  189. {mdanse_gui-2.0.0 → mdanse_gui-2.0.2}/setup.cfg +0 -0
@@ -0,0 +1,203 @@
1
+ Metadata-Version: 2.4
2
+ Name: MDANSE_GUI
3
+ Version: 2.0.2
4
+ Summary: MDANSE GUI package - the graphical interface for MDANSE
5
+ Maintainer-email: Maciej Bartkowiak <maciej.bartkowiak@stfc.ac.uk>, "Chi Y. Cheng" <chi.cheng@stfc.ac.uk>, Jacob Wilkins <jacob.wilkins@stfc.ac.uk>
6
+ License-Expression: GPL-3.0-or-later
7
+ Project-URL: homepage, https://pypi.org/project/MDANSE
8
+ Project-URL: documentation, https://mdanse.readthedocs.io/
9
+ Project-URL: repository, https://github.com/ISISNeutronMuon/MDANSE
10
+ Keywords: molecular dynamics,science,simulation,analysis
11
+ Classifier: Development Status :: 5 - Production/Stable
12
+ Classifier: Intended Audience :: Science/Research
13
+ Classifier: Topic :: Scientific/Engineering :: Chemistry
14
+ Classifier: Topic :: Scientific/Engineering :: Physics
15
+ Classifier: Topic :: Scientific/Engineering :: Visualization
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
21
+ Classifier: Programming Language :: Python :: 3 :: Only
22
+ Classifier: Operating System :: OS Independent
23
+ Requires-Python: >=3.11
24
+ Description-Content-Type: text/markdown
25
+ License-File: LICENSE
26
+ Requires-Dist: MDANSE
27
+ Requires-Dist: matplotlib
28
+ Requires-Dist: qtpy
29
+ Requires-Dist: vtk>=9.4.0
30
+ Requires-Dist: PyQt6
31
+ Requires-Dist: PyYAML
32
+ Requires-Dist: tomlkit
33
+ Requires-Dist: setuptools-git-versioning<4,>=3.0
34
+ Provides-Extra: pymixbox
35
+ Requires-Dist: pymixbox; extra == "pymixbox"
36
+ Provides-Extra: shortcuts
37
+ Requires-Dist: pyshortcuts>=1.9.11; extra == "shortcuts"
38
+ Provides-Extra: all
39
+ Requires-Dist: MDANSE_GUI[pymixbox,shortcuts]; extra == "all"
40
+ Dynamic: license-file
41
+
42
+ # MDANSE_GUI
43
+
44
+ ## MDANSE_GUI Python Module
45
+
46
+ This is the module containing the Graphical User Interface (GUI) of the
47
+ Molecular Dynamics Analysis for Neutron Scattering Experiments (MDANSE) software package.
48
+
49
+ The GUI depends on the [MDANSE package](https://pypi.org/project/MDANSE).
50
+
51
+ > [!NOTE]
52
+ > The default behaviour of MDANSE_GUI has changed in version 2.0.2
53
+ > where the system tray icon has been added to the interface.
54
+ > When the system tray icon of the MDANSE GUI is present, closing
55
+ > the main window does not close the software, and the main window
56
+ > can be shown again. The system tray icon can be disabled in the
57
+ > GUI in Settings -> User Settings, in the 'startup' group.
58
+
59
+ ## Quick start: installation
60
+
61
+ We recommend that you install MDANSE in a Python virtual environment.
62
+ You can create a virtual environment named mdanse_env by typing
63
+ ```
64
+ python3 -m venv mdanse_env
65
+ ```
66
+
67
+ To activate your virtual environment, type
68
+ ```
69
+ source mdanse_env/bin/activate
70
+ ```
71
+ in a bash console, or
72
+ ```
73
+ mdanse_env\Scripts\activate.bat
74
+ ```
75
+ if you are using cmd.exe on Windows.
76
+
77
+ While your virtual environment is active, you can install MDANSE:
78
+ ```
79
+ pip install MDANSE_GUI
80
+ ```
81
+ and start the GUI by typing
82
+ ```
83
+ mdanse_gui
84
+ ```
85
+
86
+ If you are using a virtual environment in which you had installed
87
+ MDANSE in the past, you can upgrade MDANSE to the current version
88
+ by typing:
89
+ ```
90
+ pip install --upgrade MDANSE
91
+ ```
92
+
93
+ If you experience problems with the installation, you may want to upgrade pip
94
+ ```
95
+ pip install --upgrade pip
96
+ ```
97
+ and try again.
98
+
99
+ Please remember to activate your virtual environment when you start a new
100
+ shell before you run `mdanse_gui`.
101
+
102
+ ## Additional installation options
103
+
104
+ MDANSE_GUI has optional dependencies, which are not installed unless they are
105
+ requested by the user. It is possible to install all the optional dependencies
106
+ by running
107
+ ```
108
+ pip install mdanse_gui[all]
109
+ ```
110
+
111
+ The alternative is to install specific dependencies individually. This is described
112
+ in the subsections below.
113
+
114
+ ### pymixbox
115
+
116
+ An optional dependency, [pymixbox](https://github.com/scrtwpns/mixbox) can be
117
+ installed to enable an alternative mechanism of colour mixing. It will be used
118
+ in the MDANSE_GUI plotter when plotting a 2D data set as a series of 1D curves.
119
+ The colours of consecutive curves will be generated from the initial and final
120
+ colour values using pymixbox. (If pymixbox is not installed, the colours of
121
+ intermediate curves will be generated by linear interpolation.)
122
+
123
+ To install MDANSE_GUI with pymixbox, replace the normal installation command with
124
+ ```
125
+ pip install mdanse_gui[pymixbox]
126
+ ```
127
+
128
+ ### pyshortcuts
129
+
130
+ Users who want to create a desktop shortcut and a start menu entry for MDANSE_GUI
131
+ can install MDANSE_GUI with [pyshortcuts](https://github.com/newville/pyshortcuts).
132
+ It can be done by replacing the normal installation command with
133
+ ```
134
+ pip install mdanse_gui[shortcuts]
135
+ ```
136
+
137
+ Once MDANSE_GUI and its dependencies have been installed, run the script
138
+ ```
139
+ create_mdanse_link
140
+ ```
141
+ to create a desktop icon and a start menu entry for MDANSE_GUI (or just
142
+ one of the two, depending on the operating system you are running.)
143
+
144
+
145
+ ## Quick start: workflow
146
+
147
+ The typical workflow of MDANSE:
148
+
149
+ 1. Convert a trajectory from the file format generated by an MD simulation
150
+ software into the MDANSE trajectory format,
151
+ 2. Load the converted trajectory into MDANSE,
152
+ 3. Perform an analysis,
153
+ 4. Check the results with the plotter.
154
+
155
+ Each one of these operations has its own dedicated tab in the GUI.
156
+ The plotter consists of two tabs, one for selecting the data for plotting,
157
+ and the other for viewing and customising the plot.
158
+
159
+ The most complete user documentation of MDANSE can be found on
160
+ [our Read the Docs page](https://mdanse.readthedocs.io).
161
+
162
+ Other information, including tutorials, can be found in the
163
+ [MDANSE-Examples repository](https://github.com/ISISNeutronMuon/MDANSE-Examples).
164
+
165
+ ## Citing MDANSE
166
+
167
+ If you used MDANSE in your research, please cite it according to the CITATION.cff file
168
+ in the [MDANSE GitHub repository](https://github.com/ISISNeutronMuon/MDANSE).
169
+ On GitHub, you can use the "cite this repository" link to generate the citation.
170
+
171
+ ## License
172
+
173
+ MDANSE_GUI is licensed under GPL-3.0. See
174
+ [LICENSE](https://github.com/ISISNeutronMuon/MDANSE/blob/protos/LICENSE)
175
+ for more information.
176
+
177
+ ## Acknowledgements
178
+
179
+ The VTK-based 3D viewer was taken and adapted from another software project
180
+ authored by Eric Pellegrini. We would like to thank Eric for making
181
+ his code available.
182
+
183
+ ## Joining the project
184
+
185
+ MDANSE_GUI is currently maintained and developed by software developers
186
+ from ISIS and ILL, but we are fully open to new collaborators who would
187
+ like to contribute code, documentation, tutorials or usage examples.
188
+ If you want to join the project contact:
189
+
190
+ >Dr. Sanghamitra Mukhopadhyay (sanghamitra.mukhopadhyay@stfc.ac.uk) \
191
+ ISIS Neutron and Muon Source \
192
+ Rutherford Appleton Laboratory \
193
+ Didcot, UK
194
+
195
+ ## Software Inquiries
196
+
197
+ You are welcome to use the
198
+ [issue tracker](https://github.com/ISISNeutronMuon/MDANSE/issues)
199
+ to submit ideas for
200
+ extending the MDANSE code or to report problems you encountered.
201
+ However, if you prefer to contact the MDANSE developers directly,
202
+ you can send us a message:
203
+ >MDANSE Help (MDANSE-help@stfc.ac.uk)
@@ -7,18 +7,13 @@ Molecular Dynamics Analysis for Neutron Scattering Experiments (MDANSE) software
7
7
 
8
8
  The GUI depends on the [MDANSE package](https://pypi.org/project/MDANSE).
9
9
 
10
- ## Version information
11
-
12
- This is the first release of MDANSE_GUI 2.0.0.
13
-
14
10
  > [!NOTE]
15
- > Considering the large number of different MD engines and analysis types,
16
- > it is still possible that some conversion or analysis runs will not
17
- > produce the expected results. Please report any problems
18
- > you experience while using MDANSE by adding them to the
19
- > [GitHub issue tracker](https://github.com/ISISNeutronMuon/MDANSE/issues).
20
- > You can also send a message to MDANSE-help@stfc.ac.uk to get in touch
21
- > with MDANSE developers.
11
+ > The default behaviour of MDANSE_GUI has changed in version 2.0.2
12
+ > where the system tray icon has been added to the interface.
13
+ > When the system tray icon of the MDANSE GUI is present, closing
14
+ > the main window does not close the software, and the main window
15
+ > can be shown again. The system tray icon can be disabled in the
16
+ > GUI in Settings -> User Settings, in the 'startup' group.
22
17
 
23
18
  ## Quick start: installation
24
19
 
@@ -63,6 +58,49 @@ and try again.
63
58
  Please remember to activate your virtual environment when you start a new
64
59
  shell before you run `mdanse_gui`.
65
60
 
61
+ ## Additional installation options
62
+
63
+ MDANSE_GUI has optional dependencies, which are not installed unless they are
64
+ requested by the user. It is possible to install all the optional dependencies
65
+ by running
66
+ ```
67
+ pip install mdanse_gui[all]
68
+ ```
69
+
70
+ The alternative is to install specific dependencies individually. This is described
71
+ in the subsections below.
72
+
73
+ ### pymixbox
74
+
75
+ An optional dependency, [pymixbox](https://github.com/scrtwpns/mixbox) can be
76
+ installed to enable an alternative mechanism of colour mixing. It will be used
77
+ in the MDANSE_GUI plotter when plotting a 2D data set as a series of 1D curves.
78
+ The colours of consecutive curves will be generated from the initial and final
79
+ colour values using pymixbox. (If pymixbox is not installed, the colours of
80
+ intermediate curves will be generated by linear interpolation.)
81
+
82
+ To install MDANSE_GUI with pymixbox, replace the normal installation command with
83
+ ```
84
+ pip install mdanse_gui[pymixbox]
85
+ ```
86
+
87
+ ### pyshortcuts
88
+
89
+ Users who want to create a desktop shortcut and a start menu entry for MDANSE_GUI
90
+ can install MDANSE_GUI with [pyshortcuts](https://github.com/newville/pyshortcuts).
91
+ It can be done by replacing the normal installation command with
92
+ ```
93
+ pip install mdanse_gui[shortcuts]
94
+ ```
95
+
96
+ Once MDANSE_GUI and its dependencies have been installed, run the script
97
+ ```
98
+ create_mdanse_link
99
+ ```
100
+ to create a desktop icon and a start menu entry for MDANSE_GUI (or just
101
+ one of the two, depending on the operating system you are running.)
102
+
103
+
66
104
  ## Quick start: workflow
67
105
 
68
106
  The typical workflow of MDANSE:
@@ -38,7 +38,8 @@ from qtpy.QtWidgets import (
38
38
  )
39
39
 
40
40
  from MDANSE.Chemistry import ATOMS_DATABASE
41
- from MDANSE.Chemistry.Databases import AtomsDatabaseError
41
+ from MDANSE.Chemistry.AtomsDatabase import AtomsDatabase, AtomsDatabaseError
42
+ from MDANSE.IO.IOUtils import get_next_name
42
43
  from MDANSE.MLogging import LOG
43
44
  from MDANSE_GUI.Tabs.Views.Delegates import ColourPicker
44
45
  from MDANSE_GUI.Widgets.GeneralWidgets import (
@@ -246,14 +247,14 @@ class ElementView(QTableView):
246
247
  def contextMenuEvent(self, event):
247
248
  menu = QMenu(self)
248
249
 
249
- Action1 = menu.addAction("New Custom Atom")
250
- Action2 = menu.addAction("Copy Atoms")
251
- Action3 = menu.addAction("Rename Custom Atom")
252
- Action4 = menu.addAction("Delete Custom Atoms")
253
- Action5 = menu.addAction("New Custom Property")
254
- Action6 = menu.addAction("Copy Properties")
255
- Action7 = menu.addAction("Rename Custom Property")
256
- Action8 = menu.addAction("Delete Custom Properties")
250
+ NewAtom = menu.addAction("New Custom Atom")
251
+ CopyAtom = menu.addAction("Copy Atoms")
252
+ RenameAtom = menu.addAction("Rename Custom Atom")
253
+ DeleteAtom = menu.addAction("Delete Custom Atoms")
254
+ NewProp = menu.addAction("New Custom Property")
255
+ CopyProp = menu.addAction("Copy Properties")
256
+ RenameProp = menu.addAction("Rename Custom Property")
257
+ DeleteProp = menu.addAction("Delete Custom Properties")
257
258
 
258
259
  data_model = self.parent().data_model
259
260
 
@@ -292,26 +293,26 @@ class ElementView(QTableView):
292
293
 
293
294
  temp_model = self.model().sourceModel()
294
295
  if temp_model is not None:
295
- Action1.triggered.connect(temp_model.new_line_dialog)
296
- Action2.triggered.connect(temp_model.copy_rows)
296
+ NewAtom.triggered.connect(temp_model.new_line_dialog)
297
+ CopyAtom.triggered.connect(temp_model.copy_rows)
297
298
  if self.mouse_atm in custom_atms:
298
- Action3.triggered.connect(temp_model.rename_row_dialog)
299
+ RenameAtom.triggered.connect(temp_model.rename_row_dialog)
299
300
  else:
300
- Action3.setEnabled(False)
301
+ RenameAtom.setEnabled(False)
301
302
  if enable_delete_atms:
302
- Action4.triggered.connect(temp_model.delete_rows)
303
+ DeleteAtom.triggered.connect(temp_model.delete_rows)
303
304
  else:
304
- Action4.setEnabled(False)
305
- Action5.triggered.connect(temp_model.new_column_dialog)
306
- Action6.triggered.connect(temp_model.copy_columns)
305
+ DeleteAtom.setEnabled(False)
306
+ NewProp.triggered.connect(temp_model.new_column_dialog)
307
+ CopyProp.triggered.connect(temp_model.copy_columns)
307
308
  if self.mouse_prop in custom_props:
308
- Action7.triggered.connect(temp_model.rename_column_dialog)
309
+ RenameProp.triggered.connect(temp_model.rename_column_dialog)
309
310
  else:
310
- Action7.setEnabled(False)
311
+ RenameProp.setEnabled(False)
311
312
  if enable_delete_props:
312
- Action8.triggered.connect(temp_model.delete_columns)
313
+ DeleteProp.triggered.connect(temp_model.delete_columns)
313
314
  else:
314
- Action8.setEnabled(False)
315
+ DeleteProp.setEnabled(False)
315
316
 
316
317
  menu.exec_(event.globalPos())
317
318
 
@@ -323,6 +324,7 @@ class NewElementDialog(QDialog):
323
324
 
324
325
  def __init__(self, *args, **kwargs):
325
326
  super().__init__(*args, **kwargs)
327
+ self.setModal(True)
326
328
 
327
329
  layout = QVBoxLayout(self)
328
330
  edit = QLineEdit(self)
@@ -351,7 +353,7 @@ class ElementModel(QStandardItemModel):
351
353
  table gets sorted.
352
354
  """
353
355
 
354
- def __init__(self, *args, element_database=None, **kwargs):
356
+ def __init__(self, *args, element_database: AtomsDatabase, **kwargs):
355
357
  super().__init__(*args, **kwargs)
356
358
 
357
359
  self.custom_header_brush = QBrush(QColor(255, 165, 0))
@@ -410,8 +412,8 @@ class ElementModel(QStandardItemModel):
410
412
  column = idx.column()
411
413
  row_name = self.verticalHeaderItem(row).text()
412
414
  column_name = self.horizontalHeaderItem(column).text()
413
- LOG.info(f"data:{data}, text:{text}, row:{row}, column:{column}")
414
- LOG.info(f"column name={column_name}, row name={row_name}")
415
+ LOG.debug(f"data:{data}, text:{text}, row:{row}, column:{column}")
416
+ LOG.debug(f"column name={column_name}, row name={row_name}")
415
417
  self.database.set_value(row_name, column_name, text)
416
418
  self.save_changes()
417
419
 
@@ -610,7 +612,7 @@ class ElementModel(QStandardItemModel):
610
612
  if new_label not in self.database.default_atoms_types:
611
613
  item.setForeground(self.custom_header_brush)
612
614
  self.setVerticalHeaderItem(self.rowCount() - 1, item)
613
- LOG.info(f"self.all_row_names has length: {len(self.all_row_names)}")
615
+ LOG.debug(f"self.all_row_names has length: {len(self.all_row_names)}")
614
616
 
615
617
  @Slot()
616
618
  def copy_rows(self):
@@ -623,13 +625,13 @@ class ElementModel(QStandardItemModel):
623
625
 
624
626
  for _, idx in row_idxs:
625
627
  atm_sym = self.verticalHeaderItem(idx).text()
626
- atm_sym_copy = atm_sym + "(copy)"
627
- while True:
628
- if atm_sym_copy not in self.database.atoms:
629
- self.database.add_atom(atm_sym_copy)
630
- self.copy_row_in_database(atm_sym_copy, atm_sym)
631
- break
632
- atm_sym_copy += "(copy)"
628
+ atm_sym_copy = get_next_name(
629
+ f"{atm_sym}(copy{{trial}})",
630
+ exists=self.database.atoms,
631
+ default="",
632
+ )
633
+ self.database.add_atom(atm_sym_copy)
634
+ self.copy_row_in_database(atm_sym_copy, atm_sym)
633
635
  self.save_changes()
634
636
 
635
637
  @Slot(dict)
@@ -708,7 +710,7 @@ class ElementModel(QStandardItemModel):
708
710
  item.setForeground(self.custom_header_brush)
709
711
  self.setHorizontalHeaderItem(self.columnCount() - 1, item)
710
712
  self.parent().set_column_delegate(self.columnCount() - 1)
711
- LOG.info(f"self.all_column_names has length: {len(self.all_column_names)}")
713
+ LOG.debug(f"self.all_column_names has length: {len(self.all_column_names)}")
712
714
 
713
715
  @Slot(dict)
714
716
  def add_new_column(self, input_variables: dict):
@@ -786,6 +788,7 @@ class ElementsDatabaseEditor(QDialog):
786
788
  super().__init__(*args, **kwargs)
787
789
 
788
790
  self.setWindowTitle("MDANSE Chemical Elements Database Editor")
791
+ self.setModal(True)
789
792
 
790
793
  layout = QVBoxLayout(self)
791
794
 
@@ -15,11 +15,14 @@
15
15
  #
16
16
  from __future__ import annotations
17
17
 
18
- from pathlib import Path
18
+ from typing import TYPE_CHECKING
19
19
 
20
20
  from qtpy.QtCore import QDir
21
21
  from qtpy.QtGui import QIcon
22
22
 
23
+ if TYPE_CHECKING:
24
+ from pathlib import Path
25
+
23
26
 
24
27
  class PyQtIcons:
25
28
  def __init__(self, path: Path | str):
@@ -16,9 +16,9 @@
16
16
  from __future__ import annotations
17
17
 
18
18
  import os
19
+ from contextlib import suppress
19
20
  from pathlib import PurePath
20
21
 
21
- from ase.io.formats import filetype
22
22
  from qtpy.QtCore import Slot
23
23
  from qtpy.QtWidgets import QComboBox, QFileDialog, QLineEdit, QPushButton
24
24
 
@@ -28,6 +28,9 @@ from MDANSE.Framework.Configurators.AseInputFileConfigurator import (
28
28
  from MDANSE.MLogging import LOG
29
29
  from MDANSE_GUI.InputWidgets.WidgetBase import WidgetBase
30
30
 
31
+ with suppress(ImportError):
32
+ from ase.io.formats import filetype
33
+
31
34
 
32
35
  class AseInputFileWidget(WidgetBase):
33
36
  def __init__(self, *args, **kwargs):
@@ -58,6 +58,7 @@ class AtomMappingHelperDialog(QDialog):
58
58
  """
59
59
  super().__init__(parent, *args, **kwargs)
60
60
  self.setWindowTitle("Atom mapping helper")
61
+ self.setModal(True)
61
62
  self.min_width = kwargs.get("min_width", 500)
62
63
  self.min_height = kwargs.get("min_width", 600)
63
64
  self.resize(self.min_width, self.min_height)
@@ -349,6 +349,7 @@ class SelectionHelper(QDialog):
349
349
  super().__init__(parent, *args, **kwargs)
350
350
  self.setWindowTitle(self._helper_title)
351
351
  self.setWindowFlags(Qt.Window)
352
+ self.setModal(True)
352
353
 
353
354
  self.trajectory = traj_data[1]
354
355
  self.system = self.trajectory.chemical_system
@@ -408,6 +409,7 @@ class SelectionHelper(QDialog):
408
409
  3D viewer when it is closed and then reopened.
409
410
  """
410
411
  self.selection_model.finalise_manual_selection()
412
+ self.view_3d.stop_animation()
411
413
  a0.ignore()
412
414
  self.hide()
413
415
 
@@ -445,6 +447,7 @@ class SelectionHelper(QDialog):
445
447
  or JSON text files.
446
448
  """
447
449
  self.selection_model.finalise_manual_selection()
450
+ self.view_3d.stop_animation()
448
451
  fname = QFileDialog.getSaveFileName(
449
452
  self,
450
453
  "Save current selection to a JSON file",
@@ -15,13 +15,18 @@
15
15
  #
16
16
  from __future__ import annotations
17
17
 
18
+ from typing import TypeVar
19
+
18
20
  from qtpy.QtGui import QDoubleValidator
19
21
  from qtpy.QtWidgets import QDoubleSpinBox, QLineEdit
20
22
 
23
+ from MDANSE.Framework.Configurators import FloatConfigurator
21
24
  from MDANSE_GUI.InputWidgets.WidgetBase import WidgetBase
22
25
 
26
+ FloatConfig = TypeVar("FloatConfig", bound=FloatConfigurator)
27
+
23
28
 
24
- class FloatWidget(WidgetBase):
29
+ class FloatWidget(WidgetBase[FloatConfig]):
25
30
  def __init__(self, *args, **kwargs):
26
31
  super().__init__(*args, **kwargs)
27
32
  try: