mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
QML UI: add button to show the preferences window
Add a button in the main qml file to show the preferences window. This window is linked to the QMLManager class, so any changes made will be saved to the user's settings file. Signed-off-by: Grace Karanja <gracie.karanja89@gmail.com>
This commit is contained in:
parent
956336ae1a
commit
f01ec470e7
1 changed files with 180 additions and 158 deletions
|
@ -2,12 +2,12 @@ import QtQuick 2.3
|
|||
import QtQuick.Controls 1.2
|
||||
import QtQuick.Window 2.2
|
||||
import QtQuick.Dialogs 1.2
|
||||
import QtQuick.Layouts 1.1
|
||||
import org.subsurfacedivelog.mobile 1.0
|
||||
|
||||
ApplicationWindow {
|
||||
title: qsTr("Subsurface")
|
||||
width: 500;
|
||||
height: 700
|
||||
|
||||
FileDialog {
|
||||
id: fileOpen
|
||||
|
@ -23,179 +23,201 @@ ApplicationWindow {
|
|||
id: manager
|
||||
}
|
||||
|
||||
menuBar: MenuBar {
|
||||
Menu {
|
||||
title: qsTr("File")
|
||||
MenuItem {
|
||||
text: qsTr("Open")
|
||||
onTriggered: fileOpen.open()
|
||||
}
|
||||
|
||||
MenuItem {
|
||||
text: qsTr("Exit")
|
||||
onTriggered: Qt.quit();
|
||||
}
|
||||
}
|
||||
Preferences {
|
||||
id: prefsWindow
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: page
|
||||
width: parent.width; height: parent.height
|
||||
ColumnLayout {
|
||||
id: layout
|
||||
anchors.fill: parent
|
||||
spacing: 4
|
||||
|
||||
Component {
|
||||
id: diveDelegate
|
||||
Rectangle {
|
||||
id: topPart
|
||||
height: 35
|
||||
Layout.fillWidth: true
|
||||
Layout.maximumHeight: 35
|
||||
|
||||
Item {
|
||||
id: dive
|
||||
|
||||
property real detailsOpacity : 0
|
||||
|
||||
width: diveListView.width
|
||||
height: 70
|
||||
|
||||
//Bounded rect for the background
|
||||
Rectangle {
|
||||
id: background
|
||||
x: 2; y: 2; width: parent.width - x*2; height: parent.height - y*2;
|
||||
color: "ivory"
|
||||
border.color: "orange"
|
||||
radius: 5
|
||||
}
|
||||
|
||||
//Mouse region: When clicked, the mode changes to details view
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: dive.state = 'Details'
|
||||
}
|
||||
|
||||
//Layout of the page: (mini profile, dive no, date at the tio
|
||||
//And other details at the bottom.
|
||||
Row {
|
||||
id: topLayout
|
||||
x: 10; y: 10; height: 60; width: parent.width
|
||||
spacing: 10
|
||||
|
||||
Column {
|
||||
width: background.width; height: 60
|
||||
spacing: 5
|
||||
|
||||
Text {
|
||||
text: diveNumber + ' (' + date + ')'
|
||||
}
|
||||
Text { text: location; width: details.width }
|
||||
Text { text: '<b>Depth:</b> ' + depth + ' <b>Duration:</b>' + duration; width: details.width }
|
||||
RowLayout {
|
||||
Button {
|
||||
id: prefsButton
|
||||
text: "Preferences"
|
||||
onClicked: {
|
||||
prefsWindow.show()
|
||||
}
|
||||
}
|
||||
|
||||
Button {
|
||||
id: openFile
|
||||
text: "Open File"
|
||||
onClicked: {
|
||||
fileOpen.open();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: page
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
|
||||
Component {
|
||||
id: diveDelegate
|
||||
|
||||
Item {
|
||||
id: details
|
||||
x: 10; width: parent.width - 20
|
||||
anchors { top: topLayout.bottom; topMargin: 10; bottom:parent.bottom; bottomMargin: 10 }
|
||||
opacity: dive.detailsOpacity
|
||||
id: dive
|
||||
|
||||
property real detailsOpacity : 0
|
||||
|
||||
width: diveListView.width
|
||||
height: 70
|
||||
|
||||
//Bounded rect for the background
|
||||
Rectangle {
|
||||
id: background
|
||||
x: 2; y: 2; width: parent.width - x*2; height: parent.height - y*2;
|
||||
color: "ivory"
|
||||
border.color: "orange"
|
||||
radius: 5
|
||||
}
|
||||
|
||||
//Mouse region: When clicked, the mode changes to details view
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: dive.state = 'Details'
|
||||
}
|
||||
|
||||
//Layout of the page: (mini profile, dive no, date at the tio
|
||||
//And other details at the bottom.
|
||||
Row {
|
||||
id: topLayout
|
||||
x: 10; y: 10; height: 60; width: parent.width
|
||||
spacing: 10
|
||||
|
||||
Column {
|
||||
width: background.width; height: 60
|
||||
spacing: 5
|
||||
|
||||
Text {
|
||||
text: diveNumber + ' (' + date + ')'
|
||||
}
|
||||
Text { text: location; width: details.width }
|
||||
Text { text: '<b>Depth:</b> ' + depth + ' <b>Duration:</b>' + duration; width: details.width }
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
id: details
|
||||
x: 10; width: parent.width - 20
|
||||
anchors { top: topLayout.bottom; topMargin: 10; bottom:parent.bottom; bottomMargin: 10 }
|
||||
opacity: dive.detailsOpacity
|
||||
|
||||
Text {
|
||||
id: detailsTitle
|
||||
anchors.top: parent.top
|
||||
text: "Dive Details"
|
||||
font.pointSize: 12; font.bold: true
|
||||
}
|
||||
|
||||
Flickable {
|
||||
id: flick
|
||||
width: parent.width
|
||||
anchors { top: detailsTitle.bottom; bottom: parent.bottom }
|
||||
contentHeight: detailsView.height
|
||||
clip: true
|
||||
Row {
|
||||
Text { text:
|
||||
'<b>Location: </b>' + location +
|
||||
'<br><b>Air temp: </b>' + airtemp + ' <b> Water temp: </b>' + watertemp +
|
||||
'<br><b>Suit: </b>' + suit +
|
||||
'<br><b>Buddy: </b>' + buddy +
|
||||
'<br><b>Dive Master: </b>' + divemaster +
|
||||
'<br/><b>Notes:</b><br/>' + notes; wrapMode: Text.WordWrap; width: details.width }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TextButton {
|
||||
y: 10
|
||||
anchors { right: background.right; rightMargin: 10 }
|
||||
opacity: dive.detailsOpacity
|
||||
text: "Close"
|
||||
|
||||
onClicked: dive.state = '';
|
||||
}
|
||||
|
||||
states: State {
|
||||
name: "Details"
|
||||
|
||||
PropertyChanges {
|
||||
target: background
|
||||
color: "white"
|
||||
}
|
||||
|
||||
PropertyChanges {
|
||||
target: dive
|
||||
detailsOpacity: 1; x:0 //Make details visible
|
||||
height: diveListView.height //Fill entire list area with the details
|
||||
}
|
||||
|
||||
//Move the list so that this item is at the top
|
||||
PropertyChanges {
|
||||
target: dive.ListView.view
|
||||
explicit: true
|
||||
contentY: dive.y
|
||||
}
|
||||
|
||||
//Disable flicking while we are in detailed view
|
||||
PropertyChanges {
|
||||
target: dive.ListView.view
|
||||
interactive: false
|
||||
}
|
||||
}
|
||||
|
||||
transitions: Transition {
|
||||
//make the state changes smooth
|
||||
ParallelAnimation {
|
||||
ColorAnimation {
|
||||
property: "color"
|
||||
duration: 500
|
||||
}
|
||||
NumberAnimation {
|
||||
duration: 300
|
||||
properties: "detailsOpacity,x,contentY,height,width"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Component {
|
||||
id: tripHeading
|
||||
Rectangle {
|
||||
width: page.width
|
||||
height: childrenRect.height
|
||||
color: "lightsteelblue"
|
||||
|
||||
Text {
|
||||
id: detailsTitle
|
||||
anchors.top: parent.top
|
||||
text: "Dive Details"
|
||||
font.pointSize: 12; font.bold: true
|
||||
}
|
||||
|
||||
Flickable {
|
||||
id: flick
|
||||
width: parent.width
|
||||
anchors { top: detailsTitle.bottom; bottom: parent.bottom }
|
||||
contentHeight: detailsView.height
|
||||
clip: true
|
||||
Row {
|
||||
Text { text:
|
||||
'<b>Location: </b>' + location +
|
||||
'<br><b>Air temp: </b>' + airtemp + ' <b> Water temp: </b>' + watertemp +
|
||||
'<br><b>Suit: </b>' + suit +
|
||||
'<br><b>Buddy: </b>' + buddy +
|
||||
'<br><b>Dive Master: </b>' + divemaster +
|
||||
'<br/><b>Notes:</b><br/>' + notes; wrapMode: Text.WordWrap; width: details.width }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TextButton {
|
||||
y: 10
|
||||
anchors { right: background.right; rightMargin: 10 }
|
||||
opacity: dive.detailsOpacity
|
||||
text: "Close"
|
||||
|
||||
onClicked: dive.state = '';
|
||||
}
|
||||
|
||||
states: State {
|
||||
name: "Details"
|
||||
|
||||
PropertyChanges {
|
||||
target: background
|
||||
color: "white"
|
||||
}
|
||||
|
||||
PropertyChanges {
|
||||
target: dive
|
||||
detailsOpacity: 1; x:0 //Make details visible
|
||||
height: diveListView.height //Fill entire list area with the details
|
||||
}
|
||||
|
||||
//Move the list so that this item is at the top
|
||||
PropertyChanges {
|
||||
target: dive.ListView.view
|
||||
explicit: true
|
||||
contentY: dive.y
|
||||
}
|
||||
|
||||
//Disable flicking while we are in detailed view
|
||||
PropertyChanges {
|
||||
target: dive.ListView.view
|
||||
interactive: false
|
||||
}
|
||||
}
|
||||
|
||||
transitions: Transition {
|
||||
//make the state changes smooth
|
||||
ParallelAnimation {
|
||||
ColorAnimation {
|
||||
property: "color"
|
||||
duration: 500
|
||||
}
|
||||
NumberAnimation {
|
||||
duration: 300
|
||||
properties: "detailsOpacity,x,contentY,height,width"
|
||||
}
|
||||
text: section
|
||||
font.bold: true
|
||||
font.pointSize: 16
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Component {
|
||||
id: tripHeading
|
||||
Rectangle {
|
||||
width: page.width
|
||||
height: childrenRect.height
|
||||
color: "lightsteelblue"
|
||||
ListView {
|
||||
id: diveListView
|
||||
anchors.fill: parent
|
||||
model: diveModel
|
||||
delegate: diveDelegate
|
||||
focus: true
|
||||
|
||||
Text {
|
||||
text: section
|
||||
font.bold: true
|
||||
font.pointSize: 16
|
||||
}
|
||||
section.property: "trip"
|
||||
section.criteria: ViewSection.FullString
|
||||
section.delegate: tripHeading
|
||||
}
|
||||
}
|
||||
|
||||
ListView {
|
||||
id: diveListView
|
||||
anchors.fill: parent
|
||||
model: diveModel
|
||||
delegate: diveDelegate
|
||||
focus: true
|
||||
|
||||
section.property: "trip"
|
||||
section.criteria: ViewSection.FullString
|
||||
section.delegate: tripHeading
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue