diff options
| author | Simon Robertshaw <simon@hardwired.org.uk> | 2013-03-22 14:14:17 (GMT) |
|---|---|---|
| committer | Simon Robertshaw <simon@hardwired.org.uk> | 2013-03-22 14:14:17 (GMT) |
| commit | 9abe51526cac2634af0541c3de69834dd30e9f78 (patch) | |
| tree | 6ae4deadfe00a83094b9d288d8c11d8ce823577a /src/gui/search/SearchModel.cpp | |
| parent | 2c311b9a36a88fadd96f3d39acb1ab2590835d81 (diff) | |
| download | powder-9abe51526cac2634af0541c3de69834dd30e9f78.zip powder-9abe51526cac2634af0541c3de69834dd30e9f78.tar.gz | |
Move all GUI source files into gui/
Diffstat (limited to 'src/gui/search/SearchModel.cpp')
| -rw-r--r-- | src/gui/search/SearchModel.cpp | 283 |
1 files changed, 283 insertions, 0 deletions
diff --git a/src/gui/search/SearchModel.cpp b/src/gui/search/SearchModel.cpp new file mode 100644 index 0000000..f4de2d6 --- /dev/null +++ b/src/gui/search/SearchModel.cpp @@ -0,0 +1,283 @@ +#include "SearchModel.h" +#include "client/SaveInfo.h" + +#include "client/Client.h" + +SearchModel::SearchModel(): + currentSort("best"), + showOwn(false), + showFavourite(false), + loadedSave(NULL), + updateSaveListWorking(false), + updateSaveListFinished(false), + updateTagListWorking(false), + updateTagListFinished(false), + saveListLoaded(false), + currentPage(1), + resultCount(0), + showTags(true) +{ +} + +void SearchModel::SetShowTags(bool show) +{ + showTags = show; +} + +bool SearchModel::GetShowTags() +{ + return showTags; +} + +void * SearchModel::updateSaveListTHelper(void * obj) +{ + return ((SearchModel *)obj)->updateSaveListT(); +} + +void * SearchModel::updateSaveListT() +{ + std::string category = ""; + if(showFavourite) + category = "Favourites"; + if(showOwn && Client::Ref().GetAuthUser().ID) + category = "by:"+Client::Ref().GetAuthUser().Username; + vector<SaveInfo*> * saveList = Client::Ref().SearchSaves((currentPage-1)*20, 20, lastQuery, currentSort=="new"?"date":"votes", category, thResultCount); + + updateSaveListFinished = true; + return saveList; +} + +void * SearchModel::updateTagListTHelper(void * obj) +{ + return ((SearchModel *)obj)->updateTagListT(); +} + +void * SearchModel::updateTagListT() +{ + int tagResultCount; + std::vector<std::pair<std::string, int> > * tagList = Client::Ref().GetTags(0, 24, "", tagResultCount); + + updateTagListFinished = true; + return tagList; +} + +void SearchModel::UpdateSaveList(int pageNumber, std::string query) +{ + //Threading + if(!updateSaveListWorking) + { + lastQuery = query; + lastError = ""; + saveListLoaded = false; + saveList.clear(); + //resultCount = 0; + currentPage = pageNumber; + + if(pageNumber == 1 && !showOwn && !showFavourite && currentSort == "best" && query == "") + SetShowTags(true); + else + SetShowTags(false); + + notifySaveListChanged(); + notifyTagListChanged(); + notifyPageChanged(); + selected.clear(); + notifySelectedChanged(); + + if(GetShowTags() && !tagList.size() && !updateTagListWorking) + { + updateTagListFinished = false; + updateTagListWorking = true; + pthread_create(&updateTagListThread, 0, &SearchModel::updateTagListTHelper, this); + } + + updateSaveListFinished = false; + updateSaveListWorking = true; + pthread_create(&updateSaveListThread, 0, &SearchModel::updateSaveListTHelper, this); + } +} + +void SearchModel::SetLoadedSave(SaveInfo * save) +{ + if(loadedSave != save && loadedSave) + delete loadedSave; + if(save) + { + loadedSave = new SaveInfo(*save); + } + else + { + loadedSave = NULL; + } +} + +SaveInfo * SearchModel::GetLoadedSave(){ + return loadedSave; +} + +vector<SaveInfo*> SearchModel::GetSaveList() +{ + return saveList; +} + +vector<pair<string, int> > SearchModel::GetTagList() +{ + return tagList; +} + +void SearchModel::Update() +{ + if(updateSaveListWorking) + { + if(updateSaveListFinished) + { + updateSaveListWorking = false; + lastError = ""; + saveListLoaded = true; + + vector<SaveInfo*> * tempSaveList; + pthread_join(updateSaveListThread, (void**)&tempSaveList); + + if(tempSaveList) + { + saveList = *tempSaveList; + delete tempSaveList; + } + + if(!saveList.size()) + { + lastError = Client::Ref().GetLastError(); + } + + resultCount = thResultCount; + notifyPageChanged(); + notifySaveListChanged(); + } + } + if(updateTagListWorking) + { + if(updateTagListFinished) + { + updateTagListWorking = false; + + vector<pair<string, int> > * tempTagList; + pthread_join(updateTagListThread, (void**)&tempTagList); + + if(tempTagList) + { + tagList = *tempTagList; + delete tempTagList; + } + notifyTagListChanged(); + } + } +} + +void SearchModel::AddObserver(SearchView * observer) +{ + observers.push_back(observer); + observer->NotifySaveListChanged(this); + observer->NotifyPageChanged(this); + observer->NotifySortChanged(this); + observer->NotifyShowOwnChanged(this); + observer->NotifyTagListChanged(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++) + { + SearchView* cObserver = observers[i]; + cObserver->NotifySaveListChanged(this); + } +} + +void SearchModel::notifyTagListChanged() +{ + for(int i = 0; i < observers.size(); i++) + { + SearchView* cObserver = observers[i]; + cObserver->NotifyTagListChanged(this); + } +} + +void SearchModel::notifyPageChanged() +{ + for(int i = 0; i < observers.size(); i++) + { + SearchView* cObserver = observers[i]; + cObserver->NotifyPageChanged(this); + } +} + +void SearchModel::notifySortChanged() +{ + for(int i = 0; i < observers.size(); i++) + { + SearchView* cObserver = observers[i]; + cObserver->NotifySortChanged(this); + } +} + +void SearchModel::notifyShowOwnChanged() +{ + for(int i = 0; i < observers.size(); i++) + { + SearchView* cObserver = observers[i]; + cObserver->NotifyShowOwnChanged(this); + } +} + +void SearchModel::notifyShowFavouriteChanged() +{ + for(int i = 0; i < observers.size(); i++) + { + SearchView* cObserver = observers[i]; + cObserver->NotifyShowOwnChanged(this); + } +} + +void SearchModel::notifySelectedChanged() +{ + for(int i = 0; i < observers.size(); i++) + { + SearchView* cObserver = observers[i]; + cObserver->NotifySelectedChanged(this); + } +} + +SearchModel::~SearchModel() +{ + if(loadedSave) + delete loadedSave; +} |
