This repository has been archived on 2025-03-20. You can view files and clone it, but cannot push or open issues or pull requests.
The-Powder-Toy/src/gui/search/SearchModel.cpp

287 lines
5.6 KiB
C++

#include "SearchModel.h"
#include "client/SaveInfo.h"
#include "client/Client.h"
SearchModel::SearchModel():
loadedSave(NULL),
currentSort("best"),
currentPage(1),
resultCount(0),
showOwn(false),
showFavourite(false),
showTags(true),
saveListLoaded(false),
updateSaveListWorking(false),
updateSaveListFinished(false),
updateTagListWorking(false),
updateTagListFinished(false)
{
}
void SearchModel::SetShowTags(bool show)
{
showTags = show;
}
bool SearchModel::GetShowTags()
{
return showTags;
}
TH_ENTRY_POINT 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;
}
TH_ENTRY_POINT 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;
}
bool 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);
return true;
}
return false;
}
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();
if (lastError == "Unspecified Error")
lastError = "";
}
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 (size_t 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 (size_t 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 (size_t i = 0; i < observers.size(); i++)
{
SearchView* cObserver = observers[i];
cObserver->NotifySaveListChanged(this);
}
}
void SearchModel::notifyTagListChanged()
{
for (size_t i = 0; i < observers.size(); i++)
{
SearchView* cObserver = observers[i];
cObserver->NotifyTagListChanged(this);
}
}
void SearchModel::notifyPageChanged()
{
for (size_t i = 0; i < observers.size(); i++)
{
SearchView* cObserver = observers[i];
cObserver->NotifyPageChanged(this);
}
}
void SearchModel::notifySortChanged()
{
for (size_t i = 0; i < observers.size(); i++)
{
SearchView* cObserver = observers[i];
cObserver->NotifySortChanged(this);
}
}
void SearchModel::notifyShowOwnChanged()
{
for (size_t i = 0; i < observers.size(); i++)
{
SearchView* cObserver = observers[i];
cObserver->NotifyShowOwnChanged(this);
}
}
void SearchModel::notifyShowFavouriteChanged()
{
for (size_t i = 0; i < observers.size(); i++)
{
SearchView* cObserver = observers[i];
cObserver->NotifyShowOwnChanged(this);
}
}
void SearchModel::notifySelectedChanged()
{
for (size_t i = 0; i < observers.size(); i++)
{
SearchView* cObserver = observers[i];
cObserver->NotifySelectedChanged(this);
}
}
SearchModel::~SearchModel()
{
delete loadedSave;
}