Source code for seriesmarker.gui.model.decorated_node
#==============================================================================
# -*- coding: utf-8 -*-
#
# Copyright (C) 2013 - 2016 Tobias Röttger <toroettg@gmail.com>
#
# This file is part of SeriesMarker.
#
# SeriesMarker is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 3 as
# published by the Free Software Foundation.
#
# SeriesMarker 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 SeriesMarker. If not, see <http://www.gnu.org/licenses/>.
#==============================================================================
from PySide.QtGui import QPixmap, QPixmapCache
from PySide.QtCore import Qt
from seriesmarker.net.banner_loader import banner_loader
pixmap_cache = QPixmapCache()
[docs]class DecoratedNode(object):
"""Class to handle the decoration of nodes with banners."""
[docs] def __init__(self, scale=None, cache=True):
"""Initializes a new instance.
Also defines if and to which size a banner should be scaled to
and if the banner should be cached for further usage.
:param scale: Defines the size to scale a banner to if given.
:type scale: :class:`.PySide.QtCore.QSize`
:param cache: Defines whether or not a loaded banner should be
cached on disk.
:type cache: bool
"""
super().__init__()
self._scale = scale
self._cache = cache
[docs] def banner_url(self):
"""Describes a unique string for banner identification.
:returns: The URL of the node's banner.
"""
return None
[docs] def decoration(self, index):
"""Defines the decoration of the node.
Tries to load a banner from the URL, defined by :py:meth:`banner_url`,
sets a default image while loading and in case the attempt to
obtain a banner was unsuccesful. If a banner has been cached for the
given URL, the cached image will be used instead.
:param index: The index referring to the node to get decoration for.
:type index: :class:`~.PySide.QtCore.QModelIndex`
:returns: The :class:`PySide.QtGui.Pixmap` to use as the node's decoration.
"""
pixmap = QPixmap()
banner_url = self.banner_url()
if banner_url:
placeholder = ":/icons/image-loading.png"
fetch = True
else:
banner_url = placeholder = ":/icons/image-missing.png"
fetch = False
if not pixmap_cache.find(banner_url, pixmap):
if fetch:
banner_loader.fetch_banner(banner_url, index, self._cache)
pixmap.load(placeholder)
if self._scale:
pixmap = pixmap.scaled(self._scale, Qt.AspectRatioMode.KeepAspectRatio)
pixmap_cache.insert(banner_url, pixmap)
return pixmap
[docs] def banner_loaded(self, pixmap):
"""Adds a banner, loaded by :class:`.BannerLoader`, to the cache.
If a scale size was given while initialization, also scales the
banner before adding it to the cache.
:param pixmap: The pixmap containing the banner to cache.
:type pixmap: :class:`PySide.QtGui.Pixmap`
"""
if self._scale:
pixmap = pixmap.scaled(self._scale, Qt.AspectRatioMode.KeepAspectRatio)
pixmap_cache.insert(self.banner_url(), pixmap)