Skip to content

Commit 86351fa

Browse files
AvasamToufool
andauthored
Image comparison method and default delay time (#135)
* hooked new settings window to actual values * Implemented image specific comparison method and default delay time. Closes #26 * Initial UI update for 2.0.0. Add settings window. * hooked new settings window to actual values * Better "seconds remaining" text * Undo split goes to the end of the group * Fixed images comparison method defaulting to 0 rather than none Co-authored-by: Austin <[email protected]>
1 parent 65441ba commit 86351fa

File tree

4 files changed

+84
-40
lines changed

4 files changed

+84
-40
lines changed

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
22

3+
# Caches
4+
.cache/
5+
36
# Byte-compiled / optimized / DLL files
47
__pycache__/
58

69
# Distribution / packaging
710
env/
811
build/
912
dist/
13+
*.prof
1014
# Generated
1115
**/gen/*.py
1216
!**/gen/*.pyi
@@ -19,3 +23,4 @@ dist/
1923

2024
# Dev settings
2125
*.pkl
26+
settings.toml

src/AutoSplit.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -335,10 +335,10 @@ def __start_image_function(self):
335335
self.start_image_split_below_threshold = False
336336

337337
# delay start image if needed
338-
if self.start_image.delay > 0:
338+
if self.start_image.get_delay_time(self) > 0:
339339
self.start_image_status_value_label.setText("delaying start...")
340340
delay_start_time = time()
341-
start_delay = self.start_image.delay / 1000
341+
start_delay = self.start_image.get_delay_time(self) / 1000
342342
while time() - delay_start_time < start_delay:
343343
delay_time_left = start_delay - (time() - delay_start_time)
344344
self.current_split_image.setText(
@@ -391,7 +391,7 @@ def __take_screenshot(self):
391391

392392
# save and open image
393393
cv2.imwrite(screenshot_path, capture)
394-
os.startfile(screenshot_path)
394+
os.startfile(screenshot_path) # nosec
395395

396396
def __check_fps(self):
397397
self.fps_value_label.clear()
@@ -616,7 +616,7 @@ def __auto_splitter(self):
616616
if not self.split_image.check_flag(DUMMY_FLAG):
617617
# If it's a delayed split, check if the delay has passed
618618
# Otherwise calculate the split time for the key press
619-
split_delay = self.split_image.delay / 1000
619+
split_delay = self.split_image.get_delay_time(self) / 1000
620620
if split_delay > 0 and not self.waiting_for_split_delay:
621621
split_time = round(time() + split_delay * 1000)
622622
self.waiting_for_split_delay = True

src/AutoSplitImage.py

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,40 @@ class AutoSplitImage():
3030
filename: str
3131
flags: int
3232
loops: int
33-
delay: float
3433
image_type: ImageType
3534
bytes: Optional[cv2.ndarray] = None
3635
mask: Optional[cv2.ndarray] = None
3736
# This value is internal, check for mask instead
3837
_has_transparency: bool
3938
# These values should be overriden by Defaults if None. Use getters instead
39+
__delay_time: Optional[float] = None
40+
__comparison_method: Optional[int] = None
4041
__pause_time: Optional[float] = None
4142
__similarity_threshold: Optional[float] = None
4243

44+
def get_delay_time(self, default: Union[AutoSplit, int]):
45+
"""
46+
Get image's delay time or fallback to the default value from spinbox
47+
"""
48+
default_value = default \
49+
if isinstance(default, int) \
50+
else default.settings_dict["default_delay_time"]
51+
return default_value if self.__delay_time is None else self.__delay_time
52+
53+
def __get_comparison_method(self, default: Union[AutoSplit, int]):
54+
"""
55+
Get image's comparison or fallback to the default value from combobox
56+
"""
57+
default_value = default \
58+
if isinstance(default, int) \
59+
else default.settings_dict["default_comparison_method"]
60+
return default_value if self.__comparison_method is None else self.__comparison_method
61+
4362
def get_pause_time(self, default: Union[AutoSplit, float]):
4463
"""
4564
Get image's pause time or fallback to the default value from spinbox
4665
"""
47-
default_value: float = default \
66+
default_value = default \
4867
if isinstance(default, float) \
4968
else default.settings_dict["default_pause_time"]
5069
return default_value if self.__pause_time is None else self.__pause_time
@@ -53,7 +72,7 @@ def get_similarity_threshold(self, default: Union[AutoSplit, float]):
5372
"""
5473
Get image's similarity threashold or fallback to the default value from spinbox
5574
"""
56-
default_value: float = default \
75+
default_value = default \
5776
if isinstance(default, float) \
5877
else default.settings_dict["default_similarity_threshold"]
5978
return default_value if self.__similarity_threshold is None else self.__similarity_threshold
@@ -63,7 +82,8 @@ def __init__(self, path: str):
6382
self.filename = os.path.split(path)[-1].lower()
6483
self.flags = flags_from_filename(self.filename)
6584
self.loops = loop_from_filename(self.filename)
66-
self.delay = delay_from_filename(self.filename)
85+
self.__delay_time = delay_time_from_filename(self.filename)
86+
self.__comparison_method = comparison_method_from_filename(self.filename)
6787
self.__pause_time = pause_from_filename(self.filename)
6888
self.__similarity_threshold = threshold_from_filename(self.filename)
6989
self.__read_image_bytes(path)
@@ -101,18 +121,16 @@ def check_flag(self, flag: int):
101121

102122
def compare_with_capture(
103123
self,
104-
comparison: Union[AutoSplit, int],
124+
default: Union[AutoSplit, int],
105125
capture: Optional[cv2.ndarray]
106126
):
107127
"""
108-
Compare image with capture using comparison method from combobox
128+
Compare image with capture using image's comparison method. Falls back to combobox
109129
"""
110-
comparison_method: int = comparison \
111-
if isinstance(comparison, int) \
112-
else comparison.settings_dict["default_comparison_method"]
113130

114131
if self.bytes is None or capture is None:
115132
return 0.0
133+
comparison_method = self.__get_comparison_method(default)
116134
if comparison_method == 0:
117135
return compare_l2_norm(self.bytes, capture, self.mask)
118136
if comparison_method == 1:
@@ -122,5 +140,5 @@ def compare_with_capture(
122140
return 0.0
123141

124142

125-
from split_parser import delay_from_filename, flags_from_filename, loop_from_filename, pause_from_filename, \
126-
threshold_from_filename
143+
from split_parser import comparison_method_from_filename, delay_time_from_filename, flags_from_filename, \
144+
loop_from_filename, pause_from_filename, threshold_from_filename

src/split_parser.py

Lines changed: 46 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from __future__ import annotations
2-
from typing import TYPE_CHECKING
2+
from typing import TYPE_CHECKING, TypeVar
33
if TYPE_CHECKING:
44
from AutoSplit import AutoSplit
55

@@ -14,6 +14,22 @@
1414
PAUSE_FLAG,
1515
*_] = [1 << i for i in range(31)] # 32 bits of flags
1616

17+
T = TypeVar("T", str, int, float)
18+
19+
20+
def __value_from_filename(
21+
filename: str,
22+
delimiters: str,
23+
default_value: T
24+
) -> T:
25+
if len(delimiters) != 2:
26+
raise ValueError("delimiters parameter must contain exactly 2 characters")
27+
try:
28+
value_type = type(default_value)
29+
return value_type(filename.split(delimiters[0], 1)[1].split(delimiters[1])[0])
30+
except (IndexError, ValueError):
31+
return default_value
32+
1733

1834
def threshold_from_filename(filename: str):
1935
"""
@@ -26,13 +42,10 @@ def threshold_from_filename(filename: str):
2642

2743
# Check to make sure there is a valid floating point number between
2844
# parentheses of the filename
29-
try:
30-
threshold = float(filename.split("(", 1)[1].split(")")[0])
31-
except (IndexError, ValueError):
32-
return None
45+
value = __value_from_filename(filename, "()", -1.0)
3346

3447
# Check to make sure if it is a valid threshold
35-
return threshold if 0.0 < threshold < 1.0 else None
48+
return value if 0.0 < value < 1.0 else None
3649

3750

3851
def pause_from_filename(filename: str):
@@ -46,16 +59,13 @@ def pause_from_filename(filename: str):
4659

4760
# Check to make sure there is a valid pause time between brackets
4861
# of the filename
49-
try:
50-
pause = float(filename.split("[", 1)[1].split("]")[0])
51-
except (IndexError, ValueError):
52-
return None
62+
value = __value_from_filename(filename, "[]", -1.0)
5363

5464
# Pause times should always be positive or zero
55-
return pause if pause >= 0.0 else None
65+
return value if value >= 0.0 else None
5666

5767

58-
def delay_from_filename(filename: str):
68+
def delay_time_from_filename(filename: str):
5969
"""
6070
Retrieve the delay time from the filename, if there is no delay time or the delay time
6171
isn't a valid number, then 0 is returned
@@ -66,13 +76,10 @@ def delay_from_filename(filename: str):
6676

6777
# Check to make sure there is a valid delay time between brackets
6878
# of the filename
69-
try:
70-
delay = float(filename.split("#", 1)[1].split("#")[0])
71-
except (IndexError, ValueError):
72-
return 0.0
79+
value = __value_from_filename(filename, "##", 0)
7380

7481
# Delay times should always be positive or zero
75-
return delay if delay >= 0.0 else 0.0
82+
return value if value >= 0 else None
7683

7784

7885
def loop_from_filename(filename: str):
@@ -86,13 +93,27 @@ def loop_from_filename(filename: str):
8693

8794
# Check to make sure there is a valid delay time between brackets
8895
# of the filename
89-
try:
90-
loop = int(filename.split("@", 1)[1].split("@")[0])
91-
except (IndexError, ValueError):
92-
return 1
96+
value = __value_from_filename(filename, "@@", 1)
9397

9498
# Loop should always be positive
95-
return loop if loop >= 1 else 1
99+
return value if value >= 1 else 1
100+
101+
102+
def comparison_method_from_filename(filename: str):
103+
"""
104+
Retrieve the number of loops from filename, if there is no loop number or the loop number isn't valid,
105+
then 1 is returned.
106+
107+
@param filename: String containing the file's name
108+
@return: A valid loop number, if not then 1
109+
"""
110+
111+
# Check to make sure there is a valid delay time between brackets
112+
# of the filename
113+
value = __value_from_filename(filename, "<>", -1)
114+
115+
# Comparison method should always be positive or zero
116+
return value if value >= 0 else None
96117

97118

98119
def flags_from_filename(filename: str):
@@ -110,9 +131,9 @@ def flags_from_filename(filename: str):
110131

111132
# Check to make sure there are flags between curly braces
112133
# of the filename
113-
try:
114-
flags_str = filename.split("{", 1)[1].split("}")[0]
115-
except (IndexError, ValueError):
134+
flags_str = __value_from_filename(filename, "{}", "")
135+
136+
if not flags_str:
116137
return 0
117138

118139
flags = 0x00

0 commit comments

Comments
 (0)