class EditDialog(QMainWindow): def __init__(self, mood, parent=None): super().__init__(parent) # Top level layout self.main_widget = QWidget() self.layout = QVBoxLayout() # Tracks have a separate layout self.new_tracks = [] self.track_layout = QVBoxLayout() for track in mood.playlist.playlist: url = track[0] title = track[1] self.add_track(url, title) # Add parameters self.update_box = QLineEdit(mood.label, self) self.layout.addWidget(self.update_box) #self.layout.addWidget(QLabel("Tracks:", self)) self.layout.addLayout(self.track_layout) add_button = QPushButton("+", self) add_button.setMaximumSize(22, 22) add_button.clicked.connect(self.pick_track) self.layout.addWidget(add_button) self.layout.addStretch(1) save_button = QPushButton("Save", self) save_button.clicked.connect(lambda: self.save_settings(mood)) self.layout.addWidget(save_button) self.main_widget.setLayout(self.layout) self.setCentralWidget(self.main_widget) # Set window properties self.setGeometry(400, 400, 320, 240) self.setWindowTitle('Settings') self.show() def pick_track(self): url = QFileDialog.getOpenFileName(self, 'Add Track') if url[0]: title = os.path.split(url[0])[-1] self.add_track(url[0], title) def add_track(self, url, title): idx = len(self.new_tracks) label = QLabel(title, self) label.setMinimumSize(100, 22) remove = QPushButton("-", self) remove.setMaximumSize(22, 22) mv_up = QPushButton("â–²", self) mv_up.setMaximumSize(22, 22) mv_down = QPushButton("â–¼", self) mv_down.setMaximumSize(22, 22) single_track = QHBoxLayout() single_track.addWidget(label) single_track.addWidget(remove) single_track.addWidget(mv_up) single_track.addWidget(mv_down) single_track.setSpacing(5) list_item = (url, title, single_track) remove.clicked.connect(lambda: self.remove_track(list_item)) mv_up.clicked.connect(lambda: self.up_track(list_item)) mv_down.clicked.connect(lambda: self.down_track(list_item)) self.new_tracks.append(list_item) self.track_layout.addLayout(single_track) def remove_track(self, list_item): url, title, single_track = list_item self.track_layout.removeItem(single_track) # Remove all the widgets for i in reversed(range(single_track.count())): single_track.itemAt(i).widget().setParent(None) # Delete the single track layout single_track.deleteLater() # Remove from list try: self.new_tracks.remove(list_item) except ValueError: pass def up_track(self, list_item): old_idx = self.new_tracks.index(list_item) if old_idx > 0: new_idx = old_idx - 1 self.new_tracks.remove(list_item) self.new_tracks.insert(new_idx, list_item) _, _, single_track = list_item self.track_layout.removeItem(single_track) self.track_layout.insertItem(new_idx, single_track) def down_track(self, list_item): old_idx = self.new_tracks.index(list_item) if old_idx < len(self.new_tracks) - 1: new_idx = old_idx + 1 self.new_tracks.remove(list_item) self.new_tracks.insert(new_idx, list_item) _, _, single_track = list_item self.track_layout.removeItem(single_track) self.track_layout.insertItem(new_idx, single_track) def save_settings(self, mood): # Update label new_label = self.update_box.text() if new_label != mood.label: mood.label = new_label mood.play_button.setText(mood.label) # Update playlist with new tracks mood.playlist.clear() for track in self.new_tracks: mood.playlist.add(track[0]) mood.playlist.restart()