import QtQuick 2.0 import QtQuick.Window 2.0 import QtQuick.Layouts 1.0 import QtQuick.Controls 1.0 import QtQuick.Controls.Styles 1.3 import "." Rectangle { Layout.fillWidth: true Layout.minimumHeight: hiddenHeightTopLevel() height: hiddenHeightTopLevel() Layout.maximumHeight: hiddenHeightTopLevel() id: wrapperItem signal documentSelected(string doc, string groupName) property alias model: filesList.model property string sectionName; property variant selManager; property int index; color: index % 2 === 0 ? "transparent" : projectFilesStyle.title.background function hiddenHeightTopLevel() { return section.state === "hidden" ? projectFilesStyle.documentsList.height : projectFilesStyle.documentsList.fileNameHeight * model.count + projectFilesStyle.documentsList.height; } function hiddenHeightRepeater() { return section.state === "hidden" ? 0 : projectFilesStyle.documentsList.fileNameHeight * wrapperItem.model.count; } function hiddenHeightElement() { return section.state === "hidden" ? 0 : projectFilesStyle.documentsList.fileNameHeight; } function getDocumentIndex(documentId) { for (var i = 0; i < model.count; i++) if (model.get(i).documentId === documentId) return i; return -1; } function removeDocument(documentId) { var i = getDocumentIndex(documentId); if (i !== -1) model.remove(i); } ColumnLayout { anchors.fill: parent spacing: 0 SourceSansProRegular { id: fileNameFont } SourceSansProBold { id: boldFont } RowLayout { anchors.top: parent.top id: rowCol height: projectFilesStyle.documentsList.height Layout.fillWidth: true Image { source: "qrc:/qml/img/opentriangleindicator_filesproject.png" width: 15 sourceSize.width: 12 id: imgArrow anchors.right: section.left anchors.rightMargin: 8 anchors.top: parent.top anchors.topMargin: 10 } Text { id: section text: sectionName anchors.left: parent.left anchors.leftMargin: projectFilesStyle.general.leftMargin color: projectFilesStyle.documentsList.sectionColor font.family: boldFont.name font.pointSize: projectFilesStyle.documentsList.sectionFontSize states: [ State { name: "hidden" PropertyChanges { target: filesList; visible: false; } PropertyChanges { target: rowCol; Layout.minimumHeight: projectFilesStyle.documentsList.height; Layout.maximumHeight: projectFilesStyle.documentsList.height; height: projectFilesStyle.documentsList.height; } PropertyChanges { target: imgArrow; source: "qrc:/qml/img/closedtriangleindicator_filesproject.png" } } ] } MouseArea { id: titleMouseArea anchors.fill: parent hoverEnabled: true z: 2 onClicked: { if (section.state === "hidden") section.state = ""; else section.state = "hidden"; } } } ColumnLayout { height: wrapperItem.hiddenHeightRepeater() Layout.minimumHeight: wrapperItem.hiddenHeightRepeater() Layout.preferredHeight: wrapperItem.hiddenHeightRepeater() Layout.maximumHeight: wrapperItem.hiddenHeightRepeater() width: parent.width visible: section.state !== "hidden" spacing: 0 Repeater { id: filesList visible: section.state !== "hidden" Rectangle { visible: section.state !== "hidden" id: rootItem Layout.fillWidth: true Layout.minimumHeight: wrapperItem.hiddenHeightElement() Layout.preferredHeight: wrapperItem.hiddenHeightElement() Layout.maximumHeight: wrapperItem.hiddenHeightElement() height: wrapperItem.hiddenHeightElement() color: isSelected ? projectFilesStyle.documentsList.highlightColor : "transparent" property bool isSelected property bool renameMode Row { spacing: 3 anchors.verticalCenter: parent.verticalCenter anchors.fill: parent anchors.left: parent.left anchors.leftMargin: projectFilesStyle.general.leftMargin + 2 Text { id: nameText height: parent.height visible: !renameMode color: rootItem.isSelected ? projectFilesStyle.documentsList.selectedColor : projectFilesStyle.documentsList.color text: name; font.family: fileNameFont.name font.pointSize: projectFilesStyle.documentsList.fontSize verticalAlignment: Text.AlignVCenter Connections { target: selManager onSelected: { if (groupName != sectionName) rootItem.isSelected = false; else if (doc === documentId) rootItem.isSelected = true; else rootItem.isSelected = false; if (rootItem.isSelected && section.state === "hidden") section.state = ""; } onIsCleanChanged: { if (groupName === sectionName && doc === documentId) editStatusLabel.visible = !isClean; } } } DefaultLabel { id: editStatusLabel visible: false color: rootItem.isSelected ? projectFilesStyle.documentsList.selectedColor : projectFilesStyle.documentsList.color verticalAlignment: Text.AlignVCenter text: "*" width: 10 height: parent.height } } TextInput { id: textInput text: nameText.text visible: renameMode anchors.verticalCenter: parent.verticalCenter anchors.left: parent.left anchors.leftMargin: projectFilesStyle.general.leftMargin MouseArea { id: textMouseArea anchors.fill: parent hoverEnabled: true z: 2 onClicked: { textInput.forceActiveFocus(); } } onVisibleChanged: { if (visible) { selectAll(); forceActiveFocus(); } } onAccepted: close(true); onCursorVisibleChanged: { if (!cursorVisible) close(false); } onFocusChanged: { if (!focus) close(false); } function close(accept) { rootItem.renameMode = false; if (accept) { var i = getDocumentIndex(documentId); projectModel.renameDocument(documentId, textInput.text); wrapperItem.model.set(i, projectModel.getDocument(documentId)); } } } MouseArea { id: mouseArea z: 1 hoverEnabled: false anchors.fill: parent acceptedButtons: Qt.LeftButton | Qt.RightButton onClicked:{ if (mouse.button === Qt.RightButton && !isContract) contextMenu.popup(); else if (mouse.button === Qt.LeftButton) { rootItem.isSelected = true; projectModel.openDocument(documentId); documentSelected(documentId, groupName); } } } Menu { id: contextMenu MenuItem { text: qsTr("Rename") onTriggered: { rootItem.renameMode = true; } } MenuItem { text: qsTr("Delete") onTriggered: { projectModel.removeDocument(documentId); wrapperItem.removeDocument(documentId); } } } } } } } }