shinestacker 0.2.0.post1.dev1__py3-none-any.whl → 0.2.2__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/__init__.py CHANGED
@@ -1,3 +1,16 @@
1
+ # flake8: noqa F401 F403
1
2
  from ._version import __version__
3
+ from . import config
4
+ from . import core
5
+ from . import algorithms
6
+ from .config import __all__
7
+ from .core import __all__
8
+ from .algorithms import __all__
9
+ from .config import *
10
+ from .core import *
11
+ from .algorithms import *
2
12
 
3
13
  __all__ = ['__version__']
14
+ #__all__ += config.__all__
15
+ #__all__ += core.__all__
16
+ #__all__ += algorithms.__all__
shinestacker/_version.py CHANGED
@@ -1 +1 @@
1
- __version__ = '0.2.0.post1.dev1'
1
+ __version__ = '0.2.2'
@@ -12,3 +12,8 @@ from .vignetting import Vignetting
12
12
  import logging
13
13
  logger = logging.getLogger(__name__)
14
14
  logger.addHandler(logging.NullHandler())
15
+
16
+ __all__ = [
17
+ 'StackJob', 'CombinedActions', 'AlignFrames', 'BalanceFrames', 'FocusStackBunch', 'FocusStack',
18
+ 'DepthMapStack', 'PyramidStack', 'MultiLayer', 'NoiseDetection', 'MaskNoise', 'Vignetting'
19
+ ]
@@ -62,7 +62,6 @@ def get_good_matches(des_0, des_1, matching_config=None):
62
62
 
63
63
 
64
64
  def validate_align_config(detector, descriptor, match_method):
65
- print(detector, descriptor, match_method)
66
65
  if descriptor == constants.DESCRIPTOR_SIFT and match_method == constants.MATCHING_NORM_HAMMING:
67
66
  raise ValueError("Descriptor SIFT requires matching method KNN")
68
67
  if detector == constants.DETECTOR_ORB and descriptor == constants.DESCRIPTOR_AKAZE and \
@@ -1,5 +1,5 @@
1
1
  import os
2
- from config.config import config
2
+ from ..config.config import config
3
3
 
4
4
  if not config.DISABLE_TQDM:
5
5
  from tqdm import tqdm
shinestacker/app/main.py CHANGED
@@ -12,7 +12,6 @@ from shinestacker.config.config import config
12
12
  config.init(DISABLE_TQDM=True, COMBINED_APP=True, DONT_USE_NATIVE_MENU=True)
13
13
  from shinestacker.config.constants import constants
14
14
  from shinestacker.core.logging import setup_logging
15
- from shinestacker.core.core_utils import get_app_base_path
16
15
  from shinestacker.gui.main_window import MainWindow
17
16
  from shinestacker.retouch.image_editor_ui import ImageEditorUI
18
17
  from shinestacker.app.gui_utils import disable_macos_special_menu_items
@@ -138,12 +137,7 @@ expert options are visible by default.
138
137
  app.setAttribute(Qt.AA_DontUseNativeMenuBar)
139
138
  else:
140
139
  disable_macos_special_menu_items()
141
- icon_path = f'{get_app_base_path()}'
142
- if os.path.exists(f'{icon_path}/ico'):
143
- icon_path = f'{icon_path}/ico'
144
- else:
145
- icon_path = f'{icon_path}/../ico'
146
- icon_path = f'{icon_path}/shinestacker.png'
140
+ icon_path = f"{os.path.dirname(__file__)}/../gui/ico/shinestacker.png"
147
141
  app.setWindowIcon(QIcon(icon_path))
148
142
  main_app = MainApp()
149
143
  app.main_app = main_app
@@ -12,7 +12,6 @@ from shinestacker.config.config import config
12
12
  config.init(DISABLE_TQDM=True, DONT_USE_NATIVE_MENU=True)
13
13
  from shinestacker.config.constants import constants
14
14
  from shinestacker.core.logging import setup_logging
15
- from shinestacker.core.core_utils import get_app_base_path
16
15
  from shinestacker.gui.main_window import MainWindow
17
16
  from shinestacker.app.gui_utils import disable_macos_special_menu_items
18
17
  from shinestacker.app.help_menu import add_help_action
@@ -73,7 +72,8 @@ expert options are visible by default.
73
72
  app.setAttribute(Qt.AA_DontUseNativeMenuBar)
74
73
  else:
75
74
  disable_macos_special_menu_items()
76
- app.setWindowIcon(QIcon(f'{get_app_base_path()}/ico/shinestacker.png'))
75
+ icon_path = f"{os.path.dirname(__file__)}/../gui/ico/shinestacker.png"
76
+ app.setWindowIcon(QIcon(icon_path))
77
77
  window = ProjectApp()
78
78
  if args['expert']:
79
79
  window.set_expert_options()
@@ -1,3 +1,4 @@
1
+ import os
1
2
  import sys
2
3
  import argparse
3
4
  from PySide6.QtWidgets import QApplication, QMenu
@@ -5,7 +6,6 @@ from PySide6.QtGui import QIcon, QAction
5
6
  from PySide6.QtCore import Qt, QEvent
6
7
  from shinestacker.config.config import config
7
8
  config.init(DISABLE_TQDM=True, DONT_USE_NATIVE_MENU=True)
8
- from shinestacker.core.core_utils import get_app_base_path
9
9
  from shinestacker.config.config import config
10
10
  from shinestacker.config.constants import constants
11
11
  from shinestacker.retouch.image_editor_ui import ImageEditorUI
@@ -70,7 +70,8 @@ Multiple directories can be specified separated by ';'.
70
70
  app.setAttribute(Qt.AA_DontUseNativeMenuBar)
71
71
  else:
72
72
  disable_macos_special_menu_items()
73
- app.setWindowIcon(QIcon(f'{get_app_base_path()}/ico/shinestacker.png'))
73
+ icon_path = f"{os.path.dirname(__file__)}/../gui/ico/shinestacker.png"
74
+ app.setWindowIcon(QIcon(icon_path))
74
75
  editor = RetouchApp()
75
76
  app.editor = editor
76
77
  editor.show()
@@ -2,3 +2,5 @@
2
2
  from .config import config
3
3
  from .constants import constants
4
4
  from .gui_constants import gui_constants
5
+
6
+ __all__ = ['config', 'constants', 'gui_constants']
@@ -1,5 +1,11 @@
1
1
  # flake8: noqa F401
2
- from .logging import setup_logging, console_logging_overwrite, console_logging_newline
3
- from .exceptions import (FocusStackError, InvalidOptionError, ImageLoadError, AlignmentError,
4
- BitDepthError, ShapeError)
5
- from .framework import TqdmCallbacks
2
+ from .logging import setup_logging
3
+ from .exceptions import (FocusStackError, InvalidOptionError, ImageLoadError, ImageSaveError, AlignmentError,
4
+ BitDepthError, ShapeError, RunStopException)
5
+ from .framework import Job
6
+
7
+ __all__ = [
8
+ 'setup_logging',
9
+ 'FocusStackError', 'InvalidOptionError', 'ImageLoadError', 'ImageSaveError',
10
+ 'AlignmentError','BitDepthError', 'ShapeError', 'RunStopException',
11
+ 'Job']
Binary file
Binary file
Binary file
Binary file
@@ -414,6 +414,9 @@ class MainWindow(ActionsWindow, LogManager):
414
414
  menu.addAction(self.job_retouch_path_action)
415
415
  menu.exec(event.globalPos())
416
416
 
417
+ def get_icon(self, icon):
418
+ return QIcon(os.path.join(self.script_dir, f"img/{icon}.png"))
419
+
417
420
  def get_retouch_path(self, job):
418
421
  frames_path = [get_action_output_path(action)[0]
419
422
  for action in job.sub_actions if action.type_name == constants.ACTION_COMBO]
@@ -6,7 +6,6 @@ from PySide6.QtGui import QIcon
6
6
  from PySide6.QtCore import Qt
7
7
  from .. config.gui_constants import gui_constants
8
8
  from .. config.constants import constants
9
- from .. core.core_utils import get_app_base_path
10
9
 
11
10
 
12
11
  class NewProjectDialog(QDialog):
@@ -39,12 +38,7 @@ class NewProjectDialog(QDialog):
39
38
  self.layout.addRow(label)
40
39
 
41
40
  def create_form(self):
42
- icon_path = f'{get_app_base_path()}'
43
- if os.path.exists(f'{icon_path}/ico'):
44
- icon_path = f'{icon_path}/ico'
45
- else:
46
- icon_path = f'{icon_path}/../ico'
47
- icon_path = f'{icon_path}/shinestacker.png'
41
+ icon_path = f"{os.path.dirname(__file__)}/ico/shinestacker.png"
48
42
  app_icon = QIcon(icon_path)
49
43
  icon_pixmap = app_icon.pixmap(128, 128)
50
44
  icon_label = QLabel()
@@ -1,7 +1,6 @@
1
1
  import os
2
2
  from dataclasses import dataclass
3
3
  from PySide6.QtWidgets import QMainWindow, QListWidget, QMessageBox, QDialog, QListWidgetItem, QLabel
4
- from PySide6.QtGui import QIcon
5
4
  from PySide6.QtCore import Qt
6
5
  from .. config.constants import constants
7
6
  from .colors import ColorPalette
@@ -328,9 +327,6 @@ class ProjectEditor(QMainWindow):
328
327
  label = QLabel(html_text)
329
328
  widget_list.setItemWidget(item, label)
330
329
 
331
- def get_icon(self, icon):
332
- return QIcon(os.path.join(self.script_dir, f"img/{icon}.png"))
333
-
334
330
  def add_action_CombinedActions(self):
335
331
  self.add_action(constants.ACTION_COMBO)
336
332
 
@@ -3,7 +3,6 @@ from PIL.TiffImagePlugin import IFDRational
3
3
  from PySide6.QtWidgets import QFormLayout, QHBoxLayout, QPushButton, QDialog, QLabel
4
4
  from PySide6.QtGui import QIcon
5
5
  from PySide6.QtCore import Qt
6
- from .. core.core_utils import get_app_base_path
7
6
  from .. algorithms.exif import exif_dict
8
7
 
9
8
 
@@ -32,12 +31,7 @@ class ExifData(QDialog):
32
31
  self.layout.addRow(label)
33
32
 
34
33
  def create_form(self):
35
- icon_path = f'{get_app_base_path()}'
36
- if os.path.exists(f'{icon_path}/ico'):
37
- icon_path = f'{icon_path}/ico'
38
- else:
39
- icon_path = f'{icon_path}/../ico'
40
- icon_path = f'{icon_path}/shinestacker.png'
34
+ icon_path = f"{os.path.dirname(__file__)}/../gui/ico/shinestacker.png"
41
35
  app_icon = QIcon(icon_path)
42
36
  icon_pixmap = app_icon.pixmap(128, 128)
43
37
  icon_label = QLabel()
@@ -364,8 +364,6 @@ class ImageEditor(QMainWindow):
364
364
  QMessageBox.critical(self, "Save Error", f"Could not save file: {str(e)}")
365
365
 
366
366
  def select_exif_path(self):
367
- if self.current_stack is None:
368
- return
369
367
  path, _ = QFileDialog.getOpenFileName(None, "Select file with exif data")
370
368
  if path:
371
369
  self.exif_path = path
@@ -3,7 +3,6 @@ from PySide6.QtWidgets import (QFormLayout, QHBoxLayout, QPushButton, QDialog,
3
3
  QLabel, QVBoxLayout, QWidget)
4
4
  from PySide6.QtGui import QIcon
5
5
  from PySide6.QtCore import Qt
6
- from .. core.core_utils import get_app_base_path
7
6
 
8
7
 
9
8
  class ShortcutsHelp(QDialog):
@@ -44,12 +43,7 @@ class ShortcutsHelp(QDialog):
44
43
  layout.addRow(label)
45
44
 
46
45
  def create_form(self, left_layout, right_layout):
47
- icon_path = f'{get_app_base_path()}'
48
- if os.path.exists(f'{icon_path}/ico'):
49
- icon_path = f'{icon_path}/ico'
50
- else:
51
- icon_path = f'{icon_path}/../ico'
52
- icon_path = f'{icon_path}/shinestacker.png'
46
+ icon_path = f"{os.path.dirname(__file__)}/../gui/ico/shinestacker.png"
53
47
  app_icon = QIcon(icon_path)
54
48
  icon_pixmap = app_icon.pixmap(128, 128)
55
49
  icon_label = QLabel()
@@ -1,9 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: shinestacker
3
- Version: 0.2.0.post1.dev1
3
+ Version: 0.2.2
4
4
  Summary: ShineStacker
5
5
  Author-email: Luca Lista <luka.lista@gmail.com>
6
6
  License-Expression: LGPL-3.0
7
+ Project-URL: Homepage, https://github.com/lucalista/shinestacker
8
+ Project-URL: Documentation, https://shinestacker.readthedocs.io/
7
9
  Classifier: Programming Language :: Python :: 3
8
10
  Classifier: Operating System :: OS Independent
9
11
  Requires-Python: >=3.12
@@ -30,17 +32,20 @@ Dynamic: license-file
30
32
  # Shine Stacker Processing Framework
31
33
 
32
34
  [![CI multiplatform](https://github.com/lucalista/shinestacker/actions/workflows/ci-multiplatform.yml/badge.svg)](https://github.com/lucalista/shinestacker/actions/workflows/ci-multiplatform.yml)
35
+ [![PyPI version](https://badge.fury.io/py/shinestacker.svg)](https://pypi.org/project/shinestacker/)
36
+ [![Python Versions](https://img.shields.io/pypi/pyversions/shinestacker)](https://pypi.org/project/shinestacker/)
37
+ [![codecov](https://codecov.io/github/lucalista/shinestacker/graph/badge.svg?token=Y5NKW6VH5G)](https://codecov.io/github/lucalista/shinestacker)
33
38
 
34
- <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/img/flies.gif' width="400"> <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/img/flies_stack.jpg' width="400">
39
+ <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/img/flies.gif' width="400" referrerpolicy="no-referrer"> <img src='https://raw.githubusercontent.com/lucalista/shinestacker/main/img/flies_stack.jpg' width="400" referrerpolicy="no-referrer">
35
40
 
36
- ## Documentation
41
+ # Documentation
37
42
 
38
43
  📖 [Main documentation](https://github.com/lucalista/shinestacker/blob/main/docs/main.md) • 📝 [Changelog](https://github.com/lucalista/shinestacker/blob/main/CHANGELOG.md)
39
44
 
40
45
 
41
- # Credits:
46
+ # Credits
42
47
 
43
- The main pyramid stack algorithm was inspired by the [Laplacian pyramids method](https://github.com/sjawhar/focus-stacking) implementation by Sami Jawhar. The latest implementation was rewritten from the original code that was used under permission of the author for initial versions of this package.
48
+ The main pyramid stack algorithm was initially inspired by the [Laplacian pyramids method](https://github.com/sjawhar/focus-stacking) implementation by Sami Jawhar that was used under permission of the author for initial versions of this package. The implementation in the latest releases was rewritten from the original code.
44
49
 
45
50
  # Resources
46
51
 
@@ -1,9 +1,9 @@
1
- shinestacker/__init__.py,sha256=ZZ2O_m9OFJm18AxMSuYJt4UjSuSqyJlYRaZMoets498,61
2
- shinestacker/_version.py,sha256=8SnsniWXGASAhyv0_iGZNz3rdNxykDCUL9eNy-R71E4,32
3
- shinestacker/algorithms/__init__.py,sha256=XKMSOCBqcpeXng5PJ88wLhxhvSIwBJ6xuBFHfjda4ow,519
4
- shinestacker/algorithms/align.py,sha256=93szP69KN6BVRmMlU4TsNwBMgpYxEU9fxNzoK07n0Rw,16575
1
+ shinestacker/__init__.py,sha256=sxG9J11a6Qpu_VcqsARRqGSPByHtDvQqR5ozWYjHfZU,387
2
+ shinestacker/_version.py,sha256=pKh2_hmFNUwG0JxbL18qxdmi_nmFpgRbR8X6IPZr08o,21
3
+ shinestacker/algorithms/__init__.py,sha256=X9nwToaB13GAACoaE-K0o9R1Jt7g9xSzeJI8Ra2GcL8,722
4
+ shinestacker/algorithms/align.py,sha256=As7MIfjoJc_1vJ058iwP7b_PnDnfYsBQ1JNZ4GX5ZU4,16529
5
5
  shinestacker/algorithms/balance.py,sha256=UOmyUPJVBswUYWvYIB8WdlfTAxUAahZrnxQUSrYJ3I4,15649
6
- shinestacker/algorithms/core_utils.py,sha256=u1aw2-cdA1-RiALxA4rnj38oN2pe2s3BP3T_flvuKMQ,550
6
+ shinestacker/algorithms/core_utils.py,sha256=3mvJVDDfzMOboP724iM_5WT-pLFFoGAhwcXsQN8dBYo,552
7
7
  shinestacker/algorithms/depth_map.py,sha256=hx6yyCjLKiu3Wi5uZFXiixEfOBxfieNQ9xH9cp5zD0Y,7844
8
8
  shinestacker/algorithms/exif.py,sha256=VS3qbLRVlbZ8_z8hYgGVV4BSmwWzR0reN_G0XV3hzAI,9364
9
9
  shinestacker/algorithms/multilayer.py,sha256=Fm-WZqH4DAEOAyC0QpPaMH3VaG5cEPX9rqKsAyWpELs,8694
@@ -18,15 +18,15 @@ shinestacker/app/about_dialog.py,sha256=G_2hRQFpo96q0H8z02fMZ0Jl_2-PpnwNxqISY7Xn
18
18
  shinestacker/app/app_config.py,sha256=tQ1JBTG2gtHO1UbJYJjjYUBCakmtZpafvMUTHb5OyUo,1117
19
19
  shinestacker/app/gui_utils.py,sha256=C5ehbYyoIcBweFTfdQcjsILAcWpMPrVLMbYz0ZM-EcM,1571
20
20
  shinestacker/app/help_menu.py,sha256=ofFhZMPTz7lQ-_rsu30yAxbLA-Zq_kkRGXxPMukaG08,476
21
- shinestacker/app/main.py,sha256=jh53KYyQ6SG9hsPqBpm64LmSxDWWwd7SkXbSSIjKHEk,7101
21
+ shinestacker/app/main.py,sha256=insz1oxeDlZQWNKo7DGaLmRrc8PZVD7brPRrWE1SWvk,6894
22
22
  shinestacker/app/open_frames.py,sha256=uqUihAkP1K2p4bQ8LAQK02XwVddkRJUPy_vzwUgI8jc,1356
23
- shinestacker/app/project.py,sha256=xsBoPlrZOVVScxiF1ITxnGzrEdfapjiMc_Jf94o3kIg,3254
24
- shinestacker/app/retouch.py,sha256=cHPV1LhEBk1ggvLl2Cqfn6kRDVZIPlsSuE36COHRVIM,3022
25
- shinestacker/config/__init__.py,sha256=l9Cg0Rp9sUsY_F7gR2kznuVBkQ-arO7ZOcjS1FoWPtM,121
23
+ shinestacker/app/project.py,sha256=xtuA8SRoWINpHcLTApBL3RYRd0ADrczrAaq_xtT3cZI,3234
24
+ shinestacker/app/retouch.py,sha256=6Sa3ngUqj_Wn5gZBJNZeM-JxeGvXWmJZAa2Jj99t-xk,3012
25
+ shinestacker/config/__init__.py,sha256=gMotpjZz5KyGdytdHhudCVlSKONw8kqMYNRACmlWUw0,172
26
26
  shinestacker/config/config.py,sha256=Vif1_-zFZQhI6KW1CAX3Yt-cgwXMJ7YDwDJrzoGVE48,1459
27
27
  shinestacker/config/constants.py,sha256=yOt1L7LiJyBPrGezIW-Vx_1I4r1Os0rPibfqroN30nk,5724
28
28
  shinestacker/config/gui_constants.py,sha256=PtizNIsLHM_P_GdkrhsSVZuuS5abxOETXozu5eSRt9w,2440
29
- shinestacker/core/__init__.py,sha256=1Iyzh0CXNlRQhpBJg1QR5Ip3bVS0e1hlOBhTDyrTUBw,301
29
+ shinestacker/core/__init__.py,sha256=tZOPV21QOxH6bEZG21fLxIdGNu9UbbwkFWHgSJkReRk,459
30
30
  shinestacker/core/colors.py,sha256=f4_iaNgDYpHfLaoooCsltDxem5fI950GPZlw2lFPqYM,1330
31
31
  shinestacker/core/core_utils.py,sha256=EkDJY8g3zLdAqT9hTRZ2_jh3jo8GMF2L6ZBINyG6L6Y,1398
32
32
  shinestacker/core/exceptions.py,sha256=TzguZ88XxjgbPs5jMFdrXV2cQRkl5mFfXZin9GRMSRY,1555
@@ -39,11 +39,15 @@ shinestacker/gui/colors.py,sha256=Af4ccwKfiElzA2poyx2QSU2xvxOdA5fFz0Y2YIqTj9Y,12
39
39
  shinestacker/gui/gui_images.py,sha256=3HySCrldbYhUyxO0B1ckC2TLVg5nq94bBXjqsQzCyCA,5546
40
40
  shinestacker/gui/gui_logging.py,sha256=sN82OsGhMcZdgFMY4z-VbUYiRIsReN-ICaxi31M1J6E,8147
41
41
  shinestacker/gui/gui_run.py,sha256=LpBi1V91NrJpVpgS098lSgLtiege0aqcWIGwSbB8cL4,15701
42
- shinestacker/gui/main_window.py,sha256=O7eydSmYa1ijzUHrYeeVUp9x4YGuHwhDGZQ1PxH1MJI,27101
43
- shinestacker/gui/new_project.py,sha256=-2d9ts4bcPnEo_qufKwLgRYupsx3EBs_5_u4Wz2pwX4,7226
42
+ shinestacker/gui/main_window.py,sha256=KtMe6Hm74xk-lP3qcUsWAw0dzT7CynpdbZA_H651XN0,27203
43
+ shinestacker/gui/new_project.py,sha256=kGTt8zf24w5o8wUOc0QgXVDbvi4XcM4ia0CZftUImOc,7002
44
44
  shinestacker/gui/project_converter.py,sha256=d66pbBzaBgANpudJLW0tGUSfSy0PXNhs1M6R2o_Fd5E,7390
45
- shinestacker/gui/project_editor.py,sha256=i3vPOWNtJ4zkOQ4y0EIgv30DlpTv3tWEQC9DBnGmXcY,21791
45
+ shinestacker/gui/project_editor.py,sha256=s0IU3l3xO_JGovazOHhKkT1rraUWNVzyAua1dsUqJyg,21657
46
46
  shinestacker/gui/project_model.py,sha256=buzpxppLuoNWao7M2_FOPVpCBex2WgEcvqyq9dxvrz8,4524
47
+ shinestacker/gui/ico/focus_stack_bkg.png,sha256=Q86TgqvKEi_IzKI8m6aZB2a3T40UkDtexf2PdeBM9XE,163151
48
+ shinestacker/gui/ico/shinestacker.icns,sha256=m_6WQBx8sE9jQKwIRa_B5oa7_VcNn6e2TyijeQXPjwM,337563
49
+ shinestacker/gui/ico/shinestacker.ico,sha256=yO0NaBWA0uFov_GqHuHQbymoqLtQKt5DPWpGGmRKie0,186277
50
+ shinestacker/gui/ico/shinestacker.png,sha256=HTVd02AO0fuTrh9J-qaVlIBXaHwWK7GYdOAFe17IeB8,328817
47
51
  shinestacker/gui/img/close-round-line-icon.png,sha256=9HZwCjgni1s_JGUPUb_MoOfoe4tRZgM5OWzk92XFZlE,8019
48
52
  shinestacker/gui/img/forward-button-icon.png,sha256=lNw86T4TOEd_uokHYF8myGSGUXzdsHvmDAjlbE18Pgo,4788
49
53
  shinestacker/gui/img/play-button-round-icon.png,sha256=9j6Ks9mOGa-2cXyRFpimepAAvSaHzqJKBfxShRb4_dE,4595
@@ -52,16 +56,16 @@ shinestacker/retouch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
52
56
  shinestacker/retouch/brush.py,sha256=49YNdZp1dbfowh6HmLfxuHKz7Py9wkFQsN9-pH38P7Q,319
53
57
  shinestacker/retouch/brush_controller.py,sha256=M1vXrgL8ETJheT9PJ8EVIHlMqiVRLePvL5GlEcEaZW4,2949
54
58
  shinestacker/retouch/brush_preview.py,sha256=ePyoZPdSY4ytK4uXV-eByQgfsqvhHJqXpleycSxshDg,5247
55
- shinestacker/retouch/exif_data.py,sha256=eNrkhe9WA_1LPkaoxLHeM4k8s5HJinD0-O79Ik4xMRU,2451
59
+ shinestacker/retouch/exif_data.py,sha256=cYl0ZAAEOmimh2O0REtY0fU_1Y_4uIUtk9orpVLyQKY,2234
56
60
  shinestacker/retouch/file_loader.py,sha256=TbPjiD9Vv-i3LCsPVcumYJ2DxgnLmQA6xYCiLCqbEcg,4565
57
- shinestacker/retouch/image_editor.py,sha256=WNJGUpWV14Q5kJQ5fcHAqVx_mb3vK27gfVztwHLYtOc,27637
61
+ shinestacker/retouch/image_editor.py,sha256=ehOJgGqvvUOriKyL8s-G0Y-CSYStLo4WCcPzsRy_sys,27579
58
62
  shinestacker/retouch/image_editor_ui.py,sha256=wKHqNhcjrPB_qm4zKsTQUw_rXIWzWO3uQUDZvhsbnys,15752
59
63
  shinestacker/retouch/image_viewer.py,sha256=5t7JRNoNwSgS7btn7zWmSXPPzXvZKbWBiZMm-YA7Xhg,14827
60
- shinestacker/retouch/shortcuts_help.py,sha256=yR4KqkCG3-X62KCQWAR_Tyv8aRbonTsiK753DkplehY,3966
64
+ shinestacker/retouch/shortcuts_help.py,sha256=iYwD7YGV2epNDwOBVDc99zqB9bbxLR_IUtanMJ-abPQ,3749
61
65
  shinestacker/retouch/undo_manager.py,sha256=R7O0fbdGFRK2ZZMVpbOcqB5stJLpFa-o2p7Kto8daSI,1355
62
- shinestacker-0.2.0.post1.dev1.dist-info/licenses/LICENSE,sha256=cBN0P3F6BWFkfOabkhuTxwJnK1B0v50jmmzZJjGGous,80
63
- shinestacker-0.2.0.post1.dev1.dist-info/METADATA,sha256=1k3Te_FPd1jRkcASiGH0E9Ul0JlV0Ka1EFVgIm2M7Sg,2447
64
- shinestacker-0.2.0.post1.dev1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
65
- shinestacker-0.2.0.post1.dev1.dist-info/entry_points.txt,sha256=SY6g1LqtMmp23q1DGwLUDT_dhLX9iss8DvWkiWLyo_4,166
66
- shinestacker-0.2.0.post1.dev1.dist-info/top_level.txt,sha256=MhijwnBVX5psfsyX8JZjqp3SYiWPsKe69f3Gnyze4Fw,13
67
- shinestacker-0.2.0.post1.dev1.dist-info/RECORD,,
66
+ shinestacker-0.2.2.dist-info/licenses/LICENSE,sha256=cBN0P3F6BWFkfOabkhuTxwJnK1B0v50jmmzZJjGGous,80
67
+ shinestacker-0.2.2.dist-info/METADATA,sha256=yLjjPZr1ImPVjClHq0D24fTYgH-V8smuueTGlFt_2o8,3009
68
+ shinestacker-0.2.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
69
+ shinestacker-0.2.2.dist-info/entry_points.txt,sha256=SY6g1LqtMmp23q1DGwLUDT_dhLX9iss8DvWkiWLyo_4,166
70
+ shinestacker-0.2.2.dist-info/top_level.txt,sha256=MhijwnBVX5psfsyX8JZjqp3SYiWPsKe69f3Gnyze4Fw,13
71
+ shinestacker-0.2.2.dist-info/RECORD,,