GUI

树形控件

tree_node中的label改变值后,是不会触发重布局窗口、

 

一、如何处理树形中的tlabel运行时改变值

树形由一个个ttree_node组成,这问题也就等价于,运行时,当某个ttree_node中的tlabel变换值后,要如何处理。

对处理有个基本要求:不要让触发重布局窗口。为什么?——对树形,某个tree_node中的tlable太长,显示上越界了,那也认为是极个别情况,看不到超出部分,不影响整体。在studio布局窗口时,已对树形控件预留了可以美观的渲染尺寸。

如何保证不触发重布局窗口。改变tlabel值对应的是tlabel::set_label,内中涉及到两处保证。

  1. tlabel总是在一个tgrid中(ttree_node派生于ttoggle_panel)。在tgrid,如果水平对齐是edge_align,那conside_width总是false,即如果高度上又没有触发条件,那返回值require_invalidate_layout总是false,这个值不会触发重布局窗口。
  2. 即使(1)的require_invalidate_layout=true,因为tlabel在树形中,它触发时,调用的也是ttree::invalidate_layout,不会到twindow层。

因为第二点,可以确定tree_node中的label改变值后,是不会触发重布局窗口、

这里首先要确定,tlabel的对齐要设为何值?还在犹豫,这涉及到个潜在问题。以下tgrid::place中的tgrid是task2,right_tree中minor_keys对应的tree_node。

  1. tgrid::place(, size:(1050, 64))。这是label_="123456789123"拼音时的size。值改为"1234567891231"后,即后面加了一个"1",正确的话,size应该是size:(1100, 64)了,可出错时,依旧是(1050, 64),致使因为渲染尺寸小于标称尺寸,tgrid::place抛出tlayout_exception异常。
  2. tcontainer: (1074, 64),这个多出来的24应该是left_space
  3. ttree_node: (1074, 64)
  4. ttree::tgrid2: (1074, 2880)
  5. (right_tree)tscroll_container:place((), (819, 779))。可认为这里给出的(819, 779)是视区尺寸。它要先调用tpoint content_grid_size = mini_calculate_content_grid_size(content_origin, content_size),计算出right_tree的内容尺寸content_size,这个尺寸便是(1074, 2880)。

因为视区是内容的部分显示,视区尺寸可以小于内容尺寸。也就实现了虽然内容是(1074, 2880),但可放进比它小的(819.779)。

回到为何minor_keys改为"1234567891231"后,tgrid::place给的size依旧是(1050, 64),而不是(1100, 64)。原因是改变值后,mini_calculate_content_grid_size得到内容尺寸依旧是(1074, 2880)。要解决这问题,一种快快解决办法是“gc_current_content_width_ = nposm”,要求后绪mini_calculate_content_grid_size()一定调用mini_handle_gc重计算。

目前做法是基于两点。

  1. tree_node中的tlabel,水平对齐不能是edge_align。即很容易调用后绪的ttree::invalidate_layout。
  2. 在ttree::invalidate_layout,执行两步,一是“gc_current_content_width_ = nposm”,二是tscroll_container::invalidate_layout(widget)。

由于以上2)操作,一旦tlabel变子,那很浪费资源。这需要后绪做进一步修改。

全部评论: 0

    写评论: