source: mainline/uspace/lib/ui/src/label.c@ 8624d1f

Last change on this file since 8624d1f was d7f7a4a, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 4 years ago

Replace some license headers with SPDX identifier

Headers are replaced using tools/transorm-copyright.sh only
when it can be matched verbatim with the license header used
throughout most of the codebase.

  • Property mode set to 100644
File size: 4.6 KB
Line 
1/*
2 * SPDX-FileCopyrightText: 2021 Jiri Svoboda
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7/** @addtogroup libui
8 * @{
9 */
10/**
11 * @file Label
12 */
13
14#include <errno.h>
15#include <gfx/context.h>
16#include <gfx/render.h>
17#include <gfx/text.h>
18#include <stdlib.h>
19#include <str.h>
20#include <ui/control.h>
21#include <ui/paint.h>
22#include <ui/label.h>
23#include "../private/label.h"
24#include "../private/resource.h"
25
26static void ui_label_ctl_destroy(void *);
27static errno_t ui_label_ctl_paint(void *);
28static ui_evclaim_t ui_label_ctl_pos_event(void *, pos_event_t *);
29
30/** Label control ops */
31ui_control_ops_t ui_label_ops = {
32 .destroy = ui_label_ctl_destroy,
33 .paint = ui_label_ctl_paint,
34 .pos_event = ui_label_ctl_pos_event
35};
36
37/** Create new label.
38 *
39 * @param resource UI resource
40 * @param text Text
41 * @param rlabel Place to store pointer to new label
42 * @return EOK on success, ENOMEM if out of memory
43 */
44errno_t ui_label_create(ui_resource_t *resource, const char *text,
45 ui_label_t **rlabel)
46{
47 ui_label_t *label;
48 errno_t rc;
49
50 label = calloc(1, sizeof(ui_label_t));
51 if (label == NULL)
52 return ENOMEM;
53
54 rc = ui_control_new(&ui_label_ops, (void *) label, &label->control);
55 if (rc != EOK) {
56 free(label);
57 return rc;
58 }
59
60 label->text = str_dup(text);
61 if (label->text == NULL) {
62 ui_control_delete(label->control);
63 free(label);
64 return ENOMEM;
65 }
66
67 label->res = resource;
68 label->halign = gfx_halign_left;
69 *rlabel = label;
70 return EOK;
71}
72
73/** Destroy label.
74 *
75 * @param label Label or @c NULL
76 */
77void ui_label_destroy(ui_label_t *label)
78{
79 if (label == NULL)
80 return;
81
82 ui_control_delete(label->control);
83 free(label);
84}
85
86/** Get base control from label.
87 *
88 * @param label Label
89 * @return Control
90 */
91ui_control_t *ui_label_ctl(ui_label_t *label)
92{
93 return label->control;
94}
95
96/** Set label rectangle.
97 *
98 * @param label Label
99 * @param rect New label rectangle
100 */
101void ui_label_set_rect(ui_label_t *label, gfx_rect_t *rect)
102{
103 label->rect = *rect;
104}
105
106/** Set label horizontal text alignment.
107 *
108 * @param label Label
109 * @param halign Horizontal alignment
110 */
111void ui_label_set_halign(ui_label_t *label, gfx_halign_t halign)
112{
113 label->halign = halign;
114}
115
116/** Set label vertical text alignment.
117 *
118 * @param label Label
119 * @param valign Vertical alignment
120 */
121void ui_label_set_valign(ui_label_t *label, gfx_valign_t valign)
122{
123 label->valign = valign;
124}
125
126/** Set label text.
127 *
128 * @param label Label
129 * @param text New label text
130 * @return EOK on success, ENOMEM if out of memory
131 */
132errno_t ui_label_set_text(ui_label_t *label, const char *text)
133{
134 char *tcopy;
135
136 tcopy = str_dup(text);
137 if (tcopy == NULL)
138 return ENOMEM;
139
140 free(label->text);
141 label->text = tcopy;
142
143 return EOK;
144}
145
146/** Paint label.
147 *
148 * @param label Label
149 * @return EOK on success or an error code
150 */
151errno_t ui_label_paint(ui_label_t *label)
152{
153 gfx_text_fmt_t fmt;
154 gfx_coord2_t pos;
155 errno_t rc;
156
157 /* Paint label background */
158
159 rc = gfx_set_color(label->res->gc, label->res->wnd_face_color);
160 if (rc != EOK)
161 goto error;
162
163 rc = gfx_fill_rect(label->res->gc, &label->rect);
164 if (rc != EOK)
165 goto error;
166
167 switch (label->halign) {
168 case gfx_halign_left:
169 case gfx_halign_justify:
170 pos.x = label->rect.p0.x;
171 break;
172 case gfx_halign_center:
173 pos.x = (label->rect.p0.x + label->rect.p1.x) / 2;
174 break;
175 case gfx_halign_right:
176 pos.x = label->rect.p1.x;
177 break;
178 }
179
180 switch (label->valign) {
181 case gfx_valign_top:
182 pos.y = label->rect.p0.y;
183 break;
184 case gfx_valign_center:
185 pos.y = (label->rect.p0.y + label->rect.p1.y) / 2;
186 break;
187 case gfx_valign_bottom:
188 pos.y = label->rect.p1.y;
189 break;
190 case gfx_valign_baseline:
191 return EINVAL;
192 }
193
194 gfx_text_fmt_init(&fmt);
195 fmt.font = label->res->font;
196 fmt.color = label->res->wnd_text_color;
197 fmt.halign = label->halign;
198 fmt.valign = label->valign;
199
200 rc = gfx_puttext(&pos, &fmt, label->text);
201 if (rc != EOK)
202 goto error;
203
204 rc = gfx_update(label->res->gc);
205 if (rc != EOK)
206 goto error;
207
208 return EOK;
209error:
210 return rc;
211}
212
213/** Destroy label control.
214 *
215 * @param arg Argument (ui_label_t *)
216 */
217void ui_label_ctl_destroy(void *arg)
218{
219 ui_label_t *label = (ui_label_t *) arg;
220
221 ui_label_destroy(label);
222}
223
224/** Paint label control.
225 *
226 * @param arg Argument (ui_label_t *)
227 * @return EOK on success or an error code
228 */
229errno_t ui_label_ctl_paint(void *arg)
230{
231 ui_label_t *label = (ui_label_t *) arg;
232
233 return ui_label_paint(label);
234}
235
236/** Handle label control position event.
237 *
238 * @param arg Argument (ui_label_t *)
239 * @param pos_event Position event
240 * @return @c ui_claimed iff the event is claimed
241 */
242ui_evclaim_t ui_label_ctl_pos_event(void *arg, pos_event_t *event)
243{
244 ui_label_t *label = (ui_label_t *) arg;
245
246 (void) label;
247 return ui_unclaimed;
248}
249
250/** @}
251 */
Note: See TracBrowser for help on using the repository browser.