daidaishu 发表于 2023-8-17 11:31:36

Mutlet UI中文换行bug(已解决)

本帖最后由 daidaishu 于 2023-8-23 07:57 PM 编辑

环境:Win10

问题描述:

如下图所示,我在右上角创建了一个MiniConsole,并在其中显示“【谣言】”相关的信息,
并设置了30个字符自动换行,当字符长度超过30个时,会在空格处换行,而不是第30个字
符的位置。




解决方案:

取消自动换行,自己写一个函数,在字符串达到指定宽度时调用函数插入一个换行符。

效果:


完整代码:
-- 顶边UI
local function creatUI_top()
-- 创建顶边UI容器
topContainer = topContainer or Geyser.Container:new({
    name = "topContainer",
    x = "0",y = "0",
    width = "100%",
    height = "100",
})
-- 创建聊天信息显示迷你控制台
chatConsole = chatConsole or Geyser.MiniConsole:new({
    name = "chatConsole",
    x = "0",y = "0",
    width = "50%",
    height = "100%",
    fontSize = 10,
    scrollBar = false,
    wrap = 30
}, topContainer)
-- 创建系统信息显示迷你控制台
systemConsole = systemConsole or Geyser.MiniConsole:new({
    name = "systemConsole",
    x = "50%", y = "0",
    width = "50%",
    height = "100%",
    fontSize = 10,
    scrollBar = false,
}, topContainer)
end

-- 右边UI
local function creatUI_right()
-- 创建右边UI容器
rightContainer = rightContainer or Geyser.Container:new({
    name = "topContainer",
    x = "-500",y = "100",
    width = "500",
    height = "500",
})
-- 创建地图
myMap = Geyser.Mapper:new({
name = "myMap",
x = 0, y = 0,
width = "100%",
height = "100%"
},rightContainer)
end

-- 自动换行函数
local function processCopy2decho(text,windowWidth)
local processedText = ""
local accumulatedWidth = 0
local colorFlag = 1
for char in text:gmatch(utf8.charpattern) do
    if char == "<" then
      colorFlag= 0
    elseif char == ">" then
      colorFlag = 1
    elseif colorFlag == 1 then
      local charWidth = utf8.width(char, true)
      accumulatedWidth = accumulatedWidth + charWidth
      if accumulatedWidth > windowWidth then
      processedText = processedText .. "\n"
      accumulatedWidth = charWidth
      end
    end
    processedText = processedText .. char
end
return processedText.."\n"
end

-- 聊天信息Trigger
function chatTrigger()
if chatConsole then
    selectCurrentLine()
    chatConsole:decho(processCopy2decho(copy2decho(),96))
    deleteLine()
end
end
-- 系统信息Trigger
function systemTrigger()
if systemConsole then
    selectCurrentLine()
    systemConsole:decho(processCopy2decho(copy2decho(),96))
    deleteLine()
end
end

-- 初始化
creatUI_top()
creatUI_right()

--聊天信息分类
if(exists("聊天信息分类","trigger") == 0) then
permRegexTrigger("聊天信息分类", "Pkuxkx_gui", {
    [[^【(闲聊|北侠QQ群|求助)】.*$]]
    --此行可继续增加,注意在上一行末尾加上逗号
}, [])
end
--系统信息分类
if(exists("系统信息分类","trigger") == 0) then
permRegexTrigger("系统信息分类", "Pkuxkx_gui", {
    [[^【(谣言|江湖|交易)】.*$]]
    --此行可继续增加,注意在上一行末尾加上逗号
}, [])
end



dtp 发表于 2023-8-17 11:56:20

你把 word wrap 关掉试试。找找有没有类似的设置。

sulryn 发表于 2023-8-19 17:17:35

这个应该是Mudlet本身程序的问题,粗略看了一下GitHub,icer两年多以前提过关于换行的问题,然后去年下半年,有港台人修复了这个问题,但是提供的代码有Bug所以去年年底回滚了。所以我猜目前可能没有解决办法,只能等有人更新

sulryn 发表于 2023-8-19 18:00:32

这个问题的原理大概是icer在那个issue里提到的。为了保证英语词语不断在一半,mudlet是自己找空格来换行的,北侠的消息冒号后面有个空格,所以会换行。
页: [1]
查看完整版本: Mutlet UI中文换行bug(已解决)