[Add] Added options menu for audio and faders.
This commit is contained in:
parent
6a65458f90
commit
f8701e4bdc
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
#pragma once
|
||||
|
||||
void opt_menuKeybinds(void);
|
||||
void opt_menuAudio(void);
|
||||
|
||||
|
184
src/toolkit.c
184
src/toolkit.c
@ -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.
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user