diff options
author | Gabriel de Dietrich <gabriel.dedietrich@theqtcompany.com> | 2015-02-06 19:40:08 +0100 |
---|---|---|
committer | Gabriel de Dietrich <gabriel.dedietrich@theqtcompany.com> | 2015-02-13 15:27:50 +0000 |
commit | 0674b38c9cd12fde6b41ef4be079352878befa9a (patch) | |
tree | e93c60bdc89af0d5c66dcd194fcc5a43014c6ef7 /src | |
parent | 82c7760b819f73ebc7f4ba6203fa2fc92b383236 (diff) | |
download | qtquickcontrols-0674b38c9cd12fde6b41ef4be079352878befa9a.tar.gz |
BasicTableView: Refactor and specialize ItemDelegateLoader
Change-Id: If95725e428025000d65984c81a1d7e1bac78e484
Reviewed-by: Caroline Chao <caroline.chao@theqtcompany.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/controls/Private/BasicTableView.qml | 67 | ||||
-rw-r--r-- | src/controls/Private/TableViewItemDelegateLoader.qml | 96 | ||||
-rw-r--r-- | src/controls/Private/TreeViewItemDelegateLoader.qml | 100 | ||||
-rw-r--r-- | src/controls/Private/private.pri | 2 | ||||
-rw-r--r-- | src/controls/Private/qmldir | 2 | ||||
-rw-r--r-- | src/controls/TableView.qml | 6 | ||||
-rw-r--r-- | src/controls/TreeView.qml | 6 |
7 files changed, 221 insertions, 58 deletions
diff --git a/src/controls/Private/BasicTableView.qml b/src/controls/Private/BasicTableView.qml index a42a406c..f9753166 100644 --- a/src/controls/Private/BasicTableView.qml +++ b/src/controls/Private/BasicTableView.qml @@ -398,6 +398,9 @@ ScrollView { /*! \internal */ readonly property alias __listView: listView + /*! \internal */ + property Component __itemDelegateLoader: null + /*! \internal Allows to override the model property in cases like TreeView, where we want to use a proxy/adaptor model between the user's model @@ -596,65 +599,13 @@ ScrollView { id: repeater model: columnModel - Loader { - id: itemDelegateLoader - width: columnItem.width - height: parent ? parent.height : 0 - visible: columnItem.visible - sourceComponent: rowitem.itemModel !== undefined ? // delays construction until model is initialized - (columnItem.delegate ? columnItem.delegate : itemDelegate) : null - - // these properties are exposed to the item delegate - readonly property var model: itemModel - readonly property var modelData: itemModelData - - property QtObject styleData: QtObject { - readonly property int row: rowitem.rowIndex - readonly property int column: index - readonly property int elideMode: columnItem.elideMode - readonly property int textAlignment: columnItem.horizontalAlignment - readonly property bool selected: rowitem.itemSelected - readonly property bool hasActiveFocus: rowitem.activeFocus - readonly property bool pressed: row === __mouseArea.pressedRow && column === __mouseArea.pressedColumn - readonly property color textColor: rowitem.itemTextColor - readonly property string role: columnItem.role - readonly property var value: (itemModel && itemModel.hasOwnProperty(role)) - ? itemModel[role] // Qml ListModel and QAbstractItemModel - : modelData && modelData.hasOwnProperty(role) - ? modelData[role] // QObjectList / QObject - : modelData != undefined ? modelData : "" // Models without role - readonly property int depth: itemModel && column === 0 && itemModel["_q_TreeView_ItemDepth"] || 0 - readonly property bool hasChildren: itemModel && itemModel["_q_TreeView_HasChildren"] || false - readonly property bool hasSibling: itemModel && itemModel["_q_TreeView_HasSibling"] || false - readonly property bool isExpanded: itemModel && itemModel["_q_TreeView_ItemExpanded"] || false - } - - readonly property int __itemIndentation: __style.__indentation * (styleData.depth + 1) - - Binding { - target: item - property: "x" - value: __itemIndentation - } + delegate: __itemDelegateLoader - Binding { - target: item - property: "width" - value: itemDelegateLoader.width - __itemIndentation - } - - Loader { - id: branchDelegateLoader - active: rowitem.itemModel !== undefined - && index === 0 - && itemDelegateLoader.width > __itemIndentation - && styleData.hasChildren - sourceComponent: __style ? __style.__branchDelegate : null - anchors.right: parent.item.left - anchors.verticalCenter: parent.verticalCenter - property QtObject styleData: itemDelegateLoader.styleData - onLoaded: rowitem.branchDecoration = item - } + onItemAdded: { + var columnItem = columnModel.get(index).columnItem + item.__index = index + item.__rowItem = rowitem + item.__column = columnItem } } } diff --git a/src/controls/Private/TableViewItemDelegateLoader.qml b/src/controls/Private/TableViewItemDelegateLoader.qml new file mode 100644 index 00000000..6214bdb3 --- /dev/null +++ b/src/controls/Private/TableViewItemDelegateLoader.qml @@ -0,0 +1,96 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 + +/*! + \qmltype TableViewItemDelegateLoader + \internal + \qmlabstract + \inqmlmodule QtQuick.Controls.Private +*/ + +Loader { + id: itemDelegateLoader + + width: __column ? __column.width : 0 + height: parent ? parent.height : 0 + visible: __column ? __column.visible : false + sourceComponent: __model === undefined || styleData.row === -1 ? null + : __column && __column.delegate ? __column.delegate : __itemDelegate + + // All these properties are internal + property int __index + property Item __rowItem: null + property var __model: __rowItem ? __rowItem.itemModel : undefined + property var __modelData: __rowItem ? __rowItem.itemModelData : undefined + property TableViewColumn __column: null + property Component __itemDelegate: null + property var __mouseArea: null + property var __style: null + + // These properties are exposed to the item delegate + readonly property var model: __model + readonly property var modelData: __modelData + + property QtObject styleData: QtObject { + readonly property int row: __rowItem ? __rowItem.rowIndex : -1 + readonly property int column: __index + readonly property int elideMode: __column ? __column.elideMode : Text.ElideLeft + readonly property int textAlignment: __column ? __column.horizontalAlignment : Text.AlignLeft + readonly property bool selected: __rowItem ? __rowItem.itemSelected : false + readonly property bool hasActiveFocus: __rowItem ? __rowItem.activeFocus : false + readonly property bool pressed: __mouseArea && row === __mouseArea.pressedRow && column === __mouseArea.pressedColumn + readonly property color textColor: __rowItem ? __rowItem.itemTextColor : "black" + readonly property string role: __column ? __column.role : "" + readonly property var value: model && model.hasOwnProperty(role) ? model[role] // Qml ListModel and QAbstractItemModel + : modelData && modelData.hasOwnProperty(role) ? modelData[role] // QObjectList / QObject + : modelData != undefined ? modelData : "" // Models without role + } +} diff --git a/src/controls/Private/TreeViewItemDelegateLoader.qml b/src/controls/Private/TreeViewItemDelegateLoader.qml new file mode 100644 index 00000000..20ea655d --- /dev/null +++ b/src/controls/Private/TreeViewItemDelegateLoader.qml @@ -0,0 +1,100 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 + +/*! + \qmltype TreeViewItemDelegateLoader + \internal + \qmlabstract + \inqmlmodule QtQuick.Controls.Private +*/ + +TableViewItemDelegateLoader { + id: itemDelegateLoader + + /* \internal */ + readonly property int __itemIndentation: __style && __index === 0 + ? __style.__indentation * (styleData.depth + 1) : 0 + // Exposed to the item delegate + styleData: QtObject { + readonly property int row: __rowItem ? __rowItem.rowIndex : -1 + readonly property int column: __index + readonly property int elideMode: __column ? __column.elideMode : Text.ElideLeft + readonly property int textAlignment: __column ? __column.horizontalAlignment : Text.AlignLeft + readonly property bool selected: __rowItem ? __rowItem.itemSelected : false + readonly property bool hasActiveFocus: __rowItem ? __rowItem.activeFocus : false + readonly property bool pressed: __mouseArea && row === __mouseArea.pressedRow && column === __mouseArea.pressedColumn + readonly property color textColor: __rowItem ? __rowItem.itemTextColor : "black" + readonly property string role: __column ? __column.role : "" + readonly property var value: model && model.hasOwnProperty(role) ? model[role] : "" + readonly property int depth: model && column === 0 ? model["_q_TreeView_ItemDepth"] : 0 + readonly property bool hasChildren: model ? model["_q_TreeView_HasChildren"] : false + readonly property bool hasSibling: model ? model["_q_TreeView_HasSibling"] : false + readonly property bool isExpanded: model ? model["_q_TreeView_ItemExpanded"] : false + } + + onLoaded: { + item.x = Qt.binding(function() { return __itemIndentation}) + item.width = Qt.binding(function() { return width - __itemIndentation }) + } + + Loader { + id: branchDelegateLoader + active: __model !== undefined + && __index === 0 + && styleData.hasChildren + visible: itemDelegateLoader.width > __itemIndentation + sourceComponent: __style && __style.__branchDelegate || null + anchors.right: parent.item ? parent.item.left : undefined + anchors.verticalCenter: parent.verticalCenter + property QtObject styleData: itemDelegateLoader.styleData + onLoaded: if (__rowItem) __rowItem.branchDecoration = item + } +} diff --git a/src/controls/Private/private.pri b/src/controls/Private/private.pri index 7d23fc47..5de6881e 100644 --- a/src/controls/Private/private.pri +++ b/src/controls/Private/private.pri @@ -64,6 +64,8 @@ PRIVATE_QML_FILES += \ $$PWD/EditMenu_ios.qml \ $$PWD/ToolMenuButton.qml \ $$PWD/BasicTableView.qml \ + $$PWD/TableViewItemDelegateLoader.qml \ + $$PWD/TreeViewItemDelegateLoader.qml \ $$PWD/qmldir QML_FILES += $$PRIVATE_QML_FILES diff --git a/src/controls/Private/qmldir b/src/controls/Private/qmldir index c2c2d7ca..34e3c0f0 100644 --- a/src/controls/Private/qmldir +++ b/src/controls/Private/qmldir @@ -34,3 +34,5 @@ EditMenu_base 1.0 EditMenu_base.qml EditMenu_ios 1.0 EditMenu_ios.qml ToolMenuButton 1.0 ToolMenuButton.qml BasicTableView 1.0 BasicTableView.qml +TableViewItemDelegateLoader 1.0 TableViewItemDelegateLoader.qml +TreeViewItemDelegateLoader 1.0 TreeViewItemDelegateLoader.qml diff --git a/src/controls/TableView.qml b/src/controls/TableView.qml index 629c95dd..198ec3c7 100644 --- a/src/controls/TableView.qml +++ b/src/controls/TableView.qml @@ -288,6 +288,12 @@ BasicTableView { __viewTypeName: "TableView" __model: model + __itemDelegateLoader: TableViewItemDelegateLoader { + __style: root.__style + __itemDelegate: root.itemDelegate + __mouseArea: mousearea + } + __mouseArea: MouseArea { id: mousearea diff --git a/src/controls/TreeView.qml b/src/controls/TreeView.qml index 2f1a4412..87260072 100644 --- a/src/controls/TreeView.qml +++ b/src/controls/TreeView.qml @@ -258,6 +258,12 @@ BasicTableView { onCollapsed: root.collapsed(index) } + __itemDelegateLoader: TreeViewItemDelegateLoader { + __style: root.__style + __itemDelegate: root.itemDelegate + __mouseArea: mouseArea + } + onSelectionModeChanged: if (!!selection) selection.clear() __mouseArea: MouseArea { |