load image for cover panel in its own thread and display spinner icon during loading

This commit is contained in:
coderkun 2016-06-11 12:38:21 +02:00
commit 898f59bd42
2 changed files with 51 additions and 22 deletions

View file

@ -415,30 +415,49 @@
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="homogeneous">True</property> <property name="homogeneous">True</property>
<child> <child>
<object class="GtkScrolledWindow" id="cover-scroll"> <object class="GtkStack" id="cover-stack">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">False</property>
<property name="kinetic_scrolling">False</property>
<property name="overlay_scrolling">False</property>
<signal name="size-allocate" handler="on_cover-scroll_size_allocate" swapped="no"/>
<child> <child>
<object class="GtkViewport"> <object class="GtkSpinner" id="cover-spinner">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
</object>
<packing>
<property name="name">cover-spinner</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="cover-scroll">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="kinetic_scrolling">False</property>
<property name="overlay_scrolling">False</property>
<signal name="size-allocate" handler="on_cover-scroll_size_allocate" swapped="no"/>
<child> <child>
<object class="GtkEventBox"> <object class="GtkViewport">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<child> <child>
<object class="GtkImage" id="cover-image"> <object class="GtkEventBox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="stock">gtk-missing-image</property> <child>
<object class="GtkImage" id="cover-image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-missing-image</property>
</object>
</child>
</object> </object>
</child> </child>
</object> </object>
</child> </child>
</object> </object>
<packing>
<property name="name">cover-scroll</property>
<property name="position">1</property>
</packing>
</child> </child>
</object> </object>
<packing> <packing>

View file

@ -755,6 +755,8 @@ class CoverPanel(mcg.Base):
self._panel = builder.get_object('cover-panel') self._panel = builder.get_object('cover-panel')
self._toolbar = builder.get_object('cover-toolbar') self._toolbar = builder.get_object('cover-toolbar')
# Cover # Cover
self._cover_stack = builder.get_object('cover-stack')
self._cover_spinner = builder.get_object('cover-spinner')
self._cover_scroll = builder.get_object('cover-scroll') self._cover_scroll = builder.get_object('cover-scroll')
self._cover_image = builder.get_object('cover-image') self._cover_image = builder.get_object('cover-image')
# Songs # Songs
@ -813,6 +815,7 @@ class CoverPanel(mcg.Base):
def set_album(self, album): def set_album(self, album):
# Set labels
self._album_title_label.set_markup( self._album_title_label.set_markup(
"<b><big>{}</big></b>".format( "<b><big>{}</big></b>".format(
GObject.markup_escape_text( GObject.markup_escape_text(
@ -834,9 +837,13 @@ class CoverPanel(mcg.Base):
) )
) )
) )
self._set_cover(album)
# Set tracks
self._set_tracks(album) self._set_tracks(album)
# Load cover
threading.Thread(target=self._set_cover, args=(album,)).start()
def set_play(self, pos, time): def set_play(self, pos, time):
if self._timer is not None: if self._timer is not None:
@ -873,18 +880,21 @@ class CoverPanel(mcg.Base):
def _set_cover(self, album): def _set_cover(self, album):
if self._current_album is not None and album.get_hash() == self._current_album.get_hash(): self._cover_stack.set_visible_child(self._cover_spinner)
return self._cover_spinner.start()
self._current_album = album if self._current_album is None or album.get_hash() != self._current_album.get_hash():
url = album.get_cover() self._current_album = album
if url is not None and url is not "": url = album.get_cover()
# Load image and draw it if url is not None and url is not "":
self._cover_pixbuf = Application.load_cover(url) # Load image and draw it
self._resize_image() self._cover_pixbuf = Application.load_cover(url)
else: self._resize_image()
# Reset image else:
self._cover_pixbuf = None # Reset image
self._cover_image.clear() self._cover_pixbuf = None
self._cover_image.clear()
self._cover_stack.set_visible_child(self._cover_scroll)
self._cover_spinner.stop()
def _set_tracks(self, album): def _set_tracks(self, album):