Ejemplo n.º 1
0
static int is_submenu_title(menu_t *p_menu, int n)
{
  if (n+1 >= p_menu->n_entries)
    return 0;
  else
    return IS_SUBMENU(p_menu->pp_msgs[n+1]);
}
Ejemplo n.º 2
0
static void select_one(menu_t *p_menu, int sel)
{
	if (sel >= p_menu->n_entries)
		sel = 0;
	p_menu->cur_sel = sel;
	if (p_menu->pp_msgs[p_menu->cur_sel][0] == ' ' ||
			p_menu->pp_msgs[p_menu->cur_sel][0] == '#' ||
			IS_SUBMENU(p_menu->pp_msgs[p_menu->cur_sel]))
		select_next(p_menu, 0, 1 , 1);
}
Ejemplo n.º 3
0
static void select_next(menu_t *p_menu, int dx, int dy)
{
  p_menu->cur_sel = (p_menu->cur_sel + dy) < 0 ? p_menu->n_entries - 1 :
    (p_menu->cur_sel + dy) % p_menu->n_entries;
  int next = (p_menu->cur_sel + dy + 1) < 0 ? p_menu->n_entries - 1 :
    (p_menu->cur_sel + dy + 1) % p_menu->n_entries;

  if (p_menu->pp_msgs[p_menu->cur_sel][0] == ' ' ||
      ( (p_menu->available_options & (1<<p_menu->cur_sel)) == 0) ||
      IS_SUBMENU(p_menu->pp_msgs[p_menu->cur_sel]) )
    select_next(p_menu, dx, dy);
  /* If the next is a submenu */
  if (dx != 0 &&
      IS_SUBMENU(p_menu->pp_msgs[next]))
    {
      submenu_t *p_submenu = find_submenu(p_menu, next);

      p_submenu->sel = (p_submenu->sel + dx) < 0 ? p_submenu->n_entries - 1 :
	(p_submenu->sel + dx) % p_submenu->n_entries;
    }
}
Ejemplo n.º 4
0
static void select_next(menu_t *p_menu, int dx, int dy, int cicle)
{
	int next;

	p_menu->cur_sel = get_next_seq_y(p_menu, p_menu->cur_sel, dy, cicle);
	next = get_next_seq_y(p_menu, p_menu->cur_sel, dy + 1, cicle);
	if (IS_SUBMENU(p_menu->pp_msgs[p_menu->cur_sel])&&(dy!=1)&&(dy!=-1)) p_menu->cur_sel--;
	if (p_menu->pp_msgs[p_menu->cur_sel][0] == ' ' ||
			p_menu->pp_msgs[p_menu->cur_sel][0] == '#' ||
			IS_SUBMENU(p_menu->pp_msgs[p_menu->cur_sel]) )
		select_next(p_menu, dx, dy, cicle);

	/* If the next is a submenu */
	if (dx != 0 && IS_SUBMENU(p_menu->pp_msgs[next]))
	{
		submenu_t *p_submenu = find_submenu(p_menu, next);

		p_submenu->sel = (p_submenu->sel + dx) < 0 ? p_submenu->n_entries - 1 :
		(p_submenu->sel + dx) % p_submenu->n_entries;
	}
	else if (dx == -1 && !strcmp(p_menu->pp_msgs[0], "[..]"))
		p_menu->cur_sel = 0;
}
Ejemplo n.º 5
0
static void menu_draw(menu_t *p_menu)
{
  int16_t x_start = p_menu->x1 + (p_menu->x2 - p_menu->x1) / 2 - p_menu->text_w / 2;
  int16_t y_start = p_menu->y1 + (p_menu->y2 - p_menu->y1) / 2 - p_menu->text_h / 2;
  int i;

  for (i=0; i < p_menu->n_entries; i++)
    {
      char *msg = p_menu->pp_msgs[i];

      if ((p_menu->available_options & (1<<i)) == 0)
	print_font(p_menu->p_font, vRGB(128,128,128), x_start, y_start + i * (p_menu->p_font->height + 2), msg);
      else if (p_menu->cur_sel == i)
	print_font(p_menu->p_font, vRGB(255,255,0), x_start, y_start + i * (p_menu->p_font->height + 2), msg);
      else
	print_font(p_menu->p_font, vRGB(255,255,255), x_start, y_start + i * (p_menu->p_font->height + 2), msg);
      if (IS_SUBMENU(msg))
	{
	  submenu_t *p_submenu = find_submenu(p_menu, i);
	  int n_pipe = 0;
	  int n;

	  DbgPrintf("Submenu!...\n");
	  for (n=0; msg[n] != '\0'; n++)
	    {
	      /* Underline the selected entry */
	      if (msg[n] == '|')
		{
		  int16_t n_chars;

		  for (n_chars = 1; msg[n+n_chars] && msg[n+n_chars] != '|'; n_chars++);

		  n_pipe++;
		  if (p_submenu->sel == n_pipe-1)
		    {
		      vSetForeColor(vRGB(0,255,0));
		      vFillRect(x_start + (n+1) * (p_menu->p_font->width)-1,
				y_start + (i+1) * (p_menu->p_font->height + 2)-1,
				x_start + (n+n_chars) * (p_menu->p_font->width)-1,
				y_start + (i+1) * (p_menu->p_font->height + 2)-1);
		      break;
		    }
		}
	    }
	}
    }
}
Ejemplo n.º 6
0
void menu_init(menu_t *p_menu, VMGPFONT *p_font, char *pp_msgs[],
	       int16_t x1, int16_t y1, int16_t x2, int16_t y2)
{
  int i;
  int j;

  p_menu->pp_msgs = pp_msgs;
  p_menu->p_font = p_font;
  p_menu->x1 = x1;
  p_menu->y1 = y1;
  p_menu->x2 = x2;
  p_menu->y2 = y2;

  p_menu->text_w = 0;
  p_menu->n_submenus = 0;

  for (p_menu->n_entries = 0; p_menu->pp_msgs[p_menu->n_entries]; p_menu->n_entries++)
    {
      int len;

      /* Is this a submenu? */
      if (IS_SUBMENU(p_menu->pp_msgs[p_menu->n_entries]))
	{
	  p_menu->n_submenus++;
	  continue; /* Length of submenus is unimportant */
	}
      for (len = 0; p_menu->pp_msgs[p_menu->n_entries][len]; len++);

      if (len * p_font->width > p_menu->text_w)
	p_menu->text_w = len * p_font->width;
    }
  if ( !(p_menu->p_submenus = vNewPtr(sizeof(submenu_t) * p_menu->n_submenus)) )
    {
      DbgPrintf("vNewPtr failed!\n");
      vTerminateVMGP();
    }

  j=0;
  for (i=0; i<p_menu->n_submenus; i++)
    {

      for (; j < p_menu->n_entries; j++)
	{
	  if (IS_SUBMENU(p_menu->pp_msgs[j]))
	    {
	      int n;

	      DbgPrintf("Init submenu %d:%d\n", i, j);
	      p_menu->p_submenus[i].index = j;
	      p_menu->p_submenus[i].sel = 0;
	      p_menu->p_submenus[i].n_entries = 0;
	      for (n=0; p_menu->pp_msgs[j][n] != '\0'; n++)
		{
		  if (p_menu->pp_msgs[j][n] == '|')
		    p_menu->p_submenus[i].n_entries++;
		}
	    }
	}
    }
  p_menu->text_h = p_menu->n_entries * (p_font->height+2);
}
Ejemplo n.º 7
0
static void menu_init_internal(menu_t *p_menu, const char *title,
		TTF_Font *p_font, const char **pp_msgs,
		int16_t x1, int16_t y1, int16_t x2, int16_t y2)
{
	int submenu;
	int j;

	memset(p_menu, 0, sizeof(menu_t));

	p_menu->pp_msgs = pp_msgs;
	p_menu->p_font = p_font;
	p_menu->x1 = x1;
	p_menu->y1 = y1;
	p_menu->x2 = x2;
	p_menu->y2 = y2;

	p_menu->text_w = 0;
	p_menu->n_submenus = 0;
	strcpy(p_menu->title, title);

	for (p_menu->n_entries = 0; p_menu->pp_msgs[p_menu->n_entries]; p_menu->n_entries++)
	{
		int text_w_font;

		/* Is this a submenu? */
		if (IS_SUBMENU(p_menu->pp_msgs[p_menu->n_entries]))
		{
			p_menu->n_submenus++;
			continue; /* Length of submenus is unimportant */
		}

		if (TTF_SizeText(p_font, p_menu->pp_msgs[p_menu->n_entries], &text_w_font, NULL) != 0)
		{
			write_log("%s\n", TTF_GetError());
			exit(1);
		}
		if (text_w_font > p_menu->text_w)
			p_menu->text_w = text_w_font;
	}
	if (p_menu->text_w > p_menu->x2 - p_menu->x1)
		p_menu->text_w = p_menu->x2 - p_menu->x1;

	if ( !(p_menu->p_submenus = (submenu_t *)malloc(sizeof(submenu_t) * p_menu->n_submenus)) )
	{
		perror("malloc failed!\n");
		exit(1);
	}

	j=0;
	submenu = 0;
	for (; j < p_menu->n_entries; j++)
	{
		if (IS_SUBMENU(p_menu->pp_msgs[j]))
		{
			int n;

			p_menu->p_submenus[submenu].index = j;
			p_menu->p_submenus[submenu].sel = 0;
			p_menu->p_submenus[submenu].n_entries = 0;
			for (n=0; p_menu->pp_msgs[j][n] != '\0'; n++)
			{
				if (p_menu->pp_msgs[j][n] == '|')
					p_menu->p_submenus[submenu].n_entries++;
			}
			submenu++;
		}
	}
	p_menu->text_h = p_menu->n_entries * (TTF_FontHeight(p_font) + TTF_FontHeight(p_font) / 4);
}
Ejemplo n.º 8
0
static void menu_draw(SDL_Surface *screen, menu_t *p_menu, int sel, int font_size)
{
	static SDL_Thread *thread = NULL;  
	quit_thread = 1;
	
	int font_height = TTF_FontHeight(p_menu->p_font);
	int line_height = font_height + font_height/16 +(font_height==24);
	int x_start = p_menu->x1+6/RATIO;
	int y_start = p_menu->y1 + line_height;
	SDL_Rect r;
	int entries_visible = (p_menu->y2 - p_menu->y1 -5) / line_height - 1;

	int i, y;
	
	SDL_Rect r_ext = {p_menu->x1, p_menu->y1,
				p_menu->x2 - p_menu->x1, p_menu->y2 - p_menu->y1+2/RATIO};
	SDL_Rect r_int = {p_menu->x1+4/RATIO, p_menu->y1,
				p_menu->x2 - p_menu->x1-8/RATIO, p_menu->y2 - p_menu->y1-2/RATIO};	
				
	
	SDL_FillRect(screen, &r_ext, SDL_MapRGB(screen->format, 116, 117, 206));
	SDL_BlitSurface(image_window, &r_int, screen, &r_int);
		
	if ( p_menu->n_entries * line_height > p_menu->y2 )
		y_start = p_menu->y1 + line_height;

	if (p_menu->cur_sel - p_menu->start_entry_visible > entries_visible)
	{
		while (p_menu->cur_sel - p_menu->start_entry_visible > entries_visible)
		{
			p_menu->start_entry_visible ++;
			if (p_menu->start_entry_visible > p_menu->n_entries)
			{
				p_menu->start_entry_visible = 0;
				break;
			}
		}
	}
	else if ( p_menu->cur_sel < p_menu->start_entry_visible )
		p_menu->start_entry_visible = p_menu->cur_sel;

	if (strlen(p_menu->title))
	{
		r.x = p_menu->x1;
		r.y = p_menu->y1;
		r.w = p_menu->x2 - p_menu->x1;
		r.h = line_height-1;
		if (sel < 0)
			SDL_FillRect(screen, &r, SDL_MapRGB(screen->format, 0x40, 0x00, 0x00));
		else
			SDL_FillRect(screen, &r, SDL_MapRGB(screen->format, 116, 117, 206)); //Title
		menu_print_font(screen, 255,255,255, p_menu->x1+4/RATIO, p_menu->y1, p_menu->title, font_size);
	}

	for (i = p_menu->start_entry_visible; i <= p_menu->start_entry_visible + entries_visible; i++)
	{
		const char *msg = p_menu->pp_msgs[i];

		if (i >= p_menu->n_entries)
			break;
		if (IS_MARKER(msg))
			p_menu->cur_sel = atoi(&msg[1]);
		else
		{
			y = (i - p_menu->start_entry_visible) * line_height;

			if (sel < 0)
				menu_print_font(screen, 0x40,0x40,0x40,
						x_start, y_start + y, msg, font_size);
			else if (p_menu->cur_sel == i) /* Selected - color */
				{
					if (strlen(msg)<=_MAX_STRING) menu_print_font(screen, 0,128,0,
						x_start, y_start + y, msg, font_size);
					else
					{
						if (thread) SDL_WaitThread(thread, NULL);
						thread_struct.screen=screen;
						thread_struct.x=x_start;
						thread_struct.y=y_start + y;
						thread_struct.msg=msg;
						thread_struct.font_size=font_size;
						quit_thread=0;
						thread = SDL_CreateThread(menu_thread, NULL );
					}
				}
			else if (IS_SUBMENU(msg))
			{
				if (p_menu->cur_sel == i-1) /* Selected - color */
					menu_print_font(screen, 0,128,0,
							x_start, y_start + y, msg, font_size);
				else
					menu_print_font(screen, 20,20,20,
							x_start, y_start + y, msg, font_size);
			}
			else if (msg[0] == '#')
			{
				switch (msg[1])
				{
				case '1':
					menu_print_font(screen, 116,117,206,
							x_start, y_start + y, msg+2, font_size);
					break;
				case '2':
					menu_print_font(screen, 25,0,231,
							x_start, y_start + y, msg+2, font_size);
					break;
				default:
					menu_print_font(screen, 0x40,0x40,0x40,
							x_start, y_start + y, msg, font_size);
					break;							
				}
			}
			else //Not selected
				menu_print_font(screen, 20,20,20,
						x_start, y_start + y, msg, font_size);
			if (IS_SUBMENU(msg))
			{
				submenu_t *p_submenu = find_submenu(p_menu, i);
				int n_pipe = 0;
				int n;

				for (n=0; msg[n] != '\0'; n++)
				{
					/* Underline the selected entry */
					if (msg[n] == '|')
					{
						int16_t n_chars;

						for (n_chars = 1; msg[n+n_chars] && msg[n+n_chars] != '|'; n_chars++);

						n_pipe++;
						if (p_submenu->sel == n_pipe-1)
						{
							int w;
							int h;

							if (TTF_SizeText(p_menu->p_font, "X", &w, &h) < 0)
							{
								fw = w;
								fh = h;
								write_log("%s\n", TTF_GetError());
								exit(1);
							}

							r = (SDL_Rect){ x_start + (n+1) * w, y_start + (i+ 1 - p_menu->start_entry_visible) * line_height -3/RATIO, (n_chars - 1) * w, 2};
							if (p_menu->cur_sel == i-1)
								SDL_FillRect(screen, &r,
										SDL_MapRGB(screen->format, 255,0,0));
							else
								SDL_FillRect(screen, &r,
										SDL_MapRGB(screen->format, 20,20,20));
							break;
						}
					}
				}
			}
		}
	}
}