]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/menu/nexuiz/skinlist.c
warn fixes
[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(NexuizSkinList, resizeNotify, void(entity, vector, vector, vector, vector))
6         METHOD(NexuizSkinList, drawListBoxItem, void(entity, float, vector, float))
7         METHOD(NexuizSkinList, getSkins, void(entity))
8         METHOD(NexuizSkinList, setSkin, void(entity))
9         METHOD(NexuizSkinList, loadCvars, void(entity))
10         METHOD(NexuizSkinList, saveCvars, void(entity))
11         METHOD(NexuizSkinList, skinName, string(entity, float))
12         METHOD(NexuizSkinList, clickListBoxItem, void(entity, float, vector))
13         METHOD(NexuizSkinList, keyDown, float(entity, float, float, float))
14         METHOD(NexuizSkinList, destroy, void(entity))
15
16         ATTRIB(NexuizSkinList, skinlist, float, -1)
17         ATTRIB(NexuizSkinList, realFontSize, vector, '0 0 0')
18         ATTRIB(NexuizSkinList, columnPreviewOrigin, float, 0)
19         ATTRIB(NexuizSkinList, columnPreviewSize, float, 0)
20         ATTRIB(NexuizSkinList, columnNameOrigin, float, 0)
21         ATTRIB(NexuizSkinList, columnNameSize, float, 0)
22         ATTRIB(NexuizSkinList, realUpperMargin, float, 0)       
23         ATTRIB(NexuizSkinList, origin, vector, '0 0 0')
24         ATTRIB(NexuizSkinList, itemAbsSize, vector, '0 0 0')
25
26         ATTRIB(NexuizSkinList, lastClickedSkin, float, -1)
27         ATTRIB(NexuizSkinList, lastClickedTime, float, 0)
28
29         ATTRIB(NexuizSkinList, name, string, "skinselector")
30 ENDCLASS(NexuizSkinList)
31
32 entity makeNexuizSkinList();
33 void SetSkin_Click(entity btn, entity me);
34 #endif
35
36 #ifdef IMPLEMENTATION
37
38 entity makeNexuizSkinList()
39 {
40         entity me;
41         me = spawnNexuizSkinList();
42         me.configureNexuizSkinList(me);
43         return me;
44 }
45
46 void configureNexuizSkinListNexuizSkinList(entity me)
47 {
48         me.configureNexuizListBox(me);
49         me.getSkins(me);
50         me.loadCvars(me);
51 }
52
53 void loadCvarsNexuizSkinList(entity me)
54 {
55         string s;
56         float i, n;
57         s = cvar_string("menu_skin");
58         n = me.nItems;
59         for(i = 0; i < n; ++i)
60         {
61                 if(me.skinName(me, i) == s)
62                 {
63                         me.selectedItem = i;
64                         break;
65                 }
66         }
67 }
68
69 void saveCvarsNexuizSkinList(entity me)
70 {
71         cvar_set("menu_skin", me.skinName(me, me.selectedItem));
72 }
73
74 string skinNameNexuizSkinList(entity me, float i)
75 {
76         string s;
77         s = search_getfilename(me.skinlist, i);
78         s = substring(s, 9, strlen(s) - 9 - 15);  // gfx/menu/, skinvalues.txt
79         return s;
80 }
81
82 void getSkinsNexuizSkinList(entity me)
83 {
84         me.skinlist = search_begin("gfx/menu/*/skinvalues.txt", TRUE, TRUE);
85         me.nItems = search_getsize(me.skinlist);
86 }
87
88 void destroyNexuizSkinList(entity me)
89 {
90         search_end(me.skinlist);
91 }
92
93 void resizeNotifyNexuizSkinList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
94 {
95         me.origin = absOrigin;
96         me.itemAbsSize = '0 0 0';
97         resizeNotifyNexuizListBox(me, relOrigin, relSize, absOrigin, absSize);
98
99         me.realFontSize_y = me.fontSize / (me.itemAbsSize_y = (absSize_y * me.itemHeight));
100         me.realFontSize_x = me.fontSize / (me.itemAbsSize_x = (absSize_x * (1 - me.controlWidth)));
101         me.realUpperMargin = 0.5 * (1 - me.realFontSize_y);
102
103         me.columnPreviewOrigin = 0;
104         me.columnPreviewSize = me.itemAbsSize_y / me.itemAbsSize_x * 4 / 3;
105         me.columnNameOrigin = me.columnPreviewOrigin + me.columnPreviewSize + me.realFontSize_x;
106         me.columnNameSize = 1 - me.columnPreviewSize - 2 * me.realFontSize_x;
107 }
108
109 void drawListBoxItemNexuizSkinList(entity me, float i, vector absSize, float isSelected)
110 {
111         string s;
112         
113         if(isSelected)
114                 draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
115                 
116         s = me.skinName(me, i);
117         draw_Picture(me.columnPreviewOrigin * eX, strcat("/gfx/menu/", s, "/skinpreview"), me.columnPreviewSize * eX + eY, '1 1 1', 1);
118         
119         s = draw_TextShortenToWidth(s, me.columnNameSize / me.realFontSize_x, 0);
120         draw_Text(me.realUpperMargin * eY + (me.columnNameOrigin + 0.00 * (me.columnNameSize - draw_TextWidth(s, 0) * me.realFontSize_x)) * eX, s, me.realFontSize, '1 1 1', SKINALPHA_TEXT, 0);
121 }
122
123 void setSkinNexuizSkinList(entity me)
124 {
125         me.saveCvars(me);
126         localcmd("\nmenu_restart\ntogglemenu\ndefer 0.1 \"menu_cmd skinselect\"\n");
127 }
128
129 void SetSkin_Click(entity btn, entity me)
130 {
131         me.setSkin(me);
132 }
133
134 void clickListBoxItemNexuizSkinList(entity me, float i, vector where)
135 {
136         if(i == me.lastClickedSkin)
137                 if(time < me.lastClickedTime + 0.3)
138                 {
139                         // DOUBLE CLICK!
140                         me.setSelected(me, i);
141                         me.setSkin(me);
142                 }
143         me.lastClickedSkin = i;
144         me.lastClickedTime = time;
145 }
146
147 float keyDownNexuizSkinList(entity me, float scan, float ascii, float shift)
148 {
149         if(scan == K_ENTER) {
150                 me.setSkin(me);
151                 return 1;
152         }
153         else
154                 return keyDownListBox(me, scan, ascii, shift);
155 }
156 #endif