Cytopia  0.3
A city building simulation game
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
BuildMenu Class Referencefinal

#include <BuildMenu.hxx>

+ Inheritance diagram for BuildMenu:
+ Collaboration diagram for BuildMenu:

Public Member Functions

 BuildMenu ()
 
void draw () const override
 
void createSubMenus ()
 
void setItemVisible (BuildMenuButton::Ptr btn, bool visible)
 
void onClick (BuildMenuButton::Ptr btn)
 
void onAction (const std::string &action, bool checked)
 
void onChangeTileType (const std::string &id, bool checked)
 
void closeSubmenus () override
 
void clearState ()
 
const std::stringgetId () const
 
const BuildMenuButton::ItemsgetButtons () const
 
float getTooltipDelay () const
 
- Public Member Functions inherited from GameMenu
virtual ~GameMenu ()=default
 
virtual bool isMouseHovered () const
 

Private Attributes

BuildMenuButton::Items m_buttons
 
std::string m_id = "Main"
 
ImVec2 m_btnSize
 
float m_tooltipDelay = 3.f
 

Additional Inherited Members

- Public Types inherited from GameMenu
using Ptr = std::shared_ptr< GameMenu >
 

Detailed Description

Definition at line 74 of file BuildMenu.hxx.

Constructor & Destructor Documentation

◆ BuildMenu()

BuildMenu::BuildMenu ( )

Definition at line 17 of file BuildMenu.cxx.

18 {
19  // function create new big category button
20  auto main_button = [this](const char *tx, const char *id)
21  {
22  m_buttons.emplace_back(std::make_shared<BuildMenuButton>(tx, id));
23  return m_buttons.back();
24  };
25 
26  // special case for construction button
27  auto constrution = main_button("Button_ConstructionMenu", "Construction");
28  constrution->addActionButton("Button_ConstructionMenu_Demolish", "Demolish", "Demolish");
29  constrution->addActionButton("Button_ConstructionMenu_RaiseTerrain", "RaiseTerrain", "Raise Terrain");
30  constrution->addActionButton("Button_ConstructionMenu_LowerTerrain", "LowerTerrain", "Lower Terrain");
31  constrution->addActionButton("Button_ConstructionMenu_LevelTerrain", "LevelTerrain", "Level Terrain");
32  constrution->addActionButton("Button_ConstructionMenu_DeZone", "DeZone", "De-zone");
33  constrution->addActionButton("Button_ConstructionMenu_Water", "Water", "Water");
34 
35  // add big caterogries buttons
36  main_button("Button_NatureMenu", "Nature");
37  main_button("Button_RoadsMenu", "Roads");
38  main_button("Button_ZonesMenu", "Zones");
39  main_button("Button_RecreationMenu", "Recreation");
40  main_button("Button_PowerMenu", "Power");
41  main_button("Button_WaterMenu", "Waterworks");
42  main_button("Button_EmergencyMenu", "Emergency");
43  main_button("Button_DebugMenu", "Debug");
44 
45  // save texture size
46  ImSpan2i size;
47  SDL_QueryTexture(m_buttons.front()->m_tex, nullptr, nullptr, &size.w, &size.h);
48  m_btnSize = ImVec2(size.w, size.h);
49 
51 }
+ Here is the call graph for this function:

Member Function Documentation

◆ clearState()

void BuildMenu::clearState ( )

Definition at line 450 of file BuildMenu.cxx.

451 {
452  tileToPlace = "";
453  highlightSelection = false;
455 }
+ Here is the caller graph for this function:

◆ closeSubmenus()

void BuildMenu::closeSubmenus ( )
overridevirtual

Reimplemented from GameMenu.

Definition at line 440 of file BuildMenu.cxx.

441 {
442  clearState();
443 
444  for (auto &btn : m_buttons)
445  {
446  btn->hideItems();
447  }
448 }
+ Here is the call graph for this function:

◆ createSubMenus()

void BuildMenu::createSubMenus ( )

Definition at line 221 of file BuildMenu.cxx.

222 {
223  auto debugBtnIt = std::find_if(m_buttons.begin(), m_buttons.end(), [](auto &btn) { return btn->getId() == "Debug"; });
224  if (debugBtnIt == m_buttons.end())
225  {
226  return;
227  }
228 
229  std::map<std::string, BuildMenuButton::Ptr> categories;
230  for (auto btn : m_buttons)
231  {
232  categories[btn->getId()] = btn;
233  }
234 
235  for (const auto &[tx, tileData] : TileManager::instance().getAllTileData())
236  {
237  const std::string &category = tileData.category;
238  const std::string subCategory =
239  (tileData.subCategory == tileData.category) ? (tileData.category + "_" + tileData.subCategory) : tileData.subCategory;
240  const std::string &title = tileData.title;
241  const std::string &tooltip = !title.empty() ? title : subCategory.empty() ? category : subCategory;
242 
243  // Skip all items that have no button group
244  if (category == "Water" || category == "Terrain")
245  {
246  continue;
247  }
248 
249  if (!subCategory.empty())
250  {
251  auto it = categories.find(subCategory);
252  if (it == categories.end())
253  {
254  auto category_it = categories.find(category);
256  if (category_it == categories.end())
257  {
258  btn = (*debugBtnIt)->addCategoryButton(tx, tooltip, tileData);
259  categories[category] = btn;
260  }
261  else
262  {
263  btn = category_it->second;
264  }
265 
266  auto subBtn = btn->addCategoryButton(tx, tooltip, tileData);
267  categories[subCategory] = subBtn;
268 
269  subBtn->addTileButton(tx, tooltip, tileData);
270  }
271  else
272  {
273  it->second->addTileButton(tx, tooltip, tileData);
274  }
275  }
276  else
277  {
278  auto it = categories.find(category);
279  if (it == categories.end())
280  {
281  auto btn = (*debugBtnIt)->addTileButton(tx, tooltip, tileData);
282  categories[category] = btn;
283  }
284  else
285  {
286  it->second->addTileButton(tx, tooltip, tileData);
287  }
288  }
289  }
290 }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ draw()

void BuildMenu::draw ( ) const
overridevirtual

Reimplemented from GameMenu.

Definition at line 193 of file BuildMenu.cxx.

194 {
195  ImVec2 screenSize = ui::GetIO().DisplaySize;
196  auto _self = const_cast<BuildMenu *>(this); // const_cast here because button open state can be changed
197 
198  ImVec2 pos{0, 0};
199  const auto &uiManager = UIManager::instance();
200  const float frameSize = m_btnSize.x + detail::getItemSpan(0);
201  const float buttonsSize = (float)m_buttons.size();
202 
203  switch (uiManager.buildMenuLayout())
204  {
206  pos = {(screenSize.x - buttonsSize * frameSize) / 2, screenSize.y - m_btnSize.y};
207  break;
209  pos = ImVec2{(screenSize.x - buttonsSize * frameSize) / 2, 0};
210  break;
212  pos = ImVec2{0, (screenSize.y - buttonsSize * frameSize) / 2};
213  break;
214  default:
215  pos = {screenSize.x - m_btnSize.x, (screenSize.y - buttonsSize * frameSize) / 2};
216  }
217 
218  drawSubmenu(pos, frameSize, *this, _self, 0);
219 }
+ Here is the call graph for this function:

◆ getButtons()

const BuildMenuButton::Items& BuildMenu::getButtons ( ) const
inline

Definition at line 101 of file BuildMenu.hxx.

101 { return m_buttons; }

◆ getId()

const std::string& BuildMenu::getId ( ) const
inline

Definition at line 100 of file BuildMenu.hxx.

100 { return m_id; }

◆ getTooltipDelay()

float BuildMenu::getTooltipDelay ( ) const
inline

Definition at line 102 of file BuildMenu.hxx.

102 { return m_tooltipDelay; }
+ Here is the caller graph for this function:

◆ onAction()

void BuildMenu::onAction ( const std::string action,
bool  checked 
)

Definition at line 334 of file BuildMenu.cxx.

335 {
336  if (action == "Demolish")
337  {
338  demolishMode = checked;
339  highlightSelection = checked;
340 
341  if (demolishMode)
342  {
345  }
346  }
347  else if (action == "LowerTerrain")
348  {
350  highlightSelection = checked;
351  }
352  else if (action == "RaiseTerrain")
353  {
355  highlightSelection = checked;
356  }
357  else if (action == "LevelTerrain")
358  {
360  highlightSelection = checked;
361  }
362  else if (action == "DeZone")
363  {
364  demolishMode = checked;
365  highlightSelection = checked;
366  if (demolishMode)
367  {
370  }
371  }
372  else if (action == "underground_pipes")
373  {
375  }
376  else if (action == "Water")
377  {
378  tileToPlace = checked ? "water" : "";
379  highlightSelection = checked;
381  }
382  else
383  {
385  highlightSelection = false;
386  }
387 }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ onChangeTileType()

void BuildMenu::onChangeTileType ( const std::string id,
bool  checked 
)

Definition at line 389 of file BuildMenu.cxx.

390 {
391  if (actionParameter.empty())
392  {
393  tileToPlace = "";
394  highlightSelection = false;
395  }
396 
397  tileToPlace = checked ? actionParameter : "";
398  highlightSelection = checked;
399  if (GameStates::instance().layerEditMode == LayerEditMode::BLUEPRINT)
400  {
403  }
404 
405  if (!tileToPlace.empty())
406  {
407  if (TileManager::instance().getTileData(tileToPlace))
408  {
409  switch (TileManager::instance().getTileData(tileToPlace)->tileType)
410  {
411  case +TileType::DEFAULT:
413  break;
414 
415  case +TileType::ROAD:
416  case +TileType::AUTOTILE:
417  case +TileType::POWERLINE:
419  break;
420 
421  case +TileType::GROUNDDECORATION:
422  case +TileType::WATER:
423  case +TileType::ZONE:
425  break;
426 
427  case +TileType::UNDERGROUND:
431  break;
432 
433  default:
434  break;
435  }
436  }
437  }
438 }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ onClick()

void BuildMenu::onClick ( BuildMenuButton::Ptr  btn)

Definition at line 317 of file BuildMenu.cxx.

318 {
319  clearState();
320 
321  if (!btn->m_action.empty())
322  {
323  onAction(btn->m_action, btn->m_open);
324  }
325 
326  const bool hasAction = !btn->m_tiletype.empty();
327  const bool isCategoryButton = btn->getButtons().size() > 0;
328  if (hasAction && !isCategoryButton)
329  {
330  onChangeTileType(btn->m_tiletype, btn->m_open);
331  }
332 }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ setItemVisible()

void BuildMenu::setItemVisible ( BuildMenuButton::Ptr  btn,
bool  visible 
)

Definition at line 292 of file BuildMenu.cxx.

293 {
294  if (!visible)
295  {
296  for (auto it : btn->getButtons())
297  {
298  it->hideItems();
299  }
300  }
301  else
302  {
303  for (auto it : m_buttons)
304  {
305  it->hideItems();
306  }
307 
308  BuildMenuButton *parent = btn.get();
309  while (parent)
310  {
311  parent->m_open = true;
312  parent = parent->m_parent;
313  }
314  }
315 }
+ Here is the caller graph for this function:

Member Data Documentation

◆ m_btnSize

ImVec2 BuildMenu::m_btnSize
private

Definition at line 107 of file BuildMenu.hxx.

◆ m_buttons

BuildMenuButton::Items BuildMenu::m_buttons
private

Definition at line 105 of file BuildMenu.hxx.

◆ m_id

std::string BuildMenu::m_id = "Main"
private

Definition at line 106 of file BuildMenu.hxx.

◆ m_tooltipDelay

float BuildMenu::m_tooltipDelay = 3.f
private

Definition at line 108 of file BuildMenu.hxx.


The documentation for this class was generated from the following files:
BUILDMENU_LAYOUT::BOTTOM
@ BOTTOM
demolishMode
bool demolishMode
Definition: mapEdit.cxx:5
terrainEditMode
TerrainEdit terrainEditMode
Definition: mapEdit.cxx:3
DemolishMode::DE_ZONE
@ DE_ZONE
Remove only zones.
MapLayers::setLayerEditMode
static void setLayerEditMode(LayerEditMode layerEditMode)
Definition: MapLayers.cxx:7
TerrainEdit::RAISE
@ RAISE
detail::getItemSpan
float getItemSpan(int deep)
Definition: BuildMenu.cxx:55
WATER
@ WATER
6- Water tiles
Definition: enums.hxx:17
DEFAULT
@ DEFAULT
Definition: TileManager.hxx:18
BuildMenu::m_tooltipDelay
float m_tooltipDelay
Definition: BuildMenu.hxx:108
TerrainEdit::LOWER
@ LOWER
GameStatesData::placementMode
PlacementMode placementMode
Specifies the placement mode when holding down the mouse.
Definition: GameStates.hxx:18
TerrainEdit::NONE
@ NONE
BuildMenu::m_buttons
BuildMenuButton::Items m_buttons
Definition: BuildMenu.hxx:105
BUILDMENU_LAYOUT::TOP
@ TOP
drawSubmenu
void drawSubmenu(ImVec2 pos, float categoryOffset, const Holder &holder, BuildMenu *menu, int deep)
Definition: BuildMenu.cxx:59
BuildMenu::createSubMenus
void createSubMenus()
Definition: BuildMenu.cxx:221
BuildMenu::onChangeTileType
void onChangeTileType(const std::string &id, bool checked)
Definition: BuildMenu.cxx:389
BuildMenuButton::Ptr
std::shared_ptr< BuildMenuButton > Ptr
Definition: BuildMenu.hxx:11
BuildMenuButton::m_parent
BuildMenuButton * m_parent
Definition: BuildMenu.hxx:26
BuildMenu::m_btnSize
ImVec2 m_btnSize
Definition: BuildMenu.hxx:107
BuildMenu::onAction
void onAction(const std::string &action, bool checked)
Definition: BuildMenu.cxx:334
BuildMenu
Definition: BuildMenu.hxx:74
ZONE
@ ZONE
4- Optional layer, zones(Industrial/Residential/Commercial).
Definition: enums.hxx:15
PlacementMode::LINE
@ LINE
Place tiles in a line from start to end point.
BuildMenu::clearState
void clearState()
Definition: BuildMenu.cxx:450
TerrainEdit::LEVEL
@ LEVEL
BUILDMENU_LAYOUT::LEFT
@ LEFT
PlacementMode::SINGLE
@ SINGLE
Place tiles on a single spot.
GameStatesData::demolishMode
DemolishMode demolishMode
Definition: GameStates.hxx:19
highlightSelection
bool highlightSelection
Definition: mapEdit.cxx:6
tileToPlace
std::string tileToPlace
Definition: mapEdit.cxx:4
DemolishMode::DEFAULT
@ DEFAULT
Demolish everything, but not.
BuildMenuButton::m_open
bool m_open
Definition: BuildMenu.hxx:14
GameStatesData::layerEditMode
LayerEditMode layerEditMode
Specifies the Layer Editmode. Editing Terrain or Blueprint (water pipes, subway,.....
Definition: GameStates.hxx:16
PlacementMode::RECTANGLE
@ RECTANGLE
draw a rectangle between start and end point
ROAD
@ ROAD
5- Optional layer, roads.
Definition: enums.hxx:16
LayerEditMode::TERRAIN
@ TERRAIN
Default "overworld" edit mode.
BuildMenu::m_id
std::string m_id
Definition: BuildMenu.hxx:106
BuildMenuButton
Definition: BuildMenu.hxx:9
Singleton< TileManager >::instance
static TileManager & instance(void)
Get an instance of the singleton.
Definition: Singleton.hxx:15
LayerEditMode::BLUEPRINT
@ BLUEPRINT
Placing water pipes and underground transportation on the Blueprint layer.
string
std::string string
Definition: AudioConfig.hxx:14
UNDERGROUND
@ UNDERGROUND
2- Optional layer - Pipes, Subway-pipes and so onn
Definition: enums.hxx:13