8 static ColorKey defaultKeys[] =
24 static ColorKey defaultKeys[] =
27 { Color { 146, 237, 237 }, 0.2f },
29 { lightYellow, 0.5f },
30 { Color { 255, 100, 0 }, 0.8f },
35 static ColorKey defaultKeys[] =
38 { Color { 146, 213, 237 }, 0.198606268f },
40 { Color { 255, 255, 124 }, 0.444250882f },
41 { Color { 255, 100, 0 }, 0.634146333f },
45 class ArrayColorKeys : OldArray
47 type = class(ColorKey);
53 ArrayColorKeys keys { };
59 keys.size = sizeof(defaultKeys) / sizeof(ColorKey);
60 memcpy(keys._, defaultKeys, sizeof(ColorKey) * keys.size);
64 define handleWidth = 15;
66 static uint CompareKeys(ColorKey a, ColorKey b)
68 if(a.percent > b.percent) return 1;
69 else if(a.percent < b.percent) return -1;
73 class KeyHandle : Window
75 size = { handleWidth, 20 };
82 bool OnLeftButtonDown(int x, int y, Modifiers mods)
84 GradientDesigner designer = (GradientDesigner)master;
86 startPos = position.x;
94 bool OnMouseMove(int x, int y, Modifiers mods)
98 GradientDesigner designer = (GradientDesigner)master;
102 for(c = 0; c < designer.gradient.keys.size; c++)
104 key = &designer.gradient.keys._[c];
105 if(key->percent == percent && key->color == background)
111 x -= designer.preview.position.x;
112 x += handleWidth / 2;
113 key->percent = (float) x / (float) designer.preview.size.w;
116 x = Min(x, designer.preview.size.w);
117 percent = (float) x / (float) designer.preview.size.w;
119 position.x = (percent * designer.preview.size.w) + designer.preview.position.x - handleWidth/2;
120 startPos = position.x;
122 qsort(designer.gradient.keys._, designer.gradient.keys.size, sizeof(ColorKey), CompareKeys);
124 for(c = 0; c < designer.gradient.keys.size; c++)
126 key = &designer.gradient.keys._[c];
127 if(key->percent < 0) key->percent = 0;
128 else if(key->percent > 1) key->percent = 1;
131 designer.Update(null);
132 designer.NotifyUpdate(designer.master);
137 bool OnLeftDoubleClick(int x, int y, Modifiers mods)
139 ColorPicker colorPicker { master = this };
140 colorPicker.color = background;
142 if(colorPicker.Modal() == ok)
144 GradientDesigner designer = (GradientDesigner)master;
148 for(c = 0; c < designer.gradient.keys.size; c++)
150 key = &designer.gradient.keys._[c];
151 if(key->percent == percent && key->color == background)
154 background = colorPicker.color;
155 key->color = background;
156 designer.Update(null);
157 designer.NotifyUpdate(designer.master);
163 bool OnKeyDown(Key key, unichar ch)
167 GradientDesigner designer = (GradientDesigner)master;
171 for(c = 0; c < designer.gradient.keys.size; c++)
173 key = &designer.gradient.keys._[c];
174 if(key->percent == percent && key->color == background)
177 *key = designer.gradient.keys._[designer.gradient.keys.size-1];
178 designer.gradient.keys.size--;
179 qsort(designer.gradient.keys._, designer.gradient.keys.size, sizeof(ColorKey), CompareKeys);
182 designer.Update(null);
183 designer.NotifyUpdate(designer.master);
189 bool OnLeftButtonUp(int x, int y, Modifiers mods)
199 void OnRedraw(Surface surface)
203 if(background.r > 128 || background.g > 128)
204 surface.SetForeground(darkGray);
206 surface.SetForeground(white);
208 surface.Rectangle(0,0,clientSize.w-1, clientSize.h-1);
209 surface.Rectangle(1,1,clientSize.w-2, clientSize.h-2);
213 bool OnActivate(bool active, Window previous, bool * goOnWithActivation, bool direct)
220 class GradientDesigner : Window
222 text = "Gradient Designer";
227 ColorGradient gradient { };
230 this, anchor = { left = 10, right = 10, top = 75, bottom = 75 };
233 void OnRedraw(Surface surface)
235 ColorGradient gradient = ((GradientDesigner)master).gradient;
236 surface.Gradient(gradient.keys._, gradient.keys.size, gradient.smoothness, horizontal, 0,0, clientSize.w-1, clientSize.h-1);
240 void OnRedraw(Surface surface)
244 for(c = 0; c < gradient.keys.size; c++)
246 ColorKey * key = gradient.keys._ + c;
247 int x = key->percent * preview.size.w + preview.position.x;
248 surface.SetForeground(black);
249 surface.DrawLine(x - 6, preview.position.y - 10, x, preview.position.y);
250 surface.DrawLine(x + 6, preview.position.y - 10, x, preview.position.y);
251 surface.SetForeground(gray);
252 surface.DrawLine(x - 5, preview.position.y - 10, x, preview.position.y - 1);
253 surface.DrawLine(x + 5, preview.position.y - 10, x, preview.position.y - 1);
258 this, borderStyle = deep, clientSize = { 124, 18 }, position = { 16, 240 }, range = 100;
261 void NotifyScrolling(ScrollBar scrollBar, ScrollBarAction action, int position, Key key)
263 gradient.smoothness = position / 100.0f;
265 NotifyUpdate(master);
268 Label lblSmoothness { this, labeledWindow = smoothness, position = { 16, 220 } };
275 smoothness.thumbPosition = (int)gradient.smoothness * 100;
276 for(window = firstChild; window; window = next)
279 if(window._class == class(KeyHandle))
284 for(c = 0; c < gradient.keys.size; c++)
286 ColorKey * key = gradient.keys._ + c;
287 KeyHandle handle { this, percent = key->percent, position = { key->percent * preview.size.w + preview.position.x - handleWidth/2, preview.position.y - 30 }, background = key->color };
297 ColorPicker picker { master = this, autoCreate = false, color = white };
299 bool OnLeftButtonDown(int x, int y, Modifiers mods)
301 if(x >= preview.position.x && x < preview.position.x + preview.size.w && y < preview.position.y && y > preview.position.y - 30)
303 if(picker.Modal() == ok)
309 gradient.keys.size++;
310 key = gradient.keys._ + gradient.keys.size - 1;
311 x -= preview.position.x;
312 x = Max(Min(x, preview.size.w), 0);
313 key->percent = (float) x / (float) preview.size.w;
314 key->color = picker.color;
316 handle = KeyHandle { this, percent = key->percent, position = { key->percent * preview.size.w + preview.position.x - handleWidth/2, preview.position.y - 30 }, background = key->color };
319 qsort(gradient.keys._, gradient.keys.size, sizeof(ColorKey), CompareKeys);
321 for(c = 0; c < gradient.keys.size; c++)
323 key = &gradient.keys._[c];
324 if(key->percent == handle.percent && key->color == handle.background)
327 key->color = picker.color;
328 handle.background = picker.color;
330 NotifyUpdate(master);
336 virtual void Window::NotifyUpdate();