]> de.git.xonotic.org Git - voretournament/voretournament.git/blob - data/qcsrc/menu/voret/colorpicker.c
Actually, set the gametype in the .instantaction file
[voretournament/voretournament.git] / data / qcsrc / menu / voret / colorpicker.c
1 #ifdef INTERFACE\r
2 CLASS(VoretColorpicker) EXTENDS(Image)\r
3         METHOD(VoretColorpicker, configureVoretColorpicker, void(entity, entity))\r
4         METHOD(VoretColorpicker, mousePress, float(entity, vector))\r
5         METHOD(VoretColorpicker, mouseRelease, float(entity, vector))\r
6         METHOD(VoretColorpicker, mouseDrag, float(entity, vector))\r
7         ATTRIB(VoretColorpicker, controlledTextbox, entity, NULL)\r
8         ATTRIB(VoretColorpicker, image, string, SKINGFX_COLORPICKER)\r
9         ATTRIB(VoretColorpicker, imagemargin, vector, SKINMARGIN_COLORPICKER)\r
10         ATTRIB(VoretColorpicker, focusable, float, 1)\r
11         METHOD(VoretColorpicker, focusLeave, void(entity))\r
12         METHOD(VoretColorpicker, keyDown, float(entity, float, float, float))\r
13         METHOD(VoretColorpicker, draw, void(entity))\r
14 ENDCLASS(VoretColorpicker)\r
15 entity makeVoretColorpicker(entity theTextbox);\r
16 #endif\r
17 \r
18 #ifdef IMPLEMENTATION\r
19 entity makeVoretColorpicker(entity theTextbox)\r
20 {\r
21         entity me;\r
22         me = spawnVoretColorpicker();\r
23         me.configureVoretColorpicker(me, theTextbox);\r
24         return me;\r
25 }\r
26 \r
27 void configureVoretColorpickerVoretColorpicker(entity me, entity theTextbox)\r
28 {\r
29         me.controlledTextbox = theTextbox;\r
30         me.configureImage(me, me.image);\r
31 }\r
32 \r
33 float mousePressVoretColorpicker(entity me, vector coords)\r
34 {\r
35         me.mouseDrag(me, coords);\r
36         return 1;\r
37 }\r
38 \r
39 // must match hslimage.c\r
40 vector hslimage_color(vector v, vector margin)\r
41 {\r
42     v_x = (v_x - margin_x) / (1 - 2 * margin_x);\r
43     v_y = (v_y - margin_y) / (1 - 2 * margin_y);\r
44     if(v_x < 0) v_x = 0;\r
45     if(v_y < 0) v_y = 0;\r
46     if(v_x > 1) v_x = 1;\r
47     if(v_y > 1) v_y = 1;\r
48     if(v_y > 0.875) // grey bar\r
49         return hsl_to_rgb(eZ * v_x);\r
50     else\r
51         return hsl_to_rgb(v_x * 6 * eX + eY + v_y / 0.875 * eZ);\r
52 }\r
53 \r
54 float mouseDragVoretColorpicker(entity me, vector coords)\r
55 {\r
56         float i;\r
57         for(;;)\r
58         {\r
59                 i = me.controlledTextbox.cursorPos;\r
60                 if(i >= 2)\r
61                 {\r
62                         if(substring(me.controlledTextbox.text, i-2, 1) == "^")\r
63                                 if(strstrofs("0123456789", substring(me.controlledTextbox.text, i-1, 1), 0) >= 0)\r
64                                 {\r
65                                         me.controlledTextbox.keyDown(me.controlledTextbox, K_BACKSPACE, 8, 0);\r
66                                         me.controlledTextbox.keyDown(me.controlledTextbox, K_BACKSPACE, 8, 0);\r
67                                         continue;\r
68                                 }\r
69                 }\r
70 \r
71                 if(i >= 5)\r
72                 {\r
73                         if(substring(me.controlledTextbox.text, i-5, 2) == "^x")\r
74                                 if(strstrofs("0123456789abcdefABCDEF", substring(me.controlledTextbox.text, i-3, 1), 0) >= 0)\r
75                                         if(strstrofs("0123456789abcdefABCDEF", substring(me.controlledTextbox.text, i-2, 1), 0) >= 0)\r
76                                                 if(strstrofs("0123456789abcdefABCDEF", substring(me.controlledTextbox.text, i-1, 1), 0) >= 0)\r
77                                                 {\r
78                                                         me.controlledTextbox.keyDown(me.controlledTextbox, K_BACKSPACE, 8, 0);\r
79                                                         me.controlledTextbox.keyDown(me.controlledTextbox, K_BACKSPACE, 8, 0);\r
80                                                         me.controlledTextbox.keyDown(me.controlledTextbox, K_BACKSPACE, 8, 0);\r
81                                                         me.controlledTextbox.keyDown(me.controlledTextbox, K_BACKSPACE, 8, 0);\r
82                                                         me.controlledTextbox.keyDown(me.controlledTextbox, K_BACKSPACE, 8, 0);\r
83                                                         continue;\r
84                                                 }\r
85                 }\r
86                 break;\r
87         }\r
88 \r
89         vector margin;\r
90         margin = me.imagemargin;\r
91         if(coords_x >= margin_x)\r
92         if(coords_y >= margin_y)\r
93         if(coords_x <= 1 - margin_x)\r
94         if(coords_y <= 1 - margin_y)\r
95                 me.controlledTextbox.enterText(me.controlledTextbox, rgb_to_hexcolor(hslimage_color(coords, margin)));\r
96 \r
97         return 1;\r
98 }\r
99 \r
100 float mouseReleaseVoretColorpicker(entity me, vector coords)\r
101 {\r
102         me.mouseDrag(me, coords);\r
103         return 1;\r
104 }\r
105 \r
106 void focusLeaveVoretColorpicker(entity me)\r
107 {\r
108         me.controlledTextbox.saveCvars(me.controlledTextbox);\r
109 }\r
110 float keyDownVoretColorpicker(entity me, float key, float ascii, float shift)\r
111 {\r
112         return me.controlledTextbox.keyDown(me.controlledTextbox, key, ascii, shift);\r
113 }\r
114 void drawVoretColorpicker(entity me)\r
115 {\r
116         drawImage(me);\r
117 \r
118         float B, C, aC;\r
119         C = cvar("r_textcontrast");\r
120         B = cvar("r_textbrightness");\r
121 \r
122         // for this to work, C/(1-B) must be in 0..1\r
123         // B must be < 1\r
124         // C must be < 1-B\r
125         \r
126         B = bound(0, B, 1);\r
127         C = bound(0, C, 1-B);\r
128 \r
129         aC = 1 - C / (1 - B);\r
130 \r
131         draw_Picture(me.imgOrigin, strcat(me.src, "_m"), me.imgSize, '0 0 0', aC);\r
132         draw_Picture(me.imgOrigin, strcat(me.src, "_m"), me.imgSize, me.color, B);\r
133 }\r
134 #endif\r