]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/menu/nexuiz/skinlist.c
skin selector by Ronan
[divverent/nexuiz.git] / data / qcsrc / menu / nexuiz / skinlist.c
1 #ifdef INTERFACE
2 CLASS(NexuizSkinList) EXTENDS(NexuizListBox)
3         METHOD(NexuizSkinList, configureNexuizSkinList, void(entity))
4         ATTRIB(NexuizSkinList, rowsPerItem, float, 4)
5         METHOD(NexuizMapList, resizeNotify, void(entity, vector, vector, vector, vector))
6         METHOD(NexuizSkinList, draw, void(entity))
7         METHOD(NexuizSkinList, drawListBoxItem, void(entity, float, vector, float))
8         METHOD(NexuizSkinList, getSkins, void(entity))
9
10         ATTRIB(NexuizSkinList, currentskin, string, "")
11         ATTRIB(NexuizSkinList, skinlist, string, "")    
12         ATTRIB(NexuizSkinList, realFontSize, vector, '0 0 0')
13         ATTRIB(NexuizSkinList, columnPreviewOrigin, float, 0)
14         ATTRIB(NexuizSkinList, columnPreviewSize, float, 0)
15         ATTRIB(NexuizSkinList, columnNameOrigin, float, 0)
16         ATTRIB(NexuizSkinList, columnNameSize, float, 0)
17         ATTRIB(NexuizSkinList, checkMarkOrigin, vector, '0 0 0')
18         ATTRIB(NexuizSkinList, checkMarkSize, vector, '0 0 0')
19         ATTRIB(NexuizSkinList, realUpperMargin1, float, 0)      
20         ATTRIB(NexuizSkinList, origin, vector, '0 0 0')
21         ATTRIB(NexuizSkinList, itemAbsSize, vector, '0 0 0')
22 ENDCLASS(NexuizSkinList)
23
24 entity makeNexuizSkinList();
25 void setSkin(entity btn, entity me);
26 #endif
27
28 #ifdef IMPLEMENTATION
29
30 entity makeNexuizSkinList()
31 {
32         entity me;
33         me = spawnNexuizSkinList();
34         me.configureNexuizSkinList(me);
35         return me;
36 }
37
38 void configureNexuizSkinListNexuizSkinList(entity me)
39 {
40         me.configureNexuizListBox(me);
41         me.getSkins(me);
42         me.currentskin = strzone(cvar_string("menu_skin"));
43 }
44
45 void getSkinsNexuizSkinList(entity me)
46 {
47         float glob,i;
48         string s,_skinlist;
49                 
50         glob = search_begin("gfx/menu/*/skinvalues.txt", TRUE, TRUE);
51         if(glob < 0)
52                 return; 
53         for (i=0 ; i < search_getsize(glob) ; ++i)
54         {
55                 s=search_getfilename(glob, i);
56                 // s contain gfx/menu/skinname/skinvalues.txt
57                 if ( tokenizebyseparator(s, "/") == 4 )
58                         // add skinname to _skinlist, manage skinname with separates words
59                         _skinlist=strcat(_skinlist, "\"", argv(2), "\"", " ");                  
60         }
61
62         me.nItems = i;
63         me.skinlist = strzone(_skinlist);
64                 
65         search_end(glob);               
66 }
67
68 void resizeNotifyNexuizSkinList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
69 {
70         me.origin = absOrigin;
71         me.itemAbsSize = '0 0 0';
72         resizeNotifyNexuizListBox(me, relOrigin, relSize, absOrigin, absSize);
73
74         me.realFontSize_y = me.fontSize / (me.itemAbsSize_y = (absSize_y * me.itemHeight));
75         me.realFontSize_x = me.fontSize / (me.itemAbsSize_x = (absSize_x * (1 - me.controlWidth)));
76         me.realUpperMargin1 = 0.5 * (1 - 2.5 * me.realFontSize_y);
77         me.realUpperMargin2 = me.realUpperMargin1 + 1.5 * me.realFontSize_y;
78
79         me.columnPreviewOrigin = 0;
80         me.columnPreviewSize = me.itemAbsSize_y / me.itemAbsSize_x * 4 / 3;
81         me.columnNameOrigin = me.columnPreviewOrigin + me.columnPreviewSize + me.realFontSize_x;
82         me.columnNameSize = 1 - me.columnPreviewSize - 2 * me.realFontSize_x;
83
84         me.checkMarkSize = (eX * (me.itemAbsSize_y / me.itemAbsSize_x) + eY) * 0.5;
85         me.checkMarkOrigin = eY + eX * (me.columnPreviewOrigin + me.columnPreviewSize) - me.checkMarkSize;
86 }
87
88 void drawNexuizSkinList(entity me)
89 {
90         drawListBox(me);
91 }
92
93 void drawListBoxItemNexuizSkinList(entity me, float i, vector absSize, float isSelected)
94 {
95         
96         string s;
97         float theAlpha;
98         
99         tokenize_sane(me.skinlist);     
100                 
101         if(isSelected)
102                 draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
103                 
104         if( me.currentskin == argv(i) )
105                 draw_Fill('0 0 0', '1 1 0', SKINCOLOR_MAPLIST_INCLUDEDBG, SKINALPHA_MAPLIST_INCLUDEDBG);
106                 
107         theAlpha = SKINALPHA_MAPLIST_INCLUDEDFG;
108                 
109         draw_Picture(me.columnPreviewOrigin * eX, strcat("/gfx/menu/", argv(i), "/skinpreview"), me.columnPreviewSize * eX + eY, '1 1 1', theAlpha);
110         
111         s = draw_TextShortenToWidth(argv(i), me.columnNameSize / me.realFontSize_x, 0);
112         draw_Text(me.realUpperMargin1 * eY + (me.columnNameOrigin + 0.00 * (me.columnNameSize - draw_TextWidth(s, 0) * me.realFontSize_x)) * eX, s, me.realFontSize, SKINCOLOR_MAPLIST_TITLE, theAlpha, 0);
113         
114 }
115
116 void setSkin(entity btn, entity me)
117 {
118         float i;
119         
120         i = me.selectedItem;
121         
122         if(i >= me.nItems || i < 0)
123                 return;
124                 
125         tokenize_sane(me.skinlist);
126         cvar_set("menu_skin", argv(i));
127         localcmd("\nmenu_restart\ntogglemenu\ndefer 1 \"menu_cmd skinselect\"\n");
128
129 }
130 #endif