управление меню mimgui клавишами

fleetxn

Новичок
Автор темы
5
1
Версия MoonLoader
.027.0-preview
есть ли какой то способ в меню mimgui выбирать элементы клавишей enter и также листать в меню стрелочками вверх и вниз (к примеру как в меню собейта)
если есть то с какими элементами это можно реализовать и как (чтобы я мог включать выключать функции и также из вкладок переходить в другие)

срочно!!
 
Последнее редактирование:

- |2347| -

Известный
406
195
код:
local imgui = require 'mimgui'
local items = {"Opt A","Opt B","Submenu","Exit"}
local sel = 0
local optA = false
local optB = false
local new = imgui.new
local WinState = new.bool(true)
local VK_UP, VK_DOWN, VK_ENTER = 0x26, 0x28, 0x0D

imgui.OnFrame(function() return WinState[0] end, function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(500,500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(245, 270), imgui.Cond.Always)
    imgui.Begin('##Window', WinState, imgui.WindowFlags.NoResize)

    if isKeyJustPressed(VK_DOWN) then sel=(sel+1)%#items end
    if isKeyJustPressed(VK_UP) then sel=(sel-1+#items)%#items end

    for i=0,#items-1 do
      if i==sel then
        imgui.TextColored(imgui.ImVec4(1.0,1.0,0.0,1.0), (items[i+1]))
      else
        imgui.Text(items[i+1])
      end
    end

    if isKeyJustPressed(VK_ENTER) then
      if sel==0 then optA = not optA
      elseif sel==1 then optB = not optB
      elseif sel==2 then print("Submenu!")
      else WinState[0] = false end
    end

    imgui.Separator()
    imgui.Text(string.format("A: %s",optA and "ON" or "OFF"))
    imgui.Text(string.format("B: %s",optB and "ON" or "OFF"))
    imgui.End()
end)
 
  • Нравится
Реакции: fleetxn

fleetxn

Новичок
Автор темы
5
1
код:
local imgui = require 'mimgui'
local items = {"Opt A","Opt B","Submenu","Exit"}
local sel = 0
local optA = false
local optB = false
local new = imgui.new
local WinState = new.bool(true)
local VK_UP, VK_DOWN, VK_ENTER = 0x26, 0x28, 0x0D

imgui.OnFrame(function() return WinState[0] end, function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(500,500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(245, 270), imgui.Cond.Always)
    imgui.Begin('##Window', WinState, imgui.WindowFlags.NoResize)

    if isKeyJustPressed(VK_DOWN) then sel=(sel+1)%#items end
    if isKeyJustPressed(VK_UP) then sel=(sel-1+#items)%#items end

    for i=0,#items-1 do
      if i==sel then
        imgui.TextColored(imgui.ImVec4(1.0,1.0,0.0,1.0), (items[i+1]))
      else
        imgui.Text(items[i+1])
      end
    end

    if isKeyJustPressed(VK_ENTER) then
      if sel==0 then optA = not optA
      elseif sel==1 then optB = not optB
      elseif sel==2 then print("Submenu!")
      else WinState[0] = false end
    end

    imgui.Separator()
    imgui.Text(string.format("A: %s",optA and "ON" or "OFF"))
    imgui.Text(string.format("B: %s",optB and "ON" or "OFF"))
    imgui.End()
end)
а как можно сделать через imgui.Selectable() и + переход на следующую вкладку чтоб другой лист выводился
 

XRLM

Против ветра рождённый
Модератор
1,639
1,301
код:
local imgui = require 'mimgui'
local items = {"Opt A","Opt B","Submenu","Exit"}
local sel = 0
local optA = false
local optB = false
local new = imgui.new
local WinState = new.bool(true)
local VK_UP, VK_DOWN, VK_ENTER = 0x26, 0x28, 0x0D

imgui.OnFrame(function() return WinState[0] end, function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(500,500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(245, 270), imgui.Cond.Always)
    imgui.Begin('##Window', WinState, imgui.WindowFlags.NoResize)

    if isKeyJustPressed(VK_DOWN) then sel=(sel+1)%#items end
    if isKeyJustPressed(VK_UP) then sel=(sel-1+#items)%#items end

    for i=0,#items-1 do
      if i==sel then
        imgui.TextColored(imgui.ImVec4(1.0,1.0,0.0,1.0), (items[i+1]))
      else
        imgui.Text(items[i+1])
      end
    end

    if isKeyJustPressed(VK_ENTER) then
      if sel==0 then optA = not optA
      elseif sel==1 then optB = not optB
      elseif sel==2 then print("Submenu!")
      else WinState[0] = false end
    end

    imgui.Separator()
    imgui.Text(string.format("A: %s",optA and "ON" or "OFF"))
    imgui.Text(string.format("B: %s",optB and "ON" or "OFF"))
    imgui.End()
end)
нахуя использовать опкоды муна во фрейме имгуи, когда есть те же самые методы имгуи
imgui.IsKeyPressed
imgui.IsKeyDown
imgui.IsKeyReleased
 
  • Нравится
Реакции: - |2347| -

Орк

Известный
432
370
У mimgui есть NavInputs вот пример работы
Анимация4.gif

Lua:
require 'lib.moonloader'

local imgui = require 'mimgui'
local ffi = require 'ffi'
local vkeys = require 'vkeys'
local bit = require 'bit'
local wm = require 'windows.message'
local encoding = require 'encoding'

encoding.default = 'CP1251'
local u8 = encoding.UTF8

local new, str, sizeof = imgui.new, ffi.string, ffi.sizeof

local renderWindow, freezePlayer, removeCursor = new.bool(), new.bool(), new.bool()
local inputField = new.char[256]()
local sizeX, sizeY = getScreenResolution()

local function isDown(vk) return isKeyDown(vk) end

local function setNav(io, nav, down)
  io.NavInputs[nav] = down and 1.0 or 0.0
end

local function clearNav(io)
  for i = 0, imgui.NavInput.COUNT - 1 do
    io.NavInputs[i] = 0.0
  end
end

imgui.OnInitialize(function()
  local io = imgui.GetIO()
  io.IniFilename = nil

  -- Включаем навигацию с клавиатуры (важно)
  io.ConfigFlags = bit.bor(io.ConfigFlags, imgui.ConfigFlags.NavEnableKeyboard)
end)

local frame = imgui.OnFrame(
  function() return renderWindow[0] end,

  -- BEFORE FRAME: тут задаём NavInputs (каждый кадр!)
  function()
    local io = imgui.GetIO()

    -- NavInputs очищаются после кадра, поэтому выставляем заново каждый раз
    clearNav(io)

    -- Навигацию “включаем” только когда курсор скрыт
    if removeCursor[0] then
      setNav(io, imgui.NavInput.DpadUp,    isDown(vkeys.VK_UP))
      setNav(io, imgui.NavInput.DpadDown,  isDown(vkeys.VK_DOWN))
      setNav(io, imgui.NavInput.DpadLeft,  isDown(vkeys.VK_LEFT))
      setNav(io, imgui.NavInput.DpadRight, isDown(vkeys.VK_RIGHT))

      local tab = isDown(vkeys.VK_TAB)
      local shift = isDown(vkeys.VK_SHIFT)
      setNav(io, imgui.NavInput.FocusNext, tab and not shift)
      setNav(io, imgui.NavInput.FocusPrev, tab and shift)

      setNav(io, imgui.NavInput.Activate, isDown(vkeys.VK_RETURN)) -- Enter
      setNav(io, imgui.NavInput.Cancel,   isDown(vkeys.VK_ESCAPE)) -- Esc
    end
  end,

  -- DRAW
  function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(480, 230), imgui.Cond.FirstUseEver)

    imgui.Begin("Main Window", renderWindow)

    imgui.Text("Подсказка: включи 'Скрыть курсор' и ходи по UI стрелками/Tab, Enter, Esc")

    if imgui.InputText("Привет", inputField, sizeof(inputField)) then
      print(u8:decode(str(inputField)))
    end

    if imgui.Button("Очистить поле") then
      imgui.StrCopy(inputField, '')
    end

    if imgui.Checkbox('Заморозить игрока', freezePlayer) then
      player.LockPlayer = freezePlayer[0]
    end

    if imgui.Checkbox('Скрыть курсор', removeCursor) then
      player.HideCursor = removeCursor[0]
      if removeCursor[0] then
        -- чтобы сразу было удобно: фокус на первый следующий элемент
        imgui.SetKeyboardFocusHere()
      end
    end

    if player.HideCursor then
      imgui.Text('Курсор скрыт')
    end

    imgui.End()
  end
)

function main()
  addEventHandler('onWindowMessage', function(msg, wparam, lparam)
    if msg == wm.WM_KEYDOWN or msg == wm.WM_SYSKEYDOWN then
      if wparam == vkeys.VK_X then
        renderWindow[0] = not renderWindow[0]
      end
    end
  end)
  wait(-1)
end
 
  • Нравится
Реакции: XRLM, fleetxn и - |2347| -

fleetxn

Новичок
Автор темы
5
1
У mimgui есть NavInputs вот пример работы
Посмотреть вложение 287499
Lua:
require 'lib.moonloader'

local imgui = require 'mimgui'
local ffi = require 'ffi'
local vkeys = require 'vkeys'
local bit = require 'bit'
local wm = require 'windows.message'
local encoding = require 'encoding'

encoding.default = 'CP1251'
local u8 = encoding.UTF8

local new, str, sizeof = imgui.new, ffi.string, ffi.sizeof

local renderWindow, freezePlayer, removeCursor = new.bool(), new.bool(), new.bool()
local inputField = new.char[256]()
local sizeX, sizeY = getScreenResolution()

local function isDown(vk) return isKeyDown(vk) end

local function setNav(io, nav, down)
  io.NavInputs[nav] = down and 1.0 or 0.0
end

local function clearNav(io)
  for i = 0, imgui.NavInput.COUNT - 1 do
    io.NavInputs[i] = 0.0
  end
end

imgui.OnInitialize(function()
  local io = imgui.GetIO()
  io.IniFilename = nil

  -- Включаем навигацию с клавиатуры (важно)
  io.ConfigFlags = bit.bor(io.ConfigFlags, imgui.ConfigFlags.NavEnableKeyboard)
end)

local frame = imgui.OnFrame(
  function() return renderWindow[0] end,

  -- BEFORE FRAME: тут задаём NavInputs (каждый кадр!)
  function()
    local io = imgui.GetIO()

    -- NavInputs очищаются после кадра, поэтому выставляем заново каждый раз
    clearNav(io)

    -- Навигацию “включаем” только когда курсор скрыт
    if removeCursor[0] then
      setNav(io, imgui.NavInput.DpadUp,    isDown(vkeys.VK_UP))
      setNav(io, imgui.NavInput.DpadDown,  isDown(vkeys.VK_DOWN))
      setNav(io, imgui.NavInput.DpadLeft,  isDown(vkeys.VK_LEFT))
      setNav(io, imgui.NavInput.DpadRight, isDown(vkeys.VK_RIGHT))

      local tab = isDown(vkeys.VK_TAB)
      local shift = isDown(vkeys.VK_SHIFT)
      setNav(io, imgui.NavInput.FocusNext, tab and not shift)
      setNav(io, imgui.NavInput.FocusPrev, tab and shift)

      setNav(io, imgui.NavInput.Activate, isDown(vkeys.VK_RETURN)) -- Enter
      setNav(io, imgui.NavInput.Cancel,   isDown(vkeys.VK_ESCAPE)) -- Esc
    end
  end,

  -- DRAW
  function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(480, 230), imgui.Cond.FirstUseEver)

    imgui.Begin("Main Window", renderWindow)

    imgui.Text("Подсказка: включи 'Скрыть курсор' и ходи по UI стрелками/Tab, Enter, Esc")

    if imgui.InputText("Привет", inputField, sizeof(inputField)) then
      print(u8:decode(str(inputField)))
    end

    if imgui.Button("Очистить поле") then
      imgui.StrCopy(inputField, '')
    end

    if imgui.Checkbox('Заморозить игрока', freezePlayer) then
      player.LockPlayer = freezePlayer[0]
    end

    if imgui.Checkbox('Скрыть курсор', removeCursor) then
      player.HideCursor = removeCursor[0]
      if removeCursor[0] then
        -- чтобы сразу было удобно: фокус на первый следующий элемент
        imgui.SetKeyboardFocusHere()
      end
    end

    if player.HideCursor then
      imgui.Text('Курсор скрыт')
    end

    imgui.End()
  end
)

function main()
  addEventHandler('onWindowMessage', function(msg, wparam, lparam)
    if msg == wm.WM_KEYDOWN or msg == wm.WM_SYSKEYDOWN then
      if wparam == vkeys.VK_X then
        renderWindow[0] = not renderWindow[0]
      end
    end
  end)
  wait(-1)
end
вариант прикольный, но почему то не могу использовать ентер, ток пробелом включается выключается

а как можно сделать через imgui.Selectable() и + переход на следующую вкладку чтоб другой лист выводился
и все же первый вариант более подходит, но нужно как то вот сделать