using AbstractPlotting points = Node(Point2f0[(0, 0), (0.5, 0.5), (1.0, 0.0)]) scene = Scene(resolution = (500, 500)) poly!(scene, points, strokewidth = 2, strokecolor = :black, color = :skyblue2, show_axis = false, scale_plot = false) scatter!(points, color = :white, strokewidth = 10, markersize = 0.05, strokecolor = :black, raw = true) pplot = scene[end] push!(points[], Point2f0(0.6, -0.3)) points[] = points[] function add_move!(scene, points, pplot) idx = Ref(0); dragstart = Ref(false); startpos = Base.RefValue(Point2f0(0)) on(events(scene).mousedrag) do drag if ispressed(scene, Mouse.left) if drag == Mouse.down plot, _idx = mouse_selection(scene) if plot == pplot idx[] = _idx; dragstart[] = true startpos[] = to_world(scene, Point2f0(scene.events.mouseposition[])) end elseif drag == Mouse.pressed && dragstart[] && checkbounds(Bool, points[], idx[]) pos = to_world(scene, Point2f0(scene.events.mouseposition[])) points[][idx[]] = pos points[] = points[] end else dragstart[] = false end return end end function add_remove_add!(scene, points, pplot) on(events(scene).mousebuttons) do but if ispressed(but, Mouse.left) && ispressed(scene, Keyboard.left_control) pos = to_world(scene, Point2f0(events(scene).mouseposition[])) push!(points[], pos) points[] = points[] elseif ispressed(but, Mouse.right) plot, idx = mouse_selection(scene) if plot == pplot && checkbounds(Bool, points[], idx) deleteat!(points[], idx) points[] = points[] end end return end end add_move!(scene, points, pplot) add_remove_add!(scene, points, pplot) center!(scene) RecordEvents(scene, "output")