From 0350b6e5e73e03f271f351c9694cfe8c7009d8b4 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Thu, 17 Mar 2016 01:38:20 +0100 Subject: [PATCH] Show QR Code at funding screens, Remove QR Code Icon from AddressTextField, Add CopyIcon to Create Offer funding screen --- .../gui/components/AddressTextField.java | 51 ++-------------- .../gui/components/TextFieldWithCopyIcon.java | 1 + .../offer/createoffer/CreateOfferView.java | 60 +++++++++++++++---- .../main/offer/takeoffer/TakeOfferView.java | 49 +++++++++++++-- .../main/overlays/windows/QRCodeWindow.java | 52 ++++++++++++++++ 5 files changed, 151 insertions(+), 62 deletions(-) create mode 100644 gui/src/main/java/io/bitsquare/gui/main/overlays/windows/QRCodeWindow.java diff --git a/gui/src/main/java/io/bitsquare/gui/components/AddressTextField.java b/gui/src/main/java/io/bitsquare/gui/components/AddressTextField.java index df4f210a31..47a6c41c1e 100644 --- a/gui/src/main/java/io/bitsquare/gui/components/AddressTextField.java +++ b/gui/src/main/java/io/bitsquare/gui/components/AddressTextField.java @@ -20,7 +20,6 @@ package io.bitsquare.gui.components; import de.jensd.fx.fontawesome.AwesomeDude; import de.jensd.fx.fontawesome.AwesomeIcon; import io.bitsquare.common.util.Utilities; -import io.bitsquare.gui.main.MainView; import io.bitsquare.gui.main.overlays.popups.Popup; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleObjectProperty; @@ -29,20 +28,12 @@ import javafx.beans.property.StringProperty; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.control.Tooltip; -import javafx.scene.image.Image; -import javafx.scene.image.ImageView; import javafx.scene.layout.AnchorPane; -import javafx.scene.layout.Pane; -import javafx.stage.Window; -import net.glxn.qrgen.QRCode; -import net.glxn.qrgen.image.ImageType; import org.bitcoinj.core.Coin; import org.bitcoinj.uri.BitcoinURI; -import org.controlsfx.control.PopOver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.ByteArrayInputStream; import java.net.URI; public class AddressTextField extends AnchorPane { @@ -86,46 +77,12 @@ public class AddressTextField extends AnchorPane { Utilities.copyToClipboard(address.get()); }); - Label qrCode = new Label(); - qrCode.getStyleClass().add("copy-icon"); - qrCode.setLayoutY(3); - AwesomeDude.setIcon(qrCode, AwesomeIcon.QRCODE); - Tooltip.install(qrCode, new Tooltip("Show QR code for this address")); - qrCode.setOnMouseClicked(e -> { - if (address.get() != null && address.get().length() > 0) { - final byte[] imageBytes = QRCode - .from(getBitcoinURI()) - .withSize(300, 220) - .to(ImageType.PNG) - .stream() - .toByteArray(); - Image qrImage = new Image(new ByteArrayInputStream(imageBytes)); - ImageView view = new ImageView(qrImage); - - Pane pane = new Pane(view); - pane.setPrefSize(320, 240); - view.relocate(10, 10); - - PopOver popOver = new PopOver(pane); - popOver.setDetachedTitle("Scan QR code for this address"); - popOver.setDetached(true); - popOver.setOnHiding(windowEvent -> MainView.removeEffect()); - - Window window = getScene().getWindow(); - double x = Math.round(window.getX() + (window.getWidth() - 320) / 2); - double y = Math.round(window.getY() + (window.getHeight() - 240) / 2); - popOver.show(getScene().getWindow(), x, y); - MainView.blur(); - } - }); - - AnchorPane.setRightAnchor(qrCode, 5.0); - AnchorPane.setRightAnchor(copyIcon, 30.0); - AnchorPane.setRightAnchor(extWalletIcon, 55.0); - AnchorPane.setRightAnchor(textField, 77.0); + AnchorPane.setRightAnchor(copyIcon, 5.0); + AnchorPane.setRightAnchor(extWalletIcon, 30.0); + AnchorPane.setRightAnchor(textField, 55.0); AnchorPane.setLeftAnchor(textField, 0.0); - getChildren().addAll(textField, extWalletIcon, copyIcon, qrCode); + getChildren().addAll(textField, extWalletIcon, copyIcon); } private void openExtWallet() { diff --git a/gui/src/main/java/io/bitsquare/gui/components/TextFieldWithCopyIcon.java b/gui/src/main/java/io/bitsquare/gui/components/TextFieldWithCopyIcon.java index a16fe9c149..d828ff3809 100644 --- a/gui/src/main/java/io/bitsquare/gui/components/TextFieldWithCopyIcon.java +++ b/gui/src/main/java/io/bitsquare/gui/components/TextFieldWithCopyIcon.java @@ -64,6 +64,7 @@ public class TextFieldWithCopyIcon extends AnchorPane { textField = new TextField(); textField.setEditable(false); textField.textProperty().bindBidirectional(text); + AnchorPane.setRightAnchor(copyIcon, 5.0); AnchorPane.setRightAnchor(textField, 30.0); AnchorPane.setLeftAnchor(textField, 0.0); textField.focusTraversableProperty().set(focusTraversableProperty().get()); diff --git a/gui/src/main/java/io/bitsquare/gui/main/offer/createoffer/CreateOfferView.java b/gui/src/main/java/io/bitsquare/gui/main/offer/createoffer/CreateOfferView.java index 5d70d559ba..a33eda5d98 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/offer/createoffer/CreateOfferView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/offer/createoffer/CreateOfferView.java @@ -28,10 +28,7 @@ import io.bitsquare.common.util.Utilities; import io.bitsquare.gui.Navigation; import io.bitsquare.gui.common.view.ActivatableViewAndModel; import io.bitsquare.gui.common.view.FxmlView; -import io.bitsquare.gui.components.AddressTextField; -import io.bitsquare.gui.components.BalanceTextField; -import io.bitsquare.gui.components.InputTextField; -import io.bitsquare.gui.components.TitledGroupBg; +import io.bitsquare.gui.components.*; import io.bitsquare.gui.main.MainView; import io.bitsquare.gui.main.account.AccountView; import io.bitsquare.gui.main.account.content.arbitratorselection.ArbitratorSelectionView; @@ -41,6 +38,7 @@ import io.bitsquare.gui.main.funds.withdrawal.WithdrawalView; import io.bitsquare.gui.main.offer.OfferView; import io.bitsquare.gui.main.overlays.popups.Popup; import io.bitsquare.gui.main.overlays.windows.OfferDetailsWindow; +import io.bitsquare.gui.main.overlays.windows.QRCodeWindow; import io.bitsquare.gui.main.portfolio.PortfolioView; import io.bitsquare.gui.main.portfolio.openoffer.OpenOffersView; import io.bitsquare.gui.util.FormBuilder; @@ -56,15 +54,21 @@ import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.*; import javafx.scene.control.*; +import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.*; import javafx.scene.text.Font; import javafx.stage.Window; import javafx.util.StringConverter; +import net.glxn.qrgen.QRCode; +import net.glxn.qrgen.image.ImageType; import org.bitcoinj.core.Coin; +import org.bitcoinj.uri.BitcoinURI; import org.controlsfx.control.PopOver; +import org.jetbrains.annotations.NotNull; import javax.inject.Inject; +import java.io.ByteArrayInputStream; import java.util.concurrent.TimeUnit; import static io.bitsquare.gui.util.FormBuilder.*; @@ -85,10 +89,11 @@ public class CreateOfferView extends ActivatableViewAndModel paymentAccountsComboBox; private ComboBox currencyComboBox; private PopOver totalToPayInfoPopover; @@ -112,6 +117,7 @@ public class CreateOfferView extends ActivatableViewAndModel tradeCurrencyCodeListener; + private ImageView qrCodeImageView; /////////////////////////////////////////////////////////////////////////////////////////// @@ -301,6 +307,7 @@ public class CreateOfferView extends ActivatableViewAndModel new QRCodeWindow(getBitcoinURI()).show()); + GridPane.setRowIndex(qrCodeImageView, gridRow); + GridPane.setColumnIndex(qrCodeImageView, 2); + GridPane.setRowSpan(qrCodeImageView, 3); + GridPane.setMargin(qrCodeImageView, new Insets(Layout.FIRST_ROW_AND_GROUP_DISTANCE, 0, 0, 0)); + gridPane.getChildren().add(qrCodeImageView); + Tuple2 addressTuple = addLabelAddressTextField(gridPane, ++gridRow, BSResources.get("createOffer.fundsBox.address")); addressLabel = addressTuple.first; addressLabel.setVisible(false); @@ -749,6 +780,12 @@ public class CreateOfferView extends ActivatableViewAndModel amountValueCurrencyBoxTuple = FormBuilder.getValueCurrencyBox(BSResources.get("createOffer.amount.prompt")); @@ -794,6 +831,7 @@ public class CreateOfferView extends ActivatableViewAndModel tuple = addLabelComboBox(gridPane, gridRow, "Payment account:", Layout.FIRST_ROW_DISTANCE); paymentAccountsLabel = tuple.first; paymentAccountsLabel.setVisible(false); @@ -566,7 +588,8 @@ public class TakeOfferView extends ActivatableViewAndModel new QRCodeWindow(getBitcoinURI()).show()); + GridPane.setRowIndex(qrCodeImageView, gridRow); + GridPane.setColumnIndex(qrCodeImageView, 2); + GridPane.setRowSpan(qrCodeImageView, 3); + GridPane.setMargin(qrCodeImageView, new Insets(Layout.FIRST_ROW_AND_GROUP_DISTANCE, 0, 0, 0)); + gridPane.getChildren().add(qrCodeImageView); + Tuple2 addressTuple = addLabelAddressTextField(gridPane, ++gridRow, BSResources.get("takeOffer.fundsBox.address")); addressLabel = addressTuple.first; addressLabel.setVisible(false); @@ -683,6 +717,12 @@ public class TakeOfferView extends ActivatableViewAndModel amountValueCurrencyBoxTuple = getAmountCurrencyBox(BSResources.get("takeOffer.amount.prompt")); @@ -728,6 +768,7 @@ public class TakeOfferView extends ActivatableViewAndModel { + private static final Logger log = LoggerFactory.getLogger(QRCodeWindow.class); + private final ImageView qrCodeImageView; + + public QRCodeWindow(String bitcoinURI) { + + final byte[] imageBytes = QRCode + .from(bitcoinURI) + .withSize(250, 250) + .to(ImageType.PNG) + .stream() + .toByteArray(); + Image qrImage = new Image(new ByteArrayInputStream(imageBytes)); + qrCodeImageView = new ImageView(qrImage); + + type = Type.Information; + width = 400; + headLine("QR-Code"); + message("Please use that QR-Code for funding your Bitsquare wallet from your external wallet."); + } + + @Override + public void show() { + createGridPane(); + addHeadLine(); + addSeparator(); + addMessage(); + + GridPane.setRowIndex(qrCodeImageView, ++rowIndex); + GridPane.setColumnSpan(qrCodeImageView, 2); + GridPane.setHalignment(qrCodeImageView, HPos.CENTER); + gridPane.getChildren().add(qrCodeImageView); + + addCloseButton(); + applyStyles(); + display(); + } +}