Исходник easy-dialog - легкое взаимодействие с локальными диалогами

chromiusj

fullstack eblan
Автор темы
Модератор
5,819
4,141
Привет.
easy-dialog - это библиотека для MoonLoader, которая кардинально упрощает создание сложных, многоуровневых и интерактивных локальных диалогов. Библиотека берет на себя всю рутинную работу по управлению состоянием, навигацией, пагинацией и анимацией, позволяя всем нам тут писать чистый, декларативный и легко поддерживаемый код.​
Основные возможности:
1. Каждый диалог - это независимый, самодостаточный объект.
2. Возможность регистрировать все диалоги в одном месте и управлять ими.
3. Создавать "живые" диалоги, содержимое которых обновляется на лету без их пересоздания.
4. Управлять потоком диалогов с помощью start, go, back, home и done.
5. Легко передавать данные из дочерних диалогов в родительские.
6. Автоматическая пагинация, передав массив данных, и библиотека сама разобьет его на страницы.
7.Легко создавайте анимированные диалоги, интерактивные меню и сложные интерфейсы с помощью :onUpdate и :update().
8. Быстро создавать стандартные окна: alert, confirm, prompt.
Зависимости:
MoonLoader v.026+ SAMPFUNCS v5.4.1+
Основное отличие новой версии - переход на декларативный подход. Не надо больше создавать диалоги "на лету", теперь можно описывать все диалоги один раз и управлять переходами между ними.
Lua:
-- 1. Определяем все диалоги в одном месте
local mainMenu = easy_dialog.Dialog.new()
:setCaption("Главное меню")
-- ... другие настройки
local settingsDialog = easy_dialog.Dialog.new()
:setCaption("Настройки")
-- ... другие настройки
-- 2. Регистрируем их по уникальным именам
easy_dialog.register("main_menu", mainMenu)
easy_dialog.register("settings", settingsDialog)
-- 3. Запускаем нужный диалог по имени
sampRegisterChatCommand("menu", function()
easy_dialog.start("main_menu")
end)
2. Навигация
Для перемещения между диалогами используются специальные функции:
easy_dialog.start("имя_диалога", данные) - Начать новый "сценарий". Полностью сбрасывает историю навигации. easy_dialog.go("имя_диалога", данные) - Перейти на следующий "диалог". Добавляет диалог в историю, позволяя вернуться назад. easy_dialog.back() - Вернуться на шаг назад. easy_dialog.home() - Вернуться на самый первый экран в текущей диалоговой сессии. easy_dialog.done(результат) - Завершить дочерний диалог и вернуть данные родительскому.
Режимы запуска (LaunchMode)
Lua:
-- Этот диалог всегда будет сбрасывать историю (как главное меню)
:setLaunchMode(easy_dialog.LaunchMode.ROOT)
-- Этот диалог не будет открыт, если он уже на экране
:setLaunchMode(easy_dialog.LaunchMode.SINGLE_TOP)
3. Работа с данными
Передача данных вперед:

Lua:
-- Передаем айди игрока в диалог действий
easy_dialog.go("player_actions", { player_id = 42 })
Прием данных (в целевом диалоге):
Lua:
:setOnStart(function(self, data)
-- data здесь будет равен { player_id = 42 }
self.targetId = data.player_id
end)
Возврат результата (из дочернего диалога):
Lua:
:setOnResponse(function(self, button, _, input_text)
if button == 1 then
easy_dialog.done({ new_name = input_text })
end
end)
Обработка результата (в родительском диалоге):
Lua:
:setOnProcessResult(function(self, result)
if result and result.new_name then
-- result здесь будет равен { new_name = "..." }
self:update() -- Обновляем родительский диалог, если нужно
end
end)
4. Динамический контент
Методы :setCaption() и :setItems() могут принимать функции, которые будут генерировать контент на лету, используя данные диалога.
Lua:
:setCaption(function(self)
return "Статистика игрока: " .. self.start_data.nickname
end)
5. Полный список методов и коллбэков
Конструкторы (вызываются по цепочке):
:setCaption(string | function) - Устанавливает заголовок. :setStyle(string) - 'msgbox', 'list', 'input', 'password', 'tablist', 'tablist_headers'. :setButtons(string, string) - Текст левой и правой кнопок. :setContent(string | function) - Основной текст. :setItems(table | function) - Список элементов (включает пагинацию). :setHeaders(table | function) - Заголовки для tablist_headers. :setItemsPerPage(number) - Элементов на странице. :setLaunchMode(number) - easy_dialog.LaunchMode.STANDARD | ROOT | SINGLE_TOP.
Обработчики событий:
:setOnStart(function(self, data)) - Вызывается при запуске диалога через start/go. :setOnResponse(function(self, button, absolute_index, text)) - Вызывается при ответе пользователя. :setOnUpdate(function(self, deltaTime)) - Вызывается каждый кадр, пока диалог активен. :setOnProcessResult(function(self, result)) - Вызывается в родительском диалоге после вызова done() в дочернем.
Методы управления:
myDialog:update() - Мгновенно перерисовывает диалог. myDialog:close(button_id) - Отправляет ответ на диалог.
Готовые шаблоны:
easy_dialog.alert(caption, text, onOK) easy_dialog.confirm(caption, text, onConfirm) easy_dialog.prompt(caption, text, onInput)
В теме есть демо-файл, показывающий всякие приколы библиотеки, активация - /showcase
 

Вложения

  • easy-dialog(demo).lua
    15.7 KB · Просмотры: 1
  • easy-dialog.lua
    15.7 KB · Просмотры: 3
Последнее редактирование:

chromiusj

fullstack eblan
Автор темы
Модератор
5,819
4,141
говно переделывай
ну переделал
обновление:
- Диалоги раньше создавались "на лету" в коде, теперь создаются один раз, регистрируются по имени и вызываются централизованно.
- Добавил более удобное перемещение. Раньше были только show и back, теперь есть полная система start, go, back, home и done для управления потоком.
- Добавил более удобную передачу данных (до этого было только через вложенные коллбэки), теперь дочерний диалог возвращает результат родительскому через done() и :setOnProcessResult().
- Состояние диалогов раньше хранилось в глобальных переменных для анимаций; теперь инкапсулировано внутри самого объекта диалога (self.) и инициализируется через :setOnStart().
- Исправлена критическая ошибка, из-за которой inputtext из диалогов ввода засирал ответы от диалогов-списков.
- Куча других приколов и т.д. В теме новый файл, и файл демки, переустановите
14.07:
- исправил работу пагинации
- поменял один примеров работы диалогов на очень интересный
 
Последнее редактирование: