summaryrefslogtreecommitdiff
path: root/source/ui_script.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/ui_script.c')
-rw-r--r--source/ui_script.c191
1 files changed, 191 insertions, 0 deletions
diff --git a/source/ui_script.c b/source/ui_script.c
new file mode 100644
index 0000000..a2452ec
--- /dev/null
+++ b/source/ui_script.c
@@ -0,0 +1,191 @@
+/*
+Copyright (C) 2008 Andrey Nazarov
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+#include "ui_local.h"
+
+static menuSound_t Activate( menuCommon_t *self ) {
+ menuAction_t *action = ( menuAction_t * )self;
+ Cbuf_AddText( action->cmd );
+ return QMS_NOTHANDLED;
+}
+
+static void Draw( menuFrameWork_t *self ) {
+ static const color_t color = { 0, 0, 255, 32 };
+ int y1, y2;
+
+ y1 = ( uis.height - MENU_SPACING * self->nitems ) / 2 - MENU_SPACING;
+ y2 = ( uis.height + MENU_SPACING * self->nitems ) / 2 + MENU_SPACING;
+
+ ref.DrawFillEx( 0, y1, uis.width, y2 - y1, color );
+
+ Menu_Draw( self );
+}
+
+static void ParseSpin( menuFrameWork_t *menu ) {
+ menuSpinControl_t *s;
+ int numItems = Cmd_Argc() - 3;
+ int i;
+
+ if( numItems < 1 ) {
+ return;
+ }
+
+ s = UI_Mallocz( sizeof( *s ) );
+ s->generic.type = MTYPE_SPINCONTROL;
+ s->generic.name = UI_CopyString( Cmd_Argv( 1 ) );
+ s->cvar = Cvar_Get( Cmd_Argv( 2 ), NULL, CVAR_USER_CREATED );
+ s->itemnames = UI_Mallocz( sizeof( char * ) * ( numItems + 1 ) );
+ for( i = 0; i < numItems; i++ ) {
+ s->itemnames[i] = UI_CopyString( Cmd_Argv( 3 + i ) );
+ }
+ s->numItems = numItems;
+
+ Menu_AddItem( menu, s );
+}
+
+static void ParseSlider( menuFrameWork_t *menu ) {
+ menuSlider_t *s = UI_Mallocz( sizeof( *s ) );
+
+ s->generic.type = MTYPE_SLIDER;
+ s->generic.name = UI_CopyString( Cmd_Argv( 1 ) );
+ s->cvar = Cvar_Get( Cmd_Argv( 2 ), NULL, CVAR_USER_CREATED );
+ s->add = atof( Cmd_Argv( 3 ) );
+ s->mul = atof( Cmd_Argv( 4 ) );
+ s->minvalue = atoi( Cmd_Argv( 5 ) );
+ s->maxvalue = atoi( Cmd_Argv( 6 ) );
+
+ Menu_AddItem( menu, s );
+}
+
+static void ParseAction( menuFrameWork_t *menu ) {
+ menuAction_t *a = UI_Mallocz( sizeof( *a ) );
+
+ a->generic.type = MTYPE_ACTION;
+ a->generic.name = UI_CopyString( Cmd_Argv( 1 ) );
+ a->generic.activate = Activate;
+ a->generic.uiFlags = UI_CENTER;
+ a->cmd = UI_CopyString( Cmd_ArgsFrom( 2 ) );
+
+ Menu_AddItem( menu, a );
+}
+
+static void ParseBind( menuFrameWork_t *menu ) {
+ menuKeybind_t *k = UI_Mallocz( sizeof( *k ) );
+
+ k->generic.type = MTYPE_KEYBIND;
+ k->generic.name = UI_CopyString( Cmd_Argv( 1 ) );
+ k->generic.uiFlags = UI_CENTER;
+ k->cmd = UI_CopyString( Cmd_ArgsFrom( 2 ) );
+
+ Menu_AddItem( menu, k );
+}
+
+static qboolean ParseFile( const char *path ) {
+ char *data, *p, *cmd;
+ int linenum = 1;
+ int argc;
+ menuFrameWork_t *menu = NULL;
+
+ FS_LoadFile( path, ( void ** )&data );
+ if( !data ) {
+ return qfalse;
+ }
+
+ COM_Compress( data );
+
+ while( *data ) {
+ p = strchr( data, '\n' );
+ if( p ) {
+ *p = 0;
+ }
+
+ Cmd_TokenizeString( data, qtrue );
+
+ argc = Cmd_Argc();
+ if( argc ) {
+ cmd = Cmd_Argv( 0 );
+ if( menu ) {
+ if( !strcmp( cmd, "end" ) ) {
+ if( !menu->title ) {
+ menu->transparent = qtrue;
+ menu->draw = Draw;
+ }
+ List_Append( &ui_menus, &menu->entry );
+ menu = NULL;
+ } else if( !strcmp( cmd, "title" ) ) {
+ if( menu->title ) {
+ Z_Free( menu->title );
+ }
+ menu->title = UI_CopyString( Cmd_Argv( 1 ) );
+ } else if( !strcmp( cmd, "spin" ) ) {
+ if( argc < 4 ) {
+ Com_WPrintf( "Insufficient arguments to '%s' on line %d in %s\n",
+ cmd, linenum, path );
+ }
+ ParseSpin( menu );
+ } else if( !strcmp( cmd, "slider" ) ) {
+ ParseSlider( menu );
+ } else if( !strcmp( cmd, "action" ) ) {
+ ParseAction( menu );
+ } else if( !strcmp( cmd, "confirm" ) ) {
+ } else if( !strcmp( cmd, "bind" ) ) {
+ ParseBind( menu );
+ } else {
+ Com_WPrintf( "Unexpected '%s' on line %d in %s\n",
+ cmd, linenum, path );
+ break;
+ }
+ } else {
+ if( !strcmp( cmd, "begin" ) ) {
+ if( argc < 2 ) {
+ Com_WPrintf( "Insufficient arguments to '%s' on line %d in %s\n",
+ cmd, linenum, path );
+ break;
+ }
+ menu = UI_Mallocz( sizeof( *menu ) );
+ menu->name = UI_CopyString( Cmd_Argv( 1 ) );
+ menu->push = Menu_Push;
+ menu->pop = Menu_Pop;
+ menu->free = Menu_Free;
+ } else {
+ Com_WPrintf( "Unexpected '%s' on line %d in %s\n",
+ cmd, linenum, path );
+ break;
+ }
+ }
+ }
+
+ if( !p ) {
+ break;
+ }
+
+ linenum++; // FIXME: meaniningless
+ data = p + 1;
+ }
+
+ FS_FreeFile( data );
+
+ return qtrue;
+}
+
+void UI_LoadStript( void ) {
+ ParseFile( "q2pro.menu" );
+}
+