# Conflicts:
#	indra/llui/lltabcontainer.cpp
#	indra/newview/llpanelmaininventory.cpp
#	indra/newview/llpreviewnotecard.cpp
This commit is contained in:
Ansariel
2026-02-25 13:19:59 +01:00
16 changed files with 388 additions and 57 deletions
+22
View File
@@ -167,6 +167,28 @@ constexpr U8 SIM_ACCESS_ADULT = 42; // Seriously Adult Only
constexpr U8 SIM_ACCESS_DOWN = 254;
constexpr U8 SIM_ACCESS_MAX = SIM_ACCESS_ADULT;
// map item types
constexpr U32 MAP_ITEM_TELEHUB = 0x01;
constexpr U32 MAP_ITEM_PG_EVENT = 0x02;
constexpr U32 MAP_ITEM_MATURE_EVENT = 0x03;
// constexpr U32 MAP_ITEM_POPULAR = 0x04; // No longer supported, 2009-03-02 KLW
// constexpr U32 MAP_ITEM_AGENT_COUNT = 0x05;
constexpr U32 MAP_ITEM_AGENT_LOCATIONS = 0x06;
constexpr U32 MAP_ITEM_LAND_FOR_SALE = 0x07;
constexpr U32 MAP_ITEM_CLASSIFIED = 0x08;
constexpr U32 MAP_ITEM_ADULT_EVENT = 0x09;
constexpr U32 MAP_ITEM_LAND_FOR_SALE_ADULT = 0x0a;
// Region map layer numbers
constexpr S32 MAP_SIM_OBJECTS = 0;
constexpr S32 MAP_SIM_TERRAIN = 1;
constexpr S32 MAP_SIM_LAND_FOR_SALE = 2; // Transparent alpha overlay of land for sale
constexpr S32 MAP_SIM_IMAGE_TYPES = 3; // Number of map layers
constexpr S32 MAP_SIM_INFO_MASK = 0x00FFFFFF; // Agent access may be stuffed into upper byte
constexpr S32 MAP_SIM_LAYER_MASK = 0x0000FFFF; // Layer info is in lower 16 bits
constexpr S32 MAP_SIM_RETURN_NULL_SIMS = 0x00010000;
constexpr S32 MAP_SIM_PRELUDE = 0x00020000;
// attachment constants
constexpr U8 ATTACHMENT_ADD = 0x80;
+13
View File
@@ -2488,6 +2488,19 @@ void LLTabContainer::setTabVisibility( LLPanel const *aPanel, bool aVisible )
updateMaxScrollPos();
}
bool LLTabContainer::getTabVisibility(const LLPanel* panel) const
{
for (tuple_list_t::const_iterator itr = mTabList.begin(); itr != mTabList.end(); ++itr)
{
LLTabTuple const* pTT = *itr;
if (pTT->mTabPanel == panel)
{
return pTT->mVisible;
}
}
return false;
}
// [SL:KB] - Patch: UI-TabRearrange | Checked: 2012-05-05 (Catznip-3.3)
boost::signals2::connection LLTabContainer::setRearrangeCallback(const tab_rearrange_signal_t::slot_type& cb)
{
+1
View File
@@ -248,6 +248,7 @@ public:
S32 getMaxTabWidth() const { return mMaxTabWidth; }
void setTabVisibility( LLPanel const *aPanel, bool );
bool getTabVisibility(const LLPanel* panel) const;
void startDragAndDropDelayTimer() { mDragAndDropDelayTimer.start(); }
+33
View File
@@ -23595,6 +23595,39 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>0</integer>
</map>
<key>InventoryShowRecentTab</key>
<map>
<key>Comment</key>
<string>Show/hide Recent tab in the Inventory floater</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>InventoryShowWornTab</key>
<map>
<key>Comment</key>
<string>Show/hide Worn tab in the Inventory floater</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>InventoryShowFavoritesTab</key>
<map>
<key>Comment</key>
<string>Show/hide Favorites tab in the Inventory floater</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>StatsReportMaxDuration</key>
<map>
<key>Comment</key>
+87 -22
View File
@@ -440,7 +440,25 @@ void LLGLTFLoader::processNodeHierarchy(S32 node_idx, std::map<std::string, S32>
(LLModel::NO_ERRORS == pModel->getStatus()) &&
validate_model(pModel))
{
mTransform.setIdentity();
// Build the scene transform.
// Non-skinned meshes: scene transform carries coord rotation + hierarchy,
// preserving the object's rotation/position/scale for upload.
// Skinned meshes: transform is already baked into vertices, so scene is identity.
if (node.mSkin >= 0)
{
mTransform.setIdentity();
}
else
{
glm::mat4 hierarchy_transform;
computeCombinedNodeTransform(mGLTFAsset, node_idx, hierarchy_transform);
glm::mat4 combined = coord_system_rotation * hierarchy_transform;
if (mApplyXYRotation)
{
combined = coord_system_rotationxy * combined;
}
mTransform = LLMatrix4(glm::value_ptr(combined));
}
transformation = mTransform;
// adjust the transformation to compensate for mesh normalization
@@ -690,7 +708,12 @@ std::string LLGLTFLoader::processTexture(std::string& full_path_out, S32 texture
// Process embedded textures
if (image.mBufferView >= 0)
{
return extractTextureToTempFile(texture_index, texture_type);
std::string temp_path = extractTextureToTempFile(texture_index, texture_type);
if (!temp_path.empty())
{
full_path_out = temp_path;
}
return temp_path;
}
return "";
@@ -740,23 +763,47 @@ bool LLGLTFLoader::populateModelFromMesh(LLModel* pModel, const std::string& bas
S32 skinIdx = nodeno.mSkin;
// Compute final combined transform matrix (hierarchy + coordinate rotation)
// Compute the vertex transform for this mesh.
// Non-skinned meshes: vertices are left untransformed; the node's hierarchy transform
// (rotation, translation, scale) is stored in the scene transform instead, matching
// the DAE loader. This ensures the uploaded object's bounding box and transform
// properties are correct. See: https://github.com/secondlife/viewer/issues/5431
// Skinned meshes: coord rotation + hierarchy are baked into vertex positions because
// inverse bind matrices and skin weights are already computed in that space.
// TODO: consider aligning skinned meshes with the DAE loader (scene transform instead
// of vertex baking), which would require adjusting inverse bind matrices, bind shape
// matrix, and weight keying to match.
S32 node_index = static_cast<S32>(&nodeno - &mGLTFAsset.mNodes[0]);
glm::mat4 hierarchy_transform;
computeCombinedNodeTransform(mGLTFAsset, node_index, hierarchy_transform);
// Combine transforms: coordinate rotation applied to hierarchy transform
glm::mat4 final_transform = coord_system_rotation * hierarchy_transform;
if (mApplyXYRotation)
glm::mat4 vertex_transform;
if (skinIdx >= 0)
{
final_transform = coord_system_rotationxy * final_transform;
// Skinned mesh: bake coord rotation + hierarchy into vertices.
// Inverse bind matrices and skin weights depend on this transform being applied.
vertex_transform = coord_system_rotation * hierarchy_transform;
if (mApplyXYRotation)
{
vertex_transform = coord_system_rotationxy * vertex_transform;
}
}
else
{
// Non-skinned mesh: don't apply any transform to vertices.
// The hierarchy transform will be stored in the scene transform matrix.
vertex_transform = glm::mat4(1.0f); // identity
}
// Check if we have a negative scale (flipped coordinate system)
bool hasNegativeScale = glm::determinant(final_transform) < 0.0f;
// coord_system_rotation and coord_system_rotationxy are pure rotations (det=1),
// so negative scale depends only on the hierarchy transform.
bool hasNegativeScale = glm::determinant(hierarchy_transform) < 0.0f;
bool hasVertexTransform = (vertex_transform != glm::mat4(1.0f));
// Pre-compute normal transform matrix (transpose of inverse of upper-left 3x3)
const glm::mat3 normal_transform = glm::transpose(glm::inverse(glm::mat3(final_transform)));
const glm::mat3 normal_transform = glm::transpose(glm::inverse(glm::mat3(vertex_transform)));
// Mark unsuported joints with '-1' so that they won't get added into weights
// GLTF maps all joints onto all meshes. Gather use count per mesh to cut unused ones.
@@ -809,27 +856,45 @@ bool LLGLTFLoader::populateModelFromMesh(LLModel* pModel, const std::string& bas
return false; // Skip this primitive
}
// Apply the global scale and center offset to all vertices
// Apply vertex transform (if any) to all vertices.
// Skinned meshes: this bakes coord rotation + hierarchy into vertices.
// Non-skinned meshes: vertex_transform is identity (no baking).
for (U32 i = 0; i < prim.getVertexCount(); i++)
{
// Use pre-computed final_transform
glm::vec4 pos(prim.mPositions[i][0], prim.mPositions[i][1], prim.mPositions[i][2], 1.0f);
glm::vec4 transformed_pos = final_transform * pos;
GLTFVertex vert;
vert.position = glm::vec3(transformed_pos);
if (!prim.mNormals.empty())
if (hasVertexTransform)
{
// Use pre-computed normal_transform
glm::vec3 normal_vec(prim.mNormals[i][0], prim.mNormals[i][1], prim.mNormals[i][2]);
vert.normal = glm::normalize(normal_transform * normal_vec);
glm::vec4 pos(prim.mPositions[i][0], prim.mPositions[i][1], prim.mPositions[i][2], 1.0f);
glm::vec4 transformed_pos = vertex_transform * pos;
vert.position = glm::vec3(transformed_pos);
if (!prim.mNormals.empty())
{
glm::vec3 normal_vec(prim.mNormals[i][0], prim.mNormals[i][1], prim.mNormals[i][2]);
vert.normal = glm::normalize(normal_transform * normal_vec);
}
else
{
vert.normal = glm::normalize(normal_transform * glm::vec3(0.0f, 0.0f, 1.0f));
LL_DEBUGS("GLTF_IMPORT") << "No normals found for primitive, using default normal." << LL_ENDL;
}
}
else
{
// Use default normal (pointing up in model space)
vert.normal = glm::normalize(normal_transform * glm::vec3(0.0f, 0.0f, 1.0f));
LL_DEBUGS("GLTF_IMPORT") << "No normals found for primitive, using default normal." << LL_ENDL;
// No transform: store raw GLTF positions and normals.
// The scene transform will carry coord rotation + hierarchy.
vert.position = glm::vec3(prim.mPositions[i][0], prim.mPositions[i][1], prim.mPositions[i][2]);
if (!prim.mNormals.empty())
{
vert.normal = glm::vec3(prim.mNormals[i][0], prim.mNormals[i][1], prim.mNormals[i][2]);
}
else
{
vert.normal = glm::vec3(0.0f, 0.0f, 1.0f);
LL_DEBUGS("GLTF_IMPORT") << "No normals found for primitive, using default normal." << LL_ENDL;
}
}
// Flip texture V coordinate
+47 -7
View File
@@ -339,14 +339,14 @@ bool LLPanelMainInventory::postBuild()
// </FS:Ansariel>
}
LLInventoryPanel* favorites_panel = getChild<LLInventoryPanel>(FAVORITES);
if (favorites_panel)
mFavoritesPanel = getChild<LLInventoryPanel>(FAVORITES);
if (mFavoritesPanel)
{
favorites_panel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER));
LLInventoryFilter& favorites_filter = favorites_panel->getFilter();
mFavoritesPanel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER));
LLInventoryFilter& favorites_filter = mFavoritesPanel->getFilter();
favorites_filter.setEmptyLookupMessage("InventoryNoMatchingFavorites");
favorites_filter.markDefault();
favorites_panel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, favorites_panel, _1, _2));
mFavoritesPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mFavoritesPanel, _1, _2));
}
// <FS:Ansariel> Only if we actually have it!
@@ -463,6 +463,10 @@ bool LLPanelMainInventory::postBuild()
menu->getChild<LLMenuItemGL>("Upload Animation")->setLabelArg("[COST]", animation_upload_cost_str);
}
mFilterTabs->setTabVisibility(mRecentPanel, gSavedSettings.getBOOL("InventoryShowRecentTab"));
mFilterTabs->setTabVisibility(mWornItemsPanel, gSavedSettings.getBOOL("InventoryShowWornTab"));
mFilterTabs->setTabVisibility(mFavoritesPanel, gSavedSettings.getBOOL("InventoryShowFavoritesTab"));
// Trigger callback for focus received so we can deselect items in inbox/outbox
LLFocusableElement::setFocusReceivedCallback(boost::bind(&LLPanelMainInventory::onFocusReceived, this));
@@ -2176,8 +2180,10 @@ void LLPanelMainInventory::initSingleFolderRoot(const LLUUID& start_folder_id)
void LLPanelMainInventory::initInventoryViews()
{
mAllItemsPanel->initializeViewBuilding();
mRecentPanel->initializeViewBuilding();
mWornItemsPanel->initializeViewBuilding();
if (gSavedSettings.getBOOL("InventoryShowRecentTab"))
mRecentPanel->initializeViewBuilding();
if (gSavedSettings.getBOOL("InventoryShowWornTab"))
mWornItemsPanel->initializeViewBuilding();
}
void LLPanelMainInventory::toggleViewMode()
@@ -2637,6 +2643,27 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
{
setViewMode(MODE_COMBINATION);
}
if (command_name == "toggle_recent_tab")
{
bool visibility = !gSavedSettings.getBOOL("InventoryShowRecentTab");
gSavedSettings.setBOOL("InventoryShowRecentTab", visibility);
mFilterTabs->setTabVisibility(mRecentPanel, visibility);
mRecentPanel->initializeViewBuilding();
}
if (command_name == "toggle_worn_tab")
{
bool visibility = !gSavedSettings.getBOOL("InventoryShowWornTab");
gSavedSettings.setBOOL("InventoryShowWornTab", visibility);
mFilterTabs->setTabVisibility(mWornItemsPanel, visibility);
mWornItemsPanel->initializeViewBuilding();
}
if (command_name == "toggle_favorites_tab")
{
bool visibility = !gSavedSettings.getBOOL("InventoryShowFavoritesTab");
gSavedSettings.setBOOL("InventoryShowFavoritesTab", visibility);
mFilterTabs->setTabVisibility(mFavoritesPanel, visibility);
}
}
void LLPanelMainInventory::onVisibilityChange( bool new_visibility )
@@ -2866,6 +2893,19 @@ bool LLPanelMainInventory::isActionChecked(const LLSD& userdata)
return isCombinationViewMode();
}
if (command_name == "recent_tab")
{
return mFilterTabs->getTabVisibility(mRecentPanel);
}
if (command_name == "worn_tab")
{
return mFilterTabs->getTabVisibility(mWornItemsPanel);
}
if (command_name == "favorites_tab")
{
return mFilterTabs->getTabVisibility(mFavoritesPanel);
}
if (command_name == "add_objects_on_double_click")
{
return gSavedSettings.getBOOL("FSDoubleClickAddInventoryObjects");
+1
View File
@@ -231,6 +231,7 @@ private:
LLInventoryPanel* mAllItemsPanel = nullptr;
LLInventoryPanel* mRecentPanel = nullptr;
LLInventoryPanel* mWornItemsPanel = nullptr;
LLInventoryPanel* mFavoritesPanel = nullptr;
bool mResortActivePanel;
LLSaveFolderState* mSavedFolderState;
std::string mFilterText;
+2 -1
View File
@@ -92,6 +92,7 @@ LLPreviewNotecard::LLPreviewNotecard(const LLSD& key) //const LLUUID& item_id,
LLPreviewNotecard::~LLPreviewNotecard()
{
delete mLiveFile;
mEditor = nullptr;
// <FS:Ansariel> FIRE-29425: User-selectable font and size for notecards
if (mFontNameChangedCallbackConnection.connected())
@@ -216,7 +217,7 @@ bool LLPreviewNotecard::handleKeyHere(KEY key, MASK mask)
// virtual
bool LLPreviewNotecard::canClose()
{
if(mForceClose || mEditor->isPristine())
if(mForceClose || !mEditor || mEditor->isPristine())
{
return true;
}
-12
View File
@@ -37,18 +37,6 @@
#include "llviewertexture.h"
#include "llgltexture.h"
// map item types
const U32 MAP_ITEM_TELEHUB = 0x01;
const U32 MAP_ITEM_PG_EVENT = 0x02;
const U32 MAP_ITEM_MATURE_EVENT = 0x03;
//const U32 MAP_ITEM_POPULAR = 0x04; // No longer supported, 2009-03-02 KLW
//const U32 MAP_ITEM_AGENT_COUNT = 0x05;
const U32 MAP_ITEM_AGENT_LOCATIONS = 0x06;
const U32 MAP_ITEM_LAND_FOR_SALE = 0x07;
const U32 MAP_ITEM_CLASSIFIED = 0x08;
const U32 MAP_ITEM_ADULT_EVENT = 0x09;
const U32 MAP_ITEM_LAND_FOR_SALE_ADULT = 0x0a;
// Description of objects like hubs, events, land for sale, people and more (TBD).
// Note: we don't store a "type" in there so we need to store instances of this class in
// well known objects (i.e. list of objects which type is "well known").
@@ -18,6 +18,9 @@
<menu_item_call name="inventory_new_window" label="Neues Inventar-Fenster"/>
<menu_item_check name="Protected Folders" label="Geschützte Ordner"/>
<menu_item_check label="Inventar-Einstellungen..." name="inv_settings"/>
<menu_item_check label="Aktuell anzeigen" name="show_recent_tab"/>
<menu_item_check label="Angezogen anzeigen" name="show_worn_tab"/>
<menu_item_check label="Favoriten anzeigen" name="show_favorites_tab"/>
<menu_item_check label="Listen-Ansicht" name="list_view"/>
<menu_item_check label="Galerie-Ansicht" name="gallery_view"/>
<menu_item_check label="Kombinierte Ansicht" name="combination_view"/>
@@ -89,11 +89,47 @@
function="Floater.Toggle"
parameter="inventory_settings" />
</menu_item_check>
<menu_item_separator>
<menu_item_separator.on_visible
<menu_item_separator/>
<menu_item_check
label="Show Recent tab"
name="show_recent_tab">
<menu_item_check.on_click
function="Inventory.GearDefault.Custom.Action"
parameter="toggle_recent_tab" />
<menu_item_check.on_check
function="Inventory.GearDefault.Check"
parameter="recent_tab" />
<menu_item_check.on_visible
function="Inventory.GearDefault.Visible"
parameter="single_folder_view" />
</menu_item_separator>
parameter="multi_folder_view" />
</menu_item_check>
<menu_item_check
label="Show Worn tab"
name="show_worn_tab">
<menu_item_check.on_click
function="Inventory.GearDefault.Custom.Action"
parameter="toggle_worn_tab" />
<menu_item_check.on_check
function="Inventory.GearDefault.Check"
parameter="worn_tab" />
<menu_item_check.on_visible
function="Inventory.GearDefault.Visible"
parameter="multi_folder_view" />
</menu_item_check>
<menu_item_check
label="Show Favorites tab"
name="show_favorites_tab">
<menu_item_check.on_click
function="Inventory.GearDefault.Custom.Action"
parameter="toggle_favorites_tab" />
<menu_item_check.on_check
function="Inventory.GearDefault.Check"
parameter="favorites_tab" />
<menu_item_check.on_visible
function="Inventory.GearDefault.Visible"
parameter="multi_folder_view" />
</menu_item_check>
<menu_item_separator/>
<menu_item_check
label="List view"
layout="topleft"
@@ -6,7 +6,10 @@
<menu_item_check label="Listen-Ansicht" name="list_view"/>
<menu_item_check label="Galerie-Ansicht" name="gallery_view"/>
<menu_item_check label="Kombinierte Ansicht" name="combination_view"/>
<menu_item_check label="Nach Name sortieren" name="sort_by_name"/>
<menu_item_check label="Aktuell anzeigen" name="recent_tab"/>
<menu_item_check label="Angezogen anzeigen" name="worn_tab"/>
<menu_item_check label="Favoriten anzeigen" name="favorites_tab"/>
<menu_item_check label="Nach Name sortieren" name="favorites_tab"/>
<menu_item_check label="Nach aktuellsten Objekten sortieren" name="sort_by_recent"/>
<menu_item_check label="Ordner immer nach Namen sortieren" name="sort_folders_by_name"/>
<menu_item_check label="Systemordner nach oben" name="sort_system_folders_to_top"/>
@@ -82,6 +82,50 @@
function="Inventory.GearDefault.Visible"
parameter="single_folder_view" />
</menu_item_check>
<menu_item_separator
layout="topleft" />
<menu_item_check
label="Show Recent tab"
layout="topleft"
name="recent_tab">
<on_click
function="Inventory.GearDefault.Custom.Action"
parameter="toggle_recent_tab" />
<on_check
function="Inventory.GearDefault.Check"
parameter="recent_tab" />
<on_visible
function="Inventory.GearDefault.Visible"
parameter="multi_folder_view" />
</menu_item_check>
<menu_item_check
label="Show Worn tab"
layout="topleft"
name="worn_tab">
<on_click
function="Inventory.GearDefault.Custom.Action"
parameter="toggle_worn_tab" />
<on_check
function="Inventory.GearDefault.Check"
parameter="worn_tab" />
<on_visible
function="Inventory.GearDefault.Visible"
parameter="multi_folder_view" />
</menu_item_check>
<menu_item_check
label="Show Favorites tab"
layout="topleft"
name="favorites_tab">
<on_click
function="Inventory.GearDefault.Custom.Action"
parameter="toggle_favorites_tab" />
<on_check
function="Inventory.GearDefault.Check"
parameter="favorites_tab" />
<on_visible
function="Inventory.GearDefault.Visible"
parameter="multi_folder_view" />
</menu_item_check>
<menu_item_separator
layout="topleft" />
<menu_item_check
@@ -53,11 +53,7 @@
function="Inventory.GearDefault.Visible"
parameter="multi_folder_view" />
</menu_item_check>
<menu_item_separator>
<menu_item_separator.on_visible
function="Inventory.GearDefault.Visible"
parameter="single_folder_view" />
</menu_item_separator>
<menu_item_separator/>
<menu_item_check
label="List view"
layout="topleft"
@@ -100,4 +96,46 @@
function="Inventory.GearDefault.Visible"
parameter="single_folder_view" />
</menu_item_check>
<menu_item_check
label="Recent tab"
layout="topleft"
name="recent_tab">
<on_click
function="Inventory.GearDefault.Custom.Action"
parameter="toggle_recent_tab" />
<on_check
function="Inventory.GearDefault.Check"
parameter="recent_tab" />
<on_visible
function="Inventory.GearDefault.Visible"
parameter="multi_folder_view" />
</menu_item_check>
<menu_item_check
label="Worn tab"
layout="topleft"
name="worn_tab">
<on_click
function="Inventory.GearDefault.Custom.Action"
parameter="toggle_worn_tab" />
<on_check
function="Inventory.GearDefault.Check"
parameter="worn_tab" />
<on_visible
function="Inventory.GearDefault.Visible"
parameter="multi_folder_view" />
</menu_item_check>
<menu_item_check
label="Favorites tab"
layout="topleft"
name="favorites_tab">
<on_click
function="Inventory.GearDefault.Custom.Action"
parameter="toggle_favorites_tab" />
<on_check
function="Inventory.GearDefault.Check"
parameter="favorites_tab" />
<on_visible
function="Inventory.GearDefault.Visible"
parameter="multi_folder_view" />
</menu_item_check>
</toggleable_menu>
@@ -20,6 +20,13 @@
<menu_item_call name="replace_links" label="Links ersetzen"/>
<menu_item_call name="inventory_new_window" label="Zusätzliches Inventar-Fenster"/>
<menu_item_check name="Protected Folders" label="Geschützte Ordner"/>
<menu_item_check label="Inventar-Einstellungen..." name="inv_settings"/>
<menu_item_check label="Aktuell anzeigen" name="show_recent_tab"/>
<menu_item_check label="Angezogen anzeigen" name="show_worn_tab"/>
<menu_item_check label="Favoriten anzeigen" name="show_favorites_tab"/>
<menu_item_check label="Listen-Ansicht" name="list_view"/>
<menu_item_check label="Galerie-Ansicht" name="gallery_view"/>
<menu_item_check label="Kombinierte Ansicht" name="combination_view"/>
<menu_item_check name="add_inv_toggle" label="Objekte hinzufügen per Doppelklick"/>
<menu_item_check name="add_invclothing_toggle" label="Kleidung hinzufügen per Doppelklick"/>
<menu_item_call name="inventory_show_filters" label="Filter anzeigen"/>
@@ -91,11 +91,47 @@
function="Floater.Toggle"
parameter="inventory_settings" />
</menu_item_check>
<menu_item_separator>
<menu_item_separator.on_visible
function="Inventory.GearDefault.Visible"
parameter="single_folder_view" />
</menu_item_separator>
<menu_item_separator/>
<menu_item_check
label="Show Recent tab"
name="show_recent_tab">
<menu_item_check.on_click
function="Inventory.GearDefault.Custom.Action"
parameter="toggle_recent_tab" />
<menu_item_check.on_check
function="Inventory.GearDefault.Check"
parameter="recent_tab" />
<menu_item_check.on_visible
function="Inventory.GearDefault.Visible"
parameter="multi_folder_view" />
</menu_item_check>
<menu_item_check
label="Show Worn tab"
name="show_worn_tab">
<menu_item_check.on_click
function="Inventory.GearDefault.Custom.Action"
parameter="toggle_worn_tab" />
<menu_item_check.on_check
function="Inventory.GearDefault.Check"
parameter="worn_tab" />
<menu_item_check.on_visible
function="Inventory.GearDefault.Visible"
parameter="multi_folder_view" />
</menu_item_check>
<menu_item_check
label="Show Favorites tab"
name="show_favorites_tab">
<menu_item_check.on_click
function="Inventory.GearDefault.Custom.Action"
parameter="toggle_favorites_tab" />
<menu_item_check.on_check
function="Inventory.GearDefault.Check"
parameter="favorites_tab" />
<menu_item_check.on_visible
function="Inventory.GearDefault.Visible"
parameter="multi_folder_view" />
</menu_item_check>
<menu_item_separator/>
<menu_item_check
label="List view"
layout="topleft"