Full Template for ticket #1

This commit is contained in:
DavidWyand-GG 2012-09-19 11:54:25 -04:00
parent 74f265b3b3
commit f439dc8dcd
2150 changed files with 286240 additions and 0 deletions

View file

@ -0,0 +1,289 @@
//-----------------------------------------------------------------------------
// Copyright (c) 2012 GarageGames, LLC
//
// 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.
//-----------------------------------------------------------------------------
// Functionality that allows all editor inspectors to share certain functionality.
//---------------------------------------------------------------------------------------------
function EditorInspectorBase::onAdd( %this )
{
if( !isObject( EditorInspectorBaseDatablockFieldPopup ) )
new PopupMenu( EditorInspectorBaseDatablockFieldPopup )
{
superClass = "MenuBuilder";
isPopup = true;
item[ 0 ] = "Edit Datablock" TAB "" TAB "DatablockEditorPlugin.openDatablock( %this.inspectorField.getData() );";
Item[ 1 ] = "Jump to Definition in Torsion" TAB "" TAB "EditorOpenDeclarationInTorsion( %this.inspectorField.getData() );";
item[ 2 ] = "Inspect Object" TAB "" TAB "inspectObject( %this.inspectorField.getData() );";
item[ 3 ] = "-";
item[ 4 ] = "Copy Value" TAB "" TAB "setClipboard( %this.inspectorField.getData() );";
item[ 5 ] = "Paste Value" TAB "" TAB "%this.inspectorField.apply( getClipboard() );";
item[ 6 ] = "Reset to Default" TAB "" TAB "%this.inspectorField.reset();";
inspectorField = -1;
};
if( !isObject( EditorInspectorBaseFieldPopup ) )
new PopupMenu( EditorInspectorBaseFieldPopup )
{
superClass = "MenuBuilder";
isPopup = true;
item[ 0 ] = "Inspect Object" TAB "" TAB "inspectObject( %this.inspectorField.getData() );";
Item[ 1 ] = "Jump to Definition in Torsion" TAB "" TAB "EditorOpenDeclarationInTorsion( %this.inspectorField.getData() );";
item[ 2 ] = "-";
item[ 3 ] = "Copy Value" TAB "" TAB "setClipboard( %this.inspectorField.getData() );";
item[ 4 ] = "Paste Value" TAB "" TAB "%this.inspectorField.apply( getClipboard() );";
item[ 5 ] = "Reset to Default" TAB "" TAB "%this.inspectorField.reset();";
inspectorField = -1;
};
if( !isObject( EditorInspectorBaseFileFieldPopup ) )
new PopupMenu( EditorInspectorBaseFileFieldPopup )
{
superClass = "MenuBuilder";
isPopup = true;
item[ 0 ] = "Open File" TAB "" TAB "openFile( %this.filePath );";
item[ 1 ] = "Open Folder" TAB "" TAB "openFolder( %this.folderPath );";
item[ 2 ] = "-";
item[ 3 ] = "Copy Value" TAB "" TAB "setClipboard( %this.inspectorField.getData() );";
item[ 4 ] = "Paste Value" TAB "" TAB "%this.inspectorField.apply( getClipboard() );";
item[ 5 ] = "Reset to Default" TAB "" TAB "%this.inspectorField.reset();";
inspectorField = -1;
folderPath = "";
filePath = "";
};
if( !isObject( EditorInspectorBaseShapeFieldPopup ) )
new PopupMenu( EditorInspectorBaseShapeFieldPopup )
{
superClass = "MenuBuilder";
isPopup = true;
item[ 0 ] = "Edit Shape" TAB "" TAB "ShapeEditorPlugin.openShape( %this.inspectorField.getData() );";
item[ 1 ] = "-";
item[ 2 ] = "Open File" TAB "" TAB "openFile( %this.filePath );";
item[ 3 ] = "Open Folder" TAB "" TAB "openFolder( %this.folderPath );";
item[ 4 ] = "-";
item[ 5 ] = "Copy Value" TAB "" TAB "setClipboard( %this.inspectorField.getData() );";
item[ 6 ] = "Paste Value" TAB "" TAB "%this.inspectorField.apply( getClipboard() );";
item[ 7 ] = "Reset to Default" TAB "" TAB "%this.inspectorField.reset();";
inspectorField = -1;
folderPath = "";
filePath = "";
};
if( !isObject( EditorInspectorBaseProfileFieldPopup ) )
new PopupMenu( EditorInspectorBaseProfileFieldPopup )
{
superClass = "MenuBuilder";
isPopup = true;
item[ 0 ] = "Edit Profile" TAB "" TAB "if( !$InGuiEditor ) toggleGuiEditor( true ); GuiEditor.editProfile( %this.inspectorField.getData() );";
item[ 1 ] = "Jump to Definition in Torsion" TAB "" TAB "EditorOpenDeclarationInTorsion( %this.inspectorField.getData() );";
item[ 2 ] = "Inspect Object" TAB "" TAB "inspectObject( %this.inspectorField.getData() );";
item[ 3 ] = "-";
item[ 4 ] = "Copy Value" TAB "" TAB "setClipboard( %this.inspectorField.getData() );";
item[ 5 ] = "Paste Value" TAB "" TAB "%this.inspectorField.apply( getClipboard() );";
item[ 6 ] = "Reset to Default" TAB "" TAB "%this.inspectorField.reset();";
inspectorField = -1;
folderPath = "";
filePath = "";
};
}
//---------------------------------------------------------------------------------------------
function EditorInspectorBase::onFieldRightClick( %this, %field )
{
%obj = %this.getInspectObject();
%fieldValue = %field.getData();
%inspectIndex = -1;
%openFileIndex = -1;
%openFolderIndex = -1;
// Find out if this is a TypeFilename field referring to a shape file.
%isShapeFilenameField = false;
if( %field.getInspectedFieldName() $= "shapeName" )
{
%isShapeFilenameField =
%obj.isMemberOfClass( "PhysicsShape" ) ||
%obj.isMemberOfClass( "TSStatic" );
}
else if( %field.getInspectedFieldName() $= "shapeFile" )
{
%isShapeFilenameField =
%obj.isMemberOfClass( "ShapeBaseData" ) ||
%obj.isMemberOfClass( "ShapeBaseImageData" ) ||
%obj.isMemberOfClass( "ForestItemData" ) ||
%obj.isMemberOfClass( "WheeledVehicleTire" ) ||
%obj.isMemberOfClass( "fxShapeReplicator" ) ||
%obj.isMemberOfClass( "RenderShapeExample" ) ||
%obj.isMemberOfClass( "DebrisData" );
}
// Select the popup.
if( %isShapeFilenameField )
{
%popup = EditorInspectorBaseShapeFieldPopup;
%openFileIndex = 2;
%openFolderIndex = 3;
}
else if( EditorInspectorBase::isFileTypeField( %field ) )
{
%popup = EditorInspectorBaseFileFieldPopup;
%openFileIndex = 0;
%openFolderIndex = 1;
}
else
{
switch$( %field.getClassName() )
{
case "GuiInspectorCustomField":
if( %field.getInspectedFieldName() !$= "parentGroup" )
return;
case "GuiInspectorTypeGuiProfile":
%popup = EditorInspectorBaseProfileFieldPopup;
%popup.enableItem( 0, isObject( %fieldValue ) );
%inspectIndex = 2;
%jumpToIndex = 1;
case "GuiInspectorDatablockField" or
"GuiInspectorTypeSFXDescriptionName" or
"GuiInspectorTypeSFXEnvironmentName" or
"GuiInspectorTypeSFXTrackName" or
"GuiInspectorTypeSFXAmbienceName" or
"GuiInspectorTypeSFXSourceName":
%popup = EditorInspectorBaseDatablockFieldPopup;
%popup.enableItem( 0, isObject( %fieldValue ) );
%inspectIndex = 2;
%jumpToIndex = 1;
default:
%popup = EditorInspectorBaseFieldPopup;
%inspectIndex = 0;
%jumpToIndex = 1;
}
}
if( %inspectIndex != -1 )
{
%isObject = false;
if( EditorInspectorBase::isObjectTypeField( %field ) )
%isObject = isObject( %fieldValue );
%popup.enableItem( %inspectIndex, %isObject );
%popup.enableItem( %jumpToIndex, %isObject );
}
if( %openFileIndex != -1 || %openFolderIndex != -1 )
{
%fullPath = EditorInspectorBase::getFullFilePath( %field );
%popup.filePath = %fullPath;
%popup.folderPath = filePath( %fullPath );
if( %openFileIndex != -1 )
%popup.enableItem( 0, isFile( %fullPath ) );
if( %openFolderIndex != -1 )
%popup.enableItem( 1, isDirectory( %popup.folderPath ) );
}
%popup.inspectorField = %field;
%popup.showPopup( Canvas );
}
//---------------------------------------------------------------------------------------------
function EditorInspectorBase::isObjectTypeField( %field )
{
// Inspector field types that refer to objects.
switch$( %field.getClassName() )
{
case "GuiInspectorDatablockField" or
"GuiInspectorTypeSFXDescriptionName" or
"GuiInspectorTypeSFXEnvironmentName" or
"GuiInspectorTypeSFXTrackName" or
"GuiInspectorTypeSFXAmbienceName" or
"GuiInspectorTypeSFXSourceName" or
"GuiInspectorTypeGuiProfile":
return true;
}
// Other console types that refer to objects.
switch$( %field.getInspectedFieldType() )
{
case "TypeSimObject" or
"TypeSimObjectName" or
"TypeMaterialName" or
"TypeCubemapName" or
"TypeGuiProfile":
return true;
}
return false;
}
//---------------------------------------------------------------------------------------------
function EditorInspectorBase::isFileTypeField( %field )
{
return %field.isMemberOfClass( "GuiInspectorTypeFileName" );
}
//---------------------------------------------------------------------------------------------
function EditorInspectorBase::getFullFilePath( %field )
{
%fileName = %field.getData();
%inspector = %field.getInspector();
%object = %inspector.getInspectObject();
if( %object.isMemberOfClass( "Material" ) )
{
// Image filenames in materials are relative to the material's file.
%objectPath = filePath( makeFullPath( %object.getFilename(), getMainDotCsDir() ) );
return makeFullPath( %fileName, %objectPath );
}
else
return makeFullPath( %fileName, getMainDotCsDir() );
}

View file

@ -0,0 +1,59 @@
//-----------------------------------------------------------------------------
// Copyright (c) 2012 GarageGames, LLC
//
// 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.
//-----------------------------------------------------------------------------
function Editor::validateObjectName( %name, %mustHaveName )
{
if( %mustHaveName && %name $= "" )
{
MessageBoxOK( "Missing Object Name", "No name given for object. Please enter a valid object name." );
return false;
}
if( !isValidObjectName( %name ) )
{
MessageBoxOK( "Invalid Object Name", "'" @ %name @ "' is not a valid object name." NL
"" NL
"Please choose a name that begins with a letter or underscore and is otherwise comprised " @
"exclusively of letters, digits, and/or underscores."
);
return false;
}
if( isObject( %name ) )
{
%filename = %name.getFilename();
if ( %filename $= "" )
%filename = "an unknown file";
MessageBoxOK( "Invalid Object Name", "Object names must be unique, and there is an " @
"existing " @ %name.getClassName() @ " object with the name '" @ %name @ "' (defined " @
"in " @ %filename @ "). Please choose another name." );
return false;
}
if( isClass( %name ) )
{
MessageBoxOK( "Invalid Object Name", "'" @ %name @ "' is the name of an existing TorqueScript " @
"class. Please choose another name." );
return false;
}
return true;
}

View file

@ -0,0 +1,99 @@
//-----------------------------------------------------------------------------
// Copyright (c) 2012 GarageGames, LLC
//
// 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.
//-----------------------------------------------------------------------------
// Common functionality for GuiSwatchButtonCtrls.
//
// Note that for the mouse-event related functionality, "useMouseEvents" must be set
// to true.
//---------------------------------------------------------------------------------------------
function GuiSwatchButtonCtrl::onMouseDragged( %this )
{
%payload = new GuiSwatchButtonCtrl();
%payload.assignFieldsFrom( %this );
%payload.position = "0 0 ";
%payload.dragSourceControl = %this;
%xOffset = getWord( %payload.extent, 0 ) / 2;
%yOffset = getWord( %payload.extent, 1 ) / 2;
%cursorpos = Canvas.getCursorPos();
%xPos = getWord( %cursorpos, 0 ) - %xOffset;
%yPos = getWord( %cursorpos, 1 ) - %yOffset;
// Create the drag control.
%ctrl = new GuiDragAndDropControl()
{
canSaveDynamicFields = "0";
Profile = "GuiSolidDefaultProfile";
HorizSizing = "right";
VertSizing = "bottom";
Position = %xPos SPC %yPos;
extent = %payload.extent;
MinExtent = "4 4";
canSave = "1";
Visible = "1";
hovertime = "1000";
deleteOnMouseUp = true;
class = "GuiDragAndDropControlType_ColorSwatch";
};
%ctrl.add( %payload );
// Start drag.
Canvas.getContent().add( %ctrl );
%ctrl.startDragging( %xOffset, %yOffset );
}
//---------------------------------------------------------------------------------------------
function GuiSwatchButtonCtrl::onControlDropped( %this, %payload, %position )
{
if( !%payload.parentGroup.isInNamespaceHierarchy( "GuiDragAndDropControlType_ColorSwatch" ) )
return;
// If dropped on same button whence we came from,
// do nothing.
if( %payload.dragSourceControl == %this )
return;
// If a swatch button control is dropped onto this control,
// copy it's color.
if( %payload.isMemberOfClass( "GuiSwatchButtonCtrl" ) )
{
// If the swatch button is part of a color-type inspector field,
// remember the inspector field so we can later set the color
// through it.
if( %this.parentGroup.isMemberOfClass( "GuiInspectorTypeColorI" ) )
%this.parentGroup.apply( ColorFloatToInt( %payload.color ) );
else if( %this.parentGroup.isMemberOfClass( "GuiInspectorTypeColorF" ) )
%this.parentGroup.apply( %payload.color );
else
%this.setColor( %payload.color );
}
}

View file

@ -0,0 +1,74 @@
//-----------------------------------------------------------------------------
// Copyright (c) 2012 GarageGames, LLC
//
// 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.
//-----------------------------------------------------------------------------
// Common functions for filter text and clear button controls on tree views.
// The GuiTextEditCtrl having the filter text must have "treeView" dynamic field
// that has the ID of the associated GuiTreeViewCtrl.
// The button ctrl used to clear the text field must have a "textCtrl" dynamic field
// that has the ID of the associated filter GuiTextEditCtrl.
//---------------------------------------------------------------------------------------------
function GuiTreeViewFilterText::onWake( %this )
{
%filter = %this.treeView.getFilterText();
if( %filter $= "" )
%this.setText( "\c2Filter..." );
else
%this.setText( %filter );
}
//---------------------------------------------------------------------------------------------
function GuiTreeViewFilterText::onGainFirstResponder( %this )
{
%this.selectAllText();
}
//---------------------------------------------------------------------------------------------
// When Enter is pressed in the filter text control, pass along the text of the control
// as the treeview's filter.
function GuiTreeViewFilterText::onReturn( %this )
{
%text = %this.getText();
if( %text $= "" )
%this.reset();
else
%this.treeView.setFilterText( %text );
}
//---------------------------------------------------------------------------------------------
function GuiTreeViewFilterText::reset( %this )
{
%this.setText( "\c2Filter..." );
%this.treeView.clearFilterText();
}
//---------------------------------------------------------------------------------------------
function GuiTreeViewFilterClearButton::onClick( %this )
{
%this.textCtrl.reset();
}

View file

@ -0,0 +1,93 @@
//-----------------------------------------------------------------------------
// Copyright (c) 2012 GarageGames, LLC
//
// 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.
//-----------------------------------------------------------------------------
// Undo actions that are useful in multiple editors.
//=============================================================================================
// Undo reparenting.
//=============================================================================================
//---------------------------------------------------------------------------------------------
function UndoActionReparentObjects::create( %treeView )
{
pushInstantGroup();
%action = new UndoScriptAction()
{
class = "UndoActionReparentObjects";
numObjects = 0;
treeView = %treeView;
};
popInstantGroup();
return %action;
}
//---------------------------------------------------------------------------------------------
function UndoActionReparentObjects::add( %this, %object, %oldParent, %newParent )
{
%index = %this.numObjects;
%this.objects[ %index ] = %object;
%this.oldParents[ %index ] = %oldParent;
%this.newParents[ %index ] = %newParent;
%this.numObjects = %this.numObjects + 1;
}
//---------------------------------------------------------------------------------------------
function UndoActionReparentObjects::undo( %this )
{
%numObjects = %this.numObjects;
for( %i = 0; %i < %numObjects; %i ++ )
{
%obj = %this.objects[ %i ];
%group = %this.oldParents[ %i ];
if( isObject( %obj ) && isObject( %group ) )
%obj.parentGroup = %group;
}
if( isObject( %this.treeView ) )
%this.treeView.update();
}
//---------------------------------------------------------------------------------------------
function UndoActionReparentObjects::redo( %this )
{
%numObjects = %this.numObjects;
for( %i = 0; %i < %numObjects; %i ++ )
{
%obj = %this.objects[ %i ];
%group = %this.newParents[ %i ];
if( isObject( %obj ) && isObject( %group ) )
%obj.parentGroup = %group;
}
if( isObject( %this.treeView ) )
%this.treeView.update();
}