shinestacker 1.2.0__py3-none-any.whl → 1.2.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.

Potentially problematic release.


This version of shinestacker might be problematic. Click here for more details.

@@ -136,7 +136,7 @@ class MainWindow(QMainWindow, LogManager):
136
136
  self.project_editor.enable_delete_action_signal.connect(
137
137
  self.menu_manager.delete_element_action.setEnabled)
138
138
  self.project_editor.undo_manager.set_enabled_undo_action_requested.connect(
139
- self.menu_manager.undo_action.setEnabled)
139
+ self.menu_manager.set_enabled_undo_action)
140
140
  self.project_controller.update_title_requested.connect(self.update_title)
141
141
  self.project_controller.refresh_ui_requested.connect(self.refresh_ui)
142
142
  self.project_controller.activate_window_requested.connect(self.activateWindow)
@@ -148,8 +148,8 @@ class MainWindow(QMainWindow, LogManager):
148
148
  def modified(self):
149
149
  return self.project_editor.modified()
150
150
 
151
- def mark_as_modified(self, modified=True):
152
- self.project_editor.mark_as_modified(modified)
151
+ def mark_as_modified(self, modified=True, description=''):
152
+ self.project_editor.mark_as_modified(modified, description)
153
153
 
154
154
  def set_project(self, project):
155
155
  self.project_editor.set_project(project)
@@ -426,7 +426,7 @@ class MainWindow(QMainWindow, LogManager):
426
426
  self.expert_options = self.menu_manager.expert_options_action.isChecked()
427
427
 
428
428
  def set_expert_options(self):
429
- self.expert_options_action.setChecked(True)
429
+ self.menu_manager.expert_options_action.setChecked(True)
430
430
  self.expert_options = True
431
431
 
432
432
  def before_thread_begins(self):
@@ -244,3 +244,7 @@ class MenuManager:
244
244
  if not enabled:
245
245
  tooltip += " (requires more tha one job)"
246
246
  self.run_all_jobs_action.setToolTip(tooltip)
247
+
248
+ def set_enabled_undo_action(self, enabled, description):
249
+ self.undo_action.setEnabled(enabled)
250
+ self.undo_action.setText(f"&Undo {description}")
@@ -183,7 +183,6 @@ class NewProjectDialog(BaseFormDialog):
183
183
  n_bytes = 1 if img.dtype == np.uint8 else 2
184
184
  n_bits = 8 if img.dtype == np.uint8 else 16
185
185
  n_gbytes = float(n_bytes * height * width * self.n_image_files) / constants.ONE_GIGA
186
- print("GBytes: ", n_gbytes)
187
186
  if n_gbytes > 1 and not self.bunch_stack.isChecked():
188
187
  msg = QMessageBox()
189
188
  msg.setStyleSheet("""
@@ -29,8 +29,8 @@ class ProjectController(QObject):
29
29
  def refresh_ui(self, job_row=-1, action_row=-1):
30
30
  self.refresh_ui_requested.emit(job_row, action_row)
31
31
 
32
- def mark_as_modified(self, modified=True):
33
- self.project_editor.mark_as_modified(modified)
32
+ def mark_as_modified(self, modified=True, description=''):
33
+ self.project_editor.mark_as_modified(modified, description)
34
34
 
35
35
  def modified(self):
36
36
  return self.project_editor.modified()
@@ -227,7 +227,7 @@ class ProjectController(QObject):
227
227
  'input_path': constants.PATH_SEPARATOR.join(multi_input_path)})
228
228
  job.add_sub_action(multi_layer)
229
229
  self.add_job_to_project(job)
230
- self.mark_as_modified(True)
230
+ self.mark_as_modified(True, "New Project")
231
231
  self.refresh_ui(0, -1)
232
232
 
233
233
  def open_project(self, file_path=False):
@@ -369,4 +369,4 @@ class ProjectController(QObject):
369
369
  dialog = self.action_config_dialog(action)
370
370
  if dialog.exec() == QDialog.Accepted:
371
371
  self.on_job_selected(self.current_job_index())
372
- self.mark_as_modified()
372
+ # self.mark_as_modified(True. "Edit Action") <-- done by dialog
@@ -75,28 +75,30 @@ def new_row_after_clone(job, action_row, is_sub_action, cloned):
75
75
 
76
76
 
77
77
  class ProjectUndoManager(QObject):
78
- set_enabled_undo_action_requested = Signal(bool)
78
+ set_enabled_undo_action_requested = Signal(bool, str)
79
79
 
80
80
  def __init__(self, parent=None):
81
81
  super().__init__(parent)
82
82
  self._undo_buffer = []
83
83
 
84
- def add(self, item):
85
- self._undo_buffer.append(item)
86
- self.set_enabled_undo_action_requested.emit(True)
84
+ def add(self, item, description):
85
+ self._undo_buffer.append((item, description))
86
+ self.set_enabled_undo_action_requested.emit(True, description)
87
87
 
88
88
  def pop(self):
89
89
  last = self._undo_buffer.pop()
90
90
  if len(self._undo_buffer) == 0:
91
- self.set_enabled_undo_action_requested.emit(False)
92
- return last
91
+ self.set_enabled_undo_action_requested.emit(False, '')
92
+ else:
93
+ self.set_enabled_undo_action_requested.emit(True, self._undo_buffer[-1][1])
94
+ return last[0]
93
95
 
94
96
  def filled(self):
95
97
  return len(self._undo_buffer) != 0
96
98
 
97
99
  def reset(self):
98
100
  self._undo_buffer = []
99
- self.set_enabled_undo_action_requested.emit(False)
101
+ self.set_enabled_undo_action_requested.emit(False, '')
100
102
 
101
103
 
102
104
  class ProjectEditor(QObject):
@@ -122,8 +124,8 @@ class ProjectEditor(QObject):
122
124
  def reset_undo(self):
123
125
  self.undo_manager.reset()
124
126
 
125
- def add_undo(self, item):
126
- self.undo_manager.add(item)
127
+ def add_undo(self, item, description=''):
128
+ self.undo_manager.add(item, description)
127
129
 
128
130
  def pop_undo(self):
129
131
  return self.undo_manager.pop()
@@ -131,10 +133,13 @@ class ProjectEditor(QObject):
131
133
  def filled_undo(self):
132
134
  return self.undo_manager.filled()
133
135
 
134
- def mark_as_modified(self, modified=True):
136
+ def set_modified(self, modified):
137
+ self._modified = modified
138
+
139
+ def mark_as_modified(self, modified=True, description=''):
135
140
  self._modified = modified
136
141
  if modified:
137
- self.add_undo(self._project.clone())
142
+ self.add_undo(self._project.clone(), description)
138
143
  self.modified_signal.emit(modified)
139
144
 
140
145
  def modified(self):
@@ -320,7 +325,7 @@ class ProjectEditor(QObject):
320
325
  new_index = job_index + delta
321
326
  if 0 <= new_index < self.num_project_jobs():
322
327
  jobs = self.project_jobs()
323
- self.mark_as_modified()
328
+ self.mark_as_modified(True, "Shift Job")
324
329
  jobs.insert(new_index, jobs.pop(job_index))
325
330
  self.refresh_ui_signal.emit(new_index, -1)
326
331
 
@@ -330,12 +335,12 @@ class ProjectEditor(QObject):
330
335
  if not pos.is_sub_action:
331
336
  new_index = pos.action_index + delta
332
337
  if 0 <= new_index < len(pos.actions):
333
- self.mark_as_modified()
338
+ self.mark_as_modified(True, "Shift Action")
334
339
  pos.actions.insert(new_index, pos.actions.pop(pos.action_index))
335
340
  else:
336
341
  new_index = pos.sub_action_index + delta
337
342
  if 0 <= new_index < len(pos.sub_actions):
338
- self.mark_as_modified()
343
+ self.mark_as_modified(True, "Shift Sub-action")
339
344
  pos.sub_actions.insert(new_index, pos.sub_actions.pop(pos.sub_action_index))
340
345
  new_row = new_row_after_insert(action_row, pos, delta)
341
346
  self.refresh_ui_signal.emit(job_row, new_row)
@@ -357,7 +362,7 @@ class ProjectEditor(QObject):
357
362
  if 0 <= job_index < self.num_project_jobs():
358
363
  job_clone = self.project_job(job_index).clone(self.CLONE_POSTFIX)
359
364
  new_job_index = job_index + 1
360
- self.mark_as_modified()
365
+ self.mark_as_modified(True, "Duplicate Job")
361
366
  self.project_jobs().insert(new_job_index, job_clone)
362
367
  self.set_current_job(new_job_index)
363
368
  self.set_current_action(new_job_index)
@@ -367,7 +372,7 @@ class ProjectEditor(QObject):
367
372
  job_row, action_row, pos = self.get_current_action()
368
373
  if not pos.actions:
369
374
  return
370
- self.mark_as_modified()
375
+ self.mark_as_modified(True, "Duplicate Action")
371
376
  job = self.project_job(job_row)
372
377
  if pos.is_sub_action:
373
378
  cloned = pos.sub_action.clone(self.CLONE_POSTFIX)
@@ -398,7 +403,7 @@ class ProjectEditor(QObject):
398
403
  reply = None
399
404
  if not confirm or reply == QMessageBox.Yes:
400
405
  self.take_job(current_index)
401
- self.mark_as_modified()
406
+ self.mark_as_modified(True, "Delete Job")
402
407
  current_job = self.project_jobs().pop(current_index)
403
408
  self.clear_action_list()
404
409
  self.refresh_ui_signal.emit(-1, -1)
@@ -420,10 +425,11 @@ class ProjectEditor(QObject):
420
425
  else:
421
426
  reply = None
422
427
  if not confirm or reply == QMessageBox.Yes:
423
- self.mark_as_modified()
424
428
  if pos.is_sub_action:
429
+ self.mark_as_modified(True, "Delete Action")
425
430
  pos.action.pop_sub_action(pos.sub_action_index)
426
431
  else:
432
+ self.mark_as_modified(True, "Delete Sub-action")
427
433
  self.project_job(job_row).pop_sub_action(pos.action_index)
428
434
  new_row = new_row_after_delete(action_row, pos)
429
435
  self.refresh_ui_signal.emit(job_row, new_row)
@@ -446,7 +452,7 @@ class ProjectEditor(QObject):
446
452
  job_action = ActionConfig("Job")
447
453
  self.dialog = self.action_config_dialog(job_action)
448
454
  if self.dialog.exec() == QDialog.Accepted:
449
- self.mark_as_modified()
455
+ self.mark_as_modified(True, "Add Job")
450
456
  self.project_jobs().append(job_action)
451
457
  self.add_list_item(self.job_list(), job_action, False)
452
458
  self.set_current_job(self.job_list_count() - 1)
@@ -467,7 +473,7 @@ class ProjectEditor(QObject):
467
473
  action.parent = self.get_current_job()
468
474
  self.dialog = self.action_config_dialog(action)
469
475
  if self.dialog.exec() == QDialog.Accepted:
470
- self.mark_as_modified()
476
+ self.mark_as_modified("Add Action")
471
477
  self.project_job(current_index).add_sub_action(action)
472
478
  self.add_list_item(self.action_list(), action, False)
473
479
  self.enable_delete_action_signal.emit(False)
@@ -507,7 +513,7 @@ class ProjectEditor(QObject):
507
513
  sub_action = ActionConfig(type_name)
508
514
  self.dialog = self.action_config_dialog(sub_action)
509
515
  if self.dialog.exec() == QDialog.Accepted:
510
- self.mark_as_modified()
516
+ self.mark_as_modified("Add Sub-action")
511
517
  action.add_sub_action(sub_action)
512
518
  self.on_job_selected(current_job_index)
513
519
  self.set_current_action(current_action_index)
@@ -535,7 +541,7 @@ class ProjectEditor(QObject):
535
541
  job_index = self.current_job_index()
536
542
  if 0 <= job_index < self.num_project_jobs():
537
543
  new_job_index = job_index
538
- self.mark_as_modified()
544
+ self.mark_as_modified(True, "Paste Job")
539
545
  self.project_jobs().insert(new_job_index, self.copy_buffer())
540
546
  self.set_current_job(new_job_index)
541
547
  self.set_current_action(new_job_index)
@@ -547,13 +553,13 @@ class ProjectEditor(QObject):
547
553
  if not pos.is_sub_action:
548
554
  if self.copy_buffer().type_name not in constants.ACTION_TYPES:
549
555
  return
550
- self.mark_as_modified()
556
+ self.mark_as_modified(True, "Paste Action")
551
557
  pos.actions.insert(pos.action_index, self.copy_buffer())
552
558
  else:
553
559
  if pos.action.type_name != constants.ACTION_COMBO or \
554
560
  self.copy_buffer().type_name not in constants.SUB_ACTION_TYPES:
555
561
  return
556
- self.mark_as_modified()
562
+ self.mark_as_modified(True, "Paste Sub-action")
557
563
  pos.sub_actions.insert(pos.sub_action_index, self.copy_buffer())
558
564
  new_row = new_row_after_paste(action_row, pos)
559
565
  self.refresh_ui_signal.emit(job_row, new_row)
@@ -597,7 +603,10 @@ class ProjectEditor(QObject):
597
603
  action_row = -1
598
604
  if current_action:
599
605
  if current_action.enabled() != enabled:
600
- self.mark_as_modified()
606
+ if enabled:
607
+ self.mark_as_modified(True, "Enable")
608
+ else:
609
+ self.mark_as_modified(True, "Disable")
601
610
  current_action.set_enabled(enabled)
602
611
  self.refresh_ui_signal.emit(job_row, action_row)
603
612
 
@@ -608,7 +617,7 @@ class ProjectEditor(QObject):
608
617
  self.set_enabled(False)
609
618
 
610
619
  def set_enabled_all(self, enable=True):
611
- self.mark_as_modified()
620
+ self.mark_as_modified(True, "Enable All")
612
621
  job_row = self.current_job_index()
613
622
  action_row = self.current_action_index()
614
623
  for j in self.project_jobs():
@@ -12,10 +12,10 @@ class TabWidgetWithPlaceholder(QWidget):
12
12
 
13
13
  def __init__(self, parent=None):
14
14
  super().__init__(parent)
15
- self.layout = QVBoxLayout(self)
16
- self.layout.setContentsMargins(0, 0, 0, 0)
15
+ self.main_layout = QVBoxLayout(self)
16
+ self.main_layout.setContentsMargins(0, 0, 0, 0)
17
17
  self.stacked_widget = QStackedWidget()
18
- self.layout.addWidget(self.stacked_widget)
18
+ self.main_layout.addWidget(self.stacked_widget)
19
19
  self.tab_widget = QTabWidget()
20
20
  self.stacked_widget.addWidget(self.tab_widget)
21
21
  self.placeholder = QLabel()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: shinestacker
3
- Version: 1.2.0
3
+ Version: 1.2.1
4
4
  Summary: ShineStacker
5
5
  Author-email: Luca Lista <luka.lista@gmail.com>
6
6
  License-Expression: LGPL-3.0
@@ -1,22 +1,22 @@
1
1
  shinestacker/__init__.py,sha256=uq2fjAw2z_6TpH3mOcWFZ98GoEPRsNhTAK8N0MMm_e8,448
2
- shinestacker/_version.py,sha256=5GblYyMbk8JySosj59Rvi2uzLqfP-DAs77ikwTafXT4,21
2
+ shinestacker/_version.py,sha256=VvDq5py76uDFeq6tv3EFMgTHX4rtDyt6nw0tPm3Wrkk,21
3
3
  shinestacker/algorithms/__init__.py,sha256=1FwVJ3w9GGbFFkjYJRUedTvcdE4j0ieSgaH9RC9iCY4,877
4
- shinestacker/algorithms/align.py,sha256=BsE3rp4EfJyWTTbC6U1leQQqURD724YLAmxY-1wM-ok,22558
5
- shinestacker/algorithms/balance.py,sha256=rz_lmBwnJBYLnYt6yJ30BXWmMwpmmmA3rKUznEWY0eo,23463
4
+ shinestacker/algorithms/align.py,sha256=PvjxHgP4Q19jmt6LS3nGcimCOywHglmxXMlfxo7dCjc,22641
5
+ shinestacker/algorithms/balance.py,sha256=Rj4dPvEiXBb0VNJPJd60wYYgevlO7xmg7H9Onxmabbs,23508
6
6
  shinestacker/algorithms/base_stack_algo.py,sha256=W-VSrCF0-lE_OOsxsnZvJ3BI0NqRKIRMciQV-ui5t_g,2515
7
7
  shinestacker/algorithms/denoise.py,sha256=GL3Z4_6MHxSa7Wo4ZzQECZS87tHBFqO0sIVF_jPuYQU,426
8
8
  shinestacker/algorithms/depth_map.py,sha256=m0_Qm8FLDeSWyQEMNx29PzXp_VFGar7gY3jWxq_10t8,5713
9
9
  shinestacker/algorithms/exif.py,sha256=SM4ZDDe8hCJ3xY6053FNndOiwzEStzdp0WrXurlcHVc,9429
10
- shinestacker/algorithms/multilayer.py,sha256=5aIaIU2GX1eoZbGL4z-Xo8XiFlCvIcZKRDYnbjjdojI,9906
11
- shinestacker/algorithms/noise_detection.py,sha256=lP5iJLFA5xWN-tpyNDH9AWuoZsL7rKhrxwDcBBc9nCk,9250
10
+ shinestacker/algorithms/multilayer.py,sha256=SfF51orenT3k15St_EUJcwnfOZ8Y5X5ZhStOWygjn1g,9838
11
+ shinestacker/algorithms/noise_detection.py,sha256=Ku0xgc_FFHzycSObDNXAux5scP3PVBeffGoYVdNJci0,9180
12
12
  shinestacker/algorithms/pyramid.py,sha256=lmd-lw4bzrpcfBaLnBXHuOJ9J7-5sWq4dC9p_EejqXA,8881
13
13
  shinestacker/algorithms/pyramid_auto.py,sha256=ByDH7Xblqj4YfNwsCWwN3wv2xL6gYp2lFnvpNPSEawM,6161
14
14
  shinestacker/algorithms/pyramid_tiles.py,sha256=SzjTSheme8MP8nQXfOu8QHbzrtpuQX2aIsBVr5aM4Mc,12165
15
15
  shinestacker/algorithms/sharpen.py,sha256=h7PMJBYxucg194Usp_6pvItPUMFYbT-ebAc_-7XBFUw,949
16
- shinestacker/algorithms/stack.py,sha256=fLDps52QT8bsC3Pz8niU0h7cGc70q9goKsgA8wvu_Bg,5054
17
- shinestacker/algorithms/stack_framework.py,sha256=YKk-JoLV6IVlTiCbo6e-Hg2dF3hdz4CE6WFIXhMXBy8,12818
16
+ shinestacker/algorithms/stack.py,sha256=UN2XHb-x-qXtescUCsOLK8GKSYx26AFpKa2xCMJKhVo,4997
17
+ shinestacker/algorithms/stack_framework.py,sha256=Y1uuXYbpCFuPYWumMhx040Q4FkylPwKkz6iXz8ay2aY,11831
18
18
  shinestacker/algorithms/utils.py,sha256=jImR2XF73gsLRZMic0kv8cyCuO2Zq21tX4kUhaTcfzI,11301
19
- shinestacker/algorithms/vignetting.py,sha256=stzrWTxJIIByq_mOI0ofE-7b0bL5MLm9dhlj_E-Kxv0,10165
19
+ shinestacker/algorithms/vignetting.py,sha256=3E-ulzw8dggAefyJwzQI056J5IGlV_vV2zPrO0DGVGk,10208
20
20
  shinestacker/algorithms/white_balance.py,sha256=PMKsBtxOSn5aRr_Gkx1StHS4eN6kBN2EhNnhg4UG24g,501
21
21
  shinestacker/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
22
  shinestacker/app/about_dialog.py,sha256=pkH7nnxUP8yc0D3vRGd1jRb5cwi1nDVbQRk_OC9yLk8,4144
@@ -28,32 +28,32 @@ shinestacker/app/project.py,sha256=W0u715LZne_PNJvg9msSy27ybIjgDXiEAQdJ7_6BjYI,2
28
28
  shinestacker/app/retouch.py,sha256=ZQ-nRKnHo6xurcP34RNqaAWkmuGBjJ5jE05hTQ_ycis,2482
29
29
  shinestacker/config/__init__.py,sha256=aXxi-LmAvXd0daIFrVnTHE5OCaYeK1uf1BKMr7oaXQs,197
30
30
  shinestacker/config/config.py,sha256=eBko2D3ADhLTIm9X6hB_a_WsIjwgfE-qmBVkhP1XSvc,1636
31
- shinestacker/config/constants.py,sha256=ncuiYyA5NgggkGbazQbccJHGzXJnl37AOyxEB-GLoB0,7116
31
+ shinestacker/config/constants.py,sha256=M8sKfZdGBhWY_wuJ40F_CEPtspPoYhrva4WFHX5bD6s,7145
32
32
  shinestacker/config/gui_constants.py,sha256=5DR-ET1oeMMD7lIsjvAwSuln89A7I9wy9VuAeRo2G64,2575
33
33
  shinestacker/core/__init__.py,sha256=IUEIx6SQ3DygDEHN3_E6uKpHjHtUa4a_U_1dLd_8yEU,484
34
34
  shinestacker/core/colors.py,sha256=kr_tJA1iRsdck2JaYDb2lS-codZ4Ty9gdu3kHfiWvuM,1340
35
35
  shinestacker/core/core_utils.py,sha256=ulJhzen5McAb5n6wWNA_KB4U_PdTEr-H2TCQkVKUaOw,1421
36
36
  shinestacker/core/exceptions.py,sha256=2-noG-ORAGdvDhL8jBQFs0xxZS4fI6UIkMqrWekgk2c,1618
37
- shinestacker/core/framework.py,sha256=zCnJuQrHNpwEgJW23_BgS7iQrLolRWTAMB1oRp_a7Kk,7447
37
+ shinestacker/core/framework.py,sha256=9uAvITAmzWnKFApLNtPf6Ah7nGJAxQ3I5nw_b2sVGQA,7628
38
38
  shinestacker/core/logging.py,sha256=9SuSSy9Usbh7zqmLYMqkmy-VBkOJW000lwqAR0XQs30,3067
39
39
  shinestacker/gui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
- shinestacker/gui/action_config.py,sha256=-J4UCbXHHlIPxRDL0Veglt4brngJP7_zHvrWof9pzsM,16895
41
- shinestacker/gui/action_config_dialog.py,sha256=USaF2QeQRNXgzLRbkV6hvVRzOMkMVyTtsAzEAMqCr-g,35191
40
+ shinestacker/gui/action_config.py,sha256=xwJfNJwYbccL9M74NObjUc4_-EBVoHN5qDdToE19rMs,19075
41
+ shinestacker/gui/action_config_dialog.py,sha256=0j6oJfNGdZ9b9-ns0k7fM_iiD9jlMmVeCEEfzO3drpw,35134
42
42
  shinestacker/gui/base_form_dialog.py,sha256=M_BvjpqUWe9YuecKg0pF3vUJ-1mqF24HjKujst2j3BA,753
43
43
  shinestacker/gui/colors.py,sha256=m0pQQ-uvtIN1xmb_-N06BvC7pZYZZnq59ZSEJwutHuk,1432
44
44
  shinestacker/gui/flow_layout.py,sha256=3yBU_z7VtvHKpx1H97CHVd81eq9pe1Dcja2EZBGGKcI,3791
45
- shinestacker/gui/gui_images.py,sha256=e0KAXSPruZoRHrajfdlmOKBYoRJJQBDan1jgs7YFltY,5678
45
+ shinestacker/gui/gui_images.py,sha256=k39DpdsxcmYoRdHNNZj6OpFAas0GOHS4JSG542wfheg,5728
46
46
  shinestacker/gui/gui_logging.py,sha256=kiZcrC2AFYCWgPZo0O5SKw-E5cFrezwf4anS3HjPuNw,8168
47
- shinestacker/gui/gui_run.py,sha256=ahbl6xMFR78QrcBbEDMuaQpkxw6DBFtSX8DCMIyr_7I,15439
48
- shinestacker/gui/main_window.py,sha256=kgozNZWqiPePZB5oX3Twdj_Z_f1RcdoLT2PFMzT0fRM,24361
49
- shinestacker/gui/menu_manager.py,sha256=SvYV7Dmz4cqoFQtRrO4JQ0uECZ4rL3EQdQg5jNakV6Y,10015
50
- shinestacker/gui/new_project.py,sha256=Iu8Gm3oRx6tCokv-Ywm_64wsNNxj_QhU1BsyoeLkJaQ,11211
51
- shinestacker/gui/project_controller.py,sha256=ooHunFKY2-dRBoyx4r3T8vs7UOpGDZUHHaSSR5V8J_E,15821
47
+ shinestacker/gui/gui_run.py,sha256=KZakfz8AkdagObB-0fLy9JUNau0hIreBHrjdf4ZRXYs,15440
48
+ shinestacker/gui/main_window.py,sha256=7zO1U_wGXsg7Owlre21PWwG9CMP5OcEey-aLtH4na0M,24404
49
+ shinestacker/gui/menu_manager.py,sha256=ZsND0e-vM263-6unwKUtYAtLbb4YgvIQabh5lCiT2ow,10179
50
+ shinestacker/gui/new_project.py,sha256=rlEaMTaxZ9eo5sZP5_zJx-vxPk9t8-I6X_aoYyVT2uQ,11171
51
+ shinestacker/gui/project_controller.py,sha256=9uNlt8fghS6QYyUpPyEw54Ia5RxwXLp1FaOtKxKArb8,15905
52
52
  shinestacker/gui/project_converter.py,sha256=bNyC1_D_MjcTOCPlQln6CIIlX818-sw_j2omrfQIGQs,7279
53
- shinestacker/gui/project_editor.py,sha256=UPXNwjpKJi7lgaohlbtojkTkotXeGY7l_W8pVII-UM0,24208
53
+ shinestacker/gui/project_editor.py,sha256=mv_gJHhllAqjttueLKFnJotrtshDpCwh0TYfG6EGBnA,24965
54
54
  shinestacker/gui/project_model.py,sha256=eRUmH3QmRzDtPtZoxgT6amKzN8_5XzwjHgEJeL-_JOE,4263
55
55
  shinestacker/gui/select_path_widget.py,sha256=OfQImOmkzbvl5BBshmb7ePWrSGDJQ8VvyaAOypHAGd4,1023
56
- shinestacker/gui/tab_widget.py,sha256=6iUifK-wu0EzjVFccKHirhA2fENglVi6xREKiD96aaY,2950
56
+ shinestacker/gui/tab_widget.py,sha256=VgRmuktWXCgbXbV7c1Tho0--W5_EmmzXPfzRZgwhGfg,2965
57
57
  shinestacker/gui/time_progress_bar.py,sha256=4_5DT_EzFdVJi5bgd9TEpoTJXeU3M08CF91cZLi75Wc,3016
58
58
  shinestacker/gui/ico/focus_stack_bkg.png,sha256=Q86TgqvKEi_IzKI8m6aZB2a3T40UkDtexf2PdeBM9XE,163151
59
59
  shinestacker/gui/ico/shinestacker.icns,sha256=3IshIOv0uFexYsAEPkE9xiyuw8mB5X5gffekOUhFlt0,45278
@@ -86,9 +86,9 @@ shinestacker/retouch/undo_manager.py,sha256=_ekbcOLcPbQLY7t-o8wf-b1uA6OPY9rRyLM-
86
86
  shinestacker/retouch/unsharp_mask_filter.py,sha256=uFnth8fpZFGhdIgJCnS8x5v6lBQgJ3hX0CBke9pFXeM,3510
87
87
  shinestacker/retouch/vignetting_filter.py,sha256=MA97rQkSL0D-Nh-n2L4AiPR064RoTROkvza4tw84g9U,3658
88
88
  shinestacker/retouch/white_balance_filter.py,sha256=glMBYlmrF-i_OrB3sGUpjZE6X4FQdyLC4GBy2bWtaFc,6056
89
- shinestacker-1.2.0.dist-info/licenses/LICENSE,sha256=pWgb-bBdsU2Gd2kwAXxketnm5W_2u8_fIeWEgojfrxs,7651
90
- shinestacker-1.2.0.dist-info/METADATA,sha256=01kq9TSpVY2_U67ZhjbPIORbMmWTOWpuiiOFty3IM1Y,6951
91
- shinestacker-1.2.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
92
- shinestacker-1.2.0.dist-info/entry_points.txt,sha256=SY6g1LqtMmp23q1DGwLUDT_dhLX9iss8DvWkiWLyo_4,166
93
- shinestacker-1.2.0.dist-info/top_level.txt,sha256=MhijwnBVX5psfsyX8JZjqp3SYiWPsKe69f3Gnyze4Fw,13
94
- shinestacker-1.2.0.dist-info/RECORD,,
89
+ shinestacker-1.2.1.dist-info/licenses/LICENSE,sha256=pWgb-bBdsU2Gd2kwAXxketnm5W_2u8_fIeWEgojfrxs,7651
90
+ shinestacker-1.2.1.dist-info/METADATA,sha256=6Cdeb52FCCmc0H48Ru2ydN6McvhemfdzB9Ye2bdCMhw,6951
91
+ shinestacker-1.2.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
92
+ shinestacker-1.2.1.dist-info/entry_points.txt,sha256=SY6g1LqtMmp23q1DGwLUDT_dhLX9iss8DvWkiWLyo_4,166
93
+ shinestacker-1.2.1.dist-info/top_level.txt,sha256=MhijwnBVX5psfsyX8JZjqp3SYiWPsKe69f3Gnyze4Fw,13
94
+ shinestacker-1.2.1.dist-info/RECORD,,