mirror of
https://github.com/The-Powder-Toy/The-Powder-Toy.git
synced 2025-08-17 21:51:20 +02:00
Add and remove tags.\nBrings to light an interesting issue with adding or removing UI components within component Event handlers
This commit is contained in:
@@ -676,3 +676,101 @@ Thumbnail * Client::GetThumbnail(int saveID, int saveDate)
|
|||||||
//http_async_req_start(http, urlStream.str().c_str(), NULL, 0, 1);
|
//http_async_req_start(http, urlStream.str().c_str(), NULL, 0, 1);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<string> * Client::RemoveTag(int saveID, string tag)
|
||||||
|
{
|
||||||
|
lastError = "";
|
||||||
|
std::vector<string> * tags = NULL;
|
||||||
|
std::stringstream urlStream;
|
||||||
|
char * data = NULL;
|
||||||
|
int dataStatus, dataLength;
|
||||||
|
urlStream << "http://" << SERVER << "/Browse/EditTag.json?Op=delete&ID=" << saveID << "&Tag=" << tag;
|
||||||
|
if(authUser.ID)
|
||||||
|
{
|
||||||
|
std::stringstream userIDStream;
|
||||||
|
userIDStream << authUser.ID;
|
||||||
|
data = http_auth_get((char *)urlStream.str().c_str(), (char *)(userIDStream.str().c_str()), NULL, (char *)(authUser.SessionID.c_str()), &dataStatus, &dataLength);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lastError = "Not authenticated";
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if(dataStatus == 200 && data)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
std::istringstream dataStream(data);
|
||||||
|
json::Array tagsArray;
|
||||||
|
json::Reader::Read(tagsArray, dataStream);
|
||||||
|
|
||||||
|
tags = new std::vector<string>();
|
||||||
|
|
||||||
|
for(int j = 0; j < tagsArray.Size(); j++)
|
||||||
|
{
|
||||||
|
json::String tempTag = tagsArray[j];
|
||||||
|
tags->push_back(tempTag.Value());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (json::Exception &e)
|
||||||
|
{
|
||||||
|
lastError = "Could not read response";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lastError = http_ret_text(dataStatus);
|
||||||
|
}
|
||||||
|
if(data)
|
||||||
|
free(data);
|
||||||
|
return tags;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<string> * Client::AddTag(int saveID, string tag)
|
||||||
|
{
|
||||||
|
lastError = "";
|
||||||
|
std::vector<string> * tags = NULL;
|
||||||
|
std::stringstream urlStream;
|
||||||
|
char * data = NULL;
|
||||||
|
int dataStatus, dataLength;
|
||||||
|
urlStream << "http://" << SERVER << "/Browse/EditTag.json?Op=add&ID=" << saveID << "&Tag=" << tag;
|
||||||
|
if(authUser.ID)
|
||||||
|
{
|
||||||
|
std::stringstream userIDStream;
|
||||||
|
userIDStream << authUser.ID;
|
||||||
|
data = http_auth_get((char *)urlStream.str().c_str(), (char *)(userIDStream.str().c_str()), NULL, (char *)(authUser.SessionID.c_str()), &dataStatus, &dataLength);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lastError = "Not authenticated";
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if(dataStatus == 200 && data)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
std::istringstream dataStream(data);
|
||||||
|
json::Array tagsArray;
|
||||||
|
json::Reader::Read(tagsArray, dataStream);
|
||||||
|
|
||||||
|
tags = new std::vector<string>();
|
||||||
|
|
||||||
|
for(int j = 0; j < tagsArray.Size(); j++)
|
||||||
|
{
|
||||||
|
json::String tempTag = tagsArray[j];
|
||||||
|
tags->push_back(tempTag.Value());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (json::Exception &e)
|
||||||
|
{
|
||||||
|
lastError = "Could not read response";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lastError = http_ret_text(dataStatus);
|
||||||
|
}
|
||||||
|
if(data)
|
||||||
|
free(data);
|
||||||
|
return tags;
|
||||||
|
}
|
||||||
|
@@ -59,6 +59,8 @@ public:
|
|||||||
Save * GetSave(int saveID, int saveDate);
|
Save * GetSave(int saveID, int saveDate);
|
||||||
void SetAuthUser(User user);
|
void SetAuthUser(User user);
|
||||||
User GetAuthUser();
|
User GetAuthUser();
|
||||||
|
std::vector<string> * RemoveTag(int saveID, string tag);
|
||||||
|
std::vector<string> * AddTag(int saveID, string tag);
|
||||||
std::string GetLastError() {
|
std::string GetLastError() {
|
||||||
return lastError;
|
return lastError;
|
||||||
}
|
}
|
||||||
|
@@ -29,6 +29,17 @@ Save * TagsController::GetSave()
|
|||||||
return tagsModel->GetSave();
|
return tagsModel->GetSave();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TagsController::RemoveTag(string tag)
|
||||||
|
{
|
||||||
|
tagsModel->RemoveTag(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TagsController::AddTag(string tag)
|
||||||
|
{
|
||||||
|
tagsModel->AddTag(tag);
|
||||||
|
}
|
||||||
|
|
||||||
void TagsController::Exit()
|
void TagsController::Exit()
|
||||||
{
|
{
|
||||||
if(ui::Engine::Ref().GetWindow() == tagsView)
|
if(ui::Engine::Ref().GetWindow() == tagsView)
|
||||||
|
@@ -23,6 +23,8 @@ public:
|
|||||||
TagsController(ControllerCallback * callback, Save * save);
|
TagsController(ControllerCallback * callback, Save * save);
|
||||||
TagsView * GetView() {return tagsView;}
|
TagsView * GetView() {return tagsView;}
|
||||||
Save * GetSave();
|
Save * GetSave();
|
||||||
|
void RemoveTag(string tag);
|
||||||
|
void AddTag(string tag);
|
||||||
void Exit();
|
void Exit();
|
||||||
virtual ~TagsController();
|
virtual ~TagsController();
|
||||||
};
|
};
|
||||||
|
@@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#include "TagsModel.h"
|
#include "TagsModel.h"
|
||||||
#include "TagsView.h"
|
#include "TagsView.h"
|
||||||
|
#include "client/Client.h"
|
||||||
|
|
||||||
TagsModel::TagsModel():
|
TagsModel::TagsModel():
|
||||||
save(NULL)
|
save(NULL)
|
||||||
@@ -26,6 +27,44 @@ Save * TagsModel::GetSave()
|
|||||||
return save;
|
return save;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TagsModel::RemoveTag(string tag)
|
||||||
|
{
|
||||||
|
if(save)
|
||||||
|
{
|
||||||
|
std::vector<string> * tags = Client::Ref().RemoveTag(save->GetID(), tag);
|
||||||
|
if(tags)
|
||||||
|
{
|
||||||
|
save->SetTags(vector<string>(*tags));
|
||||||
|
notifyTagsChanged();
|
||||||
|
delete tags;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lastError = Client::Ref().GetLastError();
|
||||||
|
notifyError();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TagsModel::AddTag(string tag)
|
||||||
|
{
|
||||||
|
if(save)
|
||||||
|
{
|
||||||
|
std::vector<string> * tags = Client::Ref().AddTag(save->GetID(), tag);
|
||||||
|
if(tags)
|
||||||
|
{
|
||||||
|
save->SetTags(vector<string>(*tags));
|
||||||
|
notifyTagsChanged();
|
||||||
|
delete tags;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lastError = Client::Ref().GetLastError();
|
||||||
|
notifyError();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void TagsModel::AddObserver(TagsView * observer)
|
void TagsModel::AddObserver(TagsView * observer)
|
||||||
{
|
{
|
||||||
observers.push_back(observer);
|
observers.push_back(observer);
|
||||||
@@ -40,6 +79,14 @@ void TagsModel::notifyTagsChanged()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TagsModel::notifyError()
|
||||||
|
{
|
||||||
|
for(int i = 0; i < observers.size(); i++)
|
||||||
|
{
|
||||||
|
observers[i]->NotifyError(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TagsModel::~TagsModel() {
|
TagsModel::~TagsModel() {
|
||||||
// TODO Auto-generated destructor stub
|
// TODO Auto-generated destructor stub
|
||||||
}
|
}
|
||||||
|
@@ -14,13 +14,18 @@
|
|||||||
class TagsView;
|
class TagsView;
|
||||||
class TagsModel {
|
class TagsModel {
|
||||||
Save * save;
|
Save * save;
|
||||||
|
string lastError;
|
||||||
std::vector<TagsView*> observers;
|
std::vector<TagsView*> observers;
|
||||||
void notifyTagsChanged();
|
void notifyTagsChanged();
|
||||||
|
void notifyError();
|
||||||
public:
|
public:
|
||||||
TagsModel();
|
TagsModel();
|
||||||
void AddObserver(TagsView * observer);
|
void AddObserver(TagsView * observer);
|
||||||
void SetSave(Save * save);
|
void SetSave(Save * save);
|
||||||
|
void RemoveTag(string tag);
|
||||||
|
void AddTag(string tag);
|
||||||
Save * GetSave();
|
Save * GetSave();
|
||||||
|
string GetLastError(){ return lastError; }
|
||||||
virtual ~TagsModel();
|
virtual ~TagsModel();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -5,18 +5,38 @@
|
|||||||
* Author: Simon
|
* Author: Simon
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "client/Client.h"
|
||||||
#include "TagsView.h"
|
#include "TagsView.h"
|
||||||
|
|
||||||
|
#include "dialogues/ErrorMessage.h"
|
||||||
#include "TagsController.h"
|
#include "TagsController.h"
|
||||||
#include "TagsModel.h"
|
#include "TagsModel.h"
|
||||||
|
|
||||||
TagsView::TagsView():
|
TagsView::TagsView():
|
||||||
ui::Window(ui::Point(-1, -1), ui::Point(200, 300))
|
ui::Window(ui::Point(-1, -1), ui::Point(195, 250))
|
||||||
{
|
{
|
||||||
submitButton = new ui::Button(ui::Point(Size.X-56, Size.Y-24), ui::Point(50, 16));
|
|
||||||
AddComponent(submitButton);
|
class CloseAction : public ui::ButtonAction
|
||||||
tagInput = new ui::Textbox(ui::Point(6, Size.Y-24), ui::Point(Size.X-80, 16), "");
|
{
|
||||||
|
TagsView * v;
|
||||||
|
public:
|
||||||
|
CloseAction(TagsView * _v) { v = _v; }
|
||||||
|
void ActionCallback(ui::Button * sender)
|
||||||
|
{
|
||||||
|
v->c->Exit();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
closeButton = new ui::Button(ui::Point(0, Size.Y-16), ui::Point(195, 16), "Close");
|
||||||
|
closeButton->SetAlignment(AlignLeft, AlignTop);
|
||||||
|
closeButton->SetActionCallback(new CloseAction(this));
|
||||||
|
AddComponent(closeButton);
|
||||||
|
|
||||||
|
tagInput = new ui::Textbox(ui::Point(8, Size.Y-40), ui::Point(Size.X-16, 16), "");
|
||||||
AddComponent(tagInput);
|
AddComponent(tagInput);
|
||||||
|
|
||||||
|
title = new ui::Label(ui::Point(5, 5), ui::Point(185, 16), "Manage tags:");
|
||||||
|
title->SetAlignment(AlignLeft, AlignTop);
|
||||||
|
AddComponent(title);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TagsView::OnDraw()
|
void TagsView::OnDraw()
|
||||||
@@ -26,6 +46,11 @@ void TagsView::OnDraw()
|
|||||||
g->drawrect(Position.X, Position.Y, Size.X, Size.Y, 255, 255, 255, 255);
|
g->drawrect(Position.X, Position.Y, Size.X, Size.Y, 255, 255, 255, 255);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TagsView::NotifyError(TagsModel * sender)
|
||||||
|
{
|
||||||
|
new ErrorMessage("Error", sender->GetLastError());
|
||||||
|
}
|
||||||
|
|
||||||
void TagsView::NotifyTagsChanged(TagsModel * sender)
|
void TagsView::NotifyTagsChanged(TagsModel * sender)
|
||||||
{
|
{
|
||||||
for(int i = 0; i < tags.size(); i++)
|
for(int i = 0; i < tags.size(); i++)
|
||||||
@@ -35,17 +60,61 @@ void TagsView::NotifyTagsChanged(TagsModel * sender)
|
|||||||
}
|
}
|
||||||
tags.clear();
|
tags.clear();
|
||||||
|
|
||||||
|
|
||||||
|
class DeleteTagAction : public ui::ButtonAction
|
||||||
|
{
|
||||||
|
TagsView * v;
|
||||||
|
string tag;
|
||||||
|
public:
|
||||||
|
DeleteTagAction(TagsView * _v, string tag) { v = _v; this->tag = tag; }
|
||||||
|
void ActionCallback(ui::Button * sender)
|
||||||
|
{
|
||||||
|
v->c->RemoveTag(tag);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
if(sender->GetSave())
|
if(sender->GetSave())
|
||||||
{
|
{
|
||||||
for(int i = 0; i < sender->GetSave()->GetTags().size(); i++)
|
for(int i = 0; i < sender->GetSave()->GetTags().size(); i++)
|
||||||
{
|
{
|
||||||
ui::Label * tempLabel = new ui::Label(ui::Point(5, 10*i), ui::Point(50, 16), sender->GetSave()->GetTags()[i]);
|
ui::Label * tempLabel = new ui::Label(ui::Point(35, 35+(16*i)), ui::Point(120, 16), sender->GetSave()->GetTags()[i]);
|
||||||
|
tempLabel->SetAlignment(AlignLeft, AlignMiddle);
|
||||||
tags.push_back(tempLabel);
|
tags.push_back(tempLabel);
|
||||||
AddComponent(tempLabel);
|
AddComponent(tempLabel);
|
||||||
|
|
||||||
|
if(sender->GetSave()->GetUserName()==Client::Ref().GetAuthUser().Username)
|
||||||
|
{
|
||||||
|
ui::Button * tempButton = new ui::Button(ui::Point(15, 35+(16*i)), ui::Point(14, 14), "x");
|
||||||
|
tempButton->SetAlignment(AlignCentre, AlignMiddle);
|
||||||
|
tempButton->SetActionCallback(new DeleteTagAction(this, sender->GetSave()->GetTags()[i]));
|
||||||
|
tags.push_back(tempButton);
|
||||||
|
AddComponent(tempButton);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TagsView::OnKeyPress(int key, Uint16 character, bool shift, bool ctrl, bool alt)
|
||||||
|
{
|
||||||
|
switch(key)
|
||||||
|
{
|
||||||
|
/*case KEY_TAB:
|
||||||
|
if(IsFocused(usernameField))
|
||||||
|
FocusComponent(passwordField);
|
||||||
|
else
|
||||||
|
FocusComponent(usernameField);
|
||||||
|
break;*/
|
||||||
|
case KEY_ENTER:
|
||||||
|
case KEY_RETURN:
|
||||||
|
if(IsFocused(tagInput))
|
||||||
|
{
|
||||||
|
c->AddTag(tagInput->GetText());
|
||||||
|
tagInput->SetText("");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TagsView::~TagsView() {
|
TagsView::~TagsView() {
|
||||||
// TODO Auto-generated destructor stub
|
// TODO Auto-generated destructor stub
|
||||||
}
|
}
|
||||||
|
@@ -18,13 +18,16 @@ class TagsController;
|
|||||||
class TagsModel;
|
class TagsModel;
|
||||||
class TagsView: public ui::Window {
|
class TagsView: public ui::Window {
|
||||||
TagsController * c;
|
TagsController * c;
|
||||||
ui::Button * submitButton;
|
ui::Button * closeButton;
|
||||||
|
ui::Label * title;
|
||||||
ui::Textbox * tagInput;
|
ui::Textbox * tagInput;
|
||||||
std::vector<ui::Label*> tags;
|
std::vector<ui::Component*> tags;
|
||||||
public:
|
public:
|
||||||
TagsView();
|
TagsView();
|
||||||
virtual void OnDraw();
|
virtual void OnDraw();
|
||||||
|
void NotifyError(TagsModel * sender);
|
||||||
void AttachController(TagsController * c_) { c = c_; };
|
void AttachController(TagsController * c_) { c = c_; };
|
||||||
|
virtual void OnKeyPress(int key, Uint16 character, bool shift, bool ctrl, bool alt);
|
||||||
void NotifyTagsChanged(TagsModel * sender);
|
void NotifyTagsChanged(TagsModel * sender);
|
||||||
virtual ~TagsView();
|
virtual ~TagsView();
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user