moment/src/qml/UI.qml
miruka 8de26c11a1 HShortcutHandler & HShortcut components
Provide more powerful shortcuts handling than what's available with
QML's Shortcut component, notably being able to react differently to key
presses, releases and auto-repeats.
2019-08-22 13:03:26 -04:00

128 lines
3.6 KiB
QML

import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import QtQuick.Window 2.7
import "Base"
import "SidePane"
HRectangle {
id: mainUI
color: theme.ui.background
Component.onCompleted: window.mainUI = mainUI
property alias shortcuts: shortcuts
property alias sidePane: sidePane
property alias pageLoader: pageLoader
property alias pressAnimation: _pressAnimation
SequentialAnimation {
id: _pressAnimation
HNumberAnimation {
target: mainUI; property: "scale"; from: 1.0; to: 0.9
}
HNumberAnimation {
target: mainUI; property: "scale"; from: 0.9; to: 1.0
}
}
property bool accountsPresent:
(modelSources["Account"] || []).length > 0 ||
py.startupAnyAccountsSaved
Shortcuts { id: shortcuts }
HImage {
id: mainUIBackground
visible: Boolean(Qt.resolvedUrl(source))
fillMode: Image.PreserveAspectCrop
source: theme.ui.image
sourceSize.width: Screen.width
sourceSize.height: Screen.height
anchors.fill: parent
asynchronous: false
}
HSplitView {
id: uiSplitView
anchors.fill: parent
onAnyResizingChanged: if (anyResizing) {
sidePane.manuallyResizing = true
} else {
sidePane.manuallyResizing = false
sidePane.manuallyResized = true
sidePane.manualWidth = sidePane.width
}
SidePane {
id: sidePane
// Initial width until user manually resizes
width: implicitWidth
Layout.minimumWidth: reduce ? 0 : theme.sidePane.collapsedWidth
Layout.maximumWidth:
window.width - theme.minimumSupportedWidthPlusSpacing
Behavior on Layout.minimumWidth { HNumberAnimation {} }
}
HLoader {
id: pageLoader
property bool isWide: width > theme.contentIsWideAbove
Component.onCompleted: {
if (! py.startupAnyAccountsSaved) {
pageLoader.showPage("SignIn")
return
}
let page = window.uiState.page
let props = window.uiState.pageProperties
if (page == "Chat/Chat.qml") {
pageLoader.showRoom(props.userId, props.roomId)
} else {
pageLoader._show(page, props)
}
}
function _show(componentUrl, properties={}) {
pageLoader.setSource(componentUrl, properties)
}
function showPage(name, properties={}) {
let path = "Pages/" + name + ".qml"
_show(path, properties)
window.uiState.page = path
window.uiState.pageProperties = properties
window.uiStateChanged()
}
function showRoom(userId, roomId) {
_show("Chat/Chat.qml", {userId, roomId})
window.uiState.page = "Chat/Chat.qml"
window.uiState.pageProperties = {userId, roomId}
window.uiStateChanged()
}
onStatusChanged: if (status == Loader.Ready) {
item.forceActiveFocus()
appearAnimation.start()
}
clip: appearAnimation.running
XAnimator {
id: appearAnimation
target: pageLoader.item
from: -300
to: 0
easing.type: Easing.OutBack
duration: theme.animationDuration * 2
}
}
}
}