Files
Artemis/ui/Artemis.qml
2024-05-31 16:36:34 +02:00

454 lines
12 KiB
QML

import QtQuick
import QtQuick.Window
import QtQuick.Controls
import QtQuick.Controls.Material
import QtQuick.Layouts
import QtQuick.Dialogs
Window {
id: window
width: 1100
height: 800
Component.onCompleted: {
x = Screen.width / 2 - width / 2
y = Screen.height / 2 - height / 2
}
title: qsTr("Artemis")
visible: true
modality: Qt.ApplicationModal
flags: Qt.Window
// Windows without upper bar
//flags: Qt.FramelessWindowHint
signal loadSignal(int signalId)
signal showPref()
signal showDBmanager()
signal showCatManager()
signal openSigEditor(string type, var sig_param, bool is_new)
signal showSpaceWeather()
signal checkDbUpdates()
signal startDownloader()
signal openDbDirectory()
signal newDb(string name)
signal exportDb(string path)
signal importDb(string path)
property var loadedList
function populateList(signalsList) {
loadedList = signalsList
textFieldSearch.enabled = true
var currentIndex = listView.currentIndex
refreshList()
// Set the currentIndex back after refreshing the list
if (currentIndex >= 0 && currentIndex < listModel.count) {
listView.currentIndex = currentIndex
}
}
function refreshList() {
listModel.clear()
for (var i = 0; i < loadedList.length; i++) {
var name = loadedList[i].name.toLowerCase()
var search = textFieldSearch.text.toLowerCase()
if (name.includes(search)) {
listModel.append(loadedList[i])
}
}
itemChangedList()
}
function itemChangedList() {
var selected_sig = listModel.get(listView.currentIndex)
if (selected_sig !== undefined) {
loadSignal(listModel.get(listView.currentIndex).SIG_ID)
editSignalMenu.enabled = true
} else {
editSignalMenu.enabled = false
}
}
function clearList() {
listModel.clear()
loadedList = []
textFieldSearch.clear()
textFieldSearch.enabled = false
}
function lockMenu(toggle) {
if (toggle) {
openFileMenu.enabled = false
exportFileMenu.enabled = false
newSignalMenu.enabled = false
editCategoryMenu.enabled = false
} else {
openFileMenu.enabled = true
exportFileMenu.enabled = true
newSignalMenu.enabled = true
editCategoryMenu.enabled = true
}
}
function bottomInfoBar(message, messageType) {
bottomInfoLabel.text = message
switch (messageType) {
case "warning":
bottomInfoLabel.color = Material.color(Material.Red)
break
case "info":
bottomInfoLabel.color = Material.foreground
break
}
}
function openGeneralDialog(messageType, title, message) {
dialogGeneral.messageType = messageType
dialogGeneral.title = title
dialogGeneral.message = message
dialogGeneral.open()
}
function openDialogDownloadDb(messageType, title, message) {
dialogDownloadDb.messageType = messageType
dialogDownloadDb.title = title
dialogDownloadDb.message = message
dialogDownloadDb.open()
}
function openDialogDownloadArtemis(messageType, title, message) {
dialogDownloadArtemis.messageType = messageType
dialogDownloadArtemis.title = title
dialogDownloadArtemis.message = message
dialogDownloadArtemis.open()
}
DialogMessage {
id: dialogDownloadDb
modal: true
standardButtons: Dialog.Cancel | Dialog.Yes
onAccepted: {
startDownloader()
}
}
DialogMessage {
id: dialogDownloadArtemis
modal: true
standardButtons: Dialog.Cancel | Dialog.Yes
onAccepted: {
Qt.openUrlExternally("https://github.com/AresValley/Artemis")
}
}
DialogMessage {
id: dialogGeneral
modal: true
standardButtons: Dialog.Ok
}
Dialog {
id: dialogNewDb
x: (parent.width - width) / 2
y: (parent.height - height) / 2
modal: true
closePolicy: Popup.NoAutoClose
standardButtons: Dialog.Ok | Dialog.Cancel
ColumnLayout {
anchors.fill: parent
Label {
text: qsTr("Enter the name of the new database:")
Layout.bottomMargin: 15
font.pointSize: 12
}
TextField {
id: newDbName
Layout.fillWidth: true
placeholderText: qsTr("Name")
}
}
onAccepted: {
newDb(newDbName.text)
}
}
FileDialog {
id: exportDialog
title: "Please choose a save folder..."
fileMode: FileDialog.SaveFile
nameFilters: ["Archive (.tar)"]
onAccepted: {
exportDb(selectedFile)
}
}
FileDialog {
id: importDialog
title: "Please choose a valid tar.gz archive..."
fileMode: FileDialog.OpenFile
nameFilters: ["Archive (*.tar)"]
onAccepted: {
importDb(selectedFile)
}
}
About {
id: aboutDialog
}
Page {
anchors.fill: parent
leftPadding: 5
rightPadding: 5
bottomPadding: 5
header: MenuBar {
id: topBar
Menu {
title: qsTr("File")
MenuItem {
text: "New Database..."
onClicked: {dialogNewDb.open()}
}
MenuItem {
text: "Load Database..."
onClicked: {showDBmanager()}
}
MenuSeparator {}
MenuItem {
id: importFileMenu
text: "Import Database"
onClicked: {importDialog.open()}
}
MenuItem {
id: exportFileMenu
text: "Export Database"
onClicked: {exportDialog.open()}
enabled: false
}
MenuSeparator {}
MenuItem {
id: editCategoryMenu
text: "Edit Tags"
onClicked: {showCatManager()}
enabled: false
}
MenuSeparator {}
MenuItem {
id: openFileMenu
text: "Open Database Folder"
onClicked: {openDbDirectory()}
enabled: false
}
MenuItem {
text: "Preferences"
onClicked: {showPref()}
}
MenuItem {
text: "Exit"
onClicked: {window.close()}
}
}
Menu {
id: signalMenu
title: qsTr("Signal")
MenuItem {
id: newSignalMenu
enabled: false
text: "New.."
onClicked: {openSigEditor('Signal', [], true)}
}
MenuItem {
id: editSignalMenu
enabled: false
text: "Edit..."
onClicked: {openSigEditor('Signal', [], false)}
}
}
Menu {
title: qsTr("Space Weather")
MenuItem {
text: "Check Report"
onClicked: {
showSpaceWeather()
}
}
}
Menu {
id: aboutMenu
title: qsTr("Help")
MenuItem {
text: "Check for Updates"
onClicked: {checkDbUpdates()}
}
MenuSeparator {}
MenuItem {
text: "Documentation"
onClicked: {Qt.openUrlExternally('https://AresValley.github.io/Artemis')}
}
MenuItem {
text: "Show Release Notes"
onClicked: {Qt.openUrlExternally('https://github.com/AresValley/Artemis/blob/master/CHANGELOG.md')}
}
MenuSeparator {}
MenuItem {
text: "Report Issue"
onClicked: {Qt.openUrlExternally('https://github.com/AresValley/Artemis/issues')}
}
MenuSeparator {}
MenuItem {
text: "About"
onClicked: {
aboutDialog.open()
}
}
}
}
footer: Label {
id: bottomInfoLabel
font.pixelSize: 12
leftPadding: 5
rightPadding: 5
bottomPadding: 5
}
RowLayout {
anchors.fill: parent
spacing: 20
ColumnLayout {
Layout.maximumWidth: 250
TextField {
id: textFieldSearch
enabled: false
Layout.fillWidth: true
Layout.topMargin: 10
placeholderText: qsTr("Search")
onTextChanged: {
refreshList()
}
}
RowLayout {
ListView {
id: listView
Layout.fillWidth: true
Layout.fillHeight: true
highlightMoveDuration: 0
clip: true
focus: true
ScrollBar.vertical: bar
highlight: Rectangle { color: Material.accent; radius: 5 }
onCurrentIndexChanged: { itemChangedList() }
delegate: Item {
id: listDelegate
width: ListView.view.width
height: 20
Label {text: name}
MouseArea {
anchors.fill: parent
onClicked: listView.currentIndex = index
}
}
model: ListModel {
id: listModel
}
}
ScrollBar {
id: bar
Layout.fillHeight: true
active: true
}
}
}
ColumnLayout {
Layout.alignment: Qt.AlignLeft | Qt.AlignTop
Layout.fillHeight: true
Layout.fillWidth: true
TabBar {
id: tabBar
width: parent.width
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
Layout.fillWidth: true
TabButton {
text: qsTr("Signal")
}
TabButton {
text: qsTr("Filter")
}
}
StackLayout {
currentIndex: tabBar.currentIndex
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
Layout.fillHeight: true
Layout.fillWidth: true
Item {
SignalPage {
id: signalPage
}
}
Item {
FilterPage {
id: filterPage
}
}
}
}
}
}
}