From f4cc91f529358b11654ec99f405a2d12ddc5d0f4 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Wed, 28 Apr 2010 23:08:37 +0100 Subject: [PATCH] Show service and song text. Click on service item/song verse to go live --- openlp/core/ui/servicemanager.py | 29 ++++- openlp/core/ui/slidecontroller.py | 40 +++++++ .../presentations/lib/messagelistener.py | 1 + openlp/plugins/remotes/lib/httpserver.py | 110 +++++++++++++----- 4 files changed, 151 insertions(+), 29 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 5c0a2468a..0cb8a7d10 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -191,6 +191,8 @@ class ServiceManager(QtGui.QWidget): QtCore.SIGNAL(u'servicemanager_next_item'), self.nextItem) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'servicemanager_previous_item'), self.previousItem) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'servicemanager_set_item'), self.onSetItem) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'servicemanager_list_request'), self.listRequest) QtCore.QObject.connect(Receiver.get_receiver(), @@ -315,6 +317,21 @@ class ServiceManager(QtGui.QWidget): prevItem = serviceIterator.value() serviceIterator += 1 + def onSetItem(self, message): + """ + Called by a signal to select a specific item + """ + self.setItem(int(message[0])) + + def setItem(self, index): + """ + Makes a specific item in the service live + """ + if index >= 0 and index < self.ServiceManagerList.topLevelItemCount: + item = self.ServiceManagerList.topLevelItem(index) + self.ServiceManagerList.setCurrentItem(item) + self.makeLive() + def onMoveSelectionUp(self): """ Moves the selection up the window @@ -877,7 +894,17 @@ class ServiceManager(QtGui.QWidget): def listRequest(self, message=None): data = [] + curindex, count = self.findServiceItem() + if curindex >= 0 and curindex < len(self.serviceItems): + curitem = self.serviceItems[curindex] + else: + curitem = None for item in self.serviceItems: service_item = item[u'service_item'] - data.append([service_item.title]) + data_item = {} + data_item[u'title'] = unicode(service_item.title) + data_item[u'plugin'] = unicode(service_item.name) + data_item[u'notes'] = unicode(service_item.notes) + data_item[u'selected'] = (item == curitem) + data.append(data_item) Receiver.send_message(u'servicemanager_list_response', data) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 811fd51e3..9381a9f2b 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -341,6 +341,12 @@ class SlideController(QtGui.QWidget): QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'slidecontroller_%s_change' % self.type_prefix), self.onSlideChange) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_set' % self.type_prefix), + self.onSlideSelectedIndex) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_text_request' % self.type_prefix), + self.onTextRequest) QtCore.QObject.connect(self.Splitter, QtCore.SIGNAL(u'splitterMoved(int, int)'), self.trackSplitter) QtCore.QObject.connect(Receiver.get_receiver(), @@ -565,6 +571,25 @@ class SlideController(QtGui.QWidget): [serviceItem]) log.log(15, u'Display Rendering took %4s' % (time.time() - before)) + def onTextRequest(self): + """ + Return the text for the current item in controller + """ + data = [] + for framenumber, frame in enumerate(self.serviceItem.get_frames()): + data_item = {} + if self.serviceItem.is_text(): + data_item[u'tag'] = unicode(frame[u'verseTag']) + data_item[u'text'] = unicode(frame[u'text']) + else: + data_item[u'tag'] = unicode(framenumber) + data_item[u'text'] = u'' + data_item[u'selected'] = \ + (self.PreviewListWidget.currentRow() == framenumber) + data.append(data_item) + Receiver.send_message(u'slidecontroller_%s_text_response' % self.type_prefix, + data) + #Screen event methods def onSlideSelectedFirst(self): """ @@ -580,6 +605,21 @@ class SlideController(QtGui.QWidget): self.PreviewListWidget.selectRow(0) self.onSlideSelected() + def onSlideSelectedIndex(self, message): + """ + Go to the requested slide + """ + index = int(message[0]) + if not self.serviceItem: + return + Receiver.send_message(u'%s_slide' % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive, index]) + if self.serviceItem.is_command(): + self.updatePreview() + else: + self.PreviewListWidget.selectRow(index) + self.onSlideSelected() + def onBlankDisplay(self, force=False): """ Handle the blank screen button diff --git a/openlp/plugins/presentations/lib/messagelistener.py b/openlp/plugins/presentations/lib/messagelistener.py index 8a1ddc8c7..65ffbe726 100644 --- a/openlp/plugins/presentations/lib/messagelistener.py +++ b/openlp/plugins/presentations/lib/messagelistener.py @@ -235,6 +235,7 @@ class MessageListener(object): def slide(self, message): isLive, item = self.decode_message(message) + slide = message[2] if isLive: self.liveHandler.slide(slide, live) else: diff --git a/openlp/plugins/remotes/lib/httpserver.py b/openlp/plugins/remotes/lib/httpserver.py index 7346afba0..c9acbaccc 100644 --- a/openlp/plugins/remotes/lib/httpserver.py +++ b/openlp/plugins/remotes/lib/httpserver.py @@ -47,13 +47,15 @@ class HttpServer(object): def start_tcp(self): log.debug(u'Start TCP server') - port = self.parent.config.get_config(u'remote port', 4316) + port = QtCore.QSettings().value( + self.parent.settings_section + u'/remote port', + QtCore.QVariant(4316)).toInt()[0] self.server = QtNetwork.QTcpServer() self.server.listen(QtNetwork.QHostAddress(QtNetwork.QHostAddress.Any), - int(port)) + port) QtCore.QObject.connect(self.server, QtCore.SIGNAL(u'newConnection()'), self.new_connection) - log.debug(u'TCP listening on port %s' % port) + log.debug(u'TCP listening on port %d' % port) def new_connection(self): log.debug(u'new http connection') @@ -70,7 +72,10 @@ class HttpServer(object): self.server.close() class HttpConnection(object): - + """ + A single connection, this handles communication between the server + and the client + """ def __init__(self, parent, socket): log.debug(u'Initialise HttpConnection: %s' % socket.peerAddress().toString()) @@ -115,47 +120,96 @@ class HttpConnection(object): function send_event(eventname, data){ var req = new XMLHttpRequest(); - url = 'send/' + eventname; + req.onreadystatechange = function() { + if(req.readyState==4 && req.status==200) + response(eventname, req.responseText); + } + var url = ''; + if(eventname.substr(-8) == '_request') + url = 'request'; + else + url = 'send'; + url += '/' + eventname; if(data!=null) url += '?q=' + escape(data); req.open('GET', url, true); req.send(); } -function get_service(){ - var req = new XMLHttpRequest(); - req.onreadystatechange = function() { - if(req.readyState==4 && req.status==200){ - data = eval('(' + req.responseText + ')'); - html = ''; +function response(eventname, text){ + switch(eventname){ + case 'servicemanager_list_request': + var data = eval('(' + text + ')'); + var html = '
'; for(row in data){ - html += ''; + html += '' + html += '' + html += '' + html += '' + html += ''; } html += '
' + data[row][0] + '
' + data[row]['title'] + '' + data[row]['plugin'] + '' + data[row]['notes'] + '
'; - service = document.getElementById('service'); - service.innerHTML = html; - } + document.getElementById('service').innerHTML = html; + break; + case 'servicemanager_previous_item': + case 'servicemanager_next_item': + case 'servicemanager_set_item': + send_event("servicemanager_list_request"); + break; + case 'slidecontroller_live_text_request': + var data = eval('(' + text + ')'); + var html = ''; + for(row in data){ + html += '' + html += '' + html += ''; + } + html += '
' + data[row]['text'] + '
'; + document.getElementById('currentitem').innerHTML = html; + break; + case 'slidecontroller_live_next': + case 'slidecontroller_live_previous': + case 'slidecontroller_live_set': + send_event("slidecontroller_live_text_request"); + break; + } - req.open('GET', 'request/servicemanager_list_request', true); - req.send(); } +send_event("servicemanager_list_request");

OpenLP Controller

- - + +
- - -
- + + +
+ -
- -
-
+ document.getElementById("alert").value);' /> +
+ +
+ +
"""