/** ** Handle scrolling area. ** ** @param state Scroll direction/state. ** @param fast Flag scroll faster. ** ** @todo Support dynamic acceleration of scroll speed. ** @todo If the scroll key is longer pressed the area is scrolled faster. */ void DoScrollArea(int state, bool fast, bool isKeyboard) { CViewport *vp; int stepx; int stepy; static int remx = 0; // FIXME: docu static int remy = 0; // FIXME: docu int speed = isKeyboard ? UI.KeyScrollSpeed : UI.MouseScrollSpeed; if (state == ScrollNone) { return; } vp = UI.SelectedViewport; if (fast) { stepx = (int)(speed * vp->MapWidth / 2 * PixelTileSize.x * FRAMES_PER_SECOND / 4); stepy = (int)(speed * vp->MapHeight / 2 * PixelTileSize.y * FRAMES_PER_SECOND / 4); } else {// dynamic: let these variables increase up to fast.. // FIXME: pixels per second should be configurable stepx = (int)(speed * PixelTileSize.x * FRAMES_PER_SECOND / 4); stepy = (int)(speed * PixelTileSize.y * FRAMES_PER_SECOND / 4); } if ((state & (ScrollLeft | ScrollRight)) && (state & (ScrollLeft | ScrollRight)) != (ScrollLeft | ScrollRight)) { stepx = stepx * 100 * 100 / VideoSyncSpeed / FRAMES_PER_SECOND / (SkipFrames + 1); remx += stepx - (stepx / 100) * 100; stepx /= 100; if (remx > 100) { ++stepx; remx -= 100; } } else { stepx = 0; } if ((state & (ScrollUp | ScrollDown)) && (state & (ScrollUp | ScrollDown)) != (ScrollUp | ScrollDown)) { stepy = stepy * 100 * 100 / VideoSyncSpeed / FRAMES_PER_SECOND / (SkipFrames + 1); remy += stepy - (stepy / 100) * 100; stepy /= 100; if (remy > 100) { ++stepy; remy -= 100; } } else { stepy = 0; } if (state & ScrollUp) { stepy = -stepy; } if (state & ScrollLeft) { stepx = -stepx; } const PixelDiff offset(stepx, stepy); vp->Set(vp->MapPos, vp->Offset + offset); // This recalulates some values HandleMouseMove(CursorScreenPos); }
/** ** Handle scrolling area. ** ** @param state Scroll direction/state. ** @param fast Flag scroll faster. ** ** @todo Support dynamic acceleration of scroll speed. ** @todo If the scroll key is longer pressed the area is scrolled faster. */ void DoScrollArea(int state, bool fast) { CViewport *vp; int stepx; int stepy; static int remx = 0; // FIXME: docu static int remy = 0; // FIXME: docu if (state == ScrollNone) { return; } vp = UI.SelectedViewport; if (fast) { stepx = vp->MapWidth / 2 * TileSizeX * FRAMES_PER_SECOND; stepy = vp->MapHeight / 2 * TileSizeY * FRAMES_PER_SECOND; } else {// dynamic: let these variables increase upto fast.. // FIXME: pixels per second should be configurable stepx = TileSizeX * FRAMES_PER_SECOND; stepy = TileSizeY * FRAMES_PER_SECOND; } if ((state & (ScrollLeft | ScrollRight)) && (state & (ScrollLeft | ScrollRight)) != (ScrollLeft | ScrollRight)) { stepx = stepx * 100 * 100 / VideoSyncSpeed / FRAMES_PER_SECOND / (SkipFrames + 1); remx += stepx - (stepx / 100) * 100; stepx /= 100; if (remx > 100) { ++stepx; remx -= 100; } } else { stepx = 0; } if ((state & (ScrollUp | ScrollDown)) && (state & (ScrollUp | ScrollDown)) != (ScrollUp | ScrollDown)) { stepy = stepy * 100 * 100 / VideoSyncSpeed / FRAMES_PER_SECOND / (SkipFrames + 1); remy += stepy - (stepy / 100) * 100; stepy /= 100; if (remy > 100) { ++stepy; remy -= 100; } } else { stepy = 0; } if (state & ScrollUp) { stepy = -stepy; } if (state & ScrollLeft) { stepx = -stepx; } vp->Set(vp->MapX, vp->MapY, vp->OffsetX + stepx, vp->OffsetY + stepy); // This recalulates some values HandleMouseMove(CursorX, CursorY); }