MoleditPy 2.2.0a1__tar.gz → 2.2.0a3__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 (80) hide show
  1. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/PKG-INFO +1 -1
  2. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/pyproject.toml +1 -1
  3. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/MoleditPy.egg-info/PKG-INFO +1 -1
  4. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/MoleditPy.egg-info/SOURCES.txt +1 -18
  5. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/constants.py +1 -1
  6. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/main_window_main_init.py +31 -13
  7. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/main_window_ui_manager.py +21 -2
  8. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/plugin_interface.py +1 -10
  9. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/plugin_manager.py +0 -3
  10. moleditpy-2.2.0a1/src/moleditpy/plugins/Analysis/ms_spectrum_neo.py +0 -919
  11. moleditpy-2.2.0a1/src/moleditpy/plugins/File/animated_xyz_giffer.py +0 -583
  12. moleditpy-2.2.0a1/src/moleditpy/plugins/File/cube_viewer.py +0 -689
  13. moleditpy-2.2.0a1/src/moleditpy/plugins/File/gaussian_fchk_freq_analyzer.py +0 -1148
  14. moleditpy-2.2.0a1/src/moleditpy/plugins/File/mapped_cube_viewer.py +0 -552
  15. moleditpy-2.2.0a1/src/moleditpy/plugins/File/orca_out_freq_analyzer.py +0 -1226
  16. moleditpy-2.2.0a1/src/moleditpy/plugins/File/paste_xyz.py +0 -336
  17. moleditpy-2.2.0a1/src/moleditpy/plugins/Input Generator/gaussian_input_generator_neo.py +0 -930
  18. moleditpy-2.2.0a1/src/moleditpy/plugins/Input Generator/orca_input_generator_neo.py +0 -1028
  19. moleditpy-2.2.0a1/src/moleditpy/plugins/Input Generator/orca_xyz2inp_gui.py +0 -286
  20. moleditpy-2.2.0a1/src/moleditpy/plugins/Optimization/all-trans_optimizer.py +0 -65
  21. moleditpy-2.2.0a1/src/moleditpy/plugins/Optimization/complex_molecule_untangler.py +0 -268
  22. moleditpy-2.2.0a1/src/moleditpy/plugins/Optimization/conf_search.py +0 -224
  23. moleditpy-2.2.0a1/src/moleditpy/plugins/Utility/atom_colorizer.py +0 -547
  24. moleditpy-2.2.0a1/src/moleditpy/plugins/Utility/console.py +0 -163
  25. moleditpy-2.2.0a1/src/moleditpy/plugins/Utility/pubchem_ressolver.py +0 -244
  26. moleditpy-2.2.0a1/src/moleditpy/plugins/Utility/vdw_radii_overlay.py +0 -303
  27. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/LICENSE +0 -0
  28. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/README.md +0 -0
  29. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/setup.cfg +0 -0
  30. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/MoleditPy.egg-info/dependency_links.txt +0 -0
  31. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/MoleditPy.egg-info/entry_points.txt +0 -0
  32. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/MoleditPy.egg-info/requires.txt +0 -0
  33. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/MoleditPy.egg-info/top_level.txt +0 -0
  34. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/__init__.py +0 -0
  35. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/__main__.py +0 -0
  36. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/main.py +0 -0
  37. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/__init__.py +0 -0
  38. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/about_dialog.py +0 -0
  39. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/align_plane_dialog.py +0 -0
  40. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/alignment_dialog.py +0 -0
  41. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/analysis_window.py +0 -0
  42. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/angle_dialog.py +0 -0
  43. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/assets/icon.icns +0 -0
  44. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/assets/icon.ico +0 -0
  45. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/assets/icon.png +0 -0
  46. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/atom_item.py +0 -0
  47. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/bond_item.py +0 -0
  48. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/bond_length_dialog.py +0 -0
  49. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/calculation_worker.py +0 -0
  50. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/color_settings_dialog.py +0 -0
  51. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/constrained_optimization_dialog.py +0 -0
  52. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/custom_interactor_style.py +0 -0
  53. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/custom_qt_interactor.py +0 -0
  54. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/dialog3_d_picking_mixin.py +0 -0
  55. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/dihedral_dialog.py +0 -0
  56. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/main_window.py +0 -0
  57. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/main_window_app_state.py +0 -0
  58. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/main_window_compute.py +0 -0
  59. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/main_window_dialog_manager.py +0 -0
  60. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/main_window_edit_3d.py +0 -0
  61. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/main_window_edit_actions.py +0 -0
  62. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/main_window_export.py +0 -0
  63. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/main_window_molecular_parsers.py +0 -0
  64. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/main_window_project_io.py +0 -0
  65. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/main_window_string_importers.py +0 -0
  66. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/main_window_view_3d.py +0 -0
  67. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/main_window_view_loaders.py +0 -0
  68. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/mirror_dialog.py +0 -0
  69. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/molecular_data.py +0 -0
  70. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/molecule_scene.py +0 -0
  71. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/move_group_dialog.py +0 -0
  72. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/periodic_table_dialog.py +0 -0
  73. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/planarize_dialog.py +0 -0
  74. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/plugin_manager_window.py +0 -0
  75. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/settings_dialog.py +0 -0
  76. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/template_preview_item.py +0 -0
  77. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/template_preview_view.py +0 -0
  78. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/translation_dialog.py +0 -0
  79. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/user_template_dialog.py +0 -0
  80. {moleditpy-2.2.0a1 → moleditpy-2.2.0a3}/src/moleditpy/modules/zoomable_view.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MoleditPy
3
- Version: 2.2.0a1
3
+ Version: 2.2.0a3
4
4
  Summary: A cross-platform, simple, and intuitive molecular structure editor built in Python. It allows 2D molecular drawing and 3D structure visualization. It supports exporting structure files for input to DFT calculation software.
5
5
  Author-email: HiroYokoyama <titech.yoko.hiro@gmail.com>
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
  [project]
6
6
  name = "MoleditPy"
7
7
 
8
- version = "2.2.0a1"
8
+ version = "2.2.0a3"
9
9
 
10
10
  license = {file = "LICENSE"}
11
11
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MoleditPy
3
- Version: 2.2.0a1
3
+ Version: 2.2.0a3
4
4
  Summary: A cross-platform, simple, and intuitive molecular structure editor built in Python. It allows 2D molecular drawing and 3D structure visualization. It supports exporting structure files for input to DFT calculation software.
5
5
  Author-email: HiroYokoyama <titech.yoko.hiro@gmail.com>
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -64,21 +64,4 @@ src/moleditpy/modules/user_template_dialog.py
64
64
  src/moleditpy/modules/zoomable_view.py
65
65
  src/moleditpy/modules/assets/icon.icns
66
66
  src/moleditpy/modules/assets/icon.ico
67
- src/moleditpy/modules/assets/icon.png
68
- src/moleditpy/plugins/Analysis/ms_spectrum_neo.py
69
- src/moleditpy/plugins/File/animated_xyz_giffer.py
70
- src/moleditpy/plugins/File/cube_viewer.py
71
- src/moleditpy/plugins/File/gaussian_fchk_freq_analyzer.py
72
- src/moleditpy/plugins/File/mapped_cube_viewer.py
73
- src/moleditpy/plugins/File/orca_out_freq_analyzer.py
74
- src/moleditpy/plugins/File/paste_xyz.py
75
- src/moleditpy/plugins/Input Generator/gaussian_input_generator_neo.py
76
- src/moleditpy/plugins/Input Generator/orca_input_generator_neo.py
77
- src/moleditpy/plugins/Input Generator/orca_xyz2inp_gui.py
78
- src/moleditpy/plugins/Optimization/all-trans_optimizer.py
79
- src/moleditpy/plugins/Optimization/complex_molecule_untangler.py
80
- src/moleditpy/plugins/Optimization/conf_search.py
81
- src/moleditpy/plugins/Utility/atom_colorizer.py
82
- src/moleditpy/plugins/Utility/console.py
83
- src/moleditpy/plugins/Utility/pubchem_ressolver.py
84
- src/moleditpy/plugins/Utility/vdw_radii_overlay.py
67
+ src/moleditpy/modules/assets/icon.png
@@ -16,7 +16,7 @@ from PyQt6.QtGui import QFont, QColor
16
16
  from rdkit import Chem
17
17
 
18
18
  #Version
19
- VERSION = '2.2.0a1'
19
+ VERSION = '2.2.0a3'
20
20
 
21
21
  ATOM_RADIUS = 18
22
22
  BOND_OFFSET = 3.5
@@ -32,7 +32,7 @@ except Exception:
32
32
  # PyQt6 Modules
33
33
  from PyQt6.QtWidgets import (
34
34
  QApplication, QWidget, QVBoxLayout, QHBoxLayout,
35
- QPushButton, QSplitter, QToolBar, QSizePolicy, QLabel, QToolButton, QMenu, QMessageBox
35
+ QPushButton, QSplitter, QToolBar, QSizePolicy, QLabel, QToolButton, QMenu, QMessageBox, QFileDialog
36
36
  )
37
37
 
38
38
  from PyQt6.QtGui import (
@@ -1901,20 +1901,38 @@ class MainWindowMainInit(object):
1901
1901
  parent_menu.addAction(action)
1902
1902
 
1903
1903
  # 4. Integrate Export Actions into Export Button and Menu
1904
+ # 4. Integrate Export Actions into Export Button AND Main File->Export Menu
1904
1905
  if self.plugin_manager.export_actions:
1906
+ # Find Main File -> Export menu
1907
+ main_export_menu = None
1908
+ for top_action in self.menuBar().actions():
1909
+ if top_action.text().replace('&', '') == 'File' and top_action.menu():
1910
+ for sub_action in top_action.menu().actions():
1911
+ if sub_action.text().replace('&', '') == 'Export' and sub_action.menu():
1912
+ main_export_menu = sub_action.menu()
1913
+ break
1914
+ if main_export_menu: break
1915
+
1916
+ # List of menus to populate
1917
+ target_menus = []
1905
1918
  if hasattr(self, 'export_button') and self.export_button.menu():
1906
- # Add separator
1907
- sep = self.export_button.menu().addSeparator()
1908
- sep.setData(PLUGIN_ACTION_TAG)
1909
-
1910
- for exp in self.plugin_manager.export_actions:
1911
- label = exp['label']
1912
- callback = exp['callback']
1913
-
1914
- a = QAction(label, self)
1915
- a.triggered.connect(callback)
1916
- a.setData(PLUGIN_ACTION_TAG)
1917
- self.export_button.menu().addAction(a)
1919
+ target_menus.append(self.export_button.menu())
1920
+ if main_export_menu:
1921
+ target_menus.append(main_export_menu)
1922
+
1923
+ for menu in target_menus:
1924
+ # Add separator
1925
+ sep = menu.addSeparator()
1926
+ sep.setData(PLUGIN_ACTION_TAG)
1927
+
1928
+ for exp in self.plugin_manager.export_actions:
1929
+ label = exp['label']
1930
+ callback = exp['callback']
1931
+
1932
+ a = QAction(label, self)
1933
+ a.triggered.connect(callback)
1934
+ a.setData(PLUGIN_ACTION_TAG)
1935
+ menu.addAction(a)
1918
1936
 
1919
1937
  # 5. Integrate File Openers into Import Menu
1920
1938
  if hasattr(self, 'import_menu') and self.plugin_manager.file_openers:
@@ -298,7 +298,7 @@ class MainWindowUiManager(object):
298
298
 
299
299
 
300
300
  def dragEnterEvent(self, event):
301
- """ウィンドウ全体で .pmeraw、.pmeprj、.mol、.sdf、.xyz ファイルのドラッグを受け入れる"""
301
+ """ウィンドウ全体でサポートされているファイルのドラッグを受け入れる"""
302
302
  # Accept if any dragged local file has a supported extension
303
303
  if event.mimeData().hasUrls():
304
304
  urls = event.mimeData().urls()
@@ -306,9 +306,28 @@ class MainWindowUiManager(object):
306
306
  try:
307
307
  if url.isLocalFile():
308
308
  file_path = url.toLocalFile()
309
- if file_path.lower().endswith(('.pmeraw', '.pmeprj', '.mol', '.sdf', '.xyz')):
309
+ file_lower = file_path.lower()
310
+
311
+ # Built-in extensions
312
+ if file_lower.endswith(('.pmeraw', '.pmeprj', '.mol', '.sdf', '.xyz')):
310
313
  event.acceptProposedAction()
311
314
  return
315
+
316
+ # Plugin-registered file openers
317
+ if self.plugin_manager and hasattr(self.plugin_manager, 'file_openers'):
318
+ for ext in self.plugin_manager.file_openers.keys():
319
+ if file_lower.endswith(ext):
320
+ event.acceptProposedAction()
321
+ return
322
+
323
+ # Plugin drop handlers (accept more liberally for custom logic)
324
+ # A plugin drop handler might handle it, so accept
325
+ if self.plugin_manager and hasattr(self.plugin_manager, 'drop_handlers'):
326
+ if len(self.plugin_manager.drop_handlers) > 0:
327
+ # Accept any file if drop handlers are registered
328
+ # They will check the file type in dropEvent
329
+ event.acceptProposedAction()
330
+ return
312
331
  except Exception:
313
332
  continue
314
333
  event.ignore()
@@ -159,16 +159,7 @@ class PluginContext:
159
159
  self._manager.register_3d_style(self._plugin_name, style_name, callback)
160
160
 
161
161
 
162
- def add_panel_button(self, text: str, callback: Callable, panel: str = "right"):
163
- """
164
- Add a button to the bottom control panel.
165
-
166
- Args:
167
- text: Label on the button.
168
- callback: Function to call on click.
169
- panel: "left" (2D Editor) or "right" (3D Viewer). Default "right".
170
- """
171
- self._manager.register_panel_button(self._plugin_name, text, callback, panel)
162
+
172
163
 
173
164
 
174
165
 
@@ -40,7 +40,6 @@ class PluginManager:
40
40
  # Registries for actions
41
41
  self.menu_actions = [] # List of (plugin_name, path, callback, text, icon, shortcut)
42
42
  self.toolbar_actions = []
43
- self.context_menu_3d_actions = []
44
43
  self.drop_handlers = [] # List of (priority, plugin_name, callback)
45
44
 
46
45
  # Extended Registries (Added to prevent lazy initialization "monkey patching")
@@ -49,7 +48,6 @@ class PluginManager:
49
48
  self.file_openers = {}
50
49
  self.analysis_tools = []
51
50
  self.save_handlers = {}
52
- self.save_handlers = {}
53
51
  self.load_handlers = {}
54
52
  self.custom_3d_styles = {} # style_name -> {'plugin': name, 'callback': func}
55
53
 
@@ -98,7 +96,6 @@ class PluginManager:
98
96
  self.plugins = []
99
97
  self.menu_actions = []
100
98
  self.toolbar_actions = []
101
- self.context_menu_3d_actions = []
102
99
  self.drop_handlers = []
103
100
 
104
101
  # Clear extended registries