]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/menu/nexuiz/credits.c
change dragScrollTimer to be an absolute time instead of a counter that gets decrease...
[divverent/nexuiz.git] / data / qcsrc / menu / nexuiz / credits.c
1 #ifdef INTERFACE
2 CLASS(NexuizCreditsList) EXTENDS(NexuizListBox)
3         METHOD(NexuizCreditsList, configureNexuizCreditsList, void(entity))
4         ATTRIB(NexuizCreditsList, rowsPerItem, float, 1)
5         METHOD(NexuizCreditsList, draw, void(entity))
6         METHOD(NexuizCreditsList, drawListBoxItem, void(entity, float, vector, float))
7         METHOD(NexuizCreditsList, resizeNotify, void(entity, vector, vector, vector, vector))
8         METHOD(NexuizCreditsList, keyDown, float(entity, float, float, float))
9
10         ATTRIB(NexuizCreditsList, realFontSize, vector, '0 0 0')
11         ATTRIB(NexuizCreditsList, realUpperMargin, float, 0)
12         ATTRIB(NexuizCreditsList, bufferIndex, float, 0)
13         ATTRIB(NexuizCreditsList, scrolling, float, 0)
14 ENDCLASS(NexuizCreditsList)
15 entity makeNexuizCreditsList();
16 #endif
17
18 #ifdef IMPLEMENTATION
19 entity makeNexuizCreditsList()
20 {
21         entity me;
22         me = spawnNexuizCreditsList();
23         me.configureNexuizCreditsList(me);
24         return me;
25 }
26 void configureNexuizCreditsListNexuizCreditsList(entity me)
27 {
28         me.configureNexuizListBox(me);
29         // load the file
30         me.bufferIndex = buf_load("nexuiz-credits.txt");
31         me.nItems = buf_getsize(me.bufferIndex);
32 }
33 void drawNexuizCreditsList(entity me)
34 {
35         float i;
36         if(me.scrolling && time > me.scrolling)
37         {
38                 me.scrollPos = min(me.scrollPos + frametime * me.itemHeight, me.nItems * me.itemHeight - 1);
39                 i = min(me.selectedItem, floor((me.scrollPos + 1) / me.itemHeight - 1));
40                 i = max(i, ceil(me.scrollPos / me.itemHeight));
41                 me.setSelected(me, i);
42         }
43         drawListBox(me);
44 }
45 void resizeNotifyNexuizCreditsList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
46 {
47         resizeNotifyNexuizListBox(me, relOrigin, relSize, absOrigin, absSize);
48
49         me.realFontSize_y = me.fontSize / (absSize_y * me.itemHeight);
50         me.realFontSize_x = me.fontSize / (absSize_x * (1 - me.controlWidth));
51         me.realUpperMargin = 0.5 * (1 - me.realFontSize_y);
52 }
53 void drawListBoxItemNexuizCreditsList(entity me, float i, vector absSize, float isSelected)
54 {
55         // layout: Ping, Credits name, Map name, NP, TP, MP
56         string s;
57         float theAlpha;
58         vector theColor;
59
60         s = bufstr_get(me.bufferIndex, i);
61
62         if(substring(s, 0, 2) == "**")
63         {
64                 s = substring(s, 2, strlen(s) - 2);
65                 theColor = SKINCOLOR_CREDITS_TITLE;
66                 theAlpha = SKINALPHA_CREDITS_TITLE;
67         }
68         else if(substring(s, 0, 1) == "*")
69         {
70                 s = substring(s, 1, strlen(s) - 1);
71                 theColor = SKINCOLOR_CREDITS_FUNCTION;
72                 theAlpha = SKINALPHA_CREDITS_FUNCTION;
73         }
74         else
75         {
76                 theColor = SKINCOLOR_CREDITS_PERSON;
77                 theAlpha = SKINALPHA_CREDITS_PERSON;
78         }
79
80         draw_CenterText(me.realUpperMargin * eY + 0.5 * eX, s, me.realFontSize, theColor, theAlpha, 0);
81 }
82
83 float keyDownNexuizCreditsList(entity me, float scan, float ascii, float shift)
84 {
85         float i;
86         me.dragScrollTimer = time;
87         me.scrolling = 0;
88
89         if(scan == K_PGUP)
90                 me.scrollPos = max(me.scrollPos - 0.5, 0);
91         else if(scan == K_PGDN)
92                 me.scrollPos = min(me.scrollPos + 0.5, me.nItems * me.itemHeight - 1);
93         else if(scan == K_UPARROW)
94                 me.scrollPos = max(me.scrollPos - me.itemHeight, 0);
95         else if(scan == K_DOWNARROW)
96                 me.scrollPos = min(me.scrollPos + me.itemHeight, me.nItems * me.itemHeight - 1);
97         else
98                 return keyDownListBox(me, scan, ascii, shift);
99
100         i = min(me.selectedItem, floor((me.scrollPos + 1) / me.itemHeight - 1));
101         i = max(i, ceil(me.scrollPos / me.itemHeight));
102         me.setSelected(me, i);
103
104         return 1;
105 }
106 #endif