1
0
Fork 0
flightgear/src/GUI/qml/AddOns.qml
2020-03-23 10:06:31 +00:00

310 lines
11 KiB
QML

import QtQuick 2.4
import FlightGear.Launcher 1.0
import "."
Item {
id: root
Flickable {
id: flick
height: parent.height
width: parent.width - scrollbar.width
flickableDirection: Flickable.VerticalFlick
contentHeight: contents.childrenRect.height
function showDetails(index)
{
// set URI, start animation
// change state
detailsView.mdx = index;
detailsView.visible = true
contents.visible = false
}
function goBack()
{
detailsView.visible = false
contents.visible = true
}
AddonsDetailsView
{
id: detailsView
anchors.fill: parent
visible: false
onGoBack: {
flick.goBack();
}
}
Column {
id: contents
width: parent.width - (Style.margin * 2)
x: Style.margin
spacing: Style.margin
//////////////////////////////////////////////////////////////////
// catalogs //////////////////////////////////////////////////////
AddOnsHeader {
id: catalogHeader
title: qsTr("Aircraft hangars")
description: qsTr("Aircraft hangars are managed collections of aircraft, which can be " +
"downloaded, installed and updated inside FlightGear.")
}
Rectangle {
width: parent.width
height: catalogsColumn.childrenRect.height + Style.margin * 2
border.width: 1
border.color: Style.frameColor
clip: true
Column {
id: catalogsColumn
width: parent.width
spacing: Style.margin
Repeater {
id: catalogsRepeater
model: _addOns.catalogs
delegate: CatalogDelegate {
width: catalogsColumn.width
}
}
ClickableText {
visible: !_addOns.isOfficialHangarRegistered && !addCatalogPanel.isActive
anchors { left: parent.left; right: parent.right; margins: Style.margin }
text : qsTr("The official FlightGear aircraft hangar is not set up. To add it, click here.");
onClicked: {
_addOns.catalogs.installDefaultCatalog()
}
}
AddCatalogPanel {
id: addCatalogPanel
anchors { left: parent.left; right: parent.right; margins: Style.margin }
}
}
}
//////////////////////////////////////////////////////////////////
Item {
// spacing item
width: parent.width
height: Style.margin * 2
}
AddOnsHeader {
id: aircraftHeader
title: qsTr("Additional aircraft folders")
description: qsTr("To use aircraft you download yourself, FlightGear needs to " +
"know the folder(s) containing the aircraft data.")
showAddButton: true
onAdd: _addOns.addAircraftPath();
}
Rectangle {
width: parent.width
height: aircraftPathsColumn.childrenRect.height + 1
border.width: 1
border.color: Style.frameColor
clip: true
Column {
id: aircraftPathsColumn
width: parent.width - Style.margin * 2
x: Style.margin
Repeater {
id: aircraftPathsRepeater
model: _addOns.aircraftPaths
delegate: PathListDelegate {
width: aircraftPathsColumn.width
deletePromptText: qsTr("Remove the aircraft folder: '%1' from the list? (The folder contents will not be changed)").arg(model.path);
modelCount: _addOns.aircraftPaths.count
onPerformDelete: _addOns.aircraftPaths.removePath(model.index)
onPerformMove: _addOns.aircraftPaths.swapIndices(model.index, newIndex);
}
}
StyledText {
visible: (aircraftPathsRepeater.count == 0)
width: parent.width
text : qsTr("No custom aircraft paths are configured.");
}
}
}
//////////////////////////////////////////////////////////////////
Item {
// spacing item
width: parent.width
height: Style.margin * 2
}
AddOnsHeader {
id: addonModuleHeader
title: qsTr("Add-on Module folders")
description: qsTr("To use Add-on Modules that you download yourself, FlightGear needs to " +
"know the folder(s) containing the Add-on Modules.")
showAddButton: true
onAdd: {
var newPath = _addOns.addAddOnModulePath();
if (newPath !== "") {
_addOns.modulePaths.push(newPath)
}
}
}
Rectangle {
width: parent.width
height: addonModulePathsColumn.childrenRect.height + 1
border.width: 1
border.color: Style.frameColor
clip: true
Column {
id: addonModulePathsColumn
width: parent.width - Style.margin * 2
x: Style.margin
Repeater {
id: addonModulesPathsRepeater
model: _addOns.modules
delegate: AddOnsDelegate {
width: addonModulePathsColumn.width
deletePromptText: qsTr("Remove the add-on module folder: '%1' from the list? (The folder contents will not be changed)").arg(model.path);
modelCount: _addOns.modulePaths.length
onPerformDelete: {
var modifiedPaths = _addOns.modulePaths.slice()
modifiedPaths.splice(model.index, 1);
_addOns.modulePaths = modifiedPaths;
}
onPerformMove: {
var modifiedPaths = _addOns.modulePaths.slice()
modifiedPaths.splice(model.index, 1);
modifiedPaths.splice(newIndex, 0, model.path)
_addOns.modulePaths = modifiedPaths;
}
onShowDetails: {
flick.showDetails(detailIndex)
}
}
}
StyledText {
visible: (addonModulesPathsRepeater.count == 0)
width: parent.width
text : qsTr("No custom add-on module paths are configured.");
}
}
}
//////////////////////////////////////////////////////////////////
Item {
// spacing item
width: parent.width
height: Style.margin * 2
}
AddOnsHeader {
id: sceneryHeader
title: qsTr("Additional scenery folders")
description: qsTr("To use scenery you download yourself, FlightGear needs " +
"to know the folders containing the scenery data. " +
"Adjust the order of the list to control which scenery is used in a region.");
showAddButton: true
onAdd: _addOns.addSceneryPath();
}
Rectangle {
width: parent.width
height: sceneryPathsColumn.childrenRect.height + 1
border.width: 1
border.color: Style.frameColor
clip: true
Column {
id: sceneryPathsColumn
width: parent.width - Style.margin * 2
x: Style.margin
Repeater {
id: sceneryPathsRepeater
model: _addOns.sceneryPaths
delegate: PathListDelegate {
width: sceneryPathsColumn.width
deletePromptText: qsTr("Remove the scenery folder: '%1' from the list? (The folder contents will not be changed)").arg(model.path);
modelCount: _addOns.sceneryPaths.count
onPerformDelete: _addOns.sceneryPaths.removePath(model.index)
onPerformMove: _addOns.sceneryPaths.swapIndices(model.index, newIndex);
}
}
StyledText {
visible: (sceneryPathsRepeater.count == 0)
width: parent.width
text : qsTr("No custom scenery paths are configured.");
}
}
}
Item {
width: parent.width
height: Math.max(installTarballText.implicitHeight, installTarballButton.height)
Button {
id: installTarballButton
text: qsTr("Install add-on scenery")
onClicked: {
var path = _addOns.installCustomScenery();
if (path !== "") {
// insert into scenery paths if not already present
// not found, add it
_addOns.sceneryPaths.appendPath(path);
}
}
}
StyledText {
id: installTarballText
anchors {
left: installTarballButton.right
right: parent.right
leftMargin: Style.margin
}
wrapMode: Text.WordWrap
text: qsTr("If you have downloaded scenery manually from the official FlightGear website, " +
"you can use this button to extract and install it into a suitable folder. " +
"(Scenery downloaded this way should have a file name such as 'w40n020.tar.gz')"
)
}
} // of install-tarbal item
} // of column
}
Scrollbar {
id: scrollbar
anchors.right: parent.right
height: parent.height
flickable: flick
visible: flick.contentHeight > flick.height
}
}