Przeglądaj źródła

Context menus on right click, asset deletion

Josh Engebretson 10 lat temu
rodzic
commit
d188ae1c89

+ 7 - 6
Script/AtomicEditor/ui/HierarchyFrame.ts

@@ -112,8 +112,6 @@ class HierarchyFrame extends Atomic.UIWidget {
 
                 if (node) {
 
-                    console.log("Pointer Down: ", node.name);
-
                     // set the widget's drag object
                     var dragObject = new Atomic.UIDragObject(node, node.name.length ? "Node: " + node.name : "Node: (Anonymous)");
                     this.hierList.rootList.dragObject = dragObject;
@@ -123,8 +121,6 @@ class HierarchyFrame extends Atomic.UIWidget {
 
                         var dragNode = <Atomic.Node> ev.dragObject.object;
 
-                        console.log("drop hover id: ", this.hierList.hoverItemID);
-
                         var dropNode: Atomic.Node = this.scene.getNode(Number(this.hierList.hoverItemID));
 
                         if (!dropNode) {
@@ -232,7 +228,12 @@ class HierarchyFrame extends Atomic.UIWidget {
         if (!name.length)
             name = "(Anonymous)"
 
-        var childItemID = this.hierList.addChildItem(parentID, name, "Folder.icon", node.id.toString());
+        var icon = "";
+
+        if (node.isTemporary())
+          icon = "ComponentBitmap";
+
+        var childItemID = this.hierList.addChildItem(parentID, name, icon, node.id.toString());
 
         this.nodeIDToItemID[node.id] = childItemID;
 
@@ -254,7 +255,7 @@ class HierarchyFrame extends Atomic.UIWidget {
         if (!this.scene)
             return;
 
-        var parentID = this.hierList.addRootItem("Scene", "Folder.icon", this.scene.id.toString());
+        var parentID = this.hierList.addRootItem("Scene", "", this.scene.id.toString());
 
         this.nodeIDToItemID[this.scene.id] = parentID;
 

+ 31 - 0
Script/AtomicEditor/ui/ProjectFrame.ts

@@ -43,6 +43,7 @@ class ProjectFrame extends ScriptWidget {
         this.subscribeToEvent("DragEnded", (data) => this.handleDragEnded(data));
 
         this.subscribeToEvent("ResourceAdded", (ev: ToolCore.ResourceAddedEvent) => this.handleResourceAdded(ev));
+        this.subscribeToEvent("ResourceRemoved", (ev: ToolCore.ResourceRemovedEvent) => this.handleResourceRemoved(ev));
 
         // this.subscribeToEvent(EditorEvents.ResourceFolderCreated, (ev: EditorEvents.ResourceFolderCreatedEvent) => this.handleResourceFolderCreated(ev));
 
@@ -55,6 +56,13 @@ class ProjectFrame extends ScriptWidget {
 
     }
 
+    handleResourceRemoved(ev: ToolCore.ResourceRemovedEvent) {
+
+      var folderList = this.folderList;
+      folderList.deleteItemByID(ev.guid);
+
+    }
+
     handleResourceAdded(ev: ToolCore.ResourceAddedEvent) {
 
         var db = ToolCore.getAssetDatabase();
@@ -103,6 +111,27 @@ class ProjectFrame extends ScriptWidget {
 
     handleWidgetEvent(data: Atomic.UIWidgetEvent): boolean {
 
+        if (data.type == Atomic.UI_EVENT_TYPE_RIGHT_POINTER_UP) {
+
+            var id = data.target.id;
+
+            if (id == "folderList_") {
+
+              var db = ToolCore.getAssetDatabase();
+              var asset = db.getAssetByGUID(this.folderList.hoverItemID);
+
+              if (asset && asset.isFolder()) {
+
+                this.menu.createFolderContextMenu(this, "folder context menu", asset, data.x, data.y);
+
+              }
+
+              return true;
+
+            }
+
+        }
+
         if (data.type == Atomic.UI_EVENT_TYPE_CLICK) {
 
             var id = data.target.id;
@@ -254,6 +283,8 @@ class ProjectFrame extends ScriptWidget {
 
     handleProjectLoaded(data) {
 
+      this.folderList.rootList.value = 0;
+      this.folderList.setExpanded(this.resourcesID, true);
 
     }
 

+ 51 - 3
Script/AtomicEditor/ui/ProjectFrameMenu.ts

@@ -10,18 +10,59 @@ class ProjectFrameMenus extends Atomic.ScriptObject {
 
         super();
 
+        MenuItemSources.createMenuItemSource("project context folder", folderContextItems);
         MenuItemSources.createMenuItemSource("project create items", createItems);
 
-        this.subscribeToEvent(EditorEvents.ContentFolderChanged, (ev:EditorEvents.ContentFolderChangedEvent) => {
-          this.contentFolder = ev.path;
+        this.subscribeToEvent(EditorEvents.ContentFolderChanged, (ev: EditorEvents.ContentFolderChangedEvent) => {
+            this.contentFolder = ev.path;
         })
 
     }
 
+    handleFolderContextMenu(target: Atomic.UIWidget, refid: string) {
+
+        if (target.id == "folder context menu") {
+
+            var folder = <ToolCore.Asset> target['folder'];
+
+            if (refid == "delete_folder") {
+
+                EditorUI.getModelOps().showResourceDelete(folder);
+
+                return true;
+            }
+
+            if (refid == "create_folder") {
+
+                EditorUI.getModelOps().showCreateFolder(folder.path);
+
+                return true;
+
+            }
+
+        }
+
+    }
+
+    createFolderContextMenu(parent: Atomic.UIWidget, id: string, folder: ToolCore.Asset, x: number, y: number) {
+
+        var menu = new Atomic.UIMenuWindow(parent, id);
+        menu['folder'] = folder;
+        var src = MenuItemSources.getMenuItemSource("project context folder");
+        menu.show(src, x, y);
+
+    }
+
     handlePopupMenu(target: Atomic.UIWidget, refid: string): boolean {
 
         if (!target || !refid) return;
 
+        if (this.handleFolderContextMenu(target, refid)) {
+
+            return true;
+
+        }
+
         if (target.id == "create popup") {
 
             if (refid == "create_folder") {
@@ -44,7 +85,7 @@ class ProjectFrameMenus extends Atomic.ScriptObject {
 
     }
 
-    contentFolder:string;
+    contentFolder: string;
 
 }
 
@@ -53,6 +94,13 @@ export = ProjectFrameMenus;
 // initialization
 var StringID = strings.StringID;
 
+var folderContextItems = {
+    "Create Folder": ["create_folder", undefined, "Folder.icon"],
+    "Reveal in Finder": ["reveal_folder", undefined, ""],
+    "-1": null,
+    "Delete": ["delete_folder", undefined, "FolderDeleteBitmap"]
+};
+
 var createItems = {
     "Folder": ["create_folder", undefined, "Folder.icon"],
     "-1": null,

+ 2 - 2
Script/AtomicEditor/ui/modal/CreateProject.ts

@@ -77,7 +77,7 @@ class CreateProject extends ModalWindow {
 
         if (!fileSystem.dirExists(folder)) {
 
-          var utils = new Editor.FileUtils();
+            var utils = new Editor.FileUtils();
             utils.createDirs(folder);
 
             utils.createDirs(folder + "Cache");
@@ -98,7 +98,7 @@ class CreateProject extends ModalWindow {
 
         this.hide();
 
-        this.sendEvent(EditorEvents.LoadProject, { path: folder});
+        this.sendEvent(EditorEvents.LoadProject, { path: folder });
 
         return true;
 

+ 10 - 0
Script/AtomicEditor/ui/modal/ModalOps.ts

@@ -39,6 +39,16 @@ class ModalOps extends Atomic.ScriptObject {
 
     }
 
+    showResourceDelete(asset:ToolCore.Asset) {
+
+      if (this.show()) {
+
+          this.opWindow = new UIResourceOps.ResourceDelete(asset);
+
+      }
+
+    }
+
     showNewProject() {
 
         if (this.show()) {

+ 1 - 1
Script/AtomicEditor/ui/modal/NewProject.ts

@@ -31,7 +31,7 @@ class NewProject extends ModalWindow {
             else if (id == "project_2d") {
                 projectType = "Project2D/";
             }
-            else if (id == "project_2d") {
+            else if (id == "project_3d") {
                 projectType = "Project3D/";
             }
 

+ 58 - 6
Script/AtomicEditor/ui/modal/UIResourceOps.ts

@@ -3,6 +3,58 @@ import EditorUI = require("../EditorUI");
 import ModalWindow = require("./ModalWindow");
 import ResourceOps = require("../../resources/ResourceOps");
 
+export class ResourceDelete extends ModalWindow {
+
+  constructor(asset: ToolCore.Asset) {
+
+      super();
+
+      this.asset = asset;
+      this.init("Delete Resource", "AtomicEditor/editor/ui/resourcedelete.tb.txt");
+      var message = <Atomic.UIEditField> this.getWidget("message");
+
+      var text = "Are you sure you want to delete resource:\n\n";
+      text += asset.path;
+      text += "\n\nThis operation cannot be undone";
+
+      message.text = text;
+
+      this.resizeToFitContent();
+      this.center();
+
+  }
+
+  handleWidgetEvent(ev: Atomic.UIWidgetEvent) {
+
+      if (ev.type == Atomic.UI_EVENT_TYPE_CLICK) {
+
+          var id = ev.target.id;
+
+          if (id == "delete") {
+
+              this.hide();
+
+              var db = ToolCore.getAssetDatabase();
+              db.deleteAsset(this.asset);
+
+              return true;
+          }
+
+          if (id == "cancel") {
+
+              this.hide();
+
+              return true;
+          }
+
+      }
+
+  }
+
+  asset: ToolCore.Asset;
+
+}
+
 export class CreateFolder extends ModalWindow {
 
     constructor(resourcePath: string) {
@@ -22,15 +74,15 @@ export class CreateFolder extends ModalWindow {
 
             if (id == "create") {
 
-              var resourcePath = Atomic.addTrailingSlash(this.resourcePath) + this.nameField.text;
+                var resourcePath = Atomic.addTrailingSlash(this.resourcePath) + this.nameField.text;
 
-              if (ResourceOps.CreateNewFolder(resourcePath)) {
+                if (ResourceOps.CreateNewFolder(resourcePath)) {
 
-                this.hide();
+                    this.hide();
 
-              }
+                }
 
-              return true;
+                return true;
 
             }
 
@@ -45,7 +97,7 @@ export class CreateFolder extends ModalWindow {
 
     }
 
-    resourcePath:string;
+    resourcePath: string;
     nameField: Atomic.UIEditField;
 
 }

+ 1 - 1
Script/TypeScript/Atomic.d.ts

@@ -7154,7 +7154,7 @@ declare module Atomic {
 
       constructor(target: UIWidget, id: string);
 
-      show(source: UISelectItemSource): void;
+      show(source: UISelectItemSource, x?: number, y?: number): void;
       close(): void;
 
    }

+ 1 - 0
Script/TypeScript/ToolCore.d.ts

@@ -279,6 +279,7 @@ declare module ToolCore {
       generateAssetGUID(): string;
       registerGUID(guid: string): void;
       getCachePath(): string;
+      deleteAsset(asset: Asset): void;
       scan(): void;
       getDotAssetFilename(path: string): string;
       getFolderAssets(folder:string):ToolCore.Asset[];

+ 1 - 1
Source/Atomic/UI/UIListView.cpp

@@ -237,7 +237,7 @@ bool ListViewItemWidget::OnEvent(const TBWidgetEvent &ev)
         return false;
     }
 
-    if (ev.type == EVENT_TYPE_POINTER_DOWN)
+    if (ev.type == EVENT_TYPE_POINTER_DOWN || ev.type == EVENT_TYPE_RIGHT_POINTER_UP)
     {
         TBWidget* parent = GetParent();
 

+ 11 - 2
Source/Atomic/UI/UIMenuWindow.cpp

@@ -29,14 +29,23 @@ UIMenuWindow::~UIMenuWindow()
         delete source_;
 }
 
-void UIMenuWindow::Show(UISelectItemSource* source)
+void UIMenuWindow::Show(UISelectItemSource* source, int x, int y)
 {
     if (source_)
         delete source_;
 
     source_ = source->GetTBItemSource();
 
-    ((TBMenuWindow*)widget_)->Show(source_, TBPopupAlignment());
+    if (x != -1 && y != -1)
+    {
+        ((TBMenuWindow*)widget_)->Show(source_, TBPopupAlignment(TBPoint(x, y)));
+    }
+    else
+    {
+        ((TBMenuWindow*)widget_)->Show(source_, TBPopupAlignment());
+    }
+
+
 }
 
 bool UIMenuWindow::OnEvent(const tb::TBWidgetEvent &ev)

+ 1 - 1
Source/Atomic/UI/UIMenuWindow.h

@@ -18,7 +18,7 @@ public:
     UIMenuWindow(Context* context, UIWidget* target, const String& id);
     virtual ~UIMenuWindow();
 
-    void Show(UISelectItemSource* source);
+    void Show(UISelectItemSource* source, int x = -1, int y = -1);
 
     void Close();
 

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

@@ -577,6 +577,20 @@ bool UIWidget::OnEvent(const tb::TBWidgetEvent &ev)
 
         }
 
+    }
+    else if (ev.type == EVENT_TYPE_RIGHT_POINTER_UP)
+    {
+        if (!ev.target || ui->IsWidgetWrapped(ev.target))
+        {
+            VariantMap eventData;
+            ConvertEvent(this, ui->WrapWidget(ev.target), ev, eventData);
+            SendEvent(E_WIDGETEVENT, eventData);
+
+            if (eventData[WidgetEvent::P_HANDLED].GetBool())
+                return true;
+
+        }
+
     }
     else if (ev.type == EVENT_TYPE_POINTER_DOWN)
     {

+ 36 - 0
Source/ToolCore/Assets/AssetDatabase.cpp

@@ -171,6 +171,42 @@ void AssetDatabase::AddAsset(SharedPtr<Asset>& asset)
     SendEvent(E_RESOURCEADDED, eventData);
 }
 
+void AssetDatabase::DeleteAsset(Asset* asset)
+{
+    SharedPtr<Asset> assetPtr(asset);
+
+    List<SharedPtr<Asset>>::Iterator itr = assets_.Find(assetPtr);
+
+    if (itr == assets_.End())
+        return;
+
+    assets_.Erase(itr);
+
+    const String& resourcePath = asset->GetPath();
+
+    FileSystem* fs = GetSubsystem<FileSystem>();
+
+    if (fs->DirExists(resourcePath))
+    {
+        fs->RemoveDir(resourcePath, true);
+    }
+    else if (fs->FileExists(resourcePath))
+    {
+        fs->Delete(resourcePath);
+    }
+
+    String dotAsset = resourcePath + ".asset";
+
+    if (fs->FileExists(dotAsset))
+    {
+        fs->Delete(dotAsset);
+    }
+
+    VariantMap eventData;
+    eventData[ResourceRemoved::P_GUID] = asset->GetGUID();
+    SendEvent(E_RESOURCEREMOVED, eventData);
+}
+
 void AssetDatabase::ImportDirtyAssets()
 {
 

+ 2 - 0
Source/ToolCore/Assets/AssetDatabase.h

@@ -29,6 +29,8 @@ public:
 
     String GetCachePath();
 
+    void DeleteAsset(Asset* asset);
+
     void Scan();
 
     void GetFolderAssets(String folder, PODVector<Asset*>& assets) const;