Support a separate text bbox in ui::edit

This commit is contained in:
Nikita Lisitsa 2022-04-08 12:36:23 +03:00
parent d1b3225112
commit 5066dd6494
2 changed files with 15 additions and 6 deletions

View file

@ -79,6 +79,8 @@ namespace psemek::ui
state_t state() const { return state_; }
void set_text_shape(geom::box<float, 2> const & box);
private:
std::u32string text_;
font_type font_;
@ -91,6 +93,7 @@ namespace psemek::ui
bool caret_visible_ = true;
box_shape shape_;
geom::box<float, 2> text_box_;
state_t state_ = state_t::normal;

View file

@ -226,6 +226,7 @@ namespace psemek::ui
void edit::reshape(geom::box<float, 2> const & bbox)
{
shape_.box = bbox;
text_box_ = bbox;
}
geom::box<float, 2> edit::size_constraints() const
@ -285,26 +286,26 @@ namespace psemek::ui
switch (halign_)
{
case halignment::left:
offset[0] = shape_.box[0].min;
offset[0] = text_box_[0].min;
break;
case halignment::center:
offset[0] = shape_.box[0].center() - cached_state_->size[0] * 0.5f;
offset[0] = text_box_[0].center() - cached_state_->size[0] * 0.5f;
break;
case halignment::right:
offset[0] = shape_.box[0].max - cached_state_->size[0];
offset[0] = text_box_[0].max - cached_state_->size[0];
break;
}
switch (valign_)
{
case valignment::top:
offset[1] = shape_.box[1].min;
offset[1] = text_box_[1].min;
break;
case valignment::center:
offset[1] = shape_.box[1].center() - cached_state_->size[1] * 0.5f;
offset[1] = text_box_[1].center() - cached_state_->size[1] * 0.5f;
break;
case valignment::bottom:
offset[1] = shape_.box[1].max - cached_state_->size[1];
offset[1] = text_box_[1].max - cached_state_->size[1];
break;
}
@ -338,6 +339,11 @@ namespace psemek::ui
}
}
void edit::set_text_shape(geom::box<float, 2> const & box)
{
text_box_ = box;
}
void edit::on_state_changed()
{
cached_state_ = std::nullopt;