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