Fix crash when using search (std::remove doesn't seem to work as I expected), Add clickable author names for search. Fixes #95

This commit is contained in:
Simon Robertshaw 2012-08-14 12:03:33 +01:00
parent c259521e5e
commit b05a847e96
4 changed files with 58 additions and 81 deletions

View File

@ -96,9 +96,6 @@ void ThumbnailBroker::RenderThumbnail(GameSave * gameSave, int width, int height
void ThumbnailBroker::RetrieveThumbnail(int saveID, int saveDate, int width, int height, ThumbnailListener * tListener)
{
#ifdef DEBUG
std::cout << typeid(*this).name() << " New Thumbnail Retrieval request for " << saveID << ":" << saveDate << std::endl;
#endif
AttachThumbnailListener(tListener);
pthread_mutex_lock(&thumbnailQueueMutex);
bool running = thumbnailQueueRunning;
@ -127,7 +124,9 @@ void ThumbnailBroker::FlushThumbQueue()
while(thumbnailComplete.size())
{
if(CheckThumbnailListener(thumbnailComplete.front().first))
{
thumbnailComplete.front().first->OnThumbnailReady(thumbnailComplete.front().second);
}
else
{
#ifdef DEBUG
@ -146,13 +145,13 @@ void ThumbnailBroker::thumbnailQueueProcessTH()
while(true)
{
//Shutdown after 2 seconds of idle
//if(time(NULL) - lastAction > 2)
//{
// pthread_mutex_lock(&thumbnailQueueMutex);
// thumbnailQueueRunning = false;
// pthread_mutex_unlock(&thumbnailQueueMutex);
// break;
//}
if(time(NULL) - lastAction > 2)
{
pthread_mutex_lock(&thumbnailQueueMutex);
thumbnailQueueRunning = false;
pthread_mutex_unlock(&thumbnailQueueMutex);
break;
}
//Renderer
pthread_mutex_lock(&thumbnailQueueMutex);
@ -379,6 +378,15 @@ void ThumbnailBroker::AttachThumbnailListener(ThumbnailListener * tListener)
void ThumbnailBroker::DetachThumbnailListener(ThumbnailListener * tListener)
{
pthread_mutex_lock(&listenersMutex);
std::remove(validListeners.begin(), validListeners.end(), tListener);
std::vector<ThumbnailListener*>::iterator iter = validListeners.begin();
while (iter != validListeners.end())
{
if(*iter == tListener)
iter = validListeners.erase(iter);
else
++iter;
}
pthread_mutex_unlock(&listenersMutex);
}

View File

@ -21,7 +21,8 @@ SaveButton::SaveButton(Point position, Point size, SaveInfo * save):
voteColour(255, 0, 0),
selectable(false),
selected(false),
waitingForThumb(false)
waitingForThumb(false),
isMouseInsideAuthor(false)
{
if(save)
{
@ -65,7 +66,8 @@ SaveButton::SaveButton(Point position, Point size, SaveFile * file):
selectable(false),
selected(false),
wantsDraw(false),
waitingForThumb(false)
waitingForThumb(false),
isMouseInsideAuthor(false)
{
if(file)
{
@ -127,66 +129,6 @@ void SaveButton::Tick(float dt)
ThumbnailBroker::Ref().RenderThumbnail(file->GetGameSave(), Size.X-3, Size.Y-25, this);
}
}
/*Thumbnail * tempThumb;
float scaleFactorY = 1.0f, scaleFactorX = 1.0f;
if(!thumbnail)
{
if(save)
{
if(!save->GetGameSave() && save->GetID())
{
tempThumb = Client::Ref().GetThumbnail(save->GetID(), 0);
if(tempThumb)
{
thumbnail = new Thumbnail(*tempThumb); //Store a local copy of the thumbnail
}
}
else if(save->GetGameSave())
{
thumbnail = SaveRenderer::Ref().Render(save->GetGameSave());
}
else
{
thumbnail = NULL;
}
}
if(file)
{
if(file->GetThumbnail())
{
thumbnail = new Thumbnail(*file->GetThumbnail());
}
else if(file->GetGameSave())
{
thumbnail = SaveRenderer::Ref().Render(file->GetGameSave());
}
else
{
thumbnail = NULL;
}
}
if(thumbnail && thumbnail->Data)
{
if(thumbnail->Size.Y > (Size.Y-25))
{
scaleFactorY = ((float)(Size.Y-25))/((float)thumbnail->Size.Y);
}
if(thumbnail->Size.X > Size.X-3)
{
scaleFactorX = ((float)Size.X-3)/((float)thumbnail->Size.X);
}
if(scaleFactorY < 1.0f || scaleFactorX < 1.0f)
{
float scaleFactor = scaleFactorY < scaleFactorX ? scaleFactorY : scaleFactorX;
pixel * thumbData = thumbnail->Data;
thumbnail->Data = Graphics::resample_img(thumbData, thumbnail->Size.X, thumbnail->Size.Y, thumbnail->Size.X * scaleFactor, thumbnail->Size.Y * scaleFactor);
thumbnail->Size.X *= scaleFactor;
thumbnail->Size.Y *= scaleFactor;
free(thumbData);
}
}
}*/
}
void SaveButton::Draw(const Point& screenPos)
@ -236,17 +178,15 @@ void SaveButton::Draw(const Point& screenPos)
g->drawrect(screenPos.X+(Size.X-thumbBoxSize.X)/2, screenPos.Y+(Size.Y-21-thumbBoxSize.Y)/2, thumbBoxSize.X, thumbBoxSize.Y, 180, 180, 180, 255);
}
if(isMouseInside)
{
//g->drawrect(screenPos.X, screenPos.Y, Size.X, Size.Y, 255, 255, 255, 255);
if(isMouseInside && !isMouseInsideAuthor)
g->drawtext(screenPos.X+(Size.X-Graphics::textwidth((char *)name.c_str()))/2, screenPos.Y+Size.Y - 21, name, 255, 255, 255, 255);
g->drawtext(screenPos.X+(Size.X-Graphics::textwidth((char *)save->userName.c_str()))/2, screenPos.Y+Size.Y - 10, save->userName, 200, 230, 255, 255);
}
else
{
g->drawtext(screenPos.X+(Size.X-Graphics::textwidth((char *)name.c_str()))/2, screenPos.Y+Size.Y - 21, name, 180, 180, 180, 255);
if(isMouseInsideAuthor)
g->drawtext(screenPos.X+(Size.X-Graphics::textwidth((char *)save->userName.c_str()))/2, screenPos.Y+Size.Y - 10, save->userName, 200, 230, 255, 255);
else
g->drawtext(screenPos.X+(Size.X-Graphics::textwidth((char *)save->userName.c_str()))/2, screenPos.Y+Size.Y - 10, save->userName, 100, 130, 160, 255);
}
}
if(file)
{
@ -290,7 +230,10 @@ void SaveButton::OnMouseUnclick(int x, int y, unsigned int button)
if(isButtonDown)
{
DoAction();
if(isMouseInsideAuthor)
DoAuthorAction();
else
DoAction();
}
isButtonDown = false;
@ -308,6 +251,16 @@ void SaveButton::OnMouseClick(int x, int y, unsigned int button)
isButtonDown = true;
}
void SaveButton::OnMouseMovedInside(int x, int y, int dx, int dy)
{
if(y > Size.Y-11)
{
isMouseInsideAuthor = true;
}
else
isMouseInsideAuthor = false;
}
void SaveButton::OnMouseEnter(int x, int y)
{
isMouseInside = true;
@ -316,6 +269,13 @@ void SaveButton::OnMouseEnter(int x, int y)
void SaveButton::OnMouseLeave(int x, int y)
{
isMouseInside = false;
isMouseInsideAuthor = false;
}
void SaveButton::DoAuthorAction()
{
if(actionCallback)
actionCallback->AuthorActionCallback(this);
}
void SaveButton::DoAction()

View File

@ -18,6 +18,7 @@ class SaveButtonAction
{
public:
virtual void ActionCallback(ui::SaveButton * sender) {}
virtual void AuthorActionCallback(ui::SaveButton * sender) {}
virtual void SelectedCallback(ui::SaveButton * sender) {}
virtual ~SaveButtonAction() {}
};
@ -30,6 +31,7 @@ class SaveButton : public Component, public ThumbnailListener
std::string name;
bool wantsDraw;
bool waitingForThumb;
bool isMouseInsideAuthor;
public:
SaveButton(Point position, Point size, SaveInfo * save);
SaveButton(Point position, Point size, SaveFile * file);
@ -41,6 +43,8 @@ public:
virtual void OnMouseEnter(int x, int y);
virtual void OnMouseLeave(int x, int y);
virtual void OnMouseMovedInside(int x, int y, int dx, int dy);
virtual void Draw(const Point& screenPos);
virtual void Tick(float dt);
@ -55,6 +59,7 @@ public:
SaveFile * GetSaveFile() { return file; }
inline bool GetState() { return state; }
virtual void DoAction();
virtual void DoAuthorAction();
virtual void DoSelection();
void SetActionCallback(SaveButtonAction * action);
protected:

View File

@ -493,6 +493,10 @@ void SearchView::NotifySaveListChanged(SearchModel * sender)
{
v->c->Selected(sender->GetSave()->GetID(), sender->GetSelected());
}
virtual void AuthorActionCallback(ui::SaveButton * sender)
{
v->Search("user:"+sender->GetSave()->GetUserName());
}
};
class TagAction: public ui::ButtonAction