;------------------------------------------------- ; Инициализация мышки и вывод ее на экран ;------------------------------------------------- init_mouse: xor a rst 30h jr show_mouse ;------------------------------------------------- ; Вывести курсор мышки ;------------------------------------------------- show_mouse: ld a,1 rst 30h ret ;------------------------------------------------- ; Скрыть курсор мышки ;------------------------------------------------- hide_mouse: ld a,2 rst 30h ret ;------------------------------------------------- ; Получить новую информацию о мышке ;------------------------------------------------- get_mouse_info: ld a,3 ; получить коорд. мышки rst 30h ret ;------------------------------------------------- ; Ждем, пока нажаты бутоны мышки ;------------------------------------------------- get_fire: call get_mouse_info and 3 jr nz,$-5 ; бутоны нажаты ret ;--------------------------------------------------------------------- ; Обработка нажатия бутонов мышки на панелях менеджера ; ; вход: hl=Y/X текст. координаты мышки. ; d=биты нажатия бутонов ;--------------------------------------------------------------------- buttons_press: ld a,d ld (buttons_bits),a ; сохр. биты нажатия бутонов ld a,h cp 27 ; нижняя граница списка jp nc,event_keybar ; тест на comline и key-бар or a ; 0-я строка jp z,main_menu ; гориз. Меню call test_show_panels ; тест на режим вкл. панелей ret z call mouse_set_active_panel ; уст. мышкой акт. панель ld a,(format_mode) ; формат акт. панели and form_info+form_qview ret nz ; info, qviev ld a,h ; Y координата мышки cp 2 ; верхняя граница списка jp c,event_title ; тест на заголовок панели sub 2 ld b,l ; сохр. X координату ld l,a ; Y координата мышки ld h,0 ; ld de,(all_files) ; число файлов и папок ld a,e or d jp z,get_fire ; защита от "залипания" бутонов ld a,(cur_panel) ; тек. акт. панель ld c,a ; 0=левая, 80h=правая ld a,(format_mode) ; формат акт. панели bit 0,a ; full, full-спек jr nz,event_set__ ; ничего не менять push de call event_calc_pointer ; вычислить полож. указателя pop de event_set__: ; hl=полож. указателя по коорд. мышки ; de=all_files call cmphlde ; сравнить hl с de jr nc,event_set_end ; указатель в конец списка ; мышка в пределах списка (не в пустом месте колонки) call A0E12_ ; обновить полож. указателя ld a,(buttons_bits) ; биты нажатия бутонов bit 1,a ; левый ? jr nz,button_left ; да ; поставить/снять выделение файла call A0E13 jp get_fire ; защита от "залипания" бутонов ; ; указатель в конец списка event_set_end: dec de ex de,hl ; hl = all_files-1 call A0E12_ ; обновить полож. указателя jp get_fire ; защита от "залипания" бутонов ; button_left: call get_fire ei ld b,9 ; ожидание push bc call get_mouse_info ; чтение состояния мышки pop bc jr nz,double_press ; кнопки нажаты halt djnz $-8 ret ; двойной клик double_press: xor a ld (MSbutt),a ; сбр. статус бутонов jp Press_Enter ; enter.asm ;----------------------------------------------------------- ; Вычисление положения указателя по координатам мышки ; для "краткого" и "среднего" форматов панелей. ; ; вход: a=формат панели ; hl=Y координата мышки ; b=X координата мышки ; c=тек. акт. панель (0=левая, 80h=правая) ; выход: hl=полож. указателя ;----------------------------------------------------------- event_calc_pointer: ld de,files_per_colon ; 25 файлов на колонку and form_brief ld a,b ; X координата jr z,event_medium__ ; "краткий" формат dec c ; акт. левая панель ? inc c ; левая панель ld c,14 ; начало средней колонки ld b,27 ; начало правой колонки jr z,event_calc__ ; да, левая ; правая панель ld c,54 ; начало средней колонки ld b,67 ; начало правой колонки event_calc__: cp c ; начало средней колонки ret c add hl,de ; коорд.мышки + файлов на колонку event_calc1__: cp b ; начало правой колонки ret c add hl,de ret ; ; "средний" формат event_medium__: dec c ; акт. левая панель ? inc c ; левая панель ld b,20 ; начало средней колонки jr z,event_calc1__ ; да, левая ; правая панель ld b,60 ; начало средней колонки jr event_calc1__ ;----------------------------------------------------------- ; Установка мышкой активной панели ; ; вход: hl=Y/X координаты ; выход: h=Y коррект. координата ;----------------------------------------------------------- mouse_set_active_panel: ld a,(cur_panel) ; 0=левая, 80h=правая or a ld a,l jr nz,mouse_set__ ; акт. правая cp 40 ; начало правой панели call nc,mouse_set_panel ; уст. акт. панель ret mouse_set__: cp 40 ; начало правой панели call c,mouse_set_panel ; уст. акт. панель ret ; mouse_set_panel: push hl ; сохр. координаты мышки ld hl,D48B1 ; флаг инверсии ld (hl),false ; сбр. инверсию path-строки push hl call clear_pointer ; убрать указатель call prn_up_path ; вывод пути тек. панели без инверсии call change_panel ; сменить акт. панель pop hl ld (hl),true ; инверсия path-строки call prn_up_path ; вывод пути тек. панели с инверсией call print_compath ; вывод пути в ком-строке pop hl ret ;----------------------------------------------------------- ; Обработка мышки на титле панели ; ; вход: hl=Y/X текст. координаты мышки ;----------------------------------------------------------- event_title: ld a,(buttons_bits) ; биты нажатия бутонов bit 0,a ; правый бутон ? jr nz,event_title_right ; да ld a,l ; X координата cp 1 ; буква сортировки jp z,select_left_drive ; меню выбора дисков cp 41 ; буква сортировки jp z,select_right_drive ; меню выбора дисков cp 2 ;  левой панели jr z,event_title_sort cp 42 ;  правой панели jr z,event_title_sort ; Указатель на строку вверх call up ; указатель на строку вверх jr event_title_wait ; задержка перемещ. указателя ; ; Листание страницей event_title_right: call page_up ; PageUp call get_fire jr event_title_wait ;----------------------------------------------------------- ; На строку вниз, если мышка на 27-й строке ;----------------------------------------------------------- event_footerline: call test_show_panels ; тест на режим вкл. панелей ret z push bc call mouse_set_active_panel ; уст. мышкой акт. панель pop bc bit 0,c ; правый бутон ? jr nz,event_foot_right ; да ; Указатель на строку вниз call down event_title_wait: call show_pointer ; вывести указатель (когда не выводят up/down) ei halt halt halt ret ; ; Листание страницей event_foot_right: call page_down ; PageDown call get_fire jr event_title_wait ;----------------------------------------------------------- ; Обработка символа "стрелка" сортировки панелей ;----------------------------------------------------------- event_title_sort: ld hl,sort_type ld c,(hl) ; n/x/.. буква сортировки ld a,"u" cp c ; unsort ? call nz,sorting_list ; обновить панель с новой сортировкой call show_pointer ; вывести указатель jp get_fire ; защита от "залипания" бутонов ;--------------------------------------------------------------------- ; Обработка мышки на key-баре ; ; вход: hl=Y/X текст. координаты мышки ;--------------------------------------------------------------------- event_keybar: db 3Eh ; ld a,.. buttons_bits: db 0 ; биты нажатия бутонов ld c,a ld a,h cp 27 ; Y координата jr z,event_footerline bit 0,c ; правый бутон ? ret nz ; да ld a,h cp 31 ; Y координата jp nz,event_comline ; тест на ком. строку ld a,l ; X координата push af call get_fire ; защита от "залипания" pop af cp 8 ret c; ; F1 пункт cp 16 jp c,user_menu ; F2 пункт cp 24 jp c,file_viewer ; F3 пункт cp 32 ret c; ; F4 пункт cp 40 jp c,copy ; F5 пункт cp 48 jp c,rename ; F6 пункт cp 56 jp c,make_folder ; F7 пункт cp 64 jp c,delete ; F8 пункт cp 72 jp nc,quit ; F10 пункт ; F9 пункт jp main_menu ;--------------------------------------------------------------------- ; Обработка мышки на командной строке ;--------------------------------------------------------------------- event_comline: cp 30 ; Y полож. ком-строки ret nz ld a,(EvComMouse1+1) ; X начало поля ввода ком-строки ld h,a push hl ; l=X координата call get_fire ; защита от "залипания" pop hl ld a,l sub h ret c ; мышка левее строки ввода ld de,(YXpos+1) ; начало поля ввода ком-строки ld (CursorPos),de ld iy,ComLineBuff ; структура буфера ком-строки jp enter_to_comline