2011-02-21

用 TreeCtrl 做 menu widget

Tile 中沒有 menu,Tk 的 menu 又太"老氣",只好自己打造了。左邊是 Tile menubutton + Tk menu,右邊是 Tile label + TreeCtrl。做法是建立一個 toplevel,裡面放 tree,然後 bind 一堆 event 追蹤... 有時間再寫成 package 用起來會比較方便。
以下是大概的 TreeCtrl code
$tree state define HOVER
$tree state define OPENW
$tree state define OPENE
       
$tree column create -tag cIcon
$tree column create -tag cName -expand 1
 
$tree element create elemIcon image -image [$ibox get favicon-wretch]
$tree element create elemName text  -justify left
$tree gradient create grdHover -steps 4 -stops {{0.0 white} {1.0 #ebf3fd}} -orient vertical    
$tree element create elemRect rect -fill [list  grdHover HOVER]  
$tree element create elemRectOutline rect -rx 1 -outline [list #b8d6fb HOVER] \
  -open [list w OPENW e OPENE]  -outlinewidth 1    
$tree element create elemBorder rect -outline "#e2e3e3" -open nws  -outlinewidth 1
$tree element create elemBorderS rect -outline "#ffffff" -open nws  -outlinewidth 1 

# column icon 
set sty [$tree style create styIcon -orient horizontal]
$tree style elements $sty {elemRect elemBorder elemBorderS elemRectOutline elemIcon}
$tree style layout $sty elemRect -detach 1 -padx {2 0}  -iexpand xy
$tree style layout $sty elemRectOutline -detach 1 -iexpand xy
$tree style layout $sty elemBorder -detach 1 -iexpand y -padx {27 0}
$tree style layout $sty elemBorderS -detach 1 -iexpand y -padx {28 0}
$tree style layout $sty elemIcon -padx {6 2} -pady {2 3} -iexpand ns

# column name
set sty [$tree style create styName]
$tree style elements $sty {elemRect elemRectOutline elemName}
$tree style layout $sty elemRect -detach yes -padx 0 -iexpand xy
$tree style layout $sty elemRectOutline -detach yes -iexpand xy
$tree style layout $sty elemName -padx 6 -pady {2 3} -squeeze x -expand ns

set nsList [list moko wretch pchome pixnet xuite yam]
foreach i $nsList  {
  set item [$tree item create -parent 0]
  $tree item style set $item 0 styIcon 1 styName
  $tree item element configure $item 0 elemIcon -image [$ibox get favicon-$i]
  $tree item element configure $item 1 elemName -text $i
}
  
$tree item state forcolumn all 0 "OPENE"
$tree item state forcolumn all 1 "OPENW"
目前還遇到一個難題,就是沒有辦法做出 menu 陰影效果。

4 則留言:

  1. 呵~TreeCtrl真的太強了。光宏快寫成套件...我想用。

    回覆刪除
  2. 我覺得做個 menu 還拉 treectrl 進來的成本太高了,且有不少效果和功能還是沒辦法做得很好,最好是有 ttk::menu 之類的 widget,不過這又得從底層開始寫... 話說最近寫 wget 有不少心得找不到人分享很悶啊 XD

    回覆刪除
  3. 寫在blog上分享吧!! 一定很多人想看

    回覆刪除
  4. 有些東西不適合公開講啦 XD

    回覆刪除