Fix player position dragging.

time
Ben Niemann 2020-02-20 10:54:04 +01:00
parent 0489093fdf
commit 402191ffec
4 changed files with 19 additions and 18 deletions

View File

@ -20,6 +20,7 @@
#
# @end:license
import enum
import logging
import time as time_lib
from typing import Any
@ -33,6 +34,11 @@ from . import ui_base
logger = logging.getLogger(__name__)
class TimeMode(enum.Enum):
Follow = 0
Manual = 1
class PlayerState(ui_base.ProjectMixin, QtCore.QObject):
playingChanged = QtCore.pyqtSignal(bool)
currentTimeChanged = QtCore.pyqtSignal(object)
@ -46,6 +52,8 @@ class PlayerState(ui_base.ProjectMixin, QtCore.QObject):
self.__session_prefix = 'player_state:%s:' % self.project.id
self.__last_current_time_update = None # type: float
self.__time_mode = TimeMode.Follow
self.__playing = False
self.__current_time = self.__get_session_value('current_time', audioproc.MusicalTime())
self.__loop_start_time = self.__get_session_value('loop_start_time', None)
@ -67,10 +75,10 @@ class PlayerState(ui_base.ProjectMixin, QtCore.QObject):
self.__player_id = player_id
def updateFromProto(self, player_state: audioproc.PlayerState) -> None:
if player_state.HasField('current_time'):
if player_state.HasField('current_time') and self.__time_mode == TimeMode.Follow:
self.setCurrentTime(audioproc.MusicalTime.from_proto(player_state.current_time))
if player_state.HasField('playing'):
if player_state.HasField('playing') and self.__time_mode == TimeMode.Follow:
self.setPlaying(player_state.playing)
if player_state.HasField('loop_enabled'):
@ -82,6 +90,9 @@ class PlayerState(ui_base.ProjectMixin, QtCore.QObject):
if player_state.HasField('loop_end_time'):
self.setLoopEndTime(audioproc.MusicalTime.from_proto(player_state.loop_end_time))
def setTimeMode(self, mode: TimeMode) -> None:
self.__time_mode = mode
def setPlaying(self, playing: bool) -> None:
if playing == self.__playing:
return

View File

@ -67,7 +67,6 @@ class ProjectView(ui_base.AbstractProjectView):
self.__player_realm = None # type: str
self.__player_node_id = None # type: str
self.__player_status_listener = None # type: core.Listener
self.__playback_pos_mode = 'follow'
self.__player_state = player_state_lib.PlayerState(context=self.context)
self.__player_state.playingChanged.connect(self.playingChanged)
@ -157,10 +156,6 @@ class ProjectView(ui_base.AbstractProjectView):
def loopEnabled(self) -> bool:
return self.__player_state.loopEnabled()
def setPlaybackPosMode(self, mode: str) -> None:
assert mode in ('follow', 'manual')
self.__playback_pos_mode = mode
async def createPluginUI(self, node_id: str) -> Tuple[int, Tuple[int, int]]:
return await self.project_client.create_plugin_ui(self.__player_id, node_id)

View File

@ -21,7 +21,6 @@
# @end:license
import logging
import typing
from typing import Any
from PyQt5.QtCore import Qt
@ -32,12 +31,9 @@ from PyQt5 import QtWidgets
from noisicaa import audioproc
from noisicaa import music
from noisicaa.ui import ui_base
from noisicaa.ui import player_state as player_state_lib
from . import time_view_mixin
if typing.TYPE_CHECKING:
from noisicaa.ui import player_state as player_state_lib
from noisicaa.ui import project_view as project_view_lib
logger = logging.getLogger(__name__)
@ -48,7 +44,6 @@ class TimeLine(
QtWidgets.QWidget):
def __init__(
self, *,
project_view: 'project_view_lib.ProjectView',
player_state: 'player_state_lib.PlayerState',
**kwargs: Any
) -> None:
@ -58,7 +53,6 @@ class TimeLine(
self.setMinimumHeight(20)
self.setMaximumHeight(20)
self.__project_view = project_view
self.__player_state = player_state
self.__player_id = None # type: str
self.__move_time = False
@ -124,7 +118,7 @@ class TimeLine(
self.project_client.update_player_state(
self.__player_id,
audioproc.PlayerState(playing=False)))
self.__project_view.setPlaybackPosMode('manual')
self.__player_state.setTimeMode(player_state_lib.TimeMode.Manual)
self.__player_state.setCurrentTime(current_time)
evt.accept()
return
@ -152,7 +146,7 @@ class TimeLine(
audioproc.PlayerState(
playing=self.__old_player_state,
current_time=current_time.to_proto())))
self.__project_view.setPlaybackPosMode('follow')
self.__player_state.setTimeMode(player_state_lib.TimeMode.Follow)
evt.accept()
return

View File

@ -96,8 +96,9 @@ class TrackListView(ui_base.ProjectMixin, slots.SlotContainer, QtWidgets.QSplitt
time_line_frame = Frame(self)
self.__time_line = time_line.TimeLine(
project_view=self.__project_view, player_state=self.__player_state,
parent=time_line_frame, context=self.context)
parent=time_line_frame,
player_state=self.__player_state,
context=self.context)
time_line_frame.setWidget(self.__time_line)
self.__time_line.setScaleX(self.__editor.scaleX())