mirror of
https://github.com/quelsolaar/MergeSource
synced 2025-02-01 09:58:42 -05:00
1698 lines
72 KiB
C
1698 lines
72 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include "seduce.h"
|
|
|
|
extern void sui_text_line_edit_mouse(SeduceRenderFont *font, float size, float spacing, float length, char *text, uint *scroll_start, uint *select_start, uint *select_end, boolean mouse_button, boolean mouse_button_last, float pointer_x);
|
|
extern void sui_text_line_edit_draw(BInputState *input, SeduceRenderFont *font, float pos_x, float pos_y, float size, float spacing, float length, char *text, uint *scroll_start, uint select_start, uint select_end, float red, float green, float blue, float alpha);
|
|
extern void sui_text_box_edit_mouse(char *text, STextBox *boxes, uint box_count, STextBlockMode *modes, uint mode_count, uint *select_start, uint *select_end, boolean mouse_button, boolean mouse_button_last, float pointer_x, float pointer_y);
|
|
extern void sui_text_monospace_edit_mouse(char *text, float pos_x, float pos_y, float character_size, float space_size, float line_size, uint line_count, uint line_length, uint *scroll, uint *select_start, uint *select_end, boolean mouse_button, boolean mouse_button_last, float pointer_x, float pointer_y);
|
|
|
|
|
|
extern void seduce_text_edit_up(char *text, uint *select_start, uint *select_end);
|
|
extern void seduce_text_edit_down(char *text, uint *select_start, uint *select_end);
|
|
extern void seduce_text_edit_forward(char *text, uint *select_start, uint *select_end);
|
|
extern void seduce_text_edit_back(char *text, uint *select_start, uint *select_end);
|
|
extern void seduce_text_edit_delete(char *text, uint length, uint *select_start, uint *select_end, STextBlockMode *modes, uint mode_count);
|
|
extern void seduce_text_edit_end(char *text, uint length, uint *select_start, uint *select_end);
|
|
extern void seduce_text_edit_home(char *text, uint length, uint *select_start, uint *select_end);
|
|
extern void seduce_text_edit_backspace(char *text, uint length, uint *select_start, uint *select_end, STextBlockMode *modes, uint mode_count);
|
|
extern void seduce_text_edit_insert_character(char *text, uint length, uint *select_start, uint *select_end, uint32 character, STextBlockMode *modes, uint mode_count);
|
|
extern void seduce_text_edit_paste(char *text, uint length, uint *select_start, uint *select_end, STextBlockMode *modes, uint mode_count);
|
|
extern void seduce_text_edit_cut(char *text, uint length, uint *select_start, uint *select_end, STextBlockMode *modes, uint mode_count);
|
|
extern void seduce_text_edit_copy(char *text, uint length, uint *select_start, uint *select_end);
|
|
|
|
|
|
typedef struct{
|
|
void *id;
|
|
uint scroll_start;
|
|
uint select_start;
|
|
uint select_end;
|
|
uint pointer_active;
|
|
char *copy;
|
|
uint copy_allocated;
|
|
void *done_func;
|
|
}STextEditState;
|
|
|
|
|
|
|
|
|
|
static STextEditState *seduce_text_state;
|
|
|
|
static uint sui_type_in_cursor = 0;
|
|
static char *sui_type_in_text = 0;
|
|
static char *sui_type_in_copy = 0;
|
|
static char *sui_return_text = 0;
|
|
static void (* sui_type_in_done_func)(void *user, char *text);
|
|
/*
|
|
boolean seduce_text_button(BInputState *input, float pos_x, float pos_y, float center, float size, float spacing, const char *text, float red, float green, float blue, float alpha, float red_select, float green_select, float blue_select, float alpha_select)
|
|
{
|
|
if(input->mode == BAM_DRAW)
|
|
{
|
|
float f, length, brightness = 0;
|
|
uint i;
|
|
length = seduce_text_line_length(NULL, size, spacing, text, -1);
|
|
center *= length;
|
|
for(i = 0; i < input->pointer_count; i++)
|
|
{
|
|
if(sui_box_click_test(input->pointers[i].pointer_x,
|
|
input->pointers[i].pointer_y,
|
|
pos_x - center,
|
|
pos_y - size * 0.5,
|
|
length, size * 2.5))
|
|
{
|
|
if(brightness < 0.3)
|
|
brightness = 0.5;
|
|
if(input->pointers[i].button[0] || input->pointers[i].last_button[0])
|
|
if(sui_box_click_test(input->pointers[i].click_pointer_x[0], input->pointers[i].click_pointer_y[0], pos_x - center, pos_y - size * 0.5, length, size * 2.5))
|
|
brightness = 1.0;
|
|
}
|
|
}
|
|
seduce_text_line_draw(NULL, pos_x - center, pos_y, size, spacing, text,
|
|
red + (red_select - red) * brightness,
|
|
green + (green_select - green) * brightness,
|
|
blue + (blue_select - blue) * brightness,
|
|
alpha + (alpha_select - alpha) * brightness, -1);
|
|
}else if(input->mode == BAM_EVENT)
|
|
{
|
|
float length;
|
|
uint i;
|
|
length = seduce_text_line_length(NULL, size, spacing, text, -1);
|
|
center *= length;
|
|
for(i = 0; i < input->pointer_count; i++)
|
|
if(input->pointers[i].button[0] == TRUE && input->pointers[i].last_button[0] == FALSE)
|
|
if(sui_box_click_test(input->pointers[i].pointer_x, input->pointers[i].pointer_y, pos_x - center, pos_y - size * 0.5, length, size * 2.5) &&
|
|
sui_box_click_test(input->pointers[i].click_pointer_x[0], input->pointers[i].click_pointer_y[0], pos_x - center, pos_y - size * 0.5, length, size * 2.5))
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
*/
|
|
boolean seduce_text_button(BInputState *input, void *id, float pos_x, float pos_y, float center, float size, float spacing, const char *text, float red, float green, float blue, float alpha, float red_select, float green_select, float blue_select, float alpha_select)
|
|
{
|
|
uint i;
|
|
if(input->mode == BAM_DRAW)
|
|
{
|
|
boolean acticve = FALSE;
|
|
float length;
|
|
for(i = 0; i < input->pointer_count; i++)
|
|
if(id == seduce_element_pointer_id(input, i, NULL))
|
|
break;
|
|
acticve = i < input->pointer_count;
|
|
|
|
for(i = 0; i < input->user_count; i++)
|
|
if(id == seduce_element_selected_id(i, NULL, NULL))
|
|
if(betray_button_get(i, BETRAY_BUTTON_FACE_A))
|
|
acticve = TRUE;
|
|
|
|
if(center > 0.001)
|
|
{
|
|
length = seduce_text_line_length(NULL, size, spacing, text, -1);
|
|
pos_x = pos_x - length * center;
|
|
}
|
|
if(acticve)
|
|
length = seduce_text_line_draw(NULL, pos_x, pos_y, size, spacing, text, red_select, green_select, blue_select, alpha_select, -1);
|
|
else
|
|
length = seduce_text_line_draw(NULL, pos_x, pos_y, size, spacing, text, red, green, blue, alpha, -1);
|
|
|
|
seduce_element_add_rectangle(input, id, 0, pos_x, pos_y - size, length, size * 3.0);
|
|
// seduce_element_add_line(input, id, 0, a, b, size * 8.0);
|
|
}
|
|
if(input->mode == BAM_EVENT)
|
|
{
|
|
for(i = 0; i < input->pointer_count; i++)
|
|
if(!input->pointers[i].button[0] && input->pointers[i].last_button[0])
|
|
if(id == seduce_element_pointer_id(input, i, NULL))
|
|
return TRUE;
|
|
for(i = 0; i < input->user_count; i++)
|
|
if(id == seduce_element_selected_id(i, NULL, NULL))
|
|
if(betray_button_get(i, BETRAY_BUTTON_FACE_A))
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// uint seduce_text_button_list(BInputState *input, void *id, float pos_x, float pos_y, float center, float size, float spacing, const char **texts, uint text_count, float red, float green, float blue, float alpha, float red_select, float green_select, float blue_select, float alpha_select);
|
|
|
|
#define SEDUCE_BUTTON_LIST_GAP_SIZE 4.0
|
|
|
|
uint seduce_text_button_list(BInputState *input, void *id, float pos_x, float pos_y, float length, STextBlockAlignmentStyle style, float size, float spacing, float line_size, const char **texts, uint text_count, uint selected, float red, float green, float blue, float alpha, float red_select, float green_select, float blue_select, float alpha_select)
|
|
{
|
|
uint i, part;
|
|
if(text_count > 64)
|
|
{
|
|
printf("Seduce ERROR: seduce_text_button_list called with more then 64 strings of text (%u)", text_count);
|
|
text_count = 64;
|
|
}
|
|
if(input->mode == BAM_DRAW)
|
|
{
|
|
float lengths[64], sum = 0;
|
|
boolean acticve[64] = {FALSE}, colapse = FALSE;
|
|
float x_start, x, a[3], b[3], gap;
|
|
char letter[2] = {0, 0};
|
|
gap = size * SEDUCE_BUTTON_LIST_GAP_SIZE;
|
|
for(i = 0; i < input->pointer_count; i++)
|
|
acticve[i] = FALSE;
|
|
if(selected < text_count)
|
|
acticve[selected] = TRUE;
|
|
for(i = 0; i < input->pointer_count; i++)
|
|
if(id == seduce_element_pointer_id(input, i, &part))
|
|
acticve[part] = TRUE;
|
|
|
|
for(i = 0; i < input->user_count; i++)
|
|
if(id == seduce_element_selected_id(i, NULL, &part))
|
|
if(betray_button_get(i, BETRAY_BUTTON_FACE_A))
|
|
acticve[part] = TRUE;
|
|
|
|
for(i = 0; i < text_count; i++)
|
|
{
|
|
lengths[i] = seduce_text_line_length(NULL, size, spacing, texts[i], -1);
|
|
sum += lengths[i];
|
|
}
|
|
if(gap * (text_count - 1) + sum > length)
|
|
{
|
|
colapse = TRUE;
|
|
sum = 0;
|
|
for(i = 0; i < text_count; i++)
|
|
{
|
|
letter[0] = texts[i][0];
|
|
lengths[i] = seduce_text_line_length(NULL, size, spacing, letter, -1);
|
|
sum += lengths[i];
|
|
}
|
|
}
|
|
switch(style)
|
|
{
|
|
case SEDUCE_TBAS_LEFT :
|
|
x_start = pos_x;
|
|
break;
|
|
case SEDUCE_TBAS_RIGHT :
|
|
x_start = pos_x - sum - gap * (float)(text_count - 1);
|
|
break;
|
|
case SEDUCE_TBAS_CENTER :
|
|
x_start = pos_x - (sum + gap * (float)(text_count - 1)) * 0.5;
|
|
break;
|
|
case SEDUCE_TBAS_STRETCH :
|
|
x_start = pos_x;
|
|
gap = (length - sum) / (float)(text_count - 1);
|
|
break;
|
|
}
|
|
x = x_start;
|
|
for(i = 0; i < text_count; i++)
|
|
{
|
|
a[0] = x;
|
|
a[1] = b[1] = pos_y;
|
|
a[2] = b[2] = 0;
|
|
if(colapse)
|
|
{
|
|
letter[0] = texts[i][0];
|
|
if(acticve[i])
|
|
seduce_text_line_draw(NULL, x, pos_y, size, spacing, letter, red_select, green_select, blue_select, alpha_select, -1);
|
|
else
|
|
seduce_text_line_draw(NULL, x, pos_y, size, spacing, letter, red, green, blue, alpha, -1);
|
|
}else
|
|
{
|
|
if(acticve[i])
|
|
seduce_text_line_draw(NULL, x, pos_y, size, spacing, texts[i], red_select, green_select, blue_select, alpha_select, -1);
|
|
else
|
|
seduce_text_line_draw(NULL, x, pos_y, size, spacing, texts[i], red, green, blue, alpha, -1);
|
|
}
|
|
b[0] = a[0] + lengths[i];
|
|
seduce_element_add_rectangle(input, id, i, x, pos_y - size, lengths[i], size * 3.0);
|
|
// seduce_element_add_line(input, id, i, a, b, size * 4.0);
|
|
x += lengths[i] + gap;
|
|
}
|
|
x = x_start;
|
|
for(i = 0; i < text_count - 1; i++)
|
|
{
|
|
x += lengths[i] + gap * 0.5;
|
|
r_primitive_line_2d(x, pos_y + size * 0.75 - line_size, x, pos_y + size * 0.75 + line_size, red_select, green_select, blue_select, alpha_select);
|
|
x += gap * 0.5;
|
|
}
|
|
r_primitive_line_flush();
|
|
}
|
|
if(input->mode == BAM_EVENT)
|
|
{
|
|
for(i = 0; i < input->pointer_count; i++)
|
|
if(!input->pointers[i].button[0] && input->pointers[i].last_button[0])
|
|
if(id == seduce_element_pointer_id(input, i, &part))
|
|
return part;
|
|
for(i = 0; i < input->user_count; i++)
|
|
if(id == seduce_element_selected_id(i, NULL, &part))
|
|
if(betray_button_get(i, BETRAY_BUTTON_FACE_A))
|
|
return part;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
void seduce_text_edit_init()
|
|
{
|
|
uint i, count;
|
|
count = betray_support_functionality(B_SF_USER_COUNT_MAX);
|
|
seduce_text_state = malloc((sizeof *seduce_text_state) * count);
|
|
for(i = 0; i < count; i++)
|
|
{
|
|
seduce_text_state[i].id = NULL;
|
|
seduce_text_state[i].scroll_start = 0;
|
|
seduce_text_state[i].select_start = 0;
|
|
seduce_text_state[i].select_end = 0;
|
|
seduce_text_state[i].pointer_active = -1;
|
|
seduce_text_state[i].done_func = NULL;
|
|
seduce_text_state[i].copy = NULL;
|
|
seduce_text_state[i].copy_allocated = 0;
|
|
}
|
|
}
|
|
|
|
void seduce_text_activate(uint user_id, void *id, char *text, uint buffer_size, void *done_func, void *user, boolean copy, uint pointer_id)
|
|
{
|
|
char *t;
|
|
uint i;
|
|
if(user_id >= betray_support_functionality(B_SF_USER_COUNT_MAX))
|
|
return;
|
|
seduce_text_state[user_id].pointer_active = pointer_id;
|
|
if(seduce_text_state[user_id].id == id)
|
|
return;
|
|
seduce_text_state[user_id].id = id;
|
|
seduce_text_state[user_id].scroll_start = 0;
|
|
seduce_text_state[user_id].select_start = 0;
|
|
seduce_text_state[user_id].select_end = 0;
|
|
seduce_text_state[user_id].done_func = done_func;
|
|
if(copy)
|
|
{
|
|
if(buffer_size < 32)
|
|
buffer_size = 32;
|
|
t = seduce_text_state[user_id].copy = malloc((sizeof *seduce_text_state[user_id].copy) * buffer_size);
|
|
seduce_text_state[user_id].copy_allocated = buffer_size;
|
|
for(i = 0; text != NULL && i < buffer_size - 1 && text[i] != 0; i++)
|
|
seduce_text_state[user_id].copy[i] = text[i];
|
|
seduce_text_state[user_id].copy[i] = 0;
|
|
}else
|
|
{
|
|
seduce_text_state[user_id].copy = NULL;
|
|
seduce_text_state[user_id].copy_allocated = 0;
|
|
}
|
|
}
|
|
|
|
|
|
void seduce_text_deactivate(uint user_id)
|
|
{
|
|
if(user_id >= betray_support_functionality(B_SF_USER_COUNT_MAX))
|
|
return;
|
|
seduce_text_state[user_id].id = NULL;
|
|
seduce_text_state[user_id].pointer_active = -1;
|
|
if(seduce_text_state[user_id].copy != NULL)
|
|
free(seduce_text_state[user_id].copy);
|
|
seduce_text_state[user_id].copy = NULL;
|
|
}
|
|
|
|
boolean seduce_text_edit_active(void *id)
|
|
{
|
|
uint i, count;
|
|
count = betray_support_functionality(B_SF_USER_COUNT_MAX);
|
|
if(id == NULL)
|
|
{
|
|
for(i = 0; i < count && seduce_text_state[i].id == id; i++);
|
|
return i < count;
|
|
}else
|
|
for(i = 0; i < count; i++)
|
|
if(seduce_text_state[i].id == id)
|
|
return TRUE;
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
// uint seduce_text_block_draw3(float pos_x, float pos_y, float line_size, float height, float line_spacing, STextBlockAlignmentStyle style, const char *text, uint pos, STextBlockMode *modes, uint mode_count)
|
|
/*
|
|
typedef struct{
|
|
float pos_x;
|
|
float pos_y;
|
|
float line_size;
|
|
float height;
|
|
float line_spacing;
|
|
STextBlockAlignmentStyle style;
|
|
}STextBox;
|
|
*/
|
|
|
|
extern void seduce_text_block_select_draw(BInputState *input, float pos_x, float pos_y, float line_size, float height, float line_spacing, STextBlockAlignmentStyle style, const char *text, uint pos, STextBlockMode *modes, uint mode_count, uint select_start, uint select_end);
|
|
|
|
STypeInState seduce_text_box_edit(BInputState *input, void *id, char *text, uint buffer_size, STextBox *boxes, uint box_count, STextBlockMode *modes, uint mode_count)
|
|
{
|
|
float array[12], output[3];
|
|
char *t;
|
|
uint i, j, pos, next, user_count;
|
|
if(input->mode == BAM_DRAW)
|
|
{
|
|
seduce_element_add_surface(input, id);
|
|
for(i = 0; i < box_count; i++)
|
|
seduce_element_add_rectangle(input, id, i, boxes[i].pos_x, boxes[i].pos_y - boxes[i].height, boxes[i].line_size, boxes[i].height);
|
|
|
|
|
|
// seduce_element_add_line(input, id, 0, array, &array[3], size * 2.0);
|
|
|
|
pos = 0;
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(seduce_text_state[i].id == id)
|
|
{
|
|
if(seduce_text_state[i].done_func != NULL)
|
|
t = seduce_text_state[i].copy;
|
|
else
|
|
t = text;
|
|
for(j = 0; j < box_count; j++)
|
|
{
|
|
next = seduce_text_block_draw(boxes[j].pos_x, boxes[j]. pos_y, boxes[j].line_size, boxes[j].height, boxes[j].line_spacing, boxes[j].style, t, pos, modes, mode_count);
|
|
if(seduce_text_state[i].select_start < seduce_text_state[i].select_end)
|
|
seduce_text_block_select_draw(input, boxes[j].pos_x, boxes[j].pos_y, boxes[j].line_size, boxes[j].height, boxes[j].line_spacing, boxes[j].style, t, pos, modes, mode_count, seduce_text_state[i].select_start, seduce_text_state[i].select_end);
|
|
else
|
|
seduce_text_block_select_draw(input, boxes[j].pos_x, boxes[j].pos_y, boxes[j].line_size, boxes[j].height, boxes[j].line_spacing, boxes[j].style, t, pos, modes, mode_count, seduce_text_state[i].select_end, seduce_text_state[i].select_start);
|
|
pos = next;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
if(i == input->user_count)
|
|
{
|
|
for(j = 0; j < box_count; j++)
|
|
pos = seduce_text_block_draw(boxes[j].pos_x, boxes[j]. pos_y, boxes[j].line_size, boxes[j].height, boxes[j].line_spacing, boxes[j].style, text, pos, modes, mode_count);
|
|
}
|
|
}else if(input->mode == BAM_EVENT)
|
|
{
|
|
for(i = 0; i < input->pointer_count; i++)
|
|
if(input->pointers[i].button[0] == TRUE && input->pointers[i].last_button[0] == FALSE)
|
|
if(/*seduce_text_state[input->pointers[i].user_id].id = id &&*/ id == seduce_element_pointer_id(input, i, NULL))
|
|
seduce_text_activate(input->pointers[i].user_id, id, text, buffer_size, NULL, NULL, FALSE, i);
|
|
|
|
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(seduce_text_state[i].pointer_active < input->pointer_count)
|
|
{
|
|
if(seduce_text_state[i].done_func != NULL)
|
|
t = seduce_text_state[i].copy;
|
|
else
|
|
t = text;
|
|
j = seduce_text_state[i].pointer_active;
|
|
if(seduce_element_surface_project(input, id, output, 2, input->pointers[j].pointer_x, input->pointers[j].pointer_y))
|
|
sui_text_box_edit_mouse(t, boxes, box_count, modes, mode_count, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, input->pointers[j].button[0], input->pointers[j].last_button[0], output[0], output[1]);
|
|
if(!input->pointers[j].button[0] && !input->pointers[j].last_button[0])
|
|
seduce_text_state[i].pointer_active = -1;
|
|
}
|
|
}
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(seduce_text_state[i].id == id)
|
|
{
|
|
for(j = 0; j < input->button_event_count; j++)
|
|
{
|
|
if(input->button_event[j].state == TRUE && input->button_event[j].user_id == i)
|
|
{
|
|
if(seduce_text_state[i].done_func != NULL)
|
|
{
|
|
t = seduce_text_state[i].copy;
|
|
buffer_size = seduce_text_state[i].copy_allocated;
|
|
}
|
|
else
|
|
t = text;
|
|
if(input->button_event[j].button == BETRAY_BUTTON_PASTE)
|
|
seduce_text_edit_paste(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, modes, mode_count);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_CUT)
|
|
seduce_text_edit_cut(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, modes, mode_count);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_COPY)
|
|
seduce_text_edit_copy(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_RIGHT)
|
|
seduce_text_edit_forward(t, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_LEFT)
|
|
seduce_text_edit_back(t, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_DELETE)
|
|
seduce_text_edit_delete(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, modes, mode_count);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_END)
|
|
seduce_text_edit_end(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_HOME)
|
|
seduce_text_edit_home(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_BACKSPACE)
|
|
seduce_text_edit_backspace(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, modes, mode_count);
|
|
else if(input->button_event[j].character > 31 && input->button_event[j].character < 256)
|
|
seduce_text_edit_insert_character(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, input->button_event[j].character, modes, mode_count);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for(i = 0; i < input->user_count; i++)
|
|
if(seduce_text_state[i].id == id)
|
|
return S_TIS_ACTIVE;
|
|
return S_TIS_IDLE;
|
|
}
|
|
|
|
extern uint seduce_text_box_draw_monospace(SeduceRenderFont *font, float pos_x, float pos_y, float character_size, float space_size, float line_size, const char *text, uint line_count, uint line_length, uint *scroll, STextBlockMode *modes, uint mode_count);
|
|
extern uint seduce_text_box_draw_monospace_select(BInputState *input, float pos_x, float pos_y, float character_size, float space_size, float line_size, const char *text, uint line_count, uint line_length, uint *scroll, uint select_start, uint select_end);
|
|
extern void seduce_text_monospace_edit_scroll(char *text, uint line_count, uint line_length, uint *scroll, uint curser);
|
|
|
|
|
|
STypeInState seduce_text_monospace_edit(BInputState *input, void *id, char *text, uint buffer_size, void *font, float pos_x, float pos_y, float character_size, float space_size, float line_size, uint line_count, uint line_length, uint *scroll, STextBlockMode *modes, uint mode_count)
|
|
{
|
|
float array[12], output[3];
|
|
char *t;
|
|
uint i, j, k, pos, next, user_count;
|
|
if(input->mode == BAM_DRAW)
|
|
{
|
|
seduce_element_add_surface(input, id);
|
|
seduce_element_add_rectangle(input, id, 0, pos_x, pos_y - line_size * line_count, space_size * line_length, line_size * line_count);
|
|
seduce_text_box_draw_monospace(font, pos_x, pos_y, character_size, space_size, line_size, text, line_count, line_length, scroll, modes, mode_count);
|
|
|
|
pos = 0;
|
|
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(seduce_text_state[i].id == id)
|
|
{
|
|
seduce_text_box_draw_monospace_select(input, pos_x, pos_y, character_size, space_size, line_size, text,line_count, line_length, scroll, seduce_text_state[i].select_start, seduce_text_state[i].select_end);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
}else if(input->mode == BAM_EVENT)
|
|
{
|
|
for(i = 0; i < input->pointer_count; i++)
|
|
if(input->pointers[i].button[0] == TRUE && input->pointers[i].last_button[0] == FALSE)
|
|
if(id == seduce_element_pointer_id(input, i, NULL))
|
|
seduce_text_activate(input->pointers[i].user_id, id, text, buffer_size, NULL, NULL, FALSE, i);
|
|
|
|
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(seduce_text_state[i].pointer_active < input->pointer_count)
|
|
{
|
|
|
|
j = seduce_text_state[i].pointer_active;
|
|
if(seduce_element_surface_project(input, id, output, 2, input->pointers[j].pointer_x, input->pointers[j].pointer_y))
|
|
sui_text_monospace_edit_mouse(text, pos_x, pos_y, character_size, space_size, line_size, line_count, line_length, scroll, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, input->pointers[j].button[0], input->pointers[j].last_button[0], output[0], output[1]);
|
|
if(!input->pointers[j].button[0] && !input->pointers[j].last_button[0])
|
|
seduce_text_state[i].pointer_active = -1;
|
|
}
|
|
}
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(seduce_text_state[i].id == id)
|
|
{
|
|
for(j = 0; j < input->button_event_count; j++)
|
|
{
|
|
if(input->button_event[j].state == TRUE && input->button_event[j].user_id == i)
|
|
{
|
|
if(seduce_text_state[i].done_func != NULL)
|
|
t = seduce_text_state[i].copy;
|
|
else
|
|
t = text;
|
|
if(input->button_event[j].button == BETRAY_BUTTON_SCROLL_DOWN /*_LEFT*/)
|
|
{
|
|
if(scroll[0] != 0)
|
|
scroll[0]--;
|
|
}else if(input->button_event[j].button == BETRAY_BUTTON_SCROLL_UP /*_RIGHT*/)
|
|
{
|
|
scroll[0]++;
|
|
}else
|
|
/* if(input->button_event[j].button == BETRAY_BUTTON_SCROLL_DOWN)
|
|
{
|
|
if(scroll[1] != 0)
|
|
scroll[1]--;
|
|
}else if(input->button_event[j].button == BETRAY_BUTTON_SCROLL_UP)
|
|
{
|
|
uint count = 1;
|
|
scroll[1]++;
|
|
for(k = 0; text[k] != 0; k++)
|
|
{
|
|
if(text[k] == '\n')
|
|
count++;
|
|
}
|
|
if(count <= line_count)
|
|
scroll[1] = 0;
|
|
else if(scroll[1] + line_count > count)
|
|
scroll[1] = count - line_count;
|
|
}else*/
|
|
{
|
|
if(input->button_event[j].button == BETRAY_BUTTON_PASTE)
|
|
seduce_text_edit_paste(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, modes, mode_count);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_CUT)
|
|
seduce_text_edit_cut(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, modes, mode_count);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_COPY)
|
|
seduce_text_edit_copy(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_UP)
|
|
seduce_text_edit_up(t, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_DOWN)
|
|
seduce_text_edit_down(t, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_RIGHT)
|
|
seduce_text_edit_forward(t, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_LEFT)
|
|
seduce_text_edit_back(t, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_DELETE)
|
|
seduce_text_edit_delete(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, modes, mode_count);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_END)
|
|
seduce_text_edit_end(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_HOME)
|
|
seduce_text_edit_home(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_BACKSPACE)
|
|
seduce_text_edit_backspace(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, modes, mode_count);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_TAB)
|
|
seduce_text_edit_insert_character(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, '\t', modes, mode_count);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_RETURN)
|
|
seduce_text_edit_insert_character(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, '\n', modes, mode_count);
|
|
else if(input->button_event[j].character > 31 && input->button_event[j].character < 256)
|
|
seduce_text_edit_insert_character(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, input->button_event[j].character, modes, mode_count);
|
|
if(seduce_text_state[i].select_start == seduce_text_state[i].select_end)
|
|
seduce_text_monospace_edit_scroll(text, line_count, line_length, scroll, seduce_text_state[i].select_start);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for(i = 0; i < input->user_count; i++)
|
|
if(seduce_text_state[i].id == id)
|
|
return S_TIS_ACTIVE;
|
|
return S_TIS_IDLE;
|
|
}
|
|
|
|
|
|
|
|
|
|
STypeInState seduce_text_edit_line(BInputState *input, void *id, SeduceRenderFont *font, char *text, uint buffer_size, float pos_x, float pos_y, float length, float size, char *label, boolean left, void (*done_func)(void *user, char *text), void *user, float red, float green, float blue, float alpha, float active_red, float active_green, float active_blue, float active_alpha)
|
|
{
|
|
float array[6], output[3], right_pad = 0;
|
|
char *t;
|
|
uint i, j, user_count;
|
|
if(!left)
|
|
{
|
|
if(text[0] != 0)
|
|
right_pad = length - seduce_text_line_length(font, size, SEDUCE_T_SPACE, text, -1);
|
|
else
|
|
right_pad = length - seduce_text_line_length(font, size, SEDUCE_T_SPACE, label, -1);
|
|
pos_x += right_pad;
|
|
}
|
|
|
|
if(input->mode == BAM_DRAW)
|
|
{
|
|
seduce_element_add_rectangle(input, id, 0, pos_x - right_pad, pos_y - size, length, size * 3.0);
|
|
seduce_element_add_surface(input, id);
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(seduce_text_state[i].id == id)
|
|
{
|
|
if(seduce_text_state[i].done_func != NULL)
|
|
t = seduce_text_state[i].copy;
|
|
else
|
|
t = text;
|
|
seduce_text_line_draw(NULL, pos_x, pos_y, size, SEDUCE_T_SPACE, &t[seduce_text_state[i].scroll_start], active_red, active_green, active_blue, active_alpha, seduce_text_line_hit_test(font, size, SEDUCE_T_SPACE, &t[seduce_text_state[i].scroll_start], length) + seduce_text_state[i].scroll_start);
|
|
sui_text_line_edit_draw(input, font, pos_x, pos_y, size, SEDUCE_T_SPACE, length, t, &seduce_text_state[i].scroll_start, seduce_text_state[i].select_start, seduce_text_state[i].select_end, active_red, active_green, active_blue, active_alpha);
|
|
break;
|
|
}
|
|
}
|
|
if(i == input->user_count)
|
|
{
|
|
if(label != NULL && (text == NULL || text[0] == 0))
|
|
t = label;
|
|
else
|
|
t = text;
|
|
|
|
for(i = 0; i < input->user_count && id != seduce_element_pointer_id(input, i, NULL); i++);
|
|
|
|
if(i < input->user_count)
|
|
seduce_text_line_draw(font, pos_x, pos_y, size, SEDUCE_T_SPACE, t, active_red, active_green, active_blue, active_alpha, seduce_text_line_hit_test(font, size, SEDUCE_T_SPACE, t, length));
|
|
else
|
|
seduce_text_line_draw(font, pos_x, pos_y, size, SEDUCE_T_SPACE, t, red, green, blue, alpha, seduce_text_line_hit_test(font, size, SEDUCE_T_SPACE, t, length));
|
|
}
|
|
}else if(input->mode == BAM_EVENT)
|
|
{
|
|
for(i = 0; i < input->pointer_count; i++)
|
|
if(input->pointers[i].button[0] == TRUE && input->pointers[i].last_button[0] == FALSE)
|
|
if(/*seduce_text_state[input->pointers[i].user_id].id != id && */id == seduce_element_pointer_id(input, i, NULL))
|
|
seduce_text_activate(input->pointers[i].user_id, id, text, buffer_size, done_func, user, done_func != NULL, i);
|
|
|
|
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(seduce_text_state[i].pointer_active < input->pointer_count && seduce_text_state[i].id == id)
|
|
{
|
|
if(seduce_text_state[i].done_func != NULL)
|
|
t = seduce_text_state[i].copy;
|
|
else
|
|
t = text;
|
|
j = seduce_text_state[i].pointer_active;
|
|
if(seduce_element_surface_project(input, id, output, 2, input->pointers[j].pointer_x, input->pointers[j].pointer_y))
|
|
sui_text_line_edit_mouse(font, size, SEDUCE_T_SPACE, length, t, &seduce_text_state[i].scroll_start, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, input->pointers[j].button[0], input->pointers[j].last_button[0], output[0] - pos_x);
|
|
if(!input->pointers[j].button[0] && !input->pointers[j].last_button[0])
|
|
seduce_text_state[i].pointer_active = -1;
|
|
}
|
|
}
|
|
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(seduce_text_state[i].id == id)
|
|
{
|
|
for(j = 0; j < input->button_event_count; j++)
|
|
{
|
|
if(input->button_event[j].state == TRUE && input->button_event[j].user_id == i)
|
|
{
|
|
if(seduce_text_state[i].done_func != NULL)
|
|
t = seduce_text_state[i].copy;
|
|
else
|
|
t = text;
|
|
if(input->button_event[j].button == BETRAY_BUTTON_PASTE)
|
|
seduce_text_edit_paste(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, NULL, 0);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_CUT)
|
|
seduce_text_edit_cut(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, NULL, 0);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_COPY)
|
|
seduce_text_edit_copy(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_RIGHT)
|
|
seduce_text_edit_forward(t, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_LEFT)
|
|
seduce_text_edit_back(t, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_DELETE)
|
|
seduce_text_edit_delete(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, NULL, 0);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_END)
|
|
seduce_text_edit_end(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_HOME)
|
|
seduce_text_edit_home(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_BACKSPACE)
|
|
seduce_text_edit_backspace(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, NULL, 0);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_RETURN)
|
|
{
|
|
if(seduce_text_state[i].done_func != NULL)
|
|
{
|
|
void (* done_func)(void *user, char *text);
|
|
done_func = seduce_text_state[i].done_func;
|
|
done_func(user, t);
|
|
free(seduce_text_state[i].copy);
|
|
}
|
|
seduce_text_state[i].id = NULL;
|
|
return S_TIS_DONE;
|
|
}
|
|
else if(input->button_event[j].character > 31 && input->button_event[j].character < 256)
|
|
seduce_text_edit_insert_character(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, input->button_event[j].character, NULL, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for(i = 0; i < input->user_count; i++)
|
|
if(seduce_text_state[i].id == id)
|
|
return S_TIS_ACTIVE;
|
|
return S_TIS_IDLE;
|
|
}
|
|
|
|
STypeInState seduce_text_edit_obfuscated(BInputState *input, void *id, char *text, uint buffer_size, float pos_x, float pos_y, float length, float size, char *label, boolean left, void (*done_func)(void *user, char *text), void *user, float red, float green, float blue, float alpha, float active_red, float active_green, float active_blue, float active_alpha)
|
|
{
|
|
float /*array[6], */output[3];
|
|
char *t, *password;
|
|
uint i, j, user_count;
|
|
if(input->mode == BAM_DRAW)
|
|
{
|
|
/* array[0] = pos_x;
|
|
array[1] = pos_y + size * 0.5;
|
|
array[2] = 0;
|
|
array[3] = pos_x + length;
|
|
array[4] = pos_y + size * 0.5;
|
|
array[5] = 0;*/
|
|
// seduce_element_add_line(input, id, 0, array, &array[3], size * 2.0);
|
|
seduce_element_add_rectangle(input, id, 0, pos_x, pos_y - size, length, size * 3.0);
|
|
seduce_element_add_surface(input, id);
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(seduce_text_state[i].id == id)
|
|
{
|
|
if(seduce_text_state[i].done_func != NULL)
|
|
t = seduce_text_state[i].copy;
|
|
else
|
|
t = text;
|
|
for(j = 0; t[j] != 0; j++);
|
|
password = malloc(sizeof *password * ++j);
|
|
for(j = 0; t[j] != 0; j++)
|
|
password[j] = '*';
|
|
password[j] = 0;
|
|
seduce_text_line_draw(NULL, pos_x, pos_y, size, SEDUCE_T_SPACE, &password[seduce_text_state[i].scroll_start], active_red, active_green, active_blue, active_alpha, seduce_text_line_hit_test(NULL, size, SEDUCE_T_SPACE, &t[seduce_text_state[i].scroll_start], length) + seduce_text_state[i].scroll_start);
|
|
sui_text_line_edit_draw(input, NULL, pos_x, pos_y, size, SEDUCE_T_SPACE, length, password, &seduce_text_state[i].scroll_start, seduce_text_state[i].select_start, seduce_text_state[i].select_end, active_red, active_green, active_blue, active_alpha);
|
|
free(password);
|
|
break;
|
|
}
|
|
}
|
|
if(i == input->user_count)
|
|
{
|
|
password = NULL;
|
|
if(label != NULL && text[0] == 0)
|
|
t = label;
|
|
else
|
|
{
|
|
for(j = 0; text[j] != 0; j++);
|
|
password = malloc(sizeof *password * ++j);
|
|
for(j = 0; text[j] != 0; j++)
|
|
password[j] = '*';
|
|
password[j] = 0;
|
|
t = password;
|
|
}
|
|
for(i = 0; i < input->user_count && id != seduce_element_pointer_id(input, i, NULL); i++);
|
|
if(i < input->user_count)
|
|
seduce_text_line_draw(NULL, pos_x, pos_y, size, SEDUCE_T_SPACE, t, active_red, active_green, active_blue, active_alpha, seduce_text_line_hit_test(NULL, size, SEDUCE_T_SPACE, t, length));
|
|
else
|
|
seduce_text_line_draw(NULL, pos_x, pos_y, size, SEDUCE_T_SPACE, t, red, green, blue, alpha, seduce_text_line_hit_test(NULL, size, SEDUCE_T_SPACE, t, length));
|
|
if(password != NULL)
|
|
free(password);
|
|
}
|
|
|
|
}else if(input->mode == BAM_EVENT)
|
|
{
|
|
for(i = 0; i < input->pointer_count; i++)
|
|
if(input->pointers[i].button[0] == TRUE && input->pointers[i].last_button[0] == FALSE)
|
|
if(/*seduce_text_state[input->pointers[i].user_id].id != id && */id == seduce_element_pointer_id(input, i, NULL))
|
|
seduce_text_activate(input->pointers[i].user_id, id, text, buffer_size, done_func, user, done_func != NULL, i);
|
|
|
|
|
|
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(seduce_text_state[i].pointer_active < input->pointer_count && seduce_text_state[i].id == id)
|
|
{
|
|
if(seduce_text_state[i].done_func != NULL)
|
|
t = seduce_text_state[i].copy;
|
|
else
|
|
t = text;
|
|
for(j = 0; t[j] != 0; j++);
|
|
password = malloc(sizeof *password * ++j);
|
|
for(j = 0; t[j] != 0; j++)
|
|
password[j] = '*';
|
|
password[j] = 0;
|
|
j = seduce_text_state[i].pointer_active;
|
|
if(seduce_element_surface_project(input, id, output, 2, input->pointers[j].pointer_x, input->pointers[j].pointer_y))
|
|
sui_text_line_edit_mouse(NULL, size, SEDUCE_T_SPACE, length, password, &seduce_text_state[i].scroll_start, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, input->pointers[j].button[0], input->pointers[j].last_button[0], output[0] - pos_x);
|
|
free(password);
|
|
if(!input->pointers[j].button[0] && !input->pointers[j].last_button[0])
|
|
seduce_text_state[i].pointer_active = -1;
|
|
}
|
|
}
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(seduce_text_state[i].id == id)
|
|
{
|
|
for(j = 0; j < input->button_event_count; j++)
|
|
{
|
|
if(input->button_event[j].state == TRUE && input->button_event[j].user_id == i)
|
|
{
|
|
if(seduce_text_state[i].done_func != NULL)
|
|
t = seduce_text_state[i].copy;
|
|
else
|
|
t = text;
|
|
if(input->button_event[j].button == BETRAY_BUTTON_PASTE)
|
|
seduce_text_edit_paste(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, NULL, 0);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_CUT)
|
|
seduce_text_edit_cut(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, NULL, 0);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_COPY)
|
|
seduce_text_edit_copy(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_RIGHT)
|
|
seduce_text_edit_forward(t, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_LEFT)
|
|
seduce_text_edit_back(t, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_DELETE)
|
|
seduce_text_edit_delete(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, NULL, 0);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_END)
|
|
seduce_text_edit_end(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_HOME)
|
|
seduce_text_edit_home(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_BACKSPACE)
|
|
seduce_text_edit_backspace(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, NULL, 0);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_RETURN)
|
|
{
|
|
if(seduce_text_state[i].done_func != NULL)
|
|
{
|
|
void (* done_func)(void *user, char *text);
|
|
done_func = seduce_text_state[i].done_func;
|
|
done_func(user, t);
|
|
free(seduce_text_state[i].copy);
|
|
}
|
|
seduce_text_state[i].id = NULL;
|
|
return S_TIS_DONE;
|
|
}
|
|
else if(input->button_event[j].character > 31 && input->button_event[j].character < 256)
|
|
seduce_text_edit_insert_character(t, buffer_size, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, input->button_event[j].character, NULL, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for(i = 0; i < input->user_count; i++)
|
|
if(seduce_text_state[i].id == id)
|
|
return S_TIS_ACTIVE;
|
|
return S_TIS_IDLE;
|
|
}
|
|
|
|
STypeInState seduce_text_edit_double(BInputState *input, void *id, SeduceRenderFont *font, double *value, float pos_x, float pos_y, float length, float size, boolean left, void (*done_func)(void *user, double value), void *user, float red, float green, float blue, float alpha, float active_red, float active_green, float active_blue, float active_alpha)
|
|
{
|
|
float /*array[6],*/ output[3];
|
|
char *t, buffer[256];
|
|
uint i, j, k, l, user_count;
|
|
if(input->mode == BAM_DRAW)
|
|
{
|
|
/* array[0] = pos_x;
|
|
array[1] = pos_y + size * 0.5;
|
|
array[2] = 0;
|
|
array[3] = pos_x + length;
|
|
array[4] = pos_y + size * 0.5;
|
|
array[5] = 0;
|
|
seduce_element_add_line(input, id, 0, array, &array[3], size * 2.0);*/
|
|
seduce_element_add_rectangle(input, id, 0, pos_x, pos_y - size, length, size * 3.0);
|
|
seduce_element_add_surface(input, id);
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(seduce_text_state[i].id == id)
|
|
{
|
|
t = seduce_text_state[i].copy;
|
|
seduce_text_line_draw(font, pos_x, pos_y, size, SEDUCE_T_SPACE, &t[seduce_text_state[i].scroll_start], active_red, active_green, active_blue, active_alpha, seduce_text_line_hit_test(font, size, SEDUCE_T_SPACE, &t[seduce_text_state[i].scroll_start], length) + seduce_text_state[i].scroll_start);
|
|
sui_text_line_edit_draw(input, font, pos_x, pos_y, size, SEDUCE_T_SPACE, length, t, &seduce_text_state[i].scroll_start, seduce_text_state[i].select_start, seduce_text_state[i].select_end, active_red, active_green, active_blue, active_alpha);
|
|
break;
|
|
}
|
|
}
|
|
if(i == input->user_count)
|
|
{
|
|
sprintf(buffer, "%f", *value);
|
|
for(j = 0; 0 != buffer[j] && 46 != buffer[j]; j++);
|
|
if(0 != buffer[j])
|
|
{
|
|
int pos;
|
|
pos = -1;
|
|
for(j++; 0 != buffer[j]; j++)
|
|
{
|
|
if(48 == buffer[j])
|
|
pos++;
|
|
else
|
|
pos = 0;
|
|
}
|
|
if(pos > 0)
|
|
buffer[j - pos] = 0;
|
|
}
|
|
for(i = 0; i < input->user_count && id != seduce_element_pointer_id(input, i, NULL); i++);
|
|
if(i < input->user_count)
|
|
seduce_text_line_draw(font, pos_x, pos_y, size, SEDUCE_T_SPACE, buffer, active_red, active_green, active_blue, active_alpha, seduce_text_line_hit_test(font, size, SEDUCE_T_SPACE, buffer, length));
|
|
else
|
|
seduce_text_line_draw(font, pos_x, pos_y, size, SEDUCE_T_SPACE, buffer, red, green, blue, alpha, seduce_text_line_hit_test(font, size, SEDUCE_T_SPACE, buffer, length));
|
|
}
|
|
|
|
}else if(input->mode == BAM_EVENT)
|
|
{
|
|
for(i = 0; i < input->pointer_count; i++)
|
|
{
|
|
if(input->pointers[i].button[0] == TRUE && input->pointers[i].last_button[0] == FALSE)
|
|
{
|
|
if(/*seduce_text_state[input->pointers[i].user_id].id != id && */id == seduce_element_pointer_id(input, i, NULL))
|
|
{
|
|
sprintf(buffer, "%f", *value);
|
|
for(j = 0; 0 != buffer[j] && 46 != buffer[j]; j++);
|
|
if(0 != buffer[j])
|
|
{
|
|
int pos;
|
|
pos = -1;
|
|
for(j++; 0 != buffer[j]; j++)
|
|
{
|
|
if(48 == buffer[j])
|
|
pos++;
|
|
else
|
|
pos = 0;
|
|
}
|
|
if(pos > 0)
|
|
buffer[j - pos] = 0;
|
|
}
|
|
seduce_text_activate(input->pointers[i].user_id, id, buffer, 256, done_func, user, TRUE, i);
|
|
}
|
|
}
|
|
}
|
|
for(i = 0; i < input->user_count; i++)
|
|
if(seduce_text_state[i].id == id)
|
|
for(j = 0; j < input->pointer_count; j++)
|
|
if(input->pointers[j].user_id == i)
|
|
if(seduce_element_surface_project(input, id, output, 2, input->pointers[j].pointer_x, input->pointers[j].pointer_y))
|
|
sui_text_line_edit_mouse(font, size, SEDUCE_T_SPACE, length, seduce_text_state[i].copy, &seduce_text_state[i].scroll_start, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, input->pointers[j].button[0], input->pointers[j].last_button[0], output[0] - pos_x);
|
|
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(seduce_text_state[i].id == id)
|
|
{
|
|
for(j = 0; j < input->button_event_count; j++)
|
|
{
|
|
if(input->button_event[j].state == TRUE && input->button_event[j].user_id == i)
|
|
{
|
|
t = seduce_text_state[i].copy;
|
|
if(input->button_event[j].button == BETRAY_BUTTON_PASTE)
|
|
{
|
|
boolean negative = FALSE;
|
|
boolean period = FALSE;
|
|
|
|
seduce_text_edit_paste(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, NULL, 0);
|
|
for(k = 0; t[k] != 0; k++)
|
|
{
|
|
if(t[k] == '-')
|
|
negative = TRUE;
|
|
if((t[k] <= 47 || t[k] >= 58) && (t[k] != '.' || period))
|
|
{
|
|
l = k;
|
|
seduce_text_edit_delete(t, 256, &k, &l, NULL, 0);
|
|
k--;
|
|
seduce_text_state[i].select_end--;
|
|
}
|
|
if(t[k] != '.')
|
|
period = TRUE;
|
|
}
|
|
if(negative && t[0] != '-')
|
|
{
|
|
uint s = 0, e = 0;
|
|
seduce_text_edit_insert_character(t, 256, &s, &e, '-', NULL, 0);
|
|
seduce_text_state[i].select_start++;
|
|
seduce_text_state[i].select_end++;
|
|
}
|
|
}else if(input->button_event[j].button == BETRAY_BUTTON_CUT)
|
|
seduce_text_edit_cut(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, NULL, 0);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_COPY)
|
|
seduce_text_edit_copy(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_RIGHT)
|
|
seduce_text_edit_forward(t, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_LEFT)
|
|
seduce_text_edit_back(t, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_DELETE)
|
|
seduce_text_edit_delete(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, NULL, 0);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_END)
|
|
seduce_text_edit_end(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_HOME)
|
|
seduce_text_edit_home(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_BACKSPACE)
|
|
seduce_text_edit_backspace(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, NULL, 0);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_RETURN)
|
|
{
|
|
double decimal = 0.1, v;
|
|
v = 0;
|
|
if(t[0] == '-')
|
|
k = 1;
|
|
else
|
|
k = 0;
|
|
for(; t[k] != 0 && t[k] != '.'; k++)
|
|
if(t[k] > 47 && t[k] < 58)
|
|
v = (t[k] - 48) + v * 10.0;
|
|
if(t[k] == '.')
|
|
{
|
|
for(; t[k] != 0; k++)
|
|
{
|
|
if(t[k] > 47 && t[k] < 58)
|
|
{
|
|
v += decimal * (t[k] - 48);
|
|
decimal /= 10.0;
|
|
}
|
|
}
|
|
}
|
|
if(t[0] == '-')
|
|
v = -v;
|
|
if(seduce_text_state[i].done_func != NULL)
|
|
{
|
|
void (* done_func)(void *user, double value);
|
|
done_func = seduce_text_state[i].done_func;
|
|
done_func(user, v);
|
|
free(seduce_text_state[i].copy);
|
|
}else
|
|
*value = v;
|
|
seduce_text_state[i].id = NULL;
|
|
return S_TIS_DONE;
|
|
}
|
|
else if((input->button_event[j].character > 47 &&
|
|
input->button_event[j].character < 58))
|
|
seduce_text_edit_insert_character(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, input->button_event[j].character, NULL, 0);
|
|
else if(input->button_event[j].character == '-' && t[0] != '-')
|
|
{
|
|
uint s = 0, e = 0;
|
|
seduce_text_edit_insert_character(t, 256, &s, &e, '-', NULL, 0);
|
|
seduce_text_state[i].select_start++;
|
|
seduce_text_state[i].select_end++;
|
|
}else if(input->button_event[j].character == '+' && t[0] == '-')
|
|
{
|
|
uint s = 0, e = 0;
|
|
seduce_text_edit_delete(t, 256, &s, &e, NULL, 0);
|
|
if(seduce_text_state[i].select_start > 0)
|
|
seduce_text_state[i].select_start--;
|
|
if(seduce_text_state[i].select_end > 0)
|
|
seduce_text_state[i].select_end--;
|
|
}
|
|
else if(input->button_event[j].character == '.' ||
|
|
input->button_event[j].character == ',')
|
|
{
|
|
uint l;
|
|
for(k = 0; t[k] != 0 && t[k] != '.'; k++);
|
|
if(t[k] == '.')
|
|
{
|
|
l = k;
|
|
seduce_text_edit_delete(t, 256, &l, &k, NULL, 0);
|
|
if(seduce_text_state[i].select_start >= l)
|
|
seduce_text_state[i].select_start--;
|
|
if(seduce_text_state[i].select_end >= l)
|
|
seduce_text_state[i].select_end--;
|
|
}
|
|
seduce_text_edit_insert_character(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, '.', NULL, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for(i = 0; i < input->user_count; i++)
|
|
if(seduce_text_state[i].id == id)
|
|
return S_TIS_ACTIVE;
|
|
return S_TIS_IDLE;
|
|
}
|
|
|
|
|
|
STypeInState seduce_text_edit_float(BInputState *input, void *id, SeduceRenderFont *font, float *value, float pos_x, float pos_y, float length, float size, boolean left, void (*done_func)(void *user, float value), void *user, float red, float green, float blue, float alpha, float active_red, float active_green, float active_blue, float active_alpha)
|
|
{
|
|
float/* array[6], */output[3];
|
|
char *t, buffer[256];
|
|
uint i, j, k, l, user_count;
|
|
if(input->mode == BAM_DRAW)
|
|
{
|
|
/* array[0] = pos_x;
|
|
array[1] = pos_y + size * 0.5;
|
|
array[2] = 0;
|
|
array[3] = pos_x + length;
|
|
array[4] = pos_y + size * 0.5;
|
|
array[5] = 0;
|
|
seduce_element_add_line(input, id, 0, array, &array[3], size * 2.0);*/
|
|
seduce_element_add_rectangle(input, id, 0, pos_x, pos_y - size, length, size * 3.0);
|
|
seduce_element_add_surface(input, id);
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(seduce_text_state[i].id == id)
|
|
{
|
|
t = seduce_text_state[i].copy;
|
|
for(j = 0; t[j] != 0 && j < seduce_text_state[i].scroll_start; j++);
|
|
seduce_text_state[i].scroll_start = j;
|
|
seduce_text_line_draw(font, pos_x, pos_y, size, SEDUCE_T_SPACE, &t[seduce_text_state[i].scroll_start], active_red, active_green, active_blue, active_alpha, seduce_text_line_hit_test(font, size, SEDUCE_T_SPACE, &t[seduce_text_state[i].scroll_start], length) + seduce_text_state[i].scroll_start);
|
|
sui_text_line_edit_draw(input, font, pos_x, pos_y, size, SEDUCE_T_SPACE, length, t, &seduce_text_state[i].scroll_start, seduce_text_state[i].select_start, seduce_text_state[i].select_end, active_red, active_green, active_blue, active_alpha);
|
|
break;
|
|
}
|
|
}
|
|
if(i == input->user_count)
|
|
{
|
|
sprintf(buffer, "%f", *value);
|
|
for(j = 0; 0 != buffer[j] && 46 != buffer[j]; j++);
|
|
if(0 != buffer[j])
|
|
{
|
|
int pos;
|
|
pos = -1;
|
|
for(j++; 0 != buffer[j]; j++)
|
|
{
|
|
if(48 == buffer[j])
|
|
pos++;
|
|
else
|
|
pos = 0;
|
|
}
|
|
if(pos > 0)
|
|
buffer[j - pos] = 0;
|
|
}
|
|
for(i = 0; i < input->user_count && id != seduce_element_pointer_id(input, i, NULL); i++);
|
|
if(i < input->user_count)
|
|
seduce_text_line_draw(font, pos_x, pos_y, size, SEDUCE_T_SPACE, buffer, active_red, active_green, active_blue, active_alpha, seduce_text_line_hit_test(font, size, SEDUCE_T_SPACE, buffer, length));
|
|
else
|
|
seduce_text_line_draw(font, pos_x, pos_y, size, SEDUCE_T_SPACE, buffer, red, green, blue, alpha, seduce_text_line_hit_test(font, size, SEDUCE_T_SPACE, buffer, length));
|
|
}
|
|
|
|
}else if(input->mode == BAM_EVENT)
|
|
{
|
|
for(i = 0; i < input->pointer_count; i++)
|
|
{
|
|
if(input->pointers[i].button[0] == TRUE && input->pointers[i].last_button[0] == FALSE)
|
|
{
|
|
if(/*seduce_text_state[input->pointers[i].user_id].id != id && */id == seduce_element_pointer_id(input, i, NULL))
|
|
{
|
|
sprintf(buffer, "%f", *value);
|
|
for(j = 0; 0 != buffer[j] && 46 != buffer[j]; j++);
|
|
if(0 != buffer[j])
|
|
{
|
|
int pos;
|
|
pos = -1;
|
|
for(j++; 0 != buffer[j]; j++)
|
|
{
|
|
if(48 == buffer[j])
|
|
pos++;
|
|
else
|
|
pos = 0;
|
|
}
|
|
if(pos > 0)
|
|
buffer[j - pos] = 0;
|
|
}
|
|
seduce_text_activate(input->pointers[i].user_id, id, buffer, 256, done_func, user, TRUE, i);
|
|
}
|
|
}
|
|
}
|
|
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(seduce_text_state[i].pointer_active < input->pointer_count && seduce_text_state[i].id == id)
|
|
{
|
|
j = seduce_text_state[i].pointer_active;
|
|
if(seduce_element_surface_project(input, id, output, 2, input->pointers[j].pointer_x, input->pointers[j].pointer_y))
|
|
sui_text_line_edit_mouse(font, size, SEDUCE_T_SPACE, length, seduce_text_state[i].copy, &seduce_text_state[i].scroll_start, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, input->pointers[j].button[0], input->pointers[j].last_button[0], output[0] - pos_x);
|
|
if(!input->pointers[j].button[0] && !input->pointers[j].last_button[0])
|
|
seduce_text_state[i].pointer_active = -1;
|
|
}
|
|
}
|
|
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(seduce_text_state[i].id == id)
|
|
{
|
|
for(j = 0; j < input->button_event_count; j++)
|
|
{
|
|
if(input->button_event[j].state == TRUE && input->button_event[j].user_id == i)
|
|
{
|
|
t = seduce_text_state[i].copy;
|
|
if(input->button_event[j].button == BETRAY_BUTTON_PASTE)
|
|
{
|
|
boolean negative = FALSE;
|
|
boolean period = FALSE;
|
|
|
|
seduce_text_edit_paste(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, NULL, 0);
|
|
for(k = 0; t[k] != 0; k++)
|
|
{
|
|
if(t[k] == '-')
|
|
negative = TRUE;
|
|
if((t[k] <= 47 || t[k] >= 58) && (t[k] != '.' || period))
|
|
{
|
|
l = k;
|
|
seduce_text_edit_delete(t, 256, &k, &l, NULL, 0);
|
|
k--;
|
|
seduce_text_state[i].select_end--;
|
|
}
|
|
if(t[k] != '.')
|
|
period = TRUE;
|
|
}
|
|
if(negative && t[0] != '-')
|
|
{
|
|
uint s = 0, e = 0;
|
|
seduce_text_edit_insert_character(t, 256, &s, &e, '-', NULL, 0);
|
|
seduce_text_state[i].select_start++;
|
|
seduce_text_state[i].select_end++;
|
|
}
|
|
}else if(input->button_event[j].button == BETRAY_BUTTON_CUT)
|
|
seduce_text_edit_cut(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, NULL, 0);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_COPY)
|
|
seduce_text_edit_copy(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_RIGHT)
|
|
seduce_text_edit_forward(t, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_LEFT)
|
|
seduce_text_edit_back(t, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_DELETE)
|
|
seduce_text_edit_delete(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, NULL, 0);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_END)
|
|
seduce_text_edit_end(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_HOME)
|
|
seduce_text_edit_home(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_BACKSPACE)
|
|
seduce_text_edit_backspace(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, NULL, 0);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_RETURN)
|
|
{
|
|
float decimal = 0.1, v;
|
|
v = 0;
|
|
if(t[0] == '-')
|
|
k = 1;
|
|
else
|
|
k = 0;
|
|
for(; t[k] != 0 && t[k] != '.'; k++)
|
|
if(t[k] > 47 && t[k] < 58)
|
|
v = (t[k] - 48) + v * 10.0;
|
|
if(t[k] == '.')
|
|
{
|
|
for(; t[k] != 0; k++)
|
|
{
|
|
if(t[k] > 47 && t[k] < 58)
|
|
{
|
|
v += decimal * (t[k] - 48);
|
|
decimal /= 10.0;
|
|
}
|
|
}
|
|
}
|
|
if(t[0] == '-')
|
|
v = -v;
|
|
if(seduce_text_state[i].done_func != NULL)
|
|
{
|
|
void (* done_func)(void *user, double value);
|
|
done_func = seduce_text_state[i].done_func;
|
|
done_func(user, v);
|
|
free(seduce_text_state[i].copy);
|
|
}else
|
|
*value = v;
|
|
seduce_text_state[i].id = NULL;
|
|
return S_TIS_DONE;
|
|
}
|
|
else if((input->button_event[j].character > 47 &&
|
|
input->button_event[j].character < 58))
|
|
seduce_text_edit_insert_character(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, input->button_event[j].character, NULL, 0);
|
|
else if(input->button_event[j].character == '-' && t[0] != '-')
|
|
{
|
|
uint s = 0, e = 0;
|
|
seduce_text_edit_insert_character(t, 256, &s, &e, '-', NULL, 0);
|
|
seduce_text_state[i].select_start++;
|
|
seduce_text_state[i].select_end++;
|
|
}else if(input->button_event[j].character == '+' && t[0] == '-')
|
|
{
|
|
uint s = 0, e = 0;
|
|
seduce_text_edit_delete(t, 256, &s, &e, NULL, 0);
|
|
if(seduce_text_state[i].select_start > 0)
|
|
seduce_text_state[i].select_start--;
|
|
if(seduce_text_state[i].select_end > 0)
|
|
seduce_text_state[i].select_end--;
|
|
}
|
|
else if(input->button_event[j].character == '.' ||
|
|
input->button_event[j].character == ',')
|
|
{
|
|
uint l;
|
|
for(k = 0; t[k] != 0 && t[k] != '.'; k++);
|
|
if(t[k] == '.')
|
|
{
|
|
l = k;
|
|
seduce_text_edit_delete(t, 256, &l, &k, NULL, 0);
|
|
if(seduce_text_state[i].select_start >= l)
|
|
seduce_text_state[i].select_start--;
|
|
if(seduce_text_state[i].select_end >= l)
|
|
seduce_text_state[i].select_end--;
|
|
}
|
|
seduce_text_edit_insert_character(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, '.', NULL, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for(i = 0; i < input->user_count; i++)
|
|
if(seduce_text_state[i].id == id)
|
|
return S_TIS_ACTIVE;
|
|
return S_TIS_IDLE;
|
|
}
|
|
|
|
STypeInState seduce_text_edit_int(BInputState *input, void *id, SeduceRenderFont *font, int *value, float pos_x, float pos_y, float length, float size, boolean left, void (*done_func)(void *user, int value), void *user, float red, float green, float blue, float alpha, float active_red, float active_green, float active_blue, float active_alpha)
|
|
{
|
|
float /*array[6], */output[3];
|
|
char *t, buffer[256];
|
|
uint i, j, k, l, user_count;
|
|
if(input->mode == BAM_DRAW)
|
|
{
|
|
/* array[0] = pos_x;
|
|
array[1] = pos_y + size * 0.5;
|
|
array[2] = 0;
|
|
array[3] = pos_x + length;
|
|
array[4] = pos_y + size * 0.5;
|
|
array[5] = 0;
|
|
seduce_element_add_line(input, id, 0, array, &array[3], size * 2.0);*/
|
|
seduce_element_add_rectangle(input, id, 0, pos_x, pos_y - size, length, size * 3.0);
|
|
seduce_element_add_surface(input, id);
|
|
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(seduce_text_state[i].id == id)
|
|
{
|
|
t = seduce_text_state[i].copy;
|
|
if(!left)
|
|
pos_x += length - seduce_text_line_length(NULL, size, SEDUCE_T_SPACE, t, -1);
|
|
seduce_text_line_draw(font, pos_x, pos_y, size, SEDUCE_T_SPACE, &t[seduce_text_state[i].scroll_start], active_red, active_green, active_blue, active_alpha, seduce_text_line_hit_test(font, size, SEDUCE_T_SPACE, &t[seduce_text_state[i].scroll_start], length) + seduce_text_state[i].scroll_start);
|
|
sui_text_line_edit_draw(input, font, pos_x, pos_y, size, SEDUCE_T_SPACE, length, t, &seduce_text_state[i].scroll_start, seduce_text_state[i].select_start, seduce_text_state[i].select_end, active_red, active_green, active_blue, active_alpha);
|
|
break;
|
|
}
|
|
}
|
|
if(i == input->user_count)
|
|
{
|
|
sprintf(buffer, "%i", *value);
|
|
if(!left)
|
|
pos_x += length - seduce_text_line_length(font, size, SEDUCE_T_SPACE, buffer, -1);
|
|
for(i = 0; i < input->user_count && id != seduce_element_pointer_id(input, i, NULL); i++);
|
|
if(i < input->user_count)
|
|
seduce_text_line_draw(font, pos_x, pos_y, size, SEDUCE_T_SPACE, buffer, active_red, active_green, active_blue, active_alpha, seduce_text_line_hit_test(font, size, SEDUCE_T_SPACE, buffer, length));
|
|
else
|
|
seduce_text_line_draw(font, pos_x, pos_y, size, SEDUCE_T_SPACE, buffer, red, green, blue, alpha, seduce_text_line_hit_test(font, size, SEDUCE_T_SPACE, buffer, length));
|
|
}
|
|
}else if(input->mode == BAM_EVENT)
|
|
{
|
|
for(i = 0; i < input->pointer_count; i++)
|
|
{
|
|
if(input->pointers[i].button[0] == TRUE && input->pointers[i].last_button[0] == FALSE)
|
|
{
|
|
if(/*seduce_text_state[input->pointers[i].user_id].id != id &&*/ id == seduce_element_pointer_id(input, i, NULL))
|
|
{
|
|
sprintf(buffer, "%i", *value);
|
|
seduce_text_activate(input->pointers[i].user_id, id, buffer, 256, done_func, user, TRUE, i);
|
|
}
|
|
}
|
|
}
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(seduce_text_state[i].pointer_active < input->pointer_count && seduce_text_state[i].id == id)
|
|
{
|
|
j = seduce_text_state[i].pointer_active;
|
|
if(seduce_element_surface_project(input, id, output, 2, input->pointers[j].pointer_x, input->pointers[j].pointer_y))
|
|
sui_text_line_edit_mouse(font, size, SEDUCE_T_SPACE, length, seduce_text_state[i].copy, &seduce_text_state[i].scroll_start, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, input->pointers[j].button[0], input->pointers[j].last_button[0], output[0] - pos_x);
|
|
if(!input->pointers[j].button[0] && !input->pointers[j].last_button[0])
|
|
seduce_text_state[i].pointer_active = -1;
|
|
}
|
|
}
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(seduce_text_state[i].id == id)
|
|
{
|
|
for(j = 0; j < input->button_event_count; j++)
|
|
{
|
|
if(input->button_event[j].state == TRUE && input->button_event[j].user_id == i)
|
|
{
|
|
t = seduce_text_state[i].copy;
|
|
if(input->button_event[j].button == BETRAY_BUTTON_PASTE)
|
|
{
|
|
boolean negative = FALSE;
|
|
seduce_text_edit_paste(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, NULL, 0);
|
|
for(k = 0; t[k] != 0; k++)
|
|
{
|
|
if(t[k] == '-')
|
|
negative = TRUE;
|
|
if(t[k] <= 47 || t[k] >= 58)
|
|
{
|
|
l = k;
|
|
seduce_text_edit_delete(t, 256, &k, &l, NULL, 0);
|
|
k--;
|
|
seduce_text_state[i].select_end--;
|
|
}
|
|
}
|
|
if(negative && t[0] != '-')
|
|
{
|
|
uint s = 0, e = 0;
|
|
seduce_text_edit_insert_character(t, 256, &s, &e, '-', NULL, 0);
|
|
seduce_text_state[i].select_start++;
|
|
seduce_text_state[i].select_end++;
|
|
}
|
|
}else if(input->button_event[j].button == BETRAY_BUTTON_CUT)
|
|
seduce_text_edit_cut(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, NULL, 0);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_COPY)
|
|
seduce_text_edit_copy(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_RIGHT)
|
|
seduce_text_edit_forward(t, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_LEFT)
|
|
seduce_text_edit_back(t, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_DELETE)
|
|
seduce_text_edit_delete(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, NULL, 0);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_END)
|
|
seduce_text_edit_end(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_HOME)
|
|
seduce_text_edit_home(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_BACKSPACE)
|
|
seduce_text_edit_backspace(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, NULL, 0);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_RETURN)
|
|
{
|
|
int decimal = 0.1, v;
|
|
v = 0;
|
|
if(t[0] == '-')
|
|
k = 1;
|
|
else
|
|
k = 0;
|
|
for(; t[k] != 0; k++)
|
|
if(t[k] > 47 && t[k] < 58)
|
|
v = (t[k] - 48) + v * 10;
|
|
if(t[0] == '-')
|
|
v = -v;
|
|
if(seduce_text_state[i].done_func != NULL)
|
|
{
|
|
void (* done_func)(void *user, int value);
|
|
done_func = seduce_text_state[i].done_func;
|
|
done_func(user, v);
|
|
free(seduce_text_state[i].copy);
|
|
}else
|
|
*value = v;
|
|
seduce_text_state[i].id = NULL;
|
|
return S_TIS_DONE;
|
|
}
|
|
else if((input->button_event[j].character > 47 && input->button_event[j].character < 58))
|
|
seduce_text_edit_insert_character(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, input->button_event[j].character, NULL, 0);
|
|
else if(input->button_event[j].character == '-' && t[0] != '-')
|
|
{
|
|
uint s = 0, e = 0;
|
|
seduce_text_edit_insert_character(t, 256, &s, &e, '-', NULL, 0);
|
|
seduce_text_state[i].select_start++;
|
|
seduce_text_state[i].select_end++;
|
|
}else if(input->button_event[j].character == '+' && t[0] == '-')
|
|
{
|
|
uint s = 0, e = 0;
|
|
seduce_text_edit_delete(t, 256, &s, &e, NULL, 0);
|
|
if(seduce_text_state[i].select_start > 0)
|
|
seduce_text_state[i].select_start--;
|
|
if(seduce_text_state[i].select_end > 0)
|
|
seduce_text_state[i].select_end--;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for(i = 0; i < input->user_count; i++)
|
|
if(seduce_text_state[i].id == id)
|
|
return S_TIS_ACTIVE;
|
|
return S_TIS_IDLE;
|
|
}
|
|
|
|
|
|
STypeInState seduce_text_edit_uint(BInputState *input, void *id, SeduceRenderFont *font, uint *value, float pos_x, float pos_y, float length, float size, boolean left, void (*done_func)(void *user, uint value), void *user, float red, float green, float blue, float alpha, float active_red, float active_green, float active_blue, float active_alpha)
|
|
{
|
|
float/* array[6],*/ output[3];
|
|
char *t, buffer[256];
|
|
uint i, j, k, l, user_count;
|
|
if(input->mode == BAM_DRAW)
|
|
{
|
|
/* array[0] = pos_x;
|
|
array[1] = pos_y + size * 0.5;
|
|
array[2] = 0;
|
|
array[3] = pos_x + length;
|
|
array[4] = pos_y + size * 0.5;
|
|
array[5] = 0;
|
|
seduce_element_add_line(input, id, 0, array, &array[3], size * 2.0);*/
|
|
seduce_element_add_rectangle(input, id, 0, pos_x, pos_y - size, length, size * 3.0);
|
|
seduce_element_add_surface(input, id);
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(seduce_text_state[i].id == id)
|
|
{
|
|
t = seduce_text_state[i].copy;
|
|
|
|
if(!left)
|
|
pos_x += length - seduce_text_line_length(NULL, size, SEDUCE_T_SPACE, t, -1);
|
|
seduce_text_line_draw(font, pos_x, pos_y, size, SEDUCE_T_SPACE, &t[seduce_text_state[i].scroll_start], active_red, active_green, active_blue, active_alpha, seduce_text_line_hit_test(font, size, SEDUCE_T_SPACE, &t[seduce_text_state[i].scroll_start], length) + seduce_text_state[i].scroll_start);
|
|
sui_text_line_edit_draw(input, font, pos_x, pos_y, size, SEDUCE_T_SPACE, length, t, &seduce_text_state[i].scroll_start, seduce_text_state[i].select_start, seduce_text_state[i].select_end, active_red, active_green, active_blue, active_alpha);
|
|
break;
|
|
}
|
|
}
|
|
if(i == input->user_count)
|
|
{
|
|
sprintf(buffer, "%u", *value);
|
|
if(!left)
|
|
pos_x += length - seduce_text_line_length(font, size, SEDUCE_T_SPACE, buffer, -1);
|
|
for(i = 0; i < input->user_count && id != seduce_element_pointer_id(input, i, NULL); i++);
|
|
if(i < input->user_count)
|
|
seduce_text_line_draw(font, pos_x, pos_y, size, SEDUCE_T_SPACE, buffer, active_red, active_green, active_blue, active_alpha, seduce_text_line_hit_test(font, size, SEDUCE_T_SPACE, buffer, length));
|
|
else
|
|
seduce_text_line_draw(font, pos_x, pos_y, size, SEDUCE_T_SPACE, buffer, red, green, blue, alpha, seduce_text_line_hit_test(font, size, SEDUCE_T_SPACE, buffer, length));
|
|
}
|
|
|
|
}else if(input->mode == BAM_EVENT)
|
|
{
|
|
for(i = 0; i < input->pointer_count; i++)
|
|
{
|
|
if(input->pointers[i].button[0] == TRUE && input->pointers[i].last_button[0] == FALSE)
|
|
{
|
|
if(/*seduce_text_state[input->pointers[i].user_id].id != id &&*/ id == seduce_element_pointer_id(input, i, NULL))
|
|
{
|
|
sprintf(buffer, "%u", *value);
|
|
seduce_text_activate(input->pointers[i].user_id, id, buffer, 256, done_func, user, TRUE, i);
|
|
}
|
|
}
|
|
}
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(seduce_text_state[i].pointer_active < input->pointer_count && seduce_text_state[i].id == id)
|
|
{
|
|
j = seduce_text_state[i].pointer_active;
|
|
if(seduce_element_surface_project(input, id, output, 2, input->pointers[j].pointer_x, input->pointers[j].pointer_y))
|
|
sui_text_line_edit_mouse(font, size, SEDUCE_T_SPACE, length, seduce_text_state[i].copy, &seduce_text_state[i].scroll_start, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, input->pointers[j].button[0], input->pointers[j].last_button[0], output[0] - pos_x);
|
|
if(!input->pointers[j].button[0] && !input->pointers[j].last_button[0])
|
|
seduce_text_state[i].pointer_active = -1;
|
|
}
|
|
}
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(seduce_text_state[i].id == id)
|
|
{
|
|
for(j = 0; j < input->button_event_count; j++)
|
|
{
|
|
if(input->button_event[j].state == TRUE && input->button_event[j].user_id == i)
|
|
{
|
|
t = seduce_text_state[i].copy;
|
|
if(input->button_event[j].button == BETRAY_BUTTON_PASTE)
|
|
{
|
|
seduce_text_edit_paste(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, NULL, 0);
|
|
for(k = 0; t[k] != 0; k++)
|
|
{
|
|
if(t[k] <= 47 || t[k] >= 58)
|
|
{
|
|
l = k;
|
|
seduce_text_edit_delete(t, 256, &k, &l, NULL, 0);
|
|
k--;
|
|
seduce_text_state[i].select_end--;
|
|
}
|
|
}
|
|
}else if(input->button_event[j].button == BETRAY_BUTTON_CUT)
|
|
seduce_text_edit_cut(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, NULL, 0);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_COPY)
|
|
seduce_text_edit_copy(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_RIGHT)
|
|
seduce_text_edit_forward(t, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_LEFT)
|
|
seduce_text_edit_back(t, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_DELETE)
|
|
seduce_text_edit_delete(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, NULL, 0);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_END)
|
|
seduce_text_edit_end(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_HOME)
|
|
seduce_text_edit_home(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_BACKSPACE)
|
|
seduce_text_edit_backspace(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, NULL, 0);
|
|
else if(input->button_event[j].button == BETRAY_BUTTON_RETURN)
|
|
{
|
|
uint v;
|
|
v = 0;
|
|
k = 0;
|
|
for(; t[k] != 0; k++)
|
|
if(t[k] > 47 && t[k] < 58)
|
|
v = (t[k] - 48) + v * 10;
|
|
if(seduce_text_state[i].done_func != NULL)
|
|
{
|
|
void (* done_func)(void *user, uint value);
|
|
done_func = seduce_text_state[i].done_func;
|
|
done_func(user, v);
|
|
free(seduce_text_state[i].copy);
|
|
}else
|
|
*value = v;
|
|
seduce_text_state[i].id = NULL;
|
|
return S_TIS_DONE;
|
|
}
|
|
else if((input->button_event[j].character > 47 && input->button_event[j].character < 58))
|
|
seduce_text_edit_insert_character(t, 256, &seduce_text_state[i].select_start, &seduce_text_state[i].select_end, input->button_event[j].character, NULL, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for(i = 0; i < input->user_count; i++)
|
|
if(seduce_text_state[i].id == id)
|
|
return S_TIS_ACTIVE;
|
|
return S_TIS_IDLE;
|
|
}
|
|
|
|
|
|
void sui_text_double_edit_print(double value, char *buffer)
|
|
{
|
|
uint i;
|
|
sprintf(buffer, "%f", value);
|
|
for(i = 0; buffer[i] != 0; i++);
|
|
for(i--; i > 0 && buffer[i] == '0'; i--);
|
|
if(buffer[i] == '.')
|
|
{
|
|
buffer[i + 1] = '0';
|
|
buffer[i + 2] = 0;
|
|
}else
|
|
buffer[i + 1] = 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
STextBlockMode *seduce_text_block_set_mode(BInputState *input, void *id, uint user_id, STextBlockMode *blocks, uint *block_count, uint *block_allocated, void *font, float red, float green, float blue, float alpha, float letter_size, float letter_spacing)
|
|
{
|
|
uint select_start = -1, select_end;
|
|
STextBlockMode pre;
|
|
uint i, start_block, end_block;
|
|
int dif;
|
|
|
|
if(id != NULL)
|
|
{
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(seduce_text_state[i].id == id)
|
|
{
|
|
select_start = seduce_text_state[i].select_start;
|
|
select_end = seduce_text_state[i].select_end;
|
|
break;
|
|
}
|
|
}
|
|
if(select_start == -1)
|
|
{
|
|
if(input->user_count > user_id && seduce_text_state[i].id != NULL)
|
|
{
|
|
select_start = seduce_text_state[user_id].select_start;
|
|
select_end = seduce_text_state[user_id].select_end;
|
|
}else
|
|
return blocks;
|
|
}
|
|
}
|
|
|
|
if(select_start > select_end)
|
|
{
|
|
i = select_start;
|
|
select_start = select_end;
|
|
select_end = i;
|
|
}
|
|
|
|
for(start_block = 0; start_block < *block_count && blocks[start_block].character_position < select_start; start_block++);
|
|
for(end_block = 0; end_block < *block_count && blocks[end_block].character_position < select_end; end_block++);
|
|
|
|
if(end_block > 0)
|
|
{
|
|
if(blocks[end_block].character_position == select_end)
|
|
pre = blocks[end_block];
|
|
else
|
|
pre = blocks[end_block - 1];
|
|
}else
|
|
pre = blocks[0];
|
|
|
|
dif = start_block - end_block;
|
|
if(blocks[start_block].character_position != select_start)
|
|
{
|
|
dif++;
|
|
}
|
|
if(end_block >= *block_count || blocks[end_block].character_position >= select_end)
|
|
dif++;
|
|
if(dif < 0)
|
|
{
|
|
*block_count += dif;
|
|
for(i = start_block; i < *block_count; i++)
|
|
blocks[i] = blocks[(int)i - dif];
|
|
}
|
|
|
|
if(dif > 0)
|
|
{
|
|
*block_count += dif;
|
|
if(*block_count > *block_allocated)
|
|
{
|
|
*block_allocated += 16;
|
|
blocks = realloc(blocks, (sizeof *blocks) * *block_allocated);
|
|
}
|
|
for(i = *block_count - 1; start_block != i; i--)
|
|
blocks[i] = blocks[(int)i - dif];
|
|
|
|
}
|
|
blocks[start_block].character_position = select_start;
|
|
blocks[start_block].font = font;
|
|
blocks[start_block].red = red;
|
|
blocks[start_block].green = green;
|
|
blocks[start_block].blue = blue;
|
|
blocks[start_block].alpha = alpha;
|
|
blocks[start_block].letter_size = letter_size;
|
|
blocks[start_block].letter_spacing = letter_spacing;
|
|
blocks[start_block + 1] = pre;
|
|
blocks[start_block + 1].character_position = select_end;
|
|
return blocks;
|
|
}
|
|
|
|
|
|
|