diff options
| author | shedaniel <daniel@shedaniel.me> | 2022-06-11 00:12:55 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2023-05-29 20:54:19 +0800 |
| commit | 68bbe0fa3c663d58599c3c1ebaa7ef2924ede6b6 (patch) | |
| tree | dec0e0602c93226ef45bbc5e464ef416a6534bad /runtime/src/main/java | |
| parent | ab3c19e02c5a2636ba7aba7ada84958d89eb168a (diff) | |
| download | RoughlyEnoughItems-68bbe0fa3c663d58599c3c1ebaa7ef2924ede6b6.tar.gz RoughlyEnoughItems-68bbe0fa3c663d58599c3c1ebaa7ef2924ede6b6.tar.bz2 RoughlyEnoughItems-68bbe0fa3c663d58599c3c1ebaa7ef2924ede6b6.zip | |
Add default favorite entries
Diffstat (limited to 'runtime/src/main/java')
8 files changed, 157 insertions, 42 deletions
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java index 6cc8e971b..2d400a103 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java @@ -269,9 +269,6 @@ public class ConfigManagerImpl implements ConfigManager { @Override public void saveConfig() { - if (getConfig().getFavoriteEntries() != null) { - getConfig().getFavoriteEntries().removeIf(Objects::isNull); - } if (getConfig().getFilteringRules().stream().noneMatch(filteringRule -> filteringRule instanceof ManualFilteringRule)) { getConfig().getFilteringRules().add(new ManualFilteringRule()); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java index 9bc601a44..e547be5f4 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java @@ -363,6 +363,10 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData { @Override public List<FavoriteEntry> getFavoriteEntries() { return basics.favorites; + } + + public List<FavoriteEntry> getHiddenFavoriteEntries() { + return basics.hiddenFavorites; } @Override @@ -525,6 +529,7 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData { public static class Basics { @ConfigEntry.Gui.Excluded public List<FavoriteEntry> favorites = new ArrayList<>(); + @ConfigEntry.Gui.Excluded public List<FavoriteEntry> hiddenFavorites = new ArrayList<>(); @Comment("Declares whether cheating mode is on.") @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) private CheatingMode cheating = CheatingMode.OFF; private boolean favoritesEnabled = true; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java index 82439dd62..45e598625 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java @@ -34,6 +34,8 @@ import me.shedaniel.rei.api.client.favorites.FavoriteEntryType; import me.shedaniel.rei.api.client.favorites.SystemFavoriteEntryProvider; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.common.registry.ReloadStage; +import me.shedaniel.rei.api.common.util.CollectionUtils; +import me.shedaniel.rei.impl.client.config.ConfigManagerImpl; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import org.apache.commons.lang3.mutable.MutableLong; @@ -113,8 +115,8 @@ public class FavoriteEntryTypeRegistryImpl implements FavoriteEntryType.Registry @Override public void endReload() { if (ConfigObject.getInstance().isFavoritesEnabled()) { - List<FavoriteEntry> favorites = ConfigObject.getInstance().getFavoriteEntries(); - favorites.removeIf(FavoriteEntry::isInvalid); + ConfigObject.getInstance().getFavoriteEntries().removeIf(FavoriteEntry::isInvalid); + ConfigManagerImpl.getInstance().getConfig().getHiddenFavoriteEntries().removeIf(FavoriteEntry::isInvalid); ConfigManager.getInstance().saveConfig(); } @@ -122,15 +124,16 @@ public class FavoriteEntryTypeRegistryImpl implements FavoriteEntryType.Registry private static class SectionImpl implements FavoriteEntryType.Section { private final Component text; - private final List<FavoriteEntry> entries = new ArrayList<>(); + private final List<CompoundEntry> entries = new ArrayList<>(); public SectionImpl(Component text) { this.text = text; } @Override - public void add(FavoriteEntry... entries) { - Collections.addAll(this.entries, entries); + public void add(boolean defaultFavorited, FavoriteEntry... entries) { + this.entries.addAll(CollectionUtils.map(entries, + entry -> new CompoundEntry(entry, defaultFavorited))); } @Override @@ -140,7 +143,14 @@ public class FavoriteEntryTypeRegistryImpl implements FavoriteEntryType.Registry @Override public List<FavoriteEntry> getEntries() { - return entries; + return CollectionUtils.map(entries, CompoundEntry::entry); } + + @Override + public List<FavoriteEntry> getDefaultEntries() { + return CollectionUtils.filterAndMap(entries, CompoundEntry::defaultFavorited, CompoundEntry::entry); + } + + public record CompoundEntry(FavoriteEntry entry, boolean defaultFavorited) {} } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java index 516418222..103fe05f5 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java @@ -72,6 +72,7 @@ import me.shedaniel.rei.impl.client.gui.widget.InternalWidgets; import me.shedaniel.rei.impl.client.gui.widget.LateRenderable; import me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListSearchManager; import me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget; +import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesEntriesManager; import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; import me.shedaniel.rei.impl.common.util.Weather; @@ -797,12 +798,7 @@ public class ScreenOverlayImpl extends ScreenOverlay { return ViewSearchBuilder.builder().addUsagesFor(stack).open(); } else if (ConfigObject.getInstance().getFavoriteKeyCode().matchesKey(keyCode, scanCode)) { FavoriteEntry favoriteEntry = FavoriteEntry.fromEntryStack(stack); - ConfigObject.getInstance().getFavoriteEntries().remove(favoriteEntry); - ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); - ConfigManager.getInstance().saveConfig(); - FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); - if (favoritesListWidget != null) - favoritesListWidget.updateSearch(); + FavoritesEntriesManager.INSTANCE.add(favoriteEntry); return true; } } @@ -871,12 +867,7 @@ public class ScreenOverlayImpl extends ScreenOverlay { return ViewSearchBuilder.builder().addUsagesFor(stack).open(); } else if (visible && ConfigObject.getInstance().getFavoriteKeyCode().matchesMouse(button)) { FavoriteEntry favoriteEntry = FavoriteEntry.fromEntryStack(stack); - ConfigObject.getInstance().getFavoriteEntries().remove(favoriteEntry); - ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); - ConfigManager.getInstance().saveConfig(); - FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); - if (favoritesListWidget != null) - favoritesListWidget.updateSearch(); + FavoritesEntriesManager.INSTANCE.add(favoriteEntry); return true; } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java index e902711c8..dc442e879 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java @@ -51,6 +51,7 @@ import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.plugins.PluginManager; import me.shedaniel.rei.impl.client.REIRuntimeImpl; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; +import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesEntriesManager; import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; import me.shedaniel.rei.impl.client.view.ViewsImpl; import net.minecraft.ChatFormatting; @@ -512,11 +513,10 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget { if (keyCode.matchesMouse(button)) { FavoriteEntry favoriteEntry = asFavoriteEntry(); if (favoriteEntry != null) { - if (reverseFavoritesAction()) - ConfigObject.getInstance().getFavoriteEntries().remove(favoriteEntry); - else { - ConfigObject.getInstance().getFavoriteEntries().remove(favoriteEntry); - ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); + if (reverseFavoritesAction()) { + FavoritesEntriesManager.INSTANCE.remove(favoriteEntry); + } else { + FavoritesEntriesManager.INSTANCE.add(favoriteEntry); } ConfigManager.getInstance().saveConfig(); FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); @@ -595,11 +595,10 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget { if (ConfigObject.getInstance().getFavoriteKeyCode().matchesKey(keyCode, scanCode)) { FavoriteEntry favoriteEntry = asFavoriteEntry(); if (favoriteEntry != null) { - if (reverseFavoritesAction()) - ConfigObject.getInstance().getFavoriteEntries().remove(favoriteEntry); - else { - ConfigObject.getInstance().getFavoriteEntries().remove(favoriteEntry); - ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); + if (reverseFavoritesAction()) { + FavoritesEntriesManager.INSTANCE.remove(favoriteEntry); + } else { + FavoritesEntriesManager.INSTANCE.add(favoriteEntry); } ConfigManager.getInstance().saveConfig(); FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesEntriesManager.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesEntriesManager.java new file mode 100644 index 000000000..c235e29ca --- /dev/null +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesEntriesManager.java @@ -0,0 +1,119 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 shedaniel + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.shedaniel.rei.impl.client.gui.widget.favorites; + +import me.shedaniel.rei.api.client.config.ConfigManager; +import me.shedaniel.rei.api.client.favorites.FavoriteEntry; +import me.shedaniel.rei.api.client.favorites.FavoriteEntryType; +import me.shedaniel.rei.api.common.util.CollectionUtils; +import me.shedaniel.rei.impl.client.config.ConfigManagerImpl; +import me.shedaniel.rei.impl.client.config.ConfigObjectImpl; +import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +public class FavoritesEntriesManager { + public static final FavoritesEntriesManager INSTANCE = new FavoritesEntriesManager(); + + private Stream<FavoriteEntry> getDefaultFavorites() { + return StreamSupport.stream(FavoriteEntryType.registry().sections().spliterator(), false) + .flatMap(section -> section.getDefaultEntries().stream()); + } + + public List<FavoriteEntry> getFavorites() { + ConfigObjectImpl config = ConfigManagerImpl.getInstance().getConfig(); + List<FavoriteEntry> defaultFavorites = getDefaultFavorites().collect(Collectors.toList()); + defaultFavorites.removeAll(config.getHiddenFavoriteEntries()); + + List<FavoriteEntry> favorites = new ArrayList<>(config.getFavoriteEntries()); + defaultFavorites.removeAll(favorites); + favorites.addAll(0, defaultFavorites); + favorites.removeIf(FavoriteEntry::isInvalid); + return favorites; + } + + public void remove(FavoriteEntry entry) { + ConfigObjectImpl config = ConfigManagerImpl.getInstance().getConfig(); + + config.getFavoriteEntries().remove(entry); + if (getDefaultFavorites().anyMatch(e -> e.equals(entry)) && !config.getHiddenFavoriteEntries().contains(entry)) { + config.getHiddenFavoriteEntries().add(entry); + } + + ConfigManager.getInstance().saveConfig(); + FavoritesListWidget widget = ScreenOverlayImpl.getFavoritesListWidget(); + if (widget != null) { + widget.updateSearch(); + } + } + + public void add(FavoriteEntry entry) { + ConfigObjectImpl config = ConfigManagerImpl.getInstance().getConfig(); + List<FavoriteEntry> defaultFavorites = getDefaultFavorites().toList(); + + config.getFavoriteEntries().remove(entry); + if (CollectionUtils.anyMatch(defaultFavorites, e -> e.equals(entry)) && !config.getHiddenFavoriteEntries().contains(entry)) { + config.getHiddenFavoriteEntries().add(entry); + } + + for (int i = defaultFavorites.size() - 1; i >= 0; i--) { + FavoriteEntry e = defaultFavorites.get(i); + if (!config.getFavoriteEntries().contains(e) && !config.getHiddenFavoriteEntries().contains(e)) { + config.getFavoriteEntries().add(0, e); + } + } + + config.getHiddenFavoriteEntries().remove(entry); + if (!CollectionUtils.anyMatch(defaultFavorites, e -> e.equals(entry))) { + config.getFavoriteEntries().add(entry); + } + + ConfigManager.getInstance().saveConfig(); + FavoritesListWidget widget = ScreenOverlayImpl.getFavoritesListWidget(); + if (widget != null) { + widget.updateSearch(); + } + } + + public void setEntries(List<FavoriteEntry> entries) { + List<FavoriteEntry> defaultFavorites = getDefaultFavorites().collect(Collectors.toList()); + List<FavoriteEntry> hiddenDefaultFavorites = new ArrayList<>(defaultFavorites); + hiddenDefaultFavorites.removeAll(entries); + ConfigObjectImpl config = ConfigManagerImpl.getInstance().getConfig(); + config.getHiddenFavoriteEntries().clear(); + config.getHiddenFavoriteEntries().addAll(hiddenDefaultFavorites); + config.getFavoriteEntries().clear(); + config.getFavoriteEntries().addAll(entries); + + ConfigManager.getInstance().saveConfig(); + FavoritesListWidget widget = ScreenOverlayImpl.getFavoritesListWidget(); + if (widget != null) { + widget.updateSearch(); + } + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidget.java index dc486b3ac..d77bd67d9 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidget.java @@ -281,7 +281,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableCo public void updateSearch() { if (ConfigObject.getInstance().isFavoritesEnabled()) { - region.setEntries(CollectionUtils.map(ConfigObject.getInstance().getFavoriteEntries(), FavoriteEntry::copy), EntryStacksRegionWidget.RemovalMode.DISAPPEAR); + region.setEntries(CollectionUtils.map(FavoritesEntriesManager.INSTANCE.getFavorites(), FavoriteEntry::copy), EntryStacksRegionWidget.RemovalMode.DISAPPEAR); } else region.setEntries(Collections.emptyList(), EntryStacksRegionWidget.RemovalMode.DISAPPEAR); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/listeners/FavoritesRegionListener.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/listeners/FavoritesRegionListener.java index 96d1de8c7..ef9a4837f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/listeners/FavoritesRegionListener.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/listeners/FavoritesRegionListener.java @@ -28,6 +28,7 @@ import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.gui.drag.DraggableStack; import me.shedaniel.rei.api.client.gui.drag.DraggingContext; +import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesEntriesManager; import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; import me.shedaniel.rei.impl.client.gui.widget.region.RealRegionEntry; import me.shedaniel.rei.impl.client.gui.widget.region.RegionEntryWidget; @@ -37,6 +38,7 @@ import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; import java.util.stream.Stream; public class FavoritesRegionListener implements RegionListener<FavoriteEntry> { @@ -47,22 +49,14 @@ public class FavoritesRegionListener implements RegionListener<FavoriteEntry> { @Override public void onDrop(Stream<FavoriteEntry> entries) { if (ConfigObject.getInstance().isFavoritesEnabled()) { - List<FavoriteEntry> favorites = ConfigObject.getInstance().getFavoriteEntries(); - favorites.clear(); - entries.forEach(entry -> { - favorites.add(entry.copy()); - }); - - ConfigManager.getInstance().saveConfig(); + FavoritesEntriesManager.INSTANCE.setEntries(entries.collect(Collectors.toList())); } } @Override public void onRemove(RealRegionEntry<FavoriteEntry> entry) { if (ConfigObject.getInstance().isFavoritesEnabled()) { - List<FavoriteEntry> favorites = ConfigObject.getInstance().getFavoriteEntries(); - favorites.removeIf(favoriteEntry -> Objects.equals(entry.getEntry(), favoriteEntry)); - ConfigManager.getInstance().saveConfig(); + FavoritesEntriesManager.INSTANCE.remove(entry.getEntry()); } } |
