2013-06-19 01:12:30 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "../GuiComponent.h"
|
|
|
|
|
|
|
|
class ComponentListComponent : public GuiComponent
|
|
|
|
{
|
|
|
|
public:
|
2013-07-10 11:29:43 +00:00
|
|
|
ComponentListComponent(Window* window, Eigen::Vector2i gridDimensions);
|
2013-06-19 01:12:30 +00:00
|
|
|
|
|
|
|
enum UpdateBehavior
|
|
|
|
{
|
|
|
|
UpdateAlways, UpdateFocused
|
|
|
|
};
|
|
|
|
|
|
|
|
enum AlignmentType
|
|
|
|
{
|
|
|
|
AlignLeft, AlignRight, AlignCenter
|
|
|
|
};
|
|
|
|
|
2013-07-10 11:29:43 +00:00
|
|
|
//DO NOT USE NEGATIVE NUMBERS FOR POSITION OR SIZE.
|
2013-08-18 14:16:11 +00:00
|
|
|
void setEntry(Eigen::Vector2i pos, Eigen::Vector2i size, GuiComponent* component, bool canFocus, AlignmentType align,
|
|
|
|
Eigen::Matrix<bool, 1, 2> autoFit = Eigen::Matrix<bool, 1, 2>(true, true), UpdateBehavior updateType = UpdateAlways);
|
2013-06-19 01:12:30 +00:00
|
|
|
|
2013-07-10 11:29:43 +00:00
|
|
|
void onPositionChanged() override;
|
2013-06-19 01:12:30 +00:00
|
|
|
|
2013-08-19 15:36:48 +00:00
|
|
|
void textInput(const char* text) override;
|
2013-06-19 01:12:30 +00:00
|
|
|
bool input(InputConfig* config, Input input) override;
|
|
|
|
void update(int deltaTime) override;
|
2013-07-10 11:29:43 +00:00
|
|
|
void render(const Eigen::Affine3f& parentTrans) override;
|
2013-06-19 01:12:30 +00:00
|
|
|
|
2013-08-21 19:49:33 +00:00
|
|
|
void forceColumnWidth(int col, unsigned int size);
|
|
|
|
void forceRowHeight(int row, unsigned int size);
|
|
|
|
|
|
|
|
void updateComponent(GuiComponent* cmp);
|
2013-06-19 01:12:30 +00:00
|
|
|
|
|
|
|
void resetCursor();
|
|
|
|
bool cursorValid();
|
|
|
|
|
2013-06-19 21:02:42 +00:00
|
|
|
GuiComponent* getSelectedComponent();
|
|
|
|
|
2013-06-19 01:12:30 +00:00
|
|
|
private:
|
|
|
|
class ComponentEntry
|
|
|
|
{
|
|
|
|
public:
|
2013-07-10 11:29:43 +00:00
|
|
|
Eigen::Vector2i pos;
|
|
|
|
Eigen::Vector2i dim;
|
2013-06-19 01:12:30 +00:00
|
|
|
GuiComponent* component;
|
|
|
|
UpdateBehavior updateType;
|
|
|
|
AlignmentType alignment;
|
|
|
|
bool canFocus;
|
|
|
|
|
|
|
|
ComponentEntry() : component(NULL), updateType(UpdateAlways), canFocus(true), alignment(AlignCenter) {};
|
2013-07-10 11:29:43 +00:00
|
|
|
ComponentEntry(Eigen::Vector2i p, Eigen::Vector2i d, GuiComponent* comp, UpdateBehavior update, bool focus, AlignmentType align) : pos(p), dim(d), component(comp), updateType(update), canFocus(focus), alignment(align) {};
|
2013-06-19 01:12:30 +00:00
|
|
|
|
|
|
|
operator bool() const
|
|
|
|
{
|
|
|
|
return component != NULL;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
//Offset we render components by (for scrolling).
|
2013-07-10 11:29:43 +00:00
|
|
|
Eigen::Vector2f mComponentOffset;
|
2013-06-19 01:12:30 +00:00
|
|
|
|
2013-07-10 11:29:43 +00:00
|
|
|
Eigen::Vector2i mGridSize;
|
2013-06-19 01:12:30 +00:00
|
|
|
ComponentEntry** mGrid;
|
|
|
|
std::vector<ComponentEntry> mEntries;
|
2013-07-10 11:29:43 +00:00
|
|
|
void makeCells(Eigen::Vector2i size);
|
2013-06-19 01:12:30 +00:00
|
|
|
void setCell(unsigned int x, unsigned int y, ComponentEntry* entry);
|
|
|
|
ComponentEntry* getCell(unsigned int x, unsigned int y);
|
|
|
|
|
2013-07-10 11:29:43 +00:00
|
|
|
Eigen::Vector2i mSelectedCellIndex;
|
2013-06-19 01:12:30 +00:00
|
|
|
|
|
|
|
unsigned int getColumnWidth(int col);
|
|
|
|
unsigned int getRowHeight(int row);
|
|
|
|
|
|
|
|
unsigned int* mColumnWidths;
|
|
|
|
unsigned int* mRowHeights;
|
2013-08-21 19:49:33 +00:00
|
|
|
bool* mColumnWidthForced;
|
|
|
|
bool* mRowHeightForced;
|
2013-06-19 01:12:30 +00:00
|
|
|
|
2013-07-10 11:29:43 +00:00
|
|
|
Eigen::Vector3f getCellOffset(Eigen::Vector2i gridPos);
|
2013-06-19 01:12:30 +00:00
|
|
|
void updateSize();
|
|
|
|
|
2013-07-10 11:29:43 +00:00
|
|
|
void moveCursor(Eigen::Vector2i dir);
|
2013-08-18 14:16:11 +00:00
|
|
|
void onCursorMoved(Eigen::Vector2i from, Eigen::Vector2i to);
|
2013-07-10 11:29:43 +00:00
|
|
|
Eigen::Vector2i mCursor;
|
2013-06-19 01:12:30 +00:00
|
|
|
|
|
|
|
void updateComponentOffsets();
|
2013-08-21 19:49:33 +00:00
|
|
|
void updateCellSize(ComponentEntry* e, bool updWidth = true, bool updHeight = true);
|
2013-06-19 01:12:30 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
//ability to define a list of components in terms of a grid
|
2013-07-10 11:29:43 +00:00
|
|
|
//these comments are kinda old
|
2013-06-19 01:12:30 +00:00
|
|
|
|
|
|
|
//input
|
|
|
|
//pass to selected component
|
|
|
|
// if returns true, stop
|
|
|
|
// else, process:
|
|
|
|
// if input == up/down
|
|
|
|
// scroll to prev/next selectable component in grid Y
|
|
|
|
// if input == left/right
|
|
|
|
// scroll to prev/next selectable component in grid X
|
|
|
|
// if input == accept
|
|
|
|
// call registered function?
|
|
|
|
|
|
|
|
//entry struct/class
|
|
|
|
// GuiComponent* component - component to work with
|
|
|
|
// bool canFocus - can we pass input to this? (necessary for labels to not be selectable)
|
|
|
|
// Function* selectFunc?
|
|
|
|
// UpdateBehavior update - how to handle updates (all the time or only when focused)
|
|
|
|
|
|
|
|
//update
|
|
|
|
//animate component offset to display selected component within the bounds
|
|
|
|
//pass update to all entries with appropriate update behavior
|
|
|
|
|
|
|
|
//render
|
|
|
|
//clip rect to our size
|
|
|
|
//render a "selected" effect behind component with focus somehow
|
|
|
|
// an edge filter would be cool, but we can't really do that without shader support
|
|
|
|
// a transparent rect will work for now, but it's kind of ugly...maybe a GuiBox
|
|
|
|
//glTranslatef by our render offset
|
|
|
|
// doesn't handle getGlobalOffset for our components...would need parenting for that
|
|
|
|
|
|
|
|
//methods
|
|
|
|
//List::setEntry(Vector2i gridPos, GuiComponent* component, bool canFocus, AlignmentType align,
|
|
|
|
// Function* selectFunc = NULL, UpdateBehavior updateType = UpdateAlways);
|
|
|
|
|
|
|
|
//example of setting up the SettingsMenu list:
|
|
|
|
//ComponentListComponent list;
|
|
|
|
//int row = 0;
|
|
|
|
//TextComponent* label = new TextComponent(Vector2i(0, 0), "Debug:", font, lblColor, etc);
|
|
|
|
//
|
|
|
|
//list.setEntry(Vector2i(-1, row), label, false, AlignRight);
|
|
|
|
//list.setEntry(Vector2i(0, row++), &mDebugSwitch, true, AlignLeft);
|
|
|
|
//...
|
|
|
|
//list.setEntry(Rect(-1, row, 2, 1), &mSaveButton, true, AlignCenter);
|
|
|
|
|
|
|
|
//example of setting up GameGrid list:
|
|
|
|
//ComponentListComponent list;
|
|
|
|
//for(int y = 0; y < yMax; y++)
|
|
|
|
// for(int x = 0; x < xMax; x++)
|
|
|
|
// list.setEntry(Vector2i(x, y), getGameImage(x, y), true, AlignCenter, &this->onSelectGame);
|