Capture key and mouse movements

This commit is contained in:
Tim Bentley 2012-12-29 20:54:25 +00:00
parent 933925647b
commit 01de9a93df
2 changed files with 61 additions and 6 deletions

View File

@ -35,14 +35,56 @@ from PyQt4 import QtCore, QtGui
from openlp.core.lib import OpenLPToolbar, Receiver, translate
from openlp.core.lib.settings import Settings
from openlp.core.lib.ui import UiStrings, critical_error_message_box
from openlp.core.ui.media import MediaState, MediaInfo, MediaType, \
get_media_players, set_media_players
from openlp.core.ui.media import MediaState, MediaInfo, MediaType, get_media_players, set_media_players
from openlp.core.ui.media.mediaplayer import MediaPlayer
from openlp.core.utils import AppLocation
from openlp.core.ui import DisplayControllerType
log = logging.getLogger(__name__)
class MediaSlider(QtGui.QSlider):
"""
Set up key bindings and mouse behaviour for the Qslider
Let's say the user clicks at (100, 50), and the slider geometry is (30, 40, 200, 60).
Then the slider width is 200-30=170px.
Now, clicking at 100 pixels(relative to the slider) means the knob should be moved at 58.82% from the slider value.
So if the slider value goes from 1 to 440, then you should use QSlider:setValue(440*58.82/100).
"""
def __init__(self, direction, manager, controller, parent=None):
QtGui.QSlider.__init__(self, direction)
self.manager = manager
self.controller = controller
def mouseMoveEvent(self, event):
#print "mme",self.sliderPosition()
QtGui.QSlider.mouseMoveEvent(self, event)
def mousePressEvent(self, event):
print "mpe",self.sliderPosition(), self.maximum(),self.minimum()
self.manager.media_seek(self.controller,self.sliderPosition())
QtGui.QSlider.mousePressEvent(self, event)
def mouseReleaseEvent(self, event):
#print "mre",self.sliderPosition()
QtGui.QSlider.mouseReleaseEvent(self, event)
def _calculate_position(self):
position = float(self.mapFromGlobal(QtGui.QCursor.pos()).x())
width = float(self.geometry().width() - self.geometry().x())
print position, width
percent = 0
if position > 0:
percent = position * (width / 100)
length = self.maximum() - self.minimum()
new_position = self.maximum()
if percent < 100:
new_position = int(length * (percent / 100) )
print length, percent, new_position, self.sliderPosition(), self.maximum()
#self.setSliderPosition(new_position)
self.manager.media_seek(self.controller, new_position)
class MediaController(object):
"""
The implementation of the Media Controller. The Media Controller adds an own
@ -70,7 +112,7 @@ class MediaController(object):
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'playbackPlay'), self.media_play_msg)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'playbackPause'), self.media_pause_msg)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'playbackStop'), self.media_stop_msg)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'seekSlider'), self.media_seek)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'seekSlider'), self.media_seek_msg)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'volumeSlider'), self.media_volume_msg)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'media_hide'), self.media_hide)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'media_blank'), self.media_blank)
@ -242,9 +284,10 @@ class MediaController(object):
icon=u':/slides/media_playback_stop.png',
tooltip=translate('OpenLP.SlideController', 'Stop playing media.'), triggers=controller.sendToPlugins)
# Build the seekSlider.
controller.seekSlider = QtGui.QSlider(QtCore.Qt.Horizontal)
controller.seekSlider = MediaSlider(QtCore.Qt.Horizontal, self, controller)
controller.seekSlider.setMaximum(1000)
controller.seekSlider.setTracking(False)
controller.seekSlider.setTracking(True)
controller.seekSlider.setMouseTracking(True)
controller.seekSlider.setToolTip(translate('OpenLP.SlideController', 'Video position.'))
controller.seekSlider.setGeometry(QtCore.QRect(90, 260, 221, 24))
controller.seekSlider.setObjectName(u'seekSlider')
@ -591,7 +634,7 @@ class MediaController(object):
self.currentMediaPlayer[controller.controllerType].volume(display, volume)
controller.volumeSlider.setValue(volume)
def media_seek(self, msg):
def media_seek_msg(self, msg):
"""
Responds to the request to change the seek Slider of a loaded video
@ -602,6 +645,17 @@ class MediaController(object):
log.debug(u'media_seek')
controller = msg[0]
seekVal = msg[1][0]
self.media_seek(controller, seekVal)
def media_seek(self, controller, seekVal):
"""
Responds to the request to change the seek Slider of a loaded video
``msg``
First element is the controller which should be used
Second element is a list with the seek Value as first element
"""
log.debug(u'media_seek')
display = self._define_display(controller)
self.currentMediaPlayer[controller.controllerType].seek(display, seekVal)

View File

@ -216,6 +216,7 @@ class VlcPlayer(MediaPlayer):
def seek(self, display, seekVal):
if display.vlcMediaPlayer.is_seekable():
print "seeking"
display.vlcMediaPlayer.set_time(seekVal)
def reset(self, display):