#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright 2017, Marten de Vries
#
# This file is part of OpenTeacher.
#
# OpenTeacher is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# OpenTeacher is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with OpenTeacher. If not, see <http://www.gnu.org/licenses/>.
import tempfile
import os
import atexit
class View:
def __init__(self, Event):
self.widget = QtWebEngineWidgets.QWebEngineView()
self.widget.page().profile().setHttpCacheType(QtWebEngineWidgets.QWebEngineProfile.MemoryHttpCache)
self.onFinished = Event()
self.urlChanged = Event()
self.widget.loadFinished.connect(self.onFinished.send)
self.widget.urlChanged.connect(lambda url: self.urlChanged.send(url.toString()))
def forward(self):
self.widget.forward()
def back(self):
self.widget.back()
def reload(self):
self.widget.reload()
def enablePlugins(self):
s = QtWebEngineWidgets.QWebEngineSettings.defaultSettings()
s.setAttribute(QtWebEngineWidgets.QWebEngineSettings.PluginsEnabled, True)
def request(self, url, headers=None):
profile = self.widget.page().profile()
for header, value in (headers or {}).items():
# add headers as required
{
b'Accept-Language': profile.setHttpAcceptLanguage,
b'User-Agent': profile.setHttpUserAgent,
}[header](value.decode('ascii'))
self.widget.load(QtCore.QUrl(url))
def print_(self, printer, donePrinting):
# TODO: The result of this is atrocious. Perhaps re-implement printing
# so as to not need a web engine?
self.widget.page().print(printer, lambda ok: donePrinting())
def setHtml(self, html):
fd, name = tempfile.mkstemp(suffix='.html')
with open(name, 'w', encoding='UTF-8') as f:
f.write(html)
self.request('file://' + name)
def remove(*args):
self.widget.loadFinished.disconnect(remove)
atexit.unregister(remove)
os.remove(name)
self.widget.loadFinished.connect(remove)
atexit.register(remove)
class QtWebEngineWebEngineModule:
def __init__(self, moduleManager, *args, **kwargs):
super().__init__(*args, **kwargs)
self._mm = moduleManager
self.type = 'webEngine'
self.requires = (
self._mm.mods(type='event'),
)
def createView(self):
""""See the qtwebkit web engine for documentation"""
return View(self._modules.default('active', type='event').createEvent)
def enable(self):
global QtWebEngineWidgets, QtWidgets, QtGui, QtCore
try:
from PyQt5 import QtWebEngineWidgets, QtWidgets, QtGui, QtCore
except ImportError as e:
# remain inactive
return
self._modules = next(iter(self._mm.mods(type='modules')))
self.active = True
def disable(self):
self.active = False
del self._modules
def init(moduleManager):
return QtWebEngineWebEngineModule(moduleManager)