feat: implement design on the login screen
This commit is contained in:
parent
eb9c948bb0
commit
67c7e9b0ca
|
@ -16,7 +16,8 @@ import core
|
|||
type
|
||||
AccountRoles {.pure.} = enum
|
||||
Username = UserRole + 1,
|
||||
Identicon = UserRole + 2
|
||||
Identicon = UserRole + 2,
|
||||
Address = UserRole + 3
|
||||
|
||||
QtObject:
|
||||
type LoginView* = ref object of QAbstractListModel
|
||||
|
@ -38,9 +39,22 @@ QtObject:
|
|||
result.status = status
|
||||
result.setup
|
||||
|
||||
proc getCurrentAccount*(self: LoginView): QVariant {.slot.} =
|
||||
result = newQVariant(self.currentAccount)
|
||||
|
||||
proc setCurrentAccount*(self: LoginView, selectedAccountIdx: int) {.slot.} =
|
||||
let currNodeAcct = self.accounts[selectedAccountIdx]
|
||||
self.currentAccount.setAccount(GeneratedAccount(name: currNodeAcct.name, photoPath: currNodeAcct.photoPath, address: currNodeAcct.keyUid))
|
||||
|
||||
QtProperty[QVariant] currentAccount:
|
||||
read = getCurrentAccount
|
||||
write = setCurrentAccount
|
||||
|
||||
proc addAccountToList*(self: LoginView, account: NodeAccount) =
|
||||
self.beginInsertRows(newQModelIndex(), self.accounts.len, self.accounts.len)
|
||||
self.accounts.add(account)
|
||||
if (self.accounts.len == 1):
|
||||
self.setCurrentAccount(0)
|
||||
self.endInsertRows()
|
||||
|
||||
proc removeAccounts*(self: LoginView) =
|
||||
|
@ -62,25 +76,24 @@ QtObject:
|
|||
case assetRole:
|
||||
of AccountRoles.Username: result = newQVariant(asset.name)
|
||||
of AccountRoles.Identicon: result = newQVariant(asset.photoPath)
|
||||
of AccountRoles.Address: result = newQVariant(asset.keyUid)
|
||||
|
||||
method roleNames(self: LoginView): Table[int, string] =
|
||||
{ AccountRoles.Username.int:"username",
|
||||
AccountRoles.Identicon.int:"identicon" }.toTable
|
||||
AccountRoles.Identicon.int:"identicon",
|
||||
AccountRoles.Address.int:"address" }.toTable
|
||||
|
||||
proc getCurrentAccount*(self: LoginView): QVariant {.slot.} =
|
||||
result = newQVariant(self.currentAccount)
|
||||
proc login(self: LoginView, password: string): string {.slot.} =
|
||||
var currentAccountId = 0
|
||||
var i = 0
|
||||
for account in self.accounts:
|
||||
if (account.keyUid == self.currentAccount.address):
|
||||
currentAccountId = i
|
||||
break
|
||||
i = i + 1
|
||||
|
||||
proc setCurrentAccount*(self: LoginView, selectedAccountIdx: int) {.slot.} =
|
||||
let currNodeAcct = self.accounts[selectedAccountIdx]
|
||||
self.currentAccount.setAccount(GeneratedAccount(name: currNodeAcct.name, photoPath: currNodeAcct.photoPath))
|
||||
|
||||
QtProperty[QVariant] currentAccount:
|
||||
read = getCurrentAccount
|
||||
write = setCurrentAccount
|
||||
|
||||
proc login(self: LoginView, selectedAccountIndex: int, password: string): string {.slot.} =
|
||||
try:
|
||||
result = self.status.accounts.login(selectedAccountIndex, password).toJson
|
||||
result = self.status.accounts.login(currentAccountId, password).toJson
|
||||
except:
|
||||
let
|
||||
e = getCurrentException()
|
||||
|
|
|
@ -33,7 +33,7 @@ QtObject:
|
|||
read = identicon
|
||||
notify = accountChanged
|
||||
|
||||
proc address*(self: AccountInfoView): string {.slot.} = result = ?.self.account.derived.whisper.publicKey
|
||||
proc address*(self: AccountInfoView): string {.slot.} = result = ?.self.account.address
|
||||
QtProperty[string] address:
|
||||
read = address
|
||||
notify = accountChanged
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
<svg width="20" height="19" viewBox="0 0 20 19" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6.85365 15.7033C6.52223 15.4548 6.05005 15.4497 5.75716 15.7426C5.46426 16.0355 5.46194 16.5142 5.78534 16.773C6.94028 17.6973 8.40549 18.25 9.9998 18.25C13.7277 18.25 16.7498 15.2279 16.7498 11.5V11.0176C16.7498 10.5721 17.2884 10.349 17.6034 10.664L18.4697 11.5303C18.7626 11.8232 19.2374 11.8232 19.5303 11.5303C19.8232 11.2374 19.8232 10.7626 19.5303 10.4697L16.5303 7.46967C16.2374 7.17678 15.7626 7.17678 15.4697 7.46967L12.4697 10.4697C12.1768 10.7626 12.1768 11.2374 12.4697 11.5303C12.7626 11.8232 13.2374 11.8232 13.5303 11.5303L14.3962 10.6644C14.7112 10.3494 15.2498 10.5725 15.2498 11.018V11.5C15.2498 14.3995 12.8993 16.75 9.9998 16.75C8.81964 16.75 7.73043 16.3606 6.85365 15.7033Z" fill="black"/>
|
||||
<path d="M4.53033 10.5303L7.53033 7.53033C7.82322 7.23744 7.82322 6.76256 7.53033 6.46967C7.23744 6.17678 6.76256 6.17678 6.46967 6.46967L5.60278 7.33656C5.30293 7.63641 4.79024 7.42405 4.79024 7C4.79024 4.1005 7.14075 1.75 10.0402 1.75C11.2204 1.75 12.3096 2.1394 13.1864 2.79673C13.5178 3.04519 13.99 3.05025 14.2829 2.75736C14.5758 2.46447 14.5781 1.98584 14.2547 1.72703C13.0998 0.802734 11.6345 0.25 10.0402 0.25C6.31232 0.25 3.29024 3.27208 3.29024 7V7.02247C3.29024 7.46793 2.75167 7.69101 2.43669 7.37603L1.53033 6.46967C1.23744 6.17678 0.762563 6.17678 0.46967 6.46967C0.176777 6.76256 0.176777 7.23744 0.46967 7.53033L3.46967 10.5303C3.76256 10.8232 4.23744 10.8232 4.53033 10.5303Z" fill="black"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.5 KiB |
|
@ -144,6 +144,7 @@ DISTFILES += \
|
|||
onboarding/Login/AccountList.qml \
|
||||
onboarding/Login/AccountSelection.qml \
|
||||
onboarding/Login/AddressView.qml \
|
||||
onboarding/Login/SelectAnotherAccountModal.qml \
|
||||
onboarding/Login/qmldir \
|
||||
onboarding/Login/samples/AccountsData.qml \
|
||||
onboarding/Login/samples/qmldir \
|
||||
|
@ -168,6 +169,7 @@ DISTFILES += \
|
|||
shared/Input.qml \
|
||||
shared/ModalPopup.qml \
|
||||
shared/PopupMenu.qml \
|
||||
shared/RoundImage.qml \
|
||||
shared/Select.qml \
|
||||
shared/Separator.qml \
|
||||
shared/StatusTabButton.qml \
|
||||
|
|
|
@ -3,75 +3,161 @@ import QtQuick.Controls 2.4
|
|||
import QtQuick.Layouts 1.11
|
||||
import QtQuick.Window 2.11
|
||||
import QtQuick.Dialogs 1.3
|
||||
import QtGraphicalEffects 1.0
|
||||
import "../shared"
|
||||
import "../imports"
|
||||
import "./Login"
|
||||
|
||||
SwipeView {
|
||||
property alias btnGenKey: accountSelection.btnGenKey
|
||||
Item {
|
||||
property alias btnGenKey: genrateKeysLink
|
||||
property bool loading: false
|
||||
|
||||
id: swipeView
|
||||
id: loginView
|
||||
anchors.fill: parent
|
||||
currentIndex: 0
|
||||
interactive: false
|
||||
|
||||
onCurrentItemChanged: {
|
||||
if(currentItem.txtPassword) {
|
||||
currentItem.txtPassword.textField.focus = true
|
||||
}
|
||||
Component.onCompleted: {
|
||||
txtPassword.forceActiveFocus(Qt.MouseFocusReason)
|
||||
}
|
||||
|
||||
AccountSelection {
|
||||
id: accountSelection
|
||||
onAccountSelect: function() {
|
||||
loginModel.setCurrentAccount(this.selectedIndex)
|
||||
swipeView.incrementCurrentIndex()
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
id: wizardStep2
|
||||
property Item txtPassword: txtPassword
|
||||
id: element
|
||||
width: 360
|
||||
height: 200
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
|
||||
RoundImage {
|
||||
id: userImage
|
||||
width: 40
|
||||
height: 40
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
source: loginModel.currentAccount.identicon
|
||||
}
|
||||
|
||||
Text {
|
||||
id: step2Title
|
||||
text: "Enter password"
|
||||
font.pointSize: 36
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 20
|
||||
id: usernameText
|
||||
text: loginModel.currentAccount.username
|
||||
font.weight: Font.Bold
|
||||
font.pixelSize: 17
|
||||
anchors.top: userImage.bottom
|
||||
anchors.topMargin: 4
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
}
|
||||
|
||||
Row {
|
||||
SelectAnotherAccountModal {
|
||||
id: selectAnotherAccountModal
|
||||
onAccountSelect: function (index) {
|
||||
loginModel.setCurrentAccount(index)
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
property bool isHovered: false
|
||||
id: changeAccountBtn
|
||||
width: 24
|
||||
height: 24
|
||||
anchors.left: usernameText.right
|
||||
anchors.leftMargin: 4
|
||||
anchors.verticalCenter: usernameText.verticalCenter
|
||||
|
||||
color: isHovered ? Theme.grey : Theme.transparent
|
||||
|
||||
radius: 4
|
||||
|
||||
Image {
|
||||
id: caretImg
|
||||
width: 10
|
||||
height: 6
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
source: "../app/img/caret.svg"
|
||||
fillMode: Image.PreserveAspectFit
|
||||
}
|
||||
ColorOverlay {
|
||||
anchors.fill: caretImg
|
||||
source: caretImg
|
||||
color: Theme.darkGrey
|
||||
}
|
||||
MouseArea {
|
||||
hoverEnabled: true
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onEntered: {
|
||||
changeAccountBtn.isHovered = true
|
||||
}
|
||||
onExited: {
|
||||
changeAccountBtn.isHovered = false
|
||||
}
|
||||
onClicked: {
|
||||
selectAnotherAccountModal.open()
|
||||
|
||||
// TODO add popup for when there are no other accounts
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
id: addressText
|
||||
width: 90
|
||||
color: Theme.darkGrey
|
||||
text: loginModel.currentAccount.address
|
||||
elide: Text.ElideMiddle
|
||||
font.pixelSize: 15
|
||||
anchors.top: usernameText.bottom
|
||||
anchors.topMargin: 4
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.top: step2Title.bottom
|
||||
anchors.topMargin: 30
|
||||
Column {
|
||||
Image {
|
||||
source: loginModel.currentAccount.identicon
|
||||
}
|
||||
}
|
||||
Column {
|
||||
Text {
|
||||
text: loginModel.currentAccount.username
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Input {
|
||||
id: txtPassword
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.rightMargin: Theme.padding
|
||||
anchors.leftMargin: Theme.padding
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: addressText.bottom
|
||||
anchors.topMargin: Theme.padding * 2
|
||||
placeholderText: "Enter password"
|
||||
textField.echoMode: TextInput.Password
|
||||
textField.focus: true
|
||||
Keys.onReturnPressed: {
|
||||
submitBtn.clicked()
|
||||
}
|
||||
}
|
||||
|
||||
Button {
|
||||
id: submitBtn
|
||||
visible: txtPassword.text.length > 0
|
||||
width: 40
|
||||
height: 40
|
||||
anchors.left: txtPassword.right
|
||||
anchors.leftMargin: Theme.padding
|
||||
anchors.verticalCenter: txtPassword.verticalCenter
|
||||
onClicked: {
|
||||
if (loading) {
|
||||
return;
|
||||
}
|
||||
loading = true
|
||||
loginModel.login(txtPassword.textField.text)
|
||||
}
|
||||
Image {
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
// TODO replace by a real loading image
|
||||
source: loading ? "../app/img/refresh.svg" : "../app/img/arrowUp.svg"
|
||||
width: 13.5
|
||||
height: 17.5
|
||||
fillMode: Image.PreserveAspectFit
|
||||
rotation: 90
|
||||
}
|
||||
background: Rectangle {
|
||||
color: Theme.blue
|
||||
radius: 50
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: {
|
||||
submitBtn.onClicked()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MessageDialog {
|
||||
id: loginError
|
||||
title: "Login failed"
|
||||
|
@ -81,6 +167,7 @@ SwipeView {
|
|||
onAccepted: {
|
||||
txtPassword.textField.clear()
|
||||
txtPassword.textField.focus = true
|
||||
loading = false
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -88,23 +175,26 @@ SwipeView {
|
|||
target: loginModel
|
||||
ignoreUnknownSignals: true
|
||||
onLoginResponseChanged: {
|
||||
if(error){
|
||||
loginError.open()
|
||||
}
|
||||
if (error) {
|
||||
loginError.open()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
StyledButton {
|
||||
id: submitBtn
|
||||
label: "Finish"
|
||||
MouseArea {
|
||||
id: genrateKeysLink
|
||||
width: genrateKeysLinkText.width
|
||||
height: genrateKeysLinkText.height
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
anchors.top: txtPassword.bottom
|
||||
anchors.topMargin: 26
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: 20
|
||||
onClicked: {
|
||||
const selectedAccountIndex = accountSelection.selectedIndex
|
||||
const response = loginModel.login(selectedAccountIndex, txtPassword.textField.text)
|
||||
// TODO: replace me with something graphical (ie spinner)
|
||||
console.log("Logging in...")
|
||||
|
||||
Text {
|
||||
id: genrateKeysLinkText
|
||||
color: Theme.blue
|
||||
text: qsTr("Generate new keys")
|
||||
font.pixelSize: 13
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -112,7 +202,7 @@ SwipeView {
|
|||
|
||||
/*##^##
|
||||
Designer {
|
||||
D{i:0;autoSize:true;height:480;width:640}
|
||||
D{i:0;autoSize:true;formeditorColor:"#ffffff";formeditorZoom:0.75;height:480;width:640}
|
||||
}
|
||||
##^##*/
|
||||
|
||||
|
|
|
@ -3,34 +3,31 @@ import QtQuick.Controls 2.3
|
|||
import QtQuick.Layouts 1.3
|
||||
import Qt.labs.platform 1.1
|
||||
import "./samples/"
|
||||
import "../../imports"
|
||||
|
||||
ListView {
|
||||
property var accounts: AccountsData {}
|
||||
property var onAccountSelect: function() {}
|
||||
property var onAccountSelect: function () {}
|
||||
|
||||
id: addressesView
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 0
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 0
|
||||
anchors.bottom: footer.top
|
||||
anchors.bottomMargin: 0
|
||||
anchors.top: title.bottom
|
||||
anchors.topMargin: 16
|
||||
contentWidth: 200
|
||||
height: parent.height
|
||||
anchors.fill: parent
|
||||
model: accounts
|
||||
focus: true
|
||||
spacing: Theme.smallPadding
|
||||
|
||||
delegate: AddressView {
|
||||
username: model.username
|
||||
identicon: model.identicon
|
||||
onAccountSelect: function(index) {
|
||||
addressesView.onAccountSelect(index)
|
||||
}
|
||||
username: model.username
|
||||
address: model.address
|
||||
identicon: model.identicon
|
||||
onAccountSelect: function (index) {
|
||||
addressesView.onAccountSelect(index)
|
||||
}
|
||||
}
|
||||
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
focus: true
|
||||
}
|
||||
|
||||
/*##^##
|
||||
Designer {
|
||||
D{i:0;autoSize:true;height:480;width:640}
|
||||
}
|
||||
##^##*/
|
||||
|
||||
|
|
|
@ -2,34 +2,72 @@ import QtQuick 2.0
|
|||
import QtQuick.Controls 2.3
|
||||
import QtQuick.Layouts 1.3
|
||||
import Qt.labs.platform 1.1
|
||||
import "../../imports"
|
||||
import "../../shared"
|
||||
|
||||
Item {
|
||||
Rectangle {
|
||||
property string username: "Jotaro Kujo"
|
||||
property string identicon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII="
|
||||
property string address: "0x123345677890987654321123456"
|
||||
property url identicon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAg0lEQVR4nOzXwQmAMBAFURV7sQybsgybsgyr0QYUlE1g+Mw7ioQMe9lMQwhDaAyhMYTGEJqYkPnrj/t5XE/ft2UdW1yken7MRAyhMYTGEBpDaAyhKe9JbzvSX9WdLWYihtAYQuMLkcYQGkPUScxEDKExhMYQGkNoDKExhMYQmjsAAP//ZfIUZgXTZXQAAAAASUVORK5CYII="
|
||||
property var onAccountSelect: function() {}
|
||||
property bool selected: loginModel.currentAccount.address === address
|
||||
property bool isHovered: false
|
||||
|
||||
id: addressViewDelegate
|
||||
height: 56
|
||||
height: 64
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 0
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 0
|
||||
border.width: 0
|
||||
color: selected || isHovered ? Theme.grey : Theme.transparent
|
||||
radius: Theme.radius
|
||||
|
||||
Row {
|
||||
RadioButton {
|
||||
checked: index == 0 ? true : false
|
||||
ButtonGroup.group: accountGroup
|
||||
onClicked: { onAccountSelect(index) }
|
||||
RoundImage {
|
||||
id: accountImage
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: Theme.padding
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
source: identicon
|
||||
}
|
||||
Text {
|
||||
id: usernameText
|
||||
text: username
|
||||
font.pixelSize: 17
|
||||
anchors.top: accountImage.top
|
||||
anchors.left: accountImage.right
|
||||
anchors.leftMargin: Theme.padding
|
||||
}
|
||||
|
||||
Text {
|
||||
id: addressText
|
||||
width: 108
|
||||
text: address
|
||||
elide: Text.ElideMiddle
|
||||
anchors.bottom: accountImage.bottom
|
||||
anchors.bottomMargin: 0
|
||||
anchors.left: usernameText.left
|
||||
anchors.leftMargin: 0
|
||||
font.pixelSize: 15
|
||||
color: Theme.darkGrey
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
hoverEnabled: true
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: {
|
||||
onAccountSelect(index)
|
||||
}
|
||||
Column {
|
||||
Image {
|
||||
source: identicon
|
||||
}
|
||||
onEntered: {
|
||||
addressViewDelegate.isHovered = true
|
||||
}
|
||||
Column {
|
||||
Text {
|
||||
text: username
|
||||
}
|
||||
onExited: {
|
||||
addressViewDelegate.isHovered = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*##^##
|
||||
Designer {
|
||||
D{i:0;formeditorColor:"#ffffff";height:64;width:450}
|
||||
}
|
||||
##^##*/
|
||||
|
|
|
@ -0,0 +1,41 @@
|
|||
import QtQuick 2.12
|
||||
import QtQuick.Controls 2.3
|
||||
import QtQuick.Layouts 1.3
|
||||
import "../../imports"
|
||||
import "../../shared"
|
||||
|
||||
ModalPopup {
|
||||
property var onAccountSelect: function () {}
|
||||
id: popup
|
||||
title: qsTr("Your accounts")
|
||||
|
||||
AccountList {
|
||||
id: accountList
|
||||
anchors.fill: parent
|
||||
|
||||
accounts: loginModel
|
||||
onAccountSelect: function(index) {
|
||||
popup.onAccountSelect(index)
|
||||
popup.close()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
footer: StyledButton {
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: Theme.padding
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: Theme.padding
|
||||
label: "Add another existing key"
|
||||
|
||||
onClicked : {
|
||||
console.log('Open other popup for seed')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*##^##
|
||||
Designer {
|
||||
D{i:0;formeditorColor:"#ffffff";height:500;width:400}
|
||||
}
|
||||
##^##*/
|
|
@ -1,3 +1,4 @@
|
|||
AccountSelection 1.0 AccountSelection.qml
|
||||
AccountList 1.0 AccountList.qml
|
||||
AddressView 1.0 AddressView.qml
|
||||
SelectAnotherAccountModal 1.0 SelectAnotherAccountModal.qml
|
||||
|
|
|
@ -6,11 +6,13 @@ import Qt.labs.platform 1.1
|
|||
ListModel {
|
||||
ListElement {
|
||||
username: "Ferocious Herringbone Sinewave2"
|
||||
identicon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII="
|
||||
identicon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAg0lEQVR4nOzXwQmAMBAFURV7sQybsgybsgyr0QYUlE1g+Mw7ioQMe9lMQwhDaAyhMYTGEJqYkPnrj/t5XE/ft2UdW1yken7MRAyhMYTGEBpDaAyhKe9JbzvSX9WdLWYihtAYQuMLkcYQGkPUScxEDKExhMYQGkNoDKExhMYQmjsAAP//ZfIUZgXTZXQAAAAASUVORK5CYII="
|
||||
address: "0x123456789009876543211234567890"
|
||||
}
|
||||
ListElement {
|
||||
username: "Another Account"
|
||||
identicon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII="
|
||||
identicon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAg0lEQVR4nOzXwQmAMBAFURV7sQybsgybsgyr0QYUlE1g+Mw7ioQMe9lMQwhDaAyhMYTGEJqYkPnrj/t5XE/ft2UdW1yken7MRAyhMYTGEBpDaAyhKe9JbzvSX9WdLWYihtAYQuMLkcYQGkPUScxEDKExhMYQGkNoDKExhMYQmjsAAP//ZfIUZgXTZXQAAAAASUVORK5CYII="
|
||||
address: "0x123456789009876543211234567890"
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -5,125 +5,125 @@ import "../imports"
|
|||
import "./"
|
||||
|
||||
Popup {
|
||||
property string title
|
||||
default property alias content : popupContent.children
|
||||
property alias header: headerContent.children
|
||||
property string title
|
||||
default property alias content: popupContent.children
|
||||
property alias header: headerContent.children
|
||||
|
||||
id: popup
|
||||
modal: true
|
||||
property alias footer : footerContent.children
|
||||
id: popup
|
||||
modal: true
|
||||
property alias footer: footerContent.children
|
||||
|
||||
Overlay.modal: Rectangle {
|
||||
color: "#60000000"
|
||||
}
|
||||
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
|
||||
parent: Overlay.overlay
|
||||
x: Math.round((parent.width - width) / 2)
|
||||
y: Math.round((parent.height - height) / 2)
|
||||
width: 480
|
||||
height: 510 // TODO find a way to make this dynamic
|
||||
background: Rectangle {
|
||||
color: Theme.white
|
||||
radius: 8
|
||||
}
|
||||
padding: 0
|
||||
contentItem: Item {
|
||||
|
||||
Item {
|
||||
id: headerContent
|
||||
width: parent.width
|
||||
height: {
|
||||
var idx = !!title ? 0 : 1
|
||||
return children[idx] && children[idx].height + Theme.padding
|
||||
Overlay.modal: Rectangle {
|
||||
color: "#60000000"
|
||||
}
|
||||
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
|
||||
parent: Overlay.overlay
|
||||
x: Math.round((parent.width - width) / 2)
|
||||
y: Math.round((parent.height - height) / 2)
|
||||
width: 480
|
||||
height: 510 // TODO find a way to make this dynamic
|
||||
background: Rectangle {
|
||||
color: Theme.white
|
||||
radius: 8
|
||||
}
|
||||
padding: 0
|
||||
contentItem: Item {
|
||||
|
||||
Item {
|
||||
id: headerContent
|
||||
width: parent.width
|
||||
height: {
|
||||
var idx = !!title ? 0 : 1
|
||||
return children[idx] && children[idx].height + Theme.padding
|
||||
}
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottomMargin: Theme.padding
|
||||
anchors.rightMargin: Theme.padding
|
||||
anchors.leftMargin: Theme.padding
|
||||
|
||||
Text {
|
||||
text: title
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
font.bold: true
|
||||
font.pixelSize: 17
|
||||
anchors.leftMargin: 16
|
||||
anchors.topMargin: Theme.padding
|
||||
anchors.bottomMargin: Theme.padding
|
||||
visible: !!title
|
||||
}
|
||||
}
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottomMargin: Theme.padding
|
||||
anchors.rightMargin: Theme.padding
|
||||
anchors.leftMargin: Theme.padding
|
||||
|
||||
Text {
|
||||
text: title
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
font.bold: true
|
||||
font.pixelSize: 17
|
||||
anchors.leftMargin: 16
|
||||
anchors.topMargin: Theme.padding
|
||||
anchors.bottomMargin: Theme.padding
|
||||
visible: !!title
|
||||
Rectangle {
|
||||
id: closeButton
|
||||
height: 32
|
||||
width: 32
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: Theme.padding
|
||||
anchors.rightMargin: Theme.padding
|
||||
anchors.right: parent.right
|
||||
radius: 8
|
||||
|
||||
Image {
|
||||
id: closeModalImg
|
||||
source: "./img/close.svg"
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: closeModalMouseArea
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
onExited: {
|
||||
closeButton.color = Theme.white
|
||||
}
|
||||
onEntered: {
|
||||
closeButton.color = Theme.grey
|
||||
}
|
||||
onClicked: {
|
||||
popup.close()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: closeButton
|
||||
height: 32
|
||||
width: 32
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: Theme.padding
|
||||
anchors.rightMargin: Theme.padding
|
||||
anchors.right: parent.right
|
||||
radius: 8
|
||||
Separator {
|
||||
id: separator
|
||||
anchors.top: headerContent.bottom
|
||||
}
|
||||
|
||||
Image {
|
||||
id: closeModalImg
|
||||
source: "./img/close.svg"
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
}
|
||||
Item {
|
||||
id: popupContent
|
||||
anchors.top: separator.bottom
|
||||
anchors.topMargin: Theme.padding
|
||||
anchors.bottom: separator2.top
|
||||
anchors.bottomMargin: Theme.padding
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: Theme.padding
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: Theme.padding
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: closeModalMouseArea
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
onExited: {
|
||||
closeButton.color = Theme.white
|
||||
}
|
||||
onEntered:{
|
||||
closeButton.color = Theme.grey
|
||||
}
|
||||
onClicked : {
|
||||
popup.close()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Separator {
|
||||
id: separator
|
||||
anchors.top: headerContent.bottom
|
||||
}
|
||||
Separator {
|
||||
id: separator2
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: 75
|
||||
}
|
||||
|
||||
Item {
|
||||
id: popupContent
|
||||
anchors.top: separator.bottom
|
||||
anchors.topMargin: Theme.padding
|
||||
anchors.bottomMargin: Theme.padding
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: Theme.padding
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: Theme.padding
|
||||
}
|
||||
|
||||
Separator {
|
||||
id: separator2
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: 75
|
||||
}
|
||||
|
||||
Item {
|
||||
id: footerContent
|
||||
height: children[0] && children[0].height
|
||||
width: parent.width
|
||||
anchors.top: separator2.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: Theme.padding
|
||||
anchors.rightMargin: Theme.padding
|
||||
anchors.leftMargin: Theme.padding
|
||||
}
|
||||
}
|
||||
Item {
|
||||
id: footerContent
|
||||
height: children[0] && children[0].height
|
||||
width: parent.width
|
||||
anchors.top: separator2.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: Theme.padding
|
||||
anchors.rightMargin: Theme.padding
|
||||
anchors.leftMargin: Theme.padding
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
import QtQuick 2.3
|
||||
import "../imports"
|
||||
|
||||
Rectangle {
|
||||
id: roundedImage
|
||||
property url source:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAg0lEQVR4nOzXwQmAMBAFURV7sQybsgybsgyr0QYUlE1g+Mw7ioQMe9lMQwhDaAyhMYTGEJqYkPnrj/t5XE/ft2UdW1yken7MRAyhMYTGEBpDaAyhKe9JbzvSX9WdLWYihtAYQuMLkcYQGkPUScxEDKExhMYQGkNoDKExhMYQmjsAAP//ZfIUZgXTZXQAAAAASUVORK5CYII="
|
||||
width: 40
|
||||
height: 40
|
||||
color: Theme.white
|
||||
radius: 50
|
||||
border.width: 1
|
||||
border.color: Theme.darkGrey
|
||||
|
||||
Image {
|
||||
width: parent.width
|
||||
height: parent.height
|
||||
fillMode: Image.PreserveAspectFit
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
source: roundedImage.source
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/*##^##
|
||||
Designer {
|
||||
D{i:0;formeditorColor:"#4c4e50";formeditorZoom:2}
|
||||
}
|
||||
##^##*/
|
|
@ -8,3 +8,4 @@ TextWithLabel 1.0 TextWithLabel.qml
|
|||
Input 1.0 Input.qml
|
||||
Select 1.0 Select.qml
|
||||
StyledTextArea 1.0 StyledTextArea.qml
|
||||
RoundImage 1.0 RoundImage.qml
|
||||
|
|
Loading…
Reference in New Issue