local FORMAS = { 10, 5, 2, 1 } -- 31-oct: medidas por modo (OtmmoHud, corelib/ui/hudmodo.lua). En COMPACTO la casilla baja a 40 (el icono de 32 se ve -- a su tamaño real, con 4 px de marco) y el título «Barra N» se cambia por un asa fina sin texto. local MEDIDAS = { normal = { celda = 46, relleno = 6, asa = 22, margen = 4 }, compacto = { celda = 40, relleno = 4, asa = 14, margen = 4 }, } local HUECO = 4 -- entre las dos barras (apiladas o lado a lado) local ABAJO = 8 -- del borde de abajo de la pantalla local function medidas() return MEDIDAS[OtmmoHud and OtmmoHud.modo == 'compacto' and 'compacto' or 'normal'] end local function compacto() return OtmmoHud and OtmmoHud.modo == 'compacto' end -- Barra 2 en COMPACTO: plegada salvo que el jugador la despliegue con el botón «2» de la barra 1 (se recuerda). function barra2Desplegada() return g_settings.getBoolean('otmmo-barra2-compacto', false) end local function hostVisible(i, bar) if not bar:isExplicitlyVisible() then return false end if i == 2 and compacto() and not barra2Desplegada() then return false end return true end local function movida(host) return host and host.movida end -- Sitio por defecto de cada barra, con anclas (siguen a la ventana al redimensionar). Si el jugador la arrastró, manda -- su posición guardada (OtmmoVentanas la vuelve a meter dentro si ya no cabe). local function anclar(i) local bar = actionBars[i] local host = bar and bar.otmmoHost if not host or host:isDestroyed() or movida(host) then return end host:breakAnchors() host:setMargin(0) local ancha = OtmmoHud and OtmmoHud.ancha local h1 = actionBars[1] and actionBars[1].otmmoHost if i == 1 then host:addAnchor(AnchorBottom, 'parent', AnchorBottom) host:setMarginBottom(ABAJO) local b2 = actionBars[2] if ancha and b2 and hostVisible(2, b2) then host:addAnchor(AnchorRight, 'parent', AnchorHorizontalCenter) host:setMarginRight(HUECO / 2) else host:addAnchor(AnchorHorizontalCenter, 'parent', AnchorHorizontalCenter) host:setMarginRight(0) end elseif ancha then host:addAnchor(AnchorBottom, 'parent', AnchorBottom) host:addAnchor(AnchorLeft, 'parent', AnchorHorizontalCenter) host:setMarginBottom(ABAJO) host:setMarginLeft(HUECO / 2) elseif h1 and not movida(h1) then host:addAnchor(AnchorBottom, 'barraFlotante1', AnchorTop) host:addAnchor(AnchorHorizontalCenter, 'barraFlotante1', AnchorHorizontalCenter) host:setMarginBottom(HUECO) else -- la barra 1 está donde la dejó el jugador: la 2 se queda en su sitio de siempre, sobre el borde de abajo host:addAnchor(AnchorBottom, 'parent', AnchorBottom) host:addAnchor(AnchorHorizontalCenter, 'parent', AnchorHorizontalCenter) host:setMarginBottom(ABAJO + host:getHeight() + HUECO) end end function colocarFlotante(bar) local host = bar.otmmoHost if not host or host:isDestroyed() then return end local m = medidas() local cols = bar.otmmoColumnas or 10 local rows = math.ceil(10 / cols) local width, height = math.max(110, cols * m.celda + 2 * m.margen), rows * m.celda + m.asa + m.margen host:resize(width, height) bar:breakAnchors() bar:addAnchor(AnchorTop, 'parent', AnchorTop) bar:addAnchor(AnchorLeft, 'parent', AnchorLeft) bar:setMarginTop(m.asa) bar:setMarginLeft(m.margen) bar:resize(cols * m.celda, rows * m.celda) local tab = bar.tabBar tab:breakAnchors() tab:setMargin(0) tab:addAnchor(AnchorTop, 'parent', AnchorTop) tab:addAnchor(AnchorLeft, 'parent', AnchorLeft) tab:resize(cols * m.celda, rows * m.celda) if not bar.otmmoGrid then bar.otmmoGrid = UIGridLayout.create(tab) tab:setLayout(bar.otmmoGrid) end bar.otmmoGrid:setCellSize({ width = m.celda, height = m.celda }) bar.otmmoGrid:setNumColumns(cols) for i, button in ipairs(tab:getChildren()) do button:setVisible(i <= 10) if button.item then button.item:setPadding(m.relleno) end end bar.prevPanel:hide() bar.nextPanel:hide() -- asa: «Barra N» en NORMAL; en COMPACTO una franja fina sin texto (se sigue arrastrando, con su tooltip) if host.asa then host.asa:setHeight(m.asa - 2) host.asa:setText(compacto() and '' or ('Barra ' .. (bar.otmmoIndice or ''))) host.forma:setHeight(m.asa - 2) host.forma:setVisible(not compacto()) if host.plegar then host.plegar:setHeight(m.asa - 2) host.plegar:setVisible(compacto() and segundaBarraVisible and segundaBarraVisible() or false) host.plegar:setText(barra2Desplegada() and '- Barra 2' or '+ Barra 2') end end if movida(host) then host:bindRectToParent() end end -- Coloca las dos barras según el modo y avisa a los vitales (van encima de la pila). function distribuirBarras() for i = 1, 2 do local bar = actionBars[i] if bar and bar.otmmoHost and not bar.otmmoHost:isDestroyed() then colocarFlotante(bar) bar.otmmoHost:setVisible(hostVisible(i, bar)) end end anclar(1) anclar(2) if modules.game_vitals and modules.game_vitals.acomodar then modules.game_vitals.acomodar() end end function alternarBarra2Compacta() g_settings.set('otmmo-barra2-compacto', not barra2Desplegada()) distribuirBarras() end function instalarFlotantes() local root = modules.game_interface.getRootPanel() for i = 1, 2 do local bar = actionBars[i] if bar and not bar.otmmoHost then local host = g_ui.createWidget('Panel', root) host:setId('barraFlotante' .. i) host:setBackgroundColor(OtmmoTheme.color.bg2) host:setBorderWidth(1) host:setBorderColor(OtmmoTheme.color.border) local handle = g_ui.createWidget('UIButton', host) handle:setText('Barra ' .. i) handle:setHeight(22) handle:addAnchor(AnchorTop, 'parent', AnchorTop) handle:addAnchor(AnchorLeft, 'parent', AnchorLeft) handle:addAnchor(AnchorRight, 'parent', AnchorRight) handle:setMarginRight(28) handle:setTooltip('Arrastra para mover la barra') local shape = g_ui.createWidget('UIButton', host) shape:setText('#') shape:setSize({ width = 24, height = 22 }) shape:addAnchor(AnchorTop, 'parent', AnchorTop) shape:addAnchor(AnchorRight, 'parent', AnchorRight) shape:setTooltip('Cambiar forma: fila, dos filas, cinco filas, columna') host.asa, host.forma = handle, shape if i == 1 then -- COMPACTO: botón para desplegar o plegar la barra 2 (en NORMAL va oculto; ahí se usa «Más») local plegar = g_ui.createWidget('GameIconButton', host) plegar:setId('plegarBarra2') plegar:setSize({ width = 64, height = 12 }) plegar:addAnchor(AnchorTop, 'parent', AnchorTop) plegar:addAnchor(AnchorRight, 'parent', AnchorRight) plegar:setMarginTop(1) plegar:setMarginRight(3) plegar:setColor(OtmmoTheme.color.text2) pcall(function() plegar:setTTFFont(OtmmoTheme.font.num, OtmmoTheme.size.xs) end) plegar:setTooltip('Mostrar u ocultar la barra 2') plegar:hide() plegar.onClick = alternarBarra2Compacta host.plegar = plegar end bar.otmmoHost = host bar.otmmoIndice = i bar.otmmoColumnas = tonumber(g_settings.getString('otmmo-barra-forma-' .. i)) or 10 if not table.find(FORMAS, bar.otmmoColumnas) then bar.otmmoColumnas = 10 end -- explícita, no efectiva: con el panel del juego oculto (salir) isVisible() da false aunque la barra siga encendida bar:setParent(host) colocarFlotante(bar) OtmmoVentanas.moverCon(host, handle, 'barra-' .. i) local index = i shape.onClick = function() if OtmmoVentanas.bloqueada() then return end local n = table.find(FORMAS, bar.otmmoColumnas) or 1 bar.otmmoColumnas = FORMAS[n % #FORMAS + 1] g_settings.set('otmmo-barra-forma-' .. index, bar.otmmoColumnas) colocarFlotante(bar) if movida(host) then OtmmoVentanas.guardar(host) end distribuirBarras() end connect(bar, { -- OJO: onVisibilityChange tambien llega cuando se oculta un ANTECESOR (al salir, gameRootPanel:hide()) con v=false. -- Copiar ese v dejaba el host oculto para siempre (al reentrar nadie lo volvia a mostrar). Se copia la -- visibilidad EXPLICITA de la barra, que no cambia por lo que le pase a sus padres. onVisibilityChange = function() if host:isDestroyed() then return end host:setVisible(hostVisible(index, bar)) anclar(1) -- con la barra 2 oculta, la 1 vuelve al centro en el modo ancho if modules.game_vitals and modules.game_vitals.acomodar then modules.game_vitals.acomodar() end end, onDestroy = function() if not host:isDestroyed() then host:destroy() end end, }) -- arrastrar una barra la saca de la pila: los vitales dejan de ir sobre ella connect(handle, { onDragLeave = function() if modules.game_vitals and modules.game_vitals.acomodar then modules.game_vitals.acomodar() end end }) elseif bar then colocarFlotante(bar) end end OtmmoHud.alCambiar('barras', distribuirBarras) end