diff --git a/src/dialogues/ConfirmPrompt.cpp b/src/dialogues/ConfirmPrompt.cpp index a5f742dbf..6943555bd 100644 --- a/src/dialogues/ConfirmPrompt.cpp +++ b/src/dialogues/ConfirmPrompt.cpp @@ -6,24 +6,30 @@ */ #include "ConfirmPrompt.h" -#include "interface/Label.h" +#include "interface/Textblock.h" #include "interface/Button.h" ConfirmPrompt::ConfirmPrompt(std::string title, std::string message, ConfirmDialogueCallback * callback_): - ui::Window(ui::Point(-1, -1), ui::Point(200, 75)), + ui::Window(ui::Point(-1, -1), ui::Point(200, 50)), callback(callback_) { - ui::Label * titleLabel = new ui::Label(ui::Point(2, 1), ui::Point(Size.X-4, 16), title); + int width, height; + ui::Label * titleLabel = new ui::Label(ui::Point(4, 5), ui::Point(Size.X-8, 15), title); titleLabel->SetTextColour(ui::Colour(220, 220, 50)); titleLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; - titleLabel->Appearance.VerticalAlign = ui::Appearance::AlignBottom; + titleLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; AddComponent(titleLabel); - ui::Label * messageLabel = new ui::Label(ui::Point(4, 18), ui::Point(Size.X-8, 60), message); + + ui::Textblock * messageLabel = new ui::Textblock(ui::Point(4, 25), ui::Point(Size.X-8, 60), message); + Graphics::textsize(messageLabel->GetDisplayText().c_str(), width, height); messageLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; messageLabel->Appearance.VerticalAlign = ui::Appearance::AlignTop; AddComponent(messageLabel); + Size.Y += height; + Position.Y = (ui::Engine::Ref().GetHeight()-Size.Y)/2; + class CloseAction: public ui::ButtonAction { public: @@ -34,21 +40,21 @@ ConfirmPrompt::ConfirmPrompt(std::string title, std::string message, ConfirmDial { ui::Engine::Ref().CloseWindow(); prompt->callback->ConfirmCallback(result); - prompt->SelfDestruct(); //TODO: Fix component disposal + prompt->SelfDestruct(); } }; ui::Button * cancelButton = new ui::Button(ui::Point(0, Size.Y-16), ui::Point(Size.X-50, 16), "Cancel"); cancelButton->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; - cancelButton->Appearance.VerticalAlign = ui::Appearance::AlignBottom; + cancelButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; cancelButton->Appearance.BorderInactive = ui::Colour(200, 200, 200); cancelButton->SetActionCallback(new CloseAction(this, ResultCancel)); AddComponent(cancelButton); - ui::Button * okayButton = new ui::Button(ui::Point(Size.X-50, Size.Y-16), ui::Point(50, 16), "Continue"); + ui::Button * okayButton = new ui::Button(ui::Point(Size.X-76, Size.Y-16), ui::Point(76, 16), "Continue"); okayButton->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; - okayButton->Appearance.VerticalAlign = ui::Appearance::AlignBottom; + okayButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; okayButton->Appearance.TextInactive = ui::Colour(220, 220, 50); okayButton->SetActionCallback(new CloseAction(this, ResultOkay)); AddComponent(okayButton); diff --git a/src/game/GameController.cpp b/src/game/GameController.cpp index 6ed6e0f0c..71e485d39 100644 --- a/src/game/GameController.cpp +++ b/src/game/GameController.cpp @@ -10,6 +10,7 @@ #include "login/LoginController.h" #include "interface/Point.h" #include "dialogues/ErrorMessage.h" +#include "dialogues/ConfirmPrompt.h" #include "GameModelException.h" #include "simulation/Air.h" #include "Notification.h" @@ -121,7 +122,8 @@ GameController::GameController(): ssave(NULL), console(NULL), tagsWindow(NULL), - options(NULL) + options(NULL), + HasDone(false) { gameView = new GameView(); gameModel = new GameModel(); @@ -391,6 +393,13 @@ void GameController::Tick() commandInterface->OnTick(); } +void GameController::Exit() +{ + if(ui::Engine::Ref().GetWindow() == gameView) + ui::Engine::Ref().CloseWindow(); + HasDone = true; +} + void GameController::Update() { ui::Point pos = gameView->GetMousePosition(); @@ -629,6 +638,19 @@ std::string GameController::ElementResolve(int type) void GameController::NotifyUpdateAvailable(Client * sender) { + class UpdateConfirmation: public ConfirmDialogueCallback { + public: + GameController * c; + UpdateConfirmation(GameController * c_) { c = c_; } + virtual void ConfirmCallback(ConfirmPrompt::DialogueResult result) { + if (result == ConfirmPrompt::ResultOkay) + { + c->RunUpdater(); + } + } + virtual ~UpdateConfirmation() { } + }; + class UpdateNotification : public Notification { GameController * c; @@ -638,7 +660,7 @@ void GameController::NotifyUpdateAvailable(Client * sender) virtual void Action() { - c->RemoveNotification(this); + new ConfirmPrompt("Run Updater", "Are you sure you want to run the updater, please save any changes before updating", new UpdateConfirmation(c)); } }; @@ -650,3 +672,8 @@ void GameController::RemoveNotification(Notification * notification) gameModel->RemoveNotification(notification); } +void GameController::RunUpdater() +{ + Exit(); +} + diff --git a/src/game/GameController.h b/src/game/GameController.h index 269cdf541..c424656e1 100644 --- a/src/game/GameController.h +++ b/src/game/GameController.h @@ -42,6 +42,7 @@ private: OptionsController * options; CommandInterface * commandInterface; public: + bool HasDone; class LoginCallback; class SearchCallback; class RenderCallback; @@ -60,6 +61,7 @@ public: bool KeyPress(int key, Uint16 character, bool shift, bool ctrl, bool alt); bool KeyRelease(int key, Uint16 character, bool shift, bool ctrl, bool alt); void Tick(); + void Exit(); void SetZoomEnabled(bool zoomEnable); void SetZoomPosition(ui::Point position); @@ -107,6 +109,7 @@ public: void RemoveNotification(Notification * notification); virtual void NotifyUpdateAvailable(Client * sender); + void RunUpdater(); }; #endif // GAMECONTROLLER_H diff --git a/src/interface/Textblock.h b/src/interface/Textblock.h index 99b79e6fa..7a94c7797 100644 --- a/src/interface/Textblock.h +++ b/src/interface/Textblock.h @@ -25,6 +25,7 @@ public: Textblock(Point position, Point size, std::string textboxText); virtual void TextPosition() {} virtual void SetText(std::string text); + virtual std::string GetDisplayText() { return textLines; } virtual void Draw(const Point& screenPos); virtual ~Textblock(); }; diff --git a/src/tasks/Task.cpp b/src/tasks/Task.cpp index c20a0ea9d..ec0ae9957 100644 --- a/src/tasks/Task.cpp +++ b/src/tasks/Task.cpp @@ -17,6 +17,8 @@ void Task::SetTaskListener(TaskListener * listener) void Task::Start() { + pthread_mutex_init (&taskMutex, NULL); + pthread_cond_init(&taskCond, NULL); pthread_create(&doWorkThread, 0, &Task::doWork_helper, this); } @@ -35,6 +37,42 @@ bool Task::GetDone() return done; } +void Task::Poll() +{ + int newProgress; + bool newDone; + std::string newStatus; + pthread_mutex_lock(&taskMutex); + newProgress = thProgress; + newDone = thDone; + newStatus = std::string(thStatus); + pthread_cond_signal(&taskCond); + pthread_mutex_unlock(&taskMutex); + + if(newProgress!=progress) { + progress = newProgress; + if(listener) + listener->NotifyProgress(this); + } + if(newStatus!=status) { + status = newStatus; + if(listener) + listener->NotifyStatus(this); + } + if(newDone!=done) + { + done = newDone; + if(listener) + listener->NotifyDone(this); + } + + if(done) + { + pthread_join(doWorkThread, NULL); + pthread_mutex_destroy(&taskMutex); + } +} + Task::~Task() { @@ -59,26 +97,24 @@ void * Task::doWork_helper(void * ref) void Task::notifyProgress(int progress) { - if(this->progress!=progress) { - this->progress = progress; - if(listener) - listener->NotifyProgress(this); - } + pthread_mutex_lock(&taskMutex); + pthread_cond_wait(&taskCond, &taskMutex); + thProgress = progress; + pthread_mutex_unlock(&taskMutex); } void Task::notifyStatus(std::string status) { - if(this->status!=status) { - this->status = status; - if(listener) - listener->NotifyStatus(this); - } + pthread_mutex_lock(&taskMutex); + pthread_cond_wait(&taskCond, &taskMutex); + thStatus = status; + pthread_mutex_unlock(&taskMutex); } void Task::notifyDone() { - if(listener) - { - done = true; listener->NotifyDone(this); - } + pthread_mutex_lock(&taskMutex); + pthread_cond_wait(&taskCond, &taskMutex); + thDone = true; + pthread_mutex_unlock(&taskMutex); } diff --git a/src/tasks/Task.h b/src/tasks/Task.h index 90463cbf1..d5ccd4b92 100644 --- a/src/tasks/Task.h +++ b/src/tasks/Task.h @@ -20,16 +20,26 @@ public: int GetProgress(); bool GetDone(); std::string GetStatus(); + void Poll(); Task() {} virtual ~Task(); protected: int progress; bool done; std::string status; + + int thProgress; + bool thDone; + std::string thStatus; + TaskListener * listener; pthread_t doWorkThread; + pthread_mutex_t taskMutex; + pthread_cond_t taskCond; + virtual void doWork(); static void * doWork_helper(void * ref); + void notifyProgress(int progress); void notifyStatus(std::string status); void notifyDone(); diff --git a/src/tasks/TaskWindow.cpp b/src/tasks/TaskWindow.cpp index ac22c79ed..e0e71bfe2 100644 --- a/src/tasks/TaskWindow.cpp +++ b/src/tasks/TaskWindow.cpp @@ -48,6 +48,11 @@ void TaskWindow::NotifyProgress(Task * task) progress = task->GetProgress(); } +void TaskWindow::OnTick(float dt) +{ + task->Poll(); +} + void TaskWindow::OnDraw() { Graphics * g = ui::Engine::Ref().g; diff --git a/src/tasks/TaskWindow.h b/src/tasks/TaskWindow.h index cacb59cda..d7edf8b64 100644 --- a/src/tasks/TaskWindow.h +++ b/src/tasks/TaskWindow.h @@ -25,6 +25,7 @@ public: virtual void NotifyStatus(Task * task); virtual void NotifyDone(Task * task); virtual void NotifyProgress(Task * task); + virtual void OnTick(float dt); virtual void OnDraw(); virtual ~TaskWindow(); }; diff --git a/src/update/UpdateActivity.cpp b/src/update/UpdateActivity.cpp new file mode 100644 index 000000000..607204565 --- /dev/null +++ b/src/update/UpdateActivity.cpp @@ -0,0 +1,28 @@ +/* + * UpdateActivity.cpp + * + * Created on: Jun 20, 2012 + * Author: Simon + */ + +#include "UpdateActivity.h" +#include "tasks/Task.h" + +class UpdateDownloadTask : public Task +{ + UpdateDownloadTask() {}; + /*virtual void doWork() + { + while(1) + }*/ +}; + +UpdateActivity::UpdateActivity() { + // TODO Auto-generated constructor stub + +} + +UpdateActivity::~UpdateActivity() { + // TODO Auto-generated destructor stub +} + diff --git a/src/update/UpdateActivity.h b/src/update/UpdateActivity.h new file mode 100644 index 000000000..6865fdfe0 --- /dev/null +++ b/src/update/UpdateActivity.h @@ -0,0 +1,22 @@ +/* + * UpdateActivity.h + * + * Created on: Jun 20, 2012 + * Author: Simon + */ + +#ifndef UPDATEACTIVITY_H_ +#define UPDATEACTIVITY_H_ + +#include "interface/Window.h" +#include "tasks/TaskWindow.h" + +class UpdateActivity { + Task * updateDownloadTask; + TaskWindow * updateWindow; +public: + UpdateActivity(); + virtual ~UpdateActivity(); +}; + +#endif /* UPDATEACTIVITY_H_ */