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

chromiusj

модерирую шмодерирую
Автор темы
Модератор
5,952
4,283
привет​
easy_dialog — это библиотека, которая кардинально упрощает создание сложных, многоуровневых и интерактивных локальных диалогов. Она берёт на себя всю рутину по управлению состоянием и навигацией, позволяя писать чистый и легко поддерживаемый код.
Зависимости:
1. MoonLoader v.026+
2. SAMPFUNCS v5.4.1+
Подключение:
Lua:
local easy_dialog = require 'easy_dialog'
local Dialog = easy_dialog.Dialog -- для удобства
Библиотека использует декларативный подход. Вы один раз описываете все диалоги как объекты, регистрируете их под уникальными именами, а затем управляете только переходами между ними.
Lua:
-- 1. Определяем все диалоги как объекты
local mainMenu = Dialog.new()
  :setCaption("Главное меню")
  :setItems({"Настройки", "Выход"})
  :setOnResponse(function(self, button, index)
    if button == 1 and index == 1 then
      easy_dialog.go("settings") -- Переходим на диалог по имени
    end
  end)

local settingsDialog = Dialog.new()
  :setCaption("Настройки")
  :setItems({"Вернуться"})
  :setOnResponse(function(self, button)
    if button == 1 then easy_dialog.back() end -- Возвращаемся назад
  end)

-- 2. Регистрируем их
easy_dialog.register("main_menu", mainMenu)
easy_dialog.register("settings", settingsDialog)

-- 3. Инициализируем библиотеку и запускаем начальный диалог
function main()
  easy_dialog.init()
  sampRegisterChatCommand("menu", function()
    easy_dialog.start("main_menu")
  end)
  wait(-1)
end

Управление потоком диалогов осуществляется через глобальные функции.
МетодОписание
Lua:
easy_dialog.start("имя", данные)
Начинает новую сессию диалогов. Полностью очищает историю навигации.
Lua:
easy_dialog.go("имя", данные)
Переходит на следующий диалог, добавляя его в историю.
Lua:
easy_dialog.back()
Возвращается на предыдущий диалог в истории.
Lua:
easy_dialog.home()
Возвращается на самый первый диалог в текущей сессии.
Lua:
easy_dialog.done(результат)
Закрывает дочерний диалог и возвращает данные родительскому.
Передача данных вперед (в дочерний диалог):
Lua:
easy_dialog.go("player_actions", { player_id = 42 })
Lua:
-- В диалоге "player_actions"
:setOnStart(function(self, data)
-- data = { player_id = 42 }
self.targetId = data.player_id
end)
Возврат результата (в родительский диалог):
Lua:
-- В дочернем диалоге
:setOnResponse(function(self, button, _, input)
    if button == 1 then
        easy_dialog.done({ new_name = input })
    end
end)
Lua:
-- В родительском диалоге
:setOnProcessResult(function(self, result)
    if result and result.new_name then
        -- result = { new_name = "..." }
        self:update() -- Обновляем родителя для отображения изменений
    end
end)

Полный список методов объекта Dialog​

МетодОписание
Lua:
:setCaption(string | function)
Заголовок диалога.
Lua:
:setStyle(string)
'msgbox', 'list', 'input', 'password', 'tablist', 'tablist_headers'.
Lua:
:setButtons(string, string)
Текст левой (response 1) и правой (response 0) кнопок.
Lua:
:setContent(string | function)
Основной текст (для msgbox, input, password).
Lua:
:setItems(table | function)
Список элементов (для list, tablist).
Lua:
:setHeaders(table | function)
Заголовки для 'tablist_headers'.
Lua:
:setItemsPerPage(number)
Количество элементов на странице для авто-пагинации.
Lua:
:setLaunchMode(number)
Режим запуска: STANDARD, ROOT, SINGLE_TOP.
КоллбэкОписание
Lua:
:setOnStart(function(self, data))
Вызывается при запуске диалога через start/go.
Lua:
:setOnResponse(function(self, button, index, input, item))
Вызывается при ответе пользователя.
Lua:
:setOnUpdate(function(self, deltaTime))
Вызывается каждый кадр, пока диалог активен (для анимаций).
Lua:
:setOnProcessResult(function(self, result))
Вызывается в родительском диалоге после done() в дочернем.
Lua:
myDialog:update()
- Мгновенно перерисовывает диалог с обновленными данными.
Lua:
myDialog:close(button_id)
- Принудительно закрывает диалог, имитируя нажатие кнопки (1 или 0).
Lua:
easy_dialog.alert(caption, text, onOK)
Lua:
easy_dialog.confirm(caption, text, onConfirm)
Lua:
easy_dialog.prompt(caption, text, onInput)
Для корректного завершения работы библиотеки необходимо всегда вызывать easy_dialog.stop() при выгрузке скрипта:
Lua:
function onScriptTerminate(script, quitGame)
    if script == thisScript() then
        easy_dialog.stop()
    end
end
 

Вложения

  • easy_dialog(example).lua
    15.6 KB · Просмотры: 4
Последнее редактирование:

chromiusj

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

chromiusj

модерирую шмодерирую
Автор темы
Модератор
5,952
4,283
обновил
добавил выгрузку библиотеки при перезагрузке, чтобы не появлялись фантомные диалоги, исправил работу с перемещениями и апдейтом данных