From 7a46da32d58b0bf2b1302f73c30af8a8e30c3439 Mon Sep 17 00:00:00 2001 From: Yves Rizoud Date: Thu, 24 Jun 2010 19:31:26 +0000 Subject: [PATCH] Support for hexa text input (internal) git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@1522 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- src/buttons.c | 18 +++++++++--------- src/buttons_effects.c | 16 ++++++++-------- src/factory.c | 2 +- src/filesel.c | 6 +++--- src/readline.c | 28 ++++++++++++++++++++-------- src/readline.h | 13 +++++++++++-- src/shade.c | 4 ++-- src/transform.c | 2 +- src/windows.c | 2 +- 9 files changed, 56 insertions(+), 35 deletions(-) diff --git a/src/buttons.c b/src/buttons.c index e5f81ec9..0048b3a7 100644 --- a/src/buttons.c +++ b/src/buttons.c @@ -1080,7 +1080,7 @@ void Button_Settings(void) str[0]='\0'; if (! (old_mouse_k & RIGHT_SIDE)) Num2str(value,str,item.Digits+1); - if (Readline(panel->Pos_X+3+176, panel->Pos_Y+num*SETTING_HEIGHT+(SETTING_HEIGHT-6)/2,str,item.Digits+1,1)) + if (Readline(panel->Pos_X+3+176, panel->Pos_Y+num*SETTING_HEIGHT+(SETTING_HEIGHT-6)/2,str,item.Digits+1,INPUT_TYPE_INTEGER)) { value=atoi(str); if (value256) @@ -4223,7 +4223,7 @@ void Button_Airbrush_menu(void) case 12 : // Delay Num2str(Airbrush_delay,str,2); - Readline(196,39,str,2,1); + Readline(196,39,str,2,INPUT_TYPE_INTEGER); Airbrush_delay=atoi(str); // On corrige le delai if (Airbrush_delay>99) @@ -4237,7 +4237,7 @@ void Button_Airbrush_menu(void) case 13 : // Mono-Flow Num2str(Airbrush_mono_flow,str,2); - Readline(113,24,str,2,1); + Readline(113,24,str,2,INPUT_TYPE_INTEGER); Airbrush_mono_flow=atoi(str); // On corrige le flux if (!Airbrush_mono_flow) @@ -4251,7 +4251,7 @@ void Button_Airbrush_menu(void) case 14 : // Init Num2str(spray_init,str,2); - Readline(113,40,str,2,1); + Readline(113,40,str,2,INPUT_TYPE_INTEGER); spray_init=atoi(str); // On corrige la valeur if (spray_init>=50) @@ -4834,7 +4834,7 @@ void Button_Text() switch(clicked_button) { case 1: // Texte saisi - Readline_ex(50,20,str,29,250,0,0); + Readline_ex(50,20,str,29,250,INPUT_TYPE_STRING,0); preview_is_needed=1; break; @@ -4874,7 +4874,7 @@ void Button_Text() break; case 7: // Taille du texte (nombre) - Readline(222,45,size_buffer,3,1); + Readline(222,45,size_buffer,3,INPUT_TYPE_INTEGER); font_size=atoi(size_buffer); // On corrige les dimensions if (font_size < 1) diff --git a/src/buttons_effects.c b/src/buttons_effects.c index 19870249..f0da5e6b 100644 --- a/src/buttons_effects.c +++ b/src/buttons_effects.c @@ -279,7 +279,7 @@ void Button_Grid_menu(void) { case 3 : Num2str(chosen_X,str,2); - Readline(39,26,str,2,1); + Readline(39,26,str,2,INPUT_TYPE_INTEGER); chosen_X=atoi(str); // On corrige les dimensions if ((!chosen_X) || (chosen_X>80)) @@ -301,7 +301,7 @@ void Button_Grid_menu(void) break; case 4 : Num2str(chosen_Y,str,2); - Readline(39,47,str,2,1); + Readline(39,47,str,2,INPUT_TYPE_INTEGER); chosen_Y=atoi(str); // On corrige les dimensions if ((!chosen_Y) || (chosen_Y>80)) @@ -323,7 +323,7 @@ void Button_Grid_menu(void) break; case 5 : Num2str(dx_selected,str,2); - Readline(97,26,str,2,1); + Readline(97,26,str,2,INPUT_TYPE_INTEGER); dx_selected=atoi(str); // On corrige les dimensions if (dx_selected>79) @@ -338,7 +338,7 @@ void Button_Grid_menu(void) break; case 6 : Num2str(dy_selected,str,2); - Readline(97,47,str,2,1); + Readline(97,47,str,2,INPUT_TYPE_INTEGER); dy_selected=atoi(str); // On corrige les dimensions if (dy_selected>79) @@ -479,7 +479,7 @@ void Button_Smooth_menu(void) Num2str(chosen_matrix[x][y],str,2); Readline(matrix_input[x][y]->Pos_X+2, matrix_input[x][y]->Pos_Y+2, - str,2,1); + str,2,INPUT_TYPE_INTEGER); chosen_matrix[x][y]=atoi(str); Display_cursor(); } @@ -639,7 +639,7 @@ void Button_Colorize_menu(void) { case 1: // Zone de saisie de l'opacité Num2str(chosen_opacity,str,3); - Readline(89,23,str,3,1); + Readline(89,23,str,3,INPUT_TYPE_INTEGER); chosen_opacity=atoi(str); // On corrige le pourcentage if (chosen_opacity>100) @@ -732,7 +732,7 @@ void Button_Tiling_menu(void) if (clicked_button==3) // Zone de saisie du décalage X { Num2str(chosen_offset_x,str,4); - Readline(93,23,str,4,1); + Readline(93,23,str,4,INPUT_TYPE_INTEGER); chosen_offset_x=atoi(str); // On corrige le décalage en X if (chosen_offset_x>=Brush_width) @@ -747,7 +747,7 @@ void Button_Tiling_menu(void) if (clicked_button==4) // Zone de saisie du décalage Y { Num2str(chosen_offset_y,str,4); - Readline(93,37,str,4,1); + Readline(93,37,str,4,INPUT_TYPE_INTEGER); chosen_offset_y=atoi(str); // On corrige le décalage en Y if (chosen_offset_y>=Brush_height) diff --git a/src/factory.c b/src/factory.c index b8244e6d..49bc2bc5 100644 --- a/src/factory.c +++ b/src/factory.c @@ -675,7 +675,7 @@ int L_InputBox(lua_State* L) case CONTROL_INPUT: Sprint_double(str,current_value[setting],decimal_places[setting],0); - Readline_ex(12+max_label_length*8+23, 22+setting*17,str,7,40,3,decimal_places[setting]); + Readline_ex(12+max_label_length*8+23, 22+setting*17,str,7,40,INPUT_TYPE_DECIMAL,decimal_places[setting]); current_value[setting]=atof(str); if (current_value[setting] < min_value[setting]) diff --git a/src/filesel.c b/src/filesel.c index 12c489d7..cd452cda 100644 --- a/src/filesel.c +++ b/src/filesel.c @@ -1368,7 +1368,7 @@ byte Button_Load_or_Save(byte load, T_IO_Context *context) case 7 : // Saisie d'un commentaire pour la sauvegarde if ( (!load) && (Get_fileformat(Main_format)->Comment) ) { - Readline(45,70,context->Comment,32,0); + Readline(45,70,context->Comment,32,INPUT_TYPE_STRING); Display_cursor(); } break; @@ -1377,7 +1377,7 @@ byte Button_Load_or_Save(byte load, T_IO_Context *context) // Save the filename strcpy(save_filename, Selector_filename); - if (Readline(82,48,Selector_filename,27,2)) + if (Readline(82,48,Selector_filename,27,INPUT_TYPE_FILENAME)) { // On regarde s'il faut rajouter une extension. C'est-à-dire s'il // n'y a pas de '.' dans le nom du fichier. @@ -1499,7 +1499,7 @@ byte Button_Load_or_Save(byte load, T_IO_Context *context) strcpy(bookmark_label, Config.Bookmark_label[clicked_button-10]); if (bookmark_label[7]==ELLIPSIS_CHARACTER) bookmark_label[7]='\0'; - if (Readline_ex(bookmark_dropdown[clicked_button-10]->Pos_X+3+10,bookmark_dropdown[clicked_button-10]->Pos_Y+2,bookmark_label,8,8,0,0)) + if (Readline_ex(bookmark_dropdown[clicked_button-10]->Pos_X+3+10,bookmark_dropdown[clicked_button-10]->Pos_Y+2,bookmark_label,8,8,INPUT_TYPE_STRING,0)) strcpy(Config.Bookmark_label[clicked_button-10],bookmark_label); Display_bookmark(bookmark_dropdown[clicked_button-10],clicked_button-10); Display_cursor(); diff --git a/src/readline.c b/src/readline.c index d0292ca6..5770d912 100644 --- a/src/readline.c +++ b/src/readline.c @@ -149,13 +149,17 @@ byte Readline_ex(word x_pos,word y_pos,char * str,byte visible_size,byte max_siz // Si on a commencé à editer par un clic-droit, on vide la chaine. if (Mouse_K==RIGHT_SIDE) str[0]='\0'; - else if (input_type==1 && str[0]!='\0') + else if (input_type==INPUT_TYPE_INTEGER && str[0]!='\0') snprintf(str,10,"%d",atoi(str)); // On tasse la chaine à gauche - else if (input_type==3) + else if (input_type==INPUT_TYPE_DECIMAL) { // Nothing. The caller should have used Sprint_double, with min_positions // at zero, so there's no spaces on the left and no useless 0s on the right. } + else if (input_type==INPUT_TYPE_HEXA) + { + // Nothing. The caller should have initialized a valid hexa number. + } Wait_end_of_click(); Keyboard_click_allowed = 0; @@ -285,15 +289,15 @@ byte Readline_ex(word x_pos,word y_pos,char * str,byte visible_size,byte max_siz is_authorized=0; // On commence par supposer qu'elle est interdite switch(input_type) { - case 0 : // N'importe quelle chaîne: + case INPUT_TYPE_STRING : if (input_key>=' ' && input_key<= 255) is_authorized=1; break; - case 1 : // Nombre + case INPUT_TYPE_INTEGER : if ( (input_key>='0') && (input_key<='9') ) is_authorized=1; break; - case 3: // Decimal number + case INPUT_TYPE_DECIMAL: if ( (input_key>='0') && (input_key<='9') ) is_authorized=1; else if (input_key=='-' && position==0 && str[0]!='-') @@ -301,10 +305,18 @@ byte Readline_ex(word x_pos,word y_pos,char * str,byte visible_size,byte max_siz else if (input_key=='.') is_authorized=1; break; - default : // Nom de fichier + case INPUT_TYPE_FILENAME: // On regarde si la touche est autorisée if ( Valid_character(input_key)) is_authorized=1; + case INPUT_TYPE_HEXA: + if ( (input_key>='0') && (input_key<='9') ) + is_authorized=1; + else if ( (input_key>='A') && (input_key<='F') ) + is_authorized=1; + else if ( (input_key>='a') && (input_key<='f') ) + is_authorized=1; + break; } // End du "switch(input_type)" // Si la touche était autorisée... @@ -350,7 +362,7 @@ affichage: Block(Window_pos_X+(x_pos*Menu_factor_X),Window_pos_Y+(y_pos*Menu_factor_Y), visible_size*(Menu_factor_X<<3),(Menu_factor_Y<<3),BACKGROUND_COLOR); // On raffiche la chaine correctement - if (input_type==1) + if (input_type==INPUT_TYPE_INTEGER) { if (str[0]=='\0') { @@ -359,7 +371,7 @@ affichage: } Print_in_window(x_pos+((max_size-size)<<3),y_pos,str,TEXT_COLOR,BACKGROUND_COLOR); } - else if (input_type==3) + else if (input_type==INPUT_TYPE_DECIMAL) { double value; // Discard extra digits diff --git a/src/readline.h b/src/readline.h index af7e1e62..99e6a2f2 100644 --- a/src/readline.h +++ b/src/readline.h @@ -24,13 +24,22 @@ /// Text input functions. ////////////////////////////////////////////////////////////////////////////// +enum INPUT_TYPE +{ + INPUT_TYPE_STRING=0, ///< Any string + INPUT_TYPE_INTEGER=1, ///< Decimal integer + INPUT_TYPE_FILENAME=2,///< Filename + INPUT_TYPE_DECIMAL=3, ///< Decimal value + INPUT_TYPE_HEXA=4, ///< Hexadecimal integer +}; + /// /// Lets the user input a line of text, exit by Esc or Return. /// @param x_pos Coordinates of input, in window coordinates before scaling. /// @param y_pos Coordinates of input, in window coordinates before scaling. /// @param str The original string value (will be modified, unless user cancels. /// @param visible_size Number of characters visible and editable. -/// @param input_type 0=string, 1=number, 2=filename (255 editable characters) +/// @param input_type one of enum ::INPUT_TYPE /// @return 0 if user cancelled (esc), 1 if accepted (return) byte Readline(word x_pos,word y_pos,char * str,byte visible_size,byte input_type); @@ -41,7 +50,7 @@ byte Readline(word x_pos,word y_pos,char * str,byte visible_size,byte input_type /// @param str The original string value (will be modified, unless user cancels. /// @param visible_size Number of characters visible. /// @param max_size Number of characters editable. -/// @param input_type 0=string, 1=integer, 2=filename (255 editable characters) 3=decimal +/// @param input_type one of enum ::INPUT_TYPE /// @param decimal_places Number of decimal places (used only with decimal type) /// @return 0 if user cancelled (esc), 1 if accepted (return) byte Readline_ex(word x_pos,word y_pos,char * str,byte visible_size,byte max_size, byte input_type, byte decimal_places); diff --git a/src/shade.c b/src/shade.c index 71579428..117bec89 100644 --- a/src/shade.c +++ b/src/shade.c @@ -837,7 +837,7 @@ int Menu_shade(void) case 15 : // Saisie du pas Num2str(Shade_list[Shade_current].Step,str,3); - Readline(276,176,str,3,1); + Readline(276,176,str,3,INPUT_TYPE_INTEGER); temp=atoi(str); // On corrige le pas if (!temp) @@ -1089,7 +1089,7 @@ void Button_Quick_shade_menu(void) case 4 : // Saisie du pas Num2str(Quick_shade_step,str,3); - Readline(42,21,str,3,1); + Readline(42,21,str,3,INPUT_TYPE_INTEGER); temp=atoi(str); // On corrige le pas if (!temp) diff --git a/src/transform.c b/src/transform.c index a59963bc..02a03c72 100644 --- a/src/transform.c +++ b/src/transform.c @@ -273,7 +273,7 @@ void Button_Transform_menu(void) input_button[clicked_button-10]->Pos_Y+2, buffer, 4, - 1)) + INPUT_TYPE_INTEGER)) { // Accept entered value *(input_value[clicked_button-10])=atoi(buffer); diff --git a/src/windows.c b/src/windows.c index 01ca39ba..5fbb7ad2 100644 --- a/src/windows.c +++ b/src/windows.c @@ -1074,7 +1074,7 @@ int Requester_window(char* message, int initial_value) { clicked_button = Window_clicked_button(); if (clicked_button == 1) - Readline(11, 39, str, 4, 1); + Readline(11, 39, str, 4, INPUT_TYPE_INTEGER); if (Key == SDLK_ESCAPE) clicked_button = 2; } while (clicked_button <= 0);