|
| 1 | +import sys |
| 2 | + |
1 | 3 | from kivy import Logger
|
2 | 4 | from kivy.app import App
|
3 | 5 | from kivy.clock import Clock
|
4 | 6 | from kivy.lang import Builder
|
| 7 | +from kivy.properties import ObjectProperty |
5 | 8 | from kivy.uix.screenmanager import Screen
|
6 | 9 |
|
7 | 10 | # Load KV file for this screen
|
8 | 11 | from utils.Screens import Screens
|
| 12 | +from utils.async_requests.AsyncResult import AsyncResult |
9 | 13 |
|
10 | 14 | Builder.load_file('kvs/StartupScreen.kv')
|
11 | 15 |
|
12 | 16 |
|
13 | 17 | class StartupScreen(Screen):
|
| 18 | + users_loaded: AsyncResult = ObjectProperty() |
| 19 | + categories_loaded: AsyncResult = ObjectProperty() |
| 20 | + products_loaded: AsyncResult = ObjectProperty() |
| 21 | + |
14 | 22 | def __init__(self, **kwargs):
|
15 | 23 | # call to user with arguments
|
16 | 24 | super(StartupScreen, self).__init__(**kwargs)
|
17 | 25 |
|
18 |
| - # Keep track of when data is loaded |
19 |
| - self.users_loaded = False |
20 |
| - self.categories_loaded = False |
21 |
| - self.products_loaded = False |
22 |
| - |
23 | 26 | # Calls upon entry of this screen
|
24 | 27 | #
|
25 | 28 | def on_enter(self, *args):
|
26 |
| - self.ids.loading_text.text = "Waiting for data to load..." |
27 |
| - |
28 |
| - App.get_running_app().loop.call_soon_threadsafe(self.wait_for_data_to_load) |
| 29 | + App.get_running_app().loop.call_soon_threadsafe(self.check_if_all_data_is_loaded) |
29 | 30 |
|
30 | 31 | # Called when all data has loaded
|
31 | 32 | def finished_loading(self, dt):
|
32 | 33 | self.manager.current = Screens.DEFAULT_SCREEN.value
|
33 | 34 |
|
34 |
| - # Called when we're waiting for the data to load |
35 |
| - def wait_for_data_to_load(self): |
| 35 | + def on_users_loaded(self, _, _2): |
| 36 | + self.check_if_all_data_is_loaded() |
36 | 37 |
|
37 |
| - all_data_loaded = True |
| 38 | + def on_categories_loaded(self, _, _2): |
| 39 | + self.check_if_all_data_is_loaded() |
38 | 40 |
|
39 |
| - if not self.users_loaded: |
40 |
| - all_data_loaded = False |
| 41 | + def on_products_loaded(self, _, _2): |
| 42 | + self.check_if_all_data_is_loaded() |
| 43 | + |
| 44 | + def check_if_all_data_is_loaded(self) -> None: |
| 45 | + |
| 46 | + self.set_loading_text("Waiting for data to load... (0/3)") |
| 47 | + |
| 48 | + if self.users_loaded is None or self.users_loaded.result is None: |
41 | 49 | Logger.debug("StellaPayUI: Waiting for users to load..")
|
| 50 | + return |
| 51 | + elif self.users_loaded.received_result is False or self.users_loaded.result.data is False: |
| 52 | + self.set_loading_text("Failed to retrieve user data!") |
| 53 | + self.on_failed_to_load() |
| 54 | + return |
| 55 | + elif self.users_loaded.result.data is True: |
| 56 | + Logger.debug("StellaPayUI: Loaded user data!") |
42 | 57 |
|
43 |
| - if not self.products_loaded: |
44 |
| - all_data_loaded = False |
45 |
| - Logger.debug("StellaPayUI: Waiting for products to load..") |
| 58 | + self.set_loading_text("Waiting for data to load... (1/3)") |
46 | 59 |
|
47 |
| - if not self.categories_loaded: |
48 |
| - all_data_loaded = False |
| 60 | + if self.categories_loaded is None or self.categories_loaded.result is None: |
49 | 61 | Logger.debug("StellaPayUI: Waiting for categories to load..")
|
| 62 | + return |
| 63 | + elif self.categories_loaded.received_result is False or self.categories_loaded.result.data is False: |
| 64 | + self.set_loading_text("Failed to retrieve category data!") |
| 65 | + self.on_failed_to_load() |
| 66 | + return |
| 67 | + elif self.categories_loaded.result.data is True: |
| 68 | + Logger.debug("StellaPayUI: Loaded categories data!") |
| 69 | + |
| 70 | + self.set_loading_text("Waiting for data to load... (2/3)") |
| 71 | + |
| 72 | + if self.products_loaded is None or self.products_loaded.result is None: |
| 73 | + Logger.debug("StellaPayUI: Waiting for products to load..") |
| 74 | + return |
| 75 | + elif self.products_loaded.received_result is False or self.products_loaded.result.data is False: |
| 76 | + self.set_loading_text("Failed to retrieve products data!") |
| 77 | + self.on_failed_to_load() |
| 78 | + return |
| 79 | + elif self.products_loaded.result.data is True: |
| 80 | + Logger.debug("StellaPayUI: Loaded products data!") |
| 81 | + |
| 82 | + self.set_loading_text("Data has loaded!") |
| 83 | + |
| 84 | + self.set_loading_spinner(False) |
| 85 | + |
| 86 | + Clock.schedule_once(self.finished_loading, 1) |
| 87 | + |
| 88 | + def on_failed_to_load(self): |
| 89 | + self.set_loading_spinner(False) |
| 90 | + Clock.schedule_once(lambda: sys.exit(1), 3) |
50 | 91 |
|
51 |
| - if all_data_loaded: |
52 |
| - # After everything has been loaded. |
53 |
| - self.ids.loading_text.text = "Data has loaded!" |
| 92 | + def set_loading_spinner(self, active: bool): |
| 93 | + self.ids.spinner_startup.active = active |
54 | 94 |
|
55 |
| - # Done loading, so call callback in one second. |
56 |
| - Clock.schedule_once(self.finished_loading, 1) |
57 |
| - else: |
58 |
| - # Run the check again |
59 |
| - App.get_running_app().loop.call_later(0.5, self.wait_for_data_to_load) |
| 95 | + def set_loading_text(self, text: str): |
| 96 | + self.ids.loading_text.text = text |
0 commit comments