mirror of
https://github.com/feather-wallet/feather.git
synced 2025-02-02 03:06:34 +00:00
Offer Book updating finished. Minor ui additions.
This commit is contained in:
parent
0018b5a869
commit
ce38f3e36e
3 changed files with 89 additions and 229 deletions
|
@ -6,6 +6,7 @@
|
|||
|
||||
#include <QList>
|
||||
#include <QProcess>
|
||||
#include <QInputDialog>
|
||||
|
||||
#include "AtomicConfigDialog.h"
|
||||
#include "OfferModel.h"
|
||||
|
@ -22,18 +23,12 @@ AtomicWidget::AtomicWidget(QWidget *parent)
|
|||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
ui->imageExchange->setBackgroundRole(QPalette::Base);
|
||||
ui->imageExchange->setAssets(":/assets/images/exchange.png", ":/assets/images/exchange_white.png");
|
||||
ui->imageExchange->setScaledContents(true);
|
||||
ui->imageExchange->setFixedSize(26, 26);
|
||||
|
||||
// validator/locale for input
|
||||
QString amount_rx = R"(^\d{0,8}[\.]\d{0,12}$)";
|
||||
QRegularExpression rx;
|
||||
rx.setPattern(amount_rx);
|
||||
QValidator *validator = new QRegularExpressionValidator(rx, this);
|
||||
ui->lineFrom->setValidator(validator);
|
||||
ui->lineTo->setValidator(validator);
|
||||
ui->offerBookTable->setModel(o_model);
|
||||
ui->offerBookTable->setSortingEnabled(true);
|
||||
ui->offerBookTable->sortByColumn(0, Qt::SortOrder::AscendingOrder);
|
||||
|
@ -42,21 +37,18 @@ AtomicWidget::AtomicWidget(QWidget *parent)
|
|||
|
||||
ui->offerBookTable->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
|
||||
ui->offerBookTable->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Stretch);
|
||||
//ui->offerBookTable->
|
||||
connect(&appData()->prices, &Prices::fiatPricesUpdated, this, &AtomicWidget::onPricesReceived);
|
||||
connect(&appData()->prices, &Prices::cryptoPricesUpdated, this, &AtomicWidget::onPricesReceived);
|
||||
ui->btn_configure->setEnabled(true);
|
||||
|
||||
connect(ui->lineFrom, &QLineEdit::textEdited, this, [this]{this->convert(false);});
|
||||
connect(ui->lineTo, &QLineEdit::textEdited, this, [this]{this->convert(true);});
|
||||
|
||||
connect(ui->comboAtomicFrom, QOverload<int>::of(&QComboBox::currentIndexChanged), [this]{this->convert(false);});
|
||||
connect(ui->comboAtomicTo, QOverload<int>::of(&QComboBox::currentIndexChanged), [this]{this->convert(false);});
|
||||
if (!Config::instance()->get(Config::swapPath).toString().isEmpty())
|
||||
ui->meta_label->setText("Refresh offer book before swapping to prevent errors");
|
||||
|
||||
connect(ui->btn_configure, &QPushButton::clicked, this, &AtomicWidget::showAtomicConfigureDialog);
|
||||
|
||||
connect(ui->btn_refreshOffer, &QPushButton::clicked, this, [this]{
|
||||
offerList->clear();
|
||||
|
||||
ui->meta_label->setText("Updating offer book this may take a bit, if no offers appear after a while try refreshing again");
|
||||
|
||||
auto m_instance = Config::instance();
|
||||
QStringList pointList = m_instance->get(Config::rendezVous).toStringList();
|
||||
for(QString point :pointList)
|
||||
|
@ -88,129 +80,40 @@ AtomicWidget::AtomicWidget(QWidget *parent)
|
|||
*/
|
||||
});
|
||||
|
||||
QTimer::singleShot(1, [this]{
|
||||
this->skinChanged();
|
||||
connect(ui->btn_addRendezvous, &QPushButton::clicked, this, [this]{
|
||||
//offerList = new QList<QSharedPointer<OfferEntry>>;
|
||||
bool ok;
|
||||
QString text = QInputDialog::getText(this, tr("Add new rendezvous point"),
|
||||
tr("p2p multi address of rendezvous point"), QLineEdit::Normal,
|
||||
"", &ok);
|
||||
if (ok && !text.isEmpty()) {
|
||||
QStringList copy = Config::instance()->get(Config::rendezVous).toStringList();
|
||||
copy.append(text);
|
||||
Config::instance()->set(Config::rendezVous,copy);
|
||||
}
|
||||
});
|
||||
|
||||
m_statusTimer.start(5000);
|
||||
connect(&m_statusTimer, &QTimer::timeout, this, &AtomicWidget::updateStatus);
|
||||
QPixmap warningIcon = QPixmap(":/assets/images/warning.png");
|
||||
ui->icon_warning->setPixmap(warningIcon.scaledToWidth(32, Qt::SmoothTransformation));
|
||||
|
||||
this->updateStatus();
|
||||
}
|
||||
|
||||
void AtomicWidget::convert(bool reverse) {
|
||||
if (!m_comboBoxInit)
|
||||
return;
|
||||
|
||||
auto lineFrom = reverse ? ui->lineTo : ui->lineFrom;
|
||||
auto lineTo = reverse ? ui->lineFrom : ui->lineTo;
|
||||
|
||||
auto comboFrom = reverse ? ui->comboAtomicTo : ui->comboAtomicFrom;
|
||||
auto comboTo = reverse ? ui->comboAtomicFrom : ui->comboAtomicTo;
|
||||
|
||||
QString symbolFrom = comboFrom->itemText(comboFrom->currentIndex());
|
||||
QString symbolTo = comboTo->itemText(comboTo->currentIndex());
|
||||
|
||||
if (symbolFrom == symbolTo) {
|
||||
lineTo->setText(lineFrom->text());
|
||||
}
|
||||
|
||||
QString amountStr = lineFrom->text();
|
||||
double amount = amountStr.toDouble();
|
||||
double result = appData()->prices.convert(symbolFrom, symbolTo, amount);
|
||||
|
||||
int precision = 10;
|
||||
if (appData()->prices.rates.contains(symbolTo))
|
||||
precision = 2;
|
||||
|
||||
lineTo->setText(QString::number(result, 'f', precision));
|
||||
}
|
||||
|
||||
void AtomicWidget::onPricesReceived() {
|
||||
if (m_comboBoxInit)
|
||||
return;
|
||||
|
||||
QList<QString> cryptoKeys = appData()->prices.markets.keys();
|
||||
QList<QString> fiatKeys = appData()->prices.rates.keys();
|
||||
if (cryptoKeys.empty() || fiatKeys.empty())
|
||||
return;
|
||||
|
||||
ui->btn_configure->setEnabled(true);
|
||||
this->initComboBox();
|
||||
m_comboBoxInit = true;
|
||||
this->updateStatus();
|
||||
}
|
||||
|
||||
void AtomicWidget::initComboBox() {
|
||||
QList<QString> cryptoKeys = appData()->prices.markets.keys();
|
||||
QList<QString> fiatKeys = appData()->prices.rates.keys();
|
||||
|
||||
QStringList enabledCrypto = conf()->get(Config::cryptoSymbols).toStringList();
|
||||
QStringList filteredCryptoKeys;
|
||||
for (const auto& symbol : cryptoKeys) {
|
||||
if (enabledCrypto.contains(symbol)) {
|
||||
filteredCryptoKeys.append(symbol);
|
||||
}
|
||||
}
|
||||
|
||||
QStringList enabledFiat = conf()->get(Config::fiatSymbols).toStringList();
|
||||
auto preferredFiat = conf()->get(Config::preferredFiatCurrency).toString();
|
||||
if (!enabledFiat.contains(preferredFiat) && fiatKeys.contains(preferredFiat)) {
|
||||
enabledFiat.append(preferredFiat);
|
||||
conf()->set(Config::fiatSymbols, enabledFiat);
|
||||
}
|
||||
QStringList filteredFiatKeys;
|
||||
for (const auto &symbol : fiatKeys) {
|
||||
if (enabledFiat.contains(symbol)) {
|
||||
filteredFiatKeys.append(symbol);
|
||||
}
|
||||
}
|
||||
|
||||
this->setupComboBox(ui->comboAtomicFrom, filteredCryptoKeys, filteredFiatKeys);
|
||||
this->setupComboBox(ui->comboAtomicTo, filteredCryptoKeys, filteredFiatKeys);
|
||||
|
||||
ui->comboAtomicFrom->setCurrentIndex(ui->comboAtomicFrom->findText("XMR"));
|
||||
|
||||
if (!preferredFiat.isEmpty()) {
|
||||
ui->comboAtomicTo->setCurrentIndex(ui->comboAtomicTo->findText(preferredFiat));
|
||||
} else {
|
||||
ui->comboAtomicTo->setCurrentIndex(ui->comboAtomicTo->findText("USD"));
|
||||
}
|
||||
}
|
||||
|
||||
void AtomicWidget::skinChanged() {
|
||||
ui->imageExchange->setMode(ColorScheme::hasDarkBackground(this));
|
||||
}
|
||||
|
||||
void AtomicWidget::showAtomicConfigureDialog() {
|
||||
AtomicConfigDialog dialog{this};
|
||||
|
||||
if (dialog.exec() == QDialog::Accepted) {
|
||||
this->initComboBox();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void AtomicWidget::setupComboBox(QComboBox *comboBox, const QStringList &crypto, const QStringList &fiat) {
|
||||
comboBox->clear();
|
||||
comboBox->addItems(crypto);
|
||||
comboBox->insertSeparator(comboBox->count());
|
||||
comboBox->addItems(fiat);
|
||||
}
|
||||
|
||||
|
||||
void AtomicWidget::updateStatus() {
|
||||
if (!m_comboBoxInit) {
|
||||
ui->label_warning->setText("Waiting on exchange data.");
|
||||
ui->frame_warning->show();
|
||||
}
|
||||
else if (websocketNotifier()->stale(10)) {
|
||||
ui->label_warning->setText("No new exchange rates received for over 10 minutes.");
|
||||
ui->frame_warning->show();
|
||||
}
|
||||
else {
|
||||
ui->frame_warning->hide();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void AtomicWidget::list(QString rendezvous) {
|
||||
|
@ -248,18 +151,27 @@ void AtomicWidget::list(QString rendezvous) {
|
|||
qDebug() << "status contained";
|
||||
parsedLine = QJsonDocument::fromJson(line.toLocal8Bit(), &parseError );
|
||||
if (parsedLine["fields"]["status"].toString().contains("Online")){
|
||||
OfferEntry entry = {parsedLine["fields"]["price"].toDouble(),parsedLine["fields"]["min_quantity"].toDouble(),parsedLine["fields"]["max_quantity"].toDouble(), parsedLine["fields"]["address"].toString()};
|
||||
offerList->append(QSharedPointer<OfferEntry>(&entry));
|
||||
qDebug() << &entry;
|
||||
bool skip = false;
|
||||
auto entry = new OfferEntry(parsedLine["fields"]["price"].toString().split( ' ')[0].toDouble(),parsedLine["fields"]["min_quantity"].toString().split(' ')[0].toDouble(),parsedLine["fields"]["max_quantity"].toString().split(' ')[0].toDouble(), parsedLine["fields"]["address"].toString());
|
||||
for(auto post : *offerList){
|
||||
if(std::equal(entry->address.begin(), entry->address.end(),post->address.begin(),post->address.end()))
|
||||
skip = true;
|
||||
}
|
||||
if (!skip) {
|
||||
ui->meta_label->setText("Updated offer book");
|
||||
offerList->append(QSharedPointer<OfferEntry>(entry));
|
||||
}
|
||||
qDebug() << entry;
|
||||
}
|
||||
}
|
||||
qDebug() << "next line";
|
||||
}
|
||||
qDebug() << "exits fine";
|
||||
swap->close();
|
||||
o_model->updateOffers(*offerList);
|
||||
return list;
|
||||
});
|
||||
swap->start("/home/dev/.config/feather/swap", arguments);
|
||||
swap->start(m_instance->get(Config::swapPath).toString(), arguments);
|
||||
//swap->waitForFinished(120000);
|
||||
|
||||
|
||||
|
|
|
@ -29,13 +29,9 @@ public slots:
|
|||
void skinChanged();
|
||||
|
||||
private slots:
|
||||
void initComboBox();
|
||||
void showAtomicConfigureDialog();
|
||||
void onPricesReceived();
|
||||
|
||||
private:
|
||||
void convert(bool reverse);
|
||||
void setupComboBox(QComboBox *comboBox, const QStringList &crypto, const QStringList &fiat);
|
||||
void updateStatus();
|
||||
|
||||
QScopedPointer<Ui::AtomicWidget> ui;
|
||||
|
|
|
@ -15,124 +15,76 @@
|
|||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QFrame" name="frame_warning">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::Shape::StyledPanel</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Shadow::Raised</enum>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<item>
|
||||
<widget class="QLabel" name="icon_warning">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>icon</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Orientation::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Policy::Maximum</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>10</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_warning">
|
||||
<property name="text">
|
||||
<string>Warning text</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QTableView" name="offerBookTable"/>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<property name="horizontalSpacing">
|
||||
<number>18</number>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QLineEdit" name="lineFrom">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Maximum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="frame">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="placeholderText">
|
||||
<string>From...</string>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>BTC change address</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="comboAtomicFrom"/>
|
||||
<widget class="QLineEdit" name="change_address"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="DoublePixmapLabel" name="imageExchange">
|
||||
<property name="text">
|
||||
<string>exchange image</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||
<item>
|
||||
<widget class="QLineEdit" name="lineTo">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Maximum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="readOnly">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="placeholderText">
|
||||
<string>To...</string>
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>XMR receive address</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="comboAtomicTo"/>
|
||||
<widget class="QLineEdit" name="xmr_address"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTableView" name="offerBookTable"/>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Orientation::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="btn_swap">
|
||||
<property name="text">
|
||||
<string>Swap</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_3">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Orientation::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
|
@ -150,6 +102,13 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="meta_label">
|
||||
<property name="text">
|
||||
<string>No swap tool configured, click configure to set up</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
|
@ -174,13 +133,6 @@
|
|||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>DoublePixmapLabel</class>
|
||||
<extends>QLabel</extends>
|
||||
<header>components.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
<slots>
|
||||
|
|
Loading…
Reference in a new issue