Warning, /education/kstars/kstars/kstarslite/qml/main.qml is written in an unsupported language. File is not indexed.

0001 // SPDX-FileCopyrightText: 2016 Artem Fedoskin <afedoskin3@gmail.com>
0002 // SPDX-License-Identifier: GPL-2.0-or-later
0003 
0004 import QtQuick 2.7
0005 
0006 import QtQuick.Controls 2.0
0007 import QtQuick.Controls.Material 2.0
0008 
0009 import QtQuick.Window 2.2 as Window
0010 import QtQuick.Layouts 1.1
0011 
0012 import "modules"
0013 import "modules/helpers"
0014 import "modules/popups"
0015 import "modules/menus"
0016 import "modules/tutorial"
0017 
0018 
0019 import "dialogs"
0020 import "dialogs/menus"
0021 import "dialogs/helpers"
0022 
0023 import "constants" 1.0
0024 import "indi"
0025 
0026 ApplicationWindow {
0027     id: window
0028     objectName: "window"
0029     width: Window.Screen.desktopAvailableWidth
0030     height: Window.Screen.desktopAvailableHeight
0031     visible: true
0032 
0033     //Application properties
0034     property bool isLoaded: false
0035     property bool isPortrait: width < height ? true: false
0036     property bool isSkyMapVisible: stackView.currentItem == initPage
0037     signal loaded();
0038 
0039     onIsLoadedChanged: {
0040         if(isLoaded) {
0041             loaded()
0042             if(KStarsLite.runTutorial) tutorialPopup.open()
0043         }
0044     }
0045 
0046     header: ToolBar {
0047         id: toolBar
0048         Material.foreground: "white"
0049         height: stackView.currentItem != initPage ? backButton.height : 0
0050         visible: stackView.currentItem != initPage
0051 
0052         /*background: Rectangle {
0053             anchors.fill: parent
0054             color: Num.sysPalette.dark
0055         }*/
0056 
0057         Behavior on height {
0058             NumberAnimation {
0059                 duration: 200
0060                 easing.type: Easing.InOutQuad
0061             }
0062         }
0063 
0064         Row {
0065             id: toolRow
0066             spacing: 20
0067             height: parent.height
0068             width: parent.width
0069 
0070             ToolButton {
0071                 id: backButton
0072                 contentItem: Image {
0073                     fillMode: Image.Pad
0074                     horizontalAlignment: Image.AlignHCenter
0075                     verticalAlignment: Image.AlignVCenter
0076                     source: "images/back.png"
0077                 }
0078                 onClicked: {
0079                     if(stackView.depth != 1) stackView.pop()
0080                 }
0081             }
0082 
0083             KSLabel {
0084                 id: titleLabel
0085                 text: stackView.currentItem.title
0086 
0087                 font.pixelSize: 20
0088                 width: parent.width - backButton.width - toolRow.spacing //To allow ellision of the text
0089 
0090                 elide: Label.ElideRight
0091                 wrapMode: Label.Wrap
0092                 maximumLineCount: 1
0093 
0094                 anchors.verticalCenter: parent.verticalCenter
0095             }
0096         }
0097     }
0098 
0099     Splash {
0100         z:1
0101         anchors.fill:parent
0102         onTimeout: {
0103             isLoaded = true
0104         }
0105     }
0106 
0107     StackView {
0108         visible: isLoaded
0109         id: stackView
0110         anchors.fill: parent
0111         initialItem: initPage
0112     }
0113 
0114     Units {
0115         id: units
0116     }
0117 
0118     //Dialogs
0119     FindDialog {
0120         id: findDialog
0121     }
0122 
0123     //Details
0124     DetailsDialog {
0125         id: detailsDialog
0126     }
0127 
0128     DetailsAddLink {
0129         id: detailsAddLink
0130     }
0131 
0132     DetailsLinkMenu {
0133         id: detailsLinkMenu
0134         x: (window.width - width)/2
0135         y: (window.height - height)/2
0136     }
0137 
0138     //Location
0139     LocationDialog {
0140         id: locationDialog
0141     }
0142 
0143     LocationEdit {
0144         id: locationEdit
0145     }
0146 
0147     LocationLoading {
0148         id: locationLoading
0149     }
0150 
0151     AboutDialog {
0152         id: aboutDialog
0153     }
0154 
0155     //Pages
0156     INDIControlPanel {
0157         id: indiControlPanel
0158     }
0159 
0160     Page {
0161         id: initPage
0162         title: xi18n("Sky Map")
0163         padding: 0
0164 
0165         Rectangle {
0166             anchors.fill: parent
0167             color: "black" //Color scheme
0168         }
0169     }
0170 
0171     SkyMapLiteWrapper {
0172         /*The reason SkyMapLite is a not a child of initPage is that it can't handle properly change of
0173           opacity. Each time we go from / to initPage this component is made invisible / visible and
0174         skyMapLiteWrapper is anchored to fill null / parent*/
0175         id: skyMapLite
0176         anchors.fill: parent
0177     }
0178 
0179     //Popups
0180     TimePage {
0181         id: timePage
0182     }
0183 
0184     ColorSchemePopup {
0185         id: colorSchemePopup
0186         x: (window.width - width)/2
0187         y: (window.height - height)/2
0188     }
0189 
0190     ProjectionsPopup {
0191         id: projPopup
0192         x: (window.width - width)/2
0193         y: (window.height - height)/2
0194     }
0195 
0196     FOVPopup {
0197         id: fovPopup
0198         x: (window.width - width)/2
0199         y: (window.height - height)/2
0200     }
0201 
0202     TutorialPopup {
0203         id: tutorialPopup
0204         x: (window.width - width)/2
0205         y: (window.height - height)/2
0206     }
0207 
0208     TutorialExitPopup {
0209         id: tutorialExitPopup
0210         x: (window.width - width)/2
0211         y: (window.height - height)/2
0212     }
0213 
0214     //Menus
0215     ContextMenu {
0216         id: contextMenu
0217         x: (window.width - width)/2
0218         y: (window.height - height)/2
0219     }
0220 
0221     LocationsGeoMenu {
0222         id: locationsGeoMenu
0223         x: (window.width - width)/2
0224         y: (window.height - height)/2
0225     }
0226 
0227     Drawer {
0228         id: globalDrawer
0229         objectName: "globalDrawer"
0230         width: Math.min(window.width, window.height) / 4 * 2
0231         height: window.height
0232         //Disable drawer while loading
0233         dragMargin: isLoaded ? Qt.styleHints.startDragDistance : -Qt.styleHints.startDragDistance
0234         background: Rectangle {
0235             anchors.fill: parent
0236             color: Num.sysPalette.base
0237         }
0238 
0239         onOpened: {
0240             contextDrawer.close()
0241         }
0242 
0243         Image {
0244             id: drawerBanner
0245             source: "images/kstars.png"
0246             fillMode: Image.PreserveAspectFit
0247 
0248             anchors {
0249                 left: parent.left
0250                 top: parent.top
0251                 right: parent.right
0252             }
0253         }
0254 
0255         ListView {
0256             clip: true
0257             id: pagesList
0258             anchors {
0259                 left: parent.left
0260                 top: drawerBanner.bottom
0261                 right: parent.right
0262                 bottom: parent.bottom
0263             }
0264 
0265             delegate: ItemDelegate {
0266                 id: globalDrawerControl
0267                 Rectangle {
0268                     anchors {
0269                         horizontalCenter: parent.horizontalCenter
0270                         bottom: parent.bottom
0271                     }
0272                     width: parent.width - 10
0273                     color: "#E8E8E8"
0274                     height: 1
0275                 }
0276 
0277                 contentItem: KSText {
0278                     rightPadding: globalDrawerControl.spacing
0279                          text: globalDrawerControl.text
0280                          font: globalDrawerControl.font
0281                          elide: Text.ElideRight
0282                          visible: globalDrawerControl.text
0283                          horizontalAlignment: Text.AlignLeft
0284                          verticalAlignment: Text.AlignVCenter
0285                 }
0286 
0287                 width: parent.width
0288                 text: model.objID.title
0289                 onClicked: {
0290                     if(stackView.currentItem != model.objID) {
0291                         if(model.objID != initPage) {
0292                             stackView.replace(null, [initPage, model.objID])
0293                         } else {
0294                             stackView.replace(null, initPage)
0295                         }
0296                         globalDrawer.close()
0297                     }
0298                 }
0299             }
0300 
0301             property ListModel drawerModel : ListModel {
0302                 //Trick to enable storing of object ids
0303                 Component.onCompleted: {
0304                     append({objID: initPage});
0305                     append({objID: indiControlPanel});
0306                     append({objID: findDialog});
0307                     append({objID: locationDialog});
0308                     append({objID: aboutDialog});
0309                 }
0310             }
0311 
0312             model: drawerModel
0313 
0314             ScrollIndicator.vertical: ScrollIndicator { }
0315         }
0316     }
0317 
0318     //Study mode
0319     property bool step1: false
0320     property bool step2: false
0321     property bool step3: false
0322     property bool step4: false
0323     property bool step5: false
0324 
0325     function askExitTutorial() {
0326         tutorialExitPopup.open()
0327     }
0328 
0329     function exitTutorial() {
0330         KStarsLite.runTutorial = false
0331         tutorialPopup.close()
0332         step1 = false
0333         step2 = false
0334         step3 = false
0335         step4 = false
0336         step5 = false
0337     }
0338 
0339     //Step 1 - Global Drawer
0340     TutorialStep1 {
0341 
0342     }
0343 
0344     //Step 2 - Context Drawer
0345     TutorialStep2 {
0346 
0347     }
0348 
0349     //Step 5 - Location
0350     TutorialStep5 {
0351 
0352     }
0353 
0354     Drawer {
0355         id: contextDrawer
0356         objectName: "contextDrawer"
0357         width: Math.min(window.width, window.height) / 4 * 2
0358         height: window.height
0359         //Disable drawer while loading and if SkyMapLite is not visible
0360         dragMargin: isSkyMapVisible && isLoaded ? Qt.styleHints.startDragDistance + 15 : -Qt.styleHints.startDragDistance
0361         edge: Qt.RightEdge
0362         background: Rectangle {
0363             anchors.fill: parent
0364             color: Num.sysPalette.base
0365         }
0366 
0367         onOpened: {
0368             globalDrawer.close()
0369         }
0370 
0371         KSLabel {
0372             id: contextTitle
0373             anchors {
0374                 top: parent.top
0375                 left: parent.left
0376                 margins: 10
0377             }
0378 
0379             font.pointSize: 14
0380             text: stackView.currentItem.title
0381         }
0382 
0383         ListView {
0384             id: contextList
0385             anchors {
0386                 left: parent.left
0387                 top: contextTitle.bottom
0388                 right: parent.right
0389                 bottom: parent.bottom
0390                 topMargin: 15
0391             }
0392             model: drawerModel
0393 
0394             delegate: ItemDelegate {
0395                 id: contextDrawerControl
0396                 Rectangle {
0397                     anchors {
0398                         horizontalCenter: parent.horizontalCenter
0399                         bottom: parent.bottom
0400                     }
0401                     width: parent.width - 10
0402                     color: "#E8E8E8"
0403                     height: 1
0404                 }
0405 
0406                 width: parent.width
0407                 text: model.title
0408                 onClicked: {
0409                     if(model.type == "popup") {
0410                         objID.open()
0411                     }
0412 
0413                     contextDrawer.close()
0414                 }
0415 
0416                 contentItem: KSText {
0417                     rightPadding: contextDrawerControl.spacing
0418                          text: contextDrawerControl.text
0419                          font: contextDrawerControl.font
0420                          elide: Text.ElideRight
0421                          visible: contextDrawerControl.text
0422                          horizontalAlignment: Text.AlignLeft
0423                          verticalAlignment: Text.AlignVCenter
0424                 }
0425             }
0426 
0427             property ListModel drawerModel : ListModel {
0428                 //Trick to enable storing of object ids
0429                 Component.onCompleted: {
0430                     append({title: xi18n("Projection systems"), objID: projPopup, type: "popup"});
0431                     append({title: xi18n("Color Schemes"), objID: colorSchemePopup, type: "popup"});
0432                     append({title: xi18n("FOV Symbols"), objID: fovPopup, type: "popup"});
0433                 }
0434             }
0435 
0436             ScrollIndicator.vertical: ScrollIndicator { }
0437         }
0438 
0439         ColumnLayout {
0440             anchors {
0441                 left: parent.left
0442                 right: parent.right
0443                 bottom: parent.bottom
0444             }
0445 
0446             RowLayout {
0447                 id: magnitudeRow
0448                 anchors {
0449                     leftMargin: 10
0450                     left: parent.left
0451                     rightMargin: 10
0452                     right: parent.right
0453                 }
0454 
0455                 property color magnitudeColor: colorSchemePopup.currentCScheme == "cs_night" ? "white" : "black"
0456 
0457                 Rectangle {
0458                     anchors{
0459                         left: parent.left
0460                         bottom: smallestMag.bottom
0461                     }
0462 
0463                     width: 24
0464                     height: 24
0465                     radius: width * 0.5
0466                     color: magnitudeRow.magnitudeColor
0467                 }
0468 
0469                 Rectangle {
0470                     anchors{
0471                         horizontalCenter: parent.horizontalCenter
0472                         bottom: smallestMag.bottom
0473                     }
0474 
0475                     width: 16
0476                     height: 16
0477                     radius: width * 0.5
0478                     color: magnitudeRow.magnitudeColor
0479                 }
0480 
0481                 Rectangle {
0482                     id: smallestMag
0483 
0484                     anchors {
0485                         right: parent.right
0486                         verticalCenter: parent.bottom
0487                     }
0488 
0489                     width: 8
0490                     height: 8
0491                     radius: width * 0.5
0492                     color: magnitudeRow.magnitudeColor
0493                 }
0494             }
0495 
0496             Slider {
0497                 id: magSlider
0498                 anchors {
0499                     left: parent.left
0500                     right: parent.right
0501                 }
0502 
0503                 from: 1.18778
0504                 to: 5.75954
0505                 value: SkyMapLite.magLim
0506 
0507                 onValueChanged: {
0508                     SkyMapLite.magLim = value
0509                 }
0510             }
0511         }
0512     }
0513 
0514     //Handle back button
0515     Connections {
0516         target: window
0517         onClosing: {
0518             if (Qt.platform.os == "android") {
0519                 if(stackView.depth > 1) {
0520                     close.accepted = false;
0521                     stackView.pop()
0522                 }
0523             }
0524         }
0525     }
0526 }