瀏覽代碼

Merge pull request #425 from rsredsq/RED-EDITOR-361

Use arrows keys to navigate in hierarchy and project panels
LaraEngebretson 10 年之前
父節點
當前提交
a3c28a975a

+ 38 - 0
Script/AtomicEditor/ui/frames/HierarchyFrame.ts

@@ -197,6 +197,44 @@ class HierarchyFrame extends Atomic.UIWidget {
 
 
         if (data.type == Atomic.UI_EVENT_TYPE_KEY_UP) {
         if (data.type == Atomic.UI_EVENT_TYPE_KEY_UP) {
 
 
+            if (data.key == Atomic.KEY_DOWN || data.key == Atomic.KEY_UP || data.key == Atomic.KEY_LEFT || data.key == Atomic.KEY_RIGHT) {
+                var selectedId = Number(this.hierList.selectedItemID);
+                var node = this.scene.getNode(selectedId);
+
+                if (node) {
+
+                    this.sendEvent("EditorActiveNodeChange", { node: node });
+
+                }
+            }
+            if (data.key == Atomic.KEY_RIGHT) {
+                var selectedId = Number(this.hierList.selectedItemID);
+                var itemNodeId = this.nodeIDToItemID[selectedId];
+
+                if (!this.hierList.getExpanded(itemNodeId) && this.hierList.getExpandable(itemNodeId)) {
+                    this.hierList.setExpanded(itemNodeId, true);
+                    this.hierList.rootList.invalidateList();
+                } else {
+                    this.hierList.rootList.selectNextItem();
+                }
+
+            } else if (data.key == Atomic.KEY_LEFT) {
+                var selectedId = Number(this.hierList.selectedItemID);
+                var itemNodeId = this.nodeIDToItemID[selectedId];
+
+                if (this.hierList.getExpanded(itemNodeId)) {
+                    this.hierList.setExpanded(itemNodeId, false);
+                    this.hierList.rootList.invalidateList();
+                } else {
+                    var node = this.scene.getNode(selectedId);
+                    var parentNode = node.getParent();
+                    if (parentNode) {
+                        this.hierList.selectItemByID(parentNode.id.toString());
+                    }
+                }
+
+            }
+
             // node deletion
             // node deletion
             if (data.key == Atomic.KEY_DELETE || data.key == Atomic.KEY_BACKSPACE) {
             if (data.key == Atomic.KEY_DELETE || data.key == Atomic.KEY_BACKSPACE) {
 
 

+ 50 - 0
Script/AtomicEditor/ui/frames/ProjectFrame.ts

@@ -136,6 +136,56 @@ class ProjectFrame extends ScriptWidget {
 
 
     handleWidgetEvent(data: Atomic.UIWidgetEvent): boolean {
     handleWidgetEvent(data: Atomic.UIWidgetEvent): boolean {
 
 
+        if (data.type == Atomic.UI_EVENT_TYPE_KEY_UP) {
+
+          if (data.key == Atomic.KEY_RIGHT) {
+              var selectedId = this.folderList.selectedItemID;
+              var itemAssetId = this.assetGUIDToItemID[selectedId];
+
+              if (selectedId != "0") {
+                  if (!this.folderList.getExpanded(itemAssetId) && this.folderList.getExpandable(itemAssetId)) {
+                      this.folderList.setExpanded(itemAssetId, true);
+                      this.folderList.rootList.invalidateList();
+                  } else {
+                      this.folderList.rootList.selectNextItem();
+                  }
+              }
+
+
+          } else if (data.key == Atomic.KEY_LEFT) {
+              var selectedId = this.folderList.selectedItemID;
+              var itemAssetId = this.assetGUIDToItemID[selectedId];
+              if (selectedId != "0") {
+                  if (this.folderList.getExpanded(itemAssetId)) {
+                      this.folderList.setExpanded(itemAssetId, false);
+                      this.folderList.rootList.invalidateList();
+                  } else {
+                      var db = ToolCore.getAssetDatabase();
+
+                      var asset = db.getAssetByGUID(selectedId);
+
+                      var parentAsset = asset.parent;
+                      if (parentAsset) {
+                         this.folderList.selectItemByID(parentAsset.guid.toString());
+                      }
+                  }
+              }
+          }
+
+            if (data.key == Atomic.KEY_DOWN || data.key == Atomic.KEY_UP || data.key == Atomic.KEY_LEFT || data.key == Atomic.KEY_RIGHT) {
+
+                var selectedId = this.folderList.selectedItemID;
+
+                if (selectedId != "0") {
+                    var db = ToolCore.getAssetDatabase();
+
+                    var asset = db.getAssetByGUID(selectedId);
+
+                    if (asset.isFolder)
+                        this.refreshContent(asset);
+                }
+            }
+        }
         if (data.type == Atomic.UI_EVENT_TYPE_RIGHT_POINTER_UP) {
         if (data.type == Atomic.UI_EVENT_TYPE_RIGHT_POINTER_UP) {
 
 
             var id = data.target.id;
             var id = data.target.id;

+ 19 - 0
Source/Atomic/UI/UIListView.cpp

@@ -295,6 +295,8 @@ bool ListViewItemWidget::OnEvent(const TBWidgetEvent &ev)
 
 
     if (ev.type == EVENT_TYPE_POINTER_DOWN || ev.type == EVENT_TYPE_RIGHT_POINTER_UP)
     if (ev.type == EVENT_TYPE_POINTER_DOWN || ev.type == EVENT_TYPE_RIGHT_POINTER_UP)
     {
     {
+        SetFocus(WIDGET_FOCUS_REASON_POINTER);
+
         TBWidget* parent = GetParent();
         TBWidget* parent = GetParent();
 
 
         while (parent)
         while (parent)
@@ -516,6 +518,23 @@ void UIListView::SetExpanded(unsigned itemID, bool value)
 
 
 }
 }
 
 
+bool UIListView::GetExpanded(unsigned itemID)
+{
+    if (!itemLookup_.Contains(itemID))
+        return false;
+
+    return itemLookup_[itemID]->GetExpanded();
+
+}
+
+bool UIListView::GetExpandable(unsigned itemID)
+{
+    if (!itemLookup_.Contains(itemID))
+        return false;
+
+    return itemLookup_[itemID]->children_.Size() > 0;
+}
+
 
 
 void UIListView::DeleteAllItems()
 void UIListView::DeleteAllItems()
 {
 {

+ 2 - 0
Source/Atomic/UI/UIListView.h

@@ -55,6 +55,8 @@ public:
     void ScrollToSelectedItem();
     void ScrollToSelectedItem();
 
 
     void SetExpanded(unsigned itemID, bool value);
     void SetExpanded(unsigned itemID, bool value);
+    bool GetExpanded(unsigned itemID);
+    bool GetExpandable(unsigned itemID);
 
 
     void DeleteAllItems();
     void DeleteAllItems();
     void SelectItemByID(const String& id);
     void SelectItemByID(const String& id);

+ 20 - 0
Source/Atomic/UI/UISelectList.cpp

@@ -194,7 +194,27 @@ void UISelectList::HandleUIUpdate(StringHash eventType, VariantMap& eventData)
 
 
 bool UISelectList::OnEvent(const tb::TBWidgetEvent &ev)
 bool UISelectList::OnEvent(const tb::TBWidgetEvent &ev)
 {
 {
+    if (ev.type == EVENT_TYPE_POINTER_DOWN)
+    {
+        GetTBSelectList()->SetFocus(WIDGET_FOCUS_REASON_POINTER);
+    }
     return UIWidget::OnEvent(ev);
     return UIWidget::OnEvent(ev);
 }
 }
 
 
+void UISelectList::SelectNextItem()
+{
+    if (!widget_)
+        return;
+    
+    ((TBSelectList*)widget_)->ChangeValue(TB_KEY_DOWN);
+}
+
+void UISelectList::SelectPreviousItem()
+{
+    if (!widget_)
+        return;
+
+    ((TBSelectList*)widget_)->ChangeValue(TB_KEY_UP);
+}
+
 }
 }

+ 3 - 0
Source/Atomic/UI/UISelectList.h

@@ -57,6 +57,9 @@ public:
 
 
     tb::TBSelectList* GetTBSelectList();
     tb::TBSelectList* GetTBSelectList();
 
 
+    void SelectNextItem();
+    void SelectPreviousItem();
+
 protected:
 protected:
 
 
     void HandleUIUpdate(StringHash eventType, VariantMap& eventData);
     void HandleUIUpdate(StringHash eventType, VariantMap& eventData);

+ 12 - 0
Source/Atomic/UI/UIWidget.cpp

@@ -148,6 +148,18 @@ void UIWidget::ConvertEvent(UIWidget *handler, UIWidget* target, const tb::TBWid
         case TB_KEY_DELETE:
         case TB_KEY_DELETE:
             key = KEY_DELETE;
             key = KEY_DELETE;
             break;
             break;
+        case TB_KEY_DOWN:
+            key = KEY_DOWN;
+            break;
+        case TB_KEY_UP:
+            key = KEY_UP;
+            break;
+        case TB_KEY_LEFT:
+            key = KEY_LEFT;
+            break;
+        case TB_KEY_RIGHT:
+            key = KEY_RIGHT;
+            break;
         default:
         default:
             break;
             break;
         }
         }