qml: ui
This commit is contained in:
@@ -24,7 +24,6 @@ Pane {
|
|||||||
icon.color: 'transparent'
|
icon.color: 'transparent'
|
||||||
action: Action {
|
action: Action {
|
||||||
text: qsTr('Spend from')
|
text: qsTr('Spend from')
|
||||||
//onTriggered:
|
|
||||||
icon.source: '../../icons/tab_send.png'
|
icon.source: '../../icons/tab_send.png'
|
||||||
enabled: false
|
enabled: false
|
||||||
}
|
}
|
||||||
@@ -45,6 +44,14 @@ Pane {
|
|||||||
enabled: false
|
enabled: false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
MenuItem {
|
||||||
|
icon.color: 'transparent'
|
||||||
|
action: Action {
|
||||||
|
text: addressdetails.isFrozen ? qsTr('Unfreeze') : qsTr('Freeze')
|
||||||
|
onTriggered: addressdetails.freeze(!addressdetails.isFrozen)
|
||||||
|
icon.source: '../../icons/seal.png'
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Flickable {
|
Flickable {
|
||||||
@@ -245,15 +252,6 @@ Pane {
|
|||||||
Label {
|
Label {
|
||||||
text: addressdetails.isFrozen ? qsTr('Frozen') : qsTr('Not frozen')
|
text: addressdetails.isFrozen ? qsTr('Frozen') : qsTr('Not frozen')
|
||||||
}
|
}
|
||||||
|
|
||||||
ColumnLayout {
|
|
||||||
Layout.columnSpan: 2
|
|
||||||
|
|
||||||
Button {
|
|
||||||
text: addressdetails.isFrozen ? qsTr('Unfreeze') : qsTr('Freeze')
|
|
||||||
onClicked: addressdetails.freeze(!addressdetails.isFrozen)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,9 @@ ElDialog {
|
|||||||
|
|
||||||
width: parent.width
|
width: parent.width
|
||||||
height: parent.height
|
height: parent.height
|
||||||
|
padding: 0
|
||||||
|
|
||||||
|
standardButtons: Dialog.Cancel
|
||||||
|
|
||||||
modal: true
|
modal: true
|
||||||
parent: Overlay.overlay
|
parent: Overlay.overlay
|
||||||
@@ -42,220 +45,201 @@ ElDialog {
|
|||||||
: ''
|
: ''
|
||||||
}
|
}
|
||||||
|
|
||||||
GridLayout {
|
ColumnLayout {
|
||||||
id: layout
|
|
||||||
width: parent.width
|
width: parent.width
|
||||||
height: parent.height
|
height: parent.height
|
||||||
columns: 2
|
spacing: 0
|
||||||
|
|
||||||
Rectangle {
|
GridLayout {
|
||||||
height: 1
|
width: parent.width
|
||||||
Layout.fillWidth: true
|
columns: 2
|
||||||
Layout.columnSpan: 2
|
Layout.leftMargin: constants.paddingLarge
|
||||||
color: Material.accentColor
|
Layout.rightMargin: constants.paddingLarge
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
id: amountLabel
|
|
||||||
text: qsTr('Amount to send')
|
|
||||||
}
|
|
||||||
|
|
||||||
RowLayout {
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Label {
|
|
||||||
id: btcValue
|
|
||||||
font.bold: true
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
Label {
|
||||||
text: Config.baseUnit
|
id: amountLabel
|
||||||
|
text: qsTr('Amount to send')
|
||||||
color: Material.accentColor
|
color: Material.accentColor
|
||||||
}
|
}
|
||||||
|
|
||||||
Label {
|
RowLayout {
|
||||||
id: fiatValue
|
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
font.pixelSize: constants.fontSizeMedium
|
Label {
|
||||||
}
|
id: btcValue
|
||||||
|
font.bold: true
|
||||||
|
}
|
||||||
|
|
||||||
Component.onCompleted: updateAmountText()
|
Label {
|
||||||
Connections {
|
text: Config.baseUnit
|
||||||
target: finalizer
|
color: Material.accentColor
|
||||||
function onEffectiveAmountChanged() {
|
}
|
||||||
updateAmountText()
|
|
||||||
|
Label {
|
||||||
|
id: fiatValue
|
||||||
|
Layout.fillWidth: true
|
||||||
|
font.pixelSize: constants.fontSizeMedium
|
||||||
|
}
|
||||||
|
|
||||||
|
Component.onCompleted: updateAmountText()
|
||||||
|
Connections {
|
||||||
|
target: finalizer
|
||||||
|
function onEffectiveAmountChanged() {
|
||||||
|
updateAmountText()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
text: qsTr('Mining fee')
|
|
||||||
}
|
|
||||||
|
|
||||||
RowLayout {
|
|
||||||
Label {
|
|
||||||
id: fee
|
|
||||||
text: Config.formatSats(finalizer.fee)
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
Label {
|
||||||
text: Config.baseUnit
|
text: qsTr('Mining fee')
|
||||||
color: Material.accentColor
|
color: Material.accentColor
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
RowLayout {
|
||||||
text: qsTr('Fee rate')
|
Label {
|
||||||
}
|
id: fee
|
||||||
|
text: Config.formatSats(finalizer.fee)
|
||||||
|
}
|
||||||
|
|
||||||
RowLayout {
|
Label {
|
||||||
Label {
|
text: Config.baseUnit
|
||||||
id: feeRate
|
color: Material.accentColor
|
||||||
text: finalizer.feeRate
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
text: 'sat/vB'
|
|
||||||
color: Material.accentColor
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
text: qsTr('Target')
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
id: targetdesc
|
|
||||||
text: finalizer.target
|
|
||||||
}
|
|
||||||
|
|
||||||
Slider {
|
|
||||||
id: feeslider
|
|
||||||
snapMode: Slider.SnapOnRelease
|
|
||||||
stepSize: 1
|
|
||||||
from: 0
|
|
||||||
to: finalizer.sliderSteps
|
|
||||||
onValueChanged: {
|
|
||||||
if (activeFocus)
|
|
||||||
finalizer.sliderPos = value
|
|
||||||
}
|
|
||||||
Component.onCompleted: {
|
|
||||||
value = finalizer.sliderPos
|
|
||||||
}
|
|
||||||
Connections {
|
|
||||||
target: finalizer
|
|
||||||
function onSliderPosChanged() {
|
|
||||||
feeslider.value = finalizer.sliderPos
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
ComboBox {
|
Label {
|
||||||
id: target
|
text: qsTr('Fee rate')
|
||||||
textRole: 'text'
|
color: Material.accentColor
|
||||||
valueRole: 'value'
|
|
||||||
model: [
|
|
||||||
{ text: qsTr('ETA'), value: 1 },
|
|
||||||
{ text: qsTr('Mempool'), value: 2 },
|
|
||||||
{ text: qsTr('Static'), value: 0 }
|
|
||||||
]
|
|
||||||
onCurrentValueChanged: {
|
|
||||||
if (activeFocus)
|
|
||||||
finalizer.method = currentValue
|
|
||||||
}
|
}
|
||||||
Component.onCompleted: {
|
|
||||||
currentIndex = indexOfValue(finalizer.method)
|
RowLayout {
|
||||||
|
Label {
|
||||||
|
id: feeRate
|
||||||
|
text: finalizer.feeRate
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
text: 'sat/vB'
|
||||||
|
color: Material.accentColor
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
InfoTextArea {
|
Label {
|
||||||
Layout.columnSpan: 2
|
text: qsTr('Target')
|
||||||
visible: finalizer.warning != ''
|
color: Material.accentColor
|
||||||
text: finalizer.warning
|
}
|
||||||
iconStyle: InfoTextArea.IconStyle.Warn
|
|
||||||
}
|
|
||||||
|
|
||||||
CheckBox {
|
Label {
|
||||||
id: final_cb
|
id: targetdesc
|
||||||
text: qsTr('Replace-by-Fee')
|
text: finalizer.target
|
||||||
Layout.columnSpan: 2
|
}
|
||||||
checked: finalizer.rbf
|
|
||||||
visible: finalizer.canRbf
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
Slider {
|
||||||
height: 1
|
id: feeslider
|
||||||
Layout.fillWidth: true
|
leftPadding: constants.paddingMedium
|
||||||
Layout.columnSpan: 2
|
snapMode: Slider.SnapOnRelease
|
||||||
color: Material.accentColor
|
stepSize: 1
|
||||||
}
|
from: 0
|
||||||
|
to: finalizer.sliderSteps
|
||||||
|
onValueChanged: {
|
||||||
|
if (activeFocus)
|
||||||
|
finalizer.sliderPos = value
|
||||||
|
}
|
||||||
|
Component.onCompleted: {
|
||||||
|
value = finalizer.sliderPos
|
||||||
|
}
|
||||||
|
Connections {
|
||||||
|
target: finalizer
|
||||||
|
function onSliderPosChanged() {
|
||||||
|
feeslider.value = finalizer.sliderPos
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Label {
|
ComboBox {
|
||||||
text: qsTr('Outputs')
|
id: target
|
||||||
Layout.columnSpan: 2
|
textRole: 'text'
|
||||||
}
|
valueRole: 'value'
|
||||||
|
model: [
|
||||||
|
{ text: qsTr('ETA'), value: 1 },
|
||||||
|
{ text: qsTr('Mempool'), value: 2 },
|
||||||
|
{ text: qsTr('Static'), value: 0 }
|
||||||
|
]
|
||||||
|
onCurrentValueChanged: {
|
||||||
|
if (activeFocus)
|
||||||
|
finalizer.method = currentValue
|
||||||
|
}
|
||||||
|
Component.onCompleted: {
|
||||||
|
currentIndex = indexOfValue(finalizer.method)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Repeater {
|
InfoTextArea {
|
||||||
model: finalizer.outputs
|
|
||||||
delegate: TextHighlightPane {
|
|
||||||
Layout.columnSpan: 2
|
Layout.columnSpan: 2
|
||||||
Layout.fillWidth: true
|
visible: finalizer.warning != ''
|
||||||
padding: 0
|
text: finalizer.warning
|
||||||
leftPadding: constants.paddingSmall
|
iconStyle: InfoTextArea.IconStyle.Warn
|
||||||
RowLayout {
|
}
|
||||||
width: parent.width
|
|
||||||
Label {
|
CheckBox {
|
||||||
text: modelData.address
|
id: final_cb
|
||||||
Layout.fillWidth: true
|
text: qsTr('Replace-by-Fee')
|
||||||
wrapMode: Text.Wrap
|
Layout.columnSpan: 2
|
||||||
font.pixelSize: constants.fontSizeLarge
|
checked: finalizer.rbf
|
||||||
font.family: FixedFont
|
visible: finalizer.canRbf
|
||||||
color: modelData.is_mine ? constants.colorMine : Material.foreground
|
}
|
||||||
}
|
|
||||||
Label {
|
Label {
|
||||||
text: Config.formatSats(modelData.value_sats)
|
text: qsTr('Outputs')
|
||||||
font.pixelSize: constants.fontSizeMedium
|
Layout.columnSpan: 2
|
||||||
font.family: FixedFont
|
color: Material.accentColor
|
||||||
}
|
}
|
||||||
Label {
|
|
||||||
text: Config.baseUnit
|
Repeater {
|
||||||
font.pixelSize: constants.fontSizeMedium
|
model: finalizer.outputs
|
||||||
color: Material.accentColor
|
delegate: TextHighlightPane {
|
||||||
|
Layout.columnSpan: 2
|
||||||
|
Layout.fillWidth: true
|
||||||
|
padding: 0
|
||||||
|
leftPadding: constants.paddingSmall
|
||||||
|
RowLayout {
|
||||||
|
width: parent.width
|
||||||
|
Label {
|
||||||
|
text: modelData.address
|
||||||
|
Layout.fillWidth: true
|
||||||
|
wrapMode: Text.Wrap
|
||||||
|
font.pixelSize: constants.fontSizeLarge
|
||||||
|
font.family: FixedFont
|
||||||
|
color: modelData.is_mine ? constants.colorMine : Material.foreground
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
text: Config.formatSats(modelData.value_sats)
|
||||||
|
font.pixelSize: constants.fontSizeMedium
|
||||||
|
font.family: FixedFont
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
text: Config.baseUnit
|
||||||
|
font.pixelSize: constants.fontSizeMedium
|
||||||
|
color: Material.accentColor
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
height: 1
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.columnSpan: 2
|
|
||||||
color: Material.accentColor
|
|
||||||
}
|
|
||||||
|
|
||||||
Item { Layout.fillHeight: true; Layout.preferredWidth: 1 }
|
Item { Layout.fillHeight: true; Layout.preferredWidth: 1 }
|
||||||
|
|
||||||
RowLayout {
|
FlatButton {
|
||||||
Layout.columnSpan: 2
|
id: sendButton
|
||||||
Layout.alignment: Qt.AlignHCenter
|
Layout.fillWidth: true
|
||||||
|
text: Daemon.currentWallet.isWatchOnly ? qsTr('Finalize') : qsTr('Pay')
|
||||||
Button {
|
icon.source: '../../icons/confirmed.png'
|
||||||
text: qsTr('Cancel')
|
enabled: finalizer.valid
|
||||||
onClicked: {
|
onClicked: {
|
||||||
txcancelled()
|
txaccepted()
|
||||||
dialog.close()
|
dialog.close()
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
id: sendButton
|
|
||||||
text: Daemon.currentWallet.isWatchOnly ? qsTr('Finalize') : qsTr('Pay')
|
|
||||||
enabled: finalizer.valid
|
|
||||||
onClicked: {
|
|
||||||
txaccepted()
|
|
||||||
dialog.close()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onClosed: txcancelled()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,20 +26,6 @@ ElDialog {
|
|||||||
color: "#aa000000"
|
color: "#aa000000"
|
||||||
}
|
}
|
||||||
|
|
||||||
// header: RowLayout {
|
|
||||||
// width: dialog.width
|
|
||||||
// Label {
|
|
||||||
// Layout.fillWidth: true
|
|
||||||
// text: dialog.title
|
|
||||||
// visible: dialog.title
|
|
||||||
// elide: Label.ElideRight
|
|
||||||
// padding: constants.paddingXLarge
|
|
||||||
// bottomPadding: 0
|
|
||||||
// font.bold: true
|
|
||||||
// font.pixelSize: constants.fontSizeMedium
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
Flickable {
|
Flickable {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
contentHeight: rootLayout.height
|
contentHeight: rootLayout.height
|
||||||
@@ -51,12 +37,6 @@ ElDialog {
|
|||||||
width: parent.width
|
width: parent.width
|
||||||
spacing: constants.paddingMedium
|
spacing: constants.paddingMedium
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
height: 1
|
|
||||||
Layout.fillWidth: true
|
|
||||||
color: Material.accentColor
|
|
||||||
}
|
|
||||||
|
|
||||||
QRImage {
|
QRImage {
|
||||||
id: qr
|
id: qr
|
||||||
render: dialog.enter ? false : true
|
render: dialog.enter ? false : true
|
||||||
@@ -66,12 +46,6 @@ ElDialog {
|
|||||||
Layout.bottomMargin: constants.paddingSmall
|
Layout.bottomMargin: constants.paddingSmall
|
||||||
}
|
}
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
height: 1
|
|
||||||
Layout.fillWidth: true
|
|
||||||
color: Material.accentColor
|
|
||||||
}
|
|
||||||
|
|
||||||
TextHighlightPane {
|
TextHighlightPane {
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
Label {
|
Label {
|
||||||
@@ -92,15 +66,23 @@ ElDialog {
|
|||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
height: 1
|
||||||
|
Layout.preferredWidth: qr.width
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
color: Material.accentColor
|
||||||
|
}
|
||||||
|
|
||||||
RowLayout {
|
RowLayout {
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
Layout.alignment: Qt.AlignHCenter
|
Layout.alignment: Qt.AlignHCenter
|
||||||
Button {
|
|
||||||
|
FlatButton {
|
||||||
text: qsTr('Copy')
|
text: qsTr('Copy')
|
||||||
icon.source: '../../icons/copy_bw.png'
|
icon.source: '../../icons/copy_bw.png'
|
||||||
onClicked: AppController.textToClipboard(dialog.text)
|
onClicked: AppController.textToClipboard(dialog.text)
|
||||||
}
|
}
|
||||||
Button {
|
FlatButton {
|
||||||
text: qsTr('Share')
|
text: qsTr('Share')
|
||||||
icon.source: '../../icons/share.png'
|
icon.source: '../../icons/share.png'
|
||||||
onClicked: {
|
onClicked: {
|
||||||
|
|||||||
@@ -18,291 +18,297 @@ ElDialog {
|
|||||||
title: qsTr('Invoice')
|
title: qsTr('Invoice')
|
||||||
standardButtons: invoice_key != '' ? Dialog.Close : Dialog.Cancel
|
standardButtons: invoice_key != '' ? Dialog.Close : Dialog.Cancel
|
||||||
|
|
||||||
|
padding: 0
|
||||||
|
|
||||||
modal: true
|
modal: true
|
||||||
parent: Overlay.overlay
|
parent: Overlay.overlay
|
||||||
Overlay.modal: Rectangle {
|
Overlay.modal: Rectangle {
|
||||||
color: "#aa000000"
|
color: "#aa000000"
|
||||||
}
|
}
|
||||||
|
|
||||||
GridLayout {
|
ColumnLayout {
|
||||||
id: layout
|
|
||||||
width: parent.width
|
width: parent.width
|
||||||
height: parent.height
|
height: parent.height
|
||||||
columns: 2
|
spacing: 0
|
||||||
|
|
||||||
Label {
|
GridLayout {
|
||||||
text: qsTr('Type')
|
id: layout
|
||||||
color: Material.accentColor
|
width: parent.width
|
||||||
}
|
Layout.leftMargin: constants.paddingLarge
|
||||||
|
Layout.rightMargin: constants.paddingLarge
|
||||||
RowLayout {
|
columns: 2
|
||||||
Layout.fillWidth: true
|
|
||||||
Image {
|
|
||||||
Layout.preferredWidth: constants.iconSizeSmall
|
|
||||||
Layout.preferredHeight: constants.iconSizeSmall
|
|
||||||
source: invoice.invoiceType == Invoice.LightningInvoice
|
|
||||||
? "../../icons/lightning.png"
|
|
||||||
: "../../icons/bitcoin.png"
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
Label {
|
||||||
text: invoice.invoiceType == Invoice.OnchainInvoice
|
text: qsTr('Type')
|
||||||
? qsTr('On chain')
|
color: Material.accentColor
|
||||||
: invoice.invoiceType == Invoice.LightningInvoice
|
|
||||||
? qsTr('Lightning')
|
|
||||||
: ''
|
|
||||||
Layout.fillWidth: true
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
text: qsTr('Status')
|
|
||||||
color: Material.accentColor
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
text: invoice.status_str
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
visible: invoice.invoiceType == Invoice.OnchainInvoice
|
|
||||||
Layout.columnSpan: 2
|
|
||||||
text: qsTr('Address')
|
|
||||||
color: Material.accentColor
|
|
||||||
}
|
|
||||||
|
|
||||||
TextHighlightPane {
|
|
||||||
visible: invoice.invoiceType == Invoice.OnchainInvoice
|
|
||||||
|
|
||||||
Layout.columnSpan: 2
|
|
||||||
Layout.fillWidth: true
|
|
||||||
|
|
||||||
padding: 0
|
|
||||||
leftPadding: constants.paddingMedium
|
|
||||||
|
|
||||||
Label {
|
|
||||||
width: parent.width
|
|
||||||
text: invoice.address
|
|
||||||
font.family: FixedFont
|
|
||||||
wrapMode: Text.Wrap
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
visible: invoice.invoiceType == Invoice.LightningInvoice
|
|
||||||
text: qsTr('Remote Pubkey')
|
|
||||||
color: Material.accentColor
|
|
||||||
}
|
|
||||||
|
|
||||||
TextHighlightPane {
|
|
||||||
visible: invoice.invoiceType == Invoice.LightningInvoice
|
|
||||||
|
|
||||||
Layout.columnSpan: 2
|
|
||||||
Layout.fillWidth: true
|
|
||||||
|
|
||||||
padding: 0
|
|
||||||
leftPadding: constants.paddingMedium
|
|
||||||
|
|
||||||
Label {
|
|
||||||
width: parent.width
|
|
||||||
text: invoice.lnprops ? invoice.lnprops.pubkey : ''
|
|
||||||
font.family: FixedFont
|
|
||||||
wrapMode: Text.Wrap
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
text: qsTr('Description')
|
|
||||||
visible: invoice.message
|
|
||||||
Layout.columnSpan: 2
|
|
||||||
color: Material.accentColor
|
|
||||||
}
|
|
||||||
|
|
||||||
TextHighlightPane {
|
|
||||||
visible: invoice.message
|
|
||||||
|
|
||||||
Layout.columnSpan: 2
|
|
||||||
Layout.preferredWidth: parent.width
|
|
||||||
Layout.alignment: Qt.AlignHCenter
|
|
||||||
|
|
||||||
padding: 0
|
|
||||||
leftPadding: constants.paddingMedium
|
|
||||||
|
|
||||||
Label {
|
|
||||||
text: invoice.message
|
|
||||||
width: parent.width
|
|
||||||
font.pixelSize: constants.fontSizeXLarge
|
|
||||||
wrapMode: Text.Wrap
|
|
||||||
elide: Text.ElideRight
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
text: qsTr('Amount to send')
|
|
||||||
color: Material.accentColor
|
|
||||||
Layout.columnSpan: 2
|
|
||||||
}
|
|
||||||
|
|
||||||
TextHighlightPane {
|
|
||||||
id: amountContainer
|
|
||||||
|
|
||||||
Layout.columnSpan: 2
|
|
||||||
Layout.preferredWidth: parent.width //* 0.75
|
|
||||||
Layout.alignment: Qt.AlignHCenter
|
|
||||||
|
|
||||||
padding: 0
|
|
||||||
leftPadding: constants.paddingXXLarge
|
|
||||||
|
|
||||||
property bool editmode: false
|
|
||||||
|
|
||||||
RowLayout {
|
RowLayout {
|
||||||
id: amountLayout
|
Layout.fillWidth: true
|
||||||
width: parent.width
|
Image {
|
||||||
|
Layout.preferredWidth: constants.iconSizeSmall
|
||||||
GridLayout {
|
Layout.preferredHeight: constants.iconSizeSmall
|
||||||
visible: !amountContainer.editmode
|
source: invoice.invoiceType == Invoice.LightningInvoice
|
||||||
columns: 2
|
? "../../icons/lightning.png"
|
||||||
|
: "../../icons/bitcoin.png"
|
||||||
Label {
|
|
||||||
font.pixelSize: constants.fontSizeXLarge
|
|
||||||
font.family: FixedFont
|
|
||||||
font.bold: true
|
|
||||||
text: Config.formatSats(invoice.amount, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
Layout.fillWidth: true
|
|
||||||
text: Config.baseUnit
|
|
||||||
color: Material.accentColor
|
|
||||||
font.pixelSize: constants.fontSizeXLarge
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
id: fiatValue
|
|
||||||
visible: Daemon.fx.enabled
|
|
||||||
text: Daemon.fx.fiatValue(invoice.amount, false)
|
|
||||||
font.pixelSize: constants.fontSizeMedium
|
|
||||||
color: constants.mutedForeground
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
visible: Daemon.fx.enabled
|
|
||||||
Layout.fillWidth: true
|
|
||||||
text: Daemon.fx.fiatCurrency
|
|
||||||
font.pixelSize: constants.fontSizeMedium
|
|
||||||
color: constants.mutedForeground
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ToolButton {
|
Label {
|
||||||
visible: !amountContainer.editmode
|
text: invoice.invoiceType == Invoice.OnchainInvoice
|
||||||
icon.source: '../../icons/pen.png'
|
? qsTr('On chain')
|
||||||
icon.color: 'transparent'
|
: invoice.invoiceType == Invoice.LightningInvoice
|
||||||
onClicked: {
|
? qsTr('Lightning')
|
||||||
amountBtc.text = invoice.amount.satsInt == 0 ? '' : Config.formatSats(invoice.amount)
|
: ''
|
||||||
amountContainer.editmode = true
|
|
||||||
amountBtc.focus = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
GridLayout {
|
|
||||||
visible: amountContainer.editmode
|
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
columns: 2
|
}
|
||||||
BtcField {
|
}
|
||||||
id: amountBtc
|
|
||||||
fiatfield: amountFiat
|
Label {
|
||||||
|
text: qsTr('Status')
|
||||||
|
color: Material.accentColor
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
text: invoice.status_str
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
visible: invoice.invoiceType == Invoice.OnchainInvoice
|
||||||
|
Layout.columnSpan: 2
|
||||||
|
text: qsTr('Address')
|
||||||
|
color: Material.accentColor
|
||||||
|
}
|
||||||
|
|
||||||
|
TextHighlightPane {
|
||||||
|
visible: invoice.invoiceType == Invoice.OnchainInvoice
|
||||||
|
|
||||||
|
Layout.columnSpan: 2
|
||||||
|
Layout.fillWidth: true
|
||||||
|
|
||||||
|
padding: 0
|
||||||
|
leftPadding: constants.paddingMedium
|
||||||
|
|
||||||
|
Label {
|
||||||
|
width: parent.width
|
||||||
|
text: invoice.address
|
||||||
|
font.family: FixedFont
|
||||||
|
wrapMode: Text.Wrap
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
visible: invoice.invoiceType == Invoice.LightningInvoice
|
||||||
|
text: qsTr('Remote Pubkey')
|
||||||
|
color: Material.accentColor
|
||||||
|
}
|
||||||
|
|
||||||
|
TextHighlightPane {
|
||||||
|
visible: invoice.invoiceType == Invoice.LightningInvoice
|
||||||
|
|
||||||
|
Layout.columnSpan: 2
|
||||||
|
Layout.fillWidth: true
|
||||||
|
|
||||||
|
padding: 0
|
||||||
|
leftPadding: constants.paddingMedium
|
||||||
|
|
||||||
|
Label {
|
||||||
|
width: parent.width
|
||||||
|
text: invoice.lnprops ? invoice.lnprops.pubkey : ''
|
||||||
|
font.family: FixedFont
|
||||||
|
wrapMode: Text.Wrap
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
text: qsTr('Description')
|
||||||
|
visible: invoice.message
|
||||||
|
Layout.columnSpan: 2
|
||||||
|
color: Material.accentColor
|
||||||
|
}
|
||||||
|
|
||||||
|
TextHighlightPane {
|
||||||
|
visible: invoice.message
|
||||||
|
|
||||||
|
Layout.columnSpan: 2
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
|
||||||
|
padding: 0
|
||||||
|
leftPadding: constants.paddingMedium
|
||||||
|
|
||||||
|
Label {
|
||||||
|
text: invoice.message
|
||||||
|
width: parent.width
|
||||||
|
font.pixelSize: constants.fontSizeXLarge
|
||||||
|
wrapMode: Text.Wrap
|
||||||
|
elide: Text.ElideRight
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
text: qsTr('Amount to send')
|
||||||
|
color: Material.accentColor
|
||||||
|
Layout.columnSpan: 2
|
||||||
|
}
|
||||||
|
|
||||||
|
TextHighlightPane {
|
||||||
|
id: amountContainer
|
||||||
|
|
||||||
|
Layout.columnSpan: 2
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
|
||||||
|
padding: 0
|
||||||
|
leftPadding: constants.paddingXXLarge
|
||||||
|
|
||||||
|
property bool editmode: false
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
id: amountLayout
|
||||||
|
width: parent.width
|
||||||
|
|
||||||
|
GridLayout {
|
||||||
|
visible: !amountContainer.editmode
|
||||||
|
columns: 2
|
||||||
|
|
||||||
|
Label {
|
||||||
|
font.pixelSize: constants.fontSizeXLarge
|
||||||
|
font.family: FixedFont
|
||||||
|
font.bold: true
|
||||||
|
text: Config.formatSats(invoice.amount, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: Config.baseUnit
|
||||||
|
color: Material.accentColor
|
||||||
|
font.pixelSize: constants.fontSizeXLarge
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
id: fiatValue
|
||||||
|
visible: Daemon.fx.enabled
|
||||||
|
text: Daemon.fx.fiatValue(invoice.amount, false)
|
||||||
|
font.pixelSize: constants.fontSizeMedium
|
||||||
|
color: constants.mutedForeground
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
visible: Daemon.fx.enabled
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: Daemon.fx.fiatCurrency
|
||||||
|
font.pixelSize: constants.fontSizeMedium
|
||||||
|
color: constants.mutedForeground
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Label {
|
ToolButton {
|
||||||
text: Config.baseUnit
|
visible: !amountContainer.editmode
|
||||||
color: Material.accentColor
|
icon.source: '../../icons/pen.png'
|
||||||
|
icon.color: 'transparent'
|
||||||
|
onClicked: {
|
||||||
|
amountBtc.text = invoice.amount.satsInt == 0 ? '' : Config.formatSats(invoice.amount)
|
||||||
|
amountContainer.editmode = true
|
||||||
|
amountBtc.focus = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
GridLayout {
|
||||||
|
visible: amountContainer.editmode
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
}
|
columns: 2
|
||||||
|
BtcField {
|
||||||
|
id: amountBtc
|
||||||
|
fiatfield: amountFiat
|
||||||
|
}
|
||||||
|
|
||||||
FiatField {
|
Label {
|
||||||
id: amountFiat
|
text: Config.baseUnit
|
||||||
btcfield: amountBtc
|
color: Material.accentColor
|
||||||
visible: Daemon.fx.enabled
|
Layout.fillWidth: true
|
||||||
}
|
}
|
||||||
|
|
||||||
Label {
|
FiatField {
|
||||||
visible: Daemon.fx.enabled
|
id: amountFiat
|
||||||
text: Daemon.fx.fiatCurrency
|
btcfield: amountBtc
|
||||||
color: Material.accentColor
|
visible: Daemon.fx.enabled
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
visible: Daemon.fx.enabled
|
||||||
|
text: Daemon.fx.fiatCurrency
|
||||||
|
color: Material.accentColor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ToolButton {
|
||||||
|
visible: amountContainer.editmode
|
||||||
|
Layout.fillWidth: false
|
||||||
|
icon.source: '../../icons/confirmed.png'
|
||||||
|
icon.color: 'transparent'
|
||||||
|
onClicked: {
|
||||||
|
amountContainer.editmode = false
|
||||||
|
invoice.amount = Config.unitsToSats(amountBtc.text)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ToolButton {
|
||||||
|
visible: amountContainer.editmode
|
||||||
|
Layout.fillWidth: false
|
||||||
|
icon.source: '../../icons/closebutton.png'
|
||||||
|
icon.color: 'transparent'
|
||||||
|
onClicked: amountContainer.editmode = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ToolButton {
|
|
||||||
visible: amountContainer.editmode
|
|
||||||
Layout.fillWidth: false
|
|
||||||
icon.source: '../../icons/confirmed.png'
|
|
||||||
icon.color: 'transparent'
|
|
||||||
onClicked: {
|
|
||||||
amountContainer.editmode = false
|
|
||||||
invoice.amount = Config.unitsToSats(amountBtc.text)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ToolButton {
|
|
||||||
visible: amountContainer.editmode
|
|
||||||
Layout.fillWidth: false
|
|
||||||
icon.source: '../../icons/closebutton.png'
|
|
||||||
icon.color: 'transparent'
|
|
||||||
onClicked: amountContainer.editmode = false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
Item { Layout.preferredHeight: constants.paddingLarge; Layout.preferredWidth: 1 }
|
||||||
|
|
||||||
Item { Layout.preferredHeight: constants.paddingLarge; Layout.preferredWidth: 1 }
|
InfoTextArea {
|
||||||
|
Layout.columnSpan: 2
|
||||||
InfoTextArea {
|
Layout.alignment: Qt.AlignHCenter
|
||||||
Layout.columnSpan: 2
|
visible: invoice.userinfo
|
||||||
Layout.alignment: Qt.AlignHCenter
|
text: invoice.userinfo
|
||||||
visible: invoice.userinfo
|
|
||||||
text: invoice.userinfo
|
|
||||||
}
|
|
||||||
|
|
||||||
RowLayout {
|
|
||||||
Layout.columnSpan: 2
|
|
||||||
Layout.alignment: Qt.AlignHCenter
|
|
||||||
spacing: constants.paddingMedium
|
|
||||||
|
|
||||||
FlatButton {
|
|
||||||
text: qsTr('Delete')
|
|
||||||
icon.source: '../../icons/delete.png'
|
|
||||||
visible: invoice_key != ''
|
|
||||||
onClicked: {
|
|
||||||
invoice.wallet.delete_invoice(invoice_key)
|
|
||||||
dialog.close()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FlatButton {
|
|
||||||
text: qsTr('Save')
|
|
||||||
icon.source: '../../icons/save.png'
|
|
||||||
visible: invoice_key == ''
|
|
||||||
enabled: invoice.canSave
|
|
||||||
onClicked: {
|
|
||||||
app.stack.push(Qt.resolvedUrl('Invoices.qml'))
|
|
||||||
invoice.save_invoice()
|
|
||||||
dialog.close()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FlatButton {
|
|
||||||
text: qsTr('Pay')
|
|
||||||
icon.source: '../../icons/confirmed.png'
|
|
||||||
enabled: invoice.invoiceType != Invoice.Invalid && invoice.canPay
|
|
||||||
onClicked: {
|
|
||||||
if (invoice_key == '') // save invoice if not retrieved from key
|
|
||||||
invoice.save_invoice()
|
|
||||||
dialog.close()
|
|
||||||
doPay() // only signal here
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Item { Layout.fillHeight: true; Layout.preferredWidth: 1 }
|
Item { Layout.fillHeight: true; Layout.preferredWidth: 1 }
|
||||||
|
|
||||||
|
FlatButton {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: qsTr('Pay')
|
||||||
|
icon.source: '../../icons/confirmed.png'
|
||||||
|
enabled: invoice.invoiceType != Invoice.Invalid && invoice.canPay
|
||||||
|
onClicked: {
|
||||||
|
if (invoice_key == '') // save invoice if not retrieved from key
|
||||||
|
invoice.save_invoice()
|
||||||
|
dialog.close()
|
||||||
|
doPay() // only signal here
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FlatButton {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: qsTr('Delete')
|
||||||
|
icon.source: '../../icons/delete.png'
|
||||||
|
visible: invoice_key != ''
|
||||||
|
onClicked: {
|
||||||
|
invoice.wallet.delete_invoice(invoice_key)
|
||||||
|
dialog.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FlatButton {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: qsTr('Save')
|
||||||
|
icon.source: '../../icons/save.png'
|
||||||
|
visible: invoice_key == ''
|
||||||
|
enabled: invoice.canSave
|
||||||
|
onClicked: {
|
||||||
|
app.stack.push(Qt.resolvedUrl('Invoices.qml'))
|
||||||
|
invoice.save_invoice()
|
||||||
|
dialog.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
|
|||||||
@@ -19,19 +19,23 @@ ElDialog {
|
|||||||
|
|
||||||
parent: Overlay.overlay
|
parent: Overlay.overlay
|
||||||
modal: true
|
modal: true
|
||||||
x: (parent.width - width) / 2
|
standardButtons: Dialog.Cancel
|
||||||
y: (parent.height - height) / 2
|
anchors.centerIn: parent
|
||||||
|
padding: 0
|
||||||
|
|
||||||
Overlay.modal: Rectangle {
|
Overlay.modal: Rectangle {
|
||||||
color: "#aa000000"
|
color: "#aa000000"
|
||||||
}
|
}
|
||||||
|
|
||||||
ColumnLayout {
|
ColumnLayout {
|
||||||
width: parent.width
|
width: parent.width
|
||||||
|
spacing: 0
|
||||||
|
|
||||||
InfoTextArea {
|
InfoTextArea {
|
||||||
visible: infotext
|
visible: infotext
|
||||||
text: infotext
|
text: infotext
|
||||||
Layout.preferredWidth: password_layout.width
|
Layout.margins: constants.paddingMedium
|
||||||
|
Layout.fillWidth: true
|
||||||
}
|
}
|
||||||
|
|
||||||
GridLayout {
|
GridLayout {
|
||||||
@@ -59,25 +63,15 @@ ElDialog {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RowLayout {
|
FlatButton {
|
||||||
Layout.alignment: Qt.AlignHCenter
|
Layout.fillWidth: true
|
||||||
Layout.topMargin: constants.paddingXXLarge
|
text: qsTr("Ok")
|
||||||
|
icon.source: '../../icons/confirmed.png'
|
||||||
Button {
|
enabled: confirmPassword ? pw_1.text == pw_2.text : true
|
||||||
text: qsTr("Ok")
|
onClicked: {
|
||||||
enabled: confirmPassword ? pw_1.text == pw_2.text : true
|
password = pw_1.text
|
||||||
onClicked: {
|
passworddialog.accept()
|
||||||
password = pw_1.text
|
|
||||||
passworddialog.accept()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Button {
|
|
||||||
text: qsTr("Cancel")
|
|
||||||
onClicked: {
|
|
||||||
passworddialog.reject()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,9 @@ ElDialog {
|
|||||||
color: "#aa000000"
|
color: "#aa000000"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
header: Item {}
|
||||||
padding: 0
|
padding: 0
|
||||||
|
topPadding: 0
|
||||||
|
|
||||||
function restart() {
|
function restart() {
|
||||||
qrscan.restart()
|
qrscan.restart()
|
||||||
@@ -28,6 +30,7 @@ ElDialog {
|
|||||||
|
|
||||||
ColumnLayout {
|
ColumnLayout {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
spacing: 0
|
||||||
|
|
||||||
QRScan {
|
QRScan {
|
||||||
id: qrscan
|
id: qrscan
|
||||||
|
|||||||
@@ -3,9 +3,7 @@ import QtQuick.Layouts 1.0
|
|||||||
import QtQuick.Controls 2.1
|
import QtQuick.Controls 2.1
|
||||||
import QtQuick.Controls.Material 2.0
|
import QtQuick.Controls.Material 2.0
|
||||||
|
|
||||||
GridLayout {
|
Item {
|
||||||
property alias text: infotext.text
|
|
||||||
|
|
||||||
enum IconStyle {
|
enum IconStyle {
|
||||||
None,
|
None,
|
||||||
Info,
|
Info,
|
||||||
@@ -13,47 +11,54 @@ GridLayout {
|
|||||||
Error
|
Error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
property alias text: infotext.text
|
||||||
property int iconStyle: InfoTextArea.IconStyle.Info
|
property int iconStyle: InfoTextArea.IconStyle.Info
|
||||||
property alias textFormat: infotext.textFormat
|
property alias textFormat: infotext.textFormat
|
||||||
|
|
||||||
columns: 1
|
implicitHeight: layout.height
|
||||||
rowSpacing: 0
|
|
||||||
|
|
||||||
Rectangle {
|
ColumnLayout {
|
||||||
height: 2
|
id: layout
|
||||||
Layout.fillWidth: true
|
|
||||||
color: Qt.rgba(1,1,1,0.25)
|
|
||||||
}
|
|
||||||
|
|
||||||
TextArea {
|
spacing: 0
|
||||||
id: infotext
|
width: parent.width
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.minimumHeight: constants.iconSizeLarge + 2*constants.paddingLarge
|
Rectangle {
|
||||||
readOnly: true
|
height: 2
|
||||||
rightPadding: constants.paddingLarge
|
Layout.fillWidth: true
|
||||||
leftPadding: 2*constants.iconSizeLarge
|
color: Qt.rgba(1,1,1,0.25)
|
||||||
wrapMode: TextInput.Wrap
|
|
||||||
textFormat: TextEdit.RichText
|
|
||||||
background: Rectangle {
|
|
||||||
color: Qt.rgba(1,1,1,0.05) // whiten 5%
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Image {
|
TextArea {
|
||||||
source: iconStyle == InfoTextArea.IconStyle.Info ? "../../../icons/info.png" : iconStyle == InfoTextArea.IconStyle.Warn ? "../../../icons/warning.png" : iconStyle == InfoTextArea.IconStyle.Error ? "../../../icons/expired.png" : ""
|
id: infotext
|
||||||
anchors.left: parent.left
|
Layout.fillWidth: true
|
||||||
anchors.top: parent.top
|
Layout.minimumHeight: constants.iconSizeLarge + 2*constants.paddingLarge
|
||||||
anchors.leftMargin: constants.paddingLarge
|
readOnly: true
|
||||||
anchors.topMargin: constants.paddingLarge
|
rightPadding: constants.paddingLarge
|
||||||
height: constants.iconSizeLarge
|
leftPadding: 2*constants.iconSizeLarge
|
||||||
width: constants.iconSizeLarge
|
wrapMode: TextInput.Wrap
|
||||||
fillMode: Image.PreserveAspectCrop
|
textFormat: TextEdit.RichText
|
||||||
|
background: Rectangle {
|
||||||
|
color: Qt.rgba(1,1,1,0.05) // whiten 5%
|
||||||
|
}
|
||||||
|
|
||||||
|
Image {
|
||||||
|
source: iconStyle == InfoTextArea.IconStyle.Info ? "../../../icons/info.png" : iconStyle == InfoTextArea.IconStyle.Warn ? "../../../icons/warning.png" : iconStyle == InfoTextArea.IconStyle.Error ? "../../../icons/expired.png" : ""
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.leftMargin: constants.paddingLarge
|
||||||
|
anchors.topMargin: constants.paddingLarge
|
||||||
|
height: constants.iconSizeLarge
|
||||||
|
width: constants.iconSizeLarge
|
||||||
|
fillMode: Image.PreserveAspectCrop
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
Rectangle {
|
||||||
|
height: 2
|
||||||
Rectangle {
|
Layout.fillWidth: true
|
||||||
height: 2
|
color: Qt.rgba(0,0,0,0.25)
|
||||||
Layout.fillWidth: true
|
}
|
||||||
color: Qt.rgba(0,0,0,0.25)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user