From 5e702c17826f192200c80d96e68e6bdeea4b5786 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 23 Nov 2011 06:05:42 +0000 Subject: [PATCH 1/4] Fixes keyboard flood where events are switched order by PYQT. Now a keyboard press is only handled if the previous is finished. Fixes: https://launchpad.net/bugs/892571 --- openlp/core/ui/slidecontroller.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index d871dc474..1d634c0a5 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -79,6 +79,7 @@ class SlideController(QtGui.QWidget): self.songEdit = False self.selectedRow = 0 self.serviceItem = None + self.accept_keypress = True self.panel = QtGui.QWidget(parent.controlSplitter) self.slideList = {} # Layout for holding panel @@ -578,12 +579,17 @@ class SlideController(QtGui.QWidget): self.display.videoStop() def servicePrevious(self): - time.sleep(0.1) - Receiver.send_message('servicemanager_previous_item') + if self.accept_keypress: + self.accept_keypress = False + Receiver.send_message('servicemanager_previous_item') + self.accept_keypress = True def serviceNext(self): - time.sleep(0.1) - Receiver.send_message('servicemanager_next_item') + if self.accept_keypress: + self.accept_keypress = False + Receiver.send_message('servicemanager_next_item') + self.accept_keypress = True + def screenSizeChanged(self): """ @@ -771,7 +777,7 @@ class SlideController(QtGui.QWidget): log.debug(u'processManagerItem live = %s' % self.isLive) self.onStopLoop() old_item = self.serviceItem - # take a copy not a link to the servicemeanager copy. + # take a copy not a link to the servicemanager copy. self.serviceItem = copy.copy(serviceItem) if old_item and self.isLive and old_item.is_capable( ItemCapabilities.ProvidesOwnDisplay): From ef884792aca175d726bb7a28cd3b075d80b1524d Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 27 Nov 2011 16:08:42 +0000 Subject: [PATCH 2/4] Move to reference counting --- openlp/core/ui/slidecontroller.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 1d634c0a5..1e5328c7e 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -79,7 +79,7 @@ class SlideController(QtGui.QWidget): self.songEdit = False self.selectedRow = 0 self.serviceItem = None - self.accept_keypress = True + self.keypress_count = 0 self.panel = QtGui.QWidget(parent.controlSplitter) self.slideList = {} # Layout for holding panel @@ -579,16 +579,18 @@ class SlideController(QtGui.QWidget): self.display.videoStop() def servicePrevious(self): - if self.accept_keypress: - self.accept_keypress = False - Receiver.send_message('servicemanager_previous_item') - self.accept_keypress = True + self.keypress_count += 1 + if self.keypress_count == 1: + while self.keypress_count != 0: + Receiver.send_message('servicemanager_previous_item') + self.keypress_count -= 1 def serviceNext(self): - if self.accept_keypress: - self.accept_keypress = False - Receiver.send_message('servicemanager_next_item') - self.accept_keypress = True + self.keypress_count += 1 + if self.keypress_count == 1: + while self.keypress_count != 0: + Receiver.send_message('servicemanager_next_item') + self.keypress_count -= 1 def screenSizeChanged(self): From 4f629dfd3bec3707b9dd3750e28e6868e809f5e1 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 28 Nov 2011 17:10:00 +0000 Subject: [PATCH 3/4] Implement a queue to process the requests --- openlp/core/ui/slidecontroller.py | 37 +++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 1e5328c7e..2fe16b406 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -26,9 +26,9 @@ ############################################################################### import logging -import os import time import copy +from collections import deque from PyQt4 import QtCore, QtGui from PyQt4.phonon import Phonon @@ -79,7 +79,6 @@ class SlideController(QtGui.QWidget): self.songEdit = False self.selectedRow = 0 self.serviceItem = None - self.keypress_count = 0 self.panel = QtGui.QWidget(parent.controlSplitter) self.slideList = {} # Layout for holding panel @@ -92,6 +91,7 @@ class SlideController(QtGui.QWidget): self.typeLabel.setText(UiStrings().Live) self.split = 1 self.typePrefix = u'live' + self.keypress_queue = deque() else: self.typeLabel.setText(UiStrings().Preview) self.split = 0 @@ -579,18 +579,31 @@ class SlideController(QtGui.QWidget): self.display.videoStop() def servicePrevious(self): - self.keypress_count += 1 - if self.keypress_count == 1: - while self.keypress_count != 0: - Receiver.send_message('servicemanager_previous_item') - self.keypress_count -= 1 + """ + Live event to select the previous service item from the service manager. + """ + self.keypress_queue.append(u'previous') + self._process_queue() + def serviceNext(self): - self.keypress_count += 1 - if self.keypress_count == 1: - while self.keypress_count != 0: - Receiver.send_message('servicemanager_next_item') - self.keypress_count -= 1 + """ + Live event to select the next service item from the service manager. + """ + self.keypress_queue.append(u'next') + self._process_queue() + + def _process_queue(self): + """ + Process the service item request queue. The key presses can arrive + faster than the processing so implement a FIFO queue. + """ + if len(self.keypress_queue): + while len(self.keypress_queue): + if self.keypress_queue.popleft() == u'previous': + Receiver.send_message('servicemanager_previous_item') + else: + Receiver.send_message('servicemanager_next_item') def screenSizeChanged(self): From 8b8a67c1f7c267cbadc9665e94698b016977dde9 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 28 Nov 2011 18:03:38 +0000 Subject: [PATCH 4/4] Fix double loop entry --- openlp/core/ui/slidecontroller.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 2fe16b406..7ea288dc5 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -91,7 +91,8 @@ class SlideController(QtGui.QWidget): self.typeLabel.setText(UiStrings().Live) self.split = 1 self.typePrefix = u'live' - self.keypress_queue = deque() + self.keypress_queue = deque() + self.keypress_loop = False else: self.typeLabel.setText(UiStrings().Preview) self.split = 0 @@ -599,11 +600,13 @@ class SlideController(QtGui.QWidget): faster than the processing so implement a FIFO queue. """ if len(self.keypress_queue): - while len(self.keypress_queue): + while len(self.keypress_queue) and not self.keypress_loop: + self.keypress_loop = True if self.keypress_queue.popleft() == u'previous': Receiver.send_message('servicemanager_previous_item') else: Receiver.send_message('servicemanager_next_item') + self.keypress_loop = False def screenSizeChanged(self):