#ifndef TOS_UI_STYLE_H #define TOS_UI_STYLE_H #include "../stdlib/Types.h" struct UIAttribute { // Attributes use ids (=type name) instead of strings int32 attribute_id; union { char value_str[32]; int32 value_int; f32 value_float; v4_f32 value_v4_f32; }; }; struct UIAttributeGroup { int32 attribute_size; UIAttribute* attributes; }; enum UIAttributeType { UI_ATTRIBUTE_TYPE_TYPE, UI_ATTRIBUTE_TYPE_STYLE, UI_ATTRIBUTE_TYPE_CONTENT, UI_ATTRIBUTE_TYPE_CONTENT_ALIGN_H, UI_ATTRIBUTE_TYPE_CONTENT_ALIGN_V, UI_ATTRIBUTE_TYPE_FONT_NAME, UI_ATTRIBUTE_TYPE_FONT_COLOR_INDEX, UI_ATTRIBUTE_TYPE_FONT_COLOR, UI_ATTRIBUTE_TYPE_FONT_SIZE, UI_ATTRIBUTE_TYPE_FONT_WEIGHT, UI_ATTRIBUTE_TYPE_FONT_LINE_HEIGHT, UI_ATTRIBUTE_TYPE_ALIGN_H, UI_ATTRIBUTE_TYPE_ALIGN_V, UI_ATTRIBUTE_TYPE_ZINDEX, UI_ATTRIBUTE_TYPE_POSITION_X, UI_ATTRIBUTE_TYPE_POSITION_Y, UI_ATTRIBUTE_TYPE_PARENT, UI_ATTRIBUTE_TYPE_DIMENSION_WIDTH, UI_ATTRIBUTE_TYPE_DIMENSION_HEIGHT, UI_ATTRIBUTE_TYPE_BACKGROUND_COLOR_INDEX, UI_ATTRIBUTE_TYPE_BACKGROUND_COLOR, UI_ATTRIBUTE_TYPE_BACKGROUND_IMG, UI_ATTRIBUTE_TYPE_BACKGROUND_IMG_OPACITY, UI_ATTRIBUTE_TYPE_BACKGROUND_IMG_POSITION_V, UI_ATTRIBUTE_TYPE_BACKGROUND_IMG_POSITION_H, UI_ATTRIBUTE_TYPE_BACKGROUND_IMG_STYLE, UI_ATTRIBUTE_TYPE_BORDER_COLOR_INDEX, UI_ATTRIBUTE_TYPE_BORDER_COLOR, UI_ATTRIBUTE_TYPE_BORDER_WIDTH, UI_ATTRIBUTE_TYPE_BORDER_TOP_COLOR, UI_ATTRIBUTE_TYPE_BORDER_TOP_WIDTH, UI_ATTRIBUTE_TYPE_BORDER_RIGHT_COLOR, UI_ATTRIBUTE_TYPE_BORDER_RIGHT_WIDTH, UI_ATTRIBUTE_TYPE_BORDER_BOTTOM_COLOR, UI_ATTRIBUTE_TYPE_BORDER_BOTTOM_WIDTH, UI_ATTRIBUTE_TYPE_BORDER_LEFT_COLOR, UI_ATTRIBUTE_TYPE_BORDER_LEFT_WIDTH, UI_ATTRIBUTE_TYPE_PADDING, UI_ATTRIBUTE_TYPE_PADDING_TOP, UI_ATTRIBUTE_TYPE_PADDING_RIGHT, UI_ATTRIBUTE_TYPE_PADDING_BOTTOM, UI_ATTRIBUTE_TYPE_PADDING_LEFT, UI_ATTRIBUTE_TYPE_SHADOW_INNER_COLOR_INDEX, UI_ATTRIBUTE_TYPE_SHADOW_INNER_COLOR, UI_ATTRIBUTE_TYPE_SHADOW_INNER_ANGLE, UI_ATTRIBUTE_TYPE_SHADOW_INNER_DISTANCE, UI_ATTRIBUTE_TYPE_SHADOW_OUTER_COLOR_INDEX, UI_ATTRIBUTE_TYPE_SHADOW_OUTER_COLOR, UI_ATTRIBUTE_TYPE_SHADOW_OUTER_ANGLE, UI_ATTRIBUTE_TYPE_SHADOW_OUTER_DISTANCE, // @todo This isn't enough, we can have many animations (position, size, colors, ...) // Maybe we need to define an animation child which overwrites the defined values // Maybe it should use the same system as state dependent values like hover, active, ... UI_ATTRIBUTE_TYPE_TRANSITION_ANIMATION, UI_ATTRIBUTE_TYPE_TRANSITION_DURATION, UI_ATTRIBUTE_TYPE_SIZE, }; UIAttribute* ui_attribute_from_group(UIAttributeGroup* group, UIAttributeType type) { for (int i = 0; i < UI_ATTRIBUTE_TYPE_SIZE && i <= type; ++i) { if (group->attributes[i].attribute_id == type) { return &group->attributes[i]; } } return NULL; } constexpr const char* ui_attribute_type_to_string(int32 e) { switch (e) { case UI_ATTRIBUTE_TYPE_TYPE: return "type"; case UI_ATTRIBUTE_TYPE_STYLE: return "style"; case UI_ATTRIBUTE_TYPE_FONT_NAME: return "font_name"; case UI_ATTRIBUTE_TYPE_FONT_COLOR: return "font_color"; case UI_ATTRIBUTE_TYPE_FONT_SIZE: return "font_size"; case UI_ATTRIBUTE_TYPE_FONT_WEIGHT: return "font_weight"; case UI_ATTRIBUTE_TYPE_FONT_LINE_HEIGHT: return "font_line_height"; case UI_ATTRIBUTE_TYPE_ALIGN_H: return "align_h"; case UI_ATTRIBUTE_TYPE_ALIGN_V: return "align_v"; case UI_ATTRIBUTE_TYPE_ZINDEX: return "zindex"; case UI_ATTRIBUTE_TYPE_BACKGROUND_COLOR: return "background_color"; case UI_ATTRIBUTE_TYPE_BACKGROUND_IMG: return "background_img"; case UI_ATTRIBUTE_TYPE_BACKGROUND_IMG_OPACITY: return "background_img_opacity"; case UI_ATTRIBUTE_TYPE_BACKGROUND_IMG_POSITION_V: return "background_img_position_v"; case UI_ATTRIBUTE_TYPE_BACKGROUND_IMG_POSITION_H: return "background_img_position_h"; case UI_ATTRIBUTE_TYPE_BACKGROUND_IMG_STYLE: return "background_img_style"; case UI_ATTRIBUTE_TYPE_BORDER_COLOR: return "border_color"; case UI_ATTRIBUTE_TYPE_BORDER_WIDTH: return "border_width"; case UI_ATTRIBUTE_TYPE_BORDER_TOP_COLOR: return "border_top_color"; case UI_ATTRIBUTE_TYPE_BORDER_TOP_WIDTH: return "border_top_width"; case UI_ATTRIBUTE_TYPE_BORDER_RIGHT_COLOR: return "border_right_color"; case UI_ATTRIBUTE_TYPE_BORDER_RIGHT_WIDTH: return "border_right_width"; case UI_ATTRIBUTE_TYPE_BORDER_BOTTOM_COLOR: return "border_bottom_color"; case UI_ATTRIBUTE_TYPE_BORDER_BOTTOM_WIDTH: return "border_bottom_width"; case UI_ATTRIBUTE_TYPE_BORDER_LEFT_COLOR: return "border_left_color"; case UI_ATTRIBUTE_TYPE_BORDER_LEFT_WIDTH: return "border_left_width"; case UI_ATTRIBUTE_TYPE_PADDING: return "padding"; case UI_ATTRIBUTE_TYPE_PADDING_TOP: return "padding_top"; case UI_ATTRIBUTE_TYPE_PADDING_RIGHT: return "padding_right"; case UI_ATTRIBUTE_TYPE_PADDING_BOTTOM: return "padding_bottom"; case UI_ATTRIBUTE_TYPE_PADDING_LEFT: return "padding_left"; case UI_ATTRIBUTE_TYPE_SHADOW_INNER_COLOR: return "shadow_inner_color"; case UI_ATTRIBUTE_TYPE_SHADOW_INNER_ANGLE: return "shadow_inner_angle"; case UI_ATTRIBUTE_TYPE_SHADOW_INNER_DISTANCE: return "shadow_inner_distance"; case UI_ATTRIBUTE_TYPE_SHADOW_OUTER_COLOR: return "shadow_outer_color"; case UI_ATTRIBUTE_TYPE_SHADOW_OUTER_ANGLE: return "shadow_outer_angle"; case UI_ATTRIBUTE_TYPE_SHADOW_OUTER_DISTANCE: return "shadow_outer_distance"; case UI_ATTRIBUTE_TYPE_TRANSITION_ANIMATION: return "transition_animation"; case UI_ATTRIBUTE_TYPE_TRANSITION_DURATION: return "transition_duration"; } return NULL; } #endif