mirror of
https://github.com/bitcoin-s/bitcoin-s.git
synced 2025-01-19 05:43:51 +01:00
Add QR Code to get adress dialog (#3186)
This commit is contained in:
parent
4b42b90784
commit
03a0ca5ee9
@ -72,6 +72,7 @@ object BundleGUI extends WalletGUI with JFXApp {
|
|||||||
scene = guiScene
|
scene = guiScene
|
||||||
icons.add(GUIUtil.logo)
|
icons.add(GUIUtil.logo)
|
||||||
}
|
}
|
||||||
|
taskRunner
|
||||||
|
|
||||||
def changeToWalletGUIScene(): Unit = {
|
def changeToWalletGUIScene(): Unit = {
|
||||||
Platform.runLater(
|
Platform.runLater(
|
||||||
|
@ -95,4 +95,5 @@ object GUI extends WalletGUI with JFXApp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fetchStartingData()
|
fetchStartingData()
|
||||||
|
taskRunner
|
||||||
}
|
}
|
||||||
|
@ -9,16 +9,18 @@ import org.bitcoins.core.wallet.fee.FeeUnit
|
|||||||
import org.bitcoins.gui.dialog._
|
import org.bitcoins.gui.dialog._
|
||||||
import org.bitcoins.gui.util.GUIUtil
|
import org.bitcoins.gui.util.GUIUtil
|
||||||
import scalafx.application.Platform
|
import scalafx.application.Platform
|
||||||
import scalafx.beans.property.{ObjectProperty, StringProperty}
|
import scalafx.beans.property._
|
||||||
import scalafx.scene.control.Alert
|
import scalafx.scene.control.Alert
|
||||||
import scalafx.scene.control.Alert.AlertType
|
import scalafx.scene.control.Alert.AlertType
|
||||||
import scalafx.stage.Window
|
import scalafx.stage.Window
|
||||||
|
|
||||||
import scala.concurrent.duration.DurationInt
|
import scala.concurrent.duration.DurationInt
|
||||||
|
import scala.concurrent.{Await, Promise}
|
||||||
import scala.util.{Failure, Success, Try}
|
import scala.util.{Failure, Success, Try}
|
||||||
|
|
||||||
class WalletGUIModel()(implicit system: ActorSystem) {
|
class WalletGUIModel()(implicit system: ActorSystem) {
|
||||||
var taskRunner: TaskRunner = _
|
var taskRunner: TaskRunner = _
|
||||||
|
import system.dispatcher
|
||||||
|
|
||||||
// Sadly, it is a Java "pattern" to pass null into
|
// Sadly, it is a Java "pattern" to pass null into
|
||||||
// constructors to signal that you want some default
|
// constructors to signal that you want some default
|
||||||
@ -35,7 +37,6 @@ class WalletGUIModel()(implicit system: ActorSystem) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
def startWalletInfoScheduler(): Cancellable = {
|
def startWalletInfoScheduler(): Cancellable = {
|
||||||
import system.dispatcher
|
|
||||||
system.scheduler.scheduleAtFixedRate(0.seconds, 10.seconds)(
|
system.scheduler.scheduleAtFixedRate(0.seconds, 10.seconds)(
|
||||||
UpdateWalletInfoRunnable)
|
UpdateWalletInfoRunnable)
|
||||||
}
|
}
|
||||||
@ -49,19 +50,22 @@ class WalletGUIModel()(implicit system: ActorSystem) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
def onGetNewAddress(): Unit = {
|
def onGetNewAddress(): Unit = {
|
||||||
val address = StringProperty("")
|
val addressP = Promise[String]()
|
||||||
|
|
||||||
taskRunner.run(
|
taskRunner.run(
|
||||||
caption = "Get New Address",
|
caption = "Get New Address",
|
||||||
op = {
|
op = {
|
||||||
ConsoleCli.exec(GetNewAddress(None),
|
ConsoleCli.exec(GetNewAddress(None),
|
||||||
GlobalData.consoleCliConfig) match {
|
GlobalData.consoleCliConfig) match {
|
||||||
case Success(commandReturn) => address.value = commandReturn
|
case Success(commandReturn) => addressP.success(commandReturn)
|
||||||
case Failure(err) => throw err
|
case Failure(err) =>
|
||||||
|
addressP.failure(err)
|
||||||
|
throw err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
val address = Await.result(addressP.future, 15.seconds)
|
||||||
GetNewAddressDialog.showAndWait(parentWindow.value, address)
|
GetNewAddressDialog.showAndWait(parentWindow.value, address)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,9 +1,16 @@
|
|||||||
package org.bitcoins.gui.dialog
|
package org.bitcoins.gui.dialog
|
||||||
|
|
||||||
|
import com.google.zxing.BarcodeFormat
|
||||||
|
import com.google.zxing.common.BitMatrix
|
||||||
|
import com.google.zxing.qrcode.QRCodeWriter
|
||||||
|
import javafx.scene.image.WritableImage
|
||||||
|
import javafx.scene.paint.Color
|
||||||
|
import org.bitcoins.core.protocol.BitcoinAddress
|
||||||
import org.bitcoins.gui.GlobalData
|
import org.bitcoins.gui.GlobalData
|
||||||
import scalafx.Includes._
|
import scalafx.Includes._
|
||||||
import scalafx.beans.property.StringProperty
|
import scalafx.beans.property.StringProperty
|
||||||
import scalafx.scene.control.{ButtonType, Dialog, TextArea}
|
import scalafx.scene.control.{ButtonType, Dialog, TextArea}
|
||||||
|
import scalafx.scene.image.{Image, ImageView}
|
||||||
import scalafx.stage.Window
|
import scalafx.stage.Window
|
||||||
|
|
||||||
object GetNewAddressDialog {
|
object GetNewAddressDialog {
|
||||||
@ -27,7 +34,33 @@ object GetNewAddressDialog {
|
|||||||
text <== address
|
text <== address
|
||||||
editable = false
|
editable = false
|
||||||
}
|
}
|
||||||
|
val image: Image =
|
||||||
|
generateQRCode(address = BitcoinAddress.fromString(address.getValue))
|
||||||
|
|
||||||
|
val qrView = new ImageView(image)
|
||||||
|
dialog.graphic = qrView
|
||||||
|
|
||||||
val _ = dialog.showAndWait()
|
val _ = dialog.showAndWait()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private def generateQRCode(address: BitcoinAddress): Image = {
|
||||||
|
val width = 250
|
||||||
|
val height = 250
|
||||||
|
val qrCodeWriter = new QRCodeWriter
|
||||||
|
val bitMatrix: BitMatrix =
|
||||||
|
qrCodeWriter.encode(s"bitcoin:$address",
|
||||||
|
BarcodeFormat.QR_CODE,
|
||||||
|
width,
|
||||||
|
height)
|
||||||
|
|
||||||
|
val writableImage = new WritableImage(width, height)
|
||||||
|
val pixelWriter = writableImage.getPixelWriter
|
||||||
|
0.until(height).map { x =>
|
||||||
|
0.until(width).map { y =>
|
||||||
|
val color = if (bitMatrix.get(x, y)) Color.BLACK else Color.WHITE
|
||||||
|
pixelWriter.setColor(x, y, color)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
writableImage
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -62,6 +62,8 @@ object Deps {
|
|||||||
val sttpV = "1.7.2"
|
val sttpV = "1.7.2"
|
||||||
val codehausV = "3.1.4"
|
val codehausV = "3.1.4"
|
||||||
val scalaJsTimeV = "2.3.0"
|
val scalaJsTimeV = "2.3.0"
|
||||||
|
val zxingV = "3.4.1"
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
object Compile {
|
object Compile {
|
||||||
@ -216,6 +218,12 @@ object Deps {
|
|||||||
|
|
||||||
val dropwizardMetrics =
|
val dropwizardMetrics =
|
||||||
"io.dropwizard.metrics" % "metrics-core" % V.dropwizardMetricsV withSources () withJavadoc ()
|
"io.dropwizard.metrics" % "metrics-core" % V.dropwizardMetricsV withSources () withJavadoc ()
|
||||||
|
|
||||||
|
val zxingCore =
|
||||||
|
"com.google.zxing" % "core" % V.zxingV withSources () withJavadoc ()
|
||||||
|
|
||||||
|
val zxingJ2SE =
|
||||||
|
"com.google.zxing" % "javase" % V.zxingV withSources () withJavadoc ()
|
||||||
}
|
}
|
||||||
|
|
||||||
object Test {
|
object Test {
|
||||||
@ -410,7 +418,9 @@ object Deps {
|
|||||||
|
|
||||||
val gui = List(Compile.akkaActor,
|
val gui = List(Compile.akkaActor,
|
||||||
Compile.breezeViz,
|
Compile.breezeViz,
|
||||||
Compile.scalaFx) ++ Compile.javaFxDeps
|
Compile.scalaFx,
|
||||||
|
Compile.zxingCore,
|
||||||
|
Compile.zxingJ2SE) ++ Compile.javaFxDeps
|
||||||
|
|
||||||
val server = Def.setting {
|
val server = Def.setting {
|
||||||
List(
|
List(
|
||||||
|
Loading…
Reference in New Issue
Block a user