]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/menu/xonotic/colorpicker.qc
Merge branch 'master' into terencehill/menu_weaponarena_selection_fix
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / xonotic / colorpicker.qc
1 #ifndef COLORPICKER_H
2 #define COLORPICKER_H
3 #include "../item/image.qc"
4 CLASS(XonoticColorpicker, Image)
5         METHOD(XonoticColorpicker, configureXonoticColorpicker, void(entity, entity));
6         METHOD(XonoticColorpicker, mousePress, float(entity, vector));
7         METHOD(XonoticColorpicker, mouseRelease, float(entity, vector));
8         METHOD(XonoticColorpicker, mouseDrag, float(entity, vector));
9         ATTRIB(XonoticColorpicker, controlledTextbox, entity, NULL)
10         ATTRIB(XonoticColorpicker, image, string, SKINGFX_COLORPICKER)
11         ATTRIB(XonoticColorpicker, imagemargin, vector, SKINMARGIN_COLORPICKER)
12         ATTRIB(XonoticColorpicker, focusable, float, 1)
13         METHOD(XonoticColorpicker, focusLeave, void(entity));
14         METHOD(XonoticColorpicker, keyDown, float(entity, float, float, float));
15         METHOD(XonoticColorpicker, draw, void(entity));
16 ENDCLASS(XonoticColorpicker)
17 entity makeXonoticColorpicker(entity theTextbox);
18 #endif
19
20 #ifdef IMPLEMENTATION
21 entity makeXonoticColorpicker(entity theTextbox)
22 {
23         entity me;
24         me = NEW(XonoticColorpicker);
25         me.configureXonoticColorpicker(me, theTextbox);
26         return me;
27 }
28
29 void XonoticColorpicker_configureXonoticColorpicker(entity me, entity theTextbox)
30 {
31         me.controlledTextbox = theTextbox;
32         me.configureImage(me, me.image);
33 }
34
35 float XonoticColorpicker_mousePress(entity me, vector coords)
36 {
37         me.mouseDrag(me, coords);
38         return 1;
39 }
40
41 // must match hslimage.c
42 vector hslimage_color(vector v, vector margin)
43 {
44     v_x = (v.x - margin.x) / (1 - 2 * margin.x);
45     v_y = (v.y - margin.y) / (1 - 2 * margin.y);
46     if(v.x < 0) v_x = 0;
47     if(v.y < 0) v_y = 0;
48     if(v.x > 1) v_x = 1;
49     if(v.y > 1) v_y = 1;
50     if(v.y > 0.875) // grey bar
51         return hsl_to_rgb(eZ * v.x);
52     else
53         return hsl_to_rgb(v.x * 6 * eX + eY + v.y / 0.875 * eZ);
54 }
55
56 vector color_hslimage(vector v, vector margin)
57 {
58         vector pos = '0 0 0';
59         v = rgb_to_hsl(v);
60         if (v.y)
61         {
62                 pos_x = v.x / 6;
63                 pos_y = v.z * 0.875;
64         }
65         else // grey scale
66         {
67                 pos_x = v.z;
68                 pos_y = 0.875 + 0.07;
69         }
70         pos_x = margin.x + pos.x * (1 - 2 * margin.x);
71         pos_y = margin.y + pos.y * (1 - 2 * margin.y);
72         return pos;
73 }
74
75 float XonoticColorpicker_mouseDrag(entity me, vector coords)
76 {
77         float i, carets;
78         for (;;)
79         {
80                 i = me.controlledTextbox.cursorPos;
81                 if(i >= 2)
82                 {
83                         if(substring(me.controlledTextbox.text, i-2, 1) == "^")
84                         {
85                                 carets = 1;
86                                 while (i - 2 - carets >= 0 && substring(me.controlledTextbox.text, i - 2 - carets, 1) == "^")
87                                         ++carets;
88                                 if (carets & 1)
89                                         if(strstrofs("0123456789", substring(me.controlledTextbox.text, i-1, 1), 0) >= 0)
90                                         {
91                                                 me.controlledTextbox.keyDown(me.controlledTextbox, K_BACKSPACE, 8, 0);
92                                                 me.controlledTextbox.keyDown(me.controlledTextbox, K_BACKSPACE, 8, 0);
93                                                 continue;
94                                         }
95                         }
96                 }
97
98                 if(i >= 5)
99                 {
100                         if(substring(me.controlledTextbox.text, i-5, 2) == "^x")
101                         {
102                                 carets = 1;
103                                 while (i - 5 - carets >= 0 && substring(me.controlledTextbox.text, i - 5 - carets, 1) == "^")
104                                         ++carets;
105                                 if (carets & 1)
106                                         if(strstrofs("0123456789abcdefABCDEF", substring(me.controlledTextbox.text, i-3, 1), 0) >= 0)
107                                                 if(strstrofs("0123456789abcdefABCDEF", substring(me.controlledTextbox.text, i-2, 1), 0) >= 0)
108                                                         if(strstrofs("0123456789abcdefABCDEF", substring(me.controlledTextbox.text, i-1, 1), 0) >= 0)
109                                                         {
110                                                                 me.controlledTextbox.keyDown(me.controlledTextbox, K_BACKSPACE, 8, 0);
111                                                                 me.controlledTextbox.keyDown(me.controlledTextbox, K_BACKSPACE, 8, 0);
112                                                                 me.controlledTextbox.keyDown(me.controlledTextbox, K_BACKSPACE, 8, 0);
113                                                                 me.controlledTextbox.keyDown(me.controlledTextbox, K_BACKSPACE, 8, 0);
114                                                                 me.controlledTextbox.keyDown(me.controlledTextbox, K_BACKSPACE, 8, 0);
115                                                                 continue;
116                                                         }
117                         }
118                 }
119                 break;
120         }
121
122         if(substring(me.controlledTextbox.text, i-1, 1) == "^")
123         {
124                 carets = 1;
125                 while (i - 1 - carets >= 0 && substring(me.controlledTextbox.text, i - 1 - carets, 1) == "^")
126                         ++carets;
127                 if (carets & 1)
128                         me.controlledTextbox.enterText(me.controlledTextbox, "^"); // escape previous caret
129         }
130
131         vector margin;
132         margin = me.imagemargin;
133         if(coords.x >= margin.x)
134         if(coords.y >= margin.y)
135         if(coords.x <= 1 - margin.x)
136         if(coords.y <= 1 - margin.y)
137                 me.controlledTextbox.enterText(me.controlledTextbox, rgb_to_hexcolor(hslimage_color(coords, margin)));
138
139         return 1;
140 }
141
142 float XonoticColorpicker_mouseRelease(entity me, vector coords)
143 {
144         m_play_click_sound(MENU_SOUND_SLIDE);
145         me.mouseDrag(me, coords);
146         return 1;
147 }
148
149 void XonoticColorpicker_focusLeave(entity me)
150 {
151         me.controlledTextbox.saveCvars(me.controlledTextbox);
152 }
153 float XonoticColorpicker_keyDown(entity me, float key, float ascii, float shift)
154 {
155         return me.controlledTextbox.keyDown(me.controlledTextbox, key, ascii, shift);
156 }
157 void XonoticColorpicker_draw(entity me)
158 {
159         SUPER(XonoticColorpicker).draw(me);
160
161         float B, C, aC;
162         C = cvar("r_textcontrast");
163         B = cvar("r_textbrightness");
164
165         // for this to work, C/(1-B) must be in 0..1
166         // B must be < 1
167         // C must be < 1-B
168
169         B = bound(0, B, 1);
170         C = bound(0, C, 1-B);
171
172         aC = 1 - C / (1 - B);
173
174         draw_Picture(me.imgOrigin, strcat(me.src, "_m"), me.imgSize, '0 0 0', aC);
175         draw_Picture(me.imgOrigin, strcat(me.src, "_m"), me.imgSize, me.color, B);
176 }
177 #endif