- Scroll images list automatically when dragging

- Expand group where new images were added
- Select dropped images
- More code style fixes
- Reverted earlier change to validateAndLoad
This commit is contained in:
Arjan Schrijver 2013-01-30 20:33:22 +01:00
parent 260a6815c2
commit d95aef4b97
5 changed files with 67 additions and 37 deletions

View File

@ -391,6 +391,7 @@ class MediaManagerItem(QtGui.QWidget):
self.loadList(full_list, target_group) self.loadList(full_list, target_group)
last_dir = os.path.split(unicode(files[0]))[0] last_dir = os.path.split(unicode(files[0]))[0]
Settings().setValue(self.settingsSection + u'/last directory', last_dir) Settings().setValue(self.settingsSection + u'/last directory', last_dir)
Settings().setValue(u'%s/%s files' % (self.settingsSection, self.settingsSection), self.getFileList())
if duplicates_found: if duplicates_found:
critical_error_message_box(UiStrings().Duplicate, critical_error_message_box(UiStrings().Duplicate,
translate('OpenLP.MediaManagerItem', 'Duplicate files were found on import and were ignored.')) translate('OpenLP.MediaManagerItem', 'Duplicate files were found on import and were ignored.'))

View File

@ -46,7 +46,7 @@ class TreeWidgetWithDnD(QtGui.QTreeWidget):
""" """
QtGui.QTreeWidget.__init__(self, parent) QtGui.QTreeWidget.__init__(self, parent)
self.mimeDataText = name self.mimeDataText = name
self.allowInternalDnD = False self.allow_internal_dnd = False
self.header().close() self.header().close()
self.defaultIndentation = self.indentation() self.defaultIndentation = self.indentation()
self.setIndentation(0) self.setIndentation(0)
@ -63,9 +63,6 @@ class TreeWidgetWithDnD(QtGui.QTreeWidget):
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'%s_dnd_internal' % self.mimeDataText), QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'%s_dnd_internal' % self.mimeDataText),
self.parent().dnd_move_internal) self.parent().dnd_move_internal)
def doInternalDnD(self, accept):
self.allowInternalDnD = accept
def mouseMoveEvent(self, event): def mouseMoveEvent(self, event):
""" """
Drag and drop event does not care what data is selected Drag and drop event does not care what data is selected
@ -87,16 +84,17 @@ class TreeWidgetWithDnD(QtGui.QTreeWidget):
def dragEnterEvent(self, event): def dragEnterEvent(self, event):
if event.mimeData().hasUrls(): if event.mimeData().hasUrls():
event.accept() event.accept()
elif self.allowInternalDnD: elif self.allow_internal_dnd:
event.accept() event.accept()
else: else:
event.ignore() event.ignore()
def dragMoveEvent(self, event): def dragMoveEvent(self, event):
QtGui.QTreeWidget.dragMoveEvent(self, event)
if event.mimeData().hasUrls(): if event.mimeData().hasUrls():
event.setDropAction(QtCore.Qt.CopyAction) event.setDropAction(QtCore.Qt.CopyAction)
event.accept() event.accept()
elif self.allowInternalDnD: elif self.allow_internal_dnd:
event.setDropAction(QtCore.Qt.CopyAction) event.setDropAction(QtCore.Qt.CopyAction)
event.accept() event.accept()
else: else:
@ -122,7 +120,7 @@ class TreeWidgetWithDnD(QtGui.QTreeWidget):
for file_name in listing: for file_name in listing:
files.append(os.path.join(localFile, file_name)) files.append(os.path.join(localFile, file_name))
Receiver.send_message(u'%s_dnd' % self.mimeDataText, {'files': files, 'target': self.itemAt(event.pos())}) Receiver.send_message(u'%s_dnd' % self.mimeDataText, {'files': files, 'target': self.itemAt(event.pos())})
elif self.allowInternalDnD: elif self.allow_internal_dnd:
event.setDropAction(QtCore.Qt.CopyAction) event.setDropAction(QtCore.Qt.CopyAction)
event.accept() event.accept()
Receiver.send_message(u'%s_dnd_internal' % self.mimeDataText, self.itemAt(event.pos())) Receiver.send_message(u'%s_dnd_internal' % self.mimeDataText, self.itemAt(event.pos()))

View File

@ -57,8 +57,8 @@ class ImageMediaItem(MediaManagerItem):
self.manager = plugin.manager self.manager = plugin.manager
self.choosegroupform = ChooseGroupForm(self) self.choosegroupform = ChooseGroupForm(self)
self.addgroupform = AddGroupForm(self) self.addgroupform = AddGroupForm(self)
self.fill_groups_combo_box(self.choosegroupform.group_combobox) self.fill_groups_combobox(self.choosegroupform.group_combobox)
self.fill_groups_combo_box(self.addgroupform.parent_group_combobox) self.fill_groups_combobox(self.addgroupform.parent_group_combobox)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'live_theme_changed'), self.liveThemeChanged) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'live_theme_changed'), self.liveThemeChanged)
# Allow DnD from the desktop # Allow DnD from the desktop
self.listView.activateDnD() self.listView.activateDnD()
@ -87,7 +87,7 @@ class ImageMediaItem(MediaManagerItem):
self.listView.clear() self.listView.clear()
self.listView.setIconSize(QtCore.QSize(88, 50)) self.listView.setIconSize(QtCore.QSize(88, 50))
self.listView.setIndentation(self.listView.defaultIndentation) self.listView.setIndentation(self.listView.defaultIndentation)
self.listView.doInternalDnD(True) self.listView.allow_internal_dnd = True
self.servicePath = os.path.join(AppLocation.get_section_data_path(self.settingsSection), u'thumbnails') self.servicePath = os.path.join(AppLocation.get_section_data_path(self.settingsSection), u'thumbnails')
check_directory_exists(self.servicePath) check_directory_exists(self.servicePath)
# Import old images list # Import old images list
@ -102,7 +102,8 @@ class ImageMediaItem(MediaManagerItem):
Settings().remove(self.settingsSection + u'/images files') Settings().remove(self.settingsSection + u'/images files')
Settings().remove(self.settingsSection + u'/images count') Settings().remove(self.settingsSection + u'/images count')
# Load images from the database # Load images from the database
self.loadFullList(self.manager.get_all_objects(ImageFilenames, order_by_ref=ImageFilenames.filename), True) self.loadFullList(self.manager.get_all_objects(ImageFilenames, order_by_ref=ImageFilenames.filename),
initial_load=True)
def addListViewToToolBar(self): def addListViewToToolBar(self):
MediaManagerItem.addListViewToToolBar(self) MediaManagerItem.addListViewToToolBar(self)
@ -162,54 +163,70 @@ class ImageMediaItem(MediaManagerItem):
self.listView.takeTopLevelItem(self.listView.indexOfTopLevelItem(row_item)) self.listView.takeTopLevelItem(self.listView.indexOfTopLevelItem(row_item))
else: else:
row_item.parent().removeChild(row_item) row_item.parent().removeChild(row_item)
self.fill_groups_combo_box(self.choosegroupform.group_combobox) self.fill_groups_combobox(self.choosegroupform.group_combobox)
self.fill_groups_combo_box(self.addgroupform.parent_group_combobox) self.fill_groups_combobox(self.addgroupform.parent_group_combobox)
self.main_window.incrementProgressBar() self.main_window.incrementProgressBar()
self.main_window.finishedProgressBar() self.main_window.finishedProgressBar()
Receiver.send_message(u'cursor_normal') Receiver.send_message(u'cursor_normal')
self.listView.blockSignals(False) self.listView.blockSignals(False)
def addSubGroups(self, groupList, parentGroupId): def add_sub_groups(self, group_list, parent_group_id):
""" """
Recursively add subgroups to the given parent group Recursively add subgroups to the given parent group
""" """
image_groups = self.manager.get_all_objects(ImageGroups, ImageGroups.parent_id == parentGroupId) image_groups = self.manager.get_all_objects(ImageGroups, ImageGroups.parent_id == parent_group_id)
image_groups.sort(cmp=locale_compare, key=lambda group_object: group_object.group_name) image_groups.sort(cmp=locale_compare, key=lambda group_object: group_object.group_name)
for image_group in image_groups: for image_group in image_groups:
group = QtGui.QTreeWidgetItem() group = QtGui.QTreeWidgetItem()
group.setText(0, image_group.group_name) group.setText(0, image_group.group_name)
group.setData(0, QtCore.Qt.UserRole, image_group) group.setData(0, QtCore.Qt.UserRole, image_group)
if parentGroupId is 0: if parent_group_id is 0:
self.listView.addTopLevelItem(group) self.listView.addTopLevelItem(group)
else: else:
groupList[parentGroupId].addChild(group) group_list[parent_group_id].addChild(group)
groupList[image_group.id] = group group_list[image_group.id] = group
self.addSubGroups(groupList, image_group.id) self.add_sub_groups(group_list, image_group.id)
def fill_groups_combo_box(self, comboBox, parentGroupId=0, prefix=''): def fill_groups_combobox(self, combobox, parent_group_id=0, prefix=''):
""" """
Recursively add groups to the combobox in the 'Add group' dialog Recursively add groups to the combobox in the 'Add group' dialog
""" """
if parentGroupId is 0: if parent_group_id is 0:
comboBox.clear() combobox.clear()
comboBox.top_level_group_added = False combobox.top_level_group_added = False
image_groups = self.manager.get_all_objects(ImageGroups, ImageGroups.parent_id == parentGroupId) image_groups = self.manager.get_all_objects(ImageGroups, ImageGroups.parent_id == parent_group_id)
image_groups.sort(cmp=locale_compare, key=lambda group_object: group_object.group_name) image_groups.sort(cmp=locale_compare, key=lambda group_object: group_object.group_name)
for image_group in image_groups: for image_group in image_groups:
comboBox.addItem(prefix + image_group.group_name, image_group.id) combobox.addItem(prefix + image_group.group_name, image_group.id)
self.fill_groups_combo_box(comboBox, image_group.id, prefix + ' ') self.fill_groups_combobox(combobox, image_group.id, prefix + ' ')
def loadFullList(self, images, initialLoad=False): def expand_group(self, group_id, root_item=None):
return_value = False
if root_item is None:
root_item = self.listView.invisibleRootItem()
for i in range(root_item.childCount()):
child = root_item.child(i)
if self.expand_group(group_id, child):
child.setExpanded(True)
return_value = True
if isinstance(root_item.data(0, QtCore.Qt.UserRole), ImageGroups):
if root_item.data(0, QtCore.Qt.UserRole).id == group_id:
return True
return return_value
def loadFullList(self, images, initial_load=False, open_group=None):
""" """
Replace the list of images and groups in the interface. Replace the list of images and groups in the interface.
""" """
if not initialLoad: if not initial_load:
Receiver.send_message(u'cursor_busy') Receiver.send_message(u'cursor_busy')
self.main_window.displayProgressBar(len(images)) self.main_window.displayProgressBar(len(images))
self.listView.clear() self.listView.clear()
# Load the list of groups and add them to the treeView # Load the list of groups and add them to the treeView
group_items = {} group_items = {}
self.addSubGroups(group_items, 0) self.add_sub_groups(group_items, parent_group_id=0)
if open_group is not None:
self.expand_group(open_group.id)
# Sort the images by its filename considering language specific # Sort the images by its filename considering language specific
# characters. # characters.
images.sort(cmp=locale_compare, key=lambda image_object: os.path.split(unicode(image_object.filename))[1]) images.sort(cmp=locale_compare, key=lambda image_object: os.path.split(unicode(image_object.filename))[1])
@ -238,13 +255,27 @@ class ImageMediaItem(MediaManagerItem):
self.listView.insertTopLevelItem(0, imported_group) self.listView.insertTopLevelItem(0, imported_group)
group_items[0] = imported_group group_items[0] = imported_group
group_items[imageFile.group_id].addChild(item_name) group_items[imageFile.group_id].addChild(item_name)
if not initialLoad: if not initial_load:
self.main_window.incrementProgressBar() self.main_window.incrementProgressBar()
if not initialLoad: if not initial_load:
self.main_window.finishedProgressBar() self.main_window.finishedProgressBar()
Receiver.send_message(u'cursor_normal') Receiver.send_message(u'cursor_normal')
def loadList(self, images, target_group=None, initialLoad=False): def validateAndLoad(self, files, target_group=None):
"""
Process a list for files either from the File Dialog or from Drag and
Drop. This method is overloaded from MediaManagerItem.
``files``
The files to be loaded.
"""
if target_group is None:
self.listView.clear()
self.loadList(files, target_group)
last_dir = os.path.split(unicode(files[0]))[0]
Settings().setValue(self.settingsSection + u'/last directory', last_dir)
def loadList(self, images, target_group=None, initial_load=False):
""" """
Add new images to the database. This method is called when adding images using the Add button or DnD. Add new images to the database. This method is called when adding images using the Add button or DnD.
""" """
@ -271,7 +302,7 @@ class ImageMediaItem(MediaManagerItem):
imageFile.filename = unicode(filename) imageFile.filename = unicode(filename)
success = self.manager.save_object(imageFile) success = self.manager.save_object(imageFile)
self.loadFullList(self.manager.get_all_objects(ImageFilenames, order_by_ref=ImageFilenames.filename), self.loadFullList(self.manager.get_all_objects(ImageFilenames, order_by_ref=ImageFilenames.filename),
initialLoad) initial_load=initial_load, open_group=parent_group)
def dnd_move_internal(self, target): def dnd_move_internal(self, target):
""" """
@ -291,9 +322,11 @@ class ImageMediaItem(MediaManagerItem):
if isinstance(item.data(0, QtCore.Qt.UserRole), ImageFilenames): if isinstance(item.data(0, QtCore.Qt.UserRole), ImageFilenames):
item.parent().removeChild(item) item.parent().removeChild(item)
target_group.addChild(item) target_group.addChild(item)
item.setSelected(True)
item_data = item.data(0, QtCore.Qt.UserRole) item_data = item.data(0, QtCore.Qt.UserRole)
item_data.group_id = target_group.data(0, QtCore.Qt.UserRole).id item_data.group_id = target_group.data(0, QtCore.Qt.UserRole).id
items_to_save.append(item_data) items_to_save.append(item_data)
target_group.setExpanded(True)
target_group.sortChildren(0, QtCore.Qt.AscendingOrder) target_group.sortChildren(0, QtCore.Qt.AscendingOrder)
# Update the group ID's of the images in the database # Update the group ID's of the images in the database
self.manager.save_objects(items_to_save) self.manager.save_objects(items_to_save)
@ -396,8 +429,8 @@ class ImageMediaItem(MediaManagerItem):
if self.manager.save_object(new_group): if self.manager.save_object(new_group):
self.loadFullList(self.manager.get_all_objects(ImageFilenames, self.loadFullList(self.manager.get_all_objects(ImageFilenames,
order_by_ref=ImageFilenames.filename)) order_by_ref=ImageFilenames.filename))
self.fill_groups_combo_box(self.choosegroupform.group_combobox) self.fill_groups_combobox(self.choosegroupform.group_combobox)
self.fill_groups_combo_box(self.addgroupform.parent_group_combobox) self.fill_groups_combobox(self.addgroupform.parent_group_combobox)
else: else:
critical_error_message_box( critical_error_message_box(
message=translate('ImagePlugin.AddGroupForm', 'Could not add the new group.')) message=translate('ImagePlugin.AddGroupForm', 'Could not add the new group.'))

View File

@ -285,7 +285,6 @@ class MediaMediaItem(MediaManagerItem):
item_name.setData(0, QtCore.Qt.UserRole, track) item_name.setData(0, QtCore.Qt.UserRole, track)
item_name.setToolTip(0, track) item_name.setToolTip(0, track)
self.listView.addTopLevelItem(item_name) self.listView.addTopLevelItem(item_name)
Settings().setValue(self.settingsSection + u'/media files', self.getFileList())
def getList(self, type=MediaType.Audio): def getList(self, type=MediaType.Audio):
media = Settings().value(self.settingsSection + u'/media files') media = Settings().value(self.settingsSection + u'/media files')

View File

@ -208,7 +208,6 @@ class PresentationMediaItem(MediaManagerItem):
item_name.setIcon(0, icon) item_name.setIcon(0, icon)
item_name.setToolTip(0, file) item_name.setToolTip(0, file)
self.listView.addTopLevelItem(item_name) self.listView.addTopLevelItem(item_name)
Settings().setValue(self.settingsSection + u'/presentations files', self.getFileList())
Receiver.send_message(u'cursor_normal') Receiver.send_message(u'cursor_normal')
if not initialLoad: if not initialLoad:
self.main_window.finishedProgressBar() self.main_window.finishedProgressBar()