Browse Source

Refactor numpad code, transfer screen

pull/45/head
dsc 4 months ago
parent
commit
bd38e5e1d8
  1. 8
      src/main.cpp
  2. 2
      src/utils/prices.cpp
  3. 2
      src/vr/assets/themes.json
  4. 4
      src/vr/main.cpp
  5. 19
      src/vr/main.h
  6. 34
      src/vr/main.qml
  7. 2
      src/vr/qml/AboutPage.qml
  8. 3
      src/vr/qml/WalletPage.qml
  9. 67
      src/vr/qml/common/MyNumPad.qml
  10. 4
      src/vr/qml/common/MyNumPadButton.qml
  11. 22
      src/vr/qml/common/MyStackViewPage.qml
  12. 5
      src/vr/qml/wallet/WalletDashBoardPage.qml
  13. 9
      src/vr/qml/wallet/send/SendPage.qml
  14. 49
      src/vr/qml/wallet/send/SendPagePIN.qml
  15. 6
      src/vr/qml/wallet/send/SendPageQR.qml
  16. 277
      src/vr/qml/wallet/send/SendPageTransfer.qml

8
src/main.cpp

@ -120,6 +120,14 @@ if (AttachConsole(ATTACH_PARENT_PROCESS)) {
if(openVREnabled) {
#ifdef HAS_OPENVR
// @TODO: custom DPI / AA
// QCoreApplication::setAttribute( Qt::AA_UseDesktopOpenGL );
// QCoreApplication::setAttribute( Qt::AA_Use96Dpi );
if(qgetenv("scale") == "1")
QCoreApplication::setAttribute( Qt::AA_EnableHighDpiScaling );
if(qgetenv("noscale") == "1")
QCoreApplication::setAttribute( Qt::AA_DisableHighDpiScaling );
QApplication vr_app(argc, argv);
auto *ctx = new AppContext(&parser);
auto *vr = new wowletvr::WowletVR(ctx, &parser, &vr_app);

2
src/utils/prices.cpp

@ -38,7 +38,7 @@ void Prices::cryptoPricesReceived(const QJsonArray &data) {
for(auto &&entry: data) {
marketStruct ms;
QJsonObject obj = entry.toObject();
ms.symbol = obj.value("symbol").toString();
ms.symbol = obj.value("symbol").toString().toUpper();
ms.image = obj.value("image").toString();
ms.name = obj.value("name").toString();
ms.price_usd = obj.value("current_price").toDouble();

2
src/vr/assets/themes.json

@ -3,7 +3,7 @@
"fontColor": "white",
"fontColorDimmed": "#cccccc",
"fontColorBright": "white",
"backgroundGradientStartColor": "#194f64",
"backgroundGradientStartColor": "#225d73",
"backgroundGradientStopColor": "#192e43",
"backgroundColor": "#1b2939",
"divideColor": "50ffffff",

4
src/vr/main.cpp

@ -83,10 +83,6 @@ namespace wowletvr {
qRegisterMetaType<TransactionInfo::Direction>();
qRegisterMetaType<TransactionHistoryModel::TransactionInfoRole>();
// @TODO: custom DPI / AA
// QCoreApplication::setAttribute( Qt::AA_UseDesktopOpenGL );
// QCoreApplication::setAttribute( Qt::AA_Use96Dpi );
if(!desktopMode) {
if(!openvr_init::initializeOpenVR(openvr_init::OpenVrInitializationType::Overlay))
throw std::runtime_error("Error: initializeOpenVR()");

19
src/vr/main.h

@ -57,12 +57,25 @@ namespace wowletvr {
m_pClipboard->setText(text, QClipboard::Selection);
}
Q_INVOKABLE QString amountToFiat(double amount) {
Q_INVOKABLE QString preferredFiat() {
return config()->get(Config::preferredFiatCurrency).toString();
}
Q_INVOKABLE QString fiatToWow(double amount) {
auto preferredFiatCurrency = config()->get(Config::preferredFiatCurrency).toString();
if (amount <= 0) return QString("0.00");
double conversionAmount = AppContext::prices->convert(preferredFiatCurrency, "WOW", amount);
return QString("%1").arg(QString::number(conversionAmount, 'f', 2));
}
Q_INVOKABLE QString wowToFiat(double amount) {
auto preferredFiatCurrency = config()->get(Config::preferredFiatCurrency).toString();
if (amount <= 0) return QString("0.00 %1").arg(preferredFiatCurrency);
if (amount <= 0) return QString("0.00");
double conversionAmount = AppContext::prices->convert("WOW", preferredFiatCurrency, amount);
return QString("~%1 %2").arg(QString::number(conversionAmount, 'f', 2), preferredFiatCurrency);
if(conversionAmount <= 0) return QString("0.00");
return QString("~%1").arg(QString::number(conversionAmount, 'f', 2));
}
private:

34
src/vr/main.qml

@ -22,7 +22,8 @@ Rectangle {
color: "transparent"
property var themes: {}
property string theme: "wownero"
property string theme: "default"
property string fiatSymbol: "USD"
signal initTheme();
// Components that have been dynamically created need to redraw
@ -309,24 +310,23 @@ Rectangle {
try {
appWindow.themes = WowletVR.getThemes();
appWindow.theme = WowletVR.getCurrentTheme();
}
catch(err) {
} catch(err) {
// for debugging purposes - do not change color codes here, use themes.json instead.
appWindow.themes = {
"default": {
"fontColor": "white",
"fontColorDimmed": "#cccccc",
"fontColorBright": "#white",
"backgroundGradientStartColor": "#194f64",
"backgroundGradientStopColor": "#192e43",
},
"wownero": {
"fontColor": "#bd93f9",
"fontColorDimmed": "#cccccc",
"fontColorBright": "#e5d3ff",
"backgroundGradientStartColor": "#383a59",
"backgroundGradientStopColor": "#282a36",
}
"default": {
"fontColor": "white",
"fontColorDimmed": "#cccccc",
"fontColorBright": "white",
"backgroundGradientStartColor": "#225d73",
"backgroundGradientStopColor": "#192e43",
},
"wownero": {
"fontColor": "#bd93f9",
"fontColorDimmed": "#cccccc",
"fontColorBright": "#e5d3ff",
"backgroundGradientStartColor": "#383a59",
"backgroundGradientStopColor": "#282a36",
}
}
}

2
src/vr/qml/AboutPage.qml

@ -47,8 +47,8 @@ ColumnLayout {
Layout.leftMargin: 40
Layout.rightMargin: 40
Layout.fillWidth: true
text: "Greetings: matzman666, qvqc, ez, Gatto, cisme, wowario, lza_menace, jwinterm, nioc, asymptotically, azy, selsta, kico, laura, thrmo, rottensox, solar, bl4sty, scoobybejesus"
fontSize: 14
text: "Shoutouts: matzman666, qvqc, ez, Gatto, RAGEHAÜZ, cisme, wowario, lza_menace, jwinterm, nioc, asymptotically, azy, selsta, kico, laura, thrmo, rottensox, solar, bl4sty, scoobybejesus"
wrap: true
}

3
src/vr/qml/WalletPage.qml

@ -35,6 +35,7 @@ Rectangle {
StackView {
id: walletView
anchors.fill: parent
initialItem: walletDashboardPage
pushEnter: Transition {
PropertyAnimation {
@ -72,8 +73,6 @@ Rectangle {
easing.type: Easing.OutCubic
}
}
initialItem: walletDashboardPage
}
function onPageCompleted() {

67
src/vr/qml/common/MyNumPad.qml

@ -6,34 +6,23 @@ import "."
ColumnLayout {
id: root
enabled: true
spacing: 16
property double disabledOpacity: 0.4
property var code: [];
property bool compact: false
signal resolvePressed();
signal codeUpdated(var pin_code);
function onButtonPress(val) {
code.push(val);
if(code.length === 5)
code = [val];
codeUpdated(code);
}
function reset() {
root.code = [];
}
signal buttonPress(string val);
signal clearPress();
RowLayout {
spacing: 20
spacing: 18
MyNumPadButton {
opacity: root.enabled ? 1 : disabledOpacity
text: "1"
onClicked: {
onButtonPress("1");
buttonPress("1");
}
}
@ -41,7 +30,7 @@ ColumnLayout {
opacity: root.enabled ? 1 : disabledOpacity
text: "2"
onClicked: {
onButtonPress("2");
buttonPress("2");
}
}
@ -49,19 +38,19 @@ ColumnLayout {
opacity: root.enabled ? 1 : disabledOpacity
text: "3"
onClicked: {
onButtonPress("3");
buttonPress("3");
}
}
}
RowLayout {
spacing: 20
spacing: 18
MyNumPadButton {
opacity: root.enabled ? 1 : disabledOpacity
text: "4"
onClicked: {
onButtonPress("4");
buttonPress("4");
}
}
@ -69,7 +58,7 @@ ColumnLayout {
opacity: root.enabled ? 1 : disabledOpacity
text: "5"
onClicked: {
onButtonPress("5");
buttonPress("5");
}
}
@ -77,19 +66,19 @@ ColumnLayout {
opacity: root.enabled ? 1 : disabledOpacity
text: "6"
onClicked: {
onButtonPress("6");
buttonPress("6");
}
}
}
RowLayout {
spacing: 20
spacing: 18
MyNumPadButton {
opacity: root.enabled ? 1 : disabledOpacity
text: "7"
onClicked: {
onButtonPress("7");
buttonPress("7");
}
}
@ -97,7 +86,7 @@ ColumnLayout {
opacity: root.enabled ? 1 : disabledOpacity
text: "8"
onClicked: {
onButtonPress("8");
buttonPress("8");
}
}
@ -105,32 +94,44 @@ ColumnLayout {
opacity: root.enabled ? 1 : disabledOpacity
text: "9"
onClicked: {
onButtonPress("9");
buttonPress("9");
}
}
}
RowLayout {
spacing: 20
spacing: 18
MyNumPadButton {
opacity: root.enabled ? 1 : disabledOpacity
text: "0"
onClicked: {
onButtonPress("0");
buttonPress("0");
}
}
MyNumPadButton {
visible: root.compact
opacity: root.enabled ? 1 : disabledOpacity
text: "."
onClicked: {
buttonPress(".");
}
}
MyNumPadButton {
opacity: root.enabled ? 1 : disabledOpacity
Layout.preferredWidth: 204
Layout.preferredWidth: root.compact ? 106 : 230
fontSize: 16
text: "Clear"
text: root.compact ? "C" : "Clear"
onClicked: {
root.code = [0,0,0,0];
root.codeUpdated(root.code);
clearPress();
}
}
}
function reset() {
}
}

4
src/vr/qml/common/MyNumPadButton.qml

@ -11,8 +11,8 @@ Rectangle {
signal clicked;
Layout.preferredWidth: 92
Layout.preferredHeight: 92
Layout.preferredWidth: 106
Layout.preferredHeight: 106
color: Style.btnExitedColor
MyText {

22
src/vr/qml/common/MyStackViewPage.qml

@ -128,7 +128,6 @@ Rectangle {
ColumnLayout {
id: mainLayout
spacing: 12
anchors.fill: parent
}
@ -147,7 +146,7 @@ Rectangle {
anchors.leftMargin: 40
anchors.rightMargin: 40
color: Style.fontColorDimmed
color: Style.dividerColor
height: 1
}
@ -169,7 +168,7 @@ Rectangle {
Rectangle {
Layout.fillHeight: true
Layout.preferredWidth: 1
color: Style.fontColorDimmed
color: Style.dividerColor
}
RowLayout {
@ -204,7 +203,7 @@ Rectangle {
Rectangle {
Layout.fillHeight: true
Layout.preferredWidth: 1
color: Style.fontColorDimmed
color: Style.dividerColor
}
RowLayout {
@ -228,12 +227,21 @@ Rectangle {
Rectangle {
Layout.fillHeight: true
Layout.preferredWidth: 1
color: Style.fontColorDimmed
color: Style.dividerColor
}
MyText {
fontSize: 14
text: "Balance: " + WowletVR.amountToFiat(appWindow.spendable);
text: {
let rtn = "Balance: ";
try {
rtn += WowletVR.wowToFiat(appWindow.spendable);
} catch(err) {
rtn += "ERROR";
}
return rtn + " " + appWindow.fiatSymbol
}
color: Style.fontColorDimmed
}
}
@ -251,7 +259,7 @@ Rectangle {
content.Layout.topMargin = 10
content.Layout.leftMargin = 40
content.Layout.rightMargin = 40
content.Layout.bottomMargin = 40
content.Layout.bottomMargin = 10
bigRect.parent = mainLayout
}

5
src/vr/qml/wallet/WalletDashBoardPage.qml

@ -95,5 +95,10 @@ MyStackViewPage {
function onPageCompleted() {
historyView.onPageCompleted();
try {
appWindow.fiatSymbol = WowletVR.preferredFiat();
} catch(err) {
}
}
}

9
src/vr/qml/wallet/send/SendPage.qml

@ -8,6 +8,7 @@ import "."
MyStackViewPage {
id: sendStateController
height: 800
width: 1600
headerText: "Send"
@ -32,9 +33,6 @@ MyStackViewPage {
}
}
// if(previousView !== null && currentView.viewName === "wizardHome")
// wizardController.restart();
if (currentView) {
sendStack.replace(currentView)
// Calls when view is opened
@ -44,10 +42,6 @@ MyStackViewPage {
}
previousView = currentView;
// reset push direction
// if(wizardController.wizardState == "wizardHome")
// wizardController.wizardStackView.backTransition = false;
}
states: [
@ -105,6 +99,7 @@ MyStackViewPage {
onBackClicked: {
// top back button to send/receive menu, reset default states for sendViews
sendStateView.pinPage.onPageCompleted();
sendStateView.qrPage.onPageCompleted();
sendStateView.dashPage.onPageCompleted();
sendStateView.transferPage.onPageCompleted();
}

49
src/vr/qml/wallet/send/SendPagePIN.qml

@ -9,7 +9,7 @@ ColumnLayout {
id: root
Layout.fillWidth: true
property string _PINLookup: ""
property string pin: ""
MyText {
Layout.fillWidth: true
@ -29,25 +29,11 @@ ColumnLayout {
MyNumPad {
id: numPad
onCodeUpdated: {
let codeFmt = "";
for(var i = 0; i != 4; i++) {
if(pin_code[i] !== undefined) {
codeFmt += pin_code[i] + " ";
} else {
codeFmt += ". ";
}
onButtonPress: {
root.pin += val;
if(root.pin.length === 4 && root.pin !== "0000") {
return addressLookup();
}
// update display thingy
codeDisplay.text = codeFmt;
// lol Qt
codeFmt = codeFmt.replace(" ", "").replace(" ", "").replace(" ", "").replace(" ", "").replace(" ", "").trim();
if(pin_code.length === 4 && codeFmt != "0000")
addressLookup(codeFmt);
}
}
@ -66,7 +52,7 @@ ColumnLayout {
id: codeDisplay
Layout.preferredWidth: 390
visible: true
text: "0 0 0 0"
text: (root.pin[0] || ".") + " " + (root.pin[1] || ".") + " " + (root.pin[2] || ".") + " " + (root.pin[3] || ".");
color: Style.fontColor
font.bold: true
font.pointSize: 40
@ -136,7 +122,7 @@ ColumnLayout {
}
MyText {
text: _PINLookup
text: root.pin
}
}
}
@ -148,18 +134,18 @@ ColumnLayout {
Layout.fillWidth: true
}
function addressLookup(code) {
if(_PINLookup !== "")
return;
_PINLookup = code;
function addressLookup() {
console.log("addressLookup()");
idleContainer.visible = false;
loadingContainer.visible = true;
numPad.enabled = false;
ctx.onLookupReceivingPIN(code);
try {
ctx.onLookupReceivingPIN(root.pin);
} catch(err){
console.log("ctx.onLookupReceivingPIN() ignored")
}
}
function onPageCompleted(previousView) {
@ -167,8 +153,9 @@ ColumnLayout {
}
function reset() {
console.log("SendPagePin reset()");
// reset state
_PINLookup = "";
root.pin = "";
idleContainer.visible = true;
loadingContainer.visible = false;
@ -176,8 +163,6 @@ ColumnLayout {
numPad.enabled = true;
numPad.reset();
codeDisplay.text = "0 0 0 0";
}
Connections {
@ -186,7 +171,7 @@ ColumnLayout {
function onPinLookupReceived(address, pin) {
console.log("onPinLookupReceived", address);
if(pin === _PINLookup) {
if(pin === root.pin) {
sendStateController.destinationAddress = address;
sendStateView.state = "transferPage";
} else {

6
src/vr/qml/wallet/send/SendPageQR.qml

@ -42,7 +42,11 @@ ColumnLayout {
Layout.fillWidth: true
}
function onPageCompleted(previousView){
function reset() {
}
function onPageCompleted(previousView){
reset();
}
}

277
src/vr/qml/wallet/send/SendPageTransfer.qml

@ -9,7 +9,8 @@ ColumnLayout {
spacing: 30
property string txDialogText: ""
property double amount: 0.0
property string amount: ""
property string amount_type: "wow"
property bool canSend: false
Layout.fillWidth: true
@ -21,37 +22,85 @@ ColumnLayout {
text: "How much would you like to send?"
}
MyNumPadSendAmount {
id: myNumPadSendAmount
Layout.fillWidth: true
Layout.preferredHeight: 112
Layout.maximumHeight: 112
onAmountUpdated: {
root.amount = amount;
fiatText.text = WowletVR.amountToFiat(root.amount);
// @TODO: tx validation here
if(root.amount <= 0) {
root.canSend = false;
} else if(root.amount > appWindow.spendable) {
root.canSend = false;
} else {
root.canSend = true;
}
}
function count(input, needle) {
return input.split(".").length - 1;
}
RowLayout {
spacing: 30
Layout.topMargin: 20
Layout.fillHeight: true
Layout.fillWidth: true
spacing: 40
ColumnLayout {
Layout.preferredWidth: 320
Layout.preferredHeight: 400
MyNumPad {
id: numPad
compact: true
onButtonPress: {
let periods = count(root.amount, ".");
if(periods == 1 && val === ".") return;
if(root.amount === "" && val === ".") return;
if(root.amount.length > 7) return;
root.amount += val;
}
onClearPress: {
root.amount = "";
}
}
Rectangle {
Layout.fillHeight: true
Layout.preferredWidth: parent.Layout.preferredWidth
color: "transparent"
}
}
ColumnLayout {
spacing: 14
Layout.fillHeight: true
Layout.preferredWidth: 280
MyPushButton {
id: wowButton
opacity: enabled ? 1.0 : 0.4
enabled: root.amount_type === "fiat"
Layout.preferredWidth: 280
Layout.preferredHeight: 108
text: "Wownero"
onClicked: {
root.amount_type = "wow"
}
}
MyPushButton {
id: fiatBtn
opacity: enabled ? 1.0 : 0.4
enabled: root.amount_type === "wow"
Layout.preferredWidth: 280
Layout.preferredHeight: 108
text: "Fiat"
onClicked: {
root.amount_type = "fiat"
}
}
Item {
Layout.fillHeight: true
Layout.fillWidth: true
}
}
ColumnLayout {
spacing: 10
Layout.fillHeight: true
Layout.maximumWidth: parent.width / 2
RowLayout {
spacing: 30
@ -78,7 +127,21 @@ ColumnLayout {
MyText {
fontSize: 24
fontColor: Style.fontColorBright
text: root.amount + " WOW"
text: {
let rtn = "";
if(root.amount === "") rtn += "0.0"
else if(root.amount_type === "wow") {
rtn += root.amount;
} else {
try {
rtn += WowletVR.fiatToWow(root.amount);
} catch(err) {
return "ERROR";
}
}
return rtn + " WOW";
}
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
}
@ -111,7 +174,21 @@ ColumnLayout {
id: fiatText
fontSize: 18
fontColor: Style.fontColorBright
text: "$0.00 USD"
text: {
let rtn = "";
if(root.amount === "") rtn += "0.0"
else if(root.amount_type === "fiat") {
rtn += root.amount;
} else {
try {
rtn += WowletVR.wowToFiat(root.amount);
} catch(err) {
return "ERROR";
}
}
return rtn + " " + appWindow.fiatSymbol
}
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
}
@ -153,133 +230,49 @@ ColumnLayout {
Layout.fillWidth: true
Layout.fillHeight: true
}
}
Rectangle {
color: "transparent"
Layout.fillWidth: true
Layout.fillHeight: true
}
}
RowLayout {
Layout.preferredWidth: parent.width
Layout.preferredHeight: 128
MyPushButton {
id: keyboardButton
Layout.preferredWidth: 700
text: "Enter amount via virtual keyboard"
onClicked: {
OverlayController.showKeyboard(text, 1337)
}
}
MyPushButton {
id: sendButton
opacity: root.canSend ? 1.0 : 0.5
enabled: root.canSend
MyPushButton {
id: sendButton
Layout.preferredWidth: 420
Layout.alignment: Qt.AlignRight
Layout.preferredWidth: 420
Layout.alignment: Qt.AlignRight
text: "Create transaction"
text: "Create transaction"
onClicked: {
WowletVR.onCreateTransaction(destinationAddress, root.amount, "", false); // no description
sendButton.enabled = false;
}
}
}
onClicked: {
if(amount === "") return;
Item {
Layout.fillWidth: true
Layout.fillHeight: true
}
let _amount = parseFloat(amount);
if(root.amount_type == "fiat") {
try {
_amount = WowletVR.fiatToWow(_amount);
} catch(err) {
messagePopup.showMessage("Error", "Could not convert fiat to wow.");
return;
}
}
Connections {
target: OverlayController
if(amount <= 0) {
messagePopup.showMessage("Error", "Amount was zero.");
return;
}
function onKeyBoardInputSignal(input, userValue) {
if (userValue == 1337) {
let val = parseFloat(input);
if(val >= 0)
myNumPadSendAmount.onAmountUpdated(val);
WowletVR.onCreateTransaction(destinationAddress, _amount.toString(), "", false); // no description
sendButton.enabled = false;
}
}
}
}
Connections {
target: ctx
function onInitiateTransaction() {
console.log("transactionStarted");
mainView.opacity = 0.4;
mainView.enabled = false;
root.canSend = false;
root.txDialogText = "Busy creating transaction. Hold on tight!";
waitPopup.open();
}
function onCreateTransactionError(message) { // str
console.log("onCreateTransactionError", message);
waitPopup.close();
mainView.opacity = 1.0;
mainView.enabled = true;
root.canSend = true;
root.txDialogText = "";
messagePopup.showMessage("Error creating tx", message);
}
function onCreateTransactionSuccess(tx, address) { // PendingTransaction
console.log("onCreateTransactionSuccess", address)
root.txDialogText = "Submitting transaction to the Wownero network.";
}
function onTransactionCommitted(status, tx, txid) { // bool,PendingTransaction,stringlist
console.log("onTransactionCommitted", status);
waitPopup.close();
mainView.opacity = 1.0;
mainView.enabled = true;
root.canSend = true;
root.txDialogText = "";
walletView.pop();
}
function onPageCompleted() {
root.amount = "";
root.amount_type = "wow";
root.txDialogText = "";
}
function onPageCompleted(previousView){
}
Popup {
id: waitPopup
implicitHeight: 100
implicitWidth: 1200
x: (parent.width - width) / 2
y: (parent.height - height) / 2
ColumnLayout {
anchors.fill: parent
MyText {
Layout.alignment: Qt.AlignHCenter
fontColor: Style.fontColor
text: root.txDialogText
}
}
background: Rectangle {
color: "black"
opacity: 0.8
}
Item {
Layout.fillWidth: true
Layout.fillHeight: true
}
Component.onCompleted: {

Loading…
Cancel
Save