From af4d0220877b8017c37b48cd09e123f0b3ce59e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20B=C3=A1lint=20Misius?= Date: Thu, 7 Mar 2019 11:42:29 +0100 Subject: [PATCH] Add RequestMonitor --- src/client/RequestMonitor.h | 56 ++++++++++++++++++++++++++++++ src/gui/interface/AvatarButton.cpp | 17 +++++---- src/gui/interface/AvatarButton.h | 11 +++--- src/gui/interface/SaveButton.cpp | 25 +++++-------- src/gui/interface/SaveButton.h | 12 +++---- 5 files changed, 84 insertions(+), 37 deletions(-) create mode 100644 src/client/RequestMonitor.h diff --git a/src/client/RequestMonitor.h b/src/client/RequestMonitor.h new file mode 100644 index 0000000000..d32886c894 --- /dev/null +++ b/src/client/RequestMonitor.h @@ -0,0 +1,56 @@ +#ifndef REQUESTMONITOR_H +#define REQUESTMONITOR_H + +#include +#include + +namespace http +{ + template + class RequestMonitor + { + R *request; + + protected: + RequestMonitor() : + request(nullptr) + { + } + + virtual ~RequestMonitor() + { + if (request) + { + request->Cancel(); + } + } + + void RequestPoll() + { + if (request && request->CheckDone()) + { + OnResponse(request->Finish()); + request = nullptr; + } + } + + template + void RequestSetup(Args&&... args) + { + assert(!request); + request = new R(std::forward(args)...); + } + + void RequestStart() + { + assert(request); + request->Start(); + } + + virtual void OnResponse(typename std::result_of::type v) = 0; + }; +} + +#endif // REQUESTMONITOR_H + + diff --git a/src/gui/interface/AvatarButton.cpp b/src/gui/interface/AvatarButton.cpp index 9c70f9ec37..1f75795223 100644 --- a/src/gui/interface/AvatarButton.cpp +++ b/src/gui/interface/AvatarButton.cpp @@ -4,7 +4,6 @@ #include "AvatarButton.h" #include "Format.h" #include "client/Client.h" -#include "client/AvatarRequest.h" #include "graphics/Graphics.h" #include "ContextMenu.h" #include "Keys.h" @@ -14,7 +13,6 @@ namespace ui { AvatarButton::AvatarButton(Point position, Point size, ByteString username): Component(position, size), - avatarRequest(nullptr), name(username), tried(false), actionCallback(NULL) @@ -27,20 +25,21 @@ AvatarButton::~AvatarButton() delete actionCallback; } +void AvatarButton::OnResponse(std::unique_ptr Avatar) +{ + avatar = std::move(Avatar); +} + void AvatarButton::Tick(float dt) { if(!avatar && !tried && name.size() > 0) { tried = true; - avatarRequest = new http::AvatarRequest(name, Size.X, Size.Y); - avatarRequest->Start(); + RequestSetup(name, Size.X, Size.Y); + RequestStart(); } - if (avatarRequest && avatarRequest->CheckDone()) - { - avatar = avatarRequest->Finish(); - avatarRequest = nullptr; - } + RequestPoll(); } void AvatarButton::Draw(const Point& screenPos) diff --git a/src/gui/interface/AvatarButton.h b/src/gui/interface/AvatarButton.h index 867a3f6b6d..ac65ecb2df 100644 --- a/src/gui/interface/AvatarButton.h +++ b/src/gui/interface/AvatarButton.h @@ -6,13 +6,11 @@ #include "Component.h" #include "graphics/Graphics.h" #include "gui/interface/Colour.h" +#include "client/AvatarRequest.h" +#include "client/RequestMonitor.h" #include -namespace http -{ - class AvatarRequest; -} namespace ui { class AvatarButton; @@ -23,10 +21,9 @@ class AvatarButtonAction virtual ~AvatarButtonAction() {} }; -class AvatarButton : public Component +class AvatarButton : public Component, public http::RequestMonitor { std::unique_ptr avatar; - http::AvatarRequest *avatarRequest; ByteString name; bool tried; public: @@ -44,6 +41,8 @@ class AvatarButton : public Component void Draw(const Point& screenPos) override; void Tick(float dt) override; + void OnResponse(std::unique_ptr avatar) override; + void DoAction(); void SetUsername(ByteString username) { name = username; } diff --git a/src/gui/interface/SaveButton.cpp b/src/gui/interface/SaveButton.cpp index fd1275a38f..419c8d57f4 100644 --- a/src/gui/interface/SaveButton.cpp +++ b/src/gui/interface/SaveButton.cpp @@ -8,11 +8,10 @@ #include "SaveButton.h" #include "client/Client.h" #include "client/SaveInfo.h" -#include "client/ThumbnailRequest.h" #include "client/ThumbnailRenderer.h" -#include "graphics/Graphics.h" #include "simulation/SaveRenderer.h" #include "client/GameSave.h" +#include "simulation/SaveRenderer.h" namespace ui { @@ -24,7 +23,6 @@ SaveButton::SaveButton(Point position, Point size, SaveInfo * save): isMouseInsideAuthor(false), isMouseInsideHistory(false), showVotes(false), - thumbnailRequest(nullptr), isButtonDown(false), isMouseInside(false), selected(false), @@ -98,7 +96,6 @@ SaveButton::SaveButton(Point position, Point size, SaveFile * file): isMouseInsideAuthor(false), isMouseInsideHistory(false), showVotes(false), - thumbnailRequest(nullptr), isButtonDown(false), isMouseInside(false), selected(false), @@ -119,16 +116,16 @@ SaveButton::SaveButton(Point position, Point size, SaveFile * file): SaveButton::~SaveButton() { - if (thumbnailRequest) - { - thumbnailRequest->Cancel(); - } - delete actionCallback; delete save; delete file; } +void SaveButton::OnResponse(std::unique_ptr Thumbnail) +{ + thumbnail = std::move(Thumbnail); +} + void SaveButton::Tick(float dt) { if (!thumbnail) @@ -147,8 +144,8 @@ void SaveButton::Tick(float dt) } else if (save->GetID()) { - thumbnailRequest = new http::ThumbnailRequest(save->GetID(), save->GetVersion(), thumbBoxSize.X, thumbBoxSize.Y); - thumbnailRequest->Start(); + RequestSetup(save->GetID(), save->GetVersion(), thumbBoxSize.X, thumbBoxSize.Y); + RequestStart(); triedThumbnail = true; } } @@ -160,11 +157,7 @@ void SaveButton::Tick(float dt) } } - if (thumbnailRequest && thumbnailRequest->CheckDone()) - { - thumbnail = thumbnailRequest->Finish(); - thumbnailRequest = nullptr; - } + RequestPoll(); if (thumbnailRenderer) { diff --git a/src/gui/interface/SaveButton.h b/src/gui/interface/SaveButton.h index 08932597d9..ac900f983d 100644 --- a/src/gui/interface/SaveButton.h +++ b/src/gui/interface/SaveButton.h @@ -8,14 +8,13 @@ #include "client/SaveInfo.h" #include "graphics/Graphics.h" #include "gui/interface/Colour.h" +#include "client/ThumbnailRequest.h" +#include "client/RequestMonitor.h" +#include "graphics/Graphics.h" #include class ThumbnailRendererTask; -namespace http -{ - class ThumbnailRequest; -} namespace ui { class SaveButton; @@ -29,7 +28,7 @@ class SaveButtonAction virtual ~SaveButtonAction() {} }; -class SaveButton : public Component +class SaveButton : public Component, public http::RequestMonitor { SaveFile * file; SaveInfo * save; @@ -47,7 +46,6 @@ class SaveButton : public Component bool isMouseInsideHistory; bool showVotes; std::unique_ptr thumbnailRenderer; - http::ThumbnailRequest *thumbnailRequest; public: SaveButton(Point position, Point size, SaveInfo * save); SaveButton(Point position, Point size, SaveFile * file); @@ -67,6 +65,8 @@ class SaveButton : public Component void Draw(const Point& screenPos) override; void Tick(float dt) override; + void OnResponse(std::unique_ptr thumbnail) override; + void SetSelected(bool selected_) { selected = selected_; } bool GetSelected() { return selected; } void SetSelectable(bool selectable_) { selectable = selectable_; }