Skip to content

Commit

Permalink
Merge pull request #4420 from stejbac/fix-blank-offer-book-price-cells
Browse files Browse the repository at this point in the history
Fix intermittent blank price cells in offer book view
  • Loading branch information
sqrrm committed Aug 31, 2020
2 parents c551adb + 23688db commit 4d32da7
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 78 deletions.
Expand Up @@ -50,7 +50,6 @@
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;

import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
Expand Down Expand Up @@ -127,14 +126,12 @@ class OfferBookChartViewModel extends ActivatableViewModel {
fillTradeCurrencies();
};

currenciesUpdatedListener = new ChangeListener<>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
if (!isAnyPricePresent()) {
offerBook.fillOfferBookListItems();
updateChartData();
priceFeedService.updateCounterProperty().removeListener(currenciesUpdatedListener);
}
currenciesUpdatedListener = (observable, oldValue, newValue) -> {
if (!isAnyPriceAbsent()) {
offerBook.fillOfferBookListItems();
updateChartData();
var self = this;
priceFeedService.updateCounterProperty().removeListener(self.currenciesUpdatedListener);
}
};

Expand Down Expand Up @@ -163,7 +160,7 @@ protected void activate() {
fillTradeCurrencies();
updateChartData();

if (isAnyPricePresent())
if (isAnyPriceAbsent())
priceFeedService.updateCounterProperty().addListener(currenciesUpdatedListener);

syncPriceFeedCurrency();
Expand Down Expand Up @@ -271,7 +268,7 @@ private void syncPriceFeedCurrency() {
priceFeedService.setCurrencyCode(getCurrencyCode());
}

private boolean isAnyPricePresent() {
private boolean isAnyPriceAbsent() {
return offerBookListItems.stream().anyMatch(item -> item.getOffer().getPrice() == null);
}

Expand All @@ -291,11 +288,11 @@ private void updateChartData() {
Comparator<Offer> offerAmountComparator = Comparator.comparing(Offer::getAmount).reversed();

var buyOfferSortComparator =
offerPriceComparator.reversed() // Buy offers, as opposed to sell offers, are primarily sorted from high price to low.
.thenComparing(offerAmountComparator);
offerPriceComparator.reversed() // Buy offers, as opposed to sell offers, are primarily sorted from high price to low.
.thenComparing(offerAmountComparator);
var sellOfferSortComparator =
offerPriceComparator
.thenComparing(offerAmountComparator);
offerPriceComparator
.thenComparing(offerAmountComparator);

List<Offer> allBuyOffers = offerBookListItems.stream()
.map(OfferBookListItem::getOffer)
Expand Down
Expand Up @@ -71,7 +71,6 @@
import de.jensd.fx.glyphs.GlyphIcons;
import de.jensd.fx.glyphs.materialdesignicons.MaterialDesignIcon;

import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ContentDisplay;
Expand Down Expand Up @@ -731,66 +730,33 @@ public void updateItem(final OfferBookListItem item, boolean empty) {
return column;
}

private ObservableValue<OfferBookListItem> asPriceDependentObservable(OfferBookListItem item) {
return item.getOffer().isUseMarketBasedPrice()
? EasyBind.map(model.priceFeedService.updateCounterProperty(), n -> item)
: new ReadOnlyObjectWrapper<>(item);
}

private AutoTooltipTableColumn<OfferBookListItem, OfferBookListItem> getPriceColumn() {
AutoTooltipTableColumn<OfferBookListItem, OfferBookListItem> column = new AutoTooltipTableColumn<>("") {
{
setMinWidth(100);
}
};
column.getStyleClass().add("number-column");
column.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
column.setCellValueFactory(offer -> asPriceDependentObservable(offer.getValue()));
column.setCellFactory(
new Callback<>() {
@Override
public TableCell<OfferBookListItem, OfferBookListItem> call(
TableColumn<OfferBookListItem, OfferBookListItem> column) {
return new TableCell<>() {
private OfferBookListItem offerBookListItem;
private ChangeListener<Number> priceChangedListener;
ChangeListener<Scene> sceneChangeListener;

@Override
public void updateItem(final OfferBookListItem item, boolean empty) {
super.updateItem(item, empty);

if (item != null && !empty) {
if (getTableView().getScene() != null && sceneChangeListener == null) {
sceneChangeListener = (observable, oldValue, newValue) -> {
if (newValue == null) {
if (priceChangedListener != null) {
model.priceFeedService.updateCounterProperty().removeListener(priceChangedListener);
priceChangedListener = null;
}
offerBookListItem = null;
setGraphic(null);
getTableView().sceneProperty().removeListener(sceneChangeListener);
sceneChangeListener = null;
}
};
getTableView().sceneProperty().addListener(sceneChangeListener);
}

this.offerBookListItem = item;

if (priceChangedListener == null) {
priceChangedListener = (observable, oldValue, newValue) -> {
if (offerBookListItem != null && offerBookListItem.getOffer().getPrice() != null) {
setGraphic(getPriceLabel(model.getPrice(offerBookListItem), offerBookListItem));
}
};
model.priceFeedService.updateCounterProperty().addListener(priceChangedListener);
}
setGraphic(getPriceLabel(item.getOffer().getPrice() == null ? Res.get("shared.na") : model.getPrice(item), item));
setGraphic(getPriceLabel(model.getPrice(item), item));
} else {
if (priceChangedListener != null) {
model.priceFeedService.updateCounterProperty().removeListener(priceChangedListener);
priceChangedListener = null;
}
if (sceneChangeListener != null) {
getTableView().sceneProperty().removeListener(sceneChangeListener);
sceneChangeListener = null;
}
this.offerBookListItem = null;
setGraphic(null);
}
}
Expand Down Expand Up @@ -845,35 +811,19 @@ private AutoTooltipTableColumn<OfferBookListItem, OfferBookListItem> getVolumeCo
}
};
column.getStyleClass().add("number-column");
column.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
column.setCellValueFactory(offer -> asPriceDependentObservable(offer.getValue()));
column.setCellFactory(
new Callback<>() {
@Override
public TableCell<OfferBookListItem, OfferBookListItem> call(
TableColumn<OfferBookListItem, OfferBookListItem> column) {
return new TableCell<>() {
private OfferBookListItem offerBookListItem;
final ChangeListener<Number> listener = new ChangeListener<>() {
@Override
public void changed(ObservableValue<? extends Number> observable,
Number oldValue,
Number newValue) {
if (offerBookListItem != null && offerBookListItem.getOffer().getVolume() != null) {
setText("");
setGraphic(new ColoredDecimalPlacesWithZerosText(model.getVolume(offerBookListItem),
model.getNumberOfDecimalsForVolume(offerBookListItem)));
model.priceFeedService.updateCounterProperty().removeListener(listener);
}
}
};

@Override
public void updateItem(final OfferBookListItem item, boolean empty) {
super.updateItem(item, empty);

if (item != null && !empty) {
if (item.getOffer().getPrice() == null) {
this.offerBookListItem = item;
model.priceFeedService.updateCounterProperty().addListener(listener);
setText(Res.get("shared.na"));
setGraphic(null);
} else {
Expand All @@ -882,8 +832,6 @@ public void updateItem(final OfferBookListItem item, boolean empty) {
model.getNumberOfDecimalsForVolume(item)));
}
} else {
model.priceFeedService.updateCounterProperty().removeListener(listener);
this.offerBookListItem = null;
setText("");
setGraphic(null);
}
Expand Down Expand Up @@ -1015,7 +963,7 @@ public TableCell<OfferBookListItem, OfferBookListItem> call(TableColumn<OfferBoo
public void updateItem(final OfferBookListItem newItem, boolean empty) {
super.updateItem(newItem, empty);

TableRow tableRow = getTableRow();
TableRow<OfferBookListItem> tableRow = getTableRow();
if (newItem != null && !empty) {
final Offer offer = newItem.getOffer();
boolean myOffer = model.isMyOffer(offer);
Expand Down

0 comments on commit 4d32da7

Please sign in to comment.