1
0

qml: hook any qml supporting plugins, add test plugin

This allows different platforms to have their own UI components while still leveraging the common
set of QObjects and utility components.
This commit is contained in:
Sander van Grieken
2021-04-04 13:56:45 +02:00
parent 39048fdd10
commit d195fce82d
3 changed files with 50 additions and 11 deletions

View File

@@ -44,18 +44,32 @@ class ElectrumQmlApplication(QGuiApplication):
def __init__(self, args, daemon):
super().__init__(args)
qmlRegisterType(QEWalletListModel, 'QElectrum', 1, 0, 'QEWalletListModel')
qmlRegisterType(QEWallet, 'QElectrum', 1, 0, 'QEWallet')
qmlRegisterType(QEWalletListModel, 'Electrum', 1, 0, 'WalletListModel')
qmlRegisterType(QEWallet, 'Electrum', 1, 0, 'Wallet')
self.engine = QQmlApplicationEngine(parent=self)
self.context = self.engine.rootContext()
self.qen = QENetwork(daemon.network)
self.context.setContextProperty('Network', self.qen)
self.qed = QEDaemon(daemon)
self.context.setContextProperty('Daemon', self.qed)
self.qeqr = QEQR()
self.context.setContextProperty('QR', self.qeqr)
self.engine.load(QUrl('electrum/gui/qml/components/main.qml'))
self._singletons['network'] = QENetwork(daemon.network)
self._singletons['daemon'] = QEDaemon(daemon)
self._singletons['qr'] = QEQR()
self.context.setContextProperty('Network', self._singletons['network'])
self.context.setContextProperty('Daemon', self._singletons['daemon'])
self.context.setContextProperty('QR', self._singletons['qr'])
# get notified whether root QML document loads or not
self.engine.objectCreated.connect(self.objectCreated)
_logger = get_logger(__name__)
_valid = True
_singletons = {}
# slot is called after loading root QML. If object is None, it has failed.
@pyqtSlot('QObject*', 'QUrl')
def objectCreated(self, object, url):
self._logger.info(str(object))
if object is None:
self._valid = False
self.engine.objectCreated.disconnect(self.objectCreated)
class ElectrumGui(Logger):
@@ -73,13 +87,19 @@ class ElectrumGui(Logger):
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_ShareOpenGLContexts)
# if hasattr(QGuiApplication, 'setDesktopFileName'):
# QGuiApplication.setDesktopFileName('electrum.desktop')
if hasattr(QtCore.Qt, "AA_EnableHighDpiScaling"):
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling);
os.environ["QT_QUICK_CONTROLS_STYLE"] = "Material"
self.gui_thread = threading.current_thread()
self.config = config
self.daemon = daemon
self.plugins = plugins
self.app = ElectrumQmlApplication(sys.argv, self.daemon)
# TODO when plugin support. run_hook('init_qml', self)
# Initialize any QML plugins
run_hook('init_qml', self.app.engine)
self.app.engine.load('electrum/gui/qml/components/main.qml')
def close(self):
# for window in self.windows:
@@ -93,7 +113,9 @@ class ElectrumGui(Logger):
self.app.quit()
def main(self):
self.app.exec_()
if self.app._valid:
self.logger.info('Entering main loop')
self.app.exec_()
def stop(self):
self.logger.info('closing GUI')

View File

@@ -0,0 +1,5 @@
from electrum.i18n import _
fullname = 'QML Plugin Test'
description = '%s\n%s' % (_("Plugin to test QML integration from plugins."), _("Note: Used for development"))
available_for = ['qml']

View File

@@ -0,0 +1,12 @@
import os
from PyQt5.QtCore import QUrl
from PyQt5.QtQml import QQmlApplicationEngine
from electrum.plugin import hook, BasePlugin
class Plugin(BasePlugin):
def __init__(self, parent, config, name):
BasePlugin.__init__(self, parent, config, name)
@hook
def init_qml(self, engine: QQmlApplicationEngine):
pass