int disable_open;
u32 page, /* current page index */
- page_depth;
+ page_depth,
+ controls_page_id;
+
+ ent_menuitem *ctr_kbm,
+ *ctr_deck,
+ *ctr_ps,
+ *ctr_steam,
+ *ctr_xbox;
enum menu_input_mode{
k_menu_input_mode_keys,
/*
* Attaches memory locations to the various items in the menu
*/
-static void menu_link(void)
-{
+static void menu_link(void){
/* link data locations */
for( u32 i=0; i<mdl_arrcount(&menu.items); i++ ){
ent_menuitem *item = mdl_arritm( &menu.items, i );
item->pvoid = NULL;
}
}
+
+ /* link controllers */
+ menu.ctr_deck = NULL;
+ menu.ctr_kbm = NULL;
+ menu.ctr_ps = NULL;
+ menu.ctr_steam = NULL;
+ menu.ctr_xbox = NULL;
+
+ for( u32 i=0; i<mdl_arrcount(&menu.items); i++ ){
+ ent_menuitem *item = mdl_arritm( &menu.items, i );
+
+ if( MDL_CONST_PSTREQ( &menu.model, item->visual.pstr_name, "deck" ) )
+ menu.ctr_deck = item;
+ if( MDL_CONST_PSTREQ( &menu.model, item->visual.pstr_name, "kbm" ) )
+ menu.ctr_kbm = item;
+ if( MDL_CONST_PSTREQ( &menu.model, item->visual.pstr_name, "ps" ) )
+ menu.ctr_ps = item;
+ if( MDL_CONST_PSTREQ( &menu.model, item->visual.pstr_name, "steam" ) )
+ menu.ctr_steam = item;
+ if( MDL_CONST_PSTREQ( &menu.model, item->visual.pstr_name, "xbox" ) )
+ menu.ctr_xbox = item;
+ }
}
static void menu_close(void){
/*
* Drop back a page until we're at the bottom which then we jus quit
*/
-static void menu_back_page(void)
-{
+static void menu_back_page(void){
vg_info( "menu_back_page()\n" );
menu.page_depth --;
if( menu.page_depth == 0 ){
/*
* Open page to the string identifier
*/
-static void menu_open_page( const char *name )
-{
+static void menu_open_page( const char *name ){
if( menu.page_depth >= MENU_STACK_SIZE )
vg_fatal_error( "Stack overflow\n" );
/*
* activate a pressable type
*/
-static void menu_trigger_item( ent_menuitem *item )
-{
+static void menu_trigger_item( ent_menuitem *item ){
if ( item->type == k_ent_menuitem_type_event_button ){
u32 q = item->button.pstr;
}
}
-static f32 menu_slider_snap( f32 value, f32 old, f32 notch )
-{
+static f32 menu_slider_snap( f32 value, f32 old, f32 notch ){
f32 const k_epsilon = 0.0125f;
if( fabsf(notch-value) < k_epsilon ){
return value;
}
+static void menu_setitem_type( ent_menuitem *item,
+ enum ent_menuitem_type type ){
+ if( !item ) return;
+ item->type = type;
+}
+
/*
* Run from vg_gui every frame
*/
}
}
}
+
+ menu_setitem_type( menu.ctr_deck, k_ent_menuitem_type_disabled );
+ menu_setitem_type( menu.ctr_ps, k_ent_menuitem_type_disabled );
+ menu_setitem_type( menu.ctr_kbm, k_ent_menuitem_type_disabled );
+ menu_setitem_type( menu.ctr_xbox, k_ent_menuitem_type_disabled );
+ menu_setitem_type( menu.ctr_steam, k_ent_menuitem_type_disabled );
+
+ if( vg_input.display_input_method == k_input_method_kbm )
+ menu_setitem_type( menu.ctr_kbm, k_ent_menuitem_type_visual );
+ else{
+ if( vg_input.display_input_type == SDL_CONTROLLER_TYPE_PS3 ||
+ vg_input.display_input_type == SDL_CONTROLLER_TYPE_PS4 ||
+ vg_input.display_input_type == SDL_CONTROLLER_TYPE_PS5 ){
+ menu_setitem_type( menu.ctr_ps, k_ent_menuitem_type_visual );
+ }
+ else {
+ menu_setitem_type( menu.ctr_xbox, k_ent_menuitem_type_visual );
+ }
+ /* FIXME: Steam/Deck controller detection? */
+ }
}
/*
screen = { 0,0, vg.window_x,vg.window_y };
ui_rect_center( screen, panel );
ui_fill( panel, ui_colour(k_ui_bg) );
- ui_outline( panel, 1, ui_colour(k_ui_fg) );
+ ui_outline( panel, 1, ui_colour(k_ui_fg), 0 );
ui_rect_pad( panel, (ui_px[]){8,8} );
ui_rect title;
for( u32 i=0; i<mdl_arrcount(&menu.items); i++ ){
ent_menuitem *item = mdl_arritm( &menu.items, i );
+ if( item->type == k_ent_menuitem_type_disabled ) continue;
if( item->type == k_ent_menuitem_type_page ) continue;
if( !(item->groups & (0x1 << menu.page)) ) continue;
#include "vg/vg.h"
static int skaterift_loaded = 0;
-static char g_an_buffer[ 4096 ];
+static char g_an_buffer[ 96 ],
+ g_an_buffer2[ 96 ];
int main( int argc, char *argv[] ){
vg_mem.use_libc_malloc = 0;
vg_ui.wants_mouse = 1;
- ui_rect panel;
+ ui_rect panel, content;
ui_panel( window, panel );
- ui_enum( panel, "Select enum:", dropdown_options, 3, &dropdown_value );
- ui_checkbox( panel, "Toggly:", &checkbox_value );
+
+ static i32 page = 0;
+ ui_tabs( panel, content,
+ (const char *[]){ "Controls", "Other", "Nothing" }, 3, &page );
+
+ if( page == 0 ){
+ ui_enum( content, "Select enum:", dropdown_options, 3, &dropdown_value );
+ ui_checkbox( content, "Toggly:", &checkbox_value );
+ ui_textbox( content, "Single:", g_an_buffer, 96, 1, 0, NULL );
+ ui_textbox( content, "Multi:", g_an_buffer2, 96, 5, 0, NULL );
+
+ if( ui_button( content, "Hello" ) == 1 ){
+ vg_success( "Ding!\n" );
+ }
+ }
+ else if( page == 1 ){
+ if( ui_button( content, "Another button" ) == 1 ){
+ vg_error( "Press\n" );
+ }
+ }
+
#if 0
ui_fill( window, ui_colour( k_ui_bg+1 ) );
workshop_form_gui_draw_preview( img_box );
/* file path */
- ui_rect null, file_entry, file_button, file_label;
- ui_split( content, k_ui_axis_h, 8, 0, null, content );
- ui_split( content, k_ui_axis_h, 28, 0, file_entry, content );
+ ui_rect file_button, file_label;
char buf[128];
- snprintf( buf, 128, "Addon folder: skaterift/%s",
- workshop_filetype_folder() );
-
- ui_label( file_entry, buf, 1, 8, file_entry );
+ snprintf( buf, 128,
+ "Addon folder: skaterift/%s", workshop_filetype_folder() );
if( type == k_addon_type_world ){
struct ui_textbox_callbacks callbacks = {
.change = workshop_changed_model_path
};
- ui_textbox( file_entry, workshop_form.addon_folder,
- vg_list_size(workshop_form.addon_folder), 0, &callbacks );
+ ui_textbox( content, buf, workshop_form.addon_folder,
+ vg_list_size(workshop_form.addon_folder), 1, 0, &callbacks );
}
else{
+ ui_rect file_entry;
+ ui_standard_widget( content, file_entry, 1 );
ui_split( file_entry, k_ui_axis_v, -128, 0, file_entry, file_button );
+
if( workshop_form.file_intent != k_workshop_form_file_intent_none ){
ui_text( file_entry, workshop_form.addon_folder, 1,
k_ui_align_middle_left, ui_colour( k_ui_fg+4 ) );
.change = workshop_changed_model_path
};
- ui_textbox( file_entry, workshop_form.addon_folder,
- vg_list_size(workshop_form.addon_folder), 0, &callbacks );
+ ui_textbox( file_entry, buf, workshop_form.addon_folder,
+ vg_list_size(workshop_form.addon_folder), 1,
+ 0, &callbacks );
if( ui_button_text( file_button, "Load", 1 ) == 1 ){
workshop_op_load_model();
}
}
- ui_rect title_entry, label;
- ui_split( content, k_ui_axis_h, 8, 0, null, content );
- ui_split( content, k_ui_axis_h, 28, 0, title_entry, content );
-
const char *str_title = "Title:", *str_desc = "Description:";
- ui_split( title_entry, k_ui_axis_v,
- ui_text_line_width(str_title)+8, 0, label, title_entry );
-
- ui_rect vis_enum;
- ui_split_ratio( title_entry, k_ui_axis_v, 0.6f, 16,
- title_entry, vis_enum );
/* title box */
{
struct ui_textbox_callbacks callbacks = {
.change = workshop_changed_title
};
- ui_text( label, str_title, 1, k_ui_align_middle_left, 0 );
- ui_textbox( title_entry, workshop_form.submission.title,
- vg_list_size(workshop_form.submission.title), 0, &callbacks );
+ ui_textbox( content, str_title, workshop_form.submission.title,
+ vg_list_size(workshop_form.submission.title), 1,
+ 0, &callbacks );
}
/* visibility option */
{
- ui_enum( vis_enum, "Visibility:", workshop_form_visibility_opts,
+ ui_enum( content, "Visibility:", workshop_form_visibility_opts,
4, &workshop_form.submission.visibility );
}
struct ui_textbox_callbacks callbacks = {
.change = workshop_changed_description
};
- ui_rect desc_entry;
- ui_split( content, k_ui_axis_h, 8, 0, null, content );
- ui_split( content, k_ui_axis_h, 28, 0, label, content );
- ui_split( content, k_ui_axis_h, 28*4, 0, desc_entry, content );
- ui_text( label, str_desc, 1, k_ui_align_middle_left, 0 );
- ui_textbox( desc_entry, workshop_form.submission.description,
- vg_list_size(workshop_form.submission.description),
- UI_TEXTBOX_MULTILINE|UI_TEXTBOX_WRAP, &callbacks );
+ ui_textbox( content, str_desc, workshop_form.submission.description,
+ vg_list_size(workshop_form.submission.description), 4,
+ UI_TEXTBOX_MULTILINE|UI_TEXTBOX_WRAP, &callbacks );
}
/* submissionable */
- ui_rect submission_row;
- ui_split( content, k_ui_axis_h, 8, 0, null, content );
- ui_split( content, k_ui_axis_h, content[3]-32-8, 0, content,
- submission_row );
+ ui_rect final_row;
+ ui_split( content, k_ui_axis_h, content[3]-32-8, 0, content, final_row );
ui_rect submission_center;
- rect_copy( submission_row, submission_center );
+ rect_copy( final_row, submission_center );
submission_center[2] = 256;
- ui_rect_center( submission_row, submission_center );
+ ui_rect_center( final_row, submission_center );
ui_rect btn_left, btn_right;
ui_split_ratio( submission_center, k_ui_axis_v, 0.5f, 8,
"By submitting this item, you agree to the workshop terms of service";
ui_rect disclaimer_row, inner, link;
- ui_split( content, k_ui_axis_h, 8, 0, null, content );
- ui_split( content, k_ui_axis_h, content[3]-32, 0, content,
- disclaimer_row );
+ ui_split( content, k_ui_axis_h, content[3]-32, 0, content, disclaimer_row );
ui_px btn_width = 32;
rect_copy( disclaimer_row, inner );
inner[2] = ui_text_line_width( disclaimer_text ) + btn_width+8;
+ ui_rect label;
ui_rect_center( disclaimer_row, inner );
ui_split( inner, k_ui_axis_v, inner[2]-btn_width, 0, label, btn_right);
ui_rect_pad( btn_right, (ui_px[2]){2,2} );
vg_ui.wants_mouse = 1;
ui_fill( window, ui_colour( k_ui_bg+1 ) );
- ui_outline( window, 1, ui_colour( k_ui_bg+7 ) );
+ ui_outline( window, 1, ui_colour( k_ui_bg+7 ), 0 );
ui_rect title, panel;
ui_split( window, k_ui_axis_h, 28, 0, title, panel );