GMLscripts.com

Discuss and collaborate on GML scripts
Invert

You are not logged in.

#1 2017-05-15 14:15:17

Tsa05
Member
Registered: 2016-11-16
Posts: 13

draw_slider(x,y,size,params,orientation)

Horizontal Slider
Draws a horizontal or vertical slider bar on the screen, handling mouse clicking along the way.
Returns a simple array containing the current position of the slider and also the click-dragging state in order to help it play well with other UI elements.

Typical usage in draw event:

Expandslide = draw_slider(x,y, 300, slide, 1);
amount = slide[0];

Where slide is set up prior to drawing like so:
slide = [defaultStartingPercent, 0]

Expand///@description			draw_slider(x,y,size,params,orientation)
///@arg		{real}	x		Starting x-coord of slider
///@arg		{real}	y		Starting y-coord of slider
///@arg		{real}	size	Pixels wide or tall for slider
///@arg		{array}	params	Parameters for persistent settings
///@arg		{real}	orient	0 for horizontal, 1 for vertical
/*
*	Returns:
*		Parameter array of data generated by slider
*
*	Parameter array:
*		0: The default amount to slide (0-1)
*		1: Whether the slider is engaged (0,1)
*
*	The return array's zero index value is the percent of slide.
*	This varies with distance from the origin coords, so:
*	Horizontal slide goes 0-1 from left to right
*	Vertical slide goes 0-1 from top to bottom.
*/
/// GMLscripts.com/license
{
var sx = argument[0];
var sy = argument[1];
var ss = argument[2];
var sp = argument[3];
var so = argument[4];

var barColor = make_color_rgb(204,204,204);
var borderColor = make_color_rgb(112,112,112);
var shadowColor = make_color_rgb(145,145,145);
var lightGrey = make_color_rgb(237,237,237);
var darkGrey = make_color_rgb(168,168,168);

var thickness = 10;
var snapPercent = .04;

var mLeft = mouse_check_button(mb_left);

var sa,se,x1,y1,x2,y2,sx1,sy1,sx2,sy2,mx1,my1,mx2,my2,cx,cy,r, retVal;
if(is_array(sp)){
	sa = sp[0]; se = sp[1];
}else{
	sa = real(sp); se = 0;
}
if(!so){
	// Horizontal
	x1 = sx; y1 = sy;
	x2 = x1+ss; y2 = y1+thickness;
	
	sx1 = x1; sy1 = y1;
	sx2 = x2; sy2 = y1+thickness/5;
	
	var mThick = thickness/5;
	mx1 = (x1+x2)/2-mThick/2; my1 = y1;
	mx2 = (x1+x2)/2+mThick/2; my2 = y2;
	
	// Adjust amount
	if(se || (mLeft && 
	point_in_rectangle(mouse_x,mouse_y, x1,y1-thickness/2, x2, y2+thickness/2))){
		sa = clamp((mouse_x-x1)/ss,0,1);
		se = 1;
	}
	
	r = thickness;
	cy = (y1+y2)/2;
	cx = x1+sa*ss;
	
	// Snap
	if(!mLeft){
		se=0;
		if( (abs(cx- (x1+x2)/2))/ss<=snapPercent){
			cx = (x1+x2)/2;
			sa = clamp((cx-x1)/ss,0,1);
		}
	}
}else{
	// Vertical
	x1 = sx; y1 = sy;
	x2 = x1+thickness; y2 = y1+ss;
	
	sx1 = x1; sy1 = y1;
	sx2 = x1+thickness/5; sy2 = y2;
	
	var mThick = thickness/5;
	mx1 = x1; my1 = (y1+y2)/2-mThick/2;
	mx2 = x2; my2 = (y1+y2)/2+mThick/2;
	
	// Adjust amount
	if(se || (mLeft && 
	point_in_rectangle(mouse_x,mouse_y, x1-thickness/2,y1, x2+thickness/2, y2))){
		sa = clamp((mouse_y-y1)/ss,0,1);
		se = 1;
	}
	
	r = thickness;
	cx = (x1+x2)/2;
	cy = y1+sa*ss;
	
	// Snap
	if(!mLeft){
		se=0;
		if( (abs(cy- (y1+y2)/2))/ss<=snapPercent){
			cy = (y1+y2)/2;
			sa = clamp((cy-y1)/ss,0,1);
		}
	}
}
retVal[0] = sa;
retVal[1] = se;
draw_set_circle_precision(64);
draw_set_color(barColor);	
draw_rectangle(x1,y1,x2,y2,0);
draw_set_color(shadowColor);
draw_rectangle(sx1,sy1,sx2,sy2,0);
draw_set_color(borderColor);
draw_rectangle(x1,y1,x2,y2,1);
draw_rectangle(mx1,my1,mx2,my2,0);
draw_circle_color(cx,cy,r,lightGrey,darkGrey,0);
draw_set_color(borderColor);
draw_circle(cx,cy,r,1);


return retVal;
}

Last edited by Tsa05 (2017-05-15 14:55:01)

Offline

#2 2017-05-17 00:12:55

xot
Administrator
Registered: 2007-08-18
Posts: 1,240

Re: draw_slider(x,y,size,params,orientation)

Cool immediate-mode-style slider. Thanks!


Abusing forum power since 1986.

Offline

Board footer

Powered by FluxBB