Qt World Summit Conference App
import QtQuick 2.7
import Felgo 4.0
import "pages"
import "common"
import "model"
import "logic"
Rectangle {
id: loaderItem
anchors.fill: parent
color: Theme.backgroundColor
property Navigation navigation: mainLoader.item && mainLoader.item.navigation
property bool openInboxAfterLoading: false
onNavigationChanged: {
if(navigation && openInboxAfterLoading)
mainLoader.item.openInbox()
}
DataModel {
id: dataModel
dispatcher: logic
onInitializedChanged: logic.loadData()
}
Logic {
id: logic
}
ViewHelper {
id: viewHelper
}
Settings {
id: webStorage
Component.onCompleted: {
logic.initializeDataModel(webStorage)
logic.increaseLocalAppStarts()
}
}
Facebook {
id: facebook
appId: AppSettings.facebookAppId
readPermissions: [ "public_profile", "email"]
}
Amplitude {
id: amplitude
apiKey: AppSettings.amplitudeApiKey
onPluginLoaded: {
Qt.callLater(() => { amplitude.logEvent("Start App", {"platform" : (system.isPlatform(System.IOS) ? "iOS" : "Android")}) })
}
}
Component.onCompleted: {
loaderTimer.start()
}
Loader {
id: mainLoader
asynchronous: !system.desktopPlatform
visible: false
onLoaded:{
console.debug("xxx-QtWSLoaderItem: finished loading main qml file, showing it now")
item.parent = loaderItem
loadingFadeOut.start()
}
}
Timer {
id: loaderTimer
interval: 100
onTriggered: mainLoader.source = Qt.resolvedUrl("QtWSMainItem.qml")
}
Rectangle {
id: loading
anchors.fill: parent
color: "#f0f1f2"
z: 2
AppImage {
id: img
source: "../assets/QtWS2019_globe_black.png"
width: dp(150)
fillMode: Image.PreserveAspectFit
anchors.centerIn: parent
}
Column {
anchors.centerIn: parent
anchors.verticalCenterOffset: img.height
spacing: dp(15)
Item {
id: loadSpinner
width: dp(30)
height: dp(30)
anchors.horizontalCenter: parent.horizontalCenter
Rectangle {
width: dp(10)
height: dp(10)
radius: width/2
color: Theme.tintColor
anchors.horizontalCenter: parent.horizontalCenter
}
Rectangle {
width: dp(10)
height: dp(10)
radius: width/2
color: Theme.tintColor
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.bottom
}
RotationAnimator {
target: loadSpinner
running: true
loops: Animation.Infinite
from: 0
to: 360
duration: 2000
}
}
NumberAnimation {
id: loadingFadeOut
target: loading
property: "opacity"
to: 0
duration: 300
}
}
Column {
width: parent.width
spacing: dp(10)
anchors.bottom: parent.bottom
anchors.bottomMargin: dp(15)
AppText {
text: "This conference app is powered by"
anchors.horizontalCenter: parent.horizontalCenter
font.pixelSize: sp(11)
}
Row {
anchors.horizontalCenter: parent.horizontalCenter
spacing: dp(5)
AppImage {
source: "../assets/Qt_logo.png"
height: dp(30)
fillMode: Image.PreserveAspectFit
anchors.verticalCenter: parent.verticalCenter
}
AppText {
text: "+"
anchors.verticalCenter: parent.verticalCenter
}
AppImage {
source: "../assets/felgo_black.png"
height: dp(30)
fillMode: Image.PreserveAspectFit
anchors.verticalCenter: parent.verticalCenter
}
}
}
}
Connections {
target: getApplication()
onIsOnlineChanged: {
if(!dataModel.loaded && isOnline)
loadDataTimer.start()
}
}
Timer {
id: loadDataTimer
interval: 1000
onTriggered: logic.loadData()
}
Item {
id: trackColorBindingFix
property color baseTrackColor
property var baseTrackLightness
Component.onCompleted: updateBaseTrackLightness()
Connections {
target: Theme
onBackgroundColorChanged: trackColorBindingFix.updateBaseTrackLightness()
}
function updateBaseTrackLightness() {
trackColorBindingFix.baseTrackColor = Theme.backgroundColor
trackColorBindingFix.baseTrackLightness = colorToHsl(trackColorBindingFix.baseTrackColor)[2]
}
}
function getTrackColor(fetchedColor) {
var targetColor = fetchedColor
if(targetColor === undefined)
return Theme.secondaryTextColor
targetColor = Qt.tint(targetColor, "transparent")
if(!targetColor) {
return Theme.secondaryTextColor
}
var light = 0.45 + 0.25 * (0.5 - trackColorBindingFix.baseTrackLightness)
return Qt.hsla(targetColor.hslHue, 1, light, 1)
}
function colorToHsl(color) {
var r = color.r /= 255
var g = color.g /= 255
var b = color.b /= 255
var max = Math.max(r, g, b), min = Math.min(r, g, b);
var h, s, l = (max + min) / 2;
if(max == min) {
h = s = 0;
}
else {
var d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch(max) {
case r: h = (g - b) / d + (g < b ? 6 : 0); break;
case g: h = (b - r) / d + 2; break;
case b: h = (r - g) / d + 4; break;
}
h /= 6;
}
return [h, s, l];