Line data Source code
1 : /* Copyright (C) 2003-2012 by George Williams */
2 : /*
3 : * Redistribution and use in source and binary forms, with or without
4 : * modification, are permitted provided that the following conditions are met:
5 :
6 : * Redistributions of source code must retain the above copyright notice, this
7 : * list of conditions and the following disclaimer.
8 :
9 : * Redistributions in binary form must reproduce the above copyright notice,
10 : * this list of conditions and the following disclaimer in the documentation
11 : * and/or other materials provided with the distribution.
12 :
13 : * The name of the author may not be used to endorse or promote products
14 : * derived from this software without specific prior written permission.
15 :
16 : * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 : * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 : * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 : * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 : * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 : * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 : * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 : * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 : * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 : * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 : */
27 : #include "cvundoes.h"
28 : #include "effects.h"
29 : #include "fontforgeui.h"
30 : #include "splinestroke.h"
31 : #include "splineutil2.h"
32 : #include <ustring.h>
33 : #include <gkeysym.h>
34 : #include <utype.h>
35 : #include <math.h>
36 : #include "edgelist.h"
37 :
38 0 : static void CVOutline(CharView *cv, real width) {
39 : StrokeInfo si;
40 : SplineSet *temp, *spl;
41 : int changed;
42 :
43 0 : memset(&si,0,sizeof(si));
44 0 : si.removeexternal = true;
45 0 : si.radius = width;
46 : /* si.removeoverlapifneeded = true;*/
47 :
48 0 : CVPreserveState((CharViewBase *) cv);
49 0 : temp = SplineSetStroke(cv->b.layerheads[cv->b.drawmode]->splines,&si,cv->b.layerheads[cv->b.drawmode]->order2);
50 0 : for ( spl=cv->b.layerheads[cv->b.drawmode]->splines; spl->next!=NULL; spl=spl->next );
51 0 : spl->next = temp;
52 0 : SplineSetsCorrect(cv->b.layerheads[cv->b.drawmode]->splines,&changed);
53 0 : CVCharChangedUpdate(&cv->b);
54 0 : }
55 :
56 0 : static void MVOutline(MetricsView *mv, real width) {
57 : StrokeInfo si;
58 : SplineSet *temp, *spl;
59 : int i, changed;
60 :
61 0 : memset(&si,0,sizeof(si));
62 0 : si.removeexternal = true;
63 0 : si.radius = width;
64 : /* si.removeoverlapifneeded = true; */
65 :
66 0 : for ( i=mv->glyphcnt-1; i>=0; --i )
67 0 : if ( mv->perchar[i].selected )
68 0 : break;
69 0 : if ( i!=-1 ) {
70 0 : SplineChar *sc = mv->glyphs[i].sc;
71 0 : SCPreserveLayer(sc,mv->layer,false);
72 0 : temp = SplineSetStroke(sc->layers[mv->layer].splines,&si,sc->layers[mv->layer].order2);
73 0 : for ( spl=sc->layers[mv->layer].splines; spl->next!=NULL; spl=spl->next );
74 0 : spl->next = temp;
75 0 : SplineSetsCorrect(sc->layers[mv->layer].splines,&changed);
76 0 : SCCharChangedUpdate(sc,mv->layer);
77 : }
78 0 : }
79 :
80 0 : static void CVInline(CharView *cv, real width, real inset) {
81 : StrokeInfo si;
82 : SplineSet *temp, *spl, *temp2;
83 : int changed;
84 :
85 0 : memset(&si,0,sizeof(si));
86 0 : si.removeexternal = true;
87 : /* si.removeoverlapifneeded = true;*/
88 :
89 0 : CVPreserveState((CharViewBase *) cv);
90 0 : si.radius = width;
91 0 : temp = SplineSetStroke(cv->b.layerheads[cv->b.drawmode]->splines,&si,cv->b.layerheads[cv->b.drawmode]->order2);
92 0 : si.radius = width+inset;
93 0 : temp2 = SplineSetStroke(cv->b.layerheads[cv->b.drawmode]->splines,&si,cv->b.layerheads[cv->b.drawmode]->order2);
94 0 : for ( spl=cv->b.layerheads[cv->b.drawmode]->splines; spl->next!=NULL; spl=spl->next );
95 0 : spl->next = temp;
96 0 : for ( ; spl->next!=NULL; spl=spl->next );
97 0 : spl->next = temp2;
98 0 : SplineSetsCorrect(cv->b.layerheads[cv->b.drawmode]->splines,&changed);
99 0 : CVCharChangedUpdate(&cv->b);
100 0 : }
101 :
102 0 : static void MVInline(MetricsView *mv, real width, real inset) {
103 : StrokeInfo si;
104 : SplineSet *temp, *spl, *temp2;
105 : int i, changed;
106 :
107 0 : memset(&si,0,sizeof(si));
108 0 : si.removeexternal = true;
109 : /* si.removeoverlapifneeded = true;*/
110 :
111 0 : for ( i=mv->glyphcnt-1; i>=0; --i )
112 0 : if ( mv->perchar[i].selected )
113 0 : break;
114 0 : if ( i!=-1 ) {
115 0 : SplineChar *sc = mv->glyphs[i].sc;
116 0 : SCPreserveLayer(sc,mv->layer,false);
117 0 : si.radius = width;
118 0 : temp = SplineSetStroke(sc->layers[mv->layer].splines,&si,sc->layers[mv->layer].order2);
119 0 : si.radius = width+inset;
120 0 : temp2 = SplineSetStroke(sc->layers[mv->layer].splines,&si,sc->layers[mv->layer].order2);
121 0 : for ( spl=sc->layers[mv->layer].splines; spl->next!=NULL; spl=spl->next );
122 0 : spl->next = temp;
123 0 : for ( ; spl->next!=NULL; spl=spl->next );
124 0 : spl->next = temp2;
125 0 : SplineSetsCorrect(sc->layers[mv->layer].splines,&changed);
126 0 : SCCharChangedUpdate(sc,mv->layer);
127 : }
128 0 : }
129 :
130 : static double def_outline_width = 10, def_gap_width = 20;
131 :
132 : #define CID_Width 1000
133 : #define CID_Gap 1001
134 :
135 : typedef struct outlinedata {
136 : unsigned int done: 1;
137 : FontView *fv;
138 : CharView *cv;
139 : MetricsView *mv;
140 : int isinline;
141 : int wireframe;
142 : GWindow gw;
143 : } OutlineData;
144 :
145 0 : static int OD_OK(GGadget *g, GEvent *e) {
146 0 : if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
147 0 : OutlineData *od = GDrawGetUserData(GGadgetGetWindow(g));
148 : real width, gap;
149 0 : int err = 0;
150 :
151 0 : width = GetReal8(od->gw,CID_Width,_("Outline Width"),&err);
152 0 : if ( od->isinline )
153 0 : gap = GetReal8(od->gw,CID_Gap,_("_Gap:"),&err);
154 0 : if ( err )
155 0 : return(true);
156 0 : def_outline_width = width;
157 0 : if ( od->isinline ) {
158 0 : def_gap_width = gap;
159 0 : if ( od->fv!=NULL )
160 0 : FVInline((FontViewBase *) od->fv,width,gap);
161 0 : else if ( od->cv!=NULL )
162 0 : CVInline(od->cv,width,gap);
163 0 : else if ( od->mv!=NULL )
164 0 : MVInline(od->mv,width,gap);
165 : } else {
166 0 : if ( od->fv!=NULL )
167 0 : FVOutline((FontViewBase *) od->fv,width);
168 0 : else if ( od->cv!=NULL )
169 0 : CVOutline(od->cv,width);
170 0 : else if ( od->mv!=NULL )
171 0 : MVOutline(od->mv,width);
172 : }
173 0 : od->done = true;
174 : }
175 0 : return( true );
176 : }
177 :
178 0 : static int OD_Cancel(GGadget *g, GEvent *e) {
179 0 : if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
180 0 : OutlineData *od = GDrawGetUserData(GGadgetGetWindow(g));
181 0 : od->done = true;
182 : }
183 0 : return( true );
184 : }
185 :
186 0 : static int od_e_h(GWindow gw, GEvent *event) {
187 0 : if ( event->type==et_close ) {
188 0 : OutlineData *od = GDrawGetUserData(gw);
189 0 : od->done = true;
190 0 : } else if ( event->type == et_char ) {
191 0 : return( false );
192 0 : } else if ( event->type == et_map ) {
193 : /* Above palettes */
194 0 : GDrawRaise(gw);
195 : }
196 0 : return( true );
197 : }
198 :
199 0 : void OutlineDlg(FontView *fv, CharView *cv,MetricsView *mv,int isinline) {
200 : GRect pos;
201 : GWindow gw;
202 : GWindowAttrs wattrs;
203 : GGadgetCreateData gcd[9], *harray[6], *butarray[7], *varray[7], boxes[4];
204 : GTextInfo label[9];
205 : OutlineData od;
206 : char buffer[20], buffer2[20];
207 : int i,k;
208 :
209 0 : od.done = false;
210 0 : od.fv = fv;
211 0 : od.cv = cv;
212 0 : od.mv = mv;
213 0 : od.isinline = isinline;
214 :
215 0 : memset(&wattrs,0,sizeof(wattrs));
216 0 : wattrs.mask = wam_events|wam_cursor|wam_utf8_wtitle|wam_undercursor|wam_isdlg|wam_restrict;
217 0 : wattrs.event_masks = ~(1<<et_charup);
218 0 : wattrs.restrict_input_to_me = 1;
219 0 : wattrs.undercursor = 1;
220 0 : wattrs.cursor = ct_pointer;
221 0 : wattrs.utf8_window_title = isinline?_("Inline"):_("Outline");
222 0 : wattrs.is_dlg = true;
223 0 : pos.x = pos.y = 0;
224 0 : pos.width = GGadgetScale(GDrawPointsToPixels(NULL,170));
225 0 : pos.height = GDrawPointsToPixels(NULL,75);
226 0 : od.gw = gw = GDrawCreateTopWindow(NULL,&pos,od_e_h,&od,&wattrs);
227 :
228 0 : memset(&label,0,sizeof(label));
229 0 : memset(&gcd,0,sizeof(gcd));
230 0 : memset(&boxes,0,sizeof(boxes));
231 :
232 0 : i = k = 0;
233 0 : label[i].text = (unichar_t *) _("Outline Width:");
234 0 : label[i].text_is_1byte = true;
235 0 : label[i].text_in_resource = true;
236 0 : gcd[i].gd.label = &label[i];
237 0 : gcd[i].gd.pos.x = 7; gcd[i].gd.pos.y = 7+3;
238 0 : gcd[i].gd.flags = gg_enabled|gg_visible;
239 0 : gcd[i++].creator = GLabelCreate;
240 0 : harray[k++] = &gcd[i-1];
241 :
242 0 : sprintf( buffer, "%g", def_outline_width );
243 0 : label[i].text = (unichar_t *) buffer;
244 0 : label[i].text_is_1byte = true;
245 0 : gcd[i].gd.label = &label[i];
246 0 : gcd[i].gd.pos.x = 40; gcd[i].gd.pos.y = 7; gcd[i].gd.pos.width = 40;
247 0 : gcd[i].gd.flags = gg_enabled|gg_visible;
248 0 : gcd[i].gd.cid = CID_Width;
249 0 : gcd[i++].creator = GTextFieldCreate;
250 0 : harray[k++] = &gcd[i-1];
251 0 : harray[k++] = GCD_Glue;
252 :
253 0 : if ( isinline ) {
254 0 : label[i].text = (unichar_t *) _("_Gap:");
255 0 : label[i].text_is_1byte = true;
256 0 : label[i].text_in_resource = true;
257 0 : gcd[i].gd.label = &label[i];
258 0 : gcd[i].gd.pos.x = 90; gcd[i].gd.pos.y = 7+3;
259 0 : gcd[i].gd.flags = gg_enabled|gg_visible;
260 0 : gcd[i++].creator = GLabelCreate;
261 0 : harray[k++] = &gcd[i-1];
262 :
263 0 : sprintf( buffer2, "%g", def_gap_width );
264 0 : label[i].text = (unichar_t *) buffer2;
265 0 : label[i].text_is_1byte = true;
266 0 : gcd[i].gd.label = &label[i];
267 0 : gcd[i].gd.pos.x = 120; gcd[i].gd.pos.y = 7; gcd[i].gd.pos.width = 40;
268 0 : gcd[i].gd.flags = gg_enabled|gg_visible;
269 0 : gcd[i].gd.cid = CID_Gap;
270 0 : gcd[i++].creator = GTextFieldCreate;
271 0 : harray[k++] = &gcd[i-1];
272 : }
273 0 : harray[k] = NULL;
274 :
275 0 : k = 0;
276 0 : gcd[i].gd.pos.x = 20-3; gcd[i].gd.pos.y = 7+32;
277 0 : gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0;
278 0 : gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_default;
279 0 : label[i].text = (unichar_t *) _("_OK");
280 0 : label[i].text_is_1byte = true;
281 0 : label[i].text_in_resource = true;
282 0 : gcd[i].gd.label = &label[i];
283 0 : gcd[i].gd.handle_controlevent = OD_OK;
284 0 : gcd[i++].creator = GButtonCreate;
285 0 : butarray[k++] = GCD_Glue; butarray[k++] = &gcd[i-1]; butarray[k++] = GCD_Glue;
286 :
287 0 : gcd[i].gd.pos.x = -20; gcd[i].gd.pos.y = 7+32+3;
288 0 : gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0;
289 0 : gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_cancel;
290 0 : label[i].text = (unichar_t *) _("_Cancel");
291 0 : label[i].text_is_1byte = true;
292 0 : label[i].text_in_resource = true;
293 0 : gcd[i].gd.label = &label[i];
294 0 : gcd[i].gd.handle_controlevent = OD_Cancel;
295 0 : gcd[i++].creator = GButtonCreate;
296 0 : butarray[k++] = GCD_Glue; butarray[k++] = &gcd[i-1]; butarray[k++] = GCD_Glue;
297 0 : butarray[k] = 0;
298 :
299 0 : boxes[2].gd.flags = gg_enabled|gg_visible;
300 0 : boxes[2].gd.u.boxelements = harray;
301 0 : boxes[2].creator = GHBoxCreate;
302 :
303 0 : boxes[3].gd.flags = gg_enabled|gg_visible;
304 0 : boxes[3].gd.u.boxelements = butarray;
305 0 : boxes[3].creator = GHBoxCreate;
306 :
307 0 : varray[0] = &boxes[2]; varray[1] = NULL;
308 0 : varray[2] = GCD_Glue; varray[3] = NULL;
309 0 : varray[4] = &boxes[3]; varray[5] = NULL;
310 0 : varray[6] = NULL;
311 :
312 0 : boxes[0].gd.pos.x = boxes[0].gd.pos.y = 2;
313 0 : boxes[0].gd.flags = gg_enabled|gg_visible;
314 0 : boxes[0].gd.u.boxelements = varray;
315 0 : boxes[0].creator = GHVGroupCreate;
316 :
317 0 : gcd[i].gd.pos.x = 2; gcd[i].gd.pos.y = 2;
318 0 : gcd[i].gd.pos.width = pos.width-4; gcd[i].gd.pos.height = pos.height-4;
319 0 : gcd[i].gd.flags = gg_enabled|gg_visible|gg_pos_in_pixels;
320 0 : gcd[i].creator = GGroupCreate;
321 :
322 0 : GGadgetsCreate(gw,boxes);
323 0 : GHVBoxSetExpandableRow(boxes[0].ret,gb_expandglue);
324 0 : GHVBoxSetExpandableCol(boxes[2].ret,gb_expandglue);
325 0 : GHVBoxSetExpandableCol(boxes[3].ret,gb_expandgluesame);
326 0 : GHVBoxFitWindow(boxes[0].ret);
327 :
328 0 : GWidgetIndicateFocusGadget(GWidgetGetControl(gw,CID_Width));
329 0 : GTextFieldSelect(GWidgetGetControl(gw,CID_Width),0,-1);
330 :
331 0 : GWidgetHidePalettes();
332 0 : GDrawSetVisible(gw,true);
333 0 : while ( !od.done )
334 0 : GDrawProcessOneEvent(NULL);
335 0 : GDrawSetVisible(gw,false);
336 0 : }
337 :
338 0 : static void CVShadow(CharView *cv,real angle, real outline_width,
339 : real shadow_length,int wireframe) {
340 0 : CVPreserveState((CharViewBase *) cv);
341 0 : cv->b.layerheads[cv->b.drawmode]->splines = SSShadow(cv->b.layerheads[cv->b.drawmode]->splines,angle,outline_width,shadow_length,cv->b.sc,wireframe);
342 0 : CVCharChangedUpdate(&cv->b);
343 0 : }
344 :
345 0 : static void MVShadow(MetricsView *mv,real angle, real outline_width,
346 : real shadow_length,int wireframe) {
347 : int i;
348 :
349 0 : for ( i=mv->glyphcnt-1; i>=0; --i )
350 0 : if ( mv->perchar[i].selected )
351 0 : break;
352 0 : if ( i!=-1 ) {
353 0 : SplineChar *sc = mv->glyphs[i].sc;
354 0 : SCPreserveLayer(sc,mv->layer,false);
355 0 : sc->layers[mv->layer].splines = SSShadow(sc->layers[mv->layer].splines,angle,outline_width,shadow_length,sc,wireframe);
356 0 : SCCharChangedUpdate(sc,mv->layer);
357 : }
358 0 : }
359 :
360 : static double def_shadow_len=100, def_sun_angle= -45;
361 :
362 : #define CID_ShadowLen 1001
363 : #define CID_LightAngle 1002
364 :
365 0 : static int SD_OK(GGadget *g, GEvent *e) {
366 0 : if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
367 0 : OutlineData *od = GDrawGetUserData(GGadgetGetWindow(g));
368 : real width, angle, len;
369 0 : int err = 0;
370 :
371 0 : width = GetReal8(od->gw,CID_Width,_("Outline Width"),&err);
372 0 : len = GetReal8(od->gw,CID_ShadowLen,_("Shadow Length:"),&err);
373 0 : angle = GetReal8(od->gw,CID_LightAngle,_("Light Angle:"),&err);
374 0 : if ( err )
375 0 : return(true);
376 0 : def_outline_width = width;
377 0 : def_shadow_len = len;
378 0 : def_sun_angle = angle;
379 0 : angle *= -3.1415926535897932/180;
380 0 : angle -= 3.1415926535897932/2;
381 0 : if ( od->fv!=NULL )
382 0 : FVShadow((FontViewBase *) od->fv,angle,width,len,od->wireframe);
383 0 : else if ( od->cv!=NULL )
384 0 : CVShadow(od->cv,angle,width,len,od->wireframe);
385 0 : else if ( od->mv!=NULL )
386 0 : MVShadow(od->mv,angle,width,len,od->wireframe);
387 0 : od->done = true;
388 : }
389 0 : return( true );
390 : }
391 :
392 0 : void ShadowDlg(FontView *fv, CharView *cv,MetricsView *mv,int wireframe) {
393 : GRect pos;
394 : GWindow gw;
395 : GWindowAttrs wattrs;
396 : GGadgetCreateData gcd[10], *butarray[7], *hvarray[16], boxes[3];
397 : GTextInfo label[10];
398 : OutlineData od;
399 : char buffer[20], buffer2[20], buffer3[20];
400 : int i, k;
401 :
402 0 : od.done = false;
403 0 : od.fv = fv;
404 0 : od.cv = cv;
405 0 : od.mv = mv;
406 0 : od.wireframe = wireframe;
407 :
408 0 : memset(&wattrs,0,sizeof(wattrs));
409 0 : wattrs.mask = wam_events|wam_cursor|wam_utf8_wtitle|wam_undercursor|wam_isdlg|wam_restrict;
410 0 : wattrs.event_masks = ~(1<<et_charup);
411 0 : wattrs.restrict_input_to_me = 1;
412 0 : wattrs.undercursor = 1;
413 0 : wattrs.cursor = ct_pointer;
414 0 : wattrs.utf8_window_title = _("Shadow");
415 0 : wattrs.is_dlg = true;
416 0 : pos.x = pos.y = 0;
417 0 : pos.width = GGadgetScale(GDrawPointsToPixels(NULL,160));
418 0 : pos.height = GDrawPointsToPixels(NULL,125);
419 0 : od.gw = gw = GDrawCreateTopWindow(NULL,&pos,od_e_h,&od,&wattrs);
420 :
421 0 : memset(&label,0,sizeof(label));
422 0 : memset(&gcd,0,sizeof(gcd));
423 0 : memset(&boxes,0,sizeof(boxes));
424 :
425 0 : i = k = 0;
426 0 : label[i].text = (unichar_t *) _("Outline Width:");
427 0 : label[i].text_is_1byte = true;
428 0 : gcd[i].gd.label = &label[i];
429 0 : gcd[i].gd.pos.x = 7; gcd[i].gd.pos.y = 7+3;
430 0 : gcd[i].gd.flags = gg_enabled|gg_visible;
431 0 : gcd[i++].creator = GLabelCreate;
432 0 : hvarray[k++] = &gcd[i-1];
433 :
434 0 : sprintf( buffer, "%g", def_outline_width );
435 0 : label[i].text = (unichar_t *) buffer;
436 0 : label[i].text_is_1byte = true;
437 0 : gcd[i].gd.label = &label[i];
438 0 : gcd[i].gd.pos.x = 90; gcd[i].gd.pos.y = 7; gcd[i].gd.pos.width = 50;
439 0 : gcd[i].gd.flags = gg_enabled|gg_visible;
440 0 : gcd[i].gd.cid = CID_Width;
441 0 : gcd[i++].creator = GTextFieldCreate;
442 0 : hvarray[k++] = &gcd[i-1]; hvarray[k++] = NULL;
443 :
444 0 : label[i].text = (unichar_t *) _("Shadow Length:");
445 0 : label[i].text_is_1byte = true;
446 0 : gcd[i].gd.label = &label[i];
447 0 : gcd[i].gd.pos.x = gcd[i-2].gd.pos.x; gcd[i].gd.pos.y = gcd[i-2].gd.pos.y+26;
448 0 : gcd[i].gd.flags = gg_enabled|gg_visible;
449 0 : gcd[i++].creator = GLabelCreate;
450 0 : hvarray[k++] = &gcd[i-1];
451 :
452 0 : sprintf( buffer2, "%g", def_shadow_len );
453 0 : label[i].text = (unichar_t *) buffer2;
454 0 : label[i].text_is_1byte = true;
455 0 : gcd[i].gd.label = &label[i];
456 0 : gcd[i].gd.pos.x = gcd[i-2].gd.pos.x; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y-3; gcd[i].gd.pos.width = gcd[i-2].gd.pos.width;
457 0 : gcd[i].gd.flags = gg_enabled|gg_visible;
458 0 : gcd[i].gd.cid = CID_ShadowLen;
459 0 : gcd[i++].creator = GTextFieldCreate;
460 0 : hvarray[k++] = &gcd[i-1]; hvarray[k++] = NULL;
461 :
462 0 : label[i].text = (unichar_t *) _("Light Angle:");
463 0 : label[i].text_is_1byte = true;
464 0 : gcd[i].gd.label = &label[i];
465 0 : gcd[i].gd.pos.x = gcd[i-2].gd.pos.x; gcd[i].gd.pos.y = gcd[i-2].gd.pos.y+26;
466 0 : gcd[i].gd.flags = gg_enabled|gg_visible;
467 0 : gcd[i++].creator = GLabelCreate;
468 0 : hvarray[k++] = &gcd[i-1];
469 :
470 0 : sprintf( buffer3, "%g", def_sun_angle );
471 0 : label[i].text = (unichar_t *) buffer3;
472 0 : label[i].text_is_1byte = true;
473 0 : gcd[i].gd.label = &label[i];
474 0 : gcd[i].gd.pos.x = gcd[i-2].gd.pos.x; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y-3; gcd[i].gd.pos.width = gcd[i-2].gd.pos.width;
475 0 : gcd[i].gd.flags = gg_enabled|gg_visible;
476 0 : gcd[i].gd.cid = CID_LightAngle;
477 0 : gcd[i++].creator = GTextFieldCreate;
478 0 : hvarray[k++] = &gcd[i-1]; hvarray[k++] = NULL;
479 0 : hvarray[k++] = &boxes[2]; hvarray[k++] = GCD_ColSpan; hvarray[k++] = NULL;
480 0 : hvarray[k++] = GCD_Glue; hvarray[k++] = GCD_Glue; hvarray[k++] = NULL;
481 0 : hvarray[k] = NULL;
482 :
483 0 : k = 0;
484 0 : gcd[i].gd.pos.x = 20-3; gcd[i].gd.pos.y = gcd[i-2].gd.pos.y+30;
485 0 : gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0;
486 0 : gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_default;
487 0 : label[i].text = (unichar_t *) _("_OK");
488 0 : label[i].text_is_1byte = true;
489 0 : label[i].text_in_resource = true;
490 0 : gcd[i].gd.label = &label[i];
491 0 : gcd[i].gd.handle_controlevent = SD_OK;
492 0 : gcd[i++].creator = GButtonCreate;
493 0 : butarray[k++] = GCD_Glue; butarray[k++] = &gcd[i-1]; butarray[k++] = GCD_Glue;
494 :
495 0 : gcd[i].gd.pos.x = -20; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+3;
496 0 : gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0;
497 0 : gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_cancel;
498 0 : label[i].text = (unichar_t *) _("_Cancel");
499 0 : label[i].text_is_1byte = true;
500 0 : label[i].text_in_resource = true;
501 0 : gcd[i].gd.label = &label[i];
502 0 : gcd[i].gd.handle_controlevent = OD_Cancel;
503 0 : gcd[i++].creator = GButtonCreate;
504 0 : butarray[k++] = GCD_Glue; butarray[k++] = &gcd[i-1]; butarray[k++] = GCD_Glue;
505 0 : butarray[k] = NULL;
506 :
507 0 : boxes[2].gd.flags = gg_enabled|gg_visible;
508 0 : boxes[2].gd.u.boxelements = butarray;
509 0 : boxes[2].creator = GHBoxCreate;
510 :
511 0 : boxes[0].gd.pos.x = boxes[0].gd.pos.y = 2;
512 0 : boxes[0].gd.flags = gg_enabled|gg_visible;
513 0 : boxes[0].gd.u.boxelements = hvarray;
514 0 : boxes[0].creator = GHVGroupCreate;
515 :
516 0 : gcd[i].gd.pos.x = 2; gcd[i].gd.pos.y = 2;
517 0 : gcd[i].gd.pos.width = pos.width-4; gcd[i].gd.pos.height = pos.height-4;
518 0 : gcd[i].gd.flags = gg_enabled|gg_visible|gg_pos_in_pixels;
519 0 : gcd[i].creator = GGroupCreate;
520 :
521 0 : GGadgetsCreate(gw,boxes);
522 :
523 0 : GHVBoxSetExpandableRow(boxes[0].ret,gb_expandglue);
524 0 : GHVBoxSetExpandableCol(boxes[2].ret,gb_expandgluesame);
525 0 : GHVBoxFitWindow(boxes[0].ret);
526 :
527 0 : GWidgetIndicateFocusGadget(GWidgetGetControl(gw,CID_ShadowLen));
528 0 : GTextFieldSelect(GWidgetGetControl(gw,CID_ShadowLen),0,-1);
529 :
530 0 : GWidgetHidePalettes();
531 0 : GDrawSetVisible(gw,true);
532 0 : while ( !od.done )
533 0 : GDrawProcessOneEvent(NULL);
534 0 : GDrawSetVisible(gw,false);
535 0 : }
|