179 lines
4.8 KiB
QML
179 lines
4.8 KiB
QML
|
import QtQuick 2.15
|
|||
|
import QtQuick.Controls 2.15
|
|||
|
import QtQuick.Layouts 1.15
|
|||
|
|
|||
|
import StatusQ.Components 0.1
|
|||
|
import StatusQ.Components.private 0.1
|
|||
|
import StatusQ.Controls 0.1
|
|||
|
import StatusQ.Core 0.1
|
|||
|
import StatusQ.Core.Theme 0.1
|
|||
|
import StatusQ.Core.Utils 0.1
|
|||
|
|
|||
|
import AppLayouts.Wallet.panels 1.0
|
|||
|
|
|||
|
import utils 1.0
|
|||
|
|
|||
|
Control {
|
|||
|
id: root
|
|||
|
|
|||
|
/** Expected model structure: see TokenSelectorPanel::assetsModel **/
|
|||
|
property alias assetsModel: tokenSelectorPanel.assetsModel
|
|||
|
|
|||
|
/** Expected model structure: see TokenSelectorPanel::collectiblesModel **/
|
|||
|
property alias collectiblesModel: tokenSelectorPanel.collectiblesModel
|
|||
|
|
|||
|
signal assetSelected(string key)
|
|||
|
signal collectionSelected(string key)
|
|||
|
signal collectibleSelected(string key)
|
|||
|
|
|||
|
// Index of the current tab, indexes correspond to the
|
|||
|
// TokensSelectorPanel.Tabs enum values.
|
|||
|
property alias currentTab: tokenSelectorPanel.currentTab
|
|||
|
|
|||
|
function setCustom(name: string, icon: url, key: string) {
|
|||
|
d.isTokenSelected = true
|
|||
|
d.currentName = name
|
|||
|
d.currentIcon = icon
|
|||
|
tokenSelectorPanel.highlightedKey = key ?? ""
|
|||
|
}
|
|||
|
|
|||
|
padding: 10
|
|||
|
|
|||
|
QtObject {
|
|||
|
id: d
|
|||
|
|
|||
|
property bool isTokenSelected: false
|
|||
|
|
|||
|
property string currentName
|
|||
|
property url currentIcon
|
|||
|
}
|
|||
|
|
|||
|
background: StatusComboboxBackground {
|
|||
|
border.width: 0
|
|||
|
color: {
|
|||
|
if (d.isTokenSelected)
|
|||
|
return "transparent"
|
|||
|
|
|||
|
return root.hovered || dropdown.opened
|
|||
|
? Theme.palette.primaryColor2
|
|||
|
: Theme.palette.primaryColor3
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
contentItem: Loader {
|
|||
|
sourceComponent: d.isTokenSelected ? selectedContent
|
|||
|
: notSelectedContent
|
|||
|
}
|
|||
|
|
|||
|
Component {
|
|||
|
id: notSelectedContent
|
|||
|
|
|||
|
RowLayout {
|
|||
|
spacing: 10
|
|||
|
|
|||
|
StatusBaseText {
|
|||
|
objectName: "tokenSelectorContentItemText"
|
|||
|
font.pixelSize: root.font.pixelSize
|
|||
|
font.weight: Font.Medium
|
|||
|
color: Theme.palette.primaryColor1
|
|||
|
text: qsTr("Select token")
|
|||
|
}
|
|||
|
|
|||
|
StatusComboboxIndicator {
|
|||
|
color: Theme.palette.primaryColor1
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Component {
|
|||
|
id: selectedContent
|
|||
|
|
|||
|
RowLayout {
|
|||
|
spacing: Style.current.halfPadding
|
|||
|
|
|||
|
StatusRoundedImage {
|
|||
|
objectName: "tokenSelectorIcon"
|
|||
|
Layout.preferredWidth: 20
|
|||
|
Layout.preferredHeight: 20
|
|||
|
image.source: d.currentIcon
|
|||
|
}
|
|||
|
|
|||
|
StatusBaseText {
|
|||
|
objectName: "tokenSelectorContentItemText"
|
|||
|
font.pixelSize: 28
|
|||
|
color: root.hovered ? Theme.palette.blue : Theme.palette.darkBlue
|
|||
|
|
|||
|
text: d.currentName
|
|||
|
}
|
|||
|
|
|||
|
StatusComboboxIndicator {
|
|||
|
color: Theme.palette.primaryColor1
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
StatusDropdown {
|
|||
|
id: dropdown
|
|||
|
|
|||
|
y: parent.height + 4
|
|||
|
|
|||
|
closePolicy: Popup.CloseOnPressOutsideParent
|
|||
|
bottomPadding: 0
|
|||
|
|
|||
|
contentItem: TokenSelectorPanel {
|
|||
|
id: tokenSelectorPanel
|
|||
|
|
|||
|
function findSubitem(key) {
|
|||
|
const count = collectiblesModel.rowCount()
|
|||
|
|
|||
|
for (let i = 0; i < count; i++) {
|
|||
|
const entry = ModelUtils.get(collectiblesModel, i)
|
|||
|
const subitem = ModelUtils.getByKey(
|
|||
|
entry.subitems, "key", key)
|
|||
|
if (subitem)
|
|||
|
return subitem
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function setCurrentAndClose(name, icon) {
|
|||
|
d.currentName = name
|
|||
|
d.currentIcon = icon
|
|||
|
d.isTokenSelected = true
|
|||
|
dropdown.close()
|
|||
|
}
|
|||
|
|
|||
|
onAssetSelected: {
|
|||
|
const entry = ModelUtils.getByKey(assetsModel, "tokensKey", key)
|
|||
|
highlightedKey = key
|
|||
|
|
|||
|
setCurrentAndClose(entry.symbol,
|
|||
|
Constants.tokenIcon(entry.symbol))
|
|||
|
root.assetSelected(key)
|
|||
|
}
|
|||
|
|
|||
|
onCollectibleSelected: {
|
|||
|
highlightedKey = key
|
|||
|
|
|||
|
const subitem = findSubitem(key)
|
|||
|
setCurrentAndClose(subitem.name, subitem.icon)
|
|||
|
|
|||
|
root.collectibleSelected(key)
|
|||
|
}
|
|||
|
|
|||
|
onCollectionSelected: {
|
|||
|
highlightedKey = key
|
|||
|
|
|||
|
const subitem = findSubitem(key)
|
|||
|
setCurrentAndClose(subitem.name, subitem.icon)
|
|||
|
|
|||
|
root.collectionSelected(key)
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
MouseArea {
|
|||
|
anchors.fill: parent
|
|||
|
onClicked: dropdown.opened ? dropdown.close() : dropdown.open()
|
|||
|
}
|
|||
|
}
|