|
@@ -162,6 +162,40 @@ const SCROLLBAR_WIDTH = 6;
|
|
|
const SCROLLBAR_MARGIN = 4;
|
|
|
const SCROLLBAR_COLOR = "rgba(0,0,0,0.3)";
|
|
|
|
|
|
+function getScrollbars(
|
|
|
+ canvasWidth: number,
|
|
|
+ canvasHeight: number,
|
|
|
+ scrollX: number,
|
|
|
+ scrollY: number
|
|
|
+) {
|
|
|
+ // horizontal scrollbar
|
|
|
+ const sceneWidth = canvasWidth + Math.abs(scrollX);
|
|
|
+ const scrollBarWidth = (canvasWidth * canvasWidth) / sceneWidth;
|
|
|
+ const scrollBarX = scrollX > 0 ? 0 : canvasWidth - scrollBarWidth;
|
|
|
+ const horizontalScrollBar = {
|
|
|
+ x: scrollBarX + SCROLLBAR_MARGIN,
|
|
|
+ y: canvasHeight - SCROLLBAR_WIDTH - SCROLLBAR_MARGIN,
|
|
|
+ width: scrollBarWidth - SCROLLBAR_MARGIN * 2,
|
|
|
+ height: SCROLLBAR_WIDTH
|
|
|
+ };
|
|
|
+
|
|
|
+ // vertical scrollbar
|
|
|
+ const sceneHeight = canvasHeight + Math.abs(scrollY);
|
|
|
+ const scrollBarHeight = (canvasHeight * canvasHeight) / sceneHeight;
|
|
|
+ const scrollBarY = scrollY > 0 ? 0 : canvasHeight - scrollBarHeight;
|
|
|
+ const verticalScrollBar = {
|
|
|
+ x: canvasWidth - SCROLLBAR_WIDTH - SCROLLBAR_MARGIN,
|
|
|
+ y: scrollBarY + SCROLLBAR_MARGIN,
|
|
|
+ width: SCROLLBAR_WIDTH,
|
|
|
+ height: scrollBarHeight - SCROLLBAR_WIDTH * 2
|
|
|
+ };
|
|
|
+
|
|
|
+ return {
|
|
|
+ horizontal: horizontalScrollBar,
|
|
|
+ vertical: verticalScrollBar
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
function renderScene(
|
|
|
rc: RoughCanvas,
|
|
|
context: CanvasRenderingContext2D,
|
|
@@ -169,9 +203,6 @@ function renderScene(
|
|
|
) {
|
|
|
if (!context) return;
|
|
|
|
|
|
- const canvasWidth = context.canvas.width;
|
|
|
- const canvasHeight = context.canvas.height;
|
|
|
-
|
|
|
const fillStyle = context.fillStyle;
|
|
|
if (typeof sceneState.viewBackgroundColor === "string") {
|
|
|
context.fillStyle = sceneState.viewBackgroundColor;
|
|
@@ -214,28 +245,25 @@ function renderScene(
|
|
|
maxY = Math.max(maxY, getElementAbsoluteY2(element));
|
|
|
});
|
|
|
|
|
|
- // horizontal scrollbar
|
|
|
+ const scrollBars = getScrollbars(
|
|
|
+ context.canvas.width,
|
|
|
+ context.canvas.height,
|
|
|
+ sceneState.scrollX,
|
|
|
+ sceneState.scrollY
|
|
|
+ );
|
|
|
+
|
|
|
context.fillStyle = SCROLLBAR_COLOR;
|
|
|
- const sceneWidth = canvasWidth + Math.abs(sceneState.scrollX);
|
|
|
- const scrollBarWidth = (canvasWidth * canvasWidth) / sceneWidth;
|
|
|
- const scrollBarX = sceneState.scrollX > 0 ? 0 : canvasWidth - scrollBarWidth;
|
|
|
context.fillRect(
|
|
|
- scrollBarX + SCROLLBAR_MARGIN,
|
|
|
- canvasHeight - SCROLLBAR_WIDTH - SCROLLBAR_MARGIN,
|
|
|
- scrollBarWidth - SCROLLBAR_MARGIN * 2,
|
|
|
- SCROLLBAR_WIDTH
|
|
|
+ scrollBars.horizontal.x,
|
|
|
+ scrollBars.horizontal.y,
|
|
|
+ scrollBars.horizontal.width,
|
|
|
+ scrollBars.horizontal.height
|
|
|
);
|
|
|
-
|
|
|
- // vertical scrollbar
|
|
|
- const sceneHeight = canvasHeight + Math.abs(sceneState.scrollY);
|
|
|
- const scrollBarHeight = (canvasHeight * canvasHeight) / sceneHeight;
|
|
|
- const scrollBarY =
|
|
|
- sceneState.scrollY > 0 ? 0 : canvasHeight - scrollBarHeight;
|
|
|
context.fillRect(
|
|
|
- canvasWidth - SCROLLBAR_WIDTH - SCROLLBAR_MARGIN,
|
|
|
- scrollBarY + SCROLLBAR_MARGIN,
|
|
|
- SCROLLBAR_WIDTH,
|
|
|
- scrollBarHeight - SCROLLBAR_WIDTH * 2
|
|
|
+ scrollBars.vertical.x,
|
|
|
+ scrollBars.vertical.y,
|
|
|
+ scrollBars.vertical.width,
|
|
|
+ scrollBars.vertical.height
|
|
|
);
|
|
|
context.fillStyle = fillStyle;
|
|
|
}
|