uint32_t is_hidden : 1;
uint32_t is_monospaced : 1;
+ uint32_t needs_size_update : 1;
};
typedef enum
ply_load_glyph_action_t action,
ply_pixel_buffer_t *pixel_buffer);
+static void size_control (ply_label_plugin_control_t *label,
+ bool force);
+
/* Query fontconfig, if available, for the default font. */
static const char *
query_fc_match ()
static long
get_width_of_control (ply_label_plugin_control_t *label)
{
+ size_control (label, false);
return label->area.width;
}
static long
get_height_of_control (ply_label_plugin_control_t *label)
{
+ size_control (label, false);
return label->area.height;
}
}
static void
-size_control (ply_label_plugin_control_t *label)
+size_control (ply_label_plugin_control_t *label,
+ bool force)
{
+ if (!force && !label->needs_size_update)
+ return;
+
+ if (!force && label->is_hidden) {
+ label->needs_size_update = true;
+ return;
+ }
+
if (label->rich_text == NULL && label->text == NULL) {
label->area.width = 0;
label->area.height = 0;
}
load_glyphs (label, PLY_LOAD_GLYPH_ACTION_MEASURE, NULL);
+ label->needs_size_update = false;
}
static void
ply_rectangle_t dirty_area = label->area;
if (adjust_size)
- size_control (label);
+ size_control (label, true);
if (label->is_hidden || label->display == NULL)
return;
label->scale_factor = device_scale;
set_font_for_control (label, label->font?: "Sans");
- size_control (label);
+ size_control (label, true);
}
static void
{
if (label->alignment != alignment) {
label->alignment = alignment;
+ label->needs_size_update = true;
trigger_redraw (label, true);
}
}
{
if (label->width != width) {
label->width = width;
+ label->needs_size_update = true;
trigger_redraw (label, true);
}
}
if (label->text != text) {
clear_text (label);
label->text = strdup (text);
+ label->needs_size_update = true;
trigger_redraw (label, true);
}
}
ply_rich_text_take_reference (rich_text);
label->span = *span;
+ label->needs_size_update = true;
trigger_redraw (label, true);
}
int dpi = 96;
bool size_in_pixels = false;
+ label->needs_size_update = true;
+
new_font = strdup (font);
free (label->font);
label->font = new_font;
FT_Set_Char_Size (label->face, size.as_integer, 0, dpi * label->scale_factor, 0);
/* Ignore errors, to keep the current size. */
-
trigger_redraw (label, true);
}
label->is_hidden = false;
- size_control (label);
+ size_control (label, false);
if (!label->is_hidden && label->display != NULL)
ply_pixel_display_draw_area (label->display,