[ui] app: Add a dedicated function to retrieve thumbnails

Instead of doing it directly within the `_getRecentProjectFiles` method,
add a function that attempts to retrieve a thumbnail corresponding to
an input project file path.
This commit is contained in:
Candice Bentéjac 2025-01-03 17:51:04 +01:00
parent edfe872227
commit 041c643be6

View file

@ -354,6 +354,33 @@ class MeshroomApp(QApplication):
meshroom.core.initPipelines() meshroom.core.initPipelines()
self.pipelineTemplateFilesChanged.emit() self.pipelineTemplateFilesChanged.emit()
def _retrieveThumbnailPath(self, filepath: str) -> str:
"""
Given the path of a project file, load this file and try to retrieve the path to its thumbnail, i.e. its
first viewpoint image.
Args:
filepath: the path of the project file to retrieve the thumbnail from
Returns:
The path to the thumbnail if it could be found, an empty string otherwise
"""
thumbnail = ""
try:
with open(filepath) as file:
fileData = json.load(file)
# Find the first CameraInit node
fileData = fileData["graph"]
for node in fileData:
if fileData[node]["nodeType"] == "CameraInit" and fileData[node]["inputs"].get("viewpoints"):
if len(fileData[node]["inputs"]["viewpoints"]) > 0:
thumbnail = fileData[node]["inputs"]["viewpoints"][0]["path"]
break
except FileNotFoundError:
pass
return thumbnail
def _getRecentProjectFiles(self) -> list[dict[str, str]]: def _getRecentProjectFiles(self) -> list[dict[str, str]]:
""" """
Read the list of recent project files from the QSettings, retrieve their filepath, and if it exists, their Read the list of recent project files from the QSettings, retrieve their filepath, and if it exists, their
@ -370,23 +397,9 @@ class MeshroomApp(QApplication):
size = settings.beginReadArray("Projects") size = settings.beginReadArray("Projects")
for i in range(size): for i in range(size):
settings.setArrayIndex(i) settings.setArrayIndex(i)
p = settings.value("filepath") path = settings.value("filepath")
thumbnail = "" if path:
if p: p = {"path": path, "thumbnail": self._retrieveThumbnailPath(path)}
# get the first image path from the project
try:
with open(p) as file:
file = json.load(file)
# find the first camerainit node
file = file["graph"]
for node in file:
if file[node]["nodeType"] == "CameraInit" and file[node]["inputs"].get("viewpoints"):
if len(file[node]["inputs"]["viewpoints"]) > 0:
thumbnail = file[node]["inputs"]["viewpoints"][0]["path"]
break
except FileNotFoundError:
pass
p = {"path": p, "thumbnail": thumbnail}
projects.append(p) projects.append(p)
settings.endArray() settings.endArray()
settings.endGroup() settings.endGroup()