shithub: qk2

ref: ed82668431413cf8d5389a631cad56a6c4d2d6da
dir: /plan9/menu.c/

View raw version
#include <u.h>
#include <libc.h>
#include <stdio.h>
#include "../q_shared.h"

extern void M_PopMenu(void);

static menuframework_s vmenu;
static menuslider_s ssizeslide, gammaslide;
static menulist_s fullscrbox;
static menuaction_s applyaction, defaultsaction;


void
vmssize(void *s)
{
	Cvar_SetValue("viewsize", ((menuslider_s *)s)->curvalue * 10);
}

void
vmgamma(void *s)
{
	// invert sense so greater = brighter, and scale to a range of 0.5 to 1.3
	Cvar_SetValue("vid_gamma", 0.8 - (((menuslider_s *)s)->curvalue/10.0 - 0.5) + 0.5);
}

void
vmreset(void *)
{
	VID_MenuInit();
}

void
vmapply(void *)
{
	Cvar_SetValue("vid_gamma", 0.8 - (gammaslide.curvalue/10.0 - 0.5) + 0.5);
	Cvar_SetValue("vid_fullscreen", fullscrbox.curvalue);
	M_ForceMenuOff();
}

void
VID_MenuInit(void)
{
	static char *yesno[] = {"no", "yes", nil};

	if(!scr_viewsize)
		scr_viewsize = Cvar_Get("viewsize", "100", CVAR_ARCHIVE);
	ssizeslide.curvalue = scr_viewsize->value/10;

	vmenu.x = vid.width * 0.50;
	vmenu.nitems = 0;

	ssizeslide.generic.type = MTYPE_SLIDER;
	ssizeslide.generic.x = 0;
	ssizeslide.generic.y = 20;
	ssizeslide.generic.name = "screen size";
	ssizeslide.minvalue = 3;
	ssizeslide.maxvalue = 12;
	ssizeslide.generic.callback = vmssize;

	gammaslide.generic.type = MTYPE_SLIDER;
	gammaslide.generic.x = 0;
	gammaslide.generic.y = 30;
	gammaslide.generic.name = "gamma";
	gammaslide.generic.callback = vmgamma;
	gammaslide.minvalue = 5;
	gammaslide.maxvalue = 13;
	gammaslide.curvalue = (1.3 - vid_gamma->value + 0.5) * 10;

	fullscrbox.generic.type = MTYPE_SPINCONTROL;
	fullscrbox.generic.x = 0;
	fullscrbox.generic.y = 40;
	fullscrbox.generic.name = "fullscreen";
	fullscrbox.itemnames = yesno;
	fullscrbox.curvalue = vid_fullscreen->value;

	defaultsaction.generic.type = MTYPE_ACTION;
	defaultsaction.generic.name = "reset to default";
	defaultsaction.generic.x = 0;
	defaultsaction.generic.y = 90;
	defaultsaction.generic.callback = vmreset;

	applyaction.generic.type = MTYPE_ACTION;
	applyaction.generic.name = "apply";
	applyaction.generic.x = 0;
	applyaction.generic.y = 100;
	applyaction.generic.callback = vmapply;

	Menu_AddItem(&vmenu, (void *)&ssizeslide);
	Menu_AddItem(&vmenu, (void *)&gammaslide);
	Menu_AddItem(&vmenu, (void *)&fullscrbox);
	Menu_AddItem(&vmenu, (void *)&defaultsaction);
	Menu_AddItem(&vmenu, (void *)&applyaction);

	Menu_Center(&vmenu);
	vmenu.x -= 8;
}

void
VID_MenuDraw(void)
{
	int w, h;

	Draw_GetPicSize(&w, &h, "m_banner_video");
	Draw_Pic(vid.width/2 - w/2, vid.height/2 - 110, "m_banner_video");
	Menu_AdjustCursor(&vmenu, 1);	// starting position
	Menu_Draw(&vmenu);
}

char *VID_MenuKey (int key)
{
	static char *sound = "misc/menu1.wav";

	switch(key){
	case K_ESCAPE:
		M_PopMenu();
		return NULL;
	case K_UPARROW:
		vmenu.cursor--;
		Menu_AdjustCursor(&vmenu, -1);
		break;
	case K_DOWNARROW:
		vmenu.cursor++;
		Menu_AdjustCursor(&vmenu, 1);
		break;
	case K_LEFTARROW:
		Menu_SlideItem(&vmenu, -1);
		break;
	case K_RIGHTARROW:
		Menu_SlideItem(&vmenu, 1);
		break;
	case K_ENTER:
		Menu_SelectItem(&vmenu);
		break;
	}
	return sound;
}