Files
cartridges/src/importer/importer.py
2023-05-24 15:33:19 +02:00

108 lines
3.0 KiB
Python

from threading import Thread, Lock
from gi.repository import Adw, Gtk, Gio
from .game import Game
from .steamgriddb import SGDBHelper
class Importer:
win = None
progressbar = None
import_statuspage = None
import_dialog = None
sources = None
progress_lock = None
counts = None
games_lock = None
games = None
def __init__(self, win) -> None:
self.games = set()
self.sources = set()
self.counts = dict()
self.games_lock = Lock()
self.progress_lock = Lock()
self.win = win
@property
def progress(self):
# Compute overall values
done = 0
total = 0
with self.progress_lock:
for source in self.sources:
done += self.counts[source.id]["done"]
total += self.counts[source.id]["total"]
# Compute progress
progress = 1
if total > 0:
progress = 1 - done / total
return progress
def create_dialog(self):
"""Create the import dialog"""
self.progressbar = Gtk.ProgressBar(margin_start=12, margin_end=12)
self.import_statuspage = Adw.StatusPage(
title=_("Importing Games…"),
child=self.progressbar,
)
self.import_dialog = Adw.Window(
content=self.import_statuspage,
modal=True,
default_width=350,
default_height=-1,
transient_for=self.win,
deletable=False,
)
self.import_dialog.present()
def close_dialog(self):
self.import_dialog.close()
def update_progressbar(self):
self.progressbar.set_fraction(self.progress)
def add_source(self, source):
self.sources.add(source)
self.counts[source.id] = {"done": 0, "total": 0}
def import_games(self):
self.create_dialog()
# Scan sources in threads
threads = []
for source in self.sources:
print(f"{source.full_name}, installed: {source.is_installed}") # ! DEBUG
if not source.is_installed:
continue
t = Thread(target=self.__import_source, args=tuple([source])) # fmt: skip
threads.append(t)
t.start()
for t in threads:
t.join()
# Save games
for game in self.games:
game.save()
self.close_dialog()
def __import_source(self, *args, **kwargs):
"""Source import thread entry point"""
# TODO error handling in source iteration
# TODO add SGDB image (move to a game manager)
source, *rest = args
iterator = source.__iter__()
with self.progress_lock:
self.counts[source.id]["total"] = iterator.__len__()
for game in iterator:
with self.games_lock:
self.games.add(game)
with self.progress_lock:
if not game.blacklisted:
self.counts[source.id]["done"] += 1
self.update_progressbar()