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 <joerg.bornemann@theqtcompany.com>
This commit is contained in:
Ulf Hermann
2015-01-15 12:34:19 +01:00
parent c6628f7ee3
commit 7e976569ea
3 changed files with 106 additions and 45 deletions

View File

@@ -55,8 +55,6 @@ Item {
signal selectNextBySelectionId(int selectionId) signal selectNextBySelectionId(int selectionId)
signal selectPrevBySelectionId(int selectionId) signal selectPrevBySelectionId(int selectionId)
readonly property int dragHeight: 5
property bool reverseSelect: false property bool reverseSelect: false
visible: model && (mockup || (!model.hidden && !model.empty)) visible: model && (mockup || (!model.hidden && !model.empty))
@@ -111,56 +109,35 @@ Item {
visible: expanded visible: expanded
Repeater { Repeater {
model: labels.length model: labels.length
Button { Loader {
id: button id: loader
property string labelText: labels[index].description ? labels[index].description : asynchronous: dragOffset - draggerParent.contentY + y + txt.height >
qsTr("[unknown]") draggerParent.height
active: expanded
width: labelContainer.width width: labelContainer.width
height: column.parentModel ? column.parentModel.rowHeight(index + 1) : 0 height: column.parentModel ? column.parentModel.rowHeight(index + 1) : 0
action: Action {
onTriggered: { onAsynchronousChanged: {
if (reverseSelect) if (!asynchronous && active && status !== Loader.Ready) {
labelContainer.selectPrevBySelectionId(labels[index].id); // Trigger a synchronous reload to avoid glitches
else var component = sourceComponent;
labelContainer.selectNextBySelectionId(labels[index].id); sourceComponent = undefined;
sourceComponent = component;
}
} }
tooltip: button.labelText + (labels[index].displayName ? sourceComponent: RowLabel {
(" (" + labels[index].displayName + ")") : "") label: labels[index];
} onSelectBySelectionId: {
if (labelContainer.reverseSelect) {
style: ButtonStyle { labelContainer.selectPrevBySelectionId(label.id);
background: Rectangle { } else {
border.width: 1 labelContainer.selectNextBySelectionId(label.id);
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 { onSetRowHeight: {
hoverEnabled: true column.parentModel.setExpandedRowHeight(index + 1, newHeight);
property bool resizing: false loader.height = column.parentModel.rowHeight(index + 1);
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);
}
} }
} }
} }

View File

@@ -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)
}
}
}

View File

@@ -32,5 +32,6 @@
<file>notes.frag</file> <file>notes.frag</file>
<file>TimelineLabels.qml</file> <file>TimelineLabels.qml</file>
<file>TimelineContent.qml</file> <file>TimelineContent.qml</file>
<file>RowLabel.qml</file>
</qresource> </qresource>
</RCC> </RCC>