Thread Rating:
  • 356 Vote(s) - 2.76 Average
  • 1
  • 2
  • 3
  • 4
  • 5
ツリー構造について
07-08-2014, 10:51 AM,
#5
RE: ツリー構造について
階層の取得についてはromさんの取得方法で大きな問題はないと思います。


e.kouさんのサンプルにもあるように、
クラスの継承だけでなく、tree-item-creation-proc を使うことで、
いろいろな実装方法が考えられそうですね。

個人的には、ExTreeNode に「階層情報」のフィールドを持たせたのであれば、
ExTreeNode の責任範囲をかんがえたときには、
自分自身で階層情報を取得したほうが、よりシンプルかなと思いました。

また、ツリー生成のタイミングと、表示のタイミングが異なるケースはあまりなさそうですが、
サンプルのように、TreeItem の位置が変更されることも考えて、
一応、ゲッターの中で再取得するようにしてみました。
(サンプルでは、ExTreeItem を利用して、ドラッグでツリーを移動することができます)

Code:
||++  TreeNode拡張
||++  TreeNodeに階層フィールドを追加
{define-class public ExTreeNode {inherits DefaultTreeNode}
  ||現在の階層を返すゲッター
  {getter public {node-level}:int
    let rank:int = 1
    let rank_node:#TreeNode=self
    {while rank_node.parent != null do
        {set rank_node = rank_node.parent}
        {inc rank}
    }
    {return rank}
  }
  {constructor public {default  ... }
    {construct-super  {splice ...} }
  }
}

||ドラッグで移動可能なTreeItem
||※実用には「もとに戻す」機能が必要
{define-class public ExTreeItem {inherits DefaultTreeItem }

  {constructor public {default ...}
    {construct-super {splice ...}}

    set self.dragee = {ImageDragee}

    {self.add-event-handler
        {on e:DragOver do
            {e.will-accept-drop?
                {proc {type:Type, x:Distance, y:Distance,
                       effect:#DragEffect}:DragEffect
                    {return drag-effect-copy}
                }
            }
        }
    }

    {self.add-event-handler
        {on e:Drop do
            {e.accept-drop
                {proc {a:any, x:Distance, y:Distance,
                       effect:#DragEffect}:DropResult
                    {return
                        {DropResultCopy
                            action =
                                {proc {}:void
                                    {type-switch a
                                     case ti:DefaultTreeItem do
                                        {self.node.append ti.node}
                                        {if not self.expanded? then
                                            {self.toggle-node}
                                        }
                                    }
                                }
                        }
                    }
                }
            }
        }
    }
  }
}

||++  TreeControl生成
{TreeControl
    data-model =
        {TreeModel
            root =
                {ExTreeNode node-data="Food",
                    {ExTreeNode node-data="Fruit",
                        {ExTreeNode node-data="Apples",
                            {ExTreeNode node-data="Macintosh"},
                            {ExTreeNode node-data="Cortland"},
                            {ExTreeNode node-data="Gala"},
                            {ExTreeNode node-data="Delicious"}
                        },
                        {ExTreeNode node-data="Oranges"}
                    },
                    {ExTreeNode node-data="Vegetables",
                        {ExTreeNode node-data="Squash"},
                        {ExTreeNode node-data="Tomatoes"},
                        {ExTreeNode node-data="Cucumbers"}
                    }
                }
        },
    tree-item-creation-proc ={proc {node:TreeNode}:TreeItem
                                 {return {ExTreeItem node}}
                             },
    ||++ アクションイベント
    {on Action at tc:TreeControl do
        {type-switch tc.current-node
         case et:ExTreeNode do
            {popup-message et.node-level&"階層です。"}
        }
    }
}


Messages In This Thread
ツリー構造について - by rom - 07-02-2014, 10:54 AM
RE: ツリー構造について - by rom - 07-02-2014, 11:28 AM
RE: ツリー構造について - by e.kou - 07-04-2014, 02:50 PM
RE: ツリー構造について - by e.kou - 07-08-2014, 09:24 AM
RE: ツリー構造について - by umemura - 07-08-2014, 10:51 AM
RE: ツリー構造について - by rom - 07-08-2014, 02:55 PM
Forum Jump:


Users browsing this thread:
5 Guest(s)

MyBB SQL Error

MyBB has experienced an internal SQL error and cannot continue.

SQL Error:
1017 - Can't find file: 'mybb_threadviews' (errno: 2)
Query:
INSERT INTO mybb_threadviews (tid) VALUES('1095')