diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index 8732aec63d..a71230c984 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -434,25 +434,24 @@ class TagsModel(QAbstractItemModel): # {{{ action != Qt.CopyAction: return False idx = parent - p = self.parent(idx) - if idx.isValid() and p.isValid(): - item = self.data(p, Qt.UserRole) - fm = self.db.metadata_for_field(item.category_key) - if item.category_key in \ - ('tags', 'series', 'authors', 'rating', 'publisher') or \ - (fm['is_custom'] and \ - fm['datatype'] in ['text', 'rating', 'series']): - child = self.data(idx, Qt.UserRole) - mime = 'application/calibre+from_library' - ids = list(map(int, str(md.data(mime)).split())) - self.handle_drop(item, child, ids) - return True + if idx.isValid(): + node = self.data(idx, Qt.UserRole) + if node.type == TagTreeItem.TAG: + fm = self.db.metadata_for_field(node.tag.category) + if node.tag.category in \ + ('tags', 'series', 'authors', 'rating', 'publisher') or \ + (fm['is_custom'] and \ + fm['datatype'] in ['text', 'rating', 'series']): + mime = 'application/calibre+from_library' + ids = list(map(int, str(md.data(mime)).split())) + self.handle_drop(node, ids) + return True return False - def handle_drop(self, parent, child, ids): - # print 'Dropped ids:', ids, parent.category_key, child.tag.name - key = parent.category_key + def handle_drop(self, on_node, ids): + #print 'Dropped ids:', ids, on_node.tag + key = on_node.tag.category if (key == 'authors' and len(ids) >= 5): if not confirm('

'+_('Changing the authors for several books can ' 'take a while. Are you sure?') @@ -466,7 +465,7 @@ class TagsModel(QAbstractItemModel): # {{{ fm = self.db.metadata_for_field(key) is_multiple = fm['is_multiple'] - val = child.tag.name + val = on_node.tag.name for id in ids: mi = self.db.get_metadata(id, index_is_id=True) @@ -500,8 +499,6 @@ class TagsModel(QAbstractItemModel): # {{{ self.db.commit() self.drag_drop_finished.emit(ids) - - def set_search_restriction(self, s): self.search_restriction = s @@ -633,8 +630,15 @@ class TagsModel(QAbstractItemModel): # {{{ def flags(self, index, *args): ans = Qt.ItemIsEnabled|Qt.ItemIsSelectable|Qt.ItemIsEditable - if index.isValid() and self.parent(index).isValid(): - ans |= Qt.ItemIsDropEnabled + if index.isValid(): + node = self.data(index, Qt.UserRole) + if node.type == TagTreeItem.TAG: + fm = self.db.metadata_for_field(node.tag.category) + if node.tag.category in \ + ('tags', 'series', 'authors', 'rating', 'publisher') or \ + (fm['is_custom'] and \ + fm['datatype'] in ['text', 'rating', 'series']): + ans |= Qt.ItemIsDropEnabled return ans def supportedDropActions(self): diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 5bec43ab28..3c949fcf78 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -68,7 +68,7 @@ copyfile = os.link if hasattr(os, 'link') else shutil.copyfile class Tag(object): def __init__(self, name, id=None, count=0, state=0, avg=0, sort=None, - tooltip=None, icon=None): + tooltip=None, icon=None, category=None): self.name = name self.id = id self.count = count @@ -81,9 +81,11 @@ class Tag(object): tooltip = _('%sAverage rating is %3.1f')%(tooltip, self.avg_rating) self.tooltip = tooltip self.icon = icon + self.category = category def __unicode__(self): - return u'%s:%s:%s:%s:%s'%(self.name, self.count, self.id, self.state, self.tooltip) + return u'%s:%s:%s:%s:%s:%s'%(self.name, self.count, self.id, self.state, + self.category, self.tooltip) def __str__(self): return unicode(self).encode('utf-8') @@ -1115,8 +1117,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): formatter = (lambda x:unicode(x)) categories[category] = [Tag(formatter(r[1]), count=r[2], id=r[0], - avg=r[3], sort=r[4], - icon=icon, tooltip=tooltip) + avg=r[3], sort=r[4], icon=icon, + tooltip=tooltip, category=category) for r in data if item_not_zero_func(r)] # Needed for legacy databases that have multiple ratings that @@ -1148,7 +1150,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): WHERE format="%s"'''%fmt, all=False) if count > 0: - categories['formats'].append(Tag(fmt, count=count, icon=icon)) + categories['formats'].append(Tag(fmt, count=count, icon=icon, + category='formats')) if sort == 'popularity': categories['formats'].sort(key=lambda x: x.count, reverse=True) @@ -1194,7 +1197,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): if icon_map and 'search' in icon_map: icon = icon_map['search'] for srch in saved_searches().names(): - items.append(Tag(srch, tooltip=saved_searches().lookup(srch), icon=icon)) + items.append(Tag(srch, tooltip=saved_searches().lookup(srch), + icon=icon, category='search')) if len(items): if icon_map is not None: icon_map['search'] = icon_map['search']