Skip to content

Commit 564a985

Browse files
Merge pull request #4654 from HenrikJannsen/improve-amount-ranges-in-musig-create-offer
Improve amount ranges in musig create offer
2 parents 8ad0ce9 + 555b4b7 commit 564a985

10 files changed

Lines changed: 319 additions & 298 deletions

File tree

apps/desktop/desktop/src/main/java/bisq/desktop/main/content/mu_sig/offer/components/amount_selection/MuSigAmountSelectionController.java

Lines changed: 207 additions & 193 deletions
Large diffs are not rendered by default.

apps/desktop/desktop/src/main/java/bisq/desktop/main/content/mu_sig/offer/components/amount_selection/MuSigAmountSelectionModel.java

Lines changed: 63 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -17,85 +17,100 @@
1717

1818
package bisq.desktop.main.content.mu_sig.offer.components.amount_selection;
1919

20-
import bisq.bisq_easy.BisqEasyTradeAmountLimits;
2120
import bisq.common.market.Market;
2221
import bisq.common.market.MarketRepository;
2322
import bisq.common.monetary.Monetary;
23+
import bisq.common.monetary.MonetaryRange;
2424
import bisq.desktop.common.view.Model;
2525
import bisq.offer.Direction;
2626
import javafx.beans.property.BooleanProperty;
2727
import javafx.beans.property.DoubleProperty;
28-
import javafx.beans.property.IntegerProperty;
2928
import javafx.beans.property.ObjectProperty;
3029
import javafx.beans.property.SimpleBooleanProperty;
3130
import javafx.beans.property.SimpleDoubleProperty;
32-
import javafx.beans.property.SimpleIntegerProperty;
3331
import javafx.beans.property.SimpleObjectProperty;
3432
import javafx.beans.property.SimpleStringProperty;
3533
import javafx.beans.property.StringProperty;
3634
import lombok.Getter;
3735
import lombok.Setter;
3836

37+
import java.util.Map;
38+
3939
@Getter
4040
public class MuSigAmountSelectionModel implements Model {
41-
private final double sliderMin = 0;
42-
private final double sliderMax = 1;
43-
public final int amountBoxWidth = 300;
44-
public final int amountBoxHeight = 120;
41+
static final String SLIDER_TRACK_DEFAULT_COLOR = "-bisq-dark-grey-50";
42+
static final String SLIDER_TRACK_MARKER_COLOR = "-bisq2-green";
43+
static final int RANGE_INPUT_TEXT_MAX_LENGTH = 11;
44+
static final int FIXED_INPUT_TEXT_MAX_LENGTH = 18;
4545

46-
private final ObjectProperty<Monetary> maxOrFixedBaseSideAmount = new SimpleObjectProperty<>();
47-
private final ObjectProperty<Monetary> maxOrFixedQuoteSideAmount = new SimpleObjectProperty<>();
46+
private final Map<Integer, Integer> widthByNumCharsMap;
47+
@Setter
48+
private Market market = MarketRepository.getDefaultBtcFiatMarket();
49+
@Setter
50+
private Direction direction = Direction.BUY;
51+
52+
// Range
53+
private final BooleanProperty useRangeAmount = new SimpleBooleanProperty();
54+
55+
private final ObjectProperty<MonetaryRange> quoteSideTradeAmountLimits = new SimpleObjectProperty<>();
56+
57+
private final ObjectProperty<MonetaryRange> rangeBaseSideAmount = new SimpleObjectProperty<>();
58+
private final ObjectProperty<MonetaryRange> rangeQuoteSideAmount = new SimpleObjectProperty<>();
59+
60+
private final ObjectProperty<Monetary> maxAllowedQuoteSideAmount = new SimpleObjectProperty<>();
61+
private final ObjectProperty<Monetary> maxAllowedBaseSideAmount = new SimpleObjectProperty<>();
62+
63+
private final StringProperty formattedMinRangeAmount = new SimpleStringProperty();
64+
private final StringProperty rangeAmountCode = new SimpleStringProperty();
65+
private final StringProperty formattedMaxAllowedQuoteSideAmount = new SimpleStringProperty();
66+
67+
68+
// Amounts
4869
private final ObjectProperty<Monetary> minBaseSideAmount = new SimpleObjectProperty<>();
4970
private final ObjectProperty<Monetary> minQuoteSideAmount = new SimpleObjectProperty<>();
50-
private final StringProperty spendOrReceiveString = new SimpleStringProperty();
71+
private final ObjectProperty<Monetary> maxOrFixedBaseSideAmount = new SimpleObjectProperty<>();
72+
private final ObjectProperty<Monetary> maxOrFixedQuoteSideAmount = new SimpleObjectProperty<>();
73+
5174

75+
// Slider
5276
private final DoubleProperty maxOrFixedAmountSliderValue = new SimpleDoubleProperty();
5377
private final DoubleProperty minAmountSliderValue = new SimpleDoubleProperty();
5478
private final BooleanProperty maxOrFixedAmountSliderFocus = new SimpleBooleanProperty();
5579
private final BooleanProperty minAmountSliderFocus = new SimpleBooleanProperty();
5680
private final BooleanProperty rangeSliderLowThumbFocus = new SimpleBooleanProperty();
5781
private final BooleanProperty rangeSliderHighThumbFocus = new SimpleBooleanProperty();
58-
private final BooleanProperty isRangeAmountEnabled = new SimpleBooleanProperty();
5982

60-
@Setter
61-
private ObjectProperty<Monetary> minRangeMonetary = new SimpleObjectProperty<>(BisqEasyTradeAmountLimits.DEFAULT_MIN_BTC_TRADE_AMOUNT);
62-
@Setter
63-
private ObjectProperty<Monetary> maxRangeMonetary = new SimpleObjectProperty<>(BisqEasyTradeAmountLimits.DEFAULT_MAX_BTC_TRADE_AMOUNT);
64-
@Setter
65-
private ObjectProperty<Monetary> minRangeBaseSideValue = new SimpleObjectProperty<>();
66-
@Setter
67-
private ObjectProperty<Monetary> maxRangeBaseSideValue = new SimpleObjectProperty<>();
68-
@Setter
69-
private ObjectProperty<Monetary> minRangeQuoteSideValue = new SimpleObjectProperty<>();
70-
@Setter
71-
private ObjectProperty<Monetary> maxRangeQuoteSideValue = new SimpleObjectProperty<>();
72-
private final ObjectProperty<Monetary> maxQuoteAllowedLimitation = new SimpleObjectProperty<>();
73-
private final ObjectProperty<Monetary> maxBaseAllowedLimitation = new SimpleObjectProperty<>();
7483
@Setter
7584
private Monetary leftMarkerQuoteSideValue;
7685
@Setter
7786
private Monetary rightMarkerQuoteSideValue;
7887
private final StringProperty sliderTrackStyle = new SimpleStringProperty();
79-
@Setter
80-
private Market market = MarketRepository.getDefaultBtcFiatMarket();
81-
@Setter
82-
private Direction direction = Direction.BUY;
83-
private final StringProperty description = new SimpleStringProperty();
84-
private final StringProperty minRangeValueAsString = new SimpleStringProperty();
85-
private final StringProperty minRangeCodeAsString = new SimpleStringProperty();
86-
private final StringProperty maxRangeValueLimitationAsString = new SimpleStringProperty();
87-
private final StringProperty maxRangeCodeAsString = new SimpleStringProperty();
88-
private final BooleanProperty showRangeAmountSelection = new SimpleBooleanProperty(false);
89-
private final BooleanProperty allowInvertingBaseAndQuoteCurrencies = new SimpleBooleanProperty(false);
90-
private final IntegerProperty baseAmountSelectionHBoxWidth = new SimpleIntegerProperty(amountBoxWidth);
88+
89+
90+
// Input type
9191
private final BooleanProperty isDefaultAmountInputBtc = new SimpleBooleanProperty(false);
92-
private final BooleanProperty shouldShowMinAmounts = new SimpleBooleanProperty(false);
9392
private final BooleanProperty shouldShowInvertedMinAmounts = new SimpleBooleanProperty(false);
94-
private final BooleanProperty shouldShowMaxOrFixedAmounts = new SimpleBooleanProperty(false);
9593
private final BooleanProperty shouldShowInvertedMaxOrFixedAmounts = new SimpleBooleanProperty(false);
94+
private final BooleanProperty shouldShowMaxOrFixedAmounts = new SimpleBooleanProperty(false);
95+
private final BooleanProperty shouldShowMinAmounts = new SimpleBooleanProperty(false);
96+
private final BooleanProperty showRangeAmountSelection = new SimpleBooleanProperty(false);
97+
98+
// Strings
99+
private final StringProperty spendOrReceiveString = new SimpleStringProperty();
100+
private final StringProperty description = new SimpleStringProperty();
101+
102+
// Layout
103+
private final double sliderMin = 0;
104+
private final double sliderMax = 1;
105+
public final int amountBoxWidth = 300;
106+
public final int amountBoxHeight = 120;
96107
private final BooleanProperty shouldFocusInputTextField = new SimpleBooleanProperty(false);
97108
private final BooleanProperty shouldApplyNewInputTextFontStyle = new SimpleBooleanProperty(false);
98109

110+
public MuSigAmountSelectionModel(Map<Integer, Integer> widthByNumCharsMap) {
111+
this.widthByNumCharsMap = widthByNumCharsMap;
112+
}
113+
99114
void reset() {
100115
maxOrFixedBaseSideAmount.set(null);
101116
maxOrFixedQuoteSideAmount.set(null);
@@ -108,28 +123,22 @@ void reset() {
108123
minAmountSliderFocus.set(false);
109124
rangeSliderLowThumbFocus.set(false);
110125
rangeSliderHighThumbFocus.set(false);
111-
isRangeAmountEnabled.set(false);
112-
minRangeMonetary.set(BisqEasyTradeAmountLimits.DEFAULT_MIN_BTC_TRADE_AMOUNT);
113-
maxRangeMonetary.set(BisqEasyTradeAmountLimits.DEFAULT_MAX_BTC_TRADE_AMOUNT);
114-
minRangeBaseSideValue.set(null);
115-
maxRangeBaseSideValue.set(null);
116-
minRangeQuoteSideValue.set(null);
117-
maxRangeQuoteSideValue.set(null);
118-
maxQuoteAllowedLimitation.set(null);
119-
maxBaseAllowedLimitation.set(null);
126+
useRangeAmount.set(false);
127+
quoteSideTradeAmountLimits.set(null);
128+
rangeBaseSideAmount.set(null);
129+
rangeQuoteSideAmount.set(null);
130+
maxAllowedQuoteSideAmount.set(null);
131+
maxAllowedBaseSideAmount.set(null);
120132
leftMarkerQuoteSideValue = null;
121133
rightMarkerQuoteSideValue = null;
122134
sliderTrackStyle.set(null);
123135
market = MarketRepository.getDefaultBtcFiatMarket();
124136
direction = Direction.BUY;
125137
description.set(null);
126-
minRangeValueAsString.set(null);
127-
minRangeCodeAsString.set(null);
128-
maxRangeValueLimitationAsString.set(null);
129-
maxRangeCodeAsString.set(null);
138+
formattedMinRangeAmount.set(null);
139+
rangeAmountCode.set(null);
140+
formattedMaxAllowedQuoteSideAmount.set(null);
130141
showRangeAmountSelection.set(false);
131-
allowInvertingBaseAndQuoteCurrencies.set(false);
132-
baseAmountSelectionHBoxWidth.set(amountBoxWidth);
133142
isDefaultAmountInputBtc.set(false);
134143
shouldShowMinAmounts.set(false);
135144
shouldShowInvertedMinAmounts.set(false);

apps/desktop/desktop/src/main/java/bisq/desktop/main/content/mu_sig/offer/components/amount_selection/MuSigAmountSelectionView.java

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public class MuSigAmountSelectionView extends View<VBox, MuSigAmountSelectionMod
7575
private final ChangeListener<Number> maxOrFixedAmountSliderValueListener, minAmountSliderValueListener;
7676
private final BisqMenuItem flipCurrenciesButton;
7777
private final RangeSlider rangeAmountSlider;
78-
private Subscription shouldFocusInputTextFieldPin, sliderTrackStylePin, isRangeAmountEnabledPin,
78+
private Subscription shouldFocusInputTextFieldPin, sliderTrackStylePin, useRangeAmountPin,
7979
shouldApplyNewInputTextFontStylePin;
8080

8181
MuSigAmountSelectionView(MuSigAmountSelectionModel model,
@@ -131,6 +131,9 @@ public class MuSigAmountSelectionView extends View<VBox, MuSigAmountSelectionMod
131131
baseAmountSelectionHBox = new HBox(minBaseAmountRoot, invertedMinQuoteAmountRoot, baseAmountSeparator,
132132
maxOrFixedBaseAmountRoot, invertedMaxOrFixedQuoteAmountRoot);
133133
baseAmountSelectionHBox.getStyleClass().add("base-amount");
134+
baseAmountSelectionHBox.setMinWidth(model.getAmountBoxWidth() - 10);
135+
baseAmountSelectionHBox.setMaxWidth(model.getAmountBoxWidth() - 10);
136+
134137

135138
flipCurrenciesButton = new BisqMenuItem("flip-fields-arrows-green", "flip-fields-arrows-white");
136139
flipCurrenciesButton.setTooltip(Res.get("muSig.offer.create.amount.selection.flipCurrenciesButton.tooltip"));
@@ -216,11 +219,11 @@ public class MuSigAmountSelectionView extends View<VBox, MuSigAmountSelectionMod
216219

217220
@Override
218221
protected void onViewAttached() {
219-
isRangeAmountEnabledPin = EasyBind.subscribe(model.getIsRangeAmountEnabled(), isRangeAmountEnabled -> {
222+
useRangeAmountPin = EasyBind.subscribe(model.getUseRangeAmount(), useRangeAmount -> {
220223
root.getStyleClass().clear();
221224
root.getStyleClass().add("amount-selection");
222-
root.getStyleClass().add(isRangeAmountEnabled ? "range-amount" : "fixed-amount");
223-
VBox.setMargin(sliderIndicators, isRangeAmountEnabled ? SLIDER_INDICATORS_RANGE_MARGIN : SLIDER_INDICATORS_FIXED_MARGIN);
225+
root.getStyleClass().add(useRangeAmount ? "range-amount" : "fixed-amount");
226+
VBox.setMargin(sliderIndicators, useRangeAmount ? SLIDER_INDICATORS_RANGE_MARGIN : SLIDER_INDICATORS_FIXED_MARGIN);
224227
applyTextInputFontStyle(true);
225228
});
226229
sliderTrackStylePin = EasyBind.subscribe(model.getSliderTrackStyle(), trackStyle -> {
@@ -240,14 +243,14 @@ protected void onViewAttached() {
240243
fixedAmountSlider.valueProperty().addListener(maxOrFixedAmountSliderValueListener);
241244
model.getMaxOrFixedAmountSliderFocus().bind(fixedAmountSlider.focusedProperty());
242245
description.textProperty().bind(model.getDescription());
243-
minRangeValue.textProperty().bind(model.getMinRangeValueAsString());
244-
minRangeCode.textProperty().bind(model.getMinRangeCodeAsString());
245-
maxRangeValue.textProperty().bind(model.getMaxRangeValueLimitationAsString());
246-
maxRangeCode.textProperty().bind(model.getMaxRangeCodeAsString());
247-
quoteAmountSeparator.visibleProperty().bind(model.getIsRangeAmountEnabled());
248-
quoteAmountSeparator.managedProperty().bind(model.getIsRangeAmountEnabled());
249-
baseAmountSeparator.visibleProperty().bind(model.getIsRangeAmountEnabled());
250-
baseAmountSeparator.managedProperty().bind(model.getIsRangeAmountEnabled());
246+
minRangeValue.textProperty().bind(model.getFormattedMinRangeAmount());
247+
minRangeCode.textProperty().bind(model.getRangeAmountCode());
248+
maxRangeValue.textProperty().bind(model.getFormattedMaxAllowedQuoteSideAmount());
249+
maxRangeCode.textProperty().bind(model.getRangeAmountCode());
250+
quoteAmountSeparator.visibleProperty().bind(model.getUseRangeAmount());
251+
quoteAmountSeparator.managedProperty().bind(model.getUseRangeAmount());
252+
baseAmountSeparator.visibleProperty().bind(model.getUseRangeAmount());
253+
baseAmountSeparator.managedProperty().bind(model.getUseRangeAmount());
251254
minQuoteAmountRoot.visibleProperty().bind(model.getShouldShowMinAmounts());
252255
minQuoteAmountRoot.managedProperty().bind(model.getShouldShowMinAmounts());
253256
minBaseAmountRoot.visibleProperty().bind(model.getShouldShowMinAmounts());
@@ -256,14 +259,10 @@ protected void onViewAttached() {
256259
invertedMinQuoteAmountRoot.managedProperty().bind(model.getShouldShowInvertedMinAmounts());
257260
invertedMinBaseAmountRoot.visibleProperty().bind(model.getShouldShowInvertedMinAmounts());
258261
invertedMinBaseAmountRoot.managedProperty().bind(model.getShouldShowInvertedMinAmounts());
259-
rangeAmountSlider.visibleProperty().bind(model.getIsRangeAmountEnabled());
260-
rangeAmountSlider.managedProperty().bind(model.getIsRangeAmountEnabled());
261-
fixedAmountSlider.visibleProperty().bind(model.getIsRangeAmountEnabled().not());
262-
fixedAmountSlider.managedProperty().bind(model.getIsRangeAmountEnabled().not());
263-
flipCurrenciesButton.visibleProperty().bind(model.getAllowInvertingBaseAndQuoteCurrencies());
264-
flipCurrenciesButton.managedProperty().bind(model.getAllowInvertingBaseAndQuoteCurrencies());
265-
baseAmountSelectionHBox.minWidthProperty().bind(model.getBaseAmountSelectionHBoxWidth());
266-
baseAmountSelectionHBox.maxWidthProperty().bind(model.getBaseAmountSelectionHBoxWidth());
262+
rangeAmountSlider.visibleProperty().bind(model.getUseRangeAmount());
263+
rangeAmountSlider.managedProperty().bind(model.getUseRangeAmount());
264+
fixedAmountSlider.visibleProperty().bind(model.getUseRangeAmount().not());
265+
fixedAmountSlider.managedProperty().bind(model.getUseRangeAmount().not());
267266
maxOrFixedBaseAmountRoot.visibleProperty().bind(model.getShouldShowMaxOrFixedAmounts());
268267
maxOrFixedBaseAmountRoot.managedProperty().bind(model.getShouldShowMaxOrFixedAmounts());
269268
maxOrFixedQuoteAmountRoot.visibleProperty().bind(model.getShouldShowMaxOrFixedAmounts());
@@ -286,7 +285,7 @@ protected void onViewAttached() {
286285

287286
@Override
288287
protected void onViewDetached() {
289-
isRangeAmountEnabledPin.unsubscribe();
288+
useRangeAmountPin.unsubscribe();
290289
sliderTrackStylePin.unsubscribe();
291290
shouldFocusInputTextFieldPin.unsubscribe();
292291
shouldApplyNewInputTextFontStylePin.unsubscribe();
@@ -321,10 +320,6 @@ protected void onViewDetached() {
321320
rangeAmountSlider.managedProperty().unbind();
322321
fixedAmountSlider.visibleProperty().unbind();
323322
fixedAmountSlider.managedProperty().unbind();
324-
flipCurrenciesButton.visibleProperty().unbind();
325-
flipCurrenciesButton.managedProperty().unbind();
326-
baseAmountSelectionHBox.minWidthProperty().unbind();
327-
baseAmountSelectionHBox.maxWidthProperty().unbind();
328323
maxOrFixedBaseAmountRoot.visibleProperty().unbind();
329324
maxOrFixedBaseAmountRoot.managedProperty().unbind();
330325
maxOrFixedQuoteAmountRoot.visibleProperty().unbind();

0 commit comments

Comments
 (0)