terom@64: """ terom@64: Per-directory gallery state terom@64: """ terom@12: terom@64: import filesystem, image, html terom@12: terom@76: from utils import lazy_load, lazy_load_iter terom@64: terom@76: import math terom@76: terom@76: class Folder (filesystem.Directory) : terom@12: """ terom@64: A Folder is a filesystem Directory that contains any number of other Folders and Images. terom@12: """ terom@12: terom@76: def __init__ (self, *args, **kwargs) : terom@76: super(Folder, self).__init__(*args, **kwargs) terom@12: terom@64: # info terom@64: self.title = None terom@64: self.description = None terom@64: terom@64: @lazy_load terom@64: def preview_dir (self) : terom@64: """ terom@64: Load and return the Directory for previews terom@64: """ terom@64: terom@64: return self.subdir(self.config.preview_dir, create=True) terom@12: terom@64: @lazy_load terom@64: def thumb_dir (self) : terom@64: """ terom@64: Load and return the Directory for thumbs terom@64: """ terom@64: terom@64: return self.subdir(self.config.thumb_dir, create=True) terom@64: terom@64: @lazy_load_iter terom@64: def subnodes (self) : terom@64: """ terom@64: Load and return an ordered list of child-Nodes terom@64: """ terom@64: terom@76: return super(Folder, self).subnodes(skip_dotfiles=True, sort=True) terom@64: terom@64: @lazy_load_iter terom@64: def subfolders (self) : terom@64: """ terom@64: Load and return an ordered list of sub-Folders terom@64: """ terom@64: terom@64: return (Folder(node) for node in self.subnodes if isinstance(node, filesystem.Directory)) terom@64: terom@64: @lazy_load_iter terom@64: def images (self) : terom@64: """ terom@64: Load and return an ordered/linked list of sub-Images terom@64: """ terom@64: terom@64: prev = None terom@64: terom@64: for node in self.subnodes : terom@64: # skip non-relevant ones terom@64: # XXX: node should need to be a File terom@76: if not node.is_file() or not self.config.is_image(filesystem.File(node)) : terom@64: continue terom@64: terom@64: # create new terom@77: img = image.Image(node) terom@64: terom@64: # link up terom@64: if prev : terom@76: img.prev = prev terom@64: prev.next = img terom@64: terom@64: # yield the linked-up prev terom@64: yield prev terom@64: terom@64: # continue terom@64: prev = img terom@64: terom@64: # and the last one terom@64: if prev : terom@64: yield prev terom@64: terom@64: @property terom@64: def page_count (self) : terom@64: """ terom@64: Returns the number of pages needed to show this folder's images terom@64: """ terom@64: terom@76: return int(math.ceil(len(self.images) / float(self.config.images_per_page))) terom@64: terom@64: def images_for_page (self, page) : terom@64: """ terom@64: Returns the list of Images to be displayed for the given page, if any terom@64: """ terom@64: terom@64: # offset to first image terom@64: offset = page * self.config.images_per_page terom@64: terom@64: # slice terom@64: return self.images[offset : offset + self.config.images_per_page] terom@64: terom@64: def html_file (self, page=0) : terom@64: """ terom@64: Returns the File representing the .html for the given page terom@64: """ terom@64: terom@64: if page : terom@64: return self.subfile("index_%d.html" % page) terom@64: terom@64: else : terom@64: return self.subfile("index.html") terom@64: terom@64: def index (self) : terom@64: """ terom@64: Recursively index this Folder, yielding a series of all Folder objects inside. terom@70: terom@70: XXX: not used terom@64: """ terom@64: terom@64: # and subfolders terom@64: for subfolder in self.subfolders : terom@64: yield subfolder terom@64: terom@64: for item in subfolder.index_subfolders() : terom@64: yield item terom@64: