diff options
| author | Simon Robertshaw <simon@hardwired.org.uk> | 2012-06-07 13:23:26 (GMT) |
|---|---|---|
| committer | Simon Robertshaw <simon@hardwired.org.uk> | 2012-06-07 13:23:26 (GMT) |
| commit | 61ed6e0276d580515d0acf5ddb96b1db95b9b191 (patch) | |
| tree | 65d9ad219e0b0f6bb1a81813c1888888f2cbd7a4 /src/localbrowser | |
| parent | 2e48fc6115ebe0d294a2c7ff7fe8774217676f44 (diff) | |
| download | powder-61ed6e0276d580515d0acf5ddb96b1db95b9b191.zip powder-61ed6e0276d580515d0acf5ddb96b1db95b9b191.tar.gz | |
Rename Save class to SaveInfo, introduce SaveFile for hanlding of local data (stamps and local saves). Rename Stamps browser to LocalBrowser, ready for sharing code with the local save browser
Diffstat (limited to 'src/localbrowser')
| -rw-r--r-- | src/localbrowser/LocalBrowserController.cpp | 135 | ||||
| -rw-r--r-- | src/localbrowser/LocalBrowserController.h | 39 | ||||
| -rw-r--r-- | src/localbrowser/LocalBrowserModel.cpp | 131 | ||||
| -rw-r--r-- | src/localbrowser/LocalBrowserModel.h | 43 | ||||
| -rw-r--r-- | src/localbrowser/LocalBrowserModelException.h | 23 | ||||
| -rw-r--r-- | src/localbrowser/LocalBrowserView.cpp | 197 | ||||
| -rw-r--r-- | src/localbrowser/LocalBrowserView.h | 40 |
7 files changed, 608 insertions, 0 deletions
diff --git a/src/localbrowser/LocalBrowserController.cpp b/src/localbrowser/LocalBrowserController.cpp new file mode 100644 index 0000000..a66715a --- /dev/null +++ b/src/localbrowser/LocalBrowserController.cpp @@ -0,0 +1,135 @@ +/* + * StampsController.cpp + * + * Created on: Mar 29, 2012 + * Author: Simon + */ +#include <sstream> +#include <unistd.h> + +#include "client/Client.h" +#include "LocalBrowserController.h" +#include "interface/Engine.h" +#include "dialogues/ConfirmPrompt.h" +#include "tasks/TaskWindow.h" +#include "tasks/Task.h" + +#include "LocalBrowserModel.h" +#include "LocalBrowserView.h" + +LocalBrowserController::LocalBrowserController(ControllerCallback * callback): + HasDone(false) +{ + browserModel = new LocalBrowserModel(); + browserView = new LocalBrowserView(); + browserView->AttachController(this); + browserModel->AddObserver(browserView); + + this->callback = callback; + + browserModel->UpdateSavesList(1); +} + +void LocalBrowserController::OpenSave(SaveFile * save) +{ + browserModel->SetSave(save); +} + +SaveFile * LocalBrowserController::GetSave() +{ + return browserModel->GetSave(); +} + +void LocalBrowserController::RemoveSelected() +{ + class RemoveSelectedConfirmation: public ConfirmDialogueCallback { + public: + LocalBrowserController * c; + RemoveSelectedConfirmation(LocalBrowserController * c_) { c = c_; } + virtual void ConfirmCallback(ConfirmPrompt::DialogueResult result) { + if (result == ConfirmPrompt::ResultOkay) + c->removeSelectedC(); + } + virtual ~RemoveSelectedConfirmation() { } + }; + + std::stringstream desc; + desc << "Are you sure you want to delete " << browserModel->GetSelected().size() << " saves"; + if(browserModel->GetSelected().size()>1) + desc << "s"; + new ConfirmPrompt("Delete saves", desc.str(), new RemoveSelectedConfirmation(this)); +} + +void LocalBrowserController::removeSelectedC() +{ + class RemoveSavesTask : public Task + { + std::vector<std::string> saves; + public: + RemoveSavesTask(std::vector<std::string> saves_) { saves = saves_; } + virtual void doWork() + { + for(int i = 0; i < saves.size(); i++) + { + std::stringstream saveName; + saveName << "Deleting save [" << saves[i] << "] ..."; + notifyStatus(saveName.str()); + Client::Ref().DeleteStamp(saves[i]); + usleep(100*1000); + notifyProgress((float(i+1)/float(saves.size())*100)); + } + } + }; + + std::vector<std::string> selected = browserModel->GetSelected(); + new TaskWindow("Removing saves", new RemoveSavesTask(selected)); + ClearSelection(); + browserModel->UpdateSavesList(browserModel->GetPageNum()); +} + +void LocalBrowserController::ClearSelection() +{ + browserModel->ClearSelected(); +} + +void LocalBrowserController::NextPage() +{ + if(browserModel->GetPageNum()>1) + browserModel->UpdateSavesList(browserModel->GetPageNum()-1); +} + +void LocalBrowserController::PrevPage() +{ + if(browserModel->GetPageNum() <= browserModel->GetPageCount()) + browserModel->UpdateSavesList(browserModel->GetPageNum()+1); +} + +void LocalBrowserController::Update() +{ + if(browserModel->GetSave()) + { + Exit(); + } +} + +void LocalBrowserController::Selected(std::string saveName, bool selected) +{ + if(selected) + browserModel->SelectSave(saveName); + else + browserModel->DeselectSave(saveName); +} + +void LocalBrowserController::Exit() +{ + if(ui::Engine::Ref().GetWindow() == browserView) + ui::Engine::Ref().CloseWindow(); + if(callback) + callback->ControllerExit(); + HasDone = true; +} + +LocalBrowserController::~LocalBrowserController() { + // TODO Auto-generated destructor stub +} + diff --git a/src/localbrowser/LocalBrowserController.h b/src/localbrowser/LocalBrowserController.h new file mode 100644 index 0000000..233ff9c --- /dev/null +++ b/src/localbrowser/LocalBrowserController.h @@ -0,0 +1,39 @@ +/* + * StampsController.h + * + * Created on: Mar 29, 2012 + * Author: Simon + */ + +#ifndef STAMPSCONTROLLER_H_ +#define STAMPSCONTROLLER_H_ + +#include "Controller.h" +#include "LocalBrowserView.h" +#include "client/SaveInfo.h" + +class LocalBrowserView; +class LocalBrowserModel; +class LocalBrowserController { + ControllerCallback * callback; + LocalBrowserView * browserView; + LocalBrowserModel * browserModel; +public: + bool HasDone; + LocalBrowserController(ControllerCallback * callback); + LocalBrowserView * GetView() {return browserView;} + SaveFile * GetSave(); + void RemoveSelected(); + void removeSelectedC(); + void ClearSelection(); + void Selected(std::string stampID, bool selected); + void OpenSave(SaveFile * stamp); + void SetStamp(); + void NextPage(); + void PrevPage(); + void Update(); + void Exit(); + virtual ~LocalBrowserController(); +}; + +#endif /* STAMPSCONTROLLER_H_ */ diff --git a/src/localbrowser/LocalBrowserModel.cpp b/src/localbrowser/LocalBrowserModel.cpp new file mode 100644 index 0000000..ca75874 --- /dev/null +++ b/src/localbrowser/LocalBrowserModel.cpp @@ -0,0 +1,131 @@ +/* + * StampsModel.cpp + * + * Created on: Mar 29, 2012 + * Author: Simon + */ + +#include "LocalBrowserModel.h" +#include "LocalBrowserView.h" +#include "client/Client.h" +#include "LocalBrowserModelException.h" + +LocalBrowserModel::LocalBrowserModel(): + stamp(NULL), + currentPage(1) +{ + // TODO Auto-generated constructor stub + stampIDs = Client::Ref().GetStamps(); +} + + +std::vector<SaveFile*> LocalBrowserModel::GetSavesList() +{ + return savesList; +} + +void LocalBrowserModel::AddObserver(LocalBrowserView * observer) +{ + observers.push_back(observer); + observer->NotifySavesListChanged(this); + observer->NotifyPageChanged(this); +} + +void LocalBrowserModel::notifySavesListChanged() +{ + for(int i = 0; i < observers.size(); i++) + { + observers[i]->NotifySavesListChanged(this); + } +} + +void LocalBrowserModel::notifyPageChanged() +{ + for(int i = 0; i < observers.size(); i++) + { + observers[i]->NotifyPageChanged(this); + } +} + +SaveFile * LocalBrowserModel::GetSave() +{ + return stamp; +} + +void LocalBrowserModel::SetSave(SaveFile * newStamp) +{ + if(stamp) + delete stamp; + stamp = new SaveFile(*newStamp); +} + +void LocalBrowserModel::UpdateSavesList(int pageNumber) +{ + std::vector<SaveFile*> tempSavesList = savesList; + savesList.clear(); + currentPage = pageNumber; + notifyPageChanged(); + notifySavesListChanged(); + /*notifyStampsListChanged(); + for(int i = 0; i < tempStampsList.size(); i++) + { + delete tempStampsList[i]; + }*/ + + int stampsEnd = pageNumber*20; + + for(int i = stampsEnd-20; i<stampIDs.size() && i<stampsEnd; i++) + { + SaveFile * tempSave = Client::Ref().GetStamp(stampIDs[i]); + if(tempSave) + { + savesList.push_back(tempSave); + } + } + notifySavesListChanged(); +} + +void LocalBrowserModel::SelectSave(std::string stampID) +{ + for(int i = 0; i < selected.size(); i++) + { + if(selected[i]==stampID) + { + return; + } + } + selected.push_back(stampID); + notifySelectedChanged(); +} + +void LocalBrowserModel::DeselectSave(std::string stampID) +{ + bool changed = false; +restart: + for(int i = 0; i < selected.size(); i++) + { + if(selected[i]==stampID) + { + selected.erase(selected.begin()+i); + changed = true; + goto restart; //Just ensure all cases are removed. + } + } + if(changed) + notifySelectedChanged(); +} + +void LocalBrowserModel::notifySelectedChanged() +{ + for(int i = 0; i < observers.size(); i++) + { + LocalBrowserView* cObserver = observers[i]; + cObserver->NotifySelectedChanged(this); + } +} + +LocalBrowserModel::~LocalBrowserModel() { + if(stamp) + delete stamp; +} + diff --git a/src/localbrowser/LocalBrowserModel.h b/src/localbrowser/LocalBrowserModel.h new file mode 100644 index 0000000..531cc9b --- /dev/null +++ b/src/localbrowser/LocalBrowserModel.h @@ -0,0 +1,43 @@ +/* + * StampsModel.h + * + * Created on: Mar 29, 2012 + * Author: Simon + */ + +#ifndef STAMPSMODEL_H_ +#define STAMPSMODEL_H_ + +#include <vector> +#include <string> +#include <cmath> +#include "client/SaveFile.h" + +class LocalBrowserView; +class LocalBrowserModel { + vector<std::string> selected; + SaveFile * stamp; + std::vector<std::string> stampIDs; + std::vector<SaveFile*> savesList; + std::vector<LocalBrowserView*> observers; + int currentPage; + void notifySavesListChanged(); + void notifyPageChanged(); + void notifySelectedChanged(); +public: + LocalBrowserModel(); + int GetPageCount() { return max(1, (int)(ceil(stampIDs.size()/16))); } + int GetPageNum() { return currentPage; } + void AddObserver(LocalBrowserView * observer); + std::vector<SaveFile *> GetSavesList(); + void UpdateSavesList(int pageNumber); + SaveFile * GetSave(); + void SetSave(SaveFile * newStamp); + vector<std::string> GetSelected() { return selected; } + void ClearSelected() { selected.clear(); notifySelectedChanged(); } + void SelectSave(std::string stampID); + void DeselectSave(std::string stampID); + virtual ~LocalBrowserModel(); +}; + +#endif /* STAMPSMODEL_H_ */ diff --git a/src/localbrowser/LocalBrowserModelException.h b/src/localbrowser/LocalBrowserModelException.h new file mode 100644 index 0000000..087f7df --- /dev/null +++ b/src/localbrowser/LocalBrowserModelException.h @@ -0,0 +1,23 @@ +/* + * StampsModelException.h + * + * Created on: Mar 29, 2012 + * Author: Simon + */ + +#ifndef STAMPSMODELEXCEPTION_H_ +#define STAMPSMODELEXCEPTION_H_ + +#include <string> +#include <exception> +using namespace std; + +class LocalBrowserModelException { + string message; +public: + LocalBrowserModelException(string message_): message(message_) {}; + const char * what() const throw() { return message.c_str(); }; + ~LocalBrowserModelException() throw() {}; +}; + +#endif /* STAMPSMODELEXCEPTION_H_ */ diff --git a/src/localbrowser/LocalBrowserView.cpp b/src/localbrowser/LocalBrowserView.cpp new file mode 100644 index 0000000..82182f4 --- /dev/null +++ b/src/localbrowser/LocalBrowserView.cpp @@ -0,0 +1,197 @@ +/* + * StampsView.cpp + * + * Created on: Mar 29, 2012 + * Author: Simon + */ + +#include <sstream> +#include "client/Client.h" +#include "LocalBrowserView.h" + +#include "dialogues/ErrorMessage.h" +#include "LocalBrowserController.h" +#include "LocalBrowserModel.h" +#include "LocalBrowserModelException.h" + +LocalBrowserView::LocalBrowserView(): + ui::Window(ui::Point(0, 0), ui::Point(XRES+BARSIZE, YRES+MENUSIZE)) +{ + nextButton = new ui::Button(ui::Point(XRES+BARSIZE-52, YRES+MENUSIZE-18), ui::Point(50, 16), "Next \x95"); + previousButton = new ui::Button(ui::Point(1, YRES+MENUSIZE-18), ui::Point(50, 16), "\x96 Prev"); + infoLabel = new ui::Label(ui::Point(51, YRES+MENUSIZE-18), ui::Point(XRES+BARSIZE-102, 16), "Loading..."); + AddComponent(infoLabel); + AddComponent(nextButton); + AddComponent(previousButton); + + class NextPageAction : public ui::ButtonAction + { + LocalBrowserView * v; + public: + NextPageAction(LocalBrowserView * _v) { v = _v; } + void ActionCallback(ui::Button * sender) + { + v->c->NextPage(); + } + }; + nextButton->SetActionCallback(new NextPageAction(this)); + nextButton->Appearance.HorizontalAlign = ui::Appearance::AlignRight; nextButton->Appearance.VerticalAlign = ui::Appearance::AlignBottom; + + class PrevPageAction : public ui::ButtonAction + { + LocalBrowserView * v; + public: + PrevPageAction(LocalBrowserView * _v) { v = _v; } + void ActionCallback(ui::Button * sender) + { + v->c->PrevPage(); + } + }; + previousButton->SetActionCallback(new PrevPageAction(this)); + previousButton->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; previousButton->Appearance.VerticalAlign = ui::Appearance::AlignBottom; + + class RemoveSelectedAction : public ui::ButtonAction + { + LocalBrowserView * v; + public: + RemoveSelectedAction(LocalBrowserView * _v) { v = _v; } + void ActionCallback(ui::Button * sender) + { + v->c->RemoveSelected(); + } + }; + + removeSelected = new ui::Button(ui::Point((((XRES+BARSIZE)-100)/2), YRES+MENUSIZE-18), ui::Point(100, 16), "Delete"); + removeSelected->Visible = false; + removeSelected->SetActionCallback(new RemoveSelectedAction(this)); + AddComponent(removeSelected); +} + +void LocalBrowserView::OnTick(float dt) +{ + c->Update(); +} + +void LocalBrowserView::NotifyPageChanged(LocalBrowserModel * sender) +{ + std::stringstream pageInfo; + pageInfo << "Page " << sender->GetPageNum() << " of " << sender->GetPageCount(); + infoLabel->SetText(pageInfo.str()); + if(sender->GetPageNum() == 1) + { + previousButton->Visible = false; + } + else + { + previousButton->Visible = true; + } + if(sender->GetPageNum() == sender->GetPageCount()) + { + nextButton->Visible = false; + } + else + { + nextButton->Visible = true; + } +} + +void LocalBrowserView::NotifySavesListChanged(LocalBrowserModel * sender) +{ + int i = 0; + int buttonWidth, buttonHeight, saveX = 0, saveY = 0, savesX = 5, savesY = 4, buttonPadding = 2; + int buttonAreaWidth, buttonAreaHeight, buttonXOffset, buttonYOffset; + + vector<SaveFile*> saves = sender->GetSavesList(); + for(i = 0; i < stampButtons.size(); i++) + { + RemoveComponent(stampButtons[i]); + delete stampButtons[i]; + } + stampButtons.clear(); + buttonXOffset = 0; + buttonYOffset = 50; + buttonAreaWidth = Size.X; + buttonAreaHeight = Size.Y - buttonYOffset - 18; + buttonWidth = (buttonAreaWidth/savesX) - buttonPadding*2; + buttonHeight = (buttonAreaHeight/savesY) - buttonPadding*2; + class SaveOpenAction: public ui::SaveButtonAction + { + LocalBrowserView * v; + public: + SaveOpenAction(LocalBrowserView * _v) { v = _v; } + virtual void ActionCallback(ui::SaveButton * sender) + { + if(sender->GetSaveFile()) + v->c->OpenSave(sender->GetSaveFile()); + } + virtual void SelectedCallback(ui::SaveButton * sender) + { + if(sender->GetSaveFile()) + v->c->Selected(sender->GetSaveFile()->GetName(), sender->GetSelected()); + } + }; + for(i = 0; i < saves.size(); i++) + { + if(saveX == savesX) + { + if(saveY == savesY-1) + break; + saveX = 0; + saveY++; + } + ui::SaveButton * saveButton; + saveButton = new ui::SaveButton( + ui::Point( + buttonXOffset + buttonPadding + saveX*(buttonWidth+buttonPadding*2), + buttonYOffset + buttonPadding + saveY*(buttonHeight+buttonPadding*2) + ), + ui::Point(buttonWidth, buttonHeight), + saves[i]); + saveButton->SetSelectable(true); + saveButton->SetActionCallback(new SaveOpenAction(this)); + stampButtons.push_back(saveButton); + AddComponent(saveButton); + saveX++; + } +} + +void LocalBrowserView::NotifySelectedChanged(LocalBrowserModel * sender) +{ + vector<std::string> selected = sender->GetSelected(); + for(int j = 0; j < stampButtons.size(); j++) + { + stampButtons[j]->SetSelected(false); + for(int i = 0; i < selected.size(); i++) + { + if(stampButtons[j]->GetSaveFile()->GetName()==selected[i]) + stampButtons[j]->SetSelected(true); + } + } + + if(selected.size()) + { + removeSelected->Visible = true; + } + else + removeSelected->Visible = false; +} + +void LocalBrowserView::OnMouseWheel(int x, int y, int d) +{ + if(!d) + return; + if(d<0) + c->NextPage(); + else + c->PrevPage(); +} +void LocalBrowserView::OnKeyPress(int key, Uint16 character, bool shift, bool ctrl, bool alt) +{ + if(key==KEY_ESCAPE) + c->Exit(); +} + +LocalBrowserView::~LocalBrowserView() { + // TODO Auto-generated destructor stub +} + diff --git a/src/localbrowser/LocalBrowserView.h b/src/localbrowser/LocalBrowserView.h new file mode 100644 index 0000000..3f197e0 --- /dev/null +++ b/src/localbrowser/LocalBrowserView.h @@ -0,0 +1,40 @@ +/* + * StampsView.h + * + * Created on: Mar 29, 2012 + * Author: Simon + */ + +#ifndef STAMPSVIEW_H_ +#define STAMPSVIEW_H_ + +#include <vector> +#include "interface/Window.h" +#include "interface/Button.h" +#include "interface/Textbox.h" +#include "interface/Label.h" +#include "interface/SaveButton.h" + +class LocalBrowserController; +class LocalBrowserModel; +class LocalBrowserView: public ui::Window { + LocalBrowserController * c; + std::vector<ui::SaveButton*> stampButtons; + ui::Button * previousButton; + ui::Button * nextButton; + ui::Label * infoLabel; + ui::Button * removeSelected; +public: + LocalBrowserView(); + //virtual void OnDraw(); + virtual void OnTick(float dt); + void AttachController(LocalBrowserController * c_) { c = c_; }; + void NotifyPageChanged(LocalBrowserModel * sender); + void NotifySavesListChanged(LocalBrowserModel * sender); + void NotifySelectedChanged(LocalBrowserModel * sender); + virtual void OnMouseWheel(int x, int y, int d); + virtual void OnKeyPress(int key, Uint16 character, bool shift, bool ctrl, bool alt); + virtual ~LocalBrowserView(); +}; + +#endif /* STAMPSVIEW_H_ */ |
