Browse Source
the grids. Messages are displayed properly now (although the interface doesn't respond properly when messages are selected.)master
Julio Biason
15 years ago
3 changed files with 213 additions and 92 deletions
@ -0,0 +1,125 @@
|
||||
#!/usr/bin/env python |
||||
# -*- coding: utf-8 -*- |
||||
|
||||
# Mitter, a micro-blogging client with multiple interfaces. |
||||
# Copyright (C) 2007-2010 Mitter Contributors |
||||
# |
||||
# This program is free software: you can redistribute it and/or modify |
||||
# it under the terms of the GNU General Public License as published by |
||||
# the Free Software Foundation, either version 3 of the License, or |
||||
# (at your option) any later version. |
||||
# |
||||
# This program is distributed in the hope that it will be useful, |
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
# GNU General Public License for more details. |
||||
# |
||||
# You should have received a copy of the GNU General Public License |
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
|
||||
import logging |
||||
import urllib2 |
||||
|
||||
import gtk |
||||
|
||||
# ---------------------------------------------------------------------- |
||||
# Constants |
||||
# ---------------------------------------------------------------------- |
||||
_log = logging.getLogger('ui.helpers.avatarcache') |
||||
|
||||
# ---------------------------------------------------------------------- |
||||
# The cache class |
||||
# ---------------------------------------------------------------------- |
||||
|
||||
class AvatarCache(object): |
||||
"""An avatar cache, storing GDK pixbufs references.""" |
||||
|
||||
def __init__(self, connection, default, timeout=None): |
||||
"""Initialization of the cache. |
||||
|
||||
connection: |
||||
A :class:`ThreadManager`, which will be used as thread pool to |
||||
request the avatars. |
||||
|
||||
default: |
||||
A gdk_pixbuf to be used as placeholder while the real avatar is |
||||
being downloaded. |
||||
|
||||
timeout: |
||||
Request timeout when downloading the avatars.""" |
||||
|
||||
self._connection = connection |
||||
self._default = default |
||||
self._cache = {} |
||||
self._timeout = timeout |
||||
|
||||
def get(self, owner, avatar, url=None): |
||||
"""Return the avatar from the cache or, if the avatar isn't available |
||||
yet, returns the default avatar and queue the download of it. |
||||
|
||||
owner: |
||||
The object requesting the avatar. Must have a "queue_draw()" |
||||
method, which will be called once the avatar is available. Can be |
||||
None. |
||||
|
||||
avatar: |
||||
The identification of the avatar. Can be any string. |
||||
|
||||
url: |
||||
URL to download the avatar. If not passed, *avatar* **must** be a |
||||
valid URL.""" |
||||
|
||||
if avatar in self._cache: |
||||
return self._cache[avatar] |
||||
|
||||
if not url: |
||||
url = avatar |
||||
|
||||
self._connection.add_work(self._post_avatar_download, |
||||
self._exception_avatar_download, |
||||
self._download_pic, |
||||
avatar, |
||||
url, |
||||
owner) |
||||
|
||||
# add the default avatar in the cache just to avoid a new request for |
||||
# it. It will be overwritten anyway later. |
||||
self._cache[avatar] = self._default |
||||
return self._default |
||||
|
||||
# ------------------------------------------------------------ |
||||
# Network functions |
||||
# ------------------------------------------------------------ |
||||
def _download_pic(self, avatar, url, owner): |
||||
"""Download a picture from the web. Can be used in a thread.""" |
||||
request = urllib2.Request(url=url) |
||||
timeout = self._timeout |
||||
_log.debug('Starting request of %s (timeout %ds)' % ( |
||||
url, timeout)) |
||||
response = urllib2.urlopen(request, timeout=timeout) |
||||
data = response.read() |
||||
_log.debug('Request completed') |
||||
return (avatar, owner, data) |
||||
|
||||
def _post_avatar_download(self, widget, data): |
||||
"""Called after the data from the picture is available.""" |
||||
(avatar, owner, data) = data |
||||
|
||||
loader = gtk.gdk.PixbufLoader() |
||||
loader.write(data) |
||||
loader.close() |
||||
|
||||
user_pic = loader.get_pixbuf() |
||||
user_pic = user_pic.scale_simple(48, 48, gtk.gdk.INTERP_BILINEAR) |
||||
self._cache[avatar] = user_pic |
||||
|
||||
if owner: |
||||
owner.queue_draw() |
||||
return |
||||
|
||||
def _exception_avatar_download(self, widget, exception): |
||||
"""Called in case we have a problem downloading an user avatar.""" |
||||
_log.debug('Exception trying to get an avatar.') |
||||
_log.debug(str(exception)) |
||||
return |
||||
|
Loading…
Reference in new issue