Source code for enaml.resource_manager
#------------------------------------------------------------------------------
# Copyright (c) 2012, Enthought, Inc.
# All rights reserved.
#------------------------------------------------------------------------------
import logging
from urlparse import urlparse
from traits.api import HasTraits, Dict, Str
from .icon_provider import IconProvider
from .image_provider import ImageProvider
logger = logging.getLogger(__name__)
[docs]class ResourceManager(HasTraits):
""" A class which manages resource loading for a `Session`.
A `ResourceManager` is used by a `Session` object to load resources
when a url resource request is made by a client session. Users work
with the manager by assigning provider objects associated with a
host name. For example, a user can provide an image for the url
`image://filesystem/c:/foo/bar.png` by assigning an `ImageProvider`
instace to the `image_providers` dict with the key `filesystem`.
"""
#: A dict mapping provider location to image provider object. When
#: a resource `image://foo/bar/baz` is requested, the image provider
#: provider `foo` is use to request path `/bar/baz`.
image_providers = Dict(Str, ImageProvider)
#: A dict of icon providers for the `icon://...` scheme.
icon_providers = Dict(Str, IconProvider)
[docs] def load(self, url, metadata, reply):
""" Load a resource from the manager.
Parameters
----------
url : str
The url pointing to the resource to load.
metadata : dict
Additional metadata required to load the resource of the
given type. See the individual loading handlers for the
supported metadata.
reply : URLReply
A url reply which will be invoked with the loaded resource
object, or None if the loading fails. It must be safe to
invoke this reply from a thread.
"""
scheme = urlparse(url).scheme
handler = getattr(self, '_load_' + scheme, None)
if handler is None:
msg = 'unhandled url resource scheme: `%s`'
logger.error(msg % url)
reply(None)
return
handler(url, metadata, reply)
#--------------------------------------------------------------------------
# Private API
#--------------------------------------------------------------------------
def _load_image(self, url, metadata, reply):
""" Load an image resource.
This is a private handler method called by the `load` method.
It should not be called directly by user code.
Parameters
----------
url : str
The url pointing to the image to load.
metadata : dict
The image loader accepts optional 'size' metadata which
is the desired size with which to load the image. The
default is (-1, -1) which indicates the images natural
size should be used.
reply : URLReply
A url reply which will be invoked with the loaded image
object, or None if the loading fails. It must be safe to
invoke this reply from a thread.
"""
spec = urlparse(url)
provider = self.image_providers.get(spec.netloc)
if provider is None:
msg = 'no image provider registered for url: `%s`'
logger.error(msg % url)
reply(None)
return
size = metadata.get('size', (-1, -1))
provider.request_image(spec.path, size, reply)
def _load_icon(self, url, metadata, reply):
""" Load an icon resource.
This is a private handler method called by the `load` method.
It should not be called directly by user code.
Parameters
----------
url : str
The url pointing to the icon to load.
metadata : dict
The icon loader does not accept any metadata. Any data
in this dict will be ignored.
reply : URLReply
A url reply which will be invoked with the loaded icon
object, or None if the loading fails. It must be safe to
invoke this reply from a thread.
"""
spec = urlparse(url)
provider = self.icon_providers.get(spec.netloc)
if provider is None:
msg = 'no icon provider registered for url: `%s`'
logger.error(msg % url)
reply(None)
return
provider.request_icon(spec.path, reply)