1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2025-12-10 09:32:29 +01:00

Added some of the suggested changes

This commit is contained in:
Duncan Frost
2014-10-15 22:53:12 +01:00
parent 9cb03a9d3e
commit 9a3aeed508
4 changed files with 82 additions and 19 deletions

View File

@@ -1222,6 +1222,11 @@ void game_handle_key_scroll()
if (mainWindow->viewport == NULL)
return;
rct_window *textWindow;
textWindow = window_find_by_id(113, 0);
if (textWindow) return;
scrollX = 0;
scrollY = 0;

View File

@@ -43,6 +43,7 @@ unsigned int gLastKeyPressed;
char* gTextInput;
int gTextInputLength;
int text_input_max_length;
int gTextInputCursorPosition = 0;
static void osinterface_create_window();
static void osinterface_close_window();
@@ -90,9 +91,9 @@ void osinterface_start_text_input(char* buffer, int max_length){
gTextInput = buffer;
}
char* osinterface_stop_text_input(){
void osinterface_stop_text_input(){
SDL_StopTextInput();
return gTextInput;
gTextInput = NULL;
}
/**
@@ -422,8 +423,23 @@ void osinterface_process_messages()
//calling it here will save screenshots even while in main menu
screenshot_check();
}
if (e.key.keysym.sym == SDLK_BACKSPACE && gTextInputLength > 0){
gTextInput[--gTextInputLength] = '\0';
if (e.key.keysym.sym == SDLK_BACKSPACE && gTextInputLength > 0 && gTextInput && gTextInputCursorPosition){
if (gTextInputCursorPosition != text_input_max_length)
memmove(gTextInput + gTextInputCursorPosition - 1, gTextInput + gTextInputCursorPosition, text_input_max_length - gTextInputCursorPosition - 1);
gTextInput[gTextInputLength - 1] = '\0';
gTextInputCursorPosition--;
gTextInputLength--;
}
if (e.key.keysym.sym == SDLK_DELETE && gTextInputLength > 0 && gTextInput && gTextInputCursorPosition != text_input_max_length){
memmove(gTextInput + gTextInputCursorPosition, gTextInput + gTextInputCursorPosition + 1, text_input_max_length - gTextInputCursorPosition - 1);
gTextInput[text_input_max_length - 1] = '\0';
gTextInputLength--;
}
if (e.key.keysym.sym == SDLK_LEFT && gTextInput){
if (gTextInputCursorPosition) gTextInputCursorPosition--;
}
else if (e.key.keysym.sym == SDLK_RIGHT && gTextInput){
if (gTextInputCursorPosition < gTextInputLength) gTextInputCursorPosition++;
}
break;
case SDL_MULTIGESTURE:
@@ -447,11 +463,20 @@ void osinterface_process_messages()
break;
case SDL_TEXTINPUT:
if (gTextInputLength < text_input_max_length){
if (gTextInputLength < text_input_max_length && gTextInput){
char new_char;
if (!(e.text.text[0] & 0x80))
gTextInput[gTextInputLength++] = *e.text.text;
new_char = *e.text.text;
else if (!(e.text.text[0] & 0x20))
gTextInput[gTextInputLength++] = ((e.text.text[0] & 0x1F) << 6) | (e.text.text[1] & 0x3F);
new_char = ((e.text.text[0] & 0x1F) << 6) | (e.text.text[1] & 0x3F);
if (gTextInputLength > gTextInputCursorPosition){
memmove(gTextInput + gTextInputCursorPosition + 1, gTextInput + gTextInputCursorPosition, text_input_max_length - gTextInputCursorPosition - 1);
gTextInput[gTextInputCursorPosition] = new_char;
gTextInputLength++;
}
else gTextInput[gTextInputLength++] = new_char;
gTextInputCursorPosition++;
}
break;
default:

View File

@@ -83,11 +83,10 @@ extern openrct2_cursor gCursorState;
extern const unsigned char *gKeysState;
extern unsigned char *gKeysPressed;
extern unsigned int gLastKeyPressed;
extern char* gTextInput;
extern int gTextInputLength;
extern int gTextInputCursorPosition;
void osinterface_start_text_input(char* buffer, int max_length);
char* osinterface_stop_text_input();
void osinterface_stop_text_input();
void osinterface_init();
void osinterface_process_messages();
void osinterface_draw();

View File

@@ -26,7 +26,7 @@
#include "../localisation/localisation.h"
#define WW 250
#define WH 50
#define WH 90
#define MAX_TEXTINPUT 32
enum WINDOW_TEXT_INPUT_WIDGET_IDX {
@@ -47,6 +47,7 @@ static void window_text_input_emptysub(){}
static void window_text_input_mouseup();
static void window_text_input_paint();
static void window_text_input_text(int key, rct_window* w);
static void window_text_input_update(rct_window* w);
//0x9A3F7C
static void* window_text_input_events[] = {
@@ -56,7 +57,7 @@ static void* window_text_input_events[] = {
window_text_input_emptysub,
window_text_input_emptysub,
window_text_input_emptysub,
window_text_input_emptysub,
window_text_input_update,
window_text_input_emptysub,
window_text_input_emptysub,
window_text_input_emptysub,
@@ -89,7 +90,15 @@ char current_mode = 0;
void window_text_input_open(rct_window* call_w, int call_widget, uint16 title, uint16 description, rct_string_id string_id, uint32 args){
window_close_by_id(113, 0);
rct_window* w = window_create_auto_pos(WW, WH, (uint32*)window_text_input_events, 113, 0);
rct_window* w = window_create(
(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) / 2) - WW / 2,
(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16) / 2) - WH / 2,
WW,
WH,
(uint32*)window_text_input_events,
113,
0);
w->widgets = window_text_input_widgets;
w->enabled_widgets = (1 << 2);
@@ -105,7 +114,7 @@ void window_text_input_open(rct_window* call_w, int call_widget, uint16 title, u
window_init_scroll_widgets(w);
w->colours[0] = 7;
w->colours[1] = 7;
w->colours[2] = 7;
w->colours[2] = 1;
}
/**
@@ -139,14 +148,32 @@ static void window_text_input_paint(){
window_draw_widgets(w, dpi);
int x = w->x + 4;
int y = w->y + 15;
int y = w->y + 25;
gfx_draw_string_left(dpi, string_description, 0, w->colours[1], x, y);
gfx_draw_string_centred(dpi, string_description, w->x + 4 + WW / 2, y, w->colours[1], 0);
y += 15;
y += 25;
gfx_draw_string(dpi, text_input, w->colours[1], x, y);
gfx_fill_rect_inset(dpi, w->x + 4, y, w->x + WW - 4, y + 12, w->colours[1], 0x60);
y += 1;
gfx_draw_string(dpi, text_input, w->colours[2], w->x + 6, y);
char temp_string[32] = { 0 };
memcpy(temp_string, text_input, gTextInputCursorPosition);
int x = w->x + 7 + gfx_get_string_width(temp_string);
int width = 6;
if (gTextInputCursorPosition < strlen(text_input)){
temp_string[1] = '\0';
temp_string[0] = text_input[gTextInputCursorPosition];
width = max(gfx_get_string_width(temp_string) - 2, 4);
}
y += 9;
if ((w->frame_no > 15) && current_mode){
gfx_fill_rect(dpi, x, y, x + width, y, w->colours[1]);
}
}
@@ -166,5 +193,12 @@ static void window_text_input_text(int key, rct_window* w){
RCT2_CALLPROC_X(calling_w->event_handlers[WE_TEXT_INPUT], 0, 0, 1, calling_widget, (int)calling_w, (int)text_input, 0);
}
window_invalidate(w);
}
void window_text_input_update(rct_window* w)
{
w->frame_no++;
if (w->frame_no > 30) w->frame_no = 0;
window_invalidate(w);
}