diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 55e1e466a4..7668a62dae 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -17,6 +17,7 @@ from UM.Logger import Logger from UM.Preferences import Preferences from UM.Message import Message from UM.PluginRegistry import PluginRegistry +from UM.JobQueue import JobQueue from UM.Scene.BoxRenderer import BoxRenderer from UM.Scene.Selection import Selection @@ -71,6 +72,17 @@ class CuraApplication(QtApplication): Preferences.getInstance().addPreference("cura/active_machine", "") Preferences.getInstance().addPreference("cura/active_mode", "simple") + Preferences.getInstance().addPreference("cura/recent_files", "") + + JobQueue.getInstance().jobFinished.connect(self._onJobFinished) + + self._recent_files = [] + files = Preferences.getInstance().getValue("cura/recent_files").split(";") + for f in files: + if not os.path.isfile(f): + continue + + self._recent_files.append(f) ## Handle loading of all plugin types (and the backend explicitly) # \sa PluginRegistery @@ -305,6 +317,11 @@ class CuraApplication(QtApplication): return log + recentFilesChanged = pyqtSignal() + @pyqtProperty("QStringList", notify = recentFilesChanged) + def recentFiles(self): + return self._recent_files + outputDevicesChanged = pyqtSignal() @pyqtProperty("QVariantMap", notify = outputDevicesChanged) @@ -460,3 +477,18 @@ class CuraApplication(QtApplication): op = AddSceneNodeOperation(node, self.getController().getScene().getRoot()) op.push() + + def _onJobFinished(self, job): + if type(job) is not ReadMeshJob: + return + + f = job.getFileName() + if f in self._recent_files: + self._recent_files.remove(f) + + self._recent_files.insert(0, f) + if len(self._recent_files) > 10: + del self._recent_files[10] + + Preferences.getInstance().setValue("cura/recent_files", ";".join(self._recent_files)) + self.recentFilesChanged.emit() diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index a2eeba59cd..e0caf4d83d 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -25,6 +25,7 @@ UM.MainWindow { window: base Menu { + id: fileMenu //: File menu title: qsTr("&File"); @@ -33,6 +34,19 @@ UM.MainWindow { MenuSeparator { } + Instantiator { + model: Printer.recentFiles + MenuItem { + property url filePath: modelData; + text: (index + 1) + ". " + modelData.slice(modelData.lastIndexOf("/") + 1); + onTriggered: UM.MeshFileHandler.readLocalFile(filePath); + } + onObjectAdded: fileMenu.insertItem(index, object) + onObjectRemoved: fileMenu.removeItem(object) + } + + MenuSeparator { } + MenuItem { action: actions.quit; } }