SDL中文论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2727|回复: 2
打印 上一主题 下一主题

[Studio] studio代码注释

[复制链接]

187

主题

346

帖子

2450

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2450
跳转到指定楼层
楼主
发表于 2017-3-11 21:19:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ancientcc 于 2017-3-11 21:30 编辑

tchild、restore_map_from

  1. struct tchild {
  2.         unit* window;
  3.         std::vector<unit*> rows;
  4.         std::vector<unit*> cols;
  5.         std::vector<unit*> units;
  6. };
复制代码
rows。网格中各行的配置。
cols。网格中各列的配置。
units。网格中各单元的配置。各单元在units中存储是“Z”序。

功能:在大地图画出child指定的网格。
  1. void unit_map::restore_map_from(const unit::tchild& child, const int xstart, const int ystart, bool create)
复制代码

child此次要加载的网格
xstart、ystart此个网格要加载到的、开始的单元坐标
create是否要把从child解析出的单元写入map_、coor_map_。什么时候用true?内容发生变动,像把占位控件变成列表,于是根网格已被从大地图抽出,用它在大地图重画根网格


它会修改child中window的cover_width、cover_height字段。
  1. struct tcell_setting {
  2. struct {
  3.         int cover_width;
  4.         int cover_height;
  5. } window;
  6. };
复制代码
这两个字段指示要在地图画出此个网格须要的矩形尺寸,单位是栅格。图中第一个3x1网格,它当中有格子含有孩子,它的cover_width=4、cover_height=7 。第二个1x3网格,当中没有格子含有孩子,它的cover_width=4、cover_height=2 。

在恢复时,垂直、水平都有个serial_gap,这个值固定是1。cover_width、cover_height不包含最右、最上那个serial_gap。

  1. class unit {
  2.         std::vector<tchild> children_;
  3. };
复制代码
children_是该unit中有子孩子。在图中,一个孩子对应一个网格。tgrid时,children_长度1;listbox时,长度2。

回复

使用道具 举报

187

主题

346

帖子

2450

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2450
沙发
 楼主| 发表于 2017-11-1 20:35:44 | 只看该作者

预览

本帖最后由 ancientcc 于 2017-11-1 21:19 编辑

通过预览,可以看到整窗口布局,但看不到和实际布局一样的控件尺寸。和实际布局最大区别是,对不可扩展控件,它的标称尺寸都是(preview_widget_best_width, preview_widget_best_height)。也就是说,实际布局时标称高度是1像素的图像,在预览图中也是preview_widget_best_height。
布局规则
  • 顶层是一个tchild,当内中的某个控件是可扩展时,扩展该控件(一定含有tchild)。何样的控件被认为是可扩展的?——panel、scroll_panel、grid,即u.is_extensible()返回true。基于此,栈层控件被认为只是一个“控件”,也不能扩展出列表行、树形节点。
  • 布局某个tchild时,按照网式布局规则算出row_height、col_width、row_grow_factor、col_grow_factor。所有控件的标称尺寸是(preview_widget_best_width, preview_widget_best_height),然后按照网式布局的规则会进行拉伸。
  • 窗口的容许尺寸是(640*hdpi_scale, 480*hdpi_scale)。
回复 支持 反对

使用道具 举报

187

主题

346

帖子

2450

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2450
板凳
 楼主| 发表于 2019-10-23 22:04:18 | 只看该作者

导出app时,studio随机非法退出

导出app包过程中,复制完文件后进入编译*.bin,会随机出现非法退出。经验看这非法有以下几个特点。1)这非法出现在Main Thread线程,而不是在编译*.bin的SignalThread。2)似乎总是和t_string有关。下图是一个例子,是在t_string::~t_string中。

对应此时的SignalThread状态。

分析原因。我初步怀疑是language_counter值发生改变造成的。在进入编译*.bin前,studio会调用teditor_::reload_extendable_cfg(),后者会调用t_string::reset_translations(),从而把language_counter。同于加1后,t_string_base::str()值就要被重新计算了,t_string_base::str()返回的又是“const std::string&”,如果有代码不慎把把这返回值存成指针,那就会发生错误。

以上只是猜测,于是暂时修改方法是在teditor_::reload_extendable_cfg()不调用t_string::reset_translations(),让导出app的整个过程中language_counter不会发生变化。看今后导出app是否还有导常,再判断这想法是不是对的。

——如果真是这原因造成,那调用t_string::reset_translations()时机得特别留意了,一定要等到app中已没有窗口,窗口中变量太多,没法确定language_counter变动是否会给自已造成问题。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|丽谷软件|libsdl.cn

GMT+8, 2024-5-20 05:39 , Processed in 0.050390 second(s), 21 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表