Parcourir la source

Ongoing wipwork of the BaseUI update. Some bugfixes pending

Areloch il y a 1 an
Parent
commit
ce4c8dabc9
53 fichiers modifiés avec 2021 ajouts et 3880 suppressions
  1. 5 0
      Engine/source/gui/buttons/guiButtonBaseCtrl.cpp
  2. 12 2
      Engine/source/gui/buttons/guiButtonBaseCtrl.h
  3. 5 2
      Engine/source/gui/buttons/guiIconButtonCtrl.cpp
  4. 6 1
      Engine/source/gui/core/guiControl.cpp
  5. 2 0
      Engine/source/gui/core/guiControl.h
  6. 3 1
      Engine/source/sim/actionMap.cpp
  7. 15 9
      Templates/BaseGame/game/core/gui/scripts/profiles.tscript
  8. 63 0
      Templates/BaseGame/game/core/rendering/scripts/graphicsOptions.tscript
  9. 14 21
      Templates/BaseGame/game/data/UI/UI.tscript
  10. 0 5
      Templates/BaseGame/game/data/UI/guis/ChooseLevelDlg.asset.taml
  11. 5 0
      Templates/BaseGame/game/data/UI/guis/ChooseLevelMenu.asset.taml
  12. 97 0
      Templates/BaseGame/game/data/UI/guis/ChooseLevelMenu.gui
  13. 211 0
      Templates/BaseGame/game/data/UI/guis/ChooseLevelMenu.tscript
  14. 5 0
      Templates/BaseGame/game/data/UI/guis/GameMenu.asset.taml
  15. 97 0
      Templates/BaseGame/game/data/UI/guis/GameMenu.gui
  16. 186 0
      Templates/BaseGame/game/data/UI/guis/GameMenu.tscript
  17. 0 5
      Templates/BaseGame/game/data/UI/guis/GuiMusicPlayer.asset.taml
  18. 0 4
      Templates/BaseGame/game/data/UI/guis/IODropdownDlg.asset.taml
  19. 0 159
      Templates/BaseGame/game/data/UI/guis/IODropdownDlg.ed.gui
  20. 0 5
      Templates/BaseGame/game/data/UI/guis/MainMenuButtons.asset.taml
  21. 0 84
      Templates/BaseGame/game/data/UI/guis/MainMenuButtons.gui
  22. 0 107
      Templates/BaseGame/game/data/UI/guis/MainMenuButtons.tscript
  23. 0 5
      Templates/BaseGame/game/data/UI/guis/PauseMenu.asset.taml
  24. 0 230
      Templates/BaseGame/game/data/UI/guis/RecordingsDlg.gui
  25. 5 0
      Templates/BaseGame/game/data/UI/guis/SystemMenu.asset.taml
  26. 53 0
      Templates/BaseGame/game/data/UI/guis/SystemMenu.gui
  27. 37 0
      Templates/BaseGame/game/data/UI/guis/SystemMenu.tscript
  28. 0 106
      Templates/BaseGame/game/data/UI/guis/chooseLevelDlg.gui
  29. 0 210
      Templates/BaseGame/game/data/UI/guis/chooseLevelDlg.tscript
  30. 0 192
      Templates/BaseGame/game/data/UI/guis/guiMusicPlayer.gui
  31. 0 236
      Templates/BaseGame/game/data/UI/guis/guiMusicPlayer.tscript
  32. 126 124
      Templates/BaseGame/game/data/UI/guis/joinServerMenu.gui
  33. 126 20
      Templates/BaseGame/game/data/UI/guis/joinServerMenu.tscript
  34. 9 11
      Templates/BaseGame/game/data/UI/guis/mainMenu.gui
  35. 55 43
      Templates/BaseGame/game/data/UI/guis/mainMenu.tscript
  36. 32 304
      Templates/BaseGame/game/data/UI/guis/messageBoxDlg.gui
  37. 218 0
      Templates/BaseGame/game/data/UI/guis/messageBoxDlg.tscript
  38. 305 86
      Templates/BaseGame/game/data/UI/guis/optionsMenu.gui
  39. 194 27
      Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript
  40. 0 163
      Templates/BaseGame/game/data/UI/guis/pauseMenu.gui
  41. 0 93
      Templates/BaseGame/game/data/UI/guis/pauseMenu.tscript
  42. 0 4
      Templates/BaseGame/game/data/UI/guis/recordingsDlg.asset.taml
  43. BIN
      Templates/BaseGame/game/data/UI/images/backdrop.png
  44. 3 0
      Templates/BaseGame/game/data/UI/images/backdrop_image.asset.taml
  45. 3 0
      Templates/BaseGame/game/data/UI/images/textEditFrame_image.asset.taml
  46. 0 50
      Templates/BaseGame/game/data/UI/scripts/guiTreeViewCtrl.tscript
  47. 0 90
      Templates/BaseGame/game/data/UI/scripts/help.tscript
  48. 0 729
      Templates/BaseGame/game/data/UI/scripts/menuInputHandling.tscript
  49. 0 308
      Templates/BaseGame/game/data/UI/scripts/menuNavigation.tscript
  50. 0 341
      Templates/BaseGame/game/data/UI/scripts/messageBoxes.tscript
  51. 105 96
      Templates/BaseGame/game/data/UI/scripts/profiles.tscript
  52. 22 0
      Templates/BaseGame/game/data/UI/scripts/utility.tscript
  53. 2 7
      Templates/BaseGame/game/tools/settings.xml

+ 5 - 0
Engine/source/gui/buttons/guiButtonBaseCtrl.cpp

@@ -83,6 +83,8 @@ IMPLEMENT_CALLBACK( GuiButtonBaseCtrl, onMouseDragged, void, (), (),
    "pressed the left mouse button on the control and then moves the mouse over a certain distance threshold with "
    "the mouse button still pressed." );
 
+IMPLEMENT_CALLBACK(GuiButtonBaseCtrl, onHighlighted, void, (bool highlighted), (highlighted),
+   "Called when the status of the button being highlighted changes.");
 
 ImplementEnumType( GuiButtonType,
    "Type of button control.\n\n"
@@ -290,6 +292,7 @@ void GuiButtonBaseCtrl::onMouseEnter(const GuiEvent &event)
    {
       mDepressed = true;
       mHighlighted = true;
+      onHighlighted_callback(true);
    }
    else
    {
@@ -297,6 +300,7 @@ void GuiButtonBaseCtrl::onMouseEnter(const GuiEvent &event)
          SFX->playOnce(mProfile->getSoundButtonOverProfile());
 
       mHighlighted = true;
+      onHighlighted_callback(true);
    }
 }
 
@@ -311,6 +315,7 @@ void GuiButtonBaseCtrl::onMouseLeave(const GuiEvent &)
    if( isMouseLocked() )
       mDepressed = false;
    mHighlighted = false;
+   onHighlighted_callback(false);
 }
 
 //-----------------------------------------------------------------------------

+ 12 - 2
Engine/source/gui/buttons/guiButtonBaseCtrl.h

@@ -73,6 +73,7 @@ class GuiButtonBaseCtrl : public GuiControl
 	   DECLARE_CALLBACK( void, onMouseEnter, () );   
 	   DECLARE_CALLBACK( void, onMouseLeave, () );      
 	   DECLARE_CALLBACK( void, onMouseDragged, () );   
+      DECLARE_CALLBACK( void, onHighlighted, (bool));
 
       /// @}
 
@@ -95,9 +96,18 @@ class GuiButtonBaseCtrl : public GuiControl
       bool getStateOn() const { return mStateOn; }
 
       void setDepressed( bool depressed ) { mDepressed = depressed; }
-      void resetState() {mDepressed = false; mHighlighted = false;}
+      void resetState()
+      {
+         mDepressed = false;
+         mHighlighted = false;
+         onHighlighted_callback(false);
+      }
 
-      void setHighlighted(bool highlighted) { mHighlighted = highlighted; }
+      void setHighlighted(bool highlighted)
+      {
+         mHighlighted = highlighted;
+         onHighlighted_callback(highlighted);
+      }
       bool isHighlighted() { return mHighlighted; }
 
       void acceleratorKeyPress(U32 index);

+ 5 - 2
Engine/source/gui/buttons/guiIconButtonCtrl.cpp

@@ -253,7 +253,7 @@ void GuiIconButtonCtrl::renderButton( Point2I &offset, const RectI& updateRect )
          if (mProfile->mBorder != 0)
             renderFilledBorder(boundsRect, borderColor, fillColor, mProfile->mBorderThickness);
          else
-            GFX->getDrawUtil()->drawRectFill(boundsRect, mProfile->mFillColor);
+            GFX->getDrawUtil()->drawRectFill(boundsRect, fillColor);
       }
    }
    else if(mHighlighted && mActive)
@@ -269,7 +269,7 @@ void GuiIconButtonCtrl::renderButton( Point2I &offset, const RectI& updateRect )
          if (mProfile->mBorder != 0)
             renderFilledBorder(boundsRect, borderColor, fillColor, mProfile->mBorderThickness);
          else
-            GFX->getDrawUtil()->drawRectFill(boundsRect, mProfile->mFillColor);
+            GFX->getDrawUtil()->drawRectFill(boundsRect, fillColor);
       }
    }
    else
@@ -388,6 +388,7 @@ void GuiIconButtonCtrl::renderButton( Point2I &offset, const RectI& updateRect )
             start.x = iconRect.extent.x + mButtonMargin.x + mTextMargin;
          }
 
+         drawer->setBitmapModulation(fontColor);
          drawer->drawText( mProfile->mFont, start + offset, text, mProfile->mFontColors );
       }
 
@@ -395,6 +396,7 @@ void GuiIconButtonCtrl::renderButton( Point2I &offset, const RectI& updateRect )
       {
          Point2I start( mTextMargin, ( getHeight() - mProfile->mFont->getHeight() ) / 2 );
 
+         drawer->setBitmapModulation(fontColor);
          drawer->drawText( mProfile->mFont, start + offset, text, mProfile->mFontColors );
       }
 
@@ -408,6 +410,7 @@ void GuiIconButtonCtrl::renderButton( Point2I &offset, const RectI& updateRect )
          }
          else
             start.set( ( getWidth() - textWidth ) / 2, ( getHeight() - mProfile->mFont->getHeight() ) / 2 );
+
          drawer->setBitmapModulation( fontColor );
          drawer->drawText( mProfile->mFont, start + offset, text, mProfile->mFontColors );
       }

+ 6 - 1
Engine/source/gui/core/guiControl.cpp

@@ -218,7 +218,8 @@ GuiControl::GuiControl() : mAddGroup( NULL ),
                            mLangTable(NULL),
                            mFirstResponder(NULL),
                            mHorizSizing(horizResizeRight),
-                           mVertSizing(vertResizeBottom)
+                           mVertSizing(vertResizeBottom),
+                           mCategory(StringTable->EmptyString())
 {
    mConsoleVariable     = StringTable->EmptyString();
    mAcceleratorKey      = StringTable->EmptyString();
@@ -294,6 +295,10 @@ void GuiControl::initPersistFields()
       addField("accelerator",       TypeString,       Offset(mAcceleratorKey, GuiControl),
          "Key combination that triggers the control's primary action when the control is on the canvas." );
 
+      addField("category", TypeString, Offset(mCategory, GuiControl),
+         "Name of the category this gui control should be grouped into for organizational purposes. Primarily for tooling.");
+      
+
    endGroup( "Control" );	
    
    addGroup( "ToolTip" );

+ 2 - 0
Engine/source/gui/core/guiControl.h

@@ -218,6 +218,8 @@ class GuiControl : public SimGroup
       String mAltConsoleCommand;
       
       String mTooltip;
+
+      StringTableEntry mCategory;
       
       /// @}
       

+ 3 - 1
Engine/source/sim/actionMap.cpp

@@ -729,7 +729,8 @@ bool ActionMap::nextBoundNode( const char* function, U32 &devMapIndex, U32 &node
       for ( U32 j = nodeIndex; j < dvcMap->nodeMap.size(); j++ )
       {
          const Node* node = &dvcMap->nodeMap[j];
-         if ( !( node->flags & Node::BindCmd ) && ( dStricmp( function, node->consoleFunction ) == 0 ) )
+         if ( ( (node->flags & Node::BindCmd) && (dStricmp(function, node->makeConsoleCommand) == 0 || dStricmp(function, node->breakConsoleCommand) == 0) )
+            || (!(node->flags & Node::BindCmd) && dStricmp( function, node->consoleFunction ) == 0 ) )
          {
             devMapIndex = i;
             nodeIndex = j;
@@ -1805,6 +1806,7 @@ bool ActionMap::handleEvent(const InputEventInfo* pEvent)
    for (SimSet::iterator itr = pActionMapSet->end() - 1;
         itr > pActionMapSet->begin(); itr--) {
       ActionMap* pMap = static_cast<ActionMap*>(*itr);
+
       if (pMap->processAction(pEvent) == true)
          return true;
    }

+ 15 - 9
Templates/BaseGame/game/core/gui/scripts/profiles.tscript

@@ -147,25 +147,31 @@ new GuiControlProfile(GuiTextEditProfile)
    category = "Core";
 };
 
-if(!isObject(GuiMenuScrollProfile))
-new GuiControlProfile(GuiMenuScrollProfile)
+if(!isObject(GuiScrollProfile))
+new GuiControlProfile(GuiScrollProfile)
 {
-   opaque = true;
-   fontColor = $TextMediumEmphasisColor;
-   fontColorHL = $TextMediumEmphasisColor;
-   fontColorNA = $TextDisabledColor;
-   fontColorSEL = $TextMediumEmphasisColor;
-   fillColor = "40 40 40";
+   opaque = "0";
+   fontColor = "200 200 200 255";
+   fontColorHL = "200 200 200 255";
+   fontColorNA = "108 108 108 255";
+   fontColorSEL = "200 200 200 255";
+   fillColor = "0 0 0 0";
    fillColorHL = "56 56 56";
    fillColorNA = "40 40 40";
    borderColor = "87 87 87";
    borderColorNA = "0 0 0";
    borderColorHL = "255 255 255";
-   border = true;
+   border = "0";
    bitmapAsset = "Core_GUI:scrollBar_image";
    hasBitmapArray = true;
    category = "Core";
    fontSize = 15;
+   fontColors[0] = "200 200 200 255";
+   fontColors[1] = "200 200 200 255";
+   fontColors[2] = "108 108 108 255";
+   fontColors[3] = "200 200 200 255";
+   fontColors[8] = "Fuchsia";
+   fontColors[9] = "255 0 255 255";
 };
 
 if(!isObject(GuiOverlayProfile))

+ 63 - 0
Templates/BaseGame/game/core/rendering/scripts/graphicsOptions.tscript

@@ -74,6 +74,21 @@ new SimGroup(VideoSettingsGroup)
          OptionName = "Graphical Quality";
          Description = "Controls the general graphical quality";
          
+         new ArrayObject()
+         {
+            class = "OptionsQualityLevel";
+            caseSensitive = true;
+            
+            displayName = "Medium";
+            
+            key["$pref::TS::detailAdjust"] = 1.0;
+            key["$pref::TS::skipRenderDLs"] = 0;  
+            key["$pref::useStaticObjectFade"] = true;
+            key["$pref::staticObjectFadeStart"] = 75;    
+            key["$pref::staticObjectFadeEnd"] = 100;  
+            key["$pref::staticObjectUnfadeableSize"] = 75;
+         };
+         
          new ArrayObject()
          {
             class = "OptionsQualityLevel";
@@ -89,6 +104,54 @@ new SimGroup(VideoSettingsGroup)
             key["$pref::staticObjectUnfadeableSize"] = 75;     
          }; 
       };
+      
+      new SimGroup()
+      { 
+         class = "OptionsSettings";
+         
+         OptionName = "Lighting Quality";
+         Description = "Controls the lighting and shadows quality";
+         
+         new ArrayObject()
+         {
+            class = "OptionsQualityLevel";
+            caseSensitive = true;
+            
+            displayName = "High";
+
+            key["$pref::lightManager"] = "Advanced Lighting";
+            key["$pref::Shadows::disable"] = false;
+            key["$pref::Shadows::textureScalar"] = 1.0;
+            key["$pref::PSSM::detailAdjustScale"] = 1.0;
+            key["$pref::allowLocalLightShadows"] = true;     
+         }; 
+      };
+   };
+   
+   new SimGroup(AdvancedVideoSettingsGroup)
+   {
+      class = "SubOptionsGroup";
+      displayName = "Advanced";
+     
+      new SimGroup()
+      { 
+         class = "OptionsSettings"; 
+         
+         OptionName = "Mesh Detail";
+         Description = "Controls the max quality of mesh objects";
+         
+         new ArrayObject()
+         {
+            class = "OptionsQualityLevel";
+            caseSensitive = true;
+            
+            displayName = "High";
+
+            key["$pref::TS::detailAdjust"] = 1.5;
+            key["$pref::TS::skipRenderDLs"] = 0;      
+         };
+         
+      };
    };
    
    /*new SimGroup(AdvancedVideoSettingsGroup)

+ 14 - 21
Templates/BaseGame/game/data/UI/UI.tscript

@@ -39,21 +39,12 @@ function UI::initClient(%this)
    //Load UI stuff
    //Profiles
    %this.queueExec("./scripts/profiles");
-   
-   //Navigation Utility Scripts
-   //%this.queueExec("./scripts/menuNavigation");
-   
-   //Now gui files
-   %this.queueExec("./scripts/menuInputHandling");
-   
+
    %this.queueExec("./guis/mainMenu");
    %this.queueExec("./guis/mainMenu.gui");
    
-   //%this.queueExec("./guis/mainMenuButtons");
-   //%this.queueExec("./guis/mainMenuButtons.gui");
-   
-   %this.queueExec("./guis/chooseLevelDlg");
-   %this.queueExec("./guis/chooseLevelDlg.gui");
+   %this.queueExec("./guis/ChooseLevelMenu");
+   %this.queueExec("./guis/ChooseLevelMenu.gui");
    
    %this.queueExec("./guis/joinServerMenu");
    %this.queueExec("./guis/joinServerMenu.gui");
@@ -63,8 +54,8 @@ function UI::initClient(%this)
    %this.queueExec("./guis/optionsMenu");
    %this.queueExec("./guis/optionsMenu.gui");
    
-   %this.queueExec("./guis/pauseMenu");
-   %this.queueExec("./guis/pauseMenu.gui");
+   %this.queueExec("./guis/GameMenu");
+   %this.queueExec("./guis/GameMenu.gui");
    
    %this.queueExec("./guis/remapDlg.gui");
    %this.queueExec("./guis/remapConfirmDlg.gui");
@@ -73,21 +64,18 @@ function UI::initClient(%this)
    %this.queueExec("./guis/profiler.gui");
    
    %this.queueExec("./guis/netGraphGui.gui");
-   %this.queueExec("./guis/RecordingsDlg.gui");
-   
-   %this.queueExec("./guis/guiMusicPlayer");
-   %this.queueExec("./guis/guiMusicPlayer.gui");
    
    %this.queueExec("./guis/startupGui");
    %this.queueExec("./guis/startupGui.gui");
    
-   // Load Editor Dialogs
+   %this.queueExec("./guis/messageBoxDlg");
    %this.queueExec("./guis/messageBoxDlg.gui");
    
+   %this.queueExec("./guis/SystemMenu");
+   %this.queueExec("./guis/SystemMenu.gui");
+   
    //Load scripts
    %this.queueExec("./scripts/controlsMenu");
-   %this.queueExec("./scripts/messageBoxes");
-   %this.queueExec("./scripts/help");
    %this.queueExec("./scripts/cursors");
    
    if(isToolBuild())
@@ -97,3 +85,8 @@ function UI::initClient(%this)
 function UI::onCreateClientConnection(%this){}
 
 function UI::onDestroyClientConnection(%this){}
+
+function UI::registerGameMenus(%this, %menusArrayObj)
+{
+   %menusArrayObj.add("System", SystemMenu);
+}

+ 0 - 5
Templates/BaseGame/game/data/UI/guis/ChooseLevelDlg.asset.taml

@@ -1,5 +0,0 @@
-<GUIAsset
-    AssetName="ChooseLevelDlg"
-    scriptFile="@assetFile=chooseLevelDlg"
-    GUIFile="@assetFile=chooseLevelDlg.gui"
-    VersionId="1"/>

+ 5 - 0
Templates/BaseGame/game/data/UI/guis/ChooseLevelMenu.asset.taml

@@ -0,0 +1,5 @@
+<GUIAsset
+    AssetName="ChooseLevelMenu"
+    scriptFile="@assetFile=ChooseLevelMenu"
+    GUIFile="@assetFile=ChooseLevelMenu.gui"
+    VersionId="1"/>

+ 97 - 0
Templates/BaseGame/game/data/UI/guis/ChooseLevelMenu.gui

@@ -0,0 +1,97 @@
+//--- OBJECT WRITE BEGIN ---
+$guiContent = new GuiChunkedBitmapCtrl(ChooseLevelMenu) {
+   BitmapAsset = "UI:backgrounddark_image";
+   extent = "1280 720";
+   minExtent = "8 8";
+   horizSizing = "width";
+   vertSizing = "height";
+   profile = "GuiNonModalDefaultProfile";
+   category = "BaseUI";
+   tooltipProfile = "GuiToolTipProfile";
+   isContainer = "1";
+   canSaveDynamicFields = "1";
+      launchInEditor = "0";
+      
+   new GuiInputCtrl(ChooseLevelInputHandler) {
+      ignoreMouseEvents = "1";
+      ActionMap = "ChooseLevelActionMap";
+      position = "-50 0";
+      extent = "2186 851";
+      horizSizing = "width";
+      vertSizing = "height";
+      profile = "GuiInputCtrlProfile";
+      tooltipProfile = "GuiToolTipProfile";
+   };
+
+   new GuiPanel(ChooseLevelTitlePanel) {
+      extent = "1281 80";
+      horizSizing = "width";
+      profile = "GuiMenuPanelProfile";
+      tooltipProfile = "GuiToolTipProfile";
+
+      new GuiTextCtrl(ChooseLevelTitleText) {
+         text = "SINGLE PLAYER";
+         position = "22 23";
+         extent = "220 28";
+         profile = "MenuHeaderText";
+         tooltipProfile = "GuiToolTipProfile";
+      };
+   };
+   new GuiPanel(ChooseLevelButtonPanel) {
+      position = "0 683";
+      extent = "1281 40";
+      horizSizing = "width";
+      vertSizing = "top";
+      profile = "GuiMenuPanelProfile";
+      tooltipProfile = "GuiToolTipProfile";
+
+      new GuiIconButtonCtrl(ChooseLevelStartBtn) {
+         BitmapAsset = "UI:Keyboard_Black_Return_image";
+         sizeIconToButton = "1";
+         makeIconSquare = "1";
+         textLocation = "Center";
+         text = "Start";
+         position = "1115 0";
+         extent = "140 40";
+         horizSizing = "left";
+         vertSizing = "center";
+         profile = "GuiMenuButtonProfile";
+         command = "OptionsMenu.applySettings();";
+         tooltipProfile = "GuiToolTipProfile";
+      };
+      new GuiIconButtonCtrl(ChooseLevelBackBtn) {
+         BitmapAsset = "UI:Keyboard_Black_Escape_image";
+         sizeIconToButton = "1";
+         makeIconSquare = "1";
+         textLocation = "Center";
+         text = "Back";
+         position = "16 0";
+         extent = "140 40";
+         vertSizing = "center";
+         profile = "GuiMenuButtonProfile";
+         command = "Canvas.popDialog();";
+         tooltipProfile = "GuiToolTipProfile";
+      };
+   };
+   new GuiScrollCtrl(LevelPreviewScroll) {
+      hScrollBar = "dynamic";
+      vScrollBar = "alwaysOff";
+      position = "0 118";
+      extent = "1283 500";
+      horizSizing = "width";
+      vertSizing = "center";
+      profile = "GuiMenuScrollProfile";
+      tooltipProfile = "GuiToolTipProfile";
+
+      new GuiStackControl(LevelPreviewArray) {
+         position = "1 1";
+         extent = "1280 480";
+         vertSizing = "center";
+         profile = "GuiMenuDefaultProfile";
+         tooltipProfile = "GuiToolTipProfile";
+         padding = "5";
+         stackingType = "Horizontal";
+      };
+   };
+};
+//--- OBJECT WRITE END ---

+ 211 - 0
Templates/BaseGame/game/data/UI/guis/ChooseLevelMenu.tscript

@@ -0,0 +1,211 @@
+//-----------------------------------------------------------------------------
+// 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 ChooseLevelMenu::onAdd( %this )
+{
+   if(!isObject(ChooseLevelAssetQuery))
+      new AssetQuery(ChooseLevelAssetQuery);
+}
+
+function ChooseLevelMenu::onWake(%this)
+{
+   LevelPreviewArray.clear();
+   
+   ChooseLevelAssetQuery.clear();
+   AssetDatabase.findAssetType(ChooseLevelAssetQuery, "LevelAsset");
+      
+   %count = ChooseLevelAssetQuery.getCount();
+   
+   if(%count == 0 && !IsDirectory("tools"))
+   {
+      //We have no levels found. Prompt the user to open the editor to the default level if the tools are present
+      MessageBoxOK("Error", "No levels were found in any modules. Please ensure you have modules loaded that contain gameplay code and level files.", 
+         "Canvas.popDialog(ChooseLevelMenu); if(isObject(ChooseLevelMenu.returnGui) && ChooseLevelMenu.returnGui.isMethod(\"onReturnTo\")) ChooseLevelMenu.returnGui.onReturnTo();");
+         
+      ChooseLevelAssetQuery.delete();
+      return;
+   }
+   
+   for(%i=0; %i < %count; %i++)
+	{
+	   %assetId = ChooseLevelAssetQuery.getAsset(%i);
+	   
+	   if(AssetDatabase.getAssetModule(%assetId).ModuleId $= "ToolsModule")
+	      continue;
+      
+      %levelAsset = AssetDatabase.acquireAsset(%assetId);
+      
+      %file = %levelAsset.getLevelPath();
+      
+      if ( !isFile(%file) )
+         continue;
+         
+      %levelPreviewImg = %levelAsset.getPreviewImagePath();
+   
+      if (!isFile(%levelPreviewImg))
+         %levelPreviewImg = "UI:no_preview_image";
+         
+      %preview = new GuiContainer() { 
+         extent = "480 480";
+         levelAssetId = %assetId;
+         
+         new GuiButtonCtrl() {
+            position = "0 0";
+            extent = "480 480";
+            buttonType = "ToggleButton";
+            profile = LevelPreviewButtonProfile;
+            horizSizing = "width";
+            vertSizing = "height";
+            internalName = "button";
+            class = "LevelPreviewButton";
+            command = "$selectedLevelAsset = " @ %assetId @ ";";
+            altCommand = "ChooseLevelBegin(1);"; //allow doubleclick to quick action it
+         };
+         
+         new GuiBitmapCtrl() {
+            position = "20 0";
+            extent =  "440 440";
+            BitmapAsset = %levelPreviewImg; 
+            horizSizing = "width";
+            vertSizing = "bottom";
+            profile = GuiNonModalDefaultProfile;
+         };
+         
+         new GuiTextCtrl() { 
+            position = "20 445";
+            extent = "440 15";
+            text = %levelAsset.levelName;
+            profile = MenuSubHeaderText;
+            internalName = "levelNameTxt";
+         };
+            
+         new GuiMLTextCtrl() { 
+            position = "20 465";
+            extent = "440 15";
+            text = %levelAsset.levelDescription;
+            profile = GuiMLTextProfile;
+            internalName = "levelDescTxt";
+         };
+      };
+      
+      LevelPreviewArray.add(%preview);
+   }
+   
+   // Also add the new level mission as defined in the world editor settings
+   // if we are choosing a level to launch in the editor.
+   if ( %this.launchInEditor )
+   {
+      %this.addMissionFile( "tools/levels/DefaultEditorLevel.mis" );
+   }
+   
+   //LevelList.setSelected(0);
+   
+   if(!$pref::HostMultiPlayer)
+      ChooseLevelTitleText.setText("SINGLE PLAYER");
+   else
+      ChooseLevelTitleText.setText("CREATE SERVER");
+      
+   $MenuList = LevelPreviewArray;
+   $MenuList.listPosition = 0;
+   $MenuList.syncGui();
+}
+
+if(!isObject( ChooseLevelActionMap ) )
+{
+   new ActionMap(ChooseLevelActionMap){}; 
+   
+   //Null the up/down nav so we can swap in left/right nav
+   ChooseLevelActionMap.bindCmd( keyboard, w, "" );
+   ChooseLevelActionMap.bindCmd( keyboard, s, "" );
+   ChooseLevelActionMap.bindCmd( gamepad, yaxis, "" );
+   ChooseLevelActionMap.bindCmd( gamepad, upov, "" );
+   ChooseLevelActionMap.bindCmd( gamepad, dpov, "" );
+   
+   ChooseLevelActionMap.bind( keyboard, a, BaseUINavigatePrev );
+   ChooseLevelActionMap.bind( keyboard, d, BaseUINavigateNext );
+   ChooseLevelActionMap.bind( gamepad, xaxis, "D", "-0.23 0.23", BaseUIStickNavigate );
+   ChooseLevelActionMap.bind( gamepad, lpov, BaseUINavigatePrev );
+   ChooseLevelActionMap.bind( gamepad, rpov, BaseUINavigateNext );
+   
+   ChooseLevelActionMap.bind( keyboard, Enter, ChooseLevelBegin );
+   ChooseLevelActionMap.bind( gamepad, btn_a, ChooseLevelBegin );
+}
+
+function LevelPreviewArray::syncGUI(%this)
+{
+   %this.callOnChildren("setHighlighted", false);
+   
+   %btn = %this.getObject(%this.listPosition);
+   %btn-->button.setHighlighted(true);
+   
+   $selectedLevelAsset = %btn.levelAssetId;
+}
+
+function ChooseLevelBegin(%val)
+{
+   if(%val)
+   {
+      // So we can't fire the button when loading is in progress.
+      if ( isObject( ServerGroup ) )
+         return;
+         
+      Canvas.popDialog();
+      
+      %entry = LevelPreviewArray.getObject(LevelPreviewArray.listPosition);
+      
+      if(!AssetDatabase.isDeclaredAsset(%entry.levelAssetId))
+      {
+         MessageBoxOK("Error", "Selected level preview does not have a valid level asset!");
+         return;  
+      }
+
+      // Launch the chosen level with the editor open?
+      if ( ChooseLevelMenu.launchInEditor )
+      {
+         activatePackage( "BootEditor" );
+         ChooseLevelMenu.launchInEditor = false; 
+         StartGame(%entry.levelAssetId, "SinglePlayer");
+      }
+      else
+      {
+         StartGame(%entry.levelAssetId); 
+      }
+   }
+}
+
+function ChooseLevelMenu::onSleep( %this )
+{
+   // This is set from the outside, only stays true for a single wake/sleep
+   // cycle.
+   %this.launchInEditor = false;
+}
+
+function LevelPreviewButton::onHighlighted(%this, %highlighted)
+{
+   %container = %this.getParent();
+   
+   %container-->levelNameTxt.profile = %highlighted ? MenuSubHeaderTextHighlighted : MenuSubHeaderText;
+   %container-->levelDescTxt.profile = %highlighted ? GuiMLTextProfileHighlighted : GuiMLTextProfile;
+   
+   LevelPreviewScroll.scrollToObject(%this);
+}

+ 5 - 0
Templates/BaseGame/game/data/UI/guis/GameMenu.asset.taml

@@ -0,0 +1,5 @@
+<GUIAsset
+    AssetName="GameMenu"
+    scriptFile="@assetFile=GameMenu"
+    GUIFile="@assetFile=GameMenu.gui"
+    VersionId="1"/>

+ 97 - 0
Templates/BaseGame/game/data/UI/guis/GameMenu.gui

@@ -0,0 +1,97 @@
+//--- OBJECT WRITE BEGIN ---
+$guiContent = new GuiControl(GameMenu) {
+   extent = "1280 720";
+   profile = "GuiDefaultProfile";
+   tooltipProfile = "GuiToolTipProfile";
+   isContainer = "1";
+   superClass = "UINavigation";
+   canSaveDynamicFields = "1";
+      currentMenu = "SystemMenu";
+      gameMenusArray = "17288";
+      resizePages = "1";
+
+   new GuiInputCtrl(GameMenuInputHandler) {
+      ignoreMouseEvents = "1";
+      ActionMap = "GameMenuActionMap";
+      position = "-50 0";
+      extent = "50 50";
+      horizSizing = "width";
+      vertSizing = "height";
+      profile = "GuiInputCtrlProfile";
+      tooltipProfile = "GuiToolTipProfile";
+   };
+   new GuiChunkedBitmapCtrl(GameMenuBG) {
+      BitmapAsset = "UI:hudfill_image";
+      extent = "1280 720";
+      horizSizing = "width";
+      vertSizing = "height";
+      profile = "GuiDefaultProfile";
+      tooltipProfile = "GuiToolTipProfile";
+      isContainer = "1";
+      canSaveDynamicFields = "1";
+
+      new GuiPanel(GameMenuTitlePanel) {
+         extent = "1281 60";
+         horizSizing = "width";
+         profile = "GuiMenuPanelProfile";
+         tooltipProfile = "GuiToolTipProfile";
+         
+         new GuiStackControl(GameMenuButtonList){
+            position = "40 0";
+            extent = "1240 60";
+            profile = GuiDefaultProfile;
+            stackingType = "Horizontal";
+            padding = "10";
+            horizSizing = "center";
+            vertSizing = "center";
+         };
+         
+         new GuiControl(GameMenuNavButtonOverlay) {
+            extent = "1281 60";
+            horizSizing = "width";
+            vertSizing = "height";
+            profile = GuiNonModalDefaultProfile;
+            
+            new GuiBitmapCtrl(GameMenuPrevNavIcon) {
+               BitmapAsset = "UI:Keyboard_Black_Q_image";
+               position = "0 24";
+               extent = "40 40";
+               profile = GuiNonModalDefaultProfile;
+               vertSizing = "top";
+            };
+            
+            new GuiBitmapCtrl(GameMenuNextNavIcon) {
+               BitmapAsset = "UI:Keyboard_Black_E_image";
+               position = "0 24";
+               extent = "40 40";
+               profile = GuiNonModalDefaultProfile;
+               vertSizing = "top";
+            };
+         };
+      };
+   };
+   new GuiPanel(GameMenuButtonPanel) {
+      position = "0 683";
+      extent = "1281 40";
+      horizSizing = "width";
+      vertSizing = "top";
+      profile = "GuiMenuPanelProfile";
+      tooltipProfile = "GuiToolTipProfile";
+
+      new GuiIconButtonCtrl(GameMenuBackBtn) {
+         BitmapAsset = "UI:Keyboard_Black_Escape_image";
+         sizeIconToButton = "1";
+         makeIconSquare = "1";
+         textLocation = "Center";
+         text = "Back";
+         position = "16 0";
+         extent = "140 40";
+         vertSizing = "center";
+         profile = "GuiMenuButtonProfile";
+         command = "Canvas.popDialog(GameMenu);";
+         tooltipProfile = "GuiToolTipProfile";
+         class = "MenuInputButton";
+      };
+   };
+};
+//--- OBJECT WRITE END ---

+ 186 - 0
Templates/BaseGame/game/data/UI/guis/GameMenu.tscript

@@ -0,0 +1,186 @@
+function GameMenu::onAdd(%this)
+{
+   %this.gameMenusArray = new ArrayObject(){};
+}
+
+function GameMenu::onWake(%this)
+{
+   if($Server::ServerType $= "SinglePlayer")
+   {
+      $timescale = 0;
+      
+      sfxSetChannelVolume( $SimAudioType, $pref::SFX::channelVolume[ 0 ] );
+   }
+   
+   callOnModules("registerGameMenus", "", %this.gameMenusArray);
+   
+   //Remove duplicates as needed
+   %this.gameMenusArray.uniqueKey();
+   
+   GameMenuButtonList.clear();
+   
+   %stackWidth = 0;
+   //process the entries and give 'em buttons on the button array
+   for(%i=0; %i < %this.gameMenusArray.count(); %i++)
+   {
+      %buttonText = %this.gameMenusArray.getKey(%i);
+      
+      %textWidth = GuiMenuButtonProfile.getStringWidth(%buttonText);
+      
+      %btn = new GuiButtonCtrl() {
+         extent = %textWidth + 80 SPC 40;
+         profile = GuiMenuButtonProfile;
+         text = %buttonText;
+         class = "GameMenuButton";
+         command = "GameMenu.openGameMenu(\"" @ %buttonText @ "\");";
+      };
+      
+      %stackWidth += %textWidth + 40;
+         
+      GameMenuButtonList.add(%btn);
+   }
+   
+   GameMenuButtonList.resize(GameMenuTitlePanel.extent.x/2 - %stackWidth/2, 0, %stackWidth, GameMenuTitlePanel.extent.y);
+
+   %this.openGameMenu("System");
+   
+   //give a slight delay for the canvas to be fully refreshed before we sync things
+   %this.schedule(500, "syncGUI");
+}
+
+function GameMenu::onSleep(%this)
+{
+   if($Server::ServerType $= "SinglePlayer")
+   {
+      $timescale = 1;
+      sfxSetChannelVolume( $SimAudioType, $pref::SFX::channelVolume[ $SimAudioType ] );
+   }
+   
+   if(isObject(%this.currentMenu))
+   {
+      Canvas.popDialog(%this.currentMenu);  
+   }
+}
+
+if(!isObject( GameMenuActionMap ) )
+{
+   new ActionMap(GameMenuActionMap){};
+   
+   //We'll just use the existing BaseUI nav functions because it'd be the same logic anyways
+   GameMenuActionMap.bind( keyboard, w, BaseUINavigatePrev );
+   GameMenuActionMap.bind( keyboard, s, BaseUINavigateNext );
+   GameMenuActionMap.bind( gamepad, yaxis, "D", "-0.23 0.23", BaseUIStickNavigate );
+   GameMenuActionMap.bind( gamepad, upov, BaseUINavigatePrev );
+   GameMenuActionMap.bind( gamepad, dpov, BaseUINavigateNext );
+   
+   GameMenuActionMap.bind( keyboard, Enter, BaseUIActivateSelected );
+   GameMenuActionMap.bind( gamepad, btn_a, BaseUIActivateSelected );
+   
+   GameMenuActionMap.bindCmd( keyboard, Escape, "Canvas.popDialog(GameMenu);", "" );
+   GameMenuActionMap.bindCmd( gamepad, btn_b, "Canvas.popDialog(GameMenu);", "" );
+   GameMenuActionMap.bindCmd( gamepad, btn_start, "Canvas.popDialog(GameMenu);", "" );
+   
+   GameMenuActionMap.bind( keyboard, q, GameMenuPrevMenu );
+   GameMenuActionMap.bind( gamepad, btn_l, GameMenuPrevMenu );
+   
+   GameMenuActionMap.bind( keyboard, e, GameMenuNextMenu );
+   GameMenuActionMap.bind( gamepad, btn_r, GameMenuNextMenu );
+}
+
+function GameMenu::openGameMenu(%this, %menuName)
+{
+   %menuIdx = %this.gameMenusArray.getIndexFromKey(%menuName);
+   if(%menuIdx != -1)
+   {
+      %newMenu = %this.gameMenusArray.getValue(%menuIdx);
+
+      if(isObject(%this.currentMenu))
+         Canvas.popDialog(%this.currentMenu);
+      
+      Canvas.pushDialog(%newMenu);
+      %this.currentMenu = %newMenu;
+      %this.currentMenuIdx = %menuIdx;
+   }
+   
+   %this.syncGui();
+}
+
+function openPauseMenuOptions()
+{
+   GameMenu.pushPage(OptionsMenu);
+}
+
+function pauseMenuExitToMenu()
+{
+   MessageBoxOKCancel("Exit?", "Do you wish to exit to the Main Menu?", "escapeFromGame();", "");
+}
+
+function pauseMenuExitToDesktop()
+{
+   MessageBoxOKCancel("Exit?", "Do you wish to exit to the desktop?", "quit();", "");
+}
+
+function GameMenuPrevMenu(%val)
+{
+   if(%val)
+   {
+      %currentIdx = GameMenu.currentMenuIdx;
+      GameMenu.currentMenuIdx -= 1;
+      if(GameMenu.currentMenuIdx < 0)
+         GameMenu.currentMenuIdx = 0;
+         
+      if(%currentIdx == GameMenu.currentMenuIdx)
+         return;
+         
+      %menuName = GameMenu.gameMenusArray.getKey(GameMenu.currentMenuIdx);
+      
+      GameMenu.openGameMenu(%menuName);
+   }
+}
+
+function GameMenuNextMenu(%val)
+{
+   if(%val)
+   {
+      %currentIdx = GameMenu.currentMenuIdx;
+      GameMenu.currentMenuIdx += 1;
+      if(GameMenu.currentMenuIdx >= GameMenu.gameMenusArray.count())
+         GameMenu.currentMenuIdx = GameMenu.gameMenusArray.count()-1;
+         
+      if(%currentIdx == GameMenu.currentMenuIdx)
+         return;
+         
+      %menuName = GameMenu.gameMenusArray.getKey(GameMenu.currentMenuIdx);
+      
+      GameMenu.openGameMenu(%menuName);
+   }
+}
+
+function GameMenu::syncGui(%this)
+{
+   GameMenuButtonList.callOnChildren("setHighlighted", false);
+   
+   %btn = GameMenuButtonList.getObject(%this.currentMenuIdx);
+   %btn.setHighlighted(true);
+   
+   %buttonPosX = %btn.position.x + GameMenuButtonList.position.x;
+
+   GameMenuPrevNavIcon.position.x = %buttonPosX;
+   GameMenuNextNavIcon.position.x = %buttonPosX + %btn.extent.x - 40;
+   
+   //Update the button imagery to comply to the last input device we'd used
+   %device = Canvas.getLastInputDevice();
+   if(%device $= "mouse")
+      %device = "keyboard";
+      
+   GameMenuBackBtn.setBitmap(BaseUIActionMap.getCommandButtonBitmap(%device, "BaseUIBackOut"));
+   
+   GameMenuPrevNavIcon.setBitmap(GameMenuActionMap.getCommandButtonBitmap(%device, "GameMenuPrevMenu"));
+   GameMenuNextNavIcon.setBitmap(GameMenuActionMap.getCommandButtonBitmap(%device, "GameMenuNextMenu"));
+   
+   %this.schedule(500, "syncGUI");
+}
+
+/*
+
+*/

+ 0 - 5
Templates/BaseGame/game/data/UI/guis/GuiMusicPlayer.asset.taml

@@ -1,5 +0,0 @@
-<GUIAsset
-    AssetName="GuiMusicPlayer"
-    scriptFile="@assetFile=guiMusicPlayer"
-    GUIFile="@assetFile=guiMusicPlayer.gui"
-    VersionId="1"/>

+ 0 - 4
Templates/BaseGame/game/data/UI/guis/IODropdownDlg.asset.taml

@@ -1,4 +0,0 @@
-<GUIAsset
-    AssetName="IODropdownDlg"
-    GUIFile="@assetFile=IODropdownDlg.ed.gui"
-    VersionId="1"/>

+ 0 - 159
Templates/BaseGame/game/data/UI/guis/IODropdownDlg.ed.gui

@@ -1,159 +0,0 @@
-//--- OBJECT WRITE BEGIN ---
-$guiContent = new GuiControl(IODropdownDlg) {
-	profile = "GuiDefaultProfile";
-	horizSizing = "width";
-	vertSizing = "height";
-	position = "0 0";
-	extent = "640 480";
-	minExtent = "8 8";
-	visible = "1";
-	helpTag = "0";
-   new GuiWindowCtrl(IODropdownFrame) {
-      canSaveDynamicFields = "0";
-      Profile = "GuiWindowProfile";
-      horizSizing = "center";
-      vertSizing = "center";
-      position = "272 77";
-      extent = "256 117";
-      minExtent = "256 8";
-      canSave = "1";
-      Visible = "1";
-      hovertime = "1000";
-      maxLength = "255";
-      resizeWidth = "1";
-      resizeHeight = "1";
-      canMove = "1";
-      canClose = "1";
-      canMinimize = "0";
-      canMaximize = "0";
-      minSize = "50 50";
-      text = "";
-      closeCommand="IOCallback(IODropdownDlg,IODropdownDlg.cancelCallback);";
-
-      new GuiMLTextCtrl(IODropdownText) {
-         text = "";
-         maxLength = "1024";
-         margin = "0 0 0 0";
-         padding = "0 0 0 0";
-         anchorTop = "1";
-         anchorBottom = "0";
-         anchorLeft = "1";
-         anchorRight = "0";
-         isContainer = "0";
-         profile = "GuiMLTextProfile";
-         horizSizing = "center";
-         vertSizing = "bottom";
-         position = "9 26";
-         extent = "237 16";
-         minExtent = "8 8";
-         canSave = "1";
-         visible = "1";
-         tooltipprofile = "GuiToolTipProfile";
-         hovertime = "1000";
-         canSaveDynamicFields = "0";
-      };
-      new GuiBitmapBorderCtrl() {
-         isContainer = "0";
-         profile = "GuiGroupBorderProfile";
-         horizSizing = "width";
-         vertSizing = "bottom";
-         position = "7 51";
-         extent = "243 28";
-         minExtent = "0 0";
-         canSave = "1";
-         visible = "1";
-         tooltipprofile = "GuiToolTipProfile";
-         hovertime = "1000";
-         canSaveDynamicFields = "0";
-
-         new GuiTextCtrl(IOInputText) {
-            text = "Decal Datablock";
-            maxLength = "1024";
-            margin = "0 0 0 0";
-            padding = "0 0 0 0";
-            anchorTop = "1";
-            anchorBottom = "0";
-            anchorLeft = "1";
-            anchorRight = "0";
-            isContainer = "0";
-            profile = "GuiTextRightProfile";
-            horizSizing = "right";
-            vertSizing = "bottom";
-            position = "5 5";
-            extent = "105 18";
-            minExtent = "8 2";
-            canSave = "1";
-            visible = "1";
-            tooltipprofile = "GuiToolTipProfile";
-            hovertime = "1000";
-            canSaveDynamicFields = "0";
-         };
-         new GuiPopUpMenuCtrl(IODropdownMenu) {
-            maxPopupHeight = "200";
-            sbUsesNAColor = "0";
-            reverseTextList = "0";
-            bitmapBounds = "16 16";
-            maxLength = "1024";
-            margin = "0 0 0 0";
-            padding = "0 0 0 0";
-            anchorTop = "1";
-            anchorBottom = "0";
-            anchorLeft = "1";
-            anchorRight = "0";
-            isContainer = "0";
-            profile = "GuiPopUpMenuProfile";
-            horizSizing = "width";
-            vertSizing = "bottom";
-            position = "115 5";
-            extent = "122 18";
-            minExtent = "8 2";
-            canSave = "1";
-            visible = "1";
-            tooltipprofile = "GuiToolTipProfile";
-            hovertime = "1000";
-            canSaveDynamicFields = "0";
-         };
-      };
-      new GuiButtonCtrl() {
-         text = "OK";
-         groupNum = "-1";
-         buttonType = "PushButton";
-         useMouseEvents = "0";
-         isContainer = "0";
-         profile = "GuiButtonProfile";
-         horizSizing = "width";
-         vertSizing = "top";
-         position = "7 85";
-         extent = "156 24";
-         minExtent = "8 8";
-         canSave = "1";
-         visible = "1";
-         accelerator = "return";
-         command = "IOCallback(IODropdownDlg,IODropdownDlg.callback);";
-         tooltipprofile = "GuiToolTipProfile";
-         hovertime = "1000";
-         canSaveDynamicFields = "0";
-      };
-      new GuiButtonCtrl() {
-         text = "Cancel";
-         groupNum = "-1";
-         buttonType = "PushButton";
-         useMouseEvents = "0";
-         isContainer = "0";
-         profile = "GuiButtonProfile";
-         horizSizing = "left";
-         vertSizing = "top";
-         position = "170 85";
-         extent = "80 24";
-         minExtent = "8 8";
-         canSave = "1";
-         visible = "1";
-         accelerator = "escape";
-         command = "IOCallback(IODropdownDlg,IODropdownDlg.cancelCallback);";
-         tooltipprofile = "GuiToolTipProfile";
-         hovertime = "1000";
-         canSaveDynamicFields = "0";
-      };
-   };
-};
-//--- OBJECT WRITE END ---

+ 0 - 5
Templates/BaseGame/game/data/UI/guis/MainMenuButtons.asset.taml

@@ -1,5 +0,0 @@
-<GUIAsset
-    AssetName="MainMenuButtons"
-    scriptFile="@assetFile=MainMenuButtons.tscript"
-    GUIFile="@assetFile=MainMenuButtons.gui"
-    VersionId="1"/>

+ 0 - 84
Templates/BaseGame/game/data/UI/guis/MainMenuButtons.gui

@@ -1,84 +0,0 @@
-//--- OBJECT WRITE BEGIN ---
-$guiContent = new GuiControl(MainMenuButtons) {
-   extent = "1024 768";
-   horizSizing = "width";
-   vertSizing = "height";
-   profile = "GuiNonModalDefaultProfile";
-   tooltipProfile = "GuiToolTipProfile";
-   isContainer = "1";
-   canSaveDynamicFields = "1";
-      originalAssetName = "MainMenuButtons";
-
-   new GuiStackControl(MainMenuButtonList) {
-      padding = "15";
-      dynamicSize = "0";
-      position = "312 145";
-      extent = "400 477";
-      horizSizing = "center";
-      vertSizing = "center";
-      profile = "GuiDefaultProfile";
-      tooltipProfile = "GuiToolTipProfile";
-      superClass = "MenuList";
-
-      new GuiButtonCtrl(MainMenuSinglePlayerBtn) {
-         text = "Single Player";
-         extent = "400 55";
-         profile = "GuiMenuButtonProfile";
-         command = "openSinglePlayerMenu();";
-         tooltipProfile = "GuiToolTipProfile";
-      };
-      new GuiButtonCtrl(MainMenuCreateSrvrBtn) {
-         text = "Create Server";
-         position = "0 70";
-         extent = "400 55";
-         profile = "GuiMenuButtonProfile";
-         command = "openMultiPlayerMenu();";
-         tooltipProfile = "GuiToolTipProfile";
-      };
-      new GuiButtonCtrl(MainMenuJoinSrvrBtn) {
-         text = "Join Server";
-         position = "0 140";
-         extent = "400 55";
-         profile = "GuiMenuButtonProfile";
-         command = "openJoinServerMenu();";
-         tooltipProfile = "GuiToolTipProfile";
-      };
-      new GuiButtonCtrl(MainMenuOptionBtn) {
-         text = "Options";
-         position = "0 210";
-         extent = "400 55";
-         profile = "GuiMenuButtonProfile";
-         command = "openOptionsMenu();";
-         tooltipProfile = "GuiToolTipProfile";
-      };
-      new GuiButtonCtrl(MainMenuWorldEditBtn) {
-         text = "Open World Editor (F11)";
-         position = "0 280";
-         extent = "400 55";
-         profile = "GuiMenuButtonProfile";
-         command = "openWorldEditorBtn();";
-         tooltipProfile = "GuiToolTipProfile";
-         enabled = (ModuleDatabase.findModule("ToolsModule") !$= "");
-         visible = (ModuleDatabase.findModule("ToolsModule") !$= "");
-      };
-      new GuiButtonCtrl(MainMenuGuiEditBtn) {
-         text = "Open GUI Editor (F10)";
-         position = "0 350";
-         extent = "400 55";
-         profile = "GuiMenuButtonProfile";
-         command = "openGUIEditorBtn();";
-         tooltipProfile = "GuiToolTipProfile";
-         enabled = (ModuleDatabase.findModule("ToolsModule") !$= "");
-         visible = (ModuleDatabase.findModule("ToolsModule") !$= "");
-      };
-      new GuiButtonCtrl(MainMenuExitBtn) {
-         text = "Exit";
-         position = "0 420";
-         extent = "400 55";
-         profile = "GuiMenuButtonProfile";
-         command = "quit();";
-         tooltipProfile = "GuiToolTipProfile";
-      };
-   };
-};
-//--- OBJECT WRITE END ---

+ 0 - 107
Templates/BaseGame/game/data/UI/guis/MainMenuButtons.tscript

@@ -1,107 +0,0 @@
-function MainMenuButtons::onWake(%this)
-{
-}
-
-function MainMenuButtons::onSleep(%this)
-{
-}
-
-//==============================================================================
-// This gets called by the MainMenuGUI beacuse it, being a UINavigation classed control
-// set MainMenuButtonList as it's root page. 
-// This is an optional function, but is called as part of the validation that the page
-// CAN be opened, so it's shown here as an example
-function MainMenuButtons::canOpen(%this)
-{
-   return true;
-}
-
-//==============================================================================
-// This gets called by the MainMenuGUI beacuse it, being a UINavigation classed control
-// set MainMenuButtonList as it's root page. 
-// Once the page is added to the MainMenuGUI's UINavigation page stack, onOpen here is called
-// Which allows us to actually do the work we need to do for display
-function MainMenuButtons::onOpen(%this)
-{
-   //Here, we set the MainMenuButtonList - a GuiStackControl with the MenuList class
-   // to be the active menu list.
-   // This means that when the MainMenuGUI's MainMenuInputHandler receives an input
-   // or we have one of the buttons in the MainMenuButtonHolder be actioned, we know
-   // we're working/navigating this list of buttons specifically
-   // In practice, it sets the $activeMenuList global variable so the various menu class code
-   // can reference it consistently
-   MainMenuButtonList.setAsActiveMenuList();
-   
-   //Because MainMenuGUI set it's MainMenuButtonHolder as the active button container, we can reference it
-   //by $activeMenuButtonContainer and set the menu button/accelerator prompts we need for the MainMenuButtonList
-   //specifically.
-   //In particular, being a simple list of buttons, the only one we NEED is a simple activate, so we'll
-   //disable all the other ones to keep them clear in case they were set by other pages at some point
-   $activeMenuButtonContainer-->button1.disable();
-   $activeMenuButtonContainer-->button2.disable();
-   $activeMenuButtonContainer-->button3.disable();
-   
-   //Here we set the 4th button in the container
-   //All the buttons have the MenuInputButton class, which, like the other classes
-   //help keep things accessible and consistent. Here we use that class's set function to
-   //configure the accelerator behavior
-   //The first parameter sets the gamepad button to the 'A' button
-   //The second sets the keyboard button to Enter or Return
-   //Third is what the displayed text will be
-   //And finally we set the command when the button is clicked, or either key inputs are caught by
-   //our MenuInputHandler
-   //The menu buttons automatically detect which input device you're using and swap the display between
-   //gamepad or keyboard for consistent behavior
-   $activeMenuButtonContainer-->button4.set("btn_a", "Return", "Go", "MainMenuButtonList.activate();");
-   $activeMenuButtonContainer-->button5.disable();
-}
-
-//Optional, as the check defaults to true, but here as an example case
-function MainMenuButtons::canClose(%this)
-{
-   return true;
-}
-
-
-function MainMenuButtons::onClose(%this)
-{
-}
-
-//Our actual commands when we activate the buttons
-function openSinglePlayerMenu()
-{
-   $pref::HostMultiPlayer=false;
-   MainMenuGui.pushPage(ChooseLevelDlg);
-}
-
-function openMultiPlayerMenu()
-{
-   $pref::HostMultiPlayer=true;
-   
-   //Here, like the other commands, we add a new page onto the stack
-   //In this case, we'll push the ChooseLevelDlg control onto the stack. This will
-   //invoke the canClose() and then onClose() functions for MainMenuButtonList
-   //before calling the onOpen() for ChooseLevelDlg then displaying.
-   MainMenuGui.pushPage(ChooseLevelDlg);
-}
-
-function openJoinServerMenu()
-{
-   //Here, like the other commands, we add a new page onto the stack
-   //In this case, we'll push the JoinServerMenu control onto the stack. This will
-   //invoke the canClose() and then onClose() functions for MainMenuButtonList
-   //before calling the onOpen() for JoinServerMenu then displaying.
-   MainMenuGui.pushPage(JoinServerMenu);
-}
-
-
-
-function openWorldEditorBtn()
-{
-   fastLoadWorldEdit(1);
-}
-
-function openGUIEditorBtn()
-{
-   fastLoadGUIEdit(1);
-}

+ 0 - 5
Templates/BaseGame/game/data/UI/guis/PauseMenu.asset.taml

@@ -1,5 +0,0 @@
-<GUIAsset
-    AssetName="PauseMenu"
-    scriptFile="@assetFile=pauseMenu"
-    GUIFile="@assetFile=pauseMenu.gui"
-    VersionId="1"/>

+ 0 - 230
Templates/BaseGame/game/data/UI/guis/RecordingsDlg.gui

@@ -1,230 +0,0 @@
-//--- OBJECT WRITE BEGIN ---
-$guiContent = new GuiControl(recordingsDlg) {
-   position = "0 0";
-   extent = "1024 768";
-   minExtent = "8 8";
-   horizSizing = "right";
-   vertSizing = "bottom";
-   profile = "GuiDefaultProfile";
-   visible = "1";
-   active = "1";
-   tooltipProfile = "GuiToolTipProfile";
-   hovertime = "1000";
-   isContainer = "1";
-   canSave = "1";
-   canSaveDynamicFields = "1";
-      helpTag = "0";
-
-   new GuiWindowCtrl() {
-      text = "Demo Recordings";
-      resizeWidth = "0";
-      resizeHeight = "0";
-      canMove = "1";
-      canClose = "1";
-      canMinimize = "0";
-      canMaximize = "0";
-      canCollapse = "0";
-      closeCommand = "Canvas.popDialog(recordingsDlg);";
-      edgeSnap = "1";
-      margin = "0 0 0 0";
-      padding = "0 0 0 0";
-      anchorTop = "1";
-      anchorBottom = "0";
-      anchorLeft = "1";
-      anchorRight = "0";
-      position = "247 215";
-      extent = "530 338";
-      minExtent = "48 92";
-      horizSizing = "center";
-      vertSizing = "center";
-      profile = "GuiWindowProfile";
-      visible = "1";
-      active = "1";
-      tooltipProfile = "GuiToolTipProfile";
-      hovertime = "1000";
-      isContainer = "1";
-      canSave = "1";
-      canSaveDynamicFields = "0";
-
-      new GuiScrollCtrl() {
-         willFirstRespond = "1";
-         hScrollBar = "dynamic";
-         vScrollBar = "alwaysOn";
-         lockHorizScroll = "0";
-         lockVertScroll = "0";
-         constantThumbHeight = "0";
-         childMargin = "0 0";
-         mouseWheelScrollSpeed = "-1";
-         margin = "0 0 0 0";
-         padding = "0 0 0 0";
-         anchorTop = "1";
-         anchorBottom = "0";
-         anchorLeft = "1";
-         anchorRight = "0";
-         position = "23 60";
-         extent = "484 237";
-         minExtent = "32 32";
-         horizSizing = "right";
-         vertSizing = "bottom";
-         profile = "GuiScrollProfile";
-         visible = "1";
-         active = "1";
-         tooltipProfile = "GuiToolTipProfile";
-         hovertime = "1000";
-         isContainer = "1";
-         canSave = "1";
-         canSaveDynamicFields = "0";
-
-         new GuiTextListCtrl(RecordingsDlgList) {
-            columns = "0";
-            fitParentWidth = "1";
-            clipColumnText = "0";
-            position = "1 1";
-            extent = "469 32";
-            minExtent = "8 20";
-            horizSizing = "right";
-            vertSizing = "bottom";
-            profile = "GuiTextArrayProfile";
-            visible = "1";
-            active = "1";
-            tooltipProfile = "GuiToolTipProfile";
-            hovertime = "1000";
-            isContainer = "1";
-            canSave = "1";
-            canSaveDynamicFields = "0";
-         };
-      };
-      new GuiButtonCtrl(DR_CancelBtn) {
-         text = "Cancel";
-         groupNum = "-1";
-         buttonType = "PushButton";
-         useMouseEvents = "0";
-         position = "396 306";
-         extent = "110 20";
-         minExtent = "8 8";
-         horizSizing = "right";
-         vertSizing = "top";
-         profile = "GuiButtonProfile";
-         visible = "1";
-         active = "1";
-         command = "Canvas.popDialog(recordingsDlg);";
-         accelerator = "escape";
-         tooltipProfile = "GuiToolTipProfile";
-         hovertime = "1000";
-         isContainer = "0";
-         canSave = "1";
-         canSaveDynamicFields = "0";
-      };
-      new GuiButtonCtrl(DR_StartDemoBtn) {
-         text = "Play";
-         groupNum = "-1";
-         buttonType = "PushButton";
-         useMouseEvents = "0";
-         position = "25 305";
-         extent = "110 20";
-         minExtent = "8 8";
-         horizSizing = "right";
-         vertSizing = "top";
-         profile = "GuiButtonProfile";
-         visible = "1";
-         active = "1";
-         command = "StartSelectedDemo();";
-         tooltipProfile = "GuiToolTipProfile";
-         hovertime = "1000";
-         isContainer = "0";
-         canSave = "1";
-         canSaveDynamicFields = "0";
-      };
-      new GuiTextCtrl() {
-         text = "During gameplay press the following keys:";
-         maxLength = "1024";
-         margin = "0 0 0 0";
-         padding = "0 0 0 0";
-         anchorTop = "1";
-         anchorBottom = "0";
-         anchorLeft = "1";
-         anchorRight = "0";
-         position = "23 30";
-         extent = "206 18";
-         minExtent = "8 2";
-         horizSizing = "right";
-         vertSizing = "bottom";
-         profile = "GuiTextProfile";
-         visible = "1";
-         active = "1";
-         tooltipProfile = "GuiToolTipProfile";
-         hovertime = "1000";
-         isContainer = "1";
-         canSave = "1";
-         canSaveDynamicFields = "0";
-      };
-      new GuiTextCtrl() {
-         text = "Start = F3";
-         maxLength = "1024";
-         margin = "0 0 0 0";
-         padding = "0 0 0 0";
-         anchorTop = "1";
-         anchorBottom = "0";
-         anchorLeft = "1";
-         anchorRight = "0";
-         position = "253 32";
-         extent = "50 15";
-         minExtent = "8 2";
-         horizSizing = "right";
-         vertSizing = "bottom";
-         profile = "GuiTextProfile";
-         visible = "1";
-         active = "1";
-         tooltipProfile = "GuiToolTipProfile";
-         hovertime = "1000";
-         isContainer = "1";
-         canSave = "1";
-         canSaveDynamicFields = "0";
-      };
-      new GuiTextCtrl() {
-         text = "Stop = F4";
-         maxLength = "1024";
-         margin = "0 0 0 0";
-         padding = "0 0 0 0";
-         anchorTop = "1";
-         anchorBottom = "0";
-         anchorLeft = "1";
-         anchorRight = "0";
-         position = "320 32";
-         extent = "49 13";
-         minExtent = "8 2";
-         horizSizing = "right";
-         vertSizing = "bottom";
-         profile = "GuiTextProfile";
-         visible = "1";
-         active = "1";
-         tooltipProfile = "GuiToolTipProfile";
-         hovertime = "1000";
-         isContainer = "1";
-         canSave = "1";
-         canSaveDynamicFields = "0";
-      };
-      new GuiButtonCtrl(DR_DelDemoBtn) {
-         text = "Delete";
-         groupNum = "-1";
-         buttonType = "PushButton";
-         useMouseEvents = "0";
-         position = "210 305";
-         extent = "110 20";
-         minExtent = "8 2";
-         horizSizing = "right";
-         vertSizing = "bottom";
-         profile = "GuiButtonProfile";
-         visible = "1";
-         active = "1";
-         command = "deleteDemoRecord();";
-         tooltipProfile = "GuiToolTipProfile";
-         hovertime = "1000";
-         isContainer = "0";
-         canSave = "1";
-         canSaveDynamicFields = "0";
-      };
-   };
-};
-//--- OBJECT WRITE END ---
-

+ 5 - 0
Templates/BaseGame/game/data/UI/guis/SystemMenu.asset.taml

@@ -0,0 +1,5 @@
+<GUIAsset
+    AssetName="SystemMenu"
+    ScriptFile="@assetFile=SystemMenu.tscript"
+    GUIFile="@assetFile=SystemMenu.gui"
+    VersionId="1"/>

+ 53 - 0
Templates/BaseGame/game/data/UI/guis/SystemMenu.gui

@@ -0,0 +1,53 @@
+//--- OBJECT WRITE BEGIN ---
+$guiContent = new GuiControl(SystemMenu) {
+   extent = "1280 720";
+   profile = "GuiNonModalDefaultProfile";
+   tooltipProfile = "GuiToolTipProfile";
+   isContainer = "1";
+   canSaveDynamicFields = "1";
+
+   new GuiStackControl(SystemMenuButtonList) {
+      padding = "5";
+      dynamicSize = "0";
+      position = "440 263";
+      extent = "400 189";
+      horizSizing = "center";
+      vertSizing = "center";
+      profile = "GuiDefaultProfile";
+      tooltipProfile = "GuiToolTipProfile";
+      superClass = "MenuList";
+
+      new GuiButtonCtrl() {
+         text = "Return to Game";
+         extent = "400 40";
+         profile = "GuiMenuButtonProfile";
+         command = "Canvas.popDialog(GameMenu);";
+         tooltipProfile = "GuiToolTipProfile";
+      };
+      new GuiButtonCtrl() {
+         text = "Options";
+         position = "0 45";
+         extent = "400 40";
+         profile = "GuiMenuButtonProfile";
+         command = "Canvas.pushDialog(OptionsMenu);";
+         tooltipProfile = "GuiToolTipProfile";
+      };
+      new GuiButtonCtrl() {
+         text = "Exit to Menu";
+         position = "0 90";
+         extent = "400 40";
+         profile = "GuiMenuButtonProfile";
+         command = "systemMenuExitToMenu();";
+         tooltipProfile = "GuiToolTipProfile";
+      };
+      new GuiButtonCtrl() {
+         text = "Exit to Desktop";
+         position = "0 135";
+         extent = "400 40";
+         profile = "GuiMenuButtonProfile";
+         command = "systemMenuExitToDesktop();";
+         tooltipProfile = "GuiToolTipProfile";
+      };
+   };
+};
+//--- OBJECT WRITE END ---

+ 37 - 0
Templates/BaseGame/game/data/UI/guis/SystemMenu.tscript

@@ -0,0 +1,37 @@
+function SystemMenu::onWake(%this)
+{
+    $MenuList = SystemMenuButtonList;
+    $MenuList.listPosition = 0;
+}
+
+function SystemMenu::onSleep(%this)
+{
+    
+}
+
+function systemMenuExitToMenu()
+{
+   MessageBoxOKCancel("Exit?", "Do you wish to exit to the Main Menu?", "escapeFromGame();", "");
+}
+
+function systemMenuExitToDesktop()
+{
+   MessageBoxOKCancel("Exit?", "Do you wish to exit to the desktop?", "quit();", "");
+}
+
+function SystemMenuButtonList::syncGUI(%this)
+{
+   %this.callOnChildren("setHighlighted", false);
+   
+   %btn = %this.getObject(%this.listPosition);
+   %btn.setHighlighted(true);
+   
+   //
+   //Update the button imagery to comply to the last input device we'd used
+   %device = Canvas.getLastInputDevice();
+   if(%device $= "mouse")
+      %device = "keyboard";
+      
+   //We'll call back to the GameMenu parent just to be sure everything's on the same page
+   GameMenu.syncGui();
+}

+ 0 - 106
Templates/BaseGame/game/data/UI/guis/chooseLevelDlg.gui

@@ -1,106 +0,0 @@
-//--- OBJECT WRITE BEGIN ---
-$guiContent = new GuiControl(ChooseLevelDlg) {
-   extent = "1024 768";
-   minExtent = "8 8";
-   horizSizing = "width";
-   vertSizing = "height";
-   profile = "GuiNonModalDefaultProfile";
-   tooltipProfile = "GuiToolTipProfile";
-   isContainer = "1";
-   canSaveDynamicFields = "1";
-      Enabled = "1";
-      launchInEditor = "0";
-      returnGui = "MainMenuGui";
-
-   new GuiControl(ChooseLevelWindow) {
-      position = "48 56";
-      extent = "928 655";
-      horizSizing = "center";
-      vertSizing = "center";
-      profile = "GuiDefaultProfile";
-      tooltipProfile = "GuiToolTipProfile";
-      isContainer = "1";
-
-      new GuiBitmapBarCtrl() {
-         BitmapAsset = "UI:panel_image";
-         extent = "927 40";
-         horizSizing = "width";
-         profile = "GuiDefaultProfile";
-         tooltipProfile = "GuiToolTipProfile";
-      };
-      new GuiTextCtrl(LevelSelectTitle) {
-         text = "SINGLE PLAYER";
-         position = "22 10";
-         extent = "307 28";
-         profile = "MenuHeaderText";
-         tooltipProfile = "GuiToolTipProfile";
-      };
-      new GuiBitmapBarCtrl() {
-         BitmapAsset = "UI:panel_low_image";
-         position = "0 40";
-         extent = "927 618";
-         horizSizing = "width";
-         profile = "GuiDefaultProfile";
-         tooltipProfile = "GuiToolTipProfile";
-      };
-      new GuiBitmapCtrl() {
-         BitmapAsset = "Core_Rendering:missingTexture_image";
-         position = "513 71";
-         extent = "400 300";
-         profile = "GuiDefaultProfile";
-         tooltipProfile = "GuiToolTipProfile";
-         internalName = "CurrentPreview";
-         canSaveDynamicFields = "1";
-            Enabled = "1";
-      };
-      new GuiTextCtrl() {
-         text = "Example Level";
-         maxLength = "255";
-         position = "514 375";
-         extent = "398 27";
-         minExtent = "8 8";
-         profile = "MenuHeaderText";
-         tooltipProfile = "GuiToolTipProfile";
-         isContainer = "0";
-         internalName = "LevelName";
-      };
-      new GuiTextCtrl() {
-         text = "Description:";
-         maxLength = "255";
-         position = "522 410";
-         extent = "91 18";
-         minExtent = "8 8";
-         profile = "MenuSubHeaderText";
-         tooltipProfile = "GuiToolTipProfile";
-         isContainer = "0";
-         internalName = "LevelDescriptionLabel";
-      };
-      new GuiMLTextCtrl() {
-         text = "This is placeholder text";
-         position = "522 436";
-         extent = "391 14";
-         minExtent = "8 8";
-         profile = "GuiMLWhiteTextProfile";
-         tooltipProfile = "GuiToolTipProfile";
-         internalName = "LevelDescription";
-      };
-      new GuiScrollCtrl() {
-         hScrollBar = "dynamic";
-         vScrollBar = "dynamic";
-         position = "0 40";
-         extent = "450 580";
-         profile = "GuiMenuScrollProfile";
-         tooltipProfile = "GuiToolTipProfile";
-
-         new GuiGameListMenuCtrl(LevelList) {
-            callbackOnInputs = "1";
-            position = "1 1";
-            extent = "450 90";
-            profile = "DefaultListMenuProfile";
-            tooltipProfile = "GuiToolTipProfile";
-            class = "UIMenuButtonList";
-   };
-      };
-   };
-};
-//--- OBJECT WRITE END ---

+ 0 - 210
Templates/BaseGame/game/data/UI/guis/chooseLevelDlg.tscript

@@ -1,210 +0,0 @@
-//-----------------------------------------------------------------------------
-// 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 ChooseLevelDlg::onWake( %this )
-{
-   if(!isObject(LevelListEntries))
-      new ArrayObject(LevelListEntries){};
-      
-   if(!isObject(ChooseLevelAssetQuery))
-      new AssetQuery(ChooseLevelAssetQuery);
-}
-
-function ChooseLevelDlg::onOpen(%this)
-{
-   LevelList.clearRows();
-   LevelListEntries.empty();
-   
-   ChooseLevelWindow->CurrentPreview.setBitmap("UI:no_preview_image");
-   ChooseLevelWindow->LevelDescriptionLabel.visible = false;
-   ChooseLevelWindow->LevelDescription.visible = false;
-   
-   ChooseLevelAssetQuery.clear();
-   AssetDatabase.findAssetType(ChooseLevelAssetQuery, "LevelAsset");
-      
-   %count = ChooseLevelAssetQuery.getCount();
-   
-   if(%count == 0 && !IsDirectory("tools"))
-   {
-      //We have no levels found. Prompt the user to open the editor to the default level if the tools are present
-      MessageBoxOK("Error", "No levels were found in any modules. Please ensure you have modules loaded that contain gameplay code and level files.", 
-         "Canvas.popDialog(ChooseLevelDlg); if(isObject(ChooseLevelDlg.returnGui) && ChooseLevelDlg.returnGui.isMethod(\"onReturnTo\")) ChooseLevelDlg.returnGui.onReturnTo();");
-         
-      ChooseLevelAssetQuery.delete();
-      return;
-   }
-   
-   for(%i=0; %i < %count; %i++)
-	{
-	   %assetId = ChooseLevelAssetQuery.getAsset(%i);
-	   
-	   if(AssetDatabase.getAssetModule(%assetId).ModuleId $= "ToolsModule")
-	      continue;
-      
-      %levelAsset = AssetDatabase.acquireAsset(%assetId);
-      
-      %file = %levelAsset.getLevelPath();
-      
-      if ( !isFile(%file @ ".mis") && !isFile(%file @ ".mis.dso") &&!isFile(%file) )
-         continue;
-         
-      // Skip our new level/mission if we arent choosing a level
-      // to launch in the editor.
-      if ( !%this.launchInEditor )
-      {
-         %fileName = fileName(%file);
-         if (strstr(%fileName, "newMission.mis") > -1 || strstr(%fileName, "newLevel.mis") > -1)
-            continue;      
-      }
-                  
-      %this.addLevelAsset( %levelAsset );
-   }
-   
-   // Also add the new level mission as defined in the world editor settings
-   // if we are choosing a level to launch in the editor.
-   if ( %this.launchInEditor )
-   {
-      %this.addMissionFile( "tools/levels/DefaultEditorLevel.mis" );
-   }
-
-   for(%i=0; %i < LevelListEntries.count(); %i++)
-   {
-      %levelAsset = LevelListEntries.getKey(%i);
-      
-      LevelList.addRow(%levelAsset.LevelName, "", -1, -30);
-   }
-   
-   LevelList.setSelected(0);
-   LevelList.onChange();
-   
-   if(!$pref::HostMultiPlayer)
-      LevelSelectTitle.setText("SINGLE PLAYER");
-   else
-      LevelSelectTitle.setText("CREATE SERVER");
-   
-   $activeMenuButtonContainer-->button1.disable();
-   $activeMenuButtonContainer-->button2.disable();
-   $activeMenuButtonContainer-->button3.disable();
-   $activeMenuButtonContainer-->button4.set("btn_a", "Return", "Start Level", "ChooseLevelDlg.beginLevel();");
-   $activeMenuButtonContainer-->button5.set("btn_b", "Escape", "Back", %this @ ".navigation.popPage();");
-}
-
-function ChooseLevelDlg::onSleep( %this )
-{
-   // This is set from the outside, only stays true for a single wake/sleep
-   // cycle.
-   %this.launchInEditor = false;
-}
-
-function ChooseLevelDlg::addMissionFile( %this, %file )
-{
-   %levelName = fileBase(%file);
-   %levelDesc = "A Torque level";
-
-   %LevelInfoObject = getLevelInfo(%file);
-
-   if (%LevelInfoObject != 0)
-   {
-      if(%LevelInfoObject.levelName !$= "")
-         %levelName = %LevelInfoObject.levelName;
-      else if(%LevelInfoObject.name !$= "")
-         %levelName = %LevelInfoObject.name;
-
-      if (%LevelInfoObject.desc0 !$= "")
-         %levelDesc = %LevelInfoObject.desc0;
-         
-      if (%LevelInfoObject.preview !$= "")
-         %levelPreview = %LevelInfoObject.preview;
-         
-      %LevelInfoObject.delete();
-   }
-
-   LevelListEntries.add( %levelName TAB %file TAB %levelDesc TAB %levelPreview );
-}
-
-function ChooseLevelDlg::addLevelAsset( %this, %levelAsset )
-{
-   LevelListEntries.add( %levelAsset );
-}
-
-function LevelList::onChange(%this)
-{
-   %index = %this.getSelectedRow();
-   
-   %levelAsset = LevelListEntries.getKey(%index);
-   
-   // Get the name
-   ChooseLevelWindow->LevelName.text = %levelAsset.LevelName;
-   
-   // Get the level id
-   $selectedLevelAsset = %levelAsset.getAssetId();
-   
-   // Find the preview image
-   %levelPreview = %levelAsset.getPreviewImagePath();
-   
-   // Test against all of the different image formats
-   // This should probably be moved into an engine function
-   if (isFile(%levelPreview))
-      ChooseLevelWindow->CurrentPreview.setBitmap(%levelPreview);
-   else
-      ChooseLevelWindow->CurrentPreview.setBitmap("UI:no_preview_image");
-
-   // Get the description
-   %levelDesc = %levelAsset.description;
-   
-   if(%levelDesc !$= "")
-   {
-      ChooseLevelWindow->LevelDescriptionLabel.setVisible(true);
-      ChooseLevelWindow->LevelDescription.setVisible(true);
-      ChooseLevelWindow->LevelDescription.setText(%levelDesc);
-   }
-   else
-   {
-      ChooseLevelWindow->LevelDescriptionLabel.setVisible(false);
-      ChooseLevelWindow->LevelDescription.setVisible(false);
-   }
-   
-}
-
-// Do this onMouseUp not via Command which occurs onMouseDown so we do
-// not have a lingering mouseUp event lingering in the ether.
-function ChooseLevelDlg::beginLevel(%this)
-{
-   // So we can't fire the button when loading is in progress.
-   if ( isObject( ServerGroup ) )
-      return;
-      
-   %this.navigation.popPage();
-
-   // Launch the chosen level with the editor open?
-   if ( ChooseLevelDlg.launchInEditor )
-   {
-      activatePackage( "BootEditor" );
-      ChooseLevelDlg.launchInEditor = false; 
-      StartGame("", "SinglePlayer");
-   }
-   else
-   {
-      StartGame(); 
-   }
-}

+ 0 - 192
Templates/BaseGame/game/data/UI/guis/guiMusicPlayer.gui

@@ -1,192 +0,0 @@
-//--- OBJECT WRITE BEGIN ---
-$guiContent = new GuiControl(GuiMusicPlayer) {
-   isContainer = "1";
-   Profile = "GuiWindowProfile";
-   HorizSizing = "right";
-   VertSizing = "bottom";
-   position = "0 0";
-   Extent = "1024 768";
-   MinExtent = "8 2";
-   canSave = "1";
-   Visible = "1";
-   tooltipprofile = "GuiToolTipProfile";
-   hovertime = "1000";
-   canSaveDynamicFields = "1";
-   superClass = "GuiMusicPlayerClass";
-
-   new GuiWindowCtrl() {
-      resizeWidth = "0";
-      resizeHeight = "0";
-      canMove = "1";
-      canClose = "1";
-      canMinimize = "1";
-      canMaximize = "1";
-      minSize = "50 50";
-      EdgeSnap = "1";
-      text = "Torque Music Player";
-      Margin = "0 0 0 0";
-      Padding = "0 0 0 0";
-      AnchorTop = "1";
-      AnchorBottom = "0";
-      AnchorLeft = "1";
-      AnchorRight = "0";
-      isContainer = "1";
-      Profile = "GuiWindowProfile";
-      HorizSizing = "right";
-      VertSizing = "bottom";
-      position = "29 35";
-      Extent = "518 377";
-      MinExtent = "8 2";
-      canSave = "1";
-      Visible = "1";
-      tooltipprofile = "GuiToolTipProfile";
-      hovertime = "1000";
-      canSaveDynamicFields = "0";
-      closeCommand = "toggleMusicPlayer();";
-
-      new GuiCheckBoxCtrl(GuiMusicPlayerFadeCheckBox) {
-         useInactiveState = "0";
-         text = "Fade";
-         groupNum = "-1";
-         buttonType = "ToggleButton";
-         useMouseEvents = "0";
-         isContainer = "0";
-         Profile = "GuiCheckBoxProfile";
-         HorizSizing = "right";
-         VertSizing = "bottom";
-         position = "457 347";
-         Extent = "53 30";
-         MinExtent = "8 2";
-         canSave = "1";
-         Visible = "1";
-         tooltipprofile = "GuiToolTipProfile";
-         hovertime = "1000";
-         canSaveDynamicFields = "0";
-      };
-      new GuiCheckBoxCtrl(GuiMusicPlayerLoopCheckBox) {
-         useInactiveState = "0";
-         text = "Loop";
-         groupNum = "-1";
-         buttonType = "ToggleButton";
-         useMouseEvents = "0";
-         isContainer = "0";
-         Profile = "GuiCheckBoxProfile";
-         HorizSizing = "right";
-         VertSizing = "bottom";
-         position = "457 330";
-         Extent = "44 30";
-         MinExtent = "8 2";
-         canSave = "1";
-         Visible = "1";
-         tooltipprofile = "GuiToolTipProfile";
-         hovertime = "1000";
-         canSaveDynamicFields = "0";
-      };
-      new GuiScrollCtrl() {
-         willFirstRespond = "1";
-         hScrollBar = "dynamic";
-         vScrollBar = "alwaysOn";
-         lockHorizScroll = "0";
-         lockVertScroll = "0";
-         constantThumbHeight = "0";
-         childMargin = "0 0";
-         mouseWheelScrollSpeed = "-1";
-         Margin = "0 0 0 0";
-         Padding = "0 0 0 0";
-         AnchorTop = "1";
-         AnchorBottom = "0";
-         AnchorLeft = "1";
-         AnchorRight = "0";
-         isContainer = "1";
-         Profile = "GuiScrollProfile";
-         HorizSizing = "right";
-         VertSizing = "bottom";
-         position = "9 31";
-         Extent = "500 298";
-         MinExtent = "8 2";
-         canSave = "1";
-         Visible = "1";
-         tooltipprofile = "GuiToolTipProfile";
-         hovertime = "1000";
-         canSaveDynamicFields = "0";
-
-         new GuiListBoxCtrl(GuiMusicPlayerMusicList) {
-            AllowMultipleSelections = "1";
-            fitParentWidth = "1";
-            isContainer = "0";
-            Profile = "GuiListBoxProfile";
-            HorizSizing = "right";
-            VertSizing = "bottom";
-            position = "1 1";
-            Extent = "485 2";
-            MinExtent = "8 2";
-            canSave = "1";
-            Visible = "1";
-            tooltipprofile = "GuiToolTipProfile";
-            hovertime = "1000";
-            canSaveDynamicFields = "0";
-            superClass = "GuiMusicPlayerMusicListClass";
-         };
-      };
-      new GuiSliderCtrl(GuiMusicPlayerScrubber) {
-         range = "0 1";
-         ticks = "10";
-         value = "0";
-         snap = "false";
-         isContainer = "0";
-         Profile = "GuiSliderProfile";
-         HorizSizing = "right";
-         VertSizing = "bottom";
-         position = "114 343";
-         Extent = "331 23";
-         MinExtent = "8 2";
-         canSave = "1";
-         Visible = "1";
-         Command = "$thisControl.onDragComplete();";
-         tooltipprofile = "GuiToolTipProfile";
-         hovertime = "1000";
-         canSaveDynamicFields = "0";
-         class = "GuiMusicPlayerScrubberClass";
-         className = "GuiMusicPlayerScrubberClass";
-      };
-      new GuiButtonCtrl(GuiMusicPlayerStopButton) {
-         text = "Stop";
-         groupNum = "-1";
-         buttonType = "PushButton";
-         useMouseEvents = "0";
-         isContainer = "0";
-         Profile = "GuiButtonProfile";
-         HorizSizing = "right";
-         VertSizing = "bottom";
-         position = "57 338";
-         Extent = "40 30";
-         MinExtent = "8 2";
-         canSave = "1";
-         Visible = "1";
-         Command = "GuiMusicPlayer.stop();";
-         tooltipprofile = "GuiToolTipProfile";
-         hovertime = "1000";
-         canSaveDynamicFields = "0";
-      };
-      new GuiButtonCtrl(GuiMusicPlayerPlayButton) {
-         text = "Play";
-         groupNum = "-1";
-         buttonType = "PushButton";
-         useMouseEvents = "0";
-         isContainer = "0";
-         Profile = "GuiButtonProfile";
-         HorizSizing = "right";
-         VertSizing = "bottom";
-         position = "13 338";
-         Extent = "40 30";
-         MinExtent = "8 2";
-         canSave = "1";
-         Visible = "1";
-         Command = "GuiMusicPlayer.play();";
-         tooltipprofile = "GuiToolTipProfile";
-         hovertime = "1000";
-         canSaveDynamicFields = "0";
-      };
-   };
-};
-//--- OBJECT WRITE END ---

+ 0 - 236
Templates/BaseGame/game/data/UI/guis/guiMusicPlayer.tscript

@@ -1,236 +0,0 @@
-//-----------------------------------------------------------------------------
-// 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.
-//-----------------------------------------------------------------------------
-
-// A very simple music player.
-//---------------------------------------------------------------------------------------------
-// Preferences.
-
-$pref::GuiMusicPlayer::filePattern = "*.ogg\t*.wav";
-$pref::GuiMusicPlayer::fadeTime = "3.0";
-
-//---------------------------------------------------------------------------------------------
-// Datablocks.
-
-singleton SFXDescription( GuiMusicPlayerStream : AudioMusic2D )
-{
-   volume = 1.0;
-   isLooping = false;
-   isStreaming = true;
-   is3D = false;
-};
-singleton SFXDescription( GuiMusicPlayerLoopingStream : AudioMusic2D )
-{
-   volume = 1.0;
-   isLooping = true;
-   isStreaming = true;
-   is3D = false;
-};
-
-//---------------------------------------------------------------------------------------------
-// Functions.
-
-function toggleMusicPlayer()
-{   
-   if( !GuiMusicPlayer.isAwake() )
-   {
-      GuiMusicPlayer.setExtent( Canvas.getExtent() );
-      GuiMusicPlayer.setPosition( 0, 0 );
-      
-      Canvas.pushDialog( GuiMusicPlayer );
-   }
-   else
-      Canvas.popDialog( GuiMusicPlayer );
-}
-
-//---------------------------------------------------------------------------------------------
-// Methods.
-
-function GuiMusicPlayer_onSFXSourceStatusChange( %id, %status )
-{
-   if( %status $= "Stopped" )
-      GuiMusicPlayer.onStop();
-}
-
-function GuiMusicPlayerClass::play( %this )
-{
-   if( %this.status $= "Stopped"
-       || %this.status $= "Paused"
-       || %this.status $= "" )
-   {
-      %isPlaying = true;
-      if( %this.status $= "Paused" && isObject( %this.sfxSource ) )
-         %this.sfxSource.play();
-      else
-      {
-         %sel = GuiMusicPlayerMusicList.getSelectedItem();
-         if( %sel == -1 )
-            %isPlaying = false;
-         else
-         {
-            %desc = GuiMusicPlayerStream;
-            if( GuiMusicPlayerLoopCheckBox.getValue() )
-               %desc = GuiMusicPlayerLoopingStream;
-               
-            if( GuiMusicPlayerFadeCheckBox.getValue() )
-            {
-               %desc.fadeInTime = $pref::GuiMusicPlayer::fadeTime;
-               %desc.fadeOutTime = $pref::GuiMusicPlayer::fadeTime;
-            }
-            else
-            {
-               %desc.fadeInTime = 0;
-               %desc.fadeOutTime = 0;
-            }
-               
-            %file = GuiMusicPlayerMusicList.getItemText( %sel );
-            %this.sfxSource = sfxPlayOnce( %desc, %file );
-            if( !%this.sfxSource )
-               %isPlaying = false;
-            else
-            {
-               %this.sfxSource.statusCallback = "GuiMusicPlayer_onSFXSourceStatusChange";
-               GuiMusicPlayer.status = "Playing";
-               
-               GuiMusicPlayerScrubber.setActive( true );
-               GuiMusicPlayerScrubber.setup( %this.sfxSource.getDuration() );
-            }
-         }
-      }
-      
-      if( %isPlaying )
-      {
-         GuiMusicPlayerPlayButton.setText( "Pause" );
-         GuiMusicPlayerPlayButton.command = "GuiMusicPlayer.pause();";
-         GuiMusicPlayerLoopCheckBox.setActive( false );
-         GuiMusicPlayerFadeCheckBox.setActive( false );
-         %this.status = "Playing";
-      }
-   }
-}
-
-function GuiMusicPlayerClass::stop( %this )
-{
-   if( %this.status $= "Playing"
-       || %this.status $= "Paused" )
-   {
-      if( isObject( %this.sfxSource ) )
-         %this.sfxSource.stop( 0 ); // Stop immediately.
-   }
-}
-
-function GuiMusicPlayerClass::onStop( %this )
-{
-   %this.sfxSource = 0;
-
-   GuiMusicPlayerLoopCheckBox.setActive( true );
-   GuiMusicPlayerFadeCheckBox.setActive( true );
-   GuiMusicPlayerScrubber.setActive( false );
-   GuiMusicPlayerPlayButton.setText( "Play" );
-   GuiMusicPlayerPlayButton.Command = "GuiMusicPlayer.play();";
-   %this.status = "Stopped";
-   
-   GuiMusicPlayerScrubber.setValue( 0 );   
-}
-
-function GuiMusicPlayerClass::pause( %this )
-{
-   if( %this.status $= "Playing" )
-   {
-      if( isObject( %this.sfxSource ) )
-         %this.sfxSource.pause( 0 );
-         
-      GuiMusicPlayerPlayButton.setText( "Play" );
-      GuiMusicPlayerPlayButton.command = "GuiMusicPlayer.play();";
-      %this.status = "Paused";
-   }
-}
-
-function GuiMusicPlayerClass::seek( %this, %playtime )
-{
-   if( ( %this.status $= "Playing"
-         || %this.status $= "Paused" )
-       && isObject( %this.sfxSource ) )
-      %this.sfxSource.setPosition( %playtime );
-}
-
-function GuiMusicPlayer::onWake( %this )
-{
-   GuiMusicPlayerMusicList.load();
-}
-
-function GuiMusicPlayerMusicListClass::load( %this )
-{
-   // Remove all the files currently in the list.
-   
-   %this.clearItems();
-   
-   // Find the file matching pattern we should use.
-   
-   %filePattern = $pref::GuiMusicPlayer::filePattern;
-   %sfxProvider = getWord( sfxGetDeviceInfo(), 0 );
-   %filePatternVarName = "$pref::GuiMusicPlayer::filePattern" @ %sfxProvider;
-   if( isDefined( %filePatternVarName ) )
-      eval( "%filePattern = " @ %filePatternVarName @ ";" );
-      
-   // Find all files matching the pattern.
-      
-   for( %file = findFirstFileMultiExpr( %filePattern );
-        %file !$= "";
-        %file = findNextFileMultiExpr( %filePattern ) )
-      %this.addItem( makeRelativePath( %file, getMainDotCsDir() ) );
-}
-
-function GuiMusicPlayerMusicList::onDoubleClick( %this )
-{
-   GuiMusicPlayer.stop();
-   GuiMusicPlayer.play();
-}
-
-function GuiMusicPlayerScrubber::onMouseDragged( %this )
-{
-   %this.isBeingDragged = true;
-}
-
-function GuiMusicPlayerScrubberClass::setup( %this, %totalPlaytime )
-{
-   %this.range = "0 " @ %totalPlaytime;
-   %this.ticks = %totalPlaytime / 5; // One tick per five seconds.
-   
-   %this.update();
-}
-
-function GuiMusicPlayerScrubberClass::update( %this )
-{   
-   if( GuiMusicPlayer.status $= "Playing"
-       && !%this.isBeingDragged )
-      %this.setValue( GuiMusicPlayer.sfxSource.getPosition() );
-
-   if( GuiMusicPlayer.status $= "Playing"
-       || GuiMusicPlayer.status $= "Paused" )
-      %this.schedule( 5, "update" );
-}
-
-function GuiMusicPlayerScrubberClass::onDragComplete( %this )
-{
-   GuiMusicPlayer.seek( %this.getValue() );
-   %this.isBeingDragged = false;
-}

+ 126 - 124
Templates/BaseGame/game/data/UI/guis/joinServerMenu.gui

@@ -1,159 +1,161 @@
 //--- OBJECT WRITE BEGIN ---
 $guiContent = new GuiControl(JoinServerMenu) {
-   extent = "1024 768";
-   profile = "GuiNonModalDefaultProfile";
+   extent = "1280 720";
+   horizSizing = "width";
+   vertSizing = "height";
+   profile = "GuiMenuBackgroundProfile";
    tooltipProfile = "GuiToolTipProfile";
    isContainer = "1";
+   canSaveDynamicFields = "1";
+   
+   new GuiInputCtrl(JoinServerInputHandler) {
+      ignoreMouseEvents = "1";
+      ActionMap = "JoinServerActionMap";
+      position = "-50 0";
+      extent = "50 50";
       horizSizing = "width";
       vertSizing = "height";
-      canSaveDynamicFields = "0";
+      profile = "GuiInputCtrlProfile";
+      tooltipProfile = "GuiToolTipProfile";
+   };
 
-   new GuiControl(JoinServerWindow) {
-      position = "48 56";
-      extent = "928 655";
-      horizSizing = "center";
-      vertSizing = "center";
-      profile = "GuiDefaultProfile";
+   new GuiPanel(JoinServerTitlePanel) {
+      extent = "1281 80";
+      horizSizing = "width";
+      profile = "GuiMenuPanelProfile";
       tooltipProfile = "GuiToolTipProfile";
-      isContainer = "1";
 
-      new GuiBitmapBarCtrl() {
-         BitmapAsset = "UI:panel_image";
-         extent = "927 40";
-         horizSizing = "width";
-         profile = "GuiDefaultProfile";
-         tooltipProfile = "GuiToolTipProfile";
-      };
       new GuiTextCtrl() {
          text = "JOIN SERVER";
-         position = "22 10";
-         extent = "207 28";
+         position = "22 23";
+         extent = "220 28";
          profile = "MenuHeaderText";
          tooltipProfile = "GuiToolTipProfile";
       };
-      new GuiBitmapBarCtrl() {
-         BitmapAsset = "UI:panel_low_image";
-         position = "0 40";
-         extent = "927 618";
-         horizSizing = "width";
-         profile = "GuiDefaultProfile";
-         tooltipProfile = "GuiToolTipProfile";
-      };
-      new GuiTextCtrl(JS_status) {
-         text = "No servers found.";
-         maxLength = "255";
-         position = "392 47";
-         extent = "148 18";
-         minExtent = "8 8";
+   };
+   new GuiContainer() {
+      position = "203 81";
+      extent = "900 30";
+      profile = GuiMenuPanelProfile;
+      tooltipProfile = "GuiToolTipProfile";
+      horizSizing = "center";
+      vertSizing = "bottom";
+
+      new GuiTextCtrl() {
+         text = "Server Details";
+         position = "0 0";
+         extent = "730 30";
+         horizSizing = "right";
+         vertSizing = "center";
          profile = "MenuSubHeaderText";
          tooltipProfile = "GuiToolTipProfile";
       };
+      
       new GuiTextCtrl() {
-         text = "Players";
-         maxLength = "255";
-         position = "269 67";
-         extent = "36 18";
-         minExtent = "8 8";
-         profile = "GuiMLWhiteTextProfile";
+         text = "Ping";
+         position = "730 0";
+         extent = "50 30";
+         horizSizing = "left";
+         vertSizing = "center";
+         profile = "MenuSubHeaderText";
          tooltipProfile = "GuiToolTipProfile";
-         isContainer = "0";
       };
+      
       new GuiTextCtrl() {
-         text = "Version";
-         maxLength = "255";
-         position = "335 67";
-         extent = "38 18";
-         minExtent = "8 8";
-         profile = "GuiMLWhiteTextProfile";
+         text = "Player Count";
+         position = "780 0";
+         extent = "120 30";
+         horizSizing = "left";
+         vertSizing = "center";
+         profile = "MenuSubHeaderText";
          tooltipProfile = "GuiToolTipProfile";
-         isContainer = "0";
       };
-      new GuiTextCtrl() {
-         text = "Game";
-         maxLength = "255";
-         position = "412 67";
-         extent = "28 18";
-         minExtent = "8 8";
-         profile = "GuiMLWhiteTextProfile";
+   }; 
+   new GuiScrollCtrl() {
+      hScrollBar = "alwaysOff";
+      vScrollBar = "dynamic";
+      position = "203 111";
+      extent = "900 601";
+      minExtent = "8 8";
+      horizSizing = "center";
+      vertSizing = "height";
+      profile = "GuiMenuScrollProfile";
+      tooltipProfile = "GuiToolTipProfile";
+
+      new GuiStackControl(JoinServerList) {
+         padding = "10";
+         changeChildSizeToFit = "0";
+         position = "1 1";
+         extent = "888 16";
+         horizSizing = "center";
+         vertSizing = "center";
+         profile = "GuiMenuDefaultProfile";
          tooltipProfile = "GuiToolTipProfile";
-         isContainer = "0";
+         superClass = "MenuList";
       };
-      new GuiTextCtrl() {
-         text = "Ping";
-         maxLength = "255";
-         position = "212 67";
-         extent = "20 18";
-         minExtent = "8 8";
-         profile = "GuiMLWhiteTextProfile";
+   };
+   new GuiPanel(JoinServerButtonPanel) {
+      position = "0 683";
+      extent = "1281 40";
+      horizSizing = "width";
+      vertSizing = "top";
+      profile = "GuiMenuPanelProfile";
+      tooltipProfile = "GuiToolTipProfile";
+
+      new GuiIconButtonCtrl(JoinServerJoinBtn) {
+         BitmapAsset = "UI:Keyboard_Black_Return_image";
+         sizeIconToButton = "1";
+         makeIconSquare = "1";
+         textLocation = "Center";
+         text = "Join";
+         position = "1115 0";
+         extent = "140 40";
+         horizSizing = "left";
+         vertSizing = "center";
+         profile = "GuiMenuButtonProfile";
+         command = "JoinServerMenu.query();";
          tooltipProfile = "GuiToolTipProfile";
-         isContainer = "0";
       };
-      new GuiTextCtrl() {
-         text = "Server Name";
-         maxLength = "255";
-         position = "12 67";
-         extent = "63 18";
-         minExtent = "8 8";
-         profile = "GuiMLWhiteTextProfile";
+      new GuiIconButtonCtrl(JoinServerQLanBtn) {
+         BitmapAsset = "UI:Keyboard_Black_Escape_image";
+         sizeIconToButton = "1";
+         makeIconSquare = "1";
+         textLocation = "Center";
+         text = "Query Lan";
+         position = "965 0";
+         extent = "140 40";
+         horizSizing = "left";
+         vertSizing = "center";
+         profile = "GuiMenuButtonProfile";
+         command = "JoinServerMenu.queryLan();";
          tooltipProfile = "GuiToolTipProfile";
-         isContainer = "0";
       };
-      new GuiScrollCtrl() {
-         hScrollBar = "dynamic";
-         vScrollBar = "dynamic";
-         position = "19 98";
-         extent = "890 501";
-         minExtent = "8 8";
-         profile = "GuiMenuScrollProfile";
+      new GuiIconButtonCtrl(JoinServerQServerBtn) {
+         BitmapAsset = "UI:Keyboard_Black_Escape_image";
+         sizeIconToButton = "1";
+         makeIconSquare = "1";
+         textLocation = "Center";
+         text = "Query Server";
+         position = "817 0";
+         extent = "140 40";
+         horizSizing = "left";
+         vertSizing = "center";
+         profile = "GuiMenuButtonProfile";
+         command = "JoinServerMenu.join();";
          tooltipProfile = "GuiToolTipProfile";
-
-         new GuiStackControl(JoinServerList) {
-            padding = "10";
-            changeChildSizeToFit = "0";
-            position = "1 1";
-            extent = "888 16";
-            horizSizing = "center";
-            vertSizing = "center";
-            profile = "GuiDefaultProfile";
-            tooltipProfile = "GuiToolTipProfile";
-            superClass = "MenuList";
-         };
       };
-      new GuiControl(JS_queryStatus) {
-         position = "16 615";
-         extent = "900 35";
-         profile = "GuiDefaultProfile";
-         visible = "0";
+      new GuiIconButtonCtrl(JoinServerBackBtn) {
+         BitmapAsset = "UI:Keyboard_Black_Escape_image";
+         sizeIconToButton = "1";
+         makeIconSquare = "1";
+         textLocation = "Center";
+         text = "Back";
+         position = "16 0";
+         extent = "140 40";
+         vertSizing = "center";
+         profile = "GuiMenuButtonProfile";
+         command = "Canvas.popDialog();";
          tooltipProfile = "GuiToolTipProfile";
-         isContainer = "1";
-         hidden = "1";
-
-         new GuiProgressCtrl(JS_statusBar) {
-            position = "84 0";
-            extent = "695 35";
-            minExtent = "8 8";
-            profile = "GuiProgressProfile";
-            tooltipProfile = "GuiToolTipProfile";
-            isContainer = "0";
-         };
-         new GuiButtonCtrl(JS_cancelQuery) {
-            text = "Cancel!";
-            extent = "84 35";
-            minExtent = "8 8";
-            profile = "GuiMenuButtonProfile";
-            command = "JoinServerDlg.cancel();";
-            tooltipProfile = "GuiToolTipProfile";
-         };
-         new GuiTextCtrl(JS_statusText) {
-            text = "Querying master server";
-            maxLength = "255";
-            position = "84 0";
-            extent = "695 35";
-            minExtent = "8 8";
-            profile = "GuiMenuButtonProfile";
-            tooltipProfile = "GuiToolTipProfile";
-            isContainer = "0";
-   };
       };
    };
 };

+ 126 - 20
Templates/BaseGame/game/data/UI/guis/joinServerMenu.tscript

@@ -1,17 +1,19 @@
 
 function JoinServerMenu::onWake(%this)
 {
+   $MenuList = JoinServerList;
+   JoinServerList.listPosition = 0;
 }   
 
-function JoinServerMenu::onOpen(%this)
+if(!isObject( JoinServerActionMap ) )
 {
-   JoinServerList.setAsActiveMenuList();
-
-   $activeMenuButtonContainer-->button1.set("btn_y", "R", "Refresh", "JoinServerMenu.refresh();");
-   $activeMenuButtonContainer-->button2.set("btn_a", "Q", "Query LAN", "JoinServerMenu.queryLan();");
-   $activeMenuButtonContainer-->button3.set("btn_x", "E", "Query Online", "JoinServerMenu.query();");
-   $activeMenuButtonContainer-->button4.set("btn_start", "Return", "Join", "JoinServerMenu.join();");
-   $activeMenuButtonContainer-->button5.set("btn_b", "Escape", "Back", "cancelServerQuery(); " @ %this @ ".navigation.popPage();");
+   new ActionMap(JoinServerActionMap){};
+   
+   JoinServerActionMap.bindCmd( keyboard, q, "JoinServerMenu.query();" );
+   JoinServerActionMap.bindCmd( gamepad, btn_x, "JoinServerMenu.query();" );
+   
+   JoinServerActionMap.bindCmd( keyboard, e, "JoinServerMenu.queryLan();" );
+   JoinServerActionMap.bindCmd( gamepad, btn_y, "JoinServerMenu.queryLan();" );
 }
 
 //----------------------------------------
@@ -93,19 +95,17 @@ function JoinServerMenu::update(%this)
    %sc = getServerCount();
    for( %i = 0; %i < %sc; %i ++ ) {
       setServerInfo(%i);
-      %serverBtn = new GuiButtonCtrl(){
-         text = $ServerInfo::Name TAB
-            $ServerInfo::Ping TAB
-            $ServerInfo::PlayerCount @ "/" @ $ServerInfo::MaxPlayers TAB
-            $ServerInfo::Version TAB
-            $ServerInfo::MissionName;
-         profile = GuiJoinServerButtonProfile;      
-         extent = JoinServerList.extent.x SPC 30; 
-      };
-      JoinServerList.add(%serverBtn);
+      
+      %serverEntry = %this.addServerEntry();
+      %serverEntry-->serverNameTxt.text = $ServerInfo::Name;
+      %serverEntry-->serverDetailsTxt.text = $ServerInfo::Version @ " | " @ $ServerInfo::MissionName @ " | " @ $ServerInfo::MissionType;
+      %serverEntry-->pingTxt.text = $ServerInfo::Ping @ " ms";
+      %serverEntry-->playerCountTxt.text = $ServerInfo::PlayerCount @ "|" @ $ServerInfo::MaxPlayers;
+      
+      %serverEntry.resize(0, 0, JoinServerList.extent.x, %serverEntry.extent.y);
+      
+      JoinServerList.add(%serverEntry);
    }
-
-   $activeMenuButtonContainer-->button4.setActive(JoinServerList.getCount() > 0);
 } 
 
 //----------------------------------------
@@ -138,3 +138,109 @@ function onServerQueryStatus(%status, %msg, %value)
          JoinServerMenu.update();
    }
 }
+
+function JoinServerMenu::addServerEntry(%this)
+{
+   %entry = new GuiContainer() {
+      position = "0 0";
+      extent = "900 40";
+      profile = GuiMenuDefaultProfile;
+      tooltipProfile = "GuiToolTipProfile";
+      horizSizing = "width";
+      vertSizing = "bottom";
+      class = "JoinServerServerEntry";
+      
+      new GuiButtonCtrl() {
+         profile = GuiMenuButtonProfile;
+         position = "0 0";
+         extent = "900 40";
+         horizSizing = "width";
+         vertSizing = "height";
+         internalName = "button";
+      };
+
+      new GuiTextCtrl() {
+         position = "0 0";
+         extent = "730 20";
+         profile = "MenuSubHeaderText";
+         tooltipProfile = "GuiToolTipProfile";
+         internalName = "serverNameTxt";
+      };
+      new GuiTextCtrl() {
+         position = $optionsEntryPad SPC 17;
+         extent = "730 18";
+         profile = "GuiMLTextProfile";
+         tooltipProfile = "GuiToolTipProfile";
+         internalName = "serverDetailsTxt";
+      };
+      
+      new GuiTextCtrl() {
+         position = "730 0";
+         extent = "50 40";
+         horizSizing = "left";
+         vertSizing = "center";
+         profile = "MenuSubHeaderText";
+         tooltipProfile = "GuiToolTipProfile";
+         internalName = "pingTxt";
+      };
+      
+      new GuiTextCtrl() {
+         position = "780 0";
+         extent = "120 40";
+         horizSizing = "left";
+         vertSizing = "center";
+         profile = "MenuSubHeaderText";
+         tooltipProfile = "GuiToolTipProfile";
+         internalName = "playerCountTxt";
+      };
+   }; 
+   
+   return %entry;   
+}
+
+function JoinServerMenu::addStatusEntry(%this)
+{
+   %entry = new GuiContainer() {
+      position = "0 0";
+      extent = "900 40";
+      profile = GuiMenuDefaultProfile;
+      tooltipProfile = "GuiToolTipProfile";
+      horizSizing = "width";
+      vertSizing = "bottom";
+      class = "JoinServerStatusEntry";
+      
+      new GuiTextCtrl() {
+         position = "0 0";
+         extent = "730 20";
+         profile = "MenuSubHeaderCenteredText";
+         tooltipProfile = "GuiToolTipProfile";
+         internalName = "statusTxt";
+      };
+   };
+   
+   return %entry;
+}
+
+function JoinServerList::syncGui(%this)
+{
+   %this.callOnChildren("setHighlighted", false);
+   
+   if(%this.listPosition < %this.getCount())
+   {
+      %btn = %this.getObject(%this.listPosition);
+      %btn-->button.setHighlighted(true);
+   }
+   
+   //
+   //Update the button imagery to comply to the last input device we'd used
+   %device = Canvas.getLastInputDevice();
+   if(%device $= "mouse")
+      %device = "keyboard";
+      
+   JoinServerBackBtn.setBitmap(BaseUIActionMap.getCommandButtonBitmap(%device, "BaseUIBackOut")); 
+   JoinServerJoinBtn.setBitmap(BaseUIActionMap.getCommandButtonBitmap(%device, "BaseUIActivateSelected")); 
+   JoinServerQLanBtn.setBitmap(JoinServerActionMap.getCommandButtonBitmap(%device, "JoinServerMenu.queryLan();"));
+   JoinServerQServerBtn.setBitmap(JoinServerActionMap.getCommandButtonBitmap(%device, "JoinServerMenu.query();"));
+   
+   //JoinServerJoinBtn.setActive($selectedLevelAsset !$= "");
+}

+ 9 - 11
Templates/BaseGame/game/data/UI/guis/mainMenu.gui

@@ -6,22 +6,20 @@ $guiContent = new GuiChunkedBitmapCtrl(MainMenuGui) {
    horizSizing = "width";
    vertSizing = "height";
    profile = "GuiDefaultProfile";
+   category = "BaseUI";
    tooltipProfile = "GuiToolTipProfile";
    isContainer = "1";
    canSaveDynamicFields = "1";
 
    new GuiInputCtrl(MainMenuInputHandler) {
-      sendAxisEvents = "0";
-      sendBreakEvents = "0";
       ignoreMouseEvents = "1";
+      ActionMap = "BaseUIActionMap";
       position = "-50 0";
       extent = "2186 851";
       horizSizing = "width";
       vertSizing = "height";
       profile = "GuiInputCtrlProfile";
       tooltipProfile = "GuiToolTipProfile";
-      //class = "MenuInputHandler";
-      actionMap = MainMenuActionMap;
    };
    new GuiBitmapCtrl(SideBackgroundImage) {
       BitmapAsset = "UI:menu_side_background_image";
@@ -33,7 +31,7 @@ $guiContent = new GuiChunkedBitmapCtrl(MainMenuGui) {
    };
    new GuiBitmapCtrl(MainMenuAppLogo) {
       BitmapAsset = "UI:Torque_3D_logo_image";
-      position = "462 30";
+      position = "460 78";
       extent = "360 100";
       horizSizing = "center";
       profile = "GuiDefaultProfile";
@@ -73,7 +71,7 @@ $guiContent = new GuiChunkedBitmapCtrl(MainMenuGui) {
    new GuiStackControl(MainMenuButtonList) {
       padding = "5";
       dynamicSize = "0";
-      position = "440 185";
+      position = "440 199";
       extent = "400 322";
       horizSizing = "center";
       vertSizing = "center";
@@ -85,7 +83,7 @@ $guiContent = new GuiChunkedBitmapCtrl(MainMenuGui) {
          text = "Single Player";
          extent = "400 40";
          profile = "GuiMenuButtonProfile";
-         command = "openSinglePlayerMenu();";
+         command = "$pref::HostMultiPlayer=false;\nCanvas.pushDialog(ChooseLevelMenu);";
          tooltipProfile = "GuiToolTipProfile";
       };
       new GuiButtonCtrl(MainMenuCreateSrvrBtn) {
@@ -93,7 +91,7 @@ $guiContent = new GuiChunkedBitmapCtrl(MainMenuGui) {
          position = "0 45";
          extent = "400 40";
          profile = "GuiMenuButtonProfile";
-         command = "openMultiPlayerMenu();";
+         command = "$pref::HostMultiPlayer=true;Canvas.pushDialog(ChooseLevelMenu);";
          tooltipProfile = "GuiToolTipProfile";
       };
       new GuiButtonCtrl(MainMenuJoinSrvrBtn) {
@@ -101,7 +99,7 @@ $guiContent = new GuiChunkedBitmapCtrl(MainMenuGui) {
          position = "0 90";
          extent = "400 40";
          profile = "GuiMenuButtonProfile";
-         command = "openJoinServerMenu();";
+         command = "Canvas.pushDialog(JoinServerMenu);";
          tooltipProfile = "GuiToolTipProfile";
       };
       new GuiButtonCtrl(MainMenuOptionBtn) {
@@ -117,7 +115,7 @@ $guiContent = new GuiChunkedBitmapCtrl(MainMenuGui) {
          position = "0 180";
          extent = "400 40";
          profile = "GuiMenuButtonProfile";
-         command = "openWorldEditorBtn();";
+         command = "fastLoadWorldEdit(1);";
          tooltipProfile = "GuiToolTipProfile";
       };
       new GuiButtonCtrl(MainMenuGuiEditBtn) {
@@ -125,7 +123,7 @@ $guiContent = new GuiChunkedBitmapCtrl(MainMenuGui) {
          position = "0 225";
          extent = "400 40";
          profile = "GuiMenuButtonProfile";
-         command = "openGUIEditorBtn();";
+         command = "fastLoadGUIEdit(1);";
          tooltipProfile = "GuiToolTipProfile";
       };
       new GuiButtonCtrl(MainMenuExitBtn) {

+ 55 - 43
Templates/BaseGame/game/data/UI/guis/mainMenu.tscript

@@ -4,60 +4,84 @@ function MainMenuGui::onAdd(%this)
 
 function MainMenuGui::onWake(%this)
 {
-   MainMenuButtonList.listPosition = 0;
+   $MenuList = MainMenuButtonList;
+   $MenuList.listPosition = 0;
 }
 
-if(!isObject( MainMenuActionMap ) )
+function MainMenuGui::onSleep(%this)
 {
-   new ActionMap(MainMenuActionMap){};
+}
+
+if(!isObject( BaseUIActionMap ) )
+{
+   new ActionMap(BaseUIActionMap){};
    
-   MainMenuActionMap.bind( keyboard, w, mainMenuNavigateUp );
-   MainMenuActionMap.bind( keyboard, s, mainMenuNavigateDown );
-   MainMenuActionMap.bind( gamepad, yaxis, "D", "-0.23 0.23", mainMenuStickNavigate );
-   MainMenuActionMap.bind( gamepad, upov, mainMenuNavigateUp );
-   MainMenuActionMap.bind( gamepad, dpov, mainMenuNavigateDown );
+   BaseUIActionMap.bind( keyboard, w, BaseUINavigatePrev );
+   BaseUIActionMap.bind( keyboard, s, BaseUINavigateNext );
+   BaseUIActionMap.bind( gamepad, yaxis, "D", "-0.23 0.23", BaseUIStickNavigate );
+   BaseUIActionMap.bind( gamepad, upov, BaseUINavigatePrev );
+   BaseUIActionMap.bind( gamepad, dpov, BaseUINavigateNext );
    
-   MainMenuActionMap.bind( keyboard, Enter, activateSelected );
-   MainMenuActionMap.bind( gamepad, btn_a, activateSelected );
+   BaseUIActionMap.bind( keyboard, Enter, BaseUIActivateSelected );
+   BaseUIActionMap.bind( gamepad, btn_a, BaseUIActivateSelected );
+   
+   BaseUIActionMap.bind( keyboard, Escape, BaseUIBackOut );
+   BaseUIActionMap.bind( gamepad, btn_b, BaseUIBackOut );
 }
 
-function mainMenuNavigateUp(%val)
+function BaseUINavigatePrev(%val)
 {
    if(%val)
    {
-      MainMenuButtonList.listPosition -= 1;
-      if(MainMenuButtonList.listPosition < 0)
-         MainMenuButtonList.listPosition = 0;
+      $MenuList.listPosition -= 1;
+      if($MenuList.listPosition < 0)
+         $MenuList.listPosition = 0;
          
-      MainMenuGUI.syncGUI();
+      $MenuList.syncGUI();
    }
 }
 
-function mainMenuNavigateDown(%val)
+function BaseUINavigateNext(%val)
 {
    if(%val)
    {
-      MainMenuButtonList.listPosition += 1;
-      if(MainMenuButtonList.listPosition >= MainMenuButtonList.getCount())
-         MainMenuButtonList.listPosition = MainMenuButtonList.getCount()-1;
+      $MenuList.listPosition += 1;
+      if($MenuList.listPosition >= $MenuList.getCount())
+         $MenuList.listPosition = $MenuList.getCount()-1;
          
-      MainMenuGUI.syncGUI();
+      $MenuList.syncGUI();
    }
 }
 
-function mainMenuStickNavigate(%val)
+function BaseUIStickNavigate(%val)
 {
    if(%val == -1)
-      mainMenuNavigateUp(1);
+      BaseUINavigateNext(1);
    else if(%val == 1)
       mainMenuNavigateDown(1);
 }
 
-function MainMenuGUI::syncGUI(%this)
+function BaseUIBackOut(%val)
+{
+   //we can't navigate further back than the MainMenuGui
+   if(%val && Canvas.getObject(Canvas.getCount()-1) != MainMenuGui)
+   {
+      Canvas.popDialog();
+      %topMenu = Canvas.getObject(Canvas.getCount()-1);
+      if(isObject(%topMenu))
+      {
+         //re-kick the on-wake so we can be fully up to date and relevently
+         //contexted
+         %topMenu.onWake();  
+      }
+   }
+}
+
+function MainMenuButtonList::syncGUI(%this)
 {
-   MainMenuButtonList.callOnChildren("setHighlighted", false);
+   %this.callOnChildren("setHighlighted", false);
    
-   %btn = MainMenuButtonList.getObject(MainMenuButtonList.listPosition);
+   %btn = %this.getObject(%this.listPosition);
    %btn.setHighlighted(true);
    
    //
@@ -66,25 +90,13 @@ function MainMenuGUI::syncGUI(%this)
    if(%device $= "mouse")
       %device = "keyboard";
       
-   %binding = MainMenuActionMap.getBinding("activateSelected");
-   
-   %bindingCount = getFieldCount(%binding);
-   for(%i=0; %i < %bindingCount; %i+=2)
-   {
-      %mapDevice = stripTrailingNumber(getField(%binding, %i)); 
-      if(%mapDevice $= %device)
-      {
-         %button = getField(%binding, %i+1);
-         break;
-      }
-   }
-
-   %assetId = getButtonBitmap(%device, %button);
-   MainMenuGoButton.setBitmap(%assetId);
+   MainMenuGoButton.setBitmap(BaseUIActionMap.getCommandButtonBitmap(%device, "BaseUIActivateSelected"));
 }
 
-function activateSelected()
+function BaseUIActivateSelected()
 {
-   %btn = MainMenuButtonList.getObject(MainMenuButtonList.listPosition);
-   %btn.performClick();
+   %btn = $MenuList.getObject($MenuList.listPosition);
+   
+   if(%btn.isMethod("performClick"))
+      %btn.performClick();
 }

+ 32 - 304
Templates/BaseGame/game/data/UI/guis/messageBoxDlg.gui

@@ -1,347 +1,75 @@
 //--- OBJECT WRITE BEGIN ---
 $guiContent = new GuiControl(MessageBoxDlg) {
-   position = "0 0";
-   extent = "1024 768";
+   extent = "1280 720";
    minExtent = "8 8";
    horizSizing = "width";
    vertSizing = "height";
    profile = "GuiOverlayProfile";
-   visible = "1";
-   active = "1";
    tooltipProfile = "GuiToolTipProfile";
-   hovertime = "1000";
    isContainer = "1";
-   canSave = "1";
    canSaveDynamicFields = "1";
       helpTag = "0";
 
+   new GuiInputCtrl(MessageBoxInputHandler) {
+      ignoreMouseEvents = "1";
+      ActionMap = "MessageBoxActionMap";
+      position = "-50 0";
+      extent = "2186 851";
+      horizSizing = "width";
+      vertSizing = "height";
+      profile = "GuiInputCtrlProfile";
+      tooltipProfile = "GuiToolTipProfile";
+   };
+   
+   new GuiBitmapCtrl() {
+      BitmapAsset = "UI:backdrop_image";
+      position = "272 128";
+      extent = "735 463";
+      horizSizing = "center";
+      vertSizing = "center";
+      profile = "GuiDefaultProfile";
+      tooltipProfile = "GuiToolTipProfile";
+   };
    new GuiControl(MessageBoxCtrl) {
-      position = "192 197";
+      position = "319 169";
       extent = "641 381";
-      minExtent = "8 2";
       horizSizing = "center";
       vertSizing = "center";
       profile = "GuiDefaultProfile";
-      visible = "1";
-      active = "1";
       tooltipProfile = "GuiToolTipProfile";
-      hovertime = "1000";
       isContainer = "1";
-      canSave = "1";
-      canSaveDynamicFields = "0";
 
-      new GuiBitmapBarCtrl() {
-         percent = "100";
-         vertical = "0";
-         flipClip = "0";
-         bitmapAsset = "UI:panel_image";
-         color = "255 255 255 255";
-         position = "0 0";
-         extent = "641 40";
-         minExtent = "8 2";
+      new GuiPanel() {
+         extent = "641 381";
          horizSizing = "width";
-         vertSizing = "bottom";
-         profile = "GuiDefaultProfile";
-         visible = "1";
-         active = "1";
+         vertSizing = "height";
+         profile = "GuiMenuBasePanelProfile";
          tooltipProfile = "GuiToolTipProfile";
-         hovertime = "1000";
-         isContainer = "0";
-         canSave = "1";
-         canSaveDynamicFields = "0";
       };
       new GuiTextCtrl(MessageBoxTitleText) {
-         text = "OPTIONS";
-         maxLength = "1024";
-         margin = "0 0 0 0";
-         padding = "0 0 0 0";
-         anchorTop = "1";
-         anchorBottom = "0";
-         anchorLeft = "1";
-         anchorRight = "0";
          position = "32 7";
          extent = "577 28";
-         minExtent = "8 2";
-         horizSizing = "right";
-         vertSizing = "bottom";
-         profile = "MenuHeaderText";
-         visible = "1";
-         active = "1";
-         tooltipProfile = "GuiToolTipProfile";
-         hovertime = "1000";
-         isContainer = "1";
-         canSave = "1";
-         canSaveDynamicFields = "0";
-      };
-      new GuiBitmapBarCtrl() {
-         percent = "100";
-         vertical = "0";
-         flipClip = "0";
-         bitmapAsset = "UI:panel_low_image";
-         color = "255 255 255 255";
-         position = "0 40";
-         extent = "641 341";
-         minExtent = "8 2";
          horizSizing = "width";
-         vertSizing = "bottom";
-         profile = "GuiDefaultProfile";
-         visible = "1";
-         active = "1";
+         profile = "MenuHeaderText";
          tooltipProfile = "GuiToolTipProfile";
-         hovertime = "1000";
-         isContainer = "0";
-         canSave = "1";
-         canSaveDynamicFields = "0";
       };
       new GuiMLTextCtrl(MessageBoxText) {
-         lineSpacing = "2";
-         allowColorChars = "0";
-         maxChars = "-1";
-         useURLMouseCursor = "0";
          position = "81 83";
          extent = "481 19";
          minExtent = "8 8";
          horizSizing = "center";
          vertSizing = "center";
          profile = "MenuMLSubHeaderText";
-         visible = "1";
-         active = "1";
-         tooltipProfile = "GuiToolTipProfile";
-         hovertime = "1000";
-         isContainer = "0";
-         canSave = "1";
-         canSaveDynamicFields = "0";
-      };
-      new GuiControl(MessageBoxOKButtonHolder) {
-         position = "0 285";
-         extent = "642 40";
-         minExtent = "8 2";
-         horizSizing = "center";
-         vertSizing = "top";
-         profile = "GuiDefaultProfile";
-         visible = "1";
-         active = "1";
-         tooltipProfile = "GuiToolTipProfile";
-         hovertime = "1000";
-         isContainer = "1";
-         class = "MenuInputButtonContainer";
-         canSave = "1";
-         canSaveDynamicFields = "0";
-
-         new GuiIconButtonCtrl() {
-            buttonMargin = "4 4";
-            iconBitmap = "data/ui/images/Inputs/Keyboard & Mouse/Keyboard_Black_Enter";
-            iconLocation = "Left";
-            sizeIconToButton = "1";
-            makeIconSquare = "1";
-            textLocation = "Right";
-            textMargin = "4";
-            autoSize = "0";
-            text = "Go";
-            groupNum = "-1";
-            buttonType = "PushButton";
-            useMouseEvents = "0";
-            position = "251 0";
-            extent = "140 40";
-            minExtent = "8 2";
-            horizSizing = "right";
-            vertSizing = "bottom";
-            profile = "GuiMenuButtonProfile";
-            visible = "1";
-            active = "1";
-            command = "MainMenuButtonList.activateRow();";
-            tooltipProfile = "GuiToolTipProfile";
-            hovertime = "1000";
-            isContainer = "0";
-            internalName = "OKButton";
-            class = "MenuInputButton";
-            canSave = "1";
-            canSaveDynamicFields = "0";
-         };
-      };
-      new GuiControl(MessageBoxOCButtonHolder) {
-         position = "0 285";
-         extent = "642 40";
-         minExtent = "8 2";
-         horizSizing = "center";
-         vertSizing = "top";
-         profile = "GuiDefaultProfile";
-         visible = "1";
-         active = "1";
          tooltipProfile = "GuiToolTipProfile";
-         hovertime = "1000";
-         isContainer = "1";
-         class = "MenuInputButtonContainer";
-         canSave = "1";
-         canSaveDynamicFields = "0";
-
-         new GuiIconButtonCtrl() {
-            buttonMargin = "4 4";
-            iconBitmap = "data/ui/images/Inputs/Keyboard & Mouse/Keyboard_Black_Enter";
-            iconLocation = "Left";
-            sizeIconToButton = "1";
-            makeIconSquare = "1";
-            textLocation = "Right";
-            textMargin = "4";
-            autoSize = "0";
-            text = "Go";
-            groupNum = "-1";
-            buttonType = "PushButton";
-            useMouseEvents = "0";
-            position = "171 0";
-            extent = "140 40";
-            minExtent = "8 2";
-            horizSizing = "right";
-            vertSizing = "bottom";
-            profile = "GuiMenuButtonProfile";
-            visible = "1";
-            active = "1";
-            command = "MainMenuButtonList.activateRow();";
-            tooltipProfile = "GuiToolTipProfile";
-            hovertime = "1000";
-            isContainer = "0";
-            internalName = "OKButton";
-            class = "MenuInputButton";
-            canSave = "1";
-            canSaveDynamicFields = "0";
-         };
-         new GuiIconButtonCtrl() {
-            buttonMargin = "4 4";
-            iconBitmap = "data/ui/images/Inputs/Keyboard & Mouse/Keyboard_Black_Enter";
-            iconLocation = "Left";
-            sizeIconToButton = "1";
-            makeIconSquare = "1";
-            textLocation = "Right";
-            textMargin = "4";
-            autoSize = "0";
-            text = "Go";
-            groupNum = "-1";
-            buttonType = "PushButton";
-            useMouseEvents = "0";
-            position = "323 0";
-            extent = "140 40";
-            minExtent = "8 2";
-            horizSizing = "right";
-            vertSizing = "bottom";
-            profile = "GuiMenuButtonProfile";
-            visible = "1";
-            active = "1";
-            command = "MainMenuButtonList.activateRow();";
-            tooltipProfile = "GuiToolTipProfile";
-            hovertime = "1000";
-            isContainer = "0";
-            internalName = "CancelButton";
-            class = "MenuInputButton";
-            canSave = "1";
-            canSaveDynamicFields = "0";
-         };
       };
-      new GuiControl(MessageBoxYNCButtonHolder) {
-         position = "0 285";
-         extent = "642 40";
-         minExtent = "8 2";
-         horizSizing = "center";
+      new GuiStackControl(MessageBoxButtonHolder) {
+         stackingType = "Horizontal";
+         position = "250 285";
+         extent = "140 40";
+         horizSizing = "width";
          vertSizing = "top";
          profile = "GuiDefaultProfile";
-         visible = "1";
-         active = "1";
          tooltipProfile = "GuiToolTipProfile";
-         hovertime = "1000";
-         isContainer = "1";
-         class = "MenuInputButtonContainer";
-         canSave = "1";
-         canSaveDynamicFields = "0";
-
-         new GuiIconButtonCtrl() {
-            buttonMargin = "4 4";
-            iconBitmap = "data/ui/images/Inputs/Keyboard & Mouse/Keyboard_Black_Enter";
-            iconLocation = "Left";
-            sizeIconToButton = "1";
-            makeIconSquare = "1";
-            textLocation = "Right";
-            textMargin = "4";
-            autoSize = "0";
-            text = "Go";
-            groupNum = "-1";
-            buttonType = "PushButton";
-            useMouseEvents = "0";
-            position = "99 0";
-            extent = "140 40";
-            minExtent = "8 2";
-            horizSizing = "right";
-            vertSizing = "bottom";
-            profile = "GuiMenuButtonProfile";
-            visible = "1";
-            active = "1";
-            command = "MainMenuButtonList.activateRow();";
-            tooltipProfile = "GuiToolTipProfile";
-            hovertime = "1000";
-            isContainer = "0";
-            internalName = "yesButton";
-            class = "MenuInputButton";
-            canSave = "1";
-            canSaveDynamicFields = "0";
-         };
-         new GuiIconButtonCtrl() {
-            buttonMargin = "4 4";
-            iconBitmap = "data/ui/images/Inputs/Keyboard & Mouse/Keyboard_Black_Enter";
-            iconLocation = "Left";
-            sizeIconToButton = "1";
-            makeIconSquare = "1";
-            textLocation = "Right";
-            textMargin = "4";
-            autoSize = "0";
-            text = "Go";
-            groupNum = "-1";
-            buttonType = "PushButton";
-            useMouseEvents = "0";
-            position = "251 0";
-            extent = "140 40";
-            minExtent = "8 2";
-            horizSizing = "right";
-            vertSizing = "bottom";
-            profile = "GuiMenuButtonProfile";
-            visible = "1";
-            active = "1";
-            command = "MainMenuButtonList.activateRow();";
-            tooltipProfile = "GuiToolTipProfile";
-            hovertime = "1000";
-            isContainer = "0";
-            internalName = "noButton";
-            class = "MenuInputButton";
-            canSave = "1";
-            canSaveDynamicFields = "0";
-         };
-         new GuiIconButtonCtrl() {
-            buttonMargin = "4 4";
-            iconBitmap = "data/ui/images/Inputs/Keyboard & Mouse/Keyboard_Black_Enter";
-            iconLocation = "Left";
-            sizeIconToButton = "1";
-            makeIconSquare = "1";
-            textLocation = "Right";
-            textMargin = "4";
-            autoSize = "0";
-            text = "Go";
-            groupNum = "-1";
-            buttonType = "PushButton";
-            useMouseEvents = "0";
-            position = "403 0";
-            extent = "140 40";
-            minExtent = "8 2";
-            horizSizing = "right";
-            vertSizing = "bottom";
-            profile = "GuiMenuButtonProfile";
-            visible = "1";
-            active = "1";
-            command = "MainMenuButtonList.activateRow();";
-            tooltipProfile = "GuiToolTipProfile";
-            hovertime = "1000";
-            isContainer = "0";
-            internalName = "CancelButton";
-            class = "MenuInputButton";
-            canSave = "1";
-            canSaveDynamicFields = "0";
-         };
       };
    };
 };

+ 218 - 0
Templates/BaseGame/game/data/UI/guis/messageBoxDlg.tscript

@@ -0,0 +1,218 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+// --------------------------------------------------------------------
+// Message Sound
+// --------------------------------------------------------------------
+/*new SFXDescription(MessageBoxAudioDescription)
+{
+   volume      = 1.0;
+   isLooping   = false;
+   is3D        = false;
+   channel     = $GuiAudioType;
+};
+
+new SFXProfile(messageBoxBeep)
+{
+   filename    = "./messageBoxSound";
+   description = MessageBoxAudioDescription;
+   preload     = true;
+};*/
+
+//---------------------------------------------------------------------------------------------
+// messageCallback
+// Calls a callback passed to a message box.
+//---------------------------------------------------------------------------------------------
+function messageCallback(%dlg, %callback)
+{
+   Canvas.popDialog(%dlg);
+   eval(%callback);
+}
+
+//---------------------------------------------------------------------------------------------
+// MBSetText
+// Sets the text of a message box and resizes it to accomodate the new string.
+//---------------------------------------------------------------------------------------------
+function MBSetText(%text, %frame, %msg)
+{
+   // Get the extent of the text box.
+   %ext = %text.getExtent();
+   // Set the text in the center of the text box.
+   %text.setText("<just:center>" @ %msg);
+   // Force the textbox to resize itself vertically.
+   %text.forceReflow();
+   // Grab the new extent of the text box.
+   %newExtent = %text.getExtent();
+
+   // Get the vertical change in extent.
+   %deltaY = getWord(%newExtent, 1) - getWord(%ext, 1);
+   
+   // Resize the window housing the text box.
+   %windowPos = %frame.getPosition();
+   %windowExt = %frame.getExtent();
+   %frame.resize(getWord(%windowPos, 0), getWord(%windowPos, 1) - (%deltaY / 2),
+                 getWord(%windowExt, 0), getWord(%windowExt, 1) + %deltaY);
+                 
+   %frame.canMove = "0";
+   //%frame.canClose = "0";
+   %frame.resizeWidth = "0";
+   %frame.resizeHeight = "0";
+   %frame.canMinimize = "0";
+   %frame.canMaximize = "0";
+   
+   //sfxPlayOnce( messageBoxBeep );
+}
+
+function MessageBoxCtrl::onWake(%this)
+{
+   %this.callback = "";
+   %this.cancelCallback = "";
+}
+
+//---------------------------------------------------------------------------------------------
+// Various message box display functions. Each one takes a window title, a message, and a
+// callback for each button.
+//---------------------------------------------------------------------------------------------
+function MessageBoxCtrl::createButton(%this, %text, %command, %bitmap)
+{
+   %btn = new GuiIconButtonCtrl() {
+      BitmapAsset = %bitmap;
+      sizeIconToButton = "1";
+      makeIconSquare = "1";
+      textLocation = "Center";
+      iconLocation = "Left";
+      text = %text;
+      position = "251 0";
+      extent = "140 40";
+      profile = "GuiMenuButtonProfile";
+      command = %command;
+      tooltipProfile = "GuiToolTipProfile";
+   };
+   
+   MessageBoxButtonHolder.add(%btn);
+   
+   //update positioning of the holder to be centered
+   MessageBoxButtonHolder.position.x = MessageBoxCtrl.extent.x/2 - MessageBoxButtonHolder.extent.x/2;
+   
+   return %btn;
+}
+
+function MessageBoxDlg::onWake(%this)
+{
+   
+}
+
+if(!isObject( MessageBoxActionMap ) )
+{
+   new ActionMap(MessageBoxActionMap){};
+   
+   MessageBoxActionMap.bind( keyboard, Enter, messageBoxYesClicked );
+   MessageBoxActionMap.bind( gamepad, btn_a, messageBoxYesClicked );
+   
+   MessageBoxActionMap.bind( keyboard, Escape, messageBoxNoClicked );
+   MessageBoxActionMap.bind( gamepad, btn_b, messageBoxNoClicked );
+}
+
+function MessageBoxCtrl::syncGui(%this)
+{
+   
+}
+
+function messageBoxYesClicked(%this)
+{
+   MessageCallback(MessageBoxDlg, MessageBoxDlg.callback);
+}
+
+function messageBoxNoClicked(%this)
+{
+   MessageCallback(MessageBoxDlg,MessageBoxDlg.cancelCallback);
+}
+
+//MessageBoxOK("Test", "This is a test message box", "echo(\"Uhhhhhawhat?\"");
+function MessageBoxOK(%title, %message, %callback)
+{
+   MessageBoxButtonHolder.clear();
+   
+   Canvas.pushDialog(MessageBoxDlg);
+   MessageBoxTitleText.text = %title;
+   
+   %okButton = MessageBoxCtrl.createButton("OK", "messageBoxYesClicked();");
+   %bitmapAssetId = MessageBoxActionMap.getCommandButtonBitmap(Canvas.getLastInputDevice(), "messageBoxYesClicked");
+   %okButton.setBitmap(%bitmapAssetId);
+   
+   MBSetText(MessageBoxText, MessageBoxCtrl, %message);
+   MessageBoxDlg.callback = %callback;
+}
+
+function MessageBoxOKCancel(%title, %message, %callback, %cancelCallback, %okLabelOverride, %cancelLabelOverride)
+{
+   MessageBoxButtonHolder.clear();
+   
+   Canvas.pushDialog(MessageBoxDlg);
+   MessageBoxTitleText.text = %title;
+   
+   if(%okLabelOverride $= "")
+      %okLabel = "OK";
+   else
+      %okLabel = %okLabelOverride;
+      
+   if(%cancelLabelOverride $= "")
+      %cancelLabel = "Cancel";
+   else
+      %cancelLabel = %cancelLabelOverride;
+      
+   %okButton = MessageBoxCtrl.createButton(%okLabel, "messageBoxYesClicked();");
+   %bitmapAssetId = MessageBoxActionMap.getCommandButtonBitmap(Canvas.getLastInputDevice(), "messageBoxYesClicked");
+   %okButton.setBitmap(%bitmapAssetId);
+   
+   %cancelButton = MessageBoxCtrl.createButton(%cancelLabel, "messageBoxNoClicked();");
+   %bitmapAssetId = MessageBoxActionMap.getCommandButtonBitmap(Canvas.getLastInputDevice(), "messageBoxNoClicked");
+   %cancelButton.setBitmap(%bitmapAssetId);
+   
+   MBSetText(MessageBoxText, MessageBoxCtrl, %message);
+   MessageBoxDlg.callback = %callback;
+   MessageBoxDlg.cancelCallback = %cancelCallback;
+}
+
+function MessageBoxYesNo(%title, %message, %yesCallback, %noCallback)
+{
+   MessageBoxOKCancel(%title, %message, %yesCallback, %noCallback, "Yes", "No");
+}
+
+//---------------------------------------------------------------------------------------------
+// MessagePopup
+// Displays a message box with no buttons. Disappears after %delay milliseconds.
+//---------------------------------------------------------------------------------------------
+function MessagePopup(%title, %message, %delay)
+{
+   Canvas.pushDialog(MessageBoxDlg);
+   MessageBoxTitleText.text = %title;
+   MBSetText(MessageBoxText, MessageBoxCtrl, %message);
+
+   if (%delay !$= "")
+      schedule(%delay, 0, CloseMessagePopup);
+}
+
+function CloseMessagePopup()
+{
+   Canvas.popDialog(MessageBoxDlg);
+}

+ 305 - 86
Templates/BaseGame/game/data/UI/guis/optionsMenu.gui

@@ -6,73 +6,94 @@ $guiContent = new GuiChunkedBitmapCtrl(OptionsMenu) {
    horizSizing = "width";
    vertSizing = "height";
    profile = "GuiDefaultProfile";
+   category = "BaseUI";
    tooltipProfile = "GuiToolTipProfile";
    isContainer = "1";
    canSaveDynamicFields = "1";
-      currentCategory = "Graphics";
-      optionsCategories = "17233";
-      unappliedChanges = "17234";
+      optionsCategories = "17237";
+      unappliedChanges = "17238";
 
-   new GuiControl(OptionsMenuContainer) {
-      position = "208 32";
-      extent = "870 655";
-      horizSizing = "aspectCenter";
-      vertSizing = "center";
-      profile = "GuiDefaultProfile";
-      tooltipProfile = "GuiToolTipProfile";
-      isContainer = "1";
-   };
-   new GuiInputCtrl(MainMenuInputHandler) {
+   new GuiInputCtrl(OptionsMenuInputHandler) {
       ignoreMouseEvents = "1";
-      ActionMap = "MainMenuActionMap";
-      position = "-49 0";
+      ActionMap = "OptionsMenuActionMap";
+      position = "-50 0";
       extent = "2186 851";
       horizSizing = "width";
       vertSizing = "height";
       profile = "GuiInputCtrlProfile";
       tooltipProfile = "GuiToolTipProfile";
    };
-   new GuiStackControl(OptionsMenuCategoryList) {
-      stackingType = "Horizontal";
-      padding = "10";
-      dynamicSize = "0";
-      position = "398 80";
-      extent = "471 40";
+   new GuiControl(OptionsMenuCategoryContainer) {
+      position = "332 80";
+      extent = "617 49";
       horizSizing = "center";
       profile = "GuiDefaultProfile";
       tooltipProfile = "GuiToolTipProfile";
-      superClass = "MenuList";
+      isContainer = "1";
 
-      new GuiButtonCtrl() {
-         text = "Video";
-         extent = "100 40";
-         profile = "GuiMenuButtonProfile";
-         command = "populateDisplaySettingsList();";
-         tooltipProfile = "GuiToolTipProfile";
-      };
-      new GuiButtonCtrl() {
-         text = "Audio";
-         position = "110 0";
-         extent = "100 40";
+      new GuiIconButtonCtrl(OptionsMenuCatPrevBtn) {
+         BitmapAsset = "UI:Keyboard_Black_Q_image";
+         iconLocation = "Center";
+         makeIconSquare = "1";
+         textLocation = "Center";
+         bitmapMargin = "30";
+         position = "1 4";
+         extent = "50 40";
+         vertSizing = "center";
          profile = "GuiMenuButtonProfile";
-         command = "populateAudioSettingsList();";
+         command = "OptionsMenuCategoryPrev();";
          tooltipProfile = "GuiToolTipProfile";
+         class = "MenuInputButton";
       };
-      new GuiButtonCtrl() {
-         text = "Keyboard & Mouse";
-         position = "220 0";
-         extent = "140 40";
+      new GuiIconButtonCtrl(OptionsMenuCatNextBtn) {
+         BitmapAsset = "UI:Keyboard_Black_E_image";
+         iconLocation = "Center";
+         makeIconSquare = "1";
+         bitmapMargin = "30";
+         position = "568 4";
+         extent = "50 40";
+         horizSizing = "left";
+         vertSizing = "center";
          profile = "GuiMenuButtonProfile";
-         command = "populateKeyboardMouseSettingsList();";
+         command = "OptionsMenuCategoryNext();";
          tooltipProfile = "GuiToolTipProfile";
+         class = "MenuInputButton";
       };
-      new GuiButtonCtrl() {
-         text = "Gamepad";
-         position = "370 0";
-         extent = "100 40";
-         profile = "GuiMenuButtonProfile";
-         command = "populateGamepadSettingsList();";
+      new GuiStackControl(OptionsMenuCategoryList) {
+         stackingType = "Horizontal";
+         padding = "10";
+         dynamicSize = "0";
+         position = "137 3";
+         extent = "358 40";
+         horizSizing = "center";
+         vertSizing = "center";
+         profile = "GuiDefaultProfile";
          tooltipProfile = "GuiToolTipProfile";
+         superClass = "MenuList";
+
+         new GuiButtonCtrl() {
+            text = "Video";
+            extent = "100 40";
+            profile = "GuiMenuButtonProfile";
+            command = "populateDisplaySettingsList();";
+            tooltipProfile = "GuiToolTipProfile";
+         };
+         new GuiButtonCtrl() {
+            text = "Audio";
+            position = "110 0";
+            extent = "100 40";
+            profile = "GuiMenuButtonProfile";
+            command = "populateAudioSettingsList();";
+            tooltipProfile = "GuiToolTipProfile";
+         };
+         new GuiButtonCtrl() {
+            text = "Controls";
+            position = "220 0";
+            extent = "140 40";
+            profile = "GuiMenuButtonProfile";
+            command = "populateKeyboardMouseSettingsList();";
+            tooltipProfile = "GuiToolTipProfile";
+         };
       };
    };
    new GuiScrollCtrl(OptionsMenuSettingsScroll) {
@@ -89,13 +110,227 @@ $guiContent = new GuiChunkedBitmapCtrl(OptionsMenu) {
          padding = "5";
          changeChildSizeToFit = "0";
          position = "1 1";
-         extent = "603 245";
+         extent = "603 200";
          horizSizing = "width";
          vertSizing = "height";
          profile = "GuiDefaultProfile";
          tooltipProfile = "GuiToolTipProfile";
          superClass = "MenuList";
-         visible = true;
+
+         new GuiTextCtrl() {
+            text = "Basic";
+            extent = "500 30";
+            profile = "MenuHeaderText";
+            tooltipProfile = "GuiToolTipProfile";
+         };
+         new GuiContainer() {
+            position = "0 35";
+            extent = "603 40";
+            horizSizing = "width";
+            profile = "GuiMenuDefaultProfile";
+            tooltipProfile = "GuiToolTipProfile";
+            class = "OptionsListEntry";
+
+            new GuiButtonCtrl() {
+               extent = "603 40";
+               horizSizing = "width";
+               vertSizing = "height";
+               profile = "GuiMenuButtonProfile";
+               tooltipProfile = "GuiToolTipProfile";
+               internalName = "Button";
+               class = "optionsMenuButton";
+            };
+            new GuiTextCtrl() {
+               text = "Graphical Quality";
+               position = "10 -1";
+               extent = "250 20";
+               profile = "MenuSubHeaderText";
+               tooltipProfile = "GuiToolTipProfile";
+               internalName = "OptionName";
+            };
+            new GuiTextCtrl() {
+               text = "Controls the general graphical quality";
+               position = "10 17";
+               extent = "178 18";
+               profile = "GuiMLTextProfile";
+               tooltipProfile = "GuiToolTipProfile";
+               internalName = "OptionDescription";
+            };
+            new GuiContainer() {
+               position = "353 0";
+               extent = "250 40";
+               horizSizing = "left";
+               vertSizing = "height";
+               profile = "GuiModelessDialogProfile";
+               tooltipProfile = "GuiToolTipProfile";
+               internalName = "valuesContainer";
+
+               new GuiButtonCtrl() {
+                  text = "<";
+                  position = "160 0";
+                  extent = "20 40";
+                  profile = "GuiMenuButtonProfile";
+                  tooltipProfile = "GuiToolTipProfile";
+               };
+               new GuiTextCtrl() {
+                  text = "High";
+                  position = "180 0";
+                  extent = "50 40";
+                  vertSizing = "center";
+                  profile = "GuiMenuTextProfile";
+                  tooltipProfile = "GuiToolTipProfile";
+                  internalName = "optionValue";
+               };
+               new GuiButtonCtrl() {
+                  text = ">";
+                  position = "230 0";
+                  extent = "20 40";
+                  profile = "GuiMenuButtonProfile";
+                  tooltipProfile = "GuiToolTipProfile";
+               };
+            };
+         };
+         new GuiContainer() {
+            position = "0 80";
+            extent = "603 40";
+            horizSizing = "width";
+            profile = "GuiMenuDefaultProfile";
+            tooltipProfile = "GuiToolTipProfile";
+            class = "OptionsListEntry";
+
+            new GuiButtonCtrl() {
+               extent = "603 40";
+               horizSizing = "width";
+               vertSizing = "height";
+               profile = "GuiMenuButtonProfile";
+               tooltipProfile = "GuiToolTipProfile";
+               internalName = "Button";
+               class = "optionsMenuButton";
+            };
+            new GuiTextCtrl() {
+               text = "Lighting Quality";
+               position = "10 -1";
+               extent = "250 20";
+               profile = "MenuSubHeaderText";
+               tooltipProfile = "GuiToolTipProfile";
+               internalName = "OptionName";
+            };
+            new GuiTextCtrl() {
+               text = "Controls the lighting and shadows quality";
+               position = "10 17";
+               extent = "198 18";
+               profile = "GuiMLTextProfile";
+               tooltipProfile = "GuiToolTipProfile";
+               internalName = "OptionDescription";
+            };
+            new GuiContainer() {
+               position = "353 0";
+               extent = "250 40";
+               horizSizing = "left";
+               vertSizing = "height";
+               profile = "GuiModelessDialogProfile";
+               tooltipProfile = "GuiToolTipProfile";
+               internalName = "valuesContainer";
+
+               new GuiButtonCtrl() {
+                  text = "<";
+                  position = "160 0";
+                  extent = "20 40";
+                  profile = "GuiMenuButtonProfile";
+                  tooltipProfile = "GuiToolTipProfile";
+               };
+               new GuiTextCtrl() {
+                  text = "High";
+                  position = "180 0";
+                  extent = "50 40";
+                  vertSizing = "center";
+                  profile = "GuiMenuTextProfile";
+                  tooltipProfile = "GuiToolTipProfile";
+                  internalName = "optionValue";
+               };
+               new GuiButtonCtrl() {
+                  text = ">";
+                  position = "230 0";
+                  extent = "20 40";
+                  profile = "GuiMenuButtonProfile";
+                  tooltipProfile = "GuiToolTipProfile";
+               };
+            };
+         };
+         new GuiTextCtrl() {
+            text = "Advanced";
+            position = "0 125";
+            extent = "500 30";
+            profile = "MenuHeaderText";
+            tooltipProfile = "GuiToolTipProfile";
+         };
+         new GuiContainer() {
+            position = "0 160";
+            extent = "603 40";
+            horizSizing = "width";
+            profile = "GuiMenuDefaultProfile";
+            tooltipProfile = "GuiToolTipProfile";
+            class = "OptionsListEntry";
+
+            new GuiButtonCtrl() {
+               extent = "603 40";
+               horizSizing = "width";
+               vertSizing = "height";
+               profile = "GuiMenuButtonProfile";
+               tooltipProfile = "GuiToolTipProfile";
+               internalName = "Button";
+               class = "optionsMenuButton";
+            };
+            new GuiTextCtrl() {
+               text = "Mesh Detail";
+               position = "10 -1";
+               extent = "250 20";
+               profile = "MenuSubHeaderText";
+               tooltipProfile = "GuiToolTipProfile";
+               internalName = "OptionName";
+            };
+            new GuiTextCtrl() {
+               text = "Controls the max quality of mesh objects";
+               position = "10 17";
+               extent = "195 18";
+               profile = "GuiMLTextProfile";
+               tooltipProfile = "GuiToolTipProfile";
+               internalName = "OptionDescription";
+            };
+            new GuiContainer() {
+               position = "353 0";
+               extent = "250 40";
+               horizSizing = "left";
+               vertSizing = "height";
+               profile = "GuiModelessDialogProfile";
+               tooltipProfile = "GuiToolTipProfile";
+               internalName = "valuesContainer";
+
+               new GuiButtonCtrl() {
+                  text = "<";
+                  position = "160 0";
+                  extent = "20 40";
+                  profile = "GuiMenuButtonProfile";
+                  tooltipProfile = "GuiToolTipProfile";
+               };
+               new GuiTextCtrl() {
+                  text = "High";
+                  position = "180 0";
+                  extent = "50 40";
+                  vertSizing = "center";
+                  profile = "GuiMenuTextProfile";
+                  tooltipProfile = "GuiToolTipProfile";
+                  internalName = "optionValue";
+               };
+               new GuiButtonCtrl() {
+                  text = ">";
+                  position = "230 0";
+                  extent = "20 40";
+                  profile = "GuiMenuButtonProfile";
+                  tooltipProfile = "GuiToolTipProfile";
+               };
+            };
+         };
       };
       new GuiStackControl(AudioSettingsList) {
          padding = "5";
@@ -105,9 +340,10 @@ $guiContent = new GuiChunkedBitmapCtrl(OptionsMenu) {
          horizSizing = "width";
          vertSizing = "height";
          profile = "GuiDefaultProfile";
+         visible = "0";
          tooltipProfile = "GuiToolTipProfile";
          superClass = "MenuList";
-         visible = false;
+         hidden = "1";
       };
       new GuiStackControl(ControlSettingsList) {
          padding = "5";
@@ -117,9 +353,10 @@ $guiContent = new GuiChunkedBitmapCtrl(OptionsMenu) {
          horizSizing = "width";
          vertSizing = "height";
          profile = "GuiDefaultProfile";
+         visible = "0";
          tooltipProfile = "GuiToolTipProfile";
          superClass = "MenuList";
-         visible = false;
+         hidden = "1";
       };
    };
    new GuiPanel(OptionMenuTitlePanel) {
@@ -136,7 +373,7 @@ $guiContent = new GuiChunkedBitmapCtrl(OptionsMenu) {
          tooltipProfile = "GuiToolTipProfile";
       };
    };
-   new GuiPanel(MainMenuButtonPanel) {
+   new GuiPanel(OptionsMenuButtonPanel) {
       position = "0 683";
       extent = "1281 40";
       horizSizing = "width";
@@ -144,7 +381,7 @@ $guiContent = new GuiChunkedBitmapCtrl(OptionsMenu) {
       profile = "GuiMenuPanelProfile";
       tooltipProfile = "GuiToolTipProfile";
 
-      new GuiIconButtonCtrl() {
+      new GuiIconButtonCtrl(OptionsMenuApplyBtn) {
          BitmapAsset = "UI:Keyboard_Black_Return_image";
          sizeIconToButton = "1";
          makeIconSquare = "1";
@@ -155,12 +392,11 @@ $guiContent = new GuiChunkedBitmapCtrl(OptionsMenu) {
          horizSizing = "left";
          vertSizing = "center";
          profile = "GuiMenuButtonProfile";
-         command = "MainMenuSelectButton(1);";
+         command = "OptionsMenu.applySettings();";
          tooltipProfile = "GuiToolTipProfile";
-         internalName = "button4";
          class = "MenuInputButton";
       };
-      new GuiIconButtonCtrl() {
+      new GuiIconButtonCtrl(OptionsMenuBackBtn) {
          BitmapAsset = "UI:Keyboard_Black_Escape_image";
          sizeIconToButton = "1";
          makeIconSquare = "1";
@@ -168,44 +404,27 @@ $guiContent = new GuiChunkedBitmapCtrl(OptionsMenu) {
          text = "Back";
          position = "16 0";
          extent = "140 40";
+         vertSizing = "center";
+         profile = "GuiMenuButtonProfile";
+         command = "Canvas.popDialog();";
+         tooltipProfile = "GuiToolTipProfile";
+         class = "MenuInputButton";
+      };
+      new GuiIconButtonCtrl(OptionsMenuResetBtn) {
+         BitmapAsset = "UI:Keyboard_Black_Return_image";
+         sizeIconToButton = "1";
+         makeIconSquare = "1";
+         textLocation = "Center";
+         text = "Reset";
+         position = "947 0";
+         extent = "140 40";
          horizSizing = "left";
          vertSizing = "center";
          profile = "GuiMenuButtonProfile";
-         command = "MainMenuSelectButton(1);";
+         command = "OptionsMenu.resetSettings();";
          tooltipProfile = "GuiToolTipProfile";
-         internalName = "button4";
          class = "MenuInputButton";
       };
    };
-   new GuiIconButtonCtrl() {
-      BitmapAsset = "UI:Keyboard_Black_E_image";
-      iconLocation = "Center";
-      sizeIconToButton = "1";
-      makeIconSquare = "1";
-      position = "899 80";
-      extent = "50 40";
-      horizSizing = "left";
-      vertSizing = "center";
-      profile = "GuiMenuButtonProfile";
-      command = "MainMenuSelectButton(1);";
-      tooltipProfile = "GuiToolTipProfile";
-      internalName = "button4";
-      class = "MenuInputButton";
-   };
-   new GuiIconButtonCtrl() {
-      BitmapAsset = "UI:Keyboard_Black_Q_image";
-      iconLocation = "Center";
-      sizeIconToButton = "1";
-      makeIconSquare = "1";
-      position = "331 80";
-      extent = "50 40";
-      horizSizing = "left";
-      vertSizing = "center";
-      profile = "GuiMenuButtonProfile";
-      command = "MainMenuSelectButton(1);";
-      tooltipProfile = "GuiToolTipProfile";
-      internalName = "button4";
-      class = "MenuInputButton";
-   };
 };
 //--- OBJECT WRITE END ---

+ 194 - 27
Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript

@@ -48,6 +48,7 @@
 
 $yesNoList = "No\tYes";
 $onOffList = "Off\tOn";
+$optionsEntryPad = 10;
 
 function OptionsMenu::onAdd(%this)
 {
@@ -63,12 +64,6 @@ function OptionsMenu::onAdd(%this)
    
    %this.currentCategory = "";
    
-   addOptionsMenuCategory("Display", "populateDisplaySettingsList();");
-   addOptionsMenuCategory("Graphics", "populateGraphicsSettingsList();");
-   addOptionsMenuCategory("Audio", "populateAudioSettingsList();");
-   addOptionsMenuCategory("Keyboard & Mouse", "populateKeyboardMouseSettingsList();");
-   addOptionsMenuCategory("Gamepad", "populateGamepadSettingsList();");
-   
    callOnModules("populateOptionsMenuCategories", "Game");
 }
 
@@ -93,28 +88,147 @@ function OptionsMenu::onWake(%this)
          {
             %option = %setting.getObject(%s);
             
-            %optionsEntry = addOptionEntry();
-            %optionsEntry-->optionName.text = %option.OptionName;
-            %optionsEntry-->optionDescription.text = %option.Description;
-            %optionsEntry-->optionValue.text = %option.getObject(0).displayName;
-            
+            %optionsEntry = addOptionEntry(%option);
+
             if(isObject(%optionsEntry))
+            {
+               %optionsEntry.resize(0, 0, VideoSettingsList.extent.x, %optionsEntry.extent.y);
+               
                VideoSettingsList.add(%optionsEntry);
+            }
          }
       }
       else if(%setting.class $= "OptionsSettings")
       {
-         %entry = addOptionEntry();
-         %entry-->optionName.text = %setting.displayName;
-         %entry-->optionDescription.text = %setting.description;
-         %entry-->optionValue.text = %setting.getObject(0).displayName;
+         %optionsEntry = addOptionEntry(%option);
+            
+         if(isObject(%optionsEntry))
+         {
+            %optionsEntry.resize(0, 0, VideoSettingsList.extent.x, %optionsEntry.extent.y);
+            
+            VideoSettingsList.add(%optionsEntry);
+         }
+      }
+   }
+   
+   $MenuList = VideoSettingsList;
+   
+   //Find our first non-group entry
+   while($MenuList.getObject($MenuList.listPosition).class !$= OptionsListEntry && $MenuList.listPosition < $MenuList.getCount())
+   {
+      $MenuList.listPosition += 1;
+   }
+}
+
+if(!isObject( OptionsMenuActionMap ) )
+{
+   new ActionMap(OptionsMenuActionMap){};
+   
+   OptionsMenuActionMap.bind( keyboard, w, OptionMenuNavigatePrev );
+   OptionsMenuActionMap.bind( keyboard, s, OptionMenuNavigateNext );
+   OptionsMenuActionMap.bind( gamepad, yaxis, "D", "-0.23 0.23", OptionMenuStickNavigate );
+   OptionsMenuActionMap.bind( gamepad, upov, OptionMenuNavigatePrev );
+   OptionsMenuActionMap.bind( gamepad, dpov, OptionMenuNavigateNext );
+   
+   OptionsMenuActionMap.bind( keyboard, a, OptionMenuPrevSetting );
+   OptionsMenuActionMap.bind( keyboard, d, OptionMenuNextSetting );
+   OptionsMenuActionMap.bind( gamepad, xaxis, "D", "-0.23 0.23", OptionMenuStickChangeSetting );
+   OptionsMenuActionMap.bind( gamepad, lpov, OptionMenuPrevSetting );
+   OptionsMenuActionMap.bind( gamepad, lpov, OptionMenuNextSetting );
+   
+   //OptionsMenuActionMap.bind( keyboard, Enter, BaseUIActivateSelected );
+   //OptionsMenuActionMap.bind( gamepad, btn_a, BaseUIActivateSelected );
+}
+
+function VideoSettingsList::syncGui(%this)
+{
+   %this.callOnChildren("setHighlighted", false);
+   
+   %btn = %this.getObject(%this.listPosition);
+   if(%btn.class $= "OptionsListEntry")
+      %btn-->button.setHighlighted(true);
+}
+
+//
+function OptionMenuNavigatePrev(%val)
+{
+   if(%val)
+   {
+      $MenuList.listPosition -= 1;
+      while( $MenuList.listPosition >= 0 && $MenuList.getObject($MenuList.listPosition).class !$= OptionsListEntry)
+      {
+         $MenuList.listPosition -= 1;
+      }
          
-         if(isObject(%entry))
-               VideoSettingsList.add(%entry);
+      if($MenuList.listPosition < 0)
+         $MenuList.listPosition = 0;
+         
+      $MenuList.syncGUI();
+   }
+}
+
+function OptionMenuNavigateNext(%val)
+{
+   if(%val)
+   {
+      $MenuList.listPosition += 1;
+      while($MenuList.listPosition < $MenuList.getCount() && $MenuList.getObject($MenuList.listPosition).class !$= OptionsListEntry)
+      {
+         $MenuList.listPosition += 1;
       }
+      
+      if($MenuList.listPosition >= $MenuList.getCount())
+         $MenuList.listPosition = $MenuList.getCount()-1;
+         
+      $MenuList.syncGUI();
    }
 }
 
+function OptionMenuStickNavigate(%val)
+{
+   if(%val == -1)
+      BaseUINavigateNext(1);
+   else if(%val == 1)
+      mainMenuNavigateDown(1);
+}
+
+function OptionMenuPrevSetting(%val)
+{
+   %option = $MenuList.getObject($MenuList.listPosition);
+   echo("Option: " @ %option.className);
+   %optionObject = %option.optionsObject;
+   %currentOptionLevel = %optionObject.getObject(%option.currentOptionIndex);
+   
+   echo("Changed option: " @ %optionObject.optionName @ " to level: " @ %currentOptionLevel.displayName);
+   /*$MenuList.listPosition -= 1;
+      
+   if($MenuList.listPosition < 0)
+      $MenuList.listPosition = 0;*/
+      
+   $MenuList.syncGUI();
+}
+
+function OptionMenuNextSetting(%val)
+{
+   %option = $MenuList.getObject($MenuList.listPosition);
+   %optionObject = %option.optionsObject;
+   %currentOptionLevel = %optionObject.getObject(%option.currentOptionIndex);
+   
+   echo("Changed option: " @ %optionObject.optionName @ " to level: " @ %currentOptionLevel.displayName);
+   
+   /*$MenuList.listPosition += 1;
+      
+   if($MenuList.listPosition >= $MenuList.getCount())
+      $MenuList.listPosition = $MenuList.getCount()-1;*/
+      
+   $MenuList.syncGUI();
+}
+
+function OptionMenuStickChangeSetting(%val)
+{
+   
+}
+//
 function OptionsMenu::onOpen(%this)
 {
    OptionsMenuCategoryList.clear(); 
@@ -173,7 +287,7 @@ function OptionsMenu::canClose(%this)
    //UINavigation to not close the page
    if(OptionsMenuSettingsList.isActiveMenuList())
    {
-   OptionsMenuCategoryList.setAsActiveMenuList();
+      OptionsMenuCategoryList.setAsActiveMenuList();
       return false;
    }
    else
@@ -1238,28 +1352,66 @@ function addOptionGroup()
    };   
    
    return %group;
+}
+
+function optionsMenuButton::onHighlighted(%this, %highlighted)
+{
+   %container = %this.getParent();
    
+   %container-->optionName.profile = %highlighted ? MenuSubHeaderTextHighlighted : MenuSubHeaderText;
+   %container-->optionDescription.profile = %highlighted ? GuiMLTextProfileHighlighted : GuiMLTextProfile;
+   
+   %valuesContainer = %container-->valuesContainer;
+   %valuesContainer-->optionValue.profile = %highlighted ? GuiMenuTextProfileHighlighted : GuiMenuTextProfile;
+}
+
+function optionsMenuButton::onMouseDown(%this)
+{
+   //check if we're clicking on the left or right of the value and adjust it accordingly
 }
 
-function addOptionEntry()
+function addOptionEntry(%optionObj)
 {
+   if(!isObject(%optionObj) || %optionObj.class !$= "OptionsSettings")
+   {
+      error("addOptionsEntry() - attempting to create a new options entry, but was provided an invalid options object");
+      return 0;  
+   }
+   
+   %qualityLevel = %optionObj.getObject(0);
+   
    %entry = new GuiContainer() {
       position = "0 0";
       extent = "500 40";
-      profile = "GuiMenuPanelProfile";
+      profile = GuiMenuDefaultProfile;
       tooltipProfile = "GuiToolTipProfile";
+      horizSizing = "width";
+      vertSizing = "bottom";
+      class = "OptionsListEntry";
+      optionsObject = %optionObj;
+      currentOptionIndex = 0;
+      
+      new GuiButtonCtrl() {
+         profile = GuiMenuButtonProfile;
+         position = "0 0";
+         extent = "500 40";
+         horizSizing = "width";
+         vertSizing = "height";
+         internalName = "button";
+         class = "optionsMenuButton";
+      };
 
       new GuiTextCtrl() {
-         text = "";
-         position = "1 -1";
+         text = %optionObj.OptionName;
+         position = $optionsEntryPad SPC -1;
          extent = "250 20";
          profile = "MenuSubHeaderText";
          tooltipProfile = "GuiToolTipProfile";
          internalName = "optionName";
       };
       new GuiTextCtrl() {
-         text = "Sets the resolution and detail of shadows";
-         position = "1 17";
+         text = %optionObj.Description;
+         position = $optionsEntryPad SPC 17;
          extent = "250 18";
          profile = "GuiMLTextProfile";
          tooltipProfile = "GuiToolTipProfile";
@@ -1273,17 +1425,32 @@ function addOptionEntry()
          tooltipProfile = "GuiToolTipProfile";
          horizSizing = "left";
          vertSizing = "height";
+         internalName = "valuesContainer";
+         
+         new GuiButtonCtrl() {
+            position = "160 0";
+            extent = "20 40";
+            text = "<";
+            profile = GuiMenuButtonProfile;
+         };
          
          new GuiTextCtrl() {
-            text = "< High >";
+            text = %qualityLevel.displayName;
             position = "180 0";
-            extent = "70 40";
+            extent = "50 40";
             profile = "GuiMenuTextProfile";
             tooltipProfile = "GuiToolTipProfile";
-            horizSizing = "left";
+            horizSizing = "right";
             vertSizing = "center";
             internalName = "optionValue";
          };
+         
+         new GuiButtonCtrl() {
+            position = "230 0";
+            extent = "20 40";
+            text = ">";
+            profile = GuiMenuButtonProfile;
+         };
       };
    }; 
    

+ 0 - 163
Templates/BaseGame/game/data/UI/guis/pauseMenu.gui

@@ -1,163 +0,0 @@
-//--- OBJECT WRITE BEGIN ---
-$guiContent = new GuiControl(PauseMenu) {
-   extent = "1024 768";
-   profile = "GuiDefaultProfile";
-   tooltipProfile = "GuiToolTipProfile";
-   isContainer = "1";
-   superClass = "UINavigation";
-   canSaveDynamicFields = "1";
-
-   new GuiChunkedBitmapCtrl(PauseMenuBG) {
-      BitmapAsset = "UI:hudfill_image";
-      extent = "1024 768";
-      horizSizing = "width";
-      vertSizing = "height";
-      profile = "GuiDefaultProfile";
-      tooltipProfile = "GuiToolTipProfile";
-      isContainer = "1";
-      canSaveDynamicFields = "1";
-   };
-   new GuiInputCtrl(PauseMenuInputHandler) {
-      sendAxisEvents = "1";
-      sendBreakEvents = "1";
-      ignoreMouseEvents = "1";
-      position = "-50 0";
-      extent = "10 10";
-      horizSizing = "width";
-      vertSizing = "height";
-      profile = "GuiInputCtrlProfile";
-      tooltipProfile = "GuiToolTipProfile";
-      class = "MenuInputHandler";
-   };
-   new GuiControl(PauseMenuButtons) {
-      position = "162 125";
-      extent = "700 518";
-      horizSizing = "center";
-      vertSizing = "center";
-      profile = "GuiDefaultProfile";
-      tooltipProfile = "GuiToolTipProfile";
-      isContainer = "1";
-      
-      new GuiStackControl(PauseMenuList) {
-         padding = "15";
-         dynamicSize = "0";
-         extent = "700 320";
-         horizSizing = "center";
-         vertSizing = "center";
-         profile = "GuiDefaultProfile";
-         tooltipProfile = "GuiToolTipProfile";
-         superClass = "MenuList";
-
-         new GuiButtonCtrl() {
-            text = "Options";
-            extent = "700 55";
-            profile = "GuiMenuButtonProfile";
-            command = "openPauseMenuOptions();";
-            tooltipProfile = "GuiToolTipProfile";
-         };
-         new GuiButtonCtrl() {
-            text = "Exit to Menu";
-            position = "0 70";
-            extent = "700 55";
-            profile = "GuiMenuButtonProfile";
-            command = "pauseMenuExitToMenu();";
-            tooltipProfile = "GuiToolTipProfile";
-         };
-         new GuiButtonCtrl() {
-            text = "Exit to Desktop";
-            position = "0 140";
-            extent = "700 55";
-            profile = "GuiMenuButtonProfile";
-            command = "pauseMenuExitToDesktop();";
-            tooltipProfile = "GuiToolTipProfile";
-         };
-      };
-   };
-   new GuiControl(PauseButtonHolder) {
-      position = "144 711";
-      extent = "736 40";
-      horizSizing = "center";
-      vertSizing = "top";
-      profile = "GuiDefaultProfile";
-      tooltipProfile = "GuiToolTipProfile";
-      isContainer = "1";
-      class = "MenuInputButtonContainer";
-
-      new GuiIconButtonCtrl() {
-         BitmapAsset = "UI:Keyboard_Black_Return_image";
-         sizeIconToButton = "1";
-         makeIconSquare = "1";
-         textLocation = "Right";
-         position = "11 0";
-         extent = "140 40";
-         profile = "GuiMenuButtonProfile";
-         visible = "0";
-         active = "0";
-         tooltipProfile = "GuiToolTipProfile";
-         internalName = "button1";
-         class = "MenuInputButton";
-         hidden = "1";
-      };
-      new GuiIconButtonCtrl() {
-         BitmapAsset = "UI:Keyboard_Black_Return_image";
-         sizeIconToButton = "1";
-         makeIconSquare = "1";
-         textLocation = "Right";
-         position = "155 0";
-         extent = "140 40";
-         profile = "GuiMenuButtonProfile";
-         visible = "0";
-         active = "0";
-         tooltipProfile = "GuiToolTipProfile";
-         internalName = "button2";
-         class = "MenuInputButton";
-         hidden = "1";
-      };
-      new GuiIconButtonCtrl() {
-         BitmapAsset = "UI:Keyboard_Black_Return_image";
-         sizeIconToButton = "1";
-         makeIconSquare = "1";
-         textLocation = "Right";
-         position = "299 0";
-         extent = "140 40";
-         profile = "GuiMenuButtonProfile";
-         visible = "0";
-         active = "0";
-         tooltipProfile = "GuiToolTipProfile";
-         internalName = "button3";
-         class = "MenuInputButton";
-         hidden = "1";
-      };
-      new GuiIconButtonCtrl() {
-         BitmapAsset = "UI:Keyboard_Black_Return_image";
-         sizeIconToButton = "1";
-         makeIconSquare = "1";
-         textLocation = "Right";
-         position = "443 0";
-         extent = "140 40";
-         profile = "GuiMenuButtonProfile";
-         visible = "0";
-         active = "0";
-         tooltipProfile = "GuiToolTipProfile";
-         internalName = "button4";
-         class = "MenuInputButton";
-         hidden = "1";
-      };
-      new GuiIconButtonCtrl() {
-         BitmapAsset = "UI:Keyboard_Black_Return_image";
-         sizeIconToButton = "1";
-         makeIconSquare = "1";
-         textLocation = "Right";
-         position = "587 0";
-         extent = "140 40";
-         profile = "GuiMenuButtonProfile";
-         visible = "0";
-         active = "0";
-         tooltipProfile = "GuiToolTipProfile";
-         internalName = "button5";
-         class = "MenuInputButton";
-         hidden = "1";
-      };
-   };
-};
-//--- OBJECT WRITE END ---

+ 0 - 93
Templates/BaseGame/game/data/UI/guis/pauseMenu.tscript

@@ -1,93 +0,0 @@
-function PauseMenu::onWake(%this)
-{
-   if($Server::ServerType $= "SinglePlayer")
-   {
-      $timescale = 0;
-      
-      sfxSetChannelVolume( $SimAudioType, $pref::SFX::channelVolume[ 0 ] );
-   }
-   
-   PauseButtonHolder.setActive();
-   PauseMenuInputHandler.setFirstResponder();
-   
-   %this.resizePages = true;
-   
-   %this.setRootPage(PauseMenuButtons);
-}
-
-function PauseMenuButtons::onOpen(%this)
-{
-   PauseMenuList.clear();
-   
-   if($Tools::loaded && EditorIsActive())
-   {
-      %this.addPauseMenuButton("Exit Editor", "fastLoadWorldEdit();"); 
-   }
-   
-   %this.addPauseMenuButton("Options", "openPauseMenuOptions();");
-   %this.addPauseMenuButton("Exit to Menu", "pauseMenuExitToMenu();");
-   %this.addPauseMenuButton("Exit to Desktop", "pauseMenuExitToDesktop();"); 
-   
-   PauseMenuList.setAsActiveMenuList();
-   
-   $activeMenuButtonContainer-->button1.disable();
-   $activeMenuButtonContainer-->button2.disable();
-   $activeMenuButtonContainer-->button3.disable();
-   $activeMenuButtonContainer-->button4.set("btn_a", "", "OK", "PauseMenuList.activate();");
-   $activeMenuButtonContainer-->button5.set("btn_b", "Escape", "Back", "Canvas.popDialog();");
-}
-
-function PauseMenuButtons::addPauseMenuButton(%this, %buttonText, %buttonCallback)
-{
-   %newButton = new GuiButtonCtrl() {
-      text = %buttonText;
-      groupNum = "-1";
-      buttonType = "PushButton";
-      useMouseEvents = "0";
-      position = "0 0";
-      extent = "400 55";
-      minExtent = "8 2";
-      horizSizing = "right";
-      vertSizing = "bottom";
-      profile = "GuiMenuButtonProfile";
-      visible = "1";
-      active = "1";
-      command = %buttonCallback;
-      tooltipProfile = "GuiToolTipProfile";
-      hovertime = "1000";
-      isContainer = "0";
-      canSave = "1";
-      canSaveDynamicFields = "0";
-   };
-
-   PauseMenuList.add(%newButton);
-}
-function PauseMenu::onSleep(%this)
-{
-   if($Server::ServerType $= "SinglePlayer")
-   {
-      $timescale = 1;
-      sfxSetChannelVolume( $SimAudioType, $pref::SFX::channelVolume[ $SimAudioType ] );
-   }
-}
-
-function openPauseMenuOptions()
-{
-   PauseMenu.pushPage(OptionsMenu);
-}
-
-function pauseMenuExitToMenu()
-{
-   MessageBoxOKCancel("Exit?", "Do you wish to exit to the Main Menu?", "escapeFromGame();", "");
-}
-
-function pauseMenuExitToDesktop()
-{
-   MessageBoxOKCancel("Exit?", "Do you wish to exit to the desktop?", "quit();", "");
-}
-
-function PauseButtonHolder::onWake(%this)
-{
-
-   
-}

+ 0 - 4
Templates/BaseGame/game/data/UI/guis/recordingsDlg.asset.taml

@@ -1,4 +0,0 @@
-<GUIAsset
-    AssetName="recordingsDlg"
-    GUIFile="@assetFile=RecordingsDlg.gui"
-    VersionId="1"/>

BIN
Templates/BaseGame/game/data/UI/images/backdrop.png


+ 3 - 0
Templates/BaseGame/game/data/UI/images/backdrop_image.asset.taml

@@ -0,0 +1,3 @@
+<ImageAsset
+    AssetName="backdrop_image"
+    imageFile="@assetFile=backdrop.png"/>

+ 3 - 0
Templates/BaseGame/game/data/UI/images/textEditFrame_image.asset.taml

@@ -0,0 +1,3 @@
+<ImageAsset
+    AssetName="textEditFrame_image"
+    imageFile="@assetFile=textEditFrame.png"/>

+ 0 - 50
Templates/BaseGame/game/data/UI/scripts/guiTreeViewCtrl.tscript

@@ -1,50 +0,0 @@
-//-----------------------------------------------------------------------------
-// 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 GuiTreeViewCtrl::onDefineIcons( %this )
-{
-   %icons = "core/art/gui/images/treeview/default:" @
-            "core/art/gui/images/treeview/simgroup:" @
-            "core/art/gui/images/treeview/simgroup_closed:" @
-            "core/art/gui/images/treeview/simgroup_selected:" @
-            "core/art/gui/images/treeview/simgroup_selected_closed:" @      
-            "core/art/gui/images/treeview/hidden:" @      
-            "core/art/gui/images/treeview/shll_icon_passworded_hi:" @
-            "core/art/gui/images/treeview/shll_icon_passworded:" @      
-            "core/art/gui/images/treeview/default";
-              
-   %this.buildIconTable(%icons);   
-}
-
-function GuiTreeViewCtrl::handleRenameObject( %this, %name, %obj )
-{
-   %inspector = GuiInspector::findByObject( %obj );
-   
-   if( isObject( %inspector ) )   
-   {
-      %field = ( %this.renameInternal ) ? "internalName" : "name";      
-      %inspector.setObjectField( %field, %name );
-      return true;
-   }
-   
-   return false;   
-}

+ 0 - 90
Templates/BaseGame/game/data/UI/scripts/help.tscript

@@ -1,90 +0,0 @@
-//-----------------------------------------------------------------------------
-// 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 HelpDlg::onWake(%this)
-{
-   HelpFileList.entryCount = 0;
-   HelpFileList.clear();
-   for(%file = findFirstFile("*.hfl"); %file !$= ""; %file = findNextFile("*.hfl"))
-   {
-      HelpFileList.fileName[HelpFileList.entryCount] = %file;
-      HelpFileList.addRow(HelpFileList.entryCount, fileBase(%file));
-      HelpFileList.entryCount++;
-   }
-   HelpFileList.sortNumerical(0);
-   for(%i = 0; %i < HelpFileList.entryCount; %i++)
-   {
-      %rowId = HelpFileList.getRowId(%i);
-      %text = HelpFileList.getRowTextById(%rowId);
-      %text = %i + 1 @ ". " @ restWords(%text);
-      HelpFileList.setRowById(%rowId, %text);
-   }
-   HelpFileList.setSelectedRow(0);
-}
-
-function HelpFileList::onSelect(%this, %row)
-{
-   %fo = new FileObject();
-   %fo.openForRead(%this.fileName[%row]);
-   %text = "";
-   while(!%fo.isEOF())
-      %text = %text @ %fo.readLine() @ "\n";
-
-   %fo.delete();
-   HelpText.setText(%text);
-}
-
-function getHelp(%helpName)
-{
-   Canvas.pushDialog(HelpDlg);
-   if(%helpName !$= "")
-   {
-      %index = HelpFileList.findTextIndex(%helpName);
-      HelpFileList.setSelectedRow(%index);
-   }
-}
-
-function contextHelp()
-{
-   for(%i = 0; %i < Canvas.getCount(); %i++)
-   {
-      if(Canvas.getObject(%i).getName() $= HelpDlg)
-      {
-         Canvas.popDialog(HelpDlg);
-         return;
-      }
-   }
-   %content = Canvas.getContent();
-   %helpPage = %content.getHelpPage();
-   getHelp(%helpPage);
-}
-
-function GuiControl::getHelpPage(%this)
-{
-   return %this.helpPage;
-}
-
-function GuiMLTextCtrl::onURL(%this, %url)
-{
-   gotoWebPage( %url );
-}   
-

+ 0 - 729
Templates/BaseGame/game/data/UI/scripts/menuInputHandling.tscript

@@ -1,729 +0,0 @@
-//==============================================================================
-// Menu Input Buttons
-// This file manages the Menu Input Buttons stuff
-// Any time you have a GUI button that should be clickable AND map to a key input
-// such as a gamepad button, or enter, etc, this stuff can be used
-//==============================================================================
-/*
-Gamepad input reference for 360 controller
-btn_a = A
-btn_b = B
-btn_x = X
-btn_y = Y
-btn_r = Right Bumper
-btn_l = Right Bumper
-upov = Dpad Up
-dpov = Dpad Down
-lpov = Dpad Left
-rpov = Dpad Right
-xaxis = Left Stick | + values = up, - values = down
-yaxis = Left Stick | + values = up, - values = down
-rxaxis = Right Stick | + values = up, - values = down
-ryaxis = Right Stick | + values = up, - values = down
-zaxis = Left Trigger
-rzaxis = Right Trigger
-btn_start = Start
-btn_back = Back/Select
-*/
-
-//==============================================================================
-/// Summary:
-/// This is used with the main UI menu lists, when a non-axis input event is called
-/// such as pressing a button
-/// It is called from the engine
-/// 
-/// \param %device (string) The name of the device the input event is coming fromt
-/// \param %action (string) The specific key/input action
-/// \param %state (bool) The down/up state of the event sent
-function UIMenuButtonList::onInputEvent(%this, %device, %action, %state)
-{
-   if(%state)
-      $activeMenuButtonContainer.processInputs(%device, %action);
-}
-
-//==============================================================================
-/// Summary:
-/// This is used with the main UI menu lists, when an axis input event is called
-/// such as moving a joystick
-/// It is called from the engine
-/// 
-/// \param %device (string) The name of the device the input event is coming fromt
-/// \param %action (string) The specific key/input action
-/// \param %axisVal (float) The float value of the axis event
-function UIMenuButtonList::onAxisEvent(%this, %device, %action, %axisVal)
-{
-   //Skip out of the value is too low as it could just be noise or miscalibrated defaults
-   if(%axisVal < 0.02)
-      return;
-      
-   $activeMenuButtonContainer.processAxisEvent(%device, %action);
-}
-
-//==============================================================================
-/// Summary:
-/// Sets the command and text for the specified button. If %text and %command
-/// are left empty, the button will be disabled and hidden.
-///
-/// \param %gamepadButton (string) The button to set for when using gamepad input. See the input map reference comment at the top of the file
-/// \param %keyboardButton (string) The button to set for when using keyboard/mouse input.
-/// \param %text (string) The text to display next to the A button graphic.
-/// \param %command (string) The command executed when the A button is pressed.
-function MenuInputButton::set(%this, %gamepadButton, %keyboardButton, %text, %command)
-{
-   %this.setHidden(false);
-   
-   %set = (! ((%text $= "") && (%command $= "")));
-   
-   %this.gamepadButton = %gamepadButton;
-   %this.keyboardButton = %keyboardButton;
-   
-   if(%gamepadButton $= "")
-      %this.gamepadValid = false;
-   else
-      %this.gamepadValid = true;
-      
-   if(%keyboardButton $= "")
-      %this.kbmValid = false;
-   else
-      %this.kbmValid = true;
-
-   if((!%this.kbmValid && $activeControllerType !$= "gamepad") ||
-      (!%this.gamepadValid && $activeControllerType $= "gamepad"))
-      %set = false;
-      
-   %this.setText(%text);
-   %this.Command = %command;
-   
-   %this.refresh();
-}
-
-//==============================================================================
-/// Summary:
-/// Disables the MenuInputButton, marking it as not to consume inputs or display
-function MenuInputButton::disable(%this)
-{
-   %this.setText("");
-   %this.Command = "";
-   %this.setActive(false);
-   %this.setVisible(false);
-}
-
-//==============================================================================
-/// Summary:
-/// Refreshes the specific button, updating it's visbility status and the displayed input image
-function MenuInputButton::refresh(%this)
-{
-   %set = (! ((%this.text $= "") && (%this.command $= "")));
-   
-   //Do a check so if a MenuInput is selectively bound and we're not using the
-   //matched input type, then we skip
-   if((!%this.kbmValid && $activeControllerType !$= "gamepad") ||
-      (!%this.gamepadValid && $activeControllerType $= "gamepad"))
-      %set = false;
-      
-   %this.setActive(%set);
-   %this.setVisible(%set);
-   
-   if(!%this.isActive())
-      return;
-   
-   if($activeControllerType $= "gamepad")
-   {
-      if(%this.gamepadButton !$= "")
-      {
-         %assetId = "";
-         if($activeControllerName $= "PS4 Controller")
-         { 
-            %assetId = "UI:PS4_";
-            
-            if(%this.gamepadButton $= "btn_a")
-               %assetId = %assetId @ "Cross";
-            else if(%this.gamepadButton $= "btn_b")
-               %assetId = %assetId @ "Circle";
-            else if(%this.gamepadButton $= "btn_x")
-               %assetId = %assetId @ "Square";
-            else if(%this.gamepadButton $= "btn_y")
-               %assetId = %assetId @ "Triangle";
-            else if(%this.gamepadButton $= "btn_l")
-               %assetId = %assetId @ "L1";
-            else if(%this.gamepadButton $= "zaxis")
-               %assetId = %assetId @ "L2";
-            else if(%this.gamepadButton $= "btn_r")
-               %assetId = %assetId @ "R1";
-            else if(%this.gamepadButton $= "rzaxis")
-               %assetId = %assetId @ "R2";
-            else if(%this.gamepadButton $= "btn_start")
-               %assetId = %assetId @ "Options";
-            else if(%this.gamepadButton $= "btn_back")
-               %assetId = %assetId @ "Share";
-         }
-         else if($activeControllerName $= "Nintendo Switch Pro Controller")
-         {
-            %assetId = "UI:Switch_";
-            
-            if(%this.gamepadButton $= "btn_a")
-               %assetId = %assetId @ "B";
-            else if(%this.gamepadButton $= "btn_b")
-               %assetId = %assetId @ "A";
-            else if(%this.gamepadButton $= "btn_x")
-               %assetId = %assetId @ "Y";
-            else if(%this.gamepadButton $= "btn_y")
-               %assetId = %assetId @ "X";
-            else if(%this.gamepadButton $= "btn_l")
-               %assetId = %assetId @ "LB";
-            else if(%this.gamepadButton $= "zaxis")
-               %assetId = %assetId @ "LT";
-            else if(%this.gamepadButton $= "btn_r")
-               %assetId = %assetId @ "RB";
-            else if(%this.gamepadButton $= "rzaxis")
-               %assetId = %assetId @ "RT";
-            else if(%this.gamepadButton $= "btn_start")
-               %assetId = %assetId @ "Plus";
-            else if(%this.gamepadButton $= "btn_back")
-               %assetId = %assetId @ "Minus";
-         }
-         else if($activeControllerName !$= "")
-         {
-            %assetId = "UI:Xbox_";
-            
-            if(%this.gamepadButton $= "btn_a")
-               %assetId = %assetId @ "A";
-            else if(%this.gamepadButton $= "btn_b")
-               %assetId = %assetId @ "B";
-            else if(%this.gamepadButton $= "btn_x")
-               %assetId = %assetId @ "X";
-            else if(%this.gamepadButton $= "btn_y")
-               %assetId = %assetId @ "Y";
-            else if(%this.gamepadButton $= "btn_l")
-               %assetId = %assetId @ "LB";
-            else if(%this.gamepadButton $= "zaxis")
-               %assetId = %assetId @ "LT";
-            else if(%this.gamepadButton $= "btn_r")
-               %assetId = %assetId @ "RB";
-            else if(%this.gamepadButton $= "rzaxis")
-               %assetId = %assetId @ "RT";
-            else if(%this.gamepadButton $= "btn_start")
-               %assetId = %assetId @ "Menu";
-            else if(%this.gamepadButton $= "btn_back")
-               %assetId = %assetId @ "Windows";
-         }
-      } 
-   }
-   else
-   {
-      if(%this.keyboardButton !$= "")
-      {
-         %assetId = "UI:Keyboard_Black_" @ %this.keyboardButton;
-      }
-   }
-   
-   %this.setBitmap(%assetId @ "_image");
-
-   return true;
-}
-
-//==============================================================================
-/// Summary:
-/// Refreshes a menu input container, updating the buttons inside it
-function MenuInputButtonContainer::refresh(%this)
-{
-   %count = %this.getCount();
-   for(%i=0; %i < %count; %i++)
-   {
-      %btn = %this.getObject(%i);
-      
-      %btn.refresh();
-   }
-}
-
-//==============================================================================
-/// Summary:
-/// Sets the given MenuInputButtonContainer as the active one. This directs input events
-/// to it's buttons, ensures it's visible, and auto-hides the old active container if it was set
-function MenuInputButtonContainer::setActive(%this)
-{
-   if(isObject($activeMenuButtonContainer))
-      $activeMenuButtonContainer.hidden = true;
-      
-   $activeMenuButtonContainer = %this;
-   $activeMenuButtonContainer.hidden = false;
-   $activeMenuButtonContainer.refresh();
-}
-
-//==============================================================================
-/// Summary:
-/// Checks the input manager for if we have a gamepad active and gets it's name
-/// If we have one, also sets the active input type to gamepad
-function MenuInputButtonContainer::checkGamepad(%this)
-{
-   %controllerName = SDLInputManager::JoystickNameForIndex(0);
-   
-   $activeControllerName = %controllerName;
-   
-   if($activeControllerName $= "")
-      $activeControllerType = "K&M";
-   else
-      $activeControllerType = "gamepad";     
-}
-   
-   //==============================================================================
-/// Summary:
-/// This is called by the earlier inputs callback that comes from the menu list
-/// this allows us to first check what the input type is, and if the device is different
-/// (such as going from keyboard and mouse to gamepad) we can refresh the buttons to update
-/// the display
-/// Then we process the input to see if it matches to any of the button maps for our 
-/// MenuInputButtons. If we have a match, we execute it's command.
-///
-/// \param %device (string) The device that is causing the input event
-/// \param %action (string) The name of the input action
-function MenuInputButtonContainer::processInputs(%this, %device, %action)
-{
-   //check to see if our status has changed
-   %changed = false;
-   
-   %oldDevice = $activeControllerName;
-   
-   %deviceName = stripTrailingNumber(%device);
-   
-   if(%deviceName $= "keyboard" || %deviceName $= "mouse")
-   {
-      if($activeControllerName !$= "K&M")
-         %changed = true;
-         
-      $activeControllerName = "K&M";
-      $activeControllerType = "K&M";
-      Canvas.showCursor();
-   }
-   else
-   {
-      if(%this.checkGamepad())
-      {
-         Canvas.hideCursor();
-      }
-      
-      if($activeControllerType !$= %oldDevice)
-         %changed = true;
-   }
-   
-   if(%changed)
-      %this.refresh();
-      
-   //Now process the input for the button accelerator, if applicable
-   //Set up our basic buttons
-   for(%i=0; %i < %this.getCount(); %i++)
-   {
-      %btn = %this.getObject(%i);
-      
-      if(!%btn.isActive())
-         continue;
-      
-      if($activeControllerType !$= "K&M")
-      {
-         if(%btn.gamepadButton $= %action)
-         {
-            eval(%btn.command);
-         }
-      }
-      else
-      {
-         if(%btn.keyboardButton $= %action)
-         {
-            eval(%btn.command);
-         }
-      }
-   }
-}
-
-//==============================================================================
-/// Summary:
-/// This is called by the earlier inputs callback that comes from the menu list
-/// this allows us to first check what the input type is, and if the device is different
-/// (such as going from keyboard and mouse to gamepad) we can refresh the buttons to update
-/// the display
-/// 
-/// \param %device (string) The name of the device the input event is coming fromt
-/// \param %action (string) The specific key/input action
-/// \param %axisVal (float) The float value of the axis event
-function MenuInputButtonContainer::processAxisEvent(%this, %device, %action, %axisVal)
-{
-   //check to see if our status has changed
-   %changed = false;
-   
-   %oldDevice = $activeControllerName;
-   
-   %deviceName = stripTrailingNumber(%device);
-   
-   if(%deviceName $= "mouse")
-   {
-      if($activeControllerName !$= "K&M")
-         %changed = true;
-         
-      $activeControllerName = "K&M";
-      $activeControllerType = "K&M";
-      Canvas.showCursor();
-   }
-   else
-   {
-      if(%this.checkGamepad())
-      {
-         Canvas.hideCursor();
-      }
-      
-      if($activeControllerType !$= %oldDevice)
-         %changed = true;
-   }
-   
-   if(%changed)
-      %this.refresh();
-}
-
-//
-//
-function onSDLDeviceConnected(%sdlIndex, %deviceName, %deviceType)
-{
-   /*if(GamepadButtonsGui.checkGamepad())
-   {
-      GamepadButtonsGui.hidden = false;  
-   }*/
-}
-
-function onSDLDeviceDisconnected(%sdlIndex)
-{
-   /*if(!GamepadButtonsGui.checkGamepad())
-   {
-      GamepadButtonsGui.hidden = true;
-   }*/   
-}
-
-//==============================================================================
-// Menu Input processing
-// These functions manage the Menu input processing in general
-// Whenever a MenuInputHandler consumes an input event, it'll process them here
-// This'll let the active menu list be navigated, as well as buttons be processed
-// and ultimately handled by the Input Buttons above
-//==============================================================================
-//==============================================================================
-/// Summary:
-/// This is used with the main UI menu lists, when an axis input event is called
-/// such as moving a joystick
-/// It is called from the engine
-/// 
-/// \param %device (string) The name of the device the input event is coming fromt
-/// \param %action (string) The specific key/input action
-/// \param %axisVal (float) The float value of the axis event
-function MenuInputHandler::onAxisEvent(%this, %device, %action, %value)
-{
-   //this is to force a refresh of the menu
-   if(%value == 1 || %value == -1)
-      $activeMenuButtonContainer.processInputs(%device, %action);
-      
-   if(startsWith(%device, "mouse"))
-      return;   
-   
-   if((%action $= "upov" && %value > 0) || (%action $= "yaxis" && %value == -1))
-   {
-      $activeMenuList.navigateUp();
-   }
-   
-   if((%action $= "dpov" && %value > 0) || (%action $= "yaxis" && %value == 1))
-   {
-      $activeMenuList.navigateDown();
-   }
-   
-   //How we deal with the left and right navigation is dependant on the mode of the
-   //menu list
-   if($activeMenuListMode $= "Settings")
-   {
-      if((%action $= "lpov" && %value > 0) || (%action $= "xaxis" && %value == -1))
-      {
-         echo("Options menu nudged left!");
-         //$activeMenuList.navigateLeft();
-      }
-      
-      if((%action $= "rpov" && %value > 0) || (%action $= "xaxis" && %value == -1))
-      {
-         echo("Options menu nudged right!");
-         //$activeMenuList.navigateRight();
-      }
-   }
-   else
-   {
-      if((%action $= "lpov" && %value > 0) || (%action $= "xaxis" && %value == -1))
-      {
-         $activeMenuList.navigateLeft();
-      }
-      
-      if((%action $= "rpov" && %value > 0) || (%action $= "xaxis" && %value == -1))
-      {
-         $activeMenuList.navigateRight();
-      }
-   } 
-}
-
-//==============================================================================
-/// Summary:
-/// This is used with the main UI menu lists, when a non-axis input event is called
-/// such as pressing a button
-/// It is called from the engine
-/// 
-/// \param %device (string) The name of the device the input event is coming fromt
-/// \param %action (string) The specific key/input action
-/// \param %state (bool) The down/up state of the event sent
-function MenuInputHandler::onInputEvent(%this, %device, %action, %state)
-{
-   if(%action $= "upov" || %action $= "dpov" || %action $= "lpov" || %action $= "rpov")
-   {
-      %this.onAxisEvent(%device, %action, %state);
-      return;      
-   }
-   
-   if(%state)
-      $activeMenuButtonContainer.processInputs(%device, %action);
-}
-
-//==============================================================================
-// Menu List processing
-// These functions manage the navigation and activation of the Menu Lists
-//==============================================================================
-//==============================================================================
-/// Summary:
-/// Is the GUIContainer with this MenuList namespace the 'active' menulist as far
-/// as UI interfaces is concerned?
-function MenuList::isActiveMenuList(%this)
-{
-   if($activeMenuList == %this)
-      return true;
-   
-   return false;
-}
-
-//==============================================================================
-/// Summary:
-/// Sets the GUIContainer with this MenuList namespace as the active menulist.
-/// This means that any input events caught in MenuInputHandlers is directed at
-/// this menu list to navigate it
-///
-/// \param %startPosition (Point2F) The X and Y starting positions of the selection for this menuList
-/// \param %menuMode (string) Indicates the mode/type of menuList, allowing for special behaviors depending on type
-function MenuList::setAsActiveMenuList(%this, %startPosition, %menuMode)
-{
-   if(%startPosition $= "")
-      %startPosition = "0 0";
-      
-   if(%menuMode $= "")
-      %menuMode = "Menu";
-         
-   $activeMenuList = %this;
-   $activeMenuList.hidden = false; 
-   $activeMenuList.ListPosition = %startPosition;
-   $activeMenuListMode = %menuMode;
-   
-   %this.refresh();
-}
-
-//==============================================================================
-/// Summary:
-/// Activates the currently highlighted child object
-function MenuList::activate(%this)
-{
-   //check for a highlighted element
-   if($activeMenuList.ListPosition.y > -1 && $activeMenuList.ListPosition < $activeMenuList.getCount())
-   {
-      %btn = $activeMenuList.getObject($activeMenuList.ListPosition.y);
-      %btn.performClick();
-   }
-}
-
-//==============================================================================
-/// Summary:
-/// refreshes the menuList, updating children highlight status and if there is
-/// a button pointer control defined on our list, we update it's position as 
-/// needed
-function MenuList::refresh(%this)
-{
-   %selectedObject = -1;
-   for(%i=0; %i < $activeMenuList.getCount(); %i++)
-   {
-      %btn = $activeMenuList.getObject(%i);
-      
-      %isSelected = %i == $activeMenuList.ListPosition.y;
-      
-      %btn.setHighlighted(%isSelected);
-      
-      if(%isSelected)
-         %selectedObject = %i;
-   }
-   
-   if(isObject(%this.buttonPointerCtrl))
-   {
-      if(%selectedObject != -1)
-      {
-         %this.buttonPointerCtrl.setHidden(false);
-         
-         %buttonCenter = $activeMenuList.getObject(%selectedObject).getGlobalCenter();
-         
-         if(%this.centerButtonPointerCtrl)
-         {
-            %this.buttonPointerCtrl.setCenter(%buttonCenter.x, %buttonCenter.y);
-         }
-         else
-         {
-            //if we're not centering, then left-justify
-            %this.buttonPointerCtrl.setCenter(%buttonCenter.x - $activeMenuList.getObject(%selectedObject).extent.x / 2, %buttonCenter.y);  
-         }
-      }
-      else
-      {
-         %this.buttonPointerCtrl.setHidden(true);
-      }
-   }
-   
-   if($activeMenuList.isMethod("onNavigate"))
-      $activeMenuList.onNavigate($activeMenuList.ListPosition.y);
-   
-   %parent = $activeMenuList.getParent();
-   if(%parent.getClassName() $= "GuiScrollCtrl")
-   {
-      %parent.scrollToObject(%selectedObject);
-   }
-}
-
-//==============================================================================
-/// Summary:
-/// Selects the next 'up' child item in the menuList. If the current is the topmost
-/// then nothing happens
-function MenuList::navigateUp(%this)
-{
-   $activeMenuList.ListPosition.y -= 1;
-   if($activeMenuList.ListPosition.y < 0)
-      $activeMenuList.ListPosition.y = 0;
-      
-   %this.refresh();
-}
-
-//==============================================================================
-/// Summary:
-/// Selects the next 'down' child item in the menuList. If the current is the bottommost
-/// then nothing happens
-function MenuList::navigateDown(%this)
-{
-   $activeMenuList.ListPosition.y += 1;
-   if($activeMenuList.ListPosition.y >= $activeMenuList.getCount())
-      $activeMenuList.ListPosition.y = $activeMenuList.getCount()-1;
-      
-   %this.refresh();
-}
-
-//==============================================================================
-/// Summary:
-/// Selects the next 'left' child item in the menuList. If the current item is the leftmost
-/// then nothing happens
-function MenuList::navigateLeft()
-{
-   //Atm, we're only handling specific control types, namely options entries, but
-   //this could readily be expanded upon to handle grids like for inventory screens
-   //or the like
-    
-   %btn = $activeMenuList.getObject($activeMenuList.ListPosition.y);
-   if(%btn.getClassName() $= "GuiGameSettingsCtrl" && %btn.isEnabled())
-   {
-      %mode = %btn.getMode();
-      if(%mode == 0) //options list
-      {
-         %optionId = %btn.getCurrentOptionIndex() - 1;
-         %btn.selectOptionByIndex(%optionId);
-         %btn.onChange();
-      }
-      else if(%mode == 1) //slider
-      {
-         %value = %btn.getValue();
-         %adjustedValue = %value - %btn.getIncrement();
-         %minValue = %btn.getRange().x;
-         if(%adjustedValue < %minValue)
-            %adjustedValue = %minValue;
-            
-         %btn.setValue(%adjustedValue);
-         %btn.onChange();
-      }
-   }
-}
-
-//==============================================================================
-/// Summary:
-/// Selects the next 'right' child item in the menuList. If the current item is the rightmost
-/// then nothing happens
-function MenuList::navigateRight()
-{
-   %btn = $activeMenuList.getObject($activeMenuList.ListPosition.y);
-   if(%btn.getClassName() $= "GuiGameSettingsCtrl" && %btn.isEnabled())
-   {
-      %mode = %btn.getMode();
-      if(%mode == 0) //options list
-      {
-         %optionId = %btn.getCurrentOptionIndex() + 1;
-         %btn.selectOptionByIndex(%optionId);
-         %btn.onChange();
-      }
-      else if(%mode == 1) //slider
-      {
-         %value = %btn.getValue();
-         %adjustedValue = %value + %btn.getIncrement();
-         %maxValue = %btn.getRange().y;
-         if(%adjustedValue > %maxValue)
-            %adjustedValue = %maxValue;
-            
-         %btn.setValue(%adjustedValue);
-         %btn.onChange();
-      }
-   }
-}
-
-//==============================================================================
-/// Summary:
-/// Gets the current vertical positionally selected child object
-function MenuList::getActiveRow(%this)
-{
-   return $activeMenuList.ListPosition.y;
-}
-
-//==============================================================================
-/// Summary:
-/// Called from the engine when a GUIButtonBase-derived class with MenuListButton namespace class
-/// has its highlighting status changed. Allows us to react to this change of state and trigger refreshse
-/// or other events to keep the navigation tracking up to date
-///
-/// \param %state (bool) The on/off state of the button being highlighted
-function MenuListButton::onHighlighted(%this, %state)
-{
-   echo("MenuListButton::onHighlighted() - " @ %this.internalName @ " was " @ %state @ " highlighted");
-   %parentContainer = %this.getParent();
-   if(%parentContainer.class $= "MenuList" || %parentContainer.superClass $= "MenuList")
-   {
-      if(isObject(%parentContainer.buttonPointerCtrl))
-      {
-         if(%state)
-         {
-	         %parentContainer.buttonPointerCtrl.setHidden(false);
-	         
-	         %buttonCenter = %this.getGlobalCenter();
-            echo("   - button center:" @ %buttonCenter);
-	         
-	         if(%parentContainer.centerButtonPointerCtrl)
-	         {
-	               %parentContainer.buttonPointerCtrl.setGlobalCenter(%buttonCenter.x, %buttonCenter.y);
-	         }
-	         else
-	         {
-	            //if we're not centering, then left-justify
-	            %parentContainer.buttonPointerCtrl.setGlobalCenter(%buttonCenter.x - %this.extent.x / 2, %buttonCenter.y);  
-	         }
-            echo("   - pointer position:" @ %parentContainer.buttonPointerCtrl.getPosition());
-	      }
-         /*else
-      {
-         %parentContainer.buttonPointerCtrl.setHidden(true);
-         }*/
-      }
-   }
-}

+ 0 - 308
Templates/BaseGame/game/data/UI/scripts/menuNavigation.tscript

@@ -1,308 +0,0 @@
-//==============================================================================
-/// Summary:
-/// This function sets the root page for the navigation stack. The root page is 'below'
-/// all other normal pages and cannot be popped like a normal page.
-/// When we set a new root page, we first check if we have an existing root page.
-/// If we do, we run the usual canClose() then onClose() function pair, then we 
-/// set it and call the onOpen() for the new root page.
-/// 
-/// \param %rootPage (guiControl) The new guiControl that is being set as the root page of the navigation stack
-function UINavigation::setRootPage(%this, %rootPage)
-{
-   if(!isObject(%this.pageStack))
-   {
-      %this.pageStack = new ArrayObject();  
-   }
-   
-   if(%this.rootPage $= %rootPage)
-      return;
-   
-   if(isObject(%this.rootPage))
-   {
-      %canClose = true;
-      if(%this.rootPage.isMethod("canClose"))
-         %canClose = %this.rootPage.call("canClose");
-         
-      if(!%canClose)
-         return; //if we're not allowed to close, just bail out wholesale because clearly 
-                  //something is blocking changes to pages
-         
-      %this.remove(%this.rootPage);
-      if(%this.rootPage.isMethod("onClose"))
-         %this.rootPage.call("onClose");
-         
-      %this.rootPage.navigation = "";
-   }
-      
-   %this.rootPage = %rootPage;
-   
-   %this.add(%rootPage);
-   if(%this.resizePages)
-   {
-      %rootPage.resize(%this.position.x, %this.position.y, 
-         %this.extent.x, %this.extent.y);
-   }
-   %rootPage.navigation = %this;
-   
-   if(%rootPage.isMethod("onOpen"))
-      %rootPage.call("onOpen");
-}
-
-//==============================================================================
-/// Summary:
-/// This function pushes a page onto the given UINavigation-classed GUIContainer's stack
-/// The order of operations is thus:
-/// 1) check to see if the new page being pushed says it can open via the canOpen() function. 
-///    If this method is not defined, it defaults to true, as there's no impediment to continuing
-///    If this check returns false, the pushPage event cancels.
-/// 2) check to see if the current page on the stack says it can close. Similar to 
-///    the canOpen() check on the new page, we default to true
-///    If this check returns false, the pushPage event cancels.
-/// 3) Call - if defined - onClose() on the current top page of the stack
-/// 4) Add the new page onto the stack
-/// 5) Call - if defined - onOpen() on the new page
-/// 6) Finally, if we defined a callback, call that.
-/// With this all run, the previous top page has done any cleanup work it needed to
-/// and the new top page has been opened successfully.
-/// 
-/// \param %newPage (guiControl) The new guiControl that is being added onto the page stack
-/// \param %callback[optional]: (Evaluable string) A evalable statement to invoke when the push has been completed
-function UINavigation::pushPage(%this, %newPage, %callback)
-{
-   if(!isObject(%this.pageStack))
-   {
-      %this.pageStack = new ArrayObject();
-   }
-   
-   //don't re-add pages
-   if(%this.getPageCount() != 0 && 
-      %this.pageStack.getIndexFromKey(%newPage) != -1)
-      return;
-   
-   %canChange = true;
-   if(%newPage.isMethod("canOpen"))
-      %canChange = %newPage.call("canOpen");
-      
-   if(!%canChange)
-      return;
-      
-   %currentPage = %this.getCurrentPage();
-   if(isObject(%currentPage))
-   {
-      if(%currentPage.isMethod("canClose"))
-         %canChange = %currentPage.call("canClose");
-         
-      if(!%canChange)
-         return;
-         
-      if(%currentPage.isMethod("onClose"))
-         %currentPage.call("onClose");
-   }
-   
-   %this.pageStack.push_back(%newPage);
-   %this.add(%newPage);
-   if(%this.resizePages)
-   {
-      %newPage.resize(%this.position.x, %this.position.y, 
-         %this.extent.x, %this.extent.y);
-   }
-   
-   if(%newPage.isMethod("onOpen"))
-      %newPage.call("onOpen");
-   
-   %newPage.navigation = %this;
-   
-   if(%callback !$= "")
-   eval(%callback);
-}
-
-//==============================================================================
-/// Summary:
-/// This function pops the topmost page off the given UINavigation-classed GUIContainer's stack
-/// The order of operations is thus:
-/// 1) check to see if the top page being popped says it can close via the canClose() function. 
-///    If this method is not defined, it defaults to true, as there's no impediment to continuing
-///    If this check returns false, the popPage event cancels.
-/// 2) check to see if the previous page on the stack says it can open. Similar to 
-///    the canClose() check on the new page, we default to true
-///    If this check returns false, the popPage event cancels.
-/// 3) Call - if defined - onClose() on the current top page of the stack
-/// 4) Remove the top page
-/// 5) Call - if defined - onOpen() on the now topmost page
-/// 6) Finally, if we defined a callback, call that.
-/// With this all run, the previous top page has done any cleanup work it needed to
-/// and the new top page has been opened successfully.
-/// 
-/// \param %callback[optional] (Evaluable string) A evalable statement to invoke when the pop has been completed
-function UINavigation::popPage(%this, %callback)
-{
-   if(%this.pageStack.count() == 0)
-      return;
-      
-   %currentPage = %this.getCurrentPage();
-   if(isObject(%currentPage))
-   {
-      %canChange = true;
-      if(%currentPage.isMethod("canClose"))
-         %canChange = %currentPage.call("canClose");
-         
-      if(!%canChange)
-         return;
-   }
-   
-   %prevPage = %this.getPreviousPage();
-   if(isObject(%prevPage))
-   {
-      %canChange = true;
-      if(%prevPage.isMethod("canOpen"))
-         %canChange = %prevPage.call("canOpen");
-         
-      if(!%canChange)
-         return;
-   }
-      
-   if(isObject(%currentPage))
-   {
-      if(%currentPage.isMethod("onClose"))
-      {
-         %currentPage.call("onClose");
-      }    
-      
-      %this.pageStack.pop_back();
-      %this.remove(%currentPage);
-      
-      %currentPage.navigation = "";
-   }
-   
-   %newTopPage = %this.getCurrentPage();
-   if(isObject(%newTopPage))
-   {
-   	  if(%newTopPage.isMethod("onOpen"))
-         %newTopPage.call("onOpen");
-   }
-   
-   if(%callback !$= "")
-   eval(%callback);
-}
-
-//==============================================================================
-/// Summary:
-/// In order tops the topmost page in a loop until it has closed the entire stack,
-/// leaving only the root page
-/// 
-/// \param %callback[optional] (Evaluable String) A evalable statement to invoke when the pop has been completed
-function UINavigation::popToRoot(%this, %callback)
-{
-   %pageChanged = false;
-   while(%this.getPageCount() != 0)
-   {
-      %currentPage = %this.getCurrentPage();
-      if(isObject(%currentPage))
-      {
-         if(%currentPage.isMethod("canClose"))
-            %canChange = %currentPage.call("canClose");
-            
-         if(!%canChange)
-            return;
-      }
-      
-      %prevPage = %this.getPreviousPage();
-      if(isObject(%prevPage))
-      {
-         if(%prevPage.isMethod("canOpen"))
-            %canChange = %prevPage.call("canOpen");
-            
-         if(!%canChange)
-            return;
-      }
-         
-      if(isObject(%currentPage))
-      {
-         if(%currentPage.isMethod("onClose"))
-         {
-            %currentPage.call("onClose");
-         }    
-
-         %this.pageStack.pop_back();
-         %this.remove(%currentPage);
-         
-         %currentPage.navigation = "";
-      }
-      
-      %newTopPage = %this.getCurrentPage();
-      if(%newTopPage.isMethod("onOpen"))
-         %newTopPage.call("onOpen");
-         
-      %pageChanged = true;
-   }
-   
-   if(%pageChanged && %callback !$= "")
-      eval(%callback);
-}
-
-//==============================================================================
-/// Summary:
-/// Gets the current, topmost page on the stack. If no non-root pages are on the stack
-/// the root page is returned
-function UINavigation::getCurrentPage(%this)
-{
-   if(isObject(%this.pageStack) && %this.pageStack.count() != 0)
-   {
-      return %this.pageStack.getKey(%this.pageStack.count()-1);
-   }
-   else
-   {
-      if(isObject(%this.rootPage))
-         return %this.rootPage;
-   }
-   
-   return 0;
-}
-
-//==============================================================================
-/// Summary:
-/// Gets the page just under the topmost page in the stack. If there is no previous page
-/// then the root page is returned
-function UINavigation::getPreviousPage(%this)
-{
-   if(isObject(%this.pageStack) && %this.pageStack.count() > 1)
-   {
-      return %this.pageStack.getKey(%this.pageStack.count()-2);
-   }
-   else
-   {
-      if(isObject(%this.rootPage))
-         return %this.rootPage;
-   }
-   
-   return 0;
-}   
-
-//==============================================================================
-/// Summary:
-/// Gets the number of pages on the stack.
-function UINavigation::getPageCount(%this)
-{
-   %count = 0;
-   if(isObject(%this.pageStack))
-      %count = %this.pageStack.count();
-      
-   if(isObject(%this.rootPage))
-      %count++;
-      
-   return %count;
-}
-
-//==============================================================================
-/// Summary:
-/// Force the page to reprocess to ensure it's status is up to date
-function UINavigation::refreshPage(%this)
-{
-   %page = %this.getCurrentPage();
-   if(!isObject(%page))
-      return;
-      
-   if(%page.isMethod("onOpen"))
-      %page.call("onOpen");
-}
-

+ 0 - 341
Templates/BaseGame/game/data/UI/scripts/messageBoxes.tscript

@@ -1,341 +0,0 @@
-//-----------------------------------------------------------------------------
-// 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.
-//-----------------------------------------------------------------------------
-
-// --------------------------------------------------------------------
-// Message Sound
-// --------------------------------------------------------------------
-/*new SFXDescription(MessageBoxAudioDescription)
-{
-   volume      = 1.0;
-   isLooping   = false;
-   is3D        = false;
-   channel     = $GuiAudioType;
-};
-
-new SFXProfile(messageBoxBeep)
-{
-   filename    = "./messageBoxSound";
-   description = MessageBoxAudioDescription;
-   preload     = true;
-};*/
-
-//---------------------------------------------------------------------------------------------
-// messageCallback
-// Calls a callback passed to a message box.
-//---------------------------------------------------------------------------------------------
-function messageCallback(%dlg, %callback)
-{
-   Canvas.popDialog(%dlg);
-   eval(%callback);
-}
-
-//---------------------------------------------------------------------------------------------
-// MBSetText
-// Sets the text of a message box and resizes it to accomodate the new string.
-//---------------------------------------------------------------------------------------------
-function MBSetText(%text, %frame, %msg)
-{
-   // Get the extent of the text box.
-   %ext = %text.getExtent();
-   // Set the text in the center of the text box.
-   %text.setText("<just:center>" @ %msg);
-   // Force the textbox to resize itself vertically.
-   %text.forceReflow();
-   // Grab the new extent of the text box.
-   %newExtent = %text.getExtent();
-
-   // Get the vertical change in extent.
-   %deltaY = getWord(%newExtent, 1) - getWord(%ext, 1);
-   
-   // Resize the window housing the text box.
-   %windowPos = %frame.getPosition();
-   %windowExt = %frame.getExtent();
-   %frame.resize(getWord(%windowPos, 0), getWord(%windowPos, 1) - (%deltaY / 2),
-                 getWord(%windowExt, 0), getWord(%windowExt, 1) + %deltaY);
-                 
-   %frame.canMove = "0";
-   //%frame.canClose = "0";
-   %frame.resizeWidth = "0";
-   %frame.resizeHeight = "0";
-   %frame.canMinimize = "0";
-   %frame.canMaximize = "0";
-   
-   //sfxPlayOnce( messageBoxBeep );
-}
-
-function MessageBoxCtrl::onWake(%this)
-{
-}
-
-//---------------------------------------------------------------------------------------------
-// Various message box display functions. Each one takes a window title, a message, and a
-// callback for each button.
-//---------------------------------------------------------------------------------------------
-
-//MessageBoxOK("Test", "This is a test message box", "echo(\"Uhhhhhawhat?\"");
-function MessageBoxOK(%title, %message, %callback)
-{
-   Canvas.pushDialog(MessageBoxDlg);
-   MessageBoxTitleText.text = %title;
-   
-   MessageBoxOCButtonHolder.hidden = true;
-   MessageBoxYNCButtonHolder.hidden = true;
-   MessageBoxOKButtonHolder.hidden = false;
-   
-   MessageBoxOKButtonHolder-->OKButton.set("btn_a", "Return", "OK", "MessageCallback(MessageBoxDlg,MessageBoxDlg.callback);");
-   
-   MessageBoxCtrl.originalMenuInputContainer = $activeMenuButtonContainer;
-   MessageBoxOKButtonHolder.setActive();
-   
-   MBSetText(MessageBoxText, MessageBoxCtrl, %message);
-   MessageBoxDlg.callback = %callback;
-}
-
-function MessageBoxOKDlg::onSleep( %this )
-{
-   %this.callback = "";
-   MessageBoxCtrl.originalMenuInputContainer.setActive();
-}
-
-function MessageBoxOKCancel(%title, %message, %callback, %cancelCallback, %okLabelOverride, %cancelLabelOverride)
-{
-   Canvas.pushDialog(MessageBoxDlg);
-   MessageBoxTitleText.text = %title;
-   
-   MessageBoxOCButtonHolder.hidden = false;
-   MessageBoxYNCButtonHolder.hidden = true;
-   MessageBoxOKButtonHolder.hidden = true;
-   
-   if(%okLabelOverride $= "")
-      %okLabel = "OK";
-   else
-      %okLabel = %okLabelOverride;
-      
-   if(%cancelLabelOverride $= "")
-      %cancelLabel = "Cancel";
-   else
-      %cancelLabel = %cancelLabelOverride;
-   
-   MessageBoxOCButtonHolder-->OKButton.set("btn_a", "Return", %okLabel, "MessageCallback(MessageBoxDlg,MessageBoxDlg.callback);");
-   MessageBoxOCButtonHolder-->CancelButton.set("btn_b", "Escape", %cancelLabel, "MessageCallback(MessageBoxDlg,MessageBoxDlg.cancelCallback);");
-
-   MessageBoxCtrl.originalMenuInputContainer = $activeMenuButtonContainer;
-   MessageBoxOCButtonHolder.setActive();
-   
-   MBSetText(MessageBoxText, MessageBoxCtrl, %message);
-   MessageBoxDlg.callback = %callback;
-   MessageBoxDlg.cancelCallback = %cancelCallback;
-}
-
-function MessageBoxOKCancelDlg::onSleep( %this )
-{
-   %this.callback = "";
-   MessageBoxCtrl.originalMenuInputContainer.setActive();
-}
-
-function MessageBoxOKCancelDetails(%title, %message, %details, %callback, %cancelCallback)
-{   
-   if(%details $= "")
-   {
-      MBOKCancelDetailsButton.setVisible(false);
-   }
-   
-   MBOKCancelDetailsScroll.setVisible(false);
-   
-   MBOKCancelDetailsFrame.setText( %title );
-   
-   Canvas.pushDialog(MessageBoxOKCancelDetailsDlg);
-   MBSetText(MBOKCancelDetailsText, MBOKCancelDetailsFrame, %message);
-   MBOKCancelDetailsInfoText.setText(%details);
-   
-   %textExtent = MBOKCancelDetailsText.getExtent();
-   %textExtentY = getWord(%textExtent, 1);
-   %textPos = MBOKCancelDetailsText.getPosition();
-   %textPosY = getWord(%textPos, 1);
-      
-   %extentY = %textPosY + %textExtentY + 65;
-   
-   MBOKCancelDetailsInfoText.setExtent(285, 128);
-   
-   MBOKCancelDetailsFrame.setExtent(300, %extentY);
-   
-   MessageBoxOKCancelDetailsDlg.callback = %callback;
-   MessageBoxOKCancelDetailsDlg.cancelCallback = %cancelCallback;
-   
-   MBOKCancelDetailsFrame.defaultExtent = MBOKCancelDetailsFrame.getExtent();
-}
-
-function MBOKCancelDetailsToggleInfoFrame()
-{
-   if(!MBOKCancelDetailsScroll.isVisible())
-   {
-      MBOKCancelDetailsScroll.setVisible(true);
-      MBOKCancelDetailsText.forceReflow();
-      %textExtent = MBOKCancelDetailsText.getExtent();
-      %textExtentY = getWord(%textExtent, 1);
-      %textPos = MBOKCancelDetailsText.getPosition();
-      %textPosY = getWord(%textPos, 1);
-      
-      %verticalStretch = %textExtentY;
-      
-      if((%verticalStretch > 260) || (%verticalStretch < 0))
-        %verticalStretch = 260;
-      
-      %extent = MBOKCancelDetailsFrame.defaultExtent;
-      %height = getWord(%extent, 1);
-      
-      %posY = %textPosY + %textExtentY + 10;
-      %posX = getWord(MBOKCancelDetailsScroll.getPosition(), 0);
-      MBOKCancelDetailsScroll.setPosition(%posX, %posY);
-      MBOKCancelDetailsScroll.setExtent(getWord(MBOKCancelDetailsScroll.getExtent(), 0), %verticalStretch);
-      MBOKCancelDetailsFrame.setExtent(300, %height + %verticalStretch + 10);    
-   } else
-   {
-      %extent = MBOKCancelDetailsFrame.defaultExtent;
-      %width = getWord(%extent, 0);
-      %height = getWord(%extent, 1);
-      MBOKCancelDetailsFrame.setExtent(%width, %height);
-      MBOKCancelDetailsScroll.setVisible(false);
-   }
-}
-
-function MessageBoxOKCancelDetailsDlg::onSleep( %this )
-{
-   %this.callback = "";
-   MessageBoxCtrl.originalMenuInputContainer.setActive();
-}
-
-function MessageBoxYesNo(%title, %message, %yesCallback, %noCallback)
-{
-   Canvas.pushDialog(MessageBoxDlg);
-   MessageBoxTitleText.text = %title;
-   
-   MessageBoxOCButtonHolder.hidden = false;
-   MessageBoxYNCButtonHolder.hidden = true;
-   MessageBoxOKButtonHolder.hidden = true;
-   
-   MessageBoxOCButtonHolder-->OKButton.set("btn_a", "Return", "Yes", "MessageCallback(MessageBoxDlg,MessageBoxDlg.yesCallBack);");
-   MessageBoxOCButtonHolder-->CancelButton.set("btn_b", "Escape", "No", "MessageCallback(MessageBoxDlg,MessageBoxDlg.noCallback);");
-   
-   MessageBoxCtrl.originalMenuInputContainer = $activeMenuButtonContainer;
-   MessageBoxOCButtonHolder.setActive();
-   
-   MBSetText(MessageBoxText, MessageBoxCtrl, %message);
-   MessageBoxDlg.yesCallBack = %yesCallback;
-   MessageBoxDlg.noCallback = %noCallback;
-}
-
-function MessageBoxYesNoCancel(%title, %message, %yesCallback, %noCallback, %cancelCallback)
-{
-   Canvas.pushDialog(MessageBoxDlg);
-   MessageBoxTitleText.text = %title;
-   
-   MessageBoxOCButtonHolder.hidden = true;
-   MessageBoxYNCButtonHolder.hidden = false;
-   MessageBoxOKButtonHolder.hidden = true;
-   
-   MessageBoxYNCButtonHolder-->yesButton.set("btn_a", "Return", "Yes", "MessageCallback(MessageBoxDlg,MessageBoxDlg.yesCallBack);");
-   MessageBoxYNCButtonHolder-->noButton.set("btn_x", "backspace", "No", "MessageCallback(MessageBoxDlg,MessageBoxDlg.noCallback);");
-   MessageBoxYNCButtonHolder-->cancelButton.set("btn_b", "Escape", "No", "MessageCallback(MessageBoxDlg,MessageBoxDlg.cancelCallback);");
-   
-   MessageBoxCtrl.originalMenuInputContainer = $activeMenuButtonContainer;
-   MessageBoxYNCButtonHolder.setActive();
-   
-   MBSetText(MessageBoxText, MessageBoxCtrl, %message);
-   MessageBoxDlg.yesCallBack = %yesCallback;
-   MessageBoxDlg.noCallback = %noCallback;
-   MessageBoxDlg.cancelCallback = %cancelCallback;
-}
-
-function MessageBoxDlg::onSleep( %this )
-{
-   %this.callback = "";
-   %this.cancelCallback = "";
-   %this.yesCallback = "";
-   %this.noCallback = "";
-   %this.cancelCallback = "";
-   MessageBoxCtrl.originalMenuInputContainer.setActive();
-}
-
-//---------------------------------------------------------------------------------------------
-// MessagePopup
-// Displays a message box with no buttons. Disappears after %delay milliseconds.
-//---------------------------------------------------------------------------------------------
-function MessagePopup(%title, %message, %delay)
-{
-   Canvas.pushDialog(MessageBoxDlg);
-   MessageBoxTitleText.text = %title;
-   MBSetText(MessageBoxText, MessageBoxCtrl, %message);
-
-   if (%delay !$= "")
-      schedule(%delay, 0, CloseMessagePopup);
-}
-
-function CloseMessagePopup()
-{
-   Canvas.popDialog(MessageBoxDlg);
-}
-
-//---------------------------------------------------------------------------------------------
-// IODropdown
-// By passing in a simgroup or simset, the user will be able to choose a child of that group
-// through a guiPopupMenuCtrl
-//---------------------------------------------------------------------------------------------
-
-function IODropdown(%title, %message, %simgroup, %callback, %cancelCallback)
-{
-   IODropdownFrame.text = %title;
-   Canvas.pushDialog(IODropdownDlg);
-   MBSetText(IODropdownText, IODropdownFrame, %message);
-   
-   if(isObject(%simgroup))
-   {
-      for(%i = 0; %i < %simgroup.getCount(); %i++)
-         IODropdownMenu.add(%simgroup.getObject(%i).getName());
-      
-   }
-   
-   IODropdownMenu.sort();
-   IODropdownMenu.setFirstSelected(0);
-   
-   IODropdownDlg.callback = %callback;
-   IODropdownDlg.cancelCallback = %cancelCallback;
-}
-
-function IODropdownDlg::onSleep( %this )
-{
-   %this.callback = "";
-   %this.cancelCallback = "";
-   IODropdownMenu.clear();
-}
-
-//The # in the function passed replaced with the output 
-//of the preset menu.
-function IOCallback(%dlg, %callback)
-{
-   %id = IODropdownMenu.getSelected();
-   %text = IODropdownMenu.getTextById(%id);
-   %callback = strreplace(%callback, "#", %text); 
-   eval(%callback);
-   
-   Canvas.popDialog(%dlg);
-}

+ 105 - 96
Templates/BaseGame/game/data/UI/scripts/profiles.tscript

@@ -1,8 +1,10 @@
 $TextMediumEmphasisColor = "200 200 200";
+$TextMediumEmphasisColorHL = "0 0 0";
 $TextHighEmphasisColor = "224 224 224";
+$TextHighEmphasisColorHL = "0 0 0";
 $TextDisabledColor = "108 108 108";
 
-new GuiGameListMenuProfile(DefaultListMenuProfile)
+singleton GuiGameListMenuProfile(DefaultListMenuProfile)
 {
    fontType = "Arial Bold";
    fontSize = 20;
@@ -26,12 +28,12 @@ new GuiGameListMenuProfile(DefaultListMenuProfile)
    canKeyFocus = true;
 };
 
-new GuiControlProfile(GamepadDefaultProfile)
+singleton GuiControlProfile(GamepadDefaultProfile)
 {
    border = 0;
 };
 
-new GuiControlProfile(GamepadButtonTextLeft)
+singleton GuiControlProfile(GamepadButtonTextLeft)
 {
    fontType = "Arial Bold";
    fontSize = 20;
@@ -39,20 +41,26 @@ new GuiControlProfile(GamepadButtonTextLeft)
    justify = "left";
 };
 
-new GuiControlProfile(GamepadButtonTextRight : GamepadButtonTextLeft)
+singleton GuiControlProfile(GamepadButtonTextRight : GamepadButtonTextLeft)
 {
    justify = "right";
 };
 
-new GuiControlProfile(MenuHeaderText)
+singleton GuiControlProfile(MenuHeaderText)
 {
    fontType = "Arial Bold";
    fontSize = 30;
    fontColor = $TextHighEmphasisColor;
    justify = "left";
+   modal = false;
+};
+
+singleton GuiControlProfile(MenuHeaderTextHighlighted : MenuHeaderText)
+{
+   fontColor = $TextHighEmphasisColorHL;
 };
 
-new GuiControlProfile(MenuHeaderTextCenter)
+singleton GuiControlProfile(MenuHeaderTextCenter)
 {
    fontType = "Arial Bold";
    fontSize = 30;
@@ -60,15 +68,26 @@ new GuiControlProfile(MenuHeaderTextCenter)
    justify = "center";
 };
 
-new GuiControlProfile(MenuSubHeaderText)
+singleton GuiControlProfile(MenuSubHeaderText)
 {
    fontType = "Arial Bold";
    fontSize = 20;
    fontColor = $TextMediumEmphasisColor;
    justify = "left";
+   modal = false;
+};
+
+singleton GuiControlProfile(MenuSubHeaderTextHighlighted : MenuSubHeaderText)
+{
+   fontColor = $TextMediumEmphasisColorHL;
 };
 
-new GuiControlProfile(MenuMLSubHeaderText)
+singleton GuiControlProfile(MenuSubHeaderCenteredText : MenuSubHeaderText)
+{
+   justify = "center";
+};
+
+singleton GuiControlProfile(MenuMLSubHeaderText)
 {
    fontType = "Arial Bold";
    fontSize = 20;
@@ -76,15 +95,21 @@ new GuiControlProfile(MenuMLSubHeaderText)
    justify = "left";
    autoSizeWidth = true;
    autoSizeHeight = true;  
+   modal = false;
 };
 
-new GuiControlProfile(MenuMLSubHeaderTextCenter : MenuMLSubHeaderText)
+singleton GuiControlProfile(MenuMLSubHeaderTextCenter : MenuMLSubHeaderText)
 {
    justify = "center";
 };
 
-if( !isObject( GuiMenuButtonProfile ) )
-new GuiControlProfile( GuiMenuButtonProfile )
+singleton GuiControlProfile( GuiMenuDefaultProfile )
+{
+   opaque = false;
+   fillColor = "0 0 0 0";   
+};
+
+singleton GuiControlProfile( GuiMenuButtonProfile )
 {
    opaque = true;
    border = false;
@@ -115,8 +140,13 @@ new GuiControlProfile( GuiMenuButtonProfile )
    fontColorLinkHL = "Magenta";
 };
 
-if( !isObject( GuiHighlightMenuButtonProfile ) )
-new GuiControlProfile( GuiHighlightMenuButtonProfile )
+singleton GuiControlProfile( LevelPreviewButtonProfile : GuiMenuButtonProfile )
+{
+   fontSize = 22;
+   justify = "Left";
+};
+
+singleton GuiControlProfile( GuiHighlightMenuButtonProfile )
 {
    opaque = true;
    border = false;
@@ -134,8 +164,7 @@ new GuiControlProfile( GuiHighlightMenuButtonProfile )
    category = "Core";
 };
 
-if( !isObject( GuiBlankMenuButtonProfile ) )
-new GuiControlProfile( GuiBlankMenuButtonProfile )
+singleton GuiControlProfile( GuiBlankMenuButtonProfile )
 {
    opaque = true;
    border = false;
@@ -155,14 +184,12 @@ new GuiControlProfile( GuiBlankMenuButtonProfile )
    category = "Core";
 };
 
-if( !isObject( GuiJoinServerButtonProfile ) )
-new GuiControlProfile( GuiJoinServerButtonProfile : GuiMenuButtonProfile )
+singleton GuiControlProfile( GuiJoinServerButtonProfile : GuiMenuButtonProfile )
 {
    justify = "left";
 };
 
-if( !isObject( GuiMenuTextProfile ) )
-new GuiControlProfile( GuiMenuTextProfile )
+singleton GuiControlProfile( GuiMenuTextProfile )
 {
    opaque = true;
    border = false;
@@ -173,27 +200,30 @@ new GuiControlProfile( GuiMenuTextProfile )
    fontColorNA = "125 125 125";
    fixedExtent = false;
    justify = "center";
-   category = "Core";
+   category = "BaseUI";
+   modal = false;
+};
+
+singleton GuiControlProfile( GuiMenuTextProfileHighlighted : GuiMenuTextProfile )
+{
+   fontColor = "0 0 0";
 };
 
-if( !isObject( GuiSolidDefaultProfile ) )
-new GuiControlProfile (GuiSolidDefaultProfile)
+singleton GuiControlProfile (GuiSolidDefaultProfile)
 {
    opaque = true;
    border = true;
    category = "Core";
 };
 
-if( !isObject( GuiTransparentProfile ) )
-new GuiControlProfile (GuiTransparentProfile)
+singleton GuiControlProfile (GuiTransparentProfile)
 {
    opaque = false;
    border = false;
    category = "Core";
 };
 
-if( !isObject( GuiGroupBorderProfile ) )
-new GuiControlProfile( GuiGroupBorderProfile )
+singleton GuiControlProfile( GuiGroupBorderProfile )
 {
    border = false;
    opaque = false;
@@ -202,8 +232,7 @@ new GuiControlProfile( GuiGroupBorderProfile )
    category = "Core";
 };
 
-if( !isObject( GuiTabBorderProfile ) )
-new GuiControlProfile( GuiTabBorderProfile )
+singleton GuiControlProfile( GuiTabBorderProfile )
 {
    border = false;
    opaque = false;
@@ -212,15 +241,13 @@ new GuiControlProfile( GuiTabBorderProfile )
    category = "Core";
 };
 
-if( !isObject( GuiModelessDialogProfile ) )
-new GuiControlProfile( GuiModelessDialogProfile )
+singleton GuiControlProfile( GuiModelessDialogProfile )
 {
    modal = false;
    category = "Core";
 };
 
-if( !isObject( GuiFrameSetProfile ) )
-new GuiControlProfile (GuiFrameSetProfile)
+singleton GuiControlProfile (GuiFrameSetProfile)
 {
    fillcolor = "255 255 255";
    borderColor = "246 245 244";
@@ -230,31 +257,27 @@ new GuiControlProfile (GuiFrameSetProfile)
    category = "Core";
 };
 
-if( !isObject( GuiInputCtrlProfile ) )
-new GuiControlProfile( GuiInputCtrlProfile )
+singleton GuiControlProfile( GuiInputCtrlProfile )
 {
    tab = true;
    canKeyFocus = true;
    category = "Core";
 };
 
-if( !isObject( GuiTextProfile ) )
-new GuiControlProfile (GuiTextProfile)
+singleton GuiControlProfile (GuiTextProfile)
 {
    justify = "left";
    fontColor = "20 20 20";
    category = "Core";
 };
 
-if( !isObject( GuiTextRightProfile ) )
-new GuiControlProfile (GuiTextRightProfile : GuiTextProfile)
+singleton GuiControlProfile (GuiTextRightProfile : GuiTextProfile)
 {
    justify = "right";
    category = "Core";
 };
 
-if( !isObject( GuiAutoSizeTextProfile ) )
-new GuiControlProfile (GuiAutoSizeTextProfile)
+singleton GuiControlProfile (GuiAutoSizeTextProfile)
 {
    fontColor = "0 0 0";
    autoSizeWidth = true;
@@ -262,22 +285,19 @@ new GuiControlProfile (GuiAutoSizeTextProfile)
    category = "Core";
 };
 
-if( !isObject( GuiMediumTextProfile ) )
-new GuiControlProfile( GuiMediumTextProfile : GuiTextProfile )
+singleton GuiControlProfile( GuiMediumTextProfile : GuiTextProfile )
 {
    fontSize = 24;
    category = "Core";
 };
 
-if( !isObject( GuiBigTextProfile ) )
-new GuiControlProfile( GuiBigTextProfile : GuiTextProfile )
+singleton GuiControlProfile( GuiBigTextProfile : GuiTextProfile )
 {
    fontSize = 36;
    category = "Core";
 };
 
-if( !isObject( GuiMLTextProfile ) )
-new GuiControlProfile( GuiMLTextProfile )
+singleton GuiControlProfile( GuiMLTextProfile )
 {
    fontColor = $TextMediumEmphasisColor;
    fontColorHL = $TextMediumEmphasisColor;
@@ -289,11 +309,16 @@ new GuiControlProfile( GuiMLTextProfile )
    autoSizeWidth = true;
    autoSizeHeight = true;  
    border = false;
-   category = "Core";
+   modal = false;
+   category = "BaseUI";
 };
 
-if( !isObject( GuiMLWhiteTextProfile ) )
-new GuiControlProfile( GuiMLWhiteTextProfile )
+singleton GuiControlProfile( GuiMLTextProfileHighlighted : GuiMLTextProfile )
+{
+   fontColor = $TextMediumEmphasisColorHL;
+};
+
+singleton GuiControlProfile( GuiMLWhiteTextProfile )
 {
    fontColor = "220 220 220";
    fontColorHL = $TextMediumEmphasisColor;
@@ -303,8 +328,7 @@ new GuiControlProfile( GuiMLWhiteTextProfile )
    category = "Core";
 };
 
-if( !isObject( GuiTextArrayProfile ) )
-new GuiControlProfile( GuiTextArrayProfile : GuiTextProfile )
+singleton GuiControlProfile( GuiTextArrayProfile : GuiTextProfile )
 {
    fontColor = $TextMediumEmphasisColor;
    fontColorHL = $TextMediumEmphasisColor;
@@ -324,8 +348,7 @@ new GuiControlProfile( GuiTextArrayProfile : GuiTextProfile )
    canKeyFocus = true;
 };
 
-if( !isObject( GuiMenuTextEditProfile ) )
-new GuiControlProfile( GuiMenuTextEditProfile : GuiTextEditProfile )
+singleton GuiControlProfile( GuiMenuTextEditProfile : GuiTextEditProfile )
 {
    fontColor = $TextMediumEmphasisColor;
    fontColorHL = $TextMediumEmphasisColor;
@@ -347,8 +370,7 @@ new GuiControlProfile( GuiMenuTextEditProfile : GuiTextEditProfile )
 // TODO: Revisit Popupmenu
 // ----------------------------------------------------------------------------
 
-if( !isObject( GuiPopupMenuItemBorder ) )
-new GuiControlProfile( GuiPopupMenuItemBorder : GuiButtonProfile )
+singleton GuiControlProfile( GuiPopupMenuItemBorder : GuiButtonProfile )
 {
    opaque = true;
    border = true;
@@ -362,8 +384,7 @@ new GuiControlProfile( GuiPopupMenuItemBorder : GuiButtonProfile )
    category = "Core";
 };
 
-if( !isObject( GuiPopUpMenuDefault ) )
-new GuiControlProfile( GuiPopUpMenuDefault : GuiDefaultProfile )
+singleton GuiControlProfile( GuiPopUpMenuDefault : GuiDefaultProfile )
 {
    opaque = true;
    mouseOverSelected = true;
@@ -385,8 +406,7 @@ new GuiControlProfile( GuiPopUpMenuDefault : GuiDefaultProfile )
    category = "Core";
 };
 
-if( !isObject( GuiPopUpMenuProfile ) )
-new GuiControlProfile( GuiPopUpMenuProfile : GuiPopUpMenuDefault )
+singleton GuiControlProfile( GuiPopUpMenuProfile : GuiPopUpMenuDefault )
 {
    textOffset         = "6 4";
    bitmapAsset             = "UI:dropDown_image";
@@ -396,8 +416,7 @@ new GuiControlProfile( GuiPopUpMenuProfile : GuiPopUpMenuDefault )
    category = "Core";
 };
 
-if( !isObject( GuiTabBookProfile ) )
-new GuiControlProfile( GuiTabBookProfile )
+singleton GuiControlProfile( GuiTabBookProfile )
 {
    fillColorHL = "100 100 100";
    fillColorNA = "150 150 150";
@@ -418,8 +437,7 @@ new GuiControlProfile( GuiTabBookProfile )
    category = "Core";
 };
 
-if( !isObject( GuiTabPageProfile ) )
-new GuiControlProfile( GuiTabPageProfile : GuiDefaultProfile )
+singleton GuiControlProfile( GuiTabPageProfile : GuiDefaultProfile )
 {
    fontType = "Arial";
    fontSize = 10;
@@ -430,8 +448,7 @@ new GuiControlProfile( GuiTabPageProfile : GuiDefaultProfile )
    category = "Core";
 };
 
-if( !isObject( GuiConsoleProfile ) )
-new GuiControlProfile( GuiConsoleProfile )
+singleton GuiControlProfile( GuiConsoleProfile )
 {
    fontType = ($platform $= "macos") ? "Monaco" : "Lucida Console";
    fontSize = ($platform $= "macos") ? 13 : 12;
@@ -445,8 +462,7 @@ new GuiControlProfile( GuiConsoleProfile )
    category = "Core";
 };
 
-if( !isObject( GuiConsoleTextProfile ) )
-new GuiControlProfile( GuiConsoleTextProfile )
+singleton GuiControlProfile( GuiConsoleTextProfile )
 {   
    fontColor = "0 0 0";
    autoSizeWidth = true;
@@ -462,8 +478,7 @@ new GuiControlProfile( GuiConsoleTextProfile )
 
 $ConsoleDefaultFillColor = "0 0 0 175";
 
-if( !isObject( ConsoleScrollProfile ) )
-new GuiControlProfile( ConsoleScrollProfile : GuiScrollProfile )
+singleton GuiControlProfile( ConsoleScrollProfile : GuiScrollProfile )
 {
 	opaque = true;
 	fillColor = $ConsoleDefaultFillColor;
@@ -473,8 +488,7 @@ new GuiControlProfile( ConsoleScrollProfile : GuiScrollProfile )
    category = "Core";
 };
 
-if( !isObject( ConsoleTextEditProfile ) )
-new GuiControlProfile( ConsoleTextEditProfile : GuiTextEditProfile )
+singleton GuiControlProfile( ConsoleTextEditProfile : GuiTextEditProfile )
 {
    fillColor = "242 241 240 255";
    fillColorHL = "255 255 255";   
@@ -485,8 +499,7 @@ new GuiControlProfile( ConsoleTextEditProfile : GuiTextEditProfile )
 // Center and bottom print
 //-----------------------------------------------------------------------------
 
-if( !isObject( CenterPrintProfile ) )
-new GuiControlProfile ( CenterPrintProfile )
+singleton GuiControlProfile ( CenterPrintProfile )
 {
    opaque = false;
    fillColor = "128 128 128";
@@ -496,8 +509,7 @@ new GuiControlProfile ( CenterPrintProfile )
    category = "Core";
 };
 
-if( !isObject( CenterPrintTextProfile ) )
-new GuiControlProfile ( CenterPrintTextProfile )
+singleton GuiControlProfile ( CenterPrintTextProfile )
 {
    opaque = false;
    fontType = "Arial";
@@ -509,9 +521,7 @@ new GuiControlProfile ( CenterPrintTextProfile )
 // ----------------------------------------------------------------------------
 // Radio button control
 // ----------------------------------------------------------------------------
-
-if( !isObject( GuiRadioProfile ) )
-new GuiControlProfile( GuiRadioProfile )
+singleton GuiControlProfile( GuiRadioProfile )
 {
    fontSize = 14;
    fillColor = "232 232 232";
@@ -526,31 +536,16 @@ new GuiControlProfile( GuiRadioProfile )
 //
 // Scroll Profile
 //
-if(!isObject(GuiMenuScrollProfile))
-new GuiControlProfile(GuiMenuScrollProfile)
+singleton GuiControlProfile(GuiMenuScrollProfile)
 {
    opaque = false;
-   fillcolor = "22 22 22";
+   fillcolor = "0 0 0 0";
    fontColor = "200 200 200";
    fontColorHL = "250 250 250";
    border = false;
    bitmapAsset = "UI:scrollBar_image";
    hasBitmapArray = true;
-   category = "Core";
-};
-
-// Scroll
-if(!isObject(GuiMenuScrollProfile))
-new GuiControlProfile(GuiMenuScrollProfile)
-{
-   opaque = true;
-   fillcolor = "128 128 128";
-   fontColor = "0 0 0";
-   fontColorHL = "150 150 150";
-   border = true;
-   bitmapAsset = "UI:scrollBar_image";
-   hasBitmapArray = true;
-   category = "Core";
+   category = "BaseUI";
 };
 
 singleton GuiControlProfile(SliderBitmapGUIProfile)
@@ -561,9 +556,23 @@ singleton GuiControlProfile(SliderBitmapGUIProfile)
    borderColor = "0 0 0 255";
 };
 
+singleton GuiControlProfile(GuiMenuBackgroundProfile)
+{
+   category = "BaseUI";
+   opaque = true;
+   fillcolor = "34 34 34 255";
+};
+
 singleton GuiControlProfile(GuiMenuPanelProfile)
 {
    category = "BaseUI";
    opaque = true;
    fillcolor = "15 15 15 255";
 };
+
+singleton GuiControlProfile(GuiMenuBasePanelProfile)
+{
+   category = "BaseUI";
+   opaque = true;
+   fillcolor = "40 40 40 255";
+};

+ 22 - 0
Templates/BaseGame/game/data/UI/scripts/utility.tscript

@@ -1,3 +1,25 @@
+function ActionMap::getCommandButtonBitmap(%this, %device, %command)
+{
+   %binding = %this.getBinding(%command);
+   
+   if(%device $= "mouse" || %device $= "")
+      %device = "keyboard";
+   
+   %bindingCount = getFieldCount(%binding);
+   for(%i=0; %i < %bindingCount; %i+=2)
+   {
+      %mapDevice = stripTrailingNumber(getField(%binding, %i)); 
+      if(%mapDevice $= %device)
+      {
+         %button = getField(%binding, %i+1);
+         break;
+      }
+   }
+
+   %assetId = getButtonBitmap(%device, %button);
+   return %assetId;
+}
+
 function getButtonBitmap(%device, %button)
 {
    if(%device $= "gamepad")

+ 2 - 7
Templates/BaseGame/game/tools/settings.xml

@@ -41,7 +41,7 @@
             <Setting
                 name="doubleClickAction">Edit Asset</Setting>
             <Setting
-                name="LastPosExt">0 1047 2200 360</Setting>
+                name="LastPosExt">0 976 2016 360</Setting>
             <Setting
                 name="previewTileSize">1</Setting>
             <Setting
@@ -106,7 +106,7 @@
         <Setting
             name="lastPath">tools/RPGDialogEditor/gui</Setting>
         <Setting
-            name="previewResolution">1024 768</Setting>
+            name="previewResolution">1280 720</Setting>
         <Group
             name="EngineDevelopment">
             <Setting
@@ -125,11 +125,6 @@
             <Setting
                 name="documentationURL">https://docs.torque3d.org</Setting>
         </Group>
-        <Group
-            name="Library">
-            <Setting
-                name="viewType">Categorized</Setting>
-        </Group>
         <Group
             name="Rendering">
             <Setting