playlist_table.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. from PyQt5 import QtWidgets
  2. from PyQt5.QtCore import pyqtSignal, Qt
  3. from PyQt5.QtGui import QIcon, QPixmap
  4. from PyQt5.QtWidgets import QTableWidgetItem
  5. from core.repositories import TrackRepository, SessionTrackRepository
  6. from ui.qt.widgets.sqt.SQTableWidget import SQTableWidget
  7. class PlaylistTable(SQTableWidget):
  8. trackSelected = pyqtSignal(object)
  9. trackDoubleClicked = pyqtSignal(object)
  10. def __init__(self, parent):
  11. super().__init__(parent)
  12. self.playlist = None
  13. self.count = -1
  14. self.cellPressed.connect(self._cellPressed)
  15. self.cellDoubleClicked.connect(self._cellDoubleClicked)
  16. def populate(self, playlist=None):
  17. if playlist:
  18. self.playlist = playlist
  19. if not self.playlist:
  20. return
  21. self.hideColumn(0)
  22. self.hideColumn(1)
  23. header = self.horizontalHeader()
  24. header.setSectionResizeMode(2, QtWidgets.QHeaderView.Stretch)
  25. self.setColumnWidth(3, 50)
  26. self.hideColumn(4)
  27. self.clear()
  28. self.update()
  29. def update(self):
  30. if not self.playlist:
  31. raise RuntimeError("No playlist loaded")
  32. self.setUpdatesEnabled(False)
  33. session_track_repo = SessionTrackRepository()
  34. track_repo = TrackRepository()
  35. session_tracks = session_track_repo.get_by_session_id(self.playlist.id)
  36. if not session_tracks:
  37. self.clear()
  38. self.setUpdatesEnabled(True)
  39. return
  40. loaded = {self.item(row, 0).data(0): row for row in self.rows()}
  41. for session_track_id, row in loaded.items():
  42. if session_track_id not in [st.id for st in session_tracks]:
  43. self.removeRow(row)
  44. i = 0
  45. for session_track in session_tracks:
  46. track = track_repo.get_by_id(session_track.track_id)
  47. if session_track.id in loaded:
  48. row = loaded[session_track.id]
  49. else:
  50. row = self.rowCount()
  51. self.insertRow(row)
  52. item = QTableWidgetItem()
  53. item.setData(0, session_track.id)
  54. self.setItem(i, 0, item)
  55. item = QTableWidgetItem()
  56. item.setData(0, track.id)
  57. self.setItem(row, 1, item)
  58. self.setItem(row, 2, QTableWidgetItem(track.title))
  59. item = QTableWidgetItem(track.literal_duration())
  60. item.setTextAlignment(Qt.AlignCenter)
  61. self.setItem(row, 3, item)
  62. item = QTableWidgetItem()
  63. item.setData(0, session_track.order)
  64. self.setItem(row, 4, item)
  65. i += 1
  66. self.count = i
  67. self.sortItems(4)
  68. self.setUpdatesEnabled(True)
  69. def clear(self):
  70. while self.rowCount():
  71. self.removeRow(0)
  72. super().clear()
  73. def _cellPressed(self, row, _):
  74. track_id = int(self.item(row, 1).data(0))
  75. if track_id:
  76. track = TrackRepository().get_by_id(track_id)
  77. self.trackSelected.emit(track)
  78. def _cellDoubleClicked(self, row, _):
  79. track_id = int(self.item(row, 1).data(0))
  80. if track_id:
  81. track = TrackRepository().get_by_id(int(track_id))
  82. self.trackDoubleClicked.emit(track)
  83. def selected_session_track(self):
  84. item = self.item(self.currentRow(), 0)
  85. if not item:
  86. return None
  87. session_track_id = item.data(0)
  88. if not session_track_id:
  89. return None
  90. return SessionTrackRepository().get_by_id(int(session_track_id))
  91. def set_is_playing(self, track=None):
  92. for i in self.rows():
  93. track_id = self.item(i, 1).data(0)
  94. if track is not None and track_id == track.id:
  95. icon = QIcon(":/img/rsc/play.png")
  96. else:
  97. icon = QIcon()
  98. self.item(i, 2).setIcon(icon)
  99. def update_session_track_order(self, session_track, new_order):
  100. session_track_repo = SessionTrackRepository()
  101. session_track_repo.set_session_track_order(session_track, new_order, True)
  102. self.update()
  103. def move_selected_up(self, track):
  104. session_track = self.selected_session_track()
  105. if session_track:
  106. self.update_session_track_order(session_track, session_track.order - 1)
  107. def move_selected_down(self, track):
  108. session_track = self.selected_session_track()
  109. if session_track:
  110. self.update_session_track_order(session_track, session_track.order + 1)
  111. def move_selected_to_top(self, track):
  112. session_track = self.selected_session_track()
  113. if session_track:
  114. self.update_session_track_order(session_track, 0)
  115. def move_selected_to_bottom(self, track):
  116. session_track = self.selected_session_track()
  117. if session_track:
  118. self.update_session_track_order(session_track, 99999999)