mirror of
https://github.com/geode-sdk/geode.git
synced 2025-03-19 17:39:50 -04:00
fix description & changelog not working on server mods
This commit is contained in:
parent
f48dc529a8
commit
5c3111e564
4 changed files with 98 additions and 31 deletions
loader/src/ui
|
@ -147,6 +147,9 @@ protected:
|
|||
this->setSprite(CCSprite::createWithTexture(texture));
|
||||
}
|
||||
}
|
||||
else if (event->isCancelled()) {
|
||||
this->setSprite(nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
|
|
|
@ -5,6 +5,60 @@
|
|||
#include <Geode/utils/ColorProvider.hpp>
|
||||
#include "ConfirmUninstallPopup.hpp"
|
||||
|
||||
class FetchTextArea : public CCNode {
|
||||
public:
|
||||
using Request = server::ServerRequest<std::optional<std::string>>;
|
||||
|
||||
protected:
|
||||
EventListener<Request> m_listener;
|
||||
MDTextArea* m_textarea;
|
||||
CCNode* m_loading;
|
||||
std::string m_noneText;
|
||||
|
||||
bool init(Request const& req, std::string const& noneText, CCSize const& size) {
|
||||
if (!CCNode::init())
|
||||
return false;
|
||||
|
||||
this->setAnchorPoint({ .5f, .5f });
|
||||
this->setContentSize(size);
|
||||
|
||||
m_noneText = noneText;
|
||||
|
||||
m_textarea = MDTextArea::create("", size);
|
||||
this->addChildAtPosition(m_textarea, Anchor::Center);
|
||||
|
||||
m_loading = createLoadingCircle(30);
|
||||
this->addChildAtPosition(m_loading, Anchor::Center);
|
||||
|
||||
m_listener.bind(this, &FetchTextArea::onRequest);
|
||||
m_listener.setFilter(req);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void onRequest(Request::Event* event) {
|
||||
if (event->getValue() && event->getValue()->isOk() && event->getValue()->unwrap()) {
|
||||
m_loading->removeFromParent();
|
||||
m_textarea->setString(event->getValue()->unwrap()->c_str());
|
||||
}
|
||||
else if (!event->getProgress()) {
|
||||
m_loading->removeFromParent();
|
||||
m_textarea->setString(m_noneText.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
static FetchTextArea* create(Request const& req, std::string const& noneText, CCSize const& size) {
|
||||
auto ret = new FetchTextArea();
|
||||
if (ret && ret->init(req, noneText, size)) {
|
||||
ret->autorelease();
|
||||
return ret;
|
||||
}
|
||||
CC_SAFE_DELETE(ret);
|
||||
return nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
bool ModPopup::setup(ModSource&& src) {
|
||||
m_source = std::move(src);
|
||||
m_noElasticity = true;
|
||||
|
@ -665,16 +719,18 @@ void ModPopup::loadTab(ModPopup::Tab tab) {
|
|||
const float mdScale = .85f;
|
||||
switch (tab) {
|
||||
case Tab::Details: {
|
||||
m_currentTabPage = MDTextArea::create(
|
||||
m_source.getAbout().value_or("No description provided"),
|
||||
m_currentTabPage = FetchTextArea::create(
|
||||
m_source.fetchAbout(),
|
||||
"No description provided",
|
||||
size / mdScale
|
||||
);
|
||||
m_currentTabPage->setScale(mdScale);
|
||||
} break;
|
||||
|
||||
case Tab::Changelog: {
|
||||
m_currentTabPage = MDTextArea::create(
|
||||
m_source.getChangelog().value_or("No changelog provided"),
|
||||
m_currentTabPage = FetchTextArea::create(
|
||||
m_source.fetchChangelog(),
|
||||
"No changelog provided",
|
||||
size / mdScale
|
||||
);
|
||||
m_currentTabPage->setScale(mdScale);
|
||||
|
|
|
@ -26,28 +26,6 @@ ModMetadata ModSource::getMetadata() const {
|
|||
}
|
||||
}, m_value);
|
||||
}
|
||||
std::optional<std::string> ModSource::getAbout() const {
|
||||
return std::visit(makeVisitor {
|
||||
[](Mod* mod) {
|
||||
return mod->getMetadata().getDetails();
|
||||
},
|
||||
[](server::ServerModMetadata const& metadata) {
|
||||
// Versions should be guaranteed to have at least one item
|
||||
return metadata.about;
|
||||
}
|
||||
}, m_value);
|
||||
}
|
||||
std::optional<std::string> ModSource::getChangelog() const {
|
||||
return std::visit(makeVisitor {
|
||||
[](Mod* mod) {
|
||||
return mod->getMetadata().getChangelog();
|
||||
},
|
||||
[](server::ServerModMetadata const& metadata) {
|
||||
// Versions should be guaranteed to have at least one item
|
||||
return metadata.changelog;
|
||||
}
|
||||
}, m_value);
|
||||
}
|
||||
CCNode* ModSource::createModLogo() const {
|
||||
return std::visit(makeVisitor {
|
||||
[](Mod* mod) {
|
||||
|
@ -95,16 +73,46 @@ server::ServerModMetadata const* ModSource::asServer() const {
|
|||
return std::get_if<server::ServerModMetadata>(&m_value);
|
||||
}
|
||||
|
||||
server::ServerRequest<server::ServerModMetadata> ModSource::fetchServerInfo() const {
|
||||
server::ServerRequest<std::optional<std::string>> ModSource::fetchAbout() const {
|
||||
return std::visit(makeVisitor {
|
||||
[](Mod* mod) {
|
||||
return server::getMod(mod->getID());
|
||||
return server::ServerRequest<std::optional<std::string>>::immediate(Ok(mod->getMetadata().getDetails()));
|
||||
},
|
||||
[](server::ServerModMetadata const& metadata) {
|
||||
return server::ServerRequest<server::ServerModMetadata>::immediate(Ok(metadata));
|
||||
return server::getMod(metadata.id).map(
|
||||
[](auto* result) -> Result<std::optional<std::string>, server::ServerError> {
|
||||
if (result->isOk()) {
|
||||
return Ok(result->unwrap().about);
|
||||
}
|
||||
return Err(result->unwrapErr());
|
||||
}
|
||||
);
|
||||
}
|
||||
}, m_value);
|
||||
}
|
||||
server::ServerRequest<std::optional<std::string>> ModSource::fetchChangelog() const {
|
||||
return std::visit(makeVisitor {
|
||||
[](Mod* mod) {
|
||||
return server::ServerRequest<std::optional<std::string>>::immediate(Ok(mod->getMetadata().getChangelog()));
|
||||
},
|
||||
[](server::ServerModMetadata const& metadata) {
|
||||
return server::getMod(metadata.id).map(
|
||||
[](auto* result) -> Result<std::optional<std::string>, server::ServerError> {
|
||||
if (result->isOk()) {
|
||||
return Ok(result->unwrap().changelog);
|
||||
}
|
||||
return Err(result->unwrapErr());
|
||||
}
|
||||
);
|
||||
}
|
||||
}, m_value);
|
||||
}
|
||||
server::ServerRequest<server::ServerModMetadata> ModSource::fetchServerInfo() const {
|
||||
// Request the info even if this is already a server mod because this might
|
||||
// not have the full details (for example changelog) and the server cache
|
||||
// should deal with performance issues
|
||||
return server::getMod(this->getID());
|
||||
}
|
||||
server::ServerRequest<std::unordered_set<std::string>> ModSource::fetchValidTags() const {
|
||||
return std::visit(makeVisitor {
|
||||
[](Mod* mod) {
|
||||
|
|
|
@ -17,8 +17,6 @@ public:
|
|||
|
||||
std::string getID() const;
|
||||
ModMetadata getMetadata() const;
|
||||
std::optional<std::string> getAbout() const;
|
||||
std::optional<std::string> getChangelog() const;
|
||||
CCNode* createModLogo() const;
|
||||
bool wantsRestart() const;
|
||||
// note: be sure to call checkUpdates first...
|
||||
|
@ -36,6 +34,8 @@ public:
|
|||
server::ServerModMetadata const* asServer() const;
|
||||
|
||||
server::ServerRequest<server::ServerModMetadata> fetchServerInfo() const;
|
||||
server::ServerRequest<std::optional<std::string>> fetchAbout() const;
|
||||
server::ServerRequest<std::optional<std::string>> fetchChangelog() const;
|
||||
server::ServerRequest<std::unordered_set<std::string>> fetchValidTags() const;
|
||||
server::ServerRequest<std::optional<server::ServerModUpdate>> checkUpdates();
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue