forked from Support/sp-hydra-veil-gui
update: added background page rendering
This commit is contained in:
parent
ed79aae5a3
commit
e98f2c99d2
4 changed files with 130 additions and 0 deletions
|
|
@ -26,6 +26,7 @@ core_logger.propagate = False
|
||||||
from gui.v2.infrastructure.navigator import Navigator
|
from gui.v2.infrastructure.navigator import Navigator
|
||||||
from gui.v2.infrastructure.setup_observers import setup_observers
|
from gui.v2.infrastructure.setup_observers import setup_observers
|
||||||
from gui.v2.infrastructure.connection_manager import ConnectionManager
|
from gui.v2.infrastructure.connection_manager import ConnectionManager
|
||||||
|
from gui.v2.infrastructure.page_registry import PRELOAD_ORDER, PRELOAD_SKIP
|
||||||
from gui.v2.workers.worker_thread import WorkerThread
|
from gui.v2.workers.worker_thread import WorkerThread
|
||||||
from gui.v2.ui.builders.bottom_section import create_bottom_section
|
from gui.v2.ui.builders.bottom_section import create_bottom_section
|
||||||
from gui.v2.ui.builders.top_section import create_top_section
|
from gui.v2.ui.builders.top_section import create_top_section
|
||||||
|
|
@ -163,6 +164,17 @@ class CustomWindow(QMainWindow):
|
||||||
self.check_logging()
|
self.check_logging()
|
||||||
|
|
||||||
self.navigator = Navigator(self.page_stack, self)
|
self.navigator = Navigator(self.page_stack, self)
|
||||||
|
|
||||||
|
self._preload_queue = []
|
||||||
|
self._preload_total = 0
|
||||||
|
self._preload_done = 0
|
||||||
|
self._preload_failed = 0
|
||||||
|
self._preload_skipped_runtime = 0
|
||||||
|
self._preload_t_start = 0.0
|
||||||
|
self._preload_timer = QTimer(self)
|
||||||
|
self._preload_timer.setSingleShot(True)
|
||||||
|
self._preload_timer.timeout.connect(self._preload_next)
|
||||||
|
|
||||||
self.page_stack.currentChanged.connect(self.page_changed)
|
self.page_stack.currentChanged.connect(self.page_changed)
|
||||||
|
|
||||||
self.show()
|
self.show()
|
||||||
|
|
@ -185,6 +197,55 @@ class CustomWindow(QMainWindow):
|
||||||
self.navigator.navigate("welcome")
|
self.navigator.navigate("welcome")
|
||||||
else:
|
else:
|
||||||
self.navigator.navigate("menu")
|
self.navigator.navigate("menu")
|
||||||
|
self._start_background_preload()
|
||||||
|
|
||||||
|
def _start_background_preload(self):
|
||||||
|
import time
|
||||||
|
self._preload_queue = [n for n in PRELOAD_ORDER if n not in PRELOAD_SKIP]
|
||||||
|
self._preload_total = len(self._preload_queue)
|
||||||
|
self._preload_done = 0
|
||||||
|
self._preload_failed = 0
|
||||||
|
self._preload_skipped_runtime = 0
|
||||||
|
self._preload_t_start = time.perf_counter()
|
||||||
|
print(f"[preload] ============================================================", flush=True)
|
||||||
|
print(f"[preload] starting background preload: {self._preload_total} pages queued", flush=True)
|
||||||
|
print(f"[preload] order : {', '.join(self._preload_queue)}", flush=True)
|
||||||
|
print(f"[preload] skipped : {', '.join(sorted(PRELOAD_SKIP))} (unsafe init)", flush=True)
|
||||||
|
print(f"[preload] gap : 250 ms between loads, 700 ms initial delay", flush=True)
|
||||||
|
print(f"[preload] ============================================================", flush=True)
|
||||||
|
self._preload_timer.start(700)
|
||||||
|
|
||||||
|
def _preload_next(self):
|
||||||
|
while self._preload_queue and self._preload_queue[0] in self.navigator._instances:
|
||||||
|
skipped = self._preload_queue.pop(0)
|
||||||
|
self._preload_skipped_runtime += 1
|
||||||
|
print(f"[preload] {skipped:30s} SKIP (user navigated here first)", flush=True)
|
||||||
|
if not self._preload_queue:
|
||||||
|
self._emit_preload_summary()
|
||||||
|
return
|
||||||
|
idx = self._preload_done + self._preload_failed + 1
|
||||||
|
name = self._preload_queue.pop(0)
|
||||||
|
print(f"[preload] ---- {idx}/{self._preload_total} ----", flush=True)
|
||||||
|
ok = self.navigator.preload(name)
|
||||||
|
if ok:
|
||||||
|
self._preload_done += 1
|
||||||
|
else:
|
||||||
|
self._preload_failed += 1
|
||||||
|
if self._preload_queue:
|
||||||
|
self._preload_timer.start(250)
|
||||||
|
else:
|
||||||
|
self._emit_preload_summary()
|
||||||
|
|
||||||
|
def _emit_preload_summary(self):
|
||||||
|
import time
|
||||||
|
total_s = time.perf_counter() - self._preload_t_start
|
||||||
|
print(f"[preload] ============================================================", flush=True)
|
||||||
|
print(f"[preload] complete: {self._preload_done} loaded, "
|
||||||
|
f"{self._preload_failed} failed, "
|
||||||
|
f"{self._preload_skipped_runtime} skipped (user beat us to it) "
|
||||||
|
f"in {total_s:.2f}s", flush=True)
|
||||||
|
print(f"[preload] cached pages now: {sorted(self.navigator._instances.keys())}", flush=True)
|
||||||
|
print(f"[preload] ============================================================", flush=True)
|
||||||
|
|
||||||
def perform_update_check(self):
|
def perform_update_check(self):
|
||||||
from core.controllers.ClientController import ClientController
|
from core.controllers.ClientController import ClientController
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,6 @@
|
||||||
import importlib
|
import importlib
|
||||||
|
import time
|
||||||
|
import traceback
|
||||||
|
|
||||||
from gui.v2.infrastructure.page_registry import PAGE_REGISTRY
|
from gui.v2.infrastructure.page_registry import PAGE_REGISTRY
|
||||||
|
|
||||||
|
|
@ -23,6 +25,37 @@ class Navigator:
|
||||||
self._instances[name] = page
|
self._instances[name] = page
|
||||||
self.page_stack.setCurrentIndex(self.page_stack.indexOf(page))
|
self.page_stack.setCurrentIndex(self.page_stack.indexOf(page))
|
||||||
|
|
||||||
|
def preload(self, name):
|
||||||
|
if name in self._instances:
|
||||||
|
print(f"[preload] {name:30s} SKIP (already cached)", flush=True)
|
||||||
|
return False
|
||||||
|
if name not in PAGE_REGISTRY:
|
||||||
|
print(f"[preload] {name:30s} SKIP (not in registry)", flush=True)
|
||||||
|
return False
|
||||||
|
module_path, class_name = PAGE_REGISTRY[name]
|
||||||
|
print(f"[preload] {name:30s} LOAD {module_path}.{class_name}", flush=True)
|
||||||
|
t0 = time.perf_counter()
|
||||||
|
try:
|
||||||
|
module = importlib.import_module(module_path)
|
||||||
|
cls = getattr(module, class_name)
|
||||||
|
page = cls(self.page_stack, self.custom_window)
|
||||||
|
self.page_stack.addWidget(page)
|
||||||
|
self._instances[name] = page
|
||||||
|
dt_ms = (time.perf_counter() - t0) * 1000.0
|
||||||
|
print(f"[preload] {name:30s} OK ({dt_ms:6.1f} ms, "
|
||||||
|
f"cached={len(self._instances)}, stack_size={self.page_stack.count()})",
|
||||||
|
flush=True)
|
||||||
|
return True
|
||||||
|
except Exception as e:
|
||||||
|
dt_ms = (time.perf_counter() - t0) * 1000.0
|
||||||
|
print(f"[preload] {name:30s} FAIL ({dt_ms:6.1f} ms) "
|
||||||
|
f"{type(e).__name__}: {e}", flush=True)
|
||||||
|
traceback.print_exc()
|
||||||
|
from core.errors.logger import logger as core_logger
|
||||||
|
core_logger.warning(f"Background preload failed for '{name}': "
|
||||||
|
f"{type(e).__name__}: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
def get_cached(self, name):
|
def get_cached(self, name):
|
||||||
return self._instances.get(name)
|
return self._instances.get(name)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,3 +30,38 @@ PAGE_REGISTRY = {
|
||||||
"fast_registration": ("gui.v2.ui.pages.fast_registration_page", "FastRegistrationPage"),
|
"fast_registration": ("gui.v2.ui.pages.fast_registration_page", "FastRegistrationPage"),
|
||||||
"fast_mode_prompt": ("gui.v2.ui.pages.fast_mode_prompt_page", "FastModePromptPage"),
|
"fast_mode_prompt": ("gui.v2.ui.pages.fast_mode_prompt_page", "FastModePromptPage"),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PRELOAD_SKIP = {
|
||||||
|
"blank",
|
||||||
|
"welcome",
|
||||||
|
"payment_confirmed",
|
||||||
|
"ticket_prep",
|
||||||
|
}
|
||||||
|
|
||||||
|
PRELOAD_ORDER = [
|
||||||
|
"settings",
|
||||||
|
"editor",
|
||||||
|
"ticket_or_billing_choice",
|
||||||
|
"payment_details",
|
||||||
|
"plan_picker",
|
||||||
|
"ticket_crypto_picker",
|
||||||
|
"duration_selection",
|
||||||
|
"currency_selection",
|
||||||
|
"policy_suggestion",
|
||||||
|
"systemwide_prompt",
|
||||||
|
"fast_mode_prompt",
|
||||||
|
"fast_registration",
|
||||||
|
"id",
|
||||||
|
"protocol",
|
||||||
|
"location",
|
||||||
|
"hidetor",
|
||||||
|
"residential",
|
||||||
|
"tor",
|
||||||
|
"connection",
|
||||||
|
"screen",
|
||||||
|
"browser",
|
||||||
|
"resume",
|
||||||
|
"wireguard",
|
||||||
|
"install_system_package",
|
||||||
|
"sync_screen",
|
||||||
|
]
|
||||||
|
|
|
||||||
|
|
@ -231,6 +231,7 @@ class WorkerThread(QThread):
|
||||||
self.check_for_update()
|
self.check_for_update()
|
||||||
locations = LocationController.get_all()
|
locations = LocationController.get_all()
|
||||||
browser = ApplicationVersionController.get_all()
|
browser = ApplicationVersionController.get_all()
|
||||||
|
print('the browser is: ', browser)
|
||||||
all_browser_versions = [
|
all_browser_versions = [
|
||||||
f"{browser.application_code}:{browser.version_number}" for browser in browser if browser.supported]
|
f"{browser.application_code}:{browser.version_number}" for browser in browser if browser.supported]
|
||||||
all_location_codes = [
|
all_location_codes = [
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue