Ejemplo n.º 1
0
static void
updateScrollerProportion(ScrollView *sPtr)
{
    float prop, value;
    float oldV, oldP;

    if (sPtr->flags.hasHScroller) {
        oldV = WMGetScrollerValue(sPtr->hScroller);
        oldP = WMGetScrollerKnobProportion(sPtr->hScroller);

        prop = (float)sPtr->viewport->size.width/(float)sPtr->contentView->size.width;

        if (oldP == 1.0)
            value = 0;
        else
            value = (prop * oldV) / oldP;
        WMSetScrollerParameters(sPtr->hScroller, value, prop);
    }
    if (sPtr->flags.hasVScroller) {
        oldV = WMGetScrollerValue(sPtr->vScroller);
        oldP = WMGetScrollerKnobProportion(sPtr->vScroller);

        prop = (float)sPtr->viewport->size.height/(float)sPtr->contentView->size.height;

        if (oldP == 1.0)
            value = 0;
        else
            value = (prop * oldV) / oldP;
        WMSetScrollerParameters(sPtr->vScroller, value, prop);
    }
    applyScrollerValues(sPtr);
}
Ejemplo n.º 2
0
static void
applyScrollerValues(WMScrollView *sPtr)
{
    int x, y;

    if (sPtr->contentView == NULL)
        return;

    if (sPtr->flags.hasHScroller) {
        float v = WMGetScrollerValue(sPtr->hScroller);
        int size;

        size = sPtr->contentView->size.width-sPtr->viewport->size.width;

        x = v * size;
    } else {
        x = 0;
    }

    if (sPtr->flags.hasVScroller) {
        float v = WMGetScrollerValue(sPtr->vScroller);

        int size;

        size = sPtr->contentView->size.height-sPtr->viewport->size.height;

        y = v * size;
    } else {
        y = 0;
    }



    x = WMAX(0, x);
    y = WMAX(0, y);

    W_MoveView(sPtr->contentView, -x, -y);

    W_RaiseView(sPtr->viewport);
}
Ejemplo n.º 3
0
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
}
Ejemplo n.º 4
0
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);
    }
}