mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Paint the non printing characters using aliases
This commit is contained in:
parent
fb7118814f
commit
e3b0de4829
@ -6,12 +6,12 @@ from __future__ import (unicode_literals, division, absolute_import,
|
|||||||
__license__ = 'GPL v3'
|
__license__ = 'GPL v3'
|
||||||
__copyright__ = '2014, Kovid Goyal <kovid at kovidgoyal.net>'
|
__copyright__ = '2014, Kovid Goyal <kovid at kovidgoyal.net>'
|
||||||
|
|
||||||
import unicodedata
|
import unicodedata, re
|
||||||
from bisect import bisect
|
from bisect import bisect
|
||||||
|
|
||||||
from PyQt4.Qt import (
|
from PyQt4.Qt import (
|
||||||
QAbstractItemModel, QModelIndex, Qt, QVariant, pyqtSignal, QApplication,
|
QAbstractItemModel, QModelIndex, Qt, QVariant, pyqtSignal, QApplication,
|
||||||
QTreeView, QSize, QGridLayout, QAbstractListModel, QListView,
|
QTreeView, QSize, QGridLayout, QAbstractListModel, QListView, QPen,
|
||||||
QStyledItemDelegate, QSplitter, QLabel, QSizePolicy, QIcon)
|
QStyledItemDelegate, QSplitter, QLabel, QSizePolicy, QIcon)
|
||||||
|
|
||||||
from calibre.constants import ispy3, plugins
|
from calibre.constants import ispy3, plugins
|
||||||
@ -23,6 +23,14 @@ if not ispy3:
|
|||||||
chr = unichr
|
chr = unichr
|
||||||
ROOT = QModelIndex()
|
ROOT = QModelIndex()
|
||||||
|
|
||||||
|
non_printing = {
|
||||||
|
0xa0: 'nbsp', 0x2000: 'nqsp', 0x2001: 'mqsp', 0x2002: 'ensp', 0x2003: 'emsp', 0x2004: '3/msp', 0x2005: '4/msp', 0x2006: '6/msp',
|
||||||
|
0x2007: 'fsp', 0x2008: 'psp', 0x2009: 'thsp', 0x200A: 'hsp', 0x200b: 'zwsp', 0x200c: 'zwnj', 0x200d: 'zwj', 0x200e: 'lrm', 0x200f: 'rlm',
|
||||||
|
0x2028: 'lsep', 0x2029: 'psep', 0x202a: 'rle', 0x202b: 'lre', 0x202c: 'pdp', 0x202d: 'lro', 0x202e: 'rlo', 0x202f: 'nnbsp',
|
||||||
|
0x205f: 'mmsp', 0x2060: 'wj', 0x2061: 'fa', 0x2062: 'x', 0x2063: ',', 0x2064: '+', 0x206A: 'iss', 0x206b: 'ass', 0x206c: 'iafs', 0x206d: 'aafs',
|
||||||
|
0x206e: 'nads', 0x206f: 'nods', 0x20: 'sp', 0x7f: 'del', 0x2e3a: '2m', 0x2e3b: '3m', 0xad: 'shy',
|
||||||
|
}
|
||||||
|
|
||||||
class CategoryModel(QAbstractItemModel):
|
class CategoryModel(QAbstractItemModel):
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
@ -303,7 +311,7 @@ class CategoryModel(QAbstractItemModel):
|
|||||||
(_('Japanese Chess'), (0x2616, 0x2617)),
|
(_('Japanese Chess'), (0x2616, 0x2617)),
|
||||||
(_('Mahjong Tiles'), (0x1F000, 0x1F02F)),
|
(_('Mahjong Tiles'), (0x1F000, 0x1F02F)),
|
||||||
(_('Playing Cards'), (0x1F0A0, 0x1F0FF)),
|
(_('Playing Cards'), (0x1F0A0, 0x1F0FF)),
|
||||||
(_('Playing Cards'), (0x2660, 0x2667)),
|
(_('Playing Card Suits'), (0x2660, 0x2667)),
|
||||||
)),
|
)),
|
||||||
|
|
||||||
(_('Other Symbols'), (
|
(_('Other Symbols'), (
|
||||||
@ -460,6 +468,9 @@ class CharModel(QAbstractListModel):
|
|||||||
return QVariant(self.chars[index.row()])
|
return QVariant(self.chars[index.row()])
|
||||||
return NONE
|
return NONE
|
||||||
|
|
||||||
|
def flags(self, index):
|
||||||
|
return Qt.ItemIsEnabled
|
||||||
|
|
||||||
class CharDelegate(QStyledItemDelegate):
|
class CharDelegate(QStyledItemDelegate):
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
@ -474,16 +485,27 @@ class CharDelegate(QStyledItemDelegate):
|
|||||||
charcode, ok = index.data(Qt.UserRole).toInt()
|
charcode, ok = index.data(Qt.UserRole).toInt()
|
||||||
if not ok:
|
if not ok:
|
||||||
return
|
return
|
||||||
char = chr(charcode)
|
|
||||||
painter.save()
|
painter.save()
|
||||||
try:
|
try:
|
||||||
f = option.font
|
if charcode in non_printing:
|
||||||
f.setPixelSize(self.item_size.height() - 8)
|
self.paint_non_printing(painter, option, charcode)
|
||||||
painter.setFont(f)
|
else:
|
||||||
painter.drawText(option.rect, Qt.AlignHCenter | Qt.AlignBottom | Qt.TextSingleLine, char)
|
self.paint_normal(painter, option, charcode)
|
||||||
finally:
|
finally:
|
||||||
painter.restore()
|
painter.restore()
|
||||||
|
|
||||||
|
def paint_normal(self, painter, option, charcode):
|
||||||
|
f = option.font
|
||||||
|
f.setPixelSize(option.rect.height() - 8)
|
||||||
|
painter.setFont(f)
|
||||||
|
painter.drawText(option.rect, Qt.AlignHCenter | Qt.AlignBottom | Qt.TextSingleLine, chr(charcode))
|
||||||
|
|
||||||
|
def paint_non_printing(self, painter, option, charcode):
|
||||||
|
text = re.sub(r'(sp|j|nj|ss|fs|ds)$', r'\n\1', non_printing[charcode])
|
||||||
|
painter.drawText(option.rect, Qt.AlignCenter | Qt.TextWordWrap | Qt.TextWrapAnywhere, text)
|
||||||
|
painter.setPen(QPen(Qt.DashLine))
|
||||||
|
painter.drawRect(option.rect)
|
||||||
|
|
||||||
class CharView(QListView):
|
class CharView(QListView):
|
||||||
|
|
||||||
show_name = pyqtSignal(object)
|
show_name = pyqtSignal(object)
|
||||||
@ -499,6 +521,7 @@ class CharView(QListView):
|
|||||||
self.setWrapping(True)
|
self.setWrapping(True)
|
||||||
self.setMouseTracking(True)
|
self.setMouseTracking(True)
|
||||||
self.setSpacing(2)
|
self.setSpacing(2)
|
||||||
|
self.setUniformItemSizes(True)
|
||||||
self.setCursor(Qt.PointingHandCursor)
|
self.setCursor(Qt.PointingHandCursor)
|
||||||
|
|
||||||
def show_chars(self, name, codes):
|
def show_chars(self, name, codes):
|
||||||
@ -557,7 +580,7 @@ class CharSelect(Dialog):
|
|||||||
def show_char_info(self, char_code):
|
def show_char_info(self, char_code):
|
||||||
if char_code > 0:
|
if char_code > 0:
|
||||||
category_name, subcategory_name, character_name = self.category_view.model().get_char_info(char_code)
|
category_name, subcategory_name, character_name = self.category_view.model().get_char_info(char_code)
|
||||||
self.char_info.setText('%s - %s - %s (U+%s)' % (category_name, subcategory_name, character_name, hex(char_code)))
|
self.char_info.setText('%s - %s - %s (%04X)' % (category_name, subcategory_name, character_name, char_code))
|
||||||
else:
|
else:
|
||||||
self.char_info.clear()
|
self.char_info.clear()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user