Skip to content

Commit

Permalink
Merge pull request #2822 from HenrikJannsen/apply-changes-to-trade-wi…
Browse files Browse the repository at this point in the history
…zard

Apply changes to trade wizard
  • Loading branch information
HenrikJannsen authored Sep 13, 2024
2 parents ed9c038 + cd1eb71 commit 002ce77
Show file tree
Hide file tree
Showing 19 changed files with 556 additions and 235 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@
import org.fxmisc.easybind.EasyBind;
import org.fxmisc.easybind.Subscription;

import java.util.Optional;

import static com.google.common.base.Preconditions.checkArgument;

@Slf4j
Expand Down Expand Up @@ -93,12 +95,16 @@ public void setMinMaxRange(Monetary minRangeValue, Monetary maxRangeValue) {
controller.setMinMaxRange(minRangeValue, maxRangeValue);
}

public void setReputationBasedQuoteSideAmount(Monetary reputationBasedQuoteSideAmount) {
controller.setReputationBasedQuoteSideAmount(reputationBasedQuoteSideAmount);
public void setLeftMarkerQuoteSideValue(Monetary quoteSideAmount) {
controller.setLeftMarkerQuoteSideValue(quoteSideAmount);
}

public void setRightMarkerQuoteSideValue(Monetary quoteSideAmount) {
controller.setRightMarkerQuoteSideValue(quoteSideAmount);
}

public Monetary getReputationBasedQuoteSideAmount() {
return controller.model.getReputationBasedQuoteSideAmount();
return controller.model.getRightMarkerQuoteSideValue();
}

public void applyReputationBasedQuoteSideAmount() {
Expand Down Expand Up @@ -128,6 +134,9 @@ public void setDescription(String description) {
}

private static class Controller implements bisq.desktop.common.view.Controller {
private static final String SLIDER_TRACK_DEFAULT_COLOR = "-bisq-dark-grey-50";
private static final String SLIDER_TRACK_MARKER_COLOR = "-bisq2-green";

private final Model model;
@Getter
private final View view;
Expand Down Expand Up @@ -243,13 +252,18 @@ public void setMinMaxRange(Monetary minRangeValue, Monetary maxRangeValue) {
applyInitialRangeValues();
}

public void setReputationBasedQuoteSideAmount(Monetary reputationBasedQuoteSideAmount) {
model.setReputationBasedQuoteSideAmount(reputationBasedQuoteSideAmount);
public void setLeftMarkerQuoteSideValue(Monetary quoteSideAmount) {
model.setLeftMarkerQuoteSideValue(quoteSideAmount);
applySliderTrackStyle();
}

public void setRightMarkerQuoteSideValue(Monetary quoteSideAmount) {
model.setRightMarkerQuoteSideValue(quoteSideAmount);
applySliderTrackStyle();
}

public void applyReputationBasedQuoteSideAmount() {
quoteSideAmountInput.setAmount(model.getReputationBasedQuoteSideAmount());
quoteSideAmountInput.setAmount(model.getRightMarkerQuoteSideValue());
}

public void setQuote(PriceQuote priceQuote) {
Expand Down Expand Up @@ -286,7 +300,7 @@ public void onActivate() {
quoteSideAmountInput.setAmount(exactAmount.round(0));
} else {
log.warn("price.quoteProperty().get() is null. We use a fiat value of 100 as default value.");
Fiat defaultQuoteSideAmount = Fiat.fromValue(1000000, model.getMarket().getQuoteCurrencyCode());
Fiat defaultQuoteSideAmount = Fiat.fromFaceValue(100, model.getMarket().getQuoteCurrencyCode());
quoteSideAmountInput.setAmount(defaultQuoteSideAmount);
}
} else {
Expand Down Expand Up @@ -372,47 +386,40 @@ private void applyInitialRangeValues() {
boolean isMinRangeMonetaryFiat = FiatCurrencyRepository.getCurrencyByCodeMap().containsKey(minRangeMonetary.getCode());
boolean isMaxRangeMonetaryFiat = FiatCurrencyRepository.getCurrencyByCodeMap().containsKey(maxRangeMonetary.getCode());

if (model.getMinRangeBaseSideValue().get() == null) {
Monetary minRangeMonetaryAsCoin = !isMinRangeMonetaryFiat ?
minRangeMonetary :
priceQuote.toBaseSideMonetary(minRangeMonetary);
model.getMinRangeBaseSideValue().set(minRangeMonetaryAsCoin);
if (!model.useQuoteCurrencyForMinMaxRange) {
model.getMinRangeValueAsString().set(Res.get("bisqEasy.component.amount.minRangeValue",
AmountFormatter.formatAmountWithCode(minRangeMonetaryAsCoin)));
}
Monetary minRangeMonetaryAsCoin = !isMinRangeMonetaryFiat ?
minRangeMonetary :
priceQuote.toBaseSideMonetary(minRangeMonetary);
model.getMinRangeBaseSideValue().set(minRangeMonetaryAsCoin);
if (!model.useQuoteCurrencyForMinMaxRange) {
model.getMinRangeValueAsString().set(Res.get("bisqEasy.component.amount.minRangeValue",
AmountFormatter.formatAmountWithCode(minRangeMonetaryAsCoin)));
}
if (model.getMaxRangeBaseSideValue().get() == null) {
Monetary maxRangeMonetaryAsCoin = !isMaxRangeMonetaryFiat ?
maxRangeMonetary :
priceQuote.toBaseSideMonetary(maxRangeMonetary);
model.getMaxRangeBaseSideValue().set(maxRangeMonetaryAsCoin);
if (!model.useQuoteCurrencyForMinMaxRange) {
model.getMaxRangeValueAsString().set(Res.get("bisqEasy.component.amount.maxRangeValue",
AmountFormatter.formatAmountWithCode(maxRangeMonetaryAsCoin)));
}

Monetary maxRangeMonetaryAsCoin = !isMaxRangeMonetaryFiat ?
maxRangeMonetary :
priceQuote.toBaseSideMonetary(maxRangeMonetary);
model.getMaxRangeBaseSideValue().set(maxRangeMonetaryAsCoin);
if (!model.useQuoteCurrencyForMinMaxRange) {
model.getMaxRangeValueAsString().set(Res.get("bisqEasy.component.amount.maxRangeValue",
AmountFormatter.formatAmountWithCode(maxRangeMonetaryAsCoin)));
}

if (model.getMinRangeQuoteSideValue().get() == null) {
Monetary minRangeMonetaryAsFiat = isMinRangeMonetaryFiat ?
minRangeMonetary :
priceQuote.toQuoteSideMonetary(minRangeMonetary).round(0);
model.getMinRangeQuoteSideValue().set(minRangeMonetaryAsFiat);
if (model.useQuoteCurrencyForMinMaxRange) {
model.getMinRangeValueAsString().set(Res.get("bisqEasy.component.amount.minRangeValue",
AmountFormatter.formatAmountWithCode(minRangeMonetaryAsFiat)));
}
Monetary minRangeMonetaryAsFiat = isMinRangeMonetaryFiat ?
minRangeMonetary :
priceQuote.toQuoteSideMonetary(minRangeMonetary).round(0);
model.getMinRangeQuoteSideValue().set(minRangeMonetaryAsFiat);
if (model.useQuoteCurrencyForMinMaxRange) {
model.getMinRangeValueAsString().set(Res.get("bisqEasy.component.amount.minRangeValue",
AmountFormatter.formatAmountWithCode(minRangeMonetaryAsFiat)));
}

if (model.getMaxRangeQuoteSideValue().get() == null) {
Monetary maxRangeMonetaryAsFiat = isMaxRangeMonetaryFiat ?
maxRangeMonetary :
priceQuote.toQuoteSideMonetary(maxRangeMonetary).round(0);
model.getMaxRangeQuoteSideValue().set(maxRangeMonetaryAsFiat);
if (model.useQuoteCurrencyForMinMaxRange) {
model.getMaxRangeValueAsString().set(Res.get("bisqEasy.component.amount.maxRangeValue",
AmountFormatter.formatAmountWithCode(maxRangeMonetaryAsFiat)));
}
Monetary maxRangeMonetaryAsFiat = isMaxRangeMonetaryFiat ?
maxRangeMonetary :
priceQuote.toQuoteSideMonetary(maxRangeMonetary).round(0);
model.getMaxRangeQuoteSideValue().set(maxRangeMonetaryAsFiat);
if (model.useQuoteCurrencyForMinMaxRange) {
model.getMaxRangeValueAsString().set(Res.get("bisqEasy.component.amount.maxRangeValue",
AmountFormatter.formatAmountWithCode(maxRangeMonetaryAsFiat)));
}

applySliderTrackStyle();
Expand All @@ -421,22 +428,37 @@ private void applyInitialRangeValues() {
private void applySliderTrackStyle() {
Monetary minRangeMonetary = model.getMinRangeQuoteSideValue().get();
Monetary maxRangeMonetary = model.getMaxRangeQuoteSideValue().get();
Monetary reputationBasedQuoteSideAmount = model.getReputationBasedQuoteSideAmount();
if (reputationBasedQuoteSideAmount != null &&
minRangeMonetary != null &&
maxRangeMonetary != null) {
double repAmount = reputationBasedQuoteSideAmount.getValue() - minRangeMonetary.getValue();
double range = model.getMaxRangeMonetary().get().getValue() - minRangeMonetary.getValue();
double reputationBasedAmountOnSlider = range != 0 ? repAmount / range : 0;
String rightSideColor = "-bisq-dark-grey-50";
model.getSliderTrackStyle().set(String.format(
"-track-color: linear-gradient(to right, " +
"-bisq2-green 0%%, " +
"-bisq2-green %1$.1f%%, " +
rightSideColor + " %1$.1f%%, " +
rightSideColor + " 100%%);",
100 * reputationBasedAmountOnSlider));
if (minRangeMonetary == null || maxRangeMonetary == null) {
return;
}
long minRangeMonetaryValue = minRangeMonetary.getValue();
long maxRangeMonetaryValue = maxRangeMonetary.getValue();
double range = maxRangeMonetaryValue - minRangeMonetaryValue;

// If left value is not set we use minRange
// If left value is set but right value not set we don't show any marker
Monetary markerQuoteSideValue = model.getLeftMarkerQuoteSideValue();
long leftMarkerQuoteSideValue = Optional.ofNullable(markerQuoteSideValue).orElse(minRangeMonetary).getValue();
double left = leftMarkerQuoteSideValue - minRangeMonetaryValue;
double leftPercentage = range != 0 ? 100 * left / range : 0;

long rightMarkerQuoteSideValue = Optional.ofNullable(model.getRightMarkerQuoteSideValue()).orElse(minRangeMonetary).getValue();
double right = rightMarkerQuoteSideValue - minRangeMonetaryValue;
double rightPercentage = range != 0 ? 100 * right / range : 0;

// E.g.: -bisq-dark-grey-50 0%, -bisq-dark-grey-50 30.0%, -bisq2-green 30.0%, -bisq2-green 60.0%, -bisq-dark-grey-50 60.0%, -bisq-dark-grey-50 100%)
String segments = String.format(
SLIDER_TRACK_DEFAULT_COLOR + " 0%%, " +
SLIDER_TRACK_DEFAULT_COLOR + " %1$.1f%%, " +

SLIDER_TRACK_MARKER_COLOR + " %1$.1f%%, " +
SLIDER_TRACK_MARKER_COLOR + " %2$.1f%%, " +

SLIDER_TRACK_DEFAULT_COLOR + " %2$.1f%%, " +
SLIDER_TRACK_DEFAULT_COLOR + " 100%%)",
leftPercentage, rightPercentage);
String style = "-track-color: linear-gradient(to right, " + segments + ";";
model.getSliderTrackStyle().set(style);
}

@Override
Expand All @@ -453,6 +475,8 @@ public void onDeactivate() {
maxRangeCustomValuePin.unsubscribe();
baseSideAmountValidPin.unsubscribe();
quoteSideAmountValidPin.unsubscribe();
model.setLeftMarkerQuoteSideValue(null);
model.setRightMarkerQuoteSideValue(null);
}

private void setQuoteFromBase() {
Expand Down Expand Up @@ -507,7 +531,9 @@ private static class Model implements bisq.desktop.common.view.Model {
@Setter
private ObjectProperty<Monetary> maxRangeQuoteSideValue = new SimpleObjectProperty<>();
@Setter
private Monetary reputationBasedQuoteSideAmount;
private Monetary leftMarkerQuoteSideValue;
@Setter
private Monetary rightMarkerQuoteSideValue;
private final StringProperty sliderTrackStyle = new SimpleStringProperty();
@Setter
private Market market = MarketRepository.getDefault();
Expand All @@ -529,6 +555,8 @@ void reset() {
sliderFocus.set(false);
market = MarketRepository.getDefault();
direction = Direction.BUY;
leftMarkerQuoteSideValue = null;
rightMarkerQuoteSideValue = null;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import bisq.common.currency.Market;
import bisq.common.monetary.Monetary;
import bisq.common.util.MathUtils;
import bisq.common.util.StringUtils;
import bisq.desktop.components.controls.validator.NumberValidator;
import bisq.presentation.formatters.AmountFormatter;
import bisq.presentation.parser.AmountParser;
Expand Down Expand Up @@ -79,7 +80,7 @@ public void requestFocus() {

protected static class Controller implements bisq.desktop.common.view.Controller {
@Setter
protected Model model;
protected Model model;
@Getter
@Setter
protected View view;
Expand Down Expand Up @@ -111,7 +112,7 @@ private void onFocusChange(boolean hasFocus) {
}

private void onAmount(String value) {
if (isValueOrCodeNull(value, model.code.get())) {
if (StringUtils.isEmpty(value) || StringUtils.isEmpty(model.code.get())) {
setAmountInvalid();
return;
}
Expand All @@ -124,9 +125,6 @@ private void onAmount(String value) {
updateAmountIfNotFocused(value);
}

private boolean isValueOrCodeNull(String value, String code) {
return value == null || code == null;
}

private void handleInvalidValue() {
if (!model.hasFocus) {
Expand Down Expand Up @@ -219,7 +217,9 @@ private void onFocusChanged(ObservableValue<? extends Boolean> observable, Boole
}
}

private void onAmountChanged(ObservableValue<? extends Monetary> observable, Monetary oldValue, Monetary newValue) {
private void onAmountChanged(ObservableValue<? extends Monetary> observable,
Monetary oldValue,
Monetary newValue) {
applyAmount(newValue);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ public void init(BisqEasyOffer bisqEasyOffer, Optional<Monetary> optionalReputat
maxAmount = reputationBasedQuoteSideAmount.isGreaterThan(offersQuoteSideMaxOrFixedAmount)
? offersQuoteSideMaxOrFixedAmount
: reputationBasedQuoteSideAmount;
amountComponent.setReputationBasedQuoteSideAmount(maxAmount);
amountComponent.setRightMarkerQuoteSideValue(maxAmount);
applyQuoteSideMinMaxRange(quoteSideMinAmount, maxAmount);

long sellersScore = reputationService.getReputationScore(userIdentityService.getSelectedUserIdentity().getUserProfile()).getTotalScore();
Expand Down Expand Up @@ -186,7 +186,7 @@ private void applyQuoteSideMinMaxRange(Monetary minRangeValue, Monetary maxRange

if (reputationBasedQuoteSideAmount.isLessThan(maxRangeValue)) {
model.getIsAmountLimitInfoVisible().set(true);
amountComponent.setReputationBasedQuoteSideAmount(reputationBasedQuoteSideAmount);
amountComponent.setRightMarkerQuoteSideValue(reputationBasedQuoteSideAmount);
amountComponent.setQuoteSideAmount(reputationBasedQuoteSideAmount);
String formattedAmount = AmountFormatter.formatAmountWithCode(reputationBasedQuoteSideAmount);
model.getAmountLimitInfoOverlayInfo().set(Res.get("bisqEasy.takeOffer.amount.buyer.limitInfo.overlay.info", sellersReputationScore, formattedAmount) + "\n\n");
Expand All @@ -209,7 +209,7 @@ private void applyQuoteSideMinMaxRange(Monetary minRangeValue, Monetary maxRange
BisqEasyTradeAmountLimits.getReputationBasedQuoteSideAmount(marketPriceService, bisqEasyOffer.getMarket(), myReputationScore)
.ifPresent(myReputationBasedQuoteSideAmount -> {
model.getIsAmountHyperLinkDisabled().set(myReputationBasedQuoteSideAmount.isGreaterThan(maxRangeValue));
amountComponent.setReputationBasedQuoteSideAmount(myReputationBasedQuoteSideAmount);
amountComponent.setRightMarkerQuoteSideValue(myReputationBasedQuoteSideAmount);
String formattedAmount = AmountFormatter.formatAmountWithCode(myReputationBasedQuoteSideAmount);
model.getIsAmountLimitInfoVisible().set(true);
model.getAmountLimitInfo().set(Res.get("bisqEasy.tradeWizard.amount.seller.limitInfo", myReputationScore));
Expand Down
Loading

0 comments on commit 002ce77

Please sign in to comment.