import QtQuick 2.0 import QtQuick.Window 2.0 import QtQuick.Layouts 1.0 import QtQuick.Controls 1.0 Item { property string currentDocumentId: "" function getDocumentText(documentId) { for (i = 0; i < editorListModel.count; i++) { if (editorListModel.get(i).documentId === documentId) { return editors.itemAt(i).getText(); } } return ""; } function openDocument(document) { loadDocument(document); currentDocumentId = document.documentId; } function loadDocument(document) { for (var i = 0; i < editorListModel.count; i++) if (editorListModel.get(i).documentId === document.documentId) return; //already open editorListModel.append(document); } function doLoadDocument(editor, document) { var data = fileIo.readFile(document.path); if (document.isContract) editor.onEditorTextChanged.connect(function() { codeModel.registerCodeChange(editor.getText()); }); editor.setText(data, document.syntaxMode); } Connections { target: projectModel onDocumentOpened: { openDocument(document); } onProjectSaving: { for (var i = 0; i < editorListModel.count; i++) fileIo.writeFile(editorListModel.get(i).path, editors.itemAt(i).item.getText()); } onProjectClosed: { for (var i = 0; i < editorListModel.count; i++) { editors.itemAt(i).visible = false; } editorListModel.clear(); currentDocumentId = ""; } } Repeater { id: editors model: editorListModel delegate: Loader { id: loader active: false asynchronous: true anchors.fill: parent source: "CodeEditor.qml" visible: (index >= 0 && index < editorListModel.count && currentDocumentId === editorListModel.get(index).documentId) onVisibleChanged: { loadIfNotLoaded() if (visible && item) loader.item.setFocus(); } Component.onCompleted: { loadIfNotLoaded() } onLoaded: { doLoadDocument(loader.item, editorListModel.get(index)) } function loadIfNotLoaded () { if(visible && !active) { active = true; } } } } ListModel { id: editorListModel } }