diff options
| author | Joel Bodenmann <joel@unormal.org> | 2013-07-14 20:02:28 +0200 | 
|---|---|---|
| committer | Joel Bodenmann <joel@unormal.org> | 2013-07-14 20:02:28 +0200 | 
| commit | 38a2a44b3d27ca29019cd0d75e60233ee9188c71 (patch) | |
| tree | 6cd0e65ba5ce5b0884d5cd4085795e347b5fa509 /src/gwin/slider.c | |
| parent | b7e6967886a25277af53e04ce6942b715b538644 (diff) | |
| parent | c5ec72027787c9cd5f5b36a46eb55f03fd95d894 (diff) | |
| download | uGFX-38a2a44b3d27ca29019cd0d75e60233ee9188c71.tar.gz uGFX-38a2a44b3d27ca29019cd0d75e60233ee9188c71.tar.bz2 uGFX-38a2a44b3d27ca29019cd0d75e60233ee9188c71.zip  | |
Merge branch 'GWIN'
Diffstat (limited to 'src/gwin/slider.c')
| -rw-r--r-- | src/gwin/slider.c | 487 | 
1 files changed, 280 insertions, 207 deletions
diff --git a/src/gwin/slider.c b/src/gwin/slider.c index 01df189d..4d9c3510 100644 --- a/src/gwin/slider.c +++ b/src/gwin/slider.c @@ -19,140 +19,232 @@  #if (GFX_USE_GWIN && GWIN_NEED_SLIDER) || defined(__DOXYGEN__) -#include "gwin/internal.h" +#include "gwin/class_gwin.h"  #ifndef GWIN_SLIDER_DEAD_BAND  	#define GWIN_SLIDER_DEAD_BAND	5  #endif -#if GFX_USE_GINPUT && GINPUT_NEED_MOUSE -	static void trackSliderDraw(GHandle gh, coord_t x, coord_t y); +#ifndef GWIN_SLIDER_TOGGLE_INC +	#define GWIN_SLIDER_TOGGLE_INC	20			// How many toggles to go from minimum to maximum  #endif -static const GSliderDrawStyle GSliderDefaultStyle = { -	HTML2COLOR(0x404040),		// color_edge; -	HTML2COLOR(0x000000),		// color_thumb; -	HTML2COLOR(0x00E000),		// color_active; -	HTML2COLOR(0xE0E0E0),		// color_inactive; -}; +// Send the slider event +static void SendSliderEvent(GWidgetObject *gw) { +	GSourceListener	*	psl; +	GEvent *			pe; +	#define pse			((GEventGWinSlider *)pe) -// Process an event callback -static void gwinSliderCallback(void *param, GEvent *pe) { -	GSourceListener	*psl; -	#define gh		((GHandle)param) -	#define gsw		((GSliderObject *)param) -	#define gsh		((GSourceHandle)param) -	#define pme		((GEventMouse *)pe) -	#define pde		((GEventDial *)pe) -	#define pse		((GEventGWinSlider *)pe) - -	switch (pe->type) { -	#if GFX_USE_GINPUT && GINPUT_NEED_MOUSE -		case GEVENT_MOUSE: -		case GEVENT_TOUCH: -			// If not tracking we only only interested in a mouse down over the slider -			if (!gsw->tracking) { -				if ((pme->meta & GMETA_MOUSE_DOWN) -						&& pme->x >= gh->x && pme->x < gh->x + gh->width -						&& pme->y >= gh->y && pme->y < gh->y + gh->height) { -					gsw->tracking = TRUE; -					trackSliderDraw(gh, pme->x-gh->x, pme->y-gh->y); -				} +	// Trigger a GWIN Button Event +	psl = 0; +	while ((psl = geventGetSourceListener(GWIDGET_SOURCE, psl))) { +		if (!(pe = geventGetEventBuffer(psl))) +			continue; +		pse->type = GEVENT_GWIN_SLIDER; +		pse->slider = (GHandle)gw; +		pse->position = ((GSliderObject *)gw)->pos; +		geventSendEvent(psl); +	} + +	#undef pse +} + +// Reset the display position back to the value predicted by the saved slider position +static void ResetDisplayPos(GSliderObject *gsw) { +	if (gsw->w.g.width < gsw->w.g.height) +		gsw->dpos = gsw->w.g.height-1-((gsw->w.g.height-1)*(gsw->pos-gsw->min))/(gsw->max-gsw->min); +	else +		gsw->dpos = ((gsw->w.g.width-1)*(gsw->pos-gsw->min))/(gsw->max-gsw->min); +} + +#if GINPUT_NEED_MOUSE +	// A mouse up event +	static void MouseUp(GWidgetObject *gw, coord_t x, coord_t y) { +		#define gsw		((GSliderObject *)gw) +		#define gh		((GHandle)gw) + +		#if GWIN_BUTTON_LAZY_RELEASE +			// Clip to the slider +			if (x < 0) x = 0; +			else if (x >= gh->width) x = gh->width-1; +			if (y < 0) y = 0; +			else if (y >= gh->height) x = gh->height-1; +		#else +			// Are we over the slider? +			if (x < 0 || x >= gh->width || y < 0 || y >= gh->height) { +				// No - restore the slider +				ResetDisplayPos(gsw); +				_gwidgetRedraw(gh);  				return;  			} +		#endif -			// We are tracking the mouse - -			// Test for button up -			if ((pme->meta & GMETA_MOUSE_UP)) { -				gsw->tracking = FALSE; - -				#if !GWIN_BUTTON_LAZY_RELEASE -					// Are we over the slider? -					if (pme->x < gh->x || pme->x >= gh->x + gh->width -							|| pme->y < gh->y || pme->y >= gh->y + gh->height) { -						// No - restore the slider -						gwinSliderDraw(gh); -						return; -					} -				#endif - -				// Set the new position -				if (gh->width < gh->height) -					gwinSetSliderPosition(gh, -						(uint16_t)((uint32_t)(gh->height-1-pme->y+gh->y-GWIN_SLIDER_DEAD_BAND)*(gsw->max-gsw->min)/(gh->height-2*GWIN_SLIDER_DEAD_BAND) + gsw->min)); -				else -					gwinSetSliderPosition(gh, -						(uint16_t)((uint32_t)(pme->x-gh->x-GWIN_SLIDER_DEAD_BAND)*(gsw->max-gsw->min)/(gh->width-2*GWIN_SLIDER_DEAD_BAND) + gsw->min)); - -				// Update the display -				gwinSliderDraw(gh); - -				// Generate the event -				break; -			} +		// Set the new position +		if (gh->width < gh->height) { +			if (y > gh->height-GWIN_SLIDER_DEAD_BAND) +				gsw->pos = gsw->min; +			else if (y < GWIN_SLIDER_DEAD_BAND) +				gsw->pos = gsw->max; +			else +				gsw->pos = (uint16_t)((int32_t)(gh->height-1-y-GWIN_SLIDER_DEAD_BAND)*(gsw->max-gsw->min)/(gh->height-2*GWIN_SLIDER_DEAD_BAND) + gsw->min); +		} else { +			if (x > gh->width-GWIN_SLIDER_DEAD_BAND) +				gsw->pos = gsw->max; +			else if (x < GWIN_SLIDER_DEAD_BAND) +				gsw->pos = gsw->min; +			else +				gsw->pos = (uint16_t)((int32_t)(x-GWIN_SLIDER_DEAD_BAND)*(gsw->max-gsw->min)/(gh->width-2*GWIN_SLIDER_DEAD_BAND) + gsw->min); +		} + +		ResetDisplayPos(gsw); +		_gwidgetRedraw(gh); + +		// Generate the event +		SendSliderEvent(gw); +		#undef gh +		#undef gsw +	} -			// If mouse down - track movement -			if ((pme->current_buttons & GINPUT_MOUSE_BTN_LEFT)) -				trackSliderDraw(gh, pme->x-gh->x, pme->y-gh->y); +	// A mouse move (or mouse down) event +	static void MouseMove(GWidgetObject *gw, coord_t x, coord_t y) { +		#define gsw		((GSliderObject *)gw) + +		// Determine the temporary display position (with range checking) +		if (gw->g.width < gw->g.height) { +			if (y < 0) +				gsw->dpos = 0; +			else if (y >= gw->g.height) +				gsw->dpos = gw->g.height-1; +			else +				gsw->dpos = y; +		} else { +			if (x < 0) +				gsw->dpos = 0; +			else if (x >= gw->g.width) +				gsw->dpos = gw->g.width-1; +			else +				gsw->dpos = x; +		} + +		// Update the display +		_gwidgetRedraw(&gw->g); +		#undef gsw +	} +#endif -			return; -	#endif -	#if GFX_USE_GINPUT && GINPUT_NEED_DIAL -		case GEVENT_DIAL: -			// Set the new position -			gwinSetSliderPosition(gh, (uint16_t)((uint32_t)pde->value*(gsw->max-gsw->min)/ginputGetDialRange(pde->instance) + gsw->min)); +#if GINPUT_NEED_TOGGLE +	// A toggle on has occurred +	static void ToggleOn(GWidgetObject *gw, uint16_t role) { +		#define gsw		((GSliderObject *)gw) + +		if (role) { +			gwinSliderSetPosition((GHandle)gw, gsw->pos+(gsw->max-gsw->min)/GWIN_SLIDER_TOGGLE_INC); +			SendSliderEvent(gw); +		} else { +			gwinSliderSetPosition((GHandle)gw, gsw->pos-(gsw->max-gsw->min)/GWIN_SLIDER_TOGGLE_INC); +			SendSliderEvent(gw); +		} +		#undef gsw +	} -			// Update the display -			gwinSliderDraw(gh); +	static void ToggleAssign(GWidgetObject *gw, uint16_t role, uint16_t instance) { +		if (role) +			((GSliderObject *)gw)->t_up = instance; +		else +			((GSliderObject *)gw)->t_dn = instance; +	} -			// Generate the event -			break; -	#endif +	static uint16_t ToggleGet(GWidgetObject *gw, uint16_t role) { +		return role ? ((GSliderObject *)gw)->t_up : ((GSliderObject *)gw)->t_dn; +	} +#endif -	default: -		return; +#if GINPUT_NEED_DIAL +	// A dial move event +	static void DialMove(GWidgetObject *gw, uint16_t role, uint16_t value, uint16_t max) { +		#define gsw		((GSliderObject *)gw) +		(void)			role; + +		// Set the new position +		gsw->pos = (uint16_t)((uint32_t)value*(gsw->max-gsw->min)/max + gsw->min); + +		ResetDisplayPos(gsw); +		_gwidgetRedraw((GHandle)gw); + +		// Generate the event +		SendSliderEvent(gw); +		#undef gsw  	} -	// Trigger a GWIN Slider Event -	psl = 0; -	while ((psl = geventGetSourceListener(gsh, psl))) { -		if (!(pe = geventGetEventBuffer(psl))) -			continue; -		pse->type = GEVENT_GWIN_SLIDER; -		pse->slider = gh; -		pse->position = gsw->pos; -		geventSendEvent(psl); +	static void DialAssign(GWidgetObject *gw, uint16_t role, uint16_t instance) { +		(void) role; +		((GSliderObject *)gw)->dial = instance;  	} -	#undef pse -	#undef pme -	#undef pxe -	#undef gsh -	#undef gsw -	#undef gh -} +	static uint16_t DialGet(GWidgetObject *gw, uint16_t role) { +		(void) role; +		return ((GSliderObject *)gw)->dial; +	} +#endif + +// The slider VMT table +static const gwidgetVMT sliderVMT = { +	{ +		"Slider",				// The classname +		sizeof(GSliderObject),	// The object size +		_gwidgetDestroy,		// The destroy routine +		_gwidgetRedraw,			// The redraw routine +		0,						// The after-clear routine +	}, +	gwinSliderDraw_Std,			// The default drawing routine +	#if GINPUT_NEED_MOUSE +		{ +			0,						// Process mouse down events (NOT USED) +			MouseUp,				// Process mouse up events +			MouseMove,				// Process mouse move events +		}, +	#endif +	#if GINPUT_NEED_TOGGLE +		{ +			2,						// 1 toggle role +			ToggleAssign,			// Assign Toggles +			ToggleGet,				// Get Toggles +			0,						// Process toggle off events (NOT USED) +			ToggleOn,				// Process toggle on events +		}, +	#endif +	#if GINPUT_NEED_DIAL +		{ +			1,						// 1 dial roles +			DialAssign,				// Assign Dials +			DialGet,				// Get Dials +			DialMove,				// Process dial move events +		}, +	#endif +}; -GHandle gwinCreateSlider(GSliderObject *gs, coord_t x, coord_t y, coord_t width, coord_t height) { -	if (!(gs = (GSliderObject *)_gwinInit((GWindowObject *)gs, x, y, width, height, sizeof(GSliderObject)))) +GHandle gwinSliderCreate(GSliderObject *gs, const GWidgetInit *pInit) { +	if (!(gs = (GSliderObject *)_gwidgetCreate(&gs->w, pInit, &sliderVMT)))  		return 0; -	gs->gwin.type = GW_SLIDER; -	gs->fn = gwinSliderDraw_Std; -	gs->param = 0; -	gwinSetSliderStyle(&gs->gwin, &GSliderDefaultStyle); +	#if GINPUT_NEED_TOGGLE +		gs->t_dn = GWIDGET_NO_INSTANCE; +		gs->t_up = GWIDGET_NO_INSTANCE; +	#endif +	#if GINPUT_NEED_DIAL +		gs->dial = GWIDGET_NO_INSTANCE; +	#endif  	gs->min = 0;  	gs->max = 100;  	gs->pos = 0; -	gs->tracking = FALSE; -	geventListenerInit(&gs->listener); -	geventRegisterCallback(&gs->listener, gwinSliderCallback, gs); +	ResetDisplayPos(gs); +	gwinSetVisible((GHandle)gs, pInit->g.show);  	return (GHandle)gs;  } -void gwinSetSliderRange(GHandle gh, int min, int max) { +void gwinSliderSetRange(GHandle gh, int min, int max) {  	#define gsw		((GSliderObject *)gh) -	if (gh->type != GW_SLIDER) +	if (gh->vmt != (gwinVMT *)&sliderVMT)  		return;  	if (min == max)		// prevent divide by 0 errors. @@ -160,13 +252,14 @@ void gwinSetSliderRange(GHandle gh, int min, int max) {  	gsw->min = min;  	gsw->max = max;  	gsw->pos = min; +	ResetDisplayPos(gsw);  	#undef gsw  } -void gwinSetSliderPosition(GHandle gh, int pos) { +void gwinSliderSetPosition(GHandle gh, int pos) {  	#define gsw		((GSliderObject *)gh) -	if (gh->type != GW_SLIDER) +	if (gh->vmt != (gwinVMT *)&sliderVMT)  		return;  	if (gsw->min <= gsw->max) { @@ -178,125 +271,105 @@ void gwinSetSliderPosition(GHandle gh, int pos) {  		else if (pos < gsw->max) gsw->pos = gsw->max;  		else gsw->pos = pos;  	} +	ResetDisplayPos(gsw);  	#undef gsw  } -void gwinSetSliderStyle(GHandle gh, const GSliderDrawStyle *pStyle) { -	#define gsw		((GSliderObject *)gh) - -	if (gh->type != GW_SLIDER) -		return; - -	gsw->style.color_edge		= pStyle->color_edge; -	gsw->style.color_thumb	= pStyle->color_thumb; -	gsw->style.color_active	= pStyle->color_active; -	gsw->style.color_inactive	= pStyle->color_inactive; -	#undef gsw -} - -#if GFX_USE_GINPUT && GINPUT_NEED_MOUSE -	static void trackSliderDraw(GHandle gh, coord_t x, coord_t y) { -		#define gsw		((GSliderObject *)gh) +/*---------------------------------------------------------- + * Custom Draw Routines + *----------------------------------------------------------*/ -		#if GDISP_NEED_CLIP -			gdispSetClip(gh->x, gh->y, gh->width, gh->height); -		#endif +void gwinSliderDraw_Std(GWidgetObject *gw, void *param) { +	#define gsw			((GSliderObject *)gw) +	const GColorSet *	pcol; +	(void)				param; -		if (gh->height <= gh->width) -			gsw->fn(gh, FALSE, x, &gsw->style, gsw->param); -		else -			gsw->fn(gh, TRUE, y, &gsw->style, gsw->param); -	 -		#undef gbw -	} -#endif - -void gwinSliderDraw(GHandle gh) { -	#define gsw		((GSliderObject *)gh) -	 -	if (gh->type != GW_SLIDER) +	if (gw->g.vmt != (gwinVMT *)&sliderVMT)  		return; -	#if GDISP_NEED_CLIP -		gdispSetClip(gh->x, gh->y, gh->width, gh->height); -	#endif - -	if (gh->height <= gh->width) -		gsw->fn(gh, FALSE, ((gh->width-1)*(gsw->pos-gsw->min))/(gsw->max-gsw->min), &gsw->style, gsw->param); +	if ((gw->g.flags & GWIN_FLG_ENABLED)) +		pcol = &gw->pstyle->pressed;  	else -		gsw->fn(gh, TRUE, gh->height-1-((gh->height-1)*(gsw->pos-gsw->min))/(gsw->max-gsw->min), &gsw->style, gsw->param); - -	#undef gbw -} - -void gwinSetSliderCustom(GHandle gh, GSliderDrawFunction fn, void *param) { -	#define gsw		((GSliderObject *)gh) - -	if (gh->type != GW_SLIDER) -		return; - -	gsw->fn = fn ? fn : gwinSliderDraw_Std; -	gsw->param = param; +		pcol = &gw->pstyle->disabled; + +	if (gw->g.width < gw->g.height) {			// Vertical slider +		if (gsw->dpos != gw->g.height-1) +			gdispFillArea(gw->g.x, gw->g.y+gsw->dpos, gw->g.width, gw->g.height - gsw->dpos, pcol->progress);	// Active Area +		if (gsw->dpos != 0) +			gdispFillArea(gw->g.x, gw->g.y, gw->g.width, gsw->dpos, gw->pstyle->enabled.progress);			// Inactive area +		gdispDrawBox(gw->g.x, gw->g.y, gw->g.width, gw->g.height, pcol->edge);								// Edge +		gdispDrawLine(gw->g.x, gw->g.y+gsw->dpos, gw->g.x+gw->g.width-1, gw->g.y+gsw->dpos, pcol->edge);	// Thumb +		if (gsw->dpos >= 2) +			gdispDrawLine(gw->g.x, gw->g.y+gsw->dpos-2, gw->g.x+gw->g.width-1, gw->g.y+gsw->dpos-2, pcol->edge);	// Thumb +		if (gsw->dpos <= gw->g.height-2) +			gdispDrawLine(gw->g.x, gw->g.y+gsw->dpos+2, gw->g.x+gw->g.width-1, gw->g.y+gsw->dpos+2, pcol->edge);	// Thumb + +	// Horizontal slider +	} else { +		if (gsw->dpos != gw->g.width-1) +			gdispFillArea(gw->g.x+gsw->dpos, gw->g.y, gw->g.width-gsw->dpos, gw->g.height, gw->pstyle->enabled.progress);	// Inactive area +		if (gsw->dpos != 0) +			gdispFillArea(gw->g.x, gw->g.y, gsw->dpos, gw->g.height, pcol->progress);	// Active Area +		gdispDrawBox(gw->g.x, gw->g.y, gw->g.width, gw->g.height, pcol->edge);								// Edge +		gdispDrawLine(gw->g.x+gsw->dpos, gw->g.y, gw->g.x+gsw->dpos, gw->g.y+gw->g.height-1, pcol->edge);	// Thumb +		if (gsw->dpos >= 2) +			gdispDrawLine(gw->g.x+gsw->dpos-2, gw->g.y, gw->g.x+gsw->dpos-2, gw->g.y+gw->g.height-1, pcol->edge);	// Thumb +		if (gsw->dpos <= gw->g.width-2) +			gdispDrawLine(gw->g.x+gsw->dpos+2, gw->g.y, gw->g.x+gsw->dpos+2, gw->g.y+gw->g.height-1, pcol->edge);	// Thumb +	} +	gdispDrawStringBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, gw->text, gw->g.font, pcol->text, justifyCenter);  	#undef gsw  } -void gwinSliderSetEnabled(GHandle gh, bool_t enabled) { -	if (gh->type != GW_SLIDER) +void gwinSliderDraw_Image(GWidgetObject *gw, void *param) { +	#define gsw			((GSliderObject *)gw) +	#define gi			((gdispImage *)param) +	const GColorSet *	pcol; +	coord_t				z, v; + +	if (gw->g.vmt != (gwinVMT *)&sliderVMT)  		return; -	gh->enabled = enabled; -} +	if ((gw->g.flags & GWIN_FLG_ENABLED)) +		pcol = &gw->pstyle->pressed; +	else +		pcol = &gw->pstyle->disabled; + +	if (gw->g.width < gw->g.height) {			// Vertical slider +		if (gsw->dpos != 0)							// The unfilled area +			gdispFillArea(gw->g.x, gw->g.y, gw->g.width, gsw->dpos, gw->pstyle->enabled.progress);	// Inactive area +		if (gsw->dpos != gw->g.height-1) {			// The filled area +			for(z=gw->g.height, v=gi->height; z > gsw->dpos;) { +				z -= v; +				if (z < gsw->dpos) { +					v -= gsw->dpos - z; +					z = gsw->dpos; +				} +				gdispImageDraw(gi, gw->g.x, gw->g.y+z, gw->g.width, v, 0, gi->height-v); +			} +		} +		gdispDrawBox(gw->g.x, gw->g.y, gw->g.width, gw->g.height, pcol->edge);								// Edge +		gdispDrawLine(gw->g.x, gw->g.y+gsw->dpos, gw->g.x+gw->g.width-1, gw->g.y+gsw->dpos, pcol->edge);	// Thumb -void gwinSliderDraw_Std(GHandle gh, bool_t isVertical, coord_t thumbpos, const GSliderDrawStyle *pstyle, void *param) { -	(void) param; - -	if (isVertical) { -		if (thumbpos != gh->height-1) -			gdispFillArea(gh->x, gh->y+thumbpos, gh->width, gh->height - thumbpos, pstyle->color_active); -		if (thumbpos != 0) -			gdispFillArea(gh->x, gh->y, gh->width, thumbpos, pstyle->color_inactive); -		gdispDrawBox(gh->x, gh->y, gh->width, gh->height, pstyle->color_edge); -		gdispDrawLine(gh->x, gh->y+thumbpos, gh->x+gh->width-1, gh->y+thumbpos, pstyle->color_thumb); -		if (thumbpos >= 2) -			gdispDrawLine(gh->x, gh->y+thumbpos-2, gh->x+gh->width-1, gh->y+thumbpos-2, pstyle->color_thumb); -		if (thumbpos <= gh->height-2) -			gdispDrawLine(gh->x, gh->y+thumbpos+2, gh->x+gh->width-1, gh->y+thumbpos+2, pstyle->color_thumb); +	// Horizontal slider  	} else { -		if (thumbpos != gh->width-1) -			gdispFillArea(gh->x+thumbpos, gh->y, gh->width-thumbpos, gh->height, pstyle->color_inactive); -		if (thumbpos != 0) -			gdispFillArea(gh->x, gh->y, thumbpos, gh->height, pstyle->color_active); -		gdispDrawBox(gh->x, gh->y, gh->width, gh->height, pstyle->color_edge); -		gdispDrawLine(gh->x+thumbpos, gh->y, gh->x+thumbpos, gh->y+gh->height-1, pstyle->color_thumb); -		if (thumbpos >= 2) -			gdispDrawLine(gh->x+thumbpos-2, gh->y, gh->x+thumbpos-2, gh->y+gh->height-1, pstyle->color_thumb); -		if (thumbpos <= gh->width-2) -			gdispDrawLine(gh->x+thumbpos+2, gh->y, gh->x+thumbpos+2, gh->y+gh->height-1, pstyle->color_thumb); -	} -} - -#if GFX_USE_GINPUT && GINPUT_NEED_MOUSE -	bool_t gwinAttachSliderMouse(GHandle gh, uint16_t instance) { -		GSourceHandle	gsh; - -		if (gh->type != GW_SLIDER || !(gsh = ginputGetMouse(instance))) -			return FALSE; - -		return geventAttachSource(&((GSliderObject *)gh)->listener, gsh, GLISTEN_MOUSEMETA|GLISTEN_MOUSEDOWNMOVES); +		if (gsw->dpos != gw->g.width-1)				// The unfilled area +			gdispFillArea(gw->g.x+gsw->dpos, gw->g.y, gw->g.width-gsw->dpos, gw->g.height, gw->pstyle->enabled.progress);	// Inactive area +		if (gsw->dpos != 0) {						// The filled area +			for(z=0, v=gi->width; z < gsw->dpos; z += v) { +				if (z+v > gsw->dpos) +					v -= z+v - gsw->dpos; +				gdispImageDraw(gi, gw->g.x+z, gw->g.y, v, gw->g.height, 0, 0); +			} +		} +		gdispDrawBox(gw->g.x, gw->g.y, gw->g.width, gw->g.height, pcol->edge);								// Edge +		gdispDrawLine(gw->g.x+gsw->dpos, gw->g.y, gw->g.x+gsw->dpos, gw->g.y+gw->g.height-1, pcol->edge);	// Thumb  	} -#endif - -#if GFX_USE_GINPUT && GINPUT_NEED_DIAL -	bool_t gwinAttachSliderDial(GHandle gh, uint16_t instance) { -		GSourceHandle	gsh; +	gdispDrawStringBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, gw->text, gw->g.font, pcol->text, justifyCenter); -		if (gh->type != GW_SLIDER || !(gsh = ginputGetDial(instance))) -			return FALSE; - -		return geventAttachSource(&((GSliderObject *)gh)->listener, gsh, 0); -	} -#endif +	#undef gsw +}  #endif /* GFX_USE_GWIN && GWIN_NEED_BUTTON */  /** @} */  | 
