Skip to content

Commit 4617e4b

Browse files
committed
Fix some bugs in the editor.
1 parent 29002ca commit 4617e4b

4 files changed

Lines changed: 108 additions & 55 deletions

File tree

src/editor/src/ui/property_inspector.c

Lines changed: 51 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
#include <math_funcs.h>
1717
#include <world.h>
1818

19-
struct te_property_inspector{
19+
struct te_property_inspector {
2020
// Not NULL if inspecting some object.
2121
void* obj;
2222
const char* obj_type_id;
@@ -49,7 +49,8 @@ property_inspector_set_parent(te_property_inspector* inspector, te_widget* right
4949
inspector->right_panel = right_panel;
5050
}
5151

52-
static void on_variable_checkbox_changed(te_checkbox_widget* checkbox, bool is_checked) {
52+
static void
53+
on_variable_checkbox_changed(te_checkbox_widget* checkbox, bool is_checked) {
5354
te_widget* widget = checkbox_widget_get_widget(checkbox);
5455
te_property_inspector* inspector = widget_get_custom_ptr(widget);
5556

@@ -69,7 +70,9 @@ static void on_variable_checkbox_changed(te_checkbox_widget* checkbox, bool is_c
6970
info->bool_setters[info->variables[var_idx].set_get_index](inspector->obj, is_checked);
7071
}
7172

72-
static void on_variable_text_edit_changed(te_text_edit_widget* text_edit, wchar_t* src_text, unsigned int src_len) {
73+
static void
74+
on_variable_text_edit_changed(
75+
te_text_edit_widget* text_edit, wchar_t* src_text, unsigned int src_len) {
7376
(void)src_len;
7477

7578
te_widget* widget = text_edit_widget_get_widget(text_edit);
@@ -108,20 +111,20 @@ static void on_variable_text_edit_changed(te_text_edit_widget* text_edit, wchar_
108111
}
109112
case (TE_VT_UINT): {
110113
const unsigned long test = strtoul(text, &endptr, 10);
111-
unsigned int value = 0;
112-
if (test < 0xFFFFFFFFu){
113-
value = (unsigned int)test;
114-
}
114+
unsigned int value = 0;
115+
if (test < 0xFFFFFFFFu) {
116+
value = (unsigned int)test;
117+
}
115118

116119
info->uint_setters[set_get_index](inspector->obj, value);
117120
break;
118121
}
119-
case (TE_VT_FLOAT):{
122+
case (TE_VT_FLOAT): {
120123
const float value = math_convert_string_to_float(text, &endptr);
121124
info->float_setters[set_get_index](inspector->obj, value);
122125
break;
123126
}
124-
case (TE_VT_VEC2):{
127+
case (TE_VT_VEC2): {
125128
const float item = math_convert_string_to_float(text, &endptr);
126129
vec2 value;
127130
info->vec2_getters[set_get_index](inspector->obj, value);
@@ -182,7 +185,9 @@ add_name_widget(te_widget* parent, const char* name, vec2 pos, vec2 size) {
182185
}
183186

184187
static void
185-
add_float_widget(te_property_inspector* inspector, unsigned int var_idx, unsigned int comp_idx, te_widget* parent, float value, vec2 pos, vec2 size) {
188+
add_float_widget(
189+
te_property_inspector* inspector, unsigned int var_idx, unsigned int comp_idx,
190+
te_widget* parent, float value, vec2 pos, vec2 size) {
186191
te_text_edit_widget* text_edit = text_edit_widget_create();
187192
{
188193
te_widget* widget = text_edit_widget_get_widget(text_edit);
@@ -195,13 +200,13 @@ add_float_widget(te_property_inspector* inspector, unsigned int var_idx, unsigne
195200

196201
if (comp_idx == 1) {
197202
widget_set_name(widget, "\1");
198-
}else if (comp_idx == 2) {
203+
} else if (comp_idx == 2) {
199204
widget_set_name(widget, "\2");
200205
} else if (comp_idx == 3) {
201206
widget_set_name(widget, "\3");
202207
}
203208
}
204-
text_edit_widget_set_text_height(text_edit, theme_get_text_height());
209+
text_edit_widget_set_text_height(text_edit, theme_get_text_height() * 0.95f);
205210
text_edit_widget_set_on_text_changed(text_edit, on_variable_text_edit_changed);
206211

207212
int len = snprintf(NULL, 0, "%.2f", value);
@@ -278,7 +283,8 @@ property_inspector_show(te_property_inspector* inspector, void* obj, const char*
278283
}
279284
checkbox_widget_set_background_color(checkbox, text_edit_background_color);
280285
checkbox_widget_set_checked_color(checkbox, checkbox_checked_color);
281-
checkbox_widget_set_is_checked(checkbox, type_info->bool_getters[var_info->set_get_index](obj));
286+
checkbox_widget_set_is_checked(
287+
checkbox, type_info->bool_getters[var_info->set_get_index](obj));
282288
checkbox_widget_set_on_changed(checkbox, on_variable_checkbox_changed);
283289
break;
284290
}
@@ -340,12 +346,11 @@ property_inspector_show(te_property_inspector* inspector, void* obj, const char*
340346

341347
// Text edit ----------------------------------------
342348

343-
const float value =
344-
type_info->float_getters[var_info->set_get_index](obj);
349+
const float value = type_info->float_getters[var_info->set_get_index](obj);
345350

346-
add_float_widget(inspector, var_idx, 0,
347-
rect_widget_get_widget(rect), value, (vec2){hpadding, 0.0f},
348-
(vec2){1.0f - hpadding, 1.0f});
351+
add_float_widget(
352+
inspector, var_idx, 0, rect_widget_get_widget(rect), value,
353+
(vec2){hpadding, 0.0f}, (vec2){1.0f - hpadding, 1.0f});
349354
break;
350355
}
351356
case (TE_VT_VEC2): {
@@ -366,11 +371,11 @@ property_inspector_show(te_property_inspector* inspector, void* obj, const char*
366371
// Text edit ----------------------------------------
367372

368373
add_float_widget(
369-
inspector, var_idx, 0,
370-
widget, value[0], (vec2){hpadding, 0.0f}, (vec2){vec_item_width, 1.0f});
374+
inspector, var_idx, 0, widget, value[0], (vec2){hpadding, 0.0f},
375+
(vec2){vec_item_width, 1.0f});
371376
add_float_widget(
372-
inspector, var_idx, 1,
373-
widget, value[1], (vec2){hpadding + vec_item_width + hpadding, 0.0f},
377+
inspector, var_idx, 1, widget, value[1],
378+
(vec2){hpadding + vec_item_width + hpadding, 0.0f},
374379
(vec2){vec_item_width, 1.0f});
375380

376381
break;
@@ -393,15 +398,14 @@ property_inspector_show(te_property_inspector* inspector, void* obj, const char*
393398
// Text edit ----------------------------------------
394399

395400
add_float_widget(
396-
inspector, var_idx, 0,
397-
widget, value[0], (vec2){hpadding, 0.0f}, (vec2){vec_item_width, 1.0f});
401+
inspector, var_idx, 0, widget, value[0], (vec2){hpadding, 0.0f},
402+
(vec2){vec_item_width, 1.0f});
398403
add_float_widget(
399-
inspector, var_idx, 1,
400-
widget, value[1], (vec2){hpadding + vec_item_width + hpadding, 0.0f},
404+
inspector, var_idx, 1, widget, value[1],
405+
(vec2){hpadding + vec_item_width + hpadding, 0.0f},
401406
(vec2){vec_item_width, 1.0f});
402407
add_float_widget(
403-
inspector, var_idx, 2,
404-
widget, value[2],
408+
inspector, var_idx, 2, widget, value[2],
405409
(vec2){hpadding + vec_item_width + hpadding + vec_item_width + hpadding,
406410
0.0f},
407411
(vec2){vec_item_width, 1.0f});
@@ -426,22 +430,22 @@ property_inspector_show(te_property_inspector* inspector, void* obj, const char*
426430
// Text edit ----------------------------------------
427431

428432
add_float_widget(
429-
inspector, var_idx, 0,
430-
widget, value[0], (vec2){hpadding, 0.0f}, (vec2){vec_item_width, 1.0f});
433+
inspector, var_idx, 0, widget, value[0], (vec2){hpadding, 0.0f},
434+
(vec2){vec_item_width, 1.0f});
431435
add_float_widget(
432-
inspector, var_idx, 1,
433-
widget, value[1], (vec2){hpadding + vec_item_width + hpadding, 0.0f},
436+
inspector, var_idx, 1, widget, value[1],
437+
(vec2){hpadding + vec_item_width + hpadding, 0.0f},
434438
(vec2){vec_item_width, 1.0f});
435439
add_float_widget(
436-
inspector, var_idx, 2,
437-
widget, value[2],
438-
(vec2){hpadding + vec_item_width + hpadding + vec_item_width + hpadding, 0.0f},
440+
inspector, var_idx, 2, widget, value[2],
441+
(vec2){hpadding + vec_item_width + hpadding + vec_item_width + hpadding,
442+
0.0f},
439443
(vec2){vec_item_width, 1.0f});
440444
add_float_widget(
441-
inspector, var_idx, 3,
442-
widget, value[3],
445+
inspector, var_idx, 3, widget, value[3],
443446
(vec2){hpadding + vec_item_width + hpadding + vec_item_width + hpadding
444-
+ vec_item_width + hpadding, 0.0f},
447+
+ vec_item_width + hpadding,
448+
0.0f},
445449
(vec2){vec_item_width, 1.0f});
446450

447451
break;
@@ -475,7 +479,7 @@ property_inspector_show(te_property_inspector* inspector, void* obj, const char*
475479
text_edit_widget_set_text_height(text_edit, theme_get_text_height());
476480
text_edit_widget_set_on_text_changed(text_edit, on_variable_text_edit_changed);
477481

478-
if (var_text == NULL){
482+
if (var_text == NULL) {
479483
text_edit_widget_set_text(text_edit, L"");
480484
} else {
481485
unsigned int text_len;
@@ -485,7 +489,8 @@ property_inspector_show(te_property_inspector* inspector, void* obj, const char*
485489
break;
486490
}
487491
case (TE_VT_WSTRING): {
488-
const wchar_t* var_text = type_info->wstring_getters[var_info->set_get_index](obj);
492+
const wchar_t* var_text =
493+
type_info->wstring_getters[var_info->set_get_index](obj);
489494

490495
// Text edit background ----------------------------
491496

@@ -555,4 +560,9 @@ property_inspector_hide(te_property_inspector* inspector) {
555560
void*
556561
property_inspector_get_inspected_obj(te_property_inspector* inspector) {
557562
return inspector->obj;
558-
}
563+
}
564+
565+
const char*
566+
property_inspector_get_inspected_obj_type_id(te_property_inspector* inspector) {
567+
return inspector->obj_type_id;
568+
}

src/editor/src/ui/property_inspector.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,16 @@ struct te_editor_ui;
77
te_property_inspector* property_inspector_create(struct te_editor_ui* ui);
88
void property_inspector_destroy(te_property_inspector* inspector);
99

10-
void property_inspector_set_parent(te_property_inspector* inspector, struct te_widget* right_panel);
10+
void
11+
property_inspector_set_parent(te_property_inspector* inspector, struct te_widget* right_panel);
1112

12-
// Displays/hides properties of the specified object.
13-
void property_inspector_show(te_property_inspector* inspector, void* obj, const char* obj_type_id);
13+
// Displays/hides properties of the specified game object.
14+
// Note that for widgets you need to specify the final widget type not the base type
15+
// (for example, for te_rect_widget specify te_rect_widget not the te_widget).
16+
void
17+
property_inspector_show(te_property_inspector* inspector, void* obj, const char* obj_type_id);
1418
void property_inspector_hide(te_property_inspector* inspector);
1519

1620
// Returns NULL or the currently displayed game object.
17-
void* property_inspector_get_inspected_obj(te_property_inspector* inspector);
21+
void* property_inspector_get_inspected_obj(te_property_inspector* inspector);
22+
const char* property_inspector_get_inspected_obj_type_id(te_property_inspector* inspector);

src/editor/src/ui/world_inspector.c

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -150,10 +150,36 @@ refresh_button_highlight(te_world_inspector* inspector) {
150150
return;
151151
}
152152

153+
{
154+
// For widgets, property inspector stores the final type (not the base type te_widget) but
155+
// world inspector expects the base type (te_widget), check if this is the case:
156+
const char* game_obj_type_id =
157+
property_inspector_get_inspected_obj_type_id(inspector->property_inspector);
158+
if (game_obj_type_id == NULL) {
159+
log_error("expected type id to be valid");
160+
abort();
161+
}
162+
163+
const te_type_info* type_info = type_database_get_type_info(game_obj_type_id);
164+
if (type_info == NULL) {
165+
log_error("expected type info to be valid");
166+
abort();
167+
}
168+
169+
if (type_info->get_widget != NULL) {
170+
// To compare base type obj pointers:
171+
game_obj = type_info->get_widget(game_obj);
172+
}
173+
}
174+
153175
for (unsigned int i = 0; i < inspector->item_buttons_count; i++) {
154-
te_world_item_info* info =
155-
&((te_world_item_info*)inspector->item_list)
156-
[inspector->current_page * inspector->item_buttons_count + i];
176+
const unsigned int item_idx =
177+
inspector->current_page * inspector->item_buttons_count + i;
178+
if (item_idx >= inspector->item_list_count) {
179+
break;
180+
}
181+
182+
te_world_item_info* info = &((te_world_item_info*)inspector->item_list)[item_idx];
157183
if (info->obj != game_obj) {
158184
continue;
159185
}
@@ -199,8 +225,8 @@ refresh_item_names(te_world_inspector* inspector) {
199225
switch (inspector->state) {
200226
case (TE_WIS_SHOW_WORLD_OBJECTS):
201227
case (TE_WIS_SHOW_ATTACH_TO): {
202-
te_world_item_info* data = inspector->item_list;
203-
te_world_item_info* info = &data[item_idx];
228+
te_world_item_info* info =
229+
&((te_world_item_info*)inspector->item_list)[item_idx];
204230
indent = info->indent;
205231
switch (info->type) {
206232
case (TE_WIT_MODEL): {
@@ -628,9 +654,9 @@ world_inspector_select_obj(te_world_inspector* inspector, void* obj) {
628654
bool found = false;
629655
for (unsigned int page_idx = 0; page_idx < inspector->page_count; page_idx++) {
630656
for (unsigned int i = 0; i < inspector->item_buttons_count; i++) {
631-
te_world_item_info* info = &(
632-
(te_world_item_info*)inspector
633-
->item_list)[page_idx * inspector->item_buttons_count + i];
657+
te_world_item_info* info =
658+
&((te_world_item_info*)
659+
inspector->item_list)[page_idx * inspector->item_buttons_count + i];
634660
if (info->obj != selected_info->obj) {
635661
continue;
636662
}
@@ -766,6 +792,7 @@ on_button_list_item_clicked(te_button_widget* button) {
766792
[inspector->current_page * inspector->item_buttons_count + button_index];
767793

768794
const char* type_id = NULL;
795+
void* obj = selected_info->obj;
769796
switch (selected_info->type) {
770797
case (TE_WIT_MODEL): {
771798
type_id = model_get_type_id();
@@ -778,12 +805,12 @@ on_button_list_item_clicked(te_button_widget* button) {
778805
}
779806
case (TE_WIT_WIDGET): {
780807
type_id = widget_get_owner_type_id(selected_info->obj);
808+
obj = widget_get_owner(selected_info->obj);
781809
break;
782810
}
783811
}
784812

785-
property_inspector_show(
786-
inspector->property_inspector, selected_info->obj, type_id);
813+
property_inspector_show(inspector->property_inspector, obj, type_id);
787814
refresh_button_highlight(inspector);
788815
break;
789816
}

src/engine_lib/src/widget/text_edit_widget.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,13 @@ prv_text_edit_widget_despawn_destroy_cursor(te_text_edit_widget* text_edit_widge
152152
abort();
153153
}
154154

155+
if (prv_world_is_being_destroyed(world)) {
156+
// Just disable input, child widgets will be destroyed anyway.
157+
te_window* window = game_manager_get_window(world_get_game_manager(world));
158+
SDL_StopTextInput(prv_window_get_sdl_window(window));
159+
return;
160+
}
161+
155162
// Detach and despawn.
156163
widget_set_parent(rect_widget_get_widget(text_edit_widget->rect_cursor_widget), NULL);
157164
world_despawn_widget(world, rect_widget_get_widget(text_edit_widget->rect_cursor_widget));
@@ -544,6 +551,10 @@ void
544551
text_edit_widget_set_text_height(te_text_edit_widget* text_edit_widget, float height) {
545552
text_edit_widget->text_height = height;
546553
text_widget_set_text_height(text_edit_widget->text_widget, height);
554+
555+
if (text_edit_widget->rect_cursor_widget != NULL) {
556+
prv_text_edit_widget_despawn_destroy_cursor(text_edit_widget);
557+
}
547558
}
548559

549560
float

0 commit comments

Comments
 (0)