mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Refactor the file builder
This commit is contained in:
parent
8fabc3e0bf
commit
f27b03e9e4
@ -11,7 +11,7 @@ from PyQt4.Qt import (
|
|||||||
QStyledItemDelegate, QStyle, QPixmap, QPainter)
|
QStyledItemDelegate, QStyle, QPixmap, QPainter)
|
||||||
|
|
||||||
from calibre import guess_type, human_readable
|
from calibre import guess_type, human_readable
|
||||||
from calibre.ebooks.oeb.base import OEB_STYLES
|
from calibre.ebooks.oeb.base import OEB_STYLES, OEB_DOCS
|
||||||
from calibre.ebooks.oeb.polish.cover import get_cover_page_name, get_raster_cover_name
|
from calibre.ebooks.oeb.polish.cover import get_cover_page_name, get_raster_cover_name
|
||||||
from calibre.gui2.tweak_book import current_container
|
from calibre.gui2.tweak_book import current_container
|
||||||
|
|
||||||
@ -108,15 +108,7 @@ class FileList(QTreeWidget):
|
|||||||
flags |= Qt.ItemIsDropEnabled
|
flags |= Qt.ItemIsDropEnabled
|
||||||
i.setFlags(flags)
|
i.setFlags(flags)
|
||||||
|
|
||||||
processed, seen = set(), {}
|
processed, seen = {}, {}
|
||||||
|
|
||||||
def get_display_name(name, item):
|
|
||||||
parts = name.split('/')
|
|
||||||
text = parts[-1]
|
|
||||||
while text in seen and parts:
|
|
||||||
text = parts.pop() + '/' + text
|
|
||||||
seen[text] = item
|
|
||||||
return text
|
|
||||||
|
|
||||||
cover_page_name = get_cover_page_name(container)
|
cover_page_name = get_cover_page_name(container)
|
||||||
cover_image_name = get_raster_cover_name(container)
|
cover_image_name = get_raster_cover_name(container)
|
||||||
@ -124,14 +116,35 @@ class FileList(QTreeWidget):
|
|||||||
for names in container.manifest_type_map.itervalues():
|
for names in container.manifest_type_map.itervalues():
|
||||||
manifested_names |= set(names)
|
manifested_names |= set(names)
|
||||||
|
|
||||||
def add_emblems(item, name, linear=True):
|
font_types = {guess_type('a.'+x)[0] for x in ('ttf', 'otf', 'woff')}
|
||||||
emblems = []
|
|
||||||
if name in {cover_page_name, cover_image_name}:
|
def get_category(mt):
|
||||||
emblems.append('default_cover.png')
|
category = 'misc'
|
||||||
if name not in manifested_names and name not in {container.opf_name, 'META-INF/container.xml', 'META-INF/encryption.xml'}:
|
if mt.startswith('image/'):
|
||||||
emblems.append('dialog_question.png')
|
category = 'images'
|
||||||
if not linear:
|
elif mt in font_types:
|
||||||
emblems.append('arrow-down.png')
|
category = 'fonts'
|
||||||
|
elif mt in OEB_STYLES:
|
||||||
|
category = 'styles'
|
||||||
|
elif mt in OEB_DOCS:
|
||||||
|
category = 'text'
|
||||||
|
return category
|
||||||
|
|
||||||
|
def set_display_name(name, item):
|
||||||
|
if name in processed:
|
||||||
|
# We have an exact duplicate (can happen if there are
|
||||||
|
# duplicates in the spine)
|
||||||
|
item.setText(0, processed[name].text(0))
|
||||||
|
return
|
||||||
|
|
||||||
|
parts = name.split('/')
|
||||||
|
text = parts[-1]
|
||||||
|
while text in seen and parts:
|
||||||
|
text = parts.pop() + '/' + text
|
||||||
|
seen[text] = item
|
||||||
|
item.setText(0, text)
|
||||||
|
|
||||||
|
def render_emblems(item, emblems):
|
||||||
emblems = tuple(emblems)
|
emblems = tuple(emblems)
|
||||||
if not emblems:
|
if not emblems:
|
||||||
return
|
return
|
||||||
@ -158,27 +171,38 @@ class FileList(QTreeWidget):
|
|||||||
icon = self.rendered_emblem_cache[emblems] = canvas
|
icon = self.rendered_emblem_cache[emblems] = canvas
|
||||||
item.setData(0, Qt.DecorationRole, icon)
|
item.setData(0, Qt.DecorationRole, icon)
|
||||||
|
|
||||||
|
def create_item(name, linear=None):
|
||||||
|
imt = container.mime_map.get(name, guess_type(name)[0])
|
||||||
|
icat = get_category(imt)
|
||||||
|
category = 'text' if linear is not None else ({'text':'misc'}.get(icat, icat))
|
||||||
|
item = QTreeWidgetItem(self.categories['text' if linear is not None else category], 1)
|
||||||
|
flags = Qt.ItemIsEnabled | Qt.ItemIsSelectable
|
||||||
|
if category == 'text':
|
||||||
|
flags |= Qt.ItemIsDragEnabled
|
||||||
|
item.setFlags(flags)
|
||||||
|
item.setStatusTip(0, _('Full path: ') + name)
|
||||||
|
item.setData(0, NAME_ROLE, name)
|
||||||
|
set_display_name(name, item)
|
||||||
|
# TODO: Add appropriate tooltips based on the emblems
|
||||||
|
emblems = []
|
||||||
|
if name in {cover_page_name, cover_image_name}:
|
||||||
|
emblems.append('default_cover.png')
|
||||||
|
if name not in manifested_names and name not in {container.opf_name, 'META-INF/container.xml', 'META-INF/encryption.xml'}:
|
||||||
|
emblems.append('dialog_question.png')
|
||||||
|
if linear is False:
|
||||||
|
emblems.append('arrow-down.png')
|
||||||
|
if linear is None and icat == 'text':
|
||||||
|
# Text item outside spine
|
||||||
|
emblems.append('dialog_warning.png')
|
||||||
|
if category == 'text' and name in processed:
|
||||||
|
# Duplicate entry in spine
|
||||||
|
emblems.append('dialog_warning.png')
|
||||||
|
|
||||||
|
render_emblems(item, emblems)
|
||||||
|
return item
|
||||||
|
|
||||||
for name, linear in container.spine_names:
|
for name, linear in container.spine_names:
|
||||||
processed.add(name)
|
processed[name] = create_item(name, linear=linear)
|
||||||
i = QTreeWidgetItem(self.categories['text'], 1)
|
|
||||||
prefix = '' if linear else '[nl] '
|
|
||||||
i.setText(0, prefix + get_display_name(name, i))
|
|
||||||
i.setStatusTip(0, _('Full path: ') + name)
|
|
||||||
i.setFlags(Qt.ItemIsEnabled | Qt.ItemIsDragEnabled | Qt.ItemIsSelectable)
|
|
||||||
i.setData(0, NAME_ROLE, name)
|
|
||||||
add_emblems(i, name, linear=linear)
|
|
||||||
|
|
||||||
font_types = {guess_type('a.'+x)[0] for x in ('ttf', 'otf', 'woff')}
|
|
||||||
|
|
||||||
def get_category(mt):
|
|
||||||
category = 'misc'
|
|
||||||
if mt.startswith('image/'):
|
|
||||||
category = 'images'
|
|
||||||
elif mt in font_types:
|
|
||||||
category = 'fonts'
|
|
||||||
elif mt in OEB_STYLES:
|
|
||||||
category = 'styles'
|
|
||||||
return category
|
|
||||||
|
|
||||||
all_files = list(container.manifest_type_map.iteritems())
|
all_files = list(container.manifest_type_map.iteritems())
|
||||||
all_files.append((guess_type('a.opf')[0], [container.opf_name]))
|
all_files.append((guess_type('a.opf')[0], [container.opf_name]))
|
||||||
@ -186,15 +210,7 @@ class FileList(QTreeWidget):
|
|||||||
for name in container.name_path_map:
|
for name in container.name_path_map:
|
||||||
if name in processed:
|
if name in processed:
|
||||||
continue
|
continue
|
||||||
processed.add(name)
|
processed[name] = create_item(name)
|
||||||
imt = container.mime_map.get(name, guess_type(name)[0])
|
|
||||||
icat = get_category(imt)
|
|
||||||
i = QTreeWidgetItem(self.categories[icat], 1)
|
|
||||||
i.setText(0, get_display_name(name, i))
|
|
||||||
i.setStatusTip(0, _('Full path: ') + name)
|
|
||||||
i.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
|
|
||||||
i.setData(0, NAME_ROLE, name)
|
|
||||||
add_emblems(i, name)
|
|
||||||
|
|
||||||
for c in self.categories.itervalues():
|
for c in self.categories.itervalues():
|
||||||
self.expandItem(c)
|
self.expandItem(c)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user