mirror of
https://github.com/RetroDECK/ES-DE.git
synced 2024-11-21 21:55:38 +00:00
Added AsyncReqComponent for easy asynchronous, cancelable HTTP requests with a nice loading icon.
This commit is contained in:
parent
c807c98b4a
commit
e823592660
|
@ -156,6 +156,7 @@ set(ES_HEADERS
|
|||
${CMAKE_CURRENT_SOURCE_DIR}/src/Window.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/XMLReader.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/components/AnimationComponent.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/components/AsyncReqComponent.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/components/ButtonComponent.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/components/ComponentListComponent.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/components/ImageComponent.h
|
||||
|
@ -204,6 +205,7 @@ set(ES_SOURCES
|
|||
${CMAKE_CURRENT_SOURCE_DIR}/src/Window.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/XMLReader.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/components/AnimationComponent.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/components/AsyncReqComponent.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/components/ButtonComponent.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/components/ComponentListComponent.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/components/ImageComponent.cpp
|
||||
|
|
44
src/components/AsyncReqComponent.cpp
Normal file
44
src/components/AsyncReqComponent.cpp
Normal file
|
@ -0,0 +1,44 @@
|
|||
#include "AsyncReqComponent.h"
|
||||
#include "../Renderer.h"
|
||||
|
||||
AsyncReqComponent::AsyncReqComponent(Window* window, std::shared_ptr<HttpReq> req, std::function<void(std::shared_ptr<HttpReq>)> onSuccess, std::function<void()> onCancel)
|
||||
: GuiComponent(window),
|
||||
mSuccessFunc(onSuccess), mCancelFunc(onCancel), mTime(0), mRequest(req)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool AsyncReqComponent::input(InputConfig* config, Input input)
|
||||
{
|
||||
if(input.value != 0 && config->isMappedTo("b", input))
|
||||
{
|
||||
if(mCancelFunc)
|
||||
mCancelFunc();
|
||||
|
||||
delete this;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void AsyncReqComponent::update(int deltaTime)
|
||||
{
|
||||
if(mRequest->status() != HttpReq::REQ_IN_PROGRESS)
|
||||
{
|
||||
mSuccessFunc(mRequest);
|
||||
delete this;
|
||||
return;
|
||||
}
|
||||
|
||||
mTime += deltaTime;
|
||||
}
|
||||
|
||||
void AsyncReqComponent::render(const Eigen::Affine3f& parentTrans)
|
||||
{
|
||||
Eigen::Affine3f trans = Eigen::Affine3f::Identity();
|
||||
trans = trans.translate(Eigen::Vector3f(Renderer::getScreenWidth() / 2.0f, Renderer::getScreenHeight() / 2.0f, 0));
|
||||
Renderer::setMatrix(trans);
|
||||
|
||||
Eigen::Vector3f point(cos(mTime * 0.01f) * 12, sin(mTime * 0.01f) * 12, 0);
|
||||
Renderer::drawRect((int)point.x(), (int)point.y(), 8, 8, 0x0000FFFF);
|
||||
}
|
39
src/components/AsyncReqComponent.h
Normal file
39
src/components/AsyncReqComponent.h
Normal file
|
@ -0,0 +1,39 @@
|
|||
#pragma once
|
||||
|
||||
#include "../GuiComponent.h"
|
||||
#include "../HttpReq.h"
|
||||
#include <functional>
|
||||
|
||||
/* Usage example:
|
||||
std::shared_ptr<HttpReq> httpreq = std::make_shared<HttpReq>("cdn.garcya.us", "/wp-content/uploads/2010/04/TD250.jpg");
|
||||
AsyncReqComponent* req = new AsyncReqComponent(mWindow, httpreq,
|
||||
[] (std::shared_ptr<HttpReq> r)
|
||||
{
|
||||
LOG(LogInfo) << "Request completed";
|
||||
LOG(LogInfo) << " error, if any: " << r->getErrorMsg();
|
||||
}, [] ()
|
||||
{
|
||||
LOG(LogInfo) << "Request canceled";
|
||||
});
|
||||
|
||||
mWindow->pushGui(req);
|
||||
//we can forget about req, since it will always delete itself
|
||||
*/
|
||||
|
||||
class AsyncReqComponent : public GuiComponent
|
||||
{
|
||||
public:
|
||||
|
||||
AsyncReqComponent(Window* window, std::shared_ptr<HttpReq> req, std::function<void(std::shared_ptr<HttpReq>)> onSuccess, std::function<void()> onCancel = NULL);
|
||||
|
||||
bool input(InputConfig* config, Input input) override;
|
||||
void update(int deltaTime) override;
|
||||
void render(const Eigen::Affine3f& parentTrans) override;
|
||||
|
||||
private:
|
||||
std::function<void(std::shared_ptr<HttpReq>)> mSuccessFunc;
|
||||
std::function<void()> mCancelFunc;
|
||||
|
||||
unsigned int mTime;
|
||||
std::shared_ptr<HttpReq> mRequest;
|
||||
};
|
|
@ -1,6 +1,7 @@
|
|||
#include "GuiMetaDataEd.h"
|
||||
#include "../Renderer.h"
|
||||
#include "../Log.h"
|
||||
#include "AsyncReqComponent.h"
|
||||
|
||||
#define MDED_RESERVED_ROWS 3
|
||||
|
||||
|
@ -37,6 +38,7 @@ GuiMetaDataEd::GuiMetaDataEd(Window* window, MetaDataList* md, const std::vector
|
|||
mDeleteButton.setPressedFunc([&] { mDeleteFunc(); delete this; });
|
||||
|
||||
mFetchButton.setText("FETCH", 0x555555FF);
|
||||
mFetchButton.setPressedFunc([&] { fetch(); });
|
||||
|
||||
mSaveButton.setText("SAVE", 0x0000FFFF);
|
||||
mSaveButton.setPressedFunc([&] { save(); delete this; });
|
||||
|
@ -72,7 +74,7 @@ void GuiMetaDataEd::populateList(const std::vector<MetaDataDecl>& mdd)
|
|||
|
||||
//fetch button
|
||||
mList.setEntry(Vector2i(1, y), Vector2i(1, 1), &mFetchButton, true, ComponentListComponent::AlignCenter);
|
||||
|
||||
|
||||
y++;
|
||||
|
||||
for(auto iter = mdd.begin(); iter != mdd.end(); iter++)
|
||||
|
@ -105,3 +107,8 @@ void GuiMetaDataEd::save()
|
|||
if(mSavedCallback)
|
||||
mSavedCallback();
|
||||
}
|
||||
|
||||
void GuiMetaDataEd::fetch()
|
||||
{
|
||||
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@ public:
|
|||
|
||||
private:
|
||||
void save();
|
||||
void fetch();
|
||||
|
||||
void populateList(const std::vector<MetaDataDecl>& mdd);
|
||||
|
||||
|
|
Loading…
Reference in a new issue