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