diff --git a/src/controls/templates/FormLayout.qml b/src/controls/templates/FormLayout.qml index 5b8b2708..e01295c2 100644 --- a/src/controls/templates/FormLayout.qml +++ b/src/controls/templates/FormLayout.qml @@ -1,134 +1,151 @@ /* * Copyright 2017 Marco Martin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2 or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import QtQuick 2.6 import QtQuick.Layouts 1.2 import QtQuick.Controls 2.2 import org.kde.kirigami 2.3 as Kirigami Control { id: root implicitWidth: lay.implicitWidth implicitHeight: lay.implicitHeight Layout.preferredHeight: lay.implicitHeight property bool wideMode: width > Kirigami.Units.gridUnit * 15 GridLayout { id: lay columns: root.wideMode ? 2 : 1 rowSpacing: Kirigami.Units.smallSpacing columnSpacing: Kirigami.Units.smallSpacing + property var knownItems: [] anchors { left: parent.left top: parent.top right: parent.right } } Item { id: temp } - // default property list __items - onChildrenChanged: { - var __items = children; - for (var i = 2; i < __items.length; ++i) { - var item = __items[i]; + Timer { + id: relayoutTimer + interval: 0 + onTriggered: { + var __items = children; + //exclude the layout and temp + for (var i = 2; i < __items.length; ++i) { + var item = __items[i]; - //skip items that are already there - if (item.parent && item.parent.parent == lay || - //exclude Repeaters - //NOTE: this is an heuristic but there are't better ways - (item.model !== undefined && item.children.length == 0)) { - continue; - } + //skip items that are already there + if (lay.knownItems.indexOf(item) != -1 || + //item.parent && item.parent.parent == lay || + //exclude Repeaters + //NOTE: this is an heuristic but there are't better ways + (item.model !== undefined && item.children.length == 0)) { + continue; + } + lay.knownItems.push(item); - var itemContainer = itemComponent.createObject(temp, {"item": item}) - item.parent = itemContainer; - item.anchors.fill = itemContainer; - //if section, label goes after the separator - if (item.Kirigami.FormData.isSection) { - //put an extra spacer - var placeHolder = placeHolderComponent.createObject(lay, {"item": item}); - placeHolder.Layout.colSpan = 2; - itemContainer.parent = lay; - } + var itemContainer = itemComponent.createObject(temp, {"item": item}) + //item.parent = itemContainer; + item.anchors.fill = itemContainer; + //if section, label goes after the separator + if (item.Kirigami.FormData.isSection) { + //put an extra spacer + var placeHolder = placeHolderComponent.createObject(lay, {"item": item}); + placeHolder.Layout.colSpan = 2; + itemContainer.parent = lay; + } - var buddy = buddyComponent.createObject(lay, {"item": item}) + var buddy = buddyComponent.createObject(lay, {"item": item}) - itemContainer.parent = lay; - //if section, wee need another placeholder - if (item.Kirigami.FormData.isSection) { - var placeHolder = placeHolderComponent.createObject(lay, {"item": item}); - placeHolder.parent = lay; + itemContainer.parent = lay; + //if section, wee need another placeholder + if (item.Kirigami.FormData.isSection) { + var placeHolder = placeHolderComponent.createObject(lay, {"item": item}); + placeHolder.parent = lay; + } } } } + onChildrenChanged: relayoutTimer.restart(); + Component.onCompleted: childrenChanged() Component { id: itemComponent Item { id: container property var item + enabled: item.enabled + visible: item.visible implicitWidth: item.implicitWidth Layout.preferredHeight: Math.max(item.Layout.preferredHeight, item.implicitHeight) Layout.alignment: (root.wideMode ? Qt.AlignLeft : Qt.AlignHCenter) | Qt.AlignVCenter Layout.fillWidth: item.Kirigami.FormData.isSection Layout.columnSpan: item.Kirigami.FormData.isSection ? lay.columns : 1 onItemChanged: { if (!item) { container.destroy(); } } + onXChanged: item.x = x; + onYChanged: item.y = y; } } Component { id: placeHolderComponent Item { property var item + enabled: item.enabled + visible: item.visible width: Kirigami.Units.smallSpacing height: Kirigami.Units.smallSpacing onItemChanged: { if (!item) { labelItem.destroy(); } } } } Component { id: buddyComponent Kirigami.Heading { id: labelItem property var item + enabled: item.enabled + visible: item.visible text: item.Kirigami.FormData.label level: item.Kirigami.FormData.isSection ? 3 : 5 Layout.preferredHeight: item.Kirigami.FormData.label.length > 0 ? implicitHeight : Kirigami.Units.smallSpacing Layout.alignment: root.wideMode ? (Qt.AlignRight | (item.Kirigami.FormData.buddyFor.height > height * 2 ? Qt.AlignTop : Qt.AlignVCenter)) : (Qt.AlignLeft | Qt.AlignBottom) Layout.topMargin: item.Kirigami.FormData.buddyFor.height > height * 2 ? Kirigami.Units.smallSpacing : 0 onItemChanged: { if (!item) { labelItem.destroy(); } } } } }