mirror of https://gitlab.com/openlp/openlp.git
More cleanups
This commit is contained in:
parent
5ca6d36935
commit
ad7d78ff26
|
@ -247,7 +247,7 @@ class Renderer(object):
|
|||
serviceItem.footer = footer
|
||||
serviceItem.render(True)
|
||||
if not self.force_page:
|
||||
self.display.buildHtml(serviceItem)
|
||||
self.display.build_html(serviceItem)
|
||||
raw_html = serviceItem.get_rendered_frame(0)
|
||||
self.display.text(raw_html, False)
|
||||
preview = self.display.preview()
|
||||
|
|
|
@ -85,37 +85,34 @@ class Display(QtGui.QGraphicsView):
|
|||
log.debug(u'Start Display base setup (live = %s)' % self.isLive)
|
||||
self.setGeometry(self.screen[u'size'])
|
||||
log.debug(u'Setup webView')
|
||||
self.webView = QtWebKit.QWebView(self)
|
||||
self.webView.setGeometry(0, 0, self.screen[u'size'].width(), self.screen[u'size'].height())
|
||||
self.webView.settings().setAttribute(QtWebKit.QWebSettings.PluginsEnabled, True)
|
||||
palette = self.webView.palette()
|
||||
self.web_view = QtWebKit.QWebView(self)
|
||||
self.web_view.setGeometry(0, 0, self.screen[u'size'].width(), self.screen[u'size'].height())
|
||||
self.web_view.settings().setAttribute(QtWebKit.QWebSettings.PluginsEnabled, True)
|
||||
palette = self.web_view.palette()
|
||||
palette.setBrush(QtGui.QPalette.Base, QtCore.Qt.transparent)
|
||||
self.webView.page().setPalette(palette)
|
||||
self.webView.setAttribute(QtCore.Qt.WA_OpaquePaintEvent, False)
|
||||
self.page = self.webView.page()
|
||||
self.web_view.page().setPalette(palette)
|
||||
self.web_view.setAttribute(QtCore.Qt.WA_OpaquePaintEvent, False)
|
||||
self.page = self.web_view.page()
|
||||
self.frame = self.page.mainFrame()
|
||||
if self.isLive and log.getEffectiveLevel() == logging.DEBUG:
|
||||
self.webView.settings().setAttribute(QtWebKit.QWebSettings.DeveloperExtrasEnabled, True)
|
||||
QtCore.QObject.connect(self.webView,
|
||||
QtCore.SIGNAL(u'loadFinished(bool)'), self.isWebLoaded)
|
||||
self.web_view.settings().setAttribute(QtWebKit.QWebSettings.DeveloperExtrasEnabled, True)
|
||||
self.web_view.loadFinished.connect(self.is_web_loaded)
|
||||
self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
|
||||
self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
|
||||
self.frame.setScrollBarPolicy(QtCore.Qt.Vertical,
|
||||
QtCore.Qt.ScrollBarAlwaysOff)
|
||||
self.frame.setScrollBarPolicy(QtCore.Qt.Horizontal,
|
||||
QtCore.Qt.ScrollBarAlwaysOff)
|
||||
self.frame.setScrollBarPolicy(QtCore.Qt.Vertical, QtCore.Qt.ScrollBarAlwaysOff)
|
||||
self.frame.setScrollBarPolicy(QtCore.Qt.Horizontal, QtCore.Qt.ScrollBarAlwaysOff)
|
||||
|
||||
def resizeEvent(self, event):
|
||||
"""
|
||||
React to resizing of this display
|
||||
"""
|
||||
self.webView.setGeometry(0, 0, self.width(), self.height())
|
||||
self.web_view.setGeometry(0, 0, self.width(), self.height())
|
||||
|
||||
def isWebLoaded(self):
|
||||
def is_web_loaded(self):
|
||||
"""
|
||||
Called by webView event to show display is fully loaded
|
||||
"""
|
||||
log.debug(u'Webloaded')
|
||||
log.debug(u'is web loaded')
|
||||
self.webLoaded = True
|
||||
|
||||
|
||||
|
@ -129,11 +126,11 @@ class MainDisplay(Display):
|
|||
"""
|
||||
Display.__init__(self, parent, live, controller)
|
||||
self.screens = ScreenList()
|
||||
self.rebuildCSS = False
|
||||
self.hideMode = None
|
||||
self.rebuild_css = False
|
||||
self.hide_mode = None
|
||||
self.override = {}
|
||||
self.retranslateUi()
|
||||
self.mediaObject = None
|
||||
self.media_object = None
|
||||
if live:
|
||||
self.audioPlayer = AudioPlayer(self)
|
||||
else:
|
||||
|
@ -156,14 +153,14 @@ class MainDisplay(Display):
|
|||
self.setWindowState(QtCore.Qt.WindowFullScreen)
|
||||
self.setWindowFlags(windowFlags)
|
||||
self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
|
||||
self.setTransparency(False)
|
||||
self.set_transparency(False)
|
||||
if self.isLive:
|
||||
Registry().register_function(u'live_display_hide', self.hide_display)
|
||||
Registry().register_function(u'live_display_show', self.show_display)
|
||||
Registry().register_function(u'update_display_css', self.css_changed)
|
||||
Registry().register_function(u'config_updated', self.config_changed)
|
||||
|
||||
def setTransparency(self, enabled):
|
||||
def set_transparency(self, enabled):
|
||||
"""
|
||||
Set the transparency of the window
|
||||
"""
|
||||
|
@ -178,17 +175,17 @@ class MainDisplay(Display):
|
|||
"""
|
||||
We may need to rebuild the CSS on the live display.
|
||||
"""
|
||||
self.rebuildCSS = True
|
||||
self.rebuild_css = True
|
||||
|
||||
def config_changed(self):
|
||||
"""
|
||||
Call the plugins to rebuild the Live display CSS as the screen has
|
||||
not been rebuild on exit of config.
|
||||
"""
|
||||
if self.rebuildCSS and self.plugin_manager.plugins:
|
||||
if self.rebuild_css and self.plugin_manager.plugins:
|
||||
for plugin in self.plugin_manager.plugins:
|
||||
plugin.refreshCss(self.frame)
|
||||
self.rebuildCSS = False
|
||||
self.rebuild_css = False
|
||||
|
||||
def retranslateUi(self):
|
||||
"""
|
||||
|
@ -225,7 +222,7 @@ class MainDisplay(Display):
|
|||
splash_image)
|
||||
serviceItem = ServiceItem()
|
||||
serviceItem.bg_image_bytes = image_to_byte(self.initialFrame)
|
||||
self.webView.setHtml(build_html(serviceItem, self.screen, self.isLive, None,
|
||||
self.web_view.setHtml(build_html(serviceItem, self.screen, self.isLive, None,
|
||||
plugins=self.plugin_manager.plugins))
|
||||
self.__hideMouse()
|
||||
log.debug(u'Finished MainDisplay setup')
|
||||
|
@ -288,7 +285,7 @@ class MainDisplay(Display):
|
|||
self.setVisible(False)
|
||||
self.setGeometry(self.screen[u'size'])
|
||||
|
||||
def directImage(self, path, background):
|
||||
def direct_image(self, path, background):
|
||||
"""
|
||||
API for replacement backgrounds so Images are added directly to cache.
|
||||
"""
|
||||
|
@ -318,7 +315,7 @@ class MainDisplay(Display):
|
|||
self.controller.media_controller.media_reset(self.controller)
|
||||
self.displayImage(image)
|
||||
|
||||
def displayImage(self, image):
|
||||
def display_image(self, image):
|
||||
"""
|
||||
Display an image, as is.
|
||||
"""
|
||||
|
@ -329,16 +326,16 @@ class MainDisplay(Display):
|
|||
js = u'show_image("");'
|
||||
self.frame.evaluateJavaScript(js)
|
||||
|
||||
def resetImage(self):
|
||||
def reset_image(self):
|
||||
"""
|
||||
Reset the backgound image to the service item image. Used after the
|
||||
image plugin has changed the background.
|
||||
"""
|
||||
log.debug(u'resetImage')
|
||||
if hasattr(self, u'serviceItem'):
|
||||
self.displayImage(self.serviceItem.bg_image_bytes)
|
||||
self.display_image(self.serviceItem.bg_image_bytes)
|
||||
else:
|
||||
self.displayImage(None)
|
||||
self.display_image(None)
|
||||
# clear the cache
|
||||
self.override = {}
|
||||
|
||||
|
@ -361,8 +358,8 @@ class MainDisplay(Display):
|
|||
self.application.process_events()
|
||||
# if was hidden keep it hidden
|
||||
if self.isLive:
|
||||
if self.hideMode:
|
||||
self.hide_display(self.hideMode)
|
||||
if self.hide_mode:
|
||||
self.hide_display(self.hide_mode)
|
||||
else:
|
||||
# Single screen active
|
||||
if self.screens.display_count == 1:
|
||||
|
@ -373,12 +370,12 @@ class MainDisplay(Display):
|
|||
self.setVisible(True)
|
||||
return QtGui.QPixmap.grabWidget(self)
|
||||
|
||||
def buildHtml(self, serviceItem, image_path=u''):
|
||||
def build_html(self, serviceItem, image_path=u''):
|
||||
"""
|
||||
Store the serviceItem and build the new HTML from it. Add the
|
||||
HTML to the display
|
||||
"""
|
||||
log.debug(u'buildHtml')
|
||||
log.debug(u'build_html')
|
||||
self.webLoaded = False
|
||||
self.initialFrame = None
|
||||
self.serviceItem = serviceItem
|
||||
|
@ -396,12 +393,11 @@ class MainDisplay(Display):
|
|||
else:
|
||||
# replace the background
|
||||
background = self.image_manager.get_image_bytes(self.override[u'image'], ImageSource.ImagePlugin)
|
||||
self.setTransparency(self.serviceItem.themedata.background_type ==
|
||||
BackgroundType.to_string(BackgroundType.Transparent))
|
||||
self.set_transparency(self.serviceItem.themedata.background_type ==
|
||||
BackgroundType.to_string(BackgroundType.Transparent))
|
||||
if self.serviceItem.themedata.background_filename:
|
||||
self.serviceItem.bg_image_bytes = self.image_manager.get_image_bytes(
|
||||
self.serviceItem.themedata.background_filename,
|
||||
ImageSource.Theme
|
||||
self.serviceItem.themedata.background_filename, ImageSource.Theme
|
||||
)
|
||||
if image_path:
|
||||
image_bytes = self.image_manager.get_image_bytes(image_path, ImageSource.ImagePlugin)
|
||||
|
@ -410,16 +406,16 @@ class MainDisplay(Display):
|
|||
html = build_html(self.serviceItem, self.screen, self.isLive, background, image_bytes,
|
||||
plugins=self.plugin_manager.plugins)
|
||||
log.debug(u'buildHtml - pre setHtml')
|
||||
self.webView.setHtml(html)
|
||||
self.web_view.setHtml(html)
|
||||
log.debug(u'buildHtml - post setHtml')
|
||||
if serviceItem.foot_text:
|
||||
self.footer(serviceItem.foot_text)
|
||||
# if was hidden keep it hidden
|
||||
if self.hideMode and self.isLive and not serviceItem.is_media():
|
||||
if self.hide_mode and self.isLive and not serviceItem.is_media():
|
||||
if Settings().value(u'general/auto unblank'):
|
||||
Registry().execute(u'slidecontroller_live_unblank')
|
||||
else:
|
||||
self.hide_display(self.hideMode)
|
||||
self.hide_display(self.hide_mode)
|
||||
self.__hideMouse()
|
||||
|
||||
def footer(self, text):
|
||||
|
@ -450,13 +446,12 @@ class MainDisplay(Display):
|
|||
if mode != HideMode.Screen:
|
||||
if self.isHidden():
|
||||
self.setVisible(True)
|
||||
self.webView.setVisible(True)
|
||||
self.hideMode = mode
|
||||
self.web_view.setVisible(True)
|
||||
self.hide_mode = mode
|
||||
|
||||
def show_display(self):
|
||||
"""
|
||||
Show the stored layers so the screen reappears as it was
|
||||
originally.
|
||||
Show the stored layers so the screen reappears as it was originally.
|
||||
Make the stored images None to release memory.
|
||||
"""
|
||||
log.debug(u'show_display')
|
||||
|
@ -467,7 +462,7 @@ class MainDisplay(Display):
|
|||
self.frame.evaluateJavaScript('show_blank("show");')
|
||||
if self.isHidden():
|
||||
self.setVisible(True)
|
||||
self.hideMode = None
|
||||
self.hide_mode = None
|
||||
# Trigger actions when display is active again.
|
||||
if self.isLive:
|
||||
Registry().execute(u'live_display_active')
|
||||
|
@ -533,38 +528,38 @@ class AudioPlayer(QtCore.QObject):
|
|||
self.currentIndex = -1
|
||||
self.playlist = []
|
||||
self.repeat = False
|
||||
self.mediaObject = Phonon.MediaObject()
|
||||
self.mediaObject.setTickInterval(100)
|
||||
self.audioObject = Phonon.AudioOutput(Phonon.VideoCategory)
|
||||
Phonon.createPath(self.mediaObject, self.audioObject)
|
||||
QtCore.QObject.connect(self.mediaObject, QtCore.SIGNAL(u'aboutToFinish()'), self.onAboutToFinish)
|
||||
QtCore.QObject.connect(self.mediaObject, QtCore.SIGNAL(u'finished()'), self.onFinished)
|
||||
self.media_object = Phonon.MediaObject()
|
||||
self.media_object.setTickInterval(100)
|
||||
self.audio_object = Phonon.AudioOutput(Phonon.VideoCategory)
|
||||
Phonon.createPath(self.media_object, self.audio_object)
|
||||
self.media_object.aboutToFinish.connect(self.on_about_to_finish)
|
||||
self.media_object.finished.connect(self.on_finished)
|
||||
|
||||
def __del__(self):
|
||||
"""
|
||||
Shutting down so clean up connections
|
||||
"""
|
||||
self.stop()
|
||||
for path in self.mediaObject.outputPaths():
|
||||
for path in self.media_object.outputPaths():
|
||||
path.disconnect()
|
||||
|
||||
def onAboutToFinish(self):
|
||||
def on_about_to_finish(self):
|
||||
"""
|
||||
Just before the audio player finishes the current track, queue the next
|
||||
item in the playlist, if there is one.
|
||||
"""
|
||||
self.currentIndex += 1
|
||||
if len(self.playlist) > self.currentIndex:
|
||||
self.mediaObject.enqueue(self.playlist[self.currentIndex])
|
||||
self.media_object.enqueue(self.playlist[self.currentIndex])
|
||||
|
||||
def onFinished(self):
|
||||
def on_finished(self):
|
||||
"""
|
||||
When the audio track finishes.
|
||||
"""
|
||||
if self.repeat:
|
||||
log.debug(u'Repeat is enabled... here we go again!')
|
||||
self.mediaObject.clearQueue()
|
||||
self.mediaObject.clear()
|
||||
self.media_object.clearQueue()
|
||||
self.media_object.clear()
|
||||
self.currentIndex = -1
|
||||
self.play()
|
||||
|
||||
|
@ -572,7 +567,7 @@ class AudioPlayer(QtCore.QObject):
|
|||
"""
|
||||
Connect the volume slider to the output channel.
|
||||
"""
|
||||
slider.setAudioOutput(self.audioObject)
|
||||
slider.setAudioOutput(self.audio_object)
|
||||
|
||||
def reset(self):
|
||||
"""
|
||||
|
@ -581,7 +576,7 @@ class AudioPlayer(QtCore.QObject):
|
|||
self.currentIndex = -1
|
||||
self.playlist = []
|
||||
self.stop()
|
||||
self.mediaObject.clear()
|
||||
self.media_object.clear()
|
||||
|
||||
def play(self):
|
||||
"""
|
||||
|
@ -589,24 +584,24 @@ class AudioPlayer(QtCore.QObject):
|
|||
"""
|
||||
log.debug(u'AudioPlayer.play() called')
|
||||
if self.currentIndex == -1:
|
||||
self.onAboutToFinish()
|
||||
self.mediaObject.play()
|
||||
self.on_about_to_finish()
|
||||
self.media_object.play()
|
||||
|
||||
def pause(self):
|
||||
"""
|
||||
Pause the Audio
|
||||
"""
|
||||
log.debug(u'AudioPlayer.pause() called')
|
||||
self.mediaObject.pause()
|
||||
self.media_object.pause()
|
||||
|
||||
def stop(self):
|
||||
"""
|
||||
Stop the Audio and clean up
|
||||
"""
|
||||
log.debug(u'AudioPlayer.stop() called')
|
||||
self.mediaObject.stop()
|
||||
self.media_object.stop()
|
||||
|
||||
def addToPlaylist(self, filenames):
|
||||
def add_to_playlist(self, filenames):
|
||||
"""
|
||||
Add another file to the playlist.
|
||||
|
||||
|
@ -623,31 +618,24 @@ class AudioPlayer(QtCore.QObject):
|
|||
"""
|
||||
if not self.repeat and self.currentIndex + 1 >= len(self.playlist):
|
||||
return
|
||||
isPlaying = self.mediaObject.state() == Phonon.PlayingState
|
||||
isPlaying = self.media_object.state() == Phonon.PlayingState
|
||||
self.currentIndex += 1
|
||||
if self.repeat and self.currentIndex == len(self.playlist):
|
||||
self.currentIndex = 0
|
||||
self.mediaObject.clearQueue()
|
||||
self.mediaObject.clear()
|
||||
self.mediaObject.enqueue(self.playlist[self.currentIndex])
|
||||
self.media_object.clearQueue()
|
||||
self.media_object.clear()
|
||||
self.media_object.enqueue(self.playlist[self.currentIndex])
|
||||
if isPlaying:
|
||||
self.mediaObject.play()
|
||||
self.media_object.play()
|
||||
|
||||
def goTo(self, index):
|
||||
def go_to(self, index):
|
||||
"""
|
||||
Go to a particular track in the list
|
||||
"""
|
||||
isPlaying = self.mediaObject.state() == Phonon.PlayingState
|
||||
self.mediaObject.clearQueue()
|
||||
self.mediaObject.clear()
|
||||
isPlaying = self.media_object.state() == Phonon.PlayingState
|
||||
self.media_object.clearQueue()
|
||||
self.media_object.clear()
|
||||
self.currentIndex = index
|
||||
self.mediaObject.enqueue(self.playlist[self.currentIndex])
|
||||
self.media_object.enqueue(self.playlist[self.currentIndex])
|
||||
if isPlaying:
|
||||
self.mediaObject.play()
|
||||
|
||||
#@todo is this used?
|
||||
def connectSlot(self, signal, slot):
|
||||
"""
|
||||
Connect a slot to a signal on the media object
|
||||
"""
|
||||
QtCore.QObject.connect(self.mediaObject, signal, slot)
|
||||
self.media_object.play()
|
||||
|
|
|
@ -307,8 +307,8 @@ class WebkitPlayer(MediaPlayer):
|
|||
"""
|
||||
Set up the player
|
||||
"""
|
||||
display.webView.resize(display.size())
|
||||
display.webView.raise_()
|
||||
display.web_view.resize(display.size())
|
||||
display.web_view.raise_()
|
||||
self.hasOwnWidget = False
|
||||
|
||||
def check_available(self):
|
||||
|
@ -333,7 +333,7 @@ class WebkitPlayer(MediaPlayer):
|
|||
loop = u'true'
|
||||
else:
|
||||
loop = u'false'
|
||||
display.webView.setVisible(True)
|
||||
display.web_view.setVisible(True)
|
||||
if controller.media_info.file_info.suffix() == u'swf':
|
||||
controller.media_info.is_flash = True
|
||||
js = u'show_flash("load","%s");' % (path.replace(u'\\', u'\\\\'))
|
||||
|
@ -346,14 +346,14 @@ class WebkitPlayer(MediaPlayer):
|
|||
"""
|
||||
Resize the player
|
||||
"""
|
||||
display.webView.resize(display.size())
|
||||
display.web_view.resize(display.size())
|
||||
|
||||
def play(self, display):
|
||||
"""
|
||||
Play a video
|
||||
"""
|
||||
controller = display.controller
|
||||
display.webLoaded = True
|
||||
display.web_loaded = True
|
||||
length = 0
|
||||
start_time = 0
|
||||
if self.state != MediaState.Paused and controller.media_info.start_time > 0:
|
||||
|
@ -368,7 +368,7 @@ class WebkitPlayer(MediaPlayer):
|
|||
# TODO add playing check and get the correct media length
|
||||
controller.media_info.length = length
|
||||
self.state = MediaState.Playing
|
||||
display.webView.raise_()
|
||||
display.web_view.raise_()
|
||||
return True
|
||||
|
||||
def pause(self, display):
|
||||
|
|
|
@ -538,7 +538,7 @@ class SlideController(DisplayController):
|
|||
self.previewSizeChanged()
|
||||
self.previewDisplay.setup()
|
||||
serviceItem = ServiceItem()
|
||||
self.previewDisplay.webView.setHtml(build_html(serviceItem, self.previewDisplay.screen, None, self.isLive,
|
||||
self.previewDisplay.web_view.setHtml(build_html(serviceItem, self.previewDisplay.screen, None, self.isLive,
|
||||
plugins=self.plugin_manager.plugins))
|
||||
self.media_controller.setup_display(self.previewDisplay, True)
|
||||
if self.serviceItem:
|
||||
|
@ -760,7 +760,7 @@ class SlideController(DisplayController):
|
|||
# If the current item has background audio
|
||||
if self.serviceItem.is_capable(ItemCapabilities.HasBackgroundAudio):
|
||||
log.debug(u'Starting to play...')
|
||||
self.display.audioPlayer.addToPlaylist(self.serviceItem.background_audio)
|
||||
self.display.audioPlayer.add_to_playlist(self.serviceItem.background_audio)
|
||||
self.trackMenu.clear()
|
||||
for counter in range(len(self.serviceItem.background_audio)):
|
||||
action = self.trackMenu.addAction(os.path.basename(self.serviceItem.background_audio[counter]))
|
||||
|
@ -831,7 +831,7 @@ class SlideController(DisplayController):
|
|||
# Postpone image build, we need to do this later to avoid the theme
|
||||
# flashing on the screen
|
||||
if not self.serviceItem.is_image():
|
||||
self.display.buildHtml(self.serviceItem)
|
||||
self.display.build_html(self.serviceItem)
|
||||
if serviceItem.is_media():
|
||||
self.onMediaStart(serviceItem)
|
||||
self.slideSelected(True)
|
||||
|
@ -1025,7 +1025,7 @@ class SlideController(DisplayController):
|
|||
self.display.text(to_display)
|
||||
else:
|
||||
if start:
|
||||
self.display.buildHtml(self.serviceItem, to_display)
|
||||
self.display.build_html(self.serviceItem, to_display)
|
||||
else:
|
||||
self.display.image(to_display)
|
||||
# reset the store used to display first image
|
||||
|
@ -1333,7 +1333,7 @@ class SlideController(DisplayController):
|
|||
Start playing a track
|
||||
"""
|
||||
action = self.sender()
|
||||
self.display.audioPlayer.goTo(action.data())
|
||||
self.display.audioPlayer.go_to(action.data())
|
||||
|
||||
def _get_plugin_manager(self):
|
||||
"""
|
||||
|
|
|
@ -192,7 +192,7 @@ class ImageMediaItem(MediaManagerItem):
|
|||
Called to reset the Live background with the image selected,
|
||||
"""
|
||||
self.resetAction.setVisible(False)
|
||||
self.live_controller.display.resetImage()
|
||||
self.live_controller.display.reset_image()
|
||||
|
||||
def live_theme_changed(self):
|
||||
"""
|
||||
|
@ -211,7 +211,7 @@ class ImageMediaItem(MediaManagerItem):
|
|||
bitem = self.listView.item(item.row())
|
||||
filename = bitem.data(QtCore.Qt.UserRole)
|
||||
if os.path.exists(filename):
|
||||
if self.live_controller.display.directImage(filename, background):
|
||||
if self.live_controller.display.direct_image(filename, background):
|
||||
self.resetAction.setVisible(True)
|
||||
else:
|
||||
critical_error_message_box(UiStrings().LiveBGError,
|
||||
|
|
|
@ -129,6 +129,7 @@ from openlp.core.utils import AppLocation, translate
|
|||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class HttpResponse(object):
|
||||
"""
|
||||
A simple object to encapsulate a pseudo-http response.
|
||||
|
@ -178,7 +179,7 @@ class HttpServer(object):
|
|||
self.server.listen(QtNetwork.QHostAddress(address), port)
|
||||
Registry().register_function(u'slidecontroller_live_changed', self.slide_change)
|
||||
Registry().register_function(u'slidecontroller_live_started', self.item_change)
|
||||
QtCore.QObject.connect(self.server, QtCore.SIGNAL(u'newConnection()'), self.new_connection)
|
||||
self.server.newConnection.connect(self.new_connection)
|
||||
log.debug(u'TCP listening on port %d' % port)
|
||||
|
||||
def slide_change(self, row):
|
||||
|
@ -245,8 +246,8 @@ class HttpConnection(object):
|
|||
(r'^/api/(.*)/live$', self.go_live),
|
||||
(r'^/api/(.*)/add$', self.add_to_service)
|
||||
]
|
||||
QtCore.QObject.connect(self.socket, QtCore.SIGNAL(u'readyRead()'), self.ready_read)
|
||||
QtCore.QObject.connect(self.socket, QtCore.SIGNAL(u'disconnected()'), self.disconnected)
|
||||
self.socket.readyRead.connect(self.ready_read)
|
||||
self.socket.disconnected.connect(self.disconnected)
|
||||
self.translate()
|
||||
|
||||
def _get_service_items(self):
|
||||
|
@ -255,7 +256,7 @@ class HttpConnection(object):
|
|||
current_unique_identifier = self.parent.current_item.unique_identifier
|
||||
else:
|
||||
current_unique_identifier = None
|
||||
for item in self.service_manager.serviceItems:
|
||||
for item in self.service_manager.service_items:
|
||||
service_item = item[u'service_item']
|
||||
service_items.append({
|
||||
u'id': unicode(service_item.unique_identifier),
|
||||
|
@ -389,13 +390,12 @@ class HttpConnection(object):
|
|||
u'service': self.service_manager.service_id,
|
||||
u'slide': self.parent.current_slide or 0,
|
||||
u'item': self.parent.current_item.unique_identifier if self.parent.current_item else u'',
|
||||
u'twelve':Settings().value(u'remotes/twelve hour'),
|
||||
u'twelve': Settings().value(u'remotes/twelve hour'),
|
||||
u'blank': self.live_controller.blankScreen.isChecked(),
|
||||
u'theme': self.live_controller.themeScreen.isChecked(),
|
||||
u'display': self.live_controller.desktopScreen.isChecked()
|
||||
}
|
||||
return HttpResponse(json.dumps({u'results': result}),
|
||||
{u'Content-Type': u'application/json'})
|
||||
return HttpResponse(json.dumps({u'results': result}), {u'Content-Type': u'application/json'})
|
||||
|
||||
def display(self, action):
|
||||
"""
|
||||
|
@ -426,18 +426,17 @@ class HttpConnection(object):
|
|||
return HttpResponse(json.dumps({u'results': {u'success': success}}),
|
||||
{u'Content-Type': u'application/json'})
|
||||
|
||||
def controller(self, type, action):
|
||||
def controller(self, display_type, action):
|
||||
"""
|
||||
Perform an action on the slide controller.
|
||||
|
||||
``type``
|
||||
This is the type of slide controller, either ``preview`` or
|
||||
``live``.
|
||||
``display_type``
|
||||
This is the type of slide controller, either ``preview`` or ``live``.
|
||||
|
||||
``action``
|
||||
The action to perform.
|
||||
"""
|
||||
event = u'slidecontroller_%s_%s' % (type, action)
|
||||
event = u'slidecontroller_%s_%s' % (display_type, action)
|
||||
if action == u'text':
|
||||
current_item = self.parent.current_item
|
||||
data = []
|
||||
|
@ -473,10 +472,15 @@ class HttpConnection(object):
|
|||
else:
|
||||
Registry().execute(event)
|
||||
json_data = {u'results': {u'success': True}}
|
||||
return HttpResponse(json.dumps(json_data),
|
||||
{u'Content-Type': u'application/json'})
|
||||
return HttpResponse(json.dumps(json_data), {u'Content-Type': u'application/json'})
|
||||
|
||||
def service(self, action):
|
||||
"""
|
||||
Handles requests for service items
|
||||
|
||||
``action``
|
||||
The action to perform.
|
||||
"""
|
||||
event = u'servicemanager_%s' % action
|
||||
if action == u'list':
|
||||
return HttpResponse(json.dumps({u'results': {u'items': self._get_service_items()}}),
|
||||
|
@ -491,8 +495,7 @@ class HttpConnection(object):
|
|||
Registry().execute(event, data[u'request'][u'id'])
|
||||
else:
|
||||
Registry().execute(event)
|
||||
return HttpResponse(json.dumps({u'results': {u'success': True}}),
|
||||
{u'Content-Type': u'application/json'})
|
||||
return HttpResponse(json.dumps({u'results': {u'success': True}}), {u'Content-Type': u'application/json'})
|
||||
|
||||
def pluginInfo(self, action):
|
||||
"""
|
||||
|
@ -507,15 +510,13 @@ class HttpConnection(object):
|
|||
for plugin in self.plugin_manager.plugins:
|
||||
if plugin.status == PluginStatus.Active and plugin.mediaItem and plugin.mediaItem.hasSearch:
|
||||
searches.append([plugin.name, unicode(plugin.textStrings[StringContent.Name][u'plural'])])
|
||||
return HttpResponse(
|
||||
json.dumps({u'results': {u'items': searches}}),
|
||||
{u'Content-Type': u'application/json'})
|
||||
return HttpResponse(json.dumps({u'results': {u'items': searches}}), {u'Content-Type': u'application/json'})
|
||||
|
||||
def search(self, type):
|
||||
def search(self, plugin_name):
|
||||
"""
|
||||
Return a list of items that match the search text.
|
||||
|
||||
``type``
|
||||
``plugin``
|
||||
The plugin name to search in.
|
||||
"""
|
||||
try:
|
||||
|
@ -523,36 +524,35 @@ class HttpConnection(object):
|
|||
except KeyError, ValueError:
|
||||
return HttpResponse(code=u'400 Bad Request')
|
||||
text = urllib.unquote(text)
|
||||
plugin = self.plugin_manager.get_plugin_by_name(type)
|
||||
plugin = self.plugin_manager.get_plugin_by_name(plugin_name)
|
||||
if plugin.status == PluginStatus.Active and plugin.mediaItem and plugin.mediaItem.hasSearch:
|
||||
results = plugin.mediaItem.search(text, False)
|
||||
else:
|
||||
results = []
|
||||
return HttpResponse(json.dumps({u'results': {u'items': results}}),
|
||||
{u'Content-Type': u'application/json'})
|
||||
return HttpResponse(json.dumps({u'results': {u'items': results}}), {u'Content-Type': u'application/json'})
|
||||
|
||||
def go_live(self, type):
|
||||
def go_live(self, plugin_name):
|
||||
"""
|
||||
Go live on an item of type ``type``.
|
||||
Go live on an item of type ``plugin``.
|
||||
"""
|
||||
try:
|
||||
id = json.loads(self.url_params[u'data'][0])[u'request'][u'id']
|
||||
except KeyError, ValueError:
|
||||
return HttpResponse(code=u'400 Bad Request')
|
||||
plugin = self.plugin_manager.get_plugin_by_name(type)
|
||||
plugin = self.plugin_manager.get_plugin_by_name(plugin_name)
|
||||
if plugin.status == PluginStatus.Active and plugin.mediaItem:
|
||||
plugin.mediaItem.goLive(id, remote=True)
|
||||
return HttpResponse(code=u'200 OK')
|
||||
|
||||
def add_to_service(self, type):
|
||||
def add_to_service(self, plugin_name):
|
||||
"""
|
||||
Add item of type ``type`` to the end of the service.
|
||||
Add item of type ``plugin_name`` to the end of the service.
|
||||
"""
|
||||
try:
|
||||
id = json.loads(self.url_params[u'data'][0])[u'request'][u'id']
|
||||
except KeyError, ValueError:
|
||||
return HttpResponse(code=u'400 Bad Request')
|
||||
plugin = self.plugin_manager.get_plugin_by_name(type)
|
||||
plugin = self.plugin_manager.get_plugin_by_name(plugin_name)
|
||||
if plugin.status == PluginStatus.Active and plugin.mediaItem:
|
||||
item_id = plugin.mediaItem.createItemFromId(id)
|
||||
plugin.mediaItem.addToService(item_id, remote=True)
|
||||
|
|
|
@ -45,117 +45,115 @@ class RemoteTab(SettingsTab):
|
|||
def setupUi(self):
|
||||
self.setObjectName(u'RemoteTab')
|
||||
SettingsTab.setupUi(self)
|
||||
self.serverSettingsGroupBox = QtGui.QGroupBox(self.leftColumn)
|
||||
self.serverSettingsGroupBox.setObjectName(u'serverSettingsGroupBox')
|
||||
self.serverSettingsLayout = QtGui.QFormLayout(self.serverSettingsGroupBox)
|
||||
self.serverSettingsLayout.setObjectName(u'serverSettingsLayout')
|
||||
self.addressLabel = QtGui.QLabel(self.serverSettingsGroupBox)
|
||||
self.addressLabel.setObjectName(u'addressLabel')
|
||||
self.addressEdit = QtGui.QLineEdit(self.serverSettingsGroupBox)
|
||||
self.addressEdit.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
|
||||
self.addressEdit.setValidator(QtGui.QRegExpValidator(QtCore.QRegExp(
|
||||
self.server_settings_group_box = QtGui.QGroupBox(self.leftColumn)
|
||||
self.server_settings_group_box.setObjectName(u'server_settings_group_box')
|
||||
self.server_settings_layout = QtGui.QFormLayout(self.server_settings_group_box)
|
||||
self.server_settings_layout.setObjectName(u'server_settings_layout')
|
||||
self.address_label = QtGui.QLabel(self.server_settings_group_box)
|
||||
self.address_label.setObjectName(u'address_label')
|
||||
self.address_edit = QtGui.QLineEdit(self.server_settings_group_box)
|
||||
self.address_edit.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
|
||||
self.address_edit.setValidator(QtGui.QRegExpValidator(QtCore.QRegExp(
|
||||
u'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'), self))
|
||||
self.addressEdit.setObjectName(u'addressEdit')
|
||||
QtCore.QObject.connect(self.addressEdit, QtCore.SIGNAL(u'textChanged(const QString&)'), self.setUrls)
|
||||
self.serverSettingsLayout.addRow(self.addressLabel, self.addressEdit)
|
||||
self.twelveHourCheckBox = QtGui.QCheckBox(self.serverSettingsGroupBox)
|
||||
self.twelveHourCheckBox.setObjectName(u'twelveHourCheckBox')
|
||||
self.serverSettingsLayout.addRow(self.twelveHourCheckBox)
|
||||
self.portLabel = QtGui.QLabel(self.serverSettingsGroupBox)
|
||||
self.address_edit.setObjectName(u'address_edit')
|
||||
self.server_settings_layout.addRow(self.address_label, self.address_edit)
|
||||
self.twelve_hour_check_box = QtGui.QCheckBox(self.server_settings_group_box)
|
||||
self.twelve_hour_check_box.setObjectName(u'twelve_hour_check_box')
|
||||
self.server_settings_layout.addRow(self.twelve_hour_check_box)
|
||||
self.portLabel = QtGui.QLabel(self.server_settings_group_box)
|
||||
self.portLabel.setObjectName(u'portLabel')
|
||||
self.portSpinBox = QtGui.QSpinBox(self.serverSettingsGroupBox)
|
||||
self.portSpinBox.setMaximum(32767)
|
||||
self.portSpinBox.setObjectName(u'portSpinBox')
|
||||
QtCore.QObject.connect(self.portSpinBox, QtCore.SIGNAL(u'valueChanged(int)'), self.setUrls)
|
||||
self.serverSettingsLayout.addRow(self.portLabel, self.portSpinBox)
|
||||
self.remoteUrlLabel = QtGui.QLabel(self.serverSettingsGroupBox)
|
||||
self.remoteUrlLabel.setObjectName(u'remoteUrlLabel')
|
||||
self.remoteUrl = QtGui.QLabel(self.serverSettingsGroupBox)
|
||||
self.remoteUrl.setObjectName(u'remoteUrl')
|
||||
self.remoteUrl.setOpenExternalLinks(True)
|
||||
self.serverSettingsLayout.addRow(self.remoteUrlLabel, self.remoteUrl)
|
||||
self.stageUrlLabel = QtGui.QLabel(self.serverSettingsGroupBox)
|
||||
self.stageUrlLabel.setObjectName(u'stageUrlLabel')
|
||||
self.stageUrl = QtGui.QLabel(self.serverSettingsGroupBox)
|
||||
self.stageUrl.setObjectName(u'stageUrl')
|
||||
self.stageUrl.setOpenExternalLinks(True)
|
||||
self.serverSettingsLayout.addRow(self.stageUrlLabel, self.stageUrl)
|
||||
self.leftLayout.addWidget(self.serverSettingsGroupBox)
|
||||
self.androidAppGroupBox = QtGui.QGroupBox(self.rightColumn)
|
||||
self.androidAppGroupBox.setObjectName(u'androidAppGroupBox')
|
||||
self.rightLayout.addWidget(self.androidAppGroupBox)
|
||||
self.qrLayout = QtGui.QVBoxLayout(self.androidAppGroupBox)
|
||||
self.qrLayout.setObjectName(u'qrLayout')
|
||||
self.qrCodeLabel = QtGui.QLabel(self.androidAppGroupBox)
|
||||
self.qrCodeLabel.setPixmap(QtGui.QPixmap(u':/remotes/android_app_qr.png'))
|
||||
self.qrCodeLabel.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.qrCodeLabel.setObjectName(u'qrCodeLabel')
|
||||
self.qrLayout.addWidget(self.qrCodeLabel)
|
||||
self.qrDescriptionLabel = QtGui.QLabel(self.androidAppGroupBox)
|
||||
self.qrDescriptionLabel.setObjectName(u'qrDescriptionLabel')
|
||||
self.qrDescriptionLabel.setOpenExternalLinks(True)
|
||||
self.qrDescriptionLabel.setWordWrap(True)
|
||||
self.qrLayout.addWidget(self.qrDescriptionLabel)
|
||||
self.port_spin_box = QtGui.QSpinBox(self.server_settings_group_box)
|
||||
self.port_spin_box.setMaximum(32767)
|
||||
self.port_spin_box.setObjectName(u'port_spin_box')
|
||||
self.server_settings_layout.addRow(self.portLabel, self.port_spin_box)
|
||||
self.remote_url_label = QtGui.QLabel(self.server_settings_group_box)
|
||||
self.remote_url_label.setObjectName(u'remote_url_label')
|
||||
self.remote_url = QtGui.QLabel(self.server_settings_group_box)
|
||||
self.remote_url.setObjectName(u'remote_url')
|
||||
self.remote_url.setOpenExternalLinks(True)
|
||||
self.server_settings_layout.addRow(self.remote_url_label, self.remote_url)
|
||||
self.stage_url_label = QtGui.QLabel(self.server_settings_group_box)
|
||||
self.stage_url_label.setObjectName(u'stage_url_label')
|
||||
self.stage_url = QtGui.QLabel(self.server_settings_group_box)
|
||||
self.stage_url.setObjectName(u'stage_url')
|
||||
self.stage_url.setOpenExternalLinks(True)
|
||||
self.server_settings_layout.addRow(self.stage_url_label, self.stage_url)
|
||||
self.leftLayout.addWidget(self.server_settings_group_box)
|
||||
self.android_app_group_box = QtGui.QGroupBox(self.rightColumn)
|
||||
self.android_app_group_box.setObjectName(u'android_app_group_box')
|
||||
self.rightLayout.addWidget(self.android_app_group_box)
|
||||
self.qr_layout = QtGui.QVBoxLayout(self.android_app_group_box)
|
||||
self.qr_layout.setObjectName(u'qr_layout')
|
||||
self.qr_code_label = QtGui.QLabel(self.android_app_group_box)
|
||||
self.qr_code_label.setPixmap(QtGui.QPixmap(u':/remotes/android_app_qr.png'))
|
||||
self.qr_code_label.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.qr_code_label.setObjectName(u'qr_code_label')
|
||||
self.qr_layout.addWidget(self.qr_code_label)
|
||||
self.qr_description_label = QtGui.QLabel(self.android_app_group_box)
|
||||
self.qr_description_label.setObjectName(u'qr_description_label')
|
||||
self.qr_description_label.setOpenExternalLinks(True)
|
||||
self.qr_description_label.setWordWrap(True)
|
||||
self.qr_layout.addWidget(self.qr_description_label)
|
||||
self.leftLayout.addStretch()
|
||||
self.rightLayout.addStretch()
|
||||
QtCore.QObject.connect(self.twelveHourCheckBox, QtCore.SIGNAL(u'stateChanged(int)'),
|
||||
self.onTwelveHourCheckBoxChanged)
|
||||
self.twelve_hour_check_box.stateChanged.connect(self.onTwelveHourCheckBoxChanged)
|
||||
self.address_edit.textChanged.connect(self.set_urls)
|
||||
self.port_spin_box.valueChanged.connect(self.set_urls)
|
||||
|
||||
def retranslateUi(self):
|
||||
self.serverSettingsGroupBox.setTitle(
|
||||
translate('RemotePlugin.RemoteTab', 'Server Settings'))
|
||||
self.addressLabel.setText(translate('RemotePlugin.RemoteTab', 'Serve on IP address:'))
|
||||
self.server_settings_group_box.setTitle(translate('RemotePlugin.RemoteTab', 'Server Settings'))
|
||||
self.address_label.setText(translate('RemotePlugin.RemoteTab', 'Serve on IP address:'))
|
||||
self.portLabel.setText(translate('RemotePlugin.RemoteTab', 'Port number:'))
|
||||
self.remoteUrlLabel.setText(translate('RemotePlugin.RemoteTab', 'Remote URL:'))
|
||||
self.stageUrlLabel.setText(translate('RemotePlugin.RemoteTab', 'Stage view URL:'))
|
||||
self.twelveHourCheckBox.setText(translate('RemotePlugin.RemoteTab', 'Display stage time in 12h format'))
|
||||
self.androidAppGroupBox.setTitle(translate('RemotePlugin.RemoteTab', 'Android App'))
|
||||
self.qrDescriptionLabel.setText(translate('RemotePlugin.RemoteTab',
|
||||
self.remote_url_label.setText(translate('RemotePlugin.RemoteTab', 'Remote URL:'))
|
||||
self.stage_url_label.setText(translate('RemotePlugin.RemoteTab', 'Stage view URL:'))
|
||||
self.twelve_hour_check_box.setText(translate('RemotePlugin.RemoteTab', 'Display stage time in 12h format'))
|
||||
self.android_app_group_box.setTitle(translate('RemotePlugin.RemoteTab', 'Android App'))
|
||||
self.qr_description_label.setText(translate('RemotePlugin.RemoteTab',
|
||||
'Scan the QR code or click <a href="https://play.google.com/store/'
|
||||
'apps/details?id=org.openlp.android">download</a> to install the '
|
||||
'Android app from Google Play.'))
|
||||
|
||||
def setUrls(self):
|
||||
def set_urls(self):
|
||||
ipAddress = u'localhost'
|
||||
if self.addressEdit.text() == ZERO_URL:
|
||||
ifaces = QtNetwork.QNetworkInterface.allInterfaces()
|
||||
for iface in ifaces:
|
||||
if not iface.isValid():
|
||||
if self.address_edit.text() == ZERO_URL:
|
||||
interfaces = QtNetwork.QNetworkInterface.allInterfaces()
|
||||
for interface in interfaces:
|
||||
if not interface.isValid():
|
||||
continue
|
||||
if not (iface.flags() & (QtNetwork.QNetworkInterface.IsUp | QtNetwork.QNetworkInterface.IsRunning)):
|
||||
if not (interface.flags() & (QtNetwork.QNetworkInterface.IsUp | QtNetwork.QNetworkInterface.IsRunning)):
|
||||
continue
|
||||
for addr in iface.addressEntries():
|
||||
ip = addr.ip()
|
||||
for address in interface.addressEntries():
|
||||
ip = address.ip()
|
||||
if ip.protocol() == 0 and ip != QtNetwork.QHostAddress.LocalHost:
|
||||
ipAddress = ip
|
||||
break
|
||||
else:
|
||||
ipAddress = self.addressEdit.text()
|
||||
url = u'http://%s:%s/' % (ipAddress, self.portSpinBox.value())
|
||||
self.remoteUrl.setText(u'<a href="%s">%s</a>' % (url, url))
|
||||
ipAddress = self.address_edit.text()
|
||||
url = u'http://%s:%s/' % (ipAddress, self.port_spin_box.value())
|
||||
self.remote_url.setText(u'<a href="%s">%s</a>' % (url, url))
|
||||
url += u'stage'
|
||||
self.stageUrl.setText(u'<a href="%s">%s</a>' % (url, url))
|
||||
self.stage_url.setText(u'<a href="%s">%s</a>' % (url, url))
|
||||
|
||||
def load(self):
|
||||
self.portSpinBox.setValue(Settings().value(self.settingsSection + u'/port'))
|
||||
self.addressEdit.setText(Settings().value(self.settingsSection + u'/ip address'))
|
||||
self.twelveHour = Settings().value(self.settingsSection + u'/twelve hour')
|
||||
self.twelveHourCheckBox.setChecked(self.twelveHour)
|
||||
self.setUrls()
|
||||
self.port_spin_box.setValue(Settings().value(self.settingsSection + u'/port'))
|
||||
self.address_edit.setText(Settings().value(self.settingsSection + u'/ip address'))
|
||||
self.twelve_hour = Settings().value(self.settingsSection + u'/twelve hour')
|
||||
self.twelve_hour_check_box.setChecked(self.twelve_hour)
|
||||
self.set_urls()
|
||||
|
||||
def save(self):
|
||||
changed = False
|
||||
if Settings().value(self.settingsSection + u'/ip address') != self.addressEdit.text() or \
|
||||
Settings().value(self.settingsSection + u'/port') != self.portSpinBox.value():
|
||||
if Settings().value(self.settingsSection + u'/ip address') != self.address_edit.text() or \
|
||||
Settings().value(self.settingsSection + u'/port') != self.port_spin_box.value():
|
||||
changed = True
|
||||
Settings().setValue(self.settingsSection + u'/port', self.portSpinBox.value())
|
||||
Settings().setValue(self.settingsSection + u'/ip address', self.addressEdit.text())
|
||||
Settings().setValue(self.settingsSection + u'/twelve hour', self.twelveHour)
|
||||
Settings().setValue(self.settingsSection + u'/port', self.port_spin_box.value())
|
||||
Settings().setValue(self.settingsSection + u'/ip address', self.address_edit.text())
|
||||
Settings().setValue(self.settingsSection + u'/twelve hour', self.twelve_hour)
|
||||
if changed:
|
||||
Registry().register_function(u'remotes_config_updated')
|
||||
|
||||
def onTwelveHourCheckBoxChanged(self, check_state):
|
||||
self.twelveHour = False
|
||||
self.twelve_hour = False
|
||||
# we have a set value convert to True/False
|
||||
if check_state == QtCore.Qt.Checked:
|
||||
self.twelveHour = True
|
||||
self.twelve_hour = True
|
||||
|
|
|
@ -38,7 +38,7 @@ __default_settings__ = {
|
|||
u'remotes/twelve hour': True,
|
||||
u'remotes/port': 4316,
|
||||
u'remotes/ip address': u'0.0.0.0'
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class RemotesPlugin(Plugin):
|
||||
|
|
Loading…
Reference in New Issue