LABEL: dirty flag helper functions

This commit is contained in:
BlackMATov
2020-02-07 12:59:02 +07:00
parent 5d72b0818c
commit 701a2dcfc8
3 changed files with 141 additions and 45 deletions

View File

@@ -226,3 +226,22 @@ namespace e2d
return outline_color_;
}
}
namespace e2d::labels
{
gcomponent<label> mark_dirty(gcomponent<label> self);
gcomponent<label> unmark_dirty(gcomponent<label> self);
bool is_dirty(const const_gcomponent<label>& self) noexcept;
gcomponent<label> change_text(gcomponent<label> self, str value);
gcomponent<label> change_font(gcomponent<label> self, const font_asset::ptr& value);
gcomponent<label> change_tint(gcomponent<label> self, const color32& value);
gcomponent<label> change_halign(gcomponent<label> self, label::haligns value);
gcomponent<label> change_valign(gcomponent<label> self, label::valigns value);
gcomponent<label> change_leading(gcomponent<label> self, f32 value);
gcomponent<label> change_tracking(gcomponent<label> self, f32 value);
gcomponent<label> change_text_width(gcomponent<label> self, f32 value);
gcomponent<label> change_glyph_dilate(gcomponent<label> self, f32 value);
gcomponent<label> change_outline_width(gcomponent<label> self, f32 value);
gcomponent<label> change_outline_color(gcomponent<label> self, const color32& value);
}

View File

@@ -17,13 +17,13 @@ namespace e2d::bindings::high
"dirty", sol::property(
[](const gcomponent<label>& c) -> bool {
return c.owner().component<label::dirty>().exists();
return labels::is_dirty(c);
},
[](gcomponent<label>& c, bool yesno){
if ( yesno ) {
c.owner().component<label::dirty>().ensure();
labels::mark_dirty(c);
} else {
c.owner().component<label::dirty>().remove();
labels::unmark_dirty(c);
}
}
),
@@ -33,8 +33,7 @@ namespace e2d::bindings::high
return c->text();
},
[](gcomponent<label>& c, str_view v){
c->text(str(v));
c.owner().component<label::dirty>().ensure();
labels::change_text(c, str(v));
}),
"font", sol::property(
@@ -42,8 +41,7 @@ namespace e2d::bindings::high
return c->font();
},
[](gcomponent<label>& c, const font_asset::ptr& v){
c->font(v);
c.owner().component<label::dirty>().ensure();
labels::change_font(c, v);
}),
"tint", sol::property(
@@ -51,8 +49,7 @@ namespace e2d::bindings::high
return c->tint();
},
[](gcomponent<label>& c, const color32& v){
c->tint(v);
c.owner().component<label::dirty>().ensure();
labels::change_tint(c, v);
}),
"halign", sol::property(
@@ -60,8 +57,7 @@ namespace e2d::bindings::high
return c->halign();
},
[](gcomponent<label>& c, label::haligns v){
c->halign(v);
c.owner().component<label::dirty>().ensure();
labels::change_halign(c, v);
}),
"valign", sol::property(
@@ -69,8 +65,7 @@ namespace e2d::bindings::high
return c->valign();
},
[](gcomponent<label>& c, label::valigns v){
c->valign(v);
c.owner().component<label::dirty>().ensure();
labels::change_valign(c, v);
}),
"leading", sol::property(
@@ -78,8 +73,7 @@ namespace e2d::bindings::high
return c->leading();
},
[](gcomponent<label>& c, f32 v){
c->leading(v);
c.owner().component<label::dirty>().ensure();
labels::change_leading(c, v);
}),
"tracking", sol::property(
@@ -87,8 +81,7 @@ namespace e2d::bindings::high
return c->tracking();
},
[](gcomponent<label>& c, f32 v){
c->tracking(v);
c.owner().component<label::dirty>().ensure();
labels::change_tracking(c, v);
}),
"text_width", sol::property(
@@ -96,8 +89,7 @@ namespace e2d::bindings::high
return c->text_width();
},
[](gcomponent<label>& c, f32 v){
c->text_width(v);
c.owner().component<label::dirty>().ensure();
labels::change_text_width(c, v);
}),
"glyph_dilate", sol::property(
@@ -105,8 +97,7 @@ namespace e2d::bindings::high
return c->glyph_dilate();
},
[](gcomponent<label>& c, f32 v){
c->glyph_dilate(v);
c.owner().component<label::dirty>().ensure();
labels::change_glyph_dilate(c, v);
}),
"outline_width", sol::property(
@@ -114,8 +105,7 @@ namespace e2d::bindings::high
return c->outline_width();
},
[](gcomponent<label>& c, f32 v){
c->outline_width(v);
c.owner().component<label::dirty>().ensure();
labels::change_outline_width(c, v);
}),
"outline_color", sol::property(
@@ -123,8 +113,7 @@ namespace e2d::bindings::high
return c->outline_color();
},
[](gcomponent<label>& c, const color32& v){
c->outline_color(v);
c.owner().component<label::dirty>().ensure();
labels::change_outline_color(c, v);
})
);

View File

@@ -204,8 +204,7 @@ namespace e2d
if ( str text = c->text();
ImGui::InputTextMultiline("text", &text) )
{
c->text(std::move(text));
c.owner().component<label::dirty>().ensure();
labels::change_text(c, std::move(text));
}
///TODO(BlackMat): add 'font' inspector
@@ -213,64 +212,153 @@ namespace e2d
if ( color tint = color(c->tint());
ImGui::ColorEdit4("tint", tint.data()) )
{
c->tint(color32(tint));
c.owner().component<label::dirty>().ensure();
labels::change_tint(c, color32(tint));
}
if ( label::haligns halign = c->halign();
imgui_utils::show_enum_combo_box("halign", &halign) )
{
c->halign(halign);
c.owner().component<label::dirty>().ensure();
labels::change_halign(c, halign);
}
if ( label::valigns valign = c->valign();
imgui_utils::show_enum_combo_box("valign", &valign) )
{
c->valign(valign);
c.owner().component<label::dirty>().ensure();
labels::change_valign(c, valign);
}
if ( f32 leading = c->leading();
ImGui::DragFloat("leading", &leading, 0.01f) )
{
c->leading(leading);
c.owner().component<label::dirty>().ensure();
labels::change_leading(c, leading);
}
if ( f32 tracking = c->tracking();
ImGui::DragFloat("tracking", &tracking, 0.01f) )
{
c->tracking(tracking);
c.owner().component<label::dirty>().ensure();
labels::change_tracking(c, tracking);
}
if ( f32 text_width = c->text_width();
ImGui::DragFloat("text_width", &text_width, 1.f) )
{
c->text_width(text_width);
c.owner().component<label::dirty>().ensure();
labels::change_text_width(c, text_width);
}
if ( f32 glyph_dilate = c->glyph_dilate();
ImGui::SliderFloat("glyph_dilate", &glyph_dilate, -1.f, 1.f) )
{
c->glyph_dilate(glyph_dilate);
c.owner().component<label::dirty>().ensure();
labels::change_glyph_dilate(c, glyph_dilate);
}
if ( f32 outline_width = c->outline_width();
ImGui::SliderFloat("outline_width", &outline_width, 0.f, 1.f) )
{
c->outline_width(outline_width);
c.owner().component<label::dirty>().ensure();
labels::change_outline_width(c, outline_width);
}
if ( color outline_color = color(c->outline_color());
ImGui::ColorEdit4("outline_color", outline_color.data()) )
{
c->outline_color(color32(outline_color));
c.owner().component<label::dirty>().ensure();
labels::change_outline_color(c, color32(outline_color));
}
}
}
namespace e2d::labels
{
gcomponent<label> mark_dirty(gcomponent<label> self) {
if ( self ) {
self.owner().component<label::dirty>().ensure();
}
return self;
}
gcomponent<label> unmark_dirty(gcomponent<label> self) {
if ( self ) {
self.owner().component<label::dirty>().remove();
}
return self;
}
bool is_dirty(const const_gcomponent<label>& self) noexcept {
return self.owner().component<label::dirty>().exists();
}
gcomponent<label> change_text(gcomponent<label> self, str value) {
if ( self ) {
self->text(std::move(value));
}
return mark_dirty(self);
}
gcomponent<label> change_font(gcomponent<label> self, const font_asset::ptr& value) {
if ( self ) {
self->font(value);
}
return mark_dirty(self);
}
gcomponent<label> change_tint(gcomponent<label> self, const color32& value) {
if ( self ) {
self->tint(value);
}
return mark_dirty(self);
}
gcomponent<label> change_halign(gcomponent<label> self, label::haligns value) {
if ( self ) {
self->halign(value);
}
return mark_dirty(self);
}
gcomponent<label> change_valign(gcomponent<label> self, label::valigns value) {
if ( self ) {
self->valign(value);
}
return mark_dirty(self);
}
gcomponent<label> change_leading(gcomponent<label> self, f32 value) {
if ( self ) {
self->leading(value);
}
return mark_dirty(self);
}
gcomponent<label> change_tracking(gcomponent<label> self, f32 value) {
if ( self ) {
self->tracking(value);
}
return mark_dirty(self);
}
gcomponent<label> change_text_width(gcomponent<label> self, f32 value) {
if ( self ) {
self->text_width(value);
}
return mark_dirty(self);
}
gcomponent<label> change_glyph_dilate(gcomponent<label> self, f32 value) {
if ( self ) {
self->glyph_dilate(value);
}
return mark_dirty(self);
}
gcomponent<label> change_outline_width(gcomponent<label> self, f32 value) {
if ( self ) {
self->outline_width(value);
}
return mark_dirty(self);
}
gcomponent<label> change_outline_color(gcomponent<label> self, const color32& value) {
if ( self ) {
self->outline_color(value);
}
return mark_dirty(self);
}
}