def __init__(self, iface, project_definition): self.iface = iface QDialog.__init__(self) # Set up the user interface from Designer. self.ui = Ui_WeightDataDialog() self.ui.setupUi(self) self.ok_button = self.ui.buttonBox.button(QDialogButtonBox.Ok) self.project_definition = copy.deepcopy(project_definition) self.web_view = self.ui.web_view self.web_view.load(QUrl('qrc:/plugins/svir/weight_data.html')) self.frame = self.web_view.page().mainFrame() self.setup_context_menu() self.frame.javaScriptWindowObjectCleared.connect(self.setup_js) self.web_view.loadFinished.connect(self.show_tree) self.json_updated.connect(self.handle_json_updated)
class WeightDataDialog(QDialog): """ Modal dialog allowing to select weights in a d3.js visualization """ # QVariantMap is to map a JSON to dict see: #http://pyqt.sourceforge.net/Docs/PyQt4/incompatibilities.html#pyqt4-v4-7-4 # this is for javascript to emitt when it changes the json json_updated = pyqtSignal(['QVariantMap'], name='json_updated') # Python classes should connect to json_cleaned json_cleaned = pyqtSignal(['QVariantMap'], name='json_cleaned') def __init__(self, iface, project_definition): self.iface = iface QDialog.__init__(self) # Set up the user interface from Designer. self.ui = Ui_WeightDataDialog() self.ui.setupUi(self) self.ok_button = self.ui.buttonBox.button(QDialogButtonBox.Ok) self.project_definition = copy.deepcopy(project_definition) self.web_view = self.ui.web_view self.web_view.load(QUrl('qrc:/plugins/svir/weight_data.html')) self.frame = self.web_view.page().mainFrame() self.setup_context_menu() self.frame.javaScriptWindowObjectCleared.connect(self.setup_js) self.web_view.loadFinished.connect(self.show_tree) self.json_updated.connect(self.handle_json_updated) def setup_context_menu(self): settings = QSettings() developer_mode = settings.value( '/svir/developer_mode', True, type=bool) if developer_mode is True: self.web_view.page().settings().setAttribute( QWebSettings.DeveloperExtrasEnabled, True) else: self.web_view.setContextMenuPolicy(Qt.NoContextMenu) def setup_js(self): # pass a reference (called qt_page) of self to the JS world self.frame.addToJavaScriptWindowObject('qt_page', self) def show_tree(self): # start the tree self.frame.evaluateJavaScript('init_tree()') def handle_json_updated(self, data): self.project_definition = self.clean_json([data]) self.json_cleaned.emit(self.project_definition) def clean_json(self, data): # this method takes a list of dictionaries and removes some unneeded # keys. It recurses int the children element ignore_keys = ['depth', 'x', 'y', 'id', 'x0', 'y0'] for element in data: for key in ignore_keys: element.pop(key, None) if 'children' in element: self.clean_json(element['children']) return data[0] @pyqtProperty(str) def json_str(self): #This method gets exposed to JS thanks to @pyqtProperty(str) return json.dumps(self.project_definition)