1
/* gui_label.c - GUI component to display a line of text. */
3
* GRUB -- GRand Unified Bootloader
4
* Copyright (C) 2008,2009 Free Software Foundation, Inc.
6
* GRUB is free software: you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation, either version 3 of the License, or
9
* (at your option) any later version.
11
* GRUB is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
21
#include <grub/misc.h>
23
#include <grub/font.h>
24
#include <grub/gui_string_util.h>
26
static const char *align_options[] =
42
struct grub_gui_component comp;
44
grub_gui_container_t parent;
45
grub_video_rect_t bounds;
51
grub_gui_color_t color;
53
enum align_mode align;
56
typedef struct grub_gui_label *grub_gui_label_t;
59
label_destroy (void *vself)
61
grub_gui_label_t self = vself;
62
grub_gfxmenu_timeout_unregister ((grub_gui_component_t) self);
63
grub_free (self->text);
64
grub_free (self->template);
69
label_get_id (void *vself)
71
grub_gui_label_t self = vself;
76
label_is_instance (void *vself __attribute__((unused)), const char *type)
78
return grub_strcmp (type, "component") == 0;
82
label_paint (void *vself, const grub_video_rect_t *region)
84
grub_gui_label_t self = vself;
89
if (!grub_video_have_common_points (region, &self->bounds))
92
/* Calculate the starting x coordinate. */
94
if (self->align == align_left)
96
else if (self->align == align_center)
97
left_x = ((self->bounds.width
98
- grub_font_get_string_width (self->font, self->text))
100
else if (self->align == align_right)
101
left_x = (self->bounds.width
102
- grub_font_get_string_width (self->font, self->text));
104
return; /* Invalid alignment. */
106
grub_video_rect_t vpsave;
107
grub_gui_set_viewport (&self->bounds, &vpsave);
108
grub_font_draw_string (self->text,
110
grub_gui_map_color (self->color),
112
grub_font_get_ascent (self->font));
113
grub_gui_restore_viewport (&vpsave);
117
label_set_parent (void *vself, grub_gui_container_t parent)
119
grub_gui_label_t self = vself;
120
self->parent = parent;
123
static grub_gui_container_t
124
label_get_parent (void *vself)
126
grub_gui_label_t self = vself;
131
label_set_bounds (void *vself, const grub_video_rect_t *bounds)
133
grub_gui_label_t self = vself;
134
self->bounds = *bounds;
138
label_get_bounds (void *vself, grub_video_rect_t *bounds)
140
grub_gui_label_t self = vself;
141
*bounds = self->bounds;
145
label_get_minimal_size (void *vself, unsigned *width, unsigned *height)
147
grub_gui_label_t self = vself;
148
*width = grub_font_get_string_width (self->font, self->text);
149
*height = (grub_font_get_ascent (self->font)
150
+ grub_font_get_descent (self->font));
154
label_set_state (void *vself, int visible, int start __attribute__ ((unused)),
155
int current, int end __attribute__ ((unused)))
157
grub_gui_label_t self = vself;
158
self->value = -current;
159
self->visible = visible;
160
grub_free (self->text);
161
self->text = grub_xasprintf (self->template ? : "%d", self->value);
165
label_set_property (void *vself, const char *name, const char *value)
167
grub_gui_label_t self = vself;
168
if (grub_strcmp (name, "text") == 0)
170
grub_free (self->text);
171
grub_free (self->template);
174
self->template = NULL;
175
self->text = grub_strdup ("");
179
self->template = grub_strdup (value);
180
self->text = grub_xasprintf (value, self->value);
183
else if (grub_strcmp (name, "font") == 0)
185
self->font = grub_font_get (value);
187
else if (grub_strcmp (name, "color") == 0)
189
grub_gui_parse_color (value, &self->color);
191
else if (grub_strcmp (name, "align") == 0)
194
for (i = 0; align_options[i]; i++)
196
if (grub_strcmp (align_options[i], value) == 0)
198
self->align = i; /* Set the alignment mode. */
203
else if (grub_strcmp (name, "visible") == 0)
205
self->visible = grub_strcmp (value, "false") != 0;
207
else if (grub_strcmp (name, "id") == 0)
209
grub_gfxmenu_timeout_unregister ((grub_gui_component_t) self);
210
grub_free (self->id);
212
self->id = grub_strdup (value);
215
if (self->id && grub_strcmp (self->id, GRUB_GFXMENU_TIMEOUT_COMPONENT_ID)
217
grub_gfxmenu_timeout_register ((grub_gui_component_t) self,
220
return GRUB_ERR_NONE;
223
static struct grub_gui_component_ops label_ops =
225
.destroy = label_destroy,
226
.get_id = label_get_id,
227
.is_instance = label_is_instance,
228
.paint = label_paint,
229
.set_parent = label_set_parent,
230
.get_parent = label_get_parent,
231
.set_bounds = label_set_bounds,
232
.get_bounds = label_get_bounds,
233
.get_minimal_size = label_get_minimal_size,
234
.set_property = label_set_property
238
grub_gui_label_new (void)
240
grub_gui_label_t label;
241
label = grub_zalloc (sizeof (*label));
244
label->comp.ops = &label_ops;
246
label->text = grub_strdup ("");
247
label->font = grub_font_get ("Unknown Regular 16");
248
label->color.red = 0;
249
label->color.green = 0;
250
label->color.blue = 0;
251
label->color.alpha = 255;
252
label->align = align_left;
253
return (grub_gui_component_t) label;