From 9c52c42cff602dd18a160ef3605b0d7fa9a8976c Mon Sep 17 00:00:00 2001 From: Vlad Zhukov Date: Sun, 19 Feb 2017 14:09:56 +0300 Subject: [PATCH 1/2] Add an optional callback when reading GGPK --- PyPoE/poe/file/ggpk.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PyPoE/poe/file/ggpk.py b/PyPoE/poe/file/ggpk.py index 9f889533..7f24456a 100644 --- a/PyPoE/poe/file/ggpk.py +++ b/PyPoE/poe/file/ggpk.py @@ -1032,6 +1032,8 @@ def _read(self, buffer, *args, **kwargs): ggpkfile=buffer, offset=offset, ) + if callable(kwargs['callback']): + kwargs['callback'](records, buffer, offset) offset = buffer.tell() self.records = records From 2c83ff02b1d939f44e6406fb684138df721f2c5e Mon Sep 17 00:00:00 2001 From: Vlad Zhukov Date: Sun, 19 Feb 2017 14:12:25 +0300 Subject: [PATCH 2/2] UI: use a new callback argument when reading GGPK, add a timer to only emit progress bar changes once every 200ms --- PyPoE/ui/shared/file/ggpk.py | 36 ++++++++++++++---------------------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/PyPoE/ui/shared/file/ggpk.py b/PyPoE/ui/shared/file/ggpk.py index 51df02f3..1aadd888 100644 --- a/PyPoE/ui/shared/file/ggpk.py +++ b/PyPoE/ui/shared/file/ggpk.py @@ -40,7 +40,7 @@ # Python import os -from functools import wraps +import time # 3rd-party from PySide.QtCore import * @@ -113,33 +113,25 @@ def __init__(self, file_path, *args, **kwargs): self._file_path = file_path self.ggpk_file = None self._size = 0 + self._time = 0 self.sig_update_progress.connect(self._progress_updater) self.progress_bar = GGPKProgressDialog('') - def _progress_ggpk(self, func): - """ - Hook for GGPKFile._read_record - """ - fm = self.parent() - - @wraps(func) - def temp(*args, **kwargs): - if not self._size: - self._size = kwargs['ggpkfile'].seek(0, os.SEEK_END) - kwargs['ggpkfile'].seek(0, os.SEEK_SET) - else: - #kwargs['offset']) - + def _progress_ggpk(self, records, ggpkfile, offset): + if not self._size: + self._size = ggpkfile.seek(0, os.SEEK_END) + ggpkfile.seek(0, os.SEEK_SET) + else: + # Emit the event every 200 ms + current_time = time.perf_counter() + if current_time - self._time > 0.2: + self._time = current_time self.progress_bar.sig_progress.emit( - int(kwargs['offset'] / self._size * 100) + int(offset / self._size * 100) ) - return func(*args, **kwargs) - - return temp - def _progress_updater(self, title, max, *args, **kwargs): p = self.parent().parent() @@ -159,8 +151,8 @@ def run(self): self.sig_update_progress.emit(self.tr('Reading GGPK records...'), 100) ggpk_file = GGPKFile() # Hook the function for progress bar - ggpk_file._read_record = self._progress_ggpk(ggpk_file._read_record) - ggpk_file.read(self._file_path) + # ggpk_file._read_record = self._progress_ggpk(ggpk_file._read_record) + ggpk_file.read(self._file_path, callback=self._progress_ggpk) # Finished self.progress_bar.sig_progress.emit(100)