diff options
| author | Simon Robertshaw <simon@hardwired.org.uk> | 2012-04-06 23:45:24 (GMT) |
|---|---|---|
| committer | Simon Robertshaw <simon@hardwired.org.uk> | 2012-04-06 23:45:24 (GMT) |
| commit | bbfbb81086897d50b67bf1494ac150eb607add72 (patch) | |
| tree | 80bab3ddb1f62f847f12947bc81fac2c091669b8 /src/search | |
| parent | 8f8de875c6f7a68a3e47252a8653abb72fd398c1 (diff) | |
| download | powder-bbfbb81086897d50b67bf1494ac150eb607add72.zip powder-bbfbb81086897d50b67bf1494ac150eb607add72.tar.gz | |
Confirmation Dialogue, Save selection and multi-delete
Diffstat (limited to 'src/search')
| -rw-r--r-- | src/search/SearchController.cpp | 88 | ||||
| -rw-r--r-- | src/search/SearchController.h | 7 | ||||
| -rw-r--r-- | src/search/SearchModel.cpp | 41 | ||||
| -rw-r--r-- | src/search/SearchModel.h | 7 | ||||
| -rw-r--r-- | src/search/SearchView.cpp | 99 | ||||
| -rw-r--r-- | src/search/SearchView.h | 6 |
6 files changed, 248 insertions, 0 deletions
diff --git a/src/search/SearchController.cpp b/src/search/SearchController.cpp index 1449f9a..90cd41b 100644 --- a/src/search/SearchController.cpp +++ b/src/search/SearchController.cpp @@ -1,10 +1,15 @@ #include <string> +#include <sstream> +#include <unistd.h> #include "SearchController.h" #include "SearchModel.h" #include "SearchView.h" #include "interface/Panel.h" +#include "dialogues/ConfirmPrompt.h" #include "preview/PreviewController.h" #include "client/Client.h" +#include "tasks/Task.h" +#include "tasks/TaskWindow.h" class SearchController::OpenCallback: public ControllerCallback { @@ -125,8 +130,91 @@ void SearchController::ShowOwn(bool show) searchModel->SetShowOwn(false); } +void SearchController::Selected(int saveID, bool selected) +{ + if(!Client::Ref().GetAuthUser().ID) + return; + + if(selected) + searchModel->SelectSave(saveID); + else + searchModel->DeselectSave(saveID); +} + void SearchController::OpenSave(int saveID) { activePreview = new PreviewController(saveID, new OpenCallback(this)); ui::Engine::Ref().ShowWindow(activePreview->GetView()); } + +void SearchController::ClearSelection() +{ + searchModel->ClearSelected(); +} + +void SearchController::RemoveSelected() +{ + class RemoveSelectedConfirmation: public ConfirmDialogueCallback { + public: + SearchController * c; + RemoveSelectedConfirmation(SearchController * 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 " << searchModel->GetSelected().size() << " save"; + if(searchModel->GetSelected().size()>1) + desc << "s"; + new ConfirmPrompt("Delete saves", desc.str(), new RemoveSelectedConfirmation(this)); +} + +void SearchController::removeSelectedC() +{ + class RemoveSavesTask : public Task + { + std::vector<int> saves; + public: + RemoveSavesTask(std::vector<int> saves_) { saves = saves_; } + virtual void doWork() + { + for(int i = 0; i < saves.size(); i++) + { + std::stringstream saveID; + saveID << "Deleting save [" << saves[i] << "] ..."; + notifyStatus(saveID.str()); + if(Client::Ref().DeleteSave(saves[i])!=RequestOkay) + { + std::stringstream saveIDF; + saveIDF << "\boFailed to delete [" << saves[i] << "] ..."; + notifyStatus(saveIDF.str()); + usleep(500*1000); + } + usleep(100*1000); + notifyProgress((float(i+1)/float(saves.size())*100)); + } + } + }; + + std::vector<int> selected = searchModel->GetSelected(); + new TaskWindow("Removing saves", new RemoveSavesTask(selected)); + ClearSelection(); +} + +void SearchController::UnpublishSelected() +{ + +} + +void SearchController::unpublishSelectedC() +{ + ClearSelection(); +} + +void SearchController::FavouriteSelected() +{ + ClearSelection(); +} diff --git a/src/search/SearchController.h b/src/search/SearchController.h index cf34830..3168419 100644 --- a/src/search/SearchController.h +++ b/src/search/SearchController.h @@ -21,6 +21,8 @@ private: double nextQueryTime; std::string nextQuery; bool nextQueryDone; + void removeSelectedC(); + void unpublishSelectedC(); public: class OpenCallback; bool HasExited; @@ -33,8 +35,13 @@ public: void PrevPage(); void ChangeSort(); void ShowOwn(bool show); + void Selected(int saveID, bool selected); void OpenSave(int saveID); void Update(); + void ClearSelection(); + void RemoveSelected(); + void UnpublishSelected(); + void FavouriteSelected(); Save * GetLoadedSave(); }; diff --git a/src/search/SearchModel.cpp b/src/search/SearchModel.cpp index 4a410c3..e1d9849 100644 --- a/src/search/SearchModel.cpp +++ b/src/search/SearchModel.cpp @@ -37,6 +37,8 @@ void SearchModel::UpdateSaveList(int pageNumber, std::string query) currentPage = pageNumber; notifySaveListChanged(); notifyPageChanged(); + selected.clear(); + notifySelectedChanged(); //Threading if(!updateSaveListWorking) @@ -94,6 +96,36 @@ void SearchModel::AddObserver(SearchView * observer) observer->NotifyShowOwnChanged(this); } +void SearchModel::SelectSave(int saveID) +{ + for(int i = 0; i < selected.size(); i++) + { + if(selected[i]==saveID) + { + return; + } + } + selected.push_back(saveID); + notifySelectedChanged(); +} + +void SearchModel::DeselectSave(int saveID) +{ + bool changed = false; +restart: + for(int i = 0; i < selected.size(); i++) + { + if(selected[i]==saveID) + { + selected.erase(selected.begin()+i); + changed = true; + goto restart; //Just ensure all cases are removed. + } + } + if(changed) + notifySelectedChanged(); +} + void SearchModel::notifySaveListChanged() { for(int i = 0; i < observers.size(); i++) @@ -130,6 +162,15 @@ void SearchModel::notifyShowOwnChanged() } } +void SearchModel::notifySelectedChanged() +{ + for(int i = 0; i < observers.size(); i++) + { + SearchView* cObserver = observers[i]; + cObserver->NotifySelectedChanged(this); + } +} + SearchModel::~SearchModel() { if(loadedSave) diff --git a/src/search/SearchModel.h b/src/search/SearchModel.h index 2587c03..8f2ae58 100644 --- a/src/search/SearchModel.h +++ b/src/search/SearchModel.h @@ -18,12 +18,14 @@ private: string currentSort; string lastQuery; string lastError; + vector<int> selected; vector<SearchView*> observers; vector<Save*> saveList; int currentPage; int resultCount; bool showOwn; void notifySaveListChanged(); + void notifySelectedChanged(); void notifyPageChanged(); void notifySortChanged(); void notifyShowOwnChanged(); @@ -38,6 +40,7 @@ private: public: SearchModel(); virtual ~SearchModel(); + void AddObserver(SearchView * observer); void UpdateSaveList(int pageNumber, std::string query); vector<Save*> GetSaveList(); @@ -52,6 +55,10 @@ public: void SetLoadedSave(Save * save); Save * GetLoadedSave(); bool GetSavesLoaded() { return saveListLoaded; } + vector<int> GetSelected() { return selected; } + void ClearSelected() { selected.clear(); notifySelectedChanged(); } + void SelectSave(int saveID); + void DeselectSave(int saveID); void Update(); }; diff --git a/src/search/SearchView.cpp b/src/search/SearchView.cpp index 4b9b6b2..4064658 100644 --- a/src/search/SearchView.cpp +++ b/src/search/SearchView.cpp @@ -99,6 +99,70 @@ SearchView::SearchView(): ui::Label * searchPrompt = new ui::Label(ui::Point(10, 10), ui::Point(50, 16), "Search:"); searchPrompt->SetAlignment(AlignLeft, AlignBottom); AddComponent(searchPrompt); + + class RemoveSelectedAction : public ui::ButtonAction + { + SearchView * v; + public: + RemoveSelectedAction(SearchView * _v) { v = _v; } + void ActionCallback(ui::Button * sender) + { + v->c->RemoveSelected(); + } + }; + + class UnpublishSelectedAction : public ui::ButtonAction + { + SearchView * v; + public: + UnpublishSelectedAction(SearchView * _v) { v = _v; } + void ActionCallback(ui::Button * sender) + { + v->c->UnpublishSelected(); + } + }; + + class FavouriteSelectedAction : public ui::ButtonAction + { + SearchView * v; + public: + FavouriteSelectedAction(SearchView * _v) { v = _v; } + void ActionCallback(ui::Button * sender) + { + v->c->FavouriteSelected(); + } + }; + + class ClearSelectionAction : public ui::ButtonAction + { + SearchView * v; + public: + ClearSelectionAction(SearchView * _v) { v = _v; } + void ActionCallback(ui::Button * sender) + { + v->c->ClearSelection(); + } + }; + + removeSelected = new ui::Button(ui::Point((((XRES+BARSIZE)-415)/2), YRES+MENUSIZE-18), ui::Point(100, 16), "Delete"); + removeSelected->Visible = false; + removeSelected->SetActionCallback(new RemoveSelectedAction(this)); + AddComponent(removeSelected); + + unpublishSelected = new ui::Button(ui::Point((((XRES+BARSIZE)-415)/2)+105, YRES+MENUSIZE-18), ui::Point(100, 16), "Unpublish"); + unpublishSelected->Visible = false; + unpublishSelected->SetActionCallback(new UnpublishSelectedAction(this)); + AddComponent(unpublishSelected); + + favouriteSelected = new ui::Button(ui::Point((((XRES+BARSIZE)-415)/2)+210, YRES+MENUSIZE-18), ui::Point(100, 16), "Favourite"); + favouriteSelected->Visible = false; + favouriteSelected->SetActionCallback(new FavouriteSelectedAction(this)); + AddComponent(favouriteSelected); + + clearSelection = new ui::Button(ui::Point((((XRES+BARSIZE)-415)/2)+315, YRES+MENUSIZE-18), ui::Point(100, 16), "Clear selection"); + clearSelection->Visible = false; + clearSelection->SetActionCallback(new ClearSelectionAction(this)); + AddComponent(clearSelection); } void SearchView::doSearch() @@ -211,6 +275,10 @@ void SearchView::NotifySaveListChanged(SearchModel * sender) { v->c->OpenSave(sender->GetSave()->GetID()); } + virtual void SelectedCallback(ui::SaveButton * sender) + { + v->c->Selected(sender->GetSave()->GetID(), sender->GetSelected()); + } }; for(i = 0; i < saves.size(); i++) { @@ -230,6 +298,8 @@ void SearchView::NotifySaveListChanged(SearchModel * sender) ui::Point(buttonWidth, buttonHeight), saves[i]); saveButton->SetActionCallback(new SaveOpenAction(this)); + if(Client::Ref().GetAuthUser().ID) + saveButton->SetSelectable(true); saveButtons.push_back(saveButton); AddComponent(saveButton); saveX++; @@ -237,6 +307,35 @@ void SearchView::NotifySaveListChanged(SearchModel * sender) } } +void SearchView::NotifySelectedChanged(SearchModel * sender) +{ + vector<int> selected = sender->GetSelected(); + for(int j = 0; j < saveButtons.size(); j++) + { + saveButtons[j]->SetSelected(false); + for(int i = 0; i < selected.size(); i++) + { + if(saveButtons[j]->GetSave()->GetID()==selected[i]) + saveButtons[j]->SetSelected(true); + } + } + + if(selected.size()) + { + removeSelected->Visible = true; + unpublishSelected->Visible = true; + favouriteSelected->Visible = true; + clearSelection->Visible = true; + } + else + { + removeSelected->Visible = false; + unpublishSelected->Visible = false; + favouriteSelected->Visible = false; + clearSelection->Visible = false; + } +} + void SearchView::OnTick(float dt) { c->Update(); diff --git a/src/search/SearchView.h b/src/search/SearchView.h index af43a8c..ed4b06e 100644 --- a/src/search/SearchView.h +++ b/src/search/SearchView.h @@ -27,9 +27,15 @@ private: ui::Button * sortButton; ui::Button * ownButton; ui::Spinner * loadingSpinner; + + ui::Button * removeSelected; + ui::Button * unpublishSelected; + ui::Button * favouriteSelected; + ui::Button * clearSelection; void doSearch(); public: void NotifySaveListChanged(SearchModel * sender); + void NotifySelectedChanged(SearchModel * sender); void NotifyPageChanged(SearchModel * sender); void NotifySortChanged(SearchModel * sender); void NotifyShowOwnChanged(SearchModel * sender); |
