2020-05-28 00:07:26 +00:00
# pragma once
# include "common.h"
# ifdef CUSTOM_FRONTEND_OPTIONS
# include "Frontend.h"
// Warning: All of the code relies on that you won't use more then NUM_MENUROWS(18) options on one page. Also congrats if you can make 18 options visible at once.
// Static/select: User allocates variable, passes it to function and it's set automatically from input among the strings given to function,
// then you can handle ChangeFunc and ReturnPrevPageFunc if needed.
//
// Dynamic: Function doesn't accept value pointer, user should do operations with handling ButtonPressFunc.
// Right-side text can be set via DrawFunc, which is called on every draw. ReturnPrevPageFunc is also here if needed.
# define FEOPTION_SELECT 0
# define FEOPTION_DYNAMIC 1
# define FEOPTION_REDIRECT 2
# define FEOPTION_GOBACK 3
# define FEOPTION_ACTION_LEFT 0
# define FEOPTION_ACTION_RIGHT 1
# define FEOPTION_ACTION_SELECT 2
2020-05-29 17:29:18 +00:00
# define FEOPTION_ACTION_FOCUSLOSS 3
2020-05-28 00:07:26 +00:00
void RemoveCustomFrontendOptions ( ) ;
void CustomFrontendOptionsPopulate ( ) ;
// for static and dynamic options
typedef void ( * ReturnPrevPageFunc ) ( ) ;
// for static options
typedef void ( * ChangeFunc ) ( int8 displayedValue ) ; // called before updating the value
// for dynamic options
2020-05-29 17:29:18 +00:00
typedef wchar * ( * DrawFunc ) ( bool * disabled ) ; // should return pointer to right text. *disabled = true will make it dark yellow
2020-05-28 00:07:26 +00:00
typedef void ( * ButtonPressFunc ) ( int8 action ) ; // see FEOPTION_ACTIONs above
struct FrontendOption
{
int8 type ;
int8 screenOptionOrder ;
eMenuScreen screen ;
const wchar * leftText ;
ReturnPrevPageFunc returnPrevPageFunc ;
union {
// Only for dynamic
struct {
DrawFunc drawFunc ;
ButtonPressFunc buttonPressFunc ;
} ;
// Only for static/select
struct {
const wchar * * rightTexts ;
int8 numRightTexts ;
int8 * value ;
int8 displayedValue ; // if onlyApplyOnEnter enabled
bool onlyApplyOnEnter ;
ChangeFunc changeFunc ;
} ;
// Only for redirect
struct {
eMenuScreen to ;
int8 option ;
bool fadeIn ;
} ;
} ;
} ;
extern int numCustomFrontendOptions ;
extern FrontendOption * customFrontendOptions ;
// To be used in ButtonPressFunc / ChangeFunc(but that would be weird):
void ChangeScreen ( eMenuScreen screen , int option = 0 , bool fadeIn = true ) ;
void GoBack ( bool fadeIn = true ) ;
// If option is positive number, all calls will increase it before using it (you can think it as cursor). -1 means before the back button, -2 is end of page
void FrontendOptionSetPosition ( eMenuScreen screen , int8 option = - 1 ) ;
void FrontendOptionAddSelect ( const wchar * leftText , const wchar * * rightTexts , int8 numRightTexts , int8 * var , bool onlyApplyOnEnter , ChangeFunc changeFunc , ReturnPrevPageFunc returnPrevPageFunc ) ;
void FrontendOptionAddDynamic ( const wchar * leftText , DrawFunc rightTextDrawFunc , ButtonPressFunc buttonPressFunc , ReturnPrevPageFunc returnPrevPageFunc ) ;
void FrontendOptionAddRedirect ( const wchar * text , eMenuScreen to , int8 selectedOption = 0 , bool fadeIn = true ) ;
void FrontendOptionAddBackButton ( const wchar * text , bool fadeIn = true ) ;
# endif