14 changed files with 340 additions and 50 deletions
@ -0,0 +1,137 @@ |
|||
package com.sparrowwallet.sparrow.control; |
|||
|
|||
import com.sparrowwallet.sparrow.wallet.TransactionEntry; |
|||
import javafx.animation.*; |
|||
import javafx.beans.property.*; |
|||
import javafx.geometry.Pos; |
|||
import javafx.scene.Group; |
|||
import javafx.scene.layout.StackPane; |
|||
import javafx.scene.paint.Color; |
|||
import javafx.scene.shape.Arc; |
|||
import javafx.scene.shape.ArcType; |
|||
import javafx.scene.shape.Circle; |
|||
import javafx.scene.shape.Line; |
|||
import javafx.util.Duration; |
|||
|
|||
public class ConfirmationProgressIndicator extends StackPane { |
|||
private final Group confirmationGroup; |
|||
private final Arc arc; |
|||
private final Line downTickLine; |
|||
private final Line upTickLine; |
|||
|
|||
public ConfirmationProgressIndicator(int confirmations) { |
|||
Circle circle = new Circle(7, 7, 7); |
|||
circle.setFill(Color.TRANSPARENT); |
|||
circle.getStyleClass().add("confirmation-progress-circle"); |
|||
|
|||
arc = new Arc(7, 7, 7, 7, 90, getDegrees(confirmations)); |
|||
arc.setType(ArcType.ROUND); |
|||
arc.getStyleClass().add("confirmation-progress-arc"); |
|||
|
|||
downTickLine = new Line(4, 8, 4, 8); |
|||
downTickLine.setStrokeWidth(1.0); |
|||
downTickLine.setOpacity(0); |
|||
downTickLine.getStyleClass().add("confirmation-progress-tick"); |
|||
upTickLine = new Line(6, 10, 6, 10); |
|||
upTickLine.setStrokeWidth(1.0); |
|||
upTickLine.setOpacity(0); |
|||
upTickLine.getStyleClass().add("confirmation-progress-tick"); |
|||
|
|||
confirmationGroup = new Group(circle, arc, downTickLine, upTickLine); |
|||
getStyleClass().add("confirmation-progress"); |
|||
|
|||
setAlignment(Pos.CENTER); |
|||
getChildren().addAll(confirmationGroup); |
|||
|
|||
confirmationsProperty().set(confirmations); |
|||
confirmationsProperty().addListener((observable, oldValue, newValue) -> { |
|||
if(!oldValue.equals(newValue)) { |
|||
SequentialTransition sequence = new SequentialTransition(); |
|||
|
|||
Timeline arcLengthTimeline = new Timeline(); |
|||
KeyValue arcLengthValue = new KeyValue(arc.lengthProperty(), getDegrees(newValue.intValue())); |
|||
KeyFrame arcLengthFrame = new KeyFrame(Duration.millis(1000), arcLengthValue); |
|||
arcLengthTimeline.getKeyFrames().add(arcLengthFrame); |
|||
sequence.getChildren().add(arcLengthTimeline); |
|||
|
|||
if(newValue.intValue() == TransactionEntry.BLOCKS_TO_CONFIRM) { |
|||
Timeline arcRadiusTimeline = new Timeline(); |
|||
KeyValue arcRadiusXValue = new KeyValue(arc.radiusXProperty(), 0.0); |
|||
KeyValue arcRadiusYValue = new KeyValue(arc.radiusYProperty(), 0.0); |
|||
KeyFrame arcRadiusFrame = new KeyFrame(Duration.millis(500), arcRadiusXValue, arcRadiusYValue); |
|||
arcRadiusTimeline.getKeyFrames().add(arcRadiusFrame); |
|||
sequence.getChildren().add(arcRadiusTimeline); |
|||
|
|||
FadeTransition downTickFadeIn = new FadeTransition(Duration.millis(50), downTickLine); |
|||
downTickFadeIn.setFromValue(0); |
|||
downTickFadeIn.setToValue(1); |
|||
sequence.getChildren().add(downTickFadeIn); |
|||
|
|||
Timeline downTickLineTimeline = new Timeline(); |
|||
KeyValue downTickLineX = new KeyValue(downTickLine.endXProperty(), 6); |
|||
KeyValue downTickLineY = new KeyValue(downTickLine.endYProperty(), 10); |
|||
KeyFrame downTickLineFrame = new KeyFrame(Duration.millis(125), downTickLineX, downTickLineY); |
|||
downTickLineTimeline.getKeyFrames().add(downTickLineFrame); |
|||
sequence.getChildren().add(downTickLineTimeline); |
|||
|
|||
FadeTransition upTickFadeIn = new FadeTransition(Duration.millis(50), upTickLine); |
|||
upTickFadeIn.setFromValue(0); |
|||
upTickFadeIn.setToValue(1); |
|||
sequence.getChildren().add(upTickFadeIn); |
|||
|
|||
Timeline upTickLineTimeline = new Timeline(); |
|||
KeyValue upTickLineX = new KeyValue(upTickLine.endXProperty(), 10); |
|||
KeyValue upTickLineY = new KeyValue(upTickLine.endYProperty(), 4); |
|||
KeyFrame upTickLineFrame = new KeyFrame(Duration.millis(250), upTickLineX, upTickLineY); |
|||
upTickLineTimeline.getKeyFrames().add(upTickLineFrame); |
|||
sequence.getChildren().add(upTickLineTimeline); |
|||
|
|||
FadeTransition groupFadeOut = new FadeTransition(Duration.minutes(1), confirmationGroup); |
|||
groupFadeOut.setFromValue(1); |
|||
groupFadeOut.setToValue(0); |
|||
sequence.getChildren().add(groupFadeOut); |
|||
} |
|||
|
|||
sequence.play(); |
|||
} |
|||
}); |
|||
} |
|||
|
|||
private static double getDegrees(int confirmations) { |
|||
int requiredConfirmations = TransactionEntry.BLOCKS_TO_CONFIRM; |
|||
return ((double)Math.min(confirmations, requiredConfirmations)/ requiredConfirmations) * -360d; |
|||
} |
|||
|
|||
/** |
|||
* Defines the number of confirmations |
|||
*/ |
|||
private IntegerProperty confirmations; |
|||
|
|||
public final void setConfirmations(int value) { |
|||
if(confirmations != null || value != 0) { |
|||
confirmationsProperty().set(value); |
|||
} |
|||
} |
|||
|
|||
public final int getConfirmations() { |
|||
return confirmations == null ? 0 : confirmations.get(); |
|||
} |
|||
|
|||
public final IntegerProperty confirmationsProperty() { |
|||
if(confirmations == null) { |
|||
confirmations = new IntegerPropertyBase(0) { |
|||
|
|||
@Override |
|||
public Object getBean() { |
|||
return ConfirmationProgressIndicator.this; |
|||
} |
|||
|
|||
@Override |
|||
public String getName() { |
|||
return "confirmations"; |
|||
} |
|||
}; |
|||
} |
|||
return confirmations; |
|||
} |
|||
} |
@ -0,0 +1,17 @@ |
|||
package com.sparrowwallet.sparrow.event; |
|||
|
|||
import com.sparrowwallet.drongo.wallet.Wallet; |
|||
import com.sparrowwallet.sparrow.wallet.Entry; |
|||
|
|||
public class WalletEntryLabelChangedEvent extends WalletChangedEvent { |
|||
private final Entry entry; |
|||
|
|||
public WalletEntryLabelChangedEvent(Wallet wallet, Entry entry) { |
|||
super(wallet); |
|||
this.entry = entry; |
|||
} |
|||
|
|||
public Entry getEntry() { |
|||
return entry; |
|||
} |
|||
} |
Loading…
Reference in new issue