explorertable.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. def __init__(self, parent):
  11. super(QTreeWidget, self).__init__(parent)
  12. self.setColumnCount(3)
  13. self.setColumnWidth(0, 54)
  14. self.hideColumn(2)
  15. def populate(self):
  16. session = db.Session()
  17. track_repo = TrackRepository(session)
  18. self.clear()
  19. artist_folders = {}
  20. album_folders = {}
  21. tracks = track_repo.get_all()
  22. self.setUpdatesEnabled(False)
  23. for track in tracks:
  24. if track.artist and track.artist not in artist_folders:
  25. item = QTreeWidgetItem(self)
  26. item.setIcon(0, QIcon(":/img/rsc/artist.png"))
  27. item.setText(1, track.artist)
  28. artist_folders[track.artist] = item
  29. for track in tracks:
  30. # list albums with artists
  31. if track.artist and track.album and (track.artist, track.album) not in album_folders:
  32. item = QTreeWidgetItem(artist_folders[track.artist])
  33. item.setIcon(0, QIcon(":/img/rsc/album.png"))
  34. item.setText(1, track.album)
  35. album_folders[(track.artist, track.album)] = item
  36. for track in tracks:
  37. if track.artist and track.album:
  38. parent = album_folders[(track.artist, track.album)]
  39. elif track.artist:
  40. parent = artist_folders[track.artist]
  41. else:
  42. parent = self
  43. item = QTreeWidgetItem(parent)
  44. item.setIcon(0, QIcon(":/img/rsc/music.png"))
  45. item.setText(1, track.title)
  46. item.setData(2, 0, track.id)
  47. self.setUpdatesEnabled(True)
  48. def selected_track(self):
  49. track_id = self.selectionModel().selection().indexes()[2].data(2)
  50. if not track_id:
  51. return None
  52. return TrackRepository().get_by_id(int(track_id))
  53. def selectionChanged(self, selected, _):
  54. track_id = selected.indexes()[2].data(2)
  55. if track_id:
  56. track = TrackRepository().get_by_id(int(track_id))
  57. else:
  58. track = None
  59. self.trackSelected.emit(track)