Skip to content

Commit f5d3e9b

Browse files
committed
canvas/report: Use QtWebEngine if available
1 parent a7c8b78 commit f5d3e9b

File tree

1 file changed

+53
-17
lines changed

1 file changed

+53
-17
lines changed

Orange/canvas/report/owreport.py

Lines changed: 53 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
import os
22
import pkg_resources
33
import pickle
4+
import textwrap
5+
import warnings
46
from enum import IntEnum
57

6-
from AnyQt.QtCore import Qt, pyqtSlot
8+
from AnyQt.QtCore import Qt, QObject, QFile, QTimer, QUrl, pyqtSlot, QT_VERSION
79
from AnyQt.QtGui import QIcon, QCursor, QStandardItemModel, QStandardItem
810
from AnyQt.QtWidgets import (
9-
QApplication, QDialog, QFileDialog, QTableView, QHeaderView
11+
QApplication, QDialog, QFileDialog, QTableView, QHeaderView, QSizePolicy
1012
)
1113
from AnyQt.QtPrintSupport import QPrinter, QPrintDialog
1214

1315
from Orange.widgets import gui
1416
from Orange.widgets.widget import OWWidget
1517
from Orange.widgets.settings import Setting
18+
from Orange.widgets.utils import webview
1619
from Orange.canvas.application.canvasmain import CanvasMainWindow
1720
from Orange.canvas.gui.utils import message_critical
1821

@@ -151,7 +154,31 @@ def _setup_ui_(self):
151154
self.print_button = gui.button(
152155
box, self, "Print", callback=self._print_report
153156
)
154-
self.report_view = gui.WebviewWidget(self.mainArea, bridge=self)
157+
158+
class PyBridge(QObject):
159+
@pyqtSlot(str)
160+
def _select_item(myself, item_id):
161+
item = self.table_model.get_item_by_id(item_id)
162+
self.table.selectRow(self.table_model.indexFromItem(item).row())
163+
self._change_selected_item(item)
164+
165+
@pyqtSlot(str, str)
166+
def _add_comment(myself, item_id, value):
167+
item = self.table_model.get_item_by_id(item_id)
168+
item.comment = value
169+
170+
if webview.HAVE_WEBENGINE:
171+
viewclass = webview.WebEngineView
172+
else:
173+
viewclass = webview.WebKitView
174+
175+
self.report_view = viewclass(
176+
self.mainArea, bridge=PyBridge(self),
177+
contextMenuPolicy=Qt.NoContextMenu,
178+
sizePolicy=QSizePolicy(QSizePolicy.Expanding,
179+
QSizePolicy.Expanding)
180+
)
181+
self.mainArea.layout().addWidget(self.report_view)
155182

156183
def __getstate__(self):
157184
rep_dict = self.__dict__.copy()
@@ -217,24 +244,26 @@ def _build_html(self):
217244
self.report_view.setHtml(html)
218245

219246
def _scroll_to_item(self, item):
220-
self.report_view.evalJS("document.getElementById('{}')."
221-
"scrollIntoView();".format(item.id))
247+
self.report_view.runJavaScript(
248+
"document.getElementById('{}').scrollIntoView();".format(item.id)
249+
)
222250

223251
def _change_selected_item(self, item):
224-
self.report_view.evalJS(
225-
"var sel_el = document.getElementsByClassName('selected')[0]; "
226-
"if (sel_el.id != {}) "
227-
" sel_el.className = 'normal';".format(item.id))
228-
self.report_view.evalJS("document.getElementById('{}')."
229-
"className = 'selected';".format(item.id))
230-
231-
@pyqtSlot(str)
252+
self.report_view.runJavaScript(
253+
"var sel_el = document.getElementsByClassName('selected')[0];\n"
254+
"if (sel_el.id != '{}') {{\n"
255+
" sel_el.className = 'normal';\n"
256+
"}}".format(item.id))
257+
self.report_view.runJavaScript(
258+
"document.getElementById('{}').className = 'selected';"
259+
.format(item.id)
260+
)
261+
232262
def _select_item(self, item_id):
233263
item = self.table_model.get_item_by_id(item_id)
234264
self.table.selectRow(self.table_model.indexFromItem(item).row())
235265
self._change_selected_item(item)
236266

237-
@pyqtSlot(str, str)
238267
def _add_comment(self, item_id, value):
239268
item = self.table_model.get_item_by_id(item_id)
240269
item.comment = value
@@ -284,9 +313,16 @@ def _save_report(self):
284313
with open(filename, 'wb') as f:
285314
pickle.dump(self, f)
286315
else:
287-
frame = self.report_view.page().currentFrame()
288-
with open(filename, "w") as f:
289-
f.write(frame.documentElement().toInnerXml())
316+
page = self.report_view.page()
317+
318+
def save_html(contents):
319+
with open(filename, "w") as f:
320+
f.write(contents)
321+
322+
if webview.HAVE_WEBENGINE:
323+
page.toHtml(save_html)
324+
else:
325+
save_html(page.mainFrame().toHtml())
290326

291327
def _print_report(self):
292328
printer = QPrinter()

0 commit comments

Comments
 (0)