Skip to content
This repository was archived by the owner on Mar 31, 2020. It is now read-only.

Commit 68ab1ed

Browse files
committed
Loading screen
1 parent d0c7e44 commit 68ab1ed

File tree

5 files changed

+47
-24
lines changed

5 files changed

+47
-24
lines changed

src/cache.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,14 @@ def mainloop(self, queue):
7272
profile = self.get_profile()
7373
if profile is not None:
7474
queue.put(profile)
75-
time.sleep(self.ratelimit)
75+
time.sleep(5)
7676

7777
def next(self):
7878
return self.queue.get()
7979

80+
def ready(self):
81+
return not self.queue.empty()
82+
8083
def start(self):
8184
if self.worker is not None and self.worker.is_alive():
8285
self.stop()

src/front.py

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from .cache import ImageCache
88
from .loading import Loading
99

10+
1011
def process_image(image: bytes, width: int, height: int):
1112
im = Image.open(io.BytesIO(image))
1213
im = im.resize((width, height), Image.NEAREST)
@@ -23,19 +24,27 @@ class Front(widget.PrimaryFrame):
2324
_last = None
2425

2526
def __next(self, direction: Direction = None):
26-
data: dict = self.cache.next()
27-
image = process_image(
28-
data.pop('image'),
29-
self.window.winfo_width(),
30-
self.window.winfo_height()
31-
)
32-
name = data.pop('name')
33-
self.__load(name, image, data)
34-
if direction is None:
35-
self.window.set_view(self.image)
36-
else:
27+
if self.cache.ready():
28+
data: dict = self.cache.next()
29+
image = process_image(
30+
data.pop('image'),
31+
self.window.winfo_width(),
32+
self.window.winfo_height()
33+
)
34+
name = data.pop('name')
35+
self.__load(name, image, data)
3736
self.window.change_view(self.image, direction)
3837

38+
else:
39+
loadscreen = Loading(
40+
self.window,
41+
width=self.window.winfo_width(),
42+
height=self.window.winfo_height()
43+
)
44+
self.window.change_view(View(loadscreen, 'widget'), direction)
45+
loadscreen.waitfor(self.cache.ready, self.__next, ('up',))
46+
self.update()
47+
3948
def __load(self, name, image, data):
4049
self.title.config(text=name)
4150
self.image = View(image, 'image')
@@ -72,6 +81,8 @@ def init(self):
7281

7382
self.cache = ImageCache(self.cachesize)
7483
self.cache.start()
84+
85+
def start(self):
7586
self.after(0, self.__next)
7687

7788
def cmd_dislike(self):

src/loading.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,36 @@
1-
from PIL import Image, ImageTk
21
from time import sleep
2+
from PIL import Image, ImageTk
33
from contextlib import suppress
44
from itertools import cycle
5+
from typing import Callable
56

6-
from .widget import SecondaryCanvas
7+
from .widget import PrimaryCanvas
78
from . import IMAGES
89

10+
911
def generate_frames(im: Image):
1012
with suppress(EOFError):
1113
while True:
1214
im.seek(im.tell()+1)
1315
yield ImageTk.PhotoImage(im)
1416

15-
class Loading(SecondaryCanvas):
16-
frames = generate_frames(Image.open(IMAGES / "loading.gif"))
17-
active = True
17+
18+
class Loading(PrimaryCanvas):
19+
image = IMAGES / "loading.gif"
1820
last = 0
21+
limit = 1 / 20
22+
23+
def init(self):
24+
self.frames = generate_frames(Image.open(self.image))
1925

20-
def start(self):
26+
def waitfor(self, condition: Callable, cmd: Callable = None, args=()):
2127
for im in cycle(self.frames):
22-
if not self.active:
28+
if condition():
29+
if cmd is not None:
30+
cmd(*args)
2331
break
2432
if self.last:
2533
self.delete(self.last)
2634
self.last = self.create_image(0, 0, image=im, anchor='nw')
2735
self.update()
28-
29-
def stop(self):
30-
self.active = False
36+
sleep(self.limit)

src/main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ def __init__(self, *args, **kwds):
2424
self.maxsize(400, 500)
2525

2626
self.front = Front(self)
27-
2827
self.front.pack(fill='both', expand=True)
28+
self.front.start()
2929

3030
def cleanup(self):
3131
self.front.cleanup()

src/view.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,10 @@ def move_out(self, view: View, direction: Direction):
7979
self.move_view(view, end)
8080
del self.views[view]
8181

82-
def change_view(self, view: View, direction: Direction):
82+
def change_view(self, view: View, direction: Direction = None):
83+
if direction is None:
84+
self.set_view(view)
85+
return
8386
if not isinstance(direction, Direction):
8487
direction = Direction[direction.upper()] # Cast string for convenience
8588
self.animater.clear()

0 commit comments

Comments
 (0)