Various adjustments, main window starts now, still no canvas.

This commit is contained in:
Tomas Groth 2017-09-25 20:59:43 +02:00
parent 31826f6962
commit 3094b053ff
6 changed files with 50 additions and 43 deletions

View File

@ -22,3 +22,5 @@
""" """
The Display module. The Display module.
""" """
from .canvas import MainCanvas, Canvas, DisplayControllerType
from .renderer import Renderer

View File

@ -30,6 +30,7 @@ Some of the code for this form is based on the examples at:
""" """
import html import html
import json
import logging import logging
import os import os
@ -113,6 +114,8 @@ class Canvas(QtWidgets.QGraphicsView):
self.webview = WebEngineView(self) self.webview = WebEngineView(self)
self.webview.setGeometry(0, 0, self.screen['size'].width(), self.screen['size'].height()) self.webview.setGeometry(0, 0, self.screen['size'].width(), self.screen['size'].height())
self.webview.settings().setAttribute(QtWebEngineWidgets.QWebEngineSettings.PluginsEnabled, True) self.webview.settings().setAttribute(QtWebEngineWidgets.QWebEngineSettings.PluginsEnabled, True)
self.layout = QtWidgets.QVBoxLayout(self)
self.layout.setContentsMargins(0, 0, 0, 0)
self.layout.addWidget(self.webview) self.layout.addWidget(self.webview)
self.webview.loadFinished.connect(self.after_loaded) self.webview.loadFinished.connect(self.after_loaded)
self.set_url(QtCore.QUrl('file://' + os.getcwd() + '/display.html')) self.set_url(QtCore.QUrl('file://' + os.getcwd() + '/display.html'))
@ -124,12 +127,6 @@ class Canvas(QtWidgets.QGraphicsView):
self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
def after_loaded(self):
"""
Add stuff after page initialisation
"""
self.run_javascript('Display.init();')
def resizeEvent(self, event): def resizeEvent(self, event):
""" """
React to resizing of this display React to resizing of this display
@ -159,7 +156,7 @@ class Canvas(QtWidgets.QGraphicsView):
""" """
self.webview.setHtml(html) self.webview.setHtml(html)
def after_loaded(self): def after_loaded(self, state):
""" """
Add stuff after page initialisation Add stuff after page initialisation
""" """
@ -359,7 +356,7 @@ class MainCanvas(OpenLPMixin, Canvas, RegistryProperties):
splash_image) splash_image)
service_item = ServiceItem() service_item = ServiceItem()
service_item.bg_image_bytes = image_to_byte(self.initial_fame) service_item.bg_image_bytes = image_to_byte(self.initial_fame)
self.web_view.setHtml(build_html(service_item, self.screen, self.is_live, None, self.webview.setHtml(build_html(service_item, self.screen, self.is_live, None,
plugins=self.plugin_manager.plugins)) plugins=self.plugin_manager.plugins))
self._hide_mouse() self._hide_mouse()
@ -374,17 +371,20 @@ class MainCanvas(OpenLPMixin, Canvas, RegistryProperties):
while not self.web_loaded: while not self.web_loaded:
self.application.process_events() self.application.process_events()
self.setGeometry(self.screen['size']) self.setGeometry(self.screen['size'])
if animate: json_verses = json.dumps(slide)
# NOTE: Verify this works with ''.format() print(json_verses)
_text = slide.replace('\\', '\\\\').replace('\"', '\\\"') self.run_javascript('Display.setTextSlides({verses});'.format(verses=json_verses))
self.frame.evaluateJavaScript('show_text("{text}")'.format(text=_text)) #if animate:
else: # # NOTE: Verify this works with ''.format()
# This exists for https://bugs.launchpad.net/openlp/+bug/1016843 # _text = slide.replace('\\', '\\\\').replace('\"', '\\\"')
# For unknown reasons if evaluateJavaScript is called # self.frame.evaluateJavaScript('show_text("{text}")'.format(text=_text))
# from the themewizard, then it causes a crash on #else:
# Windows if there are many items in the service to re-render. # # This exists for https://bugs.launchpad.net/openlp/+bug/1016843
# Setting the div elements direct seems to solve the issue # # For unknown reasons if evaluateJavaScript is called
self.frame.findFirstElement("#lyricsmain").setInnerXml(slide) # # from the themewizard, then it causes a crash on
# # Windows if there are many items in the service to re-render.
# # Setting the div elements direct seems to solve the issue
# self.frame.findFirstElement("#lyricsmain").setInnerXml(slide)
def alert(self, text, location): def alert(self, text, location):
""" """
@ -402,7 +402,7 @@ class MainCanvas(OpenLPMixin, Canvas, RegistryProperties):
else: else:
shrink = False shrink = False
js = 'show_alert("{text}", "")'.format(text=text_prepared) js = 'show_alert("{text}", "")'.format(text=text_prepared)
height = self.frame.evaluateJavaScript(js) height = self.run_javascript(js)
if shrink: if shrink:
if text: if text:
alert_height = int(height) alert_height = int(height)
@ -453,11 +453,17 @@ class MainCanvas(OpenLPMixin, Canvas, RegistryProperties):
:param image: The image to be displayed :param image: The image to be displayed
""" """
self.setGeometry(self.screen['size']) self.setGeometry(self.screen['size'])
if image: #if image:
js = 'show_image("data:image/png;base64,{image}");'.format(image=image) # self.set_im
else: # js = 'show_image("data:image/png;base64,{image}");'.format(image=image)
js = 'show_image("");' #else:
self.frame.evaluateJavaScript(js) # js = 'show_image("");'
#self.frame.evaluateJavaScript(js)
if not image['file'].startswith('file://'):
image['file'] = 'file://' + image['file']
json_images = json.dumps(images)
self.run_javascript('Display.setImageSlides({images});'.format(images=json_images))
def reset_image(self): def reset_image(self):
""" """
@ -484,7 +490,7 @@ class MainCanvas(OpenLPMixin, Canvas, RegistryProperties):
# Wait for the fade to finish before geting the preview. # Wait for the fade to finish before geting the preview.
# Important otherwise preview will have incorrect text if at all! # Important otherwise preview will have incorrect text if at all!
if self.service_item.theme_data and self.service_item.theme_data.display_slide_transition: if self.service_item.theme_data and self.service_item.theme_data.display_slide_transition:
while not self.frame.evaluateJavaScript('show_text_completed()'): while not self.run_javascript('show_text_completed()'):
self.application.process_events() self.application.process_events()
# Wait for the webview to update before getting the preview. # Wait for the webview to update before getting the preview.
# Important otherwise first preview will miss the background ! # Important otherwise first preview will miss the background !
@ -540,7 +546,7 @@ class MainCanvas(OpenLPMixin, Canvas, RegistryProperties):
image_bytes = self.image_manager.get_image_bytes(image_path, ImageSource.ImagePlugin) image_bytes = self.image_manager.get_image_bytes(image_path, ImageSource.ImagePlugin)
created_html = build_html(self.service_item, self.screen, self.is_live, background, image_bytes, created_html = build_html(self.service_item, self.screen, self.is_live, background, image_bytes,
plugins=self.plugin_manager.plugins) plugins=self.plugin_manager.plugins)
self.web_view.setHtml(created_html) self.webview.setHtml(created_html)
if service_item.foot_text: if service_item.foot_text:
self.footer(service_item.foot_text) self.footer(service_item.foot_text)
# if was hidden keep it hidden # if was hidden keep it hidden
@ -569,7 +575,7 @@ class MainCanvas(OpenLPMixin, Canvas, RegistryProperties):
:param text: footer text to be displayed :param text: footer text to be displayed
""" """
js = 'show_footer(\'' + text.replace('\\', '\\\\').replace('\'', '\\\'') + '\')' js = 'show_footer(\'' + text.replace('\\', '\\\\').replace('\'', '\\\'') + '\')'
self.frame.evaluateJavaScript(js) self.run_javascript(js)
def hide_display(self, mode=HideMode.Screen): def hide_display(self, mode=HideMode.Screen):
""" """
@ -583,16 +589,16 @@ class MainCanvas(OpenLPMixin, Canvas, RegistryProperties):
if not Settings().value('core/display on monitor'): if not Settings().value('core/display on monitor'):
return return
if mode == HideMode.Screen: if mode == HideMode.Screen:
self.frame.evaluateJavaScript('show_blank("desktop");') self.run_javascript('show_blank("desktop");')
self.setVisible(False) self.setVisible(False)
elif mode == HideMode.Blank or self.initial_fame: elif mode == HideMode.Blank or self.initial_fame:
self.frame.evaluateJavaScript('show_blank("black");') self.run_javascript('show_blank("black");')
else: else:
self.frame.evaluateJavaScript('show_blank("theme");') self.run_javascript('show_blank("theme");')
if mode != HideMode.Screen: if mode != HideMode.Screen:
if self.isHidden(): if self.isHidden():
self.setVisible(True) self.setVisible(True)
self.web_view.setVisible(True) self.webview.setVisible(True)
self.hide_mode = mode self.hide_mode = mode
def show_display(self): def show_display(self):
@ -604,7 +610,7 @@ class MainCanvas(OpenLPMixin, Canvas, RegistryProperties):
# Only make visible if setting enabled. # Only make visible if setting enabled.
if not Settings().value('core/display on monitor'): if not Settings().value('core/display on monitor'):
return return
self.frame.evaluateJavaScript('show_blank("show");') self.run_javascript('show_blank("show");')
# Check if setting for hiding logo on startup is enabled. # Check if setting for hiding logo on startup is enabled.
# If it is, display should remain hidden, otherwise logo is shown. (from def setup) # If it is, display should remain hidden, otherwise logo is shown. (from def setup)
if self.isHidden() and not Settings().value('core/logo hide on startup'): if self.isHidden() and not Settings().value('core/logo hide on startup'):
@ -620,10 +626,10 @@ class MainCanvas(OpenLPMixin, Canvas, RegistryProperties):
""" """
if Settings().value('advanced/hide mouse'): if Settings().value('advanced/hide mouse'):
self.setCursor(QtCore.Qt.BlankCursor) self.setCursor(QtCore.Qt.BlankCursor)
self.frame.evaluateJavaScript('document.body.style.cursor = "none"') self.run_javascript('document.body.style.cursor = "none"')
else: else:
self.setCursor(QtCore.Qt.ArrowCursor) self.setCursor(QtCore.Qt.ArrowCursor)
self.frame.evaluateJavaScript('document.body.style.cursor = "auto"') self.run_javascript('document.body.style.cursor = "auto"')
def change_window_level(self, window): def change_window_level(self, window):
""" """

View File

@ -644,7 +644,6 @@ from .settingstab import SettingsTab
from .serviceitem import ServiceItem, ServiceItemType, ItemCapabilities from .serviceitem import ServiceItem, ServiceItemType, ItemCapabilities
from .htmlbuilder import build_html, build_lyrics_format_css, build_lyrics_outline_css, build_chords_css from .htmlbuilder import build_html, build_lyrics_format_css, build_lyrics_outline_css, build_chords_css
from .imagemanager import ImageManager from .imagemanager import ImageManager
from .renderer import Renderer
from .mediamanageritem import MediaManagerItem from .mediamanageritem import MediaManagerItem
from .projector.db import ProjectorDB, Projector from .projector.db import ProjectorDB, Projector
from .projector.pjlink import PJLink from .projector.pjlink import PJLink

View File

@ -99,7 +99,6 @@ from .themelayoutform import ThemeLayoutForm
from .themeform import ThemeForm from .themeform import ThemeForm
from .filerenameform import FileRenameForm from .filerenameform import FileRenameForm
from .starttimeform import StartTimeForm from .starttimeform import StartTimeForm
from .maindisplay import MainDisplay, Display, AudioPlayer
from .servicenoteform import ServiceNoteForm from .servicenoteform import ServiceNoteForm
from .serviceitemeditform import ServiceItemEditForm from .serviceitemeditform import ServiceItemEditForm
from .slidecontroller import SlideController, DisplayController, PreviewController, LiveController from .slidecontroller import SlideController, DisplayController, PreviewController, LiveController

View File

@ -41,7 +41,7 @@ from openlp.core.common import Registry, RegistryProperties, AppLocation, Langua
from openlp.core.common.actions import ActionList, CategoryOrder from openlp.core.common.actions import ActionList, CategoryOrder
from openlp.core.common.path import Path, path_to_str, str_to_path from openlp.core.common.path import Path, path_to_str, str_to_path
from openlp.core.common.versionchecker import get_application_version from openlp.core.common.versionchecker import get_application_version
from openlp.core.lib import Renderer, PluginManager, ImageManager, PluginStatus, ScreenList, build_icon from openlp.core.lib import PluginManager, ImageManager, PluginStatus, ScreenList, build_icon
from openlp.core.lib.ui import create_action from openlp.core.lib.ui import create_action
from openlp.core.ui import AboutForm, SettingsForm, ServiceManager, ThemeManager, LiveController, PluginForm, \ from openlp.core.ui import AboutForm, SettingsForm, ServiceManager, ThemeManager, LiveController, PluginForm, \
ShortcutListForm, FormattingTagForm, PreviewController ShortcutListForm, FormattingTagForm, PreviewController
@ -52,7 +52,7 @@ from openlp.core.ui.projector.manager import ProjectorManager
from openlp.core.ui.lib.dockwidget import OpenLPDockWidget from openlp.core.ui.lib.dockwidget import OpenLPDockWidget
from openlp.core.ui.lib.filedialog import FileDialog from openlp.core.ui.lib.filedialog import FileDialog
from openlp.core.ui.lib.mediadockmanager import MediaDockManager from openlp.core.ui.lib.mediadockmanager import MediaDockManager
from openlp.core.display import Renderer
log = logging.getLogger(__name__) log = logging.getLogger(__name__)

View File

@ -38,7 +38,8 @@ from openlp.core.lib import ItemCapabilities, ServiceItem, ImageSource, ServiceI
from openlp.core.lib.ui import create_action from openlp.core.lib.ui import create_action
from openlp.core.ui.lib.toolbar import OpenLPToolbar from openlp.core.ui.lib.toolbar import OpenLPToolbar
from openlp.core.ui.lib.listpreviewwidget import ListPreviewWidget from openlp.core.ui.lib.listpreviewwidget import ListPreviewWidget
from openlp.core.ui import HideMode, MainDisplay, Display, DisplayControllerType from openlp.core.ui import HideMode, DisplayControllerType
from openlp.core.display import MainCanvas, Canvas
# Threshold which has to be trespassed to toggle. # Threshold which has to be trespassed to toggle.
@ -370,7 +371,7 @@ class SlideController(DisplayController, RegistryProperties):
self.slide_layout.setSpacing(0) self.slide_layout.setSpacing(0)
self.slide_layout.setContentsMargins(0, 0, 0, 0) self.slide_layout.setContentsMargins(0, 0, 0, 0)
self.slide_layout.setObjectName('SlideLayout') self.slide_layout.setObjectName('SlideLayout')
self.preview_display = Display(self) self.preview_display = Canvas(self)
self.slide_layout.insertWidget(0, self.preview_display) self.slide_layout.insertWidget(0, self.preview_display)
self.preview_display.hide() self.preview_display.hide()
# Actual preview screen # Actual preview screen
@ -580,7 +581,7 @@ class SlideController(DisplayController, RegistryProperties):
# rebuild display as screen size changed # rebuild display as screen size changed
if self.display: if self.display:
self.display.close() self.display.close()
self.display = MainDisplay(self) self.display = MainCanvas(self)
self.display.setup() self.display.setup()
if self.is_live: if self.is_live:
self.__add_actions_to_widget(self.display) self.__add_actions_to_widget(self.display)
@ -596,7 +597,7 @@ class SlideController(DisplayController, RegistryProperties):
self.preview_widget.screen_size_changed(self.ratio) self.preview_widget.screen_size_changed(self.ratio)
self.preview_display.setup() self.preview_display.setup()
service_item = ServiceItem() service_item = ServiceItem()
self.preview_display.web_view.setHtml(build_html(service_item, self.preview_display.screen, None, self.is_live, self.preview_display.webview.setHtml(build_html(service_item, self.preview_display.screen, None, self.is_live,
plugins=self.plugin_manager.plugins)) plugins=self.plugin_manager.plugins))
self.media_controller.setup_display(self.preview_display, True) self.media_controller.setup_display(self.preview_display, True)
if self.service_item: if self.service_item: