MoleditPy-linux 4.2.3__tar.gz → 4.2.4__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 (81) hide show
  1. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/PKG-INFO +1 -1
  2. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/pyproject.toml +1 -1
  3. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/MoleditPy_linux.egg-info/PKG-INFO +1 -1
  4. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/plugin_menu_manager.py +52 -33
  5. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/LICENSE +0 -0
  6. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/README.md +0 -0
  7. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/setup.cfg +0 -0
  8. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/MoleditPy_linux.egg-info/SOURCES.txt +0 -0
  9. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/MoleditPy_linux.egg-info/dependency_links.txt +0 -0
  10. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/MoleditPy_linux.egg-info/entry_points.txt +0 -0
  11. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/MoleditPy_linux.egg-info/requires.txt +0 -0
  12. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/MoleditPy_linux.egg-info/top_level.txt +0 -0
  13. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/__init__.py +0 -0
  14. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/__main__.py +0 -0
  15. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/assets/file_icon.ico +0 -0
  16. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/assets/icon.icns +0 -0
  17. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/assets/icon.ico +0 -0
  18. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/assets/icon.png +0 -0
  19. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/core/__init__.py +0 -0
  20. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/core/mol_geometry.py +0 -0
  21. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/core/molecular_data.py +0 -0
  22. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/main.py +0 -0
  23. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/plugins/__init__.py +0 -0
  24. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/plugins/plugin_interface.py +0 -0
  25. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/plugins/plugin_manager.py +0 -0
  26. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/plugins/plugin_manager_window.py +0 -0
  27. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/__init__.py +0 -0
  28. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/about_dialog.py +0 -0
  29. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/align_plane_dialog.py +0 -0
  30. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/alignment_dialog.py +0 -0
  31. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/analysis_window.py +0 -0
  32. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/angle_dialog.py +0 -0
  33. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/app_state.py +0 -0
  34. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/atom_item.py +0 -0
  35. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/atom_picking.py +0 -0
  36. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/base_picking_dialog.py +0 -0
  37. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/bond_item.py +0 -0
  38. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/bond_length_dialog.py +0 -0
  39. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/calculation_worker.py +0 -0
  40. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/color_settings_dialog.py +0 -0
  41. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/compute_logic.py +0 -0
  42. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/constrained_optimization_dialog.py +0 -0
  43. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/custom_interactor_style.py +0 -0
  44. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/custom_qt_interactor.py +0 -0
  45. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/dialog_3d_picking_mixin.py +0 -0
  46. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/dialog_logic.py +0 -0
  47. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/dihedral_dialog.py +0 -0
  48. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/edit_3d_logic.py +0 -0
  49. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/edit_actions_logic.py +0 -0
  50. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/export_logic.py +0 -0
  51. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/geometry_base_dialog.py +0 -0
  52. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/io_logic.py +0 -0
  53. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/main_window.py +0 -0
  54. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/main_window_init.py +0 -0
  55. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/mirror_dialog.py +0 -0
  56. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/molecular_scene_handler.py +0 -0
  57. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/molecule_scene.py +0 -0
  58. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/move_group_dialog.py +0 -0
  59. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/move_selected_atoms_dialog.py +0 -0
  60. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/periodic_table_dialog.py +0 -0
  61. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/planarize_dialog.py +0 -0
  62. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/settings_dialog.py +0 -0
  63. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/settings_tabs/__init__.py +0 -0
  64. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/settings_tabs/settings_2d_tab.py +0 -0
  65. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/settings_tabs/settings_3d_tabs.py +0 -0
  66. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/settings_tabs/settings_other_tab.py +0 -0
  67. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/settings_tabs/settings_tab_base.py +0 -0
  68. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/string_importers.py +0 -0
  69. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/template_preview_item.py +0 -0
  70. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/template_preview_view.py +0 -0
  71. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/translation_dialog.py +0 -0
  72. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/ui_manager.py +0 -0
  73. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/user_template_dialog.py +0 -0
  74. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/view_3d_logic.py +0 -0
  75. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/ui/zoomable_view.py +0 -0
  76. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/utils/__init__.py +0 -0
  77. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/utils/constants.py +0 -0
  78. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/utils/default_settings.py +0 -0
  79. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/utils/sip_isdeleted_safe.py +0 -0
  80. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/utils/suppress_log.py +0 -0
  81. {moleditpy_linux-4.2.3 → moleditpy_linux-4.2.4}/src/moleditpy_linux/utils/system_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MoleditPy-linux
3
- Version: 4.2.3
3
+ Version: 4.2.4
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-linux"
7
7
 
8
- version = "4.2.3"
8
+ version = "4.2.4"
9
9
 
10
10
  license = {file = "LICENSE"}
11
11
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MoleditPy-linux
3
- Version: 4.2.3
3
+ Version: 4.2.4
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
@@ -56,6 +56,29 @@ class PluginMenuManager:
56
56
 
57
57
  return _safe
58
58
 
59
+ def _get_plugin_target_menus(self) -> List[QMenu]:
60
+ """Return a list of all menus that might contain plugin actions."""
61
+ menus = []
62
+ for top_action in list(self._im.host.menuBar().actions()):
63
+ if top_action.menu():
64
+ menus.append(top_action.menu())
65
+
66
+ export_button = getattr(self._im, "export_button", None)
67
+ if export_button and export_button.menu():
68
+ menus.append(export_button.menu())
69
+
70
+ style_button = getattr(self._im, "style_button", None)
71
+ if style_button and style_button.menu():
72
+ menus.append(style_button.menu())
73
+
74
+ import_menu = getattr(self._im, "import_menu", None) or getattr(
75
+ self._im.host, "import_menu", None
76
+ )
77
+ if import_menu:
78
+ menus.append(import_menu)
79
+
80
+ return menus
81
+
59
82
  # ------------------------------------------------------------------
60
83
  # Public API — called by MainInitManager and PluginManager
61
84
  # ------------------------------------------------------------------
@@ -92,7 +115,7 @@ class PluginMenuManager:
92
115
  re-populates every integration point: menus, toolbars, export,
93
116
  file-openers, analysis tools, and 3D styles.
94
117
  """
95
- PLUGIN_ACTION_TAG = "plugin_managed"
118
+ plugin_action_tag = "plugin_managed"
96
119
 
97
120
  def _clean_menu(menu: QMenu) -> None:
98
121
  for action in list(menu.actions()):
@@ -101,16 +124,14 @@ class PluginMenuManager:
101
124
  _clean_menu(submenu)
102
125
  if not any(not a.isSeparator() for a in submenu.actions()):
103
126
  menu.removeAction(action)
104
- elif action.data() == PLUGIN_ACTION_TAG:
127
+ elif action.data() == plugin_action_tag:
105
128
  menu.removeAction(action)
106
129
 
107
130
  try:
108
- for top_action in list(self._im.host.menuBar().actions()):
109
- top_menu = top_action.menu()
110
- if top_menu is not None:
111
- _clean_menu(top_menu)
112
- except Exception as e:
113
- logging.warning("Plugin rebuild: menu cleanup error: %s", e)
131
+ for menu in self._get_plugin_target_menus():
132
+ _clean_menu(menu)
133
+ except Exception:
134
+ logging.exception("Plugin rebuild: menu cleanup error")
114
135
 
115
136
  self._im.plugin_menubar_separator_added = False
116
137
 
@@ -125,12 +146,12 @@ class PluginMenuManager:
125
146
  ]:
126
147
  try:
127
148
  method()
128
- except Exception as e:
129
- logging.warning("Plugin rebuild: %s error: %s", label, e)
149
+ except Exception:
150
+ logging.exception("Plugin rebuild: %s error", label)
130
151
 
131
152
  def add_registered_plugin_actions(self) -> None:
132
153
  """Add menu actions explicitly registered by V3/V4 plugins."""
133
- PLUGIN_ACTION_TAG = "plugin_managed"
154
+ plugin_action_tag = "plugin_managed"
134
155
  if not self._im.host.plugin_manager.menu_actions:
135
156
  return
136
157
 
@@ -171,10 +192,10 @@ class PluginMenuManager:
171
192
  if (
172
193
  actions
173
194
  and not actions[-1].isSeparator()
174
- and actions[-1].data() != PLUGIN_ACTION_TAG
195
+ and actions[-1].data() != plugin_action_tag
175
196
  ):
176
197
  sep = current_menu.addSeparator()
177
- sep.setData(PLUGIN_ACTION_TAG)
198
+ sep.setData(plugin_action_tag)
178
199
 
179
200
  action = QAction(text or parts[-1], self._im.host)
180
201
  action.triggered.connect(
@@ -182,7 +203,7 @@ class PluginMenuManager:
182
203
  )
183
204
  if action_def.get("shortcut"):
184
205
  action.setShortcut(QKeySequence(action_def["shortcut"]))
185
- action.setData(PLUGIN_ACTION_TAG)
206
+ action.setData(plugin_action_tag)
186
207
  current_menu.addAction(action)
187
208
 
188
209
  def add_plugin_toolbar_actions(self) -> None:
@@ -227,28 +248,24 @@ class PluginMenuManager:
227
248
 
228
249
  def _clear_all_plugin_actions(self, plugin_menu: QMenu) -> None:
229
250
  """Remove all tagged plugin actions from every menu and the export button."""
230
- PLUGIN_ACTION_TAG = "plugin_managed"
251
+ plugin_action_tag = "plugin_managed"
231
252
 
232
253
  def clear_menu(menu: Any) -> None:
233
254
  if not menu:
234
255
  return
235
256
  for act in list(menu.actions()):
236
- if act.data() == PLUGIN_ACTION_TAG:
257
+ if act.data() == plugin_action_tag:
237
258
  menu.removeAction(act)
238
259
  elif act.menu():
239
260
  clear_menu(act.menu())
240
261
 
241
262
  plugin_menu.clear()
242
- for top_action in self._im.host.menuBar().actions():
243
- if top_action.menu():
244
- clear_menu(top_action.menu())
245
-
246
- export_button = getattr(self._im, "export_button", None)
247
- if export_button and export_button.menu():
248
- clear_menu(export_button.menu())
263
+ for menu in self._get_plugin_target_menus():
264
+ clear_menu(menu)
249
265
 
250
266
  def update_style_menu_with_plugins(self) -> None:
251
267
  """Append custom 3D styles registered by plugins to the style menu."""
268
+ plugin_action_tag = "plugin_managed"
252
269
  style_button = getattr(self._im, "style_button", None)
253
270
  if not style_button or not style_button.menu():
254
271
  return
@@ -260,7 +277,8 @@ class PluginMenuManager:
260
277
 
261
278
  if style_group and self._im.host.plugin_manager.custom_3d_styles:
262
279
  if style_menu.actions() and not style_menu.actions()[-1].isSeparator():
263
- style_menu.addSeparator()
280
+ sep = style_menu.addSeparator()
281
+ sep.setData(plugin_action_tag)
264
282
 
265
283
  for style_name in self._im.host.plugin_manager.custom_3d_styles:
266
284
  if not any(a.text() == style_name for a in style_menu.actions()):
@@ -270,6 +288,7 @@ class PluginMenuManager:
270
288
  lambda checked=False,
271
289
  s=style_name: self._im.host.view_3d_manager.set_3d_style(s)
272
290
  )
291
+ action.setData(plugin_action_tag)
273
292
  style_menu.addAction(action)
274
293
  style_group.addAction(action)
275
294
 
@@ -333,7 +352,7 @@ class PluginMenuManager:
333
352
  if not self._im.host.plugin_manager.export_actions:
334
353
  return
335
354
 
336
- PLUGIN_ACTION_TAG = "plugin_managed"
355
+ plugin_action_tag = "plugin_managed"
337
356
  main_export_menu = None
338
357
  for top_action in self._im.host.menuBar().actions():
339
358
  if top_action.menu() and top_action.text().replace("&", "") == "File":
@@ -357,7 +376,7 @@ class PluginMenuManager:
357
376
 
358
377
  for menu in targets:
359
378
  sep = menu.addSeparator()
360
- sep.setData(PLUGIN_ACTION_TAG)
379
+ sep.setData(plugin_action_tag)
361
380
  for exp in self._im.host.plugin_manager.export_actions:
362
381
  a = QAction(exp["label"], self._im.host)
363
382
  a.triggered.connect(
@@ -365,7 +384,7 @@ class PluginMenuManager:
365
384
  exp["callback"], exp.get("plugin", "Plugin")
366
385
  )
367
386
  )
368
- a.setData(PLUGIN_ACTION_TAG)
387
+ a.setData(plugin_action_tag)
369
388
  menu.addAction(a)
370
389
 
371
390
  def integrate_plugin_optimization_methods(self) -> None:
@@ -405,9 +424,9 @@ class PluginMenuManager:
405
424
  if import_menu is None:
406
425
  return
407
426
 
408
- PLUGIN_ACTION_TAG = "plugin_managed"
427
+ plugin_action_tag = "plugin_managed"
409
428
  sep = import_menu.addSeparator()
410
- sep.setData(PLUGIN_ACTION_TAG)
429
+ sep.setData(plugin_action_tag)
411
430
 
412
431
  plugin_map: Dict[str, Any] = {}
413
432
  for ext, openers in self._im.host.plugin_manager.file_openers.items():
@@ -452,7 +471,7 @@ class PluginMenuManager:
452
471
 
453
472
  a = QAction(f"Import {ext_str} ({p_name})...", self._im.host)
454
473
  a.triggered.connect(make_cb(ext_map, filter_str, p_name))
455
- a.setData(PLUGIN_ACTION_TAG)
474
+ a.setData(plugin_action_tag)
456
475
  import_menu.addAction(a)
457
476
 
458
477
  def integrate_plugin_analysis_tools(self) -> None:
@@ -466,9 +485,9 @@ class PluginMenuManager:
466
485
  None,
467
486
  )
468
487
  if analysis_menu and self._im.host.plugin_manager.analysis_tools:
469
- PLUGIN_ACTION_TAG = "plugin_managed"
488
+ plugin_action_tag = "plugin_managed"
470
489
  sep = analysis_menu.addSeparator()
471
- sep.setData(PLUGIN_ACTION_TAG)
490
+ sep.setData(plugin_action_tag)
472
491
  for tool in self._im.host.plugin_manager.analysis_tools:
473
492
  a = QAction(
474
493
  f"{tool['label']} ({tool.get('plugin', 'Plugin')})", self._im.host
@@ -478,7 +497,7 @@ class PluginMenuManager:
478
497
  tool["callback"], tool.get("plugin", "Plugin")
479
498
  )
480
499
  )
481
- a.setData(PLUGIN_ACTION_TAG)
500
+ a.setData(plugin_action_tag)
482
501
  analysis_menu.addAction(a)
483
502
 
484
503
  def _clear_plugin_ui_elements(self, plugin_menu: QMenu) -> None:
File without changes