Easily ask the user a choice btw multiple options
This commit is contained in:
		
							parent
							
								
									cd5961ce6f
								
							
						
					
					
						commit
						8b32b5141a
					
				@ -52,6 +52,10 @@
 | 
			
		||||
#include "keycodes.h"
 | 
			
		||||
#include "keyboard.h"
 | 
			
		||||
 | 
			
		||||
#ifndef MIN
 | 
			
		||||
#define MIN(a,b) ((a)<(b)?(a):(b))
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
T_Toolbar_button Buttons_Pool[NB_BUTTONS];
 | 
			
		||||
T_Menu_Bar Menu_bars[MENUBAR_COUNT] =
 | 
			
		||||
  {{MENU_WIDTH,  9, 1, 45, {NULL,NULL,NULL},  20, BUTTON_HIDE }, // Status
 | 
			
		||||
@ -1439,8 +1443,95 @@ int Requester_window(const char* message, int initial_value)
 | 
			
		||||
  return clicked_button==2?-1:atoi(str);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Ask the user to choose between multiple choices
 | 
			
		||||
int Dialog_multiple_choice(const char * title, const T_MultipleChoice * choices, int default_choice)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
  int choice;
 | 
			
		||||
  word window_width = 130, window_height = 70;
 | 
			
		||||
  unsigned int max_len_label = 0;
 | 
			
		||||
  unsigned int max_len_hint = 0;
 | 
			
		||||
  short clicked_button;
 | 
			
		||||
  T_Dropdown_button* dropdown;
 | 
			
		||||
  char hint[38];
 | 
			
		||||
  const char * default_hint = NULL;
 | 
			
		||||
  const char * default_label = "please choose";
 | 
			
		||||
 | 
			
		||||
/// Window that show a warning message and wait for a click on the OK button
 | 
			
		||||
  choice = default_choice;
 | 
			
		||||
  for (i = 0; choices[i].label != NULL; i++)
 | 
			
		||||
  {
 | 
			
		||||
    if (strlen(choices[i].label) > max_len_label)
 | 
			
		||||
      max_len_label = strlen(choices[i].label);
 | 
			
		||||
    if (choices[i].hint != NULL && strlen(choices[i].hint) > max_len_hint)
 | 
			
		||||
      max_len_hint = strlen(choices[i].hint);
 | 
			
		||||
    if (default_choice == choices[i].value)
 | 
			
		||||
    {
 | 
			
		||||
      default_label = choices[i].label;
 | 
			
		||||
      default_hint = choices[i].hint;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  GFX2_Log(GFX2_DEBUG, "max_len_label=%u max_len_hint=%u\n", max_len_label, max_len_hint);
 | 
			
		||||
  if (max_len_hint > 37)  // maximum window width is 320 pixels, so that's 37 characters
 | 
			
		||||
    max_len_hint = 37;
 | 
			
		||||
 | 
			
		||||
  if (max_len_label*8 + 6 + 20 > window_width)
 | 
			
		||||
    window_width = max_len_label*8 + 6 + 20;
 | 
			
		||||
  if (max_len_hint > 0)
 | 
			
		||||
  {
 | 
			
		||||
    window_height += 10;
 | 
			
		||||
    if(max_len_hint*8 + 20 > window_width)
 | 
			
		||||
      window_width = max_len_hint * 8 + 20;
 | 
			
		||||
  }
 | 
			
		||||
  if (window_width > 320)
 | 
			
		||||
    window_width = 320;
 | 
			
		||||
 | 
			
		||||
  Open_window(window_width, window_height, title);
 | 
			
		||||
  Window_set_normal_button(10, window_height-23, 40,14, "OK", 1,1,KEY_o); // 1
 | 
			
		||||
  Window_set_normal_button(window_width-70, window_height-23, 60,14, "Cancel", 1,1,KEY_c); // 2
 | 
			
		||||
  dropdown = Window_set_dropdown_button(10, 21, window_width-20, 14, window_width-20,
 | 
			
		||||
                                        default_label, 1, 0, 1, RIGHT_SIDE|LEFT_SIDE, 0); // 3
 | 
			
		||||
  for (i = 0; choices[i].label != NULL; i++)
 | 
			
		||||
    Window_dropdown_add_item(dropdown, choices[i].value, choices[i].label);
 | 
			
		||||
 | 
			
		||||
  if (default_hint != NULL)
 | 
			
		||||
    Print_in_window(10, 21+18, default_hint, MC_Dark, MC_Light);
 | 
			
		||||
 | 
			
		||||
  Update_window_area(0, 0, window_width, window_height);
 | 
			
		||||
  Display_cursor();
 | 
			
		||||
 | 
			
		||||
  do
 | 
			
		||||
  {
 | 
			
		||||
    clicked_button = Window_clicked_button();
 | 
			
		||||
    if (clicked_button == 3)
 | 
			
		||||
    {
 | 
			
		||||
      choice = Window_attribute2;
 | 
			
		||||
      for (i = 0; choices[i].label != NULL; i++)
 | 
			
		||||
        if (choice == choices[i].value)
 | 
			
		||||
        {
 | 
			
		||||
          memset(hint, ' ', sizeof(hint));
 | 
			
		||||
          hint[max_len_hint] = '\0';
 | 
			
		||||
          if (choices[i].hint != NULL)
 | 
			
		||||
            memcpy(hint, choices[i].hint, MIN(37, strlen(choices[i].hint)));
 | 
			
		||||
          Hide_cursor();
 | 
			
		||||
          Print_in_window(10, 21+18, hint, MC_Dark, MC_Light);
 | 
			
		||||
          Display_cursor();
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else if (Key==KEY_ESCAPE)
 | 
			
		||||
      clicked_button = 2; // Cancel
 | 
			
		||||
    else if (Key==KEY_RETURN)
 | 
			
		||||
      clicked_button = 1; // OK
 | 
			
		||||
  }
 | 
			
		||||
  while (clicked_button <= 0 || clicked_button > 2);
 | 
			
		||||
 | 
			
		||||
  Close_window();
 | 
			
		||||
  Display_cursor();
 | 
			
		||||
  return (clicked_button == 2) ? -1 : choice;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Window that shows a warning message and wait for a click on the OK button
 | 
			
		||||
void Warning_message(const char * message)
 | 
			
		||||
{
 | 
			
		||||
  short clicked_button;
 | 
			
		||||
@ -1467,6 +1558,7 @@ void Warning_message(const char * message)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Window that shows a warning message and waits for a click on the OK button
 | 
			
		||||
///
 | 
			
		||||
/// This has the added advantage of supporting the printf interface.
 | 
			
		||||
void Warning_with_format(const char *template, ...) {
 | 
			
		||||
  va_list arg_ptr;
 | 
			
		||||
@ -1479,8 +1571,8 @@ void Warning_with_format(const char *template, ...) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Window that shows a big message (up to 35x13), and waits for a click on OK.
 | 
			
		||||
/// On call: Cursor must be displayed
 | 
			
		||||
/// On exit: Cursor is displayed
 | 
			
		||||
/// - On call: Cursor must be displayed
 | 
			
		||||
/// - On exit: Cursor is displayed
 | 
			
		||||
void Verbose_message(const char *caption, const char * message )
 | 
			
		||||
{
 | 
			
		||||
  short clicked_button;
 | 
			
		||||
 | 
			
		||||
@ -77,11 +77,20 @@ void Print_coordinates(void);
 | 
			
		||||
void Print_filename(void);
 | 
			
		||||
void Print_counter(short x,short y,const char * str,byte text_color,byte background_color);
 | 
			
		||||
 | 
			
		||||
/** @defgroup dialog Dialog windows
 | 
			
		||||
 * @{ */
 | 
			
		||||
byte Confirmation_box(const char * message);
 | 
			
		||||
void Warning_message(const char * message);
 | 
			
		||||
void Warning_with_format(const char * message, ...);
 | 
			
		||||
void Verbose_message(const char * caption, const char * message);
 | 
			
		||||
int Requester_window(const char* message, int initial_value);
 | 
			
		||||
typedef struct {
 | 
			
		||||
  int value;          ///< integer value
 | 
			
		||||
  const char * label; ///< label for dropdown
 | 
			
		||||
  const char * hint;  ///< optional help text
 | 
			
		||||
} T_MultipleChoice;
 | 
			
		||||
int Dialog_multiple_choice(const char * title, const T_MultipleChoice * choices, int initial_choice);
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
void Display_image_limits(void);
 | 
			
		||||
void Display_all_screen(void);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user