DropLabel.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. '''
  2. Hérite de QLabel, accepte les drop de fichiers et lit leur
  3. @author: olivier.massot, nov. 2017
  4. '''
  5. import re
  6. from PyQt5.Qt import QLabel, Qt, pyqtSignal, QTextCodec
  7. from path import Path
  8. from core import constants
  9. class DropLabel(QLabel):
  10. dropped = pyqtSignal()
  11. def __init__(self, parent):
  12. super(QLabel, self).__init__(parent)
  13. self.setAcceptDrops(True)
  14. def dragEnterEvent(self, event):
  15. if event.mimeData().hasUrls:
  16. event.accept()
  17. else:
  18. event.ignore()
  19. def dragMoveEvent(self, event):
  20. if event.mimeData().hasUrls:
  21. event.setDropAction(Qt.CopyAction)
  22. event.accept()
  23. else:
  24. event.ignore()
  25. def dropEvent(self, event):
  26. data = event.mimeData().data("FileGroupDescriptorW")
  27. data = QTextCodec.codecForName("UTF-16").toUnicode(data)
  28. data = re.findall(r"[\w\-. ]+", data)
  29. if event.mimeData().hasFormat("FileGroupDescriptor"):
  30. event.setDropAction(Qt.CopyAction)
  31. event.accept()
  32. # Get the file's name from mime data
  33. data = event.mimeData().data("FileGroupDescriptorW")
  34. data = QTextCodec.codecForName("UTF-16").toUnicode(data)
  35. names = re.findall(r"[\w\-. ]+", data)
  36. if len(names) > 1:
  37. raise IOError("Vous ne pouvez pas traiter plus d'un fichier à la fois!")
  38. filename = Path(names[0])
  39. if not filename.ext == ".xml":
  40. raise IOError("Le fichier doit être un fichier '.xml'.")
  41. # Write the file in a temporary directory
  42. with open(constants.TMPDIR / filename, 'wb') as f:
  43. f.write(event.mimeData().data("FileContents"))
  44. self.url = (constants.TMPDIR / filename)
  45. self.dropped.emit()
  46. elif event.mimeData().hasUrls:
  47. event.setDropAction(Qt.CopyAction)
  48. event.accept()
  49. links = [url.toLocalFile() for url in event.mimeData().urls()]
  50. self.url = links[0]
  51. self.dropped.emit()
  52. else:
  53. event.ignore()