2023-02-22 17:10:46 +00:00
import QtQuick 2.14
import QtQuick . Layouts 1.14
import StatusQ . Core 0.1
import StatusQ . Core . Theme 0.1
import StatusQ . Controls 0.1
import StatusQ . Controls . Validators 0.1
2023-03-17 15:09:27 +00:00
import StatusQ . Components 0.1
import StatusQ . Core . Utils 0.1
2023-02-22 17:10:46 +00:00
import utils 1.0
import "../../../Wallet/controls"
import shared . panels 1.0
StatusScrollView {
id: root
property int viewWidth: 560 // by design
2023-03-07 11:32:45 +00:00
// Collectible properties
2023-03-17 15:09:27 +00:00
readonly property alias name: nameInput . text
readonly property alias symbol: symbolInput . text
readonly property alias description: descriptionInput . text
readonly property alias infiniteSupply: unlimitedSupplyChecker . checked
2023-03-23 13:14:24 +00:00
readonly property alias notTransferable: transferableChecker . checked
2023-03-17 15:09:27 +00:00
readonly property alias selfDestruct: selfDestructChecker . checked
2023-03-28 07:47:12 +00:00
readonly property int supplyAmount: supplyInput . text ? parseInt ( supplyInput . text ) : 0
2023-03-07 11:32:45 +00:00
property url artworkSource
property int chainId
property string chainName
property string chainIcon
2023-03-08 13:44:47 +00:00
// Network related properties:
property var layer1Networks
property var layer2Networks
property var testNetworks
property var enabledNetworks
property var allNetworks
2023-03-17 15:09:27 +00:00
// Account related properties:
// Account expected roles: address, name, color, emoji
property var accounts
readonly property string accountAddress: accountsComboBox . address
readonly property string accountName: accountsComboBox . control . displayText
2023-02-22 17:10:46 +00:00
signal chooseArtWork
signal previewClicked
QtObject {
id: d
2023-03-07 11:32:45 +00:00
readonly property bool isFullyFilled: root . artworkSource . toString ( ) . length > 0
&& ! ! root . name
&& ! ! root . symbol
&& ! ! root . description
2023-03-28 07:47:12 +00:00
&& ( root . infiniteSupply || ( ! root . infiniteSupply && root . supplyAmount > 0 ) )
2023-02-22 17:10:46 +00:00
readonly property int imageSelectorRectWidth: 280
}
contentWidth: mainLayout . width
contentHeight: mainLayout . height
padding: 0
ColumnLayout {
id: mainLayout
width: root . viewWidth
spacing: Style . current . padding
StatusImageSelector {
Layout.preferredHeight: d . imageSelectorRectWidth + headerHeight
Layout.preferredWidth: d . imageSelectorRectWidth + buttonsInsideOffset
labelText: qsTr ( "Artwork" )
uploadText: qsTr ( "Drag and Drop or Upload Artwork" )
additionalText: qsTr ( "Images only" )
acceptedImageExtensions: Constants . acceptedDragNDropImageExtensions
2023-03-07 11:32:45 +00:00
file: root . artworkSource
2023-02-22 17:10:46 +00:00
2023-03-07 11:32:45 +00:00
onFileSelected: root . artworkSource = file
2023-02-22 17:10:46 +00:00
}
CustomStatusInput {
id: nameInput
label: qsTr ( "Name" )
charLimit: 30
placeholderText: qsTr ( "Name" )
errorText: qsTr ( "Collectible name" )
}
CustomStatusInput {
id: descriptionInput
label: qsTr ( "Description" )
charLimit: 280
placeholderText: qsTr ( "Describe your collectible" )
input.multiline: true
input.verticalAlignment: Qt . AlignTop
input.placeholder.verticalAlignment: Qt . AlignTop
minimumHeight: 108
maximumHeight: minimumHeight
errorText: qsTr ( "Collectible description" )
}
CustomStatusInput {
id: symbolInput
label: qsTr ( "Token symbol" )
2023-04-04 19:57:34 +00:00
charLimit: 7
2023-02-22 17:10:46 +00:00
placeholderText: qsTr ( "Letter token abbreviation e.g. ABC" )
errorText: qsTr ( "Token symbol" )
2023-04-04 19:57:34 +00:00
validator.regularExpression: Constants . regularExpressions . asciiPrintable
2023-02-22 17:10:46 +00:00
}
2023-03-17 15:09:27 +00:00
CustomLabelDescriptionComponent {
Layout.topMargin: Style . current . padding
label: qsTr ( "Select account" )
description: qsTr ( "The account on which this token will be minted" )
}
2023-02-22 17:10:46 +00:00
2023-03-17 15:09:27 +00:00
StatusEmojiAndColorComboBox {
id: accountsComboBox
2023-02-22 17:10:46 +00:00
2023-03-17 15:09:27 +00:00
readonly property string address: ModelUtils . get ( root . accounts , currentIndex , "address" )
2023-02-22 17:10:46 +00:00
2023-03-17 15:09:27 +00:00
Layout.fillWidth: true
model: root . accounts
type: StatusComboBox . Type . Secondary
size: StatusComboBox . Size . Small
implicitHeight: 44
defaultAssetName: "filled-account"
2023-02-22 17:10:46 +00:00
}
2023-03-17 15:09:27 +00:00
CustomNetworkFilterRowComponent {
2023-02-22 17:10:46 +00:00
label: qsTr ( "Select network" )
description: qsTr ( "The network on which this token will be minted" )
}
2023-03-17 15:09:27 +00:00
CustomSwitchRowComponent {
2023-03-07 11:32:45 +00:00
id: unlimitedSupplyChecker
2023-02-22 17:10:46 +00:00
label: qsTr ( "Unlimited supply" )
description: qsTr ( "Enable to allow the minting of additional collectibles in the future. Disable to specify a finite supply" )
checked: true
}
StatusInput {
id: supplyInput
2023-03-07 11:32:45 +00:00
visible: ! unlimitedSupplyChecker . checked
2023-02-22 17:10:46 +00:00
label: qsTr ( "Total finite supply" )
placeholderText: "1"
validators: StatusIntValidator { bottom: 1 ; top: 999999999 ; }
}
2023-03-17 15:09:27 +00:00
CustomSwitchRowComponent {
2023-03-07 11:32:45 +00:00
id: transferableChecker
2023-02-22 17:10:46 +00:00
2023-03-17 15:09:27 +00:00
label: checked ? qsTr ( "Not transferable (Soulbound)" ) : qsTr ( "Transferable" )
2023-02-22 17:10:46 +00:00
description: qsTr ( "If enabled, the token is locked to the first address it is sent to and can never be transferred to another address. Useful for tokens that represent Admin permissions" )
checked: true
}
2023-03-17 15:09:27 +00:00
CustomSwitchRowComponent {
2023-02-22 17:10:46 +00:00
id: selfDestructChecker
label: qsTr ( "Remote self-destruct" )
description: qsTr ( "Enable to allow you to destroy tokens remotely. Useful for revoking permissions from individuals" )
checked: true
}
StatusButton {
Layout.preferredHeight: 44
Layout.alignment: Qt . AlignHCenter
Layout.fillWidth: true
Layout.topMargin: Style . current . padding
2023-03-10 15:55:50 +00:00
Layout.bottomMargin: Style . current . padding
2023-02-22 17:10:46 +00:00
text: qsTr ( "Preview" )
enabled: d . isFullyFilled
2023-03-07 11:32:45 +00:00
onClicked: root . previewClicked ( )
2023-02-22 17:10:46 +00:00
}
}
2023-03-17 15:09:27 +00:00
// Inline components definition:
component CustomStatusInput: StatusInput {
id: customInput
property string errorText
2023-04-04 19:57:34 +00:00
property alias validator: regexValidator
2023-03-17 15:09:27 +00:00
Layout.fillWidth: true
validators: [
StatusMinLengthValidator {
minLength: 1
errorMessage: Utils . getErrorMessage ( customInput . errors ,
customInput . errorText )
} ,
StatusRegularExpressionValidator {
2023-04-04 19:57:34 +00:00
id: regexValidator
regularExpression: Constants . regularExpressions . ascii
errorMessage: Constants . errorMessages . asciiRegExp
2023-03-17 15:09:27 +00:00
}
]
}
component CustomLabelDescriptionComponent: ColumnLayout {
id: labelDescComponent
property string label
property string description
Layout.fillWidth: true
StatusBaseText {
text: labelDescComponent . label
color: Theme . palette . directColor1
font.pixelSize: Theme . primaryTextFontSize
}
StatusBaseText {
Layout.fillWidth: true
Layout.fillHeight: true
text: labelDescComponent . description
color: Theme . palette . baseColor1
font.pixelSize: Theme . primaryTextFontSize
lineHeight: 1.2
wrapMode: Text . WordWrap
}
}
component CustomSwitchRowComponent: RowLayout {
id: rowComponent
property string label
property string description
property alias checked: switch_ . checked
Layout.fillWidth: true
Layout.topMargin: Style . current . padding
spacing: 64
CustomLabelDescriptionComponent {
label: rowComponent . label
description: rowComponent . description
}
StatusSwitch {
id: switch_
}
}
component CustomNetworkFilterRowComponent: RowLayout {
id: networkComponent
property string label
property string description
Layout.fillWidth: true
Layout.topMargin: Style . current . padding
spacing: 32
CustomLabelDescriptionComponent {
label: networkComponent . label
description: networkComponent . description
}
NetworkFilter {
Layout.preferredWidth: 160
layer1Networks: root . layer1Networks
layer2Networks: root . layer2Networks
testNetworks: root . testNetworks
enabledNetworks: root . enabledNetworks
allNetworks: root . allNetworks
isChainVisible: false
multiSelection: false
onSingleNetworkSelected: {
root . chainId = chainId
root . chainName = chainName
root . chainIcon = chainIcon
}
}
}
2023-02-22 17:10:46 +00:00
}