Break out the menu plist parser into its own file.

This commit is contained in:
Bill Currie 2010-11-24 13:32:08 +09:00
parent e471ddff47
commit 2b3ba0633e
4 changed files with 191 additions and 148 deletions

View file

@ -28,7 +28,7 @@ EXTRA_DATA= $(menu_data)
menu_src= \
client_menu.qc controls_o.qc options.qc options_util.qc servlist.qc \
Frame.r menu.r HUD.r ../lib/debug.r
Frame.r menu.r HUD.r plistmenu.r ../lib/debug.r
%.qfo: %.r
$(QFCC) $(QCFLAGS) $(QCPPFLAGS) -c -o $@ $<

View file

@ -37,7 +37,7 @@
#include "options_util.h"
#include "qfs.h"
#include "PropertyList.h"
#include "plistmenu.h"
#include "gui/InputLine.h"
#include "gui/Pic.h"
@ -100,151 +100,6 @@ InputLine network_config_iactive;
* Video settings menu code
****************************/
@param object_from_plist (PLItem plist);
@param
class_from_plist (PLDictionary pldict)
{
local @param [8]params;
local @param ret;
local @va_list va_list = { 0, params };
local string classname, selname, paramstr;
local Class class;
local id obj;
local PLArray messages, msg;
local integer message_count, i, j;
local SEL sel;
local PLItem item;
classname = [(PLString) [pldict getObjectForKey:"Class"] string];
class = obj_lookup_class (classname);
if (!class) {
dprint ("could not find " + classname + "\n");
ret.pointer_val = NIL;
return ret;
}
obj = [class alloc];
messages = (PLArray) [pldict getObjectForKey:"Messages"];
message_count = [messages count];
for (i = 0; i < message_count; i++) {
msg = (PLArray) [messages getObjectAtIndex:i];
selname = [(PLString) [msg getObjectAtIndex:0] string];
sel = sel_get_uid (selname);
va_list.count = [msg count] - 1;
for (j = 0; j < va_list.count; j++) {
paramstr = [(PLString) [msg getObjectAtIndex:j + 1] string];
switch (str_mid (paramstr, 0, 1)) {
case "\"":
va_list.list[j].string_val = str_mid (paramstr, 1, -1);
break;
case "$":
item = [pldict getObjectForKey:str_mid (paramstr, 1)];
va_list.list[j] = object_from_plist (item);
break;
case "0": case "1": case "2": case "3": case "4":
case "5": case "6": case "7": case "8": case "9":
if (str_str (paramstr, "."))
va_list.list[j].float_val = stof (paramstr);
else
va_list.list[j].integer_val = stoi (paramstr);
break;
}
}
obj_msg_sendv (obj, sel, va_list);
}
ret.pointer_val = obj;
return ret;
}
@param
array_from_plist (PLArray plarray)
{
local Array array;
local integer i, count;
local @param ret;
array = [[Array alloc] init];
count = [plarray count];
for (i = 0; i < count; i++)
[array addItem: object_from_plist ([plarray getObjectAtIndex:i])];
ret.pointer_val = array;
return ret;
}
union ParamRect {
@param p;
Rect r;
};
@param
rect_from_plist (PLString plstring)
{
local string str = [plstring string];
local string tmp;
local integer xp, yp, xl, yl;
local PLItem item;
local union ParamRect pr;
pr.r = makeRect (0, 0, 0, 0);
if (str_mid (str, 0, 1) == "[") {
tmp = "(" + str_mid (str, 1, -1) + ")";
item = [PLItem fromString:tmp];
xp = stoi ([(PLString) [item getObjectAtIndex:0] string]);
yp = stoi ([(PLString) [item getObjectAtIndex:1] string]);
xl = stoi ([(PLString) [item getObjectAtIndex:2] string]);
yl = stoi ([(PLString) [item getObjectAtIndex:3] string]);
pr.r = makeRect (xp, yp, xl, yl);
}
return pr.p;
}
@param
string_from_plist (PLString plstring)
{
local @param ret;
local string str = [plstring string];
if (str_mid (str, 0, 1) == "[")
return rect_from_plist (plstring);
ret.string_val = NIL;
return ret;
}
@param
object_from_plist (PLItem plist)
{
local @param ret;
switch ([plist type]) {
case QFDictionary:
return class_from_plist ((PLDictionary) plist);
case QFArray:
return array_from_plist ((PLArray) plist);
case QFBinary:
ret.pointer_val = NIL;
return ret;
case QFString:
return string_from_plist ((PLString) plist);
}
}
PLItem read_plist (void)
{
local QFile file;
local PLItem plist;
file = QFS_OpenFile ("menu.plist");
if (!file) {
dprint ("could not load menu.plist\n");
return NIL;
}
plist = [PLItem fromFile:file];
Qclose (file);
return plist;
}
/*
DRAW_video_options
@ -882,7 +737,7 @@ MENU_options =
local integer spacing = 120;
local PLItem plist;
plist = read_plist ();
plist = read_plist ("menu.plist");
Menu_Begin (54, 72, "");
Menu_FadeScreen (1);

View file

@ -0,0 +1,9 @@
#ifndef __plistmenu_h
#define __plistmenu_h
#include "PropertyList.h"
@extern @param object_from_plist (PLItem plist);
@extern PLItem read_plist (string fname);
#endif//__plistmenu_r

179
ruamoko/cl_menu/plistmenu.r Normal file
View file

@ -0,0 +1,179 @@
/*
plistmenu.r
PropertyList menu parser.
Copyright (C) 2010 Bill Currie <bill@taniwha.org>
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:
Free Software Foundation, Inc.
59 Temple Place - Suite 330
Boston, MA 02111-1307, USA
*/
#include "debug.h"
#include "string.h"
#include "qfs.h"
#include "Array.h"
#include "gui/Rect.h"
#include "plistmenu.h"
@static @param
class_from_plist (PLDictionary pldict)
{
local @param [8]params;
local @param ret;
local @va_list va_list = { 0, params };
local string classname, selname, paramstr;
local Class class;
local id obj;
local PLArray messages, msg;
local integer message_count, i, j;
local SEL sel;
local PLItem item;
classname = [(PLString) [pldict getObjectForKey:"Class"] string];
class = obj_lookup_class (classname);
if (!class) {
dprint ("could not find " + classname + "\n");
ret.pointer_val = NIL;
return ret;
}
obj = [class alloc];
messages = (PLArray) [pldict getObjectForKey:"Messages"];
message_count = [messages count];
for (i = 0; i < message_count; i++) {
msg = (PLArray) [messages getObjectAtIndex:i];
selname = [(PLString) [msg getObjectAtIndex:0] string];
sel = sel_get_uid (selname);
va_list.count = [msg count] - 1;
for (j = 0; j < va_list.count; j++) {
paramstr = [(PLString) [msg getObjectAtIndex:j + 1] string];
switch (str_mid (paramstr, 0, 1)) {
case "\"":
va_list.list[j].string_val = str_mid (paramstr, 1, -1);
break;
case "$":
item = [pldict getObjectForKey:str_mid (paramstr, 1)];
va_list.list[j] = object_from_plist (item);
break;
case "0": case "1": case "2": case "3": case "4":
case "5": case "6": case "7": case "8": case "9":
if (str_str (paramstr, "."))
va_list.list[j].float_val = stof (paramstr);
else
va_list.list[j].integer_val = stoi (paramstr);
break;
}
}
obj_msg_sendv (obj, sel, va_list);
}
ret.pointer_val = obj;
return ret;
}
@static @param
array_from_plist (PLArray plarray)
{
local Array array;
local integer i, count;
local @param ret;
array = [[Array alloc] init];
count = [plarray count];
for (i = 0; i < count; i++) {
ret = object_from_plist ([plarray getObjectAtIndex:i]);
[array addItem: ret.pointer_val];
}
ret.pointer_val = array;
return ret;
}
union ParamRect {
@param p;
Rect r;
};
@static @param
rect_from_plist (PLString plstring)
{
local string str = [plstring string];
local string tmp;
local integer xp, yp, xl, yl;
local PLItem item;
local union ParamRect pr;
pr.r = makeRect (0, 0, 0, 0);
if (str_mid (str, 0, 1) == "[") {
tmp = "(" + str_mid (str, 1, -1) + ")";
item = [PLItem fromString:tmp];
xp = stoi ([(PLString) [item getObjectAtIndex:0] string]);
yp = stoi ([(PLString) [item getObjectAtIndex:1] string]);
xl = stoi ([(PLString) [item getObjectAtIndex:2] string]);
yl = stoi ([(PLString) [item getObjectAtIndex:3] string]);
pr.r = makeRect (xp, yp, xl, yl);
}
return pr.p;
}
@static @param
string_from_plist (PLString plstring)
{
local @param ret;
local string str = [plstring string];
if (str_mid (str, 0, 1) == "[")
return rect_from_plist (plstring);
ret.string_val = NIL;
return ret;
}
@param
object_from_plist (PLItem plist)
{
local @param ret;
switch ([plist type]) {
case QFDictionary:
return class_from_plist ((PLDictionary) plist);
case QFArray:
return array_from_plist ((PLArray) plist);
case QFBinary:
ret.pointer_val = NIL;
return ret;
case QFString:
return string_from_plist ((PLString) plist);
}
}
PLItem
read_plist (string fname)
{
local QFile file;
local PLItem plist;
file = QFS_OpenFile (fname);
if (!file) {
dprint ("could not load menu.plist\n");
return NIL;
}
plist = [PLItem fromFile:file];
Qclose (file);
return plist;
}