Browse Source

Add Mobile App connection UI

pull/45/head
adityapk00 5 years ago
parent
commit
9e8dc1e99f
  1. 39
      src/mainwindow.cpp
  2. 1
      src/mainwindow.h
  3. 25
      src/mainwindow.ui
  4. 14
      src/mobileappconnector.cpp
  5. 22
      src/mobileappconnector.h
  6. 146
      src/mobileappconnector.ui
  7. 8
      src/qrcodelabel.cpp
  8. 4
      src/qrcodelabel.h
  9. 102
      wsclient.html
  10. 13
      zec-qt-wallet.pro

39
src/mainwindow.cpp

@ -1,6 +1,7 @@
#include "mainwindow.h"
#include "addressbook.h"
#include "ui_mainwindow.h"
#include "ui_mobileappconnector.h"
#include "ui_addressbook.h"
#include "ui_zboard.h"
#include "ui_privkey.h"
@ -62,6 +63,9 @@ MainWindow::MainWindow(QWidget *parent) :
// z-Board.net
QObject::connect(ui->actionz_board_net, &QAction::triggered, this, &MainWindow::postToZBoard);
// Connect mobile app
QObject::connect(ui->actionConnect_Mobile_App, &QAction::triggered, this, &MainWindow::connectApp);
// Address Book
QObject::connect(ui->action_Address_Book, &QAction::triggered, this, &MainWindow::addressBook);
@ -524,6 +528,39 @@ void MainWindow::donate() {
ui->tabWidget->setCurrentIndex(1);
}
void MainWindow::connectApp() {
QDialog d(this);
Ui_MobileAppConnector con;
con.setupUi(&d);
Settings::saveRestore(&d);
if (rpc->getConnection() == nullptr)
return;
// Get the address of the localhost
auto addrList = QNetworkInterface::allAddresses();
// Find a suitable address
QString ipv4Addr;
for (auto addr : addrList) {
if (addr.isLoopback() || addr.protocol() == QAbstractSocket::IPv6Protocol)
continue;
ipv4Addr = addr.toString();
break;
}
if (ipv4Addr.isEmpty())
return;
QString uri = "ws://" + ipv4Addr + ":8237";
con.lblConnStr->setText(uri);
con.qrcode->setQrcodeString(uri);
d.exec();
}
void MainWindow::postToZBoard() {
QDialog d(this);
Ui_zboard zb;
@ -1263,7 +1300,7 @@ void MainWindow::setupRecieveTab() {
ui->rcvLabel->setText(label);
ui->rcvBal->setText(Settings::getZECUSDDisplayFormat(rpc->getAllBalances()->value(addr)));
ui->txtRecieve->setPlainText(addr);
ui->qrcodeDisplay->setAddress(addr);
ui->qrcodeDisplay->setQrcodeString(addr);
if (rpc->getUsedAddresses()->value(addr, false)) {
ui->lblUsed->setText(tr("Address has been previously used"));
} else {

1
src/mainwindow.h

@ -92,6 +92,7 @@ private:
void addressBook();
void payZcashURI();
void postToZBoard();
void connectApp();
void importPrivKey();
void exportAllKeys();
void exportKeys(QString addr = "");

25
src/mainwindow.ui

@ -346,8 +346,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>920</width>
<height>334</height>
<width>928</width>
<height>380</height>
</rect>
</property>
<layout class="QVBoxLayout" name="sendToLayout">
@ -992,7 +992,7 @@
<x>0</x>
<y>0</y>
<width>968</width>
<height>22</height>
<height>19</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
@ -1021,8 +1021,10 @@
<property name="title">
<string>&amp;Apps</string>
</property>
<addaction name="actionTurnstile_Migration"/>
<addaction name="actionConnect_Mobile_App"/>
<addaction name="separator"/>
<addaction name="actionz_board_net"/>
<addaction name="actionTurnstile_Migration"/>
</widget>
<widget class="QMenu" name="menu_Edit">
<property name="title">
@ -1114,9 +1116,19 @@
<string>Pay zcash &amp;URI...</string>
</property>
</action>
<action name="actionConnect_Mobile_App">
<property name="text">
<string>Connect mobile &amp;app</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<customwidgets>
<customwidget>
<class>AddressCombo</class>
<extends>QComboBox</extends>
<header>addresscombo.h</header>
</customwidget>
<customwidget>
<class>QRCodeLabel</class>
<extends>QLabel</extends>
@ -1127,11 +1139,6 @@
<extends>QLabel</extends>
<header>fillediconlabel.h</header>
</customwidget>
<customwidget>
<class>AddressCombo</class>
<extends>QComboBox</extends>
<header>addresscombo.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>tabWidget</tabstop>

14
src/mobileappconnector.cpp

@ -0,0 +1,14 @@
#include "mobileappconnector.h"
#include "ui_mobileappconnector.h"
MobileAppConnector::MobileAppConnector(QWidget *parent) :
QDialog(parent),
ui(new Ui::MobileAppConnector)
{
ui->setupUi(this);
}
MobileAppConnector::~MobileAppConnector()
{
delete ui;
}

22
src/mobileappconnector.h

@ -0,0 +1,22 @@
#ifndef MOBILEAPPCONNECTOR_H
#define MOBILEAPPCONNECTOR_H
#include <QDialog>
namespace Ui {
class MobileAppConnector;
}
class MobileAppConnector : public QDialog
{
Q_OBJECT
public:
explicit MobileAppConnector(QWidget *parent = nullptr);
~MobileAppConnector();
private:
Ui::MobileAppConnector *ui;
};
#endif // MOBILEAPPCONNECTOR_H

146
src/mobileappconnector.ui

@ -0,0 +1,146 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MobileAppConnector</class>
<widget class="QDialog" name="MobileAppConnector">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>532</width>
<height>400</height>
</rect>
</property>
<property name="windowTitle">
<string>Connect Mobile App</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="2">
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>ZecQT Wallet Companion App</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="lblConnectedApp">
<property name="text">
<string>Connected Phone Name and Description</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QPushButton" name="btnDisconnect">
<property name="text">
<string>Disconnect</string>
</property>
</widget>
</item>
<item row="2" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item row="4" column="1" colspan="2">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Close</set>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QRCodeLabel" name="qrcode">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="styleSheet">
<string notr="true">background-color: #fff</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="0" column="0" colspan="3">
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Scan this QRCode from your ZecQT companion app to connect your phone</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QLabel" name="lblConnStr">
<property name="text">
<string>TextLabel</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>QRCodeLabel</class>
<extends>QLabel</extends>
<header>qrcodelabel.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>MobileAppConnector</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>MobileAppConnector</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

8
src/qrcodelabel.cpp

@ -15,7 +15,7 @@ QSize QRCodeLabel::sizeHint() const
void QRCodeLabel::resizeEvent(QResizeEvent*)
{
if(!address.isEmpty())
if(!str.isEmpty())
QLabel::setPixmap(scaledPixmap());
}
@ -24,7 +24,7 @@ QPixmap QRCodeLabel::scaledPixmap() const {
pm.fill(Qt::white);
QPainter painter(&pm);
qrcodegen::QrCode qr = qrcodegen::QrCode::encodeText(address.toUtf8().constData(), qrcodegen::QrCode::Ecc::LOW);
qrcodegen::QrCode qr = qrcodegen::QrCode::encodeText(str.toUtf8().constData(), qrcodegen::QrCode::Ecc::LOW);
const int s = qr.getSize()>0?qr.getSize():1;
const double w = pm.width();
const double h = pm.height();
@ -51,7 +51,7 @@ QPixmap QRCodeLabel::scaledPixmap() const {
return pm;
}
void QRCodeLabel::setAddress(QString addr) {
address = addr;
void QRCodeLabel::setQrcodeString(QString stra) {
str = stra;
QLabel::setPixmap(scaledPixmap());
}

4
src/qrcodelabel.h

@ -10,13 +10,13 @@ public:
explicit QRCodeLabel(QWidget *parent = nullptr);
virtual QSize sizeHint() const;
void setAddress(QString address);
void setQrcodeString(QString address);
QPixmap scaledPixmap() const;
public slots:
void resizeEvent(QResizeEvent *);
private:
QString address;
QString str;
};

102
wsclient.html

@ -0,0 +1,102 @@
<html>
<head>
<title>WebSocket Echo Client</title>
</head>
<body>
<h1>WebSocket Echo Client</h1>
<p>
<button onClick="initWebSocket();">Connect</button>
<button onClick="stopWebSocket();">Disconnect</button>
<button onClick="checkSocket();">State</button>
</p>
<p>
<textarea id="debugTextArea" style="width:400px;height:200px;"></textarea>
</p>
<p>
<input type="text" id="inputText" onkeydown="if(event.keyCode==13)sendMessage();" />
<button onClick="sendMessage();">Send</button>
</p>
<script type="text/javascript">
var debugTextArea = document.getElementById("debugTextArea");
function debug(message) {
debugTextArea.value += message + "\n";
debugTextArea.scrollTop = debugTextArea.scrollHeight;
}
function sendMessage() {
var msg = document.getElementById("inputText").value;
if ( websocket != null )
{
document.getElementById("inputText").value = "";
websocket.send( msg );
console.log( "string sent :", '"'+msg+'"' );
}
}
var wsUri = "ws://localhost:8237";
var websocket = null;
function initWebSocket() {
try {
if (typeof MozWebSocket == 'function')
WebSocket = MozWebSocket;
if ( websocket && websocket.readyState == 1 )
websocket.close();
websocket = new WebSocket( wsUri );
websocket.onopen = function (evt) {
debug("CONNECTED");
};
websocket.onclose = function (evt) {
debug("DISCONNECTED");
};
websocket.onmessage = function (evt) {
console.log( "Message received :", evt.data );
debug( evt.data );
};
websocket.onerror = function (evt) {
debug('ERROR: ' + evt.data);
};
} catch (exception) {
debug('ERROR: ' + exception);
}
}
function stopWebSocket() {
if (websocket)
websocket.close();
}
function checkSocket() {
if (websocket != null) {
var stateStr;
switch (websocket.readyState) {
case 0: {
stateStr = "CONNECTING";
break;
}
case 1: {
stateStr = "OPEN";
break;
}
case 2: {
stateStr = "CLOSING";
break;
}
case 3: {
stateStr = "CLOSED";
break;
}
default: {
stateStr = "UNKNOW";
break;
}
}
debug("WebSocket state = " + websocket.readyState + " ( " + stateStr + " )");
} else {
debug("WebSocket is null");
}
}
</script>
</body>
</html>

13
zec-qt-wallet.pro

@ -46,14 +46,15 @@ SOURCES += \
src/sendtab.cpp \
src/senttxstore.cpp \
src/txtablemodel.cpp \
src/turnstile.cpp \
src/turnstile.cpp \
src/qrcodelabel.cpp \
src/connection.cpp \
src/fillediconlabel.cpp \
src/addressbook.cpp \
src/logger.cpp \
src/addresscombo.cpp \
src/websockets.cpp
src/websockets.cpp \
src/mobileappconnector.cpp
HEADERS += \
src/mainwindow.h \
@ -67,14 +68,15 @@ HEADERS += \
src/settings.h \
src/txtablemodel.h \
src/senttxstore.h \
src/turnstile.h \
src/turnstile.h \
src/qrcodelabel.h \
src/connection.h \
src/fillediconlabel.h \
src/addressbook.h \
src/logger.h \
src/addresscombo.h \
src/websockets.h
src/websockets.h \
src/mobileappconnector.h
FORMS += \
src/mainwindow.ui \
@ -87,7 +89,8 @@ FORMS += \
src/memodialog.ui \
src/connection.ui \
src/zboard.ui \
src/addressbook.ui
src/addressbook.ui \
src/mobileappconnector.ui
TRANSLATIONS = res/zec_qt_wallet_es.ts \

Loading…
Cancel
Save