SHOW:
|
|
- or go back to the newest paste.
1 | --[[Well, I also had to fix it, so I fixed the script so it atleast works; and doesn't spit all those errors | |
2 | The only downside with it is that you can't set the starting color, so it will automatically start as black. | |
3 | ||
4 | Usage: | |
5 | colorPicker.openSelect({255,255,255,255}) -- Just to stop it from bugging | |
6 | ||
7 | colorpicker.lua]]-- | |
8 | ||
9 | -- Fixed by Techial -- | |
10 | ||
11 | --[[ | |
12 | ||
13 | --Add this to any of your lua files. | |
14 | ||
15 | function openColor() | |
16 | ||
17 | guiSetInputEnabled(false) | |
18 | showCursor(true) | |
19 | doneLoop = false | |
20 | colorPicker.openSelect(255, 255, 255) | |
21 | finTimer = setTimer(function() | |
22 | if(colorPicker.isSelectOpen == false) then | |
23 | r, g, b = colorPicker.returnCol() | |
24 | showCursor(false) | |
25 | guiSetInputEnabled(true) | |
26 | killTimer(finTimer) | |
27 | return r, g, b | |
28 | end | |
29 | end, 2000, 0) | |
30 | ||
31 | end | |
32 | ||
33 | addEvent("openColor", true) | |
34 | addEventHandler("openColor", root, openColor) | |
35 | ||
36 | ]]-- | |
37 | ||
38 | function table.copy(theTable) | |
39 | local t = {} | |
40 | for k, v in pairs(theTable) do | |
41 | if type(v) == "table" then | |
42 | t[k] = table.copy(theTable) | |
43 | else | |
44 | t[k] = v | |
45 | end | |
46 | end | |
47 | return t | |
48 | end | |
49 | ||
50 | colorPicker = { | |
51 | default = { | |
52 | x = 0, | |
53 | y = 0, | |
54 | width = 200, | |
55 | height = 20, | |
56 | buttonWidth = .38, | |
57 | testWidth = .6, | |
58 | testHeight = 1, | |
59 | relative = false, | |
60 | value = "#ff0000ff", | |
61 | selectWindow = | |
62 | { | |
63 | width = 350, | |
64 | height = 400, | |
65 | paletteX = 18, | |
66 | paletteY = 30, | |
67 | luminanceOffset = 10, | |
68 | luminanceWidth = 15, | |
69 | alphaOffset = 25 + 17, | |
70 | alphaWidth = 15, | |
71 | rgbX = 265, | |
72 | rgbY = 300, | |
73 | rgbWidth = 50, | |
74 | rgbHeight = 21, | |
75 | hslX = 190, | |
76 | hslY = 300, | |
77 | hslWidth = 50, | |
78 | hslHeight = 21, | |
79 | historyX = 18, | |
80 | historyY = 300, | |
81 | historyWidth = 140, | |
82 | historyHeight = 80, | |
83 | noteX = 18, | |
84 | noteY = 378, | |
85 | } | |
86 | }, | |
87 | constructor = function( info ) | |
88 | info = info or colorPicker.default | |
89 | colorPicker.value = colorPicker.convertColorToTable(info.value) | |
90 | ||
91 | colorPicker.buttonWidth = info.width * colorPicker.default.buttonWidth | |
92 | ||
93 | local offset = 1 --px | |
94 | local height = 10 | |
95 | local sizeX, sizeY = guiGetSize(info.parent, false) | |
96 | if not sizeX then | |
97 | sizeX, sizeY = guiGetScreenSize() | |
98 | end | |
99 | if info.relative then | |
100 | offset = offset / sizeX | |
101 | height = height / sizeY | |
102 | end | |
103 | ||
104 | colorPicker.GUI = {} | |
105 | colorPicker.children = {} | |
106 | ||
107 | -- Create the color selection window | |
108 | local screenW, screenH = guiGetScreenSize() | |
109 | colorPicker.selectWindow = info.selectWindow | |
110 | colorPicker.GUI.selectWindow = guiCreateWindow(screenW - info.selectWindow.width, (screenH - info.selectWindow.height) / 2, | |
111 | info.selectWindow.width, info.selectWindow.height, "Pick a color", false) | |
112 | guiSetVisible(colorPicker.GUI.selectWindow, false) | |
113 | guiWindowSetSizable(colorPicker.GUI.selectWindow, false) | |
114 | ||
115 | colorPicker.GUI.palette = guiCreateStaticImage(colorPicker.selectWindow.paletteX, colorPicker.selectWindow.paletteY, | |
116 | 256, 256, "colorpicker/palette.png", false, colorPicker.GUI.selectWindow) | |
117 | colorPicker.GUI.alphaBar = guiCreateStaticImage(colorPicker.selectWindow.paletteX + 255 + colorPicker.selectWindow.alphaOffset, colorPicker.selectWindow.paletteY, | |
118 | colorPicker.selectWindow.alphaWidth, 255, "colorpicker/alpha.png", false, colorPicker.GUI.selectWindow) | |
119 | colorPicker.isSelectOpen = false | |
120 | ||
121 | -- Create the RGB and HSL edit boxes | |
122 | colorPicker.children.R = guiCreateEdit(info.selectWindow.rgbX + 10, info.selectWindow.rgbY, info.selectWindow.rgbWidth, info.selectWindow.rgbHeight, tostring( colorPicker.value[1] ), false, colorPicker.GUI.selectWindow) | |
123 | guiEditSetMaxLength(colorPicker.children.R, 3) | |
124 | addEventHandler("onClientGUIChanged", colorPicker.children.R, colorPicker.forceNaturalAndRange) | |
125 | addEventHandler("onClientGUIChanged", colorPicker.children.R, colorPicker.selectionManualInputRGB) | |
126 | colorPicker.GUI.labelR = guiCreateLabel(info.selectWindow.rgbX, info.selectWindow.rgbY + 3, | |
127 | 10, 20, "R", false, colorPicker.GUI.selectWindow) | |
128 | guiSetFont(colorPicker.GUI.labelR, "default-bold-small") | |
129 | ||
130 | colorPicker.children.G = guiCreateEdit(info.selectWindow.rgbX + 10, info.selectWindow.rgbY + info.selectWindow.rgbHeight, info.selectWindow.rgbWidth, info.selectWindow.rgbHeight, tostring( colorPicker.value[2] ), false, colorPicker.GUI.selectWindow) | |
131 | guiEditSetMaxLength(colorPicker.children.G, 3) | |
132 | addEventHandler("onClientGUIChanged", colorPicker.children.G, colorPicker.forceNaturalAndRange) | |
133 | addEventHandler("onClientGUIChanged", colorPicker.children.G, colorPicker.selectionManualInputRGB) | |
134 | colorPicker.GUI.labelG = guiCreateLabel(info.selectWindow.rgbX, info.selectWindow.rgbY + 3 + info.selectWindow.rgbHeight, | |
135 | 10, 20, "G", false, colorPicker.GUI.selectWindow) | |
136 | guiSetFont(colorPicker.GUI.labelG, "default-bold-small") | |
137 | ||
138 | colorPicker.children.B = guiCreateEdit(info.selectWindow.rgbX + 10, info.selectWindow.rgbY + info.selectWindow.rgbHeight*2, info.selectWindow.rgbWidth, info.selectWindow.rgbHeight, tostring( colorPicker.value[3] ), false, colorPicker.GUI.selectWindow) | |
139 | guiEditSetMaxLength(colorPicker.children.B, 3) | |
140 | addEventHandler("onClientGUIChanged", colorPicker.children.B, colorPicker.forceNaturalAndRange) | |
141 | addEventHandler("onClientGUIChanged", colorPicker.children.B, colorPicker.selectionManualInputRGB) | |
142 | colorPicker.GUI.labelB = guiCreateLabel(info.selectWindow.rgbX, info.selectWindow.rgbY + 3 + info.selectWindow.rgbHeight*2, | |
143 | 10, 20, "B", false, colorPicker.GUI.selectWindow) | |
144 | guiSetFont(colorPicker.GUI.labelB, "default-bold-small") | |
145 | ||
146 | colorPicker.children.A = guiCreateEdit(info.selectWindow.rgbX + 10, info.selectWindow.rgbY + info.selectWindow.rgbHeight*3, info.selectWindow.rgbWidth, info.selectWindow.rgbHeight, tostring( colorPicker.value[4] ), false, colorPicker.GUI.selectWindow) | |
147 | guiEditSetMaxLength(colorPicker.children.A, 3) | |
148 | addEventHandler("onClientGUIChanged", colorPicker.children.A, colorPicker.forceNaturalAndRange) | |
149 | addEventHandler("onClientGUIChanged", colorPicker.children.A, colorPicker.selectionManualInputRGB) | |
150 | colorPicker.GUI.labelA = guiCreateLabel(info.selectWindow.rgbX - 25, info.selectWindow.rgbY + 3 + info.selectWindow.rgbHeight*3, | |
151 | 50, 20, "Alpha", false, colorPicker.GUI.selectWindow) | |
152 | guiSetFont(colorPicker.GUI.labelA, "default-bold-small") | |
153 | ||
154 | ||
155 | colorPicker.h, colorPicker.s, colorPicker.l = colorPicker.rgb2hsl(colorPicker.value[1] / 255, colorPicker.value[2] / 255, colorPicker.value[3] / 255) | |
156 | ||
157 | colorPicker.children.H = guiCreateEdit(info.selectWindow.hslX + 10, info.selectWindow.hslY, info.selectWindow.hslWidth, info.selectWindow.hslHeight, tostring( math.floor(colorPicker.h * 255) ), false, colorPicker.GUI.selectWindow) | |
158 | guiEditSetMaxLength(colorPicker.children.H, 3) | |
159 | addEventHandler("onClientGUIChanged", colorPicker.children.H, colorPicker.forceNaturalAndRange) | |
160 | addEventHandler("onClientGUIChanged", colorPicker.children.H, colorPicker.selectionManualInputHSL) | |
161 | colorPicker.GUI.labelH = guiCreateLabel(info.selectWindow.hslX, info.selectWindow.hslY + 3, | |
162 | 10, 20, "H", false, colorPicker.GUI.selectWindow) | |
163 | guiSetFont(colorPicker.GUI.labelH, "default-bold-small") | |
164 | ||
165 | colorPicker.children.S = guiCreateEdit(info.selectWindow.hslX + 10, info.selectWindow.hslY + info.selectWindow.hslHeight, info.selectWindow.hslWidth, info.selectWindow.hslHeight, tostring( math.floor(colorPicker.s * 255) ), false, colorPicker.GUI.selectWindow) | |
166 | guiEditSetMaxLength(colorPicker.children.S, 3) | |
167 | addEventHandler("onClientGUIChanged", colorPicker.children.S, colorPicker.forceNaturalAndRange) | |
168 | addEventHandler("onClientGUIChanged", colorPicker.children.S, colorPicker.selectionManualInputHSL) | |
169 | colorPicker.GUI.labelS = guiCreateLabel(info.selectWindow.hslX, info.selectWindow.hslY + 3 + info.selectWindow.hslHeight, | |
170 | 10, 20, "S", false, colorPicker.GUI.selectWindow) | |
171 | guiSetFont(colorPicker.GUI.labelS, "default-bold-small") | |
172 | ||
173 | colorPicker.children.L = guiCreateEdit(info.selectWindow.hslX + 10, info.selectWindow.hslY + info.selectWindow.hslHeight*2, info.selectWindow.hslWidth, info.selectWindow.hslHeight, tostring( math.floor(colorPicker.s * 255) ), false, colorPicker.GUI.selectWindow) | |
174 | guiEditSetMaxLength(colorPicker.children.L, 3) | |
175 | addEventHandler("onClientGUIChanged", colorPicker.children.L, colorPicker.forceNaturalAndRange) | |
176 | addEventHandler("onClientGUIChanged", colorPicker.children.L, colorPicker.selectionManualInputHSL) | |
177 | colorPicker.GUI.labelL = guiCreateLabel(info.selectWindow.hslX, info.selectWindow.hslY + 3 + info.selectWindow.hslHeight*2, | |
178 | 10, 20, "L", false, colorPicker.GUI.selectWindow) | |
179 | guiSetFont(colorPicker.GUI.labelL, "default-bold-small") | |
180 | ||
181 | -- Create the color history | |
182 | if not colorHistory then | |
183 | colorHistory = {} | |
184 | for i=1,9 do | |
185 | colorHistory[i] = { 255, 255, 255, 200 } | |
186 | end | |
187 | end | |
188 | ||
189 | colorPicker.GUI.historyLabel = guiCreateLabel(info.selectWindow.historyX, info.selectWindow.historyY, | |
190 | 150, 15, "Recently used colors:", false, colorPicker.GUI.selectWindow) | |
191 | ||
192 | colorPicker.GUI.noteLabel = guiCreateLabel(info.selectWindow.noteX, info.selectWindow.noteY, | |
193 | 190, 15, "Click outside the window to close.", false, colorPicker.GUI.selectWindow) | |
194 | guiSetFont( colorPicker.GUI.noteLabel, "default-small" ) | |
195 | ||
196 | colorPicker.avoidRecursion = false | |
197 | end, | |
198 | forceNaturalAndRange = function() | |
199 | local inputText = guiGetText( source ) | |
200 | if not tonumber( inputText ) then | |
201 | local changedText = string.gsub( inputText, "[^%d]", "" ) | |
202 | if changedText ~= inputText then | |
203 | guiSetText(source, changedText) | |
204 | end | |
205 | end | |
206 | ||
207 | local inputNumber = tonumber(guiGetText( source )) | |
208 | if inputNumber then | |
209 | local clampedNumber = inputNumber | |
210 | clampedNumber = math.max(clampedNumber, 0) | |
211 | clampedNumber = math.min(clampedNumber, 255) | |
212 | if clampedNumber ~= inputNumber then | |
213 | guiSetText(source, tostring(clampedNumber)) | |
214 | end | |
215 | end | |
216 | end, | |
217 | setValue = function( value ) | |
218 | colorPicker.value = colorPicker.convertColorToTable(value) | |
219 | ||
220 | colorPicker.updateTempColors() | |
221 | local avoidRecursion = colorPicker.avoidRecursion | |
222 | colorPicker.avoidRecursion = true | |
223 | colorPicker.updateSelectionWindowEdits() | |
224 | colorPicker.avoidRecursion = avoidRecursion | |
225 | ||
226 | return true | |
227 | end, | |
228 | selectionManualInputRGB = function() | |
229 | if not colorPicker.avoidRecursion then | |
230 | colorPicker.avoidRecursion = true | |
231 | local r, g, b, a = tonumber(guiGetText(colorPicker.children.R)), | |
232 | tonumber(guiGetText(colorPicker.children.G)), | |
233 | tonumber(guiGetText(colorPicker.children.B)), | |
234 | tonumber(guiGetText(colorPicker.children.A)) | |
235 | if not r or not g or not b or not a then | |
236 | colorPicker.avoidRecursion = false | |
237 | return | |
238 | end | |
239 | colorPicker.h, colorPicker.s, colorPicker.l = colorPicker.rgb2hsl(r / 255, g / 255, b / 255) | |
240 | colorPicker.setValue({r, g, b, a}) | |
241 | colorPicker.avoidRecursion = false | |
242 | end | |
243 | end, | |
244 | selectionManualInputHSL = function() | |
245 | if not colorPicker.avoidRecursion then | |
246 | colorPicker.avoidRecursion = true | |
247 | local h, s, l = tonumber(guiGetText(colorPicker.children.H)), | |
248 | tonumber(guiGetText(colorPicker.children.S)), | |
249 | tonumber(guiGetText(colorPicker.children.L)) | |
250 | if not h or not s or not l then | |
251 | colorPicker.avoidRecursion = false | |
252 | return | |
253 | end | |
254 | colorPicker.h, colorPicker.s, colorPicker.l = h / 255, s / 255, l / 256 | |
255 | local r, g, b = colorPicker.hsl2rgb(colorPicker.h, colorPicker.s, colorPicker.l) | |
256 | colorPicker.setValue({r * 255, g * 255, b * 255, colorPicker.value[4]}) | |
257 | colorPicker.avoidRecursion = false | |
258 | end | |
259 | end, | |
260 | updateSelectionWindowEdits = function() | |
261 | guiSetText(colorPicker.children.R, tostring(colorPicker.value[1])) | |
262 | guiSetText(colorPicker.children.G, tostring(colorPicker.value[2])) | |
263 | guiSetText(colorPicker.children.B, tostring(colorPicker.value[3])) | |
264 | guiSetText(colorPicker.children.A, tostring(colorPicker.value[4])) | |
265 | guiSetText(colorPicker.children.H, tostring(math.floor(colorPicker.h * 255))) | |
266 | guiSetText(colorPicker.children.S, tostring(math.floor(colorPicker.s * 255))) | |
267 | guiSetText(colorPicker.children.L, tostring(math.floor(colorPicker.l * 256))) | |
268 | end, | |
269 | updateTempColors = function() | |
270 | local r, g, b, a = colorPicker.value[1], colorPicker.value[2], colorPicker.value[3], colorPicker.value[4] | |
271 | tempColors[1] = r | |
272 | tempColors[2] = g | |
273 | tempColors[3] = b | |
274 | tempColors[4] = a | |
275 | end, | |
276 | openSelect = function( currentColor ) | |
277 | if colorPicker.isSelectOpen then return end | |
278 | colorPicker.constructor() | |
279 | tempColors = {} | |
280 | colorPicker.currentColor = currentColor | |
281 | --local r, g, b, a = tempColors[currentColor].r, tempColors[currentColor].g, tempColors[currentColor].b, tempColors[currentColor].a | |
282 | colorPicker.value = { 255, 255, 255, 255 } | |
283 | ||
284 | guiSetVisible(colorPicker.GUI.selectWindow, true) | |
285 | guiBringToFront(colorPicker.GUI.selectWindow) | |
286 | addEventHandler("onClientRender", getRootElement(), colorPicker.updateSelectedValue) | |
287 | addEventHandler("onClientClick", getRootElement(), colorPicker.pickColor) | |
288 | ||
289 | colorPicker.isSelectOpen = true | |
290 | colorPicker.pickingColor = false | |
291 | colorPicker.pickingLuminance = false | |
292 | colorPicker.pickingAlpha = false | |
293 | colorPicker.h, colorPicker.s, colorPicker.l = colorPicker.rgb2hsl(colorPicker.value[1] / 255, colorPicker.value[2] / 255, colorPicker.value[3] / 255) | |
294 | end, | |
295 | closeSelect = function() | |
296 | if not colorPicker.isSelectOpen then return end | |
297 | colorPicker.currentColor = nil | |
298 | ||
299 | guiSetVisible(colorPicker.GUI.selectWindow, false) | |
300 | removeEventHandler("onClientRender", getRootElement(), colorPicker.updateSelectedValue) | |
301 | removeEventHandler("onClientClick", getRootElement(), colorPicker.pickColor) | |
302 | ||
303 | colorPicker.isSelectOpen = false | |
304 | ||
305 | colorPicker.addCurrentColorToHistory() | |
306 | end, | |
307 | addCurrentColorToHistory = function() | |
308 | -- First look up in color history to check if the | |
309 | -- current color is already present there | |
310 | for i=1,9 do | |
311 | local color = colorHistory[i] | |
312 | if color[1] == colorPicker.value[1] and | |
313 | color[2] == colorPicker.value[2] and | |
314 | color[3] == colorPicker.value[3] and | |
315 | color[4] == colorPicker.value[4] | |
316 | then | |
317 | return | |
318 | end | |
319 | end | |
320 | ||
321 | -- Pop the last color and insert the new value | |
322 | table.remove(colorHistory) | |
323 | table.insert(colorHistory, 1, table.copy(colorPicker.value)) | |
324 | end, | |
325 | updateSelectedValue = function() | |
326 | if not guiGetVisible(colorPicker.GUI.selectWindow) then return end | |
327 | ||
328 | local r, g, b, a | |
329 | ||
330 | -- Check for color changes | |
331 | local wx, wy = guiGetPosition(colorPicker.GUI.selectWindow, false) | |
332 | local paletteX, paletteY = wx + colorPicker.selectWindow.paletteX, wy + colorPicker.selectWindow.paletteY | |
333 | local luminanceX, luminanceY = paletteX + 255 + colorPicker.selectWindow.luminanceOffset, paletteY | |
334 | local alphaX, alphaY = paletteX + 255 + colorPicker.selectWindow.alphaOffset - 1, paletteY | |
335 | local cursorX, cursorY = getCursorPosition() | |
336 | local screenW, screenH = guiGetScreenSize() | |
337 | ||
338 | cursorX = cursorX * screenW | |
339 | cursorY = cursorY * screenH | |
340 | ||
341 | if colorPicker.pickingColor then | |
342 | if cursorX < paletteX then cursorX = paletteX | |
343 | elseif cursorX > paletteX + 255 then cursorX = paletteX + 255 end | |
344 | if cursorY < paletteY then cursorY = paletteY | |
345 | elseif cursorY > paletteY + 255 then cursorY = paletteY + 255 end | |
346 | ||
347 | setCursorPosition(cursorX, cursorY) | |
348 | ||
349 | colorPicker.h, colorPicker.s = (cursorX - paletteX) / 255, (255 - cursorY + paletteY) / 255 | |
350 | r, g, b = colorPicker.hsl2rgb(colorPicker.h, colorPicker.s, colorPicker.l) | |
351 | a = colorPicker.value[4] / 255 | |
352 | colorPicker.avoidRecursion = true | |
353 | colorPicker.setValue({r*255, g*255, b*255, colorPicker.value[4]}) | |
354 | colorPicker.avoidRecursion = false | |
355 | elseif colorPicker.pickingLuminance then | |
356 | if cursorY < luminanceY then cursorY = luminanceY | |
357 | elseif cursorY > luminanceY + 256 then cursorY = luminanceY + 256 end | |
358 | ||
359 | setCursorPosition(cursorX, cursorY) | |
360 | ||
361 | colorPicker.l = (256 - cursorY + luminanceY) / 256 | |
362 | r, g, b = colorPicker.hsl2rgb(colorPicker.h, colorPicker.s, colorPicker.l) | |
363 | a = colorPicker.value[4] / 255 | |
364 | colorPicker.avoidRecursion = true | |
365 | colorPicker.setValue({r*255, g*255, b*255, colorPicker.value[4]}) | |
366 | colorPicker.avoidRecursion = false | |
367 | elseif colorPicker.pickingAlpha then | |
368 | if cursorY < alphaY then cursorY = alphaY | |
369 | elseif cursorY > alphaY + 255 then cursorY = alphaY + 255 end | |
370 | ||
371 | setCursorPosition(cursorX, cursorY) | |
372 | ||
373 | colorPicker.avoidRecursion = true | |
374 | colorPicker.setValue({colorPicker.value[1], colorPicker.value[2], colorPicker.value[3], cursorY - alphaY}) | |
375 | colorPicker.avoidRecursion = false | |
376 | r, g, b, a = colorPicker.value[1] / 255, colorPicker.value[2] / 255, colorPicker.value[3] / 255, colorPicker.value[4] / 255 | |
377 | else | |
378 | r, g, b, a = colorPicker.value[1] / 255, colorPicker.value[2] / 255, colorPicker.value[3] / 255, colorPicker.value[4] / 255 | |
379 | end | |
380 | ||
381 | -- Draw the lines pointing to the current selected color | |
382 | local x = paletteX + (colorPicker.h * 255) | |
383 | local y = paletteY + ((1 - colorPicker.s) * 255) | |
384 | local color = tocolor(0, 0, 0, 255) | |
385 | ||
386 | dxDrawLine(x - 12, y, x - 2, y, color, 3, true) | |
387 | dxDrawLine(x + 2, y, x + 12, y, color, 3, true) | |
388 | dxDrawLine(x, y - 12, x, y - 2, color, 3, true) | |
389 | dxDrawLine(x, y + 2, x, y + 12, color, 3, true) | |
390 | ||
391 | -- Draw the luminance for this color | |
392 | local i | |
393 | for i=0,256 do | |
394 | local _r, _g, _b = colorPicker.hsl2rgb(colorPicker.h, colorPicker.s, (256 - i) / 256) | |
395 | local color = tocolor(_r * 255, _g * 255, _b * 255, 255) | |
396 | dxDrawRectangle(luminanceX, luminanceY + i, colorPicker.selectWindow.luminanceWidth, 1, color, true) | |
397 | end | |
398 | ||
399 | -- Draw the luminance position marker | |
400 | local arrowX = luminanceX + colorPicker.selectWindow.luminanceWidth + 4 | |
401 | local arrowY = luminanceY + ((1 - colorPicker.l) * 256) | |
402 | dxDrawLine(arrowX, arrowY, arrowX + 8, arrowY, tocolor(255, 255, 255, 255), 2, true) | |
403 | ||
404 | -- Draw the alpha for this color | |
405 | for i=0,255 do | |
406 | local color = tocolor(colorPicker.value[1], colorPicker.value[2], colorPicker.value[3], i) | |
407 | dxDrawRectangle(alphaX, alphaY + i, colorPicker.selectWindow.alphaWidth + 1, 1, color, true) | |
408 | end | |
409 | ||
410 | -- Draw the alpha position marker | |
411 | arrowX = alphaX + colorPicker.selectWindow.alphaWidth + 4 | |
412 | arrowY = alphaY + colorPicker.value[4] | |
413 | dxDrawLine(arrowX, arrowY, arrowX + 8, arrowY, tocolor(255, 255, 255, 255), 2, true) | |
414 | ||
415 | -- Draw the recently used colors | |
416 | local boxWidth = (colorPicker.selectWindow.historyWidth - 15) / 3 | |
417 | local boxHeight = (colorPicker.selectWindow.historyHeight - 45) / 3 | |
418 | for i=1,3 do | |
419 | for j=1,3 do | |
420 | local color = colorHistory[j + ((i - 1) * 3)] | |
421 | local x = wx + colorPicker.selectWindow.historyX + ((boxWidth + 5) * (j-1)) | |
422 | local y = wy + colorPicker.selectWindow.historyY + 30 + ((boxHeight + 5) * (i-1)) | |
423 | dxDrawRectangle(x, y, boxWidth, boxHeight, tocolor(unpack(color)), true) | |
424 | end | |
425 | end | |
426 | end, | |
427 | isCursorInArea = function( cursorX, cursorY, minX, minY, maxX, maxY ) | |
428 | if cursorX < minX or cursorX > maxX or | |
429 | cursorY < minY or cursorY > maxY | |
430 | then | |
431 | return false | |
432 | end | |
433 | return true | |
434 | end, | |
435 | pickColor = function( button, state, cursorX, cursorY ) | |
436 | if button ~= "left" then return end | |
437 | ||
438 | local wx, wy = guiGetPosition(colorPicker.GUI.selectWindow, false) | |
439 | local ww, wh = guiGetSize(colorPicker.GUI.selectWindow, false) | |
440 | ||
441 | local isOutsideWindow = not colorPicker.isCursorInArea(cursorX, cursorY, wx, wy, wx+ww, wy+wh) | |
442 | ||
443 | local minX, minY, maxX, maxY = wx + colorPicker.selectWindow.paletteX, | |
444 | wy + colorPicker.selectWindow.paletteY, | |
445 | wx + colorPicker.selectWindow.paletteX + 255, | |
446 | wy + colorPicker.selectWindow.paletteY + 255 | |
447 | local isInPalette = colorPicker.isCursorInArea(cursorX, cursorY, minX, minY, maxX, maxY) | |
448 | ||
449 | minX, maxX = maxX + colorPicker.selectWindow.luminanceOffset, | |
450 | maxX + colorPicker.selectWindow.luminanceOffset + colorPicker.selectWindow.luminanceWidth + 12 | |
451 | maxY = maxY + 1 | |
452 | local isInLuminance = colorPicker.isCursorInArea(cursorX, cursorY, minX, minY, maxX, maxY) | |
453 | maxY = maxY - 1 | |
454 | ||
455 | minX, maxX = wx + colorPicker.selectWindow.paletteX + 255 + colorPicker.selectWindow.alphaOffset, | |
456 | wx + colorPicker.selectWindow.paletteX + 255 + colorPicker.selectWindow.alphaOffset + colorPicker.selectWindow.alphaWidth + 12 | |
457 | local isInAlpha = colorPicker.isCursorInArea(cursorX, cursorY, minX, minY, maxX, maxY) | |
458 | ||
459 | minX, minY, maxX, maxY = wx + colorPicker.selectWindow.historyX, | |
460 | wy + colorPicker.selectWindow.historyY, | |
461 | wx + colorPicker.selectWindow.historyX + colorPicker.selectWindow.historyWidth, | |
462 | wy + colorPicker.selectWindow.historyY + colorPicker.selectWindow.historyHeight | |
463 | local isInHistory = colorPicker.isCursorInArea(cursorX, cursorY, minX, minY, maxX, maxY) | |
464 | ||
465 | if state == "down" then | |
466 | if isOutsideWindow then | |
467 | colorPicker.closeSelect() | |
468 | elseif isInPalette then | |
469 | colorPicker.pickingColor = true | |
470 | elseif isInLuminance then | |
471 | colorPicker.pickingLuminance = true | |
472 | elseif isInAlpha then | |
473 | colorPicker.pickingAlpha = true | |
474 | elseif isInHistory then | |
475 | colorPicker.pickHistory(cursorX - minX, cursorY - minY) | |
476 | end | |
477 | elseif state == "up" then | |
478 | if colorPicker.pickingColor then | |
479 | colorPicker.pickingColor = false | |
480 | elseif colorPicker.pickingLuminance then | |
481 | colorPicker.pickingLuminance = false | |
482 | elseif colorPicker.pickingAlpha then | |
483 | colorPicker.pickingAlpha = false | |
484 | end | |
485 | end | |
486 | end, | |
487 | pickHistory = function( cursorX, cursorY) | |
488 | local relX = cursorX | |
489 | local relY = cursorY - 25 | |
490 | ||
491 | if relX < 0 or relY < 0 then return end | |
492 | ||
493 | local boxWidth = (colorPicker.selectWindow.historyWidth - 15) / 3 | |
494 | local boxHeight = (colorPicker.selectWindow.historyHeight - 45) / 3 | |
495 | ||
496 | local modX = relX % (boxWidth + 5) | |
497 | local modY = relY % (boxHeight + 5) | |
498 | ||
499 | if modX > boxWidth or modY > boxHeight then return end | |
500 | ||
501 | local j = math.floor(relX / (boxWidth + 5)) | |
502 | local i = math.floor(relY / (boxHeight + 5)) | |
503 | local box = j + 1 + i * 3 | |
504 | ||
505 | if box < 1 or box > #colorHistory then return end | |
506 | local color = colorHistory[box] | |
507 | colorPicker.h, colorPicker.s, colorPicker.l = colorPicker.rgb2hsl(color[1] / 255, color[2] / 255, color[3] / 255) | |
508 | colorPicker.avoidRecursion = true | |
509 | colorPicker.setValue(color) | |
510 | colorPicker.avoidRecursion = false | |
511 | end, | |
512 | convertColorToTable = function( color ) | |
513 | local result | |
514 | ||
515 | if type(color) == "string" then | |
516 | result = {getColorFromString(color)} | |
517 | elseif type(color) == "number" then | |
518 | local str | |
519 | if color > 0xFFFFFF then | |
520 | -- RGBA color | |
521 | str = "#" .. string.format("%08X", color) | |
522 | else | |
523 | -- RGB color | |
524 | str = "#" .. string.format("%06X", color) | |
525 | end | |
526 | result = {getColorFromString(str)} | |
527 | elseif type(color) == "table" then | |
528 | result = color | |
529 | else | |
530 | result = { 255, 255, 255, 255 } | |
531 | end | |
532 | ||
533 | local checkValue = function(value) | |
534 | if not value then return 255 end | |
535 | value = math.floor(tonumber(value)) | |
536 | if value < 0 then return 0 | |
537 | elseif value > 255 then return 255 | |
538 | else return value end | |
539 | end | |
540 | result[1] = checkValue(result[1]) | |
541 | result[2] = checkValue(result[2]) | |
542 | result[3] = checkValue(result[3]) | |
543 | result[4] = checkValue(result[4]) | |
544 | ||
545 | return result | |
546 | end, | |
547 | hsl2rgb = function(h, s, l) | |
548 | local m2 | |
549 | if l < 0.5 then | |
550 | m2 = l * (s + 1) | |
551 | else | |
552 | m2 = (l + s) - (l * s) | |
553 | end | |
554 | local m1 = l * 2 - m2 | |
555 | ||
556 | local hue2rgb = function(m1, m2, h) | |
557 | if h < 0 then h = h + 1 | |
558 | elseif h > 1 then h = h - 1 end | |
559 | ||
560 | if h*6 < 1 then | |
561 | return m1 + (m2 - m1) * h * 6 | |
562 | elseif h*2 < 1 then | |
563 | return m2 | |
564 | elseif h*3 < 2 then | |
565 | return m1 + (m2 - m1) * (2/3 - h) * 6 | |
566 | else | |
567 | return m1 | |
568 | end | |
569 | end | |
570 | ||
571 | local r = hue2rgb(m1, m2, h + 1/3) | |
572 | local g = hue2rgb(m1, m2, h) | |
573 | local b = hue2rgb(m1, m2, h - 1/3) | |
574 | return r, g, b | |
575 | end, | |
576 | rgb2hsl = function(r, g, b) | |
577 | local max = math.max(r, g, b) | |
578 | local min = math.min(r, g, b) | |
579 | local l = (min + max) / 2 | |
580 | local h | |
581 | local s | |
582 | ||
583 | if max == min then | |
584 | h = 0 | |
585 | s = 0 | |
586 | else | |
587 | local d = max - min | |
588 | ||
589 | if l < 0.5 then | |
590 | s = d / (max + min) | |
591 | else | |
592 | s = d / (2 - max - min) | |
593 | end | |
594 | ||
595 | if max == r then | |
596 | h = (g - b) / d | |
597 | if g < b then h = h + 6 end | |
598 | elseif max == g then | |
599 | h = (b - r) / d + 2 | |
600 | else | |
601 | h = (r - g) / d + 4 | |
602 | end | |
603 | ||
604 | h = h / 6 | |
605 | end | |
606 | ||
607 | return h, s, l | |
608 | end, | |
609 | returnCol = function() | |
610 | return colorPicker.value[1], colorPicker.value[2], colorPicker.value[3] | |
611 | end, | |
612 | } |