widget: new label widget

This commit is contained in:
Zack Buhman 2025-07-03 22:07:34 -05:00
parent 62a47e236d
commit 12bd750d73
7 changed files with 75 additions and 17 deletions

View File

@ -1,20 +1,9 @@
#pragma once
#include "holly/ta_parameter.hpp"
#include "ta_multiwriter.hpp"
#include "widget/button.hpp"
namespace widget {
constexpr inline int str_length(const char * s)
{
int l = 0;
while (*s++) {
l += 1;
}
return l;
}
struct button_label : button {
const char * const label;
const int label_length;

View File

@ -32,8 +32,8 @@ namespace widget {
inline widget * pick(float _x, float _y)
{
if (!inside(_x, _y))
return nullptr;
//if (!inside(_x, _y))
//return nullptr;
for (int i = 0; i < length; i++) {
widget * w = children[i]->pick(_x, _y);

32
src/widget/label.cpp Normal file
View File

@ -0,0 +1,32 @@
#include "widget/label.hpp"
#include "ta_parameter.hpp"
#include "graphics_primitive.hpp"
namespace widget {
const static float label_depth = 1.0 / 5.0;
const static int label_color = 0xa7a7a7;
const static float label_shadow_depth = 1.0 / 6.0;
const static int label_shadow_color = 0x000000;
void label::draw_label(ta_parameter_writer& writer) const
{
float y_offset = 0;
float cx = x() + width / 2 - (glyph::hori_advance * value_length) / 2;
float cy = y() + height / 2 - glyph::vert_advance / 2 + y_offset;
transfer_string(writer, value, cx, cy, label_depth, label_color);
}
void label::draw(ta_multiwriter& multi)
{
transfer_global_polygon_glyph(multi.pt);
draw_label(multi.pt);
widget::draw(multi);
}
}

23
src/widget/label.hpp Normal file
View File

@ -0,0 +1,23 @@
#pragma once
#include "holly/ta_parameter.hpp"
#include "ta_multiwriter.hpp"
#include "widget/widget.hpp"
namespace widget {
struct label : widget {
const char * const value;
const int value_length;
inline label(float _width, float _height, const char * value)
: widget(0, 0, _width, _height), value(value), value_length(str_length(value))
{ }
inline label(float _x, float _y, float _width, float _height, const char * value)
: widget(_x, _y, _width, _height), value(value), value_length(str_length(value))
{ }
void draw_label(ta_parameter_writer& writer) const;
void draw(ta_multiwriter& multi) override;
};
}

View File

@ -11,8 +11,8 @@ namespace widget {
{
float xi = 0;
for (int i = 0; i < length; i++) {
children[i]->_x = xi;
children[i]->_y = 0;
children[i]->_x += xi;
children[i]->_y += 0;
xi += children[i]->width + gap;
if (children[i]->height > height)
height = children[i]->height;

View File

@ -11,8 +11,8 @@ namespace widget {
{
float yi = 0;
for (int i = 0; i < length; i++) {
children[i]->_x = 0;
children[i]->_y = yi;
children[i]->_x += 0;
children[i]->_y += yi;
yi += children[i]->height + gap;
if (children[i]->width > width)
width = children[i]->width;

View File

@ -1,9 +1,19 @@
#pragma once
#include "widget/bounding_box.hpp"
#include "ta_multiwriter.hpp"
#include "printf/printf.h"
namespace widget {
constexpr inline int str_length(const char * s)
{
int l = 0;
while (*s++) {
l += 1;
}
return l;
}
enum class click_type {
press,
@ -16,6 +26,10 @@ namespace widget {
click_type click_state;
public:
inline widget(float _width, float _height)
: bounding_box(0, 0, _width, _height), click_state(click_type::release)
{ }
inline widget(float _x, float _y, float _width, float _height)
: bounding_box(_x, _y, _width, _height), click_state(click_type::release)
{ }