[Add] Added options menu for audio and faders.

This commit is contained in:
Allanis 2014-04-08 23:48:35 +01:00
parent 6a65458f90
commit f8701e4bdc
5 changed files with 270 additions and 6 deletions

View File

@ -45,7 +45,7 @@
#define DEATH_WIDTH 130 /**< Death menu width. */
#define DEATH_HEIGHT 150 /**< Death menu height. */
#define OPTIONS_WIDTH 249 /**< Options menu width. */
#define OPTIONS_WIDTH 260 /**< Options menu width. */
#define OPTIONS_HEIGHT 90 /**< Options menu height. */
#define BUTTON_WIDTH 90 /**< Button width, standard across menus. */
@ -647,6 +647,9 @@ void menu_options(void) {
window_addButton(wid, -20 - (BUTTON_WIDTH+20), 20,
BUTTON_WIDTH, BUTTON_HEIGHT,
"btnKeybinds", "Keybindings", (void(*)(unsigned int,char*))opt_menuKeybinds);
window_addButton(wid, -20 - 2 * (BUTTON_WIDTH+20), 20,
BUTTON_WIDTH, BUTTON_HEIGHT,
"btnAudio", "Audio", (void(*)(unsigned int, char*))opt_menuAudio);
menu_Open(MENU_OPTIONS);
}

View File

@ -1,7 +1,7 @@
/**
* @file menu.h
* @file options.c
*
* @brief Handle the important game menus.
* @brief Options menu.
*/
#include <string.h>
@ -11,11 +11,16 @@
#include "lephisto.h"
#include "input.h"
#include "toolkit.h"
#include "sound.h"
#include "music.h"
#include "options.h"
#define KEYBINDS_WIDTH 440 /**< Options menu width. */
#define KEYBINDS_HEIGHT 300 /**< Options menu height. */
#define AUDIO_WIDTH 340 /**< Options menu width. */
#define AUDIO_HEIGHT 200 /**< Options menu height. */
#define BUTTON_WIDTH 90 /**< Button width, standard across menus. */
#define BUTTON_HEIGHT 30 /**< Button height, standard across menus. */
@ -25,6 +30,9 @@ extern const char* keybindNames[]; /* input.c */
static const char* modToText(SDLMod mod);
static void menuKeybinds_update(unsigned int wid, char* name);
static void opt_setSFXLevel(unsigned int wid, char* str);
static void opt_setMusicLevel(unsigned int wid, char* str);
/**
* @brief Opens the keybindings menu.
*/
@ -163,3 +171,55 @@ static void menuKeybinds_update(unsigned int wid, char* name) {
window_modifyText(wid, "txtDesc", buf);
}
/**
* @brief Callback to set the sound level.
*/
static void opt_setSFXLevel(unsigned int wid, char* str) {
double vol;
vol = window_getFaderValue(wid, str);
sound_volume(vol);
}
/**
* @brief Callback to set the music level.
*/
static void opt_setMusicLevel(unsigned int wid, char* str) {
double vol;
vol = window_getFaderValue(wid, str);
music_volume(vol);
}
/**
* @brief Opens the audio settings menu.
*/
void opt_menuAudio(void) {
unsigned int wid;
/* Create the window. */
wid = window_create("Audio", -1, -1, AUDIO_WIDTH, AUDIO_HEIGHT);
/* Sound fader. */
if(!sound_disabled) {
window_addFader(wid, 20, -40, 160, 20, "fadSound", 0., 1.,
sound_defVolume, opt_setSFXLevel);
window_addText(wid, 200, -40, AUDIO_WIDTH-220, 20, 1, "txtSound",
NULL, NULL, "Sound Volume");
} else
window_addText(wid, 200, -40, AUDIO_WIDTH-220, 20, 1, "txtSound",
NULL, NULL, "Sound Disabled");
/* Music fader. */
if(!music_disabled) {
window_addFader(wid, 20, -80, 160, 20, "fadMusic", 0., 1.,
music_defVolume, opt_setMusicLevel);
window_addText(wid, 200, -80, AUDIO_WIDTH-220, 20, 1, "txtMusic",
NULL, NULL, "Music Volume");
} else
window_addText(wid, 200, -80, AUDIO_WIDTH-220, 20, 1, "txtMusic",
NULL, NULL, "Music Disabled");
/* Close button. */
window_addButton(wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT,
"btnClose", "Close", window_close);
}

View File

@ -1,4 +1,5 @@
#pragma once
void opt_menuKeybinds(void);
void opt_menuAudio(void);

View File

@ -25,7 +25,9 @@ typedef enum WidgetType_ {
WIDGET_RECT,
WIDGET_CUST,
WIDGET_INPUT,
WIDGET_IMAGEARRAY
WIDGET_IMAGEARRAY,
WIDGET_SCROLLBAR,
WIDGET_FADER
} WidgetType;
typedef enum WidgetStatus_ {
@ -101,6 +103,16 @@ typedef struct Widget_ {
int ih; /**< Image height to use. */
void(*fptr)(unsigned int, char*); /**< Modify callback - triggered on selection. */
} iar; /**< WIDGET_IMAGEARRAY */
struct {
double value; /**< Current value. */
} scb; /**< WIDGET_SCROLLBAR */
struct {
double value; /**< Current value. */
double min; /**< Minimum value. */
double max; /**< Maximum value. */
void(*fptr)(unsigned int, char*); /**< Modify callback - triggered on value change. */
} fad; /**< WIDGET_FADER */
} dat;
} Widget;
@ -162,6 +174,7 @@ static Widget* toolkit_getFocus(void);
static void toolkit_listScroll(Widget* wgt, int direction);
static void toolkit_listFocus(Widget* lst, double bx, double by);
static void toolkit_imgarrFocus(Widget* iar, double dx, double by);
static void toolkit_faderSetValue(Widget* fad, double value);
/* Render. */
static void window_render(Window* w);
static void toolkit_renderButton(Widget* btn, double bx, double by);
@ -172,6 +185,8 @@ static void toolkit_renderRect(Widget* rct, double bx, double by);
static void toolkit_renderCust(Widget* cst, double bx, double by);
static void toolkit_renderInput(Widget* inp, double bx, double by);
static void toolkit_renderImageArray(Widget* iar, double bx, double by);
static void toolkit_renderScrollbar(Widget* scb, double bx, double by);
static void toolkit_renderFader(Widget* fad, double bx, double by);
static void toolkit_drawOutline(double x, double y, double w,
double h, double b, glColour* c, glColour* lc);
static void toolkit_drawScrollbar(double x, double y, double w, double h, double pos);
@ -420,6 +435,60 @@ void window_addImageArray(const unsigned int wid,
toolkit_nextFocus();
}
void window_addScrollbar(const unsigned int wid,
const int x, const int y, /* Position. */
const int w, const int h, /* Size. */
char* name, double value) {
Window* wdw = window_wget(wid);
Widget* wgt = window_newWidget(wdw);
/* Genetic. */
wgt->type = WIDGET_SCROLLBAR;
wgt->name = strdup(name);
/* Specific. */
wgt->dat.scb.value = value;
/* Position/size. */
wgt->w = (double)w;
wgt->h = (double)h;
toolkit_setPos(wdw, wgt, x, y);
if(wdw->focus == -1) /* Initialize the focus. */
toolkit_nextFocus();
}
void window_addFader(const unsigned int wid,
const int x, const int y, /* Position. */
const int w, const int h, /* Size, if w > h fader is horizontal, else vertical. */
char* name, const double min, const double max, /* Name, min/max values. */
const double def,
void(*call)(unsigned int, char*)) {
Window* wdw = window_wget(wid);
Widget* wgt = window_newWidget(wdw);
/* Generic. */
wgt->type = WIDGET_FADER;
wgt->name = strdup(name);
/* Specific. */
wgt->dat.fad.value = min;
wgt->dat.fad.min = min;
wgt->dat.fad.max = max;
wgt->dat.fad.value = MAX(min, MIN(max,def));
wgt->dat.fad.fptr = call;
/* Position/size. */
wgt->w = (double)w;
wgt->h = (double)h;
toolkit_setPos(wdw, wgt, x, y);
if(wdw->focus == -1) /* Initialize the focus. */
toolkit_nextFocus();
}
/* Return pointer to newly allocated widget. */
static Widget* window_newWidget(Window* w) {
Widget* wgt = NULL;
@ -515,6 +584,33 @@ void window_imgColour(const unsigned int wid, char* name, glColour* colour) {
wgt->dat.img.colour = colour;
}
/**
* Set scrollbar value.
*/
void window_scrollbarValue(const unsigned int wid,
char* name, double value) {
Widget* wgt = window_getwgt(wid, name);
wgt->dat.scb.value = value;
}
/* Set fader value. */
void window_faderValue(const unsigned int wid,
char* name, double value) {
Widget* wgt = window_getwgt(wid, name);
toolkit_faderSetValue(wgt, value);
}
/* Set minimum and maximum fader values. */
void window_faderBounds(const unsigned int wid,
char* name, double min, double max) {
Widget* wgt = window_getwgt(wid, name);
wgt->dat.fad.min = min;
wgt->dat.fad.max = max;
double value = MAX(MIN(value, wgt->dat.fad.max), wgt->dat.fad.min);
toolkit_faderSetValue(wgt, value);
}
glTexture* window_getImage(const unsigned int wid, char* name) {
Widget* wgt = window_getwgt(wid, name);
return (wgt) ? wgt->dat.img.image : NULL;
@ -526,6 +622,18 @@ char* window_getInput(const unsigned int wid, char* name) {
return(wgt) ? wgt->dat.inp.input : NULL;
}
/* Get the value from a scrollbar widget. */
double window_getScrollbarValue(const unsigned int wid, char* name) {
Widget* wgt = window_getwgt(wid, name);
return (wgt) ? wgt->dat.scb.value : 0.;
}
/* Get value of fader. */
double window_getFaderValue(const unsigned int wid, char* name) {
Widget* wgt = window_getwgt(wid, name);
return (wgt) ? wgt->dat.fad.value : 0.;
}
/* Check if a window exists. */
int window_exists(const char* wdwname) {
int i;
@ -1059,6 +1167,13 @@ static void window_render(Window* w) {
case WIDGET_IMAGEARRAY:
toolkit_renderImageArray(&w->widgets[i], x, y);
break;
case WIDGET_SCROLLBAR:
toolkit_renderScrollbar(&w->widgets[i], x, y);
break;
case WIDGET_FADER:
toolkit_renderFader(&w->widgets[i], x, y);
}
}
/* Focus widget. */
@ -1387,6 +1502,53 @@ static void toolkit_drawScrollbar(double x, double y, double w, double h, double
toolkit_drawOutline(x, sy, w, 30., 0., toolkit_colDark, NULL);
}
/**
* @brief Render a scrollbar.
* @param scb WIDGET_SCROLLBAR widget to render.
* @param bx Base X position.
* @param by Base Y position.
*/
static void toolkit_renderScrollbar(Widget* scb, double bx, double by) {
toolkit_drawScrollbar(bx + scb->x, by + scb->y,
scb->w, scb->h,
scb->dat.scb.value);
}
/**
* @brief Render a fader.
* @param fad WIDGET_FADER widget to render.
* @param bx Base X position.
* @param by Base Y position.
*/
static void toolkit_renderFader(Widget* fad, double bx, double by) {
double pos;
double w, h;
double tx, ty, tw, th;
double kx, ky, kw, kh;
/* Some values. */
pos = fad->dat.fad.value / (fad->dat.fad.max - fad->dat.fad.min);
w = fad->w;
h = fad->h;
/* Track. */
tx = bx + fad->x + (h > w ? (w - 5.) / 2 : 0);
ty = by + fad->y + (h < w ? (h - 5.) / 2 : 0);
tw = (h < w ? w : 5.);
th = (h > w ? h : 5.);
toolkit_drawRect(tx, ty, tw, th, toolkit_colDark, toolkit_colDark);
/* Knob. */
kx = bx + fad->x + (h < w ? w * pos - 5. : 0);
ky = by + fad->y + (h > w ? h * pos - 5. : 0);
kw = (h < w ? 15. : w);
kh = (h > w ? 15. : h);
/* Draw. */
toolkit_drawRect(kx, ky, kw, kh, toolkit_colDark, toolkit_colLight);
toolkit_drawOutline(kx, ky, kw, kh, 1., &cBlack, toolkit_colDark);
}
/* Handle input for input widget. */
static int toolkit_inputInput(Uint8 type, Widget* inp, SDLKey key) {
int n;
@ -1488,6 +1650,7 @@ int toolkit_input(SDL_Event* event) {
static int mouse_down = 0;
static void toolkit_mouseEvent(SDL_Event* event) {
int i;
double d;
double x, y, rel_x, rel_y;
Window* w;
Widget* wgt, *wgt_func;
@ -1541,6 +1704,12 @@ static void toolkit_mouseEvent(SDL_Event* event) {
toolkit_listMove(wgt, y-wgt->y);
if(wgt->type == WIDGET_IMAGEARRAY)
toolkit_imgarrMove(wgt, rel_y);
if(wgt->type == WIDGET_SCROLLBAR)
wgt->dat.scb.value -= rel_y / wgt->h;
if(wgt->type == WIDGET_FADER) {
d = (wgt->w > wgt->h) ? rel_x / wgt->w : rel_y / wgt->h;
toolkit_faderSetValue(wgt, wgt->dat.fad.value + d);
}
}
break;
case SDL_MOUSEBUTTONDOWN:
@ -1838,8 +2007,17 @@ static void toolkit_listScroll(Widget* wgt, int direction) {
}
/**
* @fn char* toolkit_getList(const unsigned int wid, char* name)
*
* @brief Change fader value.
*/
static void toolkit_faderSetValue(Widget* fad, double value) {
Window* w = &windows[nwindows-1];
value = MAX(MIN(value, fad->dat.fad.max), fad->dat.fad.min);
fad->dat.fad.value = value;
if(fad->dat.fad.fptr != NULL)
(*fad->dat.fad.fptr)(w->id, fad->name);
}
/**
* @brief Get what is selected currently in a list.
*
* List included Image Array.

View File

@ -50,6 +50,18 @@ void window_addImageArray(const unsigned int wid,
glTexture** tex, char** caption, int nelem, /* Elements. */
void(*call)(unsigned int, char*));
void window_addScrollbar(const unsigned int wid,
const int x, const int y, /* Position. */
const int w, const int h, /* Size. */
char* name, double value); /* Value. */
void window_addFader(const unsigned int wid,
const int x, const int y, /* Position. */
const int w, const int h, /* Size, if w > h fader is horizontal, else vertical. */
char* name, const double min, const double max, /* name, min * max values. */
const double def, /* Default pos. */
void(*call)(unsigned int, char*)); /* Function to call on value change. */
/* Modification. */
void window_setAccept(const unsigned int wid, void(*fptr)(unsigned int, char*));
void window_setCancel(const unsigned int wid, void(*cancel)(unsigned int, char*));
@ -61,6 +73,13 @@ void window_enableButton(const unsigned int wid, char* name);
/* Image. */
void window_modifyImage(const unsigned int wid, char* name, glTexture* image);
void window_imgColour(const unsigned int wid, char* name, glColour* colour);
/* Scroll bar. */
void window_scrollbarValue(const unsigned int wid,
char* name, double value);
void faderValue(const unsigned int wid,
char* name, double value);
void faderBounds(const unsigned int wid,
char* name, double min, double max);
/* Get. */
/* Generic. */
@ -77,6 +96,9 @@ char* toolkit_getList(const unsigned int wid, char* name);
int toolkit_getListPos(const unsigned int wid, char* name);
glTexture* window_getImage(const unsigned int wid, char* name);
double window_getScrollbarValue(const unsigned int wid, char* name);
double window_getFaderValue(const unsigned wid, char* name);
/* Destroy window. */
void window_close(unsigned int wid, char* str);
void window_destroy(const unsigned int wid);