From 00f16ab3490c044223561571659d9142d2bca2d1 Mon Sep 17 00:00:00 2001 From: orende <1337decker@gmail.com> Date: Thu, 20 Jul 2023 20:50:24 +0800 Subject: [PATCH 1/3] Add loading screen UI, refactor window and library Adds a loading screen shown on startup. Also refactors library and window classes to reduce coupling and move most of the slow work done in the window constructor to library.initialize(). --- bin/minigalaxy | 10 +++-- data/images/spiral_galaxy.jpg | Bin 0 -> 95043 bytes data/ui/loadingscreen.ui | 42 +++++++++++++++++ minigalaxy/api.py | 5 +-- minigalaxy/paths.py | 4 ++ minigalaxy/ui/__init__.py | 1 + minigalaxy/ui/gametile.py | 19 ++++---- minigalaxy/ui/gametilelist.py | 19 ++++---- minigalaxy/ui/information.py | 2 +- minigalaxy/ui/library.py | 59 +++++++++++++++++------- minigalaxy/ui/loadingscreen.py | 17 +++++++ minigalaxy/ui/properties.py | 2 +- minigalaxy/ui/window.py | 55 +++++++++++------------ tests/test_ui_library.py | 80 +++++++++++++++++++++++++++++---- tests/test_ui_window.py | 52 +++++++-------------- 15 files changed, 245 insertions(+), 122 deletions(-) create mode 100644 data/images/spiral_galaxy.jpg create mode 100644 data/ui/loadingscreen.ui create mode 100644 minigalaxy/ui/loadingscreen.py diff --git a/bin/minigalaxy b/bin/minigalaxy index 391f93fa..646faf3d 100755 --- a/bin/minigalaxy +++ b/bin/minigalaxy @@ -43,12 +43,13 @@ def main(): if cli_args.reset: conf_reset() # Import the gi module after parsing arguments - from minigalaxy.ui.gtk import Gtk - from minigalaxy.ui import Window + from minigalaxy.ui.gtk import Gtk, GLib + from minigalaxy.ui import Window, LoadingScreen from minigalaxy.config import Config from minigalaxy.api import Api from minigalaxy.download_manager import DownloadManager from minigalaxy.css import load_css + from minigalaxy.ui.library import Library # Start the application load_css() @@ -57,8 +58,11 @@ def main(): session.headers.update({'User-Agent': 'Minigalaxy/{} (Linux {})'.format(VERSION, platform.machine())}) api = Api(config, session) download_manager = DownloadManager(session) - window = Window(config, api, download_manager, APPLICATION_NAME) + library = Library(config, api, download_manager) + window = Window(config, api, library, APPLICATION_NAME) window.connect("destroy", Gtk.main_quit) + loading_screen = LoadingScreen() + library.initialize(loading_screen, window) Gtk.main() diff --git a/data/images/spiral_galaxy.jpg b/data/images/spiral_galaxy.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f7d285bda7e023e13bd13ec9ae70323423ef5511 GIT binary patch literal 95043 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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

-bldc#p)|mbtG>t!i?~J?z=s?mG^h zv5a@Dhhy@h@~ZhCHyEj&C}xODH}0e-Y(#hZ{ype~8*L_OI-JVZJO2QM9y6Q68tt{+ zyiBpHC~eK1ha*3pYv_N8{{R>4b>9OEOLt!~Kns-Qh66uJ`2N^UwkW1k6iy2ho(Spr zaZmeHqCY2mjgmRsF^qKl>HE-XchnF^{*6*GhD|6YO5UTiW%HteRF}+IjwIGc#Bx@tnYDWb0j`yJlIzoBmssp4`2TP zT{>;U-jmRYrq-L4bqguC$Vg(*@64e|IqV7V>}rq`T!w`mHX?9O93HJ!HBCZ$*`D!E z$DQ*cD8M9~oMX4Q6_<8iJB3*0ERXUXt<;Xyi+h)Am-Oi5xoDKS`CyeHhDRKq#n8jrXZR%tZhRIRs{&VS6WwyQ3P^^Fqpnb&SpKjTuD9JA%O?Nc_`#rt1_G;2> zWikYhqx}H0xe ze)G+_`(!dBAC$afI47QS(0BZ6e}*dCGFGkJv!`7(w}>Q?10uAGvwq$|?th&=YpvSy z+^*(n2P7r{Ju+~3KKxc~zm+RZ9{Gf;9zz52yLHLQrbR1=?gXtS_8Wfo0|ChA-xZHD ziqVHIruEg}i6gg;bn}yj$jD{{9Ivl#DJ(A~xpY%zSj-4Gr0JOCSwzU_~!4yn^jv@i^p1JM-?b4^Pw9u~}>glJK zPm(ALT7adD(gwg>{d3c~?Ovt|g2YYQR(-ZHo8(()O&i;bV-20G^8}Q6QVa~9;P>mm z{{ZXN?)WAf7IsCEf<%7%5&$dwIT`Ee+On**)U+*cZqi11X$}Jk2VP0+I(`-D zdX<97@Y_!D6}*t7(MZcWc|?*9KKBPC=kFYKucpFsMJT;q-=Fn!&%{Z>OU&}fP26xh zv~0-juolMAjFXJ}ik>lXG;=f&6A@D5bh%KxWPLfPH91yWjCnqG_AC`XRZ;Zx6wFN) z){x54CIA5BD)t%20=#_31MH;Q*?y-*DY+Ny9c|!-@)^-4Jk7fs|r8M2NfhyjSk(&InH&u)5RnP}4euP|IHL50}Oj40%e z*#|iFuP&mzlw$0S;;*YmNv%UC_H$dwbh3~X%BC%&amVh5JaPE*TyCX#YyGnv)=4d- zd`96q0y>fD(yd+HJl`Bw&I|9AxDCbf-ZTpV<;Q$L~DAM0gp;@nrYskH)!c zsMVdKZB5FWxzOnTCfD^F2eb*M+-4@)_crP!K%{5p$5T{pbq!@FjYaUc`&?rS4gpXJ zIQHm1wUrUJ^CeqpH^bMxLNYPxSH%jTFIRqt==Sgqnao}$e)Z3VDiI-(u&P)cy+<72`_`%ZG_Lm&is)0({9mbBwCODKFWOY7Y!R@r=O-T3 zv7z{e+GL6uB#PX}xny@HM_|0EKHo3vSz5lVFD;oQjtg{FRaIpJ91Q+B2dz>26}nr; z1=&kSX;grzxy)qbwoW^KmBsJH^2S#+X+2u8y&kJ?6h>R`ILW!PRkFLkJb}+j#YZS~-D}@h#VfbZfmHH1i_6Qok@(J3|AhiLPm}CQtlk31fz3V;Zjv){iXk}nTWq4k^`rzaL0Ik&2x+RNTNjz^d`Mygs e#~|uQAY`60K^fz%b>ZmyYKoK4&Ds~6KmXZnZT)`$ literal 0 HcmV?d00001 diff --git a/data/ui/loadingscreen.ui b/data/ui/loadingscreen.ui new file mode 100644 index 00000000..650d1d50 --- /dev/null +++ b/data/ui/loadingscreen.ui @@ -0,0 +1,42 @@ + + + + + diff --git a/minigalaxy/api.py b/minigalaxy/api.py index 7c0a0f39..e9019dc0 100644 --- a/minigalaxy/api.py +++ b/minigalaxy/api.py @@ -1,5 +1,4 @@ import http -import os import time from urllib.parse import urlencode import requests @@ -27,7 +26,6 @@ def __init__(self, config: Config, session: Session): self.redirect_uri = "https://embed.gog.com/on_login_success?origin=client" self.client_id = "46899977096215655" self.client_secret = "9d85c43b1482497dbbce61f6e4aa173a433796eeae2ca8c5f6129f2dc4de46d9" - self.debug = os.environ.get("MG_DEBUG") self.active_token = False self.active_token_expiration_time = time.time() self.conn_check_thpool = ThreadPoolExecutor(max_workers=2) @@ -284,8 +282,7 @@ def __request(self, url: str = None, params: dict = None) -> dict: result = {} try: response = self.session.get(url, headers=headers, params=params) - if self.debug: - logger.debug("Request %s, return code %s, response body %s", url, response.status_code, response.text) + logger.debug("Request %s, return code %s, response body %s", url, response.status_code, response.text) if response.status_code < 300: result = response.json() except requests.exceptions.RequestException: diff --git a/minigalaxy/paths.py b/minigalaxy/paths.py index 470ef6ca..65d455c0 100644 --- a/minigalaxy/paths.py +++ b/minigalaxy/paths.py @@ -27,6 +27,10 @@ os.path.join(LAUNCH_DIR, "../share/icons/hicolor/192x192/apps/io.github.sharkwouter.Minigalaxy.png") ) +SPLASH_IMAGE_PATH = os.path.abspath(os.path.join(LAUNCH_DIR, "../data/images/spiral_galaxy.jpg")) +if not os.path.exists(SPLASH_IMAGE_PATH): + SPLASH_IMAGE_PATH = os.path.abspath(os.path.join(LAUNCH_DIR, "../share/minigalaxy/images/spiral_galaxy.jpg")) + ICON_WINE_PATH = os.path.abspath(os.path.join(LAUNCH_DIR, "../data/images/winehq_logo_glass.png")) if not os.path.exists(ICON_WINE_PATH): ICON_WINE_PATH = os.path.abspath(os.path.join(LAUNCH_DIR, "../share/minigalaxy/images/winehq_logo_glass.png")) diff --git a/minigalaxy/ui/__init__.py b/minigalaxy/ui/__init__.py index 34f2dcd5..bfce42a2 100644 --- a/minigalaxy/ui/__init__.py +++ b/minigalaxy/ui/__init__.py @@ -3,3 +3,4 @@ from minigalaxy.ui.window import Window # noqa: F401 from minigalaxy.ui.preferences import Preferences # noqa: F401 from minigalaxy.ui.gametile import GameTile # noqa: F401 +from minigalaxy.ui.loadingscreen import LoadingScreen # noqa: F401 diff --git a/minigalaxy/ui/gametile.py b/minigalaxy/ui/gametile.py index 0f378eaa..443043ec 100644 --- a/minigalaxy/ui/gametile.py +++ b/minigalaxy/ui/gametile.py @@ -19,8 +19,6 @@ from minigalaxy.paths import ICON_WINE_PATH from minigalaxy.api import NoDownloadLinkFound, Api from minigalaxy.ui.gtk import Gtk, GLib, Notify -from minigalaxy.ui.information import Information -from minigalaxy.ui.properties import Properties @Gtk.Template.from_file(os.path.join(UI_DIR, "gametile.ui")) @@ -41,7 +39,8 @@ class GameTile(Gtk.Box): menu_button_properties = Gtk.Template.Child() progress_bar = Gtk.Template.Child() - def __init__(self, parent, game: Game, config: Config, api: Api, download_manager: DownloadManager): + def __init__(self, parent, game: Game, config: Config, api: Api, download_manager: DownloadManager, + show_properties_callback, show_information_callback): self.config = config current_locale = self.config.locale default_locale = locale.getdefaultlocale()[0] @@ -63,6 +62,8 @@ def __init__(self, parent, game: Game, config: Config, api: Api, download_manage self.download_list = [] self.dlc_dict = {} self.current_state = State.DOWNLOADABLE + self.show_information_callback = show_information_callback + self.show_properties_callback = show_properties_callback self.image.set_tooltip_text(self.game.name) @@ -129,16 +130,12 @@ def on_button_click(self, widget) -> None: self.parent.parent.show_error(_("Failed to start {}:").format(self.game.name), err_msg) @Gtk.Template.Callback("on_menu_button_information_clicked") - def show_information(self, button): - information_window = Information(self, self.game, self.config, self.api, self.download_manager) - information_window.run() - information_window.destroy() + def on_menu_button_information(self, button): + self.show_information_callback(self.game, self.download_manager) @Gtk.Template.Callback("on_menu_button_properties_clicked") - def show_properties(self, button): - properties_window = Properties(self, self.game, self.api) - properties_window.run() - properties_window.destroy() + def on_menu_button_properties(self, button): + self.show_properties_callback(self.game) @Gtk.Template.Callback("on_button_cancel_clicked") def on_button_cancel(self, widget): diff --git a/minigalaxy/ui/gametilelist.py b/minigalaxy/ui/gametilelist.py index 542d4be9..22fb4dde 100644 --- a/minigalaxy/ui/gametilelist.py +++ b/minigalaxy/ui/gametilelist.py @@ -20,8 +20,6 @@ from minigalaxy.paths import ICON_WINE_PATH from minigalaxy.api import NoDownloadLinkFound, Api from minigalaxy.ui.gtk import Gtk, GLib, Notify -from minigalaxy.ui.information import Information -from minigalaxy.ui.properties import Properties @Gtk.Template.from_file(os.path.join(UI_DIR, "gametilelist.ui")) @@ -42,7 +40,8 @@ class GameTileList(Gtk.Box): menu_button_properties = Gtk.Template.Child() game_label = Gtk.Template.Child() - def __init__(self, parent, game: Game, config: Config, api: Api, download_manager: DownloadManager): + def __init__(self, parent, game: Game, config: Config, api: Api, download_manager: DownloadManager, + show_properties_callback, show_information_callback): self.config = config current_locale = self.config.locale default_locale = locale.getdefaultlocale()[0] @@ -67,6 +66,8 @@ def __init__(self, parent, game: Game, config: Config, api: Api, download_manage self.download_list = [] self.dlc_dict = {} self.current_state = State.DOWNLOADABLE + self.show_information_callback = show_information_callback + self.show_properties_callback = show_properties_callback self.image.set_tooltip_text(self.game.name) @@ -135,16 +136,12 @@ def on_button_click(self, widget) -> None: self.parent.parent.show_error(_("Failed to start {}:").format(self.game.name), err_msg) @Gtk.Template.Callback("on_menu_button_information_clicked") - def show_information(self, button): - information_window = Information(self, self.game, self.config, self.api, self.download_manager) - information_window.run() - information_window.destroy() + def on_menu_button_information(self, button): + self.show_information_callback(self.game, self.download_manager) @Gtk.Template.Callback("on_menu_button_properties_clicked") - def show_properties(self, button): - properties_window = Properties(self, self.game, self.api) - properties_window.run() - properties_window.destroy() + def on_menu_button_properties(self, button): + self.show_properties_callback(self.game) @Gtk.Template.Callback("on_button_cancel_clicked") def on_button_cancel(self, widget): diff --git a/minigalaxy/ui/information.py b/minigalaxy/ui/information.py index 58b8ce45..b75b677b 100644 --- a/minigalaxy/ui/information.py +++ b/minigalaxy/ui/information.py @@ -26,7 +26,7 @@ class Information(Gtk.Dialog): label_game_description = Gtk.Template.Child() def __init__(self, parent, game, config: Config, api: Api, download_manager: DownloadManager): - Gtk.Dialog.__init__(self, title=_("Information about {}").format(game.name), parent=parent.parent.parent, + Gtk.Dialog.__init__(self, title=_("Information about {}").format(game.name), parent=parent, modal=True) self.parent = parent self.game = game diff --git a/minigalaxy/ui/library.py b/minigalaxy/ui/library.py index 0db39502..d3e647e7 100644 --- a/minigalaxy/ui/library.py +++ b/minigalaxy/ui/library.py @@ -24,9 +24,8 @@ class Library(Gtk.Viewport): flowbox = Gtk.Template.Child() - def __init__(self, parent, config: Config, api: Api, download_manager: DownloadManager): + def __init__(self, config: Config, api: Api, download_manager: DownloadManager): Gtk.Viewport.__init__(self) - self.parent = parent self.config = config self.api = api self.download_manager = download_manager @@ -38,6 +37,28 @@ def __init__(self, parent, config: Config, api: Api, download_manager: DownloadM self._queue = [] self.category_filters = [] + def initialize(self, loading_screen, window): + worker_thread = threading.Thread(target=lambda: self._do_initialization(loading_screen, window)) + worker_thread.start() + + def _do_initialization(self, loading_screen, window): + logger.debug("Checking API connectivity...") + self.offline = not self.api.can_connect() + logger.debug("Done checking API connectivity, status: %s", "offline" if self.offline else "online") + if not self.offline: + try: + logger.debug("Authenticating...") + window.authenticate() + logger.debug("Authenticated as %s", self.api.get_user_info()) + window.set_subtitle(self.api.get_user_info()) + except Exception: + logger.warn("Starting in offline mode after receiving exception", exc_info=1) + self.offline = True + self.update_library(window.show_error, window.show_properties, window.show_information) + logger.debug("Worker thread done, closing loading screen, showing main window") + loading_screen.destroy() + window.show_all() + def _debounce(self, thunk): if thunk not in self._queue: self._queue.append(thunk) @@ -48,28 +69,32 @@ def _run_queue(self): for thunk in queue: GLib.idle_add(thunk) - def reset(self): + def reset(self, show_error_callback, show_properties_callback, show_information_callback): self.games = [] for child in self.flowbox.get_children(): self.flowbox.remove(child) self.flowbox.show_all() - self.update_library() + self.update_library(show_error_callback, show_properties_callback, show_information_callback) - def update_library(self) -> None: - library_update_thread = threading.Thread(target=self.__update_library) + def update_library(self, show_error_callback, show_properties_callback, show_information_callback) -> None: + library_update_thread = threading.Thread(target=self.__update_library, args=[show_error_callback, + show_properties_callback, + show_information_callback]) library_update_thread.daemon = True library_update_thread.start() - def __update_library(self): + def __update_library(self, show_error_callback, show_properties_callback, show_information_callback): GLib.idle_add(self.__load_tile_states) self.owned_products_ids = self.api.get_owned_products_ids() # Get already installed games first self.games = self.__get_installed_games() - GLib.idle_add(self.__create_gametiles) + GLib.idle_add(self.__create_gametiles, show_properties_callback, show_information_callback) # Get games from the API - self.__add_games_from_api() - GLib.idle_add(self.__create_gametiles) + is_offline, err_msg = self.__add_games_from_api() + if is_offline: + GLib.idle_add(show_error_callback, _("Failed to retrieve library"), _(err_msg)) + GLib.idle_add(self.__create_gametiles, show_properties_callback, show_information_callback) GLib.idle_add(self.filter_library) def __load_tile_states(self): @@ -113,7 +138,7 @@ def __sort_library_func(self, child1, child2): tile2 = child2.get_children()[0].game return tile2 < tile1 - def __create_gametiles(self) -> None: + def __create_gametiles(self, show_properties_callback, show_information_callback) -> None: games_with_tiles = [] for child in self.flowbox.get_children(): tile = child.get_children()[0] @@ -122,14 +147,16 @@ def __create_gametiles(self) -> None: for game in self.games: if game not in games_with_tiles: - self.__add_gametile(game) + self.__add_gametile(game, show_properties_callback, show_information_callback) - def __add_gametile(self, game): + def __add_gametile(self, game, show_properties_callback, show_information_callback): view = self.config.view if view == "grid": - self.flowbox.add(GameTile(self, game, self.config, self.api, self.download_manager)) + self.flowbox.add(GameTile(self, game, self.config, self.api, self.download_manager, + show_properties_callback, show_information_callback)) elif view == "list": - self.flowbox.add(GameTileList(self, game, self.config, self.api, self.download_manager)) + self.flowbox.add(GameTileList(self, game, self.config, self.api, self.download_manager, + show_properties_callback, show_information_callback)) self._debounce(self.sort_library) self._debounce(self.flowbox.show_all) @@ -172,7 +199,6 @@ def __add_games_from_api(self): else: self.offline = True logger.info("Client is offline, showing installed games only") - GLib.idle_add(self.parent.show_error, _("Failed to retrieve library"), _(err_msg)) game_category_dict = {} for game in retrieved_games: if game not in self.games: @@ -186,6 +212,7 @@ def __add_games_from_api(self): if len(game.category) > 0: # exclude games without set category game_category_dict[game.name] = game.category update_game_categories_file(game_category_dict, CATEGORIES_FILE_PATH) + return self.offline, err_msg def get_installed_windows_games(full_path, game_categories_dict=None): diff --git a/minigalaxy/ui/loadingscreen.py b/minigalaxy/ui/loadingscreen.py new file mode 100644 index 00000000..a1b317db --- /dev/null +++ b/minigalaxy/ui/loadingscreen.py @@ -0,0 +1,17 @@ +import os + +from minigalaxy.paths import UI_DIR, SPLASH_IMAGE_PATH +from minigalaxy.ui.gtk import Gtk + + +@Gtk.Template.from_file(os.path.join(UI_DIR, "loadingscreen.ui")) +class LoadingScreen(Gtk.Dialog): + __gtype_name__ = "LoadingScreen" + + splash_image = Gtk.Template.Child() + splash_label = Gtk.Template.Child() + + def __init__(self): + super().__init__(title="Loading - Minigalaxy", modal=True) + self.splash_image.set_from_file(SPLASH_IMAGE_PATH) + self.show_all() diff --git a/minigalaxy/ui/properties.py b/minigalaxy/ui/properties.py index ec8eacac..a478168f 100644 --- a/minigalaxy/ui/properties.py +++ b/minigalaxy/ui/properties.py @@ -31,7 +31,7 @@ class Properties(Gtk.Dialog): label_wine_custom = Gtk.Template.Child() def __init__(self, parent, game, api): - Gtk.Dialog.__init__(self, title=_("Properties of {}").format(game.name), parent=parent.parent.parent, + Gtk.Dialog.__init__(self, title=_("Properties of {}").format(game.name), parent=parent, modal=True) self.parent = parent self.game = game diff --git a/minigalaxy/ui/window.py b/minigalaxy/ui/window.py index 20fb2977..b07a533f 100644 --- a/minigalaxy/ui/window.py +++ b/minigalaxy/ui/window.py @@ -2,8 +2,10 @@ import locale from minigalaxy.download_manager import DownloadManager +from minigalaxy.game import Game from minigalaxy.logger import logger from minigalaxy.ui.categoryfilters import CategoryFilters +from minigalaxy.ui.information import Information from minigalaxy.ui.login import Login from minigalaxy.ui.preferences import Preferences from minigalaxy.ui.about import About @@ -13,6 +15,7 @@ from minigalaxy.ui.library import Library from minigalaxy.ui.gtk import Gtk, Gdk, GdkPixbuf, Notify from minigalaxy.config import Config +from minigalaxy.ui.properties import Properties @Gtk.Template.from_file(os.path.join(UI_DIR, "application.ui")) @@ -28,7 +31,7 @@ class Window(Gtk.ApplicationWindow): menu_logout = Gtk.Template.Child() window_library = Gtk.Template.Child() - def __init__(self, config: Config, api: 'Api', download_manager: DownloadManager, name="Minigalaxy"): + def __init__(self, config: Config, api: 'Api', library: Library, name="Minigalaxy"): current_locale = config.locale default_locale = locale.getdefaultlocale()[0] if current_locale == '': @@ -43,14 +46,11 @@ def __init__(self, config: Config, api: 'Api', download_manager: DownloadManager self.api = api self.config = config self.search_string = "" - self.offline = False # Initialize notifications module Notify.init("minigalaxy") - # Set library - self.library = Library(self, config, api, download_manager) - + self.library = library self.window_library.add(self.library) self.header_installed.set_active(self.config.installed_filter) @@ -65,28 +65,12 @@ def __init__(self, config: Config, api: 'Api', download_manager: DownloadManager else: settings.set_property("gtk-application-prefer-dark-theme", False) - # Show the window + # Maximize the window if self.config.keep_window_maximized: self.maximize() - self.show_all() self.make_directories() - # Interact with the API - logger.debug("Checking API connectivity...") - self.offline = not self.api.can_connect() - logger.debug("Done checking API connectivity, status: %s", "offline" if self.offline else "online") - if not self.offline: - try: - logger.debug("Authenticating...") - self.__authenticate() - logger.debug("Authenticated as: %s", self.api.get_user_info()) - self.HeaderBar.set_subtitle(self.api.get_user_info()) - except Exception: - logger.warn("Starting in offline mode after receiving exception", exc_info=1) - self.offline = True - self.sync_library() - @Gtk.Template.Callback("filter_library") def filter_library(self, switch, _=""): self.library.filter_library(switch) @@ -111,17 +95,28 @@ def show_categories(self, button): category_filters_window.run() category_filters_window.destroy() + def show_properties(self, game: Game): + properties_window = Properties(self, game, self.api) + properties_window.run() + properties_window.destroy() + + def show_information(self, game: Game, download_manager: DownloadManager): + information_window = Information(self, game, self.config, self.api, download_manager) + information_window.run() + information_window.destroy() + @Gtk.Template.Callback("on_menu_logout_clicked") def logout(self, button): question = _("Are you sure you want to log out of GOG?") if self.show_question(question): + logger.debug("Logging user %s out", self.config.username) # Unset everything which is specific to this user self.HeaderBar.set_subtitle("") self.config.username = "" self.config.refresh_token = "" self.hide() # Show the login screen - self.__authenticate() + self.authenticate() self.HeaderBar.set_subtitle(self.api.get_user_info()) self.sync_library() self.show_all() @@ -136,8 +131,8 @@ def on_window_state_event(self, widget, event): @Gtk.Template.Callback("on_header_sync_clicked") def sync_library(self, _=""): if self.library.offline: - self.__authenticate() - self.library.update_library() + self.authenticate() + self.library.update_library(self.show_error, self.show_properties, self.show_information) def make_directories(self): # Create the thumbnails directory @@ -150,11 +145,11 @@ def make_directories(self): if not os.path.exists(ICON_DIR): os.makedirs(ICON_DIR, mode=0o755) - def reset_library(self): - self.library.reset() + def set_subtitle(self, subtitle_text): + self.HeaderBar.set_subtitle(subtitle_text) - def update_library(self): - self.library.update_library() + def reset_library(self): + self.library.reset(self.show_error, self.show_properties, self.show_information) def show_error(self, text, secondary_text=""): dialog = Gtk.MessageDialog( @@ -190,7 +185,7 @@ def show_question(self, text, secondary_text=""): The token is not valid for a long time """ - def __authenticate(self): + def authenticate(self): url = None if self.config.stay_logged_in: token = self.config.refresh_token diff --git a/tests/test_ui_library.py b/tests/test_ui_library.py index 30774159..c6f0e850 100644 --- a/tests/test_ui_library.py +++ b/tests/test_ui_library.py @@ -2,6 +2,7 @@ import os import sys import uuid +from json import JSONDecodeError from unittest import TestCase, mock from unittest.mock import MagicMock, patch, mock_open import tempfile @@ -13,10 +14,13 @@ m_gametile = MagicMock() m_gametilelist = MagicMock() m_categoryfilters = MagicMock() +m_loadingscreen = MagicMock() class UnitTestGtkTemplate: + Callback = MagicMock() + def __init__(self): self.Child = m_gtk @@ -34,6 +38,10 @@ class Gtk: Template = UnitTestGtkTemplate() Widget = m_gtk + Box = m_gtk + Dialog = m_gtk + AboutDialog = m_gtk + ApplicationWindow = m_gtk class Viewport: pass @@ -47,8 +55,7 @@ class GdkPixbuf: class Gio: pass - class GLib: - pass + GLib = MagicMock() class Notify: pass @@ -62,6 +69,7 @@ class Notify: sys.modules['minigalaxy.ui.gametile'] = m_gametile sys.modules['minigalaxy.ui.gametilelist'] = m_gametilelist sys.modules['minigalaxy.ui.categoryfilters'] = m_categoryfilters +sys.modules['minigalaxy.ui.loadingscreen'] = m_loadingscreen from minigalaxy.game import Game # noqa: E402 from minigalaxy.ui.library import Library, get_installed_windows_games, read_game_categories_file, \ update_game_categories_file # noqa: E402 @@ -79,6 +87,56 @@ class Notify: class TestLibrary(TestCase): + + def test_init_happy_path(self): + with patch('os.listdir', return_value=[]): + config_mock = MagicMock() + config_mock.locale = "en_US.UTF-8" + config_mock.keep_window_maximized = False + api_mock = MagicMock() + api_mock.authenticate.return_value = True + download_manager_mock = MagicMock() + test_library = Library(config=config_mock, api=api_mock, download_manager=download_manager_mock) + loading_screen_mock = MagicMock() + window_mock = MagicMock() + test_library._do_initialization(loading_screen_mock, window_mock) + expected = False + actual = test_library.offline + self.assertEqual(expected, actual) + window_mock.authenticate.assert_called_once() + + def test_init_fallback_to_offline_mode(self): + with patch('os.listdir', return_value=[]): + config = MagicMock() + config.locale = "en_US.UTF-8" + config.keep_window_maximized = False + api = MagicMock() + api.can_connect.return_value = False + download_manager = MagicMock() + test_library = Library(config=config, api=api, download_manager=download_manager) + loading_screen_mock = MagicMock() + window_mock = MagicMock() + test_library._do_initialization(loading_screen_mock, window_mock) + expected = True + actual = test_library.offline + self.assertEqual(expected, actual) + + def test_init_network_error_should_lead_to_offline_mode(self): + with patch('os.listdir', return_value=[]): + config = MagicMock() + config.locale = "en_US.UTF-8" + config.keep_window_maximized = False + api = MagicMock() + download_manager = MagicMock() + test_library = Library(config=config, api=api, download_manager=download_manager) + loading_screen_mock = MagicMock() + window_mock = MagicMock() + window_mock.authenticate.side_effect = JSONDecodeError(msg='mock', doc='mock', pos=0) + test_library._do_initialization(loading_screen_mock, window_mock) + expected = True + actual = test_library.offline + self.assertEqual(expected, actual) + def test1_add_games_from_api(self): self_games = [] for game in SELF_GAMES: @@ -90,7 +148,8 @@ def test1_add_games_from_api(self): config = MagicMock() api_mock = MagicMock() api_mock.get_library.return_value = api_games, err_msg - test_library = Library(MagicMock(), config, api_mock, MagicMock()) + download_manager = MagicMock() + test_library = Library(config=config, api=api_mock, download_manager=download_manager) test_library.games = self_games test_library._Library__add_games_from_api() exp = len(API_GAMES) @@ -108,7 +167,8 @@ def test2_add_games_from_api(self): config = MagicMock() api_mock = MagicMock() api_mock.get_library.return_value = api_games, err_msg - test_library = Library(MagicMock(), config, api_mock, MagicMock()) + download_manager = MagicMock() + test_library = Library(config=config, api=api_mock, download_manager=download_manager) test_library.games = self_games test_library._Library__add_games_from_api() exp = True @@ -129,7 +189,8 @@ def test3_add_games_from_api(self): config = MagicMock() api_mock = MagicMock() api_mock.get_library.return_value = api_games, err_msg - test_library = Library(MagicMock(), config, api_mock, MagicMock()) + download_manager = MagicMock() + test_library = Library(config=config, api=api_mock, download_manager=download_manager) test_library.games = self_games test_library._Library__add_games_from_api() exp = True @@ -152,7 +213,8 @@ def test4_add_games_from_api(self): config = MagicMock() api_mock = MagicMock() api_mock.get_library.return_value = api_games, err_msg - test_library = Library(MagicMock(), config, api_mock, MagicMock()) + download_manager = MagicMock() + test_library = Library(config=config, api=api_mock, download_manager=download_manager) test_library.games = self_games test_library._Library__add_games_from_api() exp = "http://test_url1" @@ -170,7 +232,8 @@ def test5_add_games_from_api(self): config = MagicMock() api_mock = MagicMock() api_mock.get_library.return_value = api_games, err_msg - test_library = Library(MagicMock(), config, api_mock, MagicMock()) + download_manager = MagicMock() + test_library = Library(config=config, api=api_mock, download_manager=download_manager) test_library.games = self_games test_library._Library__add_games_from_api() exp = "Neverwinter Nights: Enhanced Edition" @@ -184,7 +247,8 @@ def test6_add_games_from_api(self): config = MagicMock() api_mock = MagicMock() api_mock.get_library.return_value = api_games, err_msg - test_library = Library(MagicMock(), config, api_mock, MagicMock()) + download_manager = MagicMock() + test_library = Library(config=config, api=api_mock, download_manager=download_manager) test_library.games = self_games test_library._Library__add_games_from_api() exp = 1 diff --git a/tests/test_ui_window.py b/tests/test_ui_window.py index 8725c731..b87098a5 100644 --- a/tests/test_ui_window.py +++ b/tests/test_ui_window.py @@ -1,7 +1,6 @@ import sys -from unittest import TestCase -from unittest.mock import MagicMock, patch -from simplejson.errors import JSONDecodeError +from unittest import TestCase, skip +from unittest.mock import MagicMock m_gtk = MagicMock() m_gi = MagicMock() @@ -10,6 +9,9 @@ m_login = MagicMock() m_about = MagicMock() m_categoryfilters = MagicMock() +m_properties = MagicMock() +m_information = MagicMock() +m_game = MagicMock() class UnitTestGtkTemplate: @@ -58,44 +60,16 @@ def __init__(self, title): sys.modules['minigalaxy.ui.about'] = m_about sys.modules['minigalaxy.ui.gtk'] = u_gi_repository sys.modules['minigalaxy.ui.categoryfilters'] = m_categoryfilters -from minigalaxy.ui.window import Window # noqa: E402 +sys.modules['minigalaxy.ui.properties'] = m_properties +sys.modules['minigalaxy.ui.information'] = m_information +sys.modules['minigalaxy.ui.game'] = m_game +# from minigalaxy.ui.window import Window # noqa: E402 class TestWindow(TestCase): + @skip("no significant logic to test left in constructor") def test1_init(self): - with patch('minigalaxy.ui.window.Api.can_connect', return_value=False): - config = MagicMock() - config.locale = "en_US.UTF-8" - config.keep_window_maximized = False - api = MagicMock() - api.can_connect.return_value = False - test_window = Window(api=api, config=config, download_manager=MagicMock()) - exp = True - obs = test_window.offline - self.assertEqual(exp, obs) - - def test2_init(self): - config = MagicMock() - config.locale = "en_US.UTF-8" - config.keep_window_maximized = False - api = MagicMock() - api.authenticate.return_value = True - test_window = Window(api=api, config=config, download_manager=MagicMock()) - exp = False - obs = test_window.offline - self.assertEqual(exp, obs) - api.authenticate.assert_called_once() - - def test3_init(self): - config = MagicMock() - config.locale = "en_US.UTF-8" - config.keep_window_maximized = False - api = MagicMock() - api.authenticate.side_effect = JSONDecodeError(msg='mock', doc='mock', pos=0) - test_window = Window(api=api, config=config, download_manager=MagicMock()) - exp = True - obs = test_window.offline - self.assertEqual(exp, obs) + pass del sys.modules['gi'] @@ -105,3 +79,7 @@ def test3_init(self): del sys.modules['minigalaxy.ui.login'] del sys.modules['minigalaxy.ui.about'] del sys.modules['minigalaxy.ui.gtk'] +del sys.modules['minigalaxy.ui.categoryfilters'] +del sys.modules['minigalaxy.ui.properties'] +del sys.modules['minigalaxy.ui.information'] +del sys.modules['minigalaxy.ui.game'] From 17ed53256e65988abcd9f83e71ce81af6abe72af Mon Sep 17 00:00:00 2001 From: orende <1337decker@gmail.com> Date: Tue, 25 Jul 2023 11:39:07 +0800 Subject: [PATCH 2/3] Add two more ignored game ids to constants Adds game ids for "Cyberpunk 2077 Digital Goodies" and "Xenonauts 2 alpha demo". --- minigalaxy/constants.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/minigalaxy/constants.py b/minigalaxy/constants.py index d70290b3..8beda426 100644 --- a/minigalaxy/constants.py +++ b/minigalaxy/constants.py @@ -59,8 +59,10 @@ 1980301910, # The Witcher Goodies Collection 2005648906, # Spring Sale Goodies Collection #1 1486144755, # Cyberpunk 2077 Goodies Collection + 1548764757, # Cyberpunk 2077 Digital Goodies 1581684020, # A Plague Tale Digital Goodies Pack 1185685769, # CDPR Goodie Pack Content + 1497289938, # Xenonauts 2 alpha demo ] DOWNLOAD_CHUNK_SIZE = 1024 * 1024 # 1 MB From 58e8c47d64abb3a96a40aba699a20aa104876d16 Mon Sep 17 00:00:00 2001 From: orende <1337decker@gmail.com> Date: Wed, 6 Sep 2023 15:58:36 +0200 Subject: [PATCH 3/3] Update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2dfe16d..a5a1b631 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +**1.2.6** +- Show a loading screen on startup (thanks to orende) +- Hide Cyberpunk 2077 Digital Goodies and Xenonauts 2 Alpha demo (thanks to orende) + **1.2.5** - Fix filtering for installed games