Skip to content

Commit efb1fbf

Browse files
committed
add option for single-page local mods list
1 parent a3b306a commit efb1fbf

File tree

6 files changed

+38
-13
lines changed

6 files changed

+38
-13
lines changed

loader/resources/mod.json.in

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,12 @@
8585
"name": "Enable Geode-Themed Colors",
8686
"description": "When enabled, the Geode menu has a <ca>Geode-themed color scheme</c>. <cy>This does not affect any other menus!</c>"
8787
},
88+
"infinite-local-mods-list": {
89+
"type": "bool",
90+
"default": false,
91+
"name": "Expand Installed Mods List",
92+
"description": "Make the installed mods list a single infinite scrollable list instead of having pages"
93+
},
8894
"developer-title": {
8995
"type": "title",
9096
"name": "Developer Settings"

loader/src/ui/mods/sources/InstalledModListSource.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,15 @@ void InstalledModListSource::resetQuery() {
6868
};
6969
}
7070

71-
InstalledModListSource::ProviderTask InstalledModListSource::fetchPage(size_t page, size_t pageSize, bool forceUpdate) {
71+
InstalledModListSource::ProviderTask InstalledModListSource::fetchPage(size_t page, bool forceUpdate) {
7272
m_query.page = page;
73-
m_query.pageSize = pageSize;
73+
m_query.pageSize = m_pageSize;
74+
75+
// Infinite mods list option
76+
if (Mod::get()->template getSettingValue<bool>("infinite-local-mods-list")) {
77+
m_query.page = 0;
78+
m_query.pageSize = Loader::get()->getAllMods().size();
79+
}
7480

7581
auto content = ModListSource::ProvidedMods();
7682
for (auto& mod : Loader::get()->getAllMods()) {
@@ -122,3 +128,12 @@ InvalidateQueryAfter<InstalledModsQuery> InstalledModListSource::getQueryMut() {
122128
bool InstalledModListSource::isDefaultQuery() const {
123129
return m_query.isDefault();
124130
}
131+
132+
$execute {
133+
listenForSettingChanges("infinite-local-mods-list", [](bool value) {
134+
auto size = value ? std::numeric_limits<size_t>::max() : 10;
135+
InstalledModListSource::get(InstalledModListType::All)->setPageSize(size);
136+
InstalledModListSource::get(InstalledModListType::OnlyErrors)->setPageSize(size);
137+
// Updates is technically a server mod list :-) So I left it out here
138+
});
139+
}

loader/src/ui/mods/sources/ModListSource.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
#define FTS_FUZZY_MATCH_IMPLEMENTATION
66
#include <Geode/external/fts/fts_fuzzy_match.h>
77

8-
static constexpr size_t PER_PAGE = 10;
98
static std::vector<ModListSource*> ALL_EXTANT_SOURCES {};
109

1110
static size_t ceildiv(size_t a, size_t b) {
@@ -33,7 +32,7 @@ typename ModListSource::PageLoadTask ModListSource::loadPage(size_t page, bool f
3332
return PageLoadTask::immediate(Ok(m_cachedPages.at(page)));
3433
}
3534
m_cachedPages.erase(page);
36-
return this->fetchPage(page, PER_PAGE, forceUpdate).map(
35+
return this->fetchPage(page, forceUpdate).map(
3736
[this, page](Result<ProvidedMods, LoadPageError>* result) -> Result<Page, LoadPageError> {
3837
if (result->isOk()) {
3938
auto data = result->unwrap();
@@ -56,12 +55,15 @@ typename ModListSource::PageLoadTask ModListSource::loadPage(size_t page, bool f
5655
}
5756

5857
std::optional<size_t> ModListSource::getPageCount() const {
59-
return m_cachedItemCount ? std::optional(ceildiv(m_cachedItemCount.value(), PER_PAGE)) : std::nullopt;
58+
return m_cachedItemCount ? std::optional(ceildiv(m_cachedItemCount.value(), m_pageSize)) : std::nullopt;
6059
}
61-
6260
std::optional<size_t> ModListSource::getItemCount() const {
6361
return m_cachedItemCount;
6462
}
63+
void ModListSource::setPageSize(size_t size) {
64+
m_pageSize = size;
65+
this->reset();
66+
}
6567

6668
void ModListSource::reset() {
6769
this->resetQuery();

loader/src/ui/mods/sources/ModListSource.hpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,10 @@ class ModListSource {
5151
protected:
5252
std::unordered_map<size_t, Page> m_cachedPages;
5353
std::optional<size_t> m_cachedItemCount;
54+
size_t m_pageSize = 10;
5455

5556
virtual void resetQuery() = 0;
56-
virtual ProviderTask fetchPage(size_t page, size_t pageSize, bool forceUpdate) = 0;
57+
virtual ProviderTask fetchPage(size_t page, bool forceUpdate) = 0;
5758
virtual void setSearchQuery(std::string const& query) = 0;
5859

5960
ModListSource();
@@ -75,6 +76,7 @@ class ModListSource {
7576
PageLoadTask loadPage(size_t page, bool forceUpdate = false);
7677
std::optional<size_t> getPageCount() const;
7778
std::optional<size_t> getItemCount() const;
79+
void setPageSize(size_t size);
7880

7981
static void clearAllCaches();
8082
static bool isRestartRequired();
@@ -123,7 +125,7 @@ class InstalledModListSource : public ModListSource {
123125
InstalledModsQuery m_query;
124126

125127
void resetQuery() override;
126-
ProviderTask fetchPage(size_t page, size_t pageSize, bool forceUpdate) override;
128+
ProviderTask fetchPage(size_t page, bool forceUpdate) override;
127129
void setSearchQuery(std::string const& query) override;
128130

129131
InstalledModListSource(InstalledModListType type);
@@ -153,7 +155,7 @@ class ServerModListSource : public ModListSource {
153155
server::ModsQuery m_query;
154156

155157
void resetQuery() override;
156-
ProviderTask fetchPage(size_t page, size_t pageSize, bool forceUpdate) override;
158+
ProviderTask fetchPage(size_t page, bool forceUpdate) override;
157159
void setSearchQuery(std::string const& query) override;
158160

159161
ServerModListSource(ServerModListType type);
@@ -174,7 +176,7 @@ class ServerModListSource : public ModListSource {
174176
class ModPackListSource : public ModListSource {
175177
protected:
176178
void resetQuery() override;
177-
ProviderTask fetchPage(size_t page, size_t pageSize, bool forceUpdate) override;
179+
ProviderTask fetchPage(size_t page, bool forceUpdate) override;
178180
void setSearchQuery(std::string const& query) override;
179181

180182
ModPackListSource();

loader/src/ui/mods/sources/ModPackListSource.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include "ModListSource.hpp"
22

33
void ModPackListSource::resetQuery() {}
4-
ModPackListSource::ProviderTask ModPackListSource::fetchPage(size_t page, size_t pageSize, bool forceUpdate) {
4+
ModPackListSource::ProviderTask ModPackListSource::fetchPage(size_t page, bool forceUpdate) {
55
return ProviderTask::immediate(Err(LoadPageError("Coming soon ;)")));
66
}
77

loader/src/ui/mods/sources/ServerModListSource.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ void ServerModListSource::resetQuery() {
44
m_query = this->createDefaultQuery();
55
}
66

7-
ServerModListSource::ProviderTask ServerModListSource::fetchPage(size_t page, size_t pageSize, bool forceUpdate) {
7+
ServerModListSource::ProviderTask ServerModListSource::fetchPage(size_t page, bool forceUpdate) {
88
m_query.page = page;
9-
m_query.pageSize = pageSize;
9+
m_query.pageSize = m_pageSize;
1010
return server::getMods(m_query, !forceUpdate).map(
1111
[](Result<server::ServerModsList, server::ServerError>* result) -> ProviderTask::Value {
1212
if (result->isOk()) {

0 commit comments

Comments
 (0)