static void scrollCallback(WMWidget * scroller, void *self) { WMBrowser *bPtr = (WMBrowser *) self; WMScroller *sPtr = (WMScroller *) scroller; int newFirst; #define LAST_VISIBLE_COLUMN bPtr->firstVisibleColumn+bPtr->maxVisibleColumns switch (WMGetScrollerHitPart(sPtr)) { case WSDecrementLine: if (bPtr->firstVisibleColumn > 0) { scrollToColumn(bPtr, bPtr->firstVisibleColumn - 1, True); } break; case WSDecrementPage: case WSDecrementWheel: if (bPtr->firstVisibleColumn > 0) { newFirst = bPtr->firstVisibleColumn - bPtr->maxVisibleColumns; scrollToColumn(bPtr, newFirst, True); } break; case WSIncrementLine: if (LAST_VISIBLE_COLUMN < bPtr->usedColumnCount) { scrollToColumn(bPtr, bPtr->firstVisibleColumn + 1, True); } break; case WSIncrementPage: case WSIncrementWheel: if (LAST_VISIBLE_COLUMN < bPtr->usedColumnCount) { newFirst = bPtr->firstVisibleColumn + bPtr->maxVisibleColumns; if (newFirst + bPtr->maxVisibleColumns >= bPtr->columnCount) newFirst = bPtr->columnCount - bPtr->maxVisibleColumns; scrollToColumn(bPtr, newFirst, True); } break; case WSKnob: { double floatValue; double value = bPtr->columnCount - bPtr->maxVisibleColumns; floatValue = WMGetScrollerValue(bPtr->scroller); floatValue = (floatValue * value) / value; newFirst = rint(floatValue * (float)(bPtr->columnCount - bPtr->maxVisibleColumns)); if (bPtr->firstVisibleColumn != newFirst) scrollToColumn(bPtr, newFirst, False); /*else WMSetScrollerParameters(bPtr->scroller, floatValue, bPtr->maxVisibleColumns/(float)bPtr->columnCount); */ } break; case WSKnobSlot: case WSNoPart: /* do nothing */ break; } #undef LAST_VISIBLE_COLUMN }
static void doScrolling(WMWidget *self, void *data) { ScrollView *sPtr = (ScrollView*)data; float value; int pos; int vpsize; float size; if (sPtr->hScroller == (WMScroller *)self) { pos = -sPtr->contentView->pos.x; size = sPtr->contentView->size.width-sPtr->viewport->size.width; vpsize = sPtr->viewport->size.width - sPtr->pageScroll; } else { pos = -sPtr->contentView->pos.y; size = sPtr->contentView->size.height-sPtr->viewport->size.height; vpsize = sPtr->viewport->size.height - sPtr->pageScroll; } if (vpsize <= 0) vpsize = 1; switch (WMGetScrollerHitPart(self)) { case WSDecrementLine: if (pos > 0) { pos-=sPtr->lineScroll; if (pos < 0) pos = 0; value = (float)pos / size; WMSetScrollerParameters(self, value, WMGetScrollerKnobProportion(self)); } break; case WSIncrementLine: if (pos < size) { pos+=sPtr->lineScroll; if (pos > size) pos = size; value = (float)pos / size; WMSetScrollerParameters(self, value, WMGetScrollerKnobProportion(self)); } break; case WSKnob: value = WMGetScrollerValue(self); pos = value*size; break; case WSDecrementPage: if (pos > 0) { pos -= vpsize; if (pos < 0) pos = 0; value = (float)pos / size; WMSetScrollerParameters(self, value, WMGetScrollerKnobProportion(self)); } break; case WSDecrementWheel: if (pos > 0) { pos -= vpsize/3; if (pos < 0) pos = 0; value = (float)pos / size; WMSetScrollerParameters(self, value, WMGetScrollerKnobProportion(self)); } break; case WSIncrementPage: if (pos < size) { pos += vpsize; if (pos > size) pos = size; value = (float)pos / size; WMSetScrollerParameters(self, value, WMGetScrollerKnobProportion(self)); } break; case WSIncrementWheel: if (pos < size) { pos += vpsize/3; if (pos > size) pos = size; value = (float)pos / size; WMSetScrollerParameters(self, value, WMGetScrollerKnobProportion(self)); } break; case WSNoPart: case WSKnobSlot: break; } if (sPtr->hScroller == (WMScroller *)self) { W_MoveView(sPtr->contentView, -pos, sPtr->contentView->pos.y); } else { W_MoveView(sPtr->contentView, sPtr->contentView->pos.x, -pos); } }