diff --git a/src/elementsearch/ElementSearchActivity.cpp b/src/elementsearch/ElementSearchActivity.cpp new file mode 100644 index 000000000..7a879951e --- /dev/null +++ b/src/elementsearch/ElementSearchActivity.cpp @@ -0,0 +1,192 @@ +/* + * ElementSearchActivity.cpp + * + * Created on: Jun 24, 2012 + * Author: Simon + */ + +#include +#include "ElementSearchActivity.h" +#include "interface/Textbox.h" +#include "interface/Label.h" +#include "game/Tool.h" +#include "Style.h" +#include "game/GameModel.h" + +class ElementSearchActivity::ToolAction: public ui::ButtonAction +{ + ElementSearchActivity * a; +public: + Tool * tool; + ToolAction(ElementSearchActivity * a, Tool * tool) : a(a), tool(tool) { } + void ActionCallback(ui::Button * sender_) + { + ToolButton *sender = (ToolButton*)sender_; + if(sender->GetSelectionState() >= 0 && sender->GetSelectionState() <= 2) + a->SetActiveTool(sender->GetSelectionState(), tool); + } +}; + +ElementSearchActivity::ElementSearchActivity(GameModel * gameModel, std::vector tools) : + Window(ui::Point(-1, -1), ui::Point(236, 302)), + gameModel(gameModel), + tools(tools), + firstResult(NULL) +{ + ui::Label * title = new ui::Label(ui::Point(4, 5), ui::Point(Size.X-8, 15), "Element Search"); + title->SetTextColour(style::Colour::InformationTitle); + title->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; + AddComponent(title); + + class SearchAction : public ui::TextboxAction + { + private: + ElementSearchActivity * a; + public: + SearchAction(ElementSearchActivity * a) : a(a) {} + virtual void TextChangedCallback(ui::Textbox * sender) { + a->searchTools(sender->GetText()); + } + }; + + searchField = new ui::Textbox(ui::Point(8, 23), ui::Point(Size.X-16, 17), ""); + searchField->SetActionCallback(new SearchAction(this)); + searchField->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; + AddComponent(searchField); + FocusComponent(searchField); + + class CloseAction: public ui::ButtonAction + { + ElementSearchActivity * a; + public: + CloseAction(ElementSearchActivity * a) : a(a) { } + void ActionCallback(ui::Button * sender_) + { + a->Exit(); + } + }; + + class OKAction: public ui::ButtonAction + { + ElementSearchActivity * a; + public: + OKAction(ElementSearchActivity * a) : a(a) { } + void ActionCallback(ui::Button * sender_) + { + if(a->GetFirstResult()) + a->SetActiveTool(0, a->GetFirstResult()); + } + }; + + ui::Button * closeButton = new ui::Button(ui::Point(0, Size.Y-15), ui::Point((Size.X/2)+1, 15), "Close"); + closeButton->SetActionCallback(new CloseAction(this)); + ui::Button * okButton = new ui::Button(ui::Point(Size.X/2, Size.Y-15), ui::Point(Size.X/2, 15), "OK"); + okButton->SetActionCallback(new OKAction(this)); + + AddComponent(okButton); + AddComponent(closeButton); + + searchTools(""); +} + +void ElementSearchActivity::searchTools(std::string query) +{ + firstResult = NULL; + for(std::vector::iterator iter = toolButtons.begin(), end = toolButtons.end(); iter != end; ++iter) { + delete *iter; + RemoveComponent(*iter); + } + toolButtons.clear(); + + ui::Point viewPosition = searchField->Position + ui::Point(2+0, searchField->Size.Y+2+8); + ui::Point current = ui::Point(0, 0); + + std::string queryLower = std::string(query); + std::transform(queryLower.begin(), queryLower.end(), queryLower.begin(), ::tolower); + + for(std::vector::iterator iter = tools.begin(), end = tools.end(); iter != end; ++iter) { + std::string nameLower = std::string((*iter)->GetName()); + std::transform(nameLower.begin(), nameLower.end(), nameLower.begin(), ::tolower); + + if(strstr(nameLower.c_str(), queryLower.c_str())!=0) + { + Tool * tool = *iter; + + if(!firstResult) + firstResult = tool; + + ToolButton * tempButton = new ToolButton(current+viewPosition, ui::Point(30, 18), tool->GetName()); + tempButton->Appearance.BackgroundInactive = ui::Colour(tool->colRed, tool->colGreen, tool->colBlue); + tempButton->SetActionCallback(new ToolAction(this, tool)); + + if(gameModel->GetActiveTool(0) == tool) + { + tempButton->SetSelectionState(0); //Primary + } + else if(gameModel->GetActiveTool(1) == tool) + { + tempButton->SetSelectionState(1); //Secondary + } + else if(gameModel->GetActiveTool(2) == tool) + { + tempButton->SetSelectionState(2); //Tertiary + } + + toolButtons.push_back(tempButton); + AddComponent(tempButton); + + current.X += 31; + + if(current.X + 30 > searchField->Size.X) { + current.X = 0; + current.Y += 19; + } + + if(current.Y + viewPosition.Y + 18 > Size.Y-23) + break; + } + } +} + +void ElementSearchActivity::SetActiveTool(int selectionState, Tool * tool) +{ + gameModel->SetActiveTool(selectionState, tool); + Exit(); +} + +void ElementSearchActivity::Exit() +{ + if(ui::Engine::Ref().GetWindow() == this) + { + ui::Engine::Ref().CloseWindow(); + } + SelfDestruct(); +} + +void ElementSearchActivity::OnDraw() +{ + Graphics * g = ui::Engine::Ref().g; + g->clearrect(Position.X-2, Position.Y-2, Size.X+3, Size.Y+3); + g->drawrect(Position.X, Position.Y, Size.X, Size.Y, 255, 255, 255, 255); + + g->drawrect(Position.X+searchField->Position.X, Position.Y+searchField->Position.Y+searchField->Size.Y+8, searchField->Size.X, Size.Y-(searchField->Position.Y+searchField->Size.Y+8)-23, 255, 255, 255, 180); +} + +void ElementSearchActivity::OnKeyPress(int key, Uint16 character, bool shift, bool ctrl, bool alt) +{ + if(key == KEY_ENTER || key == KEY_RETURN) + { + if(firstResult) + gameModel->SetActiveTool(0, firstResult); + Exit(); + } + if(key == KEY_ESCAPE) + { + Exit(); + } +} + +ElementSearchActivity::~ElementSearchActivity() { + // TODO Auto-generated destructor stub +} + diff --git a/src/elementsearch/ElementSearchActivity.h b/src/elementsearch/ElementSearchActivity.h new file mode 100644 index 000000000..7ed7611b1 --- /dev/null +++ b/src/elementsearch/ElementSearchActivity.h @@ -0,0 +1,39 @@ +/* + * ElementSearchActivity.h + * + * Created on: Jun 24, 2012 + * Author: Simon + */ + +#ifndef ELEMENTSEARCHACTIVITY_H_ +#define ELEMENTSEARCHACTIVITY_H_ + +#include +#include +#include "interface/Window.h" +#include "interface/Textbox.h" +#include "game/ToolButton.h" + +class Tool; + +class GameModel; + +class ElementSearchActivity: public ui::Window { + Tool * firstResult; + GameModel * gameModel; + std::vector tools; + ui::Textbox * searchField; + std::vector toolButtons; + void searchTools(std::string query); +public: + class ToolAction; + Tool * GetFirstResult() { return firstResult; } + ElementSearchActivity(GameModel * gameModel, std::vector tools); + void Exit(); + void SetActiveTool(int selectionState, Tool * tool); + virtual ~ElementSearchActivity(); + virtual void OnDraw(); + virtual void OnKeyPress(int key, Uint16 character, bool shift, bool ctrl, bool alt); +}; + +#endif /* ELEMENTSEARCHACTIVITY_H_ */ diff --git a/src/game/GameController.cpp b/src/game/GameController.cpp index affb88572..5c5c92898 100644 --- a/src/game/GameController.cpp +++ b/src/game/GameController.cpp @@ -13,6 +13,7 @@ #include "dialogues/ConfirmPrompt.h" #include "GameModelException.h" #include "simulation/Air.h" +#include "elementsearch/ElementSearchActivity.h" #include "update/UpdateActivity.h" #include "Notification.h" @@ -513,6 +514,21 @@ void GameController::OpenLogin() ui::Engine::Ref().ShowWindow(loginWindow->GetView()); } +void GameController::OpenElementSearch() +{ + vector toolList; + vector menuList = gameModel->GetMenuList(); + for(std::vector::iterator iter = menuList.begin(), end = menuList.end(); iter!=end; ++iter) { + if(!(*iter)) + continue; + vector menuToolList = (*iter)->GetToolList(); + if(!menuToolList.size()) + continue; + toolList.insert(toolList.end(), menuToolList.begin(), menuToolList.end()); + } + ui::Engine::Ref().ShowWindow(new ElementSearchActivity(gameModel, toolList)); +} + void GameController::OpenTags() { if(gameModel->GetUser().ID) diff --git a/src/game/GameController.h b/src/game/GameController.h index c424656e1..4e2b43adc 100644 --- a/src/game/GameController.h +++ b/src/game/GameController.h @@ -90,6 +90,7 @@ public: void OpenRenderOptions(); void OpenSaveWindow(); void OpenStamps(); + void OpenElementSearch(); void PlaceSave(ui::Point position); void ClearSim(); void ReloadSim(); diff --git a/src/game/GameView.cpp b/src/game/GameView.cpp index 5593d4b3c..29e704286 100644 --- a/src/game/GameView.cpp +++ b/src/game/GameView.cpp @@ -238,6 +238,21 @@ GameView::GameView(): colourBSlider->SetActionCallback(colC); colourASlider = new ui::Slider(ui::Point(275, Size.Y-39), ui::Point(50, 14), 255); colourASlider->SetActionCallback(colC); + + class ElementSearchAction : public ui::ButtonAction + { + GameView * v; + public: + ElementSearchAction(GameView * _v) { v = _v; } + void ActionCallback(ui::Button * sender) + { + v->c->OpenElementSearch(); + } + }; + ui::Button * tempButton = new ui::Button(ui::Point(XRES+BARSIZE-16, YRES+MENUSIZE-32), ui::Point(15, 15), ""); + tempButton->Appearance.Margin = ui::Border(0, 2, 3, 2); + tempButton->SetActionCallback(new ElementSearchAction(this)); + AddComponent(tempButton); } class GameView::MenuAction: public ui::ButtonAction @@ -272,7 +287,7 @@ public: void GameView::NotifyMenuListChanged(GameModel * sender) { - int currentY = YRES+MENUSIZE-16-(sender->GetMenuList().size()*16); + int currentY = YRES+MENUSIZE-48;//-(sender->GetMenuList().size()*16); for(int i = 0; i < menuButtons.size(); i++) { RemoveComponent(menuButtons[i]); @@ -286,15 +301,16 @@ void GameView::NotifyMenuListChanged(GameModel * sender) } toolButtons.clear(); vector menuList = sender->GetMenuList(); - for(int i = 0; i < menuList.size(); i++) + for(vector::reverse_iterator iter = menuList.rbegin(), end = menuList.rend(); iter != end; ++iter) { std::string tempString = ""; - tempString += menuList[i]->GetIcon(); + Menu * item = *iter; + tempString += item->GetIcon(); ui::Button * tempButton = new ui::Button(ui::Point(XRES+BARSIZE-16, currentY), ui::Point(15, 15), tempString); tempButton->Appearance.Margin = ui::Border(0, 2, 3, 2); tempButton->SetTogglable(true); - tempButton->SetActionCallback(new MenuAction(this, menuList[i])); - currentY+=16; + tempButton->SetActionCallback(new MenuAction(this, item)); + currentY-=16; AddComponent(tempButton); menuButtons.push_back(tempButton); } diff --git a/src/game/Tool.cpp b/src/game/Tool.cpp new file mode 100644 index 000000000..2467d3fb8 --- /dev/null +++ b/src/game/Tool.cpp @@ -0,0 +1,94 @@ +/* + * Tool.cpp + * + * Created on: Jun 24, 2012 + * Author: Simon + */ + +#include +#include "Tool.h" + +#include "simulation/Simulation.h" + +using namespace std; + +Tool::Tool(int id, string name, int r, int g, int b): + toolID(id), + toolName(name), + colRed(r), + colGreen(g), + colBlue(b) +{ +} +string Tool::GetName() { return toolName; } +Tool::~Tool() {} +void Tool::Click(Simulation * sim, Brush * brush, ui::Point position) { } +void Tool::Draw(Simulation * sim, Brush * brush, ui::Point position) { + sim->ToolBrush(position.X, position.Y, toolID, brush); +} +void Tool::DrawLine(Simulation * sim, Brush * brush, ui::Point position1, ui::Point position2) { + sim->ToolLine(position1.X, position1.Y, position2.X, position2.Y, toolID, brush); +} +void Tool::DrawRect(Simulation * sim, Brush * brush, ui::Point position1, ui::Point position2) { + sim->ToolBox(position1.X, position1.Y, position2.X, position2.Y, toolID, brush); +} +void Tool::DrawFill(Simulation * sim, Brush * brush, ui::Point position) {}; + +ElementTool::ElementTool(int id, string name, int r, int g, int b): + Tool(id, name, r, g, b) +{ +} +ElementTool::~ElementTool() {} +void ElementTool::Draw(Simulation * sim, Brush * brush, ui::Point position){ + sim->CreateParts(position.X, position.Y, toolID, brush); +} +void ElementTool::DrawLine(Simulation * sim, Brush * brush, ui::Point position1, ui::Point position2) { + sim->CreateLine(position1.X, position1.Y, position2.X, position2.Y, toolID, brush); +} +void ElementTool::DrawRect(Simulation * sim, Brush * brush, ui::Point position1, ui::Point position2) { + sim->CreateBox(position1.X, position1.Y, position2.X, position2.Y, toolID, 0); +} +void ElementTool::DrawFill(Simulation * sim, Brush * brush, ui::Point position) { + sim->FloodParts(position.X, position.Y, toolID, -1, -1, 0); +} + + +WallTool::WallTool(int id, string name, int r, int g, int b): +Tool(id, name, r, g, b) +{ +} +WallTool::~WallTool() {} +void WallTool::Draw(Simulation * sim, Brush * brush, ui::Point position){ + sim->CreateWalls(position.X, position.Y, 1, 1, toolID, 0, brush); +} +void WallTool::DrawLine(Simulation * sim, Brush * brush, ui::Point position1, ui::Point position2) { + sim->CreateWallLine(position1.X, position1.Y, position2.X, position2.Y, 1, 1, toolID, 0, brush); +} +void WallTool::DrawRect(Simulation * sim, Brush * brush, ui::Point position1, ui::Point position2) { + sim->CreateWallBox(position1.X, position1.Y, position2.X, position2.Y, toolID, 0); +} +void WallTool::DrawFill(Simulation * sim, Brush * brush, ui::Point position) { + sim->FloodWalls(position.X, position.Y, toolID, -1, -1, 0); +} + + +GolTool::GolTool(int id, string name, int r, int g, int b): + Tool(id, name, r, g, b) +{ +} +GolTool::~GolTool() {} +void GolTool::Draw(Simulation * sim, Brush * brush, ui::Point position){ + sim->CreateParts(position.X, position.Y, PT_LIFE|(toolID<<8), brush); +} +void GolTool::DrawLine(Simulation * sim, Brush * brush, ui::Point position1, ui::Point position2) { + sim->CreateLine(position1.X, position1.Y, position2.X, position2.Y, PT_LIFE|(toolID<<8), brush); +} +void GolTool::DrawRect(Simulation * sim, Brush * brush, ui::Point position1, ui::Point position2) { + sim->CreateBox(position1.X, position1.Y, position2.X, position2.Y, PT_LIFE|(toolID<<8), 0); +} +void GolTool::DrawFill(Simulation * sim, Brush * brush, ui::Point position) { + sim->FloodParts(position.X, position.Y, PT_LIFE|(toolID<<8), -1, -1, 0); +} + + + diff --git a/src/game/Tool.h b/src/game/Tool.h index 4a78be8f2..819620d2f 100644 --- a/src/game/Tool.h +++ b/src/game/Tool.h @@ -12,33 +12,25 @@ using namespace std; +#include "interface/Point.h" + +class Simulation; +class Brush; + class Tool { protected: int toolID; string toolName; public: - Tool(int id, string name, int r, int g, int b): - toolID(id), - toolName(name), - colRed(r), - colGreen(g), - colBlue(b) - { - } - string GetName() { return toolName; } - virtual ~Tool() {} - virtual void Click(Simulation * sim, Brush * brush, ui::Point position) { } - virtual void Draw(Simulation * sim, Brush * brush, ui::Point position) { - sim->ToolBrush(position.X, position.Y, toolID, brush); - } - virtual void DrawLine(Simulation * sim, Brush * brush, ui::Point position1, ui::Point position2) { - sim->ToolLine(position1.X, position1.Y, position2.X, position2.Y, toolID, brush); - } - virtual void DrawRect(Simulation * sim, Brush * brush, ui::Point position1, ui::Point position2) { - sim->ToolBox(position1.X, position1.Y, position2.X, position2.Y, toolID, brush); - } - virtual void DrawFill(Simulation * sim, Brush * brush, ui::Point position) {}; + Tool(int id, string name, int r, int g, int b); + string GetName(); + virtual ~Tool(); + virtual void Click(Simulation * sim, Brush * brush, ui::Point position); + virtual void Draw(Simulation * sim, Brush * brush, ui::Point position); + virtual void DrawLine(Simulation * sim, Brush * brush, ui::Point position1, ui::Point position2); + virtual void DrawRect(Simulation * sim, Brush * brush, ui::Point position1, ui::Point position2); + virtual void DrawFill(Simulation * sim, Brush * brush, ui::Point position); int colRed, colBlue, colGreen; }; @@ -75,67 +67,34 @@ public: class ElementTool: public Tool { public: - ElementTool(int id, string name, int r, int g, int b): - Tool(id, name, r, g, b) - { - } - virtual ~ElementTool() {} - virtual void Draw(Simulation * sim, Brush * brush, ui::Point position){ - sim->CreateParts(position.X, position.Y, toolID, brush); - } - virtual void DrawLine(Simulation * sim, Brush * brush, ui::Point position1, ui::Point position2) { - sim->CreateLine(position1.X, position1.Y, position2.X, position2.Y, toolID, brush); - } - virtual void DrawRect(Simulation * sim, Brush * brush, ui::Point position1, ui::Point position2) { - sim->CreateBox(position1.X, position1.Y, position2.X, position2.Y, toolID, 0); - } - virtual void DrawFill(Simulation * sim, Brush * brush, ui::Point position) { - sim->FloodParts(position.X, position.Y, toolID, -1, -1, 0); - } + ElementTool(int id, string name, int r, int g, int b); + virtual ~ElementTool(); + virtual void Draw(Simulation * sim, Brush * brush, ui::Point position); + virtual void DrawLine(Simulation * sim, Brush * brush, ui::Point position1, ui::Point position2); + virtual void DrawRect(Simulation * sim, Brush * brush, ui::Point position1, ui::Point position2); + virtual void DrawFill(Simulation * sim, Brush * brush, ui::Point position); }; class WallTool: public Tool { public: - WallTool(int id, string name, int r, int g, int b): - Tool(id, name, r, g, b) - { - } - virtual ~WallTool() {} - virtual void Draw(Simulation * sim, Brush * brush, ui::Point position){ - sim->CreateWalls(position.X, position.Y, 1, 1, toolID, 0, brush); - } - virtual void DrawLine(Simulation * sim, Brush * brush, ui::Point position1, ui::Point position2) { - sim->CreateWallLine(position1.X, position1.Y, position2.X, position2.Y, 1, 1, toolID, 0, brush); - } - virtual void DrawRect(Simulation * sim, Brush * brush, ui::Point position1, ui::Point position2) { - sim->CreateWallBox(position1.X, position1.Y, position2.X, position2.Y, toolID, 0); - } - virtual void DrawFill(Simulation * sim, Brush * brush, ui::Point position) { - sim->FloodWalls(position.X, position.Y, toolID, -1, -1, 0); - } + WallTool(int id, string name, int r, int g, int b); + virtual ~WallTool(); + virtual void Draw(Simulation * sim, Brush * brush, ui::Point position); + virtual void DrawLine(Simulation * sim, Brush * brush, ui::Point position1, ui::Point position2); + virtual void DrawRect(Simulation * sim, Brush * brush, ui::Point position1, ui::Point position2); + virtual void DrawFill(Simulation * sim, Brush * brush, ui::Point position); }; class GolTool: public Tool { public: - GolTool(int id, string name, int r, int g, int b): - Tool(id, name, r, g, b) - { - } - virtual ~GolTool() {} - virtual void Draw(Simulation * sim, Brush * brush, ui::Point position){ - sim->CreateParts(position.X, position.Y, PT_LIFE|(toolID<<8), brush); - } - virtual void DrawLine(Simulation * sim, Brush * brush, ui::Point position1, ui::Point position2) { - sim->CreateLine(position1.X, position1.Y, position2.X, position2.Y, PT_LIFE|(toolID<<8), brush); - } - virtual void DrawRect(Simulation * sim, Brush * brush, ui::Point position1, ui::Point position2) { - sim->CreateBox(position1.X, position1.Y, position2.X, position2.Y, PT_LIFE|(toolID<<8), 0); - } - virtual void DrawFill(Simulation * sim, Brush * brush, ui::Point position) { - sim->FloodParts(position.X, position.Y, PT_LIFE|(toolID<<8), -1, -1, 0); - } + GolTool(int id, string name, int r, int g, int b); + virtual ~GolTool(); + virtual void Draw(Simulation * sim, Brush * brush, ui::Point position); + virtual void DrawLine(Simulation * sim, Brush * brush, ui::Point position1, ui::Point position2); + virtual void DrawRect(Simulation * sim, Brush * brush, ui::Point position1, ui::Point position2); + virtual void DrawFill(Simulation * sim, Brush * brush, ui::Point position); }; #endif /* TOOL_H_ */