2021-09-07 15:21:54 +00:00
|
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
//
|
|
|
|
// EmulationStation Desktop Edition
|
|
|
|
// FlexboxComponent.h
|
|
|
|
//
|
|
|
|
// Flexbox layout component.
|
|
|
|
// Used by gamelist views.
|
|
|
|
//
|
|
|
|
|
2021-09-27 20:18:19 +00:00
|
|
|
#ifndef ES_CORE_COMPONENTS_FLEXBOX_COMPONENT_H
|
|
|
|
#define ES_CORE_COMPONENTS_FLEXBOX_COMPONENT_H
|
2021-09-07 15:21:54 +00:00
|
|
|
|
|
|
|
#include "GuiComponent.h"
|
|
|
|
#include "renderers/Renderer.h"
|
|
|
|
|
2021-09-13 23:01:46 +00:00
|
|
|
// Default values.
|
2021-10-02 19:58:04 +00:00
|
|
|
#define DEFAULT_DIRECTION Direction::row
|
|
|
|
#define DEFAULT_ALIGN Align::center
|
2021-09-13 23:01:46 +00:00
|
|
|
#define DEFAULT_ITEMS_PER_LINE 4
|
|
|
|
#define DEFAULT_MARGIN_X 10.0f
|
|
|
|
#define DEFAULT_MARGIN_Y 10.0f
|
|
|
|
#define DEFAULT_ITEM_SIZE_X 64.0f
|
2021-09-07 15:21:54 +00:00
|
|
|
|
|
|
|
class FlexboxComponent : public GuiComponent
|
|
|
|
{
|
|
|
|
public:
|
2021-10-02 19:58:04 +00:00
|
|
|
enum class Direction : char { row, column };
|
|
|
|
enum class Align : char { start, end, center, stretch };
|
|
|
|
|
|
|
|
explicit FlexboxComponent(Window* window);
|
2021-09-13 23:01:46 +00:00
|
|
|
|
|
|
|
// Getters/Setters for rendering options.
|
2021-10-02 19:58:04 +00:00
|
|
|
[[nodiscard]] Direction getDirection() const { return mDirection; };
|
|
|
|
void setDirection(Direction value)
|
|
|
|
{
|
|
|
|
mDirection = value;
|
|
|
|
mLayoutValid = false;
|
|
|
|
};
|
|
|
|
[[nodiscard]] Align getAlign() const { return mAlign; };
|
|
|
|
void setAlign(Align value)
|
|
|
|
{
|
|
|
|
mAlign = value;
|
|
|
|
mLayoutValid = false;
|
|
|
|
};
|
|
|
|
[[nodiscard]] unsigned int getItemsPerLine() const { return mItemsPerLine; };
|
|
|
|
void setItemsPerLine(unsigned int value)
|
|
|
|
{
|
|
|
|
mItemsPerLine = value;
|
|
|
|
mLayoutValid = false;
|
|
|
|
};
|
|
|
|
[[nodiscard]] glm::vec2 getItemMargin() const { return mItemMargin; };
|
|
|
|
void setItemMargin(glm::vec2 value)
|
|
|
|
{
|
|
|
|
mItemMargin = value;
|
|
|
|
mLayoutValid = false;
|
|
|
|
};
|
|
|
|
[[nodiscard]] float getItemWidth() const { return mItemWidth; };
|
|
|
|
void setItemWidth(float value)
|
|
|
|
{
|
|
|
|
mItemWidth = value;
|
|
|
|
mLayoutValid = false;
|
|
|
|
};
|
2021-09-07 15:21:54 +00:00
|
|
|
|
|
|
|
void onSizeChanged() override;
|
2021-09-13 23:01:46 +00:00
|
|
|
void render(const glm::mat4& parentTrans) override;
|
2021-09-07 15:21:54 +00:00
|
|
|
virtual void applyTheme(const std::shared_ptr<ThemeData>& theme,
|
|
|
|
const std::string& view,
|
|
|
|
const std::string& element,
|
|
|
|
unsigned int properties) override;
|
|
|
|
virtual std::vector<HelpPrompt> getHelpPrompts() override;
|
|
|
|
|
|
|
|
private:
|
|
|
|
// Calculate flexbox layout.
|
2021-09-13 23:01:46 +00:00
|
|
|
void computeLayout();
|
2021-09-07 15:21:54 +00:00
|
|
|
|
2021-09-13 23:01:46 +00:00
|
|
|
// Rendering options.
|
2021-10-02 19:58:04 +00:00
|
|
|
Direction mDirection;
|
|
|
|
Align mAlign;
|
2021-09-13 23:01:46 +00:00
|
|
|
unsigned int mItemsPerLine;
|
|
|
|
glm::vec2 mItemMargin;
|
|
|
|
float mItemWidth;
|
2021-09-23 22:05:32 +00:00
|
|
|
bool mLayoutValid;
|
2021-09-07 15:21:54 +00:00
|
|
|
};
|
|
|
|
|
2021-09-27 20:18:19 +00:00
|
|
|
#endif // ES_CORE_COMPONENTS_FLEXBOX_COMPONENT_H
|