list context menu

This commit is contained in:
visionmercer 2026-06-08 12:08:22 +02:00
commit d6bdadb75f
2 changed files with 145 additions and 5 deletions

View file

@ -164,6 +164,7 @@ function link(x,y,label as string)
if _mousex>x and _mousey>y and _mousex<x+w and _mousey<y+16 then if _mousex>x and _mousey>y and _mousex<x+w and _mousey<y+16 then
drawlink x,y,label,1 drawlink x,y,label,1
if mouseclicked then link=-1 if mouseclicked then link=-1
if rmouseclicked then link=-2
else else
drawlink x,y,label,0 drawlink x,y,label,0
end if end if

View file

@ -10,7 +10,7 @@ type statetype
starty as long starty as long
isdrawing as integer isdrawing as integer
end type end type
''
type layertype type layertype
ihandle as long ihandle as long
blendmode as long blendmode as long
@ -207,15 +207,154 @@ sub commandlist
for i=ubound(commands)-1 to 0 step -1 for i=ubound(commands)-1 to 0 step -1
y=(ubound(commands)-i)*16 y=(ubound(commands)-i)*16
if y<_height-20 then if y<_height-20 then
'_printstring (x + 5, y + 5), left$(commands(i), 31) select case link(x+5,y+5,left$(commands(i),31))
if link(x+5,y+5,left$(commands(i),31)) then case -1 ' Left-Click triggers the inline text rename input box
commands(i)=textinput(x+5,y+5,248,23,commands(i)) commands(i)=textinput(x+5,y+5,248,23,commands(i))
end if case -2 ' Right-Click opens the context menu layout overlay
listcontextmenu i, _mousex, _mousey
exit sub
end select
end if end if
next i next i
if button(x,_height-25,60,23,"redraw") then redraw if button(x,_height-25,60,23,"redraw") then redraw
end sub end sub
sub listcontextmenu (index as long, mx as integer, my as integer)
if index < 0 or index >= ubound(commands) then exit sub
dim done as integer: done = 0
dim menuw as integer: menuw = 120
dim menuh as integer: menuh = 6 * 24 + 4 ' 6 items at 24px layout spacing
' Position correction so context panels don't clip outside screens
dim x as integer: x = mx
if x + menuw > _width then x = _width - menuw
dim y as integer: y = my
if y + menuh > _height then y = _height - menuh
do
' UI Backdrop reconstruction stack to prevent flickering frames
cls, backgroundcolor1
canvas
if showtoolbox then toolbox
if showcolorpicker then colorpicker
if state.tool = 12 then drawTextToolPanel
' Manual render block for command list data under the active frame
dim lx as integer: lx = _width - 250
line (lx, 0)-(_width - 1, _height - 1), backgroundcolor1, bf
line (lx, 0)-(lx, _height - 1), backgroundcolor2
_printmode _keepbackground
dim ly as integer, i as long
for i = ubound(commands) - 1 to 0 step -1
ly = (ubound(commands) - i) * 16
if ly < _height - 20 then
_printstring (lx + 5, ly + 5), left$(commands(i), 31)
end if
next i
if button(lx, _height - 25, 60, 23, "redraw") then redraw
' Render Context Container Box
line (x, y)-(x + menuw, y + menuh), backgroundcolor1, bf
line (x, y)-(x + menuw, y + menuh), highlightcolor, b
' Standard poll for incoming click state loops
while _mouseinput: wend
mouseclicked = 0: rmouseclicked = 0
if mousedown = -1 and _mousebutton(1) = 0 then mouseclicked = -1
if rmousedown = -1 and _mousebutton(2) = 0 then rmouseclicked = -1
mousedown = _mousebutton(1)
rmousedown = _mousebutton(2)
' Clicking completely outside the menu closes the context window
if mouseclicked or rmouseclicked then
if not (_mousex > x and _mousex < x + menuw and _mousey > y and _mousey < y + menuh) then
done = -1
end if
end if
' --- RENDER ENTRIES VIA UI BUTTONS ---
dim bx as integer: bx = x + 2
dim by as integer: by = y + 2
dim bw as integer: bw = menuw - 4
dim bh as integer: bh = 22
' Item 1: Delete
if button(bx, by, bw, bh, "Delete") then
dim k as long
for k = index to ubound(commands) - 1
commands(k) = commands(k + 1)
next k
redim _preserve commands(ubound(commands) - 1) as string
redraw
done = -1
end if
by = by + 24
' Item 2: Move Up (moves toward end of array visually)
if button(bx, by, bw, bh, "Move Up") then
if index < ubound(commands) - 2 then
dim tempCmd as string
tempCmd = commands(index)
commands(index) = commands(index + 1)
commands(index + 1) = tempCmd
redraw
end if
done = -1
end if
by = by + 24
' Item 3: Move Down (moves toward array index 0)
if button(bx, by, bw, bh, "Move Down") then
if index > 0 then
tempCmd = commands(index)
commands(index) = commands(index - 1)
commands(index - 1) = tempCmd
redraw
end if
done = -1
end if
by = by + 24
' Item 4: Insert Above
if button(bx, by, bw, bh, "Insert Above") then
redim _preserve commands(ubound(commands) + 1) as string
for k = ubound(commands) - 1 to index + 2 step -1
commands(k) = commands(k - 1)
next k
commands(index + 1) = ""
redraw
done = -1
end if
by = by + 24
' Item 5: Insert Below
if button(bx, by, bw, bh, "Insert Below") then
redim _preserve commands(ubound(commands) + 1) as string
for k = ubound(commands) - 1 to index + 1 step -1
commands(k) = commands(k - 1)
next k
commands(index) = ""
redraw
done = -1
end if
by = by + 24
' Item 6: Copy to OS Clipboard
if button(bx, by, bw, bh, "Copy") then
_clipboard$ = commands(index)
done = -1
end if
_limit 30
_display
loop until done or _keydown(27)
' Flush trailing triggers so the next loop cycle doesn't draw accidental strokes
mouseclicked = 0
rmouseclicked = 0
end sub
sub drawTextToolPanel sub drawTextToolPanel
dim panelWidth as integer: panelWidth = 160 dim panelWidth as integer: panelWidth = 160
dim x as integer: x = _width - panelWidth dim x as integer: x = _width - panelWidth