Make service items work as well.

This commit is contained in:
Raoul Snyman 2011-03-03 22:18:10 +02:00
parent d1531eb8ad
commit 89db6772c4
3 changed files with 113 additions and 73 deletions

View File

@ -35,6 +35,7 @@ import urllib2
from datetime import datetime
from PyQt4 import QtGui, QtCore
if sys.platform != u'win32' and sys.platform != u'darwin':
try:
from xdg import BaseDirectory

View File

@ -26,4 +26,68 @@
"""
The :mod:`remotes` plugin allows OpenLP to be controlled from another machine
over a network connection.
Routes:
``/``
Go to the web interface.
``/files/{filename}``
Serve a static file.
``/api/poll``
Poll to see if there are any changes. Returns a JSON-encoded dict of
any changes that occurred::
{"results": {"type": "controller"}}
Or, if there were no results, False::
{"results": False}
``/api/controller/{live|preview}/{action}``
Perform ``{action}`` on the live or preview controller. Valid actions
are:
``next``
Load the next slide.
``previous``
Load the previous slide.
``jump``
Jump to a specific slide. Requires an id return in a JSON-encoded
dict like so::
{"request": {"id": 1}}
``first``
Load the first slide.
``last``
Load the last slide.
``text``
Request the text of the current slide.
``/api/service/{action}``
Perform ``{action}`` on the service manager (e.g. go live). Data is
passed as a json-encoded ``data`` parameter. Valid actions are:
``next``
Load the next item in the service.
``previous``
Load the previews item in the service.
``jump``
Jump to a specific item in the service. Requires an id returned in
a JSON-encoded dict like so::
{"request": {"id": 1}}
``list``
Request a list of items in the service.
"""

View File

@ -110,15 +110,15 @@ class HttpServer(object):
Slide change listener. Store the item and tell the clients
"""
self.current_slide = row
self.send_poll()
#self.send_poll()
def item_change(self, items):
"""
Item (song) change listener. Store the slide and tell the clients
"""
self.current_item = items[0].title
log.debug(pformat(items[0].__dict__, 2))
self.send_poll()
self.current_item = items[0]
#log.debug(pformat(items[0].__dict__, 2))
#self.send_poll()
def send_poll(self):
"""
@ -156,69 +156,6 @@ class HttpConnection(object):
"""
A single connection, this handles communication between the server
and the client
Routes:
``/``
Go to the web interface.
``/files/{filename}``
Serve a static file.
``/api/poll``
Poll to see if there are any changes. Returns a JSON-encoded dict of
any changes that occurred::
{"results": {"type": "controller"}}
Or, if there were no results, False::
{"results": False}
``/api/controller/{live|preview}/{action}``
Perform ``{action}`` on the live or preview controller. Valid actions
are:
``next``
Load the next slide.
``previous``
Load the previous slide.
``jump``
Jump to a specific slide. Requires an id return in a JSON-encoded
dict like so::
{"request": {"id": 1}}
``first``
Load the first slide.
``last``
Load the last slide.
``text``
Request the text of the current slide.
``/api/service/{action}``
Perform ``{action}`` on the service manager (e.g. go live). Data is
passed as a json-encoded ``data`` parameter. Valid actions are:
``next``
Load the next item in the service.
``previous``
Load the previews item in the service.
``jump``
Jump to a specific item in the service. Requires an id returned in
a JSON-encoded dict like so::
{"request": {"id": 1}}
``list``
Request a list of items in the service.
"""
def __init__(self, parent, socket):
"""
@ -242,6 +179,24 @@ class HttpConnection(object):
QtCore.QObject.connect(self.socket, QtCore.SIGNAL(u'disconnected()'),
self.disconnected)
def _get_service_items(self):
service_items = []
service_manager = self.parent.parent.serviceManager
item = service_manager.findServiceItem()[0]
if item >= 0 and item < len(service_manager.serviceItems):
curitem = service_manager.serviceItems[item]
else:
curitem = None
for item in service_manager.serviceItems:
service_item = item[u'service_item']
service_items.append({
u'title': unicode(service_item.get_display_title()),
u'plugin': unicode(service_item.name),
u'notes': unicode(service_item.notes),
u'selected': (item == curitem)
})
return service_items
def ready_read(self):
"""
Data has been sent from the client. Respond to it
@ -328,8 +283,12 @@ class HttpConnection(object):
"""
Poll OpenLP to determine the current slide number and item name.
"""
return HttpResponse(json.dumps({'slide': self.parent.current_slide,
'item': self.parent.current_item}),
result = {
u'slide': self.parent.current_slide or 0,
u'item': self.parent.current_item.title \
if self.parent.current_item else u''
}
return HttpResponse(json.dumps({u'results': result}),
{'Content-Type': 'application/json'})
def controller(self, type, action):
@ -345,7 +304,21 @@ class HttpConnection(object):
"""
event = u'slidecontroller_%s_%s' % (type, action)
if action == u'text':
event += u'_request'
current_item = self.parent.current_item
data = []
if current_item:
for index, frame in enumerate(current_item.get_frames()):
item = {}
if current_item.is_text():
item[u'tag'] = unicode(frame[u'verseTag'])
item[u'text'] = unicode(frame[u'html'])
else:
item[u'tag'] = unicode(index)
item[u'text'] = u''
item[u'selected'] = (self.parent.current_slide == index)
data.append(item)
json_data = {u'results': {u'slides': data}}
else:
Receiver.send_message(event)
json_data = {u'results': {u'success': True}}
#if action == u'text':
@ -356,7 +329,9 @@ class HttpConnection(object):
def service(self, action):
event = u'servicemanager_%s' % action
if action == u'list':
event += u'_request'
return HttpResponse(
json.dumps({'results': self._get_service_items()}),
{'Content-Type': 'application/json'})
else:
event += u'_item'
if self.url_params and self.url_params.get(u'data'):