shinestacker 1.0.2__py3-none-any.whl → 1.0.3__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 CHANGED
@@ -1 +1 @@
1
- __version__ = '1.0.2'
1
+ __version__ = '1.0.3'
@@ -177,7 +177,7 @@ class MultiLayer(JobBase, FrameMultiDirectory):
177
177
  raise RuntimeError("input_path option must contain a path or an array of paths")
178
178
  if len(paths) == 0:
179
179
  self.print_message(color_str("no input paths specified",
180
- constants.LOG_COLOR_LEVEL_ALERT),
180
+ constants.LOG_COLOR_ALERT),
181
181
  level=logging.WARNING)
182
182
  return
183
183
  files = self.folder_filelist()
@@ -186,7 +186,7 @@ class MultiLayer(JobBase, FrameMultiDirectory):
186
186
  color_str(f"no input in {len(paths)} specified path" +
187
187
  ('s' if len(paths) > 1 else '') + ": "
188
188
  ", ".join([f"'{p}'" for p in paths]),
189
- constants.LOG_COLOR_LEVEL_ALERT),
189
+ constants.LOG_COLOR_ALERT),
190
190
  level=logging.WARNING)
191
191
  return
192
192
  self.print_message(color_str("merging frames in " + self.folder_list_str(),
@@ -92,7 +92,7 @@ class FramePaths:
92
92
  ('' if self.working_path[-1] == '/' else '/') + self.plot_path
93
93
  if not os.path.exists(self.plot_path):
94
94
  os.makedirs(self.plot_path)
95
- if self.input_path == '':
95
+ if self.input_path in ['', []]:
96
96
  if len(job.paths) == 0:
97
97
  raise RuntimeError(f"Job {job.name} does not have any configured path")
98
98
  self.input_path = job.paths[-1]
@@ -278,7 +278,7 @@ class MainWindow(QMainWindow, LogManager):
278
278
  current_action = None
279
279
  if item:
280
280
  index = self.job_list().row(item)
281
- current_action = self.get_job_at(index)
281
+ current_action = self.project_editor.get_job_at(index)
282
282
  self.set_current_job(index)
283
283
  item = self.action_list().itemAt(self.action_list().viewport().mapFrom(self, event.pos()))
284
284
  if item:
@@ -328,7 +328,7 @@ class MainWindow(QMainWindow, LogManager):
328
328
  self.current_action_output_path = f"{self.current_action_working_path}/{op}"
329
329
  if os.path.exists(self.current_action_output_path):
330
330
  action_name = "Browse Output Path" + (f" > {name}" if name != '' else '')
331
- n_files = len(next(os.walk(op))[2])
331
+ n_files = len(next(os.walk(self.current_action_output_path))[2])
332
332
  s = "" if n_files == 1 else "s"
333
333
  action_name += f" ({n_files} file{s})"
334
334
  self.browse_output_path_action = QAction(action_name)
@@ -204,11 +204,12 @@ class ProjectController(QObject):
204
204
  input_path.append("focus-stack-depth-map")
205
205
  if dialog.get_bunch_stack():
206
206
  input_path.append("bunches")
207
- else:
208
- input_path.append(input_path)
209
- multi_layer = ActionConfig(constants.ACTION_MULTILAYER,
210
- {'name': 'multi-layer',
211
- 'input_path': ','.join(input_path)})
207
+ multi_layer = ActionConfig(
208
+ constants.ACTION_MULTILAYER,
209
+ {
210
+ 'name': 'multi-layer',
211
+ 'input_path': constants.PATH_SEPARATOR.join(input_path)
212
+ })
212
213
  job.add_sub_action(multi_layer)
213
214
  self.add_job_to_project(job)
214
215
  self.mark_as_modified(True)
@@ -330,9 +330,8 @@ class ImageEditorUI(QMainWindow, LayerCollectionHandler):
330
330
  view_individual_action.setShortcut("L")
331
331
  view_individual_action.triggered.connect(self.set_view_individual)
332
332
  view_menu.addAction(view_individual_action)
333
- view_menu.addSeparator()
334
333
 
335
- toggle_view_master_individual_action = QAction("View Individual", self)
334
+ toggle_view_master_individual_action = QAction("Toggle Master/Individual", self)
336
335
  toggle_view_master_individual_action.setShortcut("T")
337
336
  toggle_view_master_individual_action.triggered.connect(self.toggle_view_master_individual)
338
337
  view_menu.addAction(toggle_view_master_individual_action)
@@ -57,7 +57,7 @@ class IOGuiHandler(QObject, LayerCollectionHandler):
57
57
  self.undo_manager.reset()
58
58
  self.blank_layer = np.zeros(master_layer.shape[:2])
59
59
  self.finish_loading_setup(
60
- stack, None, master_layer, False,
60
+ stack, None, master_layer,
61
61
  f"Loaded: {self.current_file_path()}")
62
62
 
63
63
  def on_file_error(self, error_msg):
@@ -137,26 +137,25 @@ class IOGuiHandler(QObject, LayerCollectionHandler):
137
137
  msg.setText(str(e))
138
138
  msg.exec()
139
139
  return
140
+ if self.layer_stack() is None and len(stack) > 0:
141
+ self.set_layer_stack(np.array(stack))
142
+ if labels is None:
143
+ labels = self.layer_labels()
144
+ else:
145
+ self.set_layer_labels(labels)
146
+ self.set_master_layer(master)
147
+ self.blank_layer = np.zeros(master.shape[:2])
148
+ else:
149
+ if labels is None:
150
+ labels = self.layer_labels()
151
+ for img, label in zip(stack, labels):
152
+ self.add_layer_label(label)
153
+ self.add_layer(img)
140
154
  self.finish_loading_setup(
141
- stack, labels, master, True,
155
+ stack, labels, master,
142
156
  "Selected frames imported")
143
157
 
144
- def finish_loading_setup(self, stack, labels, master, add_layers, message):
145
- if add_layers:
146
- if self.layer_stack() is None and len(stack) > 0:
147
- self.set_layer_stack(np.array(stack))
148
- if labels is None:
149
- labels = self.layer_labels()
150
- else:
151
- self.set_layer_labels(labels)
152
- self.set_master_layer(master)
153
- self.blank_layer = np.zeros(master.shape[:2])
154
- else:
155
- if labels is None:
156
- labels = self.layer_labels()
157
- for img, label in zip(stack, labels):
158
- self.add_layer_label(label)
159
- self.add_layer(img)
158
+ def finish_loading_setup(self, stack, labels, master, message):
160
159
  self.display_manager.update_thumbnails()
161
160
  self.mark_as_modified_requested.emit(True)
162
161
  self.change_layer_requested.emit(0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: shinestacker
3
- Version: 1.0.2
3
+ Version: 1.0.3
4
4
  Summary: ShineStacker
5
5
  Author-email: Luca Lista <luka.lista@gmail.com>
6
6
  License-Expression: LGPL-3.0
@@ -87,6 +87,7 @@ Pyramid methods in image processing
87
87
  # License
88
88
 
89
89
  <img src="https://www.gnu.org/graphics/lgplv3-147x51.png" alt="LGPL 3 logo">
90
+
90
91
  - **Code**: The software is provided as is under the [GNU Lesser General Public License v3.0](https://www.gnu.org/licenses/lgpl-3.0.en.html). See [LICENSE](https://github.com/lucalista/shinestacker/blob/main/LICENSE) for details.
91
92
  <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/src/shinestacker/gui/ico/shinestacker.png' width="150" referrerpolicy="no-referrer" alt="Shine Stacker Logo">
92
93
 
@@ -1,5 +1,5 @@
1
1
  shinestacker/__init__.py,sha256=uq2fjAw2z_6TpH3mOcWFZ98GoEPRsNhTAK8N0MMm_e8,448
2
- shinestacker/_version.py,sha256=C8nyPP5-54GgYCcP38Lbel_pRimOW-Ra4bw6Vzp2lmE,21
2
+ shinestacker/_version.py,sha256=MpVHFFoITiYyPltTb_qFrdeX2entdTm4x0PczXi3txY,21
3
3
  shinestacker/algorithms/__init__.py,sha256=c4kRrdTLlVI70Q16XkI1RSmz5MD7npDqIpO_02jTG6g,747
4
4
  shinestacker/algorithms/align.py,sha256=XT4DJoD5ZvpkC1-J3W3GWmWRsXJg3qJ-3zr9erT8oW0,17514
5
5
  shinestacker/algorithms/balance.py,sha256=iSjO-pl0vQv58iEQ077EUcDTAExMKDBdtXmJXbMhazk,16721
@@ -7,12 +7,12 @@ shinestacker/algorithms/base_stack_algo.py,sha256=AFV2QkcFNaTcnISpsWHuAVy2De9hha
7
7
  shinestacker/algorithms/denoise.py,sha256=GL3Z4_6MHxSa7Wo4ZzQECZS87tHBFqO0sIVF_jPuYQU,426
8
8
  shinestacker/algorithms/depth_map.py,sha256=FOR5M0brO5-9NnXDY7TWpc3OtKKSuzrOSoBMe0cP6Ho,6076
9
9
  shinestacker/algorithms/exif.py,sha256=gY9s6Cd4g4swo5qEjSbzuVIvl1GImCYu6ytOO9WrV0I,9435
10
- shinestacker/algorithms/multilayer.py,sha256=5JA6TW8oO_R3mu6cOvPno9by4md8q5sXUb8ZfsRRpmY,9259
10
+ shinestacker/algorithms/multilayer.py,sha256=MJqU_9LpcCi-0quJNszaFHOqna68ZqmImZQ50njOBio,9247
11
11
  shinestacker/algorithms/noise_detection.py,sha256=CDnN8pglxufY5Y-dT3mVooD4zPySdSq9CMgtDGMXBnA,8970
12
12
  shinestacker/algorithms/pyramid.py,sha256=_Pk19lRQ21b3W3aHQ6DgAe9VVOfbsi2a9jrynF0qFVw,8610
13
13
  shinestacker/algorithms/sharpen.py,sha256=h7PMJBYxucg194Usp_6pvItPUMFYbT-ebAc_-7XBFUw,949
14
14
  shinestacker/algorithms/stack.py,sha256=FCU89Of-s6C_DuMleG06c8V6fnIm9MFInvkkKtTsGBo,4906
15
- shinestacker/algorithms/stack_framework.py,sha256=frw7sbc9qOfVBYP3ZOFZEaIn9O27Wms8j_mxSW79uI0,12460
15
+ shinestacker/algorithms/stack_framework.py,sha256=peAlUUl7y8OcquhjQoXpiwsEhZw6zgZnzwt1IDpf4aU,12466
16
16
  shinestacker/algorithms/utils.py,sha256=2XFa16Q8JVq4C2iXZFOvv98GVKqxceFG73yFZNHJSqI,2475
17
17
  shinestacker/algorithms/vignetting.py,sha256=yW-1TF4tesLWfKQOS0XxRkOEN82U-YDmMaj09C9cH4M,9552
18
18
  shinestacker/algorithms/white_balance.py,sha256=PMKsBtxOSn5aRr_Gkx1StHS4eN6kBN2EhNnhg4UG24g,501
@@ -42,10 +42,10 @@ shinestacker/gui/colors.py,sha256=m0pQQ-uvtIN1xmb_-N06BvC7pZYZZnq59ZSEJwutHuk,14
42
42
  shinestacker/gui/gui_images.py,sha256=e0KAXSPruZoRHrajfdlmOKBYoRJJQBDan1jgs7YFltY,5678
43
43
  shinestacker/gui/gui_logging.py,sha256=kiZcrC2AFYCWgPZo0O5SKw-E5cFrezwf4anS3HjPuNw,8168
44
44
  shinestacker/gui/gui_run.py,sha256=G9jKIMCEdrCwRvicRykY0r_x2Vya-9EMn4HpZL8ydRI,15141
45
- shinestacker/gui/main_window.py,sha256=1Im8ER-eAYwvLXFp_OyMr3EkdpJ0K1krkmKy-WF3KM8,24210
45
+ shinestacker/gui/main_window.py,sha256=l5iMk5aIi5nXPccnibB1tswc0agatrYgXULVkXo7OV0,24254
46
46
  shinestacker/gui/menu_manager.py,sha256=_L6LOikB3impEYqilqwXc0WJuunishjz57ozZlrBn7Q,9616
47
47
  shinestacker/gui/new_project.py,sha256=zHmGrT27L7I6YHM1L8wjt7DzukLFPddFsbVyGVHfJoc,11004
48
- shinestacker/gui/project_controller.py,sha256=BbecAO0t15Usir3CYeIBiO9gvdGAmAPwhwLxci5IS7g,15103
48
+ shinestacker/gui/project_controller.py,sha256=QJSQlwEJeXJyJnkp42D9NSqWBb8q2kLf_GvLfe3pe_c,15076
49
49
  shinestacker/gui/project_converter.py,sha256=_AFfU2HYKPX78l6iX6bXJrlKpdjSl63pmKzrc6kQpn8,7348
50
50
  shinestacker/gui/project_editor.py,sha256=uouzmUkrqouQlq-dqPOgSO16r1WOnGNV2v8jTcZlRXU,23749
51
51
  shinestacker/gui/project_model.py,sha256=eRUmH3QmRzDtPtZoxgT6amKzN8_5XzwjHgEJeL-_JOE,4263
@@ -73,9 +73,9 @@ shinestacker/retouch/exif_data.py,sha256=giqoIaMlhN6H3x8BAd73ghVHODmWIcD_QbSoDym
73
73
  shinestacker/retouch/file_loader.py,sha256=x8lzKShlgElcJYLFiDoeszeVEToUUiUbUrozAeF5SMU,4812
74
74
  shinestacker/retouch/filter_manager.py,sha256=SdYIZkZBUvuB6wDG0moGWav5sfEvIcB9ioUJR5wJFts,388
75
75
  shinestacker/retouch/icon_container.py,sha256=6gw1HO1bC2FrdB4dc_iH81DQuLjzuvRGksZ2hKLT9yA,585
76
- shinestacker/retouch/image_editor_ui.py,sha256=GNozK_P7orgl8EioemJeyR4e_LLMbKVZi4xhYW9m38U,29893
76
+ shinestacker/retouch/image_editor_ui.py,sha256=cMGiqyPGqJmBaXMAc0WImDPf_hmxO4KiJtaaSpiW9EU,29869
77
77
  shinestacker/retouch/image_viewer.py,sha256=3ebrLHTDtGd_EbIT2nNFRUjH836rblmmK7jZ62YcJ2U,19564
78
- shinestacker/retouch/io_gui_handler.py,sha256=DPFEq-29b88xqCpIwEmuwUU5Xn_7UGlFFhCDM1bvMxI,11645
78
+ shinestacker/retouch/io_gui_handler.py,sha256=52Wk19DjXtgCBcBWz9t0wUEpt8RS67FohdG44OOnu8c,11541
79
79
  shinestacker/retouch/io_manager.py,sha256=JUAA--AK0mVa1PTErJTnBFjaXIle5Qs7Ow0Wkd8at0o,2437
80
80
  shinestacker/retouch/layer_collection.py,sha256=Q7zoCYRn__jYkfrEC2lY1uKHWfOUbsJ27xaYHIoKVxo,5730
81
81
  shinestacker/retouch/shortcuts_help.py,sha256=SN4vNa_6yRAFaWxt5HpWn8FHgwmHrIs_wYwjl4iyDmg,3769
@@ -83,9 +83,9 @@ shinestacker/retouch/undo_manager.py,sha256=_ekbcOLcPbQLY7t-o8wf-b1uA6OPY9rRyLM-
83
83
  shinestacker/retouch/unsharp_mask_filter.py,sha256=uFnth8fpZFGhdIgJCnS8x5v6lBQgJ3hX0CBke9pFXeM,3510
84
84
  shinestacker/retouch/vignetting_filter.py,sha256=3WuoF38lQOIaU1MWmqviItuQn8NnbMN0nwV7pM9IJqU,3453
85
85
  shinestacker/retouch/white_balance_filter.py,sha256=glMBYlmrF-i_OrB3sGUpjZE6X4FQdyLC4GBy2bWtaFc,6056
86
- shinestacker-1.0.2.dist-info/licenses/LICENSE,sha256=pWgb-bBdsU2Gd2kwAXxketnm5W_2u8_fIeWEgojfrxs,7651
87
- shinestacker-1.0.2.dist-info/METADATA,sha256=BGQfH5499HQk51ANCTjSdUxjErlNHfiz1kcCf17VKZo,5902
88
- shinestacker-1.0.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
89
- shinestacker-1.0.2.dist-info/entry_points.txt,sha256=SY6g1LqtMmp23q1DGwLUDT_dhLX9iss8DvWkiWLyo_4,166
90
- shinestacker-1.0.2.dist-info/top_level.txt,sha256=MhijwnBVX5psfsyX8JZjqp3SYiWPsKe69f3Gnyze4Fw,13
91
- shinestacker-1.0.2.dist-info/RECORD,,
86
+ shinestacker-1.0.3.dist-info/licenses/LICENSE,sha256=pWgb-bBdsU2Gd2kwAXxketnm5W_2u8_fIeWEgojfrxs,7651
87
+ shinestacker-1.0.3.dist-info/METADATA,sha256=3iFJO-177VFRPs8m5UnV2LhmiwO9wI5Bf3_x_DzkVbk,5903
88
+ shinestacker-1.0.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
89
+ shinestacker-1.0.3.dist-info/entry_points.txt,sha256=SY6g1LqtMmp23q1DGwLUDT_dhLX9iss8DvWkiWLyo_4,166
90
+ shinestacker-1.0.3.dist-info/top_level.txt,sha256=MhijwnBVX5psfsyX8JZjqp3SYiWPsKe69f3Gnyze4Fw,13
91
+ shinestacker-1.0.3.dist-info/RECORD,,