Warning, /pim/kube/framework/qml/ConversationListView.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 * Copyright (C) 2016 Michael Bohlender, <michael.bohlender@kdemail.net> 0003 * Copyright (C) 2017 Christian Mollekopf, <mollekopf@kolabsystems.com> 0004 * 0005 * This program is free software; you can redistribute it and/or modify 0006 * it under the terms of the GNU General Public License as published by 0007 * the Free Software Foundation; either version 2 of the License, or 0008 * (at your option) any later version. 0009 * 0010 * This program is distributed in the hope that it will be useful, 0011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 0012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0013 * GNU General Public License for more details. 0014 * 0015 * You should have received a copy of the GNU General Public License along 0016 * with this program; if not, write to the Free Software Foundation, Inc., 0017 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 0018 */ 0019 0020 import QtQuick 2.7 0021 import QtQuick.Controls 2 0022 import QtQuick.Layouts 1.1 0023 import org.kube.framework 1.0 as Kube 0024 0025 import QtQml 2.2 as QtQml 0026 0027 FocusScope { 0028 id: root 0029 property alias model: repeater.model 0030 property alias delegate: repeater.delegate 0031 property alias count: repeater.count 0032 property alias contentHeight: flickable.contentHeight 0033 property int currentIndex: -1 0034 0035 //We want to avoid interfering with scrolling as soon as the user starts to scroll. This is important if i.e. an html mail loads slowly. 0036 //However, we have to maintain position as the initial items expand, so we have to react to contentHeight changes. scrollToEnd ensures both. 0037 property bool scrollToEnd: true 0038 0039 property var currentItem: null 0040 0041 function scrollDown() { 0042 scrollHelper.scrollDown() 0043 } 0044 0045 function scrollUp() { 0046 scrollHelper.scrollUp() 0047 } 0048 0049 function setCurrentItem() { 0050 if (currentItem) { 0051 currentItem.isCurrentItem = false 0052 } 0053 if (currentIndex >= 0 && activeFocus) { 0054 var item = repeater.itemAt(currentIndex) 0055 if (item) { 0056 item.isCurrentItem = true 0057 currentItem = item 0058 } 0059 } else { 0060 currentItem = null 0061 } 0062 } 0063 0064 onCurrentIndexChanged: { 0065 setCurrentItem() 0066 } 0067 0068 onActiveFocusChanged: { 0069 setCurrentItem() 0070 } 0071 0072 function incrementCurrentIndex() { 0073 flickable.incrementCurrentIndex() 0074 } 0075 0076 function decrementCurrentIndex() { 0077 flickable.decrementCurrentIndex() 0078 } 0079 0080 Flickable { 0081 id: flickable 0082 anchors.fill: parent 0083 0084 //Optimize for view quality 0085 pixelAligned: true 0086 0087 contentWidth: width 0088 contentHeight: col.height 0089 0090 function scrollToIndex(index) { 0091 var item = repeater.itemAt(index) 0092 if (item) { 0093 scrollToPos(item.y) 0094 } 0095 } 0096 0097 function scrollToPos(pos) { 0098 var scrollToEndPos = (flickable.contentHeight - flickable.height) 0099 //Avoid scrolling past the end 0100 if (pos < scrollToEndPos) { 0101 flickable.contentY = pos 0102 } else { 0103 flickable.contentY = scrollToEndPos 0104 } 0105 } 0106 0107 onMovementStarted: { 0108 root.scrollToEnd = false 0109 } 0110 0111 onContentHeightChanged: { 0112 if (repeater.count && root.scrollToEnd) { 0113 //Scroll to the last item 0114 root.currentIndex = repeater.count - 1 0115 flickable.scrollToIndex(root.currentIndex) 0116 } 0117 } 0118 0119 Column { 0120 id: col 0121 width: parent.width 0122 spacing: 2 0123 Repeater { 0124 id: repeater 0125 onItemAdded: { 0126 root.scrollToEnd = true 0127 flickable.scrollToIndex(root.currentIndex) 0128 } 0129 } 0130 } 0131 0132 function incrementCurrentIndex() { 0133 if (currentIndex < repeater.count - 1) { 0134 currentIndex = currentIndex + 1 0135 } 0136 scrollToIndex(currentIndex) 0137 } 0138 0139 function decrementCurrentIndex() { 0140 if (currentIndex > 0) { 0141 currentIndex = currentIndex - 1 0142 } 0143 scrollToIndex(currentIndex) 0144 } 0145 0146 Keys.onPressed: { 0147 if (event.matches(StandardKey.MoveToNextLine)) { 0148 scrollHelper.scrollDown() 0149 } else if (event.matches(StandardKey.MoveToPreviousLine)) { 0150 scrollHelper.scrollUp() 0151 } 0152 } 0153 0154 Kube.ScrollHelper { 0155 id: scrollHelper 0156 flickable: flickable 0157 anchors.fill: parent 0158 } 0159 0160 //Intercept all scroll events, 0161 //necessary due to the webengineview 0162 Kube.MouseProxy { 0163 anchors.fill: parent 0164 target: scrollHelper 0165 forwardWheelEvents: true 0166 } 0167 0168 ScrollBar.vertical: Kube.ScrollBar {} 0169 0170 } 0171 }