From 083d4885660919585408a509cd8234e8565c000a Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sun, 26 Jun 2016 01:55:18 +1000 Subject: [PATCH] Added a favorites menu. (#298) Added a favorites menu. --- .../elementsearch/ElementSearchActivity.cpp | 4 +- src/gui/game/Favorite.cpp | 26 +++++++++++++ src/gui/game/Favorite.h | 16 ++++++++ src/gui/game/GameController.cpp | 5 +++ src/gui/game/GameController.h | 1 + src/gui/game/GameModel.cpp | 38 +++++++++++++++++++ src/gui/game/GameModel.h | 1 + src/gui/game/GameView.cpp | 34 +++++++++++++---- src/gui/game/Menu.h | 5 +++ src/gui/game/ToolButton.cpp | 11 +++++- src/gui/game/ToolButton.h | 3 +- src/gui/interface/Appearance.h | 1 + src/simulation/SimulationData.cpp | 1 + src/simulation/SimulationData.h | 7 ++-- 14 files changed, 137 insertions(+), 16 deletions(-) create mode 100644 src/gui/game/Favorite.cpp create mode 100644 src/gui/game/Favorite.h diff --git a/src/gui/elementsearch/ElementSearchActivity.cpp b/src/gui/elementsearch/ElementSearchActivity.cpp index 91d987db47..bb6c2dc705 100644 --- a/src/gui/elementsearch/ElementSearchActivity.cpp +++ b/src/gui/elementsearch/ElementSearchActivity.cpp @@ -129,9 +129,9 @@ void ElementSearchActivity::searchTools(std::string query) ToolButton * tempButton; if(tempTexture) - tempButton = new ToolButton(current+viewPosition, ui::Point(30, 18), "", tool->GetDescription()); + tempButton = new ToolButton(current+viewPosition, ui::Point(30, 18), "", tool->GetIdentifier(), tool->GetDescription()); else - tempButton = new ToolButton(current+viewPosition, ui::Point(30, 18), tool->GetName(), tool->GetDescription()); + tempButton = new ToolButton(current+viewPosition, ui::Point(30, 18), tool->GetName(), tool->GetIdentifier(), tool->GetDescription()); tempButton->Appearance.SetTexture(tempTexture); tempButton->Appearance.BackgroundInactive = ui::Colour(tool->colRed, tool->colGreen, tool->colBlue); diff --git a/src/gui/game/Favorite.cpp b/src/gui/game/Favorite.cpp new file mode 100644 index 0000000000..d142001740 --- /dev/null +++ b/src/gui/game/Favorite.cpp @@ -0,0 +1,26 @@ +#include "Favorite.h" +#include + +std::vector *favoritesList; + +Favorite::Favorite() +{ + favoritesList = new std::vector(); +} + + +std::vector *Favorite::GetFavoritesList() +{ + return favoritesList; +} + +void Favorite::SetFavoritesList(std::vector newFavoritesList) +{ + *favoritesList = newFavoritesList; +} + +bool Favorite::IsFavorite(std::string identifier) +{ + std::vector tempFavoritsList = *favoritesList; + return std::find(tempFavoritsList.begin(), tempFavoritsList.end(), identifier) != tempFavoritsList.end(); +} \ No newline at end of file diff --git a/src/gui/game/Favorite.h b/src/gui/game/Favorite.h new file mode 100644 index 0000000000..e6485b09c8 --- /dev/null +++ b/src/gui/game/Favorite.h @@ -0,0 +1,16 @@ +#ifndef FAVORITE_H +#define FAVORITE_H + +#include +#include + +#include "common/Singleton.h" + +class Favorite : public Singleton { +public: + Favorite(); + std::vector * GetFavoritesList(); + void SetFavoritesList(std::vector favoritesList); + bool IsFavorite(std::string identifier); +}; +#endif //FAVORITE_H \ No newline at end of file diff --git a/src/gui/game/GameController.cpp b/src/gui/game/GameController.cpp index 062c621ab6..cd17c00cd0 100644 --- a/src/gui/game/GameController.cpp +++ b/src/gui/game/GameController.cpp @@ -1045,6 +1045,11 @@ std::vector GameController::GetMenuList() return gameModel->GetMenuList(); } +void GameController::RebuildFavoritesMenu() +{ + gameModel->BuildFavoritesMenu(); +} + void GameController::ActiveToolChanged(int toolSelection, Tool *tool) { commandInterface->OnActiveToolChanged(toolSelection, tool); diff --git a/src/gui/game/GameController.h b/src/gui/game/GameController.h index 6028c5608d..080aafdfec 100644 --- a/src/gui/game/GameController.h +++ b/src/gui/game/GameController.h @@ -103,6 +103,7 @@ class GameController: public ClientListener void SetDebugFlags(unsigned int flags) { debugFlags = flags; } void SetActiveMenu(int menuID); std::vector GetMenuList(); + void RebuildFavoritesMenu(); Tool * GetActiveTool(int selection); void SetActiveTool(int toolSelection, Tool * tool); void SetLastTool(Tool * tool); diff --git a/src/gui/game/GameModel.cpp b/src/gui/game/GameModel.cpp index e79bd11757..5e2d45bb31 100644 --- a/src/gui/game/GameModel.cpp +++ b/src/gui/game/GameModel.cpp @@ -17,6 +17,7 @@ #include "QuickOptions.h" #include "GameModelException.h" #include "Format.h" +#include "Favorite.h" GameModel::GameModel(): clipboard(NULL), @@ -81,6 +82,11 @@ GameModel::GameModel(): sim->aheat_enable = Client::Ref().GetPrefInteger("Simulation.AmbientHeat", 0); sim->pretty_powder = Client::Ref().GetPrefInteger("Simulation.PrettyPowder", 0); + //Load favorites + std::vector favoritesList = Client::Ref().GetPrefStringArray("Favorites"); + + Favorite::Ref().SetFavoritesList(favoritesList); + //Load last user if(Client::Ref().GetAuthUser().ID) { @@ -156,6 +162,8 @@ GameModel::~GameModel() Client::Ref().SetPref("Decoration.Blue", (int)colour.Blue); Client::Ref().SetPref("Decoration.Alpha", (int)colour.Alpha); + Client::Ref().SetPref("Favorites", std::vector(Favorite::Ref().GetFavoritesList()->begin(), Favorite::Ref().GetFavoritesList()->end())); + for (size_t i = 0; i < menuList.size(); i++) { delete menuList[i]; @@ -353,6 +361,36 @@ void GameModel::BuildMenus() notifyToolListChanged(); notifyActiveToolsChanged(); notifyLastToolChanged(); + + //Build menu for favorites + BuildFavoritesMenu(); +} + +void GameModel::BuildFavoritesMenu() +{ + menuList[SC_FAVORITES]->ClearTools(); + + for (int i = 0; i < menuList.size(); i++) + { + if (i == SC_FAVORITES) + continue; + + for (int j = 0; j < menuList[i]->GetToolList().size(); j++) + { + if (Favorite::Ref().IsFavorite(menuList[i]->GetToolList()[j]->GetIdentifier())) + { + menuList[SC_FAVORITES]->AddTool(menuList[i]->GetToolList()[j]); + } + } + } + + if (activeMenu == SC_FAVORITES) + toolList = menuList[SC_FAVORITES]->GetToolList(); + + notifyMenuListChanged(); + notifyToolListChanged(); + notifyActiveToolsChanged(); + notifyLastToolChanged(); } Tool * GameModel::GetToolFromIdentifier(std::string identifier) diff --git a/src/gui/game/GameModel.h b/src/gui/game/GameModel.h index 38d7813692..f3aca6b337 100644 --- a/src/gui/game/GameModel.h +++ b/src/gui/game/GameModel.h @@ -125,6 +125,7 @@ class GameModel std::string GetInfoTip(); void BuildMenus(); + void BuildFavoritesMenu(); void BuildQuickOptionMenu(GameController * controller); std::deque GetHistory(); diff --git a/src/gui/game/GameView.cpp b/src/gui/game/GameView.cpp index d13bb7f455..1d847c7555 100644 --- a/src/gui/game/GameView.cpp +++ b/src/gui/game/GameView.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "Config.h" #include "gui/Style.h" @@ -19,6 +20,7 @@ #include "QuickOptions.h" #include "IntroText.h" #include "DecorationTool.h" +#include "Favorite.h" class SplitButton; @@ -536,11 +538,27 @@ class GameView::ToolAction: public ui::ButtonAction void ActionCallback(ui::Button * sender_) { ToolButton *sender = (ToolButton*)sender_; - if (v->CtrlBehaviour() && v->AltBehaviour() && !v->ShiftBehaviour()) - if (tool->GetIdentifier().find("DEFAULT_PT_") != tool->GetIdentifier().npos) - sender->SetSelectionState(3); - if(sender->GetSelectionState() >= 0 && sender->GetSelectionState() <= 3) - v->c->SetActiveTool(sender->GetSelectionState(), tool); + if (v->ShiftBehaviour() && !v->CtrlBehaviour() && !v->AltBehaviour()) + { + if (Favorite::Ref().IsFavorite(tool->GetIdentifier()) && sender->GetSelectionState() == 1) + Favorite::Ref().GetFavoritesList()->erase(std::remove(Favorite::Ref().GetFavoritesList()->begin(), Favorite::Ref().GetFavoritesList()->end(), + tool->GetIdentifier()), Favorite::Ref().GetFavoritesList()->end()); + else if (sender->GetSelectionState() == 0) + Favorite::Ref().GetFavoritesList()->push_back(tool->GetIdentifier()); + else if (sender->GetSelectionState() == 2) + v->c->SetActiveMenu(SC_FAVORITES); + + v->c->RebuildFavoritesMenu(); + } + else + { + if (v->CtrlBehaviour() && v->AltBehaviour() && !v->ShiftBehaviour()) + if (tool->GetIdentifier().find("DEFAULT_PT_") != tool->GetIdentifier().npos) + sender->SetSelectionState(3); + + if (sender->GetSelectionState() >= 0 && sender->GetSelectionState() <= 3) + v->c->SetActiveTool(sender->GetSelectionState(), tool); + } } }; @@ -740,9 +758,9 @@ void GameView::NotifyToolListChanged(GameModel * sender) tempTexture = ((DecorationTool*)toolList[i])->GetIcon(toolList[i]->GetToolID(), 26, 14); if(tempTexture) - tempButton = new ToolButton(ui::Point(currentX, YRES+1), ui::Point(30, 18), "", toolList[i]->GetDescription()); + tempButton = new ToolButton(ui::Point(currentX, YRES+1), ui::Point(30, 18), "", toolList[i]->GetIdentifier(), toolList[i]->GetDescription()); else - tempButton = new ToolButton(ui::Point(currentX, YRES+1), ui::Point(30, 18), toolList[i]->GetName(), toolList[i]->GetDescription()); + tempButton = new ToolButton(ui::Point(currentX, YRES+1), ui::Point(30, 18), toolList[i]->GetName(), toolList[i]->GetIdentifier(), toolList[i]->GetDescription()); //currentY -= 17; currentX -= 31; @@ -832,7 +850,7 @@ void GameView::NotifyColourPresetsChanged(GameModel * sender) int i = 0; for(std::vector::iterator iter = colours.begin(), end = colours.end(); iter != end; ++iter) { - ToolButton * tempButton = new ToolButton(ui::Point(currentX, YRES+1), ui::Point(30, 18), "", "Decoration Presets."); + ToolButton * tempButton = new ToolButton(ui::Point(currentX, YRES+1), ui::Point(30, 18), "", "", "Decoration Presets."); tempButton->Appearance.BackgroundInactive = *iter; tempButton->SetActionCallback(new ColourPresetAction(this, i)); diff --git a/src/gui/game/Menu.h b/src/gui/game/Menu.h index 0d8ac24e94..d1b00f7f3e 100644 --- a/src/gui/game/Menu.h +++ b/src/gui/game/Menu.h @@ -45,6 +45,11 @@ class Menu { tools.push_back(tool_); } + + void ClearTools() + { + tools.clear(); + } }; diff --git a/src/gui/game/ToolButton.cpp b/src/gui/game/ToolButton.cpp index 202b779338..2eb495ff4d 100644 --- a/src/gui/game/ToolButton.cpp +++ b/src/gui/game/ToolButton.cpp @@ -1,11 +1,14 @@ #include "ToolButton.h" #include "gui/interface/Keys.h" +#include "Favorite.h" -ToolButton::ToolButton(ui::Point position, ui::Point size, std::string text_, std::string toolTip): - ui::Button(position, size, text_, toolTip) +ToolButton::ToolButton(ui::Point position, ui::Point size, std::string text_, std::string toolIdentifier, std::string toolTip): + ui::Button(position, size, text_, toolTip), + toolIdentifier(toolIdentifier) { SetSelectionState(-1); Appearance.BorderActive = ui::Colour(255, 0, 0); + Appearance.BorderFavorite = ui::Colour(255, 255, 0); //don't use "..." on elements that have long names buttonDisplayText = ButtonText.substr(0, 7); @@ -56,6 +59,10 @@ void ToolButton::Draw(const ui::Point& screenPos) { g->drawrect(screenPos.X, screenPos.Y, Size.X, Size.Y, Appearance.BorderActive.Red, Appearance.BorderActive.Green, Appearance.BorderActive.Blue, Appearance.BorderActive.Alpha); } + else if (Favorite::Ref().IsFavorite(toolIdentifier) && currentSelection == -1) + { + g->drawrect(screenPos.X, screenPos.Y, Size.X, Size.Y, Appearance.BorderFavorite.Red, Appearance.BorderFavorite.Green, Appearance.BorderFavorite.Blue, Appearance.BorderFavorite.Alpha); + } else { g->drawrect(screenPos.X, screenPos.Y, Size.X, Size.Y, Appearance.BorderInactive.Red, Appearance.BorderInactive.Green, Appearance.BorderInactive.Blue, Appearance.BorderInactive.Alpha); diff --git a/src/gui/game/ToolButton.h b/src/gui/game/ToolButton.h index d0ad7c0ce6..d2a8abccbb 100644 --- a/src/gui/game/ToolButton.h +++ b/src/gui/game/ToolButton.h @@ -6,8 +6,9 @@ class ToolButton: public ui::Button { int currentSelection; + std::string toolIdentifier; public: - ToolButton(ui::Point position, ui::Point size, std::string text_, std::string toolTip = ""); + ToolButton(ui::Point position, ui::Point size, std::string text_, std::string toolIdentifier, std::string toolTip = ""); virtual void OnMouseUnclick(int x, int y, unsigned int button); virtual void OnMouseUp(int x, int y, unsigned int button); virtual void OnMouseClick(int x, int y, unsigned int button); diff --git a/src/gui/interface/Appearance.h b/src/gui/interface/Appearance.h index 1c1bb5a418..fb433bc47d 100644 --- a/src/gui/interface/Appearance.h +++ b/src/gui/interface/Appearance.h @@ -38,6 +38,7 @@ namespace ui ui::Colour BorderHover; ui::Colour BorderInactive; ui::Colour BorderActive; + ui::Colour BorderFavorite; ui::Colour BorderDisabled; ui::Border Margin; diff --git a/src/simulation/SimulationData.cpp b/src/simulation/SimulationData.cpp index b1fb478cac..3b87dec0a5 100644 --- a/src/simulation/SimulationData.cpp +++ b/src/simulation/SimulationData.cpp @@ -158,6 +158,7 @@ menu_section * LoadMenus(int & menuCount) {"\xD2", "Game Of Life", 0, 1}, {"\xD7", "Tools", 0, 1}, {"\xE4", "Decoration tools", 0, 1}, + {"\xCC", "Favorites", 0, 1}, {"\xC8", "Cracker", 0, 0}, {"\xC8", "Cracker!", 0, 0}, }; diff --git a/src/simulation/SimulationData.h b/src/simulation/SimulationData.h index 90fcfeeb46..dc208f2a55 100644 --- a/src/simulation/SimulationData.h +++ b/src/simulation/SimulationData.h @@ -15,9 +15,10 @@ #define SC_LIFE 12 #define SC_TOOL 13 #define SC_DECO 14 -#define SC_CRACKER 15 -#define SC_CRACKER2 16 -#define SC_TOTAL 15 +#define SC_FAVORITES 15 +#define SC_CRACKER 16 +#define SC_CRACKER2 17 +#define SC_TOTAL 16 #define O_WL_WALLELEC 122 #define O_WL_EWALL 123