Skip to content

Commit 788f43a

Browse files
committed
edit_OnChange() send EvText cpos and len. Fix GTK issue in edit_OnFilter().
1 parent 73a8e07 commit 788f43a

File tree

14 files changed

+229
-171
lines changed

14 files changed

+229
-171
lines changed

Changelog.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
- `ekGUI_SCALE_ADJUST` to `gui_scale_t`, for `imageview_scale()`. [Commit](https://github.com/frang75/nappgui_src/commit/814e28b45ac1cbf91b70de412f55724b819e158a).
99
- `button_min_width()`. [Commit](https://github.com/frang75/nappgui_src/commit/8639d19df195376620179e17f523646242a5e823).
1010
- `edit_min_width()`. [Commit](https://github.com/frang75/nappgui_src/commit/8639d19df195376620179e17f523646242a5e823).
11+
- `edit_min_height()`. [Commit]().
1112
- `button_get_font()`. [Commit](https://github.com/frang75/nappgui_src/commit/8639d19df195376620179e17f523646242a5e823).
1213
- `label_min_width()`. [Commit](https://github.com/frang75/nappgui_src/commit/bccc5d36a6ec9f68b0f3e682067da456b2b98ba4).
1314
- `label_get_font()`. [Commit](https://github.com/frang75/nappgui_src/commit/bccc5d36a6ec9f68b0f3e682067da456b2b98ba4).
1415
- `progress_min_width()`. [Commit](https://github.com/frang75/nappgui_src/commit/bccc5d36a6ec9f68b0f3e682067da456b2b98ba4).
1516
- `slider_min_width()`. [Commit](https://github.com/frang75/nappgui_src/commit/bccc5d36a6ec9f68b0f3e682067da456b2b98ba4).
16-
1717
- Dynamic menus. [Doc](https://nappgui.com/en/gui/menu.html). [Issue](https://github.com/frang75/nappgui_src/issues/174). [Commit](https://github.com/frang75/nappgui_src/commit/bd9fb788c687bd7a6c31bf115cd9a82e2b87ffe2).
1818
* Renamed `menu_add_item()`, previously `menu_item()`.
1919
* Renamed `menu_count()`, previously `menu_size()`.
@@ -28,6 +28,8 @@
2828
* Added `menuitem_get_enabled()`.
2929
* Added `menuitem_get_visible()`.
3030
* Added `menuitem_get_state()`.
31+
- `edit_OnChange()` set `cpos` and `len` values in `EvText` event parameters. [Commit]().
32+
- `b64_encode_from_cstr()`. [Commit]().
3133

3234
### Changed
3335

@@ -40,6 +42,9 @@
4042
- Issue in NRC generated string with new lines. [Issue](https://github.com/frang75/nappgui_src/issues/177). [Commit](https://github.com/frang75/nappgui_src/commit/c4359a9ff45e5c54547048f1046d64d5f22e987a).
4143
- Issue in `str_relpath()`. [Commit](https://github.com/frang75/nappgui_src/commit/b34b6832c361ada1acc3a6a3235ea2fa65a71d88).
4244
- `image_write()` in macOS, with indexed BMPs. [Commit](https://github.com/frang75/nappgui_src/commit/4bc8cd66ff0d4d9a341ad4a7cd17604cc36827f3).
45+
- Issue in `dbind()` default values in struct types. [Commit](https://github.com/frang75/nappgui_src/commit/73a8e0775588edd053ba707c8a748ce2b0b8c9e7).
46+
- Avoid GTK Warnings in `edit_OnFilter()` events with multiline controls. [Issue](https://github.com/frang75/nappgui_src/issues/187). [Commit]().
47+
- Excessive internal padding in GTK `button_flat()`. [Commit]().
4348

4449
### Build system
4550

demo/guihello/seltext.c

Lines changed: 67 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ typedef struct _sel_data_t SelData;
1111
struct _sel_data_t
1212
{
1313
Window *window;
14-
Edit *edit;
1514
Edit *edit_range;
1615
Button *caps;
1716
TextView *text;
@@ -33,10 +32,10 @@ static void i_OnCopy(SelData *data, Event *e)
3332
cassert_no_null(data);
3433
unref(e);
3534
control = window_get_focus(data->window);
36-
if (guicontrol_edit(control) == data->edit)
37-
edit_copy(data->edit);
38-
else if (guicontrol_textview(control) == data->text)
39-
textview_copy(data->text);
35+
if (guicontrol_edit(control) != NULL)
36+
edit_copy(guicontrol_edit(control));
37+
else if (guicontrol_textview(control) != NULL)
38+
textview_copy(guicontrol_textview(control));
4039
}
4140

4241
/*---------------------------------------------------------------------------*/
@@ -47,10 +46,10 @@ static void i_OnPaste(SelData *data, Event *e)
4746
cassert_no_null(data);
4847
unref(e);
4948
control = window_get_focus(data->window);
50-
if (guicontrol_edit(control) == data->edit)
51-
edit_paste(data->edit);
52-
else if (guicontrol_textview(control) == data->text)
53-
textview_paste(data->text);
49+
if (guicontrol_edit(control) != NULL)
50+
edit_paste(guicontrol_edit(control));
51+
else if (guicontrol_textview(control) != NULL)
52+
textview_paste(guicontrol_textview(control));
5453
}
5554

5655
/*---------------------------------------------------------------------------*/
@@ -61,10 +60,10 @@ static void i_OnCut(SelData *data, Event *e)
6160
cassert_no_null(data);
6261
unref(e);
6362
control = window_get_focus(data->window);
64-
if (guicontrol_edit(control) == data->edit)
65-
edit_cut(data->edit);
66-
else if (guicontrol_textview(control) == data->text)
67-
textview_cut(data->text);
63+
if (guicontrol_edit(control) != NULL)
64+
edit_cut(guicontrol_edit(control));
65+
else if (guicontrol_textview(control) != NULL)
66+
textview_cut(guicontrol_textview(control));
6867
}
6968

7069
/*---------------------------------------------------------------------------*/
@@ -83,10 +82,10 @@ static void i_OnSelect(SelData *data, Event *e)
8382
start = str_to_i32(tc(left), 10, NULL);
8483
end = str_to_i32(tc(right), 10, NULL);
8584

86-
if (guicontrol_edit(control) == data->edit)
87-
edit_select(data->edit, start, end);
88-
else if (guicontrol_textview(control) == data->text)
89-
textview_select(data->text, start, end);
85+
if (guicontrol_edit(control) != NULL)
86+
edit_select(guicontrol_edit(control), start, end);
87+
else if (guicontrol_textview(control) != NULL)
88+
textview_select(guicontrol_textview(control), start, end);
9089

9190
str_destroy(&left);
9291
str_destroy(&right);
@@ -103,7 +102,7 @@ static void i_OnWrap(SelData *data, Event *e)
103102

104103
/*---------------------------------------------------------------------------*/
105104

106-
static void i_OnEditFilter(SelData *data, Event *e)
105+
static void i_filter_event(SelData *data, Event *e, const char_t *name)
107106
{
108107
const EvText *p = event_params(e, EvText);
109108
cassert_no_null(data);
@@ -144,54 +143,32 @@ static void i_OnEditFilter(SelData *data, Event *e)
144143
r->apply = TRUE;
145144
}
146145

147-
textview_printf(data->info_text, "Edit: Pos %d Len %d\n", p->cpos, p->len);
146+
textview_printf(data->info_text, "%s: Pos %d Len %d\n", name, p->cpos, p->len);
148147
textview_scroll_caret(data->info_text);
149148
}
150149

151150
/*---------------------------------------------------------------------------*/
152151

153-
static void i_OnTextViewFilter(SelData *data, Event *e)
152+
static void i_OnEditFilter(SelData *data, Event *e)
154153
{
155-
const EvText *p = event_params(e, EvText);
156-
cassert_no_null(data);
157-
158-
/*
159-
* Convert the inserted text in caps.
160-
* p->text the inserted text only (const).
161-
* r->text the new filterd text.
162-
* p->cpos current caret position.
163-
* r->apply = TRUE means the editbox text has to be updated.
164-
* p->len number of chars inserted at left of caret (to caps).
165-
* We are working with UTF8-Strings. Sequential access.
166-
*/
167-
if (button_get_state(data->caps) == ekGUI_ON && p->len > 0)
168-
{
169-
EvTextFilter *r = event_result(e, EvTextFilter);
170-
const char_t *src = p->text;
171-
char_t *dest = r->text;
172-
uint32_t cp = unicode_to_u32(src, ekUTF8);
173-
uint32_t pos = 0;
174-
while (cp != 0)
175-
{
176-
uint32_t offset = 0;
154+
i_filter_event(data, e, "Edit OnFilter");
155+
}
177156

178-
if (cp >= 'a' && cp <= 'z')
179-
cp -= 32;
157+
/*---------------------------------------------------------------------------*/
180158

181-
offset = unicode_to_char(cp, dest, ekUTF8);
182-
dest += offset;
183-
src = unicode_next(src, ekUTF8);
184-
cp = unicode_to_u32(src, ekUTF8);
185-
pos += 1;
186-
}
159+
static void i_OnEditChange(SelData *data, Event *e)
160+
{
161+
const EvText *p = event_params(e, EvText);
162+
cassert_no_null(data);
163+
textview_printf(data->info_text, "Edit OnChange: Pos: %d Len %d\n", p->cpos, p->len);
164+
textview_scroll_caret(data->info_text);
165+
}
187166

188-
*dest = 0;
189-
r->cpos = p->cpos;
190-
r->apply = TRUE;
191-
}
167+
/*---------------------------------------------------------------------------*/
192168

193-
textview_printf(data->info_text, "TextView: Pos %d Len %d\n", p->cpos, p->len);
194-
textview_scroll_caret(data->info_text);
169+
static void i_OnTextViewFilter(SelData *data, Event *e)
170+
{
171+
i_filter_event(data, e, "TextView OnFilter");
195172
}
196173

197174
/*---------------------------------------------------------------------------*/
@@ -245,37 +222,55 @@ static Layout *i_text_controls(SelData *data)
245222

246223
static Layout *i_layout(SelData *data)
247224
{
248-
Layout *layout1 = layout_create(1, 7);
225+
Layout *layout1 = layout_create(1, 11);
249226
Layout *layout2 = i_text_controls(data);
250227
Label *label1 = label_create();
251228
Label *label2 = label_create();
252229
Label *label3 = label_create();
253-
Edit *edit = edit_create();
230+
Label *label4 = label_create();
231+
Label *label5 = label_create();
232+
Edit *edit1 = edit_create();
233+
Edit *edit2 = edit_multiline();
234+
Edit *edit3 = edit_multiline();
254235
TextView *text1 = textview_create();
255236
TextView *text2 = textview_create();
256237
cassert_no_null(data);
257238
label_text(label1, "EditBox");
258-
label_text(label2, "TextView");
259-
label_text(label3, "Info");
260-
edit_text(edit, "This is a text in the EditBox control");
261-
edit_OnFilter(edit, listener(data, i_OnEditFilter, SelData));
239+
label_text(label2, "EditBox (multiline)");
240+
label_text(label3, "EditBox (multiline with user-height)");
241+
label_text(label4, "TextView");
242+
label_text(label5, "Info");
243+
edit_text(edit1, "This is a text in the EditBox control");
244+
edit_text(edit2, "This is a text in the multiline EditBox control");
245+
edit_text(edit3, "This is a text in the multiline EditBox control");
246+
edit_min_height(edit3, 100);
247+
edit_OnFilter(edit1, listener(data, i_OnEditFilter, SelData));
248+
edit_OnFilter(edit2, listener(data, i_OnEditFilter, SelData));
249+
edit_OnFilter(edit3, listener(data, i_OnEditFilter, SelData));
250+
edit_OnChange(edit1, listener(data, i_OnEditChange, SelData));
251+
edit_OnChange(edit2, listener(data, i_OnEditChange, SelData));
252+
edit_OnChange(edit3, listener(data, i_OnEditChange, SelData));
262253
textview_writef(text1, "This is another text in the TextView control, wider than the control.");
263254
textview_editable(text1, TRUE);
264255
textview_OnFilter(text1, listener(data, i_OnTextViewFilter, SelData));
265256
layout_label(layout1, label1, 0, 0);
266-
layout_edit(layout1, edit, 0, 1);
257+
layout_edit(layout1, edit1, 0, 1);
267258
layout_label(layout1, label2, 0, 2);
268-
layout_textview(layout1, text1, 0, 3);
269-
layout_layout(layout1, layout2, 0, 4);
270-
layout_label(layout1, label3, 0, 5);
271-
layout_textview(layout1, text2, 0, 6);
272-
layout_tabstop(layout1, 0, 3, TRUE);
273-
layout_tabstop(layout1, 0, 4, FALSE);
274-
layout_halign(layout1, 0, 4, ekLEFT);
259+
layout_edit(layout1, edit2, 0, 3);
260+
layout_label(layout1, label3, 0, 4);
261+
layout_edit(layout1, edit3, 0, 5);
262+
layout_label(layout1, label4, 0, 6);
263+
layout_textview(layout1, text1, 0, 7);
264+
layout_layout(layout1, layout2, 0, 8);
265+
layout_label(layout1, label5, 0, 9);
266+
layout_textview(layout1, text2, 0, 10);
267+
layout_tabstop(layout1, 0, 7, TRUE);
268+
layout_tabstop(layout1, 0, 8, FALSE);
269+
layout_halign(layout1, 0, 8, ekLEFT);
275270
layout_vmargin(layout1, 1, 5);
276271
layout_vmargin(layout1, 3, 5);
277-
layout_vmargin(layout1, 4, 5);
278-
data->edit = edit;
272+
layout_vmargin(layout1, 5, 5);
273+
layout_vmargin(layout1, 7, 5);
279274
data->text = text1;
280275
data->info_text = text2;
281276
return layout1;

prj/build.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5995
1+
6016

src/gui/edit.c

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ struct _edit_t
3333
GuiComponent component;
3434
uint32_t flags;
3535
real32_t width;
36+
real32_t height;
3637
S2Df size;
3738
bool_t is_focused;
3839
bool_t is_placeholder_active;
@@ -216,6 +217,7 @@ static Edit *i_create(const align_t halign, const uint32_t flags)
216217
void *ositem = NULL;
217218
edit->flags = flags;
218219
edit->width = 100;
220+
edit->height = -1;
219221
edit->text = str_c("");
220222
edit->font = _gui_create_default_font();
221223
edit->color = kCOLOR_DEFAULT;
@@ -282,6 +284,16 @@ void edit_min_width(Edit *edit, const real32_t width)
282284

283285
/*---------------------------------------------------------------------------*/
284286

287+
void edit_min_height(Edit *edit, const real32_t height)
288+
{
289+
cassert_no_null(edit);
290+
cassert(height > 0);
291+
cassert(edit_get_type(edit->flags) == ekEDIT_MULTI);
292+
edit->height = height;
293+
}
294+
295+
/*---------------------------------------------------------------------------*/
296+
285297
void edit_text(Edit *edit, const char_t *text)
286298
{
287299
cassert_no_null(edit);
@@ -491,8 +503,12 @@ void _edit_dimension(Edit *edit, const uint32_t i, real32_t *dim0, real32_t *dim
491503
}
492504
else
493505
{
506+
/* The height set by the user cannot be lower than the height of a single - line control */
494507
cassert(i == 1);
495-
*dim1 = edit->size.height;
508+
if (edit_get_type(edit->flags) == ekEDIT_MULTI && edit->height > edit->size.height)
509+
*dim1 = edit->height;
510+
else
511+
*dim1 = edit->size.height;
496512
}
497513
}
498514

src/gui/edit.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ _gui_api void edit_OnFocus(Edit *edit, Listener *listener);
2727

2828
_gui_api void edit_min_width(Edit *edit, const real32_t width);
2929

30+
_gui_api void edit_min_height(Edit *edit, const real32_t height);
31+
3032
_gui_api void edit_text(Edit *edit, const char_t *text);
3133

3234
_gui_api void edit_font(Edit *edit, const Font *font);

src/inet/base64.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,15 @@ String *b64_encode_from_str(const String *str)
209209

210210
/*---------------------------------------------------------------------------*/
211211

212+
String *b64_encode_from_cstr(const char_t *str)
213+
{
214+
const byte_t *data = cast_const(str, byte_t);
215+
uint32_t size = str_len_c(str);
216+
return i_encode_from_data(data, size);
217+
}
218+
219+
/*---------------------------------------------------------------------------*/
220+
212221
Buffer *b64_decode_from_str(const String *base64)
213222
{
214223
const byte_t *data = cast_const(tc(base64), byte_t);

src/inet/base64.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ String *b64_encode_from_data(const byte_t *data, const uint32_t size);
2929

3030
String *b64_encode_from_str(const String *str);
3131

32+
String *b64_encode_from_cstr(const char_t *str);
33+
3234
Buffer *b64_decode_from_str(const String *base64);
3335

3436
Buffer *b64_decode_from_data(const byte_t *data, const uint32_t size);

0 commit comments

Comments
 (0)