Skip to content

Commit 8dd869f

Browse files
committed
api: Add QML extension system to register external QML files
1 parent 91f9731 commit 8dd869f

4 files changed

Lines changed: 51 additions & 0 deletions

File tree

meshroom/api/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,7 @@
1010
register_menu,
1111
get_registered_menu
1212
)
13+
14+
from meshroom.api.qml import (
15+
registerQmlSource
16+
)

meshroom/api/qml.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#!/usr/bin/env python
2+
3+
from meshroom.ui.extensions import QmlExtensions
4+
5+
6+
def registerQmlSource(folder: str, name: str, major: int = 1, minor: int = 0):
7+
QmlExtensions.registerQmlModule(folder, name, major, minor)

meshroom/ui/app.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
from meshroom.ui.scene import Scene
3535
from meshroom.ui.utils import QmlInstantEngine
3636
from meshroom.ui import commands
37+
from meshroom.ui.extensions import QmlExtensions
3738

3839

3940
class FileStatus(Enum):
@@ -287,6 +288,8 @@ def __init__(self, inputArgs):
287288
pyside6QmlPath = os.path.join(os.path.dirname(QtCore.__file__), "Qt", "qml")
288289
if os.path.isdir(pyside6QmlPath):
289290
self.engine.addImportPath(pyside6QmlPath)
291+
# Add registered QML extensions
292+
QmlExtensions.registerSources(self.engine)
290293

291294
# Expose the menu manager
292295
self.engine.rootContext().setContextProperty("MeshroomMenuManager", MeshroomMenuManager(parent=self))

meshroom/ui/extensions.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#!/usr/bin/env python
2+
3+
import logging
4+
from pathlib import Path
5+
6+
from meshroom.ui.utils import QmlInstantEngine
7+
8+
9+
10+
class QmlExtensions:
11+
""" This object manages QML Extensions.
12+
Using this we can register additional sources.
13+
"""
14+
15+
_sources = []
16+
17+
@classmethod
18+
def registerQmlModule(cls, folder: str, name: str, major: int = 1, minor: int = 0):
19+
if not (Path(folder) / "qmldir").exists():
20+
logging.error(f"Failed to register a QML module : no 'qmldir' file found on inside '{folder}'.")
21+
return
22+
cls._sources.append({
23+
"folder": folder,
24+
"module": name,
25+
"major": major,
26+
"minor": minor,
27+
})
28+
logging.debug(
29+
f"Registered QML source: module='{name}' ({major}.{minor}) from '{folder}'"
30+
)
31+
32+
@classmethod
33+
def registerSources(cls, engine: QmlInstantEngine):
34+
for src in cls._sources:
35+
qmlFolder = src["folder"]
36+
engine.addFilesFromDirectory(qmlFolder, recursive=True)
37+
engine.addImportPath(qmlFolder)

0 commit comments

Comments
 (0)