From a3596ef2c3015f7b5134df430bc3d8c9c8d0e91e Mon Sep 17 00:00:00 2001 From: axpoems <145597137+axpoems@users.noreply.github.com> Date: Thu, 22 Feb 2024 20:23:39 +0100 Subject: [PATCH 01/12] Refactor: rename dropdown menu to the more specific usecase of it --- .../offerbook/BisqEasyOfferbookView.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java index 44ded8173d..1938f8e422 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java @@ -38,9 +38,7 @@ import org.fxmisc.easybind.EasyBind; import org.fxmisc.easybind.Subscription; -import java.util.ArrayList; import java.util.Comparator; -import java.util.List; @Slf4j public final class BisqEasyOfferbookView extends ChatView { @@ -53,7 +51,7 @@ public final class BisqEasyOfferbookView extends ChatView menuItem instanceof DropdownSortByMenuItem) .anyMatch(menuItem -> ((DropdownSortByMenuItem) menuItem).isSelected()); if (!isSortingMethodSelected) { @@ -139,7 +137,7 @@ private void sortTableViewColumn(DropdownSortByMenuItem sortByMenuItem) { marketLabelTableColumn.setComparator(sortByMenuItem.getComparator()); tableView.getSortOrder().add(marketLabelTableColumn); // Update dropdown state with new selection - dropdownMenu.getMenuItems().stream().filter(menuItem -> menuItem instanceof DropdownSortByMenuItem) + sortAndFilterMarketsMenu.getMenuItems().stream().filter(menuItem -> menuItem instanceof DropdownSortByMenuItem) .forEach(menuItem -> ((DropdownSortByMenuItem) menuItem).updateSelection(menuItem == sortByMenuItem)); } @@ -182,8 +180,8 @@ private void addMarketSelectionList() { marketSelectorSearchBox = new SearchBox(); marketSelectorSearchBox.getStyleClass().add("market-selection-search-box"); - dropdownMenu = createAndGetDropdownMenu(); - HBox subheader = new HBox(marketSelectorSearchBox, Spacer.fillHBox(), dropdownMenu); + sortAndFilterMarketsMenu = createAndGetSortAndFilterMarketsMenu(); + HBox subheader = new HBox(marketSelectorSearchBox, Spacer.fillHBox(), sortAndFilterMarketsMenu); subheader.setAlignment(Pos.CENTER); subheader.getStyleClass().add("market-selection-subheader"); @@ -207,7 +205,7 @@ private void addMarketSelectionList() { marketSelectionList.getStyleClass().add("chat-container"); } - private DropdownMenu createAndGetDropdownMenu() { + private DropdownMenu createAndGetSortAndFilterMarketsMenu() { DropdownMenu dropdownMenu = new DropdownMenu("sort-grey", "sort-white", true); dropdownMenu.setTooltip(Res.get("bisqEasy.offerbook.dropdownMenu.tooltip")); dropdownMenu.getStyleClass().add("market-selection-dropdown-menu"); @@ -301,7 +299,7 @@ private void updateSelectedMarketFilter(MarketFilter marketFilter) { return; } - dropdownMenu.getMenuItems().stream().filter(menuItem -> menuItem instanceof DropdownFilterMenuItem) + sortAndFilterMarketsMenu.getMenuItems().stream().filter(menuItem -> menuItem instanceof DropdownFilterMenuItem) .forEach(menuItem -> { DropdownFilterMenuItem filterMenuItem = (DropdownFilterMenuItem) menuItem; filterMenuItem.updateSelection(marketFilter == filterMenuItem.getMarketFilter()); From 27375c2b5bbc473c53306bd7f2f6862e6191e245 Mon Sep 17 00:00:00 2001 From: axpoems <145597137+axpoems@users.noreply.github.com> Date: Thu, 22 Feb 2024 20:40:48 +0100 Subject: [PATCH 02/12] Add filter market offers dropdown menu --- .../offerbook/BisqEasyOfferbookView.java | 20 ++++++++++++++++--- i18n/src/main/resources/bisq_easy.properties | 5 +++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java index 1938f8e422..f3e0d200b1 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java @@ -51,9 +51,10 @@ public final class BisqEasyOfferbookView extends ChatView Date: Thu, 22 Feb 2024 20:44:26 +0100 Subject: [PATCH 03/12] Refactor: add dropdown title to strings --- .../offerbook/BisqEasyOfferbookView.java | 16 ++++++++-------- i18n/src/main/resources/bisq_easy.properties | 18 +++++++++--------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java index f3e0d200b1..966f9c31c8 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java @@ -208,27 +208,27 @@ private void addMarketSelectionList() { private DropdownMenu createAndGetSortAndFilterMarketsMenu() { DropdownMenu dropdownMenu = new DropdownMenu("sort-grey", "sort-white", true); - dropdownMenu.setTooltip(Res.get("bisqEasy.offerbook.dropdownMenu.tooltip")); + dropdownMenu.setTooltip(Res.get("bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.tooltip")); dropdownMenu.getStyleClass().add("market-selection-dropdown-menu"); // Sorting options - DropdownTitleMenuItem sortTitle = new DropdownTitleMenuItem(Res.get("bisqEasy.offerbook.dropdownMenu.sortTitle")); + DropdownTitleMenuItem sortTitle = new DropdownTitleMenuItem(Res.get("bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.sortTitle")); sortByMostOffers = new DropdownSortByMenuItem("check-grey", "check-white", - Res.get("bisqEasy.offerbook.dropdownMenu.mostOffers"), BisqEasyOfferbookUtil.SortByMarketActivity()); + Res.get("bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.mostOffers"), BisqEasyOfferbookUtil.SortByMarketActivity()); sortByNameAZ = new DropdownSortByMenuItem("check-grey", "check-white", - Res.get("bisqEasy.offerbook.dropdownMenu.nameAZ"), BisqEasyOfferbookUtil.SortByMarketNameAsc()); + Res.get("bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.nameAZ"), BisqEasyOfferbookUtil.SortByMarketNameAsc()); sortByNameZA = new DropdownSortByMenuItem("check-grey", "check-white", - Res.get("bisqEasy.offerbook.dropdownMenu.nameZA"), BisqEasyOfferbookUtil.SortByMarketNameDesc()); + Res.get("bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.nameZA"), BisqEasyOfferbookUtil.SortByMarketNameDesc()); // Separator SeparatorMenuItem separator = new SeparatorMenuItem(); // Filter options - DropdownTitleMenuItem filterTitle = new DropdownTitleMenuItem(Res.get("bisqEasy.offerbook.dropdownMenu.filterTitle")); + DropdownTitleMenuItem filterTitle = new DropdownTitleMenuItem(Res.get("bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.filterTitle")); filterWithOffers = new DropdownFilterMenuItem("check-grey", "check-white", - Res.get("bisqEasy.offerbook.dropdownMenu.withOffers"), MarketFilter.WITH_OFFERS); + Res.get("bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.withOffers"), MarketFilter.WITH_OFFERS); filterShowAll = new DropdownFilterMenuItem("check-grey", "check-white", - Res.get("bisqEasy.offerbook.dropdownMenu.all"), MarketFilter.ALL); + Res.get("bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.all"), MarketFilter.ALL); dropdownMenu.addMenuItems(sortTitle, sortByMostOffers, sortByNameAZ, sortByNameZA, separator, filterTitle, filterWithOffers, filterShowAll); diff --git a/i18n/src/main/resources/bisq_easy.properties b/i18n/src/main/resources/bisq_easy.properties index b4a9c9d24b..394ceeca59 100644 --- a/i18n/src/main/resources/bisq_easy.properties +++ b/i18n/src/main/resources/bisq_easy.properties @@ -377,15 +377,15 @@ bisqEasy.offerbook.marketListCell.numOffers.tooltip.none=No offers yet available bisqEasy.offerbook.marketListCell.numOffers.tooltip.one={0} offer is available in the {1} market bisqEasy.offerbook.marketListCell.numOffers.tooltip.many={0} offers are available in the {1} market -bisqEasy.offerbook.dropdownMenu.tooltip=Sort and filter markets -bisqEasy.offerbook.dropdownMenu.sortTitle=Sort by: -bisqEasy.offerbook.dropdownMenu.mostOffers=Most offers -bisqEasy.offerbook.dropdownMenu.nameAZ=Name A-Z -bisqEasy.offerbook.dropdownMenu.nameZA=Name Z-A -bisqEasy.offerbook.dropdownMenu.filterTitle=Show markets: -bisqEasy.offerbook.dropdownMenu.withOffers=With offers -bisqEasy.offerbook.dropdownMenu.favourites=Favourites -bisqEasy.offerbook.dropdownMenu.all=All +bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.tooltip=Sort and filter markets +bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.sortTitle=Sort by: +bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.mostOffers=Most offers +bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.nameAZ=Name A-Z +bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.nameZA=Name Z-A +bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.filterTitle=Show markets: +bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.withOffers=With offers +bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.favourites=Favourites +bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.all=All bisqEasy.offerbook.dropdownMenu.filterMarketOffers.allOffers=All offers bisqEasy.offerbook.dropdownMenu.filterMarketOffers.myOffers=My offers From f838eb203fefcad1e817abfce0c2e4caaa67e94d Mon Sep 17 00:00:00 2001 From: axpoems <145597137+axpoems@users.noreply.github.com> Date: Thu, 22 Feb 2024 20:55:42 +0100 Subject: [PATCH 04/12] Refactor: create generic Filters class to group all the filter enums --- .../offerbook/BisqEasyOfferbookController.java | 2 +- .../offerbook/BisqEasyOfferbookModel.java | 2 +- .../offerbook/BisqEasyOfferbookView.java | 14 +++++++------- .../{MarketFilter.java => Filters.java} | 16 +++++++++------- 4 files changed, 18 insertions(+), 16 deletions(-) rename apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/{MarketFilter.java => Filters.java} (72%) diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookController.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookController.java index 0c3cf6b665..3bfb528972 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookController.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookController.java @@ -107,7 +107,7 @@ public void onActivate() { selectedMarketFilterPin = EasyBind.subscribe(model.getSelectedMarketFilter(), filter -> { if (filter == null) { // By default, show only markets with offers - model.getSelectedMarketFilter().set(MarketFilter.WITH_OFFERS); + model.getSelectedMarketFilter().set(Filters.Markets.WITH_OFFERS); model.getFilteredMarketChannelItems().setPredicate(model.getSelectedMarketFilter().get().getPredicate()); } else { model.getFilteredMarketChannelItems().setPredicate(filter.getPredicate()); diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookModel.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookModel.java index 9d9bb23deb..a3bec33f09 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookModel.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookModel.java @@ -38,7 +38,7 @@ public final class BisqEasyOfferbookModel extends ChatModel { private final SortedList sortedMarketChannelItems = new SortedList<>(filteredMarketChannelItems); private final ObjectProperty selectedMarketChannelItem = new SimpleObjectProperty<>(); private final StringProperty marketSelectorSearchText = new SimpleStringProperty(); - private final ObjectProperty selectedMarketFilter = new SimpleObjectProperty<>(); + private final ObjectProperty selectedMarketFilter = new SimpleObjectProperty<>(); public BisqEasyOfferbookModel(ChatChannelDomain chatChannelDomain) { super(chatChannelDomain); } diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java index 966f9c31c8..b82bb07989 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java @@ -116,8 +116,8 @@ protected void onViewAttached() { sortByMostOffers.setOnAction(e -> sortTableViewColumn(sortByMostOffers)); sortByNameAZ.setOnAction(e -> sortTableViewColumn(sortByNameAZ)); sortByNameZA.setOnAction(e -> sortTableViewColumn(sortByNameZA)); - filterWithOffers.setOnAction(e -> getModel().getSelectedMarketFilter().set(MarketFilter.WITH_OFFERS)); - filterShowAll.setOnAction(e -> getModel().getSelectedMarketFilter().set(MarketFilter.ALL)); + filterWithOffers.setOnAction(e -> getModel().getSelectedMarketFilter().set(Filters.Markets.WITH_OFFERS)); + filterShowAll.setOnAction(e -> getModel().getSelectedMarketFilter().set(Filters.Markets.ALL)); createOfferButton.setOnAction(e -> getController().onCreateOffer()); @@ -226,9 +226,9 @@ private DropdownMenu createAndGetSortAndFilterMarketsMenu() { // Filter options DropdownTitleMenuItem filterTitle = new DropdownTitleMenuItem(Res.get("bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.filterTitle")); filterWithOffers = new DropdownFilterMenuItem("check-grey", "check-white", - Res.get("bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.withOffers"), MarketFilter.WITH_OFFERS); + Res.get("bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.withOffers"), Filters.Markets.WITH_OFFERS); filterShowAll = new DropdownFilterMenuItem("check-grey", "check-white", - Res.get("bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.all"), MarketFilter.ALL); + Res.get("bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.all"), Filters.Markets.ALL); dropdownMenu.addMenuItems(sortTitle, sortByMostOffers, sortByNameAZ, sortByNameZA, separator, filterTitle, filterWithOffers, filterShowAll); @@ -308,7 +308,7 @@ private void updateMarketSelectorHeaderIcon(Node node) { channelTitle.setGraphic(node); } - private void updateSelectedMarketFilter(MarketFilter marketFilter) { + private void updateSelectedMarketFilter(Filters.Markets marketFilter) { if (marketFilter == null) { return; } @@ -323,9 +323,9 @@ private void updateSelectedMarketFilter(MarketFilter marketFilter) { private static final class DropdownFilterMenuItem extends DropdownMenuItem { private static final PseudoClass SELECTED_PSEUDO_CLASS = PseudoClass.getPseudoClass("selected"); @Getter - private final MarketFilter marketFilter; + private final Filters.Markets marketFilter; - DropdownFilterMenuItem(String defaultIconId, String activeIconId, String text, MarketFilter marketFilter) { + DropdownFilterMenuItem(String defaultIconId, String activeIconId, String text, Filters.Markets marketFilter) { super(defaultIconId, activeIconId, text); this.marketFilter = marketFilter; diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/MarketFilter.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/Filters.java similarity index 72% rename from apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/MarketFilter.java rename to apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/Filters.java index b0b349b9f0..5054e768d9 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/MarketFilter.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/Filters.java @@ -21,14 +21,16 @@ import java.util.function.Predicate; -@Getter -enum MarketFilter { - ALL(item -> true), - WITH_OFFERS(item -> item.getNumOffers().get() > 0); +class Filters { + @Getter + enum Markets { + ALL(item -> true), + WITH_OFFERS(item -> item.getNumOffers().get() > 0); - private final Predicate predicate; + private final Predicate predicate; - MarketFilter(Predicate predicate) { - this.predicate = predicate; + Markets(Predicate predicate) { + this.predicate = predicate; + } } } From e60a4782a2cb0614bc3ec88089b4c2709f0ac507 Mon Sep 17 00:00:00 2001 From: axpoems <145597137+axpoems@users.noreply.github.com> Date: Sat, 24 Feb 2024 12:54:15 +0100 Subject: [PATCH 05/12] Refactor: rename selectedMarketsFilter attribute in model --- .../bisq_easy/offerbook/BisqEasyOfferbookController.java | 6 +++--- .../content/bisq_easy/offerbook/BisqEasyOfferbookModel.java | 2 +- .../content/bisq_easy/offerbook/BisqEasyOfferbookView.java | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookController.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookController.java index 3bfb528972..f4371c02d1 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookController.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookController.java @@ -104,11 +104,11 @@ public void onActivate() { } }); - selectedMarketFilterPin = EasyBind.subscribe(model.getSelectedMarketFilter(), filter -> { + selectedMarketFilterPin = EasyBind.subscribe(model.getSelectedMarketsFilter(), filter -> { if (filter == null) { // By default, show only markets with offers - model.getSelectedMarketFilter().set(Filters.Markets.WITH_OFFERS); - model.getFilteredMarketChannelItems().setPredicate(model.getSelectedMarketFilter().get().getPredicate()); + model.getSelectedMarketsFilter().set(Filters.Markets.WITH_OFFERS); + model.getFilteredMarketChannelItems().setPredicate(model.getSelectedMarketsFilter().get().getPredicate()); } else { model.getFilteredMarketChannelItems().setPredicate(filter.getPredicate()); } diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookModel.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookModel.java index a3bec33f09..d1b7f6d829 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookModel.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookModel.java @@ -38,7 +38,7 @@ public final class BisqEasyOfferbookModel extends ChatModel { private final SortedList sortedMarketChannelItems = new SortedList<>(filteredMarketChannelItems); private final ObjectProperty selectedMarketChannelItem = new SimpleObjectProperty<>(); private final StringProperty marketSelectorSearchText = new SimpleStringProperty(); - private final ObjectProperty selectedMarketFilter = new SimpleObjectProperty<>(); + private final ObjectProperty selectedMarketsFilter = new SimpleObjectProperty<>(); public BisqEasyOfferbookModel(ChatChannelDomain chatChannelDomain) { super(chatChannelDomain); } diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java index b82bb07989..b876593052 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java @@ -111,13 +111,13 @@ protected void onViewAttached() { } }); marketSelectorHeaderIconPin = EasyBind.subscribe(model.getChannelIconNode(), this::updateMarketSelectorHeaderIcon); - selectedMarketFilterPin = EasyBind.subscribe(getModel().getSelectedMarketFilter(), this::updateSelectedMarketFilter); + selectedMarketFilterPin = EasyBind.subscribe(getModel().getSelectedMarketsFilter(), this::updateSelectedMarketFilter); sortByMostOffers.setOnAction(e -> sortTableViewColumn(sortByMostOffers)); sortByNameAZ.setOnAction(e -> sortTableViewColumn(sortByNameAZ)); sortByNameZA.setOnAction(e -> sortTableViewColumn(sortByNameZA)); - filterWithOffers.setOnAction(e -> getModel().getSelectedMarketFilter().set(Filters.Markets.WITH_OFFERS)); - filterShowAll.setOnAction(e -> getModel().getSelectedMarketFilter().set(Filters.Markets.ALL)); + filterWithOffers.setOnAction(e -> getModel().getSelectedMarketsFilter().set(Filters.Markets.WITH_OFFERS)); + filterShowAll.setOnAction(e -> getModel().getSelectedMarketsFilter().set(Filters.Markets.ALL)); createOfferButton.setOnAction(e -> getController().onCreateOffer()); From 112259c401a258e71deabaa85f62ba02a93c52b8 Mon Sep 17 00:00:00 2001 From: axpoems <145597137+axpoems@users.noreply.github.com> Date: Sat, 24 Feb 2024 13:36:07 +0100 Subject: [PATCH 06/12] Add warning before applying 'Ignore user'action Fix #1548 --- .../components/chatMessages/ChatMessagesListView.java | 8 ++++++++ i18n/src/main/resources/chat.properties | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/components/chatMessages/ChatMessagesListView.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/components/chatMessages/ChatMessagesListView.java index c0521c7cd5..1e69e441d1 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/components/chatMessages/ChatMessagesListView.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/components/chatMessages/ChatMessagesListView.java @@ -443,6 +443,14 @@ public void onReportUser(ChatMessage chatMessage) { } public void onIgnoreUser(ChatMessage chatMessage) { + new Popup().warning(Res.get("chat.ignoreUser.warn")) + .actionButtonText(Res.get("chat.ignoreUser.confirm")) + .onAction(() -> doIgnoreUser(chatMessage)) + .closeButtonText(Res.get("action.cancel")) + .show(); + } + + public void doIgnoreUser(ChatMessage chatMessage) { userProfileService.findUserProfile(chatMessage.getAuthorUserProfileId()) .ifPresent(userProfileService::ignoreUserProfile); } diff --git a/i18n/src/main/resources/chat.properties b/i18n/src/main/resources/chat.properties index 0974cb36a9..ac897b7683 100644 --- a/i18n/src/main/resources/chat.properties +++ b/i18n/src/main/resources/chat.properties @@ -98,6 +98,10 @@ chat.leave.warn=Are you sure you want to leave that private chat with {0}.\n\ chat.leave.confirmLeaveChat=Leave chat chat.messagebox.noChats.placeholder.title=Start the conversation! chat.messagebox.noChats.placeholder.description=Join the discussion on {0} to share your thoughts and ask questions. +chat.ignoreUser.warn=Selecting 'Ignore user' will effectively hide all messages from this user.\n\n\ + This action will take effect the next time you enter the chat.\n\n\ + To reverse this, go to the more options menu > Channel Info > Participants and select 'Undo ignore' next to the user. +chat.ignoreUser.confirm=Ignore user ###################################################### From 388856e32b645945e976c3cdee931a36011e8237 Mon Sep 17 00:00:00 2001 From: axpoems <145597137+axpoems@users.noreply.github.com> Date: Sun, 25 Feb 2024 10:41:28 +0100 Subject: [PATCH 07/12] Refactor: use isEmpty instead of checking size --- .../content/components/chatMessages/ChatMessagesComponent.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/components/chatMessages/ChatMessagesComponent.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/components/chatMessages/ChatMessagesComponent.java index ccfa184ae3..547ea80ecd 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/components/chatMessages/ChatMessagesComponent.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/components/chatMessages/ChatMessagesComponent.java @@ -217,7 +217,6 @@ protected void selectedChannelChanged(ChatChannel chatCha applyUserProfileOrChannelChange(); boolean isBisqEasyPrivateTradeChatChannel = chatChannel instanceof BisqEasyOpenTradeChannel; - boolean isTwoPartyPrivateChatChannel = chatChannel instanceof TwoPartyPrivateChatChannel; model.getOpenDisputeButtonVisible().set(isBisqEasyPrivateTradeChatChannel); model.getSendBtcAddressButtonVisible().set(false); model.getSendPaymentAccountButtonVisible().set(false); @@ -421,7 +420,7 @@ private boolean isOfferAuthor(String offerAuthorUserProfileId) { private void maybeSwitchUserProfile() { if (model.userProfileSelectionVisible.get()) { List myUserProfilesInChannel = getMyUserProfilesInChannel(); - if (myUserProfilesInChannel.size() > 0) { + if (!myUserProfilesInChannel.isEmpty()) { userIdentityService.selectChatUserIdentity(myUserProfilesInChannel.get(0)); } } From 0593654685554716cbce8184d3285da0b5534a1a Mon Sep 17 00:00:00 2001 From: axpoems <145597137+axpoems@users.noreply.github.com> Date: Sun, 25 Feb 2024 10:42:24 +0100 Subject: [PATCH 08/12] Add offers filter in BisqEasy offerbook --- .../bisq_easy/offerbook/BisqEasyOfferbookModel.java | 1 + .../desktop/main/content/bisq_easy/offerbook/Filters.java | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookModel.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookModel.java index d1b7f6d829..19466d8bd6 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookModel.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookModel.java @@ -39,6 +39,7 @@ public final class BisqEasyOfferbookModel extends ChatModel { private final ObjectProperty selectedMarketChannelItem = new SimpleObjectProperty<>(); private final StringProperty marketSelectorSearchText = new SimpleStringProperty(); private final ObjectProperty selectedMarketsFilter = new SimpleObjectProperty<>(); + private final ObjectProperty selectedOffersFilter = new SimpleObjectProperty<>(); public BisqEasyOfferbookModel(ChatChannelDomain chatChannelDomain) { super(chatChannelDomain); } diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/Filters.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/Filters.java index 5054e768d9..51d20ed9fb 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/Filters.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/Filters.java @@ -33,4 +33,11 @@ enum Markets { this.predicate = predicate; } } + + enum Offers { + ALL, + MINE, + BUY, + SELL; + } } From df5b61b8c939c0eb87edf4a7ae29f872168d7d30 Mon Sep 17 00:00:00 2001 From: axpoems <145597137+axpoems@users.noreply.github.com> Date: Wed, 28 Feb 2024 21:56:35 +0100 Subject: [PATCH 09/12] Implement offers filter --- .../components/controls/DropdownMenuItem.java | 4 + .../BisqEasyOfferbookController.java | 13 +++- .../offerbook/BisqEasyOfferbookModel.java | 2 +- .../offerbook/BisqEasyOfferbookView.java | 77 ++++++++++++++----- .../content/bisq_easy/offerbook/Filters.java | 26 +++++-- .../ChatMessageListCellFactory.java | 3 +- .../chatMessages/ChatMessageListItem.java | 29 +++++++ .../chatMessages/ChatMessagesComponent.java | 4 + .../chatMessages/ChatMessagesListView.java | 14 +++- 9 files changed, 141 insertions(+), 31 deletions(-) diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/components/controls/DropdownMenuItem.java b/apps/desktop/desktop/src/main/java/bisq/desktop/components/controls/DropdownMenuItem.java index 28ba107af3..4de66f35b8 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/components/controls/DropdownMenuItem.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/components/controls/DropdownMenuItem.java @@ -69,6 +69,10 @@ public void updateWidth(Double width) { content.setPrefWidth(width); } + public String getLabelText() { + return label.getText(); + } + private void attachListeners() { content.setOnMouseEntered(e -> updateIcon(activeIcon)); content.setOnMouseExited(e -> updateIcon(defaultIcon)); diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookController.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookController.java index f4371c02d1..75d5cd6776 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookController.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookController.java @@ -52,7 +52,7 @@ public final class BisqEasyOfferbookController extends ChatController { + if (filter == null) { + // By default, show all offers + model.getSelectedOffersFilter().set(Filters.Offers.ALL); + chatMessagesComponent.setBisqEasyOffersFilerPredicate(model.getSelectedOffersFilter().get().getPredicate()); + } else { + chatMessagesComponent.setBisqEasyOffersFilerPredicate(filter.getPredicate()); + } + }); + updateMarketItemsPredicate(); maybeSelectFirst(); } @@ -127,6 +137,7 @@ public void onDeactivate() { selectedChannelPin.unbind(); marketSelectorSearchPin.unsubscribe(); selectedMarketFilterPin.unsubscribe(); + selectedOffersFilterPin.unsubscribe(); resetSelectedChildTarget(); } diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookModel.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookModel.java index 19466d8bd6..3f73b34246 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookModel.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookModel.java @@ -39,7 +39,7 @@ public final class BisqEasyOfferbookModel extends ChatModel { private final ObjectProperty selectedMarketChannelItem = new SimpleObjectProperty<>(); private final StringProperty marketSelectorSearchText = new SimpleStringProperty(); private final ObjectProperty selectedMarketsFilter = new SimpleObjectProperty<>(); - private final ObjectProperty selectedOffersFilter = new SimpleObjectProperty<>(); + private final ObjectProperty selectedOffersFilter = new SimpleObjectProperty<>(); public BisqEasyOfferbookModel(ChatChannelDomain chatChannelDomain) { super(chatChannelDomain); } diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java index b876593052..4bf47b84f8 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java @@ -17,6 +17,8 @@ package bisq.desktop.main.content.bisq_easy.offerbook; +import bisq.chat.ChatChannel; +import bisq.chat.ChatMessage; import bisq.desktop.common.Layout; import bisq.desktop.components.containers.Spacer; import bisq.desktop.components.controls.DropdownMenu; @@ -26,6 +28,7 @@ import bisq.desktop.components.table.BisqTableColumn; import bisq.desktop.components.table.BisqTableView; import bisq.desktop.main.content.chat.ChatView; +import bisq.desktop.main.content.components.chatMessages.ChatMessageListItem; import bisq.i18n.Res; import javafx.css.PseudoClass; import javafx.geometry.Insets; @@ -49,12 +52,14 @@ public final class BisqEasyOfferbookView extends ChatView tableView; private BisqTableColumn marketLabelTableColumn; private VBox marketSelectionList; - private Subscription tableViewSelectionPin, selectedModelItemPin, marketSelectorHeaderIconPin, selectedMarketFilterPin; + private Subscription tableViewSelectionPin, selectedModelItemPin, marketSelectorHeaderIconPin, selectedMarketFilterPin, + selectedOffersFilterPin; private Button createOfferButton; - private DropdownMenu sortAndFilterMarketsMenu, filterMarketOffers; + private DropdownMenu sortAndFilterMarketsMenu, offersFilterMenu; private DropdownSortByMenuItem sortByMostOffers, sortByNameAZ, sortByNameZA; - private DropdownFilterMenuItem filterShowAll, filterWithOffers; - private DropdownMenuItem allOffers, myOffers, buyOffers, sellOffers; + private DropdownFilterMenuItem filterShowAll, filterWithOffers; + private DropdownFilterMenuItem>> + allOffers, myOffers, buyOffers, sellOffers; private CheckBox hideUserMessagesCheckbox; public BisqEasyOfferbookView(BisqEasyOfferbookModel model, @@ -112,6 +117,7 @@ protected void onViewAttached() { }); marketSelectorHeaderIconPin = EasyBind.subscribe(model.getChannelIconNode(), this::updateMarketSelectorHeaderIcon); selectedMarketFilterPin = EasyBind.subscribe(getModel().getSelectedMarketsFilter(), this::updateSelectedMarketFilter); + selectedOffersFilterPin = EasyBind.subscribe(getModel().getSelectedOffersFilter(), this::updateSelectedOffersFilter); sortByMostOffers.setOnAction(e -> sortTableViewColumn(sortByMostOffers)); sortByNameAZ.setOnAction(e -> sortTableViewColumn(sortByNameAZ)); @@ -119,11 +125,20 @@ protected void onViewAttached() { filterWithOffers.setOnAction(e -> getModel().getSelectedMarketsFilter().set(Filters.Markets.WITH_OFFERS)); filterShowAll.setOnAction(e -> getModel().getSelectedMarketsFilter().set(Filters.Markets.ALL)); + allOffers.setOnAction(e -> setOffersFilter(allOffers)); + myOffers.setOnAction(e -> setOffersFilter(myOffers)); + buyOffers.setOnAction(e -> setOffersFilter(buyOffers)); + sellOffers.setOnAction(e -> setOffersFilter(sellOffers)); + createOfferButton.setOnAction(e -> getController().onCreateOffer()); maybeSelectSorting(); } + private void setOffersFilter(DropdownFilterMenuItem filterMenuItem) { + getModel().getSelectedOffersFilter().set((Filters.Offers) filterMenuItem.getFilter()); + } + private void maybeSelectSorting() { boolean isSortingMethodSelected = sortAndFilterMarketsMenu.getMenuItems().stream() .filter(menuItem -> menuItem instanceof DropdownSortByMenuItem) @@ -153,6 +168,7 @@ protected void onViewDetached() { tableViewSelectionPin.unsubscribe(); marketSelectorHeaderIconPin.unsubscribe(); selectedMarketFilterPin.unsubscribe(); + selectedOffersFilterPin.unsubscribe(); sortByMostOffers.setOnAction(null); sortByNameAZ.setOnAction(null); @@ -225,9 +241,9 @@ private DropdownMenu createAndGetSortAndFilterMarketsMenu() { // Filter options DropdownTitleMenuItem filterTitle = new DropdownTitleMenuItem(Res.get("bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.filterTitle")); - filterWithOffers = new DropdownFilterMenuItem("check-grey", "check-white", + filterWithOffers = new DropdownFilterMenuItem<>("check-grey", "check-white", Res.get("bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.withOffers"), Filters.Markets.WITH_OFFERS); - filterShowAll = new DropdownFilterMenuItem("check-grey", "check-white", + filterShowAll = new DropdownFilterMenuItem<>("check-grey", "check-white", Res.get("bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.all"), Filters.Markets.ALL); dropdownMenu.addMenuItems(sortTitle, sortByMostOffers, sortByNameAZ, sortByNameZA, separator, @@ -274,9 +290,9 @@ private void addChatBox() { HBox checkbox = new HBox(5, label, hideUserMessagesCheckbox); checkbox.getStyleClass().add("market-selection-subheader-checkbox"); - filterMarketOffers = createAndGetFilterMarketOffersMenu(); + offersFilterMenu = createAndGetOffersFilterMenu(); - HBox subheaderContent = new HBox(5, filterMarketOffers, checkbox); + HBox subheaderContent = new HBox(5, offersFilterMenu, checkbox); subheaderContent.getStyleClass().add("market-selection-subheader-content"); HBox.setHgrow(subheaderContent, Priority.ALWAYS); @@ -292,13 +308,17 @@ private void addChatBox() { centerVBox.setAlignment(Pos.CENTER); } - private DropdownMenu createAndGetFilterMarketOffersMenu() { + private DropdownMenu createAndGetOffersFilterMenu() { DropdownMenu dropdownMenu = new DropdownMenu("arrow-down", "arrow-down", false); - allOffers = new DropdownMenuItem(Res.get("bisqEasy.offerbook.dropdownMenu.filterMarketOffers.allOffers")); - myOffers = new DropdownMenuItem(Res.get("bisqEasy.offerbook.dropdownMenu.filterMarketOffers.myOffers")); - buyOffers = new DropdownMenuItem(Res.get("bisqEasy.offerbook.dropdownMenu.filterMarketOffers.buyOffers")); - sellOffers = new DropdownMenuItem(Res.get("bisqEasy.offerbook.dropdownMenu.filterMarketOffers.sellOffers")); + allOffers = new DropdownFilterMenuItem<>("check-grey", "check-white", + Res.get("bisqEasy.offerbook.dropdownMenu.filterMarketOffers.allOffers"), Filters.Offers.ALL); + myOffers = new DropdownFilterMenuItem<>("check-grey", "check-white", + Res.get("bisqEasy.offerbook.dropdownMenu.filterMarketOffers.myOffers"), Filters.Offers.MINE); + buyOffers = new DropdownFilterMenuItem<>("check-grey", "check-white", + Res.get("bisqEasy.offerbook.dropdownMenu.filterMarketOffers.buyOffers"), Filters.Offers.BUY); + sellOffers = new DropdownFilterMenuItem<>("check-grey", "check-white", + Res.get("bisqEasy.offerbook.dropdownMenu.filterMarketOffers.sellOffers"), Filters.Offers.SELL); dropdownMenu.addMenuItems(allOffers, myOffers, buyOffers, sellOffers); return dropdownMenu; @@ -313,22 +333,39 @@ private void updateSelectedMarketFilter(Filters.Markets marketFilter) { return; } - sortAndFilterMarketsMenu.getMenuItems().stream().filter(menuItem -> menuItem instanceof DropdownFilterMenuItem) + sortAndFilterMarketsMenu.getMenuItems().stream() + .filter(menuItem -> menuItem instanceof DropdownFilterMenuItem) + .forEach(menuItem -> { + DropdownFilterMenuItem filterMenuItem = (DropdownFilterMenuItem) menuItem; + filterMenuItem.updateSelection(marketFilter == filterMenuItem.getFilter()); + }); + } + + private void updateSelectedOffersFilter(Filters.Offers offersFilter) { + if (offersFilter == null) { + return; + } + + offersFilterMenu.getMenuItems().stream() + .filter(menuItem -> menuItem instanceof DropdownFilterMenuItem) .forEach(menuItem -> { - DropdownFilterMenuItem filterMenuItem = (DropdownFilterMenuItem) menuItem; - filterMenuItem.updateSelection(marketFilter == filterMenuItem.getMarketFilter()); + DropdownFilterMenuItem filterMenuItem = (DropdownFilterMenuItem) menuItem; + filterMenuItem.updateSelection(offersFilter == filterMenuItem.getFilter()); + if (offersFilter == filterMenuItem.getFilter()) { + offersFilterMenu.setLabel(((DropdownFilterMenuItem) menuItem).getLabelText()); + } }); } - private static final class DropdownFilterMenuItem extends DropdownMenuItem { + private static final class DropdownFilterMenuItem extends DropdownMenuItem { private static final PseudoClass SELECTED_PSEUDO_CLASS = PseudoClass.getPseudoClass("selected"); @Getter - private final Filters.Markets marketFilter; + private final Filters.FilterPredicate filter; - DropdownFilterMenuItem(String defaultIconId, String activeIconId, String text, Filters.Markets marketFilter) { + DropdownFilterMenuItem(String defaultIconId, String activeIconId, String text, Filters.FilterPredicate filter) { super(defaultIconId, activeIconId, text); - this.marketFilter = marketFilter; + this.filter = filter; getStyleClass().add("dropdown-filter-menu-item"); updateSelection(false); } diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/Filters.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/Filters.java index 51d20ed9fb..6b521248c6 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/Filters.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/Filters.java @@ -17,13 +17,20 @@ package bisq.desktop.main.content.bisq_easy.offerbook; +import bisq.chat.ChatChannel; +import bisq.chat.ChatMessage; +import bisq.desktop.main.content.components.chatMessages.ChatMessageListItem; import lombok.Getter; import java.util.function.Predicate; class Filters { + interface FilterPredicate { + Predicate getPredicate(); + } + @Getter - enum Markets { + enum Markets implements FilterPredicate { ALL(item -> true), WITH_OFFERS(item -> item.getNumOffers().get() > 0); @@ -34,10 +41,17 @@ enum Markets { } } - enum Offers { - ALL, - MINE, - BUY, - SELL; + @Getter + enum Offers implements FilterPredicate>> { + ALL(item -> true), + MINE(item -> !item.isBisqEasyPublicChatMessageWithOffer() || item.isBisqEasyPublicChatMessageWithMyOffer()), + BUY(item -> !item.isBisqEasyPublicChatMessageWithOffer() || item.isBisqEasyPublicChatMessageWithPeerBuyOffer()), + SELL(item -> !item.isBisqEasyPublicChatMessageWithOffer() || item.isBisqEasyPublicChatMessageWithPeerSellOffer()); + + private final Predicate>> predicate; + + Offers(Predicate>> predicate) { + this.predicate = predicate; + } } } diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/components/chatMessages/ChatMessageListCellFactory.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/components/chatMessages/ChatMessageListCellFactory.java index 51aaee7cd9..6bc058dfe4 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/components/chatMessages/ChatMessageListCellFactory.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/components/chatMessages/ChatMessageListCellFactory.java @@ -132,8 +132,7 @@ private Message createMessage(ChatMessageListItem mapPins = new HashSet<>(); @EqualsAndHashCode.Exclude private final Set statusPins = new HashSet<>(); + private final UserIdentityService userIdentityService; public ChatMessageListItem(M chatMessage, C chatChannel, @@ -97,6 +99,7 @@ public ChatMessageListItem(M chatMessage, NetworkService networkService) { this.chatMessage = chatMessage; this.chatChannel = chatChannel; + this.userIdentityService = userIdentityService; if (chatMessage instanceof PrivateChatMessage) { senderUserProfile = Optional.of(((PrivateChatMessage) chatMessage).getSenderUserProfile()); @@ -249,6 +252,32 @@ public String getSupportedLanguageCodesForTooltip(BisqEasyOfferbookMessage chatM return result.isEmpty() ? "" : Res.get("chat.message.supportedLanguages") + "\n" + result; } + public boolean isMyMessage() { + return chatMessage.isMyMessage(userIdentityService); + } + + public boolean isBisqEasyPublicChatMessageWithMyOffer() { + return isBisqEasyPublicChatMessageWithOffer() && isMyMessage(); + } + + public boolean isBisqEasyPublicChatMessageWithPeerBuyOffer() { + return isBisqEasyPublicChatMessageWithOffer() && !isMyMessage() && hasBisqEasyOfferWithDirection(Direction.BUY); + } + + public boolean isBisqEasyPublicChatMessageWithPeerSellOffer() { + return isBisqEasyPublicChatMessageWithOffer() && !isMyMessage() && hasBisqEasyOfferWithDirection(Direction.SELL); + } + + private boolean hasBisqEasyOfferWithDirection(Direction direction) { + if (chatMessage instanceof BisqEasyOfferMessage) { + BisqEasyOfferMessage bisqEasyOfferMessage = (BisqEasyOfferMessage) chatMessage; + if (bisqEasyOfferMessage.hasBisqEasyOffer() && bisqEasyOfferMessage.getBisqEasyOffer().isPresent()) { + return bisqEasyOfferMessage.getBisqEasyOffer().get().getDirection() == direction; + } + } + return false; + } + private String getSupportedLanguageCodes(BisqEasyOfferbookMessage chatMessage, String separator, Function toStringFunction) { return chatMessage.getBisqEasyOffer() .map(BisqEasyOffer::getSupportedLanguageCodes) diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/components/chatMessages/ChatMessagesComponent.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/components/chatMessages/ChatMessagesComponent.java index 547ea80ecd..efeccaac18 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/components/chatMessages/ChatMessagesComponent.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/components/chatMessages/ChatMessagesComponent.java @@ -103,6 +103,10 @@ public void setSearchPredicate(Predicate>> predicate) { + controller.chatMessagesListView.setBisqEasyOffersFilerPredicate(predicate); + } + public void resetSelectedChatMessage() { controller.model.selectedChatMessage = null; } diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/components/chatMessages/ChatMessagesListView.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/components/chatMessages/ChatMessagesListView.java index 1e69e441d1..6752abe80a 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/components/chatMessages/ChatMessagesListView.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/components/chatMessages/ChatMessagesListView.java @@ -126,6 +126,10 @@ public void setSearchPredicate(Predicate>> predicate) { + controller.setBisqEasyOffersFilerPredicate(predicate); + } + public void refreshMessages() { controller.refreshMessages(); } @@ -291,6 +295,11 @@ private void setSearchPredicate(Predicate>> predicate) { + model.setBisqEasyOffersFilerPredicate(Objects.requireNonNullElseGet(predicate, () -> e -> true)); + applyPredicate(); + } + /////////////////////////////////////////////////////////////////////////////////////////////////// // UI - delegate to client @@ -568,7 +577,8 @@ private void applyPredicate() { !userProfileService.getIgnoredUserProfileIds().contains(senderUserProfile.get().getId()) && userProfileService.findUserProfile(senderUserProfile.get().getId()).isPresent(); }; - model.filteredChatMessages.setPredicate(item -> model.getSearchPredicate().test(item) && predicate.test(item)); + model.filteredChatMessages.setPredicate(item -> model.getSearchPredicate().test(item) + && model.getBisqEasyOffersFilerPredicate().test(item) && predicate.test(item)); } private > Pin bindChatMessages(C channel) { @@ -645,6 +655,8 @@ public static class Model implements bisq.desktop.common.view.Model { private final ChatChannelDomain chatChannelDomain; @Setter private Predicate>> searchPredicate = e -> true; + @Setter + private Predicate>> BisqEasyOffersFilerPredicate = e -> true; private boolean autoScrollToBottom; private int numReadMessages; From 51c06b46235cae7f5e914e4cceff5649392a7744 Mon Sep 17 00:00:00 2001 From: axpoems <145597137+axpoems@users.noreply.github.com> Date: Wed, 28 Feb 2024 22:27:30 +0100 Subject: [PATCH 10/12] Improve offers filter dropdown menu styles --- .../offerbook/BisqEasyOfferbookView.java | 10 ++-- .../src/main/resources/css/bisq_easy.css | 57 ++++++++++++------- 2 files changed, 41 insertions(+), 26 deletions(-) diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java index 4bf47b84f8..8edd0fe6ef 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java @@ -288,17 +288,18 @@ private void addChatBox() { Label label = new Label(Res.get("bisqEasy.topPane.filter.hideUserMessages")); hideUserMessagesCheckbox = new CheckBox(); HBox checkbox = new HBox(5, label, hideUserMessagesCheckbox); - checkbox.getStyleClass().add("market-selection-subheader-checkbox"); + checkbox.getStyleClass().add("offerbook-subheader-checkbox"); + checkbox.setAlignment(Pos.CENTER); offersFilterMenu = createAndGetOffersFilterMenu(); - HBox subheaderContent = new HBox(5, offersFilterMenu, checkbox); - subheaderContent.getStyleClass().add("market-selection-subheader-content"); + HBox subheaderContent = new HBox(30, checkbox, offersFilterMenu); + subheaderContent.getStyleClass().add("offerbook-subheader-content"); HBox.setHgrow(subheaderContent, Priority.ALWAYS); HBox subheader = new HBox(subheaderContent); + subheader.getStyleClass().add("offerbook-subheader"); subheader.setAlignment(Pos.CENTER); - subheader.getStyleClass().add("market-selection-subheader"); chatMessagesComponent.setMinWidth(700); @@ -320,6 +321,7 @@ private DropdownMenu createAndGetOffersFilterMenu() { sellOffers = new DropdownFilterMenuItem<>("check-grey", "check-white", Res.get("bisqEasy.offerbook.dropdownMenu.filterMarketOffers.sellOffers"), Filters.Offers.SELL); dropdownMenu.addMenuItems(allOffers, myOffers, buyOffers, sellOffers); + dropdownMenu.getStyleClass().add("dropdown-offers-filter-menu"); return dropdownMenu; } diff --git a/apps/desktop/desktop/src/main/resources/css/bisq_easy.css b/apps/desktop/desktop/src/main/resources/css/bisq_easy.css index cc99821c4d..790b9430fe 100644 --- a/apps/desktop/desktop/src/main/resources/css/bisq_easy.css +++ b/apps/desktop/desktop/src/main/resources/css/bisq_easy.css @@ -115,35 +115,17 @@ -fx-text-fill: -bisq2-green; } -.market-selection-subheader-content { - -fx-max-width: 1200; - -fx-alignment: center-right; - -fx-padding: 0 25 0 25; -} - -.market-selection-subheader { +.market-selection-subheader, +.offerbook-subheader { -fx-background-color: -bisq-dark-grey-30; -fx-background-radius: 0; -fx-max-height: 30; -fx-min-height: 30; -fx-pref-height: 30; - -fx-padding: 2 12 2 7; -} - -.market-selection-subheader-checkbox .check-box { - -fx-scale-x: 0.6; - -fx-scale-y: 0.6; -} - -.market-selection-subheader-checkbox .label { - -fx-text-fill: -fx-mid-text-color; } -.market-selection-subheader-checkbox .check-box > .box { - -fx-background-color: transparent; - -fx-background-radius: 0; - -fx-border-color: -bisq-mid-grey-20; - -fx-border-width: 1; +.market-selection-subheader { + -fx-padding: 0 12 0 7; } .market-selection-search-box { @@ -170,6 +152,37 @@ -fx-pref-width: 24; } +.offerbook-subheader { + -fx-padding: 0; +} + +.offerbook-subheader-content { + -fx-max-width: 1200; + -fx-alignment: center-right; + -fx-padding: 0 25 0 25; +} + +.offerbook-subheader-checkbox .check-box { + -fx-scale-x: 0.6; + -fx-scale-y: 0.6; + -fx-cursor: hand; +} + +.offerbook-subheader-checkbox .label { + -fx-text-fill: -fx-mid-text-color; +} + +.offerbook-subheader-checkbox .check-box > .box { + -fx-background-color: transparent; + -fx-background-radius: 0; + -fx-border-color: -bisq-mid-grey-20; + -fx-border-width: 1; +} + +.offerbook-subheader .dropdown-offers-filter-menu { + -fx-padding: 0 10 0 10; +} + /* Drop down sort & filter menu */ .dropdown-menu-popup .dropdown-filter-menu-item .dropdown-menu-item-content .menu-item-icon, .dropdown-menu-popup .dropdown-filter-menu-item:hover .dropdown-menu-item-content .menu-item-icon, From b97ecf0869456ed0ff9f9952244d44ec93d47c20 Mon Sep 17 00:00:00 2001 From: axpoems <145597137+axpoems@users.noreply.github.com> Date: Wed, 28 Feb 2024 22:32:52 +0100 Subject: [PATCH 11/12] Add tooltip to offers filter dropdown menu --- .../content/bisq_easy/offerbook/BisqEasyOfferbookView.java | 4 ++-- i18n/src/main/resources/bisq_easy.properties | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java index 8edd0fe6ef..407a64f539 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java @@ -311,6 +311,8 @@ private void addChatBox() { private DropdownMenu createAndGetOffersFilterMenu() { DropdownMenu dropdownMenu = new DropdownMenu("arrow-down", "arrow-down", false); + dropdownMenu.setTooltip(Res.get("bisqEasy.offerbook.dropdownMenu.filterMarketOffers.tooltip")); + dropdownMenu.getStyleClass().add("dropdown-offers-filter-menu"); allOffers = new DropdownFilterMenuItem<>("check-grey", "check-white", Res.get("bisqEasy.offerbook.dropdownMenu.filterMarketOffers.allOffers"), Filters.Offers.ALL); @@ -321,8 +323,6 @@ private DropdownMenu createAndGetOffersFilterMenu() { sellOffers = new DropdownFilterMenuItem<>("check-grey", "check-white", Res.get("bisqEasy.offerbook.dropdownMenu.filterMarketOffers.sellOffers"), Filters.Offers.SELL); dropdownMenu.addMenuItems(allOffers, myOffers, buyOffers, sellOffers); - dropdownMenu.getStyleClass().add("dropdown-offers-filter-menu"); - return dropdownMenu; } diff --git a/i18n/src/main/resources/bisq_easy.properties b/i18n/src/main/resources/bisq_easy.properties index 394ceeca59..824de1e559 100644 --- a/i18n/src/main/resources/bisq_easy.properties +++ b/i18n/src/main/resources/bisq_easy.properties @@ -387,6 +387,7 @@ bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.withOffers=With offers bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.favourites=Favourites bisqEasy.offerbook.dropdownMenu.sortAndFilterMarkets.all=All +bisqEasy.offerbook.dropdownMenu.filterMarketOffers.tooltip=Filter offers bisqEasy.offerbook.dropdownMenu.filterMarketOffers.allOffers=All offers bisqEasy.offerbook.dropdownMenu.filterMarketOffers.myOffers=My offers bisqEasy.offerbook.dropdownMenu.filterMarketOffers.buyOffers=Buy offers From bd53c70947380977e611d2b73b0803bffe40be16 Mon Sep 17 00:00:00 2001 From: axpoems <145597137+axpoems@users.noreply.github.com> Date: Wed, 28 Feb 2024 22:44:55 +0100 Subject: [PATCH 12/12] Reset menuItems' setOnAction --- .../content/bisq_easy/offerbook/BisqEasyOfferbookView.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java index 407a64f539..77b969faa6 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/offerbook/BisqEasyOfferbookView.java @@ -175,6 +175,10 @@ protected void onViewDetached() { sortByNameZA.setOnAction(null); filterWithOffers.setOnAction(null); filterShowAll.setOnAction(null); + allOffers.setOnAction(null); + myOffers.setOnAction(null); + buyOffers.setOnAction(null); + sellOffers.setOnAction(null); createOfferButton.setOnAction(null); }