From c4cb9a96342568890dcf1e36d02d6180bdb26ac8 Mon Sep 17 00:00:00 2001 From: Eddy Pedroni Date: Tue, 4 Jan 2022 17:10:02 +0100 Subject: Hacky first implementation of GUI feedback --- solo_tool_qt.py | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) (limited to 'solo_tool_qt.py') diff --git a/solo_tool_qt.py b/solo_tool_qt.py index bb4ee76..a6823e0 100644 --- a/solo_tool_qt.py +++ b/solo_tool_qt.py @@ -10,6 +10,9 @@ POSITION_FACTOR = 100000 RATE_FACTOR = 10 UI_REFRESH_PERIOD_MS = 500 +CHANGE_GUI = 0 +CHANGE_INTERNAL = 1 + class PlaylistModel(QAbstractListModel): def __init__(self, soloTool, *args, **kwargs): super(PlaylistModel, self).__init__(*args, **kwargs) @@ -38,6 +41,8 @@ class ABListModel(QAbstractListModel): return len(self.soloTool.getStoredAbLimits()) class MainWindow(QMainWindow, Ui_MainWindow): + songChangeSignal = pyqtSignal() + def __init__(self, *args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) self.setupUi(self) @@ -52,6 +57,9 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.playlistModel = PlaylistModel(self.soloTool) self.songListView.setModel(self.playlistModel) self.songListView.selectionModel().selectionChanged.connect(self.playlistSelectionChanged) + self.songChangePending = None + self.songChangeSignal.connect(self.currentSongChanged) + self.soloTool.registerCurrentSongCallback(self.songChangeSignal.emit) self.abListModel = ABListModel(self.soloTool) self.abListView.setModel(self.abListModel) @@ -136,25 +144,43 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.soloTool.setPlaybackPosition(position) self.timer.start() - def clearAbListSelection(self): - i = self.abListView.selectionModel().currentIndex() - self.abListView.selectionModel().select(i, QItemSelectionModel.Deselect) + def clearListViewSelection(self, listView): + i = listView.selectionModel().currentIndex() + listView.selectionModel().select(i, QItemSelectionModel.Deselect) def abSliderReleased(self): a = self.aSlider.value() / float(POSITION_FACTOR) b = self.bSlider.value() / float(POSITION_FACTOR) self.soloTool.setAbLimits(a, b) - self.clearAbListSelection() + self.clearListViewSelection(self.abListView) def rateSliderReleased(self): rate = self.rateSlider.value() / float(RATE_FACTOR) self.soloTool.setPlaybackRate(rate) def playlistSelectionChanged(self, i): - index = i.indexes()[0].row() - self.soloTool.setSong(index) + if self.songChangePending == CHANGE_INTERNAL: + self.songChangePending = None + else: + assert self.songChangePending is None + self.songChangePending = CHANGE_GUI + index = i.indexes()[0].row() + self.soloTool.setSong(index) + self.abListModel.layoutChanged.emit() - self.clearAbListSelection() + self.clearListViewSelection(self.abListView) + + def currentSongChanged(self): + if self.songChangePending == CHANGE_GUI: + self.songChangePending = None + else: + assert self.songChangePending is None + self.songChangePending = CHANGE_INTERNAL + # TODO fix this hack + songIndex = self.soloTool._playlist.getCurrentSongIndex() + print(f"Forcing selection to {songIndex}") + i = self.playlistModel.createIndex(songIndex, 0) + self.songListView.selectionModel().select(i, QItemSelectionModel.ClearAndSelect) def abListSelectionChanged(self, i): if i is not None and not i.isEmpty(): -- cgit v1.2.3