mirror of https://github.com/doccano/doccano.git
pythondatasetsactive-learningtext-annotationdatasetnatural-language-processingdata-labelingmachine-learningannotation-tool
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
3.0 KiB
132 lines
3.0 KiB
<template>
|
|
<v-circle
|
|
:config="{
|
|
x: point.x,
|
|
y: point.y,
|
|
radius: 5,
|
|
fill: color,
|
|
stroke: 'black',
|
|
draggable: true,
|
|
scaleX: 1 / (scale || 1),
|
|
scaleY: 1 / (scale || 1),
|
|
dragBoundFunc
|
|
}"
|
|
v-on="
|
|
index === 0
|
|
? {
|
|
hitStrokeWidth: 12,
|
|
mouseover: onMouseOverStartPoint,
|
|
mouseout: onMouseOutStartPoint
|
|
}
|
|
: {}
|
|
"
|
|
@click="onClick"
|
|
@dblclick="onDoubleClick"
|
|
@dragstart="onDragStart"
|
|
@dragmove="onDragMove"
|
|
@dragend="onDragEnd"
|
|
@mouseenter="onMouseEnter"
|
|
@mouseleave="onMouseLeave"
|
|
/>
|
|
</template>
|
|
|
|
<script lang="ts">
|
|
import Vue from 'vue'
|
|
import Konva from 'konva'
|
|
import Flatten from '@flatten-js/core'
|
|
import { transform, inverseTransform } from '@/domain/models/tasks/shared/Scaler'
|
|
import Point = Flatten.Point
|
|
|
|
export default Vue.extend({
|
|
props: {
|
|
color: {
|
|
type: String,
|
|
default: '#00FF00'
|
|
},
|
|
point: {
|
|
type: Point,
|
|
required: true
|
|
},
|
|
index: {
|
|
type: Number,
|
|
required: true
|
|
},
|
|
maxWidth: {
|
|
type: Number,
|
|
default: 0
|
|
},
|
|
maxHeight: {
|
|
type: Number,
|
|
default: 0
|
|
},
|
|
scale: {
|
|
type: Number,
|
|
default: 1
|
|
}
|
|
},
|
|
|
|
data() {
|
|
return {
|
|
stageX: 0,
|
|
stageY: 0
|
|
}
|
|
},
|
|
|
|
methods: {
|
|
dragBoundFunc(pos: { x: number; y: number }) {
|
|
let x = transform(pos.x, this.stageX, this.scale)
|
|
let y = transform(pos.y, this.stageY, this.scale)
|
|
if (x < 0) x = 0
|
|
if (y < 0) y = 0
|
|
if (x > this.maxWidth) x = this.maxWidth
|
|
if (y > this.maxHeight) y = this.maxHeight
|
|
x = inverseTransform(x, this.stageX, this.scale)
|
|
y = inverseTransform(y, this.stageY, this.scale)
|
|
return { x, y }
|
|
},
|
|
|
|
onClick() {
|
|
this.$emit('click', this.index)
|
|
},
|
|
|
|
onDoubleClick() {
|
|
this.$emit('dblclick', this.index)
|
|
},
|
|
|
|
onDragStart(e: Konva.KonvaEventObject<DragEvent>) {
|
|
const { x = 0, y = 0 } = e.target.getStage()!.attrs
|
|
this.stageX = x
|
|
this.stageY = y
|
|
this.$emit('dragstart', this.index)
|
|
},
|
|
|
|
onDragMove(e: Konva.KonvaEventObject<DragEvent>) {
|
|
const { x, y } = e.target.attrs
|
|
this.$emit('dragmove', this.index, x, y)
|
|
},
|
|
|
|
onDragEnd(e: Konva.KonvaEventObject<DragEvent>) {
|
|
const { x, y } = e.target.attrs
|
|
this.$emit('dragend', this.index, x, y)
|
|
},
|
|
|
|
onMouseEnter(e: Konva.KonvaEventObject<MouseEvent>) {
|
|
e.target.getStage()!.container().style.cursor = 'crosshair'
|
|
},
|
|
|
|
onMouseLeave(e: Konva.KonvaEventObject<MouseEvent>) {
|
|
e.target.getStage()!.container().style.cursor = 'default'
|
|
},
|
|
|
|
onMouseOverStartPoint(e: Konva.KonvaEventObject<MouseEvent>) {
|
|
e.target.scale({ x: 2 / this.scale, y: 2 / this.scale })
|
|
this.$emit('mouseover')
|
|
},
|
|
|
|
onMouseOutStartPoint(e: Konva.KonvaEventObject<MouseEvent>) {
|
|
e.target.scale({ x: 1 / this.scale, y: 1 / this.scale })
|
|
this.$emit('mouseout')
|
|
}
|
|
}
|
|
})
|
|
</script>
|