Mudlet: 间歇泉窗口放置错误

创建于 2018-10-23  ·  26评论  ·  资料来源: Mudlet/Mudlet

问题摘要/请求的功能描述:

讲故事的时间。 我回到Mudlet,发现几个月前写的UI中有一个奇怪之处。 该代码创建了一系列具有父子关系的Geyser标签和miniConsole,它们都汇总到一个Geyser容器中。 但是,当系统初始化并创建此UI时,某些元素将被替换。 每次使用相同的元素,总是以相同的可疑的偶数(例如,容器宽度的50%和其高度的10%)相同,这些数量在附近的代码中用作约束。 奇怪的是,尽管明显错位,但Mudlet似乎并不相信这些元素就是我眼中所说的。 通过对项目的x&y属性检查间歇泉约束,可以说元素位于其适当的位置。 在元素上调用:flash()会导致闪烁,该闪烁与调用该方法的可见元素不同。 更奇怪的是,我可以用以下代码行解决所有问题:

parentContainer:move(parentContainer.x, parentContainer.y)

...从字面上看只是将最上面的容器移到了应该已经存在的位置,这时突然所有未对齐的元素都会自行整理(但是创建元素后它不会立即起作用,我必须从命令行运行它或别名)。 解决该问题的另一种方法是调整Mudlet窗口的大小,此时所有内容都固定到位。

所有这些可能仍然是我编写的(甚至可能仍然是)一些令人恐惧的代码的权限,但是毕竟,我被gg的感觉困扰,因为几个月前我编写此UI时,它并没有受到影响通过此错误,因此我重新安装了以前版本的Mudlet,并加载了带有问题代码的配置文件以进行测试。 事实证明,此错误(在我的代码中100%可重现)仅在版本3.10.1之后存在(可能也在版本3.10.2之后),但我找不到该版本的Windows安装程序。 该错误(或行为已更改)是在3.10.1(有效)和3.11.0(无效)之间引入的。 我还验证了3.13.0和3.12.0也受此问题困扰。

我将尝试缩小有问题的代码段,并在此处提供,但是我没有时间了,必须改天处理。

bug high regression

最有用的评论

@ vadi2请求了一个非常简单的脚本来重现该错误,这里是:
bug-getMainWindowSize.zip

屏幕截图显示了print()调试:
2019-04-11_04-09

mapperContainer = Geyser.Container:new({x=-700,y=0,width=700,height="70%",name="mapperContainer"})

print('Before Geyser.Mapper:new: ' .. tostring(getMainWindowSize()))
mapper = Geyser.Mapper:new({name = "mapper", x = 0, y = 0, width = "100%", height = "100%"}, mapperContainer)
print('After Geyser.Mapper:new: ' .. tostring(getMainWindowSize()))

print('before 100ms tempTimer: ' .. tostring(getMainWindowSize()))
tempTimer(0.1, function()
    print('after 100ms tempTimer: ' .. tostring(getMainWindowSize()))
end)

所有26条评论

我认为问题可能在于getMainWindowSize()随Qt升级而中断,这可以解释我们没有接触Geyser内核很久但最近就中断(Qt版本更改)的症状。 看看该功能是否是您的罪魁祸首。

这是它的计算方式: https :

:+1:我不确定我目前是否可以使用我的RL来为这次讨论做出贡献,但是我可以感谢@basooza我认为这是一个建设性的问题报告-我有这样的感觉那里有很多相关的细节,这将特别有助于缩小首先显示该问题的版本的范围...

我只是想在测试后在这里添加一些信息。 当我第一次在Windows 8.1上启动Mudlet时,我的Windows位置不正确。 我可以运行lua display(getMainWindowSize()),它的确显示了错误的值。 为了解决这个问题,我取消了最大化窗口的操作,然后拖动右下角以调整窗口大小,然后将其放回最大化。

我还发现您可以切换“主工具栏”可见性,这也将解决此问题! 因此,似乎任何影响MainWindowSize的东西都足以解决此问题。 我想知道是否可以作为一种解决方法来快速隐藏/显示“主工具栏”的可见性或其他内容。 在解决QT问题之前,可能会修复该问题。

2019-03-17_23-29_1

2019-03-17_23-30

2019-03-17_23-31

搏一搏!

我有更多信息要提供。 而不是调整窗口大小。 您只需点击右上角Mudlet的关闭按钮,然后点击是即可保存个人资料。 在下一次启动时,将不会发生这种奇怪的放置。

因此,基本上每隔一次发布,您都会看到此问题。 我将不遗余力地提出这个新发现,并说可能不是QT负责任,否则为什么它不能在其他每次发射中都解决/正确。 我的猜测是,这与保存到配置文件中的内容有关,也许比较两种状态的配置文件数据会有所启发。

我要看看是否可以进一步调试它。

好吧,我还没有深入研究为什么会发生这种情况,但是通过继续使用Mudlet,我已经弄清楚了如何每次都复制它。 首先,似乎有很多事情可以触发此错误,它们似乎都与正确加载/保存配置文件的问题有关。 这就是我每次都能重现它的方式。

在Windows系统上,首先取消选中游戏->播放菜单“打开Mudlet开始时的配置文件”中的设置。 要进入菜单游戏->播放,请取消选中该框,然后点击连接。 概要文件打开后,您可以关闭Mudlet,保存概要文件,然后再次启动Mudlet。

此时,应配置Mudlet,使其不会自动启动配置文件。

现在是下一部分,如果您启动Mudlet,然后在“字符名称”字段中填写其他字符名称(例如ALT字符)。 并点击“连接”按钮。 您将看到窗口放置全部错误。 此时,修复该错误的最简单方法是关闭Mudlet,保存配置文件,然后重新启动Mudlet。 如果您登录相同的字符,则该错误将消失。

要重现该错误,您需要做的就是关闭Mudlet,然后再次输入一个不同的角色名称,然后回到不正确的窗口放置,重新启动及其固定位置。

我认为我在描述如何重现此错误方面做得很好,但是如果有人听不懂我说的话,我将很高兴制作一段视频来演示如何重现此错误。 请让我知道。

保存(对接:映射器/用户窗口/工具栏)窗口布局的代码是否会令人厌烦?

我一直有点不清楚它怎么可能保存布局数据时可能有多个配置文件加载(每个可能与对接映射器插件,用他们自己的工具栏,并与其他停靠的用户窗口),然后期望当一个这些概要文件中的概要文件将为所有要解释的数据重新加载,然后在加载第二个或更多其他概要文件时也要遵守...

... ...当然,所有这些窗口中的任何一个或全部都可以对接(?)到选项卡式停靠窗口中(有效地停靠在彼此的顶部),然后布局/存放代码由THAT组成?

@TheFae你知道吗?

我要补充一点,它只发生在Windows上,并且可以在Windows上轻松复制。 我从未见过这种情况在linux上发生,我不确定为什么linux对配置文件的方式感到满意,而Windows却不满意。 只要有空闲时间,我就会尽力解决这个问题,我的想法是比较发生错误的会话和没有发生错误的会话之间的配置文件数据,并寻找差异。 我只是还没有足够的时间去真正地研究这一方面。

我比较了配置文件保存的设置,并且在发生错误时在加载Mudlet之前和之后看起来没有什么不同,我想知道还有哪些其他文件可能是负责的,例如windowLayout.dat(如果这是一个xml文件,比较会很容易,哈哈) )

但是该文件是经过编码的,因此我不确定如何在@ vadi2之前/之后进行比较,您是否知道在发生错误时如何在加载之前/之后查看此文件的内容。 我真的很想追踪并修复此错误。

您知道@itsTheFae吗?

@xekon当用户窗口开始记住其位置时,该文件已添加到Mudlet 3.2中: https ://www.mudlet.org/2017/06/mudlet-3-2

是否要测试Mudlet 3.1和3.2中是否存在此问题?

在3.1中,我的配置文件也不会加载到我惯用的方式中,我认为当时的窗口放置方式有所不同。

但是,基于此报告的第一篇文章,他们提到了3.10.1并没有此问题。 我已经能够100%重现该错误,并且可以确认它不存在为3.10.1

我继续从以下位置进行向上测试:3.11、3.11.1、3.12,然后最终3.13向我显示了该错误。

因此,为了进一步测试,我决定尝试从3.12开始降级! 并且存在该错误,即使我从3.11逐步升级到3.12时也没有发生。

所以我进一步降级到3.11.1 bug仍然存在。

接下来的3.11,错误仍然存​​在。

接下来的3.10.1,并最终清除了该错误。


总结3.10.1似乎根本没有bug。

之后,您可以从3.10.1升级到3.11、3.11.1或3.12,而不会遇到该错误,但是一旦升级到3.13,您将遇到该错误。

遇到3.13或更高版本的错误之后,要完全清除该错误,唯一的方法是将其降级到3.10.1(3.11、3.11.1或3.12不会清除该错误,直到您首次降级到3.10。 1)


我的直觉是windowLayout.dat文件中的某些内容未正确保存。 (并且以某种方式这不会影响linux,但是会影响Windows。)

您可以尝试在升级3.10.1-3.13之间清除windowLayout.dat吗?

如果我清除windowLayout.dat文件,则该错误会立即以3.11-3.13的形式呈现。

似乎3.10.1是最后一个没有显示该错误的版本。

所以3.11是狡猾的版本。 https://www.mudlet.org/2018/07/mudlet-3-11-quality-improvements-all-around是否有适用于它和https://github.com/Mudlet/Mudlet/compare/Mudlet-的发行说明3rdparty/zziplib时,噪音很大)

100%确信可以与Mudlet-3.10.0一起使用吗? 那就是当我们从Qt 5.6更改为5.11时(直到今天仍在使用)。 可能是其中的罪魁祸首,而不是Mudlet代码中的罪魁祸首。 这是我最初在https://github.com/Mudlet/Mudlet/issues/2076#issuecomment -432114672中所怀疑的

是的3.10.1有零个问题。

我会同意它是Qt,只是该错误仅在更改用于访问配置文件的角色名称时每隔一次启动才会发生,这表明它与如何保存内容有关。这就是为什么我想深入了解存储在windowLayout.dat中的值

也可能是较新版本的Qt与较旧版本的Qt保存/加载值的方式有所不同,但是在任何一种情况下,我都需要一个起点来深入了解情况。 我需要能够检查正在使用的值与正在存储的值,并找出根本原因是什么。

我将不得不尝试在代码中查找所有出现的windowLayout.dat事件,看看是否能找到调试此错误的最佳方法:)(我有点想它何时将值保存到该文件中,还应将其存储在值转换为平面.txt或xml文件,以便我可以进入该目录并查看)

感谢Caled的不和,我发现此错误很可能与以下内容有关: https :

Caled还说:“此外,我的解决方法是创建映射器并在'sysLoadEvent'事件中添加到GUIframe。以防万一这些信息也有用”

此示例使用Jor'Mox GUIFrame,并且启用了映射器时,会出现错误:
bugged.zip

这是一个具有映射器的无错误示例:
bugfree.zip

这是gif,显示导入错误脚本后该错误的作用(您将在此配置文件的后续启动中看到我禁用了地图加载,这似乎可以防止该错误。):
bug_layout_map

这是一个gif,它显示了即使有mapper的bug脚本的正确功能:
bugfree_withmap

借助basooza,II可以正常工作,从而不会发生错误。 该错误似乎是由于在Mudlet完全加载之前与地图移动/交互而发生的,并且显然仅在某些条件下才发生,因为我上面确实有一个无错误的示例。

GUIFrame绘制所有Ui元素的方式使地图错误非常明显,但是如果您延迟与地图的交互直到完全加载Mudlet,就不会发生。

还! 此错误仅发生在Windows上,这意味着Linux足够聪明或自然可以更快地加载,因此与地图进行交互不是问题。 但是,在Windows上,您需要延迟与地图的交互或移动地图大约100毫秒,以避免该错误。

在这里,我想到了@basooza的解决方案:
bugfix_final.zip

您将在下面的屏幕快照中注意到的另一件事是我print()getMainWindowSize()的结果,您可以看到该错误仍然存​​在,但是使用至少100ms的tempTimer可以解决该问题:
bugfix_finals

也要补充一点.....仅仅拥有tempTimer是不够的,因为我尝试的时间为0.01,那还不够(10毫秒),但0.1足够了(100毫秒)

@ vadi2请求了一个非常简单的脚本来重现该错误,这里是:
bug-getMainWindowSize.zip

屏幕截图显示了print()调试:
2019-04-11_04-09

mapperContainer = Geyser.Container:new({x=-700,y=0,width=700,height="70%",name="mapperContainer"})

print('Before Geyser.Mapper:new: ' .. tostring(getMainWindowSize()))
mapper = Geyser.Mapper:new({name = "mapper", x = 0, y = 0, width = "100%", height = "100%"}, mapperContainer)
print('After Geyser.Mapper:new: ' .. tostring(getMainWindowSize()))

print('before 100ms tempTimer: ' .. tostring(getMainWindowSize()))
tempTimer(0.1, function()
    print('after 100ms tempTimer: ' .. tostring(getMainWindowSize()))
end)

解决此问题。 似乎左侧/右侧工具栏是方便按钮通常会以某种方式获得宽度的地方-这就是为什么此处将其缩小的原因。

@basooza @xekon,请测试https://github.com/Mudlet/Mudlet/pull/2945是否可以解决您在此处描述的问题。 谢谢!

此页面是否有帮助?
0 / 5 - 0 等级