diff --git a/sass/components/canvas/canvas.scss b/sass/components/canvas/canvas.scss index c185b8c82..896c67eb1 100644 --- a/sass/components/canvas/canvas.scss +++ b/sass/components/canvas/canvas.scss @@ -124,6 +124,7 @@ .chart-editor-canvas-view { position: relative; + cursor: grab; .canvas-view { position: absolute; @@ -241,8 +242,8 @@ } .interaction-handler { - cursor: -webkit-grab; - cursor: grab; + // cursor: -webkit-grab; + // cursor: grab; fill: none; stroke: none; pointer-events: fill; @@ -590,10 +591,8 @@ } .bounding-box { - cursor: default; - &.interactable { - cursor: pointer; + // cursor: pointer; } * { diff --git a/src/app/renderer/index.tsx b/src/app/renderer/index.tsx index a6019b308..ff1fd8a6a 100644 --- a/src/app/renderer/index.tsx +++ b/src/app/renderer/index.tsx @@ -463,9 +463,13 @@ export function renderGraphicalElementSVG( onWheel?: (e: React.MouseEvent) => void; onMouseMove?: (e: React.MouseEvent) => void; } = {}; + if (style) { + style.cursor = element.style?.cursor ?? "default"; + } if (element.selectable) { - style.cursor = "pointer"; + // style.cursor = "pointer"; style.pointerEvents = "all"; + if (options.onClick) { mouseEvents.onClick = (e: React.MouseEvent) => { e.stopPropagation(); diff --git a/src/app/stores/defaults.ts b/src/app/stores/defaults.ts index 66babfde6..498fc0846 100644 --- a/src/app/stores/defaults.ts +++ b/src/app/stores/defaults.ts @@ -351,6 +351,7 @@ export function createDefaultChart( backgroundOpacity: 1, enableContextMenu: true, exposed: true, + cursor: "default" }, mappings: { marginTop: { diff --git a/src/core/graphics/elements.ts b/src/core/graphics/elements.ts index a4a91fe00..b25f31128 100644 --- a/src/core/graphics/elements.ts +++ b/src/core/graphics/elements.ts @@ -67,6 +67,8 @@ export interface Style { strokeLinejoin?: "round" | "miter" | "bevel"; strokeLinecap?: "round" | "butt" | "square"; + cursor?: string; + colorFilter?: ColorFilter; fillColor?: Color; diff --git a/src/core/graphics/renderer/index.ts b/src/core/graphics/renderer/index.ts index 9e3863f79..4fe95ed02 100644 --- a/src/core/graphics/renderer/index.ts +++ b/src/core/graphics/renderer/index.ts @@ -104,6 +104,10 @@ export class ChartRenderer { enableContextMenu: cls.object.properties.enableContextMenu, enableSelection: cls.object.properties.enableSelection, }; + if (!markGraphics.style) { + markGraphics.style = {}; + } + markGraphics.style.cursor = cls.object.properties.cursor const group = makeGroup([markGraphics]); group.key = `gl:${glyph._id}-mkst-gr:${markIndex}-${markGraphics.key}`; return group; diff --git a/src/core/prototypes/charts/index.ts b/src/core/prototypes/charts/index.ts index 1bca37744..f9319772e 100644 --- a/src/core/prototypes/charts/index.ts +++ b/src/core/prototypes/charts/index.ts @@ -132,6 +132,7 @@ export class RectangleChart extends ChartClass { backgroundColor: null, backgroundOpacity: 1, enableContextMenu: true, + cursor: "default" }; public readonly object: Specification.Chart & { diff --git a/src/core/prototypes/object.ts b/src/core/prototypes/object.ts index f775bb468..88179b70a 100644 --- a/src/core/prototypes/object.ts +++ b/src/core/prototypes/object.ts @@ -57,6 +57,7 @@ export abstract class ObjectClass< enableContextMenu: true, enableSelection: true, exposed: true, + cursor: "default" }; /** Default mapping values */ @@ -122,6 +123,24 @@ export abstract class ObjectClass< searchSection: strings.objects.interactivity, } ), + manager.inputSelect( + { property: "cursor" }, + { + type: "dropdown", + label: strings.objects.cursor.cursor, + searchSection: strings.objects.interactivity, + options: [ + "default", + "crosshair", + "grab" + ], + labels: [ + strings.objects.cursor.default, + strings.objects.cursor.crosshair, + strings.objects.cursor.grab + ] + } + ), ] ), ]; diff --git a/src/strings.ts b/src/strings.ts index b1eef40d2..e8217fec8 100644 --- a/src/strings.ts +++ b/src/strings.ts @@ -474,6 +474,12 @@ export const strings = { dropTickData: "Tick data: drop here to assign tick data", toolTips: "Tooltips", selection: "Selection", + cursor: { + cursor: "Cursor", + default: "Default", + crosshair: "Crosshair", + grab: "Grab", + }, axes: { data: "Data", numericalSuffix: ": Numerical",