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.
- shinestacker/_version.py +1 -1
- shinestacker/algorithms/align.py +34 -33
- shinestacker/algorithms/balance.py +11 -12
- shinestacker/algorithms/multilayer.py +10 -11
- shinestacker/algorithms/noise_detection.py +6 -7
- shinestacker/algorithms/stack.py +17 -17
- shinestacker/algorithms/stack_framework.py +125 -154
- shinestacker/algorithms/vignetting.py +3 -3
- shinestacker/config/constants.py +3 -1
- shinestacker/core/framework.py +12 -12
- shinestacker/gui/action_config.py +53 -0
- shinestacker/gui/action_config_dialog.py +4 -5
- shinestacker/gui/gui_images.py +10 -10
- shinestacker/gui/gui_run.py +1 -1
- shinestacker/gui/main_window.py +4 -4
- shinestacker/gui/menu_manager.py +4 -0
- shinestacker/gui/new_project.py +0 -1
- shinestacker/gui/project_controller.py +4 -4
- shinestacker/gui/project_editor.py +35 -26
- shinestacker/gui/tab_widget.py +3 -3
- {shinestacker-1.2.0.dist-info → shinestacker-1.2.1.dist-info}/METADATA +1 -1
- {shinestacker-1.2.0.dist-info → shinestacker-1.2.1.dist-info}/RECORD +26 -26
- {shinestacker-1.2.0.dist-info → shinestacker-1.2.1.dist-info}/WHEEL +0 -0
- {shinestacker-1.2.0.dist-info → shinestacker-1.2.1.dist-info}/entry_points.txt +0 -0
- {shinestacker-1.2.0.dist-info → shinestacker-1.2.1.dist-info}/licenses/LICENSE +0 -0
- {shinestacker-1.2.0.dist-info → shinestacker-1.2.1.dist-info}/top_level.txt +0 -0
shinestacker/gui/main_window.py
CHANGED
|
@@ -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.
|
|
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):
|
shinestacker/gui/menu_manager.py
CHANGED
|
@@ -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}")
|
shinestacker/gui/new_project.py
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
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():
|
shinestacker/gui/tab_widget.py
CHANGED
|
@@ -12,10 +12,10 @@ class TabWidgetWithPlaceholder(QWidget):
|
|
|
12
12
|
|
|
13
13
|
def __init__(self, parent=None):
|
|
14
14
|
super().__init__(parent)
|
|
15
|
-
self.
|
|
16
|
-
self.
|
|
15
|
+
self.main_layout = QVBoxLayout(self)
|
|
16
|
+
self.main_layout.setContentsMargins(0, 0, 0, 0)
|
|
17
17
|
self.stacked_widget = QStackedWidget()
|
|
18
|
-
self.
|
|
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,22 +1,22 @@
|
|
|
1
1
|
shinestacker/__init__.py,sha256=uq2fjAw2z_6TpH3mOcWFZ98GoEPRsNhTAK8N0MMm_e8,448
|
|
2
|
-
shinestacker/_version.py,sha256=
|
|
2
|
+
shinestacker/_version.py,sha256=VvDq5py76uDFeq6tv3EFMgTHX4rtDyt6nw0tPm3Wrkk,21
|
|
3
3
|
shinestacker/algorithms/__init__.py,sha256=1FwVJ3w9GGbFFkjYJRUedTvcdE4j0ieSgaH9RC9iCY4,877
|
|
4
|
-
shinestacker/algorithms/align.py,sha256=
|
|
5
|
-
shinestacker/algorithms/balance.py,sha256=
|
|
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=
|
|
11
|
-
shinestacker/algorithms/noise_detection.py,sha256=
|
|
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=
|
|
17
|
-
shinestacker/algorithms/stack_framework.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
41
|
-
shinestacker/gui/action_config_dialog.py,sha256=
|
|
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=
|
|
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=
|
|
48
|
-
shinestacker/gui/main_window.py,sha256=
|
|
49
|
-
shinestacker/gui/menu_manager.py,sha256=
|
|
50
|
-
shinestacker/gui/new_project.py,sha256=
|
|
51
|
-
shinestacker/gui/project_controller.py,sha256=
|
|
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=
|
|
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=
|
|
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.
|
|
90
|
-
shinestacker-1.2.
|
|
91
|
-
shinestacker-1.2.
|
|
92
|
-
shinestacker-1.2.
|
|
93
|
-
shinestacker-1.2.
|
|
94
|
-
shinestacker-1.2.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|