From 7e976569ea8cb7be6d8f05b30342d6a940c4bf8b Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Thu, 15 Jan 2015 12:34:19 +0100 Subject: [PATCH] Timeline: Load row labels asynchronously where possible Loading them all at once and keeping them around all the time wastes memory and time. Change-Id: I088e0f955a93f94fa460ca17583123eb4d317da9 Reviewed-by: Joerg Bornemann --- src/libs/timeline/qml/CategoryLabel.qml | 67 +++++++------------- src/libs/timeline/qml/RowLabel.qml | 83 +++++++++++++++++++++++++ src/libs/timeline/qml/timeline.qrc | 1 + 3 files changed, 106 insertions(+), 45 deletions(-) create mode 100644 src/libs/timeline/qml/RowLabel.qml diff --git a/src/libs/timeline/qml/CategoryLabel.qml b/src/libs/timeline/qml/CategoryLabel.qml index 4958402333c..d5ab08400e6 100644 --- a/src/libs/timeline/qml/CategoryLabel.qml +++ b/src/libs/timeline/qml/CategoryLabel.qml @@ -55,8 +55,6 @@ Item { signal selectNextBySelectionId(int selectionId) signal selectPrevBySelectionId(int selectionId) - readonly property int dragHeight: 5 - property bool reverseSelect: false visible: model && (mockup || (!model.hidden && !model.empty)) @@ -111,57 +109,36 @@ Item { visible: expanded Repeater { model: labels.length - Button { - id: button - property string labelText: labels[index].description ? labels[index].description : - qsTr("[unknown]") + Loader { + id: loader + asynchronous: dragOffset - draggerParent.contentY + y + txt.height > + draggerParent.height + active: expanded width: labelContainer.width height: column.parentModel ? column.parentModel.rowHeight(index + 1) : 0 - action: Action { - onTriggered: { - if (reverseSelect) - labelContainer.selectPrevBySelectionId(labels[index].id); - else - labelContainer.selectNextBySelectionId(labels[index].id); - } - tooltip: button.labelText + (labels[index].displayName ? - (" (" + labels[index].displayName + ")") : "") - } - - style: ButtonStyle { - background: Rectangle { - border.width: 1 - border.color: "#c8c8c8" - color: "#eaeaea" - } - label: Text { - text: button.labelText - textFormat: Text.PlainText - verticalAlignment: Text.AlignVCenter - horizontalAlignment: Text.AlignLeft - elide: Text.ElideRight - renderType: Text.NativeRendering + onAsynchronousChanged: { + if (!asynchronous && active && status !== Loader.Ready) { + // Trigger a synchronous reload to avoid glitches + var component = sourceComponent; + sourceComponent = undefined; + sourceComponent = component; } } - MouseArea { - hoverEnabled: true - property bool resizing: false - onPressed: resizing = true - onReleased: resizing = false - height: dragHeight - anchors.bottom: parent.bottom - anchors.left: parent.left - anchors.right: parent.right - cursorShape: Qt.SizeVerCursor - - onMouseYChanged: { - if (resizing) { - column.parentModel.setExpandedRowHeight(index + 1, y + mouseY); - parent.height = column.parentModel.rowHeight(index + 1); + sourceComponent: RowLabel { + label: labels[index]; + onSelectBySelectionId: { + if (labelContainer.reverseSelect) { + labelContainer.selectPrevBySelectionId(label.id); + } else { + labelContainer.selectNextBySelectionId(label.id); } } + onSetRowHeight: { + column.parentModel.setExpandedRowHeight(index + 1, newHeight); + loader.height = column.parentModel.rowHeight(index + 1); + } } } } diff --git a/src/libs/timeline/qml/RowLabel.qml b/src/libs/timeline/qml/RowLabel.qml new file mode 100644 index 00000000000..4f2afd80fff --- /dev/null +++ b/src/libs/timeline/qml/RowLabel.qml @@ -0,0 +1,83 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing +** +** This file is part of Qt Creator. +** +** 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 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQuick.Controls 1.2 +import QtQuick.Controls.Styles 1.2 + +Button { + id: button + property var label + + readonly property int dragHeight: 5 + + signal selectBySelectionId() + signal setRowHeight(int newHeight) + + property string labelText: label.description ? label.description : qsTr("[unknown]") + action: Action { + onTriggered: button.selectBySelectionId(); + tooltip: button.labelText + (label.displayName ? (" (" + label.displayName + ")") : "") + } + + style: ButtonStyle { + background: Rectangle { + border.width: 1 + border.color: "#c8c8c8" + color: "#eaeaea" + } + label: Text { + text: button.labelText + textFormat: Text.PlainText + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignLeft + elide: Text.ElideRight + renderType: Text.NativeRendering + } + } + MouseArea { + hoverEnabled: true + property bool resizing: false + onPressed: resizing = true + onReleased: resizing = false + + height: dragHeight + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + cursorShape: Qt.SizeVerCursor + + onMouseYChanged: { + if (resizing) + button.setRowHeight(y + mouseY) + } + } +} + diff --git a/src/libs/timeline/qml/timeline.qrc b/src/libs/timeline/qml/timeline.qrc index f0eb2afaa4f..4dc7e8c5a7f 100644 --- a/src/libs/timeline/qml/timeline.qrc +++ b/src/libs/timeline/qml/timeline.qrc @@ -32,5 +32,6 @@ notes.frag TimelineLabels.qml TimelineContent.qml + RowLabel.qml