Files
Onejsky4U/Plugins/Runtime/HoudiniEngine/Source/HoudiniEngineEditor/Private/SHoudiniToolPalette.h
T

184 lines
6.4 KiB
C++

/*
* Copyright (c) <2017> Side Effects Software Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
*/
#pragma once
#include "CoreMinimal.h"
#include "HoudiniEngineEditor.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "Input/Reply.h"
#include "Widgets/SCompoundWidget.h"
#include "Widgets/Views/SListView.h"
#include "Misc/NotifyHook.h"
#include "SHoudiniToolPalette.generated.h"
class IDetailsView;
class ITableRow;
class STableViewBase;
struct FSlateBrush;
enum class ECheckBoxState : uint8;
/** The list view mode of the asset view */
class SHoudiniToolListView : public SListView< TSharedPtr<FHoudiniTool> >
{
public:
virtual bool SupportsKeyboardFocus() const override { return true; }
virtual FReply OnKeyDown(const FGeometry& InGeometry, const FKeyEvent& InKeyEvent) override
{
return FReply::Unhandled();
}
};
// Class describing the various properties for a Houdini Tool
// adding a UClass was necessary to use the PropertyEditor window
UCLASS( EditInlineNew )
class UHoudiniToolProperties : public UObject
{
GENERATED_UCLASS_BODY()
public:
/** Name of the tool */
UPROPERTY( Category = Tool, EditAnywhere )
FString Name;
/** Type of the tool */
UPROPERTY( Category = Tool, EditAnywhere )
EHoudiniToolType Type;
/** Selection Type of the tool */
UPROPERTY( Category = Tool, EditAnywhere )
EHoudiniToolSelectionType SelectionType;
/** Tooltip shown on mouse hover */
UPROPERTY( Category = Tool, EditAnywhere )
FString ToolTip;
/** Path to a custom icon */
UPROPERTY( Category = Tool, EditAnywhere, meta = (FilePathFilter = "png") )
FFilePath IconPath;
/** Houdini Asset path **/
UPROPERTY(Category = Tool, EditAnywhere, meta = (FilePathFilter = "hda"))
FFilePath AssetPath;
/** Clicking on help icon will bring up this URL */
UPROPERTY( Category = Tool, EditAnywhere )
FString HelpURL;
};
// Class describing a Houdini Tool directory
// adding a UClass was necessary to use the PropertyEditor window
UCLASS(EditInlineNew)
class UHoudiniToolDirectoryProperties : public UObject
{
GENERATED_UCLASS_BODY()
public:
/** Custom Houdini Tool Directories **/
UPROPERTY(EditAnywhere, Category = CustomHoudiniTools)
TArray<FHoudiniToolDirectory> CustomHoudiniToolsDirectories;
};
class SHoudiniToolPalette : public SCompoundWidget, public FNotifyHook
{
public:
SLATE_BEGIN_ARGS( SHoudiniToolPalette ) {}
SLATE_END_ARGS();
void Construct( const FArguments& InArgs );
static FTransform GetDefaulToolSpawnTransform();
static FTransform GetMeanWorldSelectionTransform();
/** Instantiate the selected HoudiniTool and assigns input depending on the current selection and tool type **/
static void InstantiateHoudiniTool( FHoudiniTool* HoudiniTool );
/** Handler for Key presses**/
virtual FReply OnKeyDown( const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent );
bool IsActiveHoudiniToolEditable();
FText OnGetSelectedDirText() const;
protected:
/** Remove the current tool from the tool list **/
void RemoveActiveTool();
/** Shows a property window for editing the current Tool directory **/
FReply OnEditToolDirectories();
/** Handler for closing the EditToolDirectory window **/
void OnEditToolDirectoriesWindowClosed(const TSharedRef<SWindow>& InWindow, TArray<UObject *> InObjects);
/** Generates default JSON files for HDA in the current Tool directory that doesnt have one **/
void GenerateMissingJSONFiles();
private:
/** Make a widget for the list view display */
TSharedRef<ITableRow> MakeListViewWidget( TSharedPtr<struct FHoudiniTool> BspBuilder, const TSharedRef<STableViewBase>& OwnerTable );
/** Returns the index of the currently selected directory in the Editor ToolDirectoryArray **/
bool GetCurrentDirectoryIndex(int32& SelectedIndex) const;
/** Delegate for when the list view selection changes */
void OnSelectionChanged( TSharedPtr<FHoudiniTool> BspBuilder, ESelectInfo::Type SelectionType );
/** Delegate for when the direcory combo selection changes **/
void OnDirectoryChange(const FString& NewChoice);
/** Begin dragging a list widget */
FReply OnDraggingListViewWidget( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent );
/** Handler for double clicking on a Houdini tool **/
void OnDoubleClickedListViewWidget( TSharedPtr<FHoudiniTool> ListItem );
/** Handler for the right click context menu on a Houdini tool **/
TSharedPtr< SWidget > ConstructHoudiniToolContextMenu();
/** Shows a Property Window for editing the properties of new HoudiniTools**/
void EditActiveHoudiniTool();
/** Handler for closing the AddHoudiniTools window**/
void OnEditActiveHoudiniToolWindowClosed(const TSharedRef<SWindow>& InWindow, TArray<UObject *> InObjects);
TSharedRef<SWindow> CreateFloatingDetailsView( const TArray< UObject* >& InObjects );
void UpdateHoudiniToolDirectories();
//void RenameToolFolder(const FString& SourcePath, const FString& NewName);
private:
TSharedPtr<FHoudiniTool> ActiveTool;
TArray< TSharedPtr < FString > > HoudiniToolDirArray;
FString CurrentHoudiniToolDir;
/** Holds the tools list view. */
TSharedPtr<SHoudiniToolListView> HoudiniToolListView;
};