Tag Browser: Replace the use of internalPointer() with internalId()

This commit is contained in:
Kovid Goyal 2011-06-25 11:31:55 -06:00
parent 80025fe5d5
commit 4e1cafbce9
2 changed files with 46 additions and 28 deletions

View File

@ -25,7 +25,6 @@ from calibre.utils.search_query_parser import saved_searches
TAG_SEARCH_STATES = {'clear': 0, 'mark_plus': 1, 'mark_plusplus': 2, TAG_SEARCH_STATES = {'clear': 0, 'mark_plus': 1, 'mark_plusplus': 2,
'mark_minus': 3, 'mark_minusminus': 4} 'mark_minus': 3, 'mark_minusminus': 4}
class TagTreeItem(object): # {{{ class TagTreeItem(object): # {{{
CATEGORY = 0 CATEGORY = 0
@ -201,6 +200,7 @@ class TagsModel(QAbstractItemModel): # {{{
filter_categories_by=None, collapse_model='disable', filter_categories_by=None, collapse_model='disable',
state_map={}): state_map={}):
QAbstractItemModel.__init__(self, parent) QAbstractItemModel.__init__(self, parent)
self.node_map = {}
# must do this here because 'QPixmap: Must construct a QApplication # must do this here because 'QPixmap: Must construct a QApplication
# before a QPaintDevice'. The ':' at the end avoids polluting either of # before a QPaintDevice'. The ':' at the end avoids polluting either of
@ -228,7 +228,7 @@ class TagsModel(QAbstractItemModel): # {{{
data = self._get_category_nodes(config['sort_tags_by']) data = self._get_category_nodes(config['sort_tags_by'])
gst = db.prefs.get('grouped_search_terms', {}) gst = db.prefs.get('grouped_search_terms', {})
self.root_item = TagTreeItem(icon_map=self.icon_state_map) self.root_item = self.create_node(icon_map=self.icon_state_map)
self.category_nodes = [] self.category_nodes = []
last_category_node = None last_category_node = None
@ -261,7 +261,7 @@ class TagsModel(QAbstractItemModel): # {{{
for i,p in enumerate(path_parts): for i,p in enumerate(path_parts):
path += p path += p
if path not in category_node_map: if path not in category_node_map:
node = TagTreeItem(parent=last_category_node, node = self.create_node(parent=last_category_node,
data=p[1:] if i == 0 else p, data=p[1:] if i == 0 else p,
category_icon=self.category_icon_map[key], category_icon=self.category_icon_map[key],
tooltip=tt if path == key else path, tooltip=tt if path == key else path,
@ -282,7 +282,7 @@ class TagsModel(QAbstractItemModel): # {{{
tree_root = tree_root[p] tree_root = tree_root[p]
path += '.' path += '.'
else: else:
node = TagTreeItem(parent=self.root_item, node = self.create_node(parent=self.root_item,
data=self.categories[key], data=self.categories[key],
category_icon=self.category_icon_map[key], category_icon=self.category_icon_map[key],
tooltip=tt, category_key=key, tooltip=tt, category_key=key,
@ -296,6 +296,9 @@ class TagsModel(QAbstractItemModel): # {{{
def break_cycles(self): def break_cycles(self):
self.root_item.break_cycles() self.root_item.break_cycles()
self.db = self.root_item = None self.db = self.root_item = None
self.node_map = {}
#traceback.print_stack()
#print
# Drag'n Drop {{{ # Drag'n Drop {{{
def mimeTypes(self): def mimeTypes(self):
@ -307,7 +310,7 @@ class TagsModel(QAbstractItemModel): # {{{
for idx in indexes: for idx in indexes:
if idx.isValid(): if idx.isValid():
# get some useful serializable data # get some useful serializable data
node = idx.internalPointer() node = self.get_node(idx)
path = self.path_for_index(idx) path = self.path_for_index(idx)
if node.type == TagTreeItem.CATEGORY: if node.type == TagTreeItem.CATEGORY:
d = (node.type, node.py_name, node.category_key) d = (node.type, node.py_name, node.category_key)
@ -340,7 +343,7 @@ class TagsModel(QAbstractItemModel): # {{{
def do_drop_from_tag_browser(self, md, action, row, column, parent): def do_drop_from_tag_browser(self, md, action, row, column, parent):
if not parent.isValid(): if not parent.isValid():
return False return False
dest = parent.internalPointer() dest = self.get_node(parent)
if dest.type != TagTreeItem.CATEGORY: if dest.type != TagTreeItem.CATEGORY:
return False return False
if not md.hasFormat('application/calibre+from_tag_browser'): if not md.hasFormat('application/calibre+from_tag_browser'):
@ -418,7 +421,8 @@ class TagsModel(QAbstractItemModel): # {{{
node = self.index_for_path(path) node = self.index_for_path(path)
if node: if node:
copied = process_source_node(user_cats, src_parent, src_parent_is_gst, copied = process_source_node(user_cats, src_parent, src_parent_is_gst,
is_uc, dest_key, node.internalPointer()) is_uc, dest_key,
self.get_node(node))
self.db.prefs.set('user_categories', user_cats) self.db.prefs.set('user_categories', user_cats)
self.tags_view.recount() self.tags_view.recount()
@ -435,7 +439,7 @@ class TagsModel(QAbstractItemModel): # {{{
path[-1] = p - 1 path[-1] = p - 1
idx = m.index_for_path(path) idx = m.index_for_path(path)
self.tags_view.setExpanded(idx, True) self.tags_view.setExpanded(idx, True)
if idx.internalPointer().type == TagTreeItem.TAG: if self.get_node(idx).type == TagTreeItem.TAG:
m.show_item_at_index(idx, box=True) m.show_item_at_index(idx, box=True)
else: else:
m.show_item_at_index(idx) m.show_item_at_index(idx)
@ -638,6 +642,20 @@ class TagsModel(QAbstractItemModel): # {{{
traceback.print_stack() traceback.print_stack()
return False return False
def create_node(self, *args, **kwargs):
node = TagTreeItem(*args, **kwargs)
self.node_map[id(node)] = node
return node
def get_node(self, idx):
ans = self.node_map.get(idx.internalId(), self.root_item)
return ans
def createIndex(self, row, column, internal_pointer=None):
idx = QAbstractItemModel.createIndex(self, row, column,
id(internal_pointer))
return idx
def _create_node_tree(self, data, state_map): def _create_node_tree(self, data, state_map):
''' '''
Called by __init__. Do not directly call this method. Called by __init__. Do not directly call this method.
@ -666,7 +684,7 @@ class TagsModel(QAbstractItemModel): # {{{
def process_one_node(category, state_map): # {{{ def process_one_node(category, state_map): # {{{
collapse_letter = None collapse_letter = None
category_index = self.createIndex(category.row(), 0, category) category_index = self.createIndex(category.row(), 0, category)
category_node = category_index.internalPointer() category_node = category
key = category_node.category_key key = category_node.category_key
if key not in data: if key not in data:
return return
@ -733,7 +751,7 @@ class TagsModel(QAbstractItemModel): # {{{
name = eval_formatter.safe_format(collapse_template, name = eval_formatter.safe_format(collapse_template,
d, 'TAG_VIEW', None) d, 'TAG_VIEW', None)
self.beginInsertRows(category_index, 999998, 999999) #len(data[key])-1) self.beginInsertRows(category_index, 999998, 999999) #len(data[key])-1)
sub_cat = TagTreeItem(parent=category, data = name, sub_cat = self.create_node(parent=category, data = name,
tooltip = None, temporary=True, tooltip = None, temporary=True,
category_icon = category_node.icon, category_icon = category_node.icon,
category_key=category_node.category_key, category_key=category_node.category_key,
@ -744,7 +762,7 @@ class TagsModel(QAbstractItemModel): # {{{
cl = cl_list[idx] cl = cl_list[idx]
if cl != collapse_letter: if cl != collapse_letter:
collapse_letter = cl collapse_letter = cl
sub_cat = TagTreeItem(parent=category, sub_cat = self.create_node(parent=category,
data = collapse_letter, data = collapse_letter,
category_icon = category_node.icon, category_icon = category_node.icon,
tooltip = None, temporary=True, tooltip = None, temporary=True,
@ -767,7 +785,7 @@ class TagsModel(QAbstractItemModel): # {{{
key not in self.db.prefs.get('categories_using_hierarchy', []) or key not in self.db.prefs.get('categories_using_hierarchy', []) or
len(components) == 1): len(components) == 1):
self.beginInsertRows(category_index, 999998, 999999) self.beginInsertRows(category_index, 999998, 999999)
n = TagTreeItem(parent=node_parent, data=tag, tooltip=tt, n = self.create_node(parent=node_parent, data=tag, tooltip=tt,
icon_map=self.icon_state_map) icon_map=self.icon_state_map)
if tag.id_set is not None: if tag.id_set is not None:
n.id_set |= tag.id_set n.id_set |= tag.id_set
@ -803,7 +821,7 @@ class TagsModel(QAbstractItemModel): # {{{
'5state' if t.category != 'search' else '3state' '5state' if t.category != 'search' else '3state'
t.name = comp t.name = comp
self.beginInsertRows(category_index, 999998, 999999) self.beginInsertRows(category_index, 999998, 999999)
node_parent = TagTreeItem(parent=node_parent, data=t, node_parent = self.create_node(parent=node_parent, data=t,
tooltip=tt, icon_map=self.icon_state_map) tooltip=tt, icon_map=self.icon_state_map)
child_map[(comp,tag.category)] = node_parent child_map[(comp,tag.category)] = node_parent
self.endInsertRows() self.endInsertRows()
@ -837,7 +855,7 @@ class TagsModel(QAbstractItemModel): # {{{
def data(self, index, role): def data(self, index, role):
if not index.isValid(): if not index.isValid():
return NONE return NONE
item = index.internalPointer() item = self.get_node(index)
return item.data(role) return item.data(role)
def setData(self, index, value, role=Qt.EditRole): def setData(self, index, value, role=Qt.EditRole):
@ -852,7 +870,7 @@ class TagsModel(QAbstractItemModel): # {{{
error_dialog(self.tags_view, _('Item is blank'), error_dialog(self.tags_view, _('Item is blank'),
_('An item cannot be set to nothing. Delete it instead.')).exec_() _('An item cannot be set to nothing. Delete it instead.')).exec_()
return False return False
item = index.internalPointer() item = self.get_node(index)
if item.type == TagTreeItem.CATEGORY and item.category_key.startswith('@'): if item.type == TagTreeItem.CATEGORY and item.category_key.startswith('@'):
if val.find('.') >= 0: if val.find('.') >= 0:
error_dialog(self.tags_view, _('Rename user category'), error_dialog(self.tags_view, _('Rename user category'),
@ -1022,7 +1040,7 @@ class TagsModel(QAbstractItemModel): # {{{
if not parent.isValid(): if not parent.isValid():
parent_item = self.root_item parent_item = self.root_item
else: else:
parent_item = parent.internalPointer() parent_item = self.get_node(parent)
try: try:
child_item = parent_item.children[row] child_item = parent_item.children[row]
@ -1036,7 +1054,7 @@ class TagsModel(QAbstractItemModel): # {{{
if not index.isValid(): if not index.isValid():
return QModelIndex() return QModelIndex()
child_item = index.internalPointer() child_item = self.get_node(index)
parent_item = getattr(child_item, 'parent', None) parent_item = getattr(child_item, 'parent', None)
if parent_item is self.root_item or parent_item is None: if parent_item is self.root_item or parent_item is None:
@ -1052,7 +1070,7 @@ class TagsModel(QAbstractItemModel): # {{{
if not parent.isValid(): if not parent.isValid():
parent_item = self.root_item parent_item = self.root_item
else: else:
parent_item = parent.internalPointer() parent_item = self.get_node(parent)
return len(parent_item.children) return len(parent_item.children)
@ -1083,7 +1101,7 @@ class TagsModel(QAbstractItemModel): # {{{
set_to: None => advance the state, otherwise a value from TAG_SEARCH_STATES set_to: None => advance the state, otherwise a value from TAG_SEARCH_STATES
''' '''
if not index.isValid(): return False if not index.isValid(): return False
item = index.internalPointer() item = self.get_node(index)
item.toggle(set_to=set_to) item.toggle(set_to=set_to)
if exclusive: if exclusive:
self.reset_all_states(except_=item.tag) self.reset_all_states(except_=item.tag)
@ -1212,10 +1230,10 @@ class TagsModel(QAbstractItemModel): # {{{
return False return False
if path[depth] > start_path[depth]: if path[depth] > start_path[depth]:
start_path = path start_path = path
my_key = category_index.internalPointer().category_key my_key = self.get_node(category_index).category_key
for j in xrange(self.rowCount(category_index)): for j in xrange(self.rowCount(category_index)):
tag_index = self.index(j, 0, category_index) tag_index = self.index(j, 0, category_index)
tag_item = tag_index.internalPointer() tag_item = self.get_node(tag_index)
if tag_item.type == TagTreeItem.CATEGORY: if tag_item.type == TagTreeItem.CATEGORY:
if process_level(depth+1, tag_index, start_path): if process_level(depth+1, tag_index, start_path):
return True return True
@ -1240,7 +1258,7 @@ class TagsModel(QAbstractItemModel): # {{{
for i in xrange(self.rowCount(parent)): for i in xrange(self.rowCount(parent)):
idx = self.index(i, 0, parent) idx = self.index(i, 0, parent)
node = idx.internalPointer() node = self.get_node(idx)
if node.type == TagTreeItem.CATEGORY: if node.type == TagTreeItem.CATEGORY:
ckey = node.category_key ckey = node.category_key
if strcmp(ckey, key) == 0: if strcmp(ckey, key) == 0:
@ -1269,7 +1287,7 @@ class TagsModel(QAbstractItemModel): # {{{
self.tags_view.scrollTo(idx, position) self.tags_view.scrollTo(idx, position)
self.tags_view.setCurrentIndex(idx) self.tags_view.setCurrentIndex(idx)
if box: if box:
tag_item = idx.internalPointer() tag_item = self.get_node(idx)
tag_item.boxed = True tag_item.boxed = True
self.dataChanged.emit(idx, idx) self.dataChanged.emit(idx, idx)
@ -1287,7 +1305,7 @@ class TagsModel(QAbstractItemModel): # {{{
def process_level(category_index): def process_level(category_index):
for j in xrange(self.rowCount(category_index)): for j in xrange(self.rowCount(category_index)):
tag_index = self.index(j, 0, category_index) tag_index = self.index(j, 0, category_index)
tag_item = tag_index.internalPointer() tag_item = self.get_node(tag_index)
if tag_item.boxed: if tag_item.boxed:
tag_item.boxed = False tag_item.boxed = False
self.dataChanged.emit(tag_index, tag_index) self.dataChanged.emit(tag_index, tag_index)

View File

@ -22,7 +22,7 @@ from calibre.utils.icu import sort_key
class TagDelegate(QItemDelegate): # {{{ class TagDelegate(QItemDelegate): # {{{
def paint(self, painter, option, index): def paint(self, painter, option, index):
item = index.internalPointer() item = index.data(Qt.UserRole).toPyObject()
if item.type != TagTreeItem.TAG: if item.type != TagTreeItem.TAG:
QItemDelegate.paint(self, painter, option, index) QItemDelegate.paint(self, painter, option, index)
return return
@ -301,7 +301,7 @@ class TagsView(QTreeView): # {{{
self.context_menu = QMenu(self) self.context_menu = QMenu(self)
if index.isValid(): if index.isValid():
item = index.internalPointer() item = index.data(Qt.UserRole).toPyObject()
tag = None tag = None
if item.type == TagTreeItem.TAG: if item.type == TagTreeItem.TAG:
@ -486,7 +486,7 @@ class TagsView(QTreeView): # {{{
if not index.isValid(): if not index.isValid():
return return
src_is_tb = event.mimeData().hasFormat('application/calibre+from_tag_browser') src_is_tb = event.mimeData().hasFormat('application/calibre+from_tag_browser')
item = index.internalPointer() item = index.data(Qt.UserRole).toPyObject()
flags = self._model.flags(index) flags = self._model.flags(index)
if item.type == TagTreeItem.TAG and flags & Qt.ItemIsDropEnabled: if item.type == TagTreeItem.TAG and flags & Qt.ItemIsDropEnabled:
self.setDropIndicatorShown(not src_is_tb) self.setDropIndicatorShown(not src_is_tb)
@ -520,7 +520,7 @@ class TagsView(QTreeView): # {{{
self.model().clear_state() self.model().clear_state()
def is_visible(self, idx): def is_visible(self, idx):
item = idx.internalPointer() item = idx.data(Qt.UserRole).toPyObject()
if getattr(item, 'type', None) == TagTreeItem.TAG: if getattr(item, 'type', None) == TagTreeItem.TAG:
idx = idx.parent() idx = idx.parent()
return self.isExpanded(idx) return self.isExpanded(idx)