|
1 | 1 | import os |
2 | 2 | import pkg_resources |
3 | 3 | import pickle |
| 4 | +import textwrap |
| 5 | +import warnings |
4 | 6 | from enum import IntEnum |
5 | 7 |
|
6 | | -from AnyQt.QtCore import Qt, pyqtSlot |
| 8 | +from AnyQt.QtCore import Qt, QObject, QFile, QTimer, QUrl, pyqtSlot, QT_VERSION |
7 | 9 | from AnyQt.QtGui import QIcon, QCursor, QStandardItemModel, QStandardItem |
8 | 10 | from AnyQt.QtWidgets import ( |
9 | | - QApplication, QDialog, QFileDialog, QTableView, QHeaderView |
| 11 | + QApplication, QDialog, QFileDialog, QTableView, QHeaderView, QSizePolicy |
10 | 12 | ) |
11 | 13 | from AnyQt.QtPrintSupport import QPrinter, QPrintDialog |
12 | 14 |
|
13 | 15 | from Orange.widgets import gui |
14 | 16 | from Orange.widgets.widget import OWWidget |
15 | 17 | from Orange.widgets.settings import Setting |
| 18 | +from Orange.widgets.utils import webview |
16 | 19 | from Orange.canvas.application.canvasmain import CanvasMainWindow |
17 | 20 | from Orange.canvas.gui.utils import message_critical |
18 | 21 |
|
@@ -151,7 +154,31 @@ def _setup_ui_(self): |
151 | 154 | self.print_button = gui.button( |
152 | 155 | box, self, "Print", callback=self._print_report |
153 | 156 | ) |
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) |
155 | 182 |
|
156 | 183 | def __getstate__(self): |
157 | 184 | rep_dict = self.__dict__.copy() |
@@ -217,24 +244,26 @@ def _build_html(self): |
217 | 244 | self.report_view.setHtml(html) |
218 | 245 |
|
219 | 246 | 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 | + ) |
222 | 250 |
|
223 | 251 | 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 | + |
232 | 262 | def _select_item(self, item_id): |
233 | 263 | item = self.table_model.get_item_by_id(item_id) |
234 | 264 | self.table.selectRow(self.table_model.indexFromItem(item).row()) |
235 | 265 | self._change_selected_item(item) |
236 | 266 |
|
237 | | - @pyqtSlot(str, str) |
238 | 267 | def _add_comment(self, item_id, value): |
239 | 268 | item = self.table_model.get_item_by_id(item_id) |
240 | 269 | item.comment = value |
@@ -284,9 +313,16 @@ def _save_report(self): |
284 | 313 | with open(filename, 'wb') as f: |
285 | 314 | pickle.dump(self, f) |
286 | 315 | 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()) |
290 | 326 |
|
291 | 327 | def _print_report(self): |
292 | 328 | printer = QPrinter() |
|
0 commit comments