Skip to content

Commit e68c798

Browse files
[pre-commit.ci] Auto fixes from pre-commit.com hooks.
1 parent a45ff2d commit e68c798

12 files changed

Lines changed: 288 additions & 154 deletions

File tree

games/ff12/Archive/Loader.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
class ArchiveLoader(QThread):
99
"""Background thread for loading archive."""
10+
1011
finished = pyqtSignal(object)
1112
error = pyqtSignal(str)
1213

games/ff12/Archive/Model.py

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88

99
class TreeNode:
10-
def __init__(self, name: str, parent = None, is_dir = False, size = 0, entry = None):
10+
def __init__(self, name: str, parent=None, is_dir=False, size=0, entry=None):
1111
self.name = name
1212
self.parent = parent
1313
self.is_dir = is_dir
@@ -21,7 +21,7 @@ def __init__(self, name: str, parent = None, is_dir = False, size = 0, entry = N
2121
def child_count(self) -> int:
2222
return len(self.children)
2323

24-
def child(self, row: int) -> 'TreeNode | None':
24+
def child(self, row: int) -> "TreeNode | None":
2525
if 0 <= row < len(self.children):
2626
return self.children[row]
2727
return None
@@ -44,31 +44,41 @@ def sort_children(self, column: int, order: Qt.SortOrder):
4444
"""
4545
dirs = [i for i in self.children if i.is_dir]
4646
if column == ArchiveColumn.NAME:
47-
dirs.sort(key=lambda node: node.name.lower(),
48-
reverse=(order == Qt.SortOrder.DescendingOrder))
47+
dirs.sort(
48+
key=lambda node: node.name.lower(),
49+
reverse=(order == Qt.SortOrder.DescendingOrder),
50+
)
4951

5052
files = [i for i in self.children if not i.is_dir]
5153
if column == ArchiveColumn.NAME:
52-
files.sort(key=lambda node: node.name.lower(),
53-
reverse=(order == Qt.SortOrder.DescendingOrder))
54+
files.sort(
55+
key=lambda node: node.name.lower(),
56+
reverse=(order == Qt.SortOrder.DescendingOrder),
57+
)
5458
elif column == ArchiveColumn.TYPE:
55-
files.sort(key=lambda node: QFileInfo(node.name).suffix().lower(),
56-
reverse=(order == Qt.SortOrder.DescendingOrder))
59+
files.sort(
60+
key=lambda node: QFileInfo(node.name).suffix().lower(),
61+
reverse=(order == Qt.SortOrder.DescendingOrder),
62+
)
5763
elif column == ArchiveColumn.SIZE:
58-
files.sort(key=lambda node: node.size,
59-
reverse=(order == Qt.SortOrder.DescendingOrder))
64+
files.sort(
65+
key=lambda node: node.size,
66+
reverse=(order == Qt.SortOrder.DescendingOrder),
67+
)
6068

6169
self.children = dirs + files
6270
for i in dirs:
6371
i.sort_children(column, order)
6472

73+
6574
class ArchiveColumn(IntEnum):
6675
NAME = 0
6776
TYPE = auto()
6877
SIZE = auto()
6978

79+
7080
class ArchiveModel(QAbstractItemModel):
71-
def __init__(self, parent = None):
81+
def __init__(self, parent=None):
7282
super().__init__(parent)
7383
self._reader = None
7484
self._icon_provider = QFileIconProvider()
@@ -86,10 +96,10 @@ def set_data(self, reader: ArchiveReader):
8696
def _build_tree(self):
8797
"""Build the tree structure from archive entries."""
8898
dir_nodes: dict[str, TreeNode] = {"": self._root_node}
89-
sorted_entries = sorted(self._reader._entries.items(), key = lambda x: x[0])
99+
sorted_entries = sorted(self._reader._entries.items(), key=lambda x: x[0])
90100

91101
for name, entry in sorted_entries:
92-
path_parts = name.split('/')
102+
path_parts = name.split("/")
93103
current_path = ""
94104
current_node = self._root_node
95105

@@ -124,7 +134,9 @@ def sort(self, column: int, order: Qt.SortOrder):
124134
else:
125135
old_nodes.append(None)
126136

127-
self.layoutAboutToBeChanged.emit([], QAbstractItemModel.LayoutChangeHint.VerticalSortHint)
137+
self.layoutAboutToBeChanged.emit(
138+
[], QAbstractItemModel.LayoutChangeHint.VerticalSortHint
139+
)
128140

129141
self._sort_column = column
130142
self._sort_order = order
@@ -141,7 +153,9 @@ def sort(self, column: int, order: Qt.SortOrder):
141153
for old_index, new_index in zip(persistent_indexes, new_indexes):
142154
self.changePersistentIndex(old_index, new_index)
143155

144-
self.layoutChanged.emit([], QAbstractItemModel.LayoutChangeHint.VerticalSortHint)
156+
self.layoutChanged.emit(
157+
[], QAbstractItemModel.LayoutChangeHint.VerticalSortHint
158+
)
145159

146160
def _find_index_for_node(self, target_node: TreeNode) -> QModelIndex:
147161
"""Find the QModelIndex for a specific TreeNode after sorting"""
@@ -231,8 +245,16 @@ def data(self, index: QModelIndex, role: int = Qt.ItemDataRole.DisplayRole):
231245

232246
return None
233247

234-
def headerData(self, section: int, orientation: Qt.Orientation, role: int = Qt.ItemDataRole.DisplayRole) -> str | None:
235-
if orientation != Qt.Orientation.Horizontal or role != Qt.ItemDataRole.DisplayRole:
248+
def headerData(
249+
self,
250+
section: int,
251+
orientation: Qt.Orientation,
252+
role: int = Qt.ItemDataRole.DisplayRole,
253+
) -> str | None:
254+
if (
255+
orientation != Qt.Orientation.Horizontal
256+
or role != Qt.ItemDataRole.DisplayRole
257+
):
236258
return None
237259

238260
match ArchiveColumn(section):
@@ -258,7 +280,7 @@ def _format_file_size(size: int) -> str:
258280
return f"{size} B"
259281

260282
size_f = float(size)
261-
for unit in ['KB', 'MB', 'GB']:
283+
for unit in ["KB", "MB", "GB"]:
262284
size_f /= 1024.0
263285
if size_f < 1024.0:
264286
if size_f < 10:

games/ff12/Archive/Reader.py

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ def __init__(self, original_size: int, data_offset: int, block_sizes: List[int])
1313
self.data_offset = data_offset
1414
self.block_sizes = block_sizes
1515

16+
1617
class ArchiveReader:
1718
_MAX_BLOCK_SIZE = 64 * 1024
1819

@@ -74,15 +75,24 @@ def _load_metadata(self):
7475
block_count = self._get_block_count(file_metadata)
7576
global_block_sizes = self._read_block_sizes(file, block_count)
7677

77-
for block_sizes_start_index, original_size, data_offset, filepath_offset in file_metadata:
78+
for (
79+
block_sizes_start_index,
80+
original_size,
81+
data_offset,
82+
filepath_offset,
83+
) in file_metadata:
7884
name = self._read_null_string_lower(file_path_data, filepath_offset)
7985

8086
blocks = original_size // self._MAX_BLOCK_SIZE
8187
if original_size % self._MAX_BLOCK_SIZE != 0:
8288
blocks += 1
8389

84-
file_block_sizes = global_block_sizes[block_sizes_start_index:block_sizes_start_index + blocks]
85-
self._entries[name] = ArchiveEntry(original_size, data_offset, file_block_sizes)
90+
file_block_sizes = global_block_sizes[
91+
block_sizes_start_index : block_sizes_start_index + blocks
92+
]
93+
self._entries[name] = ArchiveEntry(
94+
original_size, data_offset, file_block_sizes
95+
)
8696

8797
except Exception as e:
8898
qWarning(f"Failed to load archive metadata: {e}")
@@ -97,8 +107,12 @@ def _read_file_metadata(self, file: BinaryIO, count: int) -> List[tuple]:
97107
if len(data) < file_struct.size:
98108
raise EOFError("Unexpected EOF reading file metadata")
99109

100-
block_sizes_start_index, _, original_size, data_offset, filepath_offset = file_struct.unpack(data)
101-
file_metadata.append((block_sizes_start_index, original_size, data_offset, filepath_offset))
110+
block_sizes_start_index, _, original_size, data_offset, filepath_offset = (
111+
file_struct.unpack(data)
112+
)
113+
file_metadata.append(
114+
(block_sizes_start_index, original_size, data_offset, filepath_offset)
115+
)
102116

103117
return file_metadata
104118

@@ -154,10 +168,12 @@ def unpack_file(self, file_path: str, out_path: str):
154168
if len(block_data) < block_size:
155169
raise EOFError("Unexpected EOF reading data block")
156170

157-
is_last_block = (block_count == len(entry.block_sizes) - 1)
171+
is_last_block = block_count == len(entry.block_sizes) - 1
158172
remaining_size = entry.original_size % self._MAX_BLOCK_SIZE
159173

160-
if (block_size == self._MAX_BLOCK_SIZE or (is_last_block and block_size == remaining_size)):
174+
if block_size == self._MAX_BLOCK_SIZE or (
175+
is_last_block and block_size == remaining_size
176+
):
161177
out_file.write(block_data)
162178
else:
163179
decompressed_data = zlib.decompress(block_data)
@@ -172,7 +188,8 @@ def _read_null_string_lower(data: bytes, offset: int) -> str:
172188
if end == -1:
173189
end = len(data)
174190

175-
return data[offset:end].decode("utf-8", errors = "replace").lower()
191+
return data[offset:end].decode("utf-8", errors="replace").lower()
192+
176193

177194
def get_archives(folder: Path) -> list[Path]:
178195
"""Return a list of all archives in the given folder."""

games/ff12/Archive/View.py

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,9 @@ def _show_context_menu(self, position):
5353
selected_indexes = self._get_selected_indexes()
5454
if selected_indexes:
5555
export_action = QAction("Export", self)
56-
export_action.triggered.connect(lambda: self._export_selection(selected_indexes))
56+
export_action.triggered.connect(
57+
lambda: self._export_selection(selected_indexes)
58+
)
5759
menu.addAction(export_action)
5860

5961
if menu.actions():
@@ -64,7 +66,9 @@ def _export_selection(self, indexes):
6466
QStandardPaths.StandardLocation.DesktopLocation
6567
)
6668

67-
export_dir = QFileDialog.getExistingDirectory(self, "Choose Export Directory", start_dir)
69+
export_dir = QFileDialog.getExistingDirectory(
70+
self, "Choose Export Directory", start_dir
71+
)
6872
if not export_dir:
6973
return
7074

@@ -76,7 +80,9 @@ def _export_selection(self, indexes):
7680
QMessageBox.information(self, "Export", "No files to export.")
7781
return
7882

79-
progress = QProgressDialog("Exporting files...", "Cancel", 0, len(files_to_export), self)
83+
progress = QProgressDialog(
84+
"Exporting files...", "Cancel", 0, len(files_to_export), self
85+
)
8086
progress.setWindowModality(Qt.WindowModality.WindowModal)
8187
progress.show()
8288

@@ -95,7 +101,7 @@ def _export_selection(self, indexes):
95101
try:
96102
relative_path = file_node.path()
97103
output_file = export_path / Path(relative_path)
98-
output_file.parent.mkdir(parents = True, exist_ok = True)
104+
output_file.parent.mkdir(parents=True, exist_ok=True)
99105

100106
reader.unpack_file(relative_path, output_file)
101107

@@ -106,17 +112,23 @@ def _export_selection(self, indexes):
106112
progress.close()
107113
if failed_files:
108114
log_path = export_path / "export.log"
109-
with open(log_path, "w", encoding = "utf-8") as log_file:
115+
with open(log_path, "w", encoding="utf-8") as log_file:
110116
log_file.write("\n".join(failed_files))
111117

112118
total_count = len(files_to_export)
113119
fail_count = len(failed_files)
114-
QMessageBox.warning(self, "Export Complete",
115-
f"Only {total_count - fail_count} of {total_count} files were exported successfully.\n"
116-
f"See log for details: {log_path}")
120+
QMessageBox.warning(
121+
self,
122+
"Export Complete",
123+
f"Only {total_count - fail_count} of {total_count} files were exported successfully.\n"
124+
f"See log for details: {log_path}",
125+
)
117126
else:
118-
QMessageBox.information(self, "Export Complete",
119-
f"Successfully exported {exported_count} file(s) to:\n{export_path}")
127+
QMessageBox.information(
128+
self,
129+
"Export Complete",
130+
f"Successfully exported {exported_count} file(s) to:\n{export_path}",
131+
)
120132

121133
def _get_selected_indexes(self) -> list[QModelIndex]:
122134
indexes = self.selectionModel().selectedIndexes()
@@ -130,6 +142,7 @@ def _get_selected_indexes(self) -> list[QModelIndex]:
130142

131143
def _get_selected_files(self, indexes) -> list[TreeNode]:
132144
files = []
145+
133146
def collect(node):
134147
if node.is_dir:
135148
for child in node.children:

games/ff12/Archive/Widget.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ def __init__(self, content_path: Path, parent: QWidget | None = None):
3131
h_layout.addWidget(label)
3232

3333
self._combo_box = QComboBox(self)
34-
self._combo_box.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)
34+
self._combo_box.setSizePolicy(
35+
QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed
36+
)
3537
h_layout.addWidget(self._combo_box)
3638
v_layout.addLayout(h_layout)
3739

@@ -44,7 +46,7 @@ def _reset_combo_box(self):
4446
self._combo_box.blockSignals(True)
4547
self._combo_box.clear()
4648
for p in sorted(get_archives(self._content_path)):
47-
self._combo_box.addItem(p.name, userData = p)
49+
self._combo_box.addItem(p.name, userData=p)
4850
self._combo_box.blockSignals(False)
4951

5052
def _clear_current_content(self):
@@ -98,6 +100,7 @@ def hideEvent(self, event):
98100
super().hideEvent(event)
99101
self._clear_current_content()
100102

103+
101104
class ArchiveContentWidget(QWidget):
102105
def __init__(self, parent: QWidget | None = None):
103106
super().__init__(parent)

0 commit comments

Comments
 (0)