1 /*******************************************************************************
2 * Goggles Music Manager *
3 ********************************************************************************
4 * Copyright (C) 2009-2021 by Sander Jansen. All Rights Reserved *
5 * --- *
6 * This program is free software: you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation, either version 3 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program. If not, see http://www.gnu.org/licenses. *
18 ********************************************************************************/
19 #include "gmdefs.h"
20 #include "fxext.h"
21
22 // Map
23 FXDEFMAP(GMThreadDialog) GMThreadDialogMap[]={
24 FXMAPFUNC(SEL_KEYPRESS,0,GMThreadDialog::onKeyPress),
25 FXMAPFUNC(SEL_KEYRELEASE,0,GMThreadDialog::onKeyRelease),
26 FXMAPFUNC(SEL_CLOSE,0,GMThreadDialog::onCmdCancel),
27 FXMAPFUNC(SEL_COMMAND,FXDialogBox::ID_ACCEPT,GMThreadDialog::onCmdAccept),
28 FXMAPFUNC(SEL_CHORE,FXDialogBox::ID_CANCEL,GMThreadDialog::onCmdCancel),
29 FXMAPFUNC(SEL_TIMEOUT,FXDialogBox::ID_CANCEL,GMThreadDialog::onCmdCancel),
30 FXMAPFUNC(SEL_COMMAND,FXDialogBox::ID_CANCEL,GMThreadDialog::onCmdCancel),
31 FXMAPFUNC(SEL_COMMAND,GMThreadDialog::ID_THREAD_EXEC,GMThreadDialog::onThreadExec),
32 };
33
34
35 // Object implementation
FXIMPLEMENT(GMThreadDialog,FXTopWindow,GMThreadDialogMap,ARRAYNUMBER (GMThreadDialogMap))36 FXIMPLEMENT(GMThreadDialog,FXTopWindow,GMThreadDialogMap,ARRAYNUMBER(GMThreadDialogMap))
37
38 GMThreadDialog::GMThreadDialog(FXApp* a,const FXString& name,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs):FXTopWindow(a,name,NULL,NULL,opts,x,y,w,h,pl,pr,pt,pb,hs,vs){
39 }
40
GMThreadDialog(FXWindow * own,const FXString & name,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs)41 GMThreadDialog::GMThreadDialog(FXWindow* own,const FXString& name,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs):FXTopWindow(own,name,NULL,NULL,opts,x,y,w,h,pl,pr,pt,pb,hs,vs){
42 }
43
onThreadExec(FXObject *,FXSelector,void *)44 long GMThreadDialog::onThreadExec(FXObject*,FXSelector,void*){
45 create();
46 show();
47 return 1;
48 }
49
execute(FXMessageChannel * channel)50 FXuint GMThreadDialog::execute(FXMessageChannel* channel) {
51 mutex.lock();
52 channel->message(this,FXSEL(SEL_COMMAND,ID_THREAD_EXEC),nullptr,0);
53 condition.wait(mutex);
54 mutex.unlock();
55 return code;
56 }
57
58 // Close dialog with an accept
onCmdAccept(FXObject *,FXSelector,void *)59 long GMThreadDialog::onCmdAccept(FXObject*,FXSelector,void*){
60 mutex.lock();
61 hide();
62 destroy();
63 code=1;
64 condition.signal();
65 mutex.unlock();
66 return 1;
67 }
68
69 // Close dialog with a cancel
onCmdCancel(FXObject *,FXSelector,void *)70 long GMThreadDialog::onCmdCancel(FXObject*,FXSelector,void*){
71 mutex.lock();
72 hide();
73 destroy();
74 code=0;
75 condition.signal();
76 mutex.unlock();
77 return 1;
78 }
79
80 // Keyboard press; handle escape to close the dialog
onKeyPress(FXObject * sender,FXSelector sel,void * ptr)81 long GMThreadDialog::onKeyPress(FXObject* sender,FXSelector sel,void* ptr){
82 if(FXTopWindow::onKeyPress(sender,sel,ptr)) return 1;
83 if(((FXEvent*)ptr)->code==KEY_Escape){
84 handle(this,FXSEL(SEL_COMMAND,ID_CANCEL),nullptr);
85 return 1;
86 }
87 return 0;
88 }
89
90 // Keyboard release; handle escape to close the dialog
onKeyRelease(FXObject * sender,FXSelector sel,void * ptr)91 long GMThreadDialog::onKeyRelease(FXObject* sender,FXSelector sel,void* ptr){
92 if(FXTopWindow::onKeyRelease(sender,sel,ptr)) return 1;
93 if(((FXEvent*)ptr)->code==KEY_Escape){
94 return 1;
95 }
96 return 0;
97 }
98
99
100
101
102
103
104
105
106
107
108
109 // Get highlight color
gm_make_hilite_color(FXColor clr)110 static FXColor gm_make_hilite_color(FXColor clr){
111 FXuint r,g,b;
112 r=FXREDVAL(clr);
113 g=FXGREENVAL(clr);
114 b=FXBLUEVAL(clr);
115 r=FXMAX(31,r);
116 g=FXMAX(31,g);
117 b=FXMAX(31,b);
118 r=(133*r)/100;
119 g=(133*g)/100;
120 b=(133*b)/100;
121 r=FXMIN(255,r);
122 g=FXMIN(255,g);
123 b=FXMIN(255,b);
124 return FXRGB(r,g,b);
125 }
126
127 // Get shadow color
gm_make_shadow_color(FXColor clr)128 static FXColor gm_make_shadow_color(FXColor clr){
129 FXuint r,g,b;
130 r=FXREDVAL(clr);
131 g=FXGREENVAL(clr);
132 b=FXBLUEVAL(clr);
133 r=(66*r)/100;
134 g=(66*g)/100;
135 b=(66*b)/100;
136 return FXRGB(r,g,b);
137 }
138
139
140
141
142
143 // Fill vertical gradient rectangle
fillVerticalGradient(FXDCWindow & dc,FXint x,FXint y,FXint w,FXint h,FXColor top,FXColor bottom)144 void fillVerticalGradient(FXDCWindow & dc,FXint x,FXint y,FXint w,FXint h,FXColor top,FXColor bottom){
145 FXint rr,gg,bb,dr,dg,db,r1,g1,b1,r2,g2,b2,yl,yh,yy,dy,n,t;
146 if(0<w && 0<h){
147 r1=FXREDVAL(top);
148 r2=FXREDVAL(bottom);
149 g1=FXGREENVAL(top);
150 g2=FXGREENVAL(bottom);
151 b1=FXBLUEVAL(top);
152 b2=FXBLUEVAL(bottom);
153 dr=r2-r1;
154 dg=g2-g1;
155 db=b2-b1;
156 n=FXABS(dr);
157 if((t=FXABS(dg))>n) n=t;
158 if((t=FXABS(db))>n) n=t;
159 n++;
160 if(n>h) n=h;
161 if(n>128) n=128;
162 rr=(r1<<16)+32767;
163 gg=(g1<<16)+32767;
164 bb=(b1<<16)+32767;
165 yy=32767;
166 dr=(dr<<16)/n;
167 dg=(dg<<16)/n;
168 db=(db<<16)/n;
169 dy=(h<<16)/n;
170 do{
171 yl=yy>>16;
172 yy+=dy;
173 yh=yy>>16;
174 dc.setForeground(FXRGB(rr>>16,gg>>16,bb>>16));
175 dc.fillRectangle(x,y+yl,w,yh-yl);
176 rr+=dr;
177 gg+=dg;
178 bb+=db;
179 }
180 while(yh<h);
181 }
182 }
183
184 // Fill horizontal gradient rectangle
fillHorizontalGradient(FXDCWindow & dc,FXint x,FXint y,FXint w,FXint h,FXColor left,FXColor right)185 void fillHorizontalGradient(FXDCWindow & dc,FXint x,FXint y,FXint w,FXint h,FXColor left,FXColor right){
186 FXint rr,gg,bb,dr,dg,db,r1,g1,b1,r2,g2,b2,xl,xh,xx,dx,n,t;
187 if(0<w && 0<h){
188 r1=FXREDVAL(left);
189 r2=FXREDVAL(right);
190 g1=FXGREENVAL(left);
191 g2=FXGREENVAL(right);
192 b1=FXBLUEVAL(left);
193 b2=FXBLUEVAL(right);
194 dr=r2-r1;
195 dg=g2-g1;
196 db=b2-b1;
197 n=FXABS(dr);
198 if((t=FXABS(dg))>n) n=t;
199 if((t=FXABS(db))>n) n=t;
200 n++;
201 if(n>w) n=w;
202 if(n>128) n=128;
203 rr=(r1<<16)+32767;
204 gg=(g1<<16)+32767;
205 bb=(b1<<16)+32767;
206 xx=32767;
207 dr=(dr<<16)/n;
208 dg=(dg<<16)/n;
209 db=(db<<16)/n;
210 dx=(w<<16)/n;
211 do{
212 xl=xx>>16;
213 xx+=dx;
214 xh=xx>>16;
215 dc.setForeground(FXRGB(rr>>16,gg>>16,bb>>16));
216 dc.fillRectangle(x+xl,y,xh-xl,h);
217 rr+=dr;
218 gg+=dg;
219 bb+=db;
220 }
221 while(xh<w);
222 }
223 }
224
225 FXIMPLEMENT(GMScrollFrame,FXVerticalFrame,nullptr,0)
226
GMScrollFrame()227 GMScrollFrame::GMScrollFrame(){
228 }
229
GMScrollFrame(FXComposite * p)230 GMScrollFrame::GMScrollFrame(FXComposite*p):FXVerticalFrame(p,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_LINE,0,0,0,0,0,0,0,0,0,0){
231 borderColor=getApp()->getShadowColor();
232 }
233
234
235 FXIMPLEMENT(GMScrollHFrame,FXHorizontalFrame,nullptr,0)
236
GMScrollHFrame()237 GMScrollHFrame::GMScrollHFrame(){
238 }
239
GMScrollHFrame(FXComposite * p)240 GMScrollHFrame::GMScrollHFrame(FXComposite*p):FXHorizontalFrame(p,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_LINE,0,0,0,0,0,0,0,0,0,0){
241 borderColor=getApp()->getShadowColor();
242 }
243
244
245 FXIMPLEMENT(GMTabFrame,FXVerticalFrame,nullptr,0)
246
GMTabFrame()247 GMTabFrame::GMTabFrame(){
248 }
249
GMTabFrame(FXComposite * p)250 GMTabFrame::GMTabFrame(FXComposite*p):FXVerticalFrame(p,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_LINE,0,0,0,0){
251 borderColor=getApp()->getShadowColor();
252 }
253
254
255 FXIMPLEMENT(GMHeaderItem,FXHeaderItem,nullptr,0)
256
257
258 // Map
259 FXDEFMAP(GMHeader) GMHeaderMap[]={
260 FXMAPFUNC(SEL_PAINT,0,GMHeader::onPaint),
261 };
262
263
264 // Object implementation
FXIMPLEMENT(GMHeader,FXHeader,GMHeaderMap,ARRAYNUMBER (GMHeaderMap))265 FXIMPLEMENT(GMHeader,FXHeader,GMHeaderMap,ARRAYNUMBER(GMHeaderMap))
266
267
268 // Make a Header
269 GMHeader::GMHeader(){
270 }
271
272 // Make a Header
GMHeader(FXComposite * p,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)273 GMHeader::GMHeader(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb):
274 FXHeader(p,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb){
275 }
276
277 // Handle repaint
onPaint(FXObject *,FXSelector,void * ptr)278 long GMHeader::onPaint(FXObject*,FXSelector,void* ptr){
279 FXEvent *ev=(FXEvent*)ptr;
280 FXDCWindow dc(this,ev);
281 FXint x,y,w,h,i,ilo,ihi;
282
283 // Set font
284 dc.setFont(font);
285
286 // Paint background
287
288 fillVerticalGradient(dc,ev->rect.x,0,ev->rect.w,height-1,gm_make_hilite_color(backColor),gm_make_hilite_color(gm_make_shadow_color(backColor)));
289 dc.setForeground(shadowColor);
290 dc.fillRectangle(ev->rect.x,height-1,ev->rect.w,1);
291
292 // dc.fillRectangle(ev->rect.x,ev->rect.y,ev->rect.w,ev->rect.h);
293
294 // Vertical
295 if(options&HEADER_VERTICAL){
296
297 // Determine affected items
298 ilo=getItemAt(ev->rect.y);
299 ihi=getItemAt(ev->rect.y+ev->rect.h);
300
301 // Fragment below first item
302 if(ilo<0){
303 y=pos;
304 if(0<items.no()){
305 y=pos+items[0]->getPos();
306 }
307 if(0<y){
308 if(options&FRAME_THICK)
309 drawDoubleRaisedRectangle(dc,0,0,width,y);
310 else if(options&FRAME_RAISED)
311 drawRaisedRectangle(dc,0,0,width,y);
312 }
313 ilo=0;
314 }
315
316 // Fragment above last item
317 if(ihi>=items.no()){
318 y=pos;
319 if(0<items.no()){
320 y=pos+items[items.no()-1]->getPos()+items[items.no()-1]->getSize();
321 }
322 if(y<height){
323 if(options&FRAME_THICK)
324 drawDoubleRaisedRectangle(dc,0,y,width,height-y);
325 else if(options&FRAME_RAISED)
326 drawRaisedRectangle(dc,0,y,width,height-y);
327 }
328 ihi=items.no()-1;
329 }
330
331 // Draw only affected items
332 for(i=ilo; i<=ihi; i++){
333 y=pos+items[i]->getPos();
334 h=items[i]->getSize();
335 if(items[i]->isPressed()){
336 if(options&FRAME_THICK)
337 drawDoubleSunkenRectangle(dc,0,y,width,h);
338 else if(options&FRAME_RAISED)
339 drawSunkenRectangle(dc,0,y,width,h);
340 }
341 else{
342 if(options&FRAME_THICK)
343 drawDoubleRaisedRectangle(dc,0,y,width,h);
344 else if(options&FRAME_RAISED)
345 drawRaisedRectangle(dc,0,y,width,h);
346 }
347 static_cast<GMHeaderItem*>(items[i])->draw(this,dc,0,y,width,h);
348 }
349 }
350
351 // Horizontal
352 else{
353
354 // Determine affected items
355 ilo=getItemAt(ev->rect.x);
356 ihi=getItemAt(ev->rect.x+ev->rect.w);
357
358 // Fragment below first item
359 if(ilo<0){
360 /*
361 x=pos;
362 if(0<items.no()){
363 x=pos+items[0]->getPos();
364 }
365 */
366 /*
367 if(0<x){
368 if(options&FRAME_THICK)
369 drawDoubleRaisedRectangle(dc,0,0,x,height);
370 else if(options&FRAME_RAISED)
371 drawRaisedRectangle(dc,0,0,x,height);
372 }
373 */
374 ilo=0;
375 }
376
377 // Fragment above last item
378 if(ihi>=items.no()){
379 x=pos;
380 if(0<items.no()){
381 x=pos+items[items.no()-1]->getPos()+items[items.no()-1]->getSize();
382 }
383 if(x<width){
384
385 dc.setForeground(hiliteColor);
386 dc.fillRectangle(x,0,1,height);
387 }
388
389 /*
390
391 if(options&FRAME_THICK)
392 drawDoubleRaisedRectangle(dc,x,0,width-x,height);
393 else if(options&FRAME_RAISED)
394 drawRaisedRectangle(dc,x,0,width-x,height);
395 }
396 */
397 ihi=items.no()-1;
398 }
399
400 // Draw only the affected items
401 for(i=ilo; i<=ihi; i++){
402 x=pos+items[i]->getPos();
403 w=items[i]->getSize();
404 if(items[i]->isPressed()){
405
406 if (x>0) {
407 dc.setForeground(hiliteColor);
408 dc.fillRectangle(x,0,1,height);
409 }
410
411 dc.setForeground(shadowColor);
412 dc.fillRectangle(x+w-1,0,1,height);
413
414
415 /*
416 if(options&FRAME_THICK)
417 drawDoubleSunkenRectangle(dc,x,0,w,height);
418 else if(options&FRAME_RAISED)
419 drawSunkenRectangle(dc,x,0,w,height);
420
421 */
422 }
423 else{
424 if (x>0) {
425
426 dc.setForeground(hiliteColor);
427 dc.fillRectangle(x,0,1,height);
428 }
429
430 dc.setForeground(shadowColor);
431 dc.fillRectangle(x+w-1,0,1,height);
432 /*
433 if(options&FRAME_THICK)
434 drawDoubleRaisedRectangle(dc,x,0,w,height);
435 else if(options&FRAME_RAISED)
436 drawRaisedRectangle(dc,x,0,w,height);
437
438 */
439 }
440 static_cast<GMHeaderItem*>(items[i])->draw(this,dc,x,0,w,height);
441 }
442 }
443 return 1;
444 }
445
446
447
448 FXIMPLEMENT(GMMenuCommand,FXMenuCommand,nullptr,0)
449
GMMenuCommand(FXComposite * p,const FXString & text,FXIcon * ic,FXObject * tgt,FXSelector sel,FXuint opts)450 GMMenuCommand::GMMenuCommand(FXComposite* p,const FXString& text,FXIcon* ic,FXObject* tgt,FXSelector sel,FXuint opts) : FXMenuCommand(p,text,ic,tgt,sel,opts){
451 backColor=getApp()->getBackColor();
452 }
453
454
455 FXIMPLEMENT(GMMenuCheck,FXMenuCheck,nullptr,0)
456
GMMenuCheck(FXComposite * p,const FXString & text,FXObject * tgt,FXSelector sel,FXuint opts)457 GMMenuCheck::GMMenuCheck(FXComposite* p,const FXString& text,FXObject* tgt,FXSelector sel,FXuint opts) : FXMenuCheck(p,text,tgt,sel,opts){
458 backColor=getApp()->getBackColor();
459 }
460
461
462 FXIMPLEMENT(GMMenuRadio,FXMenuRadio,nullptr,0)
463
GMMenuRadio(FXComposite * p,const FXString & text,FXObject * tgt,FXSelector sel,FXuint opts)464 GMMenuRadio::GMMenuRadio(FXComposite* p,const FXString& text,FXObject* tgt,FXSelector sel,FXuint opts) : FXMenuRadio(p,text,tgt,sel,opts){
465 backColor=getApp()->getBackColor();
466 }
467
468
469 FXIMPLEMENT(GMMenuCascade,FXMenuCascade,nullptr,0)
470
GMMenuCascade(FXComposite * p,const FXString & text,FXIcon * ic,FXPopup * pup,FXuint opts)471 GMMenuCascade::GMMenuCascade(FXComposite* p,const FXString& text,FXIcon* ic,FXPopup* pup,FXuint opts) : FXMenuCascade(p,text,ic,pup,opts){
472 backColor=getApp()->getBackColor();
473 }
474
475 FXIMPLEMENT(GMMenuPane,FXMenuPane,nullptr,0)
476
GMMenuPane(FXWindow * o,FXuint opts)477 GMMenuPane::GMMenuPane(FXWindow* o,FXuint opts) : FXMenuPane(o,opts) {
478 borderColor=getApp()->getShadowColor();
479 setFrameStyle(FRAME_LINE);
480 }
481
482
483 FXDEFMAP(GMTextField) GMTextFieldMap[]={
484 FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,GMTextField::onLeftBtnPress)
485 };
486
FXIMPLEMENT(GMTextField,FXTextField,GMTextFieldMap,ARRAYNUMBER (GMTextFieldMap))487 FXIMPLEMENT(GMTextField,FXTextField,GMTextFieldMap,ARRAYNUMBER(GMTextFieldMap))
488
489 GMTextField::GMTextField(FXComposite* p,FXint ncols,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb) : FXTextField(p,ncols,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb){
490 borderColor=getApp()->getShadowColor();
491 setFrameStyle(FRAME_LINE);
492 }
493
extendWordSelection(FXint pos,FXbool)494 FXbool GMTextField::extendWordSelection(FXint pos,FXbool /*notify*/) {
495 FXint sp,ep;
496 pos=contents.validate(FXCLAMP(0,pos,contents.length()));
497 if(pos<=anchor){
498 sp=wordStart(pos);
499 ep=wordEnd(anchor);
500 }
501 else{
502 sp=wordStart(anchor);
503 ep=wordEnd(pos);
504 }
505 return setSelection(sp,ep-sp);
506 }
507
508
509
510
511
512
513
514 // Pressed left button
onLeftBtnPress(FXObject *,FXSelector,void * ptr)515 long GMTextField::onLeftBtnPress(FXObject*,FXSelector,void* ptr){
516 FXEvent* ev=(FXEvent*)ptr;
517 flags&=~FLAG_TIP;
518 handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr);
519 if(isEnabled()){
520 grab();
521 if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1;
522 flags&=~FLAG_UPDATE;
523 if(ev->click_count==1){
524 setCursorPos(index(ev->win_x));
525 if(ev->state&SHIFTMASK){
526 extendSelection(cursor);
527 }
528 else{
529 killSelection();
530 setAnchorPos(cursor);
531 }
532 makePositionVisible(cursor);
533 flags|=FLAG_PRESSED;
534 }
535 else if (ev->click_count==2) {
536 setAnchorPos(cursor);
537 extendWordSelection(cursor,true);
538 }
539 else{
540 setAnchorPos(0);
541 setCursorPos(contents.length());
542 extendSelection(contents.length());
543 makePositionVisible(cursor);
544 }
545 return 1;
546 }
547 return 0;
548 }
549
550
551 FXIMPLEMENT(GMSpinner,FXSpinner,nullptr,0)
552
GMSpinner(FXComposite * p,FXint ncols,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)553 GMSpinner::GMSpinner(FXComposite* p,FXint ncols,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb) : FXSpinner(p,ncols,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb){
554 borderColor=getApp()->getShadowColor();
555 setFrameStyle(FRAME_LINE);
556 upButton->setFrameStyle(FRAME_NONE);
557 downButton->setFrameStyle(FRAME_NONE);
558
559 upButton->setPadLeft(1);
560 upButton->setPadRight(1);
561 upButton->setPadTop(2);
562 upButton->setPadBottom(2);
563 downButton->setPadLeft(1);
564 downButton->setPadRight(1);
565 downButton->setPadTop(2);
566 downButton->setPadBottom(2);
567 }
568
569
570 FXDEFMAP(GMMenuTitle) GMMenuTitleMap[]={
571 FXMAPFUNC(SEL_PAINT,0,GMMenuTitle::onPaint),
572 FXMAPFUNC(SEL_COMMAND,FXWindow::ID_POST,GMMenuTitle::onCmdPost),
573 };
574
FXIMPLEMENT(GMMenuTitle,FXMenuTitle,GMMenuTitleMap,ARRAYNUMBER (GMMenuTitleMap))575 FXIMPLEMENT(GMMenuTitle,FXMenuTitle,GMMenuTitleMap,ARRAYNUMBER(GMMenuTitleMap))
576
577 GMMenuTitle::GMMenuTitle(FXComposite* p,const FXString& text,FXIcon* ic,FXPopup* pup,FXuint opts) : FXMenuTitle(p,text,ic,pup,opts){
578 selbackColor=getApp()->getSelbackColor();
579 seltextColor=getApp()->getSelforeColor();
580 }
581
582
583 // Handle repaint
onPaint(FXObject *,FXSelector,void * ptr)584 long GMMenuTitle::onPaint(FXObject*,FXSelector,void* ptr){
585 FXEvent *ev=(FXEvent*)ptr;
586 FXDCWindow dc(this,ev);
587 FXint xx,yy;
588 dc.setFont(font);
589 xx=6;
590 yy=0;
591 if(isEnabled()){
592 if(isActive()){
593 dc.setForeground(gm_make_shadow_color(selbackColor));
594
595 // dc.fillRectangle(0,height-1,width,1);
596 dc.fillRectangle(width-1,0,1,height);
597 dc.fillRectangle(0,0,width,1);
598 dc.fillRectangle(0,0,1,height);
599
600 dc.setForeground(selbackColor);
601 dc.fillRectangle(1,1,width-2,height-1);
602 xx++;
603 yy++;
604 }
605 else if(underCursor()){
606 dc.setForeground(backColor);
607 dc.fillRectangle(0,0,width,height);
608 }
609 else{
610 dc.setForeground(backColor);
611 dc.fillRectangle(0,0,width,height);
612 }
613 if(icon){
614 dc.drawIcon(icon,xx,yy+(height-icon->getHeight())/2);
615 xx+=5+icon->getWidth();
616 }
617 if(!label.empty()){
618 yy+=font->getFontAscent()+(height-font->getFontHeight())/2;
619 dc.setForeground(isActive() ? seltextColor : textColor);
620 dc.drawText(xx,yy,label);
621 if(0<=hotoff){
622 dc.fillRectangle(xx+font->getTextWidth(&label[0],hotoff),yy+1,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1);
623 }
624 }
625 }
626 else{
627 dc.setForeground(backColor);
628 dc.fillRectangle(0,0,width,height);
629 if(icon){
630 dc.drawIconSunken(icon,xx,yy+(height-icon->getHeight())/2);
631 xx+=5+icon->getWidth();
632 }
633 if(!label.empty()){
634 yy+=font->getFontAscent()+(height-font->getFontHeight())/2;
635 dc.setForeground(hiliteColor);
636 dc.drawText(xx+1,yy+1,label);
637 if(0<=hotoff){
638 dc.fillRectangle(xx+font->getTextWidth(&label[0],hotoff),yy+1,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1);
639 }
640 dc.setForeground(shadowColor);
641 dc.drawText(xx,yy,label);
642 if(0<=hotoff){
643 dc.fillRectangle(xx+font->getTextWidth(&label[0],hotoff),yy+1,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1);
644 }
645 }
646 }
647 return 1;
648 }
649
650 // Post the menu
onCmdPost(FXObject *,FXSelector,void *)651 long GMMenuTitle::onCmdPost(FXObject*,FXSelector,void*){
652 FXint x,y,side;
653 if(pane && !pane->shown()){
654 translateCoordinatesTo(x,y,getRoot(),0,0);
655 side=getParent()->getLayoutHints();
656 if(side&LAYOUT_SIDE_LEFT){ // Vertical
657 //y-=1;
658 if(side&LAYOUT_SIDE_BOTTOM){ // On right
659 x-=pane->getDefaultWidth();
660 }
661 else{ // On left
662 x+=width;
663 }
664 }
665 else{ // Horizontal
666 //x-=1;
667 if(side&LAYOUT_SIDE_BOTTOM){ // On bottom
668 y-=pane->getDefaultHeight();
669 }
670 else{ // On top
671 y+=height;
672 }
673 }
674 pane->popup(getParent(),x,y);
675 if(!getParent()->grabbed()) getParent()->grab();
676 }
677 flags&=~FLAG_UPDATE;
678 flags|=FLAG_ACTIVE;
679 update();
680 return 1;
681 }
682
683
684 FXDEFMAP(GMButton) GMButtonMap[]={
685 FXMAPFUNC(SEL_PAINT,0,GMButton::onPaint)
686 };
687
FXIMPLEMENT(GMButton,FXButton,GMButtonMap,ARRAYNUMBER (GMButtonMap))688 FXIMPLEMENT(GMButton,FXButton,GMButtonMap,ARRAYNUMBER(GMButtonMap))
689
690
691 GMButton::GMButton(){
692 }
693
GMButton(FXComposite * p,const FXString & text,FXIcon * ic,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)694 GMButton::GMButton(FXComposite* p,const FXString& text,FXIcon* ic,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb) : FXButton(p,text,ic,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb) {
695 }
696
697 // Handle repaint
onPaint(FXObject *,FXSelector,void * ptr)698 long GMButton::onPaint(FXObject*,FXSelector,void* ptr){
699 FXint tw=0,th=0,iw=0,ih=0,tx,ty,ix,iy;
700 FXEvent*ev=(FXEvent*)ptr;
701 FXDCWindow dc(this,ev);
702
703 // shadowColor = gm_make_shadow_color(baseColor);
704 FXColor top = gm_make_hilite_color(backColor);
705 FXColor bottom = gm_make_hilite_color(shadowColor);
706 FXColor shade = gm_make_hilite_color(shadowColor);
707 FXColor bordercolor = shadowColor;
708
709 FXPoint basebackground[4]={FXPoint(0,0),FXPoint(width-1,0),FXPoint(0,height-1),FXPoint(width-1,height-1)};
710
711 FXPoint bordershade[16]={FXPoint(0,1),FXPoint(1,0),FXPoint(1,2),FXPoint(2,1),
712 FXPoint(width-2,0),FXPoint(width-1,1),FXPoint(width-3,1),FXPoint(width-2,2),
713 FXPoint(0,height-2),FXPoint(1,height-1),FXPoint(1,height-3),FXPoint(2,height-2),
714 FXPoint(width-1,height-2),FXPoint(width-2,height-1),FXPoint(width-2,height-3),FXPoint(width-3,height-2)
715 };
716 FXPoint bordercorners[4]={FXPoint(1,1),FXPoint(1,height-2),FXPoint(width-2,1),FXPoint(width-2,height-2)};
717
718 if (options&BUTTON_TOOLBAR && (!underCursor() || !isEnabled())) {
719 dc.setForeground(baseColor);
720 dc.fillRectangle(0,0,width,height);
721 }
722 else if (state==STATE_UP && ((options&BUTTON_TOOLBAR)==0 || (options&BUTTON_TOOLBAR && underCursor()))) {
723
724 /// Outside Background
725 dc.setForeground(baseColor);
726 dc.drawPoints(basebackground,4);
727
728 /// Border
729 dc.setForeground(bordercolor);
730 dc.drawRectangle(2,0,width-5,0);
731 dc.drawRectangle(2,height-1,width-5,height-1);
732 dc.drawRectangle(0,2,0,height-5);
733 dc.drawRectangle(width-1,2,0,height-5);
734 dc.drawPoints(bordercorners,4);
735 dc.setForeground(shade);
736 dc.drawPoints(bordershade,16);
737
738 fillVerticalGradient(dc,2,1,width-4,height-2,top,bottom);
739 dc.setForeground(top);
740 dc.drawRectangle(1,3,0,height-7);
741 dc.setForeground(bottom);
742 dc.drawRectangle(width-2,3,0,height-7);
743 }
744 else {
745 /// Outside Background
746 dc.setForeground(baseColor);
747 dc.drawPoints(basebackground,4);
748
749 /// Border
750 dc.setForeground(bordercolor);
751 dc.drawRectangle(2,0,width-5,0);
752 dc.drawRectangle(2,height-1,width-5,height-1);
753 dc.drawRectangle(0,2,0,height-5);
754 dc.drawRectangle(width-1,2,0,height-5);
755 dc.drawPoints(bordercorners,4);
756 dc.setForeground(shade);
757 dc.drawPoints(bordershade,16);
758
759 dc.setForeground(baseColor);
760 dc.fillRectangle(2,1,width-4,height-2);
761
762
763 //dc.setForeground(FXRGB(0xdc,0xd4,0xc9));
764 //dc.fillRectangle(2,1,width-4,height-2);
765 }
766
767 // Place text & icon
768 if(!label.empty()){
769 tw=labelWidth(label);
770 th=labelHeight(label);
771 }
772 if(icon){
773 iw=icon->getWidth();
774 ih=icon->getHeight();
775 }
776
777 just_x(tx,ix,tw,iw);
778 just_y(ty,iy,th,ih);
779
780 // Shift a bit when pressed
781 if(state && (options&(FRAME_RAISED|FRAME_SUNKEN))){ ++tx; ++ty; ++ix; ++iy; }
782
783 // Draw enabled state
784 if(isEnabled()){
785 if(icon){
786 dc.drawIcon(icon,ix,iy);
787 }
788 if(!label.empty()){
789 dc.setFont(font);
790 dc.setForeground(textColor);
791 drawLabel(dc,label,hotoff,tx,ty,tw,th);
792 }
793 if(hasFocus()){
794 dc.drawFocusRectangle(border+1,border+1,width-2*border-2,height-2*border-2);
795 }
796 }
797
798 // Draw grayed-out state
799 else{
800 if(icon){
801 dc.drawIconSunken(icon,ix,iy);
802 }
803 if(!label.empty()){
804 dc.setFont(font);
805 dc.setForeground(hiliteColor);
806 drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th);
807 dc.setForeground(shadowColor);
808 drawLabel(dc,label,hotoff,tx,ty,tw,th);
809 }
810 }
811 return 1;
812 }
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828 FXDEFMAP(GMToggleButton) GMToggleButtonMap[]={
829 FXMAPFUNC(SEL_PAINT,0,GMToggleButton::onPaint)
830 };
831
FXIMPLEMENT(GMToggleButton,FXToggleButton,GMToggleButtonMap,ARRAYNUMBER (GMToggleButtonMap))832 FXIMPLEMENT(GMToggleButton,FXToggleButton,GMToggleButtonMap,ARRAYNUMBER(GMToggleButtonMap))
833
834
835 GMToggleButton::GMToggleButton(){
836 }
837
GMToggleButton(FXComposite * p,const FXString & text1,const FXString & text2,FXIcon * ic1,FXIcon * ic2,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)838 GMToggleButton::GMToggleButton(FXComposite* p,const FXString& text1,const FXString& text2,FXIcon* ic1,FXIcon* ic2,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb) : FXToggleButton(p,text1,text2,ic1,ic2,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb) {
839 }
840
841 // Handle repaint
onPaint(FXObject *,FXSelector,void * ptr)842 long GMToggleButton::onPaint(FXObject*,FXSelector,void* ptr){
843 FXint tw=0,th=0,iw=0,ih=0,tx,ty,ix,iy;
844 FXEvent *ev=(FXEvent*)ptr;
845 FXDCWindow dc(this,ev);
846
847
848 FXColor top = gm_make_hilite_color(backColor);
849 FXColor bottom = gm_make_hilite_color(shadowColor);
850 FXColor shade = gm_make_hilite_color(shadowColor);
851 FXColor bordercolor = shadowColor;
852
853 FXPoint basebackground[4]={FXPoint(0,0),FXPoint(width-1,0),FXPoint(0,height-1),FXPoint(width-1,height-1)};
854
855 FXPoint bordershade[16]={FXPoint(0,1),FXPoint(1,0),FXPoint(1,2),FXPoint(2,1),
856 FXPoint(width-2,0),FXPoint(width-1,1),FXPoint(width-3,1),FXPoint(width-2,2),
857 FXPoint(0,height-2),FXPoint(1,height-1),FXPoint(1,height-3),FXPoint(2,height-2),
858 FXPoint(width-1,height-2),FXPoint(width-2,height-1),FXPoint(width-2,height-3),FXPoint(width-3,height-2)
859 };
860 FXPoint bordercorners[4]={FXPoint(1,1),FXPoint(1,height-2),FXPoint(width-2,1),FXPoint(width-2,height-2)};
861
862
863 // Got a border at all?
864 if(options&(FRAME_RAISED|FRAME_SUNKEN)){
865
866 // Toolbar style
867 if(options&TOGGLEBUTTON_TOOLBAR){
868
869 // Enabled and cursor inside and down
870 if(down || ((options&TOGGLEBUTTON_KEEPSTATE) && state)){
871
872
873 /// Outside Background
874 dc.setForeground(baseColor);
875 dc.drawPoints(basebackground,4);
876
877 /// Border
878 dc.setForeground(bordercolor);
879 dc.drawRectangle(2,0,width-5,0);
880 dc.drawRectangle(2,height-1,width-5,height-1);
881 dc.drawRectangle(0,2,0,height-5);
882 dc.drawRectangle(width-1,2,0,height-5);
883 dc.drawPoints(bordercorners,4);
884 dc.setForeground(shade);
885 dc.drawPoints(bordershade,16);
886
887 dc.setForeground(baseColor);
888 dc.fillRectangle(2,1,width-4,height-2);
889 }
890
891 // Enabled and cursor inside, and up
892 else if(isEnabled() && underCursor()){
893 /// Outside Background
894 dc.setForeground(baseColor);
895 dc.drawPoints(basebackground,4);
896
897 /// Border
898 dc.setForeground(bordercolor);
899 dc.drawRectangle(2,0,width-5,0);
900 dc.drawRectangle(2,height-1,width-5,height-1);
901 dc.drawRectangle(0,2,0,height-5);
902 dc.drawRectangle(width-1,2,0,height-5);
903 dc.drawPoints(bordercorners,4);
904 dc.setForeground(shade);
905 dc.drawPoints(bordershade,16);
906
907 fillVerticalGradient(dc,2,1,width-4,height-2,top,bottom);
908 dc.setForeground(top);
909 dc.drawRectangle(1,3,0,height-7);
910 dc.setForeground(bottom);
911 dc.drawRectangle(width-2,3,0,height-7);
912 }
913
914 // Disabled or unchecked or not under cursor
915 else{
916 dc.setForeground(backColor);
917 dc.fillRectangle(0,0,width,height);
918 }
919 }
920
921 // Normal style
922 else{
923
924 // Draw sunken if pressed
925 if(down || ((options&TOGGLEBUTTON_KEEPSTATE) && state)){
926 dc.setForeground(hiliteColor);
927 dc.fillRectangle(border,border,width-border*2,height-border*2);
928 if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width,height);
929 else drawSunkenRectangle(dc,0,0,width,height);
930 }
931
932 // Draw raised if not currently pressed down
933 else{
934 dc.setForeground(backColor);
935 dc.fillRectangle(border,border,width-border*2,height-border*2);
936 if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height);
937 else drawRaisedRectangle(dc,0,0,width,height);
938 }
939
940 }
941 }
942
943 // No borders
944 else{
945 dc.setForeground(backColor);
946 dc.fillRectangle(0,0,width,height);
947 }
948
949 // Place text & icon
950 if(state && !altlabel.empty()){
951 tw=labelWidth(altlabel);
952 th=labelHeight(altlabel);
953 }
954 else if(!label.empty()){
955 tw=labelWidth(label);
956 th=labelHeight(label);
957 }
958 if(state && alticon){
959 iw=alticon->getWidth();
960 ih=alticon->getHeight();
961 }
962 else if(icon){
963 iw=icon->getWidth();
964 ih=icon->getHeight();
965 }
966
967 just_x(tx,ix,tw,iw);
968 just_y(ty,iy,th,ih);
969
970 // Shift a bit when pressed
971 if((down || ((options&TOGGLEBUTTON_KEEPSTATE) && state)) && (options&(FRAME_RAISED|FRAME_SUNKEN))){ ++tx; ++ty; ++ix; ++iy; }
972
973 // Draw enabled state
974 if(isEnabled()){
975 if(state && alticon){
976 dc.drawIcon(alticon,ix,iy);
977 }
978 else if(icon){
979 dc.drawIcon(icon,ix,iy);
980 }
981 if(state && !altlabel.empty()){
982 dc.setFont(font);
983 dc.setForeground(textColor);
984 drawLabel(dc,altlabel,althotoff,tx,ty,tw,th);
985 }
986 else if(!label.empty()){
987 dc.setFont(font);
988 dc.setForeground(textColor);
989 drawLabel(dc,label,hotoff,tx,ty,tw,th);
990 }
991 if(hasFocus()){
992 dc.drawFocusRectangle(border+1,border+1,width-2*border-2,height-2*border-2);
993 }
994 }
995
996 // Draw grayed-out state
997 else{
998 if(state && alticon){
999 dc.drawIconSunken(alticon,ix,iy);
1000 }
1001 else if(icon){
1002 dc.drawIconSunken(icon,ix,iy);
1003 }
1004 if(state && !altlabel.empty()){
1005 dc.setFont(font);
1006 dc.setForeground(hiliteColor);
1007 drawLabel(dc,altlabel,althotoff,tx+1,ty+1,tw,th);
1008 dc.setForeground(shadowColor);
1009 drawLabel(dc,altlabel,althotoff,tx,ty,tw,th);
1010 }
1011 else if(!label.empty()){
1012 dc.setFont(font);
1013 dc.setForeground(hiliteColor);
1014 drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th);
1015 dc.setForeground(shadowColor);
1016 drawLabel(dc,label,hotoff,tx,ty,tw,th);
1017 }
1018 }
1019 return 1;
1020 }
1021
1022
1023
1024 FXIMPLEMENT(GMRadioButton,FXRadioButton,nullptr,0)
1025
1026
GMRadioButton()1027 GMRadioButton::GMRadioButton(){
1028 }
1029
GMRadioButton(FXComposite * p,const FXString & text,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)1030 GMRadioButton::GMRadioButton(FXComposite* p,const FXString& text,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb) : FXRadioButton(p,text,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb) {
1031 // borderColor=getApp()->getShadowColor();
1032
1033 borderColor=getApp()->getBackColor();
1034 hiliteColor=getApp()->getShadowColor();
1035 baseColor=getApp()->getBackColor();
1036
1037
1038 }
1039
1040 FXDEFMAP(GMCheckButton) GMCheckButtonMap[]={
1041 FXMAPFUNC(SEL_PAINT,0,GMCheckButton::onPaint)
1042 };
1043
FXIMPLEMENT(GMCheckButton,FXCheckButton,GMCheckButtonMap,ARRAYNUMBER (GMCheckButtonMap))1044 FXIMPLEMENT(GMCheckButton,FXCheckButton,GMCheckButtonMap,ARRAYNUMBER(GMCheckButtonMap))
1045
1046
1047 GMCheckButton::GMCheckButton(){
1048 }
1049
GMCheckButton(FXComposite * p,const FXString & text,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)1050 GMCheckButton::GMCheckButton(FXComposite* p,const FXString& text,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb) : FXCheckButton(p,text,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb) {
1051 }
1052
onPaint(FXObject *,FXSelector,void * ptr)1053 long GMCheckButton::onPaint(FXObject*,FXSelector,void* ptr){
1054 FXEvent *ev=(FXEvent*)ptr;
1055 FXint tw=0,th=0,tx,ty,ix,iy;
1056 FXDCWindow dc(this,ev);
1057
1058 // Figure text size
1059 if(!label.empty()){
1060 tw=labelWidth(label);
1061 th=labelHeight(label);
1062 }
1063
1064 // Placement
1065 just_x(tx,ix,tw,13);
1066 just_y(ty,iy,th,13);
1067
1068 // Widget background
1069 dc.setForeground(backColor);
1070 dc.fillRectangle(ev->rect.x,ev->rect.y,ev->rect.w,ev->rect.h);
1071
1072 // Check background
1073 if(check==maybe || !isEnabled())
1074 dc.setForeground(baseColor);
1075 else
1076 dc.setForeground(boxColor);
1077 dc.fillRectangle(ix+2,iy+2,9,9);
1078
1079 // Check border
1080 if(options&CHECKBUTTON_PLUS){
1081 dc.setForeground(textColor);
1082 dc.drawRectangle(ix+2,iy+2,8,8);
1083 }
1084 else{
1085 dc.setForeground(shadowColor);
1086 dc.drawRectangle(ix+1,iy+1,10,10);
1087 }
1088
1089 // Check color
1090 if(check==maybe || !isEnabled())
1091 dc.setForeground(shadowColor);
1092 else
1093 dc.setForeground(checkColor);
1094
1095 // Show as +
1096 if(options&CHECKBUTTON_PLUS){
1097 if(check!=true){
1098 dc.fillRectangle(ix+6,iy+4,1,5);
1099 }
1100 dc.fillRectangle(ix+4,iy+6,5,1);
1101 }
1102
1103 // Show as v
1104 else{
1105 if(check!=false){
1106 FXSegment seg[6];
1107 #ifndef _WIN32
1108 seg[0].x1=3+ix; seg[0].y1=5+iy; seg[0].x2=5+ix; seg[0].y2=7+iy;
1109 seg[1].x1=3+ix; seg[1].y1=6+iy; seg[1].x2=5+ix; seg[1].y2=8+iy;
1110 seg[2].x1=3+ix; seg[2].y1=7+iy; seg[2].x2=5+ix; seg[2].y2=9+iy;
1111 seg[3].x1=5+ix; seg[3].y1=7+iy; seg[3].x2=9+ix; seg[3].y2=3+iy;
1112 seg[4].x1=5+ix; seg[4].y1=8+iy; seg[4].x2=9+ix; seg[4].y2=4+iy;
1113 seg[5].x1=5+ix; seg[5].y1=9+iy; seg[5].x2=9+ix; seg[5].y2=5+iy;
1114 #else
1115 seg[0].x1=3+ix; seg[0].y1=5+iy; seg[0].x2=5+ix; seg[0].y2=7+iy;
1116 seg[1].x1=3+ix; seg[1].y1=6+iy; seg[1].x2=5+ix; seg[1].y2=8+iy;
1117 seg[2].x1=3+ix; seg[2].y1=7+iy; seg[2].x2=5+ix; seg[2].y2=9+iy;
1118 seg[3].x1=5+ix; seg[3].y1=7+iy; seg[3].x2=10+ix; seg[3].y2=2+iy;
1119 seg[4].x1=5+ix; seg[4].y1=8+iy; seg[4].x2=10+ix; seg[4].y2=3+iy;
1120 seg[5].x1=5+ix; seg[5].y1=9+iy; seg[5].x2=10+ix; seg[5].y2=4+iy;
1121 #endif
1122 dc.drawLineSegments(seg,6);
1123 }
1124 }
1125
1126 // Text
1127 if(!label.empty()){
1128 dc.setFont(font);
1129 if(isEnabled()){
1130 dc.setForeground(textColor);
1131 drawLabel(dc,label,hotoff,tx,ty,tw,th);
1132 if(hasFocus()){
1133 dc.drawFocusRectangle(tx-1,ty-1,tw+2,th+2);
1134 }
1135 }
1136 else{
1137 dc.setForeground(hiliteColor);
1138 drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th);
1139 dc.setForeground(shadowColor);
1140 drawLabel(dc,label,hotoff,tx,ty,tw,th);
1141 }
1142 }
1143
1144 // Frame
1145 drawFrame(dc,0,0,width,height);
1146
1147 return 1;
1148 }
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163 #define MENUBUTTONARROW_WIDTH 11
1164 #define MENUBUTTONARROW_HEIGHT 5
1165
1166 #define MENUBUTTON_MASK (MENUBUTTON_AUTOGRAY|MENUBUTTON_AUTOHIDE|MENUBUTTON_TOOLBAR|MENUBUTTON_NOARROWS)
1167 #define POPUP_MASK (MENUBUTTON_UP|MENUBUTTON_LEFT)
1168 #define ATTACH_MASK (MENUBUTTON_ATTACH_RIGHT|MENUBUTTON_ATTACH_CENTER)
1169
1170
1171
1172 FXDEFMAP(GMMenuButton) GMMenuButtonMap[]={
1173 FXMAPFUNC(SEL_PAINT,0,GMMenuButton::onPaint)
1174 };
1175
FXIMPLEMENT(GMMenuButton,FXMenuButton,GMMenuButtonMap,ARRAYNUMBER (GMMenuButtonMap))1176 FXIMPLEMENT(GMMenuButton,FXMenuButton,GMMenuButtonMap,ARRAYNUMBER(GMMenuButtonMap))
1177
1178 GMMenuButton::GMMenuButton(){
1179 }
1180
GMMenuButton(FXComposite * p,const FXString & text,FXIcon * ic,FXPopup * pup,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)1181 GMMenuButton::GMMenuButton(FXComposite* p,const FXString& text,FXIcon* ic,FXPopup* pup,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb) : FXMenuButton(p,text,ic,pup,opts,x,y,w,h,pl,pr,pt,pb) {
1182 }
1183
1184
1185 // Handle repaint
onPaint(FXObject *,FXSelector,void * ptr)1186 long GMMenuButton::onPaint(FXObject*,FXSelector,void* ptr){
1187 FXint tw=0,th=0,iw=0,ih=0,tx,ty,ix,iy;
1188 FXEvent *ev=(FXEvent*)ptr;
1189 FXPoint points[3];
1190 FXDCWindow dc(this,ev);
1191
1192 // Got a border at all?
1193 if(options&(FRAME_RAISED|FRAME_SUNKEN)){
1194
1195 // Toolbar style
1196 if(options&MENUBUTTON_TOOLBAR){
1197
1198 // Enabled and cursor inside, and not popped up
1199 if(isEnabled() && underCursor() && !state){
1200 dc.setForeground(backColor);
1201 dc.fillRectangle(border,border,width-border*2,height-border*2);
1202 if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height);
1203 else drawRaisedRectangle(dc,0,0,width,height);
1204 }
1205
1206 // Enabled and popped up
1207 else if(isEnabled() && state){
1208 dc.setForeground(hiliteColor);
1209 dc.fillRectangle(border,border,width-border*2,height-border*2);
1210 if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width,height);
1211 else drawSunkenRectangle(dc,0,0,width,height);
1212 }
1213
1214 // Disabled or unchecked or not under cursor
1215 else{
1216 dc.setForeground(backColor);
1217 dc.fillRectangle(0,0,width,height);
1218 }
1219 }
1220
1221 // Normal style
1222 else{
1223
1224 // Draw in up state if disabled or up
1225 if(!isEnabled() || !state){
1226 dc.setForeground(backColor);
1227 dc.fillRectangle(border,border,width-border*2,height-border*2);
1228 if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height);
1229 else drawRaisedRectangle(dc,0,0,width,height);
1230 }
1231
1232 // Draw sunken if enabled and either checked or pressed
1233 else{
1234 dc.setForeground(hiliteColor);
1235 dc.fillRectangle(border,border,width-border*2,height-border*2);
1236 if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width,height);
1237 else drawSunkenRectangle(dc,0,0,width,height);
1238 }
1239 }
1240 }
1241
1242 // No borders
1243 else{
1244 if(isEnabled() && state){
1245 dc.setForeground(hiliteColor);
1246 dc.fillRectangle(0,0,width,height);
1247 }
1248 else{
1249 dc.setForeground(backColor);
1250 dc.fillRectangle(0,0,width,height);
1251 }
1252 }
1253
1254 // Position text & icon
1255 // if(!label.empty()){
1256 // tw=labelWidth(label);
1257 // th=labelHeight(label);
1258 // }
1259
1260 // Icon?
1261 if(icon){
1262 tw=icon->getWidth();
1263 th=icon->getHeight();
1264 }
1265
1266 // Arrows?
1267 if(!(options&MENUBUTTON_NOARROWS)){
1268 iw=MENUBUTTONARROW_WIDTH;
1269 ih=MENUBUTTONARROW_HEIGHT;
1270 }
1271
1272 // Keep some room for the arrow!
1273 just_x(tx,ix,tw,iw);
1274 just_y(ty,iy,th,ih);
1275
1276 // Move a bit when pressed
1277 if(state){ ++tx; ++ty; ++ix; ++iy; }
1278
1279 // Draw icon
1280 if(icon){
1281 if(isEnabled())
1282 dc.drawIcon(icon,tx,ty);
1283 else
1284 dc.drawIconSunken(icon,tx,ty);
1285 }
1286
1287 // Draw arrows
1288 if(!(options&MENUBUTTON_NOARROWS)){
1289
1290 // Right arrow
1291 if((options&MENUBUTTON_RIGHT)==MENUBUTTON_RIGHT){
1292 if(isEnabled())
1293 dc.setForeground(textColor);
1294 else
1295 dc.setForeground(shadowColor);
1296 points[0].x=ix;
1297 points[0].y=iy;
1298 points[1].x=ix;
1299 points[1].y=iy+MENUBUTTONARROW_WIDTH-1;
1300 points[2].x=ix+MENUBUTTONARROW_HEIGHT;
1301 points[2].y=(FXshort)(iy+(MENUBUTTONARROW_WIDTH>>1));
1302 dc.fillPolygon(points,3);
1303 }
1304
1305 // Left arrow
1306 else if(options&MENUBUTTON_LEFT){
1307 if(isEnabled())
1308 dc.setForeground(textColor);
1309 else
1310 dc.setForeground(shadowColor);
1311 points[0].x=ix+MENUBUTTONARROW_HEIGHT;
1312 points[0].y=iy;
1313 points[1].x=ix+MENUBUTTONARROW_HEIGHT;
1314 points[1].y=iy+MENUBUTTONARROW_WIDTH-1;
1315 points[2].x=ix;
1316 points[2].y=(FXshort)(iy+(MENUBUTTONARROW_WIDTH>>1));
1317 dc.fillPolygon(points,3);
1318 }
1319
1320 // Up arrow
1321 else if(options&MENUBUTTON_UP){
1322 if(isEnabled())
1323 dc.setForeground(textColor);
1324 else
1325 dc.setForeground(shadowColor);
1326 points[0].x=(FXshort)(ix+(MENUBUTTONARROW_WIDTH>>1));
1327 points[0].y=iy-1;
1328 points[1].x=ix;
1329 points[1].y=iy+MENUBUTTONARROW_HEIGHT;
1330 points[2].x=ix+MENUBUTTONARROW_WIDTH;
1331 points[2].y=iy+MENUBUTTONARROW_HEIGHT;
1332 dc.fillPolygon(points,3);
1333 }
1334
1335 // Down arrow
1336 else{
1337 if(isEnabled())
1338 dc.setForeground(textColor);
1339 else
1340 dc.setForeground(shadowColor);
1341 points[0].x=ix+1;
1342 points[0].y=iy;
1343 points[2].x=ix+MENUBUTTONARROW_WIDTH-1;
1344 points[2].y=iy;
1345 points[1].x=(FXshort)(ix+(MENUBUTTONARROW_WIDTH>>1));
1346 points[1].y=iy+MENUBUTTONARROW_HEIGHT;
1347 dc.fillPolygon(points,3);
1348 }
1349 }
1350
1351 // Draw text
1352 if(!label.empty()){
1353 dc.setFont(font);
1354 if(isEnabled()){
1355 dc.setForeground(textColor);
1356 drawLabel(dc,label,hotoff,tx,ty,tw,th);
1357 }
1358 else{
1359 dc.setForeground(hiliteColor);
1360 drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th);
1361 dc.setForeground(shadowColor);
1362 drawLabel(dc,label,hotoff,tx,ty,tw,th);
1363 }
1364 }
1365
1366 // Draw focus
1367 if(hasFocus()){
1368 if(isEnabled()){
1369 dc.drawFocusRectangle(border+1,border+1,width-2*border-2,height-2*border-2);
1370 }
1371 }
1372 return 1;
1373 }
1374
1375
1376
1377 // Get default width
getDefaultWidth()1378 FXint GMMenuButton::getDefaultWidth(){
1379 FXint tw=0,iw=0,s=4,w,pw;
1380 // if(!label.empty()){ tw=labelWidth(label); s=4; }
1381 if(!(options&MENUBUTTON_NOARROWS)){
1382 if(options&MENUBUTTON_LEFT) iw=MENUBUTTONARROW_HEIGHT; else iw=MENUBUTTONARROW_WIDTH;
1383 }
1384 if(icon) tw=icon->getWidth();
1385 if(!(options&(ICON_AFTER_TEXT|ICON_BEFORE_TEXT))) w=FXMAX(tw,iw); else w=tw+iw+s;
1386 w=padleft+padright+(border<<1)+w;
1387 if(!(options&MENUBUTTON_LEFT) && (options&MENUBUTTON_ATTACH_RIGHT) && (options&MENUBUTTON_ATTACH_CENTER)){
1388 if(pane){ pw=pane->getDefaultWidth(); if(pw>w) w=pw; }
1389 }
1390 return w;
1391 }
1392
1393
1394 // Get default height
getDefaultHeight()1395 FXint GMMenuButton::getDefaultHeight(){
1396 FXint th=0,ih=0,h,ph;
1397 // if(!label.empty()){ th=labelHeight(label); }
1398 if(!(options&MENUBUTTON_NOARROWS)){
1399 if(options&MENUBUTTON_LEFT) ih=MENUBUTTONARROW_WIDTH; else ih=MENUBUTTONARROW_HEIGHT;
1400 }
1401 if(icon) th=icon->getHeight();
1402 if(!(options&(ICON_ABOVE_TEXT|ICON_BELOW_TEXT))) h=FXMAX(th,ih); else h=th+ih;
1403 h=padtop+padbottom+(border<<1)+h;
1404 if((options&MENUBUTTON_LEFT) && (options&MENUBUTTON_ATTACH_BOTTOM) && (options&MENUBUTTON_ATTACH_CENTER)){
1405 if(pane){ ph=pane->getDefaultHeight(); if(ph>h) h=ph; }
1406 }
1407 return h;
1408 }
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434 FXDEFMAP(GMHeaderButton) GMHeaderButtonMap[]={
1435 FXMAPFUNC(SEL_PAINT,0,GMHeaderButton::onPaint)
1436 };
1437
FXIMPLEMENT(GMHeaderButton,FXButton,GMHeaderButtonMap,ARRAYNUMBER (GMHeaderButtonMap))1438 FXIMPLEMENT(GMHeaderButton,FXButton,GMHeaderButtonMap,ARRAYNUMBER(GMHeaderButtonMap))
1439
1440
1441 GMHeaderButton::GMHeaderButton(){
1442 arrowstate=ARROW_UP;
1443 }
1444
GMHeaderButton(FXComposite * p,const FXString & text,FXIcon * ic,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)1445 GMHeaderButton::GMHeaderButton(FXComposite* p,const FXString& text,FXIcon* ic,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb) : FXButton(p,text,ic,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb) {
1446 arrowstate=ARROW_UP;
1447 }
1448
setArrowState(FXuint s)1449 void GMHeaderButton::setArrowState(FXuint s) {
1450 arrowstate=s;
1451 }
1452
getArrowState() const1453 FXuint GMHeaderButton::getArrowState() const {
1454 return arrowstate;
1455 }
1456
1457
1458
onPaint(FXObject *,FXSelector,void * ptr)1459 long GMHeaderButton::onPaint(FXObject*,FXSelector,void*ptr){
1460 FXint tw=0,th=0,iw=0,ih=0,tx,ty,ix,iy;
1461 FXEvent *ev=(FXEvent*)ptr;
1462
1463 // Start drawing
1464 FXDCWindow dc(this,ev);
1465
1466 // Got a border at all?
1467 if(options&(FRAME_RAISED|FRAME_SUNKEN)){
1468
1469 // Toolbar style
1470 if(options&BUTTON_TOOLBAR){
1471
1472 // Enabled and cursor inside, and up
1473 if(isEnabled() && underCursor() && (state==STATE_UP)){
1474 dc.setForeground(backColor);
1475 dc.fillRectangle(border,border,width-border*2,height-border*2);
1476 if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height);
1477 else drawRaisedRectangle(dc,0,0,width,height);
1478 }
1479
1480 // Enabled and cursor inside and down
1481 else if(isEnabled() && underCursor() && (state==STATE_DOWN)){
1482 dc.setForeground(backColor);
1483 dc.fillRectangle(border,border,width-border*2,height-border*2);
1484 if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width,height);
1485 else drawSunkenRectangle(dc,0,0,width,height);
1486 }
1487
1488 // Enabled and checked
1489 else if(isEnabled() && (state==STATE_ENGAGED)){
1490 dc.setForeground(hiliteColor);
1491 dc.fillRectangle(border,border,width-border*2,height-border*2);
1492 if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width,height);
1493 else drawSunkenRectangle(dc,0,0,width,height);
1494 }
1495
1496 // Disabled or unchecked or not under cursor
1497 else{
1498 dc.setForeground(backColor);
1499 dc.fillRectangle(0,0,width,height);
1500 }
1501 }
1502
1503 // Normal style
1504 else{
1505
1506 // Default
1507 if(isDefault()){
1508
1509 // Draw in up state if disabled or up
1510 if(!isEnabled() || (state==STATE_UP)){
1511 dc.setForeground(backColor);
1512 dc.fillRectangle(border+1,border+1,width-border*2-1,height-border*2-1);
1513 dc.setForeground(FXRGB(255,255,255));
1514 dc.fillRectangle(width-2,1,1,height-1);
1515
1516 // if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,1,1,width-1,height-1);
1517 // else drawRaisedRectangle(dc,1,1,width-3,height-1);
1518 }
1519
1520 // Draw sunken if enabled and either checked or pressed
1521 else{
1522 if(state==STATE_ENGAGED) dc.setForeground(hiliteColor); else dc.setForeground(backColor);
1523 dc.fillRectangle(border,border,width-border*2-1,height-border*2-1);
1524 if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width-1,height-1);
1525 else drawSunkenRectangle(dc,0,0,width-1,height-1);
1526 }
1527
1528 // Black default border
1529 drawBorderRectangle(dc,0,0,width,height);
1530 }
1531
1532 // Non-Default
1533 else{
1534
1535 // Draw in up state if disabled or up
1536 if(!isEnabled() || (state==STATE_UP)){
1537 dc.setForeground(backColor);
1538 //dc.fillRectangle(border,border,width-border*2,height-border*2);
1539
1540 //fillVerticalGradient(dc,border,border,width-border*2,height-border*2,makeHiliteColor(makeHiliteColor(makeShadowColor(backColor))),makeHiliteColor(makeShadowColor(backColor)));
1541 // fillVerticalGradient(dc,0,0,width,height-1,makeHiliteColor(makeHiliteColor(makeShadowColor(backColor))),makeHiliteColor(makeShadowColor(backColor)));
1542
1543 fillVerticalGradient(dc,ev->rect.x,0,ev->rect.w,height-1,gm_make_hilite_color(backColor),gm_make_hilite_color(gm_make_shadow_color(backColor)));
1544
1545
1546 dc.setForeground(shadowColor);
1547 dc.fillRectangle(0,height-1,width,1);
1548
1549
1550
1551
1552
1553 // if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height);
1554 /// else drawRaisedRectangle(dc,0,0,width-1,height);
1555
1556 // dc.setForeground(backColor);
1557
1558 // dc.fillRectangle(width-2,0,2,height-1);
1559
1560 }
1561
1562 // Draw sunken if enabled and either checked or pressed
1563 else{
1564 if(state==STATE_ENGAGED) dc.setForeground(hiliteColor); else dc.setForeground(backColor);
1565 dc.fillRectangle(border,border,width-border*2,height-border*2);
1566 if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width,height);
1567 else drawSunkenRectangle(dc,0,0,width,height);
1568 }
1569 }
1570 }
1571 }
1572
1573 // No borders
1574 else{
1575 if(isEnabled() && (state==STATE_ENGAGED)){
1576 dc.setForeground(hiliteColor);
1577 dc.fillRectangle(0,0,width,height);
1578 }
1579 else{
1580 dc.setForeground(backColor);
1581 dc.fillRectangle(0,0,width,height);
1582 }
1583 }
1584
1585 // Place text & icon
1586 if(!label.empty()){
1587 tw=labelWidth(label);
1588 th=labelHeight(label);
1589 }
1590 if(icon){
1591 iw=icon->getWidth();
1592 ih=icon->getHeight();
1593 }
1594
1595 just_x(tx,ix,tw,iw);
1596 just_y(ty,iy,th,ih);
1597
1598 // Shift a bit when pressed
1599 if(state && (options&(FRAME_RAISED|FRAME_SUNKEN))){ ++tx; ++ty; ++ix; ++iy; }
1600
1601 // Draw enabled state
1602 if(isEnabled()){
1603 if(icon){
1604 dc.drawIcon(icon,ix,iy);
1605 }
1606 if(!label.empty()){
1607 dc.setFont(font);
1608 dc.setForeground(textColor);
1609 drawLabel(dc,label,hotoff,tx,ty,tw,th);
1610 }
1611 // if(hasFocus()){
1612 // dc.drawFocusRectangle(border+1,border+1,width-2*border-2,height-2*border-2);
1613 // }
1614 }
1615
1616 // Draw grayed-out state
1617 else{
1618 if(icon){
1619 dc.drawIconSunken(icon,ix,iy);
1620 }
1621 if(!label.empty()){
1622 dc.setFont(font);
1623 dc.setForeground(hiliteColor);
1624 drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th);
1625 dc.setForeground(shadowColor);
1626 drawLabel(dc,label,hotoff,tx,ty,tw,th);
1627 }
1628 }
1629
1630 // Draw arrows
1631 if(arrowstate&(ARROW_UP|ARROW_DOWN)){
1632 FXint aa=(font->getFontHeight()-5)|1;
1633 FXint ay=(height-aa)/2;
1634 FXint ax=width-aa-border-border-2;
1635 if(arrowstate&ARROW_UP){
1636 dc.setForeground(hiliteColor);
1637 dc.drawLine(ax+aa/2,ay,ax+aa-1,ay+aa);
1638 dc.drawLine(ax,ay+aa,ax+aa,ay+aa);
1639 dc.setForeground(shadowColor);
1640 dc.drawLine(ax+aa/2,ay,ax,ay+aa);
1641 }
1642 else{
1643 dc.setForeground(hiliteColor);
1644 dc.drawLine(ax+aa/2,ay+aa,ax+aa-1,ay);
1645 dc.setForeground(shadowColor);
1646 dc.drawLine(ax+aa/2,ay+aa,ax,ay);
1647 dc.drawLine(ax,ay,ax+aa,ay);
1648 }
1649 }
1650 return 1;
1651 }
1652
1653
1654 FXIMPLEMENT(GMScrollArea,FXScrollArea,nullptr,0)
1655
replaceScrollbars(FXScrollArea * fs)1656 void GMScrollArea::replaceScrollbars(FXScrollArea *fs) {
1657 GMScrollArea * s = static_cast<GMScrollArea*>(fs);
1658 delete s->vertical;
1659 delete s->horizontal;
1660 delete s->corner;
1661 s->vertical=new GMScrollBar(fs,fs,GMScrollArea::ID_VSCROLLED,SCROLLBAR_VERTICAL);
1662 s->horizontal=new GMScrollBar(fs,fs,GMScrollArea::ID_HSCROLLED,SCROLLBAR_HORIZONTAL);
1663 s->corner=new GMScrollCorner(fs);
1664 }
1665
1666
1667
1668 FXIMPLEMENT(GMTreeListBox,FXTreeListBox,nullptr,0)
1669
replace(FXTreeListBox * fs)1670 void GMTreeListBox::replace(FXTreeListBox *fs) {
1671 GMTreeListBox * s = static_cast<GMTreeListBox*>(fs);
1672 GMScrollArea::replaceScrollbars(s->tree);
1673
1674 s->borderColor=s->getApp()->getShadowColor();
1675 s->setFrameStyle(FRAME_LINE);
1676 s->pane->setBorderColor(s->borderColor);
1677
1678 s->button->setFrameStyle(FRAME_NONE);
1679 s->button->setPadLeft(2);
1680 s->button->setPadRight(2);
1681 s->button->setYOffset(0);
1682 s->button->setXOffset(1);
1683 }
1684
1685
1686
1687 // Map
1688 FXDEFMAP(GMScrollBar) GMScrollBarMap[]={
1689 FXMAPFUNC(SEL_PAINT,0,GMScrollBar::onPaint),
1690 };
1691
1692
1693 // Object implementation
FXIMPLEMENT(GMScrollBar,FXScrollBar,GMScrollBarMap,ARRAYNUMBER (GMScrollBarMap))1694 FXIMPLEMENT(GMScrollBar,FXScrollBar,GMScrollBarMap,ARRAYNUMBER(GMScrollBarMap))
1695
1696
1697 // For deserialization
1698 GMScrollBar::GMScrollBar(){
1699 }
1700
1701 // Make a scrollbar
GMScrollBar(FXComposite * p,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h)1702 GMScrollBar::GMScrollBar(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXScrollBar(p,tgt,sel,opts,x,y,w,h) {
1703 //shadowColor=gm_make_shadow_color(getApp()->getBaseColor());
1704 }
1705
drawThumb(FXDCWindow & dc,FXint x,FXint y,FXint w,FXint h)1706 void GMScrollBar::drawThumb(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h){
1707 if(options&SCROLLBAR_HORIZONTAL){
1708 fillVerticalGradient(dc,x+2,y,w-4,h-1,gm_make_hilite_color(FXApp::instance()->getSelbackColor()),gm_make_hilite_color(gm_make_shadow_color(FXApp::instance()->getSelbackColor())));
1709 dc.setForeground(shadowColor);
1710 dc.fillRectangle(x+w-1,y,1,h);
1711 dc.fillRectangle(x,y,1,h);
1712 dc.setForeground(gm_make_hilite_color(getApp()->getSelbackColor()));
1713 dc.fillRectangle(x+1,y+h-1,w-2,1);
1714 dc.fillRectangle(x+w-2,y,1,h-1);
1715 dc.fillRectangle(x+1,y,1,h-1);
1716 if (w>20) {
1717 dc.setForeground(gm_make_shadow_color(getApp()->getSelbackColor()));
1718 dc.fillRectangle(thumbpos+thumbsize / 2,(height/2) - 2,1,6);
1719 dc.fillRectangle((thumbpos+thumbsize / 2) - 3,(height/2) - 2,1,6);
1720 dc.fillRectangle((thumbpos+thumbsize / 2) + 3,(height/2) - 2,1,6);
1721 }
1722 }
1723 else {
1724 fillHorizontalGradient(dc,x,y+2,w-1,h-4,gm_make_hilite_color(getApp()->getSelbackColor()),gm_make_hilite_color(gm_make_shadow_color(getApp()->getSelbackColor())));
1725 dc.setForeground(shadowColor);
1726 dc.fillRectangle(x,y+h-1,w,1);
1727 dc.fillRectangle(x,y,w,1);
1728
1729 dc.setForeground(gm_make_hilite_color(getApp()->getSelbackColor()));
1730 dc.fillRectangle(x+w-1,y+1,1,h-2);
1731 dc.fillRectangle(x,y+1,w-1,1);
1732 dc.fillRectangle(x,y+h-2,w-1,1);
1733
1734 if (h>20) {
1735 dc.setForeground(gm_make_shadow_color(getApp()->getSelbackColor()));
1736 dc.fillRectangle((width/2) - 2,thumbpos+thumbsize / 2,6,1);
1737 dc.fillRectangle((width/2) - 2,(thumbpos+thumbsize / 2) - 3,6,1);
1738 dc.fillRectangle((width/2) - 2,(thumbpos+thumbsize / 2) + 3,6,1);
1739 }
1740 }
1741 }
1742
1743 // Handle repaint
onPaint(FXObject *,FXSelector,void * ptr)1744 long GMScrollBar::onPaint(FXObject*,FXSelector,void* ptr){
1745 FXEvent *ev=(FXEvent*)ptr;
1746 int total;
1747 FXDCWindow dc(this,ev);
1748 if(options&SCROLLBAR_HORIZONTAL){
1749 total=width-height-height;
1750 dc.setForeground(shadowColor);
1751 dc.fillRectangle(0,0,width,1);
1752 if(thumbsize<total){
1753 drawThumb(dc,thumbpos,1,thumbsize,height-1);
1754 if (thumbpos-height>0) {
1755 dc.setForeground(shadowColor);
1756 dc.fillRectangle(height,1,1,height-1);
1757 dc.setForeground(gm_make_hilite_color(shadowColor));
1758 dc.fillRectangle(height+1,1,thumbpos-height-1,height-1);
1759 }
1760
1761 if (width-height-thumbpos-thumbsize>0) {
1762 dc.setForeground(shadowColor);
1763 dc.fillRectangle(width-height-1,1,1,height-1);
1764 dc.setForeground(gm_make_hilite_color(shadowColor));
1765 dc.fillRectangle(thumbpos+thumbsize,1,width-height-thumbpos-thumbsize-1,height);
1766 }
1767 }
1768 else{ // Non-scrollable
1769 dc.fillRectangle(height,1,1,height-1);
1770 dc.fillRectangle(width-height-1,1,1,height-1);
1771 dc.setForeground(gm_make_hilite_color(shadowColor));
1772 dc.fillRectangle(height+1,1,total-2,height-1);
1773 }
1774 dc.setFillStyle(FILL_SOLID);
1775 dc.setForeground(backColor);
1776 dc.fillRectangle(width-height,1,height,height-1);
1777 drawRightArrow(dc,width-height,0,height,height,(mode==MODE_INC));
1778 dc.setForeground(backColor);
1779 dc.fillRectangle(0,1,height,height-1);
1780 drawLeftArrow(dc,0,0,height,height,(mode==MODE_DEC));
1781 }
1782 else{
1783 total=height-width-width;
1784 dc.setForeground(shadowColor);
1785 dc.fillRectangle(0,0,1,height);
1786 if(thumbsize<total){
1787 drawThumb(dc,1,thumbpos,width-1,thumbsize);
1788 if (thumbpos-width>0) {
1789 dc.setForeground(shadowColor);
1790 dc.fillRectangle(1,width,width-1,1);
1791 dc.setForeground(gm_make_hilite_color(shadowColor));
1792 dc.fillRectangle(1,width+1,width-1,thumbpos-width-1);
1793 }
1794 if (height-width-thumbpos-thumbsize>0){
1795 dc.setForeground(shadowColor);
1796 dc.fillRectangle(1,height-width-1,width-1,1);
1797 dc.setForeground(gm_make_hilite_color(shadowColor));
1798 dc.fillRectangle(1,thumbpos+thumbsize,width-1,height-width-thumbpos-thumbsize-1);
1799 }
1800 }
1801 else{ // Non-scrollable
1802 dc.fillRectangle(1,width,width-1,1);
1803 dc.fillRectangle(1,height-width-1,width-1,1);
1804 dc.setForeground(gm_make_hilite_color(shadowColor));
1805 dc.fillRectangle(1,width+1,width-1,total-2);
1806 }
1807 dc.setFillStyle(FILL_SOLID);
1808 dc.setForeground(backColor);
1809 dc.fillRectangle(1,height-width,width-1,width);
1810 drawDownArrow(dc,0,height-width,width,width,(mode==MODE_INC));
1811 dc.setForeground(backColor);
1812 dc.fillRectangle(1,0,width-1,width);
1813 drawUpArrow(dc,0,0,width,width,(mode==MODE_DEC));
1814 }
1815 return 1;
1816 }
1817
1818 // Map
1819 FXDEFMAP(GMScrollCorner) GMScrollCornerMap[]={
1820 FXMAPFUNC(SEL_PAINT,0,GMScrollCorner::onPaint),
1821 };
1822
FXIMPLEMENT(GMScrollCorner,FXScrollCorner,GMScrollCornerMap,ARRAYNUMBER (GMScrollCornerMap))1823 FXIMPLEMENT(GMScrollCorner,FXScrollCorner,GMScrollCornerMap,ARRAYNUMBER(GMScrollCornerMap))
1824
1825 GMScrollCorner::GMScrollCorner(FXComposite*p):FXScrollCorner(p){
1826 shadowColor=getApp()->getShadowColor();
1827 }
1828
1829 // Slightly different from Frame border
onPaint(FXObject *,FXSelector,void * ptr)1830 long GMScrollCorner::onPaint(FXObject*,FXSelector,void* ptr){
1831 FXEvent *ev=(FXEvent*)ptr;
1832 FXDCWindow dc(this,ev);
1833 dc.setForeground(backColor);
1834 dc.fillRectangle(ev->rect.x,ev->rect.y,ev->rect.w,ev->rect.h);
1835 dc.setForeground(shadowColor);
1836 dc.fillRectangle(ev->rect.x,0,ev->rect.w,1);
1837 dc.fillRectangle(0,ev->rect.y,1,ev->rect.h);
1838 return 1;
1839 }
1840
1841
1842
1843 FXIMPLEMENT(GMTabBook,FXTabBook,nullptr,0)
1844
GMTabBook(FXComposite * p,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)1845 GMTabBook::GMTabBook(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb) :
1846 FXTabBook(p,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb) {
1847 }
1848
1849
1850 /// Make sure old tab gets repainted
setCurrent(FXint panel,FXbool notify)1851 void GMTabBook::setCurrent(FXint panel,FXbool notify) {
1852 if (panel!=current) {
1853 FXint old = current;
1854 FXTabBook::setCurrent(panel,notify);
1855 FXWindow * window = childAtIndex(old<<1);
1856 if (window) { window->update(); }
1857 }
1858 }
1859
1860
1861
1862 // Map
1863 FXDEFMAP(GMTabItem) GMTabItemMap[]={
1864 FXMAPFUNC(SEL_PAINT,0,GMTabItem::onPaint),
1865 };
1866
FXIMPLEMENT(GMTabItem,FXTabItem,GMTabItemMap,ARRAYNUMBER (GMTabItemMap))1867 FXIMPLEMENT(GMTabItem,FXTabItem,GMTabItemMap,ARRAYNUMBER(GMTabItemMap))
1868
1869 GMTabItem::GMTabItem(FXTabBar* p,const FXString& text,FXIcon* ic,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint /*pt*/,FXint /*pb*/) : FXTabItem(p,text,ic,opts,x,y,w,h,pl,pr,5,5) {
1870 }
1871
1872 //void GMTabItem::raise() {
1873 // FXTabItem::raise();
1874 // update();
1875 // recalc();
1876 // }
1877
1878
1879 /// FIXME determine last tab based visibility...
onPaint(FXObject *,FXSelector,void *)1880 long GMTabItem::onPaint(FXObject*,FXSelector,void*){
1881 FXTabBar * bar = (FXTabBar*)getParent();
1882 FXint tab = bar->indexOfChild(this)/2;
1883 FXint ntabs = (bar->numChildren()/2);
1884 FXint ctab = bar->getCurrent();
1885
1886
1887 FXbool is_last = (tab==(ntabs-1));
1888
1889 if (!is_last) {
1890 is_last=true;
1891 for (FXint t=tab+1;t<ntabs;t++){
1892 if (bar->childAtIndex(t<<1)->shown()) {
1893 is_last=false;
1894 break;
1895 }
1896 }
1897 }
1898
1899 FXDCWindow dc(this);
1900
1901 FXint tw=0,th=0,iw=0,ih=0,tx,ty,ix,iy;
1902
1903 dc.setForeground(shadowColor);
1904 dc.fillRectangle(0,0,width,1);
1905 if (tab==ctab && tab==0)
1906 dc.fillRectangle(0,0,1,height);
1907 else
1908 dc.fillRectangle(0,0,1,height-1);
1909
1910 /// last one or active one
1911 if (is_last || tab==ctab) {
1912 dc.fillRectangle(width-1,0,1,height-1);
1913 if (tab!=ctab)
1914 fillVerticalGradient(dc,1,1,width-2,height-2,gm_make_hilite_color(shadowColor),gm_make_hilite_color(shadowColor));
1915 else {
1916 /*
1917 dc.setForeground(makeShadowColor(getApp()->getSelbackColor()));
1918 dc.fillRectangle(0,0,width,1);
1919 dc.fillRectangle(width-1,0,1,4);
1920 dc.fillRectangle(0,0,1,4);
1921 dc.fillRectangle(1,3,width-2,1);
1922 */
1923 /*
1924
1925 dc.setForeground(getApp()->getSelbackColor());
1926 dc.fillRectangle(1,1,width-2,2);
1927 */
1928 // dc.setForeground(backColor);
1929 // dc.fillRectangle(1,4,width-2,height-4);
1930
1931 dc.setForeground(getApp()->getSelbackColor());
1932 // dc.fillRectangle(1,1,width-2,height-2);
1933 fillVerticalGradient(dc,1,1,width-2,height-2,gm_make_hilite_color(backColor),backColor);
1934
1935 dc.setForeground(backColor);
1936 if (tab==0)
1937 dc.fillRectangle(1,height-1,width-1,height-1);
1938 else
1939 dc.fillRectangle(0,height-1,width,height-1);
1940 }
1941 }
1942 else {
1943 fillVerticalGradient(dc,1,1,width-1,height-2,gm_make_hilite_color(shadowColor),gm_make_hilite_color(shadowColor));
1944 }
1945
1946 if(!label.empty()){
1947 tw=labelWidth(label);
1948 th=labelHeight(label);
1949 }
1950 if(icon){
1951 iw=icon->getWidth();
1952 ih=icon->getHeight();
1953 }
1954 just_x(tx,ix,tw,iw);
1955 just_y(ty,iy,th,ih);
1956 if(icon){
1957 if(isEnabled())
1958 dc.drawIcon(icon,ix,iy);
1959 else
1960 dc.drawIconSunken(icon,ix,iy);
1961 }
1962 if(!label.empty()){
1963 dc.setFont(font);
1964 if(isEnabled()){
1965 dc.setForeground(textColor);
1966 drawLabel(dc,label,hotoff,tx,ty,tw,th);
1967 if(hasFocus()){
1968 dc.drawFocusRectangle(border+1,border+1,width-2*border-2,height-2*border-2);
1969 }
1970 }
1971 else{
1972 dc.setForeground(hiliteColor);
1973 drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th);
1974 dc.setForeground(shadowColor);
1975 drawLabel(dc,label,hotoff,tx,ty,tw,th);
1976 }
1977 }
1978 return 1;
1979 }
1980
1981
1982
1983 FXIMPLEMENT(GMListBox,FXListBox,nullptr,0);
1984
GMListBox()1985 GMListBox::GMListBox(){
1986 }
1987
GMListBox(FXComposite * p,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)1988 GMListBox::GMListBox(FXComposite*p,FXObject*tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)
1989 : FXListBox(p,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb) {
1990 borderColor=getApp()->getShadowColor();
1991 setFrameStyle(FRAME_LINE);
1992
1993 GMScrollArea::replaceScrollbars(list);
1994
1995 pane->setBorderColor(borderColor);
1996 button->setFrameStyle(FRAME_NONE);
1997 button->setPadLeft(2);
1998 button->setPadRight(2);
1999 button->setYOffset(0);
2000 button->setXOffset(1);
2001 }
2002
2003
create()2004 void GMListBox::create(){
2005 FXListBox::create();
2006 ewmh_change_window_type(pane,WINDOWTYPE_COMBO);
2007 }
2008
2009
2010
2011 FXIMPLEMENT(GMComboBox,FXComboBox,nullptr,0);
2012
GMComboBox()2013 GMComboBox::GMComboBox(){
2014 }
2015
GMComboBox(FXComposite * p,FXint cols,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)2016 GMComboBox::GMComboBox(FXComposite *p,FXint cols,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)
2017 :FXComboBox(p,cols,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb){
2018 borderColor=getApp()->getShadowColor();
2019 setFrameStyle(FRAME_LINE);
2020 pane->setBorderColor(borderColor);
2021
2022 GMScrollArea::replaceScrollbars(list);
2023 button->setFrameStyle(FRAME_NONE);
2024 button->setPadLeft(2);
2025 button->setPadRight(2);
2026 button->setYOffset(0);
2027 button->setXOffset(1);
2028 }
2029
create()2030 void GMComboBox::create(){
2031 FXComboBox::create();
2032 ewmh_change_window_type(pane,WINDOWTYPE_COMBO);
2033 }
2034
2035
2036 FXIMPLEMENT(GMImageFrame,FXImageFrame,nullptr,0);
2037
GMImageFrame()2038 GMImageFrame::GMImageFrame(){
2039 }
2040
GMImageFrame(FXComposite * p,FXImage * img,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)2041 GMImageFrame::GMImageFrame(FXComposite *p,FXImage * img,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)
2042 :FXImageFrame(p,img,opts,x,y,w,h,pl,pr,pt,pb){
2043 borderColor=getApp()->getShadowColor();
2044 backColor=getApp()->getBackColor();
2045 }
2046
2047
2048
2049 FXIMPLEMENT(GMCoverFrame,FXVerticalFrame,nullptr,0);
2050
GMCoverFrame()2051 GMCoverFrame::GMCoverFrame(){
2052 }
2053
GMCoverFrame(FXComposite * p)2054 GMCoverFrame::GMCoverFrame(FXComposite *p)
2055 :FXVerticalFrame(p,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_LINE,0,0,0,0,5,5,5,5){
2056 borderColor=getApp()->getShadowColor();
2057 backColor=getApp()->getBackColor();
2058 }
2059
2060
2061 FXIMPLEMENT(GMProgressBar,FXProgressBar,nullptr,0);
2062
GMProgressBar()2063 GMProgressBar::GMProgressBar(){
2064 }
2065
GMProgressBar(FXComposite * p,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)2066 GMProgressBar::GMProgressBar(FXComposite *p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)
2067 :FXProgressBar(p,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb){
2068 borderColor=getApp()->getShadowColor();
2069 barColor=getApp()->getSelbackColor();
2070 textAltColor=getApp()->getSelforeColor();//FXRGB(255,255,255);
2071 setFrameStyle(FRAME_LINE);
2072 }
2073
2074
2075 FXDEFMAP(GMTrackProgressBar) GMTrackProgressBarMap[]={
2076 FXMAPFUNC(SEL_MOTION,0,GMTrackProgressBar::onMotion),
2077 FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,GMTrackProgressBar::onLeftBtnPress),
2078 FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,GMTrackProgressBar::onLeftBtnRelease)
2079 };
2080
2081 FXIMPLEMENT(GMTrackProgressBar,FXProgressBar,GMTrackProgressBarMap,ARRAYNUMBER(GMTrackProgressBarMap));
2082
GMTrackProgressBar()2083 GMTrackProgressBar::GMTrackProgressBar(){
2084 flags|=FLAG_ENABLED;
2085 }
2086
GMTrackProgressBar(FXComposite * p,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)2087 GMTrackProgressBar::GMTrackProgressBar(FXComposite *p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)
2088 :FXProgressBar(p,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb){
2089 flags|=FLAG_ENABLED;
2090 borderColor=getApp()->getShadowColor();
2091 barColor=getApp()->getSelbackColor();
2092 textAltColor=getApp()->getSelforeColor();
2093 setFrameStyle(FRAME_LINE);
2094 barsize=7;
2095 }
2096
2097
2098
2099 // Moving
onMotion(FXObject *,FXSelector,void *)2100 long GMTrackProgressBar::onMotion(FXObject*,FXSelector,void*){
2101 // register FXEvent *event=(FXEvent*)ptr;
2102 FXuint /*xx,yy,ww,hh,lo,hi,*/p=0/*,h,travel*/;
2103 if(!isEnabled()) return 0;
2104 if(flags&FLAG_PRESSED){
2105 /*
2106
2107 yy=border+padtop;
2108 xx=border+padleft;
2109 hh=height-(border<<1)-padtop-padbottom;
2110 ww=width-(border<<1)-padleft-padright;
2111 if(options&PROGRESSBAR_VERTICAL){
2112 h=event->win_y-dragpoint;
2113 travel=hh-headsize;
2114 if(h<yy) h=yy;
2115 if(h>yy+travel) h=yy+travel;
2116 if(h!=headpos){
2117 FXMINMAX(lo,hi,headpos,h);
2118 headpos=h;
2119 update(border,lo-1,width-(border<<1),hi+headsize+2-lo);
2120 }
2121 if(travel>0)
2122 p=range[0]+((range[1]-range[0])*(yy+travel-h)+travel/2)/travel; // Use rounding!!
2123 else
2124 p=range[0];
2125 }
2126 else{
2127 h=event->win_x-dragpoint;
2128 travel=ww-headsize;
2129 if(h<xx) h=xx;
2130 if(h>xx+travel) h=xx+travel;
2131 if(h!=headpos){
2132 FXMINMAX(lo,hi,headpos,h);
2133 headpos=h;
2134 update(lo-1,border,hi+headsize+2-lo,height-(border<<1));
2135 }
2136 if(travel>0)
2137 p=range[0]+((range[1]-range[0])*(h-xx)+travel/2)/travel; // Use rounding!!
2138 else
2139 p=range[0];
2140 }
2141 if(p<range[0]) p=range[0];
2142 if(p>range[1]) p=range[1];
2143 if(pos!=p){
2144 pos=p;
2145 flags|=FLAG_CHANGED;
2146 if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)pos);
2147 }
2148 */
2149 if(progress!=p){
2150 progress=p;
2151 flags|=FLAG_CHANGED;
2152 if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)progress);
2153 }
2154 return 1;
2155 }
2156 return 0;
2157 }
2158
2159 // Pressed LEFT button
onLeftBtnPress(FXObject *,FXSelector,void * ptr)2160 long GMTrackProgressBar::onLeftBtnPress(FXObject*,FXSelector,void* ptr){
2161 // register FXEvent *event=(FXEvent*)ptr;
2162 // register FXint p=progress;
2163 flags&=~FLAG_TIP;
2164 handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr);
2165 if(isEnabled()){
2166 grab();
2167 if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1;
2168 flags&=~FLAG_UPDATE;
2169 /*
2170 if(options&PROGRESSBAR_VERTICAL){
2171 if(event->win_y<headpos){
2172 p=progress+incr;
2173 }
2174 else if(event->win_y>(headpos+headsize)){
2175 p=progress-incr;
2176 }
2177 else{
2178 dragpoint=event->win_y-headpos;
2179 flags|=FLAG_PRESSED;
2180 }
2181 }
2182 else{
2183 if(event->win_x<headpos){
2184 p=progress-incr;
2185 }
2186 else if(event->win_x>(headpos+headsize)){
2187 p=progress+incr;
2188 }
2189 else{
2190 dragpoint=event->win_x-headpos;
2191 flags|=FLAG_PRESSED;
2192 }
2193
2194 }
2195 */
2196
2197 // if(p<range[0]) p=range[0];
2198 // if(p>range[1]) p=range[1];
2199 /*
2200 if(p!=progress){
2201 setProgress(p);
2202 flags|=FLAG_CHANGED;
2203 if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)progress);
2204 }
2205 */
2206 return 1;
2207 }
2208 return 0;
2209 }
2210
2211
2212 // Released Left button
onLeftBtnRelease(FXObject *,FXSelector,void * ptr)2213 long GMTrackProgressBar::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){
2214 FXEvent *event=(FXEvent*)ptr;
2215 // register FXuint flgs=flags;
2216 if(isEnabled()){
2217 ungrab();
2218
2219 FXint xx=border+padleft;
2220 FXint ww=width-(border<<1)-padleft-padright;
2221
2222
2223 // setProgress(progress); // Hop to exact position
2224 flags&=~FLAG_PRESSED;
2225 flags&=~FLAG_CHANGED;
2226 flags|=FLAG_UPDATE;
2227 if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1;
2228
2229 if (event->click_x > xx && event->click_x < xx+ww) {
2230 FXdouble pos = (event->click_x - xx) / (FXdouble)ww;
2231 if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),&pos);
2232 }
2233 return 1;
2234 }
2235 return 0;
2236 }
2237
2238