MoleditPy 1.16.0a1__py3-none-any.whl → 1.16.1__py3-none-any.whl

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.
moleditpy/main.py CHANGED
@@ -22,10 +22,7 @@ try:
22
22
  except Exception:
23
23
  # When executed as a standalone script (python main.py) the package-relative
24
24
  # import won't work; fall back to absolute import that works with sys.path
25
- try:
26
- from .modules.main_window import MainWindow
27
- except Exception:
28
- from modules.main_window import MainWindow
25
+ from modules.main_window import MainWindow
29
26
 
30
27
  def main():
31
28
  # --- Windows タスクバーアイコンのための追加処理 ---
@@ -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.0a1'
7
+ VERSION = '1.16.1'
8
8
 
9
9
  ATOM_RADIUS = 18
10
10
  BOND_OFFSET = 3.5
@@ -109,6 +109,9 @@ class MainWindow(QMainWindow):
109
109
  # create a small proxy (BoundFeature) that will forward call to
110
110
  # the helper class with the MainWindow instance as the first
111
111
  # argument.
112
+ # Undo/Redo操作中に状態復元中であることを示すフラグ
113
+ # 他のモジュールが呼び出される前に初期化する
114
+ self._is_restoring_state = False
112
115
 
113
116
  class BoundFeature:
114
117
  """Bind a feature-class method calls to the MainWindow.
@@ -395,7 +398,7 @@ class MainWindow(QMainWindow):
395
398
 
396
399
  def load_mol_file(self, file_path=None):
397
400
  # --- MOVED TO main_window_molecular_parsers.py ---
398
- return self.main_window_molecular_parsers.load_mol_file(file_path=None)
401
+ return self.main_window_molecular_parsers.load_mol_file(file_path)
399
402
 
400
403
  def load_mol_for_3d_viewing(self):
401
404
  # --- MOVED TO main_window_view_loaders.py ---
@@ -403,9 +406,9 @@ class MainWindow(QMainWindow):
403
406
 
404
407
  def load_xyz_for_3d_viewing(self, file_path=None):
405
408
  # --- MOVED TO main_window_view_loaders.py ---
406
- return self.main_window_view_loaders.load_xyz_for_3d_viewing(file_path=None)
409
+ return self.main_window_view_loaders.load_xyz_for_3d_viewing(file_path)
407
410
 
408
- def load_xyz_file(self, file_path):
411
+ def load_xyz_file(self, file_path=None):
409
412
  # --- MOVED TO main_window_molecular_parsers.py ---
410
413
  return self.main_window_molecular_parsers.load_xyz_file(file_path)
411
414
 
@@ -427,7 +430,7 @@ class MainWindow(QMainWindow):
427
430
 
428
431
  def load_raw_data(self, file_path=None):
429
432
  # --- MOVED TO main_window_project_io.py ---
430
- return self.main_window_project_io.load_raw_data(file_path=None)
433
+ return self.main_window_project_io.load_raw_data(file_path)
431
434
 
432
435
  def save_as_json(self):
433
436
  # --- MOVED TO main_window_project_io.py ---
@@ -439,11 +442,11 @@ class MainWindow(QMainWindow):
439
442
 
440
443
  def load_json_data(self, file_path=None):
441
444
  # --- MOVED TO main_window_project_io.py ---
442
- return self.main_window_project_io.load_json_data(file_path=None)
445
+ return self.main_window_project_io.load_json_data(file_path)
443
446
 
444
447
  def open_project_file(self, file_path=None):
445
448
  # --- MOVED TO main_window_project_io.py ---
446
- return self.main_window_project_io.open_project_file(file_path=None)
449
+ return self.main_window_project_io.open_project_file(file_path)
447
450
 
448
451
  def load_from_json_data(self, json_data):
449
452
  # --- MOVED TO main_window_app_state.py ---
@@ -611,7 +614,7 @@ class MainWindow(QMainWindow):
611
614
 
612
615
  def load_mol_file_for_3d_viewing(self, file_path=None):
613
616
  # --- MOVED TO main_window_view_loaders.py ---
614
- return self.main_window_view_loaders.load_mol_file_for_3d_viewing(file_path=None)
617
+ return self.main_window_view_loaders.load_mol_file_for_3d_viewing(file_path)
615
618
 
616
619
  def load_command_line_file(self, file_path):
617
620
  # --- MOVED TO main_window_main_init.py ---
@@ -80,9 +80,13 @@ except Exception:
80
80
  class MainWindowAppState(object):
81
81
  """ main_window.py から分離された機能クラス """
82
82
 
83
- def __init__(self, main_window):
84
- """ クラスの初期化 """
85
- self.mw = main_window
83
+ def __init__(self):
84
+ """
85
+ クラスの初期化
86
+ BoundFeature経由で呼ばれるため、'self' には MainWindow インスタンスが渡されます。
87
+ """
88
+ self.DEBUG_UNDO = False
89
+
86
90
 
87
91
 
88
92
  def get_current_state(self):
@@ -234,6 +238,9 @@ class MainWindowAppState(object):
234
238
 
235
239
 
236
240
  def push_undo_state(self):
241
+ if self._is_restoring_state:
242
+ return
243
+
237
244
  current_state_for_comparison = {
238
245
  'atoms': {k: (v['symbol'], v['item'].pos().x(), v['item'].pos().y(), v.get('charge', 0), v.get('radical', 0)) for k, v in self.data.atoms.items()},
239
246
  'bonds': {k: (v['order'], v.get('stereo', 0)) for k, v in self.data.bonds.items()},
@@ -254,8 +261,15 @@ class MainWindowAppState(object):
254
261
  }
255
262
 
256
263
  if not last_state_for_comparison or current_state_for_comparison != last_state_for_comparison:
257
- state = self.get_current_state()
264
+ # Deepcopy state to ensure saved states are immutable and not affected
265
+ # by later modifications to objects referenced from the state.
266
+ state = copy.deepcopy(self.get_current_state())
258
267
  self.undo_stack.append(state)
268
+ if getattr(self, 'DEBUG_UNDO', False):
269
+ try:
270
+ print(f"DEBUG_UNDO: push_undo_state -> new stack size: {len(self.undo_stack)}")
271
+ except Exception:
272
+ pass
259
273
  self.redo_stack.clear()
260
274
  # 初期化完了後のみ変更があったことを記録
261
275
  if self.initialization_complete:
@@ -320,6 +334,11 @@ class MainWindowAppState(object):
320
334
  self.undo_stack.clear()
321
335
  self.redo_stack.clear()
322
336
  self.push_undo_state()
337
+ if getattr(self, 'DEBUG_UNDO', False):
338
+ try:
339
+ print(f"DEBUG_UNDO: reset_undo_stack -> undo={len(self.undo_stack)} redo={len(self.redo_stack)}")
340
+ except Exception:
341
+ pass
323
342
 
324
343
 
325
344
 
@@ -327,7 +346,12 @@ class MainWindowAppState(object):
327
346
  if len(self.undo_stack) > 1:
328
347
  self.redo_stack.append(self.undo_stack.pop())
329
348
  state = self.undo_stack[-1]
330
- self.set_state_from_data(state)
349
+ self._is_restoring_state = True
350
+ try:
351
+ self.set_state_from_data(state)
352
+ finally:
353
+ self._is_restoring_state = False
354
+
331
355
 
332
356
  # Undo後に3D構造の状態に基づいてメニューを再評価
333
357
  if self.current_mol and self.current_mol.GetNumAtoms() > 0:
@@ -337,6 +361,11 @@ class MainWindowAppState(object):
337
361
  # 3D構造がない場合は3D編集機能を無効化
338
362
  self._enable_3d_edit_actions(False)
339
363
 
364
+ if getattr(self, 'DEBUG_UNDO', False):
365
+ try:
366
+ print(f"DEBUG_UNDO: undo -> undo_stack size: {len(self.undo_stack)}, redo_stack size: {len(self.redo_stack)}")
367
+ except Exception:
368
+ pass
340
369
  self.update_undo_redo_actions()
341
370
  self.update_realtime_info()
342
371
  self.view_2d.setFocus()
@@ -347,7 +376,11 @@ class MainWindowAppState(object):
347
376
  if self.redo_stack:
348
377
  state = self.redo_stack.pop()
349
378
  self.undo_stack.append(state)
350
- self.set_state_from_data(state)
379
+ self._is_restoring_state = True
380
+ try:
381
+ self.set_state_from_data(state)
382
+ finally:
383
+ self._is_restoring_state = False
351
384
 
352
385
  # Redo後に3D構造の状態に基づいてメニューを再評価
353
386
  if self.current_mol and self.current_mol.GetNumAtoms() > 0:
@@ -357,6 +390,11 @@ class MainWindowAppState(object):
357
390
  # 3D構造がない場合は3D編集機能を無効化
358
391
  self._enable_3d_edit_actions(False)
359
392
 
393
+ if getattr(self, 'DEBUG_UNDO', False):
394
+ try:
395
+ print(f"DEBUG_UNDO: redo -> undo_stack size: {len(self.undo_stack)}, redo_stack size: {len(self.redo_stack)}")
396
+ except Exception:
397
+ pass
360
398
  self.update_undo_redo_actions()
361
399
  self.update_realtime_info()
362
400
  self.view_2d.setFocus()
@@ -36,6 +36,90 @@ from PyQt6.QtGui import (
36
36
  from PyQt6.QtCore import (
37
37
  Qt, QPointF, QRectF, QLineF, QUrl, QTimer
38
38
  )
39
+ import platform
40
+ import subprocess
41
+ try:
42
+ import winreg
43
+ except Exception:
44
+ winreg = None
45
+
46
+
47
+ def detect_system_dark_mode():
48
+ """Return True if the OS prefers dark app theme, False if light, or None if unknown.
49
+
50
+ This is a best-effort, cross-platform check supporting Windows (registry),
51
+ macOS (defaults read), and GNOME/GTK-based Linux (gsettings). Return
52
+ None if no reliable information is available.
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
+ """
69
+ try:
70
+ # Windows: AppsUseLightTheme (0 = dark, 1 = light)
71
+ if platform.system() == 'Windows' and winreg is not None:
72
+ try:
73
+ with winreg.OpenKey(winreg.HKEY_CURRENT_USER,
74
+ r'Software\Microsoft\Windows\CurrentVersion\Themes\Personalize') as k:
75
+ val, _ = winreg.QueryValueEx(k, 'AppsUseLightTheme')
76
+ return 'dark' if int(val) == 0 else 'light'
77
+ except Exception:
78
+ pass
79
+
80
+ # macOS: 'defaults read -g AppleInterfaceStyle'
81
+ if platform.system() == 'Darwin':
82
+ return 'light'
83
+ '''
84
+ try:
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'
96
+ except Exception:
97
+ # その他のエラー
98
+ pass
99
+ '''
100
+
101
+ # Linux / GNOME: try color-scheme gsetting; fallback to gtk-theme detection
102
+ if platform.system() == 'Linux':
103
+ try:
104
+ p = subprocess.run(['gsettings', 'get', 'org.gnome.desktop.interface', 'color-scheme'], capture_output=True, text=True)
105
+ if p.returncode == 0:
106
+ out = p.stdout.strip().strip("'\n ")
107
+ if 'dark' in out.lower():
108
+ return 'dark'
109
+ if 'light' in out.lower():
110
+ return 'light'
111
+ except Exception:
112
+ pass
113
+
114
+ try:
115
+ p = subprocess.run(['gsettings', 'get', 'org.gnome.desktop.interface', 'gtk-theme'], capture_output=True, text=True)
116
+ if p.returncode == 0 and '-dark' in p.stdout.lower():
117
+ return 'dark'
118
+ except Exception:
119
+ pass
120
+ except Exception:
121
+ pass
122
+ return None
39
123
 
40
124
 
41
125
  # Use centralized Open Babel availability from package-level __init__
@@ -154,8 +238,8 @@ class MainWindowMainInit(object):
154
238
  self.atom_selection_mode = False
155
239
  self.selected_atom_actors = []
156
240
 
157
- # 3D編集用の原子選択状態
158
- self.selected_atoms_3d = set() # 3Dビューで選択された原子のインデックス
241
+ # 3D編集用の原子選択状態 (3Dビューで選択された原子のインデックス)
242
+ self.selected_atoms_3d = set()
159
243
 
160
244
  # 3D編集ダイアログの参照を保持
161
245
  self.active_3d_dialogs = []
@@ -406,10 +490,18 @@ class MainWindowMainInit(object):
406
490
  toolbar.addSeparator()
407
491
 
408
492
  # --- アイコン前景色を決めるヘルパー(ダーク/ライトモード対応) ---
493
+ # Use module-level detector `detect_system_dark_mode()` so tests and other
494
+ # modules can reuse the logic.
495
+
496
+
409
497
  def _icon_foreground_color():
410
- """Return a QColor for icon foreground (black on light backgrounds, white on dark backgrounds).
498
+ """Return a QColor for icon foreground.
411
499
 
412
- Priority: explicit setting 'icon_foreground' in settings -> infer from configured background color -> infer from application palette.
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
504
+ theme preference -> configured 3D background -> application palette.
413
505
  """
414
506
  try:
415
507
  fg_hex = self.settings.get('icon_foreground')
@@ -420,12 +512,24 @@ class MainWindowMainInit(object):
420
512
  except Exception:
421
513
  pass
422
514
 
515
+ # 1) Prefer the system/OS dark-mode preference if available.
516
+ try:
517
+ os_pref = detect_system_dark_mode()
518
+ # Standard mapping: dark -> white, light -> black
519
+ if os_pref is not None:
520
+ return QColor('#FFFFFF') if os_pref else QColor('#000000')
521
+ except Exception:
522
+ pass
523
+
423
524
  try:
525
+ # Keep background_color as a fallback: if system preference isn't
526
+ # available we'll use the configured 3D view background from settings.
424
527
  bg_hex = self.settings.get('background_color')
425
528
  if bg_hex:
426
529
  bg = QColor(bg_hex)
427
530
  if bg.isValid():
428
531
  lum = 0.2126 * bg.redF() + 0.7152 * bg.greenF() + 0.0722 * bg.blueF()
532
+ # Return white on dark (lum<0.5), black on light
429
533
  return QColor('#FFFFFF') if lum < 0.5 else QColor('#000000')
430
534
  except Exception:
431
535
  pass
@@ -435,6 +539,7 @@ class MainWindowMainInit(object):
435
539
  # palette.window() returns a QBrush; call color()
436
540
  window_bg = pal.window().color()
437
541
  lum = 0.2126 * window_bg.redF() + 0.7152 * window_bg.greenF() + 0.0722 * window_bg.blueF()
542
+ # Palette-based mapping: white on dark palette background
438
543
  return QColor('#FFFFFF') if lum < 0.5 else QColor('#000000')
439
544
  except Exception:
440
545
  return QColor('#000000')
@@ -164,6 +164,11 @@ class MainWindowProjectIo(object):
164
164
  # Replace current file with the newly saved file so subsequent saves go to this path
165
165
  self.current_file_path = file_path
166
166
  self.update_window_title()
167
+ # Mark this state as the last saved state for undo tracking
168
+ try:
169
+ self._saved_state = copy.deepcopy(self.get_current_state())
170
+ except Exception:
171
+ pass
167
172
 
168
173
  self.statusBar().showMessage(f"Project saved to {file_path}")
169
174
 
@@ -217,6 +222,10 @@ class MainWindowProjectIo(object):
217
222
  # Update current file to the newly saved raw file
218
223
  self.current_file_path = file_path
219
224
  self.update_window_title()
225
+ try:
226
+ self._saved_state = copy.deepcopy(self.get_current_state())
227
+ except Exception:
228
+ pass
220
229
 
221
230
  self.statusBar().showMessage(f"Project saved to {file_path}")
222
231
 
@@ -249,8 +258,12 @@ class MainWindowProjectIo(object):
249
258
  self.has_unsaved_changes = False
250
259
  self.current_file_path = file_path
251
260
  self.update_window_title()
252
-
253
- self.statusBar().showMessage(f"Project loaded from {file_path}")
261
+ try:
262
+ self._saved_state= copy.deepcopy(self.et_current_state())
263
+ except Exception:
264
+ pass
265
+
266
+ self.statusBar.showMessage(f"Project loaded from {file_path}")
254
267
 
255
268
  QTimer.singleShot(0, self.fit_to_view)
256
269
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MoleditPy
3
- Version: 1.16.0a1
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
@@ -1,6 +1,6 @@
1
1
  moleditpy/__init__.py,sha256=QCzpw3P5V_CwDtN4itK4hT9J99JgsH4gmpTfvuus6p8,46
2
2
  moleditpy/__main__.py,sha256=az0UrbFsuprbQYycF_bSUXxb0F20DuLvYxrZl1-X5EU,831
3
- moleditpy/main.py,sha256=Qh4Q12shHTSh3j5DVBJjpXw7orkdA8siikRzf8dMHl0,1270
3
+ moleditpy/main.py,sha256=cEZJuCL0HrLPUYvuwPSxgUkaDykVb573A-3qVvjF9RM,1180
4
4
  moleditpy/modules/__init__.py,sha256=X2Z0R5XpAoOehXdOv_6VlRm4rjt4zb1KPNSoLYIZsqg,1456
5
5
  moleditpy/modules/about_dialog.py,sha256=ZztVzLIQgH5mfMMOD-eAhYUbecUn8JaBtbCUg8O12t4,3409
6
6
  moleditpy/modules/align_plane_dialog.py,sha256=D6E0_rM75rKirDkvkJ-diRqNkf8IguqBBLQqDvZJHME,11665
@@ -12,22 +12,22 @@ moleditpy/modules/bond_item.py,sha256=zjQHa4vb8xhS9B7cYPRM0nak-f7lr5NQ1uAj_J78ah
12
12
  moleditpy/modules/bond_length_dialog.py,sha256=xlx-bU3tVeLfShdVRw6_Geo5Gl9mztlIfTdT9tJ6WMA,14579
13
13
  moleditpy/modules/calculation_worker.py,sha256=detE48BW08a2tvmKjMgz8zCShgARzsRH-ABmWrPcqZA,42055
14
14
  moleditpy/modules/color_settings_dialog.py,sha256=h4AOKU8dCTenecI8zOM9GfnmKDm7jfe5C4Fa23Budvs,15205
15
- moleditpy/modules/constants.py,sha256=-U7onjl-zb2CylbZsQQ3MsvnJoNHiAIwCVfm84NZg6I,4436
15
+ moleditpy/modules/constants.py,sha256=LXRej--b5v1JadEX63TDXvO8oalwVNWArkz732Q_-ME,4434
16
16
  moleditpy/modules/constrained_optimization_dialog.py,sha256=MlWnPze0JJvnqmHx9n3qZWG_h-2kZymT0PQ6lALbCro,29861
17
17
  moleditpy/modules/custom_interactor_style.py,sha256=K_uGM6FezY0kZ3zPqoR6f0nowG40ytt-L4UCAbPlwGM,38184
18
18
  moleditpy/modules/custom_qt_interactor.py,sha256=6mzaVb3Mhp-4nryG5AraEvPPgBJpotrzVYwrpCAKmVo,2186
19
19
  moleditpy/modules/dialog3_d_picking_mixin.py,sha256=gaF1ATevvvF72aBfAjubRcagT2jnVG5RMpEKos_XdKg,4768
20
20
  moleditpy/modules/dihedral_dialog.py,sha256=H6WFvc7NvPHSd5QCMk0NUPhudOzpModXv-42dYL20KM,17809
21
- moleditpy/modules/main_window.py,sha256=CcdsfVOazmLlOwKK5INAVBiHAu-tcRQvsQBqmJmosu0,35618
22
- moleditpy/modules/main_window_app_state.py,sha256=cbzgNw902fizAX1IHf5Y8eN7iNcLY3ssHFnaokYhRwg,31758
21
+ moleditpy/modules/main_window.py,sha256=Ii36JTPSkZNaqqEc8CXZ1bq9accIMg5yUs1U7_pHgYM,35791
22
+ moleditpy/modules/main_window_app_state.py,sha256=f9f3JVuC46ijlea2DR8ADa0Jn5r2dgedPPdg8OkmNAU,33374
23
23
  moleditpy/modules/main_window_compute.py,sha256=fiIokVvjzXIwwR3FV3Ltet_K4oL_rT0Z27rPMbvlyyc,51346
24
24
  moleditpy/modules/main_window_dialog_manager.py,sha256=5WU6mFABB0aI4XCywP-cLFPkNQSb3bC0OK0I28SQG_w,19845
25
25
  moleditpy/modules/main_window_edit_3d.py,sha256=FStBWVeDVAM2MoO-JCTjPM-G7iT8QZUHxsb0dS4MEAI,19553
26
26
  moleditpy/modules/main_window_edit_actions.py,sha256=8tR0rYfgWYgdKTxBP4snzpxhiD2DExSKyf4jzSWb6sE,64598
27
27
  moleditpy/modules/main_window_export.py,sha256=f_Z4qVYKBTe06lGTFqjd3deluUdkQvHhZYa81h7UpBM,34465
28
- moleditpy/modules/main_window_main_init.py,sha256=_xWK8rhOHYGwlEMOnB3zpyA8T0c-X8h-emngsGgcEAg,70922
28
+ moleditpy/modules/main_window_main_init.py,sha256=xAstCr__601hkbb1IpqpQKUFTSS6quYe66sBOgqJjkc,75228
29
29
  moleditpy/modules/main_window_molecular_parsers.py,sha256=8JAIgr1axzmJqX_Ue-Adkl8e_8B2Th9yutQbau8EEWQ,43401
30
- moleditpy/modules/main_window_project_io.py,sha256=ix6PmeCzdLRYDovS2UOPwdetoNgs2tdUUDPteP7c4w8,16511
30
+ moleditpy/modules/main_window_project_io.py,sha256=2ArkW23L4ahQIiktCCXlNsJphU0awO5YzJGihIJsn1c,17021
31
31
  moleditpy/modules/main_window_string_importers.py,sha256=yrZblvPG840qnqVEJf__XVfNnWl_r3vt68Abfs2aYDQ,10674
32
32
  moleditpy/modules/main_window_ui_manager.py,sha256=0jdTZGv5JRtDlDniblPKzLPXdfUBZ3qh12s6pav4ihI,22038
33
33
  moleditpy/modules/main_window_view_3d.py,sha256=aU6fI-ZYUV7qOQmucsF5WuafGYyvb4P2xj0oIgsnDaU,55443
@@ -47,8 +47,8 @@ moleditpy/modules/zoomable_view.py,sha256=ZgAmmWXIKtx7AhMjs6H6PCyvb_kpYuankf8Uxs
47
47
  moleditpy/modules/assets/icon.icns,sha256=wD5R6-Vw7K662tVKhu2E1ImN0oUuyAP4youesEQsn9c,139863
48
48
  moleditpy/modules/assets/icon.ico,sha256=RfgFcx7-dHY_2STdsOQCQziY5SNhDr3gPnjO6jzEDPI,147975
49
49
  moleditpy/modules/assets/icon.png,sha256=kCFN1WacYIdy0GN6SFEbNA00ef39pCczBnFdkkBI8Bs,147110
50
- moleditpy-1.16.0a1.dist-info/METADATA,sha256=371b7dT_tKv4iB-sVSWNwUvPIDCEADEgWFAaoktequM,17422
51
- moleditpy-1.16.0a1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
52
- moleditpy-1.16.0a1.dist-info/entry_points.txt,sha256=yH1h9JjALhok1foXT3-hYrC4ufoZt8b7oiBcsdnGNNM,54
53
- moleditpy-1.16.0a1.dist-info/top_level.txt,sha256=ARICrS4ihlPXqywlKl6o-oJa3Qz3gZRWu_VZsQ3_c44,10
54
- moleditpy-1.16.0a1.dist-info/RECORD,,
50
+ moleditpy-1.16.1.dist-info/METADATA,sha256=lNUaucVX0UqqAwtAlXYY9qw0re5uP49MxPp3vCH5pXQ,17356
51
+ moleditpy-1.16.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
52
+ moleditpy-1.16.1.dist-info/entry_points.txt,sha256=yH1h9JjALhok1foXT3-hYrC4ufoZt8b7oiBcsdnGNNM,54
53
+ moleditpy-1.16.1.dist-info/top_level.txt,sha256=ARICrS4ihlPXqywlKl6o-oJa3Qz3gZRWu_VZsQ3_c44,10
54
+ moleditpy-1.16.1.dist-info/RECORD,,