|  | # data file for the Fltk User Interface Designer (fluid)
version 1.0010 
header_name {.H} 
code_name {.cxx} 
gridx 2 
gridy 2 
snap 1
decl {\#include <FL/fl_draw.H>} {public
} 
decl {\#include <FL/Fl_Widget.H>} {public
} 
decl {\#include <FL/Fl_Window.H>} {public
} 
class Fl_DragBar {open : {public Fl_Widget}
} {
  decl {int old_rx,old_ry;} {}
  decl {int _type;} {}
  decl {void (*cb_OnDrag)(Fl_Widget*, int xoffset,int yoffset, void*);} {public}
  decl {void *cb_OnDrag_Data;} {public}
  decl {void (*cb_OnClick)(Fl_Widget*, int button, int shift_state, void*);} {public}
  decl {void *cb_OnClick_Data;} {public}
  decl {enum DragType {WINDRAG=0,NICEWINDRAG,FLDRAG,NICEFLDRAG};} {public
  }
  Function {Fl_DragBar(int x,int y,int w,int h,const char *l=0): Fl_Widget(x,y,w,h,l),
cb_OnDrag(NULL),
cb_OnDrag_Data(NULL)
} {open
  } {
    code {_type = Fl_DragBar::NICEFLDRAG;} {}
  }
  Function {~Fl_DragBar()} {} {}
  Function {draw()} {private
  } {
    code {int ww,hh;
  uchar r,g,b;
  uchar rb,gb,bb;
  uchar rd,gd,bd;
  int	val;
  
	draw_box();
	int x1 = x()+5;
	int x2 = x()+w()-5;
	int y1 = y()+5;
	int y2 = y()+h()-5;
	Fl::get_color(color(),r,g,b);
	val = (int)r + 64; rb = val > 255 ? 255:val;
	val = (int)g + 64; gb = val > 255 ? 255:val;
	val = (int)b + 64; bb = val > 255 ? 255:val;
	val = (int)r - 64; rd = val < 0 ? 0:val;
	val = (int)g - 64; gd = val < 0 ? 0:val;
	val = (int)b - 64; bd = val < 0 ? 0:val;
	if (h()<w())
	{
		if ((_type==Fl_DragBar::NICEWINDRAG) || (_type==Fl_DragBar::NICEFLDRAG))
		{
			fl_line_style(FL_DASH);
			for (int i = y() + 4; i < y()+h()-5;i+=3)
			{
				fl_line_style(FL_DASH);
				fl_color(rb,gb,bb);
				fl_line(x1,i,x2,i);
				fl_color(rd,gd,bd);
				fl_line(x1,i+1,x2,i+1);
			}
			fl_line_style(FL_SOLID);
		}
		fl_color(color());
		const char *l = label();
		ww = labelsize()*strlen(l)/2;
		//ww = (int)fl_width(l);
		hh = h() - 4;
		if (align() & FL_ALIGN_RIGHT)
		{
			x1 = x() + w() - 5 - ww;
		}
		else
		if (align() & FL_ALIGN_CENTER)
		{
			x1 = x() + 5;
		}
		else
		{
			x1 = x() + (w() - ww) / 2;
		}
		fl_rectf(x1,y()+(h() - hh) / 2, ww, hh);
		draw_label();
	}
	else
	if ((_type==Fl_DragBar::NICEWINDRAG) || (_type==Fl_DragBar::NICEFLDRAG))
	{
		fl_line_style(FL_DASH);	
		for (int i = x() + 4; i < x()+w()-5;i+=3)
		{
			fl_color(rb,gb,bb);
			fl_line(i,y1,i,y2);
			fl_color(rd,gd,bd);
			fl_line(i+1,y1,i+1,y2);
		}
		fl_line_style(FL_SOLID);
	}} {selected
    }
  }
  Function {handle(int event)} {private return_type int
  } {
    code {int rx,ry,xx,yy;
int mx,my;
	if (_type <  (int)Fl_DragBar::FLDRAG)
	{
		rx = Fl::event_x_root(); 
		ry = Fl::event_y_root();
	}
	else
	{ 
		rx = Fl::event_x();
		ry = Fl::event_y();
	}
	switch(event)
	{
		case FL_PUSH:
		{
			window()->show();
			fl_cursor(FL_CURSOR_MOVE);
			if (_type < (int)Fl_DragBar::FLDRAG)
			{
				old_rx = rx - window()->x();
				old_ry = ry - window()->y();
			}
			else
			{
				old_rx = rx - parent()->x();
				old_ry = ry - parent()->y();
			}
			return 1;
		}
		case FL_RELEASE:
		{
			fl_cursor(FL_CURSOR_DEFAULT);
			do_callback();
			if (((Fl::event_is_click()) && (cb_OnClick))
			{
				cb_OnClick(this, cb_OnClick_Data);
			}
			return 1;
		}
		case FL_DRAG:
		{
			if ((rx != old_rx) || (ry != old_ry))
			{
				xx =  rx - old_rx;
				yy =  ry - old_ry;
				
				if (_type <  (int)Fl_DragBar::FLDRAG) 
				{
					if (cb_OnDrag) {
						int xoffset, yoffset;
						
						xoffset = (rx - window()->x()) - old_rx;
						yoffset = (ry - window()->y()) - old_ry;
	
						cb_OnDrag(this, xoffset, yoffset, cb_OnDrag_Data);		
					}
					window()->position(xx,yy);
				}
				else
				{
					if (cb_OnDrag) {
						int xoffset, yoffset;
						
						xoffset = (rx - parent()->x()) - old_rx;
						yoffset = (ry - parent()->y()) - old_ry;
	
						cb_OnDrag(this, xoffset, yoffset, cb_OnDrag_Data);		
					}
					parent()->position(xx,yy);
					if (parent()->parent()) 
						parent()->parent()->redraw();
					else
						window()->redraw();		
				}		
			}
			return 1;
		}
		case FL_MOVE:
		{
			return 0;
		}
		case FL_ENTER :
		{
			return 0;
		}
		
		case FL_LEAVE :
		{
			fl_cursor(FL_CURSOR_DEFAULT);
			return 1;
		}
		default :
			return 0;
	}} {}
  }
  Function {type(int t)} {} {
    code {_type = t;} {}
  }
} 
 |