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