Skip to content

Commit

Permalink
feat: add option to shuffle video blocks
Browse files Browse the repository at this point in the history
  • Loading branch information
vzhd1701 committed Jun 22, 2022
1 parent 26150bd commit 2d040da
Show file tree
Hide file tree
Showing 10 changed files with 65 additions and 3 deletions.
1 change: 1 addition & 0 deletions gridplayer/dialogs/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ def __init__(self, parent):
"playlist/grid_mode": self.gridMode,
"playlist/grid_fit": self.gridFit,
"playlist/grid_size": self.gridSize,
"playlist/shuffle_on_load": self.gridShuffleOnLoad,
"playlist/save_position": self.playlistSavePosition,
"playlist/save_state": self.playlistSaveState,
"playlist/save_window": self.playlistSaveWindow,
Expand Down
6 changes: 5 additions & 1 deletion gridplayer/dialogs/settings_dialog_ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
class Ui_SettingsDialog(object):
def setupUi(self, SettingsDialog):
SettingsDialog.setObjectName("SettingsDialog")
SettingsDialog.resize(442, 593)
SettingsDialog.resize(442, 597)
self.lay_main = QtWidgets.QVBoxLayout(SettingsDialog)
self.lay_main.setSizeConstraint(QtWidgets.QLayout.SetFixedSize)
self.lay_main.setObjectName("lay_main")
Expand Down Expand Up @@ -107,6 +107,9 @@ def setupUi(self, SettingsDialog):
self.gridFit = QtWidgets.QCheckBox(SettingsDialog)
self.gridFit.setObjectName("gridFit")
self.lay_section_grid.addWidget(self.gridFit)
self.gridShuffleOnLoad = QtWidgets.QCheckBox(SettingsDialog)
self.gridShuffleOnLoad.setObjectName("gridShuffleOnLoad")
self.lay_section_grid.addWidget(self.gridShuffleOnLoad)
self.lay_left_column.addLayout(self.lay_section_grid)
self.lay_section_video_defaults = QtWidgets.QVBoxLayout()
self.lay_section_video_defaults.setObjectName("lay_section_video_defaults")
Expand Down Expand Up @@ -347,6 +350,7 @@ def retranslateUi(self, SettingsDialog):
self.gridModeLabel.setText(_translate("SettingsDialog", "Grid mode"))
self.gridSizeLabel.setText(_translate("SettingsDialog", "Grid size"))
self.gridFit.setText(_translate("SettingsDialog", "Fit grid cells"))
self.gridShuffleOnLoad.setText(_translate("SettingsDialog", "Shuffle on load"))
self.section_video_defaults.setText(
_translate("SettingsDialog", "Default Video Parameters")
)
Expand Down
1 change: 1 addition & 0 deletions gridplayer/models/playlist.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ class Playlist(BaseModel):
window_state: Optional[WindowState]
videos: Optional[List[Video]]
seek_sync_mode: SeekSyncMode = default_field("playlist/seek_sync_mode")
shuffle_on_load: bool = default_field("playlist/shuffle_on_load")

@classmethod
def read(cls, filename):
Expand Down
12 changes: 12 additions & 0 deletions gridplayer/player/managers/actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -569,6 +569,18 @@
"func": ("set_seek_sync_mode", SeekSyncMode.TIMECODE),
"check_if": ("is_seek_sync_mode_set_to", SeekSyncMode.TIMECODE),
},
"Shuffle Grid": {
"title": translate("Actions", "Shuffle"),
"key": "Alt+R",
"icon": "loop-random",
"func": "shuffle_video_blocks",
},
"Shuffle Grid On Load": {
"title": translate("Actions", "Shuffle On Load"),
"icon": "loop-random",
"func": "toggle_shuffle_on_load",
"check_if": "is_shuffle_on_load",
},
"Rows First": {
"title": translate("Actions", "Rows First"),
"key": "Alt+1",
Expand Down
3 changes: 3 additions & 0 deletions gridplayer/player/managers/menu.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,9 @@
),
(
"Grid",
"Shuffle Grid",
"Shuffle Grid On Load",
"---",
"Rows First",
"Columns First",
"---",
Expand Down
11 changes: 10 additions & 1 deletion gridplayer/player/managers/playlist.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class PlaylistManager(ManagerBase):
window_state_loaded = pyqtSignal(WindowState)
grid_state_loaded = pyqtSignal(GridState)
seek_sync_mode_loaded = pyqtSignal(SeekSyncMode)
shuffle_on_load_loaded = pyqtSignal(bool)
videos_loaded = pyqtSignal(list)

alert = pyqtSignal()
Expand Down Expand Up @@ -148,6 +149,7 @@ def load_playlist(self, playlist: Playlist):
self.window_state_loaded.emit(playlist.window_state)

self.seek_sync_mode_loaded.emit(playlist.seek_sync_mode)
self.shuffle_on_load_loaded.emit(playlist.shuffle_on_load)

self.alert.emit()

Expand Down Expand Up @@ -189,9 +191,16 @@ def _is_overwrite_denied(self, file_path: Path):
return False

def _make_playlist(self):
# if shuffle on load is ON, keep videos in the same order to maintain save state
if self._ctx.is_shuffle_on_load:
videos = sorted(self._ctx.video_blocks.videos, key=lambda v: str(v.uri))
else:
videos = self._ctx.video_blocks.videos

return Playlist(
grid_state=self._ctx.grid_state,
window_state=self._ctx.window_state,
videos=self._ctx.video_blocks.videos,
videos=videos,
seek_sync_mode=self._ctx.seek_sync_mode,
shuffle_on_load=self._ctx.is_shuffle_on_load,
)
23 changes: 23 additions & 0 deletions gridplayer/player/managers/video_blocks.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import random
from typing import List

from PyQt5.QtCore import Qt, pyqtSignal
Expand Down Expand Up @@ -36,6 +37,9 @@ def clear(self):
def index(self, block):
return self._blocks.index(block)

def shuffle(self):
random.shuffle(self._blocks)

@property
def unpaused(self):
return [v for v in self._blocks if not v.video_params.is_paused]
Expand Down Expand Up @@ -103,6 +107,7 @@ def __init__(self, **kwargs):
super().__init__(**kwargs)

self._ctx.seek_sync_mode = Settings().get("playlist/seek_sync_mode")
self._ctx.is_shuffle_on_load = Settings().get("playlist/shuffle_on_load")

self._ctx.video_blocks = VideoBlocks()

Expand All @@ -122,6 +127,10 @@ def commands(self):
"is_seek_sync_mode_set_to": self.is_seek_sync_mode_set_to,
"set_seek_sync_mode": self.set_seek_sync_mode,
"reload_all": self.reload_videos,
"shuffle_video_blocks": self.cmd_shuffle_video_blocks,
"is_shuffle_on_load": lambda: self._ctx.is_shuffle_on_load,
"set_shuffle_on_load": self.set_shuffle_on_load,
"toggle_shuffle_on_load": self.toggle_shuffle_on_load,
}

def cmd_all(self, command, *args):
Expand All @@ -145,6 +154,16 @@ def cmd_seek_timecode(self):

self.all_seek.emit(time_ms)

def cmd_shuffle_video_blocks(self):
self._ctx.video_blocks.shuffle()
self.video_count_changed.emit(len(self._ctx.video_blocks))

def set_shuffle_on_load(self, is_shuffle_on_load):
self._ctx.is_shuffle_on_load = is_shuffle_on_load

def toggle_shuffle_on_load(self):
self._ctx.is_shuffle_on_load = not self._ctx.is_shuffle_on_load

def seek_sync_percent(self, percent):
if self._ctx.seek_sync_mode == SeekSyncMode.PERCENT:
self.all_seek_percent.emit(percent)
Expand Down Expand Up @@ -196,6 +215,10 @@ def reload_videos_finish(self):
self._videos_to_reload = []

def add_videos(self, videos):
if self._ctx.is_shuffle_on_load:
videos = list(videos)
random.shuffle(videos)

for v in videos:
self._add_video_block(v)

Expand Down
1 change: 1 addition & 0 deletions gridplayer/player/player.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ def __init__(self, **kwargs):
("window_state_loaded", "window_state.restore_window_state"),
("grid_state_loaded", "grid.set_grid_state"),
("seek_sync_mode_loaded", "video_blocks.set_seek_sync_mode"),
("shuffle_on_load_loaded", "video_blocks.set_shuffle_on_load"),
("videos_loaded", "video_blocks.add_videos"),
("alert", "window_state.activate_window"),
("error", "dialogs.error"),
Expand Down
1 change: 1 addition & 0 deletions gridplayer/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ def default_language():
"playlist/save_window": False,
"playlist/seek_sync_mode": SeekSyncMode.DISABLED,
"playlist/track_changes": True,
"playlist/shuffle_on_load": False,
"video_defaults/aspect": VideoAspect.FIT,
"video_defaults/repeat": VideoRepeat.SINGLE_FILE,
"video_defaults/random_loop": False,
Expand Down
9 changes: 8 additions & 1 deletion resources/ui/settings_dialog.ui
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>442</width>
<height>593</height>
<height>597</height>
</rect>
</property>
<property name="windowTitle">
Expand Down Expand Up @@ -214,6 +214,13 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="gridShuffleOnLoad">
<property name="text">
<string>Shuffle on load</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
Expand Down

0 comments on commit 2d040da

Please sign in to comment.