/* Call the correct function for mouse pressed */ static void widgClicked(WIDGET *psWidget, UDWORD key, W_CONTEXT *psContext) { switch (psWidget->type) { case WIDG_FORM: formClicked((W_FORM *)psWidget, key); break; case WIDG_LABEL: break; case WIDG_BUTTON: buttonClicked((W_BUTTON *)psWidget, key); break; case WIDG_EDITBOX: editBoxClicked((W_EDITBOX *)psWidget, psContext); break; case WIDG_BARGRAPH: break; case WIDG_SLIDER: sliderClicked((W_SLIDER *)psWidget, psContext); break; default: ASSERT(!"Unknown widget type", "Unknown widget type"); break; } }
/* Run a slider widget */ void sliderRun(W_SLIDER *psWidget, W_CONTEXT *psContext) { SDWORD mx,my; UDWORD stopSize; if ((psWidget->state & SLD_DRAG) && !mouseDown(MOUSE_LMB)) { psWidget->state &= ~SLD_DRAG; widgSetReturn(psContext->psScreen, (WIDGET *)psWidget); } else if (!(psWidget->state & SLD_DRAG) && mouseDown(MOUSE_LMB)) { sliderClicked(psWidget, psContext); } if (psWidget->state & SLD_DRAG) { /* Figure out where the drag box should be */ mx = psContext->mx - psWidget->x; my = psContext->my - psWidget->y; switch (psWidget->orientation) { case WSLD_LEFT: if (mx <= psWidget->barSize/2) { psWidget->pos = 0; } else if (mx >= psWidget->width - psWidget->barSize/2) { psWidget->pos = psWidget->numStops; } else { /* Mouse is in the middle of the slider, calculate which stop */ stopSize = (psWidget->width - psWidget->barSize) / psWidget->numStops; psWidget->pos = (UWORD)((mx + stopSize/2 - psWidget->barSize/2) * psWidget->numStops / (psWidget->width - psWidget->barSize)); } break; case WSLD_RIGHT: if (mx <= psWidget->barSize/2) { psWidget->pos = psWidget->numStops; } else if (mx >= psWidget->width - psWidget->barSize/2) { psWidget->pos = 0; } else { /* Mouse is in the middle of the slider, calculate which stop */ stopSize = (psWidget->width - psWidget->barSize) / psWidget->numStops; psWidget->pos = (UWORD)(psWidget->numStops - (mx + stopSize/2 - psWidget->barSize/2) * psWidget->numStops / (psWidget->width - psWidget->barSize)); } break; case WSLD_TOP: if (my <= psWidget->barSize/2) { psWidget->pos = 0; } else if (my >= psWidget->height - psWidget->barSize/2) { psWidget->pos = psWidget->numStops; } else { /* Mouse is in the middle of the slider, calculate which stop */ stopSize = (psWidget->height - psWidget->barSize) / psWidget->numStops; psWidget->pos = (UWORD)((my + stopSize/2 - psWidget->barSize/2) * psWidget->numStops / (psWidget->height - psWidget->barSize)); } break; case WSLD_BOTTOM: if (my <= psWidget->barSize/2) { psWidget->pos = psWidget->numStops; } else if (my >= psWidget->height - psWidget->barSize/2) { psWidget->pos = 0; } else { /* Mouse is in the middle of the slider, calculate which stop */ stopSize = (psWidget->height - psWidget->barSize) / psWidget->numStops; psWidget->pos = (UWORD)(psWidget->numStops - (my + stopSize/2 - psWidget->barSize/2) * psWidget->numStops / (psWidget->height - psWidget->barSize)); } break; } } }