1 #include "colorpicker.qh"
5 entity makeXonoticColorpicker(entity theTextbox)
8 me = NEW(XonoticColorpicker);
9 me.configureXonoticColorpicker(me, theTextbox);
13 void XonoticColorpicker_configureXonoticColorpicker(entity me, entity theTextbox)
15 me.controlledTextbox = theTextbox;
16 me.configureImage(me, me.image);
19 METHOD(XonoticColorpicker, mousePress, bool(XonoticColorpicker this, vector pos))
21 this.mouseDrag(this, pos);
25 // must match hslimage.c
26 vector hslimage_color(vector v, vector margin)
28 v_x = (v.x - margin.x) / (1 - 2 * margin.x);
29 v_y = (v.y - margin.y) / (1 - 2 * margin.y);
34 if(v.y > 0.875) // grey bar
35 return hsl_to_rgb(eZ * v.x);
37 return hsl_to_rgb(v.x * 6 * eX + eY + v.y / 0.875 * eZ);
40 vector color_hslimage(vector v, vector margin)
54 pos_x = margin.x + pos.x * (1 - 2 * margin.x);
55 pos_y = margin.y + pos.y * (1 - 2 * margin.y);
59 float XonoticColorpicker_mouseDrag(entity me, vector coords)
64 i = me.controlledTextbox.cursorPos;
67 if(substring(me.controlledTextbox.text, i-2, 1) == "^")
70 while (i - 2 - carets >= 0 && substring(me.controlledTextbox.text, i - 2 - carets, 1) == "^")
73 if(IS_DIGIT(substring(me.controlledTextbox.text, i-1, 1)))
75 me.controlledTextbox.keyDown(me.controlledTextbox, K_BACKSPACE, 8, 0);
76 me.controlledTextbox.keyDown(me.controlledTextbox, K_BACKSPACE, 8, 0);
84 if(substring(me.controlledTextbox.text, i-5, 2) == "^x")
87 while (i - 5 - carets >= 0 && substring(me.controlledTextbox.text, i - 5 - 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)))
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);
106 if(substring(me.controlledTextbox.text, i-1, 1) == "^")
109 while (i - 1 - carets >= 0 && substring(me.controlledTextbox.text, i - 1 - carets, 1) == "^")
112 me.controlledTextbox.enterText(me.controlledTextbox, "^"); // escape previous caret
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)));
126 float XonoticColorpicker_mouseRelease(entity me, vector coords)
128 m_play_click_sound(MENU_SOUND_SLIDE);
129 me.mouseDrag(me, coords);
133 void XonoticColorpicker_focusLeave(entity me)
135 me.controlledTextbox.saveCvars(me.controlledTextbox);
137 float XonoticColorpicker_keyDown(entity me, float key, float ascii, float shift)
139 return me.controlledTextbox.keyDown(me.controlledTextbox, key, ascii, shift);
141 void XonoticColorpicker_draw(entity me)
143 SUPER(XonoticColorpicker).draw(me);
146 C = cvar("r_textcontrast");
147 B = cvar("r_textbrightness");
149 // for this to work, C/(1-B) must be in 0..1
154 C = bound(0, C, 1-B);
156 aC = 1 - C / (1 - B);
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);