Перейти к содержимому

ДубоБлог

  • записей
    15
  • комментариев
    39
  • просмотров
    2 857

Файловый менеджер. Часть #0 [апгрейд событий]

Doob

122 просмотра

Давным-давно делал модный файловый менеджер с графическим интерфейсом для опенкомпов.

Переходы по папкам, запуск файлов, распаковака tarball'ов и просмотр картинок в одной программе, к тому же фичи в виде листания свайпами, экранной клавиатуры и горстки настроек. И все это добро занимало меньше килобайта.

Но развивать идею не стал, код удалил и осталась только одна картинка тестовой версии.

 

u9nlp0H.png

 

Недавно решил это дело возродить, без зависимостей и лишних свистоплясок.

 

Для начала напишем функции, которые добавят дополнительные возможности для пользователя.

Когда игрок тыкает в экран, создаются два события - touch и drop.

Когда зажимает и тащит - touch, потом куча drag и в конце drop.

Из имеющихся событий, можно развить дополнительные события - клик, двойной клик и свайп. Можно даже добавить сложные жесты, но пока не понятно, как они могут пригодиться.

 

На все нужные события повесим слушателей и будем сохранять результат в переменную.

 

Слушатель для события touch будет проверять, было ли предыдущее событие drop. Затем сравнит с временем от последнего клика, вычислит расстояние между точками, в которых произошло событие. При совпадении координат и заданным временем между кликами пошлет событие double_click.

 

Для события drop надо проверить, было ли предыдущим touch и по тому же параметру скорости проверять время между событиями, чтобы не захватывать долгие нажатия.

Если предыдущим событием было drag, то надо определить расстояние между началом и концом действия, вычислить угол и послать это все в виде события swipe.

 

В итоге получится примерно такой код:

local computer = require('computer') -- подгрузить обертку для uptime & pushSignal
local event = require('event') -- подгрузить библиотеку событий

local lastEvent = nil -- последнее действие
local lastTouch = nil -- последнее касание
local eventTime = nil -- время от последнего события
local clickSpeed = 0.5 -- время, за которое совершается клик и дабл-клик

event.listen('drag', function(...)
  lastEvent = {...} -- просто сохранить событие
end)

event.listen('touch', function(...)
  local e = {...} -- сохранить событие в таблицу
  if e[5] == 0 and lastEvent and lastEvent[1] == 'drop' then -- если нажата ЛКМ и предыдущее было drop
    if eventTime and computer.uptime()-eventTime < clickSpeed then -- если прошло меньше времени, чем задано
      if lastTouch and lastTouch[3]-e[3]+lastTouch[4]-e[4] == 0 then -- если координаты событий не отличаются
        computer.pushSignal('double_click', e[2], e[3], e[4], e[6]) -- послать дабл-клик с координатами
      end
    end
    lastTouch = e -- сохранить последнее касание
  end
  eventTime = computer.uptime() -- обновить таймштамп события
  lastEvent = e -- сохранить событие
end)

event.listen('drop', function(...)
  local e = {...} -- сохранить событие в таблицу
  if e[5] == 0 and lastEvent then -- если нажата ЛКМ
    if lastEvent[1] == 'touch' then -- если предыдущее событие было касанием
      if eventTime and computer.uptime()-eventTime < clickSpeed then -- если прошло меньше времени, чем задано
        computer.pushSignal('click', e[2], e[3], e[4], e[6]) -- послать клик с координатами
      end
    elseif lastEvent[1] == 'drag' then -- если предыдущее было тасканием
      local dx, dy = lastTouch[3]-e[3], lastTouch[4]-e[4] -- найти дельту до координат касания
      computer.pushSignal('swipe', e[2], dx, dy, math.floor(math.deg(math.atan(dx/dy))), e[6]) -- послать свайп с дельтой и углом
    end
  end
  eventTime = computer.uptime() -- обновить таймштамп события
  lastEvent = e -- сохранить событие
end)

 

Пока он ничего не делает, только создает события, когда будет готов функционал отрисовки и взаимодействия с файловой системой, добавим к этим слушателям управляющие функции.

  • Нравится 5


0 комментариев


Рекомендуемые комментарии

Нет комментариев для отображения

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Добавить комментарий...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...