Framework for drag and drop in tag browser

This commit is contained in:
Kovid Goyal 2010-10-03 16:52:57 -06:00
parent 5e0869feb4
commit 68f7c08d32

View File

@ -79,6 +79,8 @@ class TagsView(QTreeView): # {{{
self.setHeaderHidden(True) self.setHeaderHidden(True)
self.setItemDelegate(TagDelegate(self)) self.setItemDelegate(TagDelegate(self))
self.made_connections = False self.made_connections = False
self.setAcceptDrops(True)
self.setDropIndicatorShown(True)
def set_database(self, db, tag_match, sort_by): def set_database(self, db, tag_match, sort_by):
self.hidden_categories = config['tag_browser_hidden_categories'] self.hidden_categories = config['tag_browser_hidden_categories']
@ -104,6 +106,46 @@ class TagsView(QTreeView): # {{{
def database_changed(self, event, ids): def database_changed(self, event, ids):
self.refresh_required.emit() self.refresh_required.emit()
def dragEnterEvent(self, event):
md = event.mimeData()
if md.hasFormat("application/calibre+from_library"):
event.setDropAction(Qt.CopyAction)
event.accept()
else:
event.ignore()
def dragMoveEvent(self, event):
allowed = False
idx = self.indexAt(event.pos())
m = self.model()
p = m.parent(idx)
if idx.isValid() and p.isValid():
item = m.data(p, Qt.UserRole)
if item.type == TagTreeItem.CATEGORY and \
item.category_key in \
('tags', 'series', 'authors', 'rating', 'publisher'):
allowed = True
if allowed:
event.acceptProposedAction()
else:
event.ignore()
def dropEvent(self, event):
idx = self.indexAt(event.pos())
m = self.model()
p = m.parent(idx)
if idx.isValid() and p.isValid():
item = m.data(p, Qt.UserRole)
if item.type == TagTreeItem.CATEGORY and \
item.category_key in \
('tags', 'series', 'authors', 'rating', 'publisher'):
child = m.data(idx, Qt.UserRole)
self.handle_drop(item, child)
event.accept()
def handle_drop(self, parent, child):
pass
@property @property
def match_all(self): def match_all(self):
return self.tag_match and self.tag_match.currentIndex() > 0 return self.tag_match and self.tag_match.currentIndex() > 0
@ -326,6 +368,8 @@ class TagTreeItem(object): # {{{
self.children.append(child) self.children.append(child)
def data(self, role): def data(self, role):
if role == Qt.UserRole:
return self
if self.type == self.TAG: if self.type == self.TAG:
return self.tag_data(role) return self.tag_data(role)
if self.type == self.CATEGORY: if self.type == self.CATEGORY:
@ -544,8 +588,14 @@ class TagsModel(QAbstractItemModel): # {{{
def headerData(self, *args): def headerData(self, *args):
return NONE return NONE
def flags(self, *args): def flags(self, index, *args):
return Qt.ItemIsEnabled|Qt.ItemIsSelectable|Qt.ItemIsEditable ans = Qt.ItemIsEnabled|Qt.ItemIsSelectable|Qt.ItemIsEditable
if index.isValid() and self.parent(index).isValid():
ans |= Qt.ItemIsDropEnabled
return ans
def supportedDropActions(self):
return Qt.CopyAction|Qt.MoveAction
def path_for_index(self, index): def path_for_index(self, index):
ans = [] ans = []