Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Apply changes to trade wizard #2822

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading