]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/menu/nexuiz/charmap.c
menu-div0test -> menu
[divverent/nexuiz.git] / data / qcsrc / menu / nexuiz / charmap.c
1 #ifdef INTERFACE
2 CLASS(NexuizCharmap) EXTENDS(Image)
3         METHOD(NexuizCharmap, configureNexuizCharmap, void(entity, entity))
4         METHOD(NexuizCharmap, mousePress, float(entity, vector))
5         METHOD(NexuizCharmap, mouseRelease, float(entity, vector))
6         METHOD(NexuizCharmap, mouseMove, float(entity, vector))
7         METHOD(NexuizCharmap, mouseDrag, float(entity, vector))
8         METHOD(NexuizCharmap, keyDown, float(entity, float, float, float))
9         METHOD(NexuizCharmap, draw, void(entity))
10         ATTRIB(NexuizCharmap, controlledTextbox, entity, NULL)
11         ATTRIB(NexuizCharmap, image, string, SKINGFX_CHARMAP)
12         ATTRIB(NexuizCharmap, image2, string, SKINGFX_CHARMAP_SELECTED)
13         ATTRIB(NexuizCharmap, focusable, float, 1)
14         ATTRIB(NexuizCharmap, previouslySelectedCharacterCell, float, -1)
15         ATTRIB(NexuizCharmap, selectedCharacterCell, float, 0)
16         ATTRIB(NexuizCharmap, mouseSelectedCharacterCell, float, -1)
17 ENDCLASS(NexuizCharmap)
18 entity makeNexuizCharmap(entity theTextbox);
19 #endif
20
21 #ifdef IMPLEMENTATION
22 entity makeNexuizCharmap(entity theTextbox)
23 {
24         entity me;
25         me = spawnNexuizCharmap();
26         me.configureNexuizCharmap(me, theTextbox);
27         return me;
28 }
29
30 string CharMap_CellToChar(float c)
31 {
32         if(c == 13)
33                 return chr(127);
34         else if(c < 32)
35                 return chr(c);
36         else
37                 return chr(c + 96);
38 }
39
40 void configureNexuizCharmapNexuizCharmap(entity me, entity theTextbox)
41 {
42         me.controlledTextbox = theTextbox;
43         me.configureImage(me, me.image);
44 }
45
46 float mouseMoveNexuizCharmap(entity me, vector coords)
47 {
48         float x, y, c;
49         x = floor(coords_x * 16);
50         y = floor(coords_y * 10);
51         if(x < 0 || y < 0 || x >= 16 || y >= 10)
52         {
53                 me.mouseSelectedCharacterCell = -1;
54                 return 0;
55         }
56         c = y * 16 + x;
57         if(c != me.mouseSelectedCharacterCell)
58                 me.mouseSelectedCharacterCell = me.selectedCharacterCell = c;
59         return 1;
60 }
61 float mouseDragNexuizCharmap(entity me, vector coords)
62 {
63         return me.mouseMove(me, coords);
64 }
65 float mousePressNexuizCharmap(entity me, vector coords)
66 {
67         me.mouseMove(me, coords);
68         if(me.mouseSelectedCharacterCell >= 0)
69         {
70                 me.pressed = 1;
71                 me.previouslySelectedCharacterCell = me.selectedCharacterCell;
72         }
73         return 1;
74 }
75 float mouseReleaseNexuizCharmap(entity me, vector coords)
76 {
77         if(!me.pressed)
78                 return 0;
79         me.mouseMove(me, coords);
80         if(me.selectedCharacterCell == me.previouslySelectedCharacterCell)
81                 me.controlledTextbox.enterText(me.controlledTextbox, CharMap_CellToChar(me.selectedCharacterCell));
82         me.pressed = 0;
83         return 1;
84 }
85 float keyDownNexuizCharmap(entity me, float key, float ascii, float shift)
86 {
87         switch(key)
88         {
89                 case K_LEFTARROW:
90                         me.selectedCharacterCell = mod(me.selectedCharacterCell + 159, 160);
91                         return 1;
92                 case K_RIGHTARROW:
93                         me.selectedCharacterCell = mod(me.selectedCharacterCell + 1, 160);
94                         return 1;
95                 case K_UPARROW:
96                         me.selectedCharacterCell = mod(me.selectedCharacterCell + 144, 160);
97                         return 1;
98                 case K_DOWNARROW:
99                         me.selectedCharacterCell = mod(me.selectedCharacterCell + 16, 160);
100                         return 1;
101                 case K_HOME:
102                         me.selectedCharacterCell = 0;
103                         return 1;
104                 case K_END:
105                         me.selectedCharacterCell = 159;
106                         return 1;
107                 case K_SPACE:
108                 case K_ENTER:
109                 case K_INS:
110                         me.controlledTextbox.enterText(me.controlledTextbox, CharMap_CellToChar(me.selectedCharacterCell));
111                         return 1;
112                 default:
113                         return me.controlledTextbox.keyDown(me.controlledTextbox, key, ascii, shift);
114         }
115 }
116 void drawNexuizCharmap(entity me)
117 {
118         if(me.focused)
119         {
120                 if(!me.pressed || (me.selectedCharacterCell == me.previouslySelectedCharacterCell))
121                 {
122                         vector c;
123                         c = eX * (mod(me.selectedCharacterCell, 16) / 16.0);
124                         c += eY * (floor(me.selectedCharacterCell / 16.0) / 10.0);
125                         draw_Picture(c, me.image2, '0.0625 0.1 0', '1 1 1', 1);
126                 }
127         }
128         drawImage(me);
129 }
130 #endif