Files
Cesarus85--mjolnir-vr/source/dialogs/edit_text.c
T
Berthalamewandpunpckhdq eb93ce635e wip objects.c work (#12)
* wip objects.c work

* objects_disconnect_from_structure_bsp

* match more functions

* more objects work

* objects_update work

- 93.42% matching

* match matrix4x3_transform_point

* more objects work

- fix duplicate symbol name at 1870800

* match object_choose_random_change_colors

* match object_update

* objects_garbage_collection work

* match object_set_position

* more object work

* match objects_update

* more object work

* match object_select_random_region_permutations_by_variant

* objects_in_sphere work

99.90% match

* object name list calls

* match objects_in_sphere

* misc matches

* match structure_bsp_definitions object

* match objects_in_clusters_by_indices

* more object work

* match `edit_text_handle_key`

* mark edit_text as matching

* misc changes

- match get_next_character
- match data section in objects.c

* object_export_function_values work

* match object_compute_function_values

* match object_get_orientation

* added functions and adjust formatting

* fix profile macros

* formatting changes

* more formatting

* more formatting

---------

Co-authored-by: punpckhdq <121350336+punpckhdq@users.noreply.github.com>
2026-02-15 01:05:45 +00:00

250 lines
5.9 KiB
C

/*
EDIT_TEXT.C
symbols in this file:
00085920 0080:
_code_00085920 (0000)
000859A0 0070:
_edit_text_selection_reset (0000)
00085A10 00a0:
_edit_text_get_selection_indices (0000)
00085AB0 0060:
_edit_text_new (0000)
00085B10 0340:
_edit_text_handle_key (0000)
00259730 0016:
??_C@_0BG@FJHACPE@valid_edit_text?$CIedit?$CJ?$AA@ (0000)
00259748 0023:
??_C@_0CD@CHJIFMCD@c?3?2halo?2SOURCE?2dialogs?2edit_text@ (0000)
*/
/* ---------- headers */
#include "cseries.h"
#include "edit_text.h"
#include "input/input.h"
#include "text/international_strings.h"
/* ---------- constants */
/* ---------- macros */
/* ---------- structures */
/* ---------- prototypes */
static void edit_text_fix_selection(struct edit_text *edit);
/* ---------- globals */
/* ---------- public code */
void edit_text_new(
struct edit_text *edit)
{
match_assert("c:\\halo\\SOURCE\\dialogs\\edit_text.c", 25, valid_edit_text(edit));
edit_text_selection_reset(edit);
return;
}
void edit_text_handle_key(
struct edit_text *edit,
struct key_stroke const *key)
{
boolean backspace;
match_assert("c:\\halo\\SOURCE\\dialogs\\edit_text.c", 35, valid_edit_text(edit));
edit_text_fix_selection(edit);
if (key->key_code==_key_backspace)
{
backspace= TRUE;
}
if (key->key_code==_key_backspace ||
key->key_code==_key_delete)
{
short selection_end;
short selection_start;
if (edit_text_get_selection_indices(
edit,
&selection_start,
&selection_end))
{
memmove(
&edit->buffer[selection_start],
&edit->buffer[selection_end],
strlen(&edit->buffer[selection_end])+1);
edit->insertion_point_index= selection_start;
edit->selection_start_index= NONE;
}
else if (key->key_code==_key_backspace &&
edit->insertion_point_index > 0)
{
short src_index= edit->insertion_point_index;
get_previous_character(
(unsigned char *)edit->buffer,
&edit->insertion_point_index);
memmove(
&edit->buffer[edit->insertion_point_index],
&edit->buffer[src_index],
strlen(&edit->buffer[src_index])+1);
}
else if (key->key_code == _key_delete)
{
if (edit->insertion_point_index < strlen(edit->buffer))
{
short next_index= edit->insertion_point_index;
get_next_character(
(unsigned char *)edit->buffer,
&next_index
);
memmove(
&edit->buffer[edit->insertion_point_index],
&edit->buffer[next_index],
strlen(&edit->buffer[next_index])+1);
}
}
}
else if (
key->key_code==_key_left_arrow ||
key->key_code==_key_right_arrow)
{
short selection_end;
short selection_start;
if (TEST_FLAG(key->modifier_flags, 0) ||
!edit_text_get_selection_indices(
edit,
&selection_start,
&selection_end))
{
if (TEST_FLAG(key->modifier_flags, 0) && edit->selection_start_index==NONE)
{
edit->selection_start_index= edit->insertion_point_index;
}
if (key->key_code==_key_left_arrow && edit->insertion_point_index>0)
{
get_previous_character(
(unsigned char *)edit->buffer,
&edit->insertion_point_index);
}
else if (key->key_code==_key_right_arrow)
{
if (edit->insertion_point_index<strlen(edit->buffer))
{
get_next_character(
(unsigned char *)edit->buffer,
&edit->insertion_point_index);
}
}
if (edit->selection_start_index==edit->insertion_point_index)
{
edit->selection_start_index= NONE;
}
}
else
{
if (key->key_code==_key_left_arrow)
{
edit->insertion_point_index= selection_start;
edit->selection_start_index= NONE;
}
else
{
edit->insertion_point_index= selection_end;
edit->selection_start_index= NONE;
}
}
}
else if (key->ascii_code && key->ascii_code!=(byte)NONE)
{
short selection_end;
short selection_start;
if (edit_text_get_selection_indices(
edit,
&selection_start,
&selection_end))
{
memmove(
&edit->buffer[selection_start+1],
&edit->buffer[selection_end],
strlen(&edit->buffer[selection_end])+1);
edit->insertion_point_index= selection_start;
edit->selection_start_index= NONE;
edit->buffer[edit->insertion_point_index++]= key->ascii_code;
}
else if (strlen(edit->buffer)<edit->maximum_length)
{
memmove(
&edit->buffer[edit->insertion_point_index+1],
&edit->buffer[edit->insertion_point_index],
strlen(&edit->buffer[edit->insertion_point_index])+1);
edit->buffer[edit->insertion_point_index++]= key->ascii_code;
}
}
align_to_character(
(unsigned char *)edit->buffer,
&edit->insertion_point_index);
return;
}
boolean edit_text_get_selection_indices(struct edit_text *edit, short *start_index, short *end_index)
{
boolean result= FALSE;
match_assert("c:\\halo\\SOURCE\\dialogs\\edit_text.c", 174, valid_edit_text(edit));
edit_text_fix_selection(edit);
if (edit->selection_start_index != NONE)
{
*start_index= edit->selection_start_index > edit->insertion_point_index ? edit->insertion_point_index : edit->selection_start_index;
*end_index= edit->selection_start_index > edit->insertion_point_index ? edit->selection_start_index : edit->insertion_point_index;
result= TRUE;
}
return result;
}
void edit_text_selection_reset(
struct edit_text *edit)
{
match_assert("c:\\halo\\SOURCE\\dialogs\\edit_text.c", 159, valid_edit_text(edit));
edit_text_fix_selection(edit);
edit->insertion_point_index= (short)strlen(edit->buffer);
edit->selection_start_index= NONE;
return;
}
/* ---------- private code */
static void edit_text_fix_selection(
struct edit_text *edit)
{
short length= (short)strlen(edit->buffer);
edit->insertion_point_index= PIN(edit->insertion_point_index, 0, length);
edit->selection_start_index= PIN(edit->selection_start_index, NONE, length);
if (edit->insertion_point_index == edit->selection_start_index)
{
edit->selection_start_index= NONE;
}
align_to_character((unsigned char *)edit->buffer, &edit->insertion_point_index);
if (edit->selection_start_index != NONE)
{
align_to_character((unsigned char*)edit->buffer, &edit->selection_start_index);
}
return;
}