[ui] add Open Recent Project

This commit is contained in:
Fabien Castan 2020-03-09 21:26:01 +01:00
parent d1ab458e56
commit d001cc9e73
3 changed files with 87 additions and 1 deletions

View file

@ -2,7 +2,7 @@ import logging
import os import os
import argparse import argparse
from PySide2.QtCore import Qt, QUrl, Slot, QJsonValue, Property, qInstallMessageHandler, QtMsgType from PySide2.QtCore import Qt, QUrl, Slot, QJsonValue, Property, Signal, qInstallMessageHandler, QtMsgType, QSettings
from PySide2.QtGui import QIcon from PySide2.QtGui import QIcon
from PySide2.QtWidgets import QApplication from PySide2.QtWidgets import QApplication
@ -141,6 +141,7 @@ class MeshroomApp(QApplication):
if args.project: if args.project:
r.load(args.project) r.load(args.project)
self.addRecentProjectFile(args.project)
else: else:
r.new() r.new()
@ -164,9 +165,52 @@ class MeshroomApp(QApplication):
"Invalid value: '{}'".format(args.save)) "Invalid value: '{}'".format(args.save))
os.mkdir(projectFolder) os.mkdir(projectFolder)
r.saveAs(args.save) r.saveAs(args.save)
self.addRecentProjectFile(args.save)
self.engine.load(os.path.normpath(url)) self.engine.load(os.path.normpath(url))
def _recentProjectFiles(self):
projects = []
settings = QSettings()
settings.beginGroup("RecentFiles")
size = settings.beginReadArray("Projects")
for i in range(size):
settings.setArrayIndex(i)
p = settings.value("filepath")
if p:
projects.append(p)
settings.endArray()
return projects
@Slot(str)
def addRecentProjectFile(self, projectFile):
projectFile = QUrl(projectFile).path()
projects = self._recentProjectFiles()
# remove duplicates while preserving order
from collections import OrderedDict
uniqueProjects = OrderedDict.fromkeys(projects)
projects = list(uniqueProjects)
# remove previous usage of the value
if projectFile in uniqueProjects:
projects.remove(projectFile)
# add the new value in the first place
projects.insert(0, projectFile)
# keep only the 10 first elements
projects = projects[0:20]
settings = QSettings()
settings.beginGroup("RecentFiles")
size = settings.beginWriteArray("Projects")
for i, p in enumerate(projects):
settings.setArrayIndex(i)
settings.setValue("filepath", p)
settings.endArray()
settings.sync()
self.recentProjectFilesChanged.emit()
@Slot(str, result=str) @Slot(str, result=str)
def markdownToHtml(self, md): def markdownToHtml(self, md):
""" """
@ -216,3 +260,7 @@ class MeshroomApp(QApplication):
"onlineUrl": "https://raw.githubusercontent.com/alicevision/AliceVision/develop/COPYING.md" "onlineUrl": "https://raw.githubusercontent.com/alicevision/AliceVision/develop/COPYING.md"
} }
] ]
recentProjectFilesChanged = Signal()
recentProjectFiles = Property("QVariantList", _recentProjectFiles, notify=recentProjectFilesChanged)

View file

@ -135,6 +135,7 @@ ApplicationWindow {
onAccepted: { onAccepted: {
_reconstruction.saveAs(file) _reconstruction.saveAs(file)
closed(Platform.Dialog.Accepted) closed(Platform.Dialog.Accepted)
MeshroomApp.addRecentProjectFile(file.toString())
} }
onRejected: closed(Platform.Dialog.Rejected) onRejected: closed(Platform.Dialog.Rejected)
} }
@ -207,6 +208,7 @@ ApplicationWindow {
nameFilters: ["Meshroom Graphs (*.mg)"] nameFilters: ["Meshroom Graphs (*.mg)"]
onAccepted: { onAccepted: {
_reconstruction.loadUrl(file.toString()) _reconstruction.loadUrl(file.toString())
MeshroomApp.addRecentProjectFile(file.toString())
} }
} }
@ -326,10 +328,45 @@ ApplicationWindow {
} }
} }
Action { Action {
id: openActionItem
text: "Open" text: "Open"
shortcut: "Ctrl+O" shortcut: "Ctrl+O"
onTriggered: ensureSaved(function() { openFileDialog.open() }) onTriggered: ensureSaved(function() { openFileDialog.open() })
} }
Menu {
id: openRecentMenu
title: "Open Recent"
enabled: recentFilesMenuItems.model != undefined && recentFilesMenuItems.model.length > 0
property int maxWidth: 1000
property int fullWidth: {
var result = 0;
for (var i = 0; i < count; ++i) {
var item = itemAt(i);
result = Math.max(item.implicitWidth + item.padding * 2, result);
}
return result;
}
implicitWidth: fullWidth
Repeater {
id: recentFilesMenuItems
model: MeshroomApp.recentProjectFiles
MenuItem {
onTriggered: ensureSaved(function() {
openRecentMenu.dismiss();
_reconstruction.load(modelData);
MeshroomApp.addRecentProjectFile(modelData);
})
text: fileTextMetrics.elidedText
TextMetrics {
id: fileTextMetrics
text: modelData
elide: Text.ElideLeft
elideWidth: openRecentMenu.maxWidth
}
}
}
}
Action { Action {
id: saveAction id: saveAction
text: "Save" text: "Save"

View file

@ -426,6 +426,7 @@ class Reconstruction(UIGraph):
# use the user-provided default photogrammetry project file # use the user-provided default photogrammetry project file
self.load(p, setupProjectFile=False) self.load(p, setupProjectFile=False)
@Slot(str)
def load(self, filepath, setupProjectFile=True): def load(self, filepath, setupProjectFile=True):
try: try:
super(Reconstruction, self).load(filepath, setupProjectFile) super(Reconstruction, self).load(filepath, setupProjectFile)