Dawn/archive/ui/UIMenu.hpp
2023-03-05 12:58:59 -08:00

125 lines
3.5 KiB
C++

// Copyright (c) 2023 Dominic Masters
//
// This software is released under the MIT License.
// https://opensource.org/licenses/MIT
#pragma once
#include "event/Event.hpp"
#include "ui/UIComponent.hpp"
#include "util/memory.hpp"
namespace Dawn {
class UIMenuItem {
public:
/**
* Called when the item is selected (Accepted) on.
*/
virtual void onItemSelected() = 0;
/**
* Called when either the mouse or the user controller input is removed
* off this item.
*/
virtual void onItemOver() = 0;
/**
* Called when either the mouth or the user controller input is put over
* this item.
*/
virtual void onItemOff() = 0;
/**
* Returns whether the UI item can be hovered overed or not.
* @return Whether it can be overed or not.
*/
virtual bool_t canBeOvered() = 0;
/**
* Returns whether or not the item can be selected or not.
* @return Whether it can be selected or not.
*/
virtual bool_t canBeSelected() = 0;
};
struct UIMenu {
private:
UICanvas *canvas;
int32_t x = -1;
int32_t y = -1;
int32_t rows = 1;
int32_t columns = 1;
UIMenuItem **items = nullptr;
protected:
/** Invoked by UICanvas when this menu has been made inactive. */
void onInactive();
/** Invoked by UICanvas when this menu has been made active. */
void onActive();
/** Invoked by UICanvas every tick this menu is active. */
void onTick();
public:
Event<> eventMenuActive;
Event<> eventMenuInactive;
Event<int32_t, int32_t, int32_t, int32_t> eventCursorChange;
Event<UIMenuItem*> eventItemSelected;
/**
* Construct a new UI Menu Host.
*
* @param canvas Canvas that this menu belongs to.
* @param columns Iniitial size of the menu X axis.
* @param rows Initial size of the menu Y axis.
*/
UIMenu(UICanvas *canvas, int32_t columns, int32_t rows);
/**
* Sets the size of the UI Menu.
*
* @param columns How many columns in the menu.
* @param rows How many rows in the menu.
*/
void setSize(int32_t columns, int32_t rows);
/**
* Returns the UI Item at the given position.
*
* @param x X coordinate of the item to get.
* @param y Y coordinate of the item to get.
* @return The pointer to the menu item, or null if invalid.
*/
UIMenuItem * getItem(int32_t x, int32_t y);
/**
* Sets the position of the cursor in the grid.
*
* @param x X position of the cursor.
* @param y Y position of the cursor.
*/
void setPosition(int32_t x, int32_t y);
/**
* Move the cursor relative to the current position.
*
* @param x X position to move relative.
* @param y Y position to move relative.
*/
void moveRelative(int32_t x, int32_t y);
/**
* Adds/Sets an item onto the menu.
*
* @param x X coordinate to set the item.
* @param y Y coordinate to set the item.
* @param item Item to set.
*/
void setItem(int32_t x, int32_t y, UIMenuItem *item);
/**
* Cleans up the menu items, doesn't free the children themselves.
*/
~UIMenu();
friend class UICanvas;
};
}