[{"data":1,"prerenderedAt":936},["ShallowReactive",2],{"\u002F2015-08-19-slate-file-browser-tree-view-simple":3},{"id":4,"title":5,"body":6,"date":913,"description":12,"extension":914,"meta":915,"navigation":144,"path":929,"seo":930,"stem":931,"tags":932,"__hash__":935},"blogs\u002F_legacy\u002F2015\u002F2015-08-19-slate-file-browser-tree-view-simple.md","Slate文件目录树基础实现",{"type":7,"value":8,"toc":908},"minimark",[9,13,16,19,30,33,37,40,43,46,57,60,64,67,70,73,79,82,88,91,94,97,100,103,106,249,252,901,904],[10,11,12],"p",{},"目前UMG中并没有提供TreeView类，要使用TreeView必须使用Slate。",[10,14,15],{},"当前UE4版本4.8.3。",[10,17,18],{},"TreeView在UE4编辑器中被广泛的使用，但是出于某些不可知的原因无法在UMG中进行直接使用。鉴于制作复杂度较高的界面需要使用到Slate，对Slate进行专门的研究是有必要的。",[10,20,21,22,29],{},"本文参照Unreal官方社区文档",[23,24,28],"a",{"href":25,"rel":26},"https:\u002F\u002Fwiki.unrealengine.com\u002FSlate,_Tree_View_Widget,_Ex:_In-Editor_File_Structure_Explorer",[27],"nofollow","Slate, Tree View Widget","完成。",[10,31,32],{},"请注意：原始文档中并没有给出具体的文件浏览器实现，而是提供了作为其基础的目录树使用方式。",[34,35,36],"h2",{"id":36},"目录树数据结构",[10,38,39],{},"要实现目录树并不需要太复杂的数据结构，实现基本的功能即可。",[10,41,42],{},"TreeView中本身需要的数据是数组型的，这里定义的数据结构是节点使用的。",[10,44,45],{},"DDFileTreeItem.h",[47,48,53],"pre",{"className":49,"code":51,"language":52},[50],"language-text","#pragma once\n\ntypedef TSharedPtr\u003C class FDDFileTreeItem > FDDFileTreeItemPtr;\n\n\u002F**\n* \u003C目录树节点\n*\u002F\n\nclass FDDFileTreeItem\n{\npublic:\n\n\u002F** @return \u003C返回父节点 *\u002F\nconst FDDFileTreeItemPtr GetParentCategory() const\n{\n  return ParentDir.Pin();\n}\n\n\u002F** @return \u003C返回节点的路径【只读】 *\u002F\nconst FString& GetDirectoryPath() const\n{\n  return DirectoryPath;\n}\n\n\u002F** @return \u003C返回显示名称【只读】 *\u002F\nconst FString& GetDisplayName() const\n{\n  return DisplayName;\n}\n\n\u002F** @return \u003C返回子节点【只读】 *\u002F\nconst TArray\u003C FDDFileTreeItemPtr >& GetSubDirectories() const\n{\n  return SubDirectories;\n}\n\n\u002F** @return \u003C返回可写入的子节点引用 *\u002F\nTArray\u003C FDDFileTreeItemPtr >& AccessSubDirectories()\n{\n  return SubDirectories;\n}\n\n\u002F** \u003C为当前节点添加子目录 *\u002F\nvoid AddSubDirectory(const FDDFileTreeItemPtr NewSubDir)\n{\n  SubDirectories.Add(NewSubDir);\n}\n\npublic:\n\u002F** \u003C构造函数 *\u002F\n\nFDDFileTreeItem(const FDDFileTreeItemPtr IN_ParentDir, const FString& IN_DirectoryPath, const FString& IN_DisplayName)\n: ParentDir(IN_ParentDir)\n, DirectoryPath(IN_DirectoryPath)\n, DisplayName(IN_DisplayName)\n{\n\n}\n\nprivate:\n\n\u002F** \u003C父节点引用; *\u002F\nTWeakPtr\u003C FDDFileTreeItem > ParentDir;\n\n\u002F** \u003C完整路径 *\u002F\nFString DirectoryPath;\n\n\u002F** \u003C显示名称 *\u002F\nFString DisplayName;\n\n\u002F** \u003C子节点数组 *\u002F\nTArray\u003C FDDFileTreeItemPtr > SubDirectories;\n\n};\n","text",[54,55,51],"code",{"__ignoreMap":56},"",[10,58,59],{},"节点的数据结构较为简单，直接在头文件中对函数进行了实现。",[34,61,63],{"id":62},"目录树slate控件","目录树Slate控件",[10,65,66],{},"由于原始文档中提供的代码中引用的Engine是不必要的，故而在这里直接替换成了较为通用的HUD引用，这样就不会导致代码有项目相关性了。",[10,68,69],{},"这里先上代码，其他的一些说明放在代码后面。",[10,71,72],{},"SDDFileTree.h",[47,74,77],{"className":75,"code":76,"language":52},[50],"#pragma once\n\n\u002F* \u003C节点数据结构 *\u002F\n\n#include \"DDFileTreeItem.h\"\n\ntypedef STreeView\u003C FDDFileTreeItemPtr > SDDFileTreeView;\n\n\u002F**\n* \u003C目录树Slate\n*\u002F\n\nclass SDDFileTree : public SCompoundWidget\n{\n\npublic:\n\nSLATE_BEGIN_ARGS(SDDFileTree){}\n\nSLATE_ARGUMENT(TWeakObjectPtr\u003Cclass AHUD>, OwnerHUD)\n\nSLATE_END_ARGS()\n\npublic:\n\nTWeakObjectPtr\u003CAHUD> OwnerHUD;\n\n\u002F** \u003C刷新目录 *\u002F\n\n\u002F\u002Fbool DoRefresh;\n\npublic:\n\nvoid Construct(const FArguments& InArgs);\n\n\u002F** Destructor *\u002F\n~SDDFileTree();\n\n\u002F** @return \u003C返回当前被选中的目录 *\u002F\nFDDFileTreeItemPtr GetSelectedDirectory() const;\n\n\u002F** \u003C选择目录 *\u002F\nvoid SelectDirectory(const FDDFileTreeItemPtr& CategoryToSelect);\n\n\u002F** @return \u003C返回节点是否展开 *\u002F\nbool IsItemExpanded(const FDDFileTreeItemPtr Item) const;\n\nprivate:\n\n\u002F** \u003C生成单个节点元素 *\u002F\nTSharedRef\u003CITableRow> DDFileTree_OnGenerateRow(FDDFileTreeItemPtr Item, const TSharedRef\u003CSTableViewBase>& OwnerTable);\n\n\u002F** \u003C获得子节点 *\u002F\nvoid DDFileTree_OnGetChildren(FDDFileTreeItemPtr Item, TArray\u003C FDDFileTreeItemPtr >& OutChildren);\n\n\u002F** \u003C当选中项发生变化时 *\u002F\nvoid DDFileTree_OnSelectionChanged(FDDFileTreeItemPtr Item, ESelectInfo::Type SelectInfo);\n\n\u002F** \u003C构建目录树数据 *\u002F\nvoid RebuildFileTree();\n\n\u002F** \u003C重写Tick方便以后实现目录刷新 *\u002F\nvirtual void Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime) override;\n\nprivate:\n\n\u002F** \u003CTreeView控件 *\u002F\nTSharedPtr\u003C SDDFileTreeView > DDFileTreeView;\n\n\u002F** \u003C目录树的数据 *\u002F\nTArray\u003C FDDFileTreeItemPtr > Directories;\n\n};\n",[54,78,76],{"__ignoreMap":56},[10,80,81],{},"SDDFileTree.cpp",[47,83,86],{"className":84,"code":85,"language":52},[50],"#include \"Test_mp.h\"\n#include \"SDDFileTree.h\"\n#include \"DDFileTreeItem.h\"\n\nvoid SDDFileTree::Construct(const FArguments& InArgs)\n{\n  OwnerHUD = InArgs._OwnerHUD;\n  RebuildFileTree(); \u002F* \u003C构建目录树数据 *\u002F\n\n  \u002F\u002FBuild the tree view of the above core data\n  DDFileTreeView =\n    SNew(SDDFileTreeView)\n    .SelectionMode(ESelectionMode::Single) \u002F\u002F 只允许选中一个项目\n    .ClearSelectionOnClick(false) \u002F\u002F 不允许不选中内容\n    .TreeItemsSource(&Directories)\n    .OnGenerateRow(this, &SDDFileTree::DDFileTree_OnGenerateRow)\n    .OnGetChildren(this, &SDDFileTree::DDFileTree_OnGetChildren)\n    .OnSelectionChanged(this, &SDDFileTree::DDFileTree_OnSelectionChanged)\n;\n\n    \u002F*\n    \u002F\u002F Expand the root  by default\n    for( auto RootDirIt( Directories.CreateConstIterator() ); RootDirIt; ++RootDirIt )\n    {\n      const auto& Dir = *RootDirIt;\n      DDFileTreeView->SetItemExpansion( Dir, true );\n    }\n\n    \u002F\u002F Select the first item by default\n    if( Directories.Num() > 0 )\n    {\n      DDFileTreeView->SetSelection( Directories[ 0 ] );\n    }\n\n    *\u002F\n\n    ChildSlot.AttachWidget(DDFileTreeView.ToSharedRef());\n}\n\nSDDFileTree::~SDDFileTree()\n{\n\n}\n\nvoid SDDFileTree::RebuildFileTree()\n{\n  Directories.Empty();\n  \u002F\u002F~~~~~~~~~~~~~~~~~~~\n  \u002F\u002FRoot Level\n  TSharedRef\u003CFDDFileTreeItem> RootDir = MakeShareable(new FDDFileTreeItem(NULL, TEXT(\"RootDir\"), FString(\"RootDir\")));\n  Directories.Add(RootDir);\n  TSharedRef\u003CFDDFileTreeItem> RootDir2 = MakeShareable(new FDDFileTreeItem(NULL, TEXT(\"RootDir2\"), FString(\"RootDir2\")));\n  Directories.Add(RootDir2);\n  \u002F\u002F~~~~~~~~~~~~~~~~~~~\n\n  \u002F\u002FRoot Category\n  FDDFileTreeItemPtr ParentCategory = RootDir;\n\n  \u002F\u002FAdd\n  FDDFileTreeItemPtr EachSubDir = MakeShareable(new FDDFileTreeItem(ParentCategory, \"Joy\", \"Joy\"));\n  RootDir->AddSubDirectory(EachSubDir);\n\n  \u002F\u002FAdd\n\n  EachSubDir = MakeShareable(new FDDFileTreeItem(ParentCategory, \"Song\", \"Song\"));\n  RootDir->AddSubDirectory(EachSubDir);\n\n  \u002F\u002FAdd\n\n  FDDFileTreeItemPtr SongDir = MakeShareable(new FDDFileTreeItem(ParentCategory, \"Dance\", \"Dance\"));\n  EachSubDir->AddSubDirectory(SongDir);\n\n  \u002F\u002FAdd\n\n  SongDir = MakeShareable(new FDDFileTreeItem(ParentCategory, \"Rainbows\", \"Rainbows\"));\n  EachSubDir->AddSubDirectory(SongDir);\n  \u002F\u002FAdd\n  EachSubDir = MakeShareable(new FDDFileTreeItem(ParentCategory, \"Butterflies\", \"Butterflies\"));\n  RootDir->AddSubDirectory(EachSubDir);\n\n  \u002F\u002FRefresh\n\n  if (DDFileTreeView.IsValid())\n  {\n    DDFileTreeView->RequestTreeRefresh();\n  }\n\n}\n\nTSharedRef\u003CITableRow> SDDFileTree::DDFileTree_OnGenerateRow(FDDFileTreeItemPtr Item, const TSharedRef\u003CSTableViewBase>& OwnerTable)\n{\n  if (!Item.IsValid())\n  {\n    return SNew(STableRow\u003C FDDFileTreeItemPtr >, OwnerTable)\n      [\n        SNew(STextBlock)\n          .Text(NSLOCTEXT(\"Your Namespace\", \"twns\", \"THIS WAS NULL SOMEHOW\"))\n      ];\n\n  }\n\n  return SNew(STableRow\u003C FDDFileTreeItemPtr >, OwnerTable)\n    [\n      SNew(STextBlock)\n        .Text(FText::FromString(Item->GetDisplayName()))\n        .Font(FSlateFontInfo(FPaths::EngineContentDir() \u002F TEXT(\"Slate\u002FFonts\u002FRoboto-Bold.ttf\"), 12))\n        .ColorAndOpacity(FLinearColor(1, 0, 1, 1))\n        .ShadowColorAndOpacity(FLinearColor::Black)\n        .ShadowOffset(FIntPoint(-2, 2))\n    ];\n}\n\nvoid SDDFileTree::DDFileTree_OnGetChildren(FDDFileTreeItemPtr Item, TArray\u003C FDDFileTreeItemPtr >& OutChildren)\n{\n  const auto& SubCategories = Item->GetSubDirectories();\n  OutChildren.Append(SubCategories);\n}\n\n\u002F\u002FKey function for interaction with user!\nvoid SDDFileTree::DDFileTree_OnSelectionChanged(FDDFileTreeItemPtr Item, ESelectInfo::Type SelectInfo)\n{\n  \u002F\u002FSelection Changed!\n  UE_LOG(LogTemp, Warning, TEXT(\"Item Selected: %s\"), *Item->GetDisplayName());\n}\n\nFDDFileTreeItemPtr SDDFileTree::GetSelectedDirectory() const\n{\n  if (DDFileTreeView.IsValid())\n  {\n     auto SelectedItems = DDFileTreeView->GetSelectedItems();\n     if (SelectedItems.Num() > 0)\n     {\n       const auto& SelectedCategoryItem = SelectedItems[0];\n       return SelectedCategoryItem;\n     }\n\n  }\n  return NULL;\n}\n\nvoid SDDFileTree::SelectDirectory(const FDDFileTreeItemPtr& CategoryToSelect)\n{\n  if (ensure(DDFileTreeView.IsValid()))\n  {\n      DDFileTreeView->SetSelection(CategoryToSelect);\n  }\n}\n\n\u002F\u002Fis the tree item expanded to show children?\nbool SDDFileTree::IsItemExpanded(const FDDFileTreeItemPtr Item) const\n{\n  return DDFileTreeView->IsItemExpanded(Item);\n}\n\nvoid SDDFileTree::Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime)\n{\n  \u002F\u002F Call parent implementation\n  SCompoundWidget::Tick(AllottedGeometry, InCurrentTime, InDeltaTime);\n  \u002F\u002Fcan do things here every tick\n}\n",[54,87,85],{"__ignoreMap":56},[10,89,90],{},"代码的结构还是比较清晰的，这里需要注意的是，针对TreeView的事件是在控件本身生成的时候注册的。",[10,92,93],{},"其中，OnGenerateRow事件是STreeView和SListView的必须事件。当控件需要进行元素显示时，会对这个函数进行调用，获得需要显示的元素。",[10,95,96],{},"另外，代码中的OnSelectionChanged函数缺乏必要的安全检测，在使用中需要留意。",[10,98,99],{},"用于显示的数据是在Construct中通过调用RebuildFileTree()函数生成的。",[34,101,102],{"id":102},"最终结果",[10,104,105],{},"完成了上面的步骤之后，直接在HUD中对控件进行展示即可。",[47,107,111],{"className":108,"code":109,"language":110,"meta":56,"style":56},"language-cpp shiki shiki-themes github-light-high-contrast github-dark monokai","SAssignNew(DDFileTree, SDDFileTree).OwnerHUD(this);\n\nif (GEngine->IsValidLowLevel())\n{\n  GEngine->GameViewport->AddViewportWidgetContent(SNew(SWeakWidget).PossiblyNullContent(DDFileTree.ToSharedRef()));\n}\n\nif (DDFileTree.IsValid())\n{\n  DDFileTree->SetVisibility(EVisibility::Visible);\n}\n","cpp",[54,112,113,139,146,162,168,197,203,208,221,226,244],{"__ignoreMap":56},[114,115,118,122,126,129,132,136],"span",{"class":116,"line":117},"line",1,[114,119,121],{"class":120},"scAT4","SAssignNew",[114,123,125],{"class":124},"s0idv","(DDFileTree, SDDFileTree).",[114,127,128],{"class":120},"OwnerHUD",[114,130,131],{"class":124},"(",[114,133,135],{"class":134},"s4Wjf","this",[114,137,138],{"class":124},");\n",[114,140,142],{"class":116,"line":141},2,[114,143,145],{"emptyLinePlaceholder":144},true,"\n",[114,147,149,153,156,159],{"class":116,"line":148},3,[114,150,152],{"class":151},"sLXdl","if",[114,154,155],{"class":124}," (GEngine->",[114,157,158],{"class":120},"IsValidLowLevel",[114,160,161],{"class":124},"())\n",[114,163,165],{"class":116,"line":164},4,[114,166,167],{"class":124},"{\n",[114,169,171,174,177,179,182,185,188,191,194],{"class":116,"line":170},5,[114,172,173],{"class":124},"  GEngine->GameViewport->",[114,175,176],{"class":120},"AddViewportWidgetContent",[114,178,131],{"class":124},[114,180,181],{"class":120},"SNew",[114,183,184],{"class":124},"(SWeakWidget).",[114,186,187],{"class":120},"PossiblyNullContent",[114,189,190],{"class":124},"(DDFileTree.",[114,192,193],{"class":120},"ToSharedRef",[114,195,196],{"class":124},"()));\n",[114,198,200],{"class":116,"line":199},6,[114,201,202],{"class":124},"}\n",[114,204,206],{"class":116,"line":205},7,[114,207,145],{"emptyLinePlaceholder":144},[114,209,211,213,216,219],{"class":116,"line":210},8,[114,212,152],{"class":151},[114,214,215],{"class":124}," (DDFileTree.",[114,217,218],{"class":120},"IsValid",[114,220,161],{"class":124},[114,222,224],{"class":116,"line":223},9,[114,225,167],{"class":124},[114,227,229,232,235,237,241],{"class":116,"line":228},10,[114,230,231],{"class":124},"  DDFileTree->",[114,233,234],{"class":120},"SetVisibility",[114,236,131],{"class":124},[114,238,240],{"class":239},"sfUV7","EVisibility",[114,242,243],{"class":124},"::Visible);\n",[114,245,247],{"class":116,"line":246},11,[114,248,202],{"class":124},[10,250,251],{},"启动预览，由于没有进行布局，可以在最上方看到目录树的展示。",[10,253,254,255,900],{},"![U10",[114,256,259,471],{"className":257},[258],"katex",[114,260,263],{"className":261},[262],"katex-mathml",[264,265,267],"math",{"xmlns":266},"http:\u002F\u002Fwww.w3.org\u002F1998\u002FMath\u002FMathML",[268,269,270,466],"semantics",{},[271,272,273,282,285,289,292,295,298,306,309,312,317,320,323,326,328,331,333,335,339,342,344,347,350,353,356,359,362,364,366,368,371,373,376,378,380,383,386,388,391,393,396,398,400,407,409,411,413,415,417,423,425,428,430,432,438,441,443,446,449,452,454,456,459,462,464],"mrow",{},[274,275,276,278],"msub",{},[271,277],{},[279,280,281],"mi",{},"I",[279,283,284],{},"A",[286,287,288],"mn",{},"57",[279,290,291],{},"U",[279,293,294],{},"R",[279,296,297],{},"M",[274,299,300,303],{},[279,301,302],{},"V",[279,304,305],{},"P",[279,307,308],{},"O",[286,310,311],{},"0",[313,314,316],"mo",{"stretchy":315},"false","]",[286,318,319],{},"6",[313,321,322],{"stretchy":315},"[",[279,324,325],{},"J",[279,327,291],{},[279,329,330],{},"C",[313,332,316],{"stretchy":315},[313,334,131],{"stretchy":315},[279,336,338],{"mathvariant":337},"normal","\u002F",[279,340,341],{},"w",[279,343,10],{},[313,345,346],{},"−",[279,348,349],{},"c",[279,351,352],{},"o",[279,354,355],{},"n",[279,357,358],{},"t",[279,360,361],{},"e",[279,363,355],{},[279,365,358],{},[279,367,338],{"mathvariant":337},[279,369,370],{},"u",[279,372,10],{},[279,374,375],{},"l",[279,377,352],{},[279,379,23],{},[279,381,382],{},"d",[279,384,385],{},"s",[279,387,338],{"mathvariant":337},[286,389,390],{},"2017",[279,392,338],{"mathvariant":337},[286,394,395],{},"03",[279,397,338],{"mathvariant":337},[279,399,291],{},[274,401,402,405],{},[286,403,404],{},"10",[279,406,281],{},[279,408,284],{},[286,410,288],{},[279,412,291],{},[279,414,294],{},[279,416,297],{},[274,418,419,421],{},[279,420,302],{},[279,422,305],{},[279,424,308],{},[286,426,427],{},"06",[279,429,325],{},[279,431,291],{},[274,433,434,436],{},[279,435,330],{},[279,437,358],{},[279,439,440],{},"h",[279,442,370],{},[279,444,445],{},"m",[279,447,448],{},"b",[279,450,451],{"mathvariant":337},".",[279,453,10],{},[279,455,355],{},[279,457,458],{},"g",[279,460,461],{"mathvariant":337},"\"",[279,463,291],{},[286,465,404],{},[467,468,470],"annotation",{"encoding":469},"application\u002Fx-tex","_IA57URMV_PO0]6[JUC](\u002Fwp-content\u002Fuploads\u002F2017\u002F03\u002FU10_IA57URMV_PO06JUC_thumb.png \"U10",[114,472,476,659],{"className":473,"ariaHidden":475},[474],"katex-html","true",[114,477,480,485,543,546,549,553,557,560,603,607,610,614,617,621,625,628,632,635,638,641,645,648,652,656],{"className":478},[479],"base",[114,481],{"className":482,"style":484},[483],"strut","height:1em;vertical-align:-0.25em;",[114,486,489,491],{"className":487},[488],"mord",[114,490],{},[114,492,495],{"className":493},[494],"msupsub",[114,496,500,534],{"className":497},[498,499],"vlist-t","vlist-t2",[114,501,504,529],{"className":502},[503],"vlist-r",[114,505,509],{"className":506,"style":508},[507],"vlist","height:0.3283em;",[114,510,512,517],{"style":511},"top:-2.55em;margin-right:0.05em;",[114,513],{"className":514,"style":516},[515],"pstrut","height:2.7em;",[114,518,524],{"className":519},[520,521,522,523],"sizing","reset-size6","size3","mtight",[114,525,281],{"className":526,"style":528},[488,527,523],"mathnormal","margin-right:0.0785em;",[114,530,533],{"className":531},[532],"vlist-s","​",[114,535,537],{"className":536},[503],[114,538,541],{"className":539,"style":540},[507],"height:0.15em;",[114,542],{},[114,544,284],{"className":545},[488,527],[114,547,288],{"className":548},[488],[114,550,291],{"className":551,"style":552},[488,527],"margin-right:0.109em;",[114,554,294],{"className":555,"style":556},[488,527],"margin-right:0.0077em;",[114,558,297],{"className":559,"style":552},[488,527],[114,561,563,567],{"className":562},[488],[114,564,302],{"className":565,"style":566},[488,527],"margin-right:0.2222em;",[114,568,570],{"className":569},[494],[114,571,573,595],{"className":572},[498,499],[114,574,576,592],{"className":575},[503],[114,577,579],{"className":578,"style":508},[507],[114,580,582,585],{"style":581},"top:-2.55em;margin-left:-0.2222em;margin-right:0.05em;",[114,583],{"className":584,"style":516},[515],[114,586,588],{"className":587},[520,521,522,523],[114,589,305],{"className":590,"style":591},[488,527,523],"margin-right:0.1389em;",[114,593,533],{"className":594},[532],[114,596,598],{"className":597},[503],[114,599,601],{"className":600,"style":540},[507],[114,602],{},[114,604,308],{"className":605,"style":606},[488,527],"margin-right:0.0278em;",[114,608,311],{"className":609},[488],[114,611,316],{"className":612},[613],"mclose",[114,615,319],{"className":616},[488],[114,618,322],{"className":619},[620],"mopen",[114,622,325],{"className":623,"style":624},[488,527],"margin-right:0.0962em;",[114,626,291],{"className":627,"style":552},[488,527],[114,629,330],{"className":630,"style":631},[488,527],"margin-right:0.0715em;",[114,633,316],{"className":634},[613],[114,636,131],{"className":637},[620],[114,639,338],{"className":640},[488],[114,642,341],{"className":643,"style":644},[488,527],"margin-right:0.0269em;",[114,646,10],{"className":647},[488,527],[114,649],{"className":650,"style":566},[651],"mspace",[114,653,346],{"className":654},[655],"mbin",[114,657],{"className":658,"style":566},[651],[114,660,662,665,669,672,675,678,681,684,687,690,695,698,701,704,707,711,714,718,759,762,765,768,771,774,814,817,820,823,826,868,871,874,878,881,884,887,891,894,897],{"className":661},[479],[114,663],{"className":664,"style":484},[483],[114,666,668],{"className":667},[488,527],"co",[114,670,355],{"className":671},[488,527],[114,673,358],{"className":674},[488,527],[114,676,361],{"className":677},[488,527],[114,679,355],{"className":680},[488,527],[114,682,358],{"className":683},[488,527],[114,685,338],{"className":686},[488],[114,688,370],{"className":689},[488,527],[114,691,694],{"className":692,"style":693},[488,527],"margin-right:0.0197em;","pl",[114,696,352],{"className":697},[488,527],[114,699,23],{"className":700},[488,527],[114,702,382],{"className":703},[488,527],[114,705,385],{"className":706},[488,527],[114,708,710],{"className":709},[488],"\u002F2017\u002F03\u002F",[114,712,291],{"className":713,"style":552},[488,527],[114,715,717],{"className":716},[488],"1",[114,719,721,724],{"className":720},[488],[114,722,311],{"className":723},[488],[114,725,727],{"className":726},[494],[114,728,730,751],{"className":729},[498,499],[114,731,733,748],{"className":732},[503],[114,734,736],{"className":735,"style":508},[507],[114,737,739,742],{"style":738},"top:-2.55em;margin-left:0em;margin-right:0.05em;",[114,740],{"className":741,"style":516},[515],[114,743,745],{"className":744},[520,521,522,523],[114,746,281],{"className":747,"style":528},[488,527,523],[114,749,533],{"className":750},[532],[114,752,754],{"className":753},[503],[114,755,757],{"className":756,"style":540},[507],[114,758],{},[114,760,284],{"className":761},[488,527],[114,763,288],{"className":764},[488],[114,766,291],{"className":767,"style":552},[488,527],[114,769,294],{"className":770,"style":556},[488,527],[114,772,297],{"className":773,"style":552},[488,527],[114,775,777,780],{"className":776},[488],[114,778,302],{"className":779,"style":566},[488,527],[114,781,783],{"className":782},[494],[114,784,786,806],{"className":785},[498,499],[114,787,789,803],{"className":788},[503],[114,790,792],{"className":791,"style":508},[507],[114,793,794,797],{"style":581},[114,795],{"className":796,"style":516},[515],[114,798,800],{"className":799},[520,521,522,523],[114,801,305],{"className":802,"style":591},[488,527,523],[114,804,533],{"className":805},[532],[114,807,809],{"className":808},[503],[114,810,812],{"className":811,"style":540},[507],[114,813],{},[114,815,308],{"className":816,"style":606},[488,527],[114,818,427],{"className":819},[488],[114,821,325],{"className":822,"style":624},[488,527],[114,824,291],{"className":825,"style":552},[488,527],[114,827,829,832],{"className":828},[488],[114,830,330],{"className":831,"style":631},[488,527],[114,833,835],{"className":834},[494],[114,836,838,860],{"className":837},[498,499],[114,839,841,857],{"className":840},[503],[114,842,845],{"className":843,"style":844},[507],"height:0.2806em;",[114,846,848,851],{"style":847},"top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;",[114,849],{"className":850,"style":516},[515],[114,852,854],{"className":853},[520,521,522,523],[114,855,358],{"className":856},[488,527,523],[114,858,533],{"className":859},[532],[114,861,863],{"className":862},[503],[114,864,866],{"className":865,"style":540},[507],[114,867],{},[114,869,440],{"className":870},[488,527],[114,872,370],{"className":873},[488,527],[114,875,877],{"className":876},[488,527],"mb",[114,879,451],{"className":880},[488],[114,882,10],{"className":883},[488,527],[114,885,355],{"className":886},[488,527],[114,888,458],{"className":889,"style":890},[488,527],"margin-right:0.0359em;",[114,892,461],{"className":893},[488],[114,895,291],{"className":896,"style":552},[488,527],[114,898,404],{"className":899},[488],"_IA57URMV_PO0]6[JUC\")",[10,902,903],{},"至此，目录树的基本功能已经实现。",[905,906,907],"style",{},"html pre.shiki code .scAT4, html code.shiki .scAT4{--shiki-default:#622CBC;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .s0idv, html code.shiki .s0idv{--shiki-default:#0E1116;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .s4Wjf, html code.shiki .s4Wjf{--shiki-default:#023B95;--shiki-dark:#79B8FF;--shiki-sepia:#FD971F}html pre.shiki code .sLXdl, html code.shiki .sLXdl{--shiki-default:#A0111F;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sfUV7, html code.shiki .sfUV7{--shiki-default:#702C00;--shiki-default-text-decoration:inherit;--shiki-dark:#B392F0;--shiki-dark-text-decoration:inherit;--shiki-sepia:#A6E22E;--shiki-sepia-text-decoration:underline}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":56,"searchDepth":141,"depth":148,"links":909},[910,911,912],{"id":36,"depth":141,"text":36},{"id":62,"depth":141,"text":63},{"id":102,"depth":141,"text":102},"2015-08-19","md",{"layout":916,"status":917,"published":144,"author":918,"author_login":920,"author_email":921,"wordpress_id":922,"wordpress_url":923,"date_gmt":924,"excerpt":925},"post","publish",{"display_name":919,"login":920,"email":921,"url":56},"风铃","flinkor","flinkor@foxmail.com",1542,"\u002F\u002F?p=1542","2015-08-19 06:52:43 +0000",{"type":7,"value":926},[927],[10,928,12],{},"\u002F2015-08-19-slate-file-browser-tree-view-simple",{"title":5,"description":12},"_legacy\u002F2015\u002F2015-08-19-slate-file-browser-tree-view-simple",[933,934],"UE4","Slate","AHchideoQOxz25BWavPLnfqJsUoUsDtNrYhTtEf97xw",1788763180398]