From ed36cf2c5ce0f568577394588f59ae15b61d2307 Mon Sep 17 00:00:00 2001 From: JeffR Date: Thu, 17 Feb 2022 18:04:31 -0600 Subject: [PATCH 1/6] Changes for BaseUI Update --- Engine/source/T3D/assets/MaterialAsset.cpp | 6 ++ Engine/source/T3D/assets/assetImporter.cpp | 87 ++++++++++++++----- Engine/source/T3D/assets/assetImporter.h | 32 +++++++ Engine/source/Verve/GUI/VEditorButton.cpp | 2 +- Engine/source/afx/ui/afxSpellButton.cpp | 2 +- Engine/source/console/simDictionary.cpp | 2 +- .../source/gui/buttons/guiBitmapButtonCtrl.h | 2 +- Engine/source/gui/buttons/guiBorderButton.cpp | 2 +- .../source/gui/buttons/guiButtonBaseCtrl.cpp | 22 ++++- Engine/source/gui/buttons/guiButtonBaseCtrl.h | 7 +- Engine/source/gui/buttons/guiButtonCtrl.cpp | 5 +- Engine/source/gui/buttons/guiCheckBoxCtrl.cpp | 2 +- .../source/gui/buttons/guiIconButtonCtrl.cpp | 4 +- .../gui/buttons/guiSwatchButtonCtrl.cpp | 2 +- .../gui/buttons/guiToggleButtonCtrl.cpp | 4 +- .../gui/buttons/guiToolboxButtonCtrl.cpp | 2 +- .../source/gui/controls/guiGradientCtrl.cpp | 4 +- Engine/source/gui/core/guiCanvas.cpp | 3 + Engine/source/gui/utility/guiInputCtrl.cpp | 10 ++- Engine/source/gui/utility/guiInputCtrl.h | 1 + 20 files changed, 156 insertions(+), 45 deletions(-) diff --git a/Engine/source/T3D/assets/MaterialAsset.cpp b/Engine/source/T3D/assets/MaterialAsset.cpp index 50e75ffa3..e51f9a709 100644 --- a/Engine/source/T3D/assets/MaterialAsset.cpp +++ b/Engine/source/T3D/assets/MaterialAsset.cpp @@ -319,6 +319,12 @@ U32 MaterialAsset::getAssetByMaterialName(StringTableEntry matName, AssetPtrsetAssetId(MaterialAsset::smNoMaterialAssetFallback); + (*matAsset)->mLoadedState = AssetErrCode::UsingFallback; + return AssetErrCode::UsingFallback; + } StringTableEntry MaterialAsset::getAssetIdByMaterialName(StringTableEntry matName) diff --git a/Engine/source/T3D/assets/assetImporter.cpp b/Engine/source/T3D/assets/assetImporter.cpp index e9afcc479..8dc898dae 100644 --- a/Engine/source/T3D/assets/assetImporter.cpp +++ b/Engine/source/T3D/assets/assetImporter.cpp @@ -104,7 +104,9 @@ AssetImportConfig::AssetImportConfig() : importSounds(true), VolumeAdjust(false), PitchAdjust(false), - SoundsCompressed(false) + SoundsCompressed(false), + AlwaysAddSoundSuffix(false), + AddedSoundSuffix("_sound") { } @@ -316,6 +318,8 @@ void AssetImportConfig::loadImportConfig(Settings* configSettings, String config VolumeAdjust = dAtof(configSettings->value(String(configName + "/Sounds/VolumeAdjust").c_str())); PitchAdjust = dAtof(configSettings->value(String(configName + "/Sounds/PitchAdjust").c_str())); SoundsCompressed = dAtob(configSettings->value(String(configName + "/Sounds/Compressed").c_str())); + AlwaysAddSoundSuffix = dAtob(configSettings->value(String(configName + "/Sounds/AlwaysAddSoundSuffix").c_str())); + AddedSoundSuffix = configSettings->value(String(configName + "/Sounds/AddedSoundSuffix").c_str()); } void AssetImportConfig::CopyTo(AssetImportConfig* target) const @@ -406,6 +410,8 @@ void AssetImportConfig::CopyTo(AssetImportConfig* target) const target->VolumeAdjust = VolumeAdjust; target->PitchAdjust = PitchAdjust; target->SoundsCompressed = SoundsCompressed; + target->AlwaysAddSoundSuffix = AlwaysAddSoundSuffix; + target->AddedSoundSuffix = AddedSoundSuffix; } ConsoleDocClass(AssetImportObject, @@ -607,6 +613,7 @@ AssetImportObject* AssetImporter::addImportingAsset(String assetType, Torque::Pa assetName.replace('*', '_'); assetName.replace('-', '_'); assetName.replace('+', '_'); + assetName.replace('&', '_'); assetImportObj->assetType = assetType; assetImportObj->filePath = filePath; @@ -622,6 +629,14 @@ AssetImportObject* AssetImporter::addImportingAsset(String assetType, Torque::Pa assetImportObj->importStatus = AssetImportObject::NotProcessed; assetImportObj->generatedAsset = false; + //If the config is marked to always set the directory prefix, do that now + if (activeImportConfig->AddDirectoryPrefixToAssetName) + { + assetName = getFolderPrefixedName(assetImportObj); + assetImportObj->assetName = assetName; + assetImportObj->cleanAssetName = assetName; + } + if (parentItem != nullptr) { dSprintf(importLogBuffer, sizeof(importLogBuffer), "Added Child Importing Asset to %s", parentItem->assetName.c_str()); @@ -1976,6 +1991,12 @@ void AssetImporter::processSoundAsset(AssetImportObject* assetItem) dSprintf(importLogBuffer, sizeof(importLogBuffer), "Preparing Sound for Import: %s", assetItem->assetName.c_str()); activityLog.push_back(importLogBuffer); + if (activeImportConfig->AlwaysAddSoundSuffix) + { + assetItem->assetName += activeImportConfig->AddedSoundSuffix; + assetItem->cleanAssetName = assetItem->assetName; + } + assetItem->importStatus = AssetImportObject::Processed; } @@ -2165,7 +2186,49 @@ void AssetImporter::resolveAssetItemIssues(AssetImportObject* assetItem) { //Set trailing number String renamedAssetName = assetItem->assetName; - renamedAssetName = Sim::getUniqueName(renamedAssetName.c_str()); + String renamedAssetId = assetItem->moduleName + ":" + renamedAssetName; + + String addedSuffix; + + if (assetItem->assetType == String("ShapeAsset")) + addedSuffix = activeImportConfig->AddedShapeSuffix; + else if (assetItem->assetType == String("MaterialAsset")) + addedSuffix = activeImportConfig->AddedMaterialSuffix; + else if (assetItem->assetType == String("ImageAsset")) + addedSuffix = activeImportConfig->AddedImageSuffix; + else if (assetItem->assetType == String("SoundAsset")) + addedSuffix = activeImportConfig->AddedSoundSuffix; + + //do the suffix if it isn't already on it + if (!renamedAssetName.endsWith(addedSuffix.c_str())) + { + renamedAssetName += addedSuffix; + renamedAssetId = assetItem->moduleName + ":" + renamedAssetName; + assetItem->assetName = renamedAssetName; + } + + //if still conflicted + //add the directory prefix + if (AssetDatabase.isDeclaredAsset(renamedAssetId.c_str())) + { + renamedAssetName = getFolderPrefixedName(assetItem); + renamedAssetId = assetItem->moduleName + ":" + renamedAssetName; + assetItem->assetName = renamedAssetName; + } + + bool appendedNumber = false; + U32 uniqueNumber = 0; + while (AssetDatabase.isDeclaredAsset(renamedAssetId.c_str())) + { + uniqueNumber++; + renamedAssetId = assetItem->moduleName + ":" + renamedAssetName + String::ToString(uniqueNumber); + appendedNumber = true; + } + + if (appendedNumber) + { + renamedAssetName += String::ToString(uniqueNumber); + } //Log it's renaming dSprintf(importLogBuffer, sizeof(importLogBuffer), "Asset %s was renamed due to %s as part of the Import Configuration", assetItem->assetName.c_str(), humanReadableReason.c_str()); @@ -2186,25 +2249,7 @@ void AssetImporter::resolveAssetItemIssues(AssetImportObject* assetItem) } else if (activeImportConfig->DuplicateAutoResolution == String("FolderPrefix")) { - String renamedAssetName = assetItem->assetName; - - //Set trailing number - S32 dirIndex = assetItem->filePath.getDirectoryCount() - 1; - while (dirIndex > -1) - { - renamedAssetName = assetItem->assetName; - String owningFolder = assetItem->filePath.getDirectory(dirIndex); - - renamedAssetName = owningFolder + "_" + renamedAssetName; - - if (AssetDatabase.isDeclaredAsset(renamedAssetName)) - { - dirIndex--; - continue; - } - - break; - } + String renamedAssetName = getFolderPrefixedName(assetItem); //Log it's renaming dSprintf(importLogBuffer, sizeof(importLogBuffer), "Asset %s was renamed due to %s as part of the Import Configuration", assetItem->assetName.c_str(), humanReadableReason.c_str()); diff --git a/Engine/source/T3D/assets/assetImporter.h b/Engine/source/T3D/assets/assetImporter.h index b03c89c40..9505d00b1 100644 --- a/Engine/source/T3D/assets/assetImporter.h +++ b/Engine/source/T3D/assets/assetImporter.h @@ -409,6 +409,15 @@ public: /// bool SoundsCompressed; + /// When importing an image, this indicates if it should automatically add a standard suffix onto the name + /// + bool AlwaysAddSoundSuffix; + + /// + /// If AlwaysAddSoundSuffix is on, this is the suffix to be added + /// + String AddedSoundSuffix; + public: AssetImportConfig(); virtual ~AssetImportConfig(); @@ -934,4 +943,27 @@ public: // void setTargetModuleId(const String& moduleId) { targetModuleId = moduleId; } const String& getTargetModuleId() { return targetModuleId; } + + String getFolderPrefixedName(AssetImportObject* assetItem) + { + String renamedAssetName = assetItem->assetName; + S32 dirIndex = assetItem->filePath.getDirectoryCount() - 1; + while (dirIndex > -1) + { + renamedAssetName = assetItem->assetName; + String owningFolder = assetItem->filePath.getDirectory(dirIndex); + + renamedAssetName = owningFolder + "_" + renamedAssetName; + + if (AssetDatabase.isDeclaredAsset(renamedAssetName)) + { + dirIndex--; + continue; + } + + break; + } + + return renamedAssetName; + } }; diff --git a/Engine/source/Verve/GUI/VEditorButton.cpp b/Engine/source/Verve/GUI/VEditorButton.cpp index 3c32424b4..d86f86e3f 100644 --- a/Engine/source/Verve/GUI/VEditorButton.cpp +++ b/Engine/source/Verve/GUI/VEditorButton.cpp @@ -186,7 +186,7 @@ void VEditorButton::onRender( Point2I offset, const RectI& updateRect ) { RectI boundsRect( offset, getExtent() ); - if ( mDepressed || mStateOn || mMouseOver ) + if ( mDepressed || mStateOn || mHighlighted ) { renderFilledBorder( boundsRect, mProfile->mBorderColorHL, mProfile->mFillColorHL ); } diff --git a/Engine/source/afx/ui/afxSpellButton.cpp b/Engine/source/afx/ui/afxSpellButton.cpp index 632d2e652..76888a73a 100644 --- a/Engine/source/afx/ui/afxSpellButton.cpp +++ b/Engine/source/afx/ui/afxSpellButton.cpp @@ -221,7 +221,7 @@ void afxSpellButton::onRender(Point2I offset, const RectI& updateRect) if (mActive) { - if (mMouseOver) state = HILIGHT; + if (mHighlighted) state = HILIGHT; if (mDepressed || mStateOn) state = DEPRESSED; } else diff --git a/Engine/source/console/simDictionary.cpp b/Engine/source/console/simDictionary.cpp index 93491fd1c..8730a89dd 100644 --- a/Engine/source/console/simDictionary.cpp +++ b/Engine/source/console/simDictionary.cpp @@ -53,7 +53,7 @@ void SimNameDictionary::insert(SimObject* obj) SimObject* checkForDup = find(obj->getName()); if (checkForDup) - Con::warnf("Warning! You have a duplicate datablock name of %s. This can cause problems. You should rename one of them.", obj->getName()); + Con::warnf("Warning! You have a duplicate object name of %s. This can cause problems. You should rename one of them.", obj->getName()); Mutex::lockMutex(mutex); #ifndef USE_NEW_SIMDICTIONARY diff --git a/Engine/source/gui/buttons/guiBitmapButtonCtrl.h b/Engine/source/gui/buttons/guiBitmapButtonCtrl.h index 59e7825f1..846cdaedb 100644 --- a/Engine/source/gui/buttons/guiBitmapButtonCtrl.h +++ b/Engine/source/gui/buttons/guiBitmapButtonCtrl.h @@ -137,7 +137,7 @@ class GuiBitmapButtonCtrl : public GuiButtonCtrl if( mActive ) { if( mDepressed || mStateOn ) return DEPRESSED; - if( mMouseOver ) return HILIGHT; + if( mHighlighted ) return HILIGHT; return NORMAL; } else diff --git a/Engine/source/gui/buttons/guiBorderButton.cpp b/Engine/source/gui/buttons/guiBorderButton.cpp index 6efc5bc77..24f4a50f3 100644 --- a/Engine/source/gui/buttons/guiBorderButton.cpp +++ b/Engine/source/gui/buttons/guiBorderButton.cpp @@ -79,7 +79,7 @@ void GuiBorderButtonCtrl::onRender(Point2I offset, const RectI &updateRect) } } - if ( mMouseOver ) + if ( mHighlighted ) { RectI bounds( offset, getExtent() ); for ( S32 i=0; i < mProfile->mBorderThickness; i++ ) diff --git a/Engine/source/gui/buttons/guiButtonBaseCtrl.cpp b/Engine/source/gui/buttons/guiButtonBaseCtrl.cpp index 4621d5fea..b72f1b280 100644 --- a/Engine/source/gui/buttons/guiButtonBaseCtrl.cpp +++ b/Engine/source/gui/buttons/guiButtonBaseCtrl.cpp @@ -98,7 +98,7 @@ EndImplementEnumType; GuiButtonBaseCtrl::GuiButtonBaseCtrl() { mDepressed = false; - mMouseOver = false; + mHighlighted = false; mActive = true; static StringTableEntry sButton = StringTable->insert( "Button" ); mButtonText = sButton; @@ -288,14 +288,14 @@ void GuiButtonBaseCtrl::onMouseEnter(const GuiEvent &event) if(isMouseLocked()) { mDepressed = true; - mMouseOver = true; + mHighlighted = true; } else { if ( mActive && mProfile->mSoundButtonOver ) SFX->playOnce(mProfile->mSoundButtonOver); - mMouseOver = true; + mHighlighted = true; } } @@ -309,7 +309,7 @@ void GuiButtonBaseCtrl::onMouseLeave(const GuiEvent &) onMouseLeave_callback(); if( isMouseLocked() ) mDepressed = false; - mMouseOver = false; + mHighlighted = false; } //----------------------------------------------------------------------------- @@ -542,3 +542,17 @@ DefineEngineMethod( GuiButtonBaseCtrl, resetState, void, (),, { object->resetState(); } + +DefineEngineMethod(GuiButtonBaseCtrl, setHighlighted, void, (bool highlighted), (false), + "Reset the mousing state of the button.\n\n" + "This method should not generally be called.") +{ + object->setHighlighted(highlighted); +} + +DefineEngineMethod(GuiButtonBaseCtrl, isHighlighted, bool, (),, + "Reset the mousing state of the button.\n\n" + "This method should not generally be called.") +{ + return object->isHighlighted(); +} diff --git a/Engine/source/gui/buttons/guiButtonBaseCtrl.h b/Engine/source/gui/buttons/guiButtonBaseCtrl.h index 0e3be53a7..60f76ea4a 100644 --- a/Engine/source/gui/buttons/guiButtonBaseCtrl.h +++ b/Engine/source/gui/buttons/guiButtonBaseCtrl.h @@ -49,7 +49,7 @@ class GuiButtonBaseCtrl : public GuiControl StringTableEntry mButtonText; StringTableEntry mButtonTextID; bool mDepressed; - bool mMouseOver; + bool mHighlighted; bool mStateOn; S32 mButtonType; S32 mRadioGroup; @@ -95,7 +95,10 @@ class GuiButtonBaseCtrl : public GuiControl bool getStateOn() const { return mStateOn; } void setDepressed( bool depressed ) { mDepressed = depressed; } - void resetState() {mDepressed = false; mMouseOver = false;} + void resetState() {mDepressed = false; mHighlighted = false;} + + void setHighlighted(bool highlighted) { mHighlighted = highlighted; } + bool isHighlighted() { return mHighlighted; } void acceleratorKeyPress(U32 index); void acceleratorKeyRelease(U32 index); diff --git a/Engine/source/gui/buttons/guiButtonCtrl.cpp b/Engine/source/gui/buttons/guiButtonCtrl.cpp index c0d5f4e08..8996f87a9 100644 --- a/Engine/source/gui/buttons/guiButtonCtrl.cpp +++ b/Engine/source/gui/buttons/guiButtonCtrl.cpp @@ -83,7 +83,7 @@ bool GuiButtonCtrl::onWake() void GuiButtonCtrl::onRender(Point2I offset, const RectI& updateRect) { - bool highlight = mMouseOver; + bool highlight = mHighlighted; bool depressed = mDepressed; ColorI fontColor = mActive ? ( highlight ? mProfile->mFontColorHL : mProfile->mFontColor ) : mProfile->mFontColorNA; @@ -107,7 +107,7 @@ void GuiButtonCtrl::onRender(Point2I offset, indexMultiplier = 4; else if ( mDepressed || mStateOn ) indexMultiplier = 2; - else if ( mMouseOver ) + else if ( mHighlighted ) indexMultiplier = 3; renderSizableBitmapBordersFilled( boundsRect, indexMultiplier, mProfile ); @@ -123,3 +123,4 @@ void GuiButtonCtrl::onRender(Point2I offset, //render the children renderChildControls( offset, updateRect); } + diff --git a/Engine/source/gui/buttons/guiCheckBoxCtrl.cpp b/Engine/source/gui/buttons/guiCheckBoxCtrl.cpp index b7b47b57c..983709c7a 100644 --- a/Engine/source/gui/buttons/guiCheckBoxCtrl.cpp +++ b/Engine/source/gui/buttons/guiCheckBoxCtrl.cpp @@ -106,7 +106,7 @@ void GuiCheckBoxCtrl::onRender(Point2I offset, const RectI &updateRect) } ColorI backColor = mActive ? mProfile->mFillColor : mProfile->mFillColorNA; - ColorI fontColor = mActive ? (mMouseOver ? mProfile->mFontColorHL : mProfile->mFontColor) : mProfile->mFontColorNA; + ColorI fontColor = mActive ? (mHighlighted ? mProfile->mFontColorHL : mProfile->mFontColor) : mProfile->mFontColorNA; ColorI insideBorderColor = isFirstResponder() ? mProfile->mBorderColorHL : mProfile->mBorderColor; // just draw the check box and the text: diff --git a/Engine/source/gui/buttons/guiIconButtonCtrl.cpp b/Engine/source/gui/buttons/guiIconButtonCtrl.cpp index c0fb939ff..a84623fa1 100644 --- a/Engine/source/gui/buttons/guiIconButtonCtrl.cpp +++ b/Engine/source/gui/buttons/guiIconButtonCtrl.cpp @@ -218,7 +218,7 @@ void GuiIconButtonCtrl::onRender(Point2I offset, const RectI& updateRect) void GuiIconButtonCtrl::renderButton( Point2I &offset, const RectI& updateRect ) { - bool highlight = mMouseOver; + bool highlight = mHighlighted; bool depressed = mDepressed; ColorI fontColor = mActive ? (highlight ? mProfile->mFontColorHL : mProfile->mFontColor) : mProfile->mFontColorNA; @@ -236,7 +236,7 @@ void GuiIconButtonCtrl::renderButton( Point2I &offset, const RectI& updateRect ) else renderSlightlyLoweredBox(boundsRect, mProfile); } - else if(mMouseOver && mActive) + else if(mHighlighted && mActive) { // If there is a bitmap array then render using it. // Otherwise use a standard fill. diff --git a/Engine/source/gui/buttons/guiSwatchButtonCtrl.cpp b/Engine/source/gui/buttons/guiSwatchButtonCtrl.cpp index 7db73a05e..dea3e8535 100644 --- a/Engine/source/gui/buttons/guiSwatchButtonCtrl.cpp +++ b/Engine/source/gui/buttons/guiSwatchButtonCtrl.cpp @@ -90,7 +90,7 @@ bool GuiSwatchButtonCtrl::onWake() void GuiSwatchButtonCtrl::onRender( Point2I offset, const RectI &updateRect ) { - bool highlight = mMouseOver; + bool highlight = mHighlighted; ColorI borderColor = mActive ? ( highlight ? mProfile->mBorderColorHL : mProfile->mBorderColor ) : mProfile->mBorderColorNA; diff --git a/Engine/source/gui/buttons/guiToggleButtonCtrl.cpp b/Engine/source/gui/buttons/guiToggleButtonCtrl.cpp index a2aaaa6c9..8dea6943c 100644 --- a/Engine/source/gui/buttons/guiToggleButtonCtrl.cpp +++ b/Engine/source/gui/buttons/guiToggleButtonCtrl.cpp @@ -66,7 +66,7 @@ void GuiToggleButtonCtrl::onPreRender() void GuiToggleButtonCtrl::onRender(Point2I offset, const RectI& updateRect) { - bool highlight = mMouseOver; + bool highlight = mHighlighted; bool depressed = mDepressed; ColorI fontColor = mActive ? ( highlight ? mProfile->mFontColorHL : mProfile->mFontColor ) : mProfile->mFontColorNA; @@ -89,7 +89,7 @@ void GuiToggleButtonCtrl::onRender(Point2I offset, indexMultiplier = 4; else if ( mDepressed || mStateOn ) indexMultiplier = 2; - else if ( mMouseOver ) + else if ( mHighlighted ) indexMultiplier = 3; diff --git a/Engine/source/gui/buttons/guiToolboxButtonCtrl.cpp b/Engine/source/gui/buttons/guiToolboxButtonCtrl.cpp index 3f1b26f0c..9a9a63831 100644 --- a/Engine/source/gui/buttons/guiToolboxButtonCtrl.cpp +++ b/Engine/source/gui/buttons/guiToolboxButtonCtrl.cpp @@ -144,7 +144,7 @@ void GuiToolboxButtonCtrl::onRender(Point2I offset, const RectI& updateRect) RectI r(offset, getExtent()); if ( mDepressed || mStateOn ) renderStateRect( mLoweredBitmap , r ); - else if ( mMouseOver ) + else if ( mHighlighted ) renderStateRect( mHoverBitmap , r ); } diff --git a/Engine/source/gui/controls/guiGradientCtrl.cpp b/Engine/source/gui/controls/guiGradientCtrl.cpp index 112f3859d..3b5959ae8 100644 --- a/Engine/source/gui/controls/guiGradientCtrl.cpp +++ b/Engine/source/gui/controls/guiGradientCtrl.cpp @@ -99,7 +99,7 @@ bool GuiGradientSwatchCtrl::onWake() void GuiGradientSwatchCtrl::onRender( Point2I offset, const RectI &updateRect ) { - bool highlight = mMouseOver; + bool highlight = mHighlighted; ColorI borderColor = mActive ? ( highlight ? mProfile->mBorderColorHL : mProfile->mBorderColor ) : mProfile->mBorderColorNA; RectI renderRect( offset, getExtent() ); @@ -632,4 +632,4 @@ DefineEngineMethod(GuiGradientCtrl, getColor, LinearColorF, (S32 idx), , "Get co } return LinearColorF::ONE; -} \ No newline at end of file +} diff --git a/Engine/source/gui/core/guiCanvas.cpp b/Engine/source/gui/core/guiCanvas.cpp index 0b894f7c3..95f6213c2 100644 --- a/Engine/source/gui/core/guiCanvas.cpp +++ b/Engine/source/gui/core/guiCanvas.cpp @@ -706,6 +706,9 @@ bool GuiCanvas::processInputEvent(InputEventInfo &inputEvent) if (mCursorEnabled || mForceMouseToGUI || (mAlwaysHandleMouseButtons && inputEvent.objType == SI_BUTTON) ) { + if (inputEvent.objType != SI_AXIS && inputEvent.action == SI_MAKE) + bool asdfasdf = true; + return processMouseEvent(inputEvent); } break; diff --git a/Engine/source/gui/utility/guiInputCtrl.cpp b/Engine/source/gui/utility/guiInputCtrl.cpp index 907d861a9..4c56f9133 100644 --- a/Engine/source/gui/utility/guiInputCtrl.cpp +++ b/Engine/source/gui/utility/guiInputCtrl.cpp @@ -61,7 +61,8 @@ ConsoleDocClass( GuiInputCtrl, GuiInputCtrl::GuiInputCtrl() : mSendAxisEvents(false), mSendBreakEvents(false), - mSendModifierEvents(false) + mSendModifierEvents(false), + mIgnoreMouseEvents(false) { } @@ -76,6 +77,8 @@ void GuiInputCtrl::initPersistFields() "If true, break events for all devices will generate callbacks (Default false)."); addField("sendModifierEvents", TypeBool, Offset(mSendModifierEvents, GuiInputCtrl), "If true, Make events will be sent for modifier keys (Default false)."); + addField("ignoreMouseEvents", TypeBool, Offset(mIgnoreMouseEvents, GuiInputCtrl), + "If true, any events from mouse devices will be passed through."); endGroup("GuiInputCtrl"); Parent::initPersistFields(); @@ -97,7 +100,7 @@ bool GuiInputCtrl::onWake() if ( !Parent::onWake() ) return( false ); - if( !smDesignTime ) + if( !smDesignTime && !mIgnoreMouseEvents) mouseLock(); setFirstResponder(); @@ -151,6 +154,9 @@ IMPLEMENT_CALLBACK(GuiInputCtrl, onAxisEvent, void, (const char* device, const c //------------------------------------------------------------------------------ bool GuiInputCtrl::onInputEvent( const InputEventInfo &event ) { + if (mIgnoreMouseEvents && event.deviceType == MouseDeviceType) + return false; + char deviceString[32]; if ( event.action == SI_MAKE ) { diff --git a/Engine/source/gui/utility/guiInputCtrl.h b/Engine/source/gui/utility/guiInputCtrl.h index be60371f3..269569693 100644 --- a/Engine/source/gui/utility/guiInputCtrl.h +++ b/Engine/source/gui/utility/guiInputCtrl.h @@ -36,6 +36,7 @@ protected: bool mSendAxisEvents; bool mSendBreakEvents; bool mSendModifierEvents; + bool mIgnoreMouseEvents; public: From 40acf752385a87f93eb4b6f0938a9a14196ccc3f Mon Sep 17 00:00:00 2001 From: JeffR Date: Thu, 17 Feb 2022 18:21:13 -0600 Subject: [PATCH 2/6] Template changes --- .../game/core/gui/scripts/profiles.tscript | 21 +- Templates/BaseGame/game/data/UI/UI.tscript | 2 +- .../game/data/UI/guis/OptionsDlg.asset.taml | 7 - .../game/data/UI/guis/joinServerMenu.gui | 270 +--- .../game/data/UI/guis/joinServerMenu.tscript | 35 +- .../BaseGame/game/data/UI/guis/mainMenu.gui | 210 ++- .../game/data/UI/guis/mainMenu.tscript | 16 +- .../BaseGame/game/data/UI/guis/optionsDlg.gui | 1432 ----------------- .../game/data/UI/guis/optionsMenu.gui | 547 ++++--- .../game/data/UI/guis/optionsMenu.tscript | 203 ++- .../game/data/UI/images/scrollBar.png | Bin 6643 -> 9187 bytes .../game/data/UI/scripts/controlsMenu.tscript | 2 +- .../data/UI/scripts/menuInputButtons.tscript | 341 ---- .../game/data/UI/scripts/profiles.tscript | 6 + 14 files changed, 762 insertions(+), 2330 deletions(-) delete mode 100644 Templates/BaseGame/game/data/UI/guis/OptionsDlg.asset.taml delete mode 100644 Templates/BaseGame/game/data/UI/guis/optionsDlg.gui delete mode 100644 Templates/BaseGame/game/data/UI/scripts/menuInputButtons.tscript diff --git a/Templates/BaseGame/game/core/gui/scripts/profiles.tscript b/Templates/BaseGame/game/core/gui/scripts/profiles.tscript index dd0ede04a..57156bbbe 100644 --- a/Templates/BaseGame/game/core/gui/scripts/profiles.tscript +++ b/Templates/BaseGame/game/core/gui/scripts/profiles.tscript @@ -26,6 +26,10 @@ if($Gui::fontCacheDirectory $= "") $Gui::fontCacheDirectory = expandFilename("data/cache/fonts"); } +$TextMediumEmphasisColor = "200 200 200"; +$TextHighEmphasisColor = "224 224 224"; +$TextDisabledColor = "108 108 108"; + // ---------------------------------------------------------------------------- // GuiDefaultProfile is a special profile that all other profiles inherit // defaults from. It must exist. @@ -137,13 +141,20 @@ new GuiControlProfile(GuiTextEditProfile) category = "Core"; }; -if(!isObject(GuiScrollProfile)) -new GuiControlProfile(GuiScrollProfile) +if(!isObject(GuiMenuScrollProfile)) +new GuiControlProfile(GuiMenuScrollProfile) { opaque = true; - fillcolor = "255 255 255"; - fontColor = "0 0 0"; - fontColorHL = "150 150 150"; + fontColor = $TextMediumEmphasisColor; + fontColorHL = $TextMediumEmphasisColor; + fontColorNA = $TextDisabledColor; + fontColorSEL = $TextMediumEmphasisColor; + fillColor = "40 40 40"; + fillColorHL = "56 56 56"; + fillColorNA = "40 40 40"; + borderColor = "87 87 87"; + borderColorNA = "0 0 0"; + borderColorHL = "255 255 255"; border = true; bitmapAsset = "Core_GUI:scrollBar_image"; hasBitmapArray = true; diff --git a/Templates/BaseGame/game/data/UI/UI.tscript b/Templates/BaseGame/game/data/UI/UI.tscript index e0b1670d0..5b8c1ee6a 100644 --- a/Templates/BaseGame/game/data/UI/UI.tscript +++ b/Templates/BaseGame/game/data/UI/UI.tscript @@ -36,7 +36,7 @@ function UI::initClient(%this) %this.queueExec("./scripts/profiles"); //Now gui files - %this.queueExec("./scripts/menuInputButtons"); + %this.queueExec("./scripts/menuInputHandling"); %this.queueExec("./guis/mainMenu"); %this.queueExec("./guis/mainMenu.gui"); diff --git a/Templates/BaseGame/game/data/UI/guis/OptionsDlg.asset.taml b/Templates/BaseGame/game/data/UI/guis/OptionsDlg.asset.taml deleted file mode 100644 index 21467cbc8..000000000 --- a/Templates/BaseGame/game/data/UI/guis/OptionsDlg.asset.taml +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/Templates/BaseGame/game/data/UI/guis/joinServerMenu.gui b/Templates/BaseGame/game/data/UI/guis/joinServerMenu.gui index 4343fe7ad..17a2c4435 100644 --- a/Templates/BaseGame/game/data/UI/guis/joinServerMenu.gui +++ b/Templates/BaseGame/game/data/UI/guis/joinServerMenu.gui @@ -14,19 +14,27 @@ $guiContent = new GuiControl(JoinServerMenu) { canSave = "1"; canSaveDynamicFields = "1"; returnGui = "MainMenuGui"; - - new GuiInputCtrl(JoinServerMenuInputHandler){ - profile = "GuiInputCtrlProfile"; - visible = "1"; - active = "1"; - position = "0 0"; - extent = "1024 768"; + + new GuiInputCtrl(JoinServerMenuInputHandler) { + sendAxisEvents = "1"; + sendBreakEvents = "1"; + sendModifierEvents = "0"; + ignoreMouseEvents = "1"; + lockMouse = "0"; + position = "-10 0"; + extent = "10 10"; minExtent = "8 2"; horizSizing = "width"; vertSizing = "height"; - sendBreakEvents="1"; + profile = "GuiInputCtrlProfile"; + visible = "1"; + active = "1"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "0"; + canSave = "1"; + canSaveDynamicFields = "0"; }; - new GuiControl(JoinServerWindow) { position = "48 56"; extent = "928 655"; @@ -46,7 +54,7 @@ $guiContent = new GuiControl(JoinServerMenu) { percent = "100"; vertical = "0"; flipClip = "0"; - bitmap = "data/ui/images/panel.png"; + BitmapAsset = "UI:panel_image"; color = "255 255 255 255"; position = "0 0"; extent = "927 40"; @@ -89,7 +97,7 @@ $guiContent = new GuiControl(JoinServerMenu) { percent = "100"; vertical = "0"; flipClip = "0"; - bitmap = "data/ui/images/panel_low.png"; + BitmapAsset = "UI:panel_low_image"; color = "255 255 255 255"; position = "0 40"; extent = "927 618"; @@ -105,58 +113,6 @@ $guiContent = new GuiControl(JoinServerMenu) { canSave = "1"; canSaveDynamicFields = "0"; }; - new GuiTextCtrl() { - text = "Player Name:"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "12 47"; - extent = "109 18"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "MenuSubHeaderText"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiTextEditCtrl() { - historySize = "0"; - tabComplete = "0"; - sinkAllKeyEvents = "0"; - password = "0"; - passwordMask = "*"; - text = "Visitor"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "124 47"; - extent = "144 18"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuTextEditProfile"; - visible = "1"; - active = "1"; - variable = "$pref::Player::Name"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; new GuiTextCtrl(JS_status) { text = "No servers found."; maxLength = "255"; @@ -166,7 +122,7 @@ $guiContent = new GuiControl(JoinServerMenu) { anchorBottom = "0"; anchorLeft = "1"; anchorRight = "0"; - position = "277 47"; + position = "392 47"; extent = "148 18"; minExtent = "8 8"; horizSizing = "right"; @@ -324,25 +280,30 @@ $guiContent = new GuiControl(JoinServerMenu) { canSave = "1"; canSaveDynamicFields = "0"; - new GuiTextListCtrl(JS_serverList) { - columns = "0 200 270 335 400"; - fitParentWidth = "1"; - clipColumnText = "0"; - rowHeightPadding = "2"; + new GuiStackControl(JoinServerList) { + stackingType = "Vertical"; + horizStacking = "Left to Right"; + vertStacking = "Top to Bottom"; + padding = "10"; + dynamicSize = "1"; + dynamicNonStackExtent = "0"; + dynamicPos = "0"; + changeChildSizeToFit = "0"; + changeChildPosition = "1"; position = "1 1"; - extent = "888 8"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiTextArrayProfile"; + extent = "888 16"; + minExtent = "16 16"; + horizSizing = "center"; + vertSizing = "center"; + profile = "GuiDefaultProfile"; visible = "1"; active = "1"; - altCommand = "JoinServerDlg.join();"; tooltipProfile = "GuiToolTipProfile"; hovertime = "1000"; isContainer = "1"; canSave = "1"; canSaveDynamicFields = "0"; + class = "MenuList"; }; }; new GuiControl(JS_queryStatus) { @@ -427,130 +388,9 @@ $guiContent = new GuiControl(JoinServerMenu) { canSaveDynamicFields = "0"; }; }; - new GuiButtonCtrl(JoinServerBackBtn) { - text = "Return to Menu"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "1"; - position = "0 583"; - extent = "160 33"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "0"; - active = "1"; - command = "Canvas.popDialog(JoinServerMenu);\n\nif(isObject(JoinServerMenu.returnGui) && JoinServerMenu.returnGui.isMethod(\"onReturnTo\")) JoinServerMenu.returnGui.onReturnTo();"; - accelerator = "escape"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - hidden = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiButtonCtrl(JoinServerQryLanBtn) { - text = "Query Lan"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "1"; - position = "160 583"; - extent = "160 33"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "0"; - active = "1"; - command = "JoinServerMenu.queryLan();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - hidden = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiButtonCtrl(JoinServerQryInternetBtn) { - text = "Query Internet"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "1"; - position = "320 583"; - extent = "160 33"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "0"; - active = "1"; - command = "JoinServerMenu.query();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - hidden = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiButtonCtrl(JoinServerRefreshBtn) { - text = "Refresh Server"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "1"; - position = "480 583"; - extent = "160 33"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "0"; - active = "1"; - command = "JoinServerMenu.refresh();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - hidden = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiButtonCtrl(JoinServerJoinBtn) { - text = "Join Server"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "1"; - position = "640 583"; - extent = "160 33"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "0"; - active = "0"; - command = "JoinServerMenu.join();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - hidden = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - }; - new GuiControl() { - position = "189 652"; - extent = "646 130"; - minExtent = "8 2"; - horizSizing = "center"; - vertSizing = "top"; - profile = "GuiDefaultProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; }; new GuiControl(JoinServerButtonHolder) { - position = "109 711"; + position = "116 711"; extent = "791 40"; minExtent = "8 2"; horizSizing = "center"; @@ -567,7 +407,7 @@ $guiContent = new GuiControl(JoinServerMenu) { new GuiIconButtonCtrl() { buttonMargin = "4 4"; - iconBitmap = "data/ui/images/Inputs/Keyboard & Mouse/Keyboard_Black_Enter"; + BitmapAsset = "UI:Keyboard_Black_Return_image"; iconLocation = "Left"; sizeIconToButton = "1"; makeIconSquare = "1"; @@ -586,7 +426,7 @@ $guiContent = new GuiControl(JoinServerMenu) { profile = "GuiMenuButtonProfile"; visible = "1"; active = "1"; - command = "OptionsMenu.apply();"; + command = "JoinServerMenu.join();"; tooltipProfile = "GuiToolTipProfile"; hovertime = "1000"; isContainer = "0"; @@ -597,7 +437,7 @@ $guiContent = new GuiControl(JoinServerMenu) { }; new GuiIconButtonCtrl() { buttonMargin = "4 4"; - iconBitmap = "data/ui/images/Inputs/Keyboard & Mouse/Keyboard_Black_Esc"; + BitmapAsset = "UI:Keyboard_Black_Escape_image"; iconLocation = "Left"; sizeIconToButton = "1"; makeIconSquare = "1"; @@ -616,7 +456,7 @@ $guiContent = new GuiControl(JoinServerMenu) { profile = "GuiMenuButtonProfile"; visible = "1"; active = "1"; - command = "OptionsMenu.backOut();"; + command = "JoinServerMenu.backOut();"; tooltipProfile = "GuiToolTipProfile"; hovertime = "1000"; isContainer = "0"; @@ -627,14 +467,14 @@ $guiContent = new GuiControl(JoinServerMenu) { }; new GuiIconButtonCtrl() { buttonMargin = "4 4"; - iconBitmap = "data/ui/images/Inputs/Keyboard & Mouse/Keyboard_Black_Enter"; + BitmapAsset = "UI:Keyboard_Black_Q_image"; iconLocation = "Left"; sizeIconToButton = "1"; makeIconSquare = "1"; textLocation = "Right"; textMargin = "4"; autoSize = "0"; - text = "Prev Tab"; + text = "Query LAN"; groupNum = "-1"; buttonType = "PushButton"; useMouseEvents = "0"; @@ -644,28 +484,27 @@ $guiContent = new GuiControl(JoinServerMenu) { horizSizing = "right"; vertSizing = "bottom"; profile = "GuiMenuButtonProfile"; - visible = "0"; - active = "0"; - command = "OptionsMenu.prevTab();"; + visible = "1"; + active = "1"; + command = "JoinServerMenu.queryLan();"; tooltipProfile = "GuiToolTipProfile"; hovertime = "1000"; isContainer = "0"; internalName = "queryLANButton"; class = "MenuInputButton"; - hidden = "1"; canSave = "1"; canSaveDynamicFields = "0"; }; new GuiIconButtonCtrl() { buttonMargin = "4 4"; - iconBitmap = "data/ui/images/Inputs/Keyboard & Mouse/Keyboard_Black_Esc"; + BitmapAsset = "UI:Keyboard_Black_E_image"; iconLocation = "Left"; sizeIconToButton = "1"; makeIconSquare = "1"; textLocation = "Right"; textMargin = "4"; autoSize = "0"; - text = "Next Tab"; + text = "Query Online"; groupNum = "-1"; buttonType = "PushButton"; useMouseEvents = "0"; @@ -675,28 +514,27 @@ $guiContent = new GuiControl(JoinServerMenu) { horizSizing = "right"; vertSizing = "bottom"; profile = "GuiMenuButtonProfile"; - visible = "0"; - active = "0"; - command = "OptionsMenu.nextTab();"; + visible = "1"; + active = "1"; + command = "JoinServerMenu.query();"; tooltipProfile = "GuiToolTipProfile"; hovertime = "1000"; isContainer = "0"; internalName = "queryInternetButton"; class = "MenuInputButton"; - hidden = "1"; canSave = "1"; canSaveDynamicFields = "0"; }; new GuiIconButtonCtrl() { buttonMargin = "4 4"; - bitmapAsset = "UI:Keyboard_Black_R_image"; + BitmapAsset = "UI:Keyboard_Black_R_image"; iconLocation = "Left"; sizeIconToButton = "1"; makeIconSquare = "1"; textLocation = "Right"; textMargin = "4"; autoSize = "0"; - text = "Reset"; + text = "Refresh"; groupNum = "-1"; buttonType = "PushButton"; useMouseEvents = "0"; @@ -708,7 +546,7 @@ $guiContent = new GuiControl(JoinServerMenu) { profile = "GuiMenuButtonProfile"; visible = "1"; active = "1"; - command = "OptionsMenu.resetToDefaults();"; + command = "JoinServerMenu.refresh();"; tooltipProfile = "GuiToolTipProfile"; hovertime = "1000"; isContainer = "0"; diff --git a/Templates/BaseGame/game/data/UI/guis/joinServerMenu.tscript b/Templates/BaseGame/game/data/UI/guis/joinServerMenu.tscript index e65e85e5d..b2f0eb8eb 100644 --- a/Templates/BaseGame/game/data/UI/guis/joinServerMenu.tscript +++ b/Templates/BaseGame/game/data/UI/guis/joinServerMenu.tscript @@ -3,10 +3,12 @@ function JoinServerMenu::onWake() { // Double check the status. Tried setting this the control // inactive to start with, but that didn't seem to work. - JoinServerJoinBtn.setActive(JS_serverList.rowCount() > 0); + JoinServerJoinBtn.setActive(JoinServerList.getCount() > 0); JoinServerButtonHolder.setActive(); + JoinServerList.setAsActiveMenuList(); + JoinServerMenuInputHandler.setFirstResponder(); } @@ -16,7 +18,7 @@ function JoinServerButtonHolder::onWake(%this) %this-->backButton.set("btn_b", "Escape", "Back", "JoinServerMenu.backOut();"); %this-->refreshButton.set("btn_y", "R", "Refresh", "JoinServerMenu.refresh();"); %this-->queryLANButton.set("btn_a", "Q", "Query LAN", "JoinServerMenu.queryLan();"); - %this-->queryInternetButton.set("btn_x", "E", "Query Internet", "JoinServerMenu.query();"); + %this-->queryInternetButton.set("btn_x", "E", "Query Online", "JoinServerMenu.query();"); } function JoinServerMenuInputHandler::onInputEvent(%this, %device, %action, %state) @@ -110,23 +112,23 @@ function JoinServerMenu::update(%this) { // Copy the servers into the server list. JS_queryStatus.setVisible(false); - JS_serverList.clear(); + JoinServerList.clear(); %sc = getServerCount(); for( %i = 0; %i < %sc; %i ++ ) { setServerInfo(%i); - JS_serverList.addRow( %i, - $ServerInfo::Name TAB - $ServerInfo::Ping TAB - $ServerInfo::PlayerCount @ "/" @ $ServerInfo::MaxPlayers TAB - $ServerInfo::Version TAB - $ServerInfo::MissionName - ); + %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); } - JS_serverList.sort(0); - JS_serverList.setSelectedRow(0); - JS_serverList.scrollVisible(0); - JoinServerJoinBtn.setActive(JS_serverList.rowCount() > 0); + JoinServerJoinBtn.setActive(JoinServerList.getCount() > 0); } //---------------------------------------- @@ -141,11 +143,9 @@ function onServerQueryStatus(%status, %msg, %value) switch$ (%status) { case "start": - JoinServerJoinBtn.setActive(false); - JoinServerQryInternetBtn.setActive(false); JS_statusText.setText(%msg); JS_statusBar.setValue(0); - JS_serverList.clear(); + JoinServerList.clear(); case "ping": JS_statusText.setText("Ping Servers"); @@ -156,7 +156,6 @@ function onServerQueryStatus(%status, %msg, %value) JS_statusBar.setValue(%value); case "done": - JoinServerQryInternetBtn.setActive(true); JS_queryStatus.setVisible(false); JS_status.setText(%msg); JoinServerMenu.update(); diff --git a/Templates/BaseGame/game/data/UI/guis/mainMenu.gui b/Templates/BaseGame/game/data/UI/guis/mainMenu.gui index f33c06b1d..4c6c13697 100644 --- a/Templates/BaseGame/game/data/UI/guis/mainMenu.gui +++ b/Templates/BaseGame/game/data/UI/guis/mainMenu.gui @@ -1,6 +1,6 @@ //--- OBJECT WRITE BEGIN --- $guiContent = new GuiChunkedBitmapCtrl(MainMenuGui) { - bitmapAsset = "UI:background_dark_image"; + BitmapAsset = "UI:background_dark_image"; useVariable = "0"; tile = "0"; position = "0 0"; @@ -19,15 +19,11 @@ $guiContent = new GuiChunkedBitmapCtrl(MainMenuGui) { Enabled = "1"; isDecoy = "0"; navigationIndex = "-1"; - + new GuiBitmapCtrl(MainMenuAppLogo) { - bitmapAsset = "UI:Torque_3D_logo_alt_image"; - bitmapMode = "Stretched"; - autoFitExtents = "0"; - useModifiers = "0"; - useStates = "1"; - masked = "0"; - groupNum = "-1"; + BitmapAsset = "UI:Torque_3D_logo_alt_image"; + color = "255 255 255 255"; + wrap = "0"; position = "550 30"; extent = "443 139"; minExtent = "8 2"; @@ -41,26 +37,179 @@ $guiContent = new GuiChunkedBitmapCtrl(MainMenuGui) { isContainer = "0"; canSave = "1"; canSaveDynamicFields = "1"; + autoFitExtents = "0"; + bitmapMode = "Stretched"; + groupNum = "-1"; + masked = "0"; navigationIndex = "-1"; + useModifiers = "0"; + useStates = "1"; }; - - new GuiGameListMenuCtrl(MainMenuButtonList) { - debugRender = "0"; - callbackOnInputs = "1"; - position = "292 103"; - extent = "439 561"; - minExtent = "8 2"; + new GuiStackControl(MainMenuButtonList) { + stackingType = "Vertical"; + horizStacking = "Left to Right"; + vertStacking = "Top to Bottom"; + padding = "15"; + dynamicSize = "0"; + dynamicNonStackExtent = "0"; + dynamicPos = "0"; + changeChildSizeToFit = "1"; + changeChildPosition = "1"; + position = "312 111"; + extent = "400 477"; + minExtent = "16 16"; horizSizing = "center"; vertSizing = "center"; - profile = "DefaultListMenuProfile"; + profile = "GuiDefaultProfile"; visible = "1"; active = "1"; tooltipProfile = "GuiToolTipProfile"; hovertime = "1000"; - isContainer = "0"; - class = "UIMenuButtonList"; + isContainer = "1"; canSave = "1"; canSaveDynamicFields = "0"; + class = "MenuList"; + + new GuiButtonCtrl(MainMenuSinglePlayerBtn) { + text = "Single Player"; + 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 = "openSinglePlayerMenu();"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "0"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + new GuiButtonCtrl(MainMenuCreateSrvrBtn) { + text = "Create Server"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "0 70"; + extent = "400 55"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "bottom"; + profile = "GuiMenuButtonProfile"; + visible = "1"; + active = "1"; + command = "openMultiPlayerMenu();"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "0"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + new GuiButtonCtrl(MainMenuJoinSrvrBtn) { + text = "Join Server"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "0 140"; + extent = "400 55"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "bottom"; + profile = "GuiMenuButtonProfile"; + visible = "1"; + active = "1"; + command = "openJoinServerMenu();"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "0"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + new GuiButtonCtrl(MainMenuOptionBtn) { + text = "Options"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "0 210"; + extent = "400 55"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "bottom"; + profile = "GuiMenuButtonProfile"; + visible = "1"; + active = "1"; + command = "openOptionsMenu();"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "0"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + new GuiButtonCtrl(MainMenuWorldEditBtn) { + text = "Open World Editor"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "0 280"; + extent = "400 55"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "bottom"; + profile = "GuiMenuButtonProfile"; + visible = "1"; + active = "1"; + command = "openWorldEditorBtn();"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "0"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + new GuiButtonCtrl(MainMenuGuiEditBtn) { + text = "Open GUI Editor"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "0 350"; + extent = "400 55"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "bottom"; + profile = "GuiMenuButtonProfile"; + visible = "1"; + active = "1"; + command = "openGUIEditorBtn();"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "0"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + new GuiButtonCtrl(MainMenuExitBtn) { + text = "Exit"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "0 420"; + extent = "400 55"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "bottom"; + profile = "GuiMenuButtonProfile"; + visible = "1"; + active = "1"; + command = "exit();"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "0"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; }; new GuiControl(MainMenuButtonHolder) { position = "189 711"; @@ -80,7 +229,7 @@ $guiContent = new GuiChunkedBitmapCtrl(MainMenuGui) { new GuiIconButtonCtrl() { buttonMargin = "4 4"; - iconBitmap = "data/ui/images/Inputs/Keyboard & Mouse/Keyboard_Black_Enter"; + BitmapAsset = "UI:Keyboard_Black_Return_image"; iconLocation = "Left"; sizeIconToButton = "1"; makeIconSquare = "1"; @@ -109,5 +258,26 @@ $guiContent = new GuiChunkedBitmapCtrl(MainMenuGui) { canSaveDynamicFields = "0"; }; }; + new GuiInputCtrl(MainMenuInputHandler) { + class = "MenuInputHandler"; + sendAxisEvents = "1"; + sendBreakEvents = "1"; + sendModifierEvents = "0"; + ignoreMouseEvents = "1"; + lockMouse = "0"; + position = "-50 0"; + extent = "10 10"; + minExtent = "8 2"; + horizSizing = "width"; + vertSizing = "height"; + profile = "GuiInputCtrlProfile"; + visible = "1"; + active = "1"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "0"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; }; //--- OBJECT WRITE END --- diff --git a/Templates/BaseGame/game/data/UI/guis/mainMenu.tscript b/Templates/BaseGame/game/data/UI/guis/mainMenu.tscript index f66551acd..0d830f176 100644 --- a/Templates/BaseGame/game/data/UI/guis/mainMenu.tscript +++ b/Templates/BaseGame/game/data/UI/guis/mainMenu.tscript @@ -5,8 +5,9 @@ function MainMenuGui::onAdd(%this) function MainMenuGui::onWake(%this) { - MainMenuButtonList.hidden = false; + MainMenuButtonList.setAsActiveMenuList(); MainMenuButtonHolder.setActive(); + MainMenuInputHandler.setFirstResponder(); } function MainMenuGui::onSleep(%this) @@ -16,18 +17,7 @@ function MainMenuGui::onSleep(%this) function MainMenuButtonHolder::onWake(%this) { - %this-->goButton.set("btn_a", "Return", "Go", "MainMenuButtonList.activateRow();"); -} - -function MainMenuButtonList::onAdd(%this) -{ - MainMenuButtonList.addRow("Single Player", "openSinglePlayerMenu", 0); - MainMenuButtonList.addRow("Create Server", "openMultiPlayerMenu", 4, -15); - MainMenuButtonList.addRow("Join Server", "openJoinServerMenu", 4, -15); - MainMenuButtonList.addRow("Options", "openOptionsMenu", 6, -15); - MainMenuButtonList.addRow("Open World Editor", "openWorldEditorBtn", 6, -15); - MainMenuButtonList.addRow("Open GUI Editor", "openGUIEditorBtn", 6, -15); - MainMenuButtonList.addRow("Exit Game", "quit", 8, -15); + %this-->goButton.set("btn_a", "Return", "Go", "MainMenuButtonList.activate();"); } function openSinglePlayerMenu() diff --git a/Templates/BaseGame/game/data/UI/guis/optionsDlg.gui b/Templates/BaseGame/game/data/UI/guis/optionsDlg.gui deleted file mode 100644 index b2758c32c..000000000 --- a/Templates/BaseGame/game/data/UI/guis/optionsDlg.gui +++ /dev/null @@ -1,1432 +0,0 @@ -//--- OBJECT WRITE BEGIN --- -$guiContent = new GuiControl(OptionsDlg) { - position = "0 0"; - extent = "1024 768"; - minExtent = "8 8"; - horizSizing = "width"; - vertSizing = "height"; - profile = "GuiOverlayProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - canSave = "1"; - canSaveDynamicFields = "1"; - fixedAspectRatio = "0"; - - new GuiWindowCtrl() { - text = "Options"; - resizeWidth = "0"; - resizeHeight = "0"; - canMove = "1"; - canClose = "1"; - canMinimize = "0"; - canMaximize = "0"; - canCollapse = "0"; - closeCommand = "Canvas.popDialog(optionsDlg);"; - edgeSnap = "0"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "323 232"; - extent = "377 303"; - minExtent = "8 8"; - horizSizing = "center"; - vertSizing = "center"; - profile = "GuiWindowProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - - new GuiButtonCtrl() { - text = "Done"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "306 271"; - extent = "60 23"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiButtonProfile"; - visible = "1"; - active = "1"; - command = "Canvas.popDialog(optionsDlg);"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiBitmapBorderCtrl() { - position = "9 55"; - extent = "358 210"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiTabBorderProfile"; - visible = "0"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - internalName = "OptControlsPane"; - hidden = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - - new GuiScrollCtrl() { - willFirstRespond = "1"; - hScrollBar = "alwaysOff"; - vScrollBar = "alwaysOn"; - lockHorizScroll = "1"; - 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 = "5 24"; - extent = "347 152"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiScrollProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - - new GuiTextListCtrl() { - columns = "0 160"; - fitParentWidth = "1"; - clipColumnText = "0"; - position = "1 1"; - extent = "329 780"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiDefaultProfile"; - visible = "1"; - active = "1"; - altCommand = "OptionsDlg.doRemap();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - internalName = "OptRemapList"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - }; - new GuiTextCtrl() { - text = "Control Name"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "6 6"; - extent = "64 18"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiTextProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiTextCtrl() { - text = "Control Binding"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "165 6"; - extent = "72 18"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiTextProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - - new GuiSliderCtrl(OptMouseSensitivity) { - range = "0.02 2"; - ticks = "10"; - value = "0.75"; - isContainer = "0"; - Profile = "GuiSliderProfile"; - HorizSizing = "right"; - VertSizing = "bottom"; - position = "105 182"; - Extent = "244 18"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - Command = "OptMouseSetSensitivity(OptMouseSensitivity.value);"; - tooltipprofile = "GuiToolTipProfile"; - hovertime = "1000"; - canSaveDynamicFields = "0"; - }; - new GuiTextCtrl() { - text = "Mouse Sensitivity:"; - maxLength = "255"; - Margin = "0 0 0 0"; - Padding = "0 0 0 0"; - AnchorTop = "1"; - AnchorBottom = "0"; - AnchorLeft = "1"; - AnchorRight = "0"; - isContainer = "0"; - Profile = "GuiTextProfile"; - HorizSizing = "right"; - VertSizing = "bottom"; - position = "15 182"; - Extent = "85 18"; - MinExtent = "8 8"; - canSave = "1"; - Visible = "1"; - tooltipprofile = "GuiToolTipProfile"; - hovertime = "1000"; - canSaveDynamicFields = "0"; - }; - }; - new GuiBitmapBorderCtrl() { - position = "9 55"; - extent = "358 210"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiTabBorderProfile"; - visible = "0"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - internalName = "OptAudioPane"; - hidden = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - - new GuiMLTextCtrl() { - lineSpacing = "2"; - allowColorChars = "0"; - maxChars = "-1"; - useURLMouseCursor = "0"; - position = "149 10"; - extent = "190 14"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMLTextProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "OptAudioInfo"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiTextCtrl() { - text = "Audio Provider:"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "16 16"; - extent = "75 18"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiTextProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiPopUpMenuCtrl(OptAudioProviderList) { - maxPopupHeight = "200"; - sbUsesNAColor = "0"; - reverseTextList = "0"; - bitmapBounds = "16 16"; - text = "Null"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "101 15"; - extent = "240 18"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiPopUpMenuProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiTextCtrl() { - text = "Audio Device:"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "23 48"; - extent = "75 18"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiTextProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiPopUpMenuCtrl(OptAudioDeviceList) { - maxPopupHeight = "200"; - sbUsesNAColor = "0"; - reverseTextList = "0"; - bitmapBounds = "16 16"; - text = "SFX Null Device"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "101 47"; - extent = "240 18"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiPopUpMenuProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiControl() { - position = "18 84"; - extent = "325 17"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiDefaultProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - - new GuiTextCtrl() { - text = "Master Volume"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "0 0"; - extent = "72 18"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiAutoSizeTextProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiSliderCtrl() { - range = "0 1"; - ticks = "0"; - snap = "0"; - value = "0.8"; - position = "85 1"; - extent = "240 14"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiSliderProfile"; - visible = "1"; - active = "1"; - altCommand = "OptAudioUpdateMasterVolume( $thisControl.value );"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "OptAudioVolumeMaster"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - }; - new GuiControl() { - position = "9 115"; - extent = "334 17"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiDefaultProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - - new GuiTextCtrl() { - text = "Interface Volume"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "0 0"; - extent = "82 18"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiAutoSizeTextProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiSliderCtrl() { - range = "0 1"; - ticks = "0"; - snap = "0"; - value = "1"; - position = "94 2"; - extent = "240 13"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiSliderProfile"; - visible = "1"; - active = "1"; - altCommand = "OptAudioUpdateChannelVolume(AudioGui, $thisControl.value);"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "OptAudioVolumeShell"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - }; - new GuiControl() { - position = "18 146"; - extent = "325 17"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiDefaultProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - - new GuiTextCtrl() { - text = "Effects Volume"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "0 0"; - extent = "74 18"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiAutoSizeTextProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiSliderCtrl() { - range = "0 1"; - ticks = "0"; - snap = "0"; - value = "1"; - position = "85 2"; - extent = "240 13"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiSliderProfile"; - visible = "1"; - active = "1"; - altCommand = "OptAudioUpdateChannelVolume(AudioEffect, $thisControl.value);"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "OptAudioVolumeSim"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - }; - new GuiControl() { - position = "23 177"; - extent = "320 17"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiDefaultProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - - new GuiSliderCtrl() { - range = "0 1"; - ticks = "0"; - snap = "0"; - value = "1"; - position = "80 2"; - extent = "240 13"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiSliderProfile"; - visible = "1"; - active = "1"; - altCommand = "OptAudioUpdateChannelVolume(AudioMusic, $thisControl.value);"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "OptAudioVolumeMusic"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiTextCtrl() { - text = "Music Volume"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "0 0"; - extent = "67 18"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiAutoSizeTextProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - }; - }; - new GuiBitmapBorderCtrl() { - position = "9 55"; - extent = "358 210"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiTabBorderProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - internalName = "OptGraphicsPane"; - canSave = "1"; - canSaveDynamicFields = "0"; - - new GuiTextCtrl() { - text = "Display Driver:"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "11 8"; - extent = "70 18"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiTextProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiTextCtrl() { - text = "Resolution:"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "11 35"; - extent = "53 18"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiTextProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiCheckBoxCtrl() { - text = "Fullscreen"; - groupNum = "-1"; - buttonType = "ToggleButton"; - useMouseEvents = "0"; - position = "11 62"; - extent = "85 18"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiCheckBoxProfile"; - visible = "1"; - active = "1"; - command = "OptionsDlg._updateApplyState();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "OptGraphicsFullscreenToggle"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiPopUpMenuCtrl(OptGraphicsDriverMenu) { - maxPopupHeight = "200"; - sbUsesNAColor = "0"; - reverseTextList = "0"; - bitmapBounds = "16 16"; - text = "ATI Radeon HD 5700 Series (D3D9)"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "88 8"; - extent = "258 18"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiPopUpMenuProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiPopUpMenuCtrl() { - maxPopupHeight = "200"; - sbUsesNAColor = "0"; - reverseTextList = "0"; - bitmapBounds = "16 16"; - text = "1024 x 768 (4:3)"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "67 35"; - extent = "127 18"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiPopUpMenuProfile"; - visible = "1"; - active = "1"; - command = "OptionsDlg._updateApplyState();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "OptGraphicsResolutionMenu"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiTextCtrl() { - text = "Refresh:"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "207 35"; - extent = "45 18"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiTextProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiPopUpMenuCtrl() { - maxPopupHeight = "200"; - sbUsesNAColor = "0"; - reverseTextList = "0"; - bitmapBounds = "16 16"; - text = "60"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "252 35"; - extent = "49 18"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiPopUpMenuProfile"; - visible = "1"; - active = "1"; - command = "OptionsDlg._updateApplyState();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "OptRefreshSelectMenu"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiTextCtrl() { - text = "Mesh Quality:"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "21 91"; - extent = "62 18"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiTextProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiPopUpMenuCtrl() { - maxPopupHeight = "200"; - sbUsesNAColor = "0"; - reverseTextList = "0"; - bitmapBounds = "16 16"; - text = "Low"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "90 91"; - extent = "78 18"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiPopUpMenuProfile"; - visible = "1"; - active = "1"; - command = "OptionsDlg._updateApplyState();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "OptMeshQualityPopup"; - class = "GraphicsQualityPopup"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiPopUpMenuCtrl() { - maxPopupHeight = "200"; - sbUsesNAColor = "0"; - reverseTextList = "0"; - bitmapBounds = "16 16"; - text = "Low"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "90 118"; - extent = "78 18"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiPopUpMenuProfile"; - visible = "1"; - active = "1"; - command = "OptionsDlg._updateApplyState();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "OptTextureQualityPopup"; - class = "GraphicsQualityPopup"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiTextCtrl() { - text = "Texture Quality:"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "11 118"; - extent = "77 18"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiTextProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiPopUpMenuCtrl() { - maxPopupHeight = "200"; - sbUsesNAColor = "0"; - reverseTextList = "0"; - bitmapBounds = "16 16"; - text = "Low"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "90 143"; - extent = "78 18"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiPopUpMenuProfile"; - visible = "1"; - active = "1"; - command = "OptionsDlg._updateApplyState();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "OptLightingQualityPopup"; - class = "GraphicsQualityPopup"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiTextCtrl() { - text = "Lighting Quality:"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "11 143"; - extent = "73 18"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiTextProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiTextCtrl() { - text = "Effect Quality:"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "191 91"; - extent = "73 18"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiTextProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiPopUpMenuCtrl() { - maxPopupHeight = "200"; - sbUsesNAColor = "0"; - reverseTextList = "0"; - bitmapBounds = "16 16"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "263 91"; - extent = "78 18"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiPopUpMenuProfile"; - visible = "1"; - active = "1"; - command = "OptionsDlg._updateApplyState();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "OptEffectQualityPopup"; - class = "GraphicsQualityPopup"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiTextCtrl() { - text = "Shader Quality:"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "186 118"; - extent = "77 18"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiTextProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiPopUpMenuCtrl() { - maxPopupHeight = "200"; - sbUsesNAColor = "0"; - reverseTextList = "0"; - bitmapBounds = "16 16"; - text = "Low"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "263 118"; - extent = "78 18"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiPopUpMenuProfile"; - visible = "1"; - active = "1"; - command = "OptionsDlg._updateApplyState();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "OptShaderQualityPopup"; - class = "GraphicsQualityPopup"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiTextCtrl() { - text = "Particle Quality:"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "186 156"; - extent = "73 18"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiTextProfile"; - visible = "0"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - hidden = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiPopUpMenuCtrl() { - maxPopupHeight = "200"; - sbUsesNAColor = "0"; - reverseTextList = "0"; - bitmapBounds = "16 16"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "263 156"; - extent = "78 18"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiPopUpMenuProfile"; - visible = "0"; - active = "1"; - command = "OptionsDlg._updateApplyState();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "OptParticleQualityPopup"; - class = "GraphicsQualityPopup"; - hidden = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiTextCtrl() { - text = "Anisotropic Filtering:"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "22 167"; - extent = "105 18"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiTextProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiPopUpMenuCtrl() { - maxPopupHeight = "200"; - sbUsesNAColor = "0"; - reverseTextList = "0"; - bitmapBounds = "16 16"; - text = "Off"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "123 167"; - extent = "45 18"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiPopUpMenuProfile"; - visible = "1"; - active = "1"; - command = "OptionsDlg._updateApplyState();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "OptAnisotropicPopup"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiCheckBoxCtrl() { - text = "Vertical Sync"; - groupNum = "-1"; - buttonType = "ToggleButton"; - useMouseEvents = "0"; - position = "92 62"; - extent = "85 18"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiCheckBoxProfile"; - visible = "1"; - active = "1"; - command = "OptionsDlg._updateApplyState();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "OptGraphicsVSyncToggle"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiButtonCtrl() { - text = "Auto Detect Quality"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "205 152"; - extent = "110 27"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiButtonProfile"; - visible = "1"; - active = "1"; - command = "OptionsDlg._autoDetectQuality();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiPopUpMenuCtrl() { - maxPopupHeight = "200"; - sbUsesNAColor = "0"; - reverseTextList = "0"; - bitmapBounds = "16 16"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "263 62"; - extent = "78 18"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiPopUpMenuProfile"; - visible = "1"; - active = "1"; - command = "OptionsDlg._updateApplyState();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "OptAAQualityPopup"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiTextCtrl() { - text = "Anti-aliasing"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "191 62"; - extent = "73 18"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiTextProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiControl() { - position = "0 190"; - extent = "352 15"; - minExtent = "8 2"; - horizSizing = "width"; - vertSizing = "bottom"; - profile = "GuiDefaultProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - internalName = "GammaSliderContainer"; - canSave = "1"; - canSaveDynamicFields = "0"; - - new GuiSliderCtrl() { - range = "0.001 2.2"; - ticks = "0"; - snap = "0"; - value = "1"; - position = "76 -1"; - extent = "268 15"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiSliderProfile"; - visible = "1"; - active = "1"; - variable = "$pref::Video::Gamma"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiTextCtrl() { - text = "Gamma:"; - maxLength = "255"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "22 -4"; - extent = "105 18"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiTextProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - }; - }; - new GuiControl() { - position = "9 55"; - extent = "357 208"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiWindowProfile"; - visible = "0"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - internalName = "OptNetworkPane"; - hidden = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiButtonCtrl() { - text = "Graphics"; - groupNum = "-1"; - buttonType = "RadioButton"; - useMouseEvents = "0"; - position = "9 33"; - extent = "117 23"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiButtonTabProfile"; - visible = "1"; - active = "1"; - command = "optionsDlg.setPane(Graphics);"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "OptGraphicsButton"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiButtonCtrl() { - text = "Audio"; - groupNum = "-1"; - buttonType = "RadioButton"; - useMouseEvents = "0"; - position = "126 33"; - extent = "117 23"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiButtonTabProfile"; - visible = "1"; - active = "1"; - command = "optionsDlg.setPane(Audio);"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiButtonCtrl() { - text = "Controls"; - groupNum = "-1"; - buttonType = "RadioButton"; - useMouseEvents = "0"; - position = "243 33"; - extent = "117 23"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiButtonTabProfile"; - visible = "1"; - active = "1"; - command = "optionsDlg.setPane(Controls);"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiButtonCtrl() { - text = "Apply"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "241 271"; - extent = "60 23"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiButtonProfile"; - visible = "1"; - active = "0"; - command = "optionsDlg.applyGraphics();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "apply"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - }; - new GuiControl(OptionsButtonHolder) { - position = "190 652"; - extent = "646 130"; - minExtent = "8 2"; - horizSizing = "center"; - vertSizing = "top"; - profile = "GuiDefaultProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; -}; -//--- OBJECT WRITE END --- diff --git a/Templates/BaseGame/game/data/UI/guis/optionsMenu.gui b/Templates/BaseGame/game/data/UI/guis/optionsMenu.gui index 9b76cb979..b7195557c 100644 --- a/Templates/BaseGame/game/data/UI/guis/optionsMenu.gui +++ b/Templates/BaseGame/game/data/UI/guis/optionsMenu.gui @@ -23,7 +23,7 @@ $guiContent = new GuiControl(OptionsMenu) { position = "48 56"; extent = "928 655"; minExtent = "8 2"; - horizSizing = "center"; + horizSizing = "aspectCenter"; vertSizing = "center"; profile = "GuiDefaultProfile"; visible = "1"; @@ -38,7 +38,27 @@ $guiContent = new GuiControl(OptionsMenu) { percent = "100"; vertical = "0"; flipClip = "0"; - bitmap = "data/ui/images/panel.png"; + BitmapAsset = "UI:panel_low_image"; + color = "255 255 255 255"; + position = "0 40"; + extent = "927 618"; + minExtent = "8 2"; + horizSizing = "width"; + vertSizing = "bottom"; + profile = "GuiDefaultProfile"; + visible = "1"; + active = "1"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "0"; + 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 = "927 40"; @@ -77,179 +97,6 @@ $guiContent = new GuiControl(OptionsMenu) { canSave = "1"; canSaveDynamicFields = "0"; }; - new GuiBitmapBarCtrl() { - percent = "100"; - vertical = "0"; - flipClip = "0"; - bitmap = "data/ui/images/panel_low.png"; - color = "255 255 255 255"; - position = "0 40"; - extent = "927 618"; - minExtent = "8 2"; - horizSizing = "width"; - vertSizing = "bottom"; - profile = "GuiDefaultProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiButtonCtrl() { - text = "Display"; - groupNum = "1"; - buttonType = "RadioButton"; - useMouseEvents = "0"; - position = "114 49"; - extent = "140 32"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "1"; - active = "1"; - command = "OptionsMenu.populateDisplaySettingsList();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "DisplayButton"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiButtonCtrl() { - text = "Graphics"; - groupNum = "1"; - buttonType = "RadioButton"; - useMouseEvents = "0"; - position = "258 49"; - extent = "140 32"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "1"; - active = "1"; - command = "OptionsMenu.populateGraphicsSettingsList();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "GraphicsButton"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiButtonCtrl() { - text = "Audio"; - groupNum = "1"; - buttonType = "RadioButton"; - useMouseEvents = "0"; - position = "402 49"; - extent = "140 32"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "1"; - active = "1"; - command = "OptionsMenu.populateAudioSettingsList();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "AudioButton"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiButtonCtrl() { - text = "Keyboard + Mouse"; - groupNum = "1"; - buttonType = "RadioButton"; - useMouseEvents = "0"; - position = "547 49"; - extent = "140 32"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "1"; - active = "1"; - command = "OptionsMenu.populateKeyboardMouseSettingsList();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "KBMButton"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiButtonCtrl() { - text = "Gamepad"; - groupNum = "1"; - buttonType = "RadioButton"; - useMouseEvents = "0"; - position = "691 49"; - extent = "140 32"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "1"; - active = "1"; - command = "OptionsMenu.populateGamepadSettingsList();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "gamepadButton"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiScrollCtrl() { - willFirstRespond = "1"; - hScrollBar = "alwaysOff"; - vScrollBar = "dynamic"; - lockHorizScroll = "1"; - 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 = "1 83"; - extent = "622 573"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuScrollProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - - new GuiGameListMenuCtrl(OptionsMenuSettingsList) { - debugRender = "0"; - callbackOnInputs = "1"; - position = "1 1"; - extent = "621 510"; - minExtent = "8 2"; - horizSizing = "width"; - vertSizing = "bottom"; - profile = "DefaultListMenuProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - class = "UIMenuButtonList"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - }; new GuiTextCtrl(OptionName) { maxLength = "1024"; margin = "0 0 0 0"; @@ -258,10 +105,10 @@ $guiContent = new GuiControl(OptionsMenu) { anchorBottom = "0"; anchorLeft = "1"; anchorRight = "0"; - position = "635 94"; + position = "3 606"; extent = "293 17"; minExtent = "8 2"; - horizSizing = "right"; + horizSizing = "width"; vertSizing = "bottom"; profile = "MenuSubHeaderText"; visible = "1"; @@ -278,10 +125,10 @@ $guiContent = new GuiControl(OptionsMenu) { maxChars = "-1"; text = "This is a placeholder text for an option."; useURLMouseCursor = "0"; - position = "635 126"; + position = "3 625"; extent = "293 14"; minExtent = "8 2"; - horizSizing = "right"; + horizSizing = "width"; vertSizing = "bottom"; profile = "GuiMLTextProfile"; visible = "1"; @@ -292,24 +139,286 @@ $guiContent = new GuiControl(OptionsMenu) { canSave = "1"; canSaveDynamicFields = "0"; }; - }; - new GuiControl() { - position = "189 652"; - extent = "646 130"; - minExtent = "8 2"; - horizSizing = "center"; - vertSizing = "top"; - profile = "GuiDefaultProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; + new GuiSplitContainer() { + orientation = "Vertical"; + splitterSize = "2"; + splitPoint = "250 100"; + fixedPanel = "FirstPanel"; + fixedSize = "250"; + docking = "None"; + margin = "0 0 0 0"; + padding = "0 0 0 0"; + anchorTop = "1"; + anchorBottom = "0"; + anchorLeft = "1"; + anchorRight = "0"; + position = "0 48"; + extent = "928 555"; + minExtent = "64 64"; + horizSizing = "width"; + vertSizing = "bottom"; + profile = "GuiMenuScrollProfile"; + visible = "1"; + active = "1"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "1"; + canSave = "1"; + canSaveDynamicFields = "0"; + + new GuiPanel() { + docking = "Client"; + margin = "0 0 0 0"; + padding = "0 0 0 0"; + anchorTop = "1"; + anchorBottom = "0"; + anchorLeft = "1"; + anchorRight = "0"; + position = "0 0"; + extent = "248 555"; + minExtent = "16 16"; + horizSizing = "right"; + vertSizing = "bottom"; + profile = "GuiOverlayProfile"; + visible = "1"; + active = "1"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "1"; + internalName = "Panel1"; + canSave = "1"; + canSaveDynamicFields = "0"; + + new GuiStackControl(OptionsMenuCategoryList) { + stackingType = "Vertical"; + horizStacking = "Left to Right"; + vertStacking = "Top to Bottom"; + padding = "10"; + dynamicSize = "0"; + dynamicNonStackExtent = "0"; + dynamicPos = "0"; + changeChildSizeToFit = "1"; + changeChildPosition = "1"; + position = "0 0"; + extent = "248 555"; + minExtent = "16 16"; + horizSizing = "width"; + vertSizing = "height"; + profile = "GuiDefaultProfile"; + visible = "1"; + active = "1"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "1"; + class = "MenuList"; + canSave = "1"; + canSaveDynamicFields = "0"; + + new GuiButtonCtrl(OptionsMenuDisplayBtn) { + text = "Display"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "0 0"; + extent = "248 35"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "bottom"; + profile = "GuiMenuButtonProfile"; + visible = "1"; + active = "1"; + command = "populateDisplaySettingsList();"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "0"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + new GuiButtonCtrl(OptionsMenuGraphicsBtn) { + text = "Graphics"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "0 45"; + extent = "248 35"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "bottom"; + profile = "GuiMenuButtonProfile"; + visible = "1"; + active = "1"; + command = "populateGraphicsSettingsList();"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "0"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + new GuiButtonCtrl(OptionsMenuAudioBtn) { + text = "Audio"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "0 90"; + extent = "248 35"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "bottom"; + profile = "GuiMenuButtonProfile"; + visible = "1"; + active = "1"; + command = "populateAudioSettingsList();"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "0"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + new GuiButtonCtrl(OptionsMenuKBMBtn) { + text = "Keyboard & Mouse"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "0 135"; + extent = "248 35"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "bottom"; + profile = "GuiMenuButtonProfile"; + visible = "1"; + active = "1"; + command = "populateKeyboardMouseSettingsList();"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "0"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + new GuiButtonCtrl(OptionsMenuGamepadBtn) { + text = "Gamepad"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "0 180"; + extent = "248 35"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "bottom"; + profile = "GuiMenuButtonProfile"; + visible = "1"; + active = "1"; + command = "populateGamepadSettingsList();"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "0"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + new GuiButtonCtrl(OptionsMenuProfileBtn) { + text = "Profile"; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "0 225"; + extent = "248 35"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "bottom"; + profile = "GuiMenuButtonProfile"; + visible = "1"; + active = "1"; + command = "populateProfileSettingsList();"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "0"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + }; + }; + new GuiPanel() { + docking = "Client"; + margin = "0 0 0 0"; + padding = "0 0 0 0"; + anchorTop = "1"; + anchorBottom = "0"; + anchorLeft = "1"; + anchorRight = "0"; + position = "252 0"; + extent = "676 555"; + minExtent = "16 16"; + horizSizing = "right"; + vertSizing = "bottom"; + profile = "GuiOverlayProfile"; + visible = "1"; + active = "1"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "1"; + internalName = "panel2"; + canSave = "1"; + canSaveDynamicFields = "0"; + + new GuiScrollCtrl() { + willFirstRespond = "1"; + hScrollBar = "alwaysOff"; + vScrollBar = "dynamic"; + 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 = "0 0"; + extent = "676 554"; + minExtent = "8 2"; + horizSizing = "width"; + vertSizing = "height"; + profile = "GuiMenuScrollProfile"; + visible = "1"; + active = "1"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "1"; + canSave = "1"; + canSaveDynamicFields = "0"; + + new GuiStackControl(OptionsMenuSettingsList) { + stackingType = "Vertical"; + horizStacking = "Left to Right"; + vertStacking = "Top to Bottom"; + padding = "5"; + dynamicSize = "1"; + dynamicNonStackExtent = "0"; + dynamicPos = "0"; + changeChildSizeToFit = "0"; + changeChildPosition = "1"; + position = "1 1"; + extent = "661 30"; + minExtent = "16 16"; + horizSizing = "width"; + vertSizing = "height"; + profile = "GuiDefaultProfile"; + visible = "1"; + active = "1"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "1"; + class = "MenuList"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + }; + }; + }; }; new GuiControl(OptionsButtonHolder) { - position = "109 711"; + position = "116 711"; extent = "791 40"; minExtent = "8 2"; horizSizing = "center"; @@ -326,7 +435,7 @@ $guiContent = new GuiControl(OptionsMenu) { new GuiIconButtonCtrl() { buttonMargin = "4 4"; - iconBitmap = "data/ui/images/Inputs/Keyboard & Mouse/Keyboard_Black_Enter"; + BitmapAsset = "UI:Keyboard_Black_Return_image"; iconLocation = "Left"; sizeIconToButton = "1"; makeIconSquare = "1"; @@ -345,7 +454,7 @@ $guiContent = new GuiControl(OptionsMenu) { profile = "GuiMenuButtonProfile"; visible = "1"; active = "1"; - command = "ChooseLevelDlg.beginLevel();"; + command = "OptionsMenu.apply();"; tooltipProfile = "GuiToolTipProfile"; hovertime = "1000"; isContainer = "0"; @@ -356,7 +465,7 @@ $guiContent = new GuiControl(OptionsMenu) { }; new GuiIconButtonCtrl() { buttonMargin = "4 4"; - iconBitmap = "data/ui/images/Inputs/Keyboard & Mouse/Keyboard_Black_Esc"; + BitmapAsset = "UI:Keyboard_Black_Escape_image"; iconLocation = "Left"; sizeIconToButton = "1"; makeIconSquare = "1"; @@ -375,7 +484,7 @@ $guiContent = new GuiControl(OptionsMenu) { profile = "GuiMenuButtonProfile"; visible = "1"; active = "1"; - command = "ChooseLevelDlg.backOut();"; + command = "OptionsMenu.backOut();"; tooltipProfile = "GuiToolTipProfile"; hovertime = "1000"; isContainer = "0"; @@ -386,7 +495,7 @@ $guiContent = new GuiControl(OptionsMenu) { }; new GuiIconButtonCtrl() { buttonMargin = "4 4"; - iconBitmap = "data/ui/images/Inputs/Keyboard & Mouse/Keyboard_Black_Enter"; + BitmapAsset = "UI:Switch_LB_image"; iconLocation = "Left"; sizeIconToButton = "1"; makeIconSquare = "1"; @@ -403,19 +512,21 @@ $guiContent = new GuiControl(OptionsMenu) { horizSizing = "right"; vertSizing = "bottom"; profile = "GuiMenuButtonProfile"; - visible = "1"; - active = "1"; + visible = "0"; + active = "0"; + command = "OptionsMenu.prevTab();"; tooltipProfile = "GuiToolTipProfile"; hovertime = "1000"; isContainer = "0"; internalName = "prevTabButton"; class = "MenuInputButton"; + hidden = "1"; canSave = "1"; canSaveDynamicFields = "0"; }; new GuiIconButtonCtrl() { buttonMargin = "4 4"; - iconBitmap = "data/ui/images/Inputs/Keyboard & Mouse/Keyboard_Black_Esc"; + BitmapAsset = "UI:Switch_RB_image"; iconLocation = "Left"; sizeIconToButton = "1"; makeIconSquare = "1"; @@ -432,19 +543,21 @@ $guiContent = new GuiControl(OptionsMenu) { horizSizing = "right"; vertSizing = "bottom"; profile = "GuiMenuButtonProfile"; - visible = "1"; - active = "1"; + visible = "0"; + active = "0"; + command = "OptionsMenu.nextTab();"; tooltipProfile = "GuiToolTipProfile"; hovertime = "1000"; isContainer = "0"; internalName = "nextTabButton"; class = "MenuInputButton"; + hidden = "1"; canSave = "1"; canSaveDynamicFields = "0"; }; new GuiIconButtonCtrl() { buttonMargin = "4 4"; - iconBitmap = "data/ui/images/Inputs/Keyboard & Mouse/Keyboard_Black_Esc"; + BitmapAsset = "UI:Keyboard_Black_R_image"; iconLocation = "Left"; sizeIconToButton = "1"; makeIconSquare = "1"; @@ -463,6 +576,7 @@ $guiContent = new GuiControl(OptionsMenu) { profile = "GuiMenuButtonProfile"; visible = "1"; active = "1"; + command = "OptionsMenu.resetToDefaults();"; tooltipProfile = "GuiToolTipProfile"; hovertime = "1000"; isContainer = "0"; @@ -472,5 +586,26 @@ $guiContent = new GuiControl(OptionsMenu) { canSaveDynamicFields = "0"; }; }; + new GuiInputCtrl(OptionsMenuInputHandler) { + sendAxisEvents = "1"; + sendBreakEvents = "1"; + sendModifierEvents = "0"; + ignoreMouseEvents = "1"; + lockMouse = "0"; + position = "-50 0"; + extent = "10 10"; + minExtent = "8 2"; + horizSizing = "left"; + vertSizing = "top"; + profile = "GuiInputCtrlProfile"; + visible = "1"; + active = "1"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "0"; + class = "MenuInputHandler"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; }; //--- OBJECT WRITE END --- diff --git a/Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript b/Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript index 63488c8d7..eac532203 100644 --- a/Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript +++ b/Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript @@ -54,20 +54,22 @@ function OptionsMenu::onWake(%this) { MainMenuButtonList.hidden = true; - %this.pageTabIndex = 0; - %tab = %this.getTab(); - %tab.performClick(); + OptionsMenuCategoryList.setAsActiveMenuList(); OptionsButtonHolder.setActive(); + + OptionsMenuInputHandler.setFirstResponder(); } function OptionsButtonHolder::onWake(%this) { - %this-->prevTabButton.set("btn_l", "", "Prev Tab", "OptionsMenu.prevTab();", true); - %this-->nextTabButton.set("btn_r", "", "Next Tab", "OptionsMenu.nextTab();", true); + //%this-->prevTabButton.set("btn_l", "", "Prev Tab", "OptionsMenu.prevTab();", true); + %this-->nextTabButton.set("btn_a", "", "Select", "OptionsMenuList.activate();", true); %this-->resetButton.set("btn_back", "R", "Reset", "OptionsMenu.resetToDefaults();"); %this-->applyButton.set("btn_start", "Return", "Apply", "OptionsMenu.apply();"); %this-->backButton.set("btn_b", "Escape", "Back", "OptionsMenu.backOut();"); + + //OptionsMenuCategoryList.getObject(0).performClick(); } function OptionsMenu::apply(%this) @@ -78,7 +80,7 @@ function OptionsMenu::apply(%this) } else if(%this.pageTabIndex == 1) { - %this.applyGraphicsSettings(); + %this.applyGraphicsSettings(); } else if(%this.pageTabIndex == 2) { @@ -130,26 +132,24 @@ function OptionsMenuSettingsList::onChange(%this) if(%currentRowText $= "Display") { - OptionsMenuList.populateDisplaySettingsList(); + populateDisplaySettingsList(); } else if(%currentRowText $= "Graphics") { - OptionsMenuList.populateGraphicsSettingsList(); + populateGraphicsSettingsList(); } else if(%currentRowText $= "Audio") { - OptionsMenuList.populateAudioSettingsList(); + populateAudioSettingsList(); } else if(%currentRowText $= "Keyboard + Mouse") { - OptionsMenuList.populateKeyboardMouseSettingsList(); + populateKeyboardMouseSettingsList(); } else if(%currentRowText $= "Gamepad") { - OptionsMenuList.populateGamepadSettingsList(); + populateGamepadSettingsList(); } - - } function OptionsMenu::prevTab(%this) @@ -188,10 +188,9 @@ function OptionsMenu::getTab(%this) return %this-->DisplayButton; } -function OptionsMenu::populateDisplaySettingsList(%this) +function populateDisplaySettingsList() { - %this.pageTabIndex = 0; - OptionsMenuSettingsList.clearRows(); + OptionsMenuSettingsList.clear(); OptionName.setText(""); OptionDescription.setText(""); @@ -221,7 +220,7 @@ function OptionsMenu::populateDisplaySettingsList(%this) trim(%apiList); - OptionsMenuSettingsList.addOptionRow("Display API", %apiList, false, "", -1, -30, true, "The display API used for rendering.", %displayDevice); + OptionsMenuSettingsList.addOptionRow("Display API", %apiList, false, "", true, "The display API used for rendering.", %displayDevice); %numDevices = Canvas.getMonitorCount(); %devicesList = ""; @@ -235,7 +234,7 @@ function OptionsMenu::populateDisplaySettingsList(%this) } %selectedDevice = getField(%devicesList, $pref::Video::deviceId); - OptionsMenuSettingsList.addOptionRow("Display Device", %devicesList, false, "onDisplayModeChange", -1, -30, true, "The display devices the window should be on.", %selectedDevice); + OptionsMenuSettingsList.addOptionRow("Display Device", %devicesList, false, "onDisplayModeChange", true, "The display devices the window should be on.", %selectedDevice); if (%numDevices > 1) OptionsMenuSettingsList.setRowEnabled(1, true); @@ -243,10 +242,10 @@ function OptionsMenu::populateDisplaySettingsList(%this) OptionsMenuSettingsList.setRowEnabled(1, false); %mode = getField($Video::ModeTags, $pref::Video::deviceMode); - OptionsMenuSettingsList.addOptionRow("Window Mode", $Video::ModeTags, false, "onDisplayModeChange", -1, -30, true, "", %mode); + OptionsMenuSettingsList.addOptionRow("Window Mode", $Video::ModeTags, false, "onDisplayModeChange", true, "", %mode); %resolutionList = getScreenResolutionList($pref::Video::deviceId, $pref::Video::deviceMode); - OptionsMenuSettingsList.addOptionRow("Resolution", %resolutionList, false, "onDisplayResChange", -1, -30, true, "Resolution of the game window", _makePrettyResString( $pref::Video::mode )); + OptionsMenuSettingsList.addOptionRow("Resolution", %resolutionList, false, "onDisplayResChange", true, "Resolution of the game window", _makePrettyResString( $pref::Video::mode )); //If they're doing borderless, the window resolution must match the display resolution if(%mode !$= "Borderless") @@ -254,19 +253,17 @@ function OptionsMenu::populateDisplaySettingsList(%this) else OptionsMenuSettingsList.setRowEnabled(3, false); - OptionsMenuSettingsList.addOptionRow("VSync", "No\tYes", false, "", -1, -30, true, "", convertBoolToYesNo(!$pref::Video::disableVerticalSync)); + OptionsMenuSettingsList.addOptionRow("VSync", "No\tYes", false, "", true, "", convertBoolToYesNo(!$pref::Video::disableVerticalSync)); %refreshList = getScreenRefreshList($pref::Video::mode); - OptionsMenuSettingsList.addOptionRow("Refresh Rate", %refreshList, false, "", -1, -30, true, "", $pref::Video::RefreshRate); + OptionsMenuSettingsList.addOptionRow("Refresh Rate", %refreshList, false, "", true, "", $pref::Video::RefreshRate); //move to gameplay tab - OptionsMenuSettingsList.addSliderRow("Field of View", 75, 5, "65 100", "", -1, -30); + OptionsMenuSettingsList.addSliderRow("Field of View", 75, 5, "65 100", ""); - OptionsMenuSettingsList.addSliderRow("Brightness", 0.5, 0.1, "0 1", "", -1, -30); - OptionsMenuSettingsList.addSliderRow("Contrast", 0.5, 0.1, "0 1", "", -1, -30); - - OptionsMenuSettingsList.refresh(); + OptionsMenuSettingsList.addSliderRow("Brightness", 0.5, 0.1, "0 1", ""); + OptionsMenuSettingsList.addSliderRow("Contrast", 0.5, 0.1, "0 1", ""); } function OptionsMenu::applyDisplaySettings(%this) @@ -290,10 +287,9 @@ function OptionsMenu::applyDisplaySettings(%this) export("$pref::*", %prefPath @ "/clientPrefs." @ $TorqueScriptFileExtension, false); } -function OptionsMenu::populateGraphicsSettingsList(%this) +function populateGraphicsSettingsList(%this) { - %this.pageTabIndex = 1; - OptionsMenuSettingsList.clearRows(); + OptionsMenuSettingsList.clear(); OptionName.setText(""); OptionDescription.setText(""); @@ -303,26 +299,24 @@ function OptionsMenu::populateGraphicsSettingsList(%this) %highMedLow = "Low\tMedium\tHigh"; %anisoFilter = "Off\t4\t8\t16"; %aaFilter = "Off\t1\t2\t4"; - OptionsMenuSettingsList.addOptionRow("Lighting Quality", getQualityLevels(LightingQualityList), false, "", -1, -30, true, "Amount and drawdistance of local lights", getCurrentQualityLevel(LightingQualityList)); - OptionsMenuSettingsList.addOptionRow("Shadow Quality", getQualityLevels(ShadowQualityList), false, "", -1, -30, true, "Shadow revolution quality", getCurrentQualityLevel(ShadowQualityList)); - OptionsMenuSettingsList.addOptionRow("Soft Shadow Quality", getQualityLevels(SoftShadowList), false, "", -1, -30, true, "Amount of softening applied to shadowmaps", getCurrentQualityLevel(SoftShadowList)); - OptionsMenuSettingsList.addOptionRow("Mesh Quality", getQualityLevels(MeshQualityGroup), false, "", -1, -30, true, "Fidelity of rendering of mesh objects", getCurrentQualityLevel(MeshQualityGroup)); - OptionsMenuSettingsList.addOptionRow("Object Draw Distance", getQualityLevels(MeshDrawDistQualityGroup), false, "", -1, -30, true, "Dictates if and when static objects fade out in the distance", getCurrentQualityLevel(MeshDrawDistQualityGroup)); - OptionsMenuSettingsList.addOptionRow("Texture Quality", getQualityLevels(TextureQualityGroup), false, "", -1, -30, true, "Fidelity of textures", getCurrentQualityLevel(TextureQualityGroup)); - OptionsMenuSettingsList.addOptionRow("Terrain Quality", getQualityLevels(TerrainQualityGroup), false, "", -1, -30, true, "Quality level of terrain objects", getCurrentQualityLevel(TerrainQualityGroup)); - OptionsMenuSettingsList.addOptionRow("Decal Lifetime", getQualityLevels(DecalLifetimeGroup), false, "", -1, -30, true, "How long decals are rendered", getCurrentQualityLevel(DecalLifetimeGroup)); - OptionsMenuSettingsList.addOptionRow("Ground Cover Density", getQualityLevels(GroundCoverDensityGroup), false, "", -1, -30, true, "Density of ground cover items, such as grass", getCurrentQualityLevel(GroundCoverDensityGroup)); - OptionsMenuSettingsList.addOptionRow("Shader Quality", getQualityLevels(ShaderQualityGroup), false, "", -1, -30, true, "Dictates the overall shader quality level, adjusting what features are enabled.", getCurrentQualityLevel(ShaderQualityGroup)); - OptionsMenuSettingsList.addOptionRow("Anisotropic Filtering", %anisoFilter, false, "", -1, -30, true, "Amount of Anisotropic Filtering on textures, which dictates their sharpness at a distance", $pref::Video::defaultAnisotropy); - OptionsMenuSettingsList.addOptionRow("Anti-Aliasing", %aaFilter, false, "", -1, -30, true, "Amount of Post-Processing Anti-Aliasing applied to rendering", $pref::Video::AA); - OptionsMenuSettingsList.addOptionRow("Parallax", %onOffList, false, "", -1, -30, true, "Whether the surface parallax shader effect is enabled", convertBoolToOnOff(!$pref::Video::disableParallaxMapping)); - OptionsMenuSettingsList.addOptionRow("Water Reflections", %onOffList, false, "", -1, -30, true, "Whether water reflections are enabled", convertBoolToOnOff(!$pref::Water::disableTrueReflections)); - OptionsMenuSettingsList.addOptionRow("SSAO", %onOffList, false, "", -1, -30, true, "Whether Screen-Space Ambient Occlusion is enabled", convertBoolToOnOff($pref::PostFX::EnableSSAO)); - OptionsMenuSettingsList.addOptionRow("Depth of Field", %onOffList, false, "", -1, -30, true, "Whether the Depth of Field effect is enabled", convertBoolToOnOff($pref::PostFX::EnableDOF)); - OptionsMenuSettingsList.addOptionRow("Vignette", %onOffList, false, "", -1, -30, true, "Whether the vignette effect is enabled", convertBoolToOnOff($pref::PostFX::EnableVignette)); - OptionsMenuSettingsList.addOptionRow("Light Rays", %onOffList, false, "", -1, -30, true, "Whether the light rays effect is enabled", convertBoolToOnOff($pref::PostFX::EnableLightRays)); - - OptionsMenuSettingsList.refresh(); + OptionsMenuSettingsList.addOptionRow("Lighting Quality", getQualityLevels(LightingQualityList), false, "", true, "Amount and drawdistance of local lights", getCurrentQualityLevel(LightingQualityList)); + OptionsMenuSettingsList.addOptionRow("Shadow Quality", getQualityLevels(ShadowQualityList), false, "", true, "Shadow revolution quality", getCurrentQualityLevel(ShadowQualityList)); + OptionsMenuSettingsList.addOptionRow("Soft Shadow Quality", getQualityLevels(SoftShadowList), false, "", true, "Amount of softening applied to shadowmaps", getCurrentQualityLevel(SoftShadowList)); + OptionsMenuSettingsList.addOptionRow("Mesh Quality", getQualityLevels(MeshQualityGroup), false, "", true, "Fidelity of rendering of mesh objects", getCurrentQualityLevel(MeshQualityGroup)); + OptionsMenuSettingsList.addOptionRow("Object Draw Distance", getQualityLevels(MeshDrawDistQualityGroup), false, "", true, "Dictates if and when static objects fade out in the distance", getCurrentQualityLevel(MeshDrawDistQualityGroup)); + OptionsMenuSettingsList.addOptionRow("Texture Quality", getQualityLevels(TextureQualityGroup), false, "", true, "Fidelity of textures", getCurrentQualityLevel(TextureQualityGroup)); + OptionsMenuSettingsList.addOptionRow("Terrain Quality", getQualityLevels(TerrainQualityGroup), false, "", true, "Quality level of terrain objects", getCurrentQualityLevel(TerrainQualityGroup)); + OptionsMenuSettingsList.addOptionRow("Decal Lifetime", getQualityLevels(DecalLifetimeGroup), false, "", true, "How long decals are rendered", getCurrentQualityLevel(DecalLifetimeGroup)); + OptionsMenuSettingsList.addOptionRow("Ground Cover Density", getQualityLevels(GroundCoverDensityGroup), false, "", true, "Density of ground cover items, such as grass", getCurrentQualityLevel(GroundCoverDensityGroup)); + OptionsMenuSettingsList.addOptionRow("Shader Quality", getQualityLevels(ShaderQualityGroup), false, "", true, "Dictates the overall shader quality level, adjusting what features are enabled.", getCurrentQualityLevel(ShaderQualityGroup)); + OptionsMenuSettingsList.addOptionRow("Anisotropic Filtering", %anisoFilter, false, "", true, "Amount of Anisotropic Filtering on textures, which dictates their sharpness at a distance", $pref::Video::defaultAnisotropy); + OptionsMenuSettingsList.addOptionRow("Anti-Aliasing", %aaFilter, false, "", true, "Amount of Post-Processing Anti-Aliasing applied to rendering", $pref::Video::AA); + OptionsMenuSettingsList.addOptionRow("Parallax", %onOffList, false, "", true, "Whether the surface parallax shader effect is enabled", convertBoolToOnOff(!$pref::Video::disableParallaxMapping)); + OptionsMenuSettingsList.addOptionRow("Water Reflections", %onOffList, false, "", true, "Whether water reflections are enabled", convertBoolToOnOff(!$pref::Water::disableTrueReflections)); + OptionsMenuSettingsList.addOptionRow("SSAO", %onOffList, false, "", true, "Whether Screen-Space Ambient Occlusion is enabled", convertBoolToOnOff($pref::PostFX::EnableSSAO)); + OptionsMenuSettingsList.addOptionRow("Depth of Field", %onOffList, false, "", true, "Whether the Depth of Field effect is enabled", convertBoolToOnOff($pref::PostFX::EnableDOF)); + OptionsMenuSettingsList.addOptionRow("Vignette", %onOffList, false, "", true, "Whether the vignette effect is enabled", convertBoolToOnOff($pref::PostFX::EnableVignette)); + OptionsMenuSettingsList.addOptionRow("Light Rays", %onOffList, false, "", true, "Whether the light rays effect is enabled", convertBoolToOnOff($pref::PostFX::EnableLightRays)); } function OptionsMenu::applyGraphicsSettings(%this) @@ -439,10 +433,9 @@ function updateDisplaySettings() } } -function OptionsMenu::populateAudioSettingsList(%this) +function populateAudioSettingsList(%this) { - %this.pageTabIndex = 2; - OptionsMenuSettingsList.clearRows(); + OptionsMenuSettingsList.clear(); OptionName.setText(""); OptionDescription.setText(""); @@ -477,18 +470,15 @@ function OptionsMenu::populateAudioSettingsList(%this) else %audioDeviceList = %audioDeviceList @ "\t" @ %device; } - } - OptionsMenuSettingsList.addOptionRow("Audio Provider", %audioProviderList, false, "audioProviderChanged", -1, -15, true, "", $currentAudioProvider); - OptionsMenuSettingsList.addOptionRow("Audio Device", %audioDeviceList, false, "", -1, -15, true, $pref::SFX::device); + OptionsMenuSettingsList.addOptionRow("Audio Provider", %audioProviderList, false, "audioProviderChanged", true, "", $currentAudioProvider); + OptionsMenuSettingsList.addOptionRow("Audio Device", %audioDeviceList, false, "", true, $pref::SFX::device); - OptionsMenuSettingsList.addSliderRow("Master Volume", $pref::SFX::masterVolume, 0.1, "0 1", "", -1, -30); - OptionsMenuSettingsList.addSliderRow("GUI Volume", $pref::SFX::channelVolume[ $GuiAudioType], 0.1, "0 1", "", -1, -30); - OptionsMenuSettingsList.addSliderRow("Effects Volume", $pref::SFX::channelVolume[ $SimAudioType ], 0.1, "0 1", "", -1, -30); - OptionsMenuSettingsList.addSliderRow("Music Volume", $pref::SFX::channelVolume[ $MusicAudioType ], 0.1, "0 1", "", -1, -30); - - OptionsMenuSettingsList.refresh(); + OptionsMenuSettingsList.addSliderRow("Master Volume", $pref::SFX::masterVolume, 0.1, "0 1", ""); + OptionsMenuSettingsList.addSliderRow("GUI Volume", $pref::SFX::channelVolume[ $GuiAudioType], 0.1, "0 1", ""); + OptionsMenuSettingsList.addSliderRow("Effects Volume", $pref::SFX::channelVolume[ $SimAudioType ], 0.1, "0 1", ""); + OptionsMenuSettingsList.addSliderRow("Music Volume", $pref::SFX::channelVolume[ $MusicAudioType ], 0.1, "0 1", ""); } function audioProviderChanged() @@ -498,7 +488,7 @@ function audioProviderChanged() $currentAudioProvider = %provider; //And now refresh the list to get the correct devices - OptionsMenu.populateAudioSettingsList(); + populateAudioSettingsList(); } function OptionsMenu::applyAudioSettings(%this) @@ -531,10 +521,9 @@ function OptionsMenu::applyAudioSettings(%this) } } -function OptionsMenu::populateKeyboardMouseSettingsList(%this) +function populateKeyboardMouseSettingsList(%this) { - %this.pageTabIndex = 3; - OptionsMenuSettingsList.clearRows(); + OptionsMenuSettingsList.clear(); OptionName.setText(""); OptionDescription.setText(""); @@ -542,13 +531,12 @@ function OptionsMenu::populateKeyboardMouseSettingsList(%this) $remapListDevice = "keyboard"; fillRemapList(); - OptionsMenuSettingsList.refresh(); + //OptionsMenuSettingsList.refresh(); } -function OptionsMenu::populateGamepadSettingsList(%this) +function populateGamepadSettingsList(%this) { - %this.pageTabIndex = 4; - OptionsMenuSettingsList.clearRows(); + OptionsMenuSettingsList.clear(); OptionName.setText(""); OptionDescription.setText(""); @@ -586,6 +574,69 @@ function OptionsMenu::backOut(%this) } } +function OptionsMenuSettingsList::setRowEnabled(%this, %row, %status) +{ + %option = %this.getObject(%row); + if(isObject(%option)) + { + %option.setEnabled(%status); + } +} + +function OptionsMenuSettingsList::addOptionRow(%this, %label, %optionsList, %wrapOptions, %callback, %enabled, %description, %defaultValue) +{ + if(%enabled $= "") + %enabled = true; + + %optionsRowSize = 30; + %optionColumnWidth = %this.extent.x - 450;//todo, calculate off longest option text? + + %option = new GuiGameSettingsCtrl() { + class = "MenuOptionsButton"; + profile = "GuiMenuButtonProfile"; + horizSizing = "width"; + vertSizing = "bottom"; + position = "0 0"; + extent = %this.extent.x SPC %optionsRowSize; + columnSplit = %optionColumnWidth; + useMouseEvents = true; + }; + + %option.setListSetting(%label, %optionsList, %wrapOptions, %callback, %enabled, %description, %defaultValue); + + %this.add(%option); +} + +function OptionsMenuSettingsList::addSliderRow(%this, %label, %defaultValue, %increment, %range, %callback, %enabled, %description) +{ + if(%enabled $= "") + %enabled = true; + + %optionsRowSize = 30; + %optionColumnWidth = %this.extent.x - 450;//todo, calculate off longest option text? + + %option = new GuiGameSettingsCtrl() { + class = "MenuOptionsButton"; + profile = "GuiMenuButtonProfile"; + horizSizing = "width"; + vertSizing = "bottom"; + position = "0 0"; + extent = %this.extent.x SPC %optionsRowSize; + columnSplit = %optionColumnWidth; + useMouseEvents = true; + }; + + %option.setSliderSetting(%label, %defaultValue, %increment, %range, %callback, %enabled, %description); + + %this.add(%option); +} + +// +function OptionsMenuCategoryList::onNavigate(%this, %index) +{ + %this.getObject(%index).performClick(); +} + function convertOptionToBool(%val) { if(%val $= "yes" || %val $= "on") @@ -685,4 +736,16 @@ function onDisplayResChange(%val) OptionsMenuSettingsList.setOptions(5, %refreshList); OptionsMenuSettingsList.selectOption(5, %newRate); +} + +function MenuOptionsButton::onMouseEnter(%this) +{ + OptionName.setText(%this.getLabel()); + OptionDescription.setText(%this.getToolTip()); +} + +function MenuOptionsButton::onMouseLeave(%this) +{ + OptionName.setText(""); + OptionDescription.setText(""); } \ No newline at end of file diff --git a/Templates/BaseGame/game/data/UI/images/scrollBar.png b/Templates/BaseGame/game/data/UI/images/scrollBar.png index 2699a7662781253fe3ba6bfd00468ba7a97e7ea3..4bd81576ba4217a429431e7806bf690f418ed775 100644 GIT binary patch literal 9187 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≠-#^Uf3<9hWtZwt;15VyucH;6Vs90f_3j zO+O+6<&L2MkQf)7r@GkElX@`#4y`U`t7HN;A?jdUar*uwjHSP+70TZo1xJf%YOt#L zsnQ7W7zzU5hxhO#tNN*n?eVJ8u6Kv!#Q=K{io3d)oryU>hd{yr6hVq0Fz~b=&Ic-{ z!3t0#p|PqKx_ZATXgzf?R|kIN#01-$o@(?&2E)RyvL!m$#0!Y5-NkRAl zJ;~y`6hAq1F=P}8N2K5go`79W1d`xQQ5O@V%>#as(`Hep{b+-~9PIY@=*bkcyaBDF zNV^{zKpqMPs{p}JAQUeDyFG2z#N-caPx3DnX?n{0A&Bx25Lh0M|2GRV<+RVA{{GT} zY(?8gl()c;3Em_W=ClvSlOq1RQ=*4A`FEe*WX$f+UfdpNtUN8KJS9pP&-nI6%smhkEP;fl)eFuOP4FfE3AV!FF_sj>u51ux1tnz#2t*mC09OR7!2bl< zU`S+I-tMwOz#s^8Zw8H0)uVADX!(P~BU~`@L{FE!30l;uIwTB&LLgZY2p;NUyDOqQ+$U(f$Ho7v2^a8v&cr}i^3^=Y;Q(#7BWTVlL^_I|D< z9=JWJ0D!&vRYjn7Ra6%vBYZGFQ;MeJ&nc8E!qWvqTPS~3$-l;Nf0?i_Bn*i~1C^l| zC{Pg#0R!PM7zPN3!j!;ZMU;vX_`k7}30R6Rf`rj>p_LKsIn#=0?>PgG|H?C&y@dE9 z8edn;ZW4iMsY@eQ09!$nRh8hXP?*@yrwve(-(4F2b+>A}i-(Dc>hF4}?Jh2=2D=Go z=}jbh;4q|r*Xdt*^MAqpX8$Wk|0na`VLz>P2*iuDYIUWU`Fj3G_kRKW$zY5_VLZu% z{}lS~ke{;r_6DKF{Bw-;IcvtbcwhV?1g9`+R9%!lx1n0kp4ZCZy3BUAiB;AJhuc zmsV+~14Mm$G94Y~i`|3%mK>)rZIGE_U~-yynpK4Vr0^(@b02N5#MD4n%gS$fVG!XN z3KnFV=p`mDIziPF`lv5)qnSX6{XTrD%VLL)&t@`Sg4?Q>Sc5=ehR(y#LxVf^i$>>XkgrVK#b@B9%+1X?g5(tQtk`Qi$zLXvm$iPj3h9NH*nNzMbhl23D-6vsi+En*} I_Jz>@0&<~QH2?qr delta 6623 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 diff --git a/Templates/BaseGame/game/data/UI/scripts/controlsMenu.tscript b/Templates/BaseGame/game/data/UI/scripts/controlsMenu.tscript index 071902d99..b88efa0d6 100644 --- a/Templates/BaseGame/game/data/UI/scripts/controlsMenu.tscript +++ b/Templates/BaseGame/game/data/UI/scripts/controlsMenu.tscript @@ -176,7 +176,7 @@ function fillRemapList() OptionsMenuSettingsList.addKeybindRow(getField(%keyMap, 0), getButtonBitmap(%device, getField(%keyMap, 1)), "doKeyRemap", -1, -15, true, %description); } - OptionsMenuSettingsList.refresh(); + //OptionsMenuSettingsList.refresh(); //OptionsMenu.addRow( %i, %this.buildFullMapString( %i ) ); } diff --git a/Templates/BaseGame/game/data/UI/scripts/menuInputButtons.tscript b/Templates/BaseGame/game/data/UI/scripts/menuInputButtons.tscript deleted file mode 100644 index 3d4c76c90..000000000 --- a/Templates/BaseGame/game/data/UI/scripts/menuInputButtons.tscript +++ /dev/null @@ -1,341 +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 -*/ - -/// 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 -function UIMenuButtonList::onInputEvent(%this, %device, %action, %state) -{ - if(%state) - $activeMenuButtonContainer.processInputs(%device, %action); -} - -/// 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 -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); -} - -/// 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. -/// \param %gamepadOnly (bool) If true, will only show the button when working in the gamepad input mode -function MenuInputButton::set(%this, %gamepadButton, %keyboardButton, %text, %command, %gamepadOnly) -{ - %set = (! ((%text $= "") && (%command $= ""))); - %this.setText(%text); - %this.setActive(%set); - %this.setVisible(%set); - - %this.gamepadButton = %gamepadButton; - %this.keyboardButton = %keyboardButton; - - if(%gamepadOnly $= "") - %gamepadOnly = false; - - %this.gamepadOnly = %gamepadOnly; - - %this.Command = %command; -} - -/// Refreshes the specific button, updating it's visbility status and the displayed input image -function MenuInputButton::refresh(%this) -{ - %set = (! ((%this.text $= "") && (%this.command $= ""))); - - //Special-case of where we're in keyboard+mouse mode, but the menubutton is gamepad only mode, so we early out - if(%this.gamepadOnly && $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; -} - -/// 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(); - } -} - -/// 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(); -} - -/// 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"; -} - -/// 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. -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); - } - } - } -} - -/// 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 -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; - }*/ -} \ No newline at end of file diff --git a/Templates/BaseGame/game/data/UI/scripts/profiles.tscript b/Templates/BaseGame/game/data/UI/scripts/profiles.tscript index c9dfed5b5..3aae4df2a 100644 --- a/Templates/BaseGame/game/data/UI/scripts/profiles.tscript +++ b/Templates/BaseGame/game/data/UI/scripts/profiles.tscript @@ -145,6 +145,12 @@ new GuiControlProfile( GuiBlankMenuButtonProfile ) category = "Core"; }; +if( !isObject( GuiJoinServerButtonProfile ) ) +new GuiControlProfile( GuiJoinServerButtonProfile : GuiMenuButtonProfile ) +{ + justify = "left"; +}; + if( !isObject( GuiMenuTextProfile ) ) new GuiControlProfile( GuiMenuTextProfile ) { From 01de818503eff34fdcfaa9cfe5725dfb68024f81 Mon Sep 17 00:00:00 2001 From: JeffR Date: Tue, 22 Feb 2022 20:12:39 -0600 Subject: [PATCH 3/6] Ran importer on UI module to ensure guis and images are converted to latest standards Updated all UI module controls to utilize a more standard structure with stack controls instead of the GameMenu ctrls, as well as more standardization of gamepad input handling --- .../data/ExampleModule/ExampleModule.tscript | 6 + Templates/BaseGame/game/data/UI/UI.module | 2 +- Templates/BaseGame/game/data/UI/UI.tscript | 2 +- .../data/UI/datablocks/guiSounds.asset.taml | 2 +- .../game/data/UI/datablocks/guiSounds.tscript | 2 +- .../data/UI/guis/ChooseLevelDlg.asset.taml | 6 +- .../data/UI/guis/GuiMusicPlayer.asset.taml | 6 +- .../data/UI/guis/IODropdownDlg.asset.taml | 5 +- .../data/UI/guis/JoinServerMenu.asset.taml | 6 +- .../game/data/UI/guis/LoadingGui.asset.taml | 5 +- .../game/data/UI/guis/MainMenuGui.asset.taml | 6 +- .../data/UI/guis/MessageBoxDlg.asset.taml | 5 +- .../data/UI/guis/NetGraphProfile.asset.taml | 7 - .../game/data/UI/guis/OptionsMenu.asset.taml | 6 +- .../game/data/UI/guis/PauseMenu.asset.taml | 6 +- .../game/data/UI/guis/ProfilerGui.asset.taml | 6 +- .../data/UI/guis/RemapConfirmDlg.asset.taml | 5 +- .../game/data/UI/guis/RemapDlg.asset.taml | 5 +- .../game/data/UI/guis/StartupGui.asset.taml | 6 +- .../game/data/UI/guis/chooseLevelDlg.gui | 4 +- .../data/UI/guis/controlsMenuSetting.taml | 102 --- .../game/data/UI/guis/joinServerMenu.gui | 2 +- .../game/data/UI/guis/joinServerMenu.tscript | 8 +- .../BaseGame/game/data/UI/guis/mainMenu.gui | 4 +- .../game/data/UI/guis/mainMenu.tscript | 3 +- .../game/data/UI/guis/messageBoxDlg.gui | 4 +- .../game/data/UI/guis/netGraphGui.gui | 2 +- .../game/data/UI/guis/optionsMenu.gui | 183 ------ .../game/data/UI/guis/optionsMenu.tscript | 581 ++++++++++++------ .../BaseGame/game/data/UI/guis/pauseMenu.gui | 49 +- .../game/data/UI/guis/pauseMenu.tscript | 49 +- .../game/data/UI/guis/profiler.tscript | 2 +- .../data/UI/guis/recordingsDlg.asset.taml | 5 +- .../BaseGame/game/data/UI/guis/startupGui.gui | 4 +- .../game/data/UI/guis/startupGui.tscript | 2 +- .../UI/images/Torque-3D-logo-shortcut.png | Bin 10728 -> 0 bytes .../game/data/UI/images/Torque-3D-logo-w.png | Bin 19328 -> 0 bytes .../game/data/UI/images/Torque-3D-logo.png | Bin 9063 -> 0 bytes .../data/UI/images/Torque-3D-logo_alt.png | Bin 11616 -> 0 bytes .../Torque_3D_logo_alt_image.asset.taml | 2 +- .../UI/images/Torque_3D_logo_image.asset.taml | 2 +- .../Torque_3D_logo_shortcut_image.asset.taml | 2 +- .../images/Torque_3D_logo_w_image.asset.taml | 2 +- .../game/data/UI/images/background-dark.png | Bin 5751 -> 0 bytes .../images/background_dark_image.asset.taml | 8 - .../game/data/UI/images/clear-btn_d.png | Bin 593 -> 0 bytes .../game/data/UI/images/clear-btn_h.png | Bin 595 -> 0 bytes .../game/data/UI/images/clear-btn_n.png | Bin 377 -> 0 bytes .../data/UI/images/collapse-toolbar_d.png | Bin 280 -> 0 bytes .../data/UI/images/collapse-toolbar_h.png | Bin 468 -> 0 bytes .../data/UI/images/collapse-toolbar_n.png | Bin 439 -> 0 bytes .../data/UI/images/dropdown-button-arrow.png | Bin 132 -> 0 bytes .../game/data/UI/images/dropdown-textEdit.png | Bin 390 -> 0 bytes .../game/data/UI/images/expand-toolbar_d.png | Bin 278 -> 0 bytes .../game/data/UI/images/expand-toolbar_h.png | Bin 468 -> 0 bytes .../game/data/UI/images/expand-toolbar_n.png | Bin 437 -> 0 bytes .../game/data/UI/images/group-border.png | Bin 1273 -> 0 bytes .../game/data/UI/images/inactive-overlay.png | Bin 131 -> 0 bytes .../game/data/UI/images/menu-button.png | Bin 3559 -> 0 bytes .../game/data/UI/images/next-button_d.png | Bin 279 -> 0 bytes .../game/data/UI/images/next-button_h.png | Bin 549 -> 0 bytes .../game/data/UI/images/next-button_n.png | Bin 484 -> 0 bytes .../game/data/UI/images/no-preview.png | Bin 34615 -> 0 bytes .../game/data/UI/images/previous-button_d.png | Bin 290 -> 0 bytes .../game/data/UI/images/previous-button_h.png | Bin 561 -> 0 bytes .../game/data/UI/images/previous-button_n.png | Bin 494 -> 0 bytes .../data/UI/images/selector-button-blank.png | Bin 744 -> 0 bytes .../data/UI/images/selector-button-dark.png | Bin 1942 -> 0 bytes .../images/selector-button-highlight-only.png | Bin 1613 -> 0 bytes .../game/data/UI/images/selector-button.png | Bin 4002 -> 0 bytes .../game/data/UI/images/separator-h.png | Bin 117 -> 0 bytes .../game/data/UI/images/separator-v.png | Bin 118 -> 0 bytes .../game/data/UI/images/slider - Copy.png | Bin 908 -> 0 bytes .../game/data/UI/images/slider-w-box.png | Bin 982 -> 0 bytes .../UI/images/slider___Copy_image.asset.taml | 8 - .../game/data/UI/images/tab-border.png | Bin 1203 -> 0 bytes .../game/data/UI/scripts/controlsMenu.tscript | 17 +- .../game/data/UI/scripts/cursors.tscript | 2 +- .../game/data/UI/scripts/utility.tscript | 114 ++-- .../scripts/projectImporter.tscript | 8 +- 80 files changed, 590 insertions(+), 673 deletions(-) delete mode 100644 Templates/BaseGame/game/data/UI/guis/NetGraphProfile.asset.taml delete mode 100644 Templates/BaseGame/game/data/UI/guis/controlsMenuSetting.taml delete mode 100644 Templates/BaseGame/game/data/UI/images/Torque-3D-logo-shortcut.png delete mode 100644 Templates/BaseGame/game/data/UI/images/Torque-3D-logo-w.png delete mode 100644 Templates/BaseGame/game/data/UI/images/Torque-3D-logo.png delete mode 100644 Templates/BaseGame/game/data/UI/images/Torque-3D-logo_alt.png delete mode 100644 Templates/BaseGame/game/data/UI/images/background-dark.png delete mode 100644 Templates/BaseGame/game/data/UI/images/background_dark_image.asset.taml delete mode 100644 Templates/BaseGame/game/data/UI/images/clear-btn_d.png delete mode 100644 Templates/BaseGame/game/data/UI/images/clear-btn_h.png delete mode 100644 Templates/BaseGame/game/data/UI/images/clear-btn_n.png delete mode 100644 Templates/BaseGame/game/data/UI/images/collapse-toolbar_d.png delete mode 100644 Templates/BaseGame/game/data/UI/images/collapse-toolbar_h.png delete mode 100644 Templates/BaseGame/game/data/UI/images/collapse-toolbar_n.png delete mode 100644 Templates/BaseGame/game/data/UI/images/dropdown-button-arrow.png delete mode 100644 Templates/BaseGame/game/data/UI/images/dropdown-textEdit.png delete mode 100644 Templates/BaseGame/game/data/UI/images/expand-toolbar_d.png delete mode 100644 Templates/BaseGame/game/data/UI/images/expand-toolbar_h.png delete mode 100644 Templates/BaseGame/game/data/UI/images/expand-toolbar_n.png delete mode 100644 Templates/BaseGame/game/data/UI/images/group-border.png delete mode 100644 Templates/BaseGame/game/data/UI/images/inactive-overlay.png delete mode 100644 Templates/BaseGame/game/data/UI/images/menu-button.png delete mode 100644 Templates/BaseGame/game/data/UI/images/next-button_d.png delete mode 100644 Templates/BaseGame/game/data/UI/images/next-button_h.png delete mode 100644 Templates/BaseGame/game/data/UI/images/next-button_n.png delete mode 100644 Templates/BaseGame/game/data/UI/images/no-preview.png delete mode 100644 Templates/BaseGame/game/data/UI/images/previous-button_d.png delete mode 100644 Templates/BaseGame/game/data/UI/images/previous-button_h.png delete mode 100644 Templates/BaseGame/game/data/UI/images/previous-button_n.png delete mode 100644 Templates/BaseGame/game/data/UI/images/selector-button-blank.png delete mode 100644 Templates/BaseGame/game/data/UI/images/selector-button-dark.png delete mode 100644 Templates/BaseGame/game/data/UI/images/selector-button-highlight-only.png delete mode 100644 Templates/BaseGame/game/data/UI/images/selector-button.png delete mode 100644 Templates/BaseGame/game/data/UI/images/separator-h.png delete mode 100644 Templates/BaseGame/game/data/UI/images/separator-v.png delete mode 100644 Templates/BaseGame/game/data/UI/images/slider - Copy.png delete mode 100644 Templates/BaseGame/game/data/UI/images/slider-w-box.png delete mode 100644 Templates/BaseGame/game/data/UI/images/slider___Copy_image.asset.taml delete mode 100644 Templates/BaseGame/game/data/UI/images/tab-border.png diff --git a/Templates/BaseGame/game/data/ExampleModule/ExampleModule.tscript b/Templates/BaseGame/game/data/ExampleModule/ExampleModule.tscript index 0b233dc61..0f540c0d8 100644 --- a/Templates/BaseGame/game/data/ExampleModule/ExampleModule.tscript +++ b/Templates/BaseGame/game/data/ExampleModule/ExampleModule.tscript @@ -81,6 +81,7 @@ function ExampleModule::initClient(%this) exec(%prefPath @ "/keybinds." @ $TorqueScriptFileExtension); %this.queueExec("./scripts/inputCommands"); + addOptionsMenuCategory("Example Options", "testExampleOptions();"); } //This is called when a game session client successfuly connects to a game server. @@ -105,4 +106,9 @@ function ExampleModule::onDestroyClientConnection(%this) { //This will pop the keybind, cleaning it up from the input stack, as it no longer applies ExampleMoveMap.pop(); +} + +function testExampleOptions() +{ + addListOption("Test Option", "This is a test option", $testOptionValue, "OptionA\tOptionB"); } \ No newline at end of file diff --git a/Templates/BaseGame/game/data/UI/UI.module b/Templates/BaseGame/game/data/UI/UI.module index 1ab3024a2..ed204d1b1 100644 --- a/Templates/BaseGame/game/data/UI/UI.module +++ b/Templates/BaseGame/game/data/UI/UI.module @@ -11,4 +11,4 @@ canSaveDynamicFields="true" Extension="asset.taml" Recurse="true" /> - \ No newline at end of file + diff --git a/Templates/BaseGame/game/data/UI/UI.tscript b/Templates/BaseGame/game/data/UI/UI.tscript index 5b8c1ee6a..cd645f86f 100644 --- a/Templates/BaseGame/game/data/UI/UI.tscript +++ b/Templates/BaseGame/game/data/UI/UI.tscript @@ -83,4 +83,4 @@ function UI::initClient(%this) function UI::onCreateClientConnection(%this){} -function UI::onDestroyClientConnection(%this){} \ No newline at end of file +function UI::onDestroyClientConnection(%this){} diff --git a/Templates/BaseGame/game/data/UI/datablocks/guiSounds.asset.taml b/Templates/BaseGame/game/data/UI/datablocks/guiSounds.asset.taml index 81e2a8e24..7e5a1cada 100644 --- a/Templates/BaseGame/game/data/UI/datablocks/guiSounds.asset.taml +++ b/Templates/BaseGame/game/data/UI/datablocks/guiSounds.asset.taml @@ -2,5 +2,5 @@ canSave="true" canSaveDynamicFields="true" AssetName="guiSounds" - scriptFile="@assetFile=guiSounds.cs" + scriptFile="@assetFile=guiSounds" VersionId="1" /> diff --git a/Templates/BaseGame/game/data/UI/datablocks/guiSounds.tscript b/Templates/BaseGame/game/data/UI/datablocks/guiSounds.tscript index 0aab47fb9..4eed5f78a 100644 --- a/Templates/BaseGame/game/data/UI/datablocks/guiSounds.tscript +++ b/Templates/BaseGame/game/data/UI/datablocks/guiSounds.tscript @@ -31,4 +31,4 @@ singleton SFXProfile(menuButtonHover) preload = true; description = AudioGui; fileName = "data/ui/sounds/buttonHover"; -}; \ No newline at end of file +}; diff --git a/Templates/BaseGame/game/data/UI/guis/ChooseLevelDlg.asset.taml b/Templates/BaseGame/game/data/UI/guis/ChooseLevelDlg.asset.taml index 2d6a987f0..9090ea1af 100644 --- a/Templates/BaseGame/game/data/UI/guis/ChooseLevelDlg.asset.taml +++ b/Templates/BaseGame/game/data/UI/guis/ChooseLevelDlg.asset.taml @@ -1,7 +1,5 @@ + VersionId="1"/> diff --git a/Templates/BaseGame/game/data/UI/guis/GuiMusicPlayer.asset.taml b/Templates/BaseGame/game/data/UI/guis/GuiMusicPlayer.asset.taml index 7014d72a6..94601d7a3 100644 --- a/Templates/BaseGame/game/data/UI/guis/GuiMusicPlayer.asset.taml +++ b/Templates/BaseGame/game/data/UI/guis/GuiMusicPlayer.asset.taml @@ -1,7 +1,5 @@ + VersionId="1"/> diff --git a/Templates/BaseGame/game/data/UI/guis/IODropdownDlg.asset.taml b/Templates/BaseGame/game/data/UI/guis/IODropdownDlg.asset.taml index b929c70b0..d1d0c8c8e 100644 --- a/Templates/BaseGame/game/data/UI/guis/IODropdownDlg.asset.taml +++ b/Templates/BaseGame/game/data/UI/guis/IODropdownDlg.asset.taml @@ -1,7 +1,4 @@ + VersionId="1"/> diff --git a/Templates/BaseGame/game/data/UI/guis/JoinServerMenu.asset.taml b/Templates/BaseGame/game/data/UI/guis/JoinServerMenu.asset.taml index 0ca202e6d..85da0192a 100644 --- a/Templates/BaseGame/game/data/UI/guis/JoinServerMenu.asset.taml +++ b/Templates/BaseGame/game/data/UI/guis/JoinServerMenu.asset.taml @@ -1,7 +1,5 @@ + VersionId="1"/> diff --git a/Templates/BaseGame/game/data/UI/guis/LoadingGui.asset.taml b/Templates/BaseGame/game/data/UI/guis/LoadingGui.asset.taml index 196bc91e7..fc8ac974c 100644 --- a/Templates/BaseGame/game/data/UI/guis/LoadingGui.asset.taml +++ b/Templates/BaseGame/game/data/UI/guis/LoadingGui.asset.taml @@ -1,7 +1,4 @@ + VersionId="1"/> diff --git a/Templates/BaseGame/game/data/UI/guis/MainMenuGui.asset.taml b/Templates/BaseGame/game/data/UI/guis/MainMenuGui.asset.taml index 2fd6b7c72..cdd3c6635 100644 --- a/Templates/BaseGame/game/data/UI/guis/MainMenuGui.asset.taml +++ b/Templates/BaseGame/game/data/UI/guis/MainMenuGui.asset.taml @@ -1,7 +1,5 @@ + VersionId="1"/> diff --git a/Templates/BaseGame/game/data/UI/guis/MessageBoxDlg.asset.taml b/Templates/BaseGame/game/data/UI/guis/MessageBoxDlg.asset.taml index 9b9d38995..14ff4ba60 100644 --- a/Templates/BaseGame/game/data/UI/guis/MessageBoxDlg.asset.taml +++ b/Templates/BaseGame/game/data/UI/guis/MessageBoxDlg.asset.taml @@ -1,7 +1,4 @@ + VersionId="1"/> diff --git a/Templates/BaseGame/game/data/UI/guis/NetGraphProfile.asset.taml b/Templates/BaseGame/game/data/UI/guis/NetGraphProfile.asset.taml deleted file mode 100644 index 2ee15e4ea..000000000 --- a/Templates/BaseGame/game/data/UI/guis/NetGraphProfile.asset.taml +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/Templates/BaseGame/game/data/UI/guis/OptionsMenu.asset.taml b/Templates/BaseGame/game/data/UI/guis/OptionsMenu.asset.taml index a00b4c7d4..0488ea976 100644 --- a/Templates/BaseGame/game/data/UI/guis/OptionsMenu.asset.taml +++ b/Templates/BaseGame/game/data/UI/guis/OptionsMenu.asset.taml @@ -1,7 +1,5 @@ + VersionId="1"/> diff --git a/Templates/BaseGame/game/data/UI/guis/PauseMenu.asset.taml b/Templates/BaseGame/game/data/UI/guis/PauseMenu.asset.taml index c3806430a..08a16f03d 100644 --- a/Templates/BaseGame/game/data/UI/guis/PauseMenu.asset.taml +++ b/Templates/BaseGame/game/data/UI/guis/PauseMenu.asset.taml @@ -1,7 +1,5 @@ + VersionId="1"/> diff --git a/Templates/BaseGame/game/data/UI/guis/ProfilerGui.asset.taml b/Templates/BaseGame/game/data/UI/guis/ProfilerGui.asset.taml index 0e49346ab..09b400893 100644 --- a/Templates/BaseGame/game/data/UI/guis/ProfilerGui.asset.taml +++ b/Templates/BaseGame/game/data/UI/guis/ProfilerGui.asset.taml @@ -1,7 +1,5 @@ + VersionId="1"/> diff --git a/Templates/BaseGame/game/data/UI/guis/RemapConfirmDlg.asset.taml b/Templates/BaseGame/game/data/UI/guis/RemapConfirmDlg.asset.taml index 1e3fb30aa..6fc8c874a 100644 --- a/Templates/BaseGame/game/data/UI/guis/RemapConfirmDlg.asset.taml +++ b/Templates/BaseGame/game/data/UI/guis/RemapConfirmDlg.asset.taml @@ -1,7 +1,4 @@ + VersionId="1"/> diff --git a/Templates/BaseGame/game/data/UI/guis/RemapDlg.asset.taml b/Templates/BaseGame/game/data/UI/guis/RemapDlg.asset.taml index 6b1c4df9a..7ea99e19c 100644 --- a/Templates/BaseGame/game/data/UI/guis/RemapDlg.asset.taml +++ b/Templates/BaseGame/game/data/UI/guis/RemapDlg.asset.taml @@ -1,7 +1,4 @@ + VersionId="1"/> diff --git a/Templates/BaseGame/game/data/UI/guis/StartupGui.asset.taml b/Templates/BaseGame/game/data/UI/guis/StartupGui.asset.taml index 656157f71..876b039a6 100644 --- a/Templates/BaseGame/game/data/UI/guis/StartupGui.asset.taml +++ b/Templates/BaseGame/game/data/UI/guis/StartupGui.asset.taml @@ -1,7 +1,5 @@ + VersionId="1"/> diff --git a/Templates/BaseGame/game/data/UI/guis/chooseLevelDlg.gui b/Templates/BaseGame/game/data/UI/guis/chooseLevelDlg.gui index fc2ffc57e..775e910f0 100644 --- a/Templates/BaseGame/game/data/UI/guis/chooseLevelDlg.gui +++ b/Templates/BaseGame/game/data/UI/guis/chooseLevelDlg.gui @@ -36,7 +36,7 @@ $guiContent = new GuiControl(ChooseLevelDlg) { percent = "100"; vertical = "0"; flipClip = "0"; - bitmap = "data/ui/images/panel.png"; + bitmapAsset = "UI:panel_image"; color = "255 255 255 255"; position = "0 0"; extent = "927 40"; @@ -79,7 +79,7 @@ $guiContent = new GuiControl(ChooseLevelDlg) { percent = "100"; vertical = "0"; flipClip = "0"; - bitmap = "data/ui/images/panel_low.png"; + bitmapAsset = "UI:panel_low_image"; color = "255 255 255 255"; position = "0 40"; extent = "927 618"; diff --git a/Templates/BaseGame/game/data/UI/guis/controlsMenuSetting.taml b/Templates/BaseGame/game/data/UI/guis/controlsMenuSetting.taml deleted file mode 100644 index e2794ca4a..000000000 --- a/Templates/BaseGame/game/data/UI/guis/controlsMenuSetting.taml +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - diff --git a/Templates/BaseGame/game/data/UI/guis/joinServerMenu.gui b/Templates/BaseGame/game/data/UI/guis/joinServerMenu.gui index 17a2c4435..c812e624c 100644 --- a/Templates/BaseGame/game/data/UI/guis/joinServerMenu.gui +++ b/Templates/BaseGame/game/data/UI/guis/joinServerMenu.gui @@ -425,7 +425,7 @@ $guiContent = new GuiControl(JoinServerMenu) { vertSizing = "bottom"; profile = "GuiMenuButtonProfile"; visible = "1"; - active = "1"; + active = "0"; command = "JoinServerMenu.join();"; tooltipProfile = "GuiToolTipProfile"; hovertime = "1000"; diff --git a/Templates/BaseGame/game/data/UI/guis/joinServerMenu.tscript b/Templates/BaseGame/game/data/UI/guis/joinServerMenu.tscript index b2f0eb8eb..1fe75bd46 100644 --- a/Templates/BaseGame/game/data/UI/guis/joinServerMenu.tscript +++ b/Templates/BaseGame/game/data/UI/guis/joinServerMenu.tscript @@ -1,10 +1,6 @@ -function JoinServerMenu::onWake() +function JoinServerMenu::onWake(%this) { - // Double check the status. Tried setting this the control - // inactive to start with, but that didn't seem to work. - JoinServerJoinBtn.setActive(JoinServerList.getCount() > 0); - JoinServerButtonHolder.setActive(); JoinServerList.setAsActiveMenuList(); @@ -128,7 +124,7 @@ function JoinServerMenu::update(%this) JoinServerList.add(%serverBtn); } - JoinServerJoinBtn.setActive(JoinServerList.getCount() > 0); + JoinServerButtonHolder-->joinButton.setActive(JoinServerList.getCount() > 0); } //---------------------------------------- diff --git a/Templates/BaseGame/game/data/UI/guis/mainMenu.gui b/Templates/BaseGame/game/data/UI/guis/mainMenu.gui index 4c6c13697..6b1dad9ee 100644 --- a/Templates/BaseGame/game/data/UI/guis/mainMenu.gui +++ b/Templates/BaseGame/game/data/UI/guis/mainMenu.gui @@ -1,6 +1,6 @@ //--- OBJECT WRITE BEGIN --- $guiContent = new GuiChunkedBitmapCtrl(MainMenuGui) { - BitmapAsset = "UI:background_dark_image"; + BitmapAsset = "UI:backgrounddark_image"; useVariable = "0"; tile = "0"; position = "0 0"; @@ -203,7 +203,7 @@ $guiContent = new GuiChunkedBitmapCtrl(MainMenuGui) { profile = "GuiMenuButtonProfile"; visible = "1"; active = "1"; - command = "exit();"; + command = "quit();"; tooltipProfile = "GuiToolTipProfile"; hovertime = "1000"; isContainer = "0"; diff --git a/Templates/BaseGame/game/data/UI/guis/mainMenu.tscript b/Templates/BaseGame/game/data/UI/guis/mainMenu.tscript index 0d830f176..c626c4952 100644 --- a/Templates/BaseGame/game/data/UI/guis/mainMenu.tscript +++ b/Templates/BaseGame/game/data/UI/guis/mainMenu.tscript @@ -66,4 +66,5 @@ function MainMenuGui::onReturnTo(%this) MainMenuButtonList.hidden = false; MainMenuButtonList.setFirstResponder(); MainMenuButtonHolder.setActive(); -} \ No newline at end of file + MainMenuButtonList.setAsActiveMenuList(); +} diff --git a/Templates/BaseGame/game/data/UI/guis/messageBoxDlg.gui b/Templates/BaseGame/game/data/UI/guis/messageBoxDlg.gui index a78ae98d5..91207adff 100644 --- a/Templates/BaseGame/game/data/UI/guis/messageBoxDlg.gui +++ b/Templates/BaseGame/game/data/UI/guis/messageBoxDlg.gui @@ -34,7 +34,7 @@ $guiContent = new GuiControl(MessageBoxDlg) { percent = "100"; vertical = "0"; flipClip = "0"; - bitmap = "data/ui/images/panel.png"; + bitmapAsset = "UI:panel_image"; color = "255 255 255 255"; position = "0 0"; extent = "641 40"; @@ -77,7 +77,7 @@ $guiContent = new GuiControl(MessageBoxDlg) { percent = "100"; vertical = "0"; flipClip = "0"; - bitmap = "data/ui/images/panel_low.png"; + bitmapAsset = "UI:panel_low_image"; color = "255 255 255 255"; position = "0 40"; extent = "641 341"; diff --git a/Templates/BaseGame/game/data/UI/guis/netGraphGui.gui b/Templates/BaseGame/game/data/UI/guis/netGraphGui.gui index be8ba1233..9da782ba7 100644 --- a/Templates/BaseGame/game/data/UI/guis/netGraphGui.gui +++ b/Templates/BaseGame/game/data/UI/guis/netGraphGui.gui @@ -554,4 +554,4 @@ function NetGraph::updateNetworkSimulation(%this) } netSimulateLag( %latency, %packetLoss ); -} \ No newline at end of file +} diff --git a/Templates/BaseGame/game/data/UI/guis/optionsMenu.gui b/Templates/BaseGame/game/data/UI/guis/optionsMenu.gui index b7195557c..a8fc2fb1e 100644 --- a/Templates/BaseGame/game/data/UI/guis/optionsMenu.gui +++ b/Templates/BaseGame/game/data/UI/guis/optionsMenu.gui @@ -213,127 +213,6 @@ $guiContent = new GuiControl(OptionsMenu) { class = "MenuList"; canSave = "1"; canSaveDynamicFields = "0"; - - new GuiButtonCtrl(OptionsMenuDisplayBtn) { - text = "Display"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "0 0"; - extent = "248 35"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "1"; - active = "1"; - command = "populateDisplaySettingsList();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiButtonCtrl(OptionsMenuGraphicsBtn) { - text = "Graphics"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "0 45"; - extent = "248 35"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "1"; - active = "1"; - command = "populateGraphicsSettingsList();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiButtonCtrl(OptionsMenuAudioBtn) { - text = "Audio"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "0 90"; - extent = "248 35"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "1"; - active = "1"; - command = "populateAudioSettingsList();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiButtonCtrl(OptionsMenuKBMBtn) { - text = "Keyboard & Mouse"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "0 135"; - extent = "248 35"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "1"; - active = "1"; - command = "populateKeyboardMouseSettingsList();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiButtonCtrl(OptionsMenuGamepadBtn) { - text = "Gamepad"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "0 180"; - extent = "248 35"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "1"; - active = "1"; - command = "populateGamepadSettingsList();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiButtonCtrl(OptionsMenuProfileBtn) { - text = "Profile"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "0 225"; - extent = "248 35"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "1"; - active = "1"; - command = "populateProfileSettingsList();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; }; }; new GuiPanel() { @@ -493,68 +372,6 @@ $guiContent = new GuiControl(OptionsMenu) { canSave = "1"; canSaveDynamicFields = "0"; }; - new GuiIconButtonCtrl() { - buttonMargin = "4 4"; - BitmapAsset = "UI:Switch_LB_image"; - iconLocation = "Left"; - sizeIconToButton = "1"; - makeIconSquare = "1"; - textLocation = "Right"; - textMargin = "4"; - autoSize = "0"; - text = "Prev Tab"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "0 0"; - extent = "140 40"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "0"; - active = "0"; - command = "OptionsMenu.prevTab();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "prevTabButton"; - class = "MenuInputButton"; - hidden = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiIconButtonCtrl() { - buttonMargin = "4 4"; - BitmapAsset = "UI:Switch_RB_image"; - iconLocation = "Left"; - sizeIconToButton = "1"; - makeIconSquare = "1"; - textLocation = "Right"; - textMargin = "4"; - autoSize = "0"; - text = "Next Tab"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "144 0"; - extent = "140 40"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "0"; - active = "0"; - command = "OptionsMenu.nextTab();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "nextTabButton"; - class = "MenuInputButton"; - hidden = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; new GuiIconButtonCtrl() { buttonMargin = "4 4"; BitmapAsset = "UI:Keyboard_Black_R_image"; diff --git a/Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript b/Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript index eac532203..48612b943 100644 --- a/Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript +++ b/Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript @@ -46,12 +46,67 @@ //headbob //FOV +function OptionsMenu::onAdd(%this) +{ + if(!isObject(%this.optionsCategories)) + { + %this.optionsCategories = new ArrayObject(); + } + + if(!isObject(%this.unappliedChanges)) + { + %this.unappliedChanges = new ArrayObject(); + } + + addOptionsMenuCategory("Display", "populateDisplaySettingsList();"); + addOptionsMenuCategory("Graphics", "populateGraphicsSettingsList();"); + addOptionsMenuCategory("Audio", "populateAudioSettingsList();"); + addOptionsMenuCategory("Keyboard & Mouse", "populateKeyboardMouseSettingsList();"); + addOptionsMenuCategory("Gamepad", "populateGamepadSettingsList();"); +} + function OptionsMenuSettingsList::onAdd(%this) { } +function OptionsMenuSettingsList::getOptionsList(%this, %index) +{ + +} + function OptionsMenu::onWake(%this) { + for(%i=0; %i < %this.optionsCategories.count(); %i++) + { + %catName = %this.optionsCategories.getKey(%i); + %callback = %this.optionsCategories.getValue(%i); + + %newCatButton = new GuiButtonCtrl() { + text = %catName; + groupNum = "-1"; + buttonType = "PushButton"; + useMouseEvents = "0"; + position = "0 180"; + extent = "248 35"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "bottom"; + profile = "GuiMenuButtonProfile"; + visible = "1"; + active = "1"; + command = %callback; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "0"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; + + OptionsMenuCategoryList.add(%newCatButton); + } + + %this.unappliedChanges.empty(); + MainMenuButtonList.hidden = true; OptionsMenuCategoryList.setAsActiveMenuList(); @@ -63,8 +118,6 @@ function OptionsMenu::onWake(%this) function OptionsButtonHolder::onWake(%this) { - //%this-->prevTabButton.set("btn_l", "", "Prev Tab", "OptionsMenu.prevTab();", true); - %this-->nextTabButton.set("btn_a", "", "Select", "OptionsMenuList.activate();", true); %this-->resetButton.set("btn_back", "R", "Reset", "OptionsMenu.resetToDefaults();"); %this-->applyButton.set("btn_start", "Return", "Apply", "OptionsMenu.apply();"); %this-->backButton.set("btn_b", "Escape", "Back", "OptionsMenu.backOut();"); @@ -74,19 +127,81 @@ function OptionsButtonHolder::onWake(%this) function OptionsMenu::apply(%this) { - if(%this.pageTabIndex == 0) + //Now we run through our list of unapplied changes and... apply them. + %hasKeybindChanges = false; + %hasVideoChanges = false; + %hasPostFXChanges = false; + %hasAudioChanges = false; + for(%i=0; %i < %this.unappliedChanges.count(); %i++) { - %this.applyDisplaySettings(); + %targetVar = %this.unappliedChanges.getKey(%i); + %newValue = %this.unappliedChanges.getValue(%i); + + //First, lets just check through our action map names, see if any match + %wasKeybind = false; + for(%am=0; %am < ActionMapGroup.getCount(); %am++) + { + %actionMap = ActionMapGroup.getObject(%am); + + if(%actionMap == GlobalActionMap.getId()) + continue; + + %actionMapName = %actionMap.humanReadableName $= "" ? %actionMap.getName() : %actionMap.humanReadableName; + if(%actionMapName $= %targetVar) + { + %hasKeybindChanges = true; + %wasKeybind = true; + break; + } + } + + if(!%wasKeybind) + { + %currentValue = getVariable(%targetVar); + if(%currentValue !$= %newValue) + { + setVariable(%targetVar, %newValue); + + //now, lets check for special cases that need additional handling + //for updates + if ( %targetVar $= "$pref::Video::displayDevice" ) + { + MessageBoxOK( "Change requires restart", "Please restart the game for a display device change to take effect." ); + } + else if(startsWith(%targetVar, "$pref::Graphics::")) + { + //isolate the quality group name, like $pref::Graphics::LightingQuality + //we grab LightingQuality + %qualityGroupName = getSubStr(%targetVar, 17); + if(isObject(%qualityGroupName @ "List")) + { + //yep, it's a quality group, so apply it + (%qualityGroupName @ "List").applySetting(%newValue); + } + + if(%qualityGroupName $= "TextureQuality") + { + reloadTextures(); + } + } + else if(startsWith(%targetVar, "$pref::PostFX::")) + { + %hasPostFXChanges = true; + } + else if(startsWith(%targetVar, "$pref::Video::")) + { + %hasVideoChanges = true; + } + else if(startsWith(%targetVar, "$pref::SFX::")) + { + %hasAudioChanges = true; + } + } + } } - else if(%this.pageTabIndex == 1) - { - %this.applyGraphicsSettings(); - } - else if(%this.pageTabIndex == 2) - { - %this.applyAudioSettings(); - } - else if(%this.pageTabIndex == 3 || %this.pageTabIndex == 4) + + //If we had keybind changes, go ahead and save those out + if(%hasKeybindChanges) { %prefPath = getPrefpath(); @@ -108,8 +223,26 @@ function OptionsMenu::apply(%this) } } + if(%hasPostFXChanges) + { + updatePostFXSettings(); + } + + if(%hasVideoChanges) + { + updateDisplaySettings(); + } + + if(%hasAudioChanges) + { + updateAudioSettings(); + } + + //Finally, write our prefs to file %prefPath = getPrefpath(); export("$pref::*", %prefPath @ "/clientPrefs." @ $TorqueScriptFileExtension, false); + + OptionsMenu.unappliedChanges.empty(); } function OptionsMenu::resetToDefaults(%this) @@ -117,77 +250,9 @@ function OptionsMenu::resetToDefaults(%this) MessageBoxOKCancel("", "This will set the graphical settings back to the auto-detected defaults. Do you wish to continue?", "AutodetectGraphics();", ""); } -function OptionsMenuSettingsList::onChange(%this) -{ - %optionName = %this.getRowLabel(%this.getSelectedRow()); - %tooltipText = %this.getTooltip(%this.getSelectedRow()); - - OptionName.setText(%optionName); - OptionDescription.setText(%tooltipText); - return; - - OptionsMenuSettingsList.clearOptions(); - - %currentRowText = %this.getRowLabel(%this.getSelectedRow()); - - if(%currentRowText $= "Display") - { - populateDisplaySettingsList(); - } - else if(%currentRowText $= "Graphics") - { - populateGraphicsSettingsList(); - } - else if(%currentRowText $= "Audio") - { - populateAudioSettingsList(); - } - else if(%currentRowText $= "Keyboard + Mouse") - { - populateKeyboardMouseSettingsList(); - } - else if(%currentRowText $= "Gamepad") - { - populateGamepadSettingsList(); - } -} - -function OptionsMenu::prevTab(%this) -{ - %this.pageTabIndex--; - if(%this.pageTabIndex < 0) - %this.pageTabIndex = 4; - - %tabBtn = %this.getTab(); - %tabBtn.performClick(); -} - -function OptionsMenu::nextTab(%this) -{ - %this.pageTabIndex++; - if(%this.pageTabIndex > 4) - %this.pageTabIndex = 0; - - %tabBtn = %this.getTab(); - %tabBtn.performClick(); -} - -function OptionsMenu::getTab(%this) -{ - if(%this.pageTabIndex == 0) - return %this-->DisplayButton; - else if(%this.pageTabIndex == 1) - return %this-->GraphicsButton; - else if(%this.pageTabIndex == 2) - return %this-->AudioButton; - else if(%this.pageTabIndex == 3) - return %this-->KBMButton; - else if(%this.pageTabIndex == 4) - return %this-->GamepadButton; - else - return %this-->DisplayButton; -} - +// +// +// function populateDisplaySettingsList() { OptionsMenuSettingsList.clear(); @@ -220,7 +285,7 @@ function populateDisplaySettingsList() trim(%apiList); - OptionsMenuSettingsList.addOptionRow("Display API", %apiList, false, "", true, "The display API used for rendering.", %displayDevice); + OptionsMenuSettingsList.addOptionRow("Display API", "$pref::Video::DisplayAPI", %apiList, false, "", true, "The display API used for rendering.", %displayDevice); %numDevices = Canvas.getMonitorCount(); %devicesList = ""; @@ -234,7 +299,7 @@ function populateDisplaySettingsList() } %selectedDevice = getField(%devicesList, $pref::Video::deviceId); - OptionsMenuSettingsList.addOptionRow("Display Device", %devicesList, false, "onDisplayModeChange", true, "The display devices the window should be on.", %selectedDevice); + OptionsMenuSettingsList.addOptionRow("Display Device", "$pref::Video::deviceId", %devicesList, false, "", true, "The display devices the window should be on.", %selectedDevice); if (%numDevices > 1) OptionsMenuSettingsList.setRowEnabled(1, true); @@ -242,10 +307,10 @@ function populateDisplaySettingsList() OptionsMenuSettingsList.setRowEnabled(1, false); %mode = getField($Video::ModeTags, $pref::Video::deviceMode); - OptionsMenuSettingsList.addOptionRow("Window Mode", $Video::ModeTags, false, "onDisplayModeChange", true, "", %mode); + OptionsMenuSettingsList.addOptionRow("Window Mode", "$pref::Video::deviceMode", $Video::ModeTags, false, "", true, "", %mode); %resolutionList = getScreenResolutionList($pref::Video::deviceId, $pref::Video::deviceMode); - OptionsMenuSettingsList.addOptionRow("Resolution", %resolutionList, false, "onDisplayResChange", true, "Resolution of the game window", _makePrettyResString( $pref::Video::mode )); + OptionsMenuSettingsList.addOptionRow("Resolution", "$pref::Video::Resolution", %resolutionList, false, "onDisplayResChange", true, "Resolution of the game window", _makePrettyResString( $pref::Video::mode )); //If they're doing borderless, the window resolution must match the display resolution if(%mode !$= "Borderless") @@ -253,20 +318,20 @@ function populateDisplaySettingsList() else OptionsMenuSettingsList.setRowEnabled(3, false); - OptionsMenuSettingsList.addOptionRow("VSync", "No\tYes", false, "", true, "", convertBoolToYesNo(!$pref::Video::disableVerticalSync)); + OptionsMenuSettingsList.addOptionRow("VSync", "$pref::Video::disableVerticalSync", "No\tYes", false, "", true, "", convertBoolToYesNo(!$pref::Video::disableVerticalSync)); %refreshList = getScreenRefreshList($pref::Video::mode); - OptionsMenuSettingsList.addOptionRow("Refresh Rate", %refreshList, false, "", true, "", $pref::Video::RefreshRate); + OptionsMenuSettingsList.addOptionRow("Refresh Rate", "$pref::Video::RefreshRate", %refreshList, false, "", true, "", $pref::Video::RefreshRate); //move to gameplay tab - OptionsMenuSettingsList.addSliderRow("Field of View", 75, 5, "65 100", ""); + OptionsMenuSettingsList.addSliderRow("Field of View", "", 75, 5, "65 100", ""); - OptionsMenuSettingsList.addSliderRow("Brightness", 0.5, 0.1, "0 1", ""); - OptionsMenuSettingsList.addSliderRow("Contrast", 0.5, 0.1, "0 1", ""); + OptionsMenuSettingsList.addSliderRow("Brightness", "", 0.5, 0.1, "0 1", ""); + OptionsMenuSettingsList.addSliderRow("Contrast", "", 0.5, 0.1, "0 1", ""); } -function OptionsMenu::applyDisplaySettings(%this) +/*function OptionsMenu::applyDisplaySettings(%this) { %newDevice = OptionsMenuSettingsList.getCurrentOption(0); @@ -285,9 +350,12 @@ function OptionsMenu::applyDisplaySettings(%this) echo("Exporting client prefs"); %prefPath = getPrefpath(); export("$pref::*", %prefPath @ "/clientPrefs." @ $TorqueScriptFileExtension, false); -} +}*/ -function populateGraphicsSettingsList(%this) +// +// +// +function populateGraphicsSettingsList() { OptionsMenuSettingsList.clear(); @@ -299,90 +367,32 @@ function populateGraphicsSettingsList(%this) %highMedLow = "Low\tMedium\tHigh"; %anisoFilter = "Off\t4\t8\t16"; %aaFilter = "Off\t1\t2\t4"; - OptionsMenuSettingsList.addOptionRow("Lighting Quality", getQualityLevels(LightingQualityList), false, "", true, "Amount and drawdistance of local lights", getCurrentQualityLevel(LightingQualityList)); - OptionsMenuSettingsList.addOptionRow("Shadow Quality", getQualityLevels(ShadowQualityList), false, "", true, "Shadow revolution quality", getCurrentQualityLevel(ShadowQualityList)); - OptionsMenuSettingsList.addOptionRow("Soft Shadow Quality", getQualityLevels(SoftShadowList), false, "", true, "Amount of softening applied to shadowmaps", getCurrentQualityLevel(SoftShadowList)); - OptionsMenuSettingsList.addOptionRow("Mesh Quality", getQualityLevels(MeshQualityGroup), false, "", true, "Fidelity of rendering of mesh objects", getCurrentQualityLevel(MeshQualityGroup)); - OptionsMenuSettingsList.addOptionRow("Object Draw Distance", getQualityLevels(MeshDrawDistQualityGroup), false, "", true, "Dictates if and when static objects fade out in the distance", getCurrentQualityLevel(MeshDrawDistQualityGroup)); - OptionsMenuSettingsList.addOptionRow("Texture Quality", getQualityLevels(TextureQualityGroup), false, "", true, "Fidelity of textures", getCurrentQualityLevel(TextureQualityGroup)); - OptionsMenuSettingsList.addOptionRow("Terrain Quality", getQualityLevels(TerrainQualityGroup), false, "", true, "Quality level of terrain objects", getCurrentQualityLevel(TerrainQualityGroup)); - OptionsMenuSettingsList.addOptionRow("Decal Lifetime", getQualityLevels(DecalLifetimeGroup), false, "", true, "How long decals are rendered", getCurrentQualityLevel(DecalLifetimeGroup)); - OptionsMenuSettingsList.addOptionRow("Ground Cover Density", getQualityLevels(GroundCoverDensityGroup), false, "", true, "Density of ground cover items, such as grass", getCurrentQualityLevel(GroundCoverDensityGroup)); - OptionsMenuSettingsList.addOptionRow("Shader Quality", getQualityLevels(ShaderQualityGroup), false, "", true, "Dictates the overall shader quality level, adjusting what features are enabled.", getCurrentQualityLevel(ShaderQualityGroup)); - OptionsMenuSettingsList.addOptionRow("Anisotropic Filtering", %anisoFilter, false, "", true, "Amount of Anisotropic Filtering on textures, which dictates their sharpness at a distance", $pref::Video::defaultAnisotropy); - OptionsMenuSettingsList.addOptionRow("Anti-Aliasing", %aaFilter, false, "", true, "Amount of Post-Processing Anti-Aliasing applied to rendering", $pref::Video::AA); - OptionsMenuSettingsList.addOptionRow("Parallax", %onOffList, false, "", true, "Whether the surface parallax shader effect is enabled", convertBoolToOnOff(!$pref::Video::disableParallaxMapping)); - OptionsMenuSettingsList.addOptionRow("Water Reflections", %onOffList, false, "", true, "Whether water reflections are enabled", convertBoolToOnOff(!$pref::Water::disableTrueReflections)); - OptionsMenuSettingsList.addOptionRow("SSAO", %onOffList, false, "", true, "Whether Screen-Space Ambient Occlusion is enabled", convertBoolToOnOff($pref::PostFX::EnableSSAO)); - OptionsMenuSettingsList.addOptionRow("Depth of Field", %onOffList, false, "", true, "Whether the Depth of Field effect is enabled", convertBoolToOnOff($pref::PostFX::EnableDOF)); - OptionsMenuSettingsList.addOptionRow("Vignette", %onOffList, false, "", true, "Whether the vignette effect is enabled", convertBoolToOnOff($pref::PostFX::EnableVignette)); - OptionsMenuSettingsList.addOptionRow("Light Rays", %onOffList, false, "", true, "Whether the light rays effect is enabled", convertBoolToOnOff($pref::PostFX::EnableLightRays)); + OptionsMenuSettingsList.addOptionRow("Lighting Quality", "$pref::Graphics::LightingQuality", getQualityLevels(LightingQualityList), false, "", true, "Amount and drawdistance of local lights", getCurrentQualityLevel(LightingQualityList)); + OptionsMenuSettingsList.addOptionRow("Shadow Quality", "$pref::Graphics::ShadowQuality", getQualityLevels(ShadowQualityList), false, "", true, "Shadow revolution quality", getCurrentQualityLevel(ShadowQualityList)); + OptionsMenuSettingsList.addOptionRow("Soft Shadow Quality", "$pref::Graphics::SoftShadowQuality", getQualityLevels(SoftShadowList), false, "", true, "Amount of softening applied to shadowmaps", getCurrentQualityLevel(SoftShadowList)); + OptionsMenuSettingsList.addOptionRow("Mesh Quality", "$pref::Graphics::MeshQuality", getQualityLevels(MeshQualityGroup), false, "", true, "Fidelity of rendering of mesh objects", getCurrentQualityLevel(MeshQualityGroup)); + OptionsMenuSettingsList.addOptionRow("Object Draw Distance", "$pref::Graphics::ObjectDrawDistance", getQualityLevels(MeshDrawDistQualityGroup), false, "", true, "Dictates if and when static objects fade out in the distance", getCurrentQualityLevel(MeshDrawDistQualityGroup)); + OptionsMenuSettingsList.addOptionRow("Texture Quality", "$pref::Graphics::TextureQuality", getQualityLevels(TextureQualityGroup), false, "", true, "Fidelity of textures", getCurrentQualityLevel(TextureQualityGroup)); + OptionsMenuSettingsList.addOptionRow("Terrain Quality", "$pref::Graphics::TerrainQuality", getQualityLevels(TerrainQualityGroup), false, "", true, "Quality level of terrain objects", getCurrentQualityLevel(TerrainQualityGroup)); + OptionsMenuSettingsList.addOptionRow("Decal Lifetime", "$pref::Graphics::DecalLifetime", getQualityLevels(DecalLifetimeGroup), false, "", true, "How long decals are rendered", getCurrentQualityLevel(DecalLifetimeGroup)); + OptionsMenuSettingsList.addOptionRow("Ground Cover Density", "$pref::Graphics::GroundCoverDensity", getQualityLevels(GroundCoverDensityGroup), false, "", true, "Density of ground cover items, such as grass", getCurrentQualityLevel(GroundCoverDensityGroup)); + OptionsMenuSettingsList.addOptionRow("Shader Quality", "$pref::Graphics::ShaderQuality", getQualityLevels(ShaderQualityGroup), false, "", true, "Dictates the overall shader quality level, adjusting what features are enabled.", getCurrentQualityLevel(ShaderQualityGroup)); + OptionsMenuSettingsList.addOptionRow("Anisotropic Filtering", "$pref::Video::defaultAnisotropy", %anisoFilter, false, "", true, "Amount of Anisotropic Filtering on textures, which dictates their sharpness at a distance", $pref::Video::defaultAnisotropy); + OptionsMenuSettingsList.addOptionRow("Anti-Aliasing", "$pref::Video::AA", %aaFilter, false, "", true, "Amount of Post-Processing Anti-Aliasing applied to rendering", $pref::Video::AA); + OptionsMenuSettingsList.addOptionRow("Parallax", "$pref::Video::disableParallaxMapping", %onOffList, false, "", true, "Whether the surface parallax shader effect is enabled", convertBoolToOnOff(!$pref::Video::disableParallaxMapping)); + OptionsMenuSettingsList.addOptionRow("Water Reflections", "$pref::Water::disableTrueReflections", %onOffList, false, "", true, "Whether water reflections are enabled", convertBoolToOnOff(!$pref::Water::disableTrueReflections)); + OptionsMenuSettingsList.addOptionRow("SSAO", "$pref::PostFX::EnableSSAO", %onOffList, false, "", true, "Whether Screen-Space Ambient Occlusion is enabled", convertBoolToOnOff($pref::PostFX::EnableSSAO)); + OptionsMenuSettingsList.addOptionRow("Depth of Field", "$pref::PostFX::EnableDOF", %onOffList, false, "", true, "Whether the Depth of Field effect is enabled", convertBoolToOnOff($pref::PostFX::EnableDOF)); + OptionsMenuSettingsList.addOptionRow("Vignette", "$pref::PostFX::EnableVignette", %onOffList, false, "", true, "Whether the vignette effect is enabled", convertBoolToOnOff($pref::PostFX::EnableVignette)); + OptionsMenuSettingsList.addOptionRow("Light Rays", "$pref::PostFX::EnableLightRays", %onOffList, false, "", true, "Whether the light rays effect is enabled", convertBoolToOnOff($pref::PostFX::EnableLightRays)); } -function OptionsMenu::applyGraphicsSettings(%this) -{ - LightingQualityList.applySetting(OptionsMenuSettingsList.getCurrentOption(0)); - ShadowQualityList.applySetting(OptionsMenuSettingsList.getCurrentOption(1)); - SoftShadowList.applySetting(OptionsMenuSettingsList.getCurrentOption(2)); - - MeshQualityGroup.applySetting(OptionsMenuSettingsList.getCurrentOption(3)); - MeshDrawDistQualityGroup.applySetting(OptionsMenuSettingsList.getCurrentOption(4)); - TextureQualityGroup.applySetting(OptionsMenuSettingsList.getCurrentOption(5)); - TerrainQualityGroup.applySetting(OptionsMenuSettingsList.getCurrentOption(6)); - DecalLifetimeGroup.applySetting(OptionsMenuSettingsList.getCurrentOption(7)); - GroundCoverDensityGroup.applySetting(OptionsMenuSettingsList.getCurrentOption(8)); - ShaderQualityGroup.applySetting(OptionsMenuSettingsList.getCurrentOption(9)); - - //Update Textures - reloadTextures(); - - //Update lighting - // Set the light manager. This should do nothing - // if its already set or if its not compatible. - //setLightManager( $pref::lightManager ); - - $pref::PostFX::EnableSSAO = convertOptionToBool(OptionsMenuSettingsList.getCurrentOption(14)); - $pref::PostFX::EnableDOF = convertOptionToBool(OptionsMenuSettingsList.getCurrentOption(15)); - $pref::PostFX::EnableVignette = convertOptionToBool(OptionsMenuSettingsList.getCurrentOption(16)); - $pref::PostFX::EnableLightRays = convertOptionToBool(OptionsMenuSettingsList.getCurrentOption(17)); - - PostFXManager.settingsEffectSetEnabled(SSAOPostFx, $pref::PostFX::EnableSSAO); - PostFXManager.settingsEffectSetEnabled(DOFPostEffect, $pref::PostFX::EnableDOF); - PostFXManager.settingsEffectSetEnabled(LightRayPostFX, $pref::PostFX::EnableLightRays); - PostFXManager.settingsEffectSetEnabled(vignettePostFX, $pref::PostFX::EnableVignette); - - $pref::Video::disableParallaxMapping = !convertOptionToBool(OptionsMenuSettingsList.getCurrentOption(12)); - - //water reflections - $pref::Water::disableTrueReflections = !convertOptionToBool(OptionsMenuSettingsList.getCurrentOption(13)); - - // Check the anisotropic filtering. - %level = OptionsMenuSettingsList.getCurrentOption(10); - if ( %level != $pref::Video::defaultAnisotropy ) - { - $pref::Video::defaultAnisotropy = %level; - } - - %newFSAA = OptionsMenuSettingsList.getCurrentOption(11); - if (%newFSAA $= "off") - %newFSAA = 0; - if (%newFSAA !$= $pref::Video::AA) - { - $pref::Video::AA = %newFSAA; - configureCanvas(); - } - - echo("Exporting client prefs"); - %prefPath = getPrefpath(); - export("$pref::*", %prefPath @ "/clientPrefs." @ $TorqueScriptFileExtension, false); -} - function updateDisplaySettings() { //Update the display settings now - %deviceName = OptionsMenuSettingsList.getCurrentOption(1); + %deviceName = getDisplayDeviceName(); %newDeviceID = getWord(%deviceName, 0) - 1; - %deviceModeName = OptionsMenuSettingsList.getCurrentOption(2); + %deviceModeName = getField($Video::ModeTags, $pref::Video::deviceMode); %newDeviceMode = 0; foreach$(%modeName in $Video::ModeTags) { @@ -392,15 +402,15 @@ function updateDisplaySettings() %newDeviceMode++; } - %newRes = getWord(OptionsMenuSettingsList.getCurrentOption(3), 0) SPC getWord(OptionsMenuSettingsList.getCurrentOption(3), 2); + %newRes = $pref::Video::Resolution; %newBpp = 32; // ... its not 1997 anymore. %newFullScreen = %deviceModeName $= "Fullscreen" ? true : false; - %newRefresh = OptionsMenuSettingsList.getCurrentOption(5); - %newVsync = !convertOptionToBool(OptionsMenuSettingsList.getCurrentOption(4)); + %newRefresh = $pref::Video::RefreshRate; + %newVsync = !$pref::Video::disableVerticalSync; %newFSAA = $pref::Video::AA; // Build the final mode string. - %newMode = %newRes SPC %newFullScreen SPC %newBpp SPC %newRefresh SPC %newFSAA; + %newMode = $pref::Video::Resolution SPC %newFullScreen SPC %newBpp SPC %newRefresh SPC %newFSAA; // Change the video mode. if ( %newMode !$= $pref::Video::mode || %newDeviceID != $pref::Video::deviceId || @@ -433,7 +443,18 @@ function updateDisplaySettings() } } -function populateAudioSettingsList(%this) +function updatePostFXSettings() +{ + PostFXManager.settingsEffectSetEnabled(SSAOPostFx, $pref::PostFX::EnableSSAO); + PostFXManager.settingsEffectSetEnabled(DOFPostEffect, $pref::PostFX::EnableDOF); + PostFXManager.settingsEffectSetEnabled(LightRayPostFX, $pref::PostFX::EnableLightRays); + PostFXManager.settingsEffectSetEnabled(vignettePostFX, $pref::PostFX::EnableVignette); +} + +// +// +// +function populateAudioSettingsList() { OptionsMenuSettingsList.clear(); @@ -472,13 +493,13 @@ function populateAudioSettingsList(%this) } } - OptionsMenuSettingsList.addOptionRow("Audio Provider", %audioProviderList, false, "audioProviderChanged", true, "", $currentAudioProvider); - OptionsMenuSettingsList.addOptionRow("Audio Device", %audioDeviceList, false, "", true, $pref::SFX::device); + OptionsMenuSettingsList.addOptionRow("Audio Provider", "$pref::SFX::AudioProvider", %audioProviderList, false, "audioProviderChanged", true, "", $currentAudioProvider); + OptionsMenuSettingsList.addOptionRow("Audio Device", "$pref::SFX::device", %audioDeviceList, false, "", true, $pref::SFX::device); - OptionsMenuSettingsList.addSliderRow("Master Volume", $pref::SFX::masterVolume, 0.1, "0 1", ""); - OptionsMenuSettingsList.addSliderRow("GUI Volume", $pref::SFX::channelVolume[ $GuiAudioType], 0.1, "0 1", ""); - OptionsMenuSettingsList.addSliderRow("Effects Volume", $pref::SFX::channelVolume[ $SimAudioType ], 0.1, "0 1", ""); - OptionsMenuSettingsList.addSliderRow("Music Volume", $pref::SFX::channelVolume[ $MusicAudioType ], 0.1, "0 1", ""); + OptionsMenuSettingsList.addSliderRow("Master Volume", "$pref::SFX::masterVolume", $pref::SFX::masterVolume, 0.1, "0 1", ""); + OptionsMenuSettingsList.addSliderRow("GUI Volume", "$pref::SFX::channelVolume[ $GuiAudioType]", $pref::SFX::channelVolume[ $GuiAudioType], 0.1, "0 1", ""); + OptionsMenuSettingsList.addSliderRow("Effects Volume", "$pref::SFX::channelVolume[ $SimAudioType ]", $pref::SFX::channelVolume[ $SimAudioType ], 0.1, "0 1", ""); + OptionsMenuSettingsList.addSliderRow("Music Volume", "$pref::SFX::channelVolume[ $MusicAudioType ]", $pref::SFX::channelVolume[ $MusicAudioType ], 0.1, "0 1", ""); } function audioProviderChanged() @@ -491,21 +512,21 @@ function audioProviderChanged() populateAudioSettingsList(); } -function OptionsMenu::applyAudioSettings(%this) +function updateAudioSettings() { - $pref::SFX::masterVolume = OptionsMenuSettingsList.getValue(2); + //$pref::SFX::masterVolume = OptionsMenuSettingsList.getValue(2); sfxSetMasterVolume( $pref::SFX::masterVolume ); - $pref::SFX::channelVolume[ $GuiAudioType ] = OptionsMenuSettingsList.getValue(3); - $pref::SFX::channelVolume[ $SimAudioType ] = OptionsMenuSettingsList.getValue(4); - $pref::SFX::channelVolume[ $MusicAudioType ] = OptionsMenuSettingsList.getValue(5); + //$pref::SFX::channelVolume[ $GuiAudioType ] = OptionsMenuSettingsList.getValue(3); + //$pref::SFX::channelVolume[ $SimAudioType ] = OptionsMenuSettingsList.getValue(4); + //$pref::SFX::channelVolume[ $MusicAudioType ] = OptionsMenuSettingsList.getValue(5); sfxSetChannelVolume( $GuiAudioType, $pref::SFX::channelVolume[ $GuiAudioType ] ); sfxSetChannelVolume( $SimAudioType, $pref::SFX::channelVolume[ $SimAudioType ] ); sfxSetChannelVolume( $MusicAudioType, $pref::SFX::channelVolume[ $MusicAudioType ] ); - $pref::SFX::provider = OptionsMenuSettingsList.getCurrentOption(0); - $pref::SFX::device = OptionsMenuSettingsList.getCurrentOption(1); + //$pref::SFX::provider = OptionsMenuSettingsList.getCurrentOption(0); + //$pref::SFX::device = OptionsMenuSettingsList.getCurrentOption(1); if ( !sfxCreateDevice( $pref::SFX::provider, $pref::SFX::device, @@ -521,7 +542,10 @@ function OptionsMenu::applyAudioSettings(%this) } } -function populateKeyboardMouseSettingsList(%this) +// +// +// +function populateKeyboardMouseSettingsList() { OptionsMenuSettingsList.clear(); @@ -534,7 +558,7 @@ function populateKeyboardMouseSettingsList(%this) //OptionsMenuSettingsList.refresh(); } -function populateGamepadSettingsList(%this) +function populateGamepadSettingsList() { OptionsMenuSettingsList.clear(); @@ -544,15 +568,30 @@ function populateGamepadSettingsList(%this) $remapListDevice = "gamepad"; fillRemapList(); - OptionsMenuSettingsList.refresh(); + OptionsMenuSettingsList.updateStack(); } +// +// +// function OptionsMenuList::activateRow(%this) { OptionsMenuSettingsList.setFirstResponder(); } function OptionsMenu::backOut(%this) +{ + if(%this.unappliedChanges.count() != 0) + { + MessageBoxOKCancel("Discard Changes?", "You have unapplied changes to your settings, do you wish to continue?", "OptionsMenu.doOptionsMenuBackOut();", ""); + } + else + { + %this.doOptionsMenuBackOut(); + } +} + +function OptionsMenu::doOptionsMenuBackOut(%this) { //save the settings and then back out if(OptionsMain.hidden == false) @@ -583,7 +622,7 @@ function OptionsMenuSettingsList::setRowEnabled(%this, %row, %status) } } -function OptionsMenuSettingsList::addOptionRow(%this, %label, %optionsList, %wrapOptions, %callback, %enabled, %description, %defaultValue) +function OptionsMenuSettingsList::addOptionRow(%this, %label, %targetPrefVar, %optionsList, %wrapOptions, %callback, %enabled, %description, %defaultValue) { if(%enabled $= "") %enabled = true; @@ -600,14 +639,27 @@ function OptionsMenuSettingsList::addOptionRow(%this, %label, %optionsList, %wra extent = %this.extent.x SPC %optionsRowSize; columnSplit = %optionColumnWidth; useMouseEvents = true; + previousBitmapAsset = "UI:previousOption_n_image"; + nextBitmapAsset = "UI:nextOption_n_image"; }; + %option.targetPrefVar = %targetPrefVar; //create a var-option association + + //now some override trickery, if we have a value cached for unapplied changes, swapsies the defaultValue out + //with the unapplied, allowing us to change options categories without losing changes + %unappliedPrefIndex = OptionsMenu.unappliedChanges.getIndexFromValue(%targetPrefVar); + if(%unappliedPrefIndex != -1) + { + %unappliedValue = OptionsMenu.unappliedChanges.getValue(%unappliedPrefIndex); + %defaultValue = %unappliedValue; + } + %option.setListSetting(%label, %optionsList, %wrapOptions, %callback, %enabled, %description, %defaultValue); %this.add(%option); } -function OptionsMenuSettingsList::addSliderRow(%this, %label, %defaultValue, %increment, %range, %callback, %enabled, %description) +function OptionsMenuSettingsList::addSliderRow(%this, %label, %targetPrefVar, %defaultValue, %increment, %range, %callback, %enabled, %description) { if(%enabled $= "") %enabled = true; @@ -626,11 +678,46 @@ function OptionsMenuSettingsList::addSliderRow(%this, %label, %defaultValue, %in useMouseEvents = true; }; + %option.targetPrefVar = %targetPrefVar; //create a var-option association + + //now some override trickery, if we have a value cached for unapplied changes, swapsies the defaultValue out + //with the unapplied, allowing us to change options categories without losing changes + %unappliedPrefIndex = OptionsMenu.unappliedChanges.getIndexFromValue(%targetPrefVar); + if(%unappliedPrefIndex != -1) + { + %unappliedValue = OptionsMenu.unappliedChanges.getValue(%unappliedPrefIndex); + %defaultValue = %unappliedValue; + } + %option.setSliderSetting(%label, %defaultValue, %increment, %range, %callback, %enabled, %description); %this.add(%option); } +function OptionsMenuSettingsList::addKeybindRow(%this, %label, %bitmapName, %callback, %enabled, %description) +{ + if(%enabled $= "") + %enabled = true; + + %optionsRowSize = 40; + %optionColumnWidth = %this.extent.x - 450; + + %option = new GuiGameSettingsCtrl() { + class = "MenuOptionsButton"; + profile = "GuiMenuButtonProfile"; + horizSizing = "width"; + vertSizing = "bottom"; + position = "0 0"; + extent = %this.extent.x SPC %optionsRowSize; + columnSplit = %optionColumnWidth; + useMouseEvents = true; + }; + + %option.setKeybindSetting(%label, %bitmapName, %callback, %enabled, %description); + + %this.add(%option); +} + // function OptionsMenuCategoryList::onNavigate(%this, %index) { @@ -738,6 +825,24 @@ function onDisplayResChange(%val) OptionsMenuSettingsList.selectOption(5, %newRate); } +function getDisplayDeviceName() +{ + %numDevices = Canvas.getMonitorCount(); + %devicesList = ""; + for(%i = 0; %i < %numDevices; %i++) + { + %device = (%i+1) @ " - " @ Canvas.getMonitorName(%i); + if(%i==0) + %devicesList = %device; + else + %devicesList = %devicesList @ "\t" @ %device; + } + + return getField(%devicesList, $pref::Video::deviceId); +} +// +// +// function MenuOptionsButton::onMouseEnter(%this) { OptionName.setText(%this.getLabel()); @@ -748,4 +853,84 @@ function MenuOptionsButton::onMouseLeave(%this) { OptionName.setText(""); OptionDescription.setText(""); -} \ No newline at end of file +} + +function MenuOptionsButton::onChange(%this) +{ + %optionMode = %this.getMode(); + %optionName = %this.getLabel(); + %tooltipText = %this.getTooltip(); + + %targetVar = %this.targetPrefVar; + + OptionName.setText(%optionName); + OptionDescription.setText(%tooltipText); + + %currentValue = %this.getCurrentOption(); + if(%currentValue !$= "") + { + if(%currentValue $= "yes" || %currentValue $= "on") + %saveReadyValue = 1; + else if(%currentValue $= "no" || %currentValue $= "off") + %saveReadyValue = 0; + else + %saveReadyValue = %currentValue; + + %prefIndex = OptionsMenu.unappliedChanges.getIndexFromKey(%targetVar); + if(%prefIndex == -1) + OptionsMenu.unappliedChanges.add(%targetVar, %saveReadyValue); + else + OptionsMenu.unappliedChanges.setValue(%saveReadyValue, %prefIndex); + } +} + +function OptionsMenu::onKeybindChanged(%this, %actionMap, %keybind) +{ + %prefIndex = OptionsMenu.unappliedChanges.getIndexFromKey(%actionMap); + if(%prefIndex == -1) + OptionsMenu.unappliedChanges.add(%actionMap, %keybind); + else + OptionsMenu.unappliedChanges.setValue(%keybind, %prefIndex); +} + +// +// Indicates what category the options item should be added into +// +function addOptionsMenuCategory(%categoryName, %selectCallback) +{ + OptionsMenu.optionsCategories.add(%categoryName, %selectCallback); +} + +function removeOptionsMenuCategory(%categoryName) +{ + %index = OptionsMenu.optionsCategories.getIndexFromKey(%categoryName); + if(%index != -1) + OptionsMenu.optionsCategories.erase(%index); +} + +function addListOption(%label, %description, %targetPrefVar, %optionsList, %wrapOptions, %callback, %enabled) +{ + if(%wrapOptions $= "") + %wrapOptions = false; + + if(%enabled $= "") + %enabled = true; + + OptionsMenuSettingsList.addOptionRow(%label, %targetPrefVar, %optionsList, %wrapOptions, %callback, %enabled, %description, %targetPrefVar); +} + +function addSliderOption(%label, %description, %targetPrefVar, %defaultValue, %increment, %range, %callback, %enabled) +{ + if(%enabled $= "") + %enabled = true; + + OptionsMenuSettingsList.addSliderRow(%label, %targetPrefVar, %defaultValue, %increment, %range, %callback, %enabled, %description); +} + +function addKeybindOption(%label, %description, %bitmapName, %callback, %enabled) +{ + if(%enabled $= "") + %enabled = true; + + OptionsMenuSettingsList.addSliderRow(%label, %bitmapName, %callback, %enabled, %description); +} diff --git a/Templates/BaseGame/game/data/UI/guis/pauseMenu.gui b/Templates/BaseGame/game/data/UI/guis/pauseMenu.gui index 77356fcdb..0ba6e7ce5 100644 --- a/Templates/BaseGame/game/data/UI/guis/pauseMenu.gui +++ b/Templates/BaseGame/game/data/UI/guis/pauseMenu.gui @@ -49,25 +49,31 @@ $guiContent = new GuiControl(PauseMenu) { isContainer = "1"; canSave = "1"; canSaveDynamicFields = "0"; - - new GuiGameListMenuCtrl(PauseMenuList) { - debugRender = "0"; - callbackOnInputs = "1"; - consumeKeyInputEvents = "1"; + + new GuiStackControl(PauseMenuList) { + stackingType = "Vertical"; + horizStacking = "Left to Right"; + vertStacking = "Top to Bottom"; + padding = "15"; + dynamicSize = "0"; + dynamicNonStackExtent = "0"; + dynamicPos = "0"; + changeChildSizeToFit = "1"; + changeChildPosition = "1"; position = "0 0"; extent = "700 320"; - minExtent = "8 2"; - horizSizing = "width"; - vertSizing = "bottom"; - profile = "DefaultListMenuProfile"; + minExtent = "16 16"; + horizSizing = "center"; + vertSizing = "center"; + profile = "GuiDefaultProfile"; visible = "1"; active = "1"; tooltipProfile = "GuiToolTipProfile"; hovertime = "1000"; - isContainer = "0"; - class = "UIMenuButtonList"; + isContainer = "1"; canSave = "1"; canSaveDynamicFields = "0"; + class = "MenuList"; }; }; new GuiControl(PauseButtonHolder) { @@ -147,5 +153,26 @@ $guiContent = new GuiControl(PauseMenu) { canSaveDynamicFields = "0"; }; }; + new GuiInputCtrl(PauseMenuInputHandler) { + class = "MenuInputHandler"; + sendAxisEvents = "1"; + sendBreakEvents = "1"; + sendModifierEvents = "0"; + ignoreMouseEvents = "1"; + lockMouse = "0"; + position = "-50 0"; + extent = "10 10"; + minExtent = "8 2"; + horizSizing = "width"; + vertSizing = "height"; + profile = "GuiInputCtrlProfile"; + visible = "1"; + active = "1"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "0"; + canSave = "1"; + canSaveDynamicFields = "0"; + }; }; //--- OBJECT WRITE END --- diff --git a/Templates/BaseGame/game/data/UI/guis/pauseMenu.tscript b/Templates/BaseGame/game/data/UI/guis/pauseMenu.tscript index 8d23b95d2..8751c16ef 100644 --- a/Templates/BaseGame/game/data/UI/guis/pauseMenu.tscript +++ b/Templates/BaseGame/game/data/UI/guis/pauseMenu.tscript @@ -8,19 +8,21 @@ function PauseMenu::onWake(%this) } PauseMenuList.hidden = false; - PauseMenuList.setFirstResponder(); - PauseButtonHolder.setActive(); - PauseMenuList.clearRows(); + PauseMenuList.clear(); if($Tools::loaded && EditorIsActive()) { - PauseMenuList.addRow("Exit Editor", "fastLoadWorldEdit", -1, -30); + %this.addPauseMenuButton("Exit Editor", "fastLoadWorldEdit();"); } - PauseMenuList.addRow("Options", "openPauseMenuOptions", -1, -30); - PauseMenuList.addRow("Exit to Menu", "pauseMenuExitToMenu", -1, -30); - PauseMenuList.addRow("Exit to Desktop", "pauseMenuExitToDesktop", -1, -30); + %this.addPauseMenuButton("Options", "openPauseMenuOptions();"); + %this.addPauseMenuButton("Exit to Menu", "pauseMenuExitToMenu();"); + %this.addPauseMenuButton("Exit to Desktop", "pauseMenuExitToDesktop();"); + + PauseMenuList.setAsActiveMenuList(); + PauseButtonHolder.setActive(); + PauseMenuInputHandler.setFirstResponder(); } @@ -36,8 +38,9 @@ function PauseMenu::onSleep(%this) function PauseMenu::onReturnTo(%this) { PauseMenuList.hidden = false; - PauseMenuList.setFirstResponder(); + PauseMenuList.setAsActiveMenuList(); PauseButtonHolder.setActive(); + PauseMenuInputHandler.setFirstResponder(); } function openPauseMenuOptions() @@ -61,6 +64,32 @@ function pauseMenuExitToDesktop() function PauseButtonHolder::onWake(%this) { - %this-->goButton.set("btn_a", "Return", "OK", "PauseMenuList.activateRow();", true); + %this-->goButton.set("btn_a", "Return", "OK", "PauseMenuList.activate();", true); %this-->backButton.set("btn_b", "Escape", "Back", "Canvas.popDialog();"); -} \ No newline at end of file +} + +function PauseMenu::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); +} diff --git a/Templates/BaseGame/game/data/UI/guis/profiler.tscript b/Templates/BaseGame/game/data/UI/guis/profiler.tscript index a13d7d9b5..56f88a189 100644 --- a/Templates/BaseGame/game/data/UI/guis/profiler.tscript +++ b/Templates/BaseGame/game/data/UI/guis/profiler.tscript @@ -363,4 +363,4 @@ function metrics( %expr ) } else $GameCanvas.popDialog(FrameOverlayGui); -} \ No newline at end of file +} diff --git a/Templates/BaseGame/game/data/UI/guis/recordingsDlg.asset.taml b/Templates/BaseGame/game/data/UI/guis/recordingsDlg.asset.taml index 7cc7b2168..2b0c337b5 100644 --- a/Templates/BaseGame/game/data/UI/guis/recordingsDlg.asset.taml +++ b/Templates/BaseGame/game/data/UI/guis/recordingsDlg.asset.taml @@ -1,7 +1,4 @@ + VersionId="1"/> diff --git a/Templates/BaseGame/game/data/UI/guis/startupGui.gui b/Templates/BaseGame/game/data/UI/guis/startupGui.gui index 647fc1b03..13f2460e3 100644 --- a/Templates/BaseGame/game/data/UI/guis/startupGui.gui +++ b/Templates/BaseGame/game/data/UI/guis/startupGui.gui @@ -35,7 +35,7 @@ $guiContent = new GuiFadeinBitmapCtrl(StartupGui) { Visible = "1"; tooltipprofile = "GuiToolTipProfile"; hovertime = "1000"; - bitmap = ""; + bitmapAsset = ""; wrap = "0"; command = "StartupGui.click();"; }; @@ -54,7 +54,7 @@ $guiContent = new GuiFadeinBitmapCtrl(StartupGui) { Visible = "1"; tooltipprofile = "GuiToolTipProfile"; hovertime = "1000"; - bitmap = ""; + bitmapAsset = ""; wrap = "0"; command = "StartupGui.click();"; }; diff --git a/Templates/BaseGame/game/data/UI/guis/startupGui.tscript b/Templates/BaseGame/game/data/UI/guis/startupGui.tscript index af673c819..a89226d70 100644 --- a/Templates/BaseGame/game/data/UI/guis/startupGui.tscript +++ b/Templates/BaseGame/game/data/UI/guis/startupGui.tscript @@ -32,7 +32,7 @@ function loadStartup() // A list of the splash screens and logos // to cycle through. Note that they have to // be in consecutive numerical order - StartupGui.bitmap[0] = "UI:background_dark_image"; + StartupGui.bitmap[0] = "UI:backgrounddark_image"; StartupGui.logo[0] = "UI:Torque_3D_logo_alt_image"; StartupGui.logoPos[0] = "178 251"; StartupGui.logoExtent[0] = "443 139"; diff --git a/Templates/BaseGame/game/data/UI/images/Torque-3D-logo-shortcut.png b/Templates/BaseGame/game/data/UI/images/Torque-3D-logo-shortcut.png deleted file mode 100644 index d993d4893f9112747e2099c1f111877db4064a86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10728 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 IQpVr@2Vh;nHvj+t diff --git a/Templates/BaseGame/game/data/UI/images/Torque-3D-logo-w.png b/Templates/BaseGame/game/data/UI/images/Torque-3D-logo-w.png deleted file mode 100644 index ec197dda39246e2f1f0a95f79d35a68aba584a01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19328 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 diff --git a/Templates/BaseGame/game/data/UI/images/Torque-3D-logo.png b/Templates/BaseGame/game/data/UI/images/Torque-3D-logo.png deleted file mode 100644 index e31d42a688a7e560b17237ff60edbf9c0c00dc4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9063 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 diff --git a/Templates/BaseGame/game/data/UI/images/Torque-3D-logo_alt.png b/Templates/BaseGame/game/data/UI/images/Torque-3D-logo_alt.png deleted file mode 100644 index 3836f1e7fc26b23ee299fa02570bbed343d2cb50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11616 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 diff --git a/Templates/BaseGame/game/data/UI/images/Torque_3D_logo_alt_image.asset.taml b/Templates/BaseGame/game/data/UI/images/Torque_3D_logo_alt_image.asset.taml index b153f46bc..a0e71c485 100644 --- a/Templates/BaseGame/game/data/UI/images/Torque_3D_logo_alt_image.asset.taml +++ b/Templates/BaseGame/game/data/UI/images/Torque_3D_logo_alt_image.asset.taml @@ -2,7 +2,7 @@ canSave="true" canSaveDynamicFields="true" AssetName="Torque_3D_logo_alt_image" - imageFile="@assetFile=Torque-3D-logo_alt.png" + imageFile="@assetFile=Torque_3D_logo_alt.png" UseMips="true" isHDRImage="false" imageType="Albedo" /> diff --git a/Templates/BaseGame/game/data/UI/images/Torque_3D_logo_image.asset.taml b/Templates/BaseGame/game/data/UI/images/Torque_3D_logo_image.asset.taml index da6130ae8..2315a3908 100644 --- a/Templates/BaseGame/game/data/UI/images/Torque_3D_logo_image.asset.taml +++ b/Templates/BaseGame/game/data/UI/images/Torque_3D_logo_image.asset.taml @@ -2,7 +2,7 @@ canSave="true" canSaveDynamicFields="true" AssetName="Torque_3D_logo_image" - imageFile="@assetFile=Torque-3D-logo.png" + imageFile="@assetFile=Torque_3D_logo.png" UseMips="true" isHDRImage="false" imageType="Albedo" /> diff --git a/Templates/BaseGame/game/data/UI/images/Torque_3D_logo_shortcut_image.asset.taml b/Templates/BaseGame/game/data/UI/images/Torque_3D_logo_shortcut_image.asset.taml index f780d2f0d..233a8b4fd 100644 --- a/Templates/BaseGame/game/data/UI/images/Torque_3D_logo_shortcut_image.asset.taml +++ b/Templates/BaseGame/game/data/UI/images/Torque_3D_logo_shortcut_image.asset.taml @@ -2,7 +2,7 @@ canSave="true" canSaveDynamicFields="true" AssetName="Torque_3D_logo_shortcut_image" - imageFile="@assetFile=Torque-3D-logo-shortcut.png" + imageFile="@assetFile=Torque_3D_logo_shortcut.png" UseMips="true" isHDRImage="false" imageType="Albedo" /> diff --git a/Templates/BaseGame/game/data/UI/images/Torque_3D_logo_w_image.asset.taml b/Templates/BaseGame/game/data/UI/images/Torque_3D_logo_w_image.asset.taml index 7d6d2fc14..f7dd36579 100644 --- a/Templates/BaseGame/game/data/UI/images/Torque_3D_logo_w_image.asset.taml +++ b/Templates/BaseGame/game/data/UI/images/Torque_3D_logo_w_image.asset.taml @@ -2,7 +2,7 @@ canSave="true" canSaveDynamicFields="true" AssetName="Torque_3D_logo_w_image" - imageFile="@assetFile=Torque-3D-logo-w.png" + imageFile="@assetFile=Torque_3D_logo_w.png" UseMips="true" isHDRImage="false" imageType="Albedo" /> diff --git a/Templates/BaseGame/game/data/UI/images/background-dark.png b/Templates/BaseGame/game/data/UI/images/background-dark.png deleted file mode 100644 index 13b4bda55c7c7c5ebc87d54bf010a5c06c32cc28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5751 zcmeAS@N?(olHy`uVBq!ia0y~yU;#2&7&w@K)Q9>#R~Q(W?pK9GlmsP~D-;yvr)B1( zDwI?fq$;FVWTr7NRNQ(yJ#f-(1)jG1mahE`DlHEz5)zh~zxepOxpVT_WpiI{9Bv9I#?+kdw?Mc!cDDpK4dr}|{V&IObIM4p>g6Y)Ko^Y*WU@7C!{s5xps z7vDHvSM*e2`>)U)d(|VWdJ-$@8w31tXMb<)gZ@0{keYQFH(czMBs@q~> zn&;1NcI;VZ;H3P{>CyGM=RJzzSf@WccSz#J^j6h*-_HNqIhTE}(1%yHFQ514PTwuF zeDUoqk0$%w_WKpJf9a)Uwj| zw&2wQ&0pKH+REH@%}EmJb_!OW zGp4f5o~+|5R3W3FZt!_3_u3tm$DB8`oai-}#Ca~`Qq7uoH$Pncb?~A@@l4^LC7G>z zD%R;QF+6$J+KrK;ckN2O+LLp8>-B`!G%V1YDXbPzV;dW?^!KevMB z|EKfa>qCbBwB3z9oOeEUe&zi8N)rvs>bEg6Ffg`cIy(n=Iy=LXIxvCHshw!+ao9oT zX#8a_S1mp|#%hPf>sJr7 zIGW@Y{QCU5^nxD!pXAgn!Qc1$82$oym@D+;g2o_HiZN+ z#?F~lN_%HCKL4?+y?=dq;Jl}`@6KOb{lu5;hsz_&Wzu3F**<<*wzT-3I^X6=O9bW% z_e+*IK5}1oT5o@$o|VprGaDv)o)vEIJetIQTK0@ro0pBNOkhawr`9#6xt{Bu%UXIY z>iZLYo~K)`W<|dho=?2CWc} zKKVcVb>-P&YU+2E1n|75+W59#P+n?VEVPFvK^mK6y0hUhJ4T15>aoE7&$RF>c>?%UP zwoVoSmTZSTfZEuA*Z_zdfJzv6fH(n&8JK|>Wat4PMpc4a2CHUbjfH8(v=AnP-AxG~ z2M%#JkrMo%(7+xs)D0(Ey9vK*v8S5B<|Z0v9dN!QHJoVdChQS&0F()_+I)avw2T3U z4dDU`cMxLNoB%WxyA1XyqIKQ@nLpUvL~7mvm8-N4CsN&nHCN$@c)}?SQ}ZBm6ZQmr z02n!=WeiH>kseUEf)K@6cqk`;f}Df|MeDpXTE+n5gNQ&LWchit9diJbkqDRMgDpRU zoITjwL`3pOQ8L diff --git a/Templates/BaseGame/game/data/UI/images/clear-btn_d.png b/Templates/BaseGame/game/data/UI/images/clear-btn_d.png deleted file mode 100644 index 229c71e8bddaa102f495a3dba47004f9c65cd0d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 593 zcmV-X00s?QkPn?)w z6CVEP+t+W**N+`j{PO<2JW!f(R$hMapFe*XQ8a;^}fcc&U1q&WrzGUsRJ~|Nb$;HG%v9vf=yp@5~EJ%j{0ATbF1a6f`foz5TGU zkMHBZK=}_JKCu4%`b@n56}$ZWa=w55ESxrV$`TGP&c7%D0g8vBl`A{>#l#-3tgkQ2 zR8m^7wz;{KM@Z;(+3GdzvKks+{{Hz34m}oFOoJj$N=5Z+-m>NMzkdJ5{O|8yMqVD? zKm39MzuDN>{(%B$^X5%VKwbYCk<;G)|Nj|*als698ry$h&@!{I{AFfl{tFTZ1~u4K f&!0Y90T5sS_@w(H5qG>u00000NkvXXu0mjf2Ztbp diff --git a/Templates/BaseGame/game/data/UI/images/clear-btn_h.png b/Templates/BaseGame/game/data/UI/images/clear-btn_h.png deleted file mode 100644 index 5e67cb13b2b4a85172bfa47e74b66993f0b315a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 595 zcmV-Z0<8UsP)Z)GIKgXfZeFjXq_kgNUj7V-2Ju1S$m*D2rhp`p zl9Fcr{{5R5=;ZW=4s#>mglFXG_fcy{jGxe}m8#*ZI9GM_(p zPV4K}uWDReT(?V0OVju5+t&+J`X6r7>({RxLPA1j0TnU5ee;GTDJjwa)albT#>U3& zL4koCPoF;ZdGX=}>z_Y=nBbcJ{{71fH0}21PoJ2xva|ipoIP7*Vq(%dVZwyX5fPEM zf$}_W-n;>6Vum}9nVI=>M@NUoh4be%&z?P7X=ZBLvS8uDP2azNXPP-ylRQAAkeFdrZPpa1{=Gs2xW zapJ^25Y5TSd0R(E=N8C@o}O;)$f)S{??1kax3#zR@eA<(K?!mT3yaSa`unr^czN$E zUc7iJFaS<0UAAlz7dO|l>C>iXT3T9u1p0>&9^{~y21T5Oh2^KYbLX{x`t-3I=nMva zet|!dQj))bw*LbK(3UM*m>C%v|1%<|J&=2U{P@8N#BBfm{$pZgW%wAA<=LJelEZTKubwTGJIwqVjwiI($lj%e)b#h zSV}4U^((?ZzW5oeF0X{QG;0x_gI(Zp1%{y0u%eoqB*Be}+Z35ISogfn=j{1}M~e5r zom^~6`il#Z>bB`G@&P}3s^gaM{dn?`64>vd+uy zC)Ag|rg#ir`9=|JM=PFw+g^xf&*YE1hYH5v6--s@cbdf?FJvm;W#*#H1Rw9hgS0Vv4;mgMH;x)r;fhYuV;(S;&;;NSt=u63|? zz%6O(;J_d!D}&pg-rnB0C5=o>QFLPjLReThZb@}b%@L7I2uePB_z*;W0B5A7%a^0e egYzdqfB^t3O)Y)0 z9XimShOxs=YQDsp@gJb1gn_Zvu?5E&#SyLef*bddTyF3YCK)zo&)JhrF5V0V0e+4h z&!GoIxa##XdV>0jSi8!D*$CI(frpPId zoX)3*M|j)3>wnqT_NAKB=~QbCw1-x!H26BvM$lT86^U`fnQd^FLPPQqy@lE%w=B^f)Fy&H|PPw->A71`mp00RIT5=iSlljg+$0000< KMNUMnLSTYWrq$s9 diff --git a/Templates/BaseGame/game/data/UI/images/collapse-toolbar_n.png b/Templates/BaseGame/game/data/UI/images/collapse-toolbar_n.png deleted file mode 100644 index b36de3ae049d9743a09dc6fc26af740cf9841360..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 439 zcmV;o0Z9IdP)Ox_mJPyDg4SlUjSNW3W5uGwOEk!Lx4uX4pZl7UqAx0i=rnvSAdP_$$A20Su(H_ zvh10InGB}9^1v-*3Cso@F>PaL>L}8isTm_PeHKN5r}hODW+z|w`}Q5O#yHtL&*`VC zP~)7=kRBzVBuOw+YZy|xe)*kcR2>cgwbuTO8@Fkiwr+iIX4$!2->q9vYwhDG`qk=o zMb~kBVd5z4oUzQ=+;7}ZXk^2MX<21r!6szg-dfzih^e4%lbv7^R`VYwdnU3IbzN)k2xeK9 hJ@8zg^|AXCU;u#ob3iiM+rIz+002ovPDHLkV1m|A!NdRn diff --git a/Templates/BaseGame/game/data/UI/images/dropdown-button-arrow.png b/Templates/BaseGame/game/data/UI/images/dropdown-button-arrow.png deleted file mode 100644 index 8c420ab85dad8b5ee3ca92464665ae071a471732..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%sd>6MhE&{2%E`$|abUXZ<1r^pL9db1gt1VxgHed#<;qq~ cW)1^}6XL9#0Z$iS1nOY$boFyt=akR{0H4Any8r+H diff --git a/Templates/BaseGame/game/data/UI/images/dropdown-textEdit.png b/Templates/BaseGame/game/data/UI/images/dropdown-textEdit.png deleted file mode 100644 index 3966efbb56239be59ee13cddceab917b144882b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 390 zcmV;10eSw3P)^?7l2ZX@QwNIJ_tdJyVq-O;hN*R;|Jf8oKt&?reAz#jswl zv@I};de2`VaYRw1b@G>k2y~N}rTzTSqF{8F^S*pfDsBZxV07vonVb4jntpET307*qoM6N<$f}R+y&Hw-a diff --git a/Templates/BaseGame/game/data/UI/images/expand-toolbar_d.png b/Templates/BaseGame/game/data/UI/images/expand-toolbar_d.png deleted file mode 100644 index 462929e95039217cc59fe50d6a95c2b7054ac0b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 278 zcmV+x0qOpUP)hgS0Vv4;mgMHsH*7Al-)#9Kh|`0|)U)I@mj4 zmz0y0VX$?;A?fYyjom>YT}CFR*d@cl!f^+Jx~ArcNG3!}K6>~NM125fq@~N3qsxQy cCqRG!07OkOz~-BXZ2$lO07*qoM6N<$f=)$pfdBvi diff --git a/Templates/BaseGame/game/data/UI/images/expand-toolbar_h.png b/Templates/BaseGame/game/data/UI/images/expand-toolbar_h.png deleted file mode 100644 index c33bcad6985b3862324279bc0f5457755b94f28f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 468 zcmV;_0W1EAP)qS?llb{VTLkjAsY;|aeyj=$>HXDkKfU1h$Gh(W#P&4TdW&oR`Nq&a3 zTN8um?Q=toI@keY`=EJd?T*CDZYvdgmA#wIqEGOnEJb$uEx-Uri&4ja71Rp=0000< KMNUMnLSTZ?xyoSx diff --git a/Templates/BaseGame/game/data/UI/images/expand-toolbar_n.png b/Templates/BaseGame/game/data/UI/images/expand-toolbar_n.png deleted file mode 100644 index 0af2f1bd13809d099ca3a5a5c9ba1dc42b6f66c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 437 zcmV;m0ZRUfP)4~o#5^Dg=ri|$!*BY zbpP3B?F$Y zwO%=>X`z&@9drv@g0dk;N^TmO`W3-u+KiE!MNwe&sko4$lziUp$nSm5RBnu=@2aBx z{tJ6eXN!gmYNct4`g&Fzw)&+;bvRI-=QzXGHr@KjvWz??HC?wpRyQl0+1YZdyi5{W zUN4=}-z_)f`gSe%?Dp<%8~-FuXmPb@UGQXjFw*+wZiCf_ZQoNiaUAu!c4K0>t=SF5 z!{LASY^7JJHJ)q5(e1RYDluRawr*}2FECOnsnf(0O2YO1qqJU$>_lDHiXEXW%d$tF f>$5J~UjYUHlxB7wIAEv(00000NkvXXu0mjf?KH=8 diff --git a/Templates/BaseGame/game/data/UI/images/group-border.png b/Templates/BaseGame/game/data/UI/images/group-border.png deleted file mode 100644 index 61234ae1fb3dee29eda38a371165d36b060ee426..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1273 zcmVRq)0SqBM&U{ zK~RE8k;)fTv@rNVFsUphN-&N10jmTOk|LETicKV_m54TpVAK!`|L<7|`4E(7K4ARB zDus5>J(HaE?!4W7v&qH}czMI@+&44#&Ye5=o}G2_O1ZzkpGs6d@8oj17WcW!E!8%I zG7SwXm(AMBn08BdCX>0T948-RoKK$0X0t6*Q&aiH#l^fexw~LXm>2UyPMmS3yc8^% zPN&txvs=#V2iKgriKmXs^9tJFqjWWIBOj#Opr!-61IK}Xx1-s?{L4G0_&?_ilXv4x zqfZ_btu8MwSK|-wsQY~v)cnk(&+H?8J(|C{sz$fn!M^&){#~l$>@n5f-deC_;MX2J zsxZHFtA)8SUGF$_vOr$N_B~qGz~m2~oD@4WwsorNs!FYtyCThVSEZ(BX4T=g^Lm1w z!FRq%(Y|`AS3jc65Sso~f)<#1w-6X-QZF0;z1&IJw>OAO*=w$5nIM949%2g^Yzljy(oWy)Hf= zKP~7s_`nZIkS{YqF~l(je$;4#Z=xBAo(3O1_wqgCBii5tJte9r;~AA?zGq4`(Ts_n zWQL)#a^A!gm6r6qM+nP?0Sc)kNm@4Xtw-=SGYrxowl6GaQ(5@5B&1Y;X$f*x_i`5k zxlG?JMp&eYe3Cfrf#}H=#@X;~|BtO`5XzBM3_XQWv3X-F3LkUd8np$mW$;ZD@}tlb z@grOWzKMePX$!hz`6y0z95fS#p0K!L8Eqx>`_a=%75$H%65feFik{-gOB_87-@a&t zo=kbNraT|vFoAMIeOeI8_0#*bHBgfWlms3M{F=|;vk&HAk-V?7qf70j+dSQteXuCB zxme0WXRY7zZQiQU6W{Gki*a6ad*$6z80sP_3%q+`TtsI83dY1J6eRh$8vuYoz-JP{ zd_mbs-aVmUVdndNBq%XE#kqTuz$8gP5_U;MoS^NwxEOTzWZpMPmn%SJ z?(zSC4+0292nh@kvId`u$uPqZCPNED8bgi@LmbC`Ql1P|ln1?_pHA~@{Z%BXuPKfW j%4_?bDUt6}KLr>7B{DrC{G$C100000NkvXXu0mjfaJE^D diff --git a/Templates/BaseGame/game/data/UI/images/inactive-overlay.png b/Templates/BaseGame/game/data/UI/images/inactive-overlay.png deleted file mode 100644 index feab83209cc442c5ad8dc73c2b86e0a8115c4743..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!foRZkbkkcwMLfBw9D?8~Obq{gPz9LVg>D`Q%4bP0l+XkKL$W0) diff --git a/Templates/BaseGame/game/data/UI/images/menu-button.png b/Templates/BaseGame/game/data/UI/images/menu-button.png deleted file mode 100644 index 3cfa036d8f5ec1d5458b0716efd2ea477cca0c6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3559 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 ZSBpO8NK=0oeKjq>KnJS*AI-m_{|h>L*X{rS diff --git a/Templates/BaseGame/game/data/UI/images/next-button_d.png b/Templates/BaseGame/game/data/UI/images/next-button_d.png deleted file mode 100644 index 76c3ec0ffbfd0e390d18bf15b641406a1c963304..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^+&~=2!3HE*cE)T6Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JigtRsIEGZ*dUIWo&smX&Az+(=poWapSz@o$*? zhV8dl?=!aFoKn4xeZo2Nf4=Qb$;zCp)-ipVh!6ks%DPE^D{?9q{wDx9i9DW z-@5CHEdniu-!^_}`*}dN=v;ZVvUv|*i@L#DeRZC~n>o$)T~mbY?ZFzA*KO@H&DTlVp33;PS)Y-O Z!Sa~S%jms^DnL&#c)I$ztaD0e0szoGZ1VsB diff --git a/Templates/BaseGame/game/data/UI/images/next-button_h.png b/Templates/BaseGame/game/data/UI/images/next-button_h.png deleted file mode 100644 index f52f5fb4230f07e879e02d61472b07c57d07712c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 549 zcmV+=0^0qFP)0-qXkL_v~jv zlgT7TvAv7&%t^dYr_+a#hr^+@TrOWYNQ8?)a=v3urz2xpTz;W+6qyRv^uk~=B$Fa* zY7trZc?lJ%X2T_NO4CLKXgbTNCUvD{m}Vo^YPY~Tkd2ce$z(`A zSFm{3{j7pUGGsRDL1tMpV+>&!sySO(N(;fVWY6>Px?ZdKIygr@9z84;3mir8H9bcT zKSQ{#tA_9UkIBuZg(!-!TCLy*m)dh=+qMwLF?PEhHk&s@;`3dyZQCkM?RFd6?G_i? zH&3?FXf)96b}<|dg{B^9J^vSnF{HXe^vpq8OGKg(`@ zDPc4kq4(575CoTb2I&Kvq)6s=Hk-l!@S!1z#rXq!I-TG+j+$?6tXwP5KmRLDro?qz zvLl(u&>hLB$=P8+ zw(YFdb&VZ&3=k2N&8;vD6%z#@SPPD4Vq~7_lP=Gm!*~tPGFXzjSBY6BP=OAZn1#Yz zeMOAFs`Cm16Yd2fQ=s2N5ee+0alltX+9{%Ju=RO7?f|t1WmQ!f&x7^dJ=)Ck+zLbQ z8C%e;EK4{X{$aeYESPxc)^_`2^&U`(>ag;@-~WwZxO#4HMyn_aV}GbRTk76dt6?AK zsxC-Q@=mGD}pHXHn{a?_1VZvZ|8^e0u7drcunPkNJ1EWBngI a3oroff;ABVIBm%Q00000druqyUGAf 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 diff --git a/Templates/BaseGame/game/data/UI/images/previous-button_d.png b/Templates/BaseGame/game/data/UI/images/previous-button_d.png deleted file mode 100644 index 688b3034593019b560c95d56ca9ad50633a1d800..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 290 zcmV+-0p0$IP)aLQWp}M-VW=GgSOtJO1OWsQ!>dPPUAR&lL*PV&z_HIo(bxiQo zG};(LQc4m+6k(jEjJ36vwAQ4Q+D*=|s;Zp)s}5;NiF@#a(PGS)F=NIkUe^`Jecxkv zS(e-o9)BL_eXU0B$9lCDhj0MLO$6qS*o3}t8TfCx>}q<#)g6KIH2DOD=f(ZiAb^zpyn zi5)f=3~mA3^Qa@I>5M1#`~A9Y+gB5((3 zy3Q2IOpqltj~r`OQ*qL)SfWmr$+)hfTDpz0?$jW9A znJJRv70iF?ezt;2GRTc;khLUPhNfxoeP8r3h{ls-8II%Nd9@OKJpLV-Xa}A&o6T`J zI4SalX4iGGUazs;zQX_TfVHg+=hoVTjm&s{2v?w?ly z*zfl+&4gw~WTf37V)v$tcDs#Qt(E{W`NC?cXTyDWF&d48=QKzEmifXSk4MnKPknMc zb1NV@$+2JAWC|R|1$QJB8FEKb+GN=OF;Pu&sb7pz%GFO|)dJg)641pwaK zh{1KW@K4h;sFYfamcsxM<0y(26Sjjr)t45dZ)H07*qoM6N<$f@y!$IRF3v diff --git a/Templates/BaseGame/game/data/UI/images/selector-button-blank.png b/Templates/BaseGame/game/data/UI/images/selector-button-blank.png deleted file mode 100644 index e965b3af6f2b9a269f2d363f6118060aaaacfe23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 744 zcmVP)OT4`WyUtC~=@hx+zySvwaKHgKA>83`kd%_BYOLNgO(Uv$2b*)@|Eg9YW@7fI zT~!q^i<8!-Y2N9)S2Rgnw#U*CJ*lmP+UI&jej#f@hhX^j%SM~?LF zi?zW-dhDh9K8FR%|AW1+Pd7{fT$3IAR&V6+TZaPUw@w9!-|CGXdJee7;UfF3q}2_F z-|E$KyQ*vs6_t}znHa6W?Ga9$rG&H;mg0WQq!gDq*w&w<$RMR-QTF zp5X9X$D|d%wE|28zjYYM_QYn*#rUnC;P6`qMiswx)bfSjir571FWj#7x87#*oU@1w z+uvGBam@&64A{^k=j;-))qZO&*qHn9Tm5kCB=ITlrQvKh0|K};_P1&c*wXu3jc4w^ zg=2r~8qq_QY(Sd1r diff --git a/Templates/BaseGame/game/data/UI/images/selector-button-dark.png b/Templates/BaseGame/game/data/UI/images/selector-button-dark.png deleted file mode 100644 index 84ee7e6f30f4eef5b3d2a1440495b16cf3b21f65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1942 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 LNkvXXu0mjfl=J=< diff --git a/Templates/BaseGame/game/data/UI/images/selector-button.png b/Templates/BaseGame/game/data/UI/images/selector-button.png deleted file mode 100644 index cd0780068892795e6329d713f48e84fa9f1df8d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4002 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 IM6N<$f{4Jk(*OVf diff --git a/Templates/BaseGame/game/data/UI/images/separator-h.png b/Templates/BaseGame/game/data/UI/images/separator-h.png deleted file mode 100644 index 339c0fbe039e8b5cbdd085230594099c26928157..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^Oh7Ed0V0oZ{G0)#BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%iF>*@hE&{2%E-w0@&CWQFtY@YFPFjrhT;U4EtAg|X#kZl Nc)I$ztaD0e0sy9+AwB>A diff --git a/Templates/BaseGame/game/data/UI/images/separator-v.png b/Templates/BaseGame/game/data/UI/images/separator-v.png deleted file mode 100644 index 6a0f873612cef214add9a2f88ed72dbafe92174c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^GC<74!2~3aY}VEQQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JiX=Q;978H@CFNvfBrGsX`1Ak2{Z(F84g-d-`&k-}TiGQ5 P)i8Lv`njxgN@xNAx)CBs diff --git a/Templates/BaseGame/game/data/UI/images/slider - Copy.png b/Templates/BaseGame/game/data/UI/images/slider - Copy.png deleted file mode 100644 index 92fee1e9c13401f0b9fb319b14ebd267b7c1c8a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 908 zcmV;719SX|P)BsNz zeu<3YC~{d@T`O@7=Bqd8zh+r&1N$TtpK!GELCNikCSDYg%%{_tjFWkfZXnes>n;@ zqR|aj)!gZHXh8b=y;^A;kRu8#6pO{!Mvtd3L02hDKJM?<79kE%E?3>4B+0?(MwHD# znh=bupw`5N2ruq9KZs6u_7))i@#~}<;40XaEJtI*eV$Cj55Bf2ineZ<81cX|$A?-K ziRQ$vUFqvirBbh8IBB!lrWT$p@_Epw4{y{Jk<89s7(yreE_ZXgJAlQLOs#F|`{D~e zk1JU{!ht}*1pQDv9-m=Z)*TLqIgIfHJjnm+Zki*YSv0N&+<5q!9OI!(a(m|ZDWCi2 z+7hQAJOK~#FZBQBsFq0$xe508a5Ng7>+0%qd%a%d^ZA(i`uZ`3VWtE40bY>a7M7V# zB!+jkHs_9=>37>2j-V5r7a4n=; z!uTf4JA}`P;v1uD=Z~Jdb2XVYA zW9_{!_Y>&<@ydWoCaW7|c%=l304u9lXbBBDP18sKV$fMbp11YLDqKf%e#(kCvbjnH z0IY2MSwNH|Nr;Cm_2f`8%fP&(pfq1j&P&EykrGAGkevASCV(r$>yDU`^BZRlB!U6C zWJs>$^wwoAh)RXbi7W=16Mq@GgpA26$sz+uYE0GPzMbJE%h#`yBRq)9| zM)ez$XR{;UB9VaZPe36jlnmZKpDj2gSsD4W{t>WPgB5pU{)$x*B(ajOltDF2!h9-! iq)BbrE0*;C1Q-Ck2#=cQD4UW100001gDw+ diff --git a/Templates/BaseGame/game/data/UI/images/slider-w-box.png b/Templates/BaseGame/game/data/UI/images/slider-w-box.png deleted file mode 100644 index d9ef04961a30ad99f1e8871ef1f292b8a58d99f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 982 zcmV;{11bE8P)P001Qj1^@s6w^2g10000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#cu7P-RCwCFR!vM3K@@(oZI`u_7W)HS z_z46E5)-2a4+bql1U-1bs3#7@MD)a635mu~6G-Gn0+OI7O^h)fNi@NO!AOt<2?u@- z9*T%*X=%IvU1wGbyW4iRJ=m8_JMZl``|W!(^UWYsCMfWq4Q+02T9P!k*TKfx&%D0b zIAV74Q(YCX9ALy)joJOZchpx&6vet?Mob}N^dtoU6${^z1Pb{oBc|v~N>Z->n@DC( z^dn?hhVAVwNE{p-MuM=syre-K`>u)#Xl!f(o6S~Sxwf`8L6&6j`TR#QZC~prlSvid z+}u(e$w530ZEfwknBO1B>68EU^)=Huvgcc$9*%OPjCcpe23-4*Ecl4pS?Z!vATK~Iiu<8eTHFFyaGybOBf*v0#((zSZ!Ussc*KV zOSc(IBP*p4NV1{K&1b;)3K*lE;}RUd_RdRpkQHcQ{vA+^sH8cEioJZbKQB(*d>ETm zuGaa}MSa=Fv8LiO$#h;y@AHDD?T@o!>D`6mNv2*6_aqXDx41j*a=9k%Ha_7s%C58F zFXwu=WDCZkai-igF-SdCvFG!V4BWm>!3*e*>_?`8!JubxadCuYS^C-62cdY{%V|mO zPrfEv*U!cyQ>QNWdN!6mk8mtUKTi&Y8cr}=J`yS#jShsv;o0u)ZhuWp4fOW*GG4ED z6l>Dt*u#5hb>-U;I2DTx9PIAQwsqd{y8?C4-gT3yI9WaFU@BB>UKK8*>A7oteeO!E zq@o~z9iMO)Iy!(tXb3;o>AT`6pKHBx%T2qhfX53+u`y74whPk8o`uzwE162EM<|a8 zw7SIcYMIM%i)G?$iUZ2&2bNcK>ca7I7FI{%a5zA~1PCEZ@l)(h;K<%ZdJU70*H7+D zBuN4uf3=Z>TqcahOA4g;Y!Y6wSi+(x<|H9;qX{^~k}4v-QVOC4iG*J!WFkKE!Y<#Qq8}0K%2(y+C}?TL1t607*qoM6N<$ Eg3Ob{L;wH) diff --git a/Templates/BaseGame/game/data/UI/images/slider___Copy_image.asset.taml b/Templates/BaseGame/game/data/UI/images/slider___Copy_image.asset.taml deleted file mode 100644 index 3a460e432..000000000 --- a/Templates/BaseGame/game/data/UI/images/slider___Copy_image.asset.taml +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/Templates/BaseGame/game/data/UI/images/tab-border.png b/Templates/BaseGame/game/data/UI/images/tab-border.png deleted file mode 100644 index 6703924d48fb96552fe11a91696f7c282aea3439..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1203 zcmV;k1WfyhP)s+T@)zO{{b^^V< z=wH7wY(L{2P71F802ipY7kw@qE$vBN%q#5`37@CZ`H-O1-w@Umr|4D%f4*L^Nt+hhLK_6p2Z z%jmzE=C=LL3e%yyDGwhjj6U6g3bP`N-;PET+g?oxjXD4|r+B4=CaKr15}L$b?q6b0 zh8~SA%A;{SQ}t+Cpt=UfVlxhaEO#3>tT*c#8_eR@?>5%(PLkvwCV9zbSc8!+a4ONV zR-+KOJO_Zt7V|Std?$P6?aK-C`OA{+V;uY;3(0FXgFHquf);&@Yc?a<)A*xjHOZUF z9OEwblp3gHGX%+c&yuRyjAl==LJ=%0nk$@AZ@u)S6zSP8LLos?q-QfZ^*VWDa!G;yi`d#otZB4azuR)9UhD?F)aac|0iuXn*Eh1*_F zk5@SQ_F3yW*%QGMWE}P+4H9G+d(!r(D?=_|4>u*qe>cw_ShR}v@)e(9wdwjG#i_h1~oIT;xGv>0sd%EOptRemapText.setValue( "Re-bind \"" @ %name @ "\" to..." ); OptRemapInputCtrl.index = %rowIndex; Canvas.pushDialog( RemapDlg ); + + //Let the options menu know + %actionMap = $RemapActionMap[%rowIndex]; + + OptionsMenu.onKeybindChanged(%actionMap, %name); } function ControlsMenuRebindButton::onClick(%this) @@ -327,4 +334,4 @@ function redoMapping( %device, %actionMap, %action, %cmd, %oldIndex, %newIndex ) %actionMap.bind( %device, %action, %cmd ); fillRemapList(); -} \ No newline at end of file +} diff --git a/Templates/BaseGame/game/data/UI/scripts/cursors.tscript b/Templates/BaseGame/game/data/UI/scripts/cursors.tscript index d8aa31eeb..ba81636f7 100644 --- a/Templates/BaseGame/game/data/UI/scripts/cursors.tscript +++ b/Templates/BaseGame/game/data/UI/scripts/cursors.tscript @@ -37,4 +37,4 @@ else renderOffset = "0 0"; bitmapName = "data/ui/images/defaultCursor"; }; -} \ No newline at end of file +} diff --git a/Templates/BaseGame/game/data/UI/scripts/utility.tscript b/Templates/BaseGame/game/data/UI/scripts/utility.tscript index 357a6a182..e73d1c080 100644 --- a/Templates/BaseGame/game/data/UI/scripts/utility.tscript +++ b/Templates/BaseGame/game/data/UI/scripts/utility.tscript @@ -10,117 +10,123 @@ function getButtonBitmap(%device, %button) %device = "Xbox"; } - %path = ""; + %assetId = ""; if(%device $= "PS4") { - %path = "data/ui/images/inputs/PS4/PS4_"; + %assetId = "UI:PS4_"; if(%button $= "A" || %button $= "btn_a") - %path = %path @ "Cross"; + %assetId = %assetId @ "Cross"; else if(%button $= "B" || %button $= "btn_b") - %path = %path @ "Circle"; + %assetId = %assetId @ "Circle"; else if(%button $= "X" || %button $= "btn_x") - %path = %path @ "Square"; + %assetId = %assetId @ "Square"; else if(%button $= "Y" || %button $= "btn_y") - %path = %path @ "Triangle"; + %assetId = %assetId @ "Triangle"; else if(%button $= "LB") - %path = %path @ "L1"; + %assetId = %assetId @ "L1"; else if(%button $= "LT") - %path = %path @ "L2"; + %assetId = %assetId @ "L2"; else if(%button $= "RB") - %path = %path @ "R1"; + %assetId = %assetId @ "R1"; else if(%button $= "RT") - %path = %path @ "R2"; + %assetId = %assetId @ "R2"; else if(%button $= "thumbrx" || %button $= "thumbry") - %path = %path @ "Right_Stick"; + %assetId = %assetId @ "Right_Stick"; else if(%button $= "thumblx" || %button $= "thumbly") - %path = %path @ "Left_Stick"; + %assetId = %assetId @ "Left_Stick"; else if(%button $= "start") - %path = %path @ "Options"; + %assetId = %assetId @ "Options"; else if(%button $= "back") - %path = %path @ "Share"; + %assetId = %assetId @ "Share"; else if(%button $= "dpadu") - %path = %path @ "Dpad_Up"; + %assetId = %assetId @ "Dpad_Up"; else if(%button $= "dpadd") - %path = %path @ "Dpad_Down"; + %assetId = %assetId @ "Dpad_Down"; else if(%button $= "dpadl") - %path = %path @ "Dpad_Left"; + %assetId = %assetId @ "Dpad_Left"; else if(%button $= "dpadr") - %path = %path @ "Dpad_Right"; + %assetId = %assetId @ "Dpad_Right"; + + %assetId = %assetId @ "_image"; } else if(%device $= "Switch") { - %path = "data/ui/images/inputs/Switch/Switch_"; + %assetId = "UI:Switch_"; if(%button $= "A" || %button $= "btn_a") - %path = %path @ "B"; + %assetId = %assetId @ "B"; else if(%button $= "B" || %button $= "btn_b") - %path = %path @ "A"; + %assetId = %assetId @ "A"; else if(%button $= "X" || %button $= "btn_x") - %path = %path @ "Y"; + %assetId = %assetId @ "Y"; else if(%button $= "Y" || %button $= "btn_y") - %path = %path @ "X"; + %assetId = %assetId @ "X"; else if(%button $= "LB") - %path = %path @ "LB"; + %assetId = %assetId @ "LB"; else if(%button $= "LT") - %path = %path @ "LT"; + %assetId = %assetId @ "LT"; else if(%button $= "RB") - %path = %path @ "RB"; + %assetId = %assetId @ "RB"; else if(%button $= "RT") - %path = %path @ "RT"; + %assetId = %assetId @ "RT"; else if(%button $= "thumbrx" || %button $= "thumbry") - %path = %path @ "Right_Stick"; + %assetId = %assetId @ "Right_Stick"; else if(%button $= "thumblx" || %button $= "thumbly") - %path = %path @ "Left_Stick"; + %assetId = %assetId @ "Left_Stick"; else if(%button $= "start") - %path = %path @ "Plus"; + %assetId = %assetId @ "Plus"; else if(%button $= "back") - %path = %path @ "Minus"; + %assetId = %assetId @ "Minus"; else if(%button $= "dpadu") - %path = %path @ "Dpad_Up"; + %assetId = %assetId @ "Dpad_Up"; else if(%button $= "dpadd") - %path = %path @ "Dpad_Down"; + %assetId = %assetId @ "Dpad_Down"; else if(%button $= "dpadl") - %path = %path @ "Dpad_Left"; + %assetId = %assetId @ "Dpad_Left"; else if(%button $= "dpadr") - %path = %path @ "Dpad_Right"; + %assetId = %assetId @ "Dpad_Right"; + + %assetId = %assetId @ "_image"; } else if(%device $= "Keyboard" || %device $= "Mouse") { - %pathBase = "data/ui/images/Inputs/Keyboard & Mouse/Keyboard_Black_"; - %path = %pathBase @ %button @ ".png"; - if(!isFile(%path)) - %path = %pathBase @ "Blank"; + %assetId = "UI:Keyboard_Black_" @ %button @ "_image"; } else if(%device !$= "") { - %path = "data/ui/images/inputs/Xbox/Xbox_"; + %assetId = "UI:Xbox_"; if(%button $= "btn_a") - %path = %path @ "B"; + %assetId = %assetId @ "B"; else if(%button $= "btn_b") - %path = %path @ "A"; + %assetId = %assetId @ "A"; else if(%button $= "btn_x") - %path = %path @ "Y"; + %assetId = %assetId @ "Y"; else if(%button $= "btn_y") - %path = %path @ "X"; + %assetId = %assetId @ "X"; else if(%button $= "thumbrx" || %button $= "thumbry") - %path = %path @ "Right_Stick"; + %assetId = %assetId @ "Right_Stick"; else if(%button $= "thumblx" || %button $= "thumbly") - %path = %path @ "Left_Stick"; + %assetId = %assetId @ "Left_Stick"; else if(%button $= "start") - %path = %path @ "Menu"; + %assetId = %assetId @ "Menu"; else if(%button $= "back") - %path = %path @ "Windows"; + %assetId = %assetId @ "Windows"; else if(%button $= "dpadu") - %path = %path @ "Dpad_Up"; + %assetId = %assetId @ "Dpad_Up"; else if(%button $= "dpadd") - %path = %path @ "Dpad_Down"; + %assetId = %assetId @ "Dpad_Down"; else if(%button $= "dpadl") - %path = %path @ "Dpad_Left"; + %assetId = %assetId @ "Dpad_Left"; else if(%button $= "dpadr") - %path = %path @ "Dpad_Right"; + %assetId = %assetId @ "Dpad_Right"; + + %assetId = %assetId @ "_image"; } - return %path; -} \ No newline at end of file + if(!AssetDatabase.isDeclaredAsset(%assetId)) + %assetId = "UI:Keyboard_Black_Blank_image"; + + return %assetId; +} diff --git a/Templates/BaseGame/game/tools/projectImporter/scripts/projectImporter.tscript b/Templates/BaseGame/game/tools/projectImporter/scripts/projectImporter.tscript index 2e98c9b03..c149cf3f2 100644 --- a/Templates/BaseGame/game/tools/projectImporter/scripts/projectImporter.tscript +++ b/Templates/BaseGame/game/tools/projectImporter/scripts/projectImporter.tscript @@ -1743,7 +1743,9 @@ function beginGUIImport() DirectoryHandler::createFolder(0, filePath(%destinationPath)); } - if(!pathCopy(%file, %destinationPath, false)) + //Check if we need to even copy in the first place. If we do, ensure + //the copy actually worked + if((makeRelativePath(%file) !$= %destinationPath) && !pathCopy(%file, %destinationPath, false)) { projectImporterLog("ProjectImporter::beginGUIImport() - failed to copy GUI: " @ %file @ " to destination: " @ %destinationPath); @@ -1779,9 +1781,9 @@ function processGUIntoAsset(%guiName, %file) %tamlpath = %assetPath @ %assetName @ ".asset.taml"; %scriptFile = ""; - if(isImportingFile(%filePath @ "/" @ %fileName @ ".tscript")) + if(isImportingFile(makeFullPath(%filePath @ "/" @ %fileName @ "." @ $TorqueScriptFileExtension))) { - %scriptFile = %fileName @ ".tscript"; + %scriptFile = %fileName; } %asset = new GUIAsset() From 938e4930ae1f49cb47f8b27d5bbe4d44637263b8 Mon Sep 17 00:00:00 2001 From: JeffR Date: Tue, 22 Feb 2022 23:28:28 -0600 Subject: [PATCH 4/6] Git didn't properly actually commit new files. --- .../gui/controls/guiGameSettingsCtrl.cpp | 1121 +++++++++++++++++ .../source/gui/controls/guiGameSettingsCtrl.h | 313 +++++ .../game/data/UI/guis/NetGraphGui.asset.taml | 4 + .../game/data/UI/images/Torque_3D_logo.png | Bin 0 -> 9063 bytes .../data/UI/images/Torque_3D_logo_alt.png | Bin 0 -> 11616 bytes .../UI/images/Torque_3D_logo_shortcut.png | Bin 0 -> 10728 bytes .../game/data/UI/images/Torque_3D_logo_w.png | Bin 0 -> 19328 bytes .../game/data/UI/images/backgrounddark.png | Bin 0 -> 5751 bytes .../UI/images/backgrounddark_image.asset.taml | 3 + .../game/data/UI/images/clearbtn_d.png | Bin 0 -> 593 bytes .../UI/images/clearbtn_d_image.asset.taml | 3 + .../game/data/UI/images/clearbtn_h.png | Bin 0 -> 595 bytes .../UI/images/clearbtn_h_image.asset.taml | 3 + .../game/data/UI/images/clearbtn_n.png | Bin 0 -> 377 bytes .../UI/images/clearbtn_n_image.asset.taml | 3 + .../game/data/UI/images/collapsetoolbar_d.png | Bin 0 -> 280 bytes .../images/collapsetoolbar_d_image.asset.taml | 3 + .../game/data/UI/images/collapsetoolbar_h.png | Bin 0 -> 468 bytes .../images/collapsetoolbar_h_image.asset.taml | 3 + .../game/data/UI/images/collapsetoolbar_n.png | Bin 0 -> 439 bytes .../images/collapsetoolbar_n_image.asset.taml | 3 + .../data/UI/images/dropdownbuttonarrow.png | Bin 0 -> 132 bytes .../dropdownbuttonarrow_image.asset.taml | 3 + .../game/data/UI/images/dropdowntextEdit.png | Bin 0 -> 390 bytes .../images/dropdowntextEdit_image.asset.taml | 3 + .../game/data/UI/images/expandtoolbar_d.png | Bin 0 -> 278 bytes .../images/expandtoolbar_d_image.asset.taml | 3 + .../game/data/UI/images/expandtoolbar_h.png | Bin 0 -> 468 bytes .../images/expandtoolbar_h_image.asset.taml | 3 + .../game/data/UI/images/expandtoolbar_n.png | Bin 0 -> 437 bytes .../images/expandtoolbar_n_image.asset.taml | 3 + .../game/data/UI/images/groupborder.png | Bin 0 -> 1273 bytes .../UI/images/groupborder_image.asset.taml | 3 + .../game/data/UI/images/inactiveoverlay.png | Bin 0 -> 131 bytes .../images/inactiveoverlay_image.asset.taml | 3 + .../game/data/UI/images/menubutton.png | Bin 0 -> 3559 bytes .../UI/images/menubutton_image.asset.taml | 3 + .../game/data/UI/images/nextOption_n.png | Bin 0 -> 8517 bytes .../UI/images/nextOption_n_image.asset.taml | 8 + .../game/data/UI/images/nextbutton_d.png | Bin 0 -> 279 bytes .../UI/images/nextbutton_d_image.asset.taml | 3 + .../game/data/UI/images/nextbutton_h.png | Bin 0 -> 549 bytes .../UI/images/nextbutton_h_image.asset.taml | 3 + .../game/data/UI/images/nextbutton_n.png | Bin 0 -> 484 bytes .../UI/images/nextbutton_n_image.asset.taml | 3 + .../game/data/UI/images/nopreview.png | Bin 0 -> 34615 bytes .../data/UI/images/nopreview_image.asset.taml | 3 + .../game/data/UI/images/previousOption_n.png | Bin 0 -> 8194 bytes .../images/previousOption_n_image.asset.taml | 8 + .../game/data/UI/images/previousbutton_d.png | Bin 0 -> 290 bytes .../images/previousbutton_d_image.asset.taml | 3 + .../game/data/UI/images/previousbutton_h.png | Bin 0 -> 561 bytes .../images/previousbutton_h_image.asset.taml | 3 + .../game/data/UI/images/previousbutton_n.png | Bin 0 -> 494 bytes .../images/previousbutton_n_image.asset.taml | 3 + .../game/data/UI/images/selectorbutton.png | Bin 0 -> 4002 bytes .../UI/images/selectorbutton_image.asset.taml | 3 + .../data/UI/images/selectorbuttonblank.png | Bin 0 -> 744 bytes .../selectorbuttonblank_image.asset.taml | 3 + .../data/UI/images/selectorbuttondark.png | Bin 0 -> 1942 bytes .../selectorbuttondark_image.asset.taml | 3 + .../UI/images/selectorbuttonhighlightonly.png | Bin 0 -> 1613 bytes ...lectorbuttonhighlightonly_image.asset.taml | 3 + .../game/data/UI/images/separatorh.png | Bin 0 -> 117 bytes .../UI/images/separatorh_image.asset.taml | 3 + .../game/data/UI/images/separatorv.png | Bin 0 -> 118 bytes .../UI/images/separatorv_image.asset.taml | 3 + .../game/data/UI/images/sliderwbox.png | Bin 0 -> 982 bytes .../UI/images/sliderwbox_image.asset.taml | 3 + .../game/data/UI/images/tabborder.png | Bin 0 -> 1203 bytes .../data/UI/images/tabborder_image.asset.taml | 3 + .../data/UI/scripts/menuInputHandling.tscript | 510 ++++++++ 72 files changed, 2054 insertions(+) create mode 100644 Engine/source/gui/controls/guiGameSettingsCtrl.cpp create mode 100644 Engine/source/gui/controls/guiGameSettingsCtrl.h create mode 100644 Templates/BaseGame/game/data/UI/guis/NetGraphGui.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/Torque_3D_logo.png create mode 100644 Templates/BaseGame/game/data/UI/images/Torque_3D_logo_alt.png create mode 100644 Templates/BaseGame/game/data/UI/images/Torque_3D_logo_shortcut.png create mode 100644 Templates/BaseGame/game/data/UI/images/Torque_3D_logo_w.png create mode 100644 Templates/BaseGame/game/data/UI/images/backgrounddark.png create mode 100644 Templates/BaseGame/game/data/UI/images/backgrounddark_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/clearbtn_d.png create mode 100644 Templates/BaseGame/game/data/UI/images/clearbtn_d_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/clearbtn_h.png create mode 100644 Templates/BaseGame/game/data/UI/images/clearbtn_h_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/clearbtn_n.png create mode 100644 Templates/BaseGame/game/data/UI/images/clearbtn_n_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/collapsetoolbar_d.png create mode 100644 Templates/BaseGame/game/data/UI/images/collapsetoolbar_d_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/collapsetoolbar_h.png create mode 100644 Templates/BaseGame/game/data/UI/images/collapsetoolbar_h_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/collapsetoolbar_n.png create mode 100644 Templates/BaseGame/game/data/UI/images/collapsetoolbar_n_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/dropdownbuttonarrow.png create mode 100644 Templates/BaseGame/game/data/UI/images/dropdownbuttonarrow_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/dropdowntextEdit.png create mode 100644 Templates/BaseGame/game/data/UI/images/dropdowntextEdit_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/expandtoolbar_d.png create mode 100644 Templates/BaseGame/game/data/UI/images/expandtoolbar_d_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/expandtoolbar_h.png create mode 100644 Templates/BaseGame/game/data/UI/images/expandtoolbar_h_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/expandtoolbar_n.png create mode 100644 Templates/BaseGame/game/data/UI/images/expandtoolbar_n_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/groupborder.png create mode 100644 Templates/BaseGame/game/data/UI/images/groupborder_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/inactiveoverlay.png create mode 100644 Templates/BaseGame/game/data/UI/images/inactiveoverlay_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/menubutton.png create mode 100644 Templates/BaseGame/game/data/UI/images/menubutton_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/nextOption_n.png create mode 100644 Templates/BaseGame/game/data/UI/images/nextOption_n_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/nextbutton_d.png create mode 100644 Templates/BaseGame/game/data/UI/images/nextbutton_d_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/nextbutton_h.png create mode 100644 Templates/BaseGame/game/data/UI/images/nextbutton_h_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/nextbutton_n.png create mode 100644 Templates/BaseGame/game/data/UI/images/nextbutton_n_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/nopreview.png create mode 100644 Templates/BaseGame/game/data/UI/images/nopreview_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/previousOption_n.png create mode 100644 Templates/BaseGame/game/data/UI/images/previousOption_n_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/previousbutton_d.png create mode 100644 Templates/BaseGame/game/data/UI/images/previousbutton_d_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/previousbutton_h.png create mode 100644 Templates/BaseGame/game/data/UI/images/previousbutton_h_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/previousbutton_n.png create mode 100644 Templates/BaseGame/game/data/UI/images/previousbutton_n_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/selectorbutton.png create mode 100644 Templates/BaseGame/game/data/UI/images/selectorbutton_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/selectorbuttonblank.png create mode 100644 Templates/BaseGame/game/data/UI/images/selectorbuttonblank_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/selectorbuttondark.png create mode 100644 Templates/BaseGame/game/data/UI/images/selectorbuttondark_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/selectorbuttonhighlightonly.png create mode 100644 Templates/BaseGame/game/data/UI/images/selectorbuttonhighlightonly_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/separatorh.png create mode 100644 Templates/BaseGame/game/data/UI/images/separatorh_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/separatorv.png create mode 100644 Templates/BaseGame/game/data/UI/images/separatorv_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/sliderwbox.png create mode 100644 Templates/BaseGame/game/data/UI/images/sliderwbox_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/images/tabborder.png create mode 100644 Templates/BaseGame/game/data/UI/images/tabborder_image.asset.taml create mode 100644 Templates/BaseGame/game/data/UI/scripts/menuInputHandling.tscript diff --git a/Engine/source/gui/controls/guiGameSettingsCtrl.cpp b/Engine/source/gui/controls/guiGameSettingsCtrl.cpp new file mode 100644 index 000000000..1b6516e4a --- /dev/null +++ b/Engine/source/gui/controls/guiGameSettingsCtrl.cpp @@ -0,0 +1,1121 @@ +//----------------------------------------------------------------------------- +// 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. +//----------------------------------------------------------------------------- + +#include "guiGameSettingsCtrl.h" + +#include "console/consoleTypes.h" +#include "console/engineAPI.h" +#include "gfx/gfxDrawUtil.h" +#include "gui/containers/guiScrollCtrl.h" +#include "core/strings/stringUnit.h" +#include "gui/core/guiDefaultControlRender.h" + +//----------------------------------------------------------------------------- +// GuiGameSettingsCtrl +//----------------------------------------------------------------------------- + +GuiGameSettingsCtrl::GuiGameSettingsCtrl() : + mLabel(StringTable->EmptyString()), + mScriptCallback(StringTable->EmptyString()), + mTooltip(StringTable->EmptyString()), + mEnabled(true), + mSelected(false), + mSelectedOption(0), + mWrapOptions(false), + mMode(Mode::Default), + mValue(0), + mStepSize(1), + mRange(Point2F(0, 1)), + mCallbackOnInputs(false), + mConsumeKeyInputEvents(false), + mArrowSize(30), + mColumnSplit(250), + mRightPad(20) +{ + VECTOR_SET_ASSOCIATION(mOptions); + + // initialize the control callbacks + mCallbackOnA = StringTable->EmptyString(); + mCallbackOnB = mCallbackOnA; + mCallbackOnX = mCallbackOnA; + mCallbackOnY = mCallbackOnA; + + INIT_ASSET(KeybindBitmap); + INIT_ASSET(PreviousBitmap); + INIT_ASSET(NextBitmap); +} + +GuiGameSettingsCtrl::~GuiGameSettingsCtrl() +{ + mOptions.clear(); +} + +void GuiGameSettingsCtrl::onMouseMove(const GuiEvent& event) +{ + //check if we're inside an arrow/slider/etc and kick a highlight action + Parent::onMouseMove(event); +} + +void GuiGameSettingsCtrl::onMouseUp(const GuiEvent& event) +{ + Parent::onMouseUp(event); + + if (isEnabled()) + { + if (mMode == Mode::Default) + { + activate(); + } + else if (mMode == Mode::OptionList) + { + S32 xPos = globalToLocalCoord(event.mousePoint).x; + clickOption(xPos); + } + else if (mMode == Mode::Slider) + { + S32 xPos = globalToLocalCoord(event.mousePoint).x; + clickSlider(xPos); + } + else if (mMode == Mode::Keybind) + { + S32 xPos = globalToLocalCoord(event.mousePoint).x; + clickKeybind(xPos); + } + } +} + +void GuiGameSettingsCtrl::onRender(Point2I offset, const RectI &updateRect) +{ + GFXDrawUtil* drawUtil = GFX->getDrawUtil(); + + F32 xScale = (float) getWidth(); + + S32 height = getHeight(); + + Point2I currentOffset = offset; + Point2I extent = getExtent(); + Point2I textOffset(mProfile->mTextOffset.x * xScale, mProfile->mTextOffset.y); + Point2I textExtent(mColumnSplit, height); + Point2I iconExtent, iconOffset(0.0f, 0.0f); + + bool highlight = mHighlighted; + bool depressed = mDepressed; + + ColorI fontColor = mActive ? (highlight ? mProfile->mFontColorHL : mProfile->mFontColor) : mProfile->mFontColorNA; + ColorI fillColor = mActive ? (highlight ? mProfile->mFillColorHL : mProfile->mFillColor) : mProfile->mFillColorNA; + ColorI borderColor = mActive ? (highlight ? mProfile->mBorderColorHL : mProfile->mBorderColor) : mProfile->mBorderColorNA; + + RectI boundsRect(offset, getExtent()); + + if (!mHasTheme) + { + if (mProfile->mBorder != 0) + renderFilledBorder(boundsRect, borderColor, fillColor, mProfile->mBorderThickness); + else + GFX->getDrawUtil()->drawRectFill(boundsRect, fillColor); + } + else + { + S32 indexMultiplier = 1; + + if (!mActive) + indexMultiplier = 4; + else if (mDepressed || mStateOn) + indexMultiplier = 2; + else if (mHighlighted) + indexMultiplier = 3; + + renderSizableBitmapBordersFilled(boundsRect, indexMultiplier, mProfile); + } + + // render the text + drawUtil->setBitmapModulation(fontColor); + renderJustifiedText(currentOffset + textOffset, textExtent, mLabel); + + if (mMode == Mode::OptionList) + { + onRenderListOption(currentOffset); + } + else if (mMode == Mode::Slider) + { + onRenderSliderOption(currentOffset); + } + else if (mMode == Mode::Keybind) + { + onRenderKeybindOption(currentOffset); + } + + renderChildControls(offset, updateRect); +} + +void GuiGameSettingsCtrl::onRenderListOption(Point2I currentOffset) +{ + F32 xScale = (float)getWidth(); + + S32 height = getHeight(); + + GFXDrawUtil* drawer = GFX->getDrawUtil(); + + Point2I arrowOffset; + + S32 arrowOffsetY = 0; + + bool hasOptions = (mOptions.size() > 0) && mSelectedOption > -1; + if (hasOptions) + { + if (mPreviousBitmapAsset.notNull()) + { + // render the left arrow + bool arrowOnL = (isSelected() || isHighlighted()) && (mWrapOptions || (mSelectedOption > 0)); + arrowOffset.x = currentOffset.x + mColumnSplit; + arrowOffset.y = currentOffset.y + arrowOffsetY; + + drawer->clearBitmapModulation(); + drawer->drawBitmapStretch(mPreviousBitmap, RectI(arrowOffset, Point2I(mArrowSize, mArrowSize)), GFXBitmapFlip_None, GFXTextureFilterLinear, false); + } + else + { + // render the left arrow + bool arrowOnL = (isSelected() || isHighlighted()) && (mWrapOptions || (mSelectedOption > 0)); + arrowOffset.x = currentOffset.x + mColumnSplit; + arrowOffset.y = currentOffset.y + height/2; + + drawer->clearBitmapModulation(); + + drawer->drawLine(arrowOffset, Point2I(arrowOffset.x + mArrowSize, currentOffset.y), ColorI::WHITE); + drawer->drawLine(arrowOffset, Point2I(arrowOffset.x + mArrowSize, currentOffset.y + height), ColorI::WHITE); + } + + if (mNextBitmapAsset.notNull()) + { + // render the right arrow + bool arrowOnR = (isSelected() || isHighlighted()) && (mWrapOptions || (mSelectedOption < mOptions.size() - 1)); + arrowOffset.x = currentOffset.x + getWidth() - mRightPad - mArrowSize; + arrowOffset.y = currentOffset.y + arrowOffsetY; + + drawer->clearBitmapModulation(); + drawer->drawBitmapStretch(mNextBitmap, RectI(arrowOffset, Point2I(mArrowSize, mArrowSize)), GFXBitmapFlip_None, GFXTextureFilterLinear, false); + } + else + { + // render the left arrow + bool arrowOnL = (isSelected() || isHighlighted()) && (mWrapOptions || (mSelectedOption > 0)); + arrowOffset.x = currentOffset.x + getWidth() - mRightPad; + arrowOffset.y = currentOffset.y + height / 2; + + drawer->clearBitmapModulation(); + + drawer->drawLine(arrowOffset, Point2I(arrowOffset.x - mArrowSize, currentOffset.y), ColorI::WHITE); + drawer->drawLine(arrowOffset, Point2I(arrowOffset.x - mArrowSize, currentOffset.y + height), ColorI::WHITE); + } + + // get the appropriate font color + ColorI fontColor; + if (!mEnabled) + { + fontColor = mProfile->mFontColorNA; + } + else if (isSelected()) + { + fontColor = mProfile->mFontColorSEL; + } + else if (isHighlighted()) + { + fontColor = mProfile->mFontColorHL; + } + else + { + fontColor = mProfile->mFontColor; + } + + // calculate text to be at the center between the arrows + GFont* font = mProfile->mFont; + StringTableEntry text = mOptions[mSelectedOption].mDisplayText; + S32 textWidth = font->getStrWidth(text); + S32 columnWidth = xScale - mRightPad - mColumnSplit; + S32 columnCenter = mColumnSplit + (columnWidth >> 1); + S32 textStartX = columnCenter - (textWidth >> 1); + Point2I textOffset(textStartX, 0); + + // render the option text itself + Point2I textExtent(columnWidth, height); + drawer->setBitmapModulation(fontColor); + renderJustifiedText(currentOffset + Point2I(mColumnSplit, 0), textExtent, text); + } +} + +void GuiGameSettingsCtrl::onRenderSliderOption(Point2I currentOffset) +{ + F32 xScale = (float)getWidth(); + + S32 height = getHeight(); + + S32 arrowOffsetY = 0; + + GFXDrawUtil* drawer = GFX->getDrawUtil(); + + Point2I arrowOffset; + S32 columnSplit = mColumnSplit; + + + + /*if (mPreviousBitmapAsset.notNull()) + { + // render the left arrow + bool arrowOnL = (isSelected() || isHighlighted()) && (mWrapOptions || (mSelectedOption > 0)); + arrowOffset.x = currentOffset.x + columnSplit; + arrowOffset.y = currentOffset.y + arrowOffsetY; + + drawer->clearBitmapModulation(); + drawer->drawBitmapStretch(mPreviousBitmap, RectI(arrowOffset, Point2I(mArrowSize, mArrowSize)), GFXBitmapFlip_None, GFXTextureFilterLinear, false); + } + else + { + // render the left arrow + bool arrowOnL = (isSelected() || isHighlighted()) && (mWrapOptions || (mSelectedOption > 0)); + arrowOffset.x = currentOffset.x + mColumnSplit; + arrowOffset.y = currentOffset.y + height / 2; + + drawer->clearBitmapModulation(); + + drawer->drawLine(arrowOffset, Point2I(arrowOffset.x + mArrowSize, currentOffset.y), ColorI::WHITE); + drawer->drawLine(arrowOffset, Point2I(arrowOffset.x + mArrowSize, currentOffset.y + height), ColorI::WHITE); + } + + if (mNextBitmapAsset.notNull()) + { + // render the right arrow + bool arrowOnR = (isSelected() || isHighlighted()) && (mWrapOptions || (mSelectedOption < mOptions.size() - 1)); + arrowOffset.x = currentOffset.x + mRightPad * xScale - mArrowSize; + arrowOffset.y = currentOffset.y + arrowOffsetY; + + drawer->clearBitmapModulation(); + drawer->drawBitmapStretch(mNextBitmap, RectI(arrowOffset, Point2I(mArrowSize, mArrowSize)), GFXBitmapFlip_None, GFXTextureFilterLinear, false); + } + else + { + // render the left arrow + bool arrowOnL = (isSelected() || isHighlighted()) && (mWrapOptions || (mSelectedOption > 0)); + arrowOffset.x = currentOffset.x + getWidth() - mRightPad; + arrowOffset.y = currentOffset.y + height / 2; + + drawer->clearBitmapModulation(); + + drawer->drawLine(arrowOffset, Point2I(arrowOffset.x - mArrowSize, currentOffset.y), ColorI::WHITE); + drawer->drawLine(arrowOffset, Point2I(arrowOffset.x - mArrowSize, currentOffset.y + height), ColorI::WHITE); + }*/ + + //Draw the slider bar + + RectI sliderRect; + + S32 sliderOffset = 5; + + RectI optionRect; + + sliderRect.point.x = currentOffset.x + columnSplit + mArrowSize; + sliderRect.point.y = currentOffset.y + sliderOffset; + + sliderRect.extent.x = (currentOffset.x + getWidth() - mRightPad - mArrowSize) - sliderRect.point.x; + sliderRect.extent.y = height - sliderOffset*2; + + optionRect = sliderRect; + + S32 textWidth = sliderRect.extent.x * 0.3; + sliderRect.extent.x -= textWidth; + + //Now adjust the bar to match-to our value + + S32 barStart = sliderRect.point.x; + S32 barEnd = sliderRect.point.x + sliderRect.extent.x; + + S32 xPosFill = (((mValue - mRange.x) * (barEnd - barStart)) / (mRange.y - mRange.x)) + barStart; + + RectI fillRect = sliderRect; + fillRect.extent.x = xPosFill - sliderRect.point.x; + + ColorI barColor; + ColorI barOutlineColor; + if (isSelected()) + { + barColor = mProfile->mFontColor; + barOutlineColor = mProfile->mFontColorSEL; + } + else + { + barColor = mProfile->mFontColor; + barOutlineColor = mProfile->mFontColorHL; + } + + drawer->drawRectFill(fillRect, barColor); + + drawer->drawRect(sliderRect, barOutlineColor); + + // get the appropriate font color + ColorI fontColor; + if (!mEnabled) + { + fontColor = mProfile->mFontColorNA; + } + else if (isSelected()) + { + fontColor = mProfile->mFontColorSEL; + } + else if (isHighlighted()) + { + fontColor = mProfile->mFontColorHL; + } + else + { + fontColor = mProfile->mFontColor; + } + + // calculate text to be at the center between the arrows + GFont* font = mProfile->mFont; + + char stringVal[32]; + dSprintf(stringVal, 32, "%f", mValue); + + S32 stringWidth = font->getStrWidth(stringVal); + Point2I textOffset(sliderRect.point.x + sliderRect.extent.x, 0); + + // render the option text itself + Point2I textExtent(textWidth, height); + + RectI textRect = optionRect; + textRect.point.x = sliderRect.point.x + sliderRect.extent.x; + textRect.extent.x = optionRect.extent.x * 0.3; + + drawer->setBitmapModulation(fontColor); + renderJustifiedText(textRect.point, textRect.extent, stringVal); + + //drawer->drawRectFill(textRect, ColorI::RED); +} + +void GuiGameSettingsCtrl::onRenderKeybindOption(Point2I currentOffset) +{ + F32 xScale = (float)getWidth(); + S32 columnSplit = mColumnSplit; + + S32 height = getHeight(); + + GFXDrawUtil* drawer = GFX->getDrawUtil(); + //drawer->drawBitmap(mBitmap, ) + + Point2I button; + button.x = currentOffset.x + columnSplit + (columnSplit / 2.5)/* + (optionWidth / 2)*/; + button.y = currentOffset.y; + + Point2I buttonSize; + buttonSize.x = height; + buttonSize.y = height; + + if (mKeybindBitmapAsset.notNull()) + { + RectI rect(button, buttonSize); + drawer->clearBitmapModulation(); + drawer->drawBitmapStretch(mKeybindBitmap, rect, GFXBitmapFlip_None, GFXTextureFilterLinear, false); + } + + //drawer->drawRectFill(button, ColorI::BLUE); +} + +void GuiGameSettingsCtrl::set(const char* label, const char* callback, bool useHighlightIcon, bool enabled, S32 mode, const char* tooltip) +{ + mScriptCallback = (dStrlen(callback) > 0) ? StringTable->insert(callback, true) : NULL; + mEnabled = enabled; + mMode = (Mode)mode; + mTooltip = StringTable->insert(tooltip); + mLabel = StringTable->insert(label, true); +} + +void GuiGameSettingsCtrl::setListSetting(const char* label, const char* optionsList, bool wrapOptions, const char* callback, bool enabled, const char* tooltip, const char* defaultValue) +{ + static StringTableEntry DELIM = StringTable->insert("\t", true); + + Vector options(__FILE__, __LINE__); + + S32 defaultOption = 0; + + S32 count = StringUnit::getUnitCount(optionsList, DELIM); + for (S32 i = 0; i < count; ++i) + { + OptionEntry e; + const char* option = StringUnit::getUnit(optionsList, i, DELIM); + e.mDisplayText = StringTable->insert(option, true); + e.mKeyString = e.mDisplayText; + options.push_back(e); + + if (String::compare(option, defaultValue) == 0) + defaultOption = options.size() - 1; + } + mOptions = options; + bool hasOptions = mOptions.size() > 0; + mSelectedOption = (hasOptions) ? defaultOption : NO_OPTION; + mWrapOptions = wrapOptions; + set(label, callback, true, (hasOptions) ? enabled : false, Mode::OptionList, tooltip); +} + +void GuiGameSettingsCtrl::setSliderSetting(const char* label, F32 defaultValue, F32 increments, Point2F range, const char* callback, bool enabled, const char* tooltip) +{ + static StringTableEntry DELIM = StringTable->insert("\t", true); + + mValue = defaultValue; + mStepSize = increments; + mRange = range; + + set(label, callback, true, enabled, Mode::Slider, tooltip); +} + +void GuiGameSettingsCtrl::setKeybindSetting(const char* label, const char* bitmapName, const char* callback, bool enabled, const char* tooltip) +{ + static StringTableEntry DELIM = StringTable->insert("\t", true); + + _setKeybindBitmap(StringTable->insert(bitmapName)); + + //if(mBitmap != StringTable->EmptyString()) + // mBitmapTex.set(mBitmap, &GFXDefaultGUIProfile, avar("%s() - mTextureObject (line %d)", __FUNCTION__, __LINE__)); + + set(label, callback, true, enabled, Mode::Keybind, tooltip); +} + +bool GuiGameSettingsCtrl::onAdd() +{ + if( !Parent::onAdd() ) + return false; + + return true; +} + +bool GuiGameSettingsCtrl::onWake() +{ + if( !Parent::onWake() ) + return false; + + return true; +} +void GuiGameSettingsCtrl::activate() +{ + if(isSelected() && isEnabled() && (mScriptCallback != StringTable->EmptyString())) + { + setThisControl(); + if (Con::isFunction(mScriptCallback)) + { + Con::executef(mScriptCallback); + } + } +} + +void GuiGameSettingsCtrl::setSelected() +{ + if (!isEnabled()) + return; + + mSelected = true; +} + +bool GuiGameSettingsCtrl::isEnabled() const +{ + return mEnabled; +} + +void GuiGameSettingsCtrl::setEnabled(bool enabled) +{ + mEnabled = enabled; +} + +void GuiGameSettingsCtrl::doScriptCommand(StringTableEntry command) +{ + if (command && command[0]) + { + setThisControl(); + Con::evaluate(command, false, __FILE__); + } +} + +void GuiGameSettingsCtrl::setThisControl() +{ + smThisControl = this; +} + +StringTableEntry GuiGameSettingsCtrl::getLabel() const +{ + return mLabel; +} + +void GuiGameSettingsCtrl::setLabel( const char * label) +{ + mLabel = StringTable->insert(label, true); +} + +void GuiGameSettingsCtrl::clear() +{ + mOptions.clear(); +} + +//----------------------------------------------------------------------------- +// Console stuff (GuiGameSettingsCtrl) +//----------------------------------------------------------------------------- + +StringTableEntry GuiGameSettingsCtrl::getCurrentOption() const +{ + if (mSelectedOption != NO_OPTION && !mOptions.empty()) + { + return mOptions[mSelectedOption].mDisplayText; + } + + return StringTable->insert("", false); +} + +StringTableEntry GuiGameSettingsCtrl::getCurrentOptionKey() const +{ + if (mSelectedOption != NO_OPTION) + { + return mOptions[mSelectedOption].mKeyString; + } + + return StringTable->insert("", false); +} + +S32 GuiGameSettingsCtrl::getCurrentOptionIndex() const +{ + if (mSelectedOption != NO_OPTION) + { + return mSelectedOption; + } + + return S32(-1); +} + +bool GuiGameSettingsCtrl::selectOption(const char* theOption) +{ + for (Vector::iterator anOption = mOptions.begin(); anOption < mOptions.end(); ++anOption) + { + if (String::compare((*anOption).mDisplayText, theOption) == 0) + { + S32 newIndex = anOption - mOptions.begin(); + mSelectedOption = newIndex; + return true; + } + } + + return false; +} + +bool GuiGameSettingsCtrl::selectOptionByKey(const char* optionKey) +{ + for (Vector::iterator anOption = mOptions.begin(); anOption < mOptions.end(); ++anOption) + { + if (String::compare((*anOption).mKeyString, optionKey) == 0) + { + S32 newIndex = anOption - mOptions.begin(); + mSelectedOption = newIndex; + return true; + } + } + + return false; +} + +bool GuiGameSettingsCtrl::selectOptionByIndex(S32 optionIndex) +{ + if (optionIndex < mOptions.size() && optionIndex >= 0) + { + mSelectedOption = optionIndex; + return true; + } + + return false; +} + +void GuiGameSettingsCtrl::setOptions(const char* optionsList) +{ + static StringTableEntry DELIM = StringTable->insert("\t", true); + + S32 count = StringUnit::getUnitCount(optionsList, DELIM); + mOptions.setSize(count); + for (S32 i = 0; i < count; ++i) + { + const char* option = StringUnit::getUnit(optionsList, i, DELIM); + OptionEntry e; + e.mDisplayText = StringTable->insert(option, true); + e.mKeyString = e.mDisplayText; + mOptions[i] = e; + } + + if (mSelectedOption >= mOptions.size()) + { + mSelectedOption = mOptions.size() - 1; + } +} + +void GuiGameSettingsCtrl::addOption(const char* displayText, const char* keyText) +{ + OptionEntry e; + e.mDisplayText = StringTable->insert(displayText, true); + e.mKeyString = (keyText[0] == '\0') ? e.mDisplayText : StringTable->insert(keyText, true); + + mOptions.push_back(e); +} + +void GuiGameSettingsCtrl::clickOption(S32 xPos) +{ + F32 xScale = (float)getWidth(); + + S32 leftArrowX1 = mColumnSplit; + S32 leftArrowX2 = leftArrowX1 + mArrowSize; + + S32 rightArrowX2 = getWidth() - mRightPad; + S32 rightArrowX1 = rightArrowX2 - mArrowSize; + + if ((leftArrowX1 <= xPos) && (xPos <= leftArrowX2)) + { + changeOption(-1); + } + else if ((rightArrowX1 <= xPos) && (xPos <= rightArrowX2)) + { + changeOption(1); + } +} + +void GuiGameSettingsCtrl::changeOption(S32 delta) +{ + S32 optionCount = mOptions.size(); + + S32 newSelection = mSelectedOption + delta; + if (optionCount == 0) + { + newSelection = NO_OPTION; + } + else if (!mWrapOptions) + { + newSelection = mClamp(newSelection, 0, optionCount - 1); + } + else if (newSelection < 0) + { + newSelection = optionCount - 1; + } + else if (newSelection >= optionCount) + { + newSelection = 0; + } + mSelectedOption = newSelection; + + if (mMode == GuiGameSettingsCtrl::Slider) + { + mValue += mStepSize * delta; + + mValue = mRound(mValue / mStepSize) * mStepSize; + + if (mValue < mRange.x) + mValue = mRange.x; + if (mValue > mRange.y) + mValue = mRange.y; + } + + static StringTableEntry LEFT = StringTable->insert("LEFT", true); + static StringTableEntry RIGHT = StringTable->insert("RIGHT", true); + + onChange_callback(); + + if (mScriptCallback != NULL && (mSelectedOption != NO_OPTION && mMode != GuiGameSettingsCtrl::Slider)) + { + setThisControl(); + StringTableEntry direction = NULL; + if (delta < 0) + { + direction = LEFT; + } + else if (delta > 0) + { + direction = RIGHT; + } + if ((direction != NULL) && (Con::isFunction(mScriptCallback))) + { + Con::executef(mScriptCallback, direction); + } + } +} +IMPLEMENT_CONOBJECT(GuiGameSettingsCtrl); + +void GuiGameSettingsCtrl::clickSlider(S32 xPos) +{ + F32 xScale = (float)getWidth(); + + S32 leftArrowX1 = mColumnSplit; + S32 leftArrowX2 = leftArrowX1 + mArrowSize; + + S32 rightArrowX2 = getWidth() - mRightPad; + S32 rightArrowX1 = rightArrowX2 - mArrowSize; + + S32 sliderWidth = rightArrowX1 - leftArrowX2; + sliderWidth *= 0.6; //remove the number text spacing + + /*if ((leftArrowX1 <= xPos) && (xPos <= leftArrowX2)) + { + mValue -= mStepSize; + + mValue = mRound(mValue / mStepSize) * mStepSize; + + if (mValue < mRange.x) + mValue = mRange.x; + + } + else if ((rightArrowX1 <= xPos) && (xPos <= rightArrowX2)) + { + //F32 snap = mValue % mStepSize; + //mValue.y -= snap; + + mValue += mStepSize; + + mValue = mRound(mValue / mStepSize) * mStepSize; + + if (mValue > mRange.y) + mValue = mRange.y; + } + else + {*/ + //see if we clicked on the sliderbar itself + S32 barStart = leftArrowX2; + S32 barEnd = barStart + sliderWidth; + + if (xPos >= barStart && xPos <= barEnd) + { + //find the position + F32 newValue = (((xPos - barStart) * (mRange.y - mRange.x)) / (barEnd - barStart)) + mRange.x; + + newValue = mRound(newValue / mStepSize) * mStepSize; + + mValue = newValue; + } + //} + + onChange_callback(); +} + +void GuiGameSettingsCtrl::clickKeybind(S32 xPos) +{ + S32 columnSplit = mColumnSplit; + + S32 height = getHeight(); + + Point2I button; + button.x = columnSplit + (columnSplit / 2.5)/* + (optionWidth / 2)*/; + button.y = 0; + + Point2I buttonSize; + buttonSize.x = height; + buttonSize.y = height; + + RectI rect(button, buttonSize); + + onChange_callback(); + + if (rect.pointInRect(Point2I(xPos, getHeight()/2))) + { + if (mScriptCallback != StringTable->EmptyString()) + { + Con::executef(mScriptCallback, this); + } + } +} + +F32 GuiGameSettingsCtrl::getValue() +{ + return mValue; +} + +void GuiGameSettingsCtrl::setValue(F32 value) +{ + mValue = value; +} + +const char* GuiGameSettingsCtrl::getTooltip() +{ + return mTooltip; +} + +ConsoleDocClass( GuiGameSettingsCtrl, + "@brief A base class for cross platform menu controls that are gamepad friendly.\n\n" + + "This class is used to build row-based menu GUIs that can be easily navigated " + "using the keyboard, mouse or gamepad. The desired row can be selected using " + "the mouse, or by navigating using the Up and Down buttons.\n\n" + + "@tsexample\n\n" + "new GuiGameSettingsCtrl()\n" + "{\n" + " debugRender = \"0\";\n" + " callbackOnA = \"applyOptions();\";\n" + " callbackOnB = \"Canvas.setContent(MainMenuGui);\";\n" + " callbackOnX = \"\";\n" + " callbackOnY = \"revertOptions();\";\n" + " //Properties not specific to this control have been omitted from this example.\n" + "};\n" + "@endtsexample\n\n" + + "@see GuiGameSettingsProfile\n\n" + + "@ingroup GuiGame" +); + +IMPLEMENT_CALLBACK( GuiGameSettingsCtrl, onChange, void, (), (), + "Called when the setting's value changes." ); + +IMPLEMENT_CALLBACK(GuiGameSettingsCtrl, onInputEvent, void, (const char* device, const char* action, bool state), + (device, action, state), + "@brief Callback that occurs when an input is triggered on this control\n\n" + "@param device The device type triggering the input, such as keyboard, mouse, etc\n" + "@param action The actual event occuring, such as a key or button\n" + "@param state True if the action is being pressed, false if it is being release\n\n"); + +IMPLEMENT_CALLBACK(GuiGameSettingsCtrl, onAxisEvent, void, (const char* device, const char* action, F32 axisValue), + (device, action, axisValue), + "@brief Callback that occurs when an axis event is triggered on this control\n\n" + "@param device The device type triggering the input, such as mouse, joystick, gamepad, etc\n" + "@param action The ActionMap code for the axis\n" + "@param axisValue The current value of the axis\n\n"); + +void GuiGameSettingsCtrl::initPersistFields() +{ + INITPERSISTFIELD_IMAGEASSET(KeybindBitmap, GuiGameSettingsCtrl, "Bitmap used to display the bound key for this keybind option."); + INITPERSISTFIELD_IMAGEASSET(PreviousBitmap, GuiGameSettingsCtrl, "Bitmap used for the previous button when in list mode."); + INITPERSISTFIELD_IMAGEASSET(NextBitmap, GuiGameSettingsCtrl, "Bitmap used for the next button when in list mode."); + + addField("arrowSize", TypeS32, Offset(mArrowSize, GuiGameSettingsCtrl), + "Size of the arrow buttons' extents"); + + addField("columnSplit", TypeS32, Offset(mColumnSplit, GuiGameSettingsCtrl), + "Position of the split between the leftside label and the rightside setting parts"); + + addField("rightPad", TypeS32, Offset(mRightPad, GuiGameSettingsCtrl), + "Padding between the rightmost edge of the control and right arrow."); + + addField("callbackOnA", TypeString, Offset(mCallbackOnA, GuiGameSettingsCtrl), + "Script callback when the 'A' button is pressed. 'A' inputs are Keyboard: A, Return, Space; Gamepad: A, Start" ); + + addField("callbackOnB", TypeString, Offset(mCallbackOnB, GuiGameSettingsCtrl), + "Script callback when the 'B' button is pressed. 'B' inputs are Keyboard: B, Esc, Backspace, Delete; Gamepad: B, Back" ); + + addField("callbackOnX", TypeString, Offset(mCallbackOnX, GuiGameSettingsCtrl), + "Script callback when the 'X' button is pressed. 'X' inputs are Keyboard: X; Gamepad: X" ); + + addField("callbackOnY", TypeString, Offset(mCallbackOnY, GuiGameSettingsCtrl), + "Script callback when the 'Y' button is pressed. 'Y' inputs are Keyboard: Y; Gamepad: Y" ); + + addField("callbackOnInputs", TypeBool, Offset(mCallbackOnInputs, GuiGameSettingsCtrl), + "Script callback when any inputs are detected, even if they aren't the regular 4 face buttons. Useful for secondary/speciality handling of menu navigation."); + + addField("consumeKeyInputEvents", TypeBool, Offset(mConsumeKeyInputEvents, GuiGameSettingsCtrl), + "When callbackOnInputs is active, this indicates if the input event should be consumed, or allowed 'through' to let other things respond to the event as well."); + + + Parent::initPersistFields(); +} + +DefineEngineMethod( GuiGameSettingsCtrl, isEnabled, bool, (),, + "Determines if the control is enabled or disabled.\n\n" + "@return True if the control is enabled. False if the control is not enabled." ) +{ + return object->isEnabled(); +} + +DefineEngineMethod( GuiGameSettingsCtrl, setEnabled, void, ( bool enabled ),, + "Sets the control's enabled status according to the given parameters.\n\n" + "@param enabled Indicate true to enable the control or false to disable it." ) +{ + object->setEnabled( enabled ); +} + +DefineEngineMethod( GuiGameSettingsCtrl, activate, void, (),, + "Activates the control. The script callback of the control will be called (if it has one)." ) +{ + object->activate(); +} + +DefineEngineMethod(GuiGameSettingsCtrl, getLabel, const char *, (),, + "Gets the label displayed.\n\n" + "@return The label." ) +{ + return object->getLabel(); +} + +DefineEngineMethod(GuiGameSettingsCtrl, setLabel, void, ( const char* label ),, + "Sets the label.\n\n" + "@param label Text to set as the label.\n" ) +{ + object->setLabel(label ); +} + +DefineEngineMethod( GuiGameSettingsCtrl, setSelected, void, (),, + "Sets the control as selected. Can only select enabled controls." ) +{ + object->setSelected(); +} + +DefineEngineMethod( GuiGameSettingsCtrl, getSelected, bool, (),, + "Gets if the control is currently selected.\n\n" + "@return if the control is selected." ) +{ + return object->isSelected(); +} + +DefineEngineMethod(GuiGameSettingsCtrl, clear, void, (), , + "Clears the current options.\n\n") +{ + return object->clear(); +} + +DefineEngineMethod(GuiGameSettingsCtrl, getMode, S32, (), , + "Gets this control's options mode.\n\n") +{ + GuiGameSettingsCtrl::Mode mode = object->getMode(); + if (mode == GuiGameSettingsCtrl::Mode::OptionList) + return 0; + else if (mode == GuiGameSettingsCtrl::Mode::Slider) + return 1; + else if (mode == GuiGameSettingsCtrl::Mode::Keybind) + return 2; + else + return -1; +} + +DefineEngineMethod(GuiGameSettingsCtrl, setListSetting, void, + (const char* label, const char* options, bool wrapOptions, const char* callback, bool enabled, const char* tooltip, const char* defaultValue), + (true, "", ""), + "Sets this setting to a list.\n\n" + "@param label The text to display as a label.\n" + "@param options A tab separated list of options.\n" + "@param wrapOptions Specify true to allow options to wrap at each end or false to prevent wrapping.\n" + "@param callback Name of a script function to use as a callback when this control is activated.\n" + "@param enabled [optional] If this control is initially enabled.") +{ + object->setListSetting(label, options, wrapOptions, callback, enabled, tooltip, defaultValue); +} + +DefineEngineMethod(GuiGameSettingsCtrl, setSliderSetting, void, +(const char* label, F32 defaultValue, F32 increment, Point2F range, const char* callback, bool enabled, const char* tooltip), +(true, ""), +"Sets this setting to a slider.\n\n" +"@param label The text to display as a label.\n" +"@param options A tab separated list of options.\n" +"@param wrapOptions Specify true to allow options to wrap at each end or false to prevent wrapping.\n" +"@param callback Name of a script function to use as a callback when this control is activated.\n" +"@param enabled [optional] If this control is initially enabled.") +{ + object->setSliderSetting(label, defaultValue, increment, range, callback, enabled, tooltip); +} + +DefineEngineMethod(GuiGameSettingsCtrl, setKeybindSetting, void, +(const char* label, const char* bitmapName, const char* callback, bool enabled, const char* tooltip), +(true, ""), +"Sets this setting to a keybind.\n\n" +"@param label The text to display as a label.\n" +"@param options A tab separated list of options.\n" +"@param wrapOptions Specify true to allow options to wrap at each end or false to prevent wrapping.\n" +"@param callback Name of a script function to use as a callback when this control is activated.\n" +"@param enabled [optional] If this control is initially enabled.") +{ + object->setKeybindSetting(label, bitmapName, callback, enabled, tooltip); +} + +DefineEngineMethod(GuiGameSettingsCtrl, getCurrentOption, const char*, (), , + "Gets the text for the currently selected option .\n\n" + "@return A string representing the text currently displayed as the selected option. If there is no such displayed text then the empty string is returned.") +{ + return object->getCurrentOption(); +} + +DefineEngineMethod(GuiGameSettingsCtrl, getCurrentOptionKey, const char*, (), , + "Gets the key string for the currently selected option.\n\n" + "@return The key (or id) that was assigned to the selected option. If there is no selected option then the empty string is returned.") +{ + return object->getCurrentOptionKey(); +} + +DefineEngineMethod(GuiGameSettingsCtrl, getCurrentOptionIndex, S32, (), , + "Gets the index into the option list for the currently selected option.\n\n" + "@return The index of the selected option. If there is no selected option then -1 is returned.") +{ + return object->getCurrentOptionIndex(); +} + +DefineEngineMethod(GuiGameSettingsCtrl, selectOption, bool, (const char* option), , + "Set the control's current option to the one specified\n\n" + "@param option The option to be made active.\n" + "@return True if the control contained the option and was set, false otherwise.") +{ + return object->selectOption(option); +} + +DefineEngineMethod(GuiGameSettingsCtrl, selectOptionByKey, bool, (const char* optionKey), , + "Set the control's current option to the one with the specified key.\n\n" + "@param optionKey The key string that was assigned to the option to be made active.\n" + "@return True if the control contained the key and the option and was set, false otherwise.") +{ + return object->selectOptionByKey(optionKey); +} + +DefineEngineMethod(GuiGameSettingsCtrl, selectOptionByIndex, bool, (S32 optionIndex), , + "Set the control's current option to the one at the specified index.\n\n" + "@param optionIndex The index of the option to be made active.\n" + "@return True if the index was valid and the option and was set, false otherwise.") +{ + return object->selectOptionByIndex(optionIndex); +} + +DefineEngineMethod(GuiGameSettingsCtrl, setOptions, void, (const char* optionsList), , + "Sets the list of options on the given control.\n\n" + "@param optionsList A tab separated list of options for the control.") +{ + object->setOptions(optionsList); +} + +DefineEngineMethod(GuiGameSettingsCtrl, addOption, void, (const char* displayText, const char* keyText), (""), + "Adds an option to the list of options on the given control.\n\n" + "@param displayText The text to display for this option.\n" + "@param keyText [Optional] The id string to associate with this value. " + "If unset, the id will be the same as the display text.\n") +{ + object->addOption(displayText, keyText); +} + +DefineEngineMethod(GuiGameSettingsCtrl, getValue, F32, (), , + "Sets the list of options on the given control.\n\n" + "@param optionsList A tab separated list of options for the control.") +{ + return object->getValue(); +} + +DefineEngineMethod(GuiGameSettingsCtrl, setValue, void, (F32 value), , + "Sets the list of options on the given control.\n\n" + "@param optionsList A tab separated list of options for the control.") +{ + object->setValue(value); +} + +DefineEngineMethod(GuiGameSettingsCtrl, getTooltip, const char*, (), , + "Sets the list of options on the given control.\n\n" + "@param optionsList A tab separated list of options for the control.") +{ + return object->getTooltip(); +} diff --git a/Engine/source/gui/controls/guiGameSettingsCtrl.h b/Engine/source/gui/controls/guiGameSettingsCtrl.h new file mode 100644 index 000000000..d8aac95e8 --- /dev/null +++ b/Engine/source/gui/controls/guiGameSettingsCtrl.h @@ -0,0 +1,313 @@ +//----------------------------------------------------------------------------- +// 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. +//----------------------------------------------------------------------------- + +#ifndef _GuiGameSettingsCtrl_H_ +#define _GuiGameSettingsCtrl_H_ + +#include "gui/buttons/guiButtonCtrl.h" +#include "T3D/assets/ImageAsset.h" + +/// \class GuiGameSettingsCtrl +/// A base class for cross platform menu controls that are gamepad friendly. +class GuiGameSettingsCtrl : public GuiButtonCtrl +{ +public: + typedef GuiButtonCtrl Parent; + + enum Mode + { + Default = 0, + OptionList, + Slider, + Keybind, + Text + }; + +protected: + + /// \struct OptionEntry + /// Display text and ID key for each entry in an option. + struct OptionEntry + { + StringTableEntry mDisplayText; ///< The text that is displayed for the option + StringTableEntry mKeyString; ///< Key value that is associated with this option + OptionEntry() : mDisplayText(StringTable->EmptyString()), mKeyString(StringTable->EmptyString()) {} + virtual ~OptionEntry() {} + }; + + + StringTableEntry mLabel; ///< Text to display in the control as a label + StringTableEntry mScriptCallback; ///< Script callback when control is activated + StringTableEntry mTooltip; ///< A descriptive tooltip message for what the control is + + Mode mMode; + + //List options + Vector mOptions; ///< Collection of options available to display + S32 mSelectedOption; ///< Index into mOptions pointing at the selected option + bool mWrapOptions; ///< Determines if options should "wrap around" at the ends + + //Slider option + F32 mValue; ///< When working as a slider, this contains the value + F32 mStepSize; ///< When working as a slider, this is the increment levels in the range + Point2F mRange; ///< When working as a slider, this sets our min/max range + + //Keybind option + DECLARE_IMAGEASSET(GuiGameSettingsCtrl, KeybindBitmap, changeBitmap, GFXDefaultGUIProfile); + DECLARE_ASSET_SETGET(GuiGameSettingsCtrl, KeybindBitmap); + + DECLARE_IMAGEASSET(GuiGameSettingsCtrl, PreviousBitmap, changeBitmap, GFXDefaultGUIProfile); + DECLARE_ASSET_SETGET(GuiGameSettingsCtrl, PreviousBitmap); + + DECLARE_IMAGEASSET(GuiGameSettingsCtrl, NextBitmap, changeBitmap, GFXDefaultGUIProfile); + DECLARE_ASSET_SETGET(GuiGameSettingsCtrl, NextBitmap); + + S32 mArrowSize; + S32 mColumnSplit; //Padding between the leftmost edge of the control, and the left side of the 'option'. + S32 mRightPad; + + bool mEnabled; + bool mSelected; + +public: + void changeBitmap() {} + + /// Sets the control as selected . Only controls that are enabled can be selected. + virtual void setSelected(); + + /// Determines if the specified control is enabled or disabled. + /// + /// \return True if the specified control is enabled. False if the control is not + /// enabled + virtual bool isEnabled() const; + + /// Sets a control's enabled status according to the given parameters. + /// + /// \param enabled Indicate true to enable the control or false to disable it. + virtual void setEnabled(bool enabled); + + /// Gets the label displayed on the control. + /// + /// \return The label for the control. + virtual StringTableEntry getLabel() const; + + /// Sets the label on the control. + /// + /// \param label Text to set as the label. + virtual void setLabel(const char * label); + + /// Sets the control to a List setting. + /// + /// \param label The text to display on the control as a label. + /// \param optionsList A tab separated list of options for the control. + /// \param wrapOptions Specify true to allow options to wrap at the ends or + /// false to prevent wrapping. + /// \param callback [optional] Name of a script function to use as a callback + /// when this control is activated. Default NULL means no callback. + /// \param enabled [optional] If this control is initially enabled. Default true. + void setListSetting(const char* label, const char* optionsList, bool wrapOptions, const char* callback,bool enabled, const char* tooltip = "", const char* defaultValue = ""); + + /// Sets the control to a Slider setting + /// + /// \param label The text to display on the control as a label. + /// \param defaultValue A float indicating the slider's default value + /// \param increments A float indicating the incremental values the slider snaps along between it's range + /// \param range A Point2F that indicates the minimum and maximum value range + /// \param callback [optional] Name of a script function to use as a callback + /// when this control is activated. Default NULL means no callback. + /// \param enabled [optional] If this control is initially enabled. Default true. + void setSliderSetting(const char* label, F32 defaultValue, F32 increments, Point2F range, const char* callback, bool enabled, const char* tooltip = ""); + + /// Sets the control to a Keybind setting + /// + /// \param label The text to display on the control as a label. + /// \param bitmapAssetId The assetId for the button display image + /// \param range A Point2F that indicates the minimum and maximum value range + /// \param callback [optional] Name of a script function to use as a callback + /// when this control is activated. Default NULL means no callback. + /// \param enabled [optional] If this control is initially enabled. Default true. + void setKeybindSetting(const char* label, const char* bitmapAssetId, const char* callback, bool enabled, const char* tooltip); + + /// Gets the text for the currently selected option of the control. + /// + /// \return A string representing the text currently displayed as the selected + /// option on the control. If there is no such displayed text then the empty + /// string is returned. + StringTableEntry getCurrentOption() const; + + /// Gets the key string for the currently selected option of the control + /// + /// \return The key (or id) that was assigned to the selected option on the + /// control. If there is no selected option then the empty string is returned. + StringTableEntry getCurrentOptionKey() const; + + /// Gets the index into the option list for the currently selected option of the control. + /// + /// \return The index of the selected option on the control. If there is no + /// selected option then -1 is returned. + S32 getCurrentOptionIndex() const; + + /// Attempts to set the control to the specified selected option. The option + /// will only be set if the option exists in the control. + /// + /// \param option The option to be made active. + /// \return True if the control contained the option and was set, false otherwise. + bool selectOption(const char* option); + + /// Attempts to set the control to the option with the specified key. The + /// option will only be set if the key exists in the control. + /// + /// \param optionKey The key string that was assigned to the option to be made active. + /// \return True if the control contained the key and the option and was set, false otherwise. + bool selectOptionByKey(const char* optionKey); + + /// Attempts to set the control to the option at the specified index. The option + /// will only be set if the index is valid. + /// + /// \param optionIndex The index of the option to be made active. + /// \return True if the index was valid and the option and was set, false otherwise. + bool selectOptionByIndex(S32 optionIndex); + + /// Sets the list of options on the control. + /// + /// \param optionsList A tab separated list of options for the control. + void setOptions(const char* optionsList); + + /// Adds an option to the list of options on the control. + /// + /// \param displayText The text to display for this option. + /// \param keyText The id string to associate with this value. If NULL the + /// id will be the same as the display text. + void addOption(const char* displayText, const char* keyText); + + /// Activates the control. The script callback of the control will + /// be called (if it has one). + virtual void activate(); + + /// Gets the value + /// + F32 getValue(); + + /// Sets the value + /// + /// \param value The new value to be set. + void setValue(F32 value); + + Mode getMode() { return mMode; } + + /// Gets the tooltip + const char* getTooltip(); + + GuiGameSettingsCtrl(); + ~GuiGameSettingsCtrl(); + + void onRender(Point2I offset, const RectI &updateRect); + + void onRenderListOption(Point2I currentOffset); + void onRenderSliderOption(Point2I currentOffset); + + void onRenderKeybindOption(Point2I currentOffset); + + /// Callback when the object is registered with the sim. + /// + /// \return True if the profile was successfully added, false otherwise. + bool onAdd(); + + /// Callback when the control wakes up. + bool onWake(); + + void clear(); + + virtual void onMouseMove(const GuiEvent& event); + virtual void onMouseUp(const GuiEvent& event); + + DECLARE_CONOBJECT(GuiGameSettingsCtrl); + DECLARE_CATEGORY( "Gui Game" ); + DECLARE_DESCRIPTION( "Base class for cross platform menu controls that are gamepad friendly." ); + + /// Initializes fields accessible through the console. + static void initPersistFields(); + + static const S32 NO_OPTION = -1; ///< Indicates there is no option + +protected: + /// Sets up the option + /// + /// \param label The text to display on the control as a label. + /// \param callback Name of a script function to use as a callback when this + /// control is activated. + /// \param enabled [optional] If this control is initially enabled. Default true. + virtual void set(const char* label, const char* callback, bool useHighlightIcon = true, bool enabled = true, S32 mode = 0, const char* tooltip = ""); + + /// Sets the script variable $ThisControl to reflect this control. + virtual void setThisControl(); + + /// @name Callbacks + /// @{ + DECLARE_CALLBACK( void, onChange, () ); + + DECLARE_CALLBACK(void, onInputEvent, (const char* device, const char* action, bool state)); + + DECLARE_CALLBACK(void, onAxisEvent, (const char* device, const char* action, F32 axisValue)); + /// @} + + /// Evaluates some script. If the command is empty then nothing is evaluated. + /// + /// \param command The script to evaluate. + void doScriptCommand(StringTableEntry command); + + StringTableEntry mCallbackOnA; ///< Script callback when the 'A' button is pressed + StringTableEntry mCallbackOnB; ///< Script callback when the 'B' button is pressed + StringTableEntry mCallbackOnX; ///< Script callback when the 'X' button is pressed + StringTableEntry mCallbackOnY; ///< Script callback when the 'Y' button is pressed + +private: + /// Performs a click on the current option. The x position is used to + /// determine if the left or right arrow were clicked. If one was clicked, the + /// option will be changed. If neither was clicked, the option is unaffected. + /// This method should only be called when there is an actively selected control. + /// + /// \param xPos The x position of the the click, relative to the control. + void clickOption(S32 xPos); + + /// Changes the option on the currently selected control. + /// + /// \param delta The amount to change the option selection by. Typically this + /// will be 1 or -1. + void changeOption(S32 delta); + + /// Performs a click on the current slider control. The x position is used to + /// determine if the left or right arrow were clicked, or if it landed somewhere on the sliderbar. + /// If one was clicked, the option will be changed. If neither was clicked, the option is unaffected. + /// This method should only be called when there is an actively selected control. + /// + /// \param xPos The x position of the the click, relative to the control. + void clickSlider(S32 xPos); + + void clickKeybind(S32 xPos); + +private: + bool mCallbackOnInputs; + bool mConsumeKeyInputEvents; +}; + +#endif diff --git a/Templates/BaseGame/game/data/UI/guis/NetGraphGui.asset.taml b/Templates/BaseGame/game/data/UI/guis/NetGraphGui.asset.taml new file mode 100644 index 000000000..c73e44804 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/guis/NetGraphGui.asset.taml @@ -0,0 +1,4 @@ + diff --git a/Templates/BaseGame/game/data/UI/images/Torque_3D_logo.png b/Templates/BaseGame/game/data/UI/images/Torque_3D_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e31d42a688a7e560b17237ff60edbf9c0c00dc4d GIT binary patch literal 9063 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 literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/Torque_3D_logo_alt.png b/Templates/BaseGame/game/data/UI/images/Torque_3D_logo_alt.png new file mode 100644 index 0000000000000000000000000000000000000000..3836f1e7fc26b23ee299fa02570bbed343d2cb50 GIT binary patch literal 11616 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 literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/Torque_3D_logo_shortcut.png b/Templates/BaseGame/game/data/UI/images/Torque_3D_logo_shortcut.png new file mode 100644 index 0000000000000000000000000000000000000000..d993d4893f9112747e2099c1f111877db4064a86 GIT binary patch literal 10728 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 IQpVr@2Vh;nHvj+t literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/Torque_3D_logo_w.png b/Templates/BaseGame/game/data/UI/images/Torque_3D_logo_w.png new file mode 100644 index 0000000000000000000000000000000000000000..ec197dda39246e2f1f0a95f79d35a68aba584a01 GIT binary patch literal 19328 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 literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/backgrounddark.png b/Templates/BaseGame/game/data/UI/images/backgrounddark.png new file mode 100644 index 0000000000000000000000000000000000000000..13b4bda55c7c7c5ebc87d54bf010a5c06c32cc28 GIT binary patch literal 5751 zcmeAS@N?(olHy`uVBq!ia0y~yU;#2&7&w@K)Q9>#R~Q(W?pK9GlmsP~D-;yvr)B1( zDwI?fq$;FVWTr7NRNQ(yJ#f-(1)jG1mahE`DlHEz5)zh~zxepOxpVT_WpiI{9Bv9I#?+kdw?Mc!cDDpK4dr}|{V&IObIM4p>g6Y)Ko^Y*WU@7C!{s5xps z7vDHvSM*e2`>)U)d(|VWdJ-$@8w31tXMb<)gZ@0{keYQFH(czMBs@q~> zn&;1NcI;VZ;H3P{>CyGM=RJzzSf@WccSz#J^j6h*-_HNqIhTE}(1%yHFQ514PTwuF zeDUoqk0$%w_WKpJf9a)Uwj| zw&2wQ&0pKH+REH@%}EmJb_!OW zGp4f5o~+|5R3W3FZt!_3_u3tm$DB8`oai-}#Ca~`Qq7uoH$Pncb?~A@@l4^LC7G>z zD%R;QF+6$J+KrK;ckN2O+LLp8>-B`!G%V1YDXbPzV;dW?^!KevMB z|EKfa>qCbBwB3z9oOeEUe&zi8N)rvs>bEg6Ffg`cIy(n=Iy=LXIxvCHshw!+ao9oT zX#8a_S1mp|#%hPf>sJr7 zIGW@Y{QCU5^nxD!pXAgn!Qc1$82$oym@D+;g2o_HiZN+ z#?F~lN_%HCKL4?+y?=dq;Jl}`@6KOb{lu5;hsz_&Wzu3F**<<*wzT-3I^X6=O9bW% z_e+*IK5}1oT5o@$o|VprGaDv)o)vEIJetIQTK0@ro0pBNOkhawr`9#6xt{Bu%UXIY z>iZLYo~K)`W<|dho=?2CWc} zKKVcVb>-P&YU+2E1n|75+W59#P+n?VEVPFvK^mK6y0hUhJ4T15>aoE7&$RF>c>?%UP zwoVoSmTZSTfZEuA*Z_zdfJzv6fH(n&8JK|>Wat4PMpc4a2CHUbjfH8(v=AnP-AxG~ z2M%#JkrMo%(7+xs)D0(Ey9vK*v8S5B<|Z0v9dN!QHJoVdChQS&0F()_+I)avw2T3U z4dDU`cMxLNoB%WxyA1XyqIKQ@nLpUvL~7mvm8-N4CsN&nHCN$@c)}?SQ}ZBm6ZQmr z02n!=WeiH>kseUEf)K@6cqk`;f}Df|MeDpXTE+n5gNQ&LWchit9diJbkqDRMgDpRU zoITjwL`3pOQ8L diff --git a/Templates/BaseGame/game/data/UI/images/clearbtn_d.png b/Templates/BaseGame/game/data/UI/images/clearbtn_d.png new file mode 100644 index 0000000000000000000000000000000000000000..229c71e8bddaa102f495a3dba47004f9c65cd0d4 GIT binary patch literal 593 zcmV-X00s?QkPn?)w z6CVEP+t+W**N+`j{PO<2JW!f(R$hMapFe*XQ8a;^}fcc&U1q&WrzGUsRJ~|Nb$;HG%v9vf=yp@5~EJ%j{0ATbF1a6f`foz5TGU zkMHBZK=}_JKCu4%`b@n56}$ZWa=w55ESxrV$`TGP&c7%D0g8vBl`A{>#l#-3tgkQ2 zR8m^7wz;{KM@Z;(+3GdzvKks+{{Hz34m}oFOoJj$N=5Z+-m>NMzkdJ5{O|8yMqVD? zKm39MzuDN>{(%B$^X5%VKwbYCk<;G)|Nj|*als698ry$h&@!{I{AFfl{tFTZ1~u4K f&!0Y90T5sS_@w(H5qG>u00000NkvXXu0mjf2Ztbp literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/clearbtn_d_image.asset.taml b/Templates/BaseGame/game/data/UI/images/clearbtn_d_image.asset.taml new file mode 100644 index 000000000..ef78852ae --- /dev/null +++ b/Templates/BaseGame/game/data/UI/images/clearbtn_d_image.asset.taml @@ -0,0 +1,3 @@ + diff --git a/Templates/BaseGame/game/data/UI/images/clearbtn_h.png b/Templates/BaseGame/game/data/UI/images/clearbtn_h.png new file mode 100644 index 0000000000000000000000000000000000000000..5e67cb13b2b4a85172bfa47e74b66993f0b315a2 GIT binary patch literal 595 zcmV-Z0<8UsP)Z)GIKgXfZeFjXq_kgNUj7V-2Ju1S$m*D2rhp`p zl9Fcr{{5R5=;ZW=4s#>mglFXG_fcy{jGxe}m8#*ZI9GM_(p zPV4K}uWDReT(?V0OVju5+t&+J`X6r7>({RxLPA1j0TnU5ee;GTDJjwa)albT#>U3& zL4koCPoF;ZdGX=}>z_Y=nBbcJ{{71fH0}21PoJ2xva|ipoIP7*Vq(%dVZwyX5fPEM zf$}_W-n;>6Vum}9nVI=>M@NUoh4be%&z?P7X=ZBLvS8uDP2azNXPP-ylRQAAkeFdrZPpa1{=Gs2xW zapJ^25Y5TSd0R(E=N8C@o}O;)$f)S{??1kax3#zR@eA<(K?!mT3yaSa`unr^czN$E zUc7iJFaS<0UAAlz7dO|l>C>iXT3T9u1p0>&9^{~y21T5Oh2^KYbLX{x`t-3I=nMva zet|!dQj))bw*LbK(3UM*m>C%v|1%<|J&=2U{P@8N#BBfm{$pZgW% diff --git a/Templates/BaseGame/game/data/UI/images/clearbtn_n.png b/Templates/BaseGame/game/data/UI/images/clearbtn_n.png new file mode 100644 index 0000000000000000000000000000000000000000..ecb13a8d661317f38d3e4214fff3f0312b7b8af0 GIT binary patch literal 377 zcmV-<0fzpGP)wAA<=LJelEZTKubwTGJIwqVjwiI($lj%e)b#h zSV}4U^((?ZzW5oeF0X{QG;0x_gI(Zp1%{y0u%eoqB*Be}+Z35ISogfn=j{1}M~e5r zom^~6`il#Z>bB`G@&P}3s^gaM{dn?`64>vd+uy zC)Ag|rg#ir`9=|JM=PFw+g^xf&*YE1hYH5v6--s@cbdf?FJvm;W#*#H1Rw9 diff --git a/Templates/BaseGame/game/data/UI/images/collapsetoolbar_d.png b/Templates/BaseGame/game/data/UI/images/collapsetoolbar_d.png new file mode 100644 index 0000000000000000000000000000000000000000..984a63853c4fd48dd65049cdda3025de63842420 GIT binary patch literal 280 zcmV+z0q6dSP)hgS0Vv4;mgMH;x)r;fhYuV;(S;&;;NSt=u63|? zz%6O(;J_d!D}&pg-rnB0C5=o>QFLPjLReThZb@}b%@L7I2uePB_z*;W0B5A7%a^0e egYzdqfB^t3O) diff --git a/Templates/BaseGame/game/data/UI/images/collapsetoolbar_h.png b/Templates/BaseGame/game/data/UI/images/collapsetoolbar_h.png new file mode 100644 index 0000000000000000000000000000000000000000..7e3de8387148c02f13b1e7f24f984de37feccf69 GIT binary patch literal 468 zcmV;_0W1EAP)Y)0 z9XimShOxs=YQDsp@gJb1gn_Zvu?5E&#SyLef*bddTyF3YCK)zo&)JhrF5V0V0e+4h z&!GoIxa##XdV>0jSi8!D*$CI(frpPId zoX)3*M|j)3>wnqT_NAKB=~QbCw1-x!H26BvM$lT86^U`fnQd^FLPPQqy@lE%w=B^f)Fy&H|PPw->A71`mp00RIT5=iSlljg+$0000< KMNUMnLSTYWrq$s9 literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/collapsetoolbar_h_image.asset.taml b/Templates/BaseGame/game/data/UI/images/collapsetoolbar_h_image.asset.taml new file mode 100644 index 000000000..231201217 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/images/collapsetoolbar_h_image.asset.taml @@ -0,0 +1,3 @@ + diff --git a/Templates/BaseGame/game/data/UI/images/collapsetoolbar_n.png b/Templates/BaseGame/game/data/UI/images/collapsetoolbar_n.png new file mode 100644 index 0000000000000000000000000000000000000000..b36de3ae049d9743a09dc6fc26af740cf9841360 GIT binary patch literal 439 zcmV;o0Z9IdP)Ox_mJPyDg4SlUjSNW3W5uGwOEk!Lx4uX4pZl7UqAx0i=rnvSAdP_$$A20Su(H_ zvh10InGB}9^1v-*3Cso@F>PaL>L}8isTm_PeHKN5r}hODW+z|w`}Q5O#yHtL&*`VC zP~)7=kRBzVBuOw+YZy|xe)*kcR2>cgwbuTO8@Fkiwr+iIX4$!2->q9vYwhDG`qk=o zMb~kBVd5z4oUzQ=+;7}ZXk^2MX<21r!6szg-dfzih^e4%lbv7^R`VYwdnU3IbzN)k2xeK9 hJ@8zg^|AXCU;u#ob3iiM+rIz+002ovPDHLkV1m|A!NdRn literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/collapsetoolbar_n_image.asset.taml b/Templates/BaseGame/game/data/UI/images/collapsetoolbar_n_image.asset.taml new file mode 100644 index 000000000..9e7afd9c4 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/images/collapsetoolbar_n_image.asset.taml @@ -0,0 +1,3 @@ + diff --git a/Templates/BaseGame/game/data/UI/images/dropdownbuttonarrow.png b/Templates/BaseGame/game/data/UI/images/dropdownbuttonarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..8c420ab85dad8b5ee3ca92464665ae071a471732 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%sd>6MhE&{2%E`$|abUXZ<1r^pL9db1gt1VxgHed#<;qq~ cW)1^}6XL9#0Z$iS1nOY$boFyt=akR{0H4Any8r+H literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/dropdownbuttonarrow_image.asset.taml b/Templates/BaseGame/game/data/UI/images/dropdownbuttonarrow_image.asset.taml new file mode 100644 index 000000000..24976a2d6 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/images/dropdownbuttonarrow_image.asset.taml @@ -0,0 +1,3 @@ + diff --git a/Templates/BaseGame/game/data/UI/images/dropdowntextEdit.png b/Templates/BaseGame/game/data/UI/images/dropdowntextEdit.png new file mode 100644 index 0000000000000000000000000000000000000000..3966efbb56239be59ee13cddceab917b144882b9 GIT binary patch literal 390 zcmV;10eSw3P)^?7l2ZX@QwNIJ_tdJyVq-O;hN*R;|Jf8oKt&?reAz#jswl zv@I};de2`VaYRw1b@G>k2y~N}rTzTSqF{8F^S*pfDsBZxV07vonVb4jntpET307*qoM6N<$f}R+y&Hw-a literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/dropdowntextEdit_image.asset.taml b/Templates/BaseGame/game/data/UI/images/dropdowntextEdit_image.asset.taml new file mode 100644 index 000000000..7006d8448 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/images/dropdowntextEdit_image.asset.taml @@ -0,0 +1,3 @@ + diff --git a/Templates/BaseGame/game/data/UI/images/expandtoolbar_d.png b/Templates/BaseGame/game/data/UI/images/expandtoolbar_d.png new file mode 100644 index 0000000000000000000000000000000000000000..462929e95039217cc59fe50d6a95c2b7054ac0b8 GIT binary patch literal 278 zcmV+x0qOpUP)hgS0Vv4;mgMHsH*7Al-)#9Kh|`0|)U)I@mj4 zmz0y0VX$?;A?fYyjom>YT}CFR*d@cl!f^+Jx~ArcNG3!}K6>~NM125fq@~N3qsxQy cCqRG!07OkOz~-BXZ2$lO07*qoM6N<$f=)$pfdBvi literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/expandtoolbar_d_image.asset.taml b/Templates/BaseGame/game/data/UI/images/expandtoolbar_d_image.asset.taml new file mode 100644 index 000000000..45a7de130 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/images/expandtoolbar_d_image.asset.taml @@ -0,0 +1,3 @@ + diff --git a/Templates/BaseGame/game/data/UI/images/expandtoolbar_h.png b/Templates/BaseGame/game/data/UI/images/expandtoolbar_h.png new file mode 100644 index 0000000000000000000000000000000000000000..c33bcad6985b3862324279bc0f5457755b94f28f GIT binary patch literal 468 zcmV;_0W1EAP)qS?llb{VTLkjAsY;|aeyj=$>HXDkKfU1h$Gh(W#P&4TdW&oR`Nq&a3 zTN8um?Q=toI@keY`=EJd?T*CDZYvdgmA#wIqEGOnEJb$uEx-Uri&4ja71Rp=0000< KMNUMnLSTZ?xyoSx literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/expandtoolbar_h_image.asset.taml b/Templates/BaseGame/game/data/UI/images/expandtoolbar_h_image.asset.taml new file mode 100644 index 000000000..003d65496 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/images/expandtoolbar_h_image.asset.taml @@ -0,0 +1,3 @@ + diff --git a/Templates/BaseGame/game/data/UI/images/expandtoolbar_n.png b/Templates/BaseGame/game/data/UI/images/expandtoolbar_n.png new file mode 100644 index 0000000000000000000000000000000000000000..0af2f1bd13809d099ca3a5a5c9ba1dc42b6f66c5 GIT binary patch literal 437 zcmV;m0ZRUfP)4~o#5^Dg=ri|$!*BY zbpP3B?F$Y zwO%=>X`z&@9drv@g0dk;N^TmO`W3-u+KiE!MNwe&sko4$lziUp$nSm5RBnu=@2aBx z{tJ6eXN!gmYNct4`g&Fzw)&+;bvRI-=QzXGHr@KjvWz??HC?wpRyQl0+1YZdyi5{W zUN4=}-z_)f`gSe%?Dp<%8~-FuXmPb@UGQXjFw*+wZiCf_ZQoNiaUAu!c4K0>t=SF5 z!{LASY^7JJHJ)q5(e1RYDluRawr*}2FECOnsnf(0O2YO1qqJU$>_lDHiXEXW%d$tF f>$5J~UjYUHlxB7wIAEv(00000NkvXXu0mjf?KH=8 literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/expandtoolbar_n_image.asset.taml b/Templates/BaseGame/game/data/UI/images/expandtoolbar_n_image.asset.taml new file mode 100644 index 000000000..f3b62bd23 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/images/expandtoolbar_n_image.asset.taml @@ -0,0 +1,3 @@ + diff --git a/Templates/BaseGame/game/data/UI/images/groupborder.png b/Templates/BaseGame/game/data/UI/images/groupborder.png new file mode 100644 index 0000000000000000000000000000000000000000..61234ae1fb3dee29eda38a371165d36b060ee426 GIT binary patch literal 1273 zcmVRq)0SqBM&U{ zK~RE8k;)fTv@rNVFsUphN-&N10jmTOk|LETicKV_m54TpVAK!`|L<7|`4E(7K4ARB zDus5>J(HaE?!4W7v&qH}czMI@+&44#&Ye5=o}G2_O1ZzkpGs6d@8oj17WcW!E!8%I zG7SwXm(AMBn08BdCX>0T948-RoKK$0X0t6*Q&aiH#l^fexw~LXm>2UyPMmS3yc8^% zPN&txvs=#V2iKgriKmXs^9tJFqjWWIBOj#Opr!-61IK}Xx1-s?{L4G0_&?_ilXv4x zqfZ_btu8MwSK|-wsQY~v)cnk(&+H?8J(|C{sz$fn!M^&){#~l$>@n5f-deC_;MX2J zsxZHFtA)8SUGF$_vOr$N_B~qGz~m2~oD@4WwsorNs!FYtyCThVSEZ(BX4T=g^Lm1w z!FRq%(Y|`AS3jc65Sso~f)<#1w-6X-QZF0;z1&IJw>OAO*=w$5nIM949%2g^Yzljy(oWy)Hf= zKP~7s_`nZIkS{YqF~l(je$;4#Z=xBAo(3O1_wqgCBii5tJte9r;~AA?zGq4`(Ts_n zWQL)#a^A!gm6r6qM+nP?0Sc)kNm@4Xtw-=SGYrxowl6GaQ(5@5B&1Y;X$f*x_i`5k zxlG?JMp&eYe3Cfrf#}H=#@X;~|BtO`5XzBM3_XQWv3X-F3LkUd8np$mW$;ZD@}tlb z@grOWzKMePX$!hz`6y0z95fS#p0K!L8Eqx>`_a=%75$H%65feFik{-gOB_87-@a&t zo=kbNraT|vFoAMIeOeI8_0#*bHBgfWlms3M{F=|;vk&HAk-V?7qf70j+dSQteXuCB zxme0WXRY7zZQiQU6W{Gki*a6ad*$6z80sP_3%q+`TtsI83dY1J6eRh$8vuYoz-JP{ zd_mbs-aVmUVdndNBq%XE#kqTuz$8gP5_U;MoS^NwxEOTzWZpMPmn%SJ z?(zSC4+0292nh@kvId`u$uPqZCPNED8bgi@LmbC`Ql1P|ln1?_pHA~@{Z%BXuPKfW j%4_?bDUt6}KLr>7B{DrC{G$C100000NkvXXu0mjfaJE^D literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/groupborder_image.asset.taml b/Templates/BaseGame/game/data/UI/images/groupborder_image.asset.taml new file mode 100644 index 000000000..2038044f6 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/images/groupborder_image.asset.taml @@ -0,0 +1,3 @@ + diff --git a/Templates/BaseGame/game/data/UI/images/inactiveoverlay.png b/Templates/BaseGame/game/data/UI/images/inactiveoverlay.png new file mode 100644 index 0000000000000000000000000000000000000000..feab83209cc442c5ad8dc73c2b86e0a8115c4743 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!foRZkbkkcwMLfBw9D?8~Obq{gPz9LVg>D`Q%4bP0l+XkKL$W0) literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/inactiveoverlay_image.asset.taml b/Templates/BaseGame/game/data/UI/images/inactiveoverlay_image.asset.taml new file mode 100644 index 000000000..f992cbfb6 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/images/inactiveoverlay_image.asset.taml @@ -0,0 +1,3 @@ + diff --git a/Templates/BaseGame/game/data/UI/images/menubutton.png b/Templates/BaseGame/game/data/UI/images/menubutton.png new file mode 100644 index 0000000000000000000000000000000000000000..3cfa036d8f5ec1d5458b0716efd2ea477cca0c6d GIT binary patch literal 3559 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 ZSBpO8NK=0oeKjq>KnJS*AI-m_{|h>L*X{rS literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/menubutton_image.asset.taml b/Templates/BaseGame/game/data/UI/images/menubutton_image.asset.taml new file mode 100644 index 000000000..467c7443f --- /dev/null +++ b/Templates/BaseGame/game/data/UI/images/menubutton_image.asset.taml @@ -0,0 +1,3 @@ + diff --git a/Templates/BaseGame/game/data/UI/images/nextOption_n.png b/Templates/BaseGame/game/data/UI/images/nextOption_n.png new file mode 100644 index 0000000000000000000000000000000000000000..ba710b061a2c7c64ceade2461ae2c37051578189 GIT binary patch literal 8517 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 literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/nextOption_n_image.asset.taml b/Templates/BaseGame/game/data/UI/images/nextOption_n_image.asset.taml new file mode 100644 index 000000000..55cce3fdb --- /dev/null +++ b/Templates/BaseGame/game/data/UI/images/nextOption_n_image.asset.taml @@ -0,0 +1,8 @@ + diff --git a/Templates/BaseGame/game/data/UI/images/nextbutton_d.png b/Templates/BaseGame/game/data/UI/images/nextbutton_d.png new file mode 100644 index 0000000000000000000000000000000000000000..76c3ec0ffbfd0e390d18bf15b641406a1c963304 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^+&~=2!3HE*cE)T6Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JigtRsIEGZ*dUIWo&smX&Az+(=poWapSz@o$*? zhV8dl?=!aFoKn4xeZo2Nf4=Qb$;zCp)-ipVh!6ks%DPE^D{?9q{wDx9i9DW z-@5CHEdniu-!^_}`*}dN=v;ZVvUv|*i@L#DeRZC~n>o$)T~mbY?ZFzA*KO@H&DTlVp33;PS)Y-O Z!Sa~S%jms^DnL&#c)I$ztaD0e0szoGZ1VsB literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/nextbutton_d_image.asset.taml b/Templates/BaseGame/game/data/UI/images/nextbutton_d_image.asset.taml new file mode 100644 index 000000000..6c616a75a --- /dev/null +++ b/Templates/BaseGame/game/data/UI/images/nextbutton_d_image.asset.taml @@ -0,0 +1,3 @@ + diff --git a/Templates/BaseGame/game/data/UI/images/nextbutton_h.png b/Templates/BaseGame/game/data/UI/images/nextbutton_h.png new file mode 100644 index 0000000000000000000000000000000000000000..f52f5fb4230f07e879e02d61472b07c57d07712c GIT binary patch literal 549 zcmV+=0^0qFP)0-qXkL_v~jv zlgT7TvAv7&%t^dYr_+a#hr^+@TrOWYNQ8?)a=v3urz2xpTz;W+6qyRv^uk~=B$Fa* zY7trZc?lJ%X2T_NO4CLKXgbTNCUvD{m}Vo^YPY~Tkd2ce$z(`A zSFm{3{j7pUGGsRDL1tMpV+>&!sySO(N(;fVWY6>Px?ZdKIygr@9z84;3mir8H9bcT zKSQ{#tA_9UkIBuZg(!-!TCLy*m)dh=+qMwLF?PEhHk&s@;`3dyZQCkM?RFd6?G_i? zH&3?FXf)96b}<|dg{B^9J^vSnF{HXe^vpq8OGKg(`@ zDPc4kq4(575CoTb2I&Kvq)6s=Hk-l!@S!1z#rXq!I-TG+j+$?6tXwP5KmRLDro?qz zvLl(u&>hLB$ diff --git a/Templates/BaseGame/game/data/UI/images/nextbutton_n.png b/Templates/BaseGame/game/data/UI/images/nextbutton_n.png new file mode 100644 index 0000000000000000000000000000000000000000..203133732e50b1df6bbd9506cec49f44385cf9be GIT binary patch literal 484 zcmV=P8+ zw(YFdb&VZ&3=k2N&8;vD6%z#@SPPD4Vq~7_lP=Gm!*~tPGFXzjSBY6BP=OAZn1#Yz zeMOAFs`Cm16Yd2fQ=s2N5ee+0alltX+9{%Ju=RO7?f|t1WmQ!f&x7^dJ=)Ck+zLbQ z8C%e;EK4{X{$aeYESPxc)^_`2^&U`(>ag;@-~WwZxO#4HMyn_aV}GbRTk76dt6?AK zsxC-Q@=mGD}pHXHn{a?_1VZvZ|8^e0u7drcunPkNJ1EWBngI a3oroff;ABVIBm%Q0000 diff --git a/Templates/BaseGame/game/data/UI/images/nopreview.png b/Templates/BaseGame/game/data/UI/images/nopreview.png new file mode 100644 index 0000000000000000000000000000000000000000..fccdc858bc36d7e390f8f1b75f9604f8855ce112 GIT binary patch literal 34615 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 literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/nopreview_image.asset.taml b/Templates/BaseGame/game/data/UI/images/nopreview_image.asset.taml new file mode 100644 index 000000000..cda718e30 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/images/nopreview_image.asset.taml @@ -0,0 +1,3 @@ + diff --git a/Templates/BaseGame/game/data/UI/images/previousOption_n.png b/Templates/BaseGame/game/data/UI/images/previousOption_n.png new file mode 100644 index 0000000000000000000000000000000000000000..3a9df0efa941a19848237264182e8e839e95d74e GIT binary patch literal 8194 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 SI$;mG7ecaiBA&9|9Q7YrM`J?( literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/previousOption_n_image.asset.taml b/Templates/BaseGame/game/data/UI/images/previousOption_n_image.asset.taml new file mode 100644 index 000000000..9b7fb0568 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/images/previousOption_n_image.asset.taml @@ -0,0 +1,8 @@ + diff --git a/Templates/BaseGame/game/data/UI/images/previousbutton_d.png b/Templates/BaseGame/game/data/UI/images/previousbutton_d.png new file mode 100644 index 0000000000000000000000000000000000000000..688b3034593019b560c95d56ca9ad50633a1d800 GIT binary patch literal 290 zcmV+-0p0$IP)aLQWp}M-VW=GgSOtJO1OWsQ!>dPPUAR&lL*PV&z_HIo(bxiQo zG};(LQc4m+6k(jEjJ36vwAQ4Q+D*=|s;Zp)s}5;NiF@#a(PGS)F=NIkUe^`Jecxkv zS(e-o9) diff --git a/Templates/BaseGame/game/data/UI/images/previousbutton_h.png b/Templates/BaseGame/game/data/UI/images/previousbutton_h.png new file mode 100644 index 0000000000000000000000000000000000000000..26cf0e8c67dd87290ea60c90d31cb755df60b7bd GIT binary patch literal 561 zcmV-10?z%3P)BL_eXU0B$9lCDhj0MLO$6qS*o3}t8TfCx>}q<#)g6KIH2DOD=f(ZiAb^zpyn zi5)f=3~mA3^Qa@I>5M1#`~A9Y+gB5((3 zy3Q2IOpqltj~r`OQ*qL)SfWmr$+)hfTDpz0?$jW9A znJJRv70iF?ezt;2GRTc;khLUPhNfxoeP8r3h{ls-8II%Nd9@OKJpLV-Xa}A&o6T`J zI4SalX4iGGUazs;zQX_TfVHg+=hoVTjm&s{2v?w?ly z*zfl+&4gw~WTf37V)v$tcDs#Qt(E{W`NC?cXTyDWF&d48=QKzEmifXSk4MnKPknMc zb1NV@$+2JAWC|R|1$QJB8FEKb+GN=OF;Pu&sb7pz%GFO|)dJ diff --git a/Templates/BaseGame/game/data/UI/images/previousbutton_n.png b/Templates/BaseGame/game/data/UI/images/previousbutton_n.png new file mode 100644 index 0000000000000000000000000000000000000000..c0b9f4662c6767a69f24d83f3b532a363e36a43b GIT binary patch literal 494 zcmVg)641pwaK zh{1KW@K4h;sFYfamcsxM<0y(26Sjjr)t45dZ)H07*qoM6N<$f@y!$IRF3v literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/previousbutton_n_image.asset.taml b/Templates/BaseGame/game/data/UI/images/previousbutton_n_image.asset.taml new file mode 100644 index 000000000..0c793bc45 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/images/previousbutton_n_image.asset.taml @@ -0,0 +1,3 @@ + diff --git a/Templates/BaseGame/game/data/UI/images/selectorbutton.png b/Templates/BaseGame/game/data/UI/images/selectorbutton.png new file mode 100644 index 0000000000000000000000000000000000000000..cd0780068892795e6329d713f48e84fa9f1df8d8 GIT binary patch literal 4002 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 IM6N<$f{4Jk(*OVf literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/selectorbutton_image.asset.taml b/Templates/BaseGame/game/data/UI/images/selectorbutton_image.asset.taml new file mode 100644 index 000000000..f53884267 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/images/selectorbutton_image.asset.taml @@ -0,0 +1,3 @@ + diff --git a/Templates/BaseGame/game/data/UI/images/selectorbuttonblank.png b/Templates/BaseGame/game/data/UI/images/selectorbuttonblank.png new file mode 100644 index 0000000000000000000000000000000000000000..e965b3af6f2b9a269f2d363f6118060aaaacfe23 GIT binary patch literal 744 zcmVP)OT4`WyUtC~=@hx+zySvwaKHgKA>83`kd%_BYOLNgO(Uv$2b*)@|Eg9YW@7fI zT~!q^i<8!-Y2N9)S2Rgnw#U*CJ*lmP+UI&jej#f@hhX^j%SM~?LF zi?zW-dhDh9K8FR%|AW1+Pd7{fT$3IAR&V6+TZaPUw@w9!-|CGXdJee7;UfF3q}2_F z-|E$KyQ*vs6_t}znHa6W?Ga9$rG&H;mg0WQq!gDq*w&w<$RMR-QTF zp5X9X$D|d%wE|28zjYYM_QYn*#rUnC;P6`qMiswx)bfSjir571FWj#7x87#*oU@1w z+uvGBam@&64A{^k=j;-))qZO&*qHn9Tm5kCB=ITlrQvKh0|K};_P1&c*wXu3jc4w^ zg=2r~8qq_QY(Sd1r literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/selectorbuttonblank_image.asset.taml b/Templates/BaseGame/game/data/UI/images/selectorbuttonblank_image.asset.taml new file mode 100644 index 000000000..c3f212a24 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/images/selectorbuttonblank_image.asset.taml @@ -0,0 +1,3 @@ + diff --git a/Templates/BaseGame/game/data/UI/images/selectorbuttondark.png b/Templates/BaseGame/game/data/UI/images/selectorbuttondark.png new file mode 100644 index 0000000000000000000000000000000000000000..84ee7e6f30f4eef5b3d2a1440495b16cf3b21f65 GIT binary patch literal 1942 zcmV;H2Wj|;P)8q_5Xb+!B=4lN z?AVBUt4(v4I!KilFko1|=NMX_fAf_Dp%{Bd??cV_-NM*!htZK;>r#7p~|{Ne^@a0X{^24`@3%UfLYq9}?% zS(YUc0Ym`s8-N8a_S1ei{}Rq+I3HfC<+3chy;v+JM05_f+~+~;ekD7XTeDn%ssL2Z zxhhz$1mFNv3>Kk}wg#7F*-pRT_mjzF#;)&&Vf6rJ0E*DR3t%4pZfy&?n;dMqHVz?z z%0~|PmCZY1{V&C}hu7_`jiWAJdb@Kj9jyal-Z`be6=WMY&xbFxN&)I@xi&jQr99BB zuqbT{&MDVki^uy8^Q+pB_g}k1IPuy2SC&gzlOL4`0Ja8~t?{?>ZNrsozDUt_nDdS= zR^2qqX$!CKF!Y~xRPs`B-_B8qzrjY>*dlxjz?6MoBzBdp!SRUW6gP41TG`d$49?&T z&fpC0BMmlxe?v~jK;P`U3Pkl0aC*OU?#jkUhD=1{5-;MEzN{hpqRY3XT5%@@oUed# z0!n_4-;0Kqzf@GzKF4QD$UFhYAMDvV_Iq{)fSwY7#{P;`0c1s>V%HE6IS!aNfN>BG zlZn1qcF>B3JqA;SguD_tZ*ABkV6Mz73FR3SKRlajg9O|z11iN4pHm@Ge9RM8O9AEK zC|F-ia5T69gPDiKCrScRK&hnl@`N{f1t>!G!nt5@x7myF34e=$K)z)ixv zG&m9-U0X`z62XVG$6$8DQ0+2E0Js-hcP;NbqNSFe6j;G)-N?4`~vr_43aDw2g5(mf8gP7BxV1%QQe@aIpwa=`V+t#0Dl8`7mg1APQoz>OV0wp!YiA;w$^dy=+gSi zaAxAU4kAWNMI>@rDLTT%`J0RA#w!7=^NGA7wfXlt!u8m_GU27JDK&J7NLPkTU0SZh zgf3yZTHfj!U^8?VKQwE(R5s`vGAh@Qb!{RYb*r*Euf_2z&Ksz4ue?8L!%9j3NMeKT z(n=P6$ds{W0N(&ZN@B9;2)7XT)6zz2D&%O^ijl*tBixMLOS58aDWQbrBwUOpy0ke1 z#Yn=nA>wdy)2(=_e` zlW^1HgM)+nZK%R^#|(};M=73vY0haWp-iR+YToMHGY~zg<*m*=1<|(wBu2W&;e09} zXUY;oxpR(}LP^XypC}nQCXw;K4G%vH$BCHua?UO18?Q2Puvnhr)gW0yh;y;W zAhcS^J2q#h3~Z`dYL!FqQfQedxKwP%=rIVb%Jg1TnfMTDo|-IJ^EY-%1R~*zV37!+ z)#u&|=bDKk;zDr-O2Ij;6qQ&5XUqvcBr2OHiOOb~h)(KdSK$;;YP6LC$7{kT3AodS znsB99jCjdEZwNN4M8K(4(@zs{XNhV$C87~shfu5sVM)&(Aa#goLWh`LL5F~5wVLIW zHBbJheoDcaH3XL{6`YjJl&6F<0l7;1nm2^yP07=G+E>E`s;DN)tSkH1Q4LLRZEHEx zTVZ;u>8+->E}>0tHN6!dt=@`@->mZXG_gZG6W<>ua+1yHtsMgm(_6d1eWH3RfFDHk z7=QGQEA;;e(_7m$(_7m%(_1%@j+)-OPBXo=Z8N>KZTp1vRscVDh)TYL>8;)1uB5l- zB1@NgYaUF^BZ)3;Exk2Ywh*~|$SnP#$XlNQc%tO3PXVO#*4q4HUc2Nmy%nann%-)9 zD*)45FV9I$!7;tH=>pSRQyKosW_oKAoawEmx0>Es_eRrO6)+wRncix8YXrOFoO?bT z4qpIQ`+e(pJU%3%#|=4&s<(P&t~Khd9PFxXI2^uk&OHw=w;S%)7hcbwe-5;+-nuRr z2gHS>xx diff --git a/Templates/BaseGame/game/data/UI/images/selectorbuttonhighlightonly.png b/Templates/BaseGame/game/data/UI/images/selectorbuttonhighlightonly.png new file mode 100644 index 0000000000000000000000000000000000000000..77e01fc741fbc30a882dd268ebb9c5da313f87a7 GIT binary patch literal 1613 zcmV-T2D15yP)kO zK~#9!?V7!A+(r<9XZH4_lO1;{)3^%U9NUyeo*@X}D)2KHd5XZ#5Tr7YPuaArv!Y5A6&q^H5 z;T+E49PX6iZoBES&5wxfy&r{Q9uXK#sm*_XnF!+u)-Ue6!_Maqrp+NDiU=#?@1?{qg3|xuRBTP*Z=lQ{1u44S0txiA0xR@^H$}BuqR#y;raA2 z=dJu2|9R091eak$bLuS`6M;~K-(=jy5S@iz&Ml~3d`Z}vd3)N z1kf@Gl7Q?0M#H8o7`{2+nNTya>l}=4Qck0;TA9=|FuoUT2L`t?;LaIL!!|OhwOzCS zPkOQ7krF7Rmx<};$lxvvn_Hz1uM{ow0F- z4uh0h(7+^|CRz=0s^o$aI#5ghLr-Og}jDDh|QDsAhHN90$LYP;G>kPTksyx|2IWnCWcY zCb*q&j#euXdAB?m^(wc)ZrzIb5{TY(>Q=-TK=gBhxDocnCCH`7Js2V)%2p_soRvLf zmFLX(gHiEcv5J3ZsI}2lD!WX?RLj5CN(+IPb{RtJm0U5K-4C$01IXBOd^N`D(Hd|v zpkFiTXew+<$5&Jy*bc~28rIgz5L$okTItW#!r{y_HWol+zc#Sz3s$LT2u*TZ;}~p9 zA>;s#IRzD(d89Z?U=SMIO;1l)J@`uvYb`70UZ{1`cZLRbMmJr?w6e{KkV1;|f(X_; zyzC8|t9#}U-AqKAL-YVjN0D)_E+m(lWYjvPIKkn6pg@u$9b`$QRWtNXzz5I1N;fD@ z(-(f)p&)ub=kwO%B(2lHHk-|BB6?n^Z=38-)z3A*6a5jhfuCxUS9qQK5sp4`Mhzs=l6(mHYt@W!@T$;fOYG-2uSOX0v&H3{|>s)Vwt)Edg!b znx}qSB6>a+kX2tkZ}oYr&s)Lgtv+v6Y|iJcJ#~uDTMcO!LA3QRjk*e}kFbyE00000 LNkvXXu0mjfl=J=< literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/selectorbuttonhighlightonly_image.asset.taml b/Templates/BaseGame/game/data/UI/images/selectorbuttonhighlightonly_image.asset.taml new file mode 100644 index 000000000..e359450c4 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/images/selectorbuttonhighlightonly_image.asset.taml @@ -0,0 +1,3 @@ + diff --git a/Templates/BaseGame/game/data/UI/images/separatorh.png b/Templates/BaseGame/game/data/UI/images/separatorh.png new file mode 100644 index 0000000000000000000000000000000000000000..339c0fbe039e8b5cbdd085230594099c26928157 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^Oh7Ed0V0oZ{G0)#BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%iF>*@hE&{2%E-w0@&CWQFtY@YFPFjrhT;U4EtAg|X#kZl Nc)I$ztaD0e0sy9+AwB>A literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/separatorh_image.asset.taml b/Templates/BaseGame/game/data/UI/images/separatorh_image.asset.taml new file mode 100644 index 000000000..213addd3a --- /dev/null +++ b/Templates/BaseGame/game/data/UI/images/separatorh_image.asset.taml @@ -0,0 +1,3 @@ + diff --git a/Templates/BaseGame/game/data/UI/images/separatorv.png b/Templates/BaseGame/game/data/UI/images/separatorv.png new file mode 100644 index 0000000000000000000000000000000000000000..6a0f873612cef214add9a2f88ed72dbafe92174c GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^GC<74!2~3aY}VEQQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JiX=Q;978H@CFNvfBrGsX`1Ak2{Z(F84g-d-`&k-}TiGQ5 P)i8Lv`njxgN@xNAx)CBs literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/separatorv_image.asset.taml b/Templates/BaseGame/game/data/UI/images/separatorv_image.asset.taml new file mode 100644 index 000000000..6a14f9e54 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/images/separatorv_image.asset.taml @@ -0,0 +1,3 @@ + diff --git a/Templates/BaseGame/game/data/UI/images/sliderwbox.png b/Templates/BaseGame/game/data/UI/images/sliderwbox.png new file mode 100644 index 0000000000000000000000000000000000000000..d9ef04961a30ad99f1e8871ef1f292b8a58d99f0 GIT binary patch literal 982 zcmV;{11bE8P)P001Qj1^@s6w^2g10000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#cu7P-RCwCFR!vM3K@@(oZI`u_7W)HS z_z46E5)-2a4+bql1U-1bs3#7@MD)a635mu~6G-Gn0+OI7O^h)fNi@NO!AOt<2?u@- z9*T%*X=%IvU1wGbyW4iRJ=m8_JMZl``|W!(^UWYsCMfWq4Q+02T9P!k*TKfx&%D0b zIAV74Q(YCX9ALy)joJOZchpx&6vet?Mob}N^dtoU6${^z1Pb{oBc|v~N>Z->n@DC( z^dn?hhVAVwNE{p-MuM=syre-K`>u)#Xl!f(o6S~Sxwf`8L6&6j`TR#QZC~prlSvid z+}u(e$w530ZEfwknBO1B>68EU^)=Huvgcc$9*%OPjCcpe23-4*Ecl4pS?Z!vATK~Iiu<8eTHFFyaGybOBf*v0#((zSZ!Ussc*KV zOSc(IBP*p4NV1{K&1b;)3K*lE;}RUd_RdRpkQHcQ{vA+^sH8cEioJZbKQB(*d>ETm zuGaa}MSa=Fv8LiO$#h;y@AHDD?T@o!>D`6mNv2*6_aqXDx41j*a=9k%Ha_7s%C58F zFXwu=WDCZkai-igF-SdCvFG!V4BWm>!3*e*>_?`8!JubxadCuYS^C-62cdY{%V|mO zPrfEv*U!cyQ>QNWdN!6mk8mtUKTi&Y8cr}=J`yS#jShsv;o0u)ZhuWp4fOW*GG4ED z6l>Dt*u#5hb>-U;I2DTx9PIAQwsqd{y8?C4-gT3yI9WaFU@BB>UKK8*>A7oteeO!E zq@o~z9iMO)Iy!(tXb3;o>AT`6pKHBx%T2qhfX53+u`y74whPk8o`uzwE162EM<|a8 zw7SIcYMIM%i)G?$iUZ2&2bNcK>ca7I7FI{%a5zA~1PCEZ@l)(h;K<%ZdJU70*H7+D zBuN4uf3=Z>TqcahOA4g;Y!Y6wSi+(x<|H9;qX{^~k}4v-QVOC4iG*J!WFkKE!Y<#Qq8}0K%2(y+C}?TL1t607*qoM6N<$ Eg3Ob{L;wH) literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/UI/images/sliderwbox_image.asset.taml b/Templates/BaseGame/game/data/UI/images/sliderwbox_image.asset.taml new file mode 100644 index 000000000..14abf8088 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/images/sliderwbox_image.asset.taml @@ -0,0 +1,3 @@ + diff --git a/Templates/BaseGame/game/data/UI/images/tabborder.png b/Templates/BaseGame/game/data/UI/images/tabborder.png new file mode 100644 index 0000000000000000000000000000000000000000..6703924d48fb96552fe11a91696f7c282aea3439 GIT binary patch literal 1203 zcmV;k1WfyhP)s+T@)zO{{b^^V< z=wH7wY(L{2P71F802ipY7kw@qE$vBN%q#5`37@CZ`H-O1-w@Umr|4D%f4*L^Nt+hhLK_6p2Z z%jmzE=C=LL3e%yyDGwhjj6U6g3bP`N-;PET+g?oxjXD4|r+B4=CaKr15}L$b?q6b0 zh8~SA%A;{SQ}t+Cpt=UfVlxhaEO#3>tT*c#8_eR@?>5%(PLkvwCV9zbSc8!+a4ONV zR-+KOJO_Zt7V|Std?$P6?aK-C`OA{+V;uY;3(0FXgFHquf);&@Yc?a<)A*xjHOZUF z9OEwblp3gHGX%+c&yuRyjAl==LJ=%0nk$@AZ@u)S6zSP8LLos?q-QfZ^*VWDa!G;yi`d#otZB4azuR)9UhD?F)aac|0iuXn*Eh1*_F zk5@SQ_F3yW*%QGMWE}P+4H9G+d(!r(D?=_|4>u*qe>cw_ShR}v@)e(9wdwjG#i_h1~oIT;xGv>0sd%E diff --git a/Templates/BaseGame/game/data/UI/scripts/menuInputHandling.tscript b/Templates/BaseGame/game/data/UI/scripts/menuInputHandling.tscript new file mode 100644 index 000000000..074bb3675 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/scripts/menuInputHandling.tscript @@ -0,0 +1,510 @@ +//============================================================================== +// 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 +*/ + +/// 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 +function UIMenuButtonList::onInputEvent(%this, %device, %action, %state) +{ + if(%state) + $activeMenuButtonContainer.processInputs(%device, %action); +} + +/// 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 +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); +} + +/// 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. +/// \param %gamepadOnly (bool) If true, will only show the button when working in the gamepad input mode +function MenuInputButton::set(%this, %gamepadButton, %keyboardButton, %text, %command, %gamepadOnly) +{ + %set = (! ((%text $= "") && (%command $= ""))); + %this.setText(%text); + %this.setActive(%set); + %this.setVisible(%set); + + %this.gamepadButton = %gamepadButton; + %this.keyboardButton = %keyboardButton; + + if(%gamepadOnly $= "") + %gamepadOnly = false; + + %this.gamepadOnly = %gamepadOnly; + + %this.Command = %command; +} + +/// Refreshes the specific button, updating it's visbility status and the displayed input image +function MenuInputButton::refresh(%this) +{ + %set = (! ((%this.text $= "") && (%this.command $= ""))); + + //Special-case of where we're in keyboard+mouse mode, but the menubutton is gamepad only mode, so we early out + if(%this.gamepadOnly && $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; +} + +/// 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(); + } +} + +/// 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(); +} + +/// 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"; +} + +/// 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. +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); + } + } + } +} + +/// 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 +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 +//============================================================================== +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(); + } + } +} + +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 +//============================================================================== + +function MenuList::setAsActiveMenuList(%this, %startPosition, %menuMode) +{ + if(%startPosition $= "") + %startPosition = "0 0"; + + if(%menuMode $= "") + %menuMode = "Menu"; + + $activeMenuList = %this; + $activeMenuList.hidden = false; + $activeMenuListPosition = %startPosition; + $activeMenuListMode = %menuMode; + + %this.refresh(); +} + + +function MenuList::activate(%this) +{ + //check for a highlighted element + if($activeMenuListPosition.y > -1 && $activeMenuListPosition < $activeMenuList.getCount()) + { + %btn = $activeMenuList.getObject($activeMenuListPosition.y); + %btn.performClick(); + } +} + +function MenuList::refresh(%this) +{ + %selectedObject = 0; + for(%i=0; %i < $activeMenuList.getCount(); %i++) + { + %btn = $activeMenuList.getObject(%i); + + %isSelected = %i == $activeMenuListPosition.y; + + %btn.setHighlighted(%isSelected); + + if(%isSelected) + %selectedObject = %i; + } + + if($activeMenuList.isMethod("onNavigate")) + $activeMenuList.onNavigate($activeMenuListPosition.y); + + %parent = $activeMenuList.getParent(); + if(%parent.getClassName() $= "GuiScrollCtrl") + { + %parent.scrollToObject(%selectedObject); + } +} + +function MenuList::navigateUp(%this) +{ + $activeMenuListPosition.y -= 1; + if($activeMenuListPosition.y < 0) + $activeMenuListPosition.y = 0; + + %this.refresh(); +} + +function MenuList::navigateDown(%this) +{ + $activeMenuListPosition.y += 1; + if($activeMenuListPosition.y >= $activeMenuList.getCount()) + $activeMenuListPosition.y = $activeMenuList.getCount()-1; + + %this.refresh(); +} + +function MenuList::navigateLeft() +{ + echo("Menu list navigated left!"); + + //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($activeMenuListPosition.y); + if(%btn.getClassName() $= "GuiGameSettingsCtrl" && %btn.isEnabled()) + { + warnf("MenuList::navigateLeft() - actioned the option" @ %btn @ " to the left"); + } +} + +function MenuList::navigateRight() +{ + echo("Menu list navigated right!"); + + %btn = $activeMenuList.getObject($activeMenuListPosition.y); + if(%btn.getClassName() $= "GuiGameSettingsCtrl" && %btn.isEnabled()) + { + warnf("MenuList::navigateLeft() - actioned the option" @ %btn @ " to the left"); + } +} From 725e2b1575ffafc04cdc57df8ed30bb454663eb1 Mon Sep 17 00:00:00 2001 From: JeffR Date: Tue, 22 Feb 2022 23:39:52 -0600 Subject: [PATCH 5/6] Typo'd assetId correction --- Templates/BaseGame/game/data/UI/guis/loadingGui.gui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Templates/BaseGame/game/data/UI/guis/loadingGui.gui b/Templates/BaseGame/game/data/UI/guis/loadingGui.gui index 83357901c..f232a2af9 100644 --- a/Templates/BaseGame/game/data/UI/guis/loadingGui.gui +++ b/Templates/BaseGame/game/data/UI/guis/loadingGui.gui @@ -1,6 +1,6 @@ //--- OBJECT WRITE BEGIN --- $guiContent = new GuiChunkedBitmapCtrl(LoadingGui) { - bitmapAsset = "UI:background_dark_image"; + bitmapAsset = "UI:backgrounddark_image"; useVariable = "0"; tile = "0"; position = "0 0"; From 9b4acda7bd942e9b2e8e4cc7173e5c20aad32ce8 Mon Sep 17 00:00:00 2001 From: JeffR Date: Wed, 23 Feb 2022 00:29:00 -0600 Subject: [PATCH 6/6] Missed clearing the options categories in options menu onWake --- Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript b/Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript index 48612b943..23a09236e 100644 --- a/Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript +++ b/Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript @@ -76,6 +76,8 @@ function OptionsMenuSettingsList::getOptionsList(%this, %index) function OptionsMenu::onWake(%this) { + OptionsMenuCategoryList.clear(); + for(%i=0; %i < %this.optionsCategories.count(); %i++) { %catName = %this.optionsCategories.getKey(%i);