From 4adcedcf28f6f70364ebd7b8d9ff0802f0bba432 Mon Sep 17 00:00:00 2001 From: Areloch Date: Sat, 11 Jul 2020 16:49:06 -0500 Subject: [PATCH] Added/Improved some asset type icons Renamed current default import config to DefaultConfig Updated Asset Browser UI layout. Fixed sizing behavior for Edit Asset window Fixed sizing behavior for Edit Module window Implemented Collection Sets system Implemented handling of non-asset loose files for AB Initial handling logic for prefabs for AB Updated Asset Importer to hook into C++ AssetImporter Made Add Module window properly reset module name field when opened Overhauled entire AB search system so it can use phrases and compound search logic Overhauled asset previews to utilize single guiIconButtonCtrl for efficiency and stability Updated Asset Preview Drag-n-drop to work with new previews Begun initial work with Tags integration into AB - currently only works with datablock categories Bugin initial work with Creator classes - currently only populates category lists, no items Added logic for scanning current AB directory for non-asset loose files, and activating an Auto-Import button if any are found Added ability to drag-n-drop datablocks from AB and spawn requisite object Stabilized drag-n-drop behavior of ShapeAssets, so when spawned, it'll find a much more sane drop position Fixed shapeAsset fields for drag-n-drop behavior so it correctly sets field now Adjusted folder and asset search fields in AB to utilize placeholder text Added logic when creating new module to prompt auto-populating common default folders Shifted preview size to slider Added logic to MenuBuilder so popup menus can utilize bitmap arrays Added editor setting for if to display loose files in AB Minor theme color corrections for some profiles --- .../game/tools/assetBrowser/art/checkbox.png | Bin 0 -> 3943 bytes .../tools/assetBrowser/art/datablockIcon.png | Bin 0 -> 6937 bytes .../tools/assetBrowser/art/folderIcon.png | Bin 10669 -> 11562 bytes .../tools/assetBrowser/art/gameObjectIcon.png | Bin 14773 -> 41341 bytes .../assetBrowser/art/genericAssetIcon.png | Bin 0 -> 43235 bytes .../tools/assetBrowser/art/looseFileIcon.png | Bin 0 -> 43630 bytes .../tools/assetBrowser/assetImportConfigs.xml | 211 ++-- .../tools/assetBrowser/guis/assetBrowser.gui | 707 +++++++---- .../guis/createNewCollectionSet.gui | 124 ++ .../tools/assetBrowser/guis/editAsset.gui | 28 +- .../tools/assetBrowser/guis/editModule.gui | 10 +- .../BaseGame/game/tools/assetBrowser/main.cs | 29 +- .../assetBrowser/scripts/addModuleWindow.cs | 5 + .../assetBrowser/scripts/assetBrowser.cs | 1099 ++++++++++++++--- .../tools/assetBrowser/scripts/assetImport.cs | 640 +--------- .../assetBrowser/scripts/assetImportConfig.cs | 13 +- .../scripts/assetTypes/cubemap.cs | 6 +- .../scripts/assetTypes/datablockObjects.cs | 44 +- .../assetBrowser/scripts/assetTypes/image.cs | 2 +- .../assetBrowser/scripts/assetTypes/level.cs | 4 + .../scripts/assetTypes/looseFiles.cs | 14 + .../scripts/assetTypes/material.cs | 8 +- .../assetBrowser/scripts/assetTypes/prefab.cs | 14 + .../assetBrowser/scripts/assetTypes/shape.cs | 12 +- .../assetBrowser/scripts/directoryHandling.cs | 24 +- .../tools/assetBrowser/scripts/editModule.cs | 35 +- .../assetBrowser/scripts/looseFileAudit.cs | 4 + .../tools/assetBrowser/scripts/popupMenus.cs | 36 +- .../tools/assetBrowser/scripts/profiles.cs | 27 + .../game/tools/base/menuBar/menuBuilder.ed.cs | 3 +- .../game/tools/gui/editorSettingsWindow.ed.cs | 1 + .../tools/gui/images/stencilIcons/cross.png | Bin 0 -> 15480 bytes .../tools/gui/images/stencilIcons/filter.png | Bin 0 -> 6559 bytes .../tools/gui/images/stencilIcons/import.png | Bin 0 -> 15285 bytes .../gui/images/stencilIcons/menuGrid.png | Bin 0 -> 15242 bytes .../tools/gui/images/stencilIcons/phone.png | Bin 0 -> 15246 bytes .../tools/gui/images/stencilIcons/plus.png | Bin 0 -> 15215 bytes .../gui/images/stencilIcons/previous.png | Bin 0 -> 15366 bytes .../tools/gui/images/stencilIcons/return.png | Bin 0 -> 15821 bytes .../tools/gui/images/stencilIcons/warning.png | Bin 0 -> 15751 bytes .../tools/gui/images/stencilIcons/zoom.png | Bin 0 -> 15871 bytes .../BaseGame/game/tools/gui/profiles.ed.cs | 4 +- 42 files changed, 1944 insertions(+), 1160 deletions(-) create mode 100644 Templates/BaseGame/game/tools/assetBrowser/art/checkbox.png create mode 100644 Templates/BaseGame/game/tools/assetBrowser/art/datablockIcon.png create mode 100644 Templates/BaseGame/game/tools/assetBrowser/art/genericAssetIcon.png create mode 100644 Templates/BaseGame/game/tools/assetBrowser/art/looseFileIcon.png create mode 100644 Templates/BaseGame/game/tools/assetBrowser/guis/createNewCollectionSet.gui create mode 100644 Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/looseFiles.cs create mode 100644 Templates/BaseGame/game/tools/assetBrowser/scripts/profiles.cs create mode 100644 Templates/BaseGame/game/tools/gui/images/stencilIcons/cross.png create mode 100644 Templates/BaseGame/game/tools/gui/images/stencilIcons/filter.png create mode 100644 Templates/BaseGame/game/tools/gui/images/stencilIcons/import.png create mode 100644 Templates/BaseGame/game/tools/gui/images/stencilIcons/menuGrid.png create mode 100644 Templates/BaseGame/game/tools/gui/images/stencilIcons/phone.png create mode 100644 Templates/BaseGame/game/tools/gui/images/stencilIcons/plus.png create mode 100644 Templates/BaseGame/game/tools/gui/images/stencilIcons/previous.png create mode 100644 Templates/BaseGame/game/tools/gui/images/stencilIcons/return.png create mode 100644 Templates/BaseGame/game/tools/gui/images/stencilIcons/warning.png create mode 100644 Templates/BaseGame/game/tools/gui/images/stencilIcons/zoom.png diff --git a/Templates/BaseGame/game/tools/assetBrowser/art/checkbox.png b/Templates/BaseGame/game/tools/assetBrowser/art/checkbox.png new file mode 100644 index 0000000000000000000000000000000000000000..46e0ac959fc26d224015f316df050c2f137af4d0 GIT binary patch literal 3943 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 S3QYOT0XMIk>c74QkN6*F=2BAt literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/tools/assetBrowser/art/datablockIcon.png b/Templates/BaseGame/game/tools/assetBrowser/art/datablockIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..5a691045347bfe7965935c2a368b9a42ecfd81e4 GIT binary patch literal 6937 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 literal 10669 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 literal 14773 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 diff --git a/Templates/BaseGame/game/tools/assetBrowser/art/genericAssetIcon.png b/Templates/BaseGame/game/tools/assetBrowser/art/genericAssetIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..5337b0bcc29ba8716cb12c76605160e982fc05d5 GIT binary patch literal 43235 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 literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/tools/assetBrowser/art/looseFileIcon.png b/Templates/BaseGame/game/tools/assetBrowser/art/looseFileIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..09f0f85ed04036f14c5c2a775e12939dc2e018ae GIT binary patch literal 43630 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 literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/tools/assetBrowser/assetImportConfigs.xml b/Templates/BaseGame/game/tools/assetBrowser/assetImportConfigs.xml index 3bbd75af6..c8a5afeda 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/assetImportConfigs.xml +++ b/Templates/BaseGame/game/tools/assetBrowser/assetImportConfigs.xml @@ -1,137 +1,138 @@ - - - 1 - 1 - 1 - 1 - 1 - - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - TrailingNumber - 0 - 0 - 0 - Z_AXIS - 0 - - - _NORMAL,_NORM - _AO,_AMBIENT,_AMBIENTOCCLUSION - _METAL,_MET,_METALNESS,_METALLIC - _COMP,_COMPOSITE - _ROUGH,_ROUGHNESS - N/A - 1 - 1.0 - Bilinear - 0 - _ALBEDO,_DIFFUSE,_ALB,_DIF,_COLOR,_COL - 1 - _SMOOTH,_SMOOTHNESS - 1 - - - AutoPrune - 0 - 0 - 1 - - - Col - LOS - 1 - 1 - CollisionMesh - CollisionMesh - + 1 - Seconds - 2 1 - - 1.0 - 1.0 - 0 - - - + 1 _METAL,_MET,_METALNESS,_METALLIC + _AO,_AMBIENT,_AMBIENTOCCLUSION 0 Bilinear - _SMOOTH,_SMOOTHNESS - 1 + _ROUGH,_ROUGHNESS + 1 _ALBEDO,_DIFFUSE,_ALB,_DIF,_COLOR,_COL,_baseColor,_a, - _AO,_AMBIENT,_AMBIENTOCCLUSION + _SMOOTH,_SMOOTHNESS _COMP,_COMPOSITE 1.0 - 1 _NORMAL,_NORM - _ROUGH,_ROUGHNESS - 1 + 1 N/A - 1 + 1 - - CollisionMesh - LOS - Col - CollisionMesh - 1 - 1 + + 0 + 0 + 0 + Z_AXIS + 0 + 1 + 1 + 0 + 0.01 + 0 + 0 + TrailingNumber 0 - 1.0 1.0 + 1.0 - - AutoPrune - - - 1 - 0 - 0 - 0 - 0 - 1 - TrailingNumber - 0 - Z_AXIS - 0 - 0.01 - 0 + + CollisionMesh + LOS + Col + 1 + CollisionMesh + 1 ColorEffect*, - 1 - 1 1 - 0 + 1 1 + 1 + 0 + 1 + + + AutoPrune + + + + + _AO,_AMBIENT,_AMBIENTOCCLUSION + 1 + _ALBEDO,_DIFFUSE,_ALB,_DIF,_COLOR,_COL + _SMOOTH,_SMOOTHNESS + _NORMAL,_NORM + N/A + 0 + _ROUGH,_ROUGHNESS + 1.0 + _METAL,_MET,_METALNESS,_METALLIC + 1 + _COMP,_COMPOSITE + Bilinear + 1 + + + 0 + 0 + 0 + 0 + Z_AXIS + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + TrailingNumber + + + 1 + Col + LOS + 1 + CollisionMesh + CollisionMesh - 1 1 + 1 + Seconds + 2 + + + 1 + 0 + 0 + AutoPrune + + + 1.0 + 0 + 1.0 + + + 1 + 1 + 1 + 1 + 1 diff --git a/Templates/BaseGame/game/tools/assetBrowser/guis/assetBrowser.gui b/Templates/BaseGame/game/tools/assetBrowser/guis/assetBrowser.gui index 05b81844a..6b2c57a8e 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/guis/assetBrowser.gui +++ b/Templates/BaseGame/game/tools/assetBrowser/guis/assetBrowser.gui @@ -12,20 +12,7 @@ hovertime = "1000"; isContainer = "1"; canSave = "1"; - canSaveDynamicFields = "1"; - AddNewArtAssetPopup = "18110"; - AddNewAssetPopup = "18112"; - AddNewCppAssetPopup = "18111"; - AddNewScriptAssetPopup = "18109"; - coreModulesFilter = "0"; - currentPreviewPage = "0"; - Enabled = "1"; - navigationHistoryIdx = "0"; - onlyShowModulesWithAssets = "0"; - previewData = "19953"; - previewSize = "80"; - templateFilesPath = "tools/assetBrowser/scripts/templateFiles/"; - totalPages = "1"; + canSaveDynamicFields = "0"; new GuiWindowCtrl(AssetBrowser_addFilterWindow) { text = "Create New Tag"; @@ -167,8 +154,8 @@ anchorBottom = "0"; anchorLeft = "1"; anchorRight = "0"; - position = "256 107"; - extent = "512 554"; + position = "204 80"; + extent = "615 608"; minExtent = "383 274"; horizSizing = "center"; vertSizing = "center"; @@ -181,108 +168,22 @@ canSave = "1"; canSaveDynamicFields = "0"; - new GuiButtonCtrl(CreateAssetButton) { - text = "New"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "3 22"; - extent = "45 19"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "ToolsGuiButtonProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiButtonCtrl(ImportAssetButton) { - text = "Import"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "52 22"; - extent = "45 19"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "ToolsGuiButtonProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiBitmapButtonCtrl(AssetBrowser_NavigateBackBtn) { - bitmap = "tools/gui/images/folderUp.png"; - bitmapMode = "Centered"; - autoFitExtents = "0"; - useModifiers = "0"; - useStates = "1"; - masked = "0"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "98 21"; - extent = "22 22"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiDefaultProfile"; - visible = "1"; - active = "1"; - command = "AssetBrowser.navigateHistoryBack();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiBitmapButtonCtrl(AssetBrowser_NavigateForwardBtn) { - bitmap = "tools/gui/images/folderDown.png"; - bitmapMode = "Centered"; - autoFitExtents = "0"; - useModifiers = "0"; - useStates = "1"; - masked = "0"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "120 21"; - extent = "22 22"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiDefaultProfile"; - visible = "1"; - active = "1"; - command = "AssetBrowser.navigateHistoryForward();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiStackControl(AssetBrowser_BreadcrumbBar) { - stackingType = "Horizontal"; - horizStacking = "Left to Right"; - vertStacking = "Top to Bottom"; - padding = "0"; + new GuiDynamicCtrlArrayControl() { + colCount = "20"; + colSize = "30"; + rowCount = "1"; + rowSize = "30"; + rowSpacing = "0"; + colSpacing = "0"; + frozen = "0"; + autoCellSize = "0"; + fillRowFirst = "1"; dynamicSize = "0"; - dynamicNonStackExtent = "0"; - dynamicPos = "0"; - changeChildSizeToFit = "0"; - changeChildPosition = "1"; - position = "156 21"; - extent = "326 23"; - minExtent = "16 16"; - horizSizing = "width"; + padding = "0 0 0 0"; + position = "0 24"; + extent = "615 30"; + minExtent = "8 2"; + horizSizing = "right"; vertSizing = "bottom"; profile = "GuiDefaultProfile"; visible = "1"; @@ -290,41 +191,188 @@ tooltipProfile = "GuiToolTipProfile"; hovertime = "1000"; isContainer = "1"; + internalName = "topBar"; canSave = "1"; canSaveDynamicFields = "0"; - }; - new GuiBitmapButtonCtrl(AssetBrowser_VisibilityOptions) { - bitmap = "tools/gui/images/visible"; - bitmapMode = "Centered"; - autoFitExtents = "0"; - useModifiers = "0"; - useStates = "1"; - masked = "0"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "487 21"; - extent = "23 23"; - minExtent = "8 2"; - horizSizing = "left"; - vertSizing = "bottom"; - profile = "ToolsGuiSolidDefaultProfile"; - visible = "1"; - active = "1"; - command = "AssetBrowser.showVisibiltyOptions();"; - tooltipProfile = "GuiToolTipProfile"; - tooltip = "Visibility Options"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; + + new GuiIconButtonCtrl() { + buttonMargin = "4 4"; + iconBitmap = "tools/gui/images/stencilIcons/phone.png"; + iconLocation = "Left"; + sizeIconToButton = "1"; + makeIconSquare = "1"; + textLocation = "Left"; + textMargin = "4"; + autoSize = "0"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "0 0"; + extent = "30 30"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "bottom"; + profile = "ToolsGuiDefaultProfile"; + visible = "1"; + active = "1"; + tooltipProfile = "GuiToolTipProfile"; + tooltip = "Controls for layout and window mode."; + hovertime = "1000"; + isContainer = "0"; + internalName = "windowOptionsButton"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + new GuiIconButtonCtrl() { + buttonMargin = "4 4"; + iconBitmap = "tools/gui/images/stencilIcons/plus.png"; + iconLocation = "Left"; + sizeIconToButton = "1"; + makeIconSquare = "1"; + textLocation = "Center"; + textMargin = "4"; + autoSize = "0"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "30 0"; + extent = "30 30"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "bottom"; + profile = "ToolsGuiDefaultProfile"; + visible = "1"; + active = "1"; + tooltipProfile = "GuiToolTipProfile"; + tooltip = "Create a new asset in the current directory"; + hovertime = "1000"; + isContainer = "0"; + internalName = "CreateAssetButton"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + new GuiIconButtonCtrl() { + buttonMargin = "4 4"; + iconBitmap = "tools/gui/images/stencilIcons/import.png"; + iconLocation = "Left"; + sizeIconToButton = "1"; + makeIconSquare = "1"; + textLocation = "Center"; + textMargin = "4"; + autoSize = "0"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "60 0"; + extent = "30 30"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "bottom"; + profile = "ToolsGuiDefaultProfile"; + visible = "1"; + active = "1"; + tooltipProfile = "GuiToolTipProfile"; + tooltip = "Import a file to be a new asset in the current directory"; + hovertime = "1000"; + isContainer = "0"; + internalName = "ImportAssetButton"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + new GuiIconButtonCtrl() { + buttonMargin = "4 4"; + iconBitmap = "tools/gui/images/stencilIcons/filter.png"; + iconLocation = "Left"; + sizeIconToButton = "1"; + makeIconSquare = "1"; + textLocation = "Center"; + textMargin = "4"; + autoSize = "0"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "90 0"; + extent = "30 30"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "bottom"; + profile = "ToolsGuiDefaultProfile"; + visible = "1"; + active = "1"; + command = "AssetBrowser.showVisibiltyOptions();"; + tooltipProfile = "GuiToolTipProfile"; + tooltip = "Visibility and filter modes."; + hovertime = "1000"; + isContainer = "0"; + internalName = "filterAssetsButton"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + new GuiIconButtonCtrl() { + buttonMargin = "4 4"; + iconBitmap = "tools/gui/images/stencilIcons/return.png"; + iconLocation = "Left"; + sizeIconToButton = "1"; + makeIconSquare = "1"; + textLocation = "Center"; + textMargin = "4"; + autoSize = "0"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "120 0"; + extent = "30 30"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "bottom"; + profile = "ToolsGuiDefaultProfile"; + visible = "1"; + active = "1"; + command = "AssetBrowser.refreshDatabases();"; + tooltipProfile = "GuiToolTipProfile"; + tooltip = "Refresh Asset and Module databases."; + hovertime = "1000"; + isContainer = "0"; + internalName = "refreshDatabasesButton"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + new GuiIconButtonCtrl() { + buttonMargin = "4 4"; + iconBitmap = "tools/gui/images/stencilIcons/warning.png"; + iconLocation = "Left"; + sizeIconToButton = "1"; + makeIconSquare = "1"; + textLocation = "Center"; + textMargin = "4"; + autoSize = "0"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "150 0"; + extent = "30 30"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "bottom"; + profile = "ToolsGuiDefaultProfile"; + visible = "1"; + active = "1"; + command = "AssetBrowser.autoImportSimpleLooseFiles();"; + tooltipProfile = "GuiToolTipProfile"; + tooltip = "Find all loose files that are of a \"simple\" type and automatically import them."; + hovertime = "1000"; + isContainer = "0"; + internalName = "AutoImportAssetButton"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; }; new GuiSplitContainer(AssetBrowser_MainSplit) { orientation = "Vertical"; splitterSize = "2"; - splitPoint = "149 100"; + splitPoint = "190 100"; fixedPanel = "None"; - fixedSize = "356"; + fixedSize = "468"; docking = "None"; margin = "0 0 0 0"; padding = "0 0 0 0"; @@ -332,8 +380,8 @@ anchorBottom = "0"; anchorLeft = "1"; anchorRight = "0"; - position = "3 42"; - extent = "505 509"; + position = "3 56"; + extent = "608 532"; minExtent = "64 64"; horizSizing = "relative"; vertSizing = "height"; @@ -355,7 +403,7 @@ anchorLeft = "1"; anchorRight = "0"; position = "0 0"; - extent = "147 509"; + extent = "188 532"; minExtent = "0 0"; horizSizing = "right"; vertSizing = "bottom"; @@ -376,8 +424,8 @@ anchorBottom = "0"; anchorLeft = "1"; anchorRight = "0"; - position = "0 0"; - extent = "147 31"; + position = "0 -4"; + extent = "188 25"; minExtent = "8 2"; horizSizing = "width"; vertSizing = "bottom"; @@ -396,7 +444,7 @@ sinkAllKeyEvents = "0"; password = "0"; passwordMask = "*"; - text = "Search Folders..."; + placeholderText = "Search Folders..."; maxLength = "1024"; margin = "0 0 0 0"; padding = "0 0 0 0"; @@ -404,8 +452,8 @@ anchorBottom = "0"; anchorLeft = "1"; anchorRight = "0"; - position = "0 0"; - extent = "148 18"; + position = "0 3"; + extent = "189 18"; minExtent = "8 2"; horizSizing = "width"; vertSizing = "height"; @@ -418,10 +466,11 @@ class = "AssetBrowserSearchFilterTxt"; canSave = "1"; canSaveDynamicFields = "0"; + command="AssetBrowserFolderSearchFilter.onEdited();"; }; - new GuiBitmapButtonCtrl(AssetBrowser_ClearFolderFilterBtn) { - bitmap = "tools/gui/images/clear-icon"; - bitmapMode = "Centered"; + new GuiBitmapButtonCtrl() { + bitmap = "tools/gui/images/stencilIcons/zoom.png"; + bitmapMode = "Stretched"; autoFitExtents = "0"; useModifiers = "0"; useStates = "1"; @@ -429,7 +478,7 @@ groupNum = "-1"; buttonType = "PushButton"; useMouseEvents = "0"; - position = "132 0"; + position = "173 4"; extent = "15 15"; minExtent = "8 2"; horizSizing = "left"; @@ -440,6 +489,8 @@ tooltipProfile = "GuiToolTipProfile"; hovertime = "1000"; isContainer = "0"; + internalName = "folderSearchBtn"; + class = "AssetBrowserFolderSearchBtn"; canSave = "1"; canSaveDynamicFields = "0"; }; @@ -452,7 +503,7 @@ anchorLeft = "1"; anchorRight = "0"; position = "0 17"; - extent = "147 493"; + extent = "188 516"; minExtent = "8 2"; horizSizing = "width"; vertSizing = "height"; @@ -482,7 +533,7 @@ anchorLeft = "1"; anchorRight = "0"; position = "0 0"; - extent = "147 493"; + extent = "188 516"; minExtent = "8 8"; horizSizing = "width"; vertSizing = "height"; @@ -518,7 +569,7 @@ canRenameObjects = "1"; renameInternal = "0"; position = "1 1"; - extent = "145 147"; + extent = "186 2"; minExtent = "8 2"; horizSizing = "right"; vertSizing = "bottom"; @@ -543,8 +594,8 @@ anchorBottom = "0"; anchorLeft = "1"; anchorRight = "0"; - position = "151 0"; - extent = "354 509"; + position = "192 0"; + extent = "416 532"; minExtent = "16 16"; horizSizing = "right"; vertSizing = "bottom"; @@ -565,8 +616,135 @@ anchorBottom = "0"; anchorLeft = "1"; anchorRight = "0"; - position = "1 0"; - extent = "354 19"; + position = "0 0"; + extent = "418 20"; + minExtent = "8 2"; + horizSizing = "width"; + vertSizing = "bottom"; + profile = "GuiDefaultProfile"; + visible = "1"; + active = "1"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "1"; + canSave = "1"; + canSaveDynamicFields = "0"; + + new GuiBitmapButtonCtrl(AssetBrowser_NavigateBackBtn) { + bitmap = "tools/gui/images/folderUp.png"; + bitmapMode = "Centered"; + autoFitExtents = "0"; + useModifiers = "0"; + useStates = "1"; + masked = "0"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "0 0"; + extent = "22 22"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "bottom"; + profile = "GuiDefaultProfile"; + visible = "1"; + active = "1"; + command = "AssetBrowser.navigateHistoryBack();"; + tooltipProfile = "GuiToolTipProfile"; + tooltip = "Navigate Back in history"; + hovertime = "1000"; + isContainer = "0"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + new GuiBitmapButtonCtrl(AssetBrowser_NavigateForwardBtn) { + bitmap = "tools/gui/images/folderDown.png"; + bitmapMode = "Centered"; + autoFitExtents = "0"; + useModifiers = "0"; + useStates = "1"; + masked = "0"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "22 0"; + extent = "22 22"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "bottom"; + profile = "GuiDefaultProfile"; + visible = "1"; + active = "1"; + command = "AssetBrowser.navigateHistoryForward();"; + tooltipProfile = "GuiToolTipProfile"; + tooltip = "Navigate forward in history"; + hovertime = "1000"; + isContainer = "0"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + new GuiStackControl(AssetBrowser_BreadcrumbBar) { + stackingType = "Horizontal"; + horizStacking = "Left to Right"; + vertStacking = "Top to Bottom"; + padding = "0"; + dynamicSize = "0"; + dynamicNonStackExtent = "0"; + dynamicPos = "0"; + changeChildSizeToFit = "0"; + changeChildPosition = "1"; + position = "52 0"; + extent = "365 23"; + minExtent = "16 16"; + horizSizing = "width"; + vertSizing = "bottom"; + profile = "GuiDefaultProfile"; + visible = "1"; + active = "1"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "1"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + new GuiTextEditCtrl() { + historySize = "0"; + tabComplete = "0"; + sinkAllKeyEvents = "0"; + password = "0"; + passwordMask = "*"; + maxLength = "1024"; + margin = "0 0 0 0"; + padding = "0 0 0 0"; + anchorTop = "1"; + anchorBottom = "0"; + anchorLeft = "1"; + anchorRight = "0"; + position = "48 0"; + extent = "369 18"; + minExtent = "8 2"; + horizSizing = "width"; + vertSizing = "bottom"; + profile = "ToolsGuiTextEditProfile"; + visible = "1"; + active = "1"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "1"; + internalName = "NavPath"; + class = "assetBrowserNavPath"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + }; + new GuiContainer() { + margin = "0 0 0 0"; + padding = "0 0 0 0"; + anchorTop = "1"; + anchorBottom = "0"; + anchorLeft = "1"; + anchorRight = "0"; + position = "1 20"; + extent = "416 19"; minExtent = "8 2"; horizSizing = "width"; vertSizing = "bottom"; @@ -579,13 +757,39 @@ canSave = "1"; canSaveDynamicFields = "0"; + new GuiBitmapButtonCtrl(AssetBrowser_VisibilityOptions) { + bitmap = "tools/gui/images/visible"; + bitmapMode = "Centered"; + autoFitExtents = "0"; + useModifiers = "0"; + useStates = "1"; + masked = "0"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "0 0"; + extent = "23 23"; + minExtent = "8 2"; + horizSizing = "left"; + vertSizing = "bottom"; + profile = "ToolsGuiSolidDefaultProfile"; + visible = "1"; + active = "1"; + command = "AssetBrowser.showVisibiltyOptions();"; + tooltipProfile = "GuiToolTipProfile"; + tooltip = "Visibility Options"; + hovertime = "1000"; + isContainer = "0"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; new GuiTextEditCtrl(AssetBrowserSearchFilter) { historySize = "0"; tabComplete = "0"; sinkAllKeyEvents = "0"; password = "0"; passwordMask = "*"; - text = "Search Assets..."; + placeHolderText = "Search Assets..."; maxLength = "1024"; margin = "0 0 0 0"; padding = "0 0 0 0"; @@ -593,8 +797,8 @@ anchorBottom = "0"; anchorLeft = "1"; anchorRight = "0"; - position = "21 1"; - extent = "314 18"; + position = "22 1"; + extent = "375 18"; minExtent = "8 2"; horizSizing = "width"; vertSizing = "bottom"; @@ -607,9 +811,10 @@ class = "AssetBrowserSearchFilterTxt"; canSave = "1"; canSaveDynamicFields = "0"; + command="AssetBrowserSearchFilter.onEdited();"; }; - new GuiBitmapButtonCtrl(AssetBrowser_ClearAssetFilterBtn) { - bitmap = "tools/gui/images/clear-icon"; + new GuiBitmapButtonCtrl() { + bitmap = "tools/gui/images/stencilIcons/zoom.png"; bitmapMode = "Stretched"; autoFitExtents = "0"; useModifiers = "0"; @@ -618,7 +823,7 @@ groupNum = "-1"; buttonType = "PushButton"; useMouseEvents = "0"; - position = "321 1"; + position = "383 1"; extent = "15 15"; minExtent = "8 2"; horizSizing = "left"; @@ -627,40 +832,15 @@ visible = "1"; active = "1"; tooltipProfile = "GuiToolTipProfile"; - tooltip = "Create New Asset"; hovertime = "1000"; isContainer = "0"; + internalName = "assetSearchBtn"; + class = "AssetBrowserAssetSearchBtn"; canSave = "1"; canSaveDynamicFields = "0"; }; - new GuiBitmapButtonCtrl(AssetBrowser_ToggleFolderPanel) { - bitmap = "tools/gui/images/iconList.png"; - bitmapMode = "Centered"; - autoFitExtents = "0"; - useModifiers = "0"; - useStates = "1"; - masked = "0"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "1 1"; - extent = "15 15"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "ToolsGuiSolidDefaultProfile"; - visible = "1"; - active = "1"; - command = "AssetBrowser.toggleFolderCollapseButton();"; - tooltipProfile = "GuiToolTipProfile"; - tooltip = "Toggles the display of the folders panel"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiBitmapButtonCtrl(AssetBrowser_FilterOptionsBtn) { - bitmap = "tools/gui/images/filter.png"; + new GuiBitmapButtonCtrl() { + bitmap = "tools/gui/images/save-icon"; bitmapMode = "Stretched"; autoFitExtents = "0"; useModifiers = "0"; @@ -669,7 +849,7 @@ groupNum = "-1"; buttonType = "PushButton"; useMouseEvents = "0"; - position = "337 1"; + position = "399 1"; extent = "15 15"; minExtent = "8 2"; horizSizing = "left"; @@ -677,11 +857,12 @@ profile = "ToolsGuiSolidDefaultProfile"; visible = "1"; active = "1"; - command = "AssetBrowser.showFilterOptions();"; + command = "Canvas.pushDialog(CreateNewCollectionSetCtrl);"; tooltipProfile = "GuiToolTipProfile"; - tooltip = "Filter Options"; + tooltip = "Save current search parameters as a collectionset"; hovertime = "1000"; isContainer = "0"; + internalName = "saveSearchAsCollectionBtn"; canSave = "1"; canSaveDynamicFields = "0"; }; @@ -693,8 +874,8 @@ anchorBottom = "0"; anchorLeft = "1"; anchorRight = "1"; - position = "1 17"; - extent = "354 487"; + position = "1 37"; + extent = "416 495"; minExtent = "8 2"; horizSizing = "width"; vertSizing = "height"; @@ -724,7 +905,7 @@ anchorLeft = "1"; anchorRight = "0"; position = "0 0"; - extent = "354 467"; + extent = "416 479"; minExtent = "8 8"; horizSizing = "width"; vertSizing = "height"; @@ -739,8 +920,8 @@ new GuiMouseEventCtrl(AssetListPanelInputs) { lockMouse = "0"; - position = "1 0"; - extent = "339 467"; + position = "1 1"; + extent = "414 472"; minExtent = "8 2"; horizSizing = "width"; vertSizing = "height"; @@ -763,8 +944,8 @@ dynamicPos = "0"; changeChildSizeToFit = "1"; changeChildPosition = "0"; - position = "2 1"; - extent = "339 124"; + position = "2 2"; + extent = "414 120"; minExtent = "16 16"; horizSizing = "width"; vertSizing = "bottom"; @@ -778,10 +959,10 @@ canSaveDynamicFields = "0"; new GuiDynamicCtrlArrayControl() { - colCount = "3"; + colCount = "4"; colSize = "100"; rowCount = "1"; - rowSize = "124"; + rowSize = "120"; rowSpacing = "2"; colSpacing = "2"; frozen = "0"; @@ -790,7 +971,7 @@ dynamicSize = "1"; padding = "0 0 0 0"; position = "3 0"; - extent = "339 124"; + extent = "414 120"; minExtent = "8 8"; horizSizing = "width"; vertSizing = "bottom"; @@ -814,8 +995,8 @@ anchorBottom = "0"; anchorLeft = "1"; anchorRight = "0"; - position = "0 467"; - extent = "354 20"; + position = "0 479"; + extent = "416 16"; minExtent = "8 2"; horizSizing = "width"; vertSizing = "height"; @@ -830,6 +1011,7 @@ canSaveDynamicFields = "0"; }; new GuiTextCtrl(AssetBrowser_FooterText) { + text = "0 Assets"; maxLength = "1024"; margin = "0 0 0 0"; padding = "0 0 0 0"; @@ -837,7 +1019,7 @@ anchorBottom = "0"; anchorLeft = "1"; anchorRight = "0"; - position = "0 470"; + position = "0 475"; extent = "269 23"; minExtent = "8 2"; horizSizing = "right"; @@ -851,31 +1033,82 @@ canSave = "1"; canSaveDynamicFields = "0"; }; - }; - new GuiButtonCtrl() { - text = "Select"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "301 488"; - extent = "53 19"; - minExtent = "8 2"; - horizSizing = "left"; - vertSizing = "top"; - profile = "ToolsGuiButtonProfile"; - visible = "0"; - active = "1"; - command = "AssetBrowser.selectAsset( AssetBrowser.selectedAsset );"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "SelectButton"; - hidden = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; + new GuiBitmapButtonCtrl(AssetBrowser_ToggleFolderPanel) { + bitmap = "tools/gui/images/stencilIcons/previous.png"; + bitmapMode = "Stretched"; + autoFitExtents = "0"; + useModifiers = "0"; + useStates = "1"; + masked = "0"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "-2 200"; + extent = "18 18"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "center"; + profile = "ToolsGuiSolidDefaultProfile"; + visible = "1"; + active = "1"; + command = "AssetBrowser.toggleFolderCollapseButton();"; + tooltipProfile = "GuiToolTipProfile"; + tooltip = "Toggles the display of the folders panel"; + hovertime = "1000"; + isContainer = "0"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; }; }; }; + new GuiButtonCtrl() { + text = "Select"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "559 588"; + extent = "53 19"; + minExtent = "8 2"; + horizSizing = "left"; + vertSizing = "top"; + profile = "ToolsGuiButtonProfile"; + visible = "0"; + active = "1"; + command = "AssetBrowser.selectAsset( AssetBrowser.selectedAsset );"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "0"; + internalName = "SelectButton"; + hidden = "1"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + new GuiSliderCtrl() { + range = "0 2"; + ticks = "5"; + snap = "1"; + value = "1"; + useFillBar = "0"; + fillBarColor = "255 255 255 255"; + renderTicks = "0"; + position = "8 588"; + extent = "75 20"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "top"; + profile = "GuiSliderProfile"; + visible = "1"; + active = "1"; + tooltipProfile = "GuiToolTipProfile"; + tooltip = "Controls the asset preview size. At minimum, it will render items as a list."; + hovertime = "1000"; + isContainer = "0"; + internalName = "previewSlider"; + class = "assetBrowserPreviewSlider"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; }; }; //--- OBJECT WRITE END --- diff --git a/Templates/BaseGame/game/tools/assetBrowser/guis/createNewCollectionSet.gui b/Templates/BaseGame/game/tools/assetBrowser/guis/createNewCollectionSet.gui new file mode 100644 index 000000000..faa48bd6e --- /dev/null +++ b/Templates/BaseGame/game/tools/assetBrowser/guis/createNewCollectionSet.gui @@ -0,0 +1,124 @@ +//--- OBJECT WRITE BEGIN --- +%guiContent = new GuiControl(CreateNewCollectionSetCtrl) { + position = "0 0"; + extent = "1024 768"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "bottom"; + profile = "ToolsGuiDefaultNonModalProfile"; + visible = "1"; + active = "1"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "1"; + canSave = "1"; + canSaveDynamicFields = "1"; + Enabled = "1"; + + new GuiWindowCtrl() { + text = "Name New Collection Set"; + resizeWidth = "1"; + resizeHeight = "0"; + canMove = "1"; + canClose = "1"; + canMinimize = "0"; + canMaximize = "0"; + canCollapse = "0"; + edgeSnap = "1"; + margin = "0 0 0 0"; + padding = "0 0 0 0"; + anchorTop = "1"; + anchorBottom = "0"; + anchorLeft = "1"; + anchorRight = "0"; + position = "362 334"; + extent = "355 99"; + minExtent = "48 92"; + horizSizing = "center"; + vertSizing = "center"; + profile = "ToolsGuiWindowProfile"; + visible = "1"; + active = "1"; + closeCommand = "Canvas.popDialog(CreateNewCollectionSetCtrl);"; + tooltipProfile = "ToolsGuiToolTipProfile"; + hovertime = "1000"; + isContainer = "1"; + canSave = "1"; + canSaveDynamicFields = "0"; + + new GuiButtonCtrl() { + text = "Select"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "207 68"; + extent = "71 22"; + minExtent = "8 2"; + horizSizing = "left"; + vertSizing = "top"; + profile = "ToolsGuiButtonProfile"; + visible = "1"; + active = "1"; + command = "Canvas.popDialog(CreateNewCollectionSetCtrl); AssetBrowser.saveCurrentFiltersAsCollection();"; + tooltipProfile = "ToolsGuiToolTipProfile"; + hovertime = "1000"; + isContainer = "0"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + new GuiButtonCtrl() { + text = "Cancel"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "284 68"; + extent = "64 22"; + minExtent = "8 2"; + horizSizing = "left"; + vertSizing = "top"; + profile = "ToolsGuiButtonProfile"; + visible = "1"; + active = "1"; + command = "Canvas.popDialog(CreateNewCollectionSetCtrl);"; + tooltipProfile = "ToolsGuiToolTipProfile"; + hovertime = "1000"; + isContainer = "0"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + new GuiTextEditCtrl() { + historySize = "0"; + tabComplete = "0"; + sinkAllKeyEvents = "0"; + password = "0"; + passwordMask = "*"; + maxLength = "1024"; + margin = "0 0 0 0"; + padding = "0 0 0 0"; + anchorTop = "1"; + anchorBottom = "0"; + anchorLeft = "1"; + anchorRight = "0"; + position = "8 38"; + extent = "341 18"; + minExtent = "8 2"; + horizSizing = "width"; + vertSizing = "height"; + profile = "ToolsGuiTextEditProfile"; + visible = "1"; + active = "1"; + tooltipProfile = "ToolsGuiToolTipProfile"; + hovertime = "1000"; + isContainer = "1"; + canSave = "1"; + canSaveDynamicFields = "0"; + internalName="collectionSetName"; + }; + }; +}; +//--- OBJECT WRITE END --- + +function CreateNewCollectionSetCtrl::onWake(%this) +{ + %this-->collectionSetName.setText(""); +} diff --git a/Templates/BaseGame/game/tools/assetBrowser/guis/editAsset.gui b/Templates/BaseGame/game/tools/assetBrowser/guis/editAsset.gui index ba2e61540..180b4b5d7 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/guis/editAsset.gui +++ b/Templates/BaseGame/game/tools/assetBrowser/guis/editAsset.gui @@ -1,7 +1,7 @@ //--- OBJECT WRITE BEGIN --- %guiContent = new GuiControl(AssetBrowser_editAsset) { position = "0 0"; - extent = "1920 1080"; + extent = "1024 768"; minExtent = "8 2"; horizSizing = "right"; vertSizing = "bottom"; @@ -13,7 +13,7 @@ isContainer = "1"; canSave = "1"; canSaveDynamicFields = "1"; - enabled = "1"; + Enabled = "1"; new GuiWindowCtrl(AssetBrowser_editAssetWindow) { text = "Asset Properties"; @@ -32,7 +32,7 @@ anchorBottom = "0"; anchorLeft = "1"; anchorRight = "0"; - position = "710 375"; + position = "262 219"; extent = "500 329"; minExtent = "48 92"; horizSizing = "center"; @@ -48,7 +48,7 @@ new GuiScrollCtrl() { willFirstRespond = "1"; - hScrollBar = "alwaysOff"; + hScrollBar = "dynamic"; vScrollBar = "dynamic"; lockHorizScroll = "0"; lockVertScroll = "0"; @@ -64,9 +64,9 @@ position = "1 21"; extent = "498 283"; minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "Tools"; + horizSizing = "width"; + vertSizing = "height"; + profile = "ToolsGuiScrollProfile"; visible = "1"; active = "1"; tooltipProfile = "GuiToolTipProfile"; @@ -88,9 +88,9 @@ changeChildSizeToFit = "1"; changeChildPosition = "1"; position = "1 1"; - extent = "481 101"; + extent = "493 101"; minExtent = "16 16"; - horizSizing = "right"; + horizSizing = "width"; vertSizing = "bottom"; profile = "GuiInspectorProfile"; visible = "1"; @@ -110,9 +110,9 @@ position = "402 305"; extent = "45 22"; minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "ToolsuiButtonProfile"; + horizSizing = "left"; + vertSizing = "top"; + profile = "ToolsGuiButtonProfile"; visible = "1"; active = "1"; command = "AssetBrowser_editAsset.saveAsset();"; @@ -130,8 +130,8 @@ position = "450 305"; extent = "45 22"; minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; + horizSizing = "left"; + vertSizing = "top"; profile = "ToolsGuiButtonProfile"; visible = "1"; active = "1"; diff --git a/Templates/BaseGame/game/tools/assetBrowser/guis/editModule.gui b/Templates/BaseGame/game/tools/assetBrowser/guis/editModule.gui index 23d0fd616..18927399f 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/guis/editModule.gui +++ b/Templates/BaseGame/game/tools/assetBrowser/guis/editModule.gui @@ -1,7 +1,7 @@ //--- OBJECT WRITE BEGIN --- %guiContent = new GuiControl(AssetBrowser_editModule) { position = "0 0"; - extent = "1920 1080"; + extent = "1024 768"; minExtent = "8 2"; horizSizing = "right"; vertSizing = "bottom"; @@ -13,7 +13,7 @@ isContainer = "1"; canSave = "1"; canSaveDynamicFields = "1"; - enabled = "1"; + Enabled = "1"; new GuiWindowCtrl(AssetBrowser_editModuleWindow) { text = "Module Properties"; @@ -32,7 +32,7 @@ anchorBottom = "0"; anchorLeft = "1"; anchorRight = "0"; - position = "710 375"; + position = "262 219"; extent = "500 329"; minExtent = "48 92"; horizSizing = "center"; @@ -110,7 +110,7 @@ position = "402 305"; extent = "45 22"; minExtent = "8 2"; - horizSizing = "right"; + horizSizing = "left"; vertSizing = "top"; profile = "ToolsGuiButtonProfile"; visible = "1"; @@ -130,7 +130,7 @@ position = "450 305"; extent = "45 22"; minExtent = "8 2"; - horizSizing = "right"; + horizSizing = "left"; vertSizing = "top"; profile = "ToolsGuiButtonProfile"; visible = "1"; diff --git a/Templates/BaseGame/game/tools/assetBrowser/main.cs b/Templates/BaseGame/game/tools/assetBrowser/main.cs index 5f1ad1b4e..a47aeaa73 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/main.cs +++ b/Templates/BaseGame/game/tools/assetBrowser/main.cs @@ -24,6 +24,7 @@ function initializeAssetBrowser() echo(" % - Initializing Asset Browser"); $AssetBrowser::importConfigsFile = "tools/assetBrowser/assetImportConfigs.xml"; + $AssetBrowser::collectionSetsFile = "tools/assetBrowser/searchCollectionSets.xml"; $AssetBrowser::currentImportConfig = ""; if(!isObject(AssetFilterTypeList)) @@ -50,6 +51,8 @@ function initializeAssetBrowser() AssetFilterTypeList.add("TerrainMaterialAsset"); } + exec("./scripts/profiles.cs"); + exec("./guis/assetBrowser.gui"); exec("./guis/addModuleWindow.gui"); exec("./guis/gameObjectCreator.gui"); @@ -67,6 +70,7 @@ function initializeAssetBrowser() exec("./guis/assetImportLog.gui"); exec("./guis/looseFileAudit.gui"); exec("./guis/assetNameEdit.gui"); + exec("./guis/createNewCollectionSet.gui"); exec("./scripts/assetBrowser.cs"); exec("./scripts/popupMenus.cs"); @@ -102,6 +106,8 @@ function initializeAssetBrowser() exec("./scripts/assetTypes/terrain.cs"); exec("./scripts/assetTypes/terrainMaterial.cs"); exec("./scripts/assetTypes/datablockObjects.cs"); + exec("./scripts/assetTypes/looseFiles.cs"); + exec("./scripts/assetTypes/prefab.cs"); new ScriptObject( AssetBrowserPlugin ) { @@ -123,19 +129,34 @@ function initializeAssetBrowser() ImportAssetWindow.reloadImportOptionConfigs(); + //CollectionSets + if(!isObject(AssetBrowserCollectionSets)) + { + new Settings(AssetBrowserCollectionSets) + { + file = $AssetBrowser::collectionSetsFile; + }; + } + AssetBrowserCollectionSets.read(); + if(!isObject(ImportAssetWindow.importTempDirHandler)) ImportAssetWindow.importTempDirHandler = makedirectoryHandler(0, "", ""); if(!isObject(ImportActivityLog)) new ArrayObject(ImportActivityLog); + if(!isObject(AssetSearchTerms)) + new ArrayObject(AssetSearchTerms); + ImportAssetWindow.importingFilesArray = new ArrayObject(); - if(!isObject(SessionImportAssetItems)) - new ArrayObject(SessionImportAssetItems); + //if(!isObject(SessionImportAssetItems)) + // new ArrayObject(SessionImportAssetItems); - if(!isObject(ImportAssetItems)) - new ArrayObject(ImportAssetItems); + //if(!isObject(ImportAssetItems)) + // new ArrayObject(ImportAssetItems); + + ImportAssetWindow.importer = new AssetImporter(); AssetBrowser.buildPopupMenus(); diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/addModuleWindow.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/addModuleWindow.cs index 7c0692ee6..61b671922 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/addModuleWindow.cs +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/addModuleWindow.cs @@ -19,6 +19,11 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. //----------------------------------------------------------------------------- +function AssetBrowser_addModuleWindow::onWake(%this) +{ + %this-->ModuleName.setText(""); +} + function AssetBrowser_addModuleWindow::onGainFirstResponder(%this) { %this-->moduleName.setFirstResponder(); diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.cs index 80668cfde..b8e8bf077 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.cs +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.cs @@ -3,7 +3,7 @@ new SimGroup(AssetBrowserPreviewCache); //AssetBrowser.addToolbarButton function AssetBrowser::addToolbarButton(%this) { - %filename = expandFilename("tools/gui/images/iconOpen"); + %filename = expandFilename("tools/gui/images/stencilIcons/menuGrid"); %button = new GuiBitmapButtonCtrl() { canSaveDynamicFields = "0"; internalName = AssetBrowserBtn; @@ -22,7 +22,7 @@ function AssetBrowser::addToolbarButton(%this) ToolTip = "Asset Browser"; hovertime = "750"; bitmap = %filename; - bitmapMode = "Centered"; + bitmapMode = "Stretched"; buttonType = "PushButton"; groupNum = "0"; useMouseEvents = "0"; @@ -61,11 +61,26 @@ function AssetBrowser::onWake(%this) //First, build our our list of active modules %modulesList = ModuleDatabase.findModules(true); - %this.setPreviewSize(EditorSettings.value("Assets/Browser/previewTileSize", "small")); + AssetBrowser-->previewSlider.setValue(EditorSettings.value("Assets/Browser/previewTileSize", "1.0")); AssetBrowser.toggleAssetTypeFilter(0); } +function contentTreeTabBook::onTabSelected(%this, %tabText, %tabIndex) +{ + if(%tabText $= "Content") + { + //Force it to navigate to current active directory, which also rebuilds the + //tree + AssetBrowser.dirHandler.navigateTo(AssetBrowser.dirHandler.currentAddress); + } + else + { + AssetBrowser-->filterTree.clear(); + AssetBrowser-->filterTree.buildVisibleTree(true); + } +} + //Filters function AssetBrowser::showFilterPopup(%this) { @@ -184,6 +199,37 @@ function AssetBrowser::toggleAssetTypeFilter(%this, %assetTypeIdx) } } + //Update the displayed search text! + //First, clear out the old type search term + for(%i=0; %i < AssetSearchTerms.count(); %i++) + { + %action = AssetSearchTerms.getKey(%i); + + if(%action $= "type") + { + AssetSearchTerms.erase(%i); + %i--; + } + } + + //Update our search terms + %newSearchPhrase = ""; + for(%i=0; %i < AssetFilterTypeList.Count() + 1; %i++) + { + %isChecked = AssetTypeListPopup.isItemChecked(%i); + + if(!%isChecked) + continue; + + %itemText = AssetTypeListPopup.getItemText(%i); + if(%itemText $= "All") + continue; + + AssetSearchTerms.add("type", %itemText); + } + + %this.updateSearchTextFromFilter(); + %this.rebuildAssetArray(); } @@ -315,6 +361,38 @@ function AssetBrowser::buildAssetPreview( %this, %asset, %moduleName ) %assetDesc = %assetName; %assetDesc.assetType = %assetType; } + else if(%assetType $= "LooseFile") + { + %fullPath = %moduleName !$= "" ? %moduleName @ "/" @ %assetName : %assetName; + %fullPath = strreplace(%fullPath, "/", "_"); + %fullPath = strreplace(%fullPath, ".", "-"); + + if(isObject(%fullPath)) + %assetDesc = %fullPath; + else + %assetDesc = new ScriptObject(%fullPath); + + %assetDesc.dirPath = %moduleName; + %assetDesc.assetName = %assetName; + %assetDesc.description = %moduleName @ "/" @ %assetName; + %assetDesc.assetType = %assetType; + } + else if(%assetType $= "Prefab") + { + %fullPath = %moduleName !$= "" ? %moduleName @ "/" @ %assetName : %assetName; + %fullPath = strreplace(%fullPath, "/", "_"); + %fullPath = strreplace(%fullPath, ".", "-"); + + if(isObject(%fullPath)) + %assetDesc = %fullPath; + else + %assetDesc = new ScriptObject(%fullPath); + + %assetDesc.dirPath = %moduleName; + %assetDesc.assetName = %assetName; + %assetDesc.description = %moduleName @ "/" @ %assetName; + %assetDesc.assetType = %assetType; + } } /*%fullPath = %moduleName !$= "" ? %moduleName @ "/" @ %assetName : %assetName; %fullPath = strreplace(%fullPath, "/", "_"); @@ -333,29 +411,65 @@ function AssetBrowser::buildAssetPreview( %this, %asset, %moduleName ) //%assetType = "Folder"; } - %previewSize = %this.previewSize SPC %this.previewSize; + %previewSize = 100 SPC 100; %previewBounds = 20; %tooltip = %assetName; %doubleClickCommand = "AssetBrowser.editAsset( "@%assetDesc@" );"; - if(%assetType $= "ShapeAsset") + /*if(%assetType $= "ShapeAsset") { %previewButton = AssetPreviewButtonsTemplate-->ShapeAssetPreviewButton.deepClone(); } else { %previewButton = AssetPreviewButtonsTemplate-->GeneralAssetPreviewButton.deepClone(); + }*/ + + %textBottomPad = 20; + + %previewButton = new GuiIconButtonCtrl() + { + class = "AssetBrowserPreviewButton"; + useMouseEvents = true; + iconLocation = "Center"; + sizeIconToButton = true; + makeIconSquare = true; + textLocation = "Bottom"; + extent = %previewSize.x SPC %previewSize.y + %textBottomPad; + buttonType = "RadioButton"; + profile = ToolsGuiDefaultProfile; + }; + + %previewScaleSize = AssetBrowser-->previewSlider.getValue(); + + if(%previewScaleSize $= "") + { + %previewScaleSize = 1; + AssetBrowser-->previewSlider.setValue(1); } - %previewButton.extent = %previewSize.x + %previewBounds SPC %previewSize.y + %previewBounds + 24; + if(%previewScaleSize == 0) + { + %previewButton.iconLocation = "Left"; + %previewButton.textLocation = "Right"; + %previewButton.extent = "120 20"; + } + else + { + %size = %previewSize.x * %previewScaleSize; + %previewButton.extent.x = %size; + %previewButton.extent.y = %size + %textBottomPad; + } + + //%previewButton.extent = %previewSize.x + %previewBounds SPC %previewSize.y + %previewBounds + 24; %previewButton.assetName = %assetName; %previewButton.moduleName = %moduleName; %previewButton.assetType = %assetType; //Build out the preview - %buildCommand = %this @ ".build" @ %assetType @ "Preview(" @ %assetDesc @ "," @ %this.previewData @ ");"; + %buildCommand = %this @ ".build" @ %assetType @ "Preview(\"" @ %assetDesc @ "\"," @ %this.previewData @ ");"; eval(%buildCommand); //debug dump @@ -364,34 +478,42 @@ function AssetBrowser::buildAssetPreview( %this, %asset, %moduleName ) %previewImage = %this.previewData.previewImage; %doubleClickCommand = %this.previewData.doubleClickCommand; - %previewButton-->button.assetName = %assetName; - %previewButton-->button.moduleName = %moduleName; - %previewButton-->button.assetType = %assetType; + %previewButton.assetName = %assetName; + %previewButton.moduleName = %moduleName; + %previewButton.assetType = %assetType; if(%assetType $= "ShapeAsset") { - %previewButton-->shapeAssetView.setModel(%previewImage); - %previewButton-->shapeAssetView.extent = %previewSize; + %previewButton.iconBitmap = "tools/assetBrowser/art/genericAssetIcon"; + //%previewButton.profile = AssetBrowserPreviewShapeAsset; + //%previewButton-->shapeAssetView.setModel(%previewImage); + //%previewButton-->shapeAssetView.extent = %previewSize; + } else { - %previewButton-->assetPreviewImage.bitmap = %this.previewData.previewImage; - %previewButton-->assetPreviewImage.extent = %previewSize; + %previewButton.iconBitmap = %this.previewData.previewImage; + //%previewButton-->assetPreviewImage.extent = %previewSize; } - %previewButton-->AssetPreviewBorderButton.extent = %previewSize; + %previewButton.profile = "AssetBrowserPreview" @ %previewButton.assetType; + + //%previewButton-->AssetPreviewBorderButton.extent = %previewSize; //%previewButton-->AssetPreviewButton.internalName = %this.previewData.assetName@"Border"; - %previewButton-->Button.extent = %previewSize.x + %previewBounds SPC %previewSize.y + 24; - %previewButton-->Button.tooltip = %this.previewData.tooltip; - %previewButton-->Button.Command = "AssetBrowser.updateSelection( $ThisControl.getParent().assetName, $ThisControl.getParent().moduleName );"; - %previewButton-->Button.altCommand = %doubleClickCommand; + //%previewButton-->Button.extent = %previewSize.x + %previewBounds SPC %previewSize.y + 24; + %previewButton.tooltip = %this.previewData.tooltip; + %previewButton.Command = "AssetBrowser.updateSelection( $ThisControl.getParent().assetName, $ThisControl.getParent().moduleName );"; + %previewButton.altCommand = %doubleClickCommand; //%previewButton-->AssetPreviewButton.icon = %this.previewData.previewImage; - %previewButton-->AssetNameLabel.position = 0 SPC %previewSize.y + %previewBounds - 16; - %previewButton-->AssetNameLabel.extent = %previewSize.x + %previewBounds SPC 16; - %previewButton-->AssetNameLabel.text = %this.previewData.assetName; - %previewButton-->AssetNameLabel.originalAssetName = %this.previewData.assetName; + %previewButton.text = %this.previewData.assetName; + %previewButton.text.originalAssetName = %this.previewData.assetName; + + //%previewButton-->AssetNameLabel.position = 0 SPC %previewSize.y + %previewBounds - 16; + //%previewButton-->AssetNameLabel.extent = %previewSize.x + %previewBounds SPC 16; + //%previewButton-->AssetNameLabel.text = %this.previewData.assetName; + //%previewButton-->AssetNameLabel.originalAssetName = %this.previewData.assetName; // add to the gui control array AssetBrowser-->assetList.add(%previewButton); @@ -439,26 +561,44 @@ function AssetPreviewButton::onDoubleClick(%this) // // +function assetBrowserPreviewSlider::onMouseDragged(%this) +{ + EditorSettings.setValue("Assets/Browser/previewTileSize", %this.getValue()); + AssetBrowser.refresh(); +} + function AssetBrowser::loadDirectories( %this ) { AssetBrowser-->filterTree.clear(); %dataItem = AssetBrowser-->filterTree.insertItem(0, "Content"); + AssetBrowser-->filterTree.collectionsIdx = AssetBrowser-->filterTree.insertItem(1, "Collections"); + + AssetBrowser-->filterTree.modulesIdx = AssetBrowser-->filterTree.insertItem(1, "Modules"); + + %dataItem = AssetBrowser-->filterTree.insertItem(AssetBrowser-->filterTree.modulesIdx, "Data"); + AssetBrowser-->filterTree.tagsIdx = AssetBrowser-->filterTree.insertItem(1, "Tags"); + AssetBrowser-->filterTree.creatorIdx = AssetBrowser-->filterTree.insertItem(1, "Creator"); - %dataItem = AssetBrowser-->filterTree.insertItem(1, "Data"); %this.dirHandler.loadFolders("Data", %dataItem); + %this.loadCollectionSets(); + + %this.loadTags(); + + %this.loadCreatorClasses(); + //If set to, show core if(%this.coreModulesFilter) { - %coreItem = AssetBrowser-->filterTree.insertItem(1, "Core"); + %coreItem = AssetBrowser-->filterTree.insertItem(AssetBrowser-->filterTree.modulesIdx, "Core"); %this.dirHandler.loadFolders("Core", %coreItem); } //If set to, show tools if(%this.toolsModulesFilter) { - %toolsItem = AssetBrowser-->filterTree.insertItem(1, "Tools"); + %toolsItem = AssetBrowser-->filterTree.insertItem(AssetBrowser-->filterTree.modulesIdx, "Tools"); %this.dirHandler.loadFolders("Tools", %toolsItem); } @@ -575,6 +715,198 @@ function AssetBrowser::updateSelection( %this, %asset, %moduleName ) %this.prevSelectedMaterialHL = %asset; } +function AssetBrowser::loadCollectionSets(%this) +{ + //Process any datablocks and populate their lists categories as tags as well + %collectionsItem = AssetBrowser-->filterTree.collectionsIdx; + + %collectionsCount = AssetBrowserCollectionSets.value("CollectionSetCount", 0); + + for ( %i = 0; %i < %collectionsCount; %i++ ) + { + %collection = AssetBrowserCollectionSets.value("Collection"@%i, ""); + %collectionName = getField(%collection, 0); + %collectionTerm = getField(%collection, 1); + + AssetBrowser-->filterTree.insertItem(%collectionsItem, %collectionName, %collectionTerm); + } +} + +function AssetBrowser::setCollectionSetActive(%this, %collectionSet) +{ + AssetBrowserSearchFilter.setText(%collectionSet); + AssetBrowserSearchFilter.onReturn(); +} + +function AssetBrowser::loadTags(%this) +{ + //Process any datablocks and populate their lists categories as tags as well + %dataGroup = "DataBlockGroup"; + %tagItem = AssetBrowser-->filterTree.tagsIdx; + + for ( %i = 0; %i < %dataGroup.getCount(); %i++ ) + { + %obj = %dataGroup.getObject(%i); + // echo ("Obj: " @ %obj.getName() @ " - " @ %obj.category ); + + if ( %obj.category $= "" && %obj.category == 0 ) + continue; + + %tagChildItem = AssetBrowser-->filterTree.findChildItemByName(%tagItem, %obj.category); + if(%tagChildItem == 0) + { + //Didn't already exist, so register it in + AssetBrowser-->filterTree.insertItem(%tagItem, %obj.category); + } + } +} + +function AssetBrowser::setTagActive(%this, %tag) +{ + %found = false; + + for(%i=0; %i < AssetSearchTerms.count(); %i++) + { + %action = AssetSearchTerms.getKey(%i); + %word = AssetSearchTerms.getValue(%i); + + if(%action $= "tag" && %word $= %tag) + { + //If we found it, we just remove it from our list, toggling it off + AssetSearchTerms.erase(%i); + %found = true; + } + } + + //If we didn't find it, we're going to add it into our list + if(!%found) + { + AssetSearchTerms.add("tag", %tag); + } + + %this.updateSearchTextFromFilter(); + + %this.rebuildAssetArray(); +} + +function AssetBrowser::loadCreatorClasses(%this) +{ + // Just so we can recall this method for testing changes + // without restarting. + if ( isObject( %this.creatorClassArray ) ) + %this.creatorClassArray.delete(); + + %this.creatorClassArray = new ArrayObject(); + %this.creatorClassArray.caseSensitive = true; + //%this.setListView( true ); + + %this.beginCreatorGroup( "Environment" ); + + /*// Removed Prefab as there doesn't really seem to be a point in creating a blank one + //%this.registerMissionObject( "Prefab", "Prefab" ); + %this.registerMissionObject( "SkyBox", "Sky Box" ); + %this.registerMissionObject( "CloudLayer", "Cloud Layer" ); + %this.registerMissionObject( "BasicClouds", "Basic Clouds" ); + %this.registerMissionObject( "ScatterSky", "Scatter Sky" ); + %this.registerMissionObject( "Sun", "Basic Sun" ); + %this.registerMissionObject( "Lightning" ); + %this.registerMissionObject( "WaterBlock", "Water Block" ); + %this.registerMissionObject( "SFXEmitter", "Sound Emitter" ); + %this.registerMissionObject( "Precipitation" ); + %this.registerMissionObject( "ParticleEmitterNode", "Particle Emitter" ); + + // Legacy features. Users should use Ground Cover and the Forest Editor. + //%this.registerMissionObject( "fxShapeReplicator", "Shape Replicator" ); + //%this.registerMissionObject( "fxFoliageReplicator", "Foliage Replicator" ); + + %this.registerMissionObject( "PointLight", "Point Light" ); + %this.registerMissionObject( "SpotLight", "Spot Light" ); + %this.registerMissionObject( "GroundCover", "Ground Cover" ); + %this.registerMissionObject( "TerrainBlock", "Terrain Block" ); + %this.registerMissionObject( "GroundPlane", "Ground Plane" ); + %this.registerMissionObject( "WaterPlane", "Water Plane" ); + %this.registerMissionObject( "PxCloth", "Cloth" ); + %this.registerMissionObject( "ForestWindEmitter", "Wind Emitter" ); + + %this.registerMissionObject( "DustEmitter", "Dust Emitter" ); + %this.registerMissionObject( "DustSimulation", "Dust Simulation" ); + %this.registerMissionObject( "DustEffecter", "Dust Effecter" );*/ + + %this.endCreatorGroup(); + + %this.beginCreatorGroup( "Level" ); + + /*%this.registerMissionObject( "MissionArea", "Mission Area" ); + %this.registerMissionObject( "Path" ); + %this.registerMissionObject( "Marker", "Path Node" ); + %this.registerMissionObject( "Trigger" ); + %this.registerMissionObject( "PhysicalZone", "Physical Zone" ); + %this.registerMissionObject( "Camera" ); + %this.registerMissionObject( "LevelInfo", "Level Info" ); + %this.registerMissionObject( "TimeOfDay", "Time of Day" ); + %this.registerMissionObject( "Zone", "Zone" ); + %this.registerMissionObject( "Portal", "Zone Portal" ); + %this.registerMissionObject( "SpawnSphere", "Player Spawn Sphere", "PlayerDropPoint" ); + %this.registerMissionObject( "SpawnSphere", "Observer Spawn Sphere", "ObserverDropPoint" ); + %this.registerMissionObject( "SFXSpace", "Sound Space" ); + %this.registerMissionObject( "OcclusionVolume", "Occlusion Volume" );*/ + + %this.endCreatorGroup(); + + %this.beginCreatorGroup( "System" ); + + //%this.registerMissionObject( "SimGroup" ); + //%this.registerMissionObject( "AIPathGroup" ); + + %this.endCreatorGroup(); + + %this.beginCreatorGroup( "ExampleObjects" ); + + //%this.registerMissionObject( "RenderObjectExample" ); + //%this.registerMissionObject( "RenderMeshExample" ); + //%this.registerMissionObject( "RenderShapeExample" ); + + %this.endCreatorGroup(); + + %this.creatorClassArray.sortk(); +} + +function AssetBrowser::beginCreatorGroup(%this, %group) +{ + %this.currentCreatorGroup = %group; + + AssetBrowser-->filterTree.insertItem(AssetBrowser-->filterTree.creatorIdx, %group); +} + +function AssetBrowser::endCreatorGroup(%this, %group) +{ + %this.currentCreatorGroup = ""; +} + +function AssetBrowser::addCreatorClass(%this, %class, %name, %buildfunc) +{ + if( !isClass(%class) ) + return; + + if ( %name $= "" ) + %name = %class; + + if ( %this.currentCreatorGroup !$= "" && %group $= "" ) + %group = %this.currentCreatorGroup; + + if ( %class $= "" || %group $= "" ) + { + warn( "AssetBrowser::addCreatorClass, invalid parameters!" ); + return; + } + + %args = new ScriptObject(); + %args.val[0] = %class; + %args.val[1] = %name; + %args.val[2] = %buildfunc; + + %this.creatorClassArray.push_back( %group, %args ); +} // //needs to be deleted with the persistence manager and needs to be blanked out of the matmanager //also need to update instances... i guess which is the tricky part.... @@ -777,12 +1109,12 @@ function AssetBrowser::reImportAsset(%this) // // // RMB context popups -function AssetPreviewButton::onRightClick(%this) +function AssetBrowserPreviewButton::onRightClick(%this) { - AssetBrowser.selectedAssetPreview = %this.getParent(); - EditAssetPopup.assetId = %this.getParent().moduleName @ ":" @ %this.getParent().assetName; - EditAssetPopup.assetType = %this.getParent().assetType; - %assetType = %this.getParent().assetType; + AssetBrowser.selectedAssetPreview = %this; + EditAssetPopup.assetId = %this.moduleName @ ":" @ %this.assetName; + EditAssetPopup.assetType = %this.assetType; + %assetType = %this.assetType; //Do some enabling/disabling of options depending on asset type EditAssetPopup.enableItem(0, true); @@ -806,7 +1138,7 @@ function AssetPreviewButton::onRightClick(%this) EditLevelAssetPopup.showPopup(Canvas); else if(%assetType $= "Folder") { - EditFolderPopup.dirPath = %this.getParent().moduleName @ "/" @ %this.getParent().assetName; + EditFolderPopup.dirPath = %this.moduleName @ "/" @ %this.assetName; EditFolderPopup.showPopup(Canvas); } else @@ -814,7 +1146,7 @@ function AssetPreviewButton::onRightClick(%this) if(%assetType $= "Folder") { - EditAssetPopup.assetId = %this.getParent().moduleName @ "/" @ %this.getParent().assetName; + EditAssetPopup.assetId = %this.moduleName @ "/" @ %this.assetName; } } @@ -829,88 +1161,129 @@ function AssetBrowserFilterTree::onRightMouseDown(%this, %itemId) %count = %this.getSelectedItemsCount(); %itemText = %this.getItemText(%itemId); - if( %this.getSelectedItemsCount() > 0 && (%itemText !$= "Data" && %itemText !$= "Core" && %itemText !$= "Tools")) + %parentItem = %this.getParentItem(%itemId); + if(%parentItem == %this.tagsIdx) { - //AddNewAssetPopup.showPopup(Canvas); - - //We have something clicked, so figure out if it's a sub-filter or a module filter, then push the correct - //popup menu - %parentItem = %this.getParentItem(%itemId); - if(%this.getItemText(%parentItem) $= "Data") //if it's a data module, continue + } + else if(%parentItem == %this.collectionsIdx) + { + EditCollectionSets.showPopup(Canvas); + AssetBrowser.selectedCollectionSet = %itemText; + } + else if(%parentItem == %this.creatorIdx) + { + } + else + { + if( %this.getSelectedItemsCount() > 0 && (%itemText !$= "Data" && %itemText !$= "Core" && %itemText !$= "Tools")) { - //find out if it's a folder or a module! - if(ModuleDatabase.findModule(%itemText)) + //AddNewAssetPopup.showPopup(Canvas); + + //We have something clicked, so figure out if it's a sub-filter or a module filter, then push the correct + //popup menu + %parentItem = %this.getParentItem(%itemId); + if(%this.getItemText(%parentItem) $= "Data") //if it's a data module, continue { - //yep, module, push the all-inclusive popup - EditModulePopup.showPopup(Canvas); - //also set the module value for creation info - AssetBrowser.selectedModule = %itemText; + //find out if it's a folder or a module! + if(ModuleDatabase.findModule(%itemText)) + { + //yep, module, push the all-inclusive popup + EditModulePopup.showPopup(Canvas); + //also set the module value for creation info + AssetBrowser.selectedModule = %itemText; + } + else + { + EditNonModulePopup.showPopup(Canvas); + EditNonModulePopup.targetFolder = %itemText; + } } else { - EditNonModulePopup.showPopup(Canvas); - EditNonModulePopup.targetFolder = %itemText; + EditFolderPopup.showPopup(Canvas); + EditFolderPopup.assetType = "Folder"; } } - else + else if(%itemText $= "Data") { - EditFolderPopup.showPopup(Canvas); - EditFolderPopup.assetType = "Folder"; + AddNewModulePopup.showPopup(Canvas); + } + else if(%itemText $= "Tools") + { + AddNewToolPopup.showPopup(Canvas); } - } - else if(%itemText $= "Data") - { - AddNewModulePopup.showPopup(Canvas); - } - else if(%itemText $= "Tools") - { - AddNewToolPopup.showPopup(Canvas); } } // // // +function AssetBrowser::refreshDatabases(%this) +{ + //ModuleDatabase.scanModules( "data", false ); + //ModuleDatabase.unloadGroup( "Game" ); + //ModuleDatabase.LoadGroup( "Game" ); +} + function AssetBrowser::showVisibiltyOptions(%this) { BrowserVisibilityPopup.showPopup(Canvas); } -function AssetBrowser::showFilterOptions(%this) +function AssetBrowser::saveCurrentFiltersAsCollection(%this) { + %colSetName = CreateNewCollectionSetCtrl-->collectionSetName.getText(); + if(%colSetName $= "") + { + error("Collection Sets require a name!"); + } + + %collectionsCount = AssetBrowserCollectionSets.value("CollectionSetCount", 0); + %collectionsCount += 1; + + AssetBrowserCollectionSets.setValue("CollectionSetCount", %collectionsCount); + + %collection = %colSetName TAB AssetBrowserSearchFilter.getText(); + + AssetBrowserCollectionSets.setValue("Collection"@%collectionsCount-1, %collection); + + %success = AssetBrowserCollectionSets.write(); + + AssetBrowser.loadDirectories(); } -// -// -// Preview tile handling -function AssetBrowser::setPreviewSize(%this, %size) +function AssetBrowser::deleteCollectionSet(%this) { - AssetPreviewSizePopup.checkItem(0, false); - AssetPreviewSizePopup.checkItem(1, false); - AssetPreviewSizePopup.checkItem(2, false); + %collectionsCount = AssetBrowserCollectionSets.value("CollectionSetCount", 0); + %tempCollectionListCount = 0; - %this.previewSize = 80; //default to small - - if(%size $= "Small") + %found = false; + for ( %i = 0; %i < %collectionsCount; %i++ ) { - %this.previewSize = 80; - AssetPreviewSizePopup.checkItem(0, true); - } - else if(%size $= "Medium") - { - %this.previewSize = 120; - AssetPreviewSizePopup.checkItem(1, true); - } - else if(%size $= "Large") - { - %this.previewSize = 160; - AssetPreviewSizePopup.checkItem(2, true); - } - - EditorSettings.setValue("Assets/Browser/previewTileSize", %size); + %collection = AssetBrowserCollectionSets.value("Collection"@%i, ""); + %collectionName = getField(%collection, 0); + %collectionTerm = getField(%collection, 1); - %this.rebuildAssetArray(); + if(AssetBrowser.selectedCollectionSet !$= %collectionName) + { + %tempCollectionList[%tempCollectionListCount] = %collection; + %tempCollectionListCount++; + } + } + + AssetBrowserCollectionSets.setValue("CollectionSetCount", %tempCollectionListCount); + for(%i=0; %i < %collectionsCount; %i++) + { + if(%i < %tempCollectionListCount) + AssetBrowserCollectionSets.setValue("Collection"@%i, %tempCollectionList[%i]); + else + AssetBrowserCollectionSets.remove("Collection"@%i); + } + + AssetBrowserCollectionSets.write(); + + %this.loadDirectories(); } function AssetBrowser::refreshPreviews(%this) @@ -924,21 +1297,56 @@ function AssetBrowserFilterTree::onSelect(%this, %itemId) //can't select root return; - //Make sure we have an actual module selected! - %parentId = %this.getParentItem(%itemId); - - %name = %this.getItemText(%itemId); - - %breadcrumbPath = %this.getItemValue(%itemId); - if(%breadcrumbPath !$= "") - %breadcrumbPath = %breadcrumbPath @ "/" @ %this.getItemText(%itemId); + //process special cases + %parentItem = %this.getParentItem(%itemId); + if(%parentItem == %this.tagsIdx) + { + //we selected a tag, so deal with that + AssetBrowser.setTagActive(%this.getItemText(%itemId)); + } + else if(%parentItem == %this.collectionsIdx) + { + //A collection set was selected + AssetBrowser.setCollectionSetActive(%this.getItemValue(%itemId)); + } + else if(%parentItem == %this.creatorIdx) + { + //One of the creator folders was selected + %creatorGroup = %this.getItemText(%itemId); + for ( %i = 0; %i < %this.creatorClassArray.count(); %i++ ) + { + %group = %array.getKey( %i ); + + if ( %group $= %creatorGroup ) + { + %args = %array.getValue( %i ); + %class = %args.val[0]; + %name = %args.val[1]; + %func = %args.val[2]; + + //%this.addMissionObjectIcon( %class, %name, %func ); + echo("Populating Creator Group! " @ %group @ " for class: " @ %class); + } + } + } else - %breadcrumbPath = %this.getItemText(%itemId); + { + //Make sure we have an actual module selected! + %parentId = %this.getParentItem(%itemId); - if(%breadcrumbPath $= "") - %breadcrumbPath = AssetBrowser.dirHandler.currentAddress; + %name = %this.getItemText(%itemId); - AssetBrowser.navigateTo(%breadcrumbPath); + %breadcrumbPath = %this.getItemValue(%itemId); + if(%breadcrumbPath !$= "") + %breadcrumbPath = %breadcrumbPath @ "/" @ %this.getItemText(%itemId); + else + %breadcrumbPath = %this.getItemText(%itemId); + + if(%breadcrumbPath $= "") + %breadcrumbPath = AssetBrowser.dirHandler.currentAddress; + + AssetBrowser.navigateTo(%breadcrumbPath); + } } function AssetBrowser::rebuildAssetArray(%this) @@ -972,9 +1380,6 @@ function AssetBrowser::doRebuildAssetArray(%this) %finalAssetCount = 0; - %searchText = AssetBrowserSearchFilter.getText(); - %searchFilterActive = %searchText !$= "Search Assets..."; - //now, we'll iterate through, and find the assets that are in this module, and this category for( %i=0; %i < %numAssetsFound; %i++) { @@ -986,7 +1391,8 @@ function AssetBrowser::doRebuildAssetArray(%this) //clean up the path %assetBasePath = strreplace(%assetBasePath, "//", "/"); - if(%assetBasePath $= %breadcrumbPath || (%searchFilterActive && startsWith(%assetBasePath,%breadcrumbPath))) + %searchActive = AssetSearchTerms.count() != 0; + if(%assetBasePath $= %breadcrumbPath || (%searchActive && startsWith(%assetBasePath,%breadcrumbPath))) { //first, get the asset's module, as our major categories %module = AssetDatabase.getAssetModule(%assetId); @@ -999,7 +1405,7 @@ function AssetBrowser::doRebuildAssetArray(%this) %assetType = AssetDatabase.getAssetType(%assetId); } - %validType = false; + /*%validType = false; if(AssetBrowser.assetTypeFilter $= "") { @@ -1038,34 +1444,32 @@ function AssetBrowser::doRebuildAssetArray(%this) { if(%assetType !$= AssetBrowser.assetTypeFilter) continue; - } + }*/ - /*if(%this.getItemText(%itemId) $= %assetType || (%assetType $= "" && %this.getItemText(%itemId) $= "Misc") - || %moduleItemId == 1) - {*/ - //stop adding after previewsPerPage is hit - %assetName = AssetDatabase.getAssetName(%assetId); - - if(%searchFilterActive) - { - if(strstr(strlwr(%assetName), strlwr(%searchText)) != -1) - { - %assetArray.add( %moduleName, %assetId); - - if(%assetType !$= "Folder") - %finalAssetCount++; - } - } - else - { - //got it. - %assetArray.add( %moduleName, %assetId ); - - if(%assetType !$= "Folder") - %finalAssetCount++; - } - //} - } + //stop adding after previewsPerPage is hit + %assetName = AssetDatabase.getAssetName(%assetId); + + if(%searchActive) + { + if(matchesSearch(%assetName, %assetType)) + { + %assetArray.add( %moduleName, %assetId); + + if(%assetType !$= "Folder") + %finalAssetCount++; + + continue; + } + } + else + { + //got it. + %assetArray.add( %moduleName, %assetId ); + + if(%assetType !$= "Folder") + %finalAssetCount++; + } + } } //Add folders @@ -1076,11 +1480,14 @@ function AssetBrowser::doRebuildAssetArray(%this) { %folderName = getField(%folders, %f); - %searchText = AssetBrowserSearchFilter.getText(); - if(%searchText !$= "Search Assets...") + %searchActive = AssetSearchTerms.count() != 0; + if(%searchActive) { - if(strstr(strlwr(%folderName), strlwr(%searchText)) != -1) - %assetArray.add( %breadcrumbPath, "Folder" TAB %folderName ); + if(matchesSearch(%folderName, "Folder", "")) + { + %assetArray.add( %breadcrumbPath, "Folder" TAB %folderName ); + continue; + } } else { @@ -1105,10 +1512,22 @@ function AssetBrowser::doRebuildAssetArray(%this) %dbFilename = %obj.getFileName(); %dbFilePath = filePath(%dbFilename); - if(%breadcrumbPath $= %dbFilePath) + %searchActive = AssetSearchTerms.count() != 0; + if(%searchActive) + { + if(startsWith(%dbFilePath, %breadcrumbPath)) + { + %dbName = %obj.getName(); + if(matchesSearch(%dbName, "Datablock")) + { + %assetArray.add( %dbFilename, "Datablock" TAB %dbName ); + } + } + } + else if(%dbFilePath $= %breadcrumbPath) { %dbName = %obj.getName(); - %assetArray.add( %breadcrumbPath, "Datablock" TAB %dbName ); + %assetArray.add( %dbFilename, "Datablock" TAB %dbName ); /*%catItem = AssetBrowser-->filterTree.findItemByName(%obj.category); @@ -1120,14 +1539,47 @@ function AssetBrowser::doRebuildAssetArray(%this) %this.addFolderIcon( %obj.category ); }*/ } - /*else if ( %breadcrumbPath $= %obj.category ) - { - AssetBrowser-->filterTree.insertItem(%scriptedItem, %obj.getName()); - }*/ + } + + %this.getLooseFilesInDir(); + + %looseFiles = ABLooseFileArray.count(); + for( %i=0; %i < %looseFiles; %i++) + { + %looseFileFullPath = ABLooseFileArray.getKey(%i); + %looseFilePath = filePath(%looseFileFullPath); + %looseFileName = fileName(%looseFileFullPath); + + %assetArray.add( %looseFilePath, "LooseFile" TAB %looseFileName ); } - AssetBrowser.currentPreviewPage = 0; - AssetBrowser.totalPages = 1; + //Prefabs + %expr = "*.prefab"; + %fullPrefabPath = findFirstFile( %breadcrumbPath @ "/" @ %expr ); + + while ( %fullPrefabPath !$= "" ) + { + %prefabPath = filePath(%fullPrefabPath); + %prefabName = fileName(%fullPrefabPath); + + %searchActive = AssetSearchTerms.count() != 0; + if(%searchActive) + { + if(startsWith(%prefabPath, %breadcrumbPath)) + { + if(matchesSearch(%prefabName, "Prefab")) + { + %assetArray.add( %prefabPath, "Prefab" TAB %prefabName ); + } + } + } + else if(%prefabPath $= %breadcrumbPath) + { + %assetArray.add( %prefabPath, "Prefab" TAB %prefabName ); + } + + %fullPrefabPath = findNextFile( %breadcrumbPath @ "/" @ %expr ); + } for(%i=0; %i < %assetArray.count(); %i++) AssetBrowser.buildAssetPreview( %assetArray.getValue(%i), %assetArray.getKey(%i) ); @@ -1154,9 +1606,6 @@ function AssetBrowser::doRebuildAssetArray(%this) } } } - - //if(!%validType) - // continue; } else { @@ -1169,6 +1618,141 @@ function AssetBrowser::doRebuildAssetArray(%this) %this.previewArrayDirty = false; } +// +// +// Search +function AssetBrowser::updateSearchTextFromFilter(%this) +{ + AssetSearchTerms.sortk(); + + //Update the displayed search text! + %newSearchPhrase = ""; + %currentAction = ""; + %actionCount = 0; + for(%i=0; %i < AssetSearchTerms.count(); %i++) + { + %action = AssetSearchTerms.getKey(%i); + %word = AssetSearchTerms.getValue(%i); + + if(%action !$= %currentAction) + { + if(%actionCount != 0) + { + if(%action !$= "") + %newSearchPhrase = %newSearchPhrase @ ";" @ %action @ ":" @ %word; + else + %newSearchPhrase = %newSearchPhrase @ ";" @ %word; + } + else + { + if(%action !$= "") + %newSearchPhrase = %action @ ":" @ %word; + else + %newSearchPhrase = %word; + } + + %actionCount++; + } + else + { + %newSearchPhrase = %newSearchPhrase @ "," @ %word; + } + + %currentAction = %action; + } + + AssetBrowserSearchFilter.setText(%newSearchPhrase); +} + +function AssetBrowser::processSearchFilter(%this) +{ + AssetSearchTerms.empty(); + + %searchText = AssetBrowserSearchFilter.getText(); + + %termCount = getTokenCount(%searchText, ";"); + for(%s=0; %s < %termCount; %s++) + { + %term = getToken(%searchText, ";", %s); + + %phraseCount = getTokenCount(%term, ":"); + + if(%phraseCount == 2) + { + //action/words split + %action = getToken(%term, ":", 0); + %words = getToken(%term, ":", 1); + } + else + { + %action = ""; + %words = getToken(%term, ":", 0); + } + + %wordCount = getTokenCount(%words, ","); + for(%w=0; %w < %wordCount; %w++) + { + %word = getToken(%words, ",", %w); + AssetSearchTerms.add(%action, %word); + } + } +} + +//Takes an item and compares it against the parsed search language +//This is written to be inclusive, rather than exclusive +function matchesSearch(%assetName, %assetType) +{ + if(AssetSearchTerms.count() == 0) + return true; + + %matchTags = false; + %matchType = false; + %matchName = false; + + %needsTag = false; + %needsType = false; + %needsName = false; + for(%i=0; %i < AssetSearchTerms.count(); %i++) + { + %action = AssetSearchTerms.getKey(%i); + %word = AssetSearchTerms.getValue(%i); + + if(%action $= "tag" && %matchTags == false) + { + %needsTag = true; + if(%assetType $= "Datablock") + { + if(%assetName.category $= %word) + %matchTags = true; + } + else + { + if(%assetName.tags !$= %word) + %matchTags = true; + } + } + else if(%action $= "type" && %matchType == false) + { + %needsType = true; + if(%assetType $= %word) + %matchType = true; + } + else if(%action $= "" && %matchName == false) + { + %needsName = true; + if(strstr(strlwr(%assetName), strlwr(%word)) != -1) + %matchName = true; + } + } + + if(((%needsTag && %matchTags) || !%needsTag) && + ((%needsType && %matchType) || !%needsType) && + ((%needsName && %matchName) || !%needsName)) + return true; + else + return false; +} + // // // Search Filters @@ -1197,37 +1781,74 @@ function AssetBrowserFolderSearchFilter::onReturn( %this ) AssetBrowser.refresh(); } +function AssetBrowserFolderSearchFilter::onEdited(%this) +{ + if(AssetBrowserFolderSearchFilter.getText() $= "") + { + AssetBrowser-->folderSearchBtn.setBitmap("tools/gui/images/stencilIcons/zoom.png"); + } + else + { + AssetBrowser-->folderSearchBtn.setBitmap("tools/gui/images/stencilIcons/cross.png"); + } +} + +function AssetBrowserSearchFilter::onEdited(%this) +{ + AssetBrowserSearchFilter.updateButton(); +} + function AssetBrowserSearchFilter::onReturn( %this ) { %text = %this.getText(); if( %text $= "" ) %this.reset(); + + AssetBrowserSearchFilter.updateButton(); + + AssetBrowser.processSearchFilter(); AssetBrowser.rebuildAssetArray(); } +function AssetBrowserSearchFilter::updateButton(%this) +{ + if(%this.getText() $= "") + { + AssetBrowser-->assetSearchBtn.setBitmap("tools/gui/images/stencilIcons/zoom.png"); + } + else + { + AssetBrowser-->assetSearchBtn.setBitmap("tools/gui/images/stencilIcons/cross.png"); + } +} + function AssetBrowserFolderSearchFilter::reset( %this ) { - %this.setText( "Search Folders..." ); - - AssetBrowser.refresh(); + %this.setText( "" ); + AssetBrowser-->folderSearchBtn.setBitmap("tools/gui/images/stencilIcons/zoom.png"); + //AssetBrowser.refresh(); } function AssetBrowserSearchFilter::reset( %this ) { - %this.setText( "Search Assets..." ); - - AssetBrowser.rebuildAssetArray(); + %this.setText( "" ); + AssetBrowser-->assetSearchBtn.setBitmap("tools/gui/images/stencilIcons/zoom.png"); + //AssetBrowser.rebuildAssetArray(); } -function AssetBrowser_ClearFolderFilterBtn::onClick( %this ) +function AssetBrowserFolderSearchBtn::onClick( %this ) { AssetBrowserFolderSearchFilter.reset(); + AssetBrowser.refresh(); } -function AssetBrowser_ClearAssetFilterBtn::onClick( %this ) +function AssetBrowserAssetSearchBtn::onClick( %this ) { AssetBrowserSearchFilter.reset(); + AssetBrowser.processSearchFilter(); + + AssetBrowser.rebuildAssetArray(); } // @@ -1240,7 +1861,10 @@ function AssetBrowser::navigateTo(%this, %address, %historyNav) { AssetBrowser.dirHandler.navigateTo(%address, %historyNav); - %this.updateNavigationBreadcrumb(%address); + //%this.updateNavigationBreadcrumb(%address); + + AssetBrowser.lastValidNavPath = %address; + AssetBrowser-->navPath.setText(%address); %module = AssetBrowser.dirHandler.getModuleFromAddress(%address); if(%module !$= "") @@ -1248,6 +1872,15 @@ function AssetBrowser::navigateTo(%this, %address, %historyNav) //legit module, so set it as current target AssetBrowser.SelectedModule = %module.moduleId; } + + if(%this.hasLooseFilesInDir()) + { + %this-->AutoImportAssetButton.visible = true; + } + else + { + %this-->AutoImportAssetButton.visible = false; + } } %this.rebuildAssetArray(); @@ -1346,6 +1979,20 @@ function AssetBrowser::updateNavigationBreadcrumb(%this, %address) AssetBrowser_NavigateForwardBtn.tooltip = %foreButtonHistory; } +function assetBrowserNavPath::onReturn(%this) +{ + %newPath = %this.getText(); + if(isDirectory(%newPath)) + { + AssetBrowser.lastValidNavPath = %newPath; + AssetBrowser.navigateTo(%newPath); + } + else + { + %this.setText(AssetBrowser.lastValidNavPath); + AssetBrowser.navigateTo(AssetBrowser.lastValidNavPath); + } +} // // // @@ -1403,9 +2050,13 @@ function AssetBrowser::toggleFolderCollapseButton(%this) // // // Drag n drop -function AssetPreviewButton::onMouseDragged(%this) +function AssetBrowserPreviewButton::onMouseDragged(%this) { - %payload = new GuiBitmapButtonCtrl(); + %payload = %this.clone(); + %payload.position = "0 0"; + //%payload.class = "AssetPreviewControl"; + + /*%payload = new GuiBitmapButtonCtrl(); //%payload.assignFieldsFrom( %this ); %payload.assetName = %this.assetName; %payload.assetType = %this.assetType ; @@ -1415,7 +2066,7 @@ function AssetPreviewButton::onMouseDragged(%this) %payload.dragSourceControl = %this; %payload.bitmap = %this.icon; %payload.extent.x /= 2; - %payload.extent.y /= 2; + %payload.extent.y /= 2;*/ %xOffset = getWord( %payload.extent, 0 ) / 2; %yOffset = getWord( %payload.extent, 1 ) / 2; @@ -1470,14 +2121,16 @@ function AssetPreviewButton::onMouseDragged(%this) Canvas.pushDialog(EditorDragAndDropLayer); %ctrl.startDragging( %xOffset, %yOffset ); + + Canvas.repaint(); } -function AssetPreviewButton::onControlDragCancelled(%this) +function AssetBrowserPreviewButton::onControlDragCancelled(%this) { Canvas.popDialog(EditorDragAndDropLayer); } -function AssetPreviewButton::onControlDropped( %this, %payload, %position ) +function AssetBrowserPreviewButton::onControlDropped( %this, %payload, %position ) { Canvas.popDialog(EditorDragAndDropLayer); @@ -1490,9 +2143,9 @@ function AssetPreviewButton::onControlDropped( %this, %payload, %position ) if( %payload.dragSourceControl == %this ) return; - %assetType = %payload.dragSourceControl.parentGroup.assetType; - %assetName = %payload.dragSourceControl.parentGroup.assetName; - %moduleName = %payload.dragSourceControl.parentGroup.moduleName; + %assetType = %payload.assetType; + %assetName = %payload.assetName; + %moduleName = %payload.moduleName; %targetAssetName = %this.assetName; %targetAssetType = %this.assetType; @@ -1543,16 +2196,23 @@ function EWorldEditor::onControlDropped( %this, %payload, %position ) if( %payload.dragSourceControl == %this ) return; - %assetType = %payload.dragSourceControl.parentGroup.assetType; + %assetType = %payload.assetType; %pos = EWCreatorWindow.getCreateObjectPosition(); //LocalClientConnection.camera.position; - %module = %payload.dragSourceControl.parentGroup.moduleName; - %asset = %payload.dragSourceControl.parentGroup.assetName; + %module = %payload.moduleName; + %asset = %payload.assetName; if(AssetBrowser.isMethod("on" @ %assetType @ "EditorDropped")) { - %assetDef = AssetDatabase.acquireAsset(%module @ ":" @ %asset); - %buildCommand = AssetBrowser @ ".on" @ %assetType @ "EditorDropped(" @ %assetDef @ ",\"" @ %position @ "\");"; + if(%assetType $= "Datablock") + { + %buildCommand = AssetBrowser @ ".on" @ %assetType @ "EditorDropped(" @ %asset @ ",\"" @ %position @ "\");"; + } + else + { + %assetDef = AssetDatabase.acquireAsset(%module @ ":" @ %asset); + %buildCommand = AssetBrowser @ ".on" @ %assetType @ "EditorDropped(" @ %assetDef @ ",\"" @ %position @ "\");"; + } eval(%buildCommand); } @@ -1639,9 +2299,9 @@ function AssetBrowserFilterTree::onControlDropped( %this, %payload, %position ) if( !%payload.parentGroup.isInNamespaceHierarchy( "AssetPreviewControlType_AssetDrop" ) ) return; - %assetType = %payload.dragSourceControl.parentGroup.assetType; - %assetName = %payload.dragSourceControl.parentGroup.assetName; - %moduleName = %payload.dragSourceControl.parentGroup.moduleName; + %assetType = %payload.assetType; + %assetName = %payload.assetName; + %moduleName = %payload.moduleName; echo("DROPPED A " @ %assetType @ " ON THE ASSET BROWSER NAVIGATION TREE!"); @@ -1694,6 +2354,105 @@ function AssetBrowserFilterTree::onDragDropped( %this ) %asdgadfhg =true; } +function AssetBrowser::hasLooseFilesInDir(%this) +{ + //First, wipe out any files inside the folder first + %file = findFirstFileMultiExpr( %this.dirHandler.currentAddress @ "/*.*", false); + + %aq = new AssetQuery(); + + while( %file !$= "" ) + { + if(!strIsMatchExpr("*.asset.taml", %file) && !strIsMatchExpr("*.taml", %file) && !strIsMatchExpr("*.cached.dts", %file)) + { + %assetsFound = AssetDatabase.findAssetLooseFile(%aq, %file); + + if(%assetsFound == 0) + { + %ext = fileExt(%file); + if(isShapeFormat(%ext) || isImageFormat(%ext) || isSoundFormat(%ext)) + { + %aq.delete(); + return true; + } + } + } + + %file = findNextFileMultiExpr( %this.dirHandler.currentAddress @ "/*.*" ); + } + + %aq.delete(); + return false; +} + +function AssetBrowser::autoImportSimpleLooseFiles(%this) +{ + %importer = new AssetImporter(); + + //First, wipe out any files inside the folder first + %file = findFirstFileMultiExpr( %this.dirHandler.currentAddress @ "/*.*", false); + + %aq = new AssetQuery(); + + while( %file !$= "" ) + { + if(!strIsMatchExpr("*.asset.taml", %file) && !strIsMatchExpr("*.taml", %file) && !strIsMatchExpr("*.cached.dts", %file)) + { + %assetsFound = AssetDatabase.findAssetLooseFile(%aq, %file); + + if(%assetsFound == 0) + { + %ext = fileExt(%file); + if(isShapeFormat(%ext) || isImageFormat(%ext) || isSoundFormat(%ext)) + { + %assetId = %importer.autoImportFile(%file); + } + } + } + + %file = findNextFileMultiExpr( %this.dirHandler.currentAddress @ "/*.*" ); + } + + %aq.delete(); + %importer.delete(); + + %this.refresh(); +} + +function AssetBrowser::getLooseFilesInDir(%this) +{ + if(!isObject(ABLooseFileArray)) + new ArrayObject(ABLooseFileArray); + + ABLooseFileArray.empty(); + + %showLooseFiles = EditorSettings.value("Assets/Browser/showLooseFiles", false); + if(%showLooseFiles == false) + return; + + //First, wipe out any files inside the folder first + %file = findFirstFileMultiExpr( %this.dirHandler.currentAddress @ "/*.*", false); + + %aq = new AssetQuery(); + + while( %file !$= "" ) + { + if(!strIsMatchExpr("*.asset.taml", %file) && !strIsMatchExpr("*.taml", %file) && !strIsMatchExpr("*.cached.dts", %file)) + { + %assetsFound = AssetDatabase.findAssetLooseFile(%aq, %file); + + if(%assetsFound == 0) + { + ABLooseFileArray.add(%file); + } + } + + %file = findNextFileMultiExpr( %this.dirHandler.currentAddress @ "/*.*" ); + } + + %aq.delete(); + return false; +} // // function AssetBrowser::importLooseFiles(%this) diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetImport.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetImport.cs index 163ddaa7b..4203072d7 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetImport.cs +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetImport.cs @@ -24,8 +24,10 @@ function ImportAssetWindow::showDialog(%this) { //prep the import control Canvas.pushDialog(AssetImportCtrl); - AssetImportCtrl.setHidden(true); - + AssetImportCtrl.setHidden(false); + + ImportAssetWindow.allowAutoImport = true; //special-case override for if we want to force a manual import process + ImportAssetWindow.assetHeirarchyChanged = false; %defaultConfig = EditorSettings.value("Assets/AssetImporDefaultConfig", ""); @@ -45,14 +47,15 @@ function ImportAssetWindow::showDialog(%this) function ImportAssetWindow::Close(%this) { //Some cleanup - ImportAssetWindow.importingFilesArray.empty(); + ImportAssetWindow.importer.resetImportSession(true); + //ImportAssetWindow.importingFilesArray.empty(); %this.importTempDirHandler.deleteFolder("tools/assetBrowser/importTemp/*/"); if(ImportAssetWindow.isAwake()) ImportAssetWindow.refresh(); - ImportAssetItems.empty(); + //ImportAssetItems.empty(); Canvas.popDialog(); } @@ -124,7 +127,6 @@ function getImageInfo(%file) //This lets us go and look for a image at the importing directory as long as it matches the material name function findImageFile(%path, %materialName, %type) { - if(isFile(%path @ "/" @ %materialName @ ".jpg")) return %path @ "/" @ %materialName @ ".jpg"; else if(isFile(%path @ "/" @ %materialName @ ".png")) @@ -173,7 +175,9 @@ function AssetBrowser::onDropFile( %this, %filePath ) if(!%this.isVisible()) return; - %fileExt = fileExt( %filePath ); + ImportAssetWindow.importer.addImportingFile(%filePath); + + /*%fileExt = fileExt( %filePath ); //add it to our array! if(isImageFormat(%fileExt)) %assetItem = %this.addImportingAsset("ImageAsset", %filePath); @@ -194,13 +198,13 @@ function AssetBrowser::onDropFile( %this, %filePath ) { SessionImportAssetItems.add(%assetItem); ImportAssetItems.add(%assetItem); - } + }*/ //Used to keep tabs on what files we were trying to import, used mainly in the event of //adjusting configs and needing to completely reprocess the import //ensure we're not doubling-up on files by accident - if(ImportAssetWindow.importingFilesArray.getIndexFromKey(%filePath) == -1) - ImportAssetWindow.importingFilesArray.add(%filePath); + //if(ImportAssetWindow.importingFilesArray.getIndexFromKey(%filePath) == -1) + // ImportAssetWindow.importingFilesArray.add(%filePath); } function AssetBrowser::onDropZipFile(%this, %filePath) @@ -334,8 +338,10 @@ function AssetBrowser::addImportingAsset( %this, %assetType, %filePath, %parentA %moduleName = AssetBrowser.SelectedModule; ImportAssetModuleList.text = %moduleName; + %assetName = strreplace( %assetName, " ", "_" ); + //Add to our main list - %assetItem = new ScriptObject() + %assetItem = new AssetImportObject() { assetType = %assetType; filePath = %filePath; @@ -350,33 +356,9 @@ function AssetBrowser::addImportingAsset( %this, %assetType, %filePath, %parentA skip = false; processed = false; generatedAsset = false; - childAssetItems = new ArrayObject(){}; }; - if(%parentAssetItem !$= "") - { - ImportActivityLog.add("Added Child Importing Asset to " @ %parentAssetItem.assetName); - } - else - { - ImportActivityLog.add("Added Importing Asset"); - } - - ImportActivityLog.add(" Asset Info: Name: " @ %assetName @ " | Type: " @ %assetType); - - if(%filePath !$= "") - ImportActivityLog.add(" File: " @ %filePath); - - if(%parentAssetItem $= "") - { - %asd = true; - } - else - { - %parentAssetItem.childAssetItems.add(%assetItem); - } - - ImportAssetWindow.refresh(); + ImportAssetWindow.importer.addImportingAssetItem(%assetItem, %parentAssetItem); return %assetItem; } @@ -426,7 +408,7 @@ function ImportAssetWindow::reloadImportOptionConfigs(%this) } // -function importLooseFile(%filePath, %forceAutoImport) +/*function importLooseFile(%filePath, %forceAutoImport) { %assetType = getAssetTypeByFilename(%filePath); @@ -480,7 +462,7 @@ function importLooseFile(%filePath, %forceAutoImport) $importedLooseFileAsset = %assetItem.moduleName @ ":" @ %assetItem.assetName; return true; -} +}*/ // function assetImportUpdatePath(%newPath) @@ -491,7 +473,7 @@ function assetImportUpdatePath(%newPath) } // -function ImportAssetWindow::processImportAssets(%this, %assetItem) +/*function ImportAssetWindow::processImportAssets(%this, %assetItem) { if(!isObject(%assetItem)) { @@ -573,7 +555,7 @@ function ImportAssetWindow::processImportAssets(%this, %assetItem) //so we'll loop back through again until everything has been processed if(ImportAssetWindow.assetHeirarchyChanged) %this.processImportAssets(); -} +}*/ function ImportAssetWindow::findImportingAssetByName(%this, %assetName, %assetItem) { @@ -642,16 +624,19 @@ function ImportAssetWindow::doRefresh(%this) %this.autoRenamedAssets = 0; //Go through and process any newly, unprocessed assets - %this.processImportAssets(); + ImportAssetWindow.importer.processImportingAssets(); + //%this.processImportAssets(); - ImportAssetWindow.hasImportIssues = %this.validateAssets(); + //ImportAssetWindow.hasImportIssues = %this.validateAssets(); + + ImportAssetWindow.importer.validateImportingAssets(); AssetImportCtrl-->NewAssetsTree.clear(); AssetImportCtrl-->NewAssetsTree.insertItem(0, "Importing Assets"); - for(%i=0; %i < ImportAssetItems.count(); %i++) + for(%i=0; %i < ImportAssetWindow.importer.getAssetItemCount(); %i++) { - %assetItem = ImportAssetItems.getKey(%i); + %assetItem = ImportAssetWindow.importer.getAssetItem(%i); %this.refreshAssetItem(%assetItem); } @@ -687,16 +672,17 @@ function ImportAssetWindow::doRefresh(%this) //bother showing the window. //If any of these conditions fail, we'll display the import window so it can be handled //by the user - if(ImportAssetWindow.importConfigsList.count() != 0 && - EditorSettings.value("Assets/AssetImporDefaultConfig") !$= "" && - EditorSettings.value("Assets/AutoImport", false) == true - && ImportAssetWindow.hasImportIssues == false) + if(ImportAssetWindow.importConfigsList.count() != 0 + && EditorSettings.value("Assets/AssetImporDefaultConfig") !$= "" + && EditorSettings.value("Assets/AutoImport", false) == true + && ImportAssetWindow.hasImportIssues == false + && ImportAssetWindow.allowAutoImport) { AssetImportCtrl.setHidden(true); ImportAssetWindow.visible = false; //Go ahead and check if we have any issues, and if not, run the import! - ImportAssetWindow.ImportAssets(); + ImportAssetWindow.importer.ImportAssets(); } else { @@ -723,7 +709,7 @@ function ImportAssetWindow::doRefresh(%this) %this.dirty = false; } -function ImportAssetWindow::refreshAssetItem(%this, %assetItem) +function ImportAssetWindow::refreshAssetItem(%this, %assetItem, %parentTreeIdx) { if(!isObject(%assetItem) || %assetItem.skip) return; @@ -733,7 +719,7 @@ function ImportAssetWindow::refreshAssetItem(%this, %assetItem) %assetName = %assetItem.assetName; //Once validated, attempt any fixes for issues - %this.resolveIssue(%assetItem); + ImportAssetWindow.importer.resolveAssetItemIssues(%assetItem); //create! %toolTip = ""; @@ -783,16 +769,15 @@ function ImportAssetWindow::refreshAssetItem(%this, %assetItem) %iconIdx = 7; } - %parentTreeIdx = %assetItem.parentAssetItem.treeIdx; if(%parentTreeIdx $= "") %parentTreeIdx = 1; %assetItem.treeIdx = AssetImportCtrl-->NewAssetsTree.insertItem(%parentTreeIdx, %assetName, %assetItem, "", %iconIdx, %iconIdx+1); - for(%i=0; %i < %assetItem.childAssetItems.count(); %i++) + for(%i=0; %i < ImportAssetWindow.importer.getAssetItemChildCount(%assetItem); %i++) { - %childAssetItem = %assetItem.childAssetItems.getKey(%i); - %this.refreshAssetItem(%childAssetItem); + %childAssetItem = ImportAssetWindow.importer.getAssetItemChild(%assetItem, %i); + %this.refreshAssetItem(%childAssetItem, %assetItem.treeIdx); } } @@ -818,6 +803,8 @@ function NewAssetsViewTree::onSelect(%this, %itemId) //AssetImportCtrl-->NewAssetsInspector.addField("assetName", "Asset Name", "string", "", %assetItem.assetName, "", %assetItem); AssetImportCtrl-->NewAssetsInspector.addField("status", "Status", "string", "", %assetItem.status, "", %assetItem); + AssetImportCtrl-->NewAssetsInspector.addField("statusInfo", "Status Info", "string", "", %assetItem.statusInfo, "", %assetItem); + AssetImportCtrl-->NewAssetsInspector.endGroup(); AssetImportCtrl-->NewAssetsInspector.setFieldEnabled("assetType", false); @@ -890,7 +877,7 @@ function ImportAssetWindow::removeImportingAsset(%this) { ImportActivityLog.add("Removing Asset from Import"); - %this.deleteImportingAsset(ImportAssetActions.assetItem); + %this.importer.deleteImportingAsset(ImportAssetActions.assetItem); //ImportAssetWindow.refresh(); } @@ -937,6 +924,11 @@ function ImportAssetWindow::addNewImportingAsset(%this, %filterType) //AssetBrowser.onDropFile( %path ); %fileExt = fileExt( %filePath ); + %fileName = fileName(%filePath); + + if(%fileExt $= ".dts" && endsWith(%fileName, ".cached")) + return ""; + //add it to our array! if(isImageFormat(%fileExt)) %type = "ImageAsset"; @@ -969,292 +961,9 @@ function ImportAssetWindow::addMaterialMap(%this, %map) %newAssetItem.ImageType = %map; } -// -function ImportAssetWindow::importResolution(%this, %assetItem) -{ - if(%assetItem.status !$= "Error" && %assetItem.status !$= "Warning") - { - //If nothing's wrong, we just edit it - ImportAssetOptionsWindow.editImportSettings(%assetItem); - return; - } - else - { - ImportAssetResolutionsPopup.assetItem = %assetItem; - if(%assetItem.statusType $= "DuplicateAsset" || %assetItem.statusType $= "DuplicateImportAsset") - { - ImportAssetResolutionsPopup.enableItem(3, false); //Rename - ImportAssetResolutionsPopup.enableItem(5, false); //Find Missing - } - else if(%assetItem.statusType $= "MissingFile") - { - ImportAssetResolutionsPopup.enableItem(0, false); //Use Orig - ImportAssetResolutionsPopup.enableItem(1, false); //Use Dupe - ImportAssetResolutionsPopup.enableItem(3, false); //Rename - } - } - - ImportAssetResolutionsPopup.showPopup(Canvas); -} - -function ImportAssetWindow::validateAssets(%this, %assetItem) -{ - ImportAssetWindow.importIssues = false; - - //Clear any status - %this.resetAssetsValidationStatus(); - - for(%i=0; %i < ImportAssetItems.count(); %i++) - { - %assetItem = ImportAssetItems.getKey(%i); - - %this.validateAsset(%assetItem); - } - - if(ImportAssetWindow.importIssues == false) - return false; - else - return true; -} - -function ImportAssetWindow::validateAsset(%this, %assetItem) -{ - %moduleName = AssetImportTargetModule.getText(); - - if(!isObject(%assetItem) || %assetItem.skip) - { - return; - } - - //First, check the obvious: name collisions. We should have no asset that shares a similar name. - //If we do, prompt for it be renamed first before continuing - %hasCollision = %this.checkAssetsForCollision(%assetItem); - - //Ran into a problem, so end checks on this one and move on - if(%hasCollision) - return; - - //No collisions of for this name in the importing assets. Now, check against the existing assets in the target module - if(!AssetBrowser.isAssetReImport) - { - %assetQuery = new AssetQuery(); - - %numAssetsFound = AssetDatabase.findAllAssets(%assetQuery); - - %foundCollision = false; - for( %f=0; %f < %numAssetsFound; %f++) - { - %assetId = %assetQuery.getAsset(%f); - - //first, get the asset's module, as our major categories - %module = AssetDatabase.getAssetModule(%assetId); - - %testModuleName = %module.moduleId; - - //These are core, native-level components, so we're not going to be messing with this module at all, skip it - if(%moduleName !$= %testModuleName) - continue; - - %testAssetName = AssetDatabase.getAssetName(%assetId); - - if(%testAssetName $= %assetItem.assetName) - { - %foundCollision = true; - - %assetItem.status = "error"; - %assetItem.statusType = "DuplicateAsset"; - %assetItem.statusInfo = "Duplicate asset names found with the target module!\nAsset \"" @ - %assetItem.assetName @ "\" of type \"" @ %assetItem.assetType @ "\" has a matching name.\nPlease rename it and try again!"; - - ImportActivityLog.add("Error! Asset " @ %assetItem.assetName @ " has an identically named asset in the target module"); - - break; - } - } - - if(%foundCollision == true) - { - //yup, a collision, prompt for the change and bail out - /*MessageBoxOK( "Error!", "Duplicate asset names found with the target module!\nAsset \"" @ - %assetItemA.assetName @ "\" of type \"" @ %assetItemA.assetType @ "\" has a matching name.\nPlease rename it and try again!");*/ - - //%assetQuery.delete(); - //return false; - } - - //Clean up our queries - %assetQuery.delete(); - } - - //Check if we were given a file path(so not generated) but somehow isn't a valid file - if(%assetItem.filePath !$= "" && !%assetItem.generatedAsset && !isFile(%assetItem.filePath)) - { - %assetItem.status = "error"; - %assetItem.statusType = "MissingFile"; - %assetItem.statusInfo = "Unable to find file to be imported. Please select asset file."; - - ImportActivityLog.add("Error! Asset " @ %assetItem.filePath @ " was not found"); - } - - if(%assetItem.status $= "Warning") - { - if(getAssetImportConfigValue("General/WarningsAsErrors", "0") == 1) - { - %assetItem.status = "error"; - - ImportActivityLog.add("Warnings treated as errors!"); - } - } - - if(%assetItem.status $= "error") - ImportAssetWindow.importIssues = true; - - for(%i=0; %i < %assetItem.childAssetItems.count(); %i++) - { - %childAssetItem = %assetItem.childAssetItems.getKey(%i); - - %this.validateAsset(%childAssetItem); - } -} -// - -function ImportAssetWindow::resetAssetsValidationStatus(%this, %assetItem) -{ - if(!isObject(%assetItem)) - { - for(%i=0; %i < ImportAssetItems.count(); %i++) - { - %assetItem = ImportAssetItems.getKey(%i); - - if(!isObject(%assetItem) || %assetItem.skip) - continue; - - %assetItem.status = ""; - %assetItem.statusType = ""; - %assetItem.statusInfo = ""; - - if(%assetItem.childAssetItems.count() != 0) - %this.resetAssetsValidationStatus(%assetItem); - } - } - else - { - for(%i=0; %i < %assetItem.childAssetItems.count(); %i++) - { - %childAssetItem = %assetItem.childAssetItems.getKey(%i); - - if(!isObject(%childAssetItem) || %childAssetItem.skip) - continue; - - %childAssetItem.status = ""; - %childAssetItem.statusType = ""; - %childAssetItem.statusInfo = ""; - - if(%childAssetItem.childAssetItems.count() != 0) - %this.resetAssetsValidationStatus(%childAssetItem); - } - } -} - -function ImportAssetWindow::checkAssetsForCollision(%this, %assetItemToCheck, %assetItem) -{ - %result = false; - - if(!isObject(%assetItem)) - { - for(%i=0; %i < ImportAssetItems.count(); %i++) - { - %assetItem = ImportAssetItems.getKey(%i); - - if(!isObject(%assetItem) || %assetItem.skip) - continue; - - if( (%assetItemToCheck.assetName $= %assetItem.assetName) && (%assetItemToCheck.getId() != %assetItem.getId()) ) - { - //yup, a collision, prompt for the change and bail out - %assetItemToCheck.status = "Warning"; - %assetItemToCheck.statusType = "DuplicateImportAsset"; - %assetItemToCheck.statusInfo = "Duplicate asset names found with importing assets!\nAsset \"" @ - %assetItem.assetName @ "\" of type \"" @ %assetItem.assetType @ "\" and \"" @ - %assetItemToCheck.assetName @ "\" of type \"" @ %assetItemToCheck.assetType @ "\" have matching names.\nPlease rename one of them and try again!"; - - ImportActivityLog.add("Warning! Asset " @ %assetItemToCheck.assetName @ ", type " @ %assetItemToCheck.assetType @ " has a naming collisions with asset " @ %assetItem.assetName @ ", type " @ %assetItem.assetType); - - return true; - } - - if(%assetItem.childAssetItems.count() != 0) - { - //recurse! - %result = %this.checkAssetsForCollision(%assetItemToCheck, %assetItem); - } - - if(%result) - return %result; - } - } - else - { - for(%i=0; %i < %assetItem.childAssetItems.count(); %i++) - { - %childAssetItem = %assetItem.childAssetItems.getKey(%i); - - if(!isObject(%childAssetItem) || %childAssetItem.skip) - continue; - - if( (%assetItemToCheck.assetName $= %childAssetItem.assetName) && (%assetItemToCheck.getId() != %childAssetItem.getId()) ) - { - //yup, a collision, prompt for the change and bail out - %assetItemToCheck.status = "Warning"; - %assetItemToCheck.statusType = "DuplicateImportAsset"; - %assetItemToCheck.statusInfo = "Duplicate asset names found with importing assets!\nAsset \"" @ - %childAssetItem.assetName @ "\" of type \"" @ %childAssetItem.assetType @ "\" and \"" @ - %assetItemToCheck.assetName @ "\" of type \"" @ %assetItemToCheck.assetType @ "\" have matching names.\nPlease rename one of them and try again!"; - - ImportActivityLog.add("Warning! Asset " @ %assetItemToCheck.assetName @ ", type " @ %assetItemToCheck.assetType @ " has a naming collisions with asset " @ %childAssetItem.assetName @ ", type " @ %childAssetItem.assetType); - - return true; - } - - if(%childAssetItem.childAssetItems.count() != 0) - { - //recurse! - %result = %this.checkAssetsForCollision(%assetItemToCheck, %childAssetItem); - } - - if(%result) - return %result; - } - } - - return %result; -} - -// -function ImportAssetWindow::deleteImportingAsset(%this, %assetItem) -{ - if(%assetItem.parentAssetItem !$= "") - { - %idx = %assetItem.parentAssetItem.childAssetItems.getIndexFromKey(%assetItem); - %assetItem.parentAssetItem.childAssetItems.erase(%idx); - - ImportActivityLog.add("Deleting Importing Asset " @ %assetItem.assetName @ " from it's parent item: " @ %assetItem.parentAssetItem); - } - - ImportActivityLog.add("Deleting Importing Asset " @ %assetItem.assetName @ " and all it's child items"); - - %idx = ImportAssetItems.getIndexFromKey(%assetItem); - ImportAssetItems.erase(%idx); - - schedule(10, 0, "refreshImportAssetWindow"); -} - // function ImportAssetWindow::ImportAssets(%this) { - //do the actual importing, now! - %assetCount = ImportAssetItems.count(); - //get the selected module data %moduleName = AssetImportTargetModule.getText(); @@ -1266,255 +975,34 @@ function ImportAssetWindow::ImportAssets(%this) return; } - %this.doImportAssets(); + Canvas.pushDialog( EditorLoadingGui ); + Canvas.repaint(); + + %this.importer.targetModuleId = %moduleName; + %this.importer.targetPath = AssetImportTargetAddress.getText(); + + %this.importer.importAssets(); //force an update of any and all modules so we have an up-to-date asset list AssetBrowser.refresh(); Canvas.popDialog(AssetImportCtrl); AssetBrowser.isAssetReImport = false; -} - -function ImportAssetWindow::doImportAssets(%this, %assetItem) -{ - %moduleName = AssetImportTargetModule.getText(); - if(%assetItem $= "") - { - for(%i=0; %i < ImportAssetItems.count(); %i++) - { - %assetItem = ImportAssetItems.getKey(%i); - - if(!isObject(%assetItem) || %assetItem.skip) - continue; - - %assetType = %assetItem.AssetType; - %filePath = %assetItem.filePath; - %assetName = %assetItem.assetName; - %assetImportSuccessful = false; - %assetId = %moduleName@":"@%assetName; - - %command = "AssetBrowser.import" @ %assetType @ "(" @ %assetItem @ ");"; - eval(%command); - - //recurse if needed - %this.doImportAssets(%assetItem); - } - } - else - { - for(%i=0; %i < %assetItem.childAssetItems.count(); %i++) - { - %childAssetItem = %assetItem.childAssetItems.getKey(%i); - - if(!isObject(%childAssetItem) || %childAssetItem.skip) - continue; - - %assetType = %childAssetItem.AssetType; - %filePath = %childAssetItem.filePath; - %assetName = %childAssetItem.assetName; - %assetImportSuccessful = false; - %assetId = %moduleName@":"@%assetName; - - %command = "AssetBrowser.import" @ %assetType @ "(" @ %childAssetItem @ ");"; - eval(%command); - - //recurse if needed - %this.doImportAssets(%childAssetItem); - } - } -} - -function ImportAssetWindow::doImportAsset(%this, %assetItem) -{ - %assetItem = ImportAssetTree.getItemObject(%id); - - if(!isObject(%assetItem) || %assetItem.skip) - { - %id = ImportAssetTree.getNextSibling(%id); - continue; - } + %this.importer.resetImportSession(true); - %assetType = %assetItem.AssetType; - %filePath = %assetItem.filePath; - %assetName = %assetItem.assetName; - %assetImportSuccessful = false; - %assetId = %moduleName@":"@%assetName; + Canvas.popDialog( EditorLoadingGui ); - if(%assetType $= "ImageAsset") - { - AssetBrowser.importImageAsset(%assetItem); - } - else if(%assetType $= "ShapeAsset") - { - AssetBrowser.importShapeAsset(%assetItem); - } - else if(%assetType $= "AnimationAsset") - { - %assetPath = "data/" @ %moduleName @ "/ShapeAnimations"; - %assetFullPath = %assetPath @ "/" @ fileName(%filePath); - - %newAsset = new ShapeAnimationAsset() - { - assetName = %assetName; - versionId = 1; - fileName = %assetFullPath; - originalFilePath = %filePath; - animationFile = %assetFullPath; - animationName = %assetName; - startFrame = 0; - endFrame = -1; - padRotation = false; - padTransforms = false; - }; + //do the actual importing, now! + /*%assetCount = ImportAssetItems.count(); - %assetImportSuccessful = TAMLWrite(%newAsset, %assetPath @ "/" @ %assetName @ ".asset.taml"); - - //and copy the file into the relevent directory - %doOverwrite = !AssetBrowser.isAssetReImport; - if(!pathCopy(%filePath, %assetFullPath, %doOverwrite)) - { - error("Unable to import asset: " @ %filePath); - } - } - else if(%assetType $= "SoundAsset") - { - %assetPath = "data/" @ %moduleName @ "/Sounds"; - %assetFullPath = %assetPath @ "/" @ fileName(%filePath); - - %newAsset = new SoundAsset() - { - assetName = %assetName; - versionId = 1; - fileName = %assetFullPath; - originalFilePath = %filePath; - }; - - %assetImportSuccessful = TAMLWrite(%newAsset, %assetPath @ "/" @ %assetName @ ".asset.taml"); - - //and copy the file into the relevent directory - %doOverwrite = !AssetBrowser.isAssetReImport; - if(!pathCopy(%filePath, %assetFullPath, %doOverwrite)) - { - error("Unable to import asset: " @ %filePath); - } - } - else if(%assetType $= "MaterialAsset") - { - AssetBrowser.importMaterialAsset(%assetItem); - } - else if(%assetType $= "ScriptAsset") - { - %assetPath = "data/" @ %moduleName @ "/Scripts"; - %assetFullPath = %assetPath @ "/" @ fileName(%filePath); - - %newAsset = new ScriptAsset() - { - assetName = %assetName; - versionId = 1; - scriptFilePath = %assetFullPath; - isServerSide = true; - originalFilePath = %filePath; - }; - - %assetImportSuccessful = TAMLWrite(%newAsset, %assetPath @ "/" @ %assetName @ ".asset.taml"); - - //and copy the file into the relevent directory - %doOverwrite = !AssetBrowser.isAssetReImport; - if(!pathCopy(%filePath, %assetFullPath, %doOverwrite)) - { - error("Unable to import asset: " @ %filePath); - } - } - else if(%assetType $= "GUIAsset") - { - %assetPath = "data/" @ %moduleName @ "/GUIs"; - %assetFullPath = %assetPath @ "/" @ fileName(%filePath); - - %newAsset = new GUIAsset() - { - assetName = %assetName; - versionId = 1; - GUIFilePath = %assetFullPath; - scriptFilePath = ""; - originalFilePath = %filePath; - }; - - %assetImportSuccessful = TAMLWrite(%newAsset, %assetPath @ "/" @ %assetName @ ".asset.taml"); - - //and copy the file into the relevent directory - %doOverwrite = !AssetBrowser.isAssetReImport; - if(!pathCopy(%filePath, %assetFullPath, %doOverwrite)) - { - error("Unable to import asset: " @ %filePath); - } - } - if(%assetImportSuccessful) - { - %moduleDef = ModuleDatabase.findModule(%moduleName,1); - - if(!AssetBrowser.isAssetReImport) - AssetDatabase.addDeclaredAsset(%moduleDef, %assetPath @ "/" @ %assetName @ ".asset.taml"); - else - AssetDatabase.refreshAsset(%assetId); - } - if(ImportAssetTree.isParentItem(%id)) - { - %childItem = ImportAssetTree.getChild(%id); - - //recurse! - %this.doImportAssets(%childItem); - } - - %id = ImportAssetTree.getNextSibling(%id); -} - -function ImportAssetWindow::resolveIssue(%this, %assetItem) -{ - //Ok, we actually have a warning, so lets resolve - if(%assetItem.statusType $= "DuplicateImportAsset" || %assetItem.statusType $= "DuplicateAsset") - { - %resolutionAction = getAssetImportConfigValue("General/DuplicatAutoResolution", "AutoPrune"); - - %humanReadableStatus = %assetItem.statusType $= "DuplicateImportAsset" ? "Duplicate Import Asset" : "Duplicate Asset"; - - if(%resolutionAction $= "AutoPrune") - { - %this.deleteImportingAsset(%assetItem); - %this.prunedDuplicateAssets++; - - ImportActivityLog.add("Asset " @ %assetItem.assetName @ " was Autopruned due to " @ %humanReadableStatus); - } - else if(%resolutionAction $= "AutoRename") - { - ImportActivityLog.add("Asset " @ %assetItem.assetName @ " was Auto-Renamed due to " @ %humanReadableStatus); - - %noNum = stripTrailingNumber(%assetItem.assetName); - %num = getTrailingNumber(%assetItem.assetName); - - if(%num == -1) - { - %assetItem.assetName = %noNum @ "1"; - } - else - { - %num++; - %assetItem.assetName = %noNum @ %num; - } - - ImportActivityLog.add(" New name is " @ %assetItem.assetName); - - %this.autoRenamedAssets++; - } - } - else if(%assetItem.statusType $= "MissingFile") - { - if(getAssetImportConfigValue("General/AutomaticallyPromptMissingFiles", "0") == 1) - { - %this.findMissingFile(%assetItem); - } - } + %this.doImportAssets(); + + //force an update of any and all modules so we have an up-to-date asset list + AssetBrowser.refresh(); + Canvas.popDialog(AssetImportCtrl); + AssetBrowser.isAssetReImport = false;*/ } function ImportAssetWindow::findMissingFile(%this, %assetItem) diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetImportConfig.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetImportConfig.cs index 52268c88a..62fcf8b7d 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetImportConfig.cs +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetImportConfig.cs @@ -10,11 +10,18 @@ function ImportAssetConfigList::onSelect( %this, %id, %text ) ImportActivityLog.add(""); ImportAssetWindow.activeImportConfigIndex = %id; - ImportAssetWindow.activeImportConfig = ImportAssetWindow.importConfigsList.getKey(%id); + //ImportAssetWindow.activeImportConfig = ImportAssetWindow.importConfigsList.getKey(%id); + + if(!isObject(%this.activeImporConfig)) + %this.activeImporConfig = new AssetImportConfig(); + + %this.activeImporConfig.loadImportConfig(AssetImportSettings, ImportAssetWindow.importConfigsList.getKey(%id)); //If we were trying to import anything, refresh it with the new config - if( ImportAssetWindow.importingFilesArray.count() != 0) - AssetBrowser.reloadImportingFiles(); + ImportAssetWindow.importer.resetImportSession(); + + //if( ImportAssetWindow.importingFilesArray.count() != 0) + // AssetBrowser.reloadImportingFiles(); } function setupImportConfigSettingsList() diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/cubemap.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/cubemap.cs index 49b47324c..44f6e56c0 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/cubemap.cs +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/cubemap.cs @@ -95,14 +95,14 @@ function GuiInspectorTypeCubemapAssetPtr::onControlDropped( %this, %payload, %po if( !%payload.parentGroup.isInNamespaceHierarchy( "AssetPreviewControlType_AssetDrop" ) ) return; - %assetType = %payload.dragSourceControl.parentGroup.assetType; + %assetType = %payload.assetType; if(%assetType $= "CubemapAsset") { echo("DROPPED A CUBEMAP ON A CUBEMAP ASSET COMPONENT FIELD!"); - %module = %payload.dragSourceControl.parentGroup.moduleName; - %asset = %payload.dragSourceControl.parentGroup.assetName; + %module = %payload.moduleName; + %asset = %payload.assetName; %targetComponent = %this.object; %targetComponent.CubemapAsset = %module @ ":" @ %asset; diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/datablockObjects.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/datablockObjects.cs index cf144c05d..7adffaeb2 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/datablockObjects.cs +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/datablockObjects.cs @@ -42,15 +42,26 @@ function AssetBrowser::doCreateNewDatablock(%this) function AssetBrowser::buildDatablockPreview(%this, %assetDef, %previewData) { - %previewData.assetName = %assetDef.assetName; - %previewData.assetPath = %assetDef.dirPath; + %previewData.assetName = %assetDef; + %previewData.assetPath = ""; - %previewData.previewImage = "tools/assetBrowser/art/scriptIcon"; + %previewData.previewImage = "tools/assetBrowser/art/datablockIcon"; //%previewData.assetFriendlyName = %assetDef.assetName; - %previewData.assetDesc = %assetDef.description; - %previewData.tooltip = %assetDef.dirPath; - %previewData.doubleClickCommand = "AssetBrowser.schedule(10, \"navigateTo\",\""@ %assetDef.dirPath @ "/" @ %assetDef.assetName @"\");";//browseTo %assetDef.dirPath / %assetDef.assetName + %previewData.assetDesc = %assetDef; + %previewData.tooltip = %assetDef; + %previewData.doubleClickCommand = "AssetBrowser.schedule(10, \"spawnDatablockObject\",\""@ %assetDef @"\");";//browseTo %assetDef.dirPath / %assetDef.assetName +} + +function spawnDatablockObject(%datablock) +{ + %name = %datablock.getName(); + %class = %datablock.getClassName(); + %cmd = %class @ "::create(" @ %name @ ");"; + + %shapePath = ( %datablock.shapeFile !$= "" ) ? %datablock.shapeFile : %datablock.shapeName; + %createCmd = "EWCreatorWindow.createObject( \\\"" @ %cmd @ "\\\" );"; + return eval("showImportDialog( \"" @ %shapePath @ "\", \"" @ %createCmd @ "\" );"); } function AssetBrowser::renameDatablock(%this, %folderPath, %newFolderName) @@ -124,4 +135,25 @@ function AssetBrowser::deleteDatablock(%this, %folderPath) %this.dirHandler.deleteDatablock(%folderPath); %this.refresh(); +} + +function AssetBrowser::onDatablockEditorDropped(%this, %assetDef, %position) +{ + %targetPosition = EWorldEditor.unproject(%position SPC 1000); + %camPos = LocalClientConnection.camera.getPosition(); + %rayResult = containerRayCast(%camPos, %targetPosition, -1); + + %pos = EWCreatorWindow.getCreateObjectPosition(); + + if(%rayResult != 0) + { + %pos = getWords(%rayResult, 1, 3); + } + else + { + %pos = "0 0 0"; + } + + %newObj = spawnDatablockObject(%assetDef); + %newObj.position = %pos; } \ No newline at end of file diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/image.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/image.cs index ac9a0bf8e..f96db3a18 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/image.cs +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/image.cs @@ -261,7 +261,7 @@ function GuiInspectorTypeImageAssetPtr::onControlDropped( %this, %payload, %posi if( !%payload.parentGroup.isInNamespaceHierarchy( "AssetPreviewControlType_AssetDrop" ) ) return; - %assetType = %payload.dragSourceControl.parentGroup.assetType; + %assetType = %payload.assetType; if(%assetType $= "ImageAsset") { diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/level.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/level.cs index 8d117e65e..eeeb6e5c9 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/level.cs +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/level.cs @@ -7,6 +7,10 @@ function AssetBrowser::setupCreateNewLevelAsset(%this) NewAssetPropertiesInspector.endGroup(); } +function AssetImporter::importLevelAsset(%this, %assetItem) +{ +} + function AssetBrowser::createLevelAsset(%this) { %moduleName = AssetBrowser.newAssetSettings.moduleName; diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/looseFiles.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/looseFiles.cs new file mode 100644 index 000000000..d209e2f06 --- /dev/null +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/looseFiles.cs @@ -0,0 +1,14 @@ +function AssetBrowser::buildLooseFilePreview(%this, %assetDef, %previewData) +{ + %fullPath = %assetDef.dirPath @ "/" @ %assetDef.assetName; + %previewData.assetName = %assetDef.assetName; + %previewData.assetPath = %fullPath; + + %previewData.previewImage = "tools/assetBrowser/art/looseFileIcon"; + + //%previewData.assetFriendlyName = %assetDef.assetName; + %previewData.assetDesc = %assetDef.description; + %previewData.tooltip = %fullPath; + //%previewData.doubleClickCommand = "AssetBrowser.schedule(10, \"navigateTo\",\""@ %assetDef.dirPath @ "/" @ %assetDef.assetName @"\");";//browseTo %assetDef.dirPath / %assetDef.assetName + %previewData.doubleClickCommand = "AssetBrowser.autoImportFile(\"" @ %fullPath @ "\");"; +} \ No newline at end of file diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/material.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/material.cs index 1b53e65c8..cfc890133 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/material.cs +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/material.cs @@ -432,7 +432,7 @@ function AssetBrowser::importMaterialAsset(%this, %assetItem) function AssetBrowser::buildMaterialAssetPreview(%this, %assetDef, %previewData) { - %previewData.assetName = %assetDef.materialDefinitionName; + %previewData.assetName = %assetDef.assetName; %previewData.assetPath = %assetDef.scriptFile; //Lotta prepwork @@ -501,9 +501,9 @@ function GuiInspectorTypeMaterialAssetPtr::onControlDropped( %this, %payload, %p if( !%payload.parentGroup.isInNamespaceHierarchy( "AssetPreviewControlType_AssetDrop" ) ) return; - %assetType = %payload.dragSourceControl.parentGroup.assetType; - %module = %payload.dragSourceControl.parentGroup.moduleName; - %assetName = %payload.dragSourceControl.parentGroup.assetName; + %assetType = %payload.assetType; + %module = %payload.moduleName; + %assetName = %payload.assetName; if(%assetType $= "MaterialAsset") { diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/prefab.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/prefab.cs index e69de29bb..ff271b9c1 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/prefab.cs +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/prefab.cs @@ -0,0 +1,14 @@ +function AssetBrowser::buildPrefabPreview(%this, %assetDef, %previewData) +{ + %fullPath = %assetDef.dirPath @ "/" @ %assetDef.assetName; + %previewData.assetName = %assetDef.assetName; + %previewData.assetPath = %fullPath; + + %previewData.previewImage = "tools/assetBrowser/art/genericAssetIcon"; + + //%previewData.assetFriendlyName = %assetDef.assetName; + %previewData.assetDesc = %assetDef.description; + %previewData.tooltip = %fullPath; + //%previewData.doubleClickCommand = "AssetBrowser.schedule(10, \"navigateTo\",\""@ %assetDef.dirPath @ "/" @ %assetDef.assetName @"\");";//browseTo %assetDef.dirPath / %assetDef.assetName + %previewData.doubleClickCommand = "AssetBrowser.autoImportFile(\"" @ %fullPath @ "\");"; +} \ No newline at end of file diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/shape.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/shape.cs index 483b9b0c7..8274b1cf7 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/shape.cs +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/shape.cs @@ -270,6 +270,10 @@ function AssetBrowser::onShapeAssetEditorDropped(%this, %assetDef, %position) { %pos = getWords(%rayResult, 1, 3); } + else + { + %pos = "0 0 0"; + } %assetId = %assetDef.getAssetId(); @@ -296,17 +300,17 @@ function GuiInspectorTypeShapeAssetPtr::onControlDropped( %this, %payload, %posi if( !%payload.parentGroup.isInNamespaceHierarchy( "AssetPreviewControlType_AssetDrop" ) ) return; - %assetType = %payload.dragSourceControl.parentGroup.assetType; + %assetType = %payload.assetType; if(%assetType $= "ShapeAsset") { //echo("DROPPED A SHAPE ON A SHAPE ASSET COMPONENT FIELD!"); - %module = %payload.dragSourceControl.parentGroup.moduleName; - %asset = %payload.dragSourceControl.parentGroup.assetName; + %module = %payload.moduleName; + %asset = %payload.assetName; %targetComponent = %this.targetObject; - %targetComponent.MeshAsset = %module @ ":" @ %asset; + %targetComponent.shapeAsset = %module @ ":" @ %asset; //Inspector.refresh(); } diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/directoryHandling.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/directoryHandling.cs index dc54e6521..f073ba6c6 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/directoryHandling.cs +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/directoryHandling.cs @@ -58,7 +58,7 @@ function directoryHandler::loadFolders(%this, %path, %parentId) // %iconIdx = 1; %searchFoldersText = %this.searchFilter; - if(%searchFoldersText !$= "Search Folders...") + if(%searchFoldersText !$= "") { if(strstr(strlwr(%folderName), strlwr(%searchFoldersText)) != -1) { @@ -123,7 +123,7 @@ function directoryHandler::navigateTo(%this, %address, %historyNav, %selectionNa //find our folder tree and action on it tree %folderId = %this.getFolderTreeItemFromAddress(%address); - + %this.oldAddress = %this.currentAddress; %this.currentAddress = %address; %this.selectedItem = %folderId; @@ -197,7 +197,15 @@ function directoryHandler::getFolderTreeItemFromAddress(%this, %address) //break down the address %folderCount = getTokenCount(%address, "/"); - %curItem = 0; + if(startsWith(%address, "Data/") || startsWith(%address, "Tools/") || startsWith(%address, "Core/")) + { + %curItem = %this.treeCtrl.findChildItemByName(1, "Modules"); + } + else + { + %curItem = 1; + } + %rebuiltPath = ""; for(%f=0; %f < %folderCount; %f++) { @@ -214,7 +222,15 @@ function directoryHandler::expandTreeToAddress(%this, %address) %folderCount = getTokenCount(%address, "/"); %this.treeCtrl.expandItem(0); - %curItem = 0; + if(startsWith(%address, "Data/") || startsWith(%address, "Tools/") || startsWith(%address, "Core/")) + { + %curItem = %this.treeCtrl.findChildItemByName(1, "Modules"); + } + else + { + %curItem = 1; + } + %rebuiltPath = ""; for(%f=0; %f < %folderCount; %f++) { diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/editModule.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/editModule.cs index 4a08e84bb..80739e8af 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/editModule.cs +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/editModule.cs @@ -15,7 +15,40 @@ function AssetBrowser::CreateNewModule(%this) Canvas.pushDialog(AssetBrowser_AddModule); AssetBrowser_addModuleWindow.selectWindow(); - AssetBrowser_addModuleWindow.callbackFunction = "AssetBrowser.loadDirectories();"; + AssetBrowser_addModuleWindow.callbackFunction = "AssetBrowser.promptNewModuleFolders();"; +} + +function AssetBrowser::promptNewModuleFolders(%this) +{ + MessageBoxYesNo("Create Folders?", + "Do you want to create some common folders for organization of your new Module?", + "AssetBrowser.makeModuleFolders();", //if yes, make the foldesr + "AssetBrowser.loadDirectories();"); //if no, just refresh +} + +function AssetBrowser::makeModuleFolders(%this) +{ + %moduleId = AssetBrowser.newModuleId; + %moduleDef = ModuleDatabase.findModule(%moduleId); + %modulePath = %moduleDef.ModulePath; + + %count = 0; + %defaultModuleFolders[%count++] = "datablocks"; + %defaultModuleFolders[%count++] = "terrains"; + %defaultModuleFolders[%count++] = "postFXs"; + %defaultModuleFolders[%count++] = "levels"; + %defaultModuleFolders[%count++] = "shapes"; + %defaultModuleFolders[%count++] = "guis"; + %defaultModuleFolders[%count++] = "scripts"; + %defaultModuleFolders[%count++] = "scripts/client"; + %defaultModuleFolders[%count++] = "scripts/server"; + + for(%i=0; %i <= %count; %i++) + { + %this.dirHandler.createFolder(%modulePath @ "/" @ %defaultModuleFolders[%i]); + } + + AssetBrowser.loadDirectories(); } function AssetBrowser::createNewEditorTool(%this) diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/looseFileAudit.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/looseFileAudit.cs index 0cdd00029..adba15edb 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/looseFileAudit.cs +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/looseFileAudit.cs @@ -215,6 +215,8 @@ function LooseFileAuditWindow::importGUI(%this) if(!ImportAssetWindow.isAwake()) ImportAssetWindow.showDialog(); + ImportAssetWindow.allowAutoImport = false; + AssetBrowser.addImportingAsset("GUIAsset", LooseFileList.itemPath, "", ""); LooseFileList.removeItem(LooseFileList.selectedItem, false); LooseFileList.buildVisibleTree(true); @@ -226,6 +228,8 @@ function LooseFileAuditWindow::importLevel(%this) if(!ImportAssetWindow.isAwake()) ImportAssetWindow.showDialog(); + ImportAssetWindow.allowAutoImport = false; + AssetBrowser.addImportingAsset("LevelAsset", LooseFileList.itemPath, "", ""); LooseFileList.removeItem(LooseFileList.selectedItem, false); LooseFileList.buildVisibleTree(true); diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/popupMenus.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/popupMenus.cs index e576b2f11..cbe5c528e 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/popupMenus.cs +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/popupMenus.cs @@ -87,9 +87,9 @@ function AssetBrowser::buildPopupMenus(%this) class = "EditorWorldMenu"; //isPopup = true; - item[ 0 ] = "Create Component" TAB AddNewComponentAssetPopup; - item[ 1 ] = "Create Script" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"ScriptAsset\", AssetBrowser.selectedModule);"; - item[ 2 ] = "Create State Machine" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"StateMachineAsset\", AssetBrowser.selectedModule);"; + //item[ 0 ] = "Create Component" TAB AddNewComponentAssetPopup; + item[ 0 ] = "Create Script" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"ScriptAsset\", AssetBrowser.selectedModule);"; + item[ 1 ] = "Create State Machine" TAB "" TAB "AssetBrowser.setupCreateNewAsset(\"StateMachineAsset\", AssetBrowser.selectedModule);"; //item[ 3 ] = "-"; //item[ 3 ] = "Create Game Object" TAB "" TAB "AssetBrowser.createNewGameObjectAsset(\"NewGameObject\", AssetBrowser.selectedModule);"; }; @@ -239,22 +239,6 @@ function AssetBrowser::buildPopupMenus(%this) }; } - //Asset Preview size presets - if( !isObject( AssetPreviewSizePopup ) ) - { - new PopupMenu( AssetPreviewSizePopup ) - { - superClass = "MenuBuilder"; - class = "EditorWorldMenu"; - - item[ 0 ] = "Small" TAB "" TAB "AssetBrowser.setPreviewSize(\"Small\");"; - item[ 1 ] = "Medium" TAB "" TAB "AssetBrowser.setPreviewSize(\"Medium\");"; - Item[ 2 ] = "Large" TAB "" TAB "AssetBrowser.setPreviewSize(\"Large\");"; - }; - - AssetPreviewSizePopup.checkItem(0, true); - } - if( !isObject( AssetTypeListPopup ) ) { new PopupMenu( AssetTypeListPopup ) @@ -295,8 +279,6 @@ function AssetBrowser::buildPopupMenus(%this) item[ 7 ] = "Filter by Asset Type" TAB AssetTypeListPopup; item[ 8 ] = "-"; item[ 9 ] = "Enable Auto-refresh" TAB "" TAB "AssetBrowser.toggleAutorefresh();"; - Item[ 10 ] = "-"; - Item[ 11 ] = "Asset Preview Size" TAB AssetPreviewSizePopup; }; BrowserVisibilityPopup.enableItem(5, false); @@ -408,6 +390,18 @@ function AssetBrowser::buildPopupMenus(%this) AddNewModulePopup.enableItem(1, false); } + + if( !isObject( EditCollectionSets ) ) + { + new PopupMenu( EditCollectionSets ) + { + superClass = "MenuBuilder"; + class = "EditorWorldMenu"; + //isPopup = true; + + item[ 0 ] = "Delete Collection Set" TAB "" TAB "AssetBrowser.deleteCollectionSet();"; + }; + } } function AddNewScriptAssetPopupMenu::onSelectItem(%this, %id, %text) diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/profiles.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/profiles.cs new file mode 100644 index 000000000..5010d6cd0 --- /dev/null +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/profiles.cs @@ -0,0 +1,27 @@ +singleton GuiControlProfile(AssetBrowserPreviewImageAsset : ToolsGuiDefaultProfile) +{ + fillColor = "128 128 128 255"; //hovered/selected + //fillColorNA = "230 126 0 255"; //fill color default + + border = true; + borderColor = "230 126 0 255"; + borderColorNA = "230 126 0 255"; +}; + +singleton GuiControlProfile(AssetBrowserPreviewMaterialAsset : ToolsGuiDefaultProfile) +{ + fillColor = "128 128 128 255"; //hovered/selected + + border = true; + borderColor = "0 100 0 255"; + borderColorNA = "0 100 0 255"; +}; + +singleton GuiControlProfile(AssetBrowserPreviewShapeAsset : ToolsGuiDefaultProfile) +{ + fillColor = "128 128 128 255"; //hovered/selected + + border = true; + borderColor = "0 0 200 255"; + borderColorNA = "0 0 200 255"; +}; \ No newline at end of file diff --git a/Templates/BaseGame/game/tools/base/menuBar/menuBuilder.ed.cs b/Templates/BaseGame/game/tools/base/menuBar/menuBuilder.ed.cs index 183eef7eb..883c32bf9 100644 --- a/Templates/BaseGame/game/tools/base/menuBar/menuBuilder.ed.cs +++ b/Templates/BaseGame/game/tools/base/menuBar/menuBuilder.ed.cs @@ -120,6 +120,7 @@ function MenuBuilder::addItem(%this, %pos, %item) %name = getField(%item, 0); %accel = getField(%item, 1); %cmd = getField(%item, 2); + %bitmapIdx = getField(%item, 3); // We replace the [this] token with our object ID %cmd = strreplace( %cmd, "[this]", %this ); @@ -132,7 +133,7 @@ function MenuBuilder::addItem(%this, %pos, %item) } else { - %this.insertItem(%pos, %name !$= "-" ? %name : "", %accel, %cmd); + %this.insertItem(%pos, %name !$= "-" ? %name : "", %accel, %cmd, %bitmapIdx $= "" ? -1 : %bitmapIdx); } } diff --git a/Templates/BaseGame/game/tools/gui/editorSettingsWindow.ed.cs b/Templates/BaseGame/game/tools/gui/editorSettingsWindow.ed.cs index 0dd8727f4..17155174f 100644 --- a/Templates/BaseGame/game/tools/gui/editorSettingsWindow.ed.cs +++ b/Templates/BaseGame/game/tools/gui/editorSettingsWindow.ed.cs @@ -485,6 +485,7 @@ function ESettingsWindow::getAssetEditingSettings(%this) SettingsInspector.addSettingsField("Assets/Browser/showFolders", "Show Folders in Tiles view in Asset Browser", "bool", ""); SettingsInspector.addSettingsField("Assets/Browser/showEmptyFolders", "Show Empty Folders in Tiles view in Asset Browser", "bool", ""); SettingsInspector.addSettingsField("Assets/Browser/previewTileSize", "Asset Preview Tile Size", "bool", ""); + SettingsInspector.addSettingsField("Assets/Browser/showLooseFiles", "Show Loose Files when viewing in Asset Browser", "bool", ""); SettingsInspector.addSettingsField("AssetManagement/Assets/promptOnRename", "Prompt on Rename", "bool", ""); SettingsInspector.endGroup(); } diff --git a/Templates/BaseGame/game/tools/gui/images/stencilIcons/cross.png b/Templates/BaseGame/game/tools/gui/images/stencilIcons/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..e21d5ac103af953a9ef5fc507ddc3c599c869f1f GIT binary patch literal 15480 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 J9cozJ{~yetv9SOE literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/tools/gui/images/stencilIcons/menuGrid.png b/Templates/BaseGame/game/tools/gui/images/stencilIcons/menuGrid.png new file mode 100644 index 0000000000000000000000000000000000000000..3e92b499b7ff0133e78a248f81066548da3f95da GIT binary patch literal 15242 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 H*lYg*r*Dl$ literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/tools/gui/images/stencilIcons/previous.png b/Templates/BaseGame/game/tools/gui/images/stencilIcons/previous.png new file mode 100644 index 0000000000000000000000000000000000000000..2720365ecf25b28bd849e919e0aad543f855c2df GIT binary patch literal 15366 zcmeI3ZEPIH8OPV)Hum8_nuc^~t1?^?VhVS=doQ+cb-u*DvwKcC<5yy%cK$?XQlH!p7}rj+4;>gbNgi`}ZJr3R3R2r!nCb%h^mgMcw0&zH| zYVFRyA3x~?s?zS<>W}fUbQq4S(HR2{&h!q+Gu!2W;@lK+1hXPCNI^>i*;G<9#caDX z=PRPvZswdIC$YA-J3H(F!APtRgmnV~zuWJUd5-{E18%|Z3kbqpz{3k(PT)CDz$FNx zuT>OUK;d$R94HDJN{DpfVpv<6^#W>p6?ho;kz8-S)hX~+=C*Hya()9RW+Qz{_32BWSis99C56uIP+ zo-~p<(2C5#But?c6HySV&LusrTe>-}*8o`Ru8Gl76E#@aJvGx{R;`g{_vF)ZHI-lL zASz@rY(UA({*$74?3x-fl`%pEzc+ZeW z5WOCe_ua`0BF|$cd1Zx1Ojp#z^fC`*&?frYa1Tsb>4Em3B3aTkx!~HRKCzhCqnVbZ z$*?C9LUVVksv`OmalQreahI3(@GeR6`CV~EkzI*+JP~M(`+Ti@A~(sU>C3Dmx;$yu zP{CS3*1oQefVaitY4L=+1)X5B&Txwm@V69gvDD?Z&`_tK(rxIe-1bgO zh6(Lm)9x&8o6>nusDa$R6V>HY&EJpEUHg8PrIzmpnFsUTO3j(_BxfwO>|DZ7o@zx& zBlPzeDmu}nB*w~K!T$$y6$|VpkQ*8%s+wr)Ok?BQ^R~~`K{&Crwb+qVuW?~Y%Y#lc zQIhQwJ7h{|af4j$ge$g{Zz`W*50n>FS<`DP-(~5w$H03QKy3o@Gx(caycV+76)l>2A%G7e^u%=oePhqr*W-QD8fy%=eL=R;!)Z+Jh z{Xwp>xiX_q&BEkJL`7$*Y3~p;wL(&5Pu0xPnweNnAv0eL*aK9qR`RXr@eDl~a-~PZ zrDaswm|t>Gp3;|WjN8#ca2mvz;vyo#1r!%fgBVj>L`1lN;=*YVV~UH22p3RXI1OS< zaS;*W0*VW#L5wLbA|hNsap5$GF~vnhgbOGxoCYzbxQK{w0mX&WAjT9I5fLt+xNsW8 znBpQL!UYr;PJar$LM>vJiwm(+ivFf4sLrtJ={U4ccgP%Ob ztOs=~7Or2vP=Diw==cNKj|}C^(Z!SV(+l4pJ9+n&sm$Tbx%-t~_sjLOt2Q&Y%`%-# z-9yZE4f#LytFCJR^{X~V9jAtePi%eXmy7>-Y~tUy9J~JL8?WAb`Qx>k@$xf^^6>o! zgijAIhFV`cqYs}yee>luYRs)yVUa*#R zgBJEia4&liOtGiIes&T3n%xE7Wq$~+uv@^_*zW>?b%1{M?T!ol;hkrPx81%o_(JFA zy81P5ezcceb7+QF?Zdh~d#EDDIdybz!)PLXa=1x7`cHpV`$iybOd2T-K*y`Bur-fIVwhU}s(YWu$ z2R44tzxsIH&%1j*e$2mi!*33rjqdx`lRx{Q@6TJrrmyUkn(yq`^Q|{OziHn==c#|* z`r#*Y&+ePNJo)MAiSy@f{qf9iU-_>(5&PBdV@EFj;Jw`k(t|5 b*>{*n&K=Yb3BKp;H+6fudLu_WxBc{gMY__B literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/tools/gui/images/stencilIcons/return.png b/Templates/BaseGame/game/tools/gui/images/stencilIcons/return.png new file mode 100644 index 0000000000000000000000000000000000000000..139b39afcce4a38716b887554a9155f5da47ad0b GIT binary patch literal 15821 zcmeI3dsGuw9>+(hmPTE$)=I(J7^-L?nM_`g7-Ap+K?z2L3hLGlnF-`TGBF7zpmY)K zQL!!7MNzO?Ek3&8 z`~7|I+|T{poB3y!>a!*e=0tH21R0!>uFVGD1pN*h06wihuFL^nPg&FR?Fce(DE;n- z)US<15cw)oPM#xAm#HvNW&uu61*E`bwgNSRC?~kAxS^PIa0|#nlO>6F{o_MCu8BzE zO_%C~I;(~(GNqT>$Z6$SIfn9LgPh<^P;rzl1u!s^4xH;UmssoyR}#O*Cp5;sdK@UyoesdD0MDrar9|L7<@j~ zQd@}|G+{u=64DG(?0^E+=Ul8sl!LMtQ9%Iux`SeLn2bSK&^MbArwL;9%X=sjv`FPvR)p*AW3qg*U?PqJrv zFKaDjD5Y!2YfS)aNvc#LNlrH8{c{0tpWGGQB)q6dO!LO%Rs{eX`xzf{31f8jz$r(!Z zJNq#Bry5Yw0R0r337qJ73B-zC!T$$y9~RI>05>p9y2%clJ#YG4okq^-+1lMv zVtUMl@huNH%@nwSKCxAH94xL9b)RtEZT^e$WY7b71bwXO5In*ZojxH~Y_pP6ehIaDI=XaUVo z7X1h1fiVr-l#wc#R7#(ufz5##dXtMR$1C4P>(m$Qw-1z zl)F|ut>E?y+!><2Tf?4Zb}ui;EEvEMRfLG#FzR7b7BAz~X{wFvct{MntfH#Rbz~j9FZah+qMW3#P#s zv$z-$!2%W+OoK6IaWNu-1uQO@24l?PVnhTBSX?j-#+b#$hzJ(2xL_KLF^h{45iDSF z!890S78fHTSis_fX)wktE=EMKfW-yVV2oK@jEGDoq zy6kVGz+;$PLwdFjLCQxXNaaEV>3RshFC$2)5J5U$MG(bm1Q|}Pn0+)2K|=qTp-s+l zbzFJp!kh+m#Ov!t55l*p8$(VnsO7{@k0_1UR5f5icTSL)aql)AI>8 z`nqoBC#*YZ;BZ5lk%-W+;@4tB^&={h_R8KqzGTmetbYGM;`^sWlgQJ^OoV#kOqLyq zUOGUxNpx+UT2QlONB@Y@sk=sUPUdCaf4S*=YWT70OL>R-J@Ll!8qSL^tqOg9!tnJS zL&JnakGwe|v2Ivp?Ci>uaX(y-ZcU%kxKnd^WNY|u6S1~$%KNvio_K5O&bHNEYYsI$ zXLt~m@O#nC`&C%m_H8>y|NH&wi=Y2()!0Z4F#`STgk$w2|J1$szaQ_v^22sA@_GmI zhb%3;?4VG`Cn~OG&k5fU*}AMo-L`$!&s#cd_?|rnc=-p_T+5n!wd!xhWg&CoCxwK_ z%^wyYuN*URr(U#g$ENya`R!9X_qScTKj!LYvfp`eOk>WNA*UO=oQQRci(EY8=*Dn$ z_P&&Jzb2oq&E0r)MqT{OU!pet)b>=vkf(o-9KFGHIIgo{RUI)Ys&mj+!?|A>j78tS zU7{s`QGQa2DrH(K)Xf@l6xaX4XJ)n{K=#usIBujO1>kkZj{cH#UPAIJ*Mo6p5g9)9oh z#bIY#Zd6ZGV~#~{JeSTn@Qd8C;mgj;v#y@Ia=Rlcad^axhV{GWPJULuH$%EPY@EI& z<+X8d$y4_oc_rpMUDLP|lk_dgk{8abjXUhRBf38DNM`ow@u`twq~?q7Ca#SuTeE9O z_L3>evHQEGZaP2nlT#J-Z?>xi^>+_sHWzE>FFvK)GI`@q%W77ZzcjtM{pU-$HT}2M z&$_WZbNj`e)k5R1ThNv2uCqr*#b{5&c0O}kvUvCHN?8msuPv50S$Ox%fM->29g!{H z*cMw*J7w3%v_Ubs0{y)F4{rZBc-bV`e-_<*zj=)?Q~BW7ik2}g+I^a%)ql)Szm-#7 zcneX59*=KrK6vr&pho?O!n1V`y9T|O8yQpANPPWuhB)QH?6{-NH!dJeFLySTr}I*O zI1v$h)!q^P*@~gB?3I`=v@XW8lnhh literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/tools/gui/images/stencilIcons/warning.png b/Templates/BaseGame/game/tools/gui/images/stencilIcons/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..5869f57f7242f3ebde41606a368793b9fe9e9f9a GIT binary patch literal 15751 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 As{jB1 literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/tools/gui/images/stencilIcons/zoom.png b/Templates/BaseGame/game/tools/gui/images/stencilIcons/zoom.png new file mode 100644 index 0000000000000000000000000000000000000000..6485b489f3f51efcdc3632b7a2ab232dadd69514 GIT binary patch literal 15871 zcmeI3ZB!Fi8pj6;h_Je7MTKI|7?&25WHJc>G7S+(KoCKMSP^k`k_<3PGI27I2&;w4 zsk&|{RfK9Q)r06-p`x{=MZ3PDxO=p|7mx+FzSNhhU8|*5cijmIIZ2+} z`+xp-?(aVLX1>gtwA5)Md;)zS2pW-;s7`0U^|rUS7yD`YZi9yX8g5FQYla}-mu+u1 zXwygIAxK_HYBHJ3lo^MB8tvMP`O-=h$V^m_@(TW9Ee`PD1IqnWCpd;>-v05 z7COHNv|fi0`GkQ@F|!oVLFZ!1qZrDZM-2h6uX{+044E?o3tP{SX@r#=BF)xgPwS~E z`%){|LdH}yfio1Xp{RVNy<1=hT%HfiLEr_?BXhro)fOO&3RGw4BJ3`fV=jF8EsG6mw=?3$5AT8aEjHOZc(X4?*7r{+jfdU>ENP{!xad9F71w1a024~FU;zR@rcw8V2&X~u=i3k+%xIh}5F^`KA z5h&nsfiyT{9v3GfP{88?X>i6oE>1+CfX4;W;EZ`(oQOaHj|-&18S}U}5rG087f6FM z=5cW%0tGxSkOpVWujae*{A z2zu#ik~&snZU13&*OK-azvELSD^`sxpHe)sPUDyEMthd~!2Ych)S89qvDbY5GG%pk ztlG0`SmnuME6*nFcv5q|`&8aj_og@gv#+SJsK~ml!ri}2`R`GF-tn+U+$isoG>sFS|d_`^p^mv**Xhh{oa>MNmNTq}Lz4_xYIay{0pl;@Y!Dw-AP7lGjFF{wVRo zSDNacJyLb7nt2_%M^1db>U~e~jWB(;<*HvoCmk@ar7L;5-cq@*VKme_;w*9M+Sc2r z12!lcUfXj_{?5t3FV=fChP^qx?ZENrJIB@T9#(td!j`XhcBtkc=cbj?ZN@8G53k&4 zX}wo>cCKKM<1?O6B5JstCMS0u$HecqZ)7^069cbF%d7GswBH=Joa{nU#h9Q?KNzh$TG_sbicFV{;aH) z!&j~Un3$EgxzpY2?TPMNy-Q>MT3oCNEU7_Gjd;?T3=ccHN}I6;?a_6T z1C3lU?rdB8mUC?p^;fow7G2UBTdwR}eLCmjN#tg5U`Fd3lh15>aBZFc)DvTNQnKYs z@zBhtTIj0c@cx1YmA(h7!`EK?FOwb8sQD)uki4~{ji}i4@}l7Nwe<;^iw}yz<7yk_{dkn>XBiOSFFXuA5y=wO=Y?{g2!V&6vC3 zll>jP|7se1vBYarX0|`pSpHdi_4dHh+Fx4Hjx~2Clc9L#>bt>DNo zz9F6^rJmPgU_AEZ@IM5Fcw#NTj(qGfyDDumv+ot`;UvTS*ts<|(W9zSMQmH(pQgsI z+7RMFpDS2%W0zM~=#szBw`4s_hM(;_8oK;%^==tH2j*pl(BtDoyXx;LKR8hT>c?>T oA$8S&{WZq1^^R>h_!5*{>hsf~)3=t{9??#UPgQ>!xA5)%0Vc%NDgXcg literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/tools/gui/profiles.ed.cs b/Templates/BaseGame/game/tools/gui/profiles.ed.cs index cd45141bd..5f9adbf33 100644 --- a/Templates/BaseGame/game/tools/gui/profiles.ed.cs +++ b/Templates/BaseGame/game/tools/gui/profiles.ed.cs @@ -305,7 +305,7 @@ new GuiControlProfile( ToolsGuiTextEditProfile ) fontColor = EditorSettings.value("Theme/fieldTextColor"); fontColorSEL = EditorSettings.value("Theme/fieldBGSELColor"); fontColorHL = EditorSettings.value("Theme/fieldTextSELColor"); - fontColorNA = EditorSettings.value("Theme/fieldTextSELColor"); + fontColorNA = EditorSettings.value("Theme/fieldTextNAColor"); textOffset = "4 2"; autoSizeWidth = false; autoSizeHeight = true; @@ -651,6 +651,8 @@ new GuiControlProfile( ToolsGuiTreeViewProfile ) opaque = false; border = false; category = "Tools"; + + fontColors[9] = "0 128 128"; //for active/selection of elements }; if( !isObject( ToolsGuiTextPadProfile ) )