moment/src/qml/SidePane/SidePaneList.qml

143 lines
3.9 KiB
QML
Raw Normal View History

import QtQuick 2.12
import QtQuick.Layouts 1.12
import "../Base"
import "../utils.js" as Utils
HListView {
2019-08-30 11:05:11 -04:00
id: sidePaneList
readonly property var originSource: window.sidePaneModelSource
readonly property var collapseAccounts: window.uiState.collapseAccounts
2019-08-30 13:48:24 -04:00
readonly property string filter: toolBar.roomFilter
readonly property alias activateLimiter: activateLimiter
onOriginSourceChanged: filterLimiter.restart()
onFilterChanged: filterLimiter.restart()
onCollapseAccountsChanged: filterLimiter.restart()
function filterSource() {
let show = []
2019-08-30 11:05:11 -04:00
// Hide a harmless error when activating a RoomDelegate
try { window.sidePaneModelSource } catch (err) { return }
for (let i = 0; i < window.sidePaneModelSource.length; i++) {
let item = window.sidePaneModelSource[i]
if (item.type == "Account" ||
(filter ?
Utils.filterMatches(filter, item.data.filter_string) :
! window.uiState.collapseAccounts[item.user_id]))
{
if (filter && show.length && item.type == "Account" &&
show[show.length - 1].type == "Account" &&
! Utils.filterMatches(
filter, show[show.length - 1].data.filter_string)
) {
2019-08-19 18:49:56 -04:00
// If filter active, current and previous items are
// both accounts and previous account doesn't match filter,
// that means the previous account had no matching rooms.
show.pop()
}
show.push(item)
}
}
2019-08-19 18:49:56 -04:00
let last = show[show.length - 1]
if (show.length && filter && last.type == "Account" &&
! Utils.filterMatches(filter, last.data.filter_string))
{
// If filter active, last item is an account and last item
// doesn't match filter, that account had no matching rooms.
show.pop()
}
model.source = show
}
function previous(activate=true) {
decrementCurrentIndex()
if (activate) activateLimiter.restart()
}
function next(activate=true) {
incrementCurrentIndex()
if (activate) activateLimiter.restart()
}
function activate() {
currentItem.item.activated()
}
2019-11-10 08:54:45 -04:00
function accountSettings() {
if (! currentItem) incrementCurrentIndex()
pageLoader.showPage(
2019-11-10 09:07:35 -04:00
"AccountSettings/AccountSettings",
2019-11-10 08:54:45 -04:00
{userId: currentItem.item.delegateModel.user_id},
)
}
2019-11-10 08:32:17 -04:00
function addNewChat() {
if (! currentItem) incrementCurrentIndex()
pageLoader.showPage(
"AddChat/AddChat",
{userId: currentItem.item.delegateModel.user_id},
)
}
function toggleCollapseAccount() {
if (filter) return
if (! currentItem) incrementCurrentIndex()
if (currentItem.item.delegateModel.type == "Account") {
currentItem.item.toggleCollapse()
return
}
for (let i = 0; i < model.source.length; i++) {
let item = model.source[i]
if (item.type == "Account" && item.user_id ==
currentItem.item.delegateModel.user_id)
{
currentIndex = i
currentItem.item.toggleCollapse()
}
}
}
model: HListModel {
keyField: "id"
source: originSource
}
delegate: Loader {
2019-08-30 11:05:11 -04:00
width: sidePaneList.width
Component.onCompleted: setSource(
model.type == "Account" ?
2019-08-30 11:05:11 -04:00
"AccountDelegate.qml" : "RoomDelegate.qml",
{view: sidePaneList}
)
}
Timer {
2019-08-19 20:50:14 -04:00
id: filterLimiter
interval: 16
onTriggered: filterSource()
2019-08-19 20:50:14 -04:00
}
Timer {
id: activateLimiter
interval: 300
onTriggered: activate()
}
}