forked from KolibriOS/kolibrios
Tinypad 4.0.6 - select file path with OpenDialog for Load and Save.
git-svn-id: svn://kolibrios.org@1624 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
ea9de5e3a5
commit
6976fe6967
@ -1,4 +1,5 @@
|
|||||||
@echo lang fix en >lang.inc
|
@echo lang fix en >lang.inc
|
||||||
@fasm tinypad.asm tinypad
|
@fasm tinypad.asm tinypad
|
||||||
|
@kpack tinypad
|
||||||
@erase lang.inc
|
@erase lang.inc
|
||||||
@pause
|
@pause
|
@ -1,4 +1,5 @@
|
|||||||
@echo lang fix et >lang.inc
|
@echo lang fix et >lang.inc
|
||||||
@fasm tinypad.asm tinypad
|
@fasm tinypad.asm tinypad
|
||||||
|
@kpack tinypad
|
||||||
@erase lang.inc
|
@erase lang.inc
|
||||||
@pause
|
@pause
|
@ -1,4 +1,5 @@
|
|||||||
@echo lang fix ru >lang.inc
|
@echo lang fix ru >lang.inc
|
||||||
@fasm tinypad.asm tinypad
|
@fasm tinypad.asm tinypad
|
||||||
|
@kpack tinypad
|
||||||
@erase lang.inc
|
@erase lang.inc
|
||||||
@pause
|
@pause
|
@ -114,3 +114,50 @@ sz ini_options_auto_indent,'auto_indent',0
|
|||||||
sz ini_options_smart_tab,'smart_tab',0
|
sz ini_options_smart_tab,'smart_tab',0
|
||||||
sz ini_options_optim_save,'optim_save',0
|
sz ini_options_optim_save,'optim_save',0
|
||||||
sz ini_options_line_nums,'line_nums',0
|
sz ini_options_line_nums,'line_nums',0
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
OpenDialog_data:
|
||||||
|
.type dd 0
|
||||||
|
.procinfo dd p_info ;+4
|
||||||
|
.com_area_name dd communication_area_name ;+8
|
||||||
|
.com_area dd 0 ;+12
|
||||||
|
.opendir_pach dd temp_dir_pach ;+16
|
||||||
|
.dir_default_pach dd communication_area_default_pach ;+20
|
||||||
|
.start_path dd open_dialog_path ;+24
|
||||||
|
.draw_window dd draw_window_for_OD ;+28
|
||||||
|
.status dd 0 ;+32
|
||||||
|
.openfile_pach dd fname_Info ;+36
|
||||||
|
.filename_area dd filename_area ;+40
|
||||||
|
.filter_area dd Filter
|
||||||
|
.x:
|
||||||
|
.x_size dw 420 ;+48 ; Window X size
|
||||||
|
.x_start dw 10 ;+50 ; Window X position
|
||||||
|
.y:
|
||||||
|
.y_size dw 320 ;+52 ; Window y size
|
||||||
|
.y_start dw 10 ;+54 ; Window Y position
|
||||||
|
|
||||||
|
communication_area_name:
|
||||||
|
db 'FFFFFFFF_open_dialog',0
|
||||||
|
open_dialog_path:
|
||||||
|
db '/sys/File Managers/opendial',0
|
||||||
|
communication_area_default_pach:
|
||||||
|
db '/sys',0
|
||||||
|
|
||||||
|
Filter:
|
||||||
|
dd Filter.end - Filter
|
||||||
|
.1:
|
||||||
|
db 'TXT',0
|
||||||
|
db 'ASM',0
|
||||||
|
db 'INC',0
|
||||||
|
db 'INI',0
|
||||||
|
db 'LOG',0
|
||||||
|
db 'DAT',0
|
||||||
|
db 'INF',0
|
||||||
|
db 'BAT',0
|
||||||
|
db 'SH',0
|
||||||
|
|
||||||
|
.end:
|
||||||
|
db 0
|
||||||
|
|
||||||
|
open_dialog db 0
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -305,5 +305,5 @@ lsz sysfuncs_filename,\
|
|||||||
en,<'SYSFUNCS.TXT',0>,\
|
en,<'SYSFUNCS.TXT',0>,\
|
||||||
et,<'SYSFUNCET.TXT',0>
|
et,<'SYSFUNCET.TXT',0>
|
||||||
|
|
||||||
sz s_example,'EXAMPLE.ASM'
|
sz s_example,'/sys/example.asm'
|
||||||
sz s_still ,'still'
|
sz s_still ,'still'
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
|
|
||||||
HISTORY:
|
HISTORY:
|
||||||
|
|
||||||
|
4.0.6 (26/09/2010, Marat Zakiyanov aka Mario79, aka Mario)
|
||||||
|
new features:
|
||||||
|
- Select file path with OpenDialog for Load and Save.
|
||||||
|
|
||||||
4.0.5 (Rus, mike.dld)
|
4.0.5 (Rus, mike.dld)
|
||||||
bug-fixes:
|
bug-fixes:
|
||||||
- new tab is created when opening a file from Tinypad's home folder
|
- new tab is created when opening a file from Tinypad's home folder
|
||||||
|
@ -34,7 +34,7 @@ include 'tinypad.inc'
|
|||||||
|
|
||||||
header '01',1,@CODE,TINYPAD_END,STATIC_MEM_END,MAIN_STACK,@PARAMS,ini_path
|
header '01',1,@CODE,TINYPAD_END,STATIC_MEM_END,MAIN_STACK,@PARAMS,ini_path
|
||||||
|
|
||||||
APP_VERSION equ 'SVN (4.0.5)'
|
APP_VERSION equ 'SVN (4.0.6)'
|
||||||
|
|
||||||
TRUE = 1
|
TRUE = 1
|
||||||
FALSE = 0
|
FALSE = 0
|
||||||
@ -182,6 +182,23 @@ section @CODE ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|||||||
mov al,[tabs_pos]
|
mov al,[tabs_pos]
|
||||||
mov [tab_bar.Style],al
|
mov [tab_bar.Style],al
|
||||||
|
|
||||||
|
;---------------------------------------------------------------------
|
||||||
|
mov edi,filename_area
|
||||||
|
mov esi,s_example+5
|
||||||
|
call copy_str_1
|
||||||
|
|
||||||
|
mov esi,tb_opensave.text
|
||||||
|
mov edi,fname_Info
|
||||||
|
call copy_str_1
|
||||||
|
xor eax,eax
|
||||||
|
mov [edi],al
|
||||||
|
;---------------------------------------------------------------------
|
||||||
|
;OpenDialog initialisation
|
||||||
|
push dword OpenDialog_data
|
||||||
|
call [OpenDialog_Init]
|
||||||
|
;---------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
mcall 66,1,1
|
mcall 66,1,1
|
||||||
mcall 40,00100111b
|
mcall 40,00100111b
|
||||||
red:
|
red:
|
||||||
@ -193,6 +210,8 @@ still:
|
|||||||
call draw_statusbar ; write current position & number of strings
|
call draw_statusbar ; write current position & number of strings
|
||||||
|
|
||||||
.skip_write:
|
.skip_write:
|
||||||
|
cmp [open_dialog],1
|
||||||
|
je .open_dialog
|
||||||
mcall 10 ; wait here until event
|
mcall 10 ; wait here until event
|
||||||
cmp [main_closed],0
|
cmp [main_closed],0
|
||||||
jne key.alt_x
|
jne key.alt_x
|
||||||
@ -206,7 +225,86 @@ still:
|
|||||||
jz mouse
|
jz mouse
|
||||||
|
|
||||||
jmp still.skip_write
|
jmp still.skip_write
|
||||||
|
;---------------------------------------------------------------------
|
||||||
|
.open_dialog:
|
||||||
|
pusha
|
||||||
|
|
||||||
|
call btn.bot.cancel
|
||||||
|
|
||||||
|
mov esi,tb_opensave.text
|
||||||
|
mov edi,[OpenDialog_data.openfile_pach]
|
||||||
|
movzx ecx,[tb_opensave.length]
|
||||||
|
mov edx,[OpenDialog_data.filename_area]
|
||||||
|
mov ebx,[OpenDialog_data.opendir_pach]
|
||||||
|
call copy_str_2
|
||||||
|
movzx eax,byte [bot_mode2]
|
||||||
|
mov [OpenDialog_data.type],eax
|
||||||
|
popa
|
||||||
|
; invoke OpenDialog
|
||||||
|
push dword OpenDialog_data
|
||||||
|
call [OpenDialog_Start]
|
||||||
|
|
||||||
|
cmp [OpenDialog_data.status],1
|
||||||
|
jne .3
|
||||||
|
|
||||||
|
pusha
|
||||||
|
mov edi,tb_opensave.text
|
||||||
|
mov esi,[OpenDialog_data.openfile_pach]
|
||||||
|
call copy_str_1
|
||||||
|
sub edi,tb_opensave.text
|
||||||
|
dec edi
|
||||||
|
mov eax,edi
|
||||||
|
mov [tb_opensave.length],al
|
||||||
|
popa
|
||||||
|
|
||||||
|
cmp [bot_mode2],0
|
||||||
|
je .2
|
||||||
|
call save_file
|
||||||
|
jmp .3
|
||||||
|
.2:
|
||||||
|
call load_file
|
||||||
|
.3:
|
||||||
|
mov [open_dialog],0
|
||||||
|
jmp red
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
draw_window_for_OD:
|
||||||
|
call drawwindow
|
||||||
|
call draw_statusbar
|
||||||
|
ret
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
copy_str_2:
|
||||||
|
cld
|
||||||
|
push esi ecx
|
||||||
|
rep movsb ; edi openfile_pach
|
||||||
|
xor eax,eax
|
||||||
|
mov [edi],al
|
||||||
|
pop ecx esi
|
||||||
|
mov edi,ebx
|
||||||
|
rep movsb ; edi opendir_pach
|
||||||
|
mov [edi],al
|
||||||
|
mov esi,edi
|
||||||
|
std
|
||||||
|
@@:
|
||||||
|
lodsb
|
||||||
|
cmp al,byte '/'
|
||||||
|
jne @b
|
||||||
|
inc esi
|
||||||
|
xor eax,eax
|
||||||
|
mov [esi],al
|
||||||
|
inc esi
|
||||||
|
mov edi,edx ; edi filename_area
|
||||||
|
call copy_str_1
|
||||||
|
ret
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
copy_str_1:
|
||||||
|
xor eax,eax
|
||||||
|
cld
|
||||||
|
@@:
|
||||||
|
lodsb
|
||||||
|
stosb
|
||||||
|
test eax,eax
|
||||||
|
jnz @b
|
||||||
|
ret
|
||||||
;-----------------------------------------------------------------------------
|
;-----------------------------------------------------------------------------
|
||||||
proc get_event ctx ;//////////////////////////////////////////////////////////
|
proc get_event ctx ;//////////////////////////////////////////////////////////
|
||||||
;-----------------------------------------------------------------------------
|
;-----------------------------------------------------------------------------
|
||||||
@ -525,7 +623,8 @@ section @IMPORT ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|||||||
library \
|
library \
|
||||||
libini,'libini.obj',\
|
libini,'libini.obj',\
|
||||||
libio,'libio.obj',\
|
libio,'libio.obj',\
|
||||||
libgfx,'libgfx.obj'
|
libgfx,'libgfx.obj',\
|
||||||
|
proc_lib,'proc_lib.obj'
|
||||||
|
|
||||||
import libini, \
|
import libini, \
|
||||||
ini.get_str ,'ini_get_str',\
|
ini.get_str ,'ini_get_str',\
|
||||||
@ -567,6 +666,10 @@ import libgfx, \
|
|||||||
gfx.rectangle ,'gfx_rectangle',\
|
gfx.rectangle ,'gfx_rectangle',\
|
||||||
gfx.rectangle.ex,'gfx_rectangle_ex'
|
gfx.rectangle.ex,'gfx_rectangle_ex'
|
||||||
|
|
||||||
|
import proc_lib, \
|
||||||
|
OpenDialog_Init ,'OpenDialog_init',\
|
||||||
|
OpenDialog_Start ,'OpenDialog_start'
|
||||||
|
|
||||||
TINYPAD_END: ; end of file
|
TINYPAD_END: ; end of file
|
||||||
|
|
||||||
;-----------------------------------------------------------------------------
|
;-----------------------------------------------------------------------------
|
||||||
@ -587,6 +690,16 @@ sc system_colors
|
|||||||
|
|
||||||
ini_path rb PATHL
|
ini_path rb PATHL
|
||||||
|
|
||||||
|
;---------------------------------------------------------------------
|
||||||
|
temp_dir_pach:
|
||||||
|
rb 4096
|
||||||
|
;---------------------------------------------------------------------
|
||||||
|
fname_Info:
|
||||||
|
rb 4096 ; filename
|
||||||
|
;---------------------------------------------------------------------
|
||||||
|
filename_area:
|
||||||
|
rb 256
|
||||||
|
;---------------------------------------------------------------------
|
||||||
rb 1024*4
|
rb 1024*4
|
||||||
MAIN_STACK:
|
MAIN_STACK:
|
||||||
rb 1024*4
|
rb 1024*4
|
||||||
|
@ -29,7 +29,7 @@ proc define_3d_button ;///////////////////////////////////////////////////////
|
|||||||
popad
|
popad
|
||||||
ret 4*3
|
ret 4*3
|
||||||
endp
|
endp
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
finddlg_handler:
|
finddlg_handler:
|
||||||
cmp al,1
|
cmp al,1
|
||||||
je .draw
|
je .draw
|
||||||
@ -126,71 +126,74 @@ finddlg_handler:
|
|||||||
mov [focused_tb],eax
|
mov [focused_tb],eax
|
||||||
call .draw
|
call .draw
|
||||||
@@: ret
|
@@: ret
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
osdlg_handler:
|
osdlg_handler:
|
||||||
cmp al,1
|
mov [open_dialog],1
|
||||||
je .draw
|
|
||||||
cmp al,2
|
|
||||||
je .key
|
|
||||||
cmp al,3
|
|
||||||
je botdlg.button
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.draw:
|
; cmp al,1
|
||||||
mov ebx,[bot_ofs]
|
; je .draw
|
||||||
add ebx,(1+3)*65536+6
|
; cmp al,2
|
||||||
mcall 4,,[sc.work_text],s_2filename,s_2filename.size
|
; je .key
|
||||||
mov ebx,[p_info.client_box.width]
|
; cmp al,3
|
||||||
shl ebx,16
|
; je botdlg.button
|
||||||
mov ecx,[bot_ofs]
|
; ret
|
||||||
shl ecx,16
|
|
||||||
add ecx,(2+18)*65536+15
|
|
||||||
|
|
||||||
push 20002
|
; .draw:
|
||||||
cmp [bot_mode2],0
|
; mov ebx,[bot_ofs]
|
||||||
jne .draw.lp1
|
; add ebx,(1+3)*65536+6
|
||||||
add ebx,-(2+6*(s_2open.size+2))*65536+6*(s_2open.size+2)
|
; mcall 4,,[sc.work_text],s_2filename,s_2filename.size
|
||||||
push s_2open s_2open.size
|
; mov ebx,[p_info.client_box.width]
|
||||||
jmp @f
|
; shl ebx,16
|
||||||
.draw.lp1:
|
; mov ecx,[bot_ofs]
|
||||||
add ebx,-(2+6*(s_2save.size+2))*65536+6*(s_2save.size+2)
|
; shl ecx,16
|
||||||
push s_2save s_2save.size
|
; add ecx,(2+18)*65536+15
|
||||||
|
;
|
||||||
|
; push 20002
|
||||||
|
; cmp [bot_mode2],0
|
||||||
|
; jne .draw.lp1
|
||||||
|
; add ebx,-(2+6*(s_2open.size+2))*65536+6*(s_2open.size+2)
|
||||||
|
; push s_2open s_2open.size
|
||||||
|
; jmp @f
|
||||||
|
; .draw.lp1:
|
||||||
|
; add ebx,-(2+6*(s_2save.size+2))*65536+6*(s_2save.size+2)
|
||||||
|
; push s_2save s_2save.size
|
||||||
|
|
||||||
@@: call define_3d_button
|
; @@: call define_3d_button
|
||||||
sub ebx,(6*(s_2cancel.size+2)+3)*65536
|
; sub ebx,(6*(s_2cancel.size+2)+3)*65536
|
||||||
mov bx,6*(s_2cancel.size+2)
|
; mov bx,6*(s_2cancel.size+2)
|
||||||
push 20001 s_2cancel s_2cancel.size
|
; push 20001 s_2cancel s_2cancel.size
|
||||||
call define_3d_button
|
; call define_3d_button
|
||||||
|
|
||||||
cmp [bot_mode2], 2 ; exit-save dialog
|
; cmp [bot_mode2], 2 ; exit-save dialog
|
||||||
jne @f
|
; jne @f
|
||||||
|
|
||||||
sub ebx,(6*(s_2save_no.size+2)+3)*65536
|
; sub ebx,(6*(s_2save_no.size+2)+3)*65536
|
||||||
mov bx,6*(s_2save_no.size+2)
|
; mov bx,6*(s_2save_no.size+2)
|
||||||
push 20007 s_2save_no s_2save_no.size
|
; push 20007 s_2save_no s_2save_no.size
|
||||||
call define_3d_button
|
; call define_3d_button
|
||||||
|
|
||||||
@@: mov ebp,tb_opensave
|
; @@: mov ebp,tb_opensave
|
||||||
mov eax,[p_info.client_box.width]
|
; mov eax,[p_info.client_box.width]
|
||||||
sub eax,6*(s_2filename.size+1)+1
|
; sub eax,6*(s_2filename.size+1)+1
|
||||||
add eax,6*(s_2filename.size+1)*65536
|
; add eax,6*(s_2filename.size+1)*65536
|
||||||
mov dword[tbox.width],eax
|
; mov dword[tbox.width],eax
|
||||||
add ecx,-18*65536+1
|
; add ecx,-18*65536+1
|
||||||
mov dword[tbox.height],ecx
|
; mov dword[tbox.height],ecx
|
||||||
call textbox.draw
|
; call textbox.draw
|
||||||
|
|
||||||
ret
|
; ret
|
||||||
|
|
||||||
.key:
|
|
||||||
cmp ebx,KEY_ESCAPE
|
|
||||||
je btn.bot.cancel
|
|
||||||
cmp ebx,KEY_RETURN
|
|
||||||
je btn.bot.opensave
|
|
||||||
cmp ebx,KEY_NUMRETURN
|
|
||||||
je btn.bot.opensave
|
|
||||||
call textbox.key
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
; .key:
|
||||||
|
; cmp ebx,KEY_ESCAPE
|
||||||
|
; je btn.bot.cancel
|
||||||
|
; cmp ebx,KEY_RETURN
|
||||||
|
; je btn.bot.opensave
|
||||||
|
; cmp ebx,KEY_NUMRETURN
|
||||||
|
; je btn.bot.opensave
|
||||||
|
; call textbox.key
|
||||||
|
; ret
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
gotodlg_handler:
|
gotodlg_handler:
|
||||||
cmp al,1
|
cmp al,1
|
||||||
je .draw
|
je .draw
|
||||||
@ -251,11 +254,11 @@ gotodlg_handler:
|
|||||||
je btn.bot.opensave
|
je btn.bot.opensave
|
||||||
call textbox.key
|
call textbox.key
|
||||||
ret
|
ret
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
cur_part dd ?
|
cur_part dd ?
|
||||||
cur_color dd ?
|
cur_color dd ?
|
||||||
cur_colors rd 10
|
cur_colors rd 10
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
optsdlg_handler:
|
optsdlg_handler:
|
||||||
cmp al,1
|
cmp al,1
|
||||||
je .draw
|
je .draw
|
||||||
@ -579,7 +582,7 @@ TPOSW = 10
|
|||||||
|
|
||||||
.mouse.exit:
|
.mouse.exit:
|
||||||
ret
|
ret
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
botdlg.button:
|
botdlg.button:
|
||||||
mov esi,accel_table2_botdlg
|
mov esi,accel_table2_botdlg
|
||||||
.acc: cmp ebx,[esi]
|
.acc: cmp ebx,[esi]
|
||||||
@ -590,7 +593,7 @@ botdlg.button:
|
|||||||
cmp byte[esi],0
|
cmp byte[esi],0
|
||||||
jne .acc
|
jne .acc
|
||||||
ret
|
ret
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
btn.bot.cancel:
|
btn.bot.cancel:
|
||||||
xor eax,eax
|
xor eax,eax
|
||||||
mov [bot_mode],al
|
mov [bot_mode],al
|
||||||
@ -599,7 +602,7 @@ botdlg.button:
|
|||||||
mov [s_status],eax
|
mov [s_status],eax
|
||||||
call drawwindow
|
call drawwindow
|
||||||
ret
|
ret
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
btn.bot.opensave:
|
btn.bot.opensave:
|
||||||
cmp [bot_mode2],0
|
cmp [bot_mode2],0
|
||||||
je .lp1
|
je .lp1
|
||||||
@ -616,7 +619,7 @@ botdlg.button:
|
|||||||
mov [bot_dlg_height],eax
|
mov [bot_dlg_height],eax
|
||||||
call drawwindow
|
call drawwindow
|
||||||
ret
|
ret
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
btn.bot.no:
|
btn.bot.no:
|
||||||
xor eax,eax
|
xor eax,eax
|
||||||
mov [bot_mode],al
|
mov [bot_mode],al
|
||||||
@ -630,7 +633,7 @@ botdlg.button:
|
|||||||
ret
|
ret
|
||||||
@@: call key.ctrl_f4.close
|
@@: call key.ctrl_f4.close
|
||||||
ret
|
ret
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
btn.bot.find:
|
btn.bot.find:
|
||||||
movzx ecx,[tb_find.length]
|
movzx ecx,[tb_find.length]
|
||||||
mov [s_search.size],ecx
|
mov [s_search.size],ecx
|
||||||
@ -683,7 +686,7 @@ botdlg.button:
|
|||||||
call key.f3
|
call key.f3
|
||||||
call drawwindow
|
call drawwindow
|
||||||
ret
|
ret
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
btn.bot.appearance:
|
btn.bot.appearance:
|
||||||
@@: xor eax,eax
|
@@: xor eax,eax
|
||||||
mov [bot_mode],al
|
mov [bot_mode],al
|
||||||
@ -695,12 +698,13 @@ botdlg.button:
|
|||||||
stdcall save_settings
|
stdcall save_settings
|
||||||
call drawwindow
|
call drawwindow
|
||||||
ret
|
ret
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
tabpos_round db 4,3,1,2
|
tabpos_round db 4,3,1,2
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
btn.bot.tabpos:
|
btn.bot.tabpos:
|
||||||
movzx eax,[tabs_pos]
|
movzx eax,[tabs_pos]
|
||||||
mov al,[tabpos_round+eax-1]
|
mov al,[tabpos_round+eax-1]
|
||||||
mov [tabs_pos],al
|
mov [tabs_pos],al
|
||||||
@@: call optsdlg_handler.draw_tabpos
|
@@: call optsdlg_handler.draw_tabpos
|
||||||
ret
|
ret
|
||||||
|
;-----------------------------------------------------------------------------
|
Loading…
Reference in New Issue
Block a user