MoleditPy 1.16.0a2__tar.gz → 1.16.1__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 (60) hide show
  1. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/PKG-INFO +1 -2
  2. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/pyproject.toml +1 -2
  3. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/MoleditPy.egg-info/PKG-INFO +1 -2
  4. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/MoleditPy.egg-info/SOURCES.txt +1 -2
  5. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/constants.py +1 -1
  6. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/main_window_main_init.py +48 -24
  7. moleditpy-1.16.0a2/tests/test_project_io_wrappers.py +0 -0
  8. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/README.md +0 -0
  9. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/setup.cfg +0 -0
  10. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/MoleditPy.egg-info/dependency_links.txt +0 -0
  11. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/MoleditPy.egg-info/entry_points.txt +0 -0
  12. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/MoleditPy.egg-info/requires.txt +0 -0
  13. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/MoleditPy.egg-info/top_level.txt +0 -0
  14. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/__init__.py +0 -0
  15. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/__main__.py +0 -0
  16. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/main.py +0 -0
  17. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/__init__.py +0 -0
  18. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/about_dialog.py +0 -0
  19. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/align_plane_dialog.py +0 -0
  20. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/alignment_dialog.py +0 -0
  21. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/analysis_window.py +0 -0
  22. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/angle_dialog.py +0 -0
  23. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/assets/icon.icns +0 -0
  24. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/assets/icon.ico +0 -0
  25. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/assets/icon.png +0 -0
  26. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/atom_item.py +0 -0
  27. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/bond_item.py +0 -0
  28. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/bond_length_dialog.py +0 -0
  29. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/calculation_worker.py +0 -0
  30. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/color_settings_dialog.py +0 -0
  31. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/constrained_optimization_dialog.py +0 -0
  32. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/custom_interactor_style.py +0 -0
  33. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/custom_qt_interactor.py +0 -0
  34. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/dialog3_d_picking_mixin.py +0 -0
  35. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/dihedral_dialog.py +0 -0
  36. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/main_window.py +0 -0
  37. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/main_window_app_state.py +0 -0
  38. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/main_window_compute.py +0 -0
  39. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/main_window_dialog_manager.py +0 -0
  40. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/main_window_edit_3d.py +0 -0
  41. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/main_window_edit_actions.py +0 -0
  42. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/main_window_export.py +0 -0
  43. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/main_window_molecular_parsers.py +0 -0
  44. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/main_window_project_io.py +0 -0
  45. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/main_window_string_importers.py +0 -0
  46. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/main_window_ui_manager.py +0 -0
  47. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/main_window_view_3d.py +0 -0
  48. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/main_window_view_loaders.py +0 -0
  49. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/mirror_dialog.py +0 -0
  50. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/molecular_data.py +0 -0
  51. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/molecule_scene.py +0 -0
  52. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/move_group_dialog.py +0 -0
  53. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/periodic_table_dialog.py +0 -0
  54. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/planarize_dialog.py +0 -0
  55. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/settings_dialog.py +0 -0
  56. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/template_preview_item.py +0 -0
  57. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/template_preview_view.py +0 -0
  58. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/translation_dialog.py +0 -0
  59. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/user_template_dialog.py +0 -0
  60. {moleditpy-1.16.0a2 → moleditpy-1.16.1}/src/moleditpy/modules/zoomable_view.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MoleditPy
3
- Version: 1.16.0a2
3
+ Version: 1.16.1
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
  Project-URL: Homepage, https://github.com/HiroYokoyama/python_molecular_editor
@@ -15,7 +15,6 @@ Classifier: Programming Language :: Python :: 3.10
15
15
  Classifier: Programming Language :: Python :: 3.11
16
16
  Classifier: Programming Language :: Python :: 3.12
17
17
  Classifier: Programming Language :: Python :: 3.13
18
- Classifier: License :: OSI Approved :: Apache Software License
19
18
  Requires-Python: <3.14,>=3.9
20
19
  Description-Content-Type: text/markdown
21
20
  Requires-Dist: numpy
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
  [project]
6
6
  name = "MoleditPy"
7
7
 
8
- version = "1.16.0a2"
8
+ version = "1.16.1"
9
9
 
10
10
  authors = [
11
11
  { name="HiroYokoyama", email="titech.yoko.hiro@gmail.com" },
@@ -28,7 +28,6 @@ classifiers = [
28
28
  "Programming Language :: Python :: 3.11",
29
29
  "Programming Language :: Python :: 3.12",
30
30
  "Programming Language :: Python :: 3.13",
31
- "License :: OSI Approved :: Apache Software License"
32
31
  ]
33
32
 
34
33
  dependencies = [
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MoleditPy
3
- Version: 1.16.0a2
3
+ Version: 1.16.1
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
  Project-URL: Homepage, https://github.com/HiroYokoyama/python_molecular_editor
@@ -15,7 +15,6 @@ Classifier: Programming Language :: Python :: 3.10
15
15
  Classifier: Programming Language :: Python :: 3.11
16
16
  Classifier: Programming Language :: Python :: 3.12
17
17
  Classifier: Programming Language :: Python :: 3.13
18
- Classifier: License :: OSI Approved :: Apache Software License
19
18
  Requires-Python: <3.14,>=3.9
20
19
  Description-Content-Type: text/markdown
21
20
  Requires-Dist: numpy
@@ -60,5 +60,4 @@ src/moleditpy/modules/user_template_dialog.py
60
60
  src/moleditpy/modules/zoomable_view.py
61
61
  src/moleditpy/modules/assets/icon.icns
62
62
  src/moleditpy/modules/assets/icon.ico
63
- src/moleditpy/modules/assets/icon.png
64
- tests/test_project_io_wrappers.py
63
+ src/moleditpy/modules/assets/icon.png
@@ -4,7 +4,7 @@ from PyQt6.QtGui import QFont, QColor
4
4
  from rdkit import Chem
5
5
 
6
6
  #Version
7
- VERSION = '1.16.0a2'
7
+ VERSION = '1.16.1'
8
8
 
9
9
  ATOM_RADIUS = 18
10
10
  BOND_OFFSET = 3.5
@@ -51,27 +51,52 @@ def detect_system_dark_mode():
51
51
  macOS (defaults read), and GNOME/GTK-based Linux (gsettings). Return
52
52
  None if no reliable information is available.
53
53
  """
54
+ # Delegate detailed OS detection to `detect_system_theme` and map
55
+ # 'dark' -> True, 'light' -> False. This avoids duplicating the
56
+ # registry and subprocess calls in two places.
57
+ theme = detect_system_theme()
58
+ if theme == 'dark':
59
+ return True
60
+ if theme == 'light':
61
+ return False
62
+ return None
63
+
64
+ def detect_system_theme():
65
+ """OSの優先テーマ設定を 'dark', 'light', または None として返す。
66
+
67
+ This is a best-effort, cross-platform check.
68
+ """
54
69
  try:
55
- # Windows: read registry AppsUseLightTheme (0 = dark, 1 = light)
70
+ # Windows: AppsUseLightTheme (0 = dark, 1 = light)
56
71
  if platform.system() == 'Windows' and winreg is not None:
57
72
  try:
58
73
  with winreg.OpenKey(winreg.HKEY_CURRENT_USER,
59
74
  r'Software\Microsoft\Windows\CurrentVersion\Themes\Personalize') as k:
60
75
  val, _ = winreg.QueryValueEx(k, 'AppsUseLightTheme')
61
- return False if int(val) == 0 else True
76
+ return 'dark' if int(val) == 0 else 'light'
62
77
  except Exception:
63
78
  pass
64
79
 
65
- # macOS: 'defaults read -g AppleInterfaceStyle' returns 'Dark' in dark mode
80
+ # macOS: 'defaults read -g AppleInterfaceStyle'
66
81
  if platform.system() == 'Darwin':
82
+ return 'light'
83
+ '''
67
84
  try:
68
- p = subprocess.run(['defaults', 'read', '-g', 'AppleInterfaceStyle'], capture_output=True, text=True)
69
- if p.returncode == 0 and p.stdout.strip().lower() == 'dark':
70
- return True
71
- # Key absence implies light mode
72
- return False
85
+ # 'defaults read ...' が成功すればダークモード
86
+ p = subprocess.run(
87
+ ['defaults', 'read', '-g', 'AppleInterfaceStyle'],
88
+ capture_output=True, text=True, check=True, encoding='utf-8'
89
+ )
90
+ if p.stdout.strip().lower() == 'dark':
91
+ return 'dark'
92
+
93
+ except subprocess.CalledProcessError:
94
+ # コマンド失敗 (キーが存在しない) = ライトモード
95
+ return 'light'
73
96
  except Exception:
97
+ # その他のエラー
74
98
  pass
99
+ '''
75
100
 
76
101
  # Linux / GNOME: try color-scheme gsetting; fallback to gtk-theme detection
77
102
  if platform.system() == 'Linux':
@@ -80,16 +105,16 @@ def detect_system_dark_mode():
80
105
  if p.returncode == 0:
81
106
  out = p.stdout.strip().strip("'\n ")
82
107
  if 'dark' in out.lower():
83
- return True
108
+ return 'dark'
84
109
  if 'light' in out.lower():
85
- return False
110
+ return 'light'
86
111
  except Exception:
87
112
  pass
88
113
 
89
114
  try:
90
115
  p = subprocess.run(['gsettings', 'get', 'org.gnome.desktop.interface', 'gtk-theme'], capture_output=True, text=True)
91
116
  if p.returncode == 0 and '-dark' in p.stdout.lower():
92
- return True
117
+ return 'dark'
93
118
  except Exception:
94
119
  pass
95
120
  except Exception:
@@ -213,8 +238,8 @@ class MainWindowMainInit(object):
213
238
  self.atom_selection_mode = False
214
239
  self.selected_atom_actors = []
215
240
 
216
- # 3D編集用の原子選択状態
217
- self.selected_atoms_3d = set() # 3Dビューで選択された原子のインデックス
241
+ # 3D編集用の原子選択状態 (3Dビューで選択された原子のインデックス)
242
+ self.selected_atoms_3d = set()
218
243
 
219
244
  # 3D編集ダイアログの参照を保持
220
245
  self.active_3d_dialogs = []
@@ -472,11 +497,10 @@ class MainWindowMainInit(object):
472
497
  def _icon_foreground_color():
473
498
  """Return a QColor for icon foreground.
474
499
 
475
- NOTE: this application inverts the usual foreground mapping so icons
476
- will be the *opposite* color to the background (i.e., black on dark
477
- backgrounds, white on light backgrounds). This intentionally reverses
478
- the previous behavior so button icons don't blend into the 3D-view
479
- background. Priority: explicit setting in 'icon_foreground' -> OS
500
+ NOTE: choose icon foreground to contrast against the background
501
+ (i.e., white on dark backgrounds, black on light backgrounds). This
502
+ matches common conventions. Priority: explicit setting in
503
+ 'icon_foreground' -> OS theme preference -> configured 3D
480
504
  theme preference -> configured 3D background -> application palette.
481
505
  """
482
506
  try:
@@ -491,9 +515,9 @@ class MainWindowMainInit(object):
491
515
  # 1) Prefer the system/OS dark-mode preference if available.
492
516
  try:
493
517
  os_pref = detect_system_dark_mode()
494
- # Invert the color so in dark-pref OS we return black, in light we return white
518
+ # Standard mapping: dark -> white, light -> black
495
519
  if os_pref is not None:
496
- return QColor('#000000') if os_pref else QColor('#FFFFFF')
520
+ return QColor('#FFFFFF') if os_pref else QColor('#000000')
497
521
  except Exception:
498
522
  pass
499
523
 
@@ -505,8 +529,8 @@ class MainWindowMainInit(object):
505
529
  bg = QColor(bg_hex)
506
530
  if bg.isValid():
507
531
  lum = 0.2126 * bg.redF() + 0.7152 * bg.greenF() + 0.0722 * bg.blueF()
508
- # Inverted: return black on dark (lum<0.5), white on light
509
- return QColor('#000000') if lum < 0.5 else QColor('#FFFFFF')
532
+ # Return white on dark (lum<0.5), black on light
533
+ return QColor('#FFFFFF') if lum < 0.5 else QColor('#000000')
510
534
  except Exception:
511
535
  pass
512
536
 
@@ -515,8 +539,8 @@ class MainWindowMainInit(object):
515
539
  # palette.window() returns a QBrush; call color()
516
540
  window_bg = pal.window().color()
517
541
  lum = 0.2126 * window_bg.redF() + 0.7152 * window_bg.greenF() + 0.0722 * window_bg.blueF()
518
- # Inverted mapping for palette fallback
519
- return QColor('#000000') if lum < 0.5 else QColor('#FFFFFF')
542
+ # Palette-based mapping: white on dark palette background
543
+ return QColor('#FFFFFF') if lum < 0.5 else QColor('#000000')
520
544
  except Exception:
521
545
  return QColor('#000000')
522
546
 
File without changes
File without changes
File without changes