summaryrefslogtreecommitdiff
path: root/src/search
diff options
context:
space:
mode:
authorSimon 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)
commitbbfbb81086897d50b67bf1494ac150eb607add72 (patch)
tree80bab3ddb1f62f847f12947bc81fac2c091669b8 /src/search
parent8f8de875c6f7a68a3e47252a8653abb72fd398c1 (diff)
downloadpowder-bbfbb81086897d50b67bf1494ac150eb607add72.zip
powder-bbfbb81086897d50b67bf1494ac150eb607add72.tar.gz
Confirmation Dialogue, Save selection and multi-delete
Diffstat (limited to 'src/search')
-rw-r--r--src/search/SearchController.cpp88
-rw-r--r--src/search/SearchController.h7
-rw-r--r--src/search/SearchModel.cpp41
-rw-r--r--src/search/SearchModel.h7
-rw-r--r--src/search/SearchView.cpp99
-rw-r--r--src/search/SearchView.h6
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);