explorertable.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. from PyQt5.QtCore import pyqtSlot, pyqtSignal
  2. from PyQt5.QtGui import QIcon
  3. from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem
  4. from core import db
  5. from core.logging_ import Logger
  6. from core.repositories import TrackRepository
  7. logger = Logger.get()
  8. class ExplorerTable(QTreeWidget):
  9. trackSelected = pyqtSignal(object)
  10. trackDoubleClicked = pyqtSignal(object)
  11. def __init__(self, parent):
  12. super(QTreeWidget, self).__init__(parent)
  13. self.setColumnCount(3)
  14. self.setColumnWidth(0, 54)
  15. self.hideColumn(2)
  16. self.itemDoubleClicked.connect(self._itemDoubleClicked)
  17. def populate(self):
  18. session = db.Session()
  19. track_repo = TrackRepository(session)
  20. self.clear()
  21. artist_folders = {}
  22. album_folders = {}
  23. tracks = track_repo.get_all()
  24. self.setUpdatesEnabled(False)
  25. for track in tracks:
  26. if track.artist and track.artist not in artist_folders:
  27. item = QTreeWidgetItem(self)
  28. item.setIcon(0, QIcon(":/img/rsc/artist.png"))
  29. item.setText(1, track.artist)
  30. artist_folders[track.artist] = item
  31. for track in tracks:
  32. # list albums with artists
  33. if track.artist and track.album and (track.artist, track.album) not in album_folders:
  34. item = QTreeWidgetItem(artist_folders[track.artist])
  35. item.setIcon(0, QIcon(":/img/rsc/album.png"))
  36. item.setText(1, track.album)
  37. album_folders[(track.artist, track.album)] = item
  38. for track in tracks:
  39. if track.artist and track.album:
  40. parent = album_folders[(track.artist, track.album)]
  41. elif track.artist:
  42. parent = artist_folders[track.artist]
  43. else:
  44. parent = self
  45. item = QTreeWidgetItem(parent)
  46. item.setIcon(0, QIcon(":/img/rsc/music.png"))
  47. item.setText(1, track.title)
  48. item.setData(2, 0, track.id)
  49. self.setUpdatesEnabled(True)
  50. def selected_track(self):
  51. track_id = self.selectionModel().selection().indexes()[2].data(2)
  52. if not track_id:
  53. return None
  54. return TrackRepository().get_by_id(int(track_id))
  55. def selectionChanged(self, selected, _):
  56. track_id = selected.indexes()[2].data(2)
  57. if track_id:
  58. track = TrackRepository().get_by_id(int(track_id))
  59. else:
  60. track = None
  61. self.trackSelected.emit(track)
  62. def _itemDoubleClicked(self, item, _):
  63. track_id = item.data(2, 0)
  64. if track_id:
  65. track = TrackRepository().get_by_id(int(track_id))
  66. self.trackDoubleClicked.emit(track)