kolibrios/programs/system/icon_new/RButton.inc
GerdtR 224e4023ab Fixed a problem with the stack. Improved the right mouse button menu.
git-svn-id: svn://kolibrios.org@4036 a494cfbc-eb01-0410-851d-a64ba20cac60
2013-10-15 19:20:30 +00:00

629 lines
14 KiB
PHP

if lang eq ru
MinRMenuW equ 18*6+10
else
MinRMenuW equ 15*6+10
end if
idbRRedrawFon equ 100
idbRAlign equ 101
idbRFixIcons equ 102
idbRAdd equ 103
idbRDel equ 104
idbRProp equ 105
DELTA_COLOR equ 70
;---- thread for rbutton -----------------------------------------------------------------------
RButtonWin:
mcall 40,100101b ;SetMaskMessage 100101b
mcall 48,3,sc,40
mov eax,[sc.work] ;¢ëç¨á«ï¥¬ 梥â ᢥ⫥¥ ä®­®¢®£®
rol eax,16
add al,DELTA_COLOR
jnc @f
mov al,0FFh
@@:
rol eax,16
add al,DELTA_COLOR
jnc @f
mov al,0FFh
@@:
add ah,DELTA_COLOR
jnc @f
mov ah,0FFh
@@:
mov [sc.workH],eax
mov eax,[sc.work] ;¢ëç¨á«ï¥¬ 梥â ⥬­¥¥ ä®­®¢®£®
rol eax,16
sub al,DELTA_COLOR
jnc @f
mov al,0FFh
@@:
rol eax,16
sub al,DELTA_COLOR
jnc @f
mov al,0FFh
@@:
sub ah,DELTA_COLOR
jnc @f
mov ah,0FFh
@@:
mov [sc.workL],eax
stdcall GetNumIcon,[MouseX],[MouseY],-1
mov [SelIcon],eax
mov [NumUserButt],0
mov [RMenuW],0
mcall 70,fiIni
mcall 68,12,dword[bufIni+32]
mov [RBUser],eax
stdcall [ini_enum_keys],IconIni,secRButt,GetUserBut
cmp [SelIcon],-1
jne @f
mov [RMenuH],16*4
mov eax,[NumUserButt]
shl eax,4
add [RMenuH],ax
jmp .rbw1
@@:
mov [RMenuH],16*5
.rbw1:
RBWRedraw:
mcall 12,1 ;RedrawWinBeg
mov ebx,[MouseX]
shl ebx,16
mov bx,[RMenuW]
mov ecx,[MouseY]
shl ecx,16
mov cx,[RMenuH]
mov edx,01000000h
mov esi,01000000h
xor eax,eax
int 40h
and ebx,0FFFFh ;ä®­®¢ë© ¯àאַ㣮«ì­¨ª
inc bx
and ecx,0FFFFh
inc cx
mcall 13,,,[sc.work]
cmp [SelIcon],-1 ;¥á«¨ ª«¨ª ¯® ¨ª®­ª¥, â® ¯ã­ªâë ¯®«ì§®¢ â¥«ï ­¥ ­ã¦­ë
jne .NoDrawUserBut
;-----------
mov ecx,[NumUserButt]
.DrawUB:
push ecx
mov eax,[NumUserButt]
sub eax,ecx
mov edx,eax ;button ID
or edx,60000000h
shl eax,4+16 ;*16*10000h
mov ecx,eax
mov cx,16
xor ebx,ebx
mov bx,[RMenuW]
mov esi,[sc.work]
mcall 8 ;®¯à¥¤¥«¨«¨
mov ebx,50000h
shr ecx,16
mov bx,cx
add bx,5
mov ecx,80000000h
mov eax,[NumUserButt]
sub eax,[esp]
mov edx,[RBUser+eax*8]
mcall 4 ;¯®¤¯¨á «¨
pop ecx
loop .DrawUB
;-----------
.NoDrawUserBut:
;®¯à¥¤¥«¥­¨¥ ª­®¯®ª ¤«ï ¨ª®­®ª
xor ebx,ebx
mov bx,[RMenuW]
xor eax,eax
cmp [SelIcon],-1
jne @f
mov eax,[NumUserButt]
@@:
shl eax,4
mov cx,ax
shl ecx,16
mov cx,16
push ecx ;®âá à¨á®¢ âì ª­®¯ª¨ (¯® ¢ëá®â¥)
mcall 8,,,60000000h or idbRRedrawFon,[sc.work]
add ecx,16*10000h
mcall ,,,60000000h or idbRAlign
add ecx,16*10000h
mcall ,,,60000000h or idbRFixIcons
add ecx,16*10000h
cmp dword[SelIcon],-1
je @f
mcall ,,,60000000h or idbRDel,
add ecx,16*10000h
mcall ,,,60000000h or idbRProp,
jmp .endRM1
@@:
mcall ,,,60000000h or idbRAdd,
.endRM1:
;¯®¤¯¨á¨ ª ª­®¯ª ¬
xor eax,eax
cmp [SelIcon],-1
jne @f
mov eax,[NumUserButt]
@@:
shl eax,4
mov ebx,50000h
mov bx,ax
add bx,5
mcall 4,,80000000h,RMenuRedrawFon
add ebx,16
mcall ,,,RMenuAlign
add ebx,16
cmp [bFixIcons],0
jne @f
mov edx,RMenuOffMoving
jmp .RBWR1
@@:
mov edx,RMenuOnMoving
.RBWR1:
mcall
add ebx,16
cmp dword[SelIcon],-1
je @f
mcall ,,,RMenuDel
add bx,16
mcall ,,,RMenuProp
jmp .endRM2
@@:
mcall ,,,RMenuAdd
.endRM2:
pop ecx
mcall 12,2 ;RedrawWinEnd
mcall 9,RBProcInfo,-1 ;GetThreadInfo RBProcInfo,-1
mcall 18,21,dword[RBProcInfo+30]
m2m dword[RBSlot],eax
RBWMessages:
mcall 10 ;WaitMessage
dec eax
jz RBWRedraw
sub eax,2
jz RBWButton
sub eax,3
jz RBWMouse
jmp RBWMessages
RBWButton:
mcall 17 ;GetButtonPressed
shr eax,8
cmp eax,idbRRedrawFon
jz RBRedrawFon
cmp eax,idbRAlign
jz RBAlign
cmp eax,idbRFixIcons
jz RBFixIcons
cmp eax,idbRAdd
jz RBAdd
cmp eax,idbRDel
jz RBDelete
cmp eax,idbRProp
jz RBPropeties
cmp eax,[NumUserButt]
ja @f
mov eax,[RBUser+eax*8+4]
mov dword[fiRunProg+8],0
mov dword[fiRunProg+21],eax
mcall 70,fiRunProg
@@:
jmp RBWExit
RBWMouse:
cmp [PredItem],-1
je @f
mov eax,[PredItem]
xor ebx,ebx
mov bx,[RMenuW]
mov cx,ax
shl ecx,16
mov cx,ax
mcall 38,,,[sc.work]
add ecx,00100010h
mcall ,,,[sc.work]
@@:
call ClickInWin
jnc @f
mcall 37,1 ;¯®«®¦¥­¨¥ ¬ëè¨ ®â­®á¨â¥«ì­® ®ª­ 
and eax,0FFF0h
mov [PredItem],eax
xor ebx,ebx
mov bx,[RMenuW]
mov cx,ax
shl ecx,16
mov cx,ax
mcall 38,,,[sc.workL]
add ecx,00100010h
mcall ,,,[sc.workH]
@@:
mcall 37,2 ;GetMouseKey
test eax,111b
jz RBWMessages
call ClickInWin
jc RBWMessages
RBWExit:
mcall 68,13,[RBUser]
mov [RButtonActiv],0
mcall -1 ;ExitProcess
RBRedrawFon:
mcall 15,3
jmp RBWExit
RBAlign:
call AlignIcons
m2m [PIcoDB],[BegData]
stdcall [ini_enum_sections],IconIni,Ini_SavePos
mov dword[fiRunProg+8],WarningSave
mov dword[fiRunProg+21],pthNotify
mcall 70,fiRunProg
mov [bNotSave],0
jmp RBRedrawFon
RBFixIcons:
xor dword[bFixIcons],1
cmp [bNotSave],0
je @f
mov dword[fiRunProg+8],WarningSave
mov dword[fiRunProg+21],pthNotify
mcall 70,fiRunProg
mov [bNotSave],0
@@:
jmp RBWExit
RBAdd:
cmp [DlgAddActiv],1
je RBWSetActivWin
mov [DlgAddActiv],1
mcall 51,1,DlgAdd,stack_dlg ;CreateThread DlgAdd,stack_dlg
jmp RBWExit
RBDelete:
mov eax,[SelIcon]
mov eax,[IconsOffs+eax*4]
stdcall [ini_del_section],IconIni,eax
stdcall DelIcon,[SelIcon]
; mov dword[fiStdIco],2
; m2m dword[fInfo+12],dword[SizeData]
; mcall 70,fInfo
mov dword[fiRunProg+8],WarningSave
mov dword[fiRunProg+21],pthNotify
mcall 70,fiRunProg
mov [bNotSave],0
jmp RBRedrawFon
RBPropeties:
cmp [DlgAddActiv],1
je RBWSetActivWin
mov [DlgAddActiv],1
mcall 51,1,DlgProp,stack_dlg ;CreateThread DlgProp,stack_dlg
jmp RBWExit
RBWSetActivWin:
mcall 18,3,[slotDlgAdd]
jmp RBWExit
proc ClickInWin ;Carry flag = 1, ¥á«¨ ª«¨ª ¢ ®ª­¥
mcall 37,0 ;GetMousePos
xor ebx,ebx
mov bx,ax ;y
shr eax,16 ;x
xor ecx,ecx
mov cx,bx
mov bx,ax
mcall 34
cmp eax,[RBSlot]
jne @f
stc
ret
@@:
clc
ret
endp
proc AlignIcons
local posX:WORD,\
posY:WORD,\
negatX:WORD,\
negatY:WORD
xor ebx,ebx
mov ecx,[MaxNumIcon]
test ecx,ecx
jnz .AlignIco
ret
.AlignIco:
push ecx
or ecx,-1
mov edi,dword[IconsOffs+ebx]
xor eax,eax
repne scasb
repne scasb
repne scasb
repne scasb
mov dword[negatX],0
;-------- ¯à¥®¡à §ã¥¬ ª®®à¤¨­ âë ¢ ¯®«®¦¨â¥«ì­ë¥
mov ax,[edi+2]
test ax,8000h
jz @f
neg ax
mov word[negatX],1
@@:
mov [posX],ax
mov ax,[edi]
test ax,8000h
jz @f
neg ax
mov word[negatY],1
@@:
mov [posY],ax
;-----
mov ax,[posY]
mov dx,ALIGN_SIZE
cmp ax,dx
jb .AI0
@@: sub ax,dx
cmp ax,dx
jae @b
.AI0:
mov dx,ax
cmp dx,ALIGN_SIZE/2
jb .AI1
mov ax,ALIGN_SIZE
sub ax,dx
add [posY],ax
jmp .AI2
.AI1:
sub [posY],dx
.AI2:
;-----
mov ax,[posX]
mov dx,ALIGN_SIZE
cmp ax,dx
jb .AI3
@@: sub ax,dx
cmp ax,dx
jae @b
.AI3:
mov dx,ax
cmp dx,ALIGN_SIZE/2
jb .AI4
mov ax,ALIGN_SIZE
sub ax,dx
add [posX],ax
jmp .AI5
.AI4:
sub [posX],dx
.AI5:
;----- ¯à¥®¡à §®¢ ­¨¥ ­ § ¤ ¨ ¯®¯à ¢ª  ¢ ®âà¨æ â¥«ì­ëå ª®®à¤¨­ â
mov ax,[posX]
cmp [negatX],1
jne @f
neg ax
inc ax
jmp .AI6
@@:
mov dx,[ScreenX]
shr dx,1
cmp ax,dx
jbe .AI6
sub ax,[ScreenX]
.AI6:
mov word[edi+2],ax
mov ax,[posY]
cmp [negatY],1
jne @f
neg ax
inc ax
jmp .AI7
@@:
mov dx,[ScreenY]
shr dx,1
cmp ax,dx
jbe .AI7
sub ax,[ScreenY]
.AI7:
mov word[edi],ax
;--------
pop ecx
add ebx,4
dec ecx
jnz .AlignIco
; loop .AlignIco
; mov dword[fInfo],2
; mcall 70,fInfo
ret
endp
;-------------------------------------------------------------------------------
proc GetUserBut stdcall,f_name,sec_name,key_name,key_value
cmp [NumUserButt],16
jne @f
ret
@@:
push ebx esi edi
mov edi,[key_name] ;®¯à¥¤¥«ï¥¬ è¨à¨­ã ¬¥­î
xor eax,eax
or ecx,-1
repne scasb
sub edi,[key_name]
mov eax,edi
shl eax,1
lea eax,[eax*2+eax+5*2]
cmp ax,[RMenuW]
jbe @f
mov [RMenuW],ax
@@:
cmp [RMenuW],MinRMenuW
jae @f
mov [RMenuW],MinRMenuW
@@:
mov ebx,[NumUserButt]
mov esi,[key_name]
mov edi,[RBUser+ebx*8]
@@: lodsb
stosb
test al,al
jnz @b
;debug_newline
mov [RBUser+ebx*8+4],edi
mov esi,[key_value]
@@: lodsb
stosb
test al,al
jnz @b
mov [RBUser+ebx*8+8],edi
inc [NumUserButt]
pop edi esi ebx
mov eax,1
ret
endp
proc Ini_SavePos stdcall,f_name,sec_name
push ebx edi esi
xor ebx,ebx
.SearchSect:
mov edi,[IconsOffs+ebx*4]
mov esi,[sec_name]
@@:
lodsb
scasb
jne @f
test al,al
jnz @b
jmp .IcoDataFound
@@:
inc ebx
cmp ebx,[MaxNumIcon]
jb .SearchSect
mov eax,1
pop esi edi ebx
ret
.IcoDataFound:
or ecx,-1
repne scasb
repne scasb
repne scasb
;int3
movzx eax,word[edi+2]
test eax,8000h
jz @f
or eax,0FFFF0000h
@@:
stdcall [ini_set_int],[f_name],[sec_name],keyX,eax
movzx eax,word[edi]
test eax,8000h
jz @f
or eax,0FFFF0000h
@@:
stdcall [ini_set_int],[f_name],[sec_name],keyY,eax
mov eax,1
pop esi edi ebx
ret
endp