mirror of
https://github.com/RetroDECK/ES-DE.git
synced 2024-11-25 23: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/Window.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src/XMLReader.h
|
${CMAKE_CURRENT_SOURCE_DIR}/src/XMLReader.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src/components/AnimationComponent.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/ButtonComponent.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src/components/ComponentListComponent.h
|
${CMAKE_CURRENT_SOURCE_DIR}/src/components/ComponentListComponent.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src/components/ImageComponent.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/Window.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src/XMLReader.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/src/XMLReader.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src/components/AnimationComponent.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/ButtonComponent.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src/components/ComponentListComponent.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/src/components/ComponentListComponent.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src/components/ImageComponent.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 "GuiMetaDataEd.h"
|
||||||
#include "../Renderer.h"
|
#include "../Renderer.h"
|
||||||
#include "../Log.h"
|
#include "../Log.h"
|
||||||
|
#include "AsyncReqComponent.h"
|
||||||
|
|
||||||
#define MDED_RESERVED_ROWS 3
|
#define MDED_RESERVED_ROWS 3
|
||||||
|
|
||||||
|
@ -37,6 +38,7 @@ GuiMetaDataEd::GuiMetaDataEd(Window* window, MetaDataList* md, const std::vector
|
||||||
mDeleteButton.setPressedFunc([&] { mDeleteFunc(); delete this; });
|
mDeleteButton.setPressedFunc([&] { mDeleteFunc(); delete this; });
|
||||||
|
|
||||||
mFetchButton.setText("FETCH", 0x555555FF);
|
mFetchButton.setText("FETCH", 0x555555FF);
|
||||||
|
mFetchButton.setPressedFunc([&] { fetch(); });
|
||||||
|
|
||||||
mSaveButton.setText("SAVE", 0x0000FFFF);
|
mSaveButton.setText("SAVE", 0x0000FFFF);
|
||||||
mSaveButton.setPressedFunc([&] { save(); delete this; });
|
mSaveButton.setPressedFunc([&] { save(); delete this; });
|
||||||
|
@ -105,3 +107,8 @@ void GuiMetaDataEd::save()
|
||||||
if(mSavedCallback)
|
if(mSavedCallback)
|
||||||
mSavedCallback();
|
mSavedCallback();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GuiMetaDataEd::fetch()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void save();
|
void save();
|
||||||
|
void fetch();
|
||||||
|
|
||||||
void populateList(const std::vector<MetaDataDecl>& mdd);
|
void populateList(const std::vector<MetaDataDecl>& mdd);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue