Skip to content

Commit 7b167fa

Browse files
committed
custom menu events click and down up
1 parent ee8bd71 commit 7b167fa

File tree

3 files changed

+45
-16
lines changed

3 files changed

+45
-16
lines changed

src/layout/sampling.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ function neighbors_walls_cost(sample,seeds,w,h,walls){
174174
}
175175

176176
function select_vertex_position(v,placed,width,height,debug=false){
177-
console.time("select_pos")
177+
//console.time("select_pos")
178178
g_debug = debug
179179
let best_index = -1
180180
let best_cost = Number.MAX_VALUE;
@@ -203,7 +203,7 @@ function select_vertex_position(v,placed,width,height,debug=false){
203203
let best_sample = samples[best_index]
204204
v.viewBox.x = best_sample.x
205205
v.viewBox.y = best_sample.y
206-
console.timeEnd("select_pos")
206+
//console.timeEnd("select_pos")
207207
return [best_sample.x,best_sample.y]
208208

209209
}

src/menu.js

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {html,html_tag,add_sheet,remove_sheet,send} from "../libs/web-js-utils.js"
1+
import {html,html_tag,add_sheet,remove_sheet} from "../libs/web-js-utils.js"
22
import {event} from "./utils.js"
33
import {Svg} from "../libs/svg_utils.js"
44

@@ -51,34 +51,43 @@ function onContext(e){
5151

5252
class Menu{
5353
call(Params){
54+
const circle_radius = 80
55+
const pie_radius_start = 20
56+
const pie_radius_end = 90
57+
5458
vertex = Params.v
5559
svg = Params.svg
5660
let [x,y] = [Params.x,Params.y]
5761
menu_svg = html(svg,/*html*/`<g id="g_menu"/>`)
5862
html_tag(menu_svg,"circle",/*html*/`
5963
<circle class="svg_menu" cx="${x}" cy="${y}" r="10" fill="rgba(120,160,200,0.5)" >
60-
<animate attributeName="r" begin="0s" values="10;80" keyTimes="0;1" calcMode="spline" keySplines="0 .75 .25 1" dur="300ms" repeatCount="1" fill="freeze"/>
64+
<animate attributeName="r" begin="0s" values="10;${circle_radius}" keyTimes="0;1" calcMode="spline" keySplines="0 .75 .25 1" dur="300ms" repeatCount="1" fill="freeze"/>
6165
</circle>`)
6266
menu_svg.getElementsByTagName("animate")[0].beginElement()
6367
state.active = true
6468
menu_svg.addEventListener( 'mouseleave', onMouseLeave, false );
6569
menu_svg.addEventListener( 'mousedown', onMouseDown, false );
6670
menu_svg.addEventListener( 'contextmenu', onContext, false );
6771

68-
const pie_radius_start = 20
69-
const pie_radius_end = 70
7072
const len = Params.actions.length
73+
let buttons = {}
74+
let texts = {}
7175
Params.actions.forEach((a,i)=>{
7276
const start = i / len
7377
const stop = (i+1) / len
7478
const margin = 0.01
79+
let pie = utl.pie(menu_svg,x,y,pie_radius_start,pie_radius_end,start,stop,margin)
80+
buttons[a] = pie
81+
pie.setAttribute("data-name",a)
82+
pie.setAttribute("visibility","hidden")
83+
pie.classList.add("pie_element")
84+
let [tx,ty] = angle_pos((start+stop)/2,(pie_radius_start+pie_radius_end)/2)
85+
texts[a] = html(menu_svg,/*html*/`<text x="${x+tx}" y="${y+ty}" class="m_text" dominant-baseline="middle" text-anchor="middle" style="pointer-events:none" visibility="hidden">${a}</text>`)
86+
})
87+
Params.actions.forEach((action,i)=>{
7588
setTimeout(()=>{
76-
let pie = utl.pie(menu_svg,x,y,pie_radius_start,pie_radius_end,start,stop,margin)
77-
pie.setAttribute("data-name",a)
78-
pie.classList.add("pie_element")
79-
pie.addEventListener( 'click', (e)=>{send("menu_action",{type:e.target.getAttribute("data-name")} )}, false );
80-
let [tx,ty] = angle_pos((start+stop)/2,(pie_radius_start+pie_radius_end)/2)
81-
html(menu_svg,/*html*/`<text x="${x+tx}" y="${y+ty}" class="m_text" dominant-baseline="middle" text-anchor="middle" style="pointer-events:none">${a}</text>`)
89+
buttons[action].setAttribute("visibility","visible")
90+
texts[action].setAttribute("visibility","visible")
8291
},200+i*50)
8392
})
8493
sheet = new CSSStyleSheet()
@@ -100,7 +109,8 @@ class Menu{
100109
color:hsl(240, 80%, 65%)
101110
}`)
102111
add_sheet(sheet)
103-
}
112+
return buttons
113+
}
104114
}
105115

106116
export{Menu};

src/render.js

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {html,clear} from "../libs/web-js-utils.js"
1+
import {html,clear,send} from "../libs/web-js-utils.js"
22
import {Svg} from "../libs/svg_utils.js"
33
import {Menu} from "./menu.js"
44

@@ -9,16 +9,35 @@ let g = null;
99
let svg = null;
1010
let config = null;
1111
let menu_v = null;
12+
let attraction = false;
1213

1314
function onMenuAction(e){
14-
console.log(`menu action => ${e.detail.type} on ${menu_v.label}`)
15+
console.log(`${e.detail.v.label} => ${e.detail.action}:${e.detail.type}`)
1516
}
1617

1718
function onVertexMenu(e){
1819
if(e.detail.type == "start"){
1920
menu_v = g.vertices[e.detail.id]
2021
let vb = menu_v.viewBox
21-
menu.call({svg:svg,x:vb.x,y:vb.y,actions:["attract","layout","expand"]})
22+
let buttons = menu.call({svg:svg,x:vb.x,y:vb.y,actions:["attract","layout","pin"]})
23+
buttons["pin"].addEventListener( 'click', (e)=>{send("menu_action",{type:"click",action:e.target.getAttribute("data-name"),v:menu_v} )}, false );
24+
buttons["layout"].addEventListener( 'click', (e)=>{send("menu_action",{type:"click",action:e.target.getAttribute("data-name"),v:menu_v} )}, false );
25+
buttons["attract"].addEventListener('mousedown', (e)=>{
26+
send("menu_action",{type:"start",action:e.target.getAttribute("data-name"),v:menu_v} )
27+
attraction = true
28+
}, false );
29+
buttons["attract"].addEventListener('mouseup', (e)=>{
30+
send("menu_action",{type:"end",action:e.target.getAttribute("data-name"),v:menu_v} )
31+
attraction = false
32+
}, false );
33+
buttons["attract"].addEventListener('mouseleave', (e)=>{
34+
send("menu_action",{type:"end",action:e.target.getAttribute("data-name"),v:menu_v} )
35+
attraction = false
36+
}, false );
37+
}else if(e.detail.type == "end"){
38+
if(attraction){
39+
send("menu_action",{type:"end",action:"attract",v:menu_v} )
40+
}
2241
}
2342
}
2443

0 commit comments

Comments
 (0)