summaryrefslogtreecommitdiff
path: root/indra/newview/llfloateropenobject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llfloateropenobject.cpp')
-rw-r--r--indra/newview/llfloateropenobject.cpp196
1 files changed, 196 insertions, 0 deletions
diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp
new file mode 100644
index 0000000000..fb5c795ac3
--- /dev/null
+++ b/indra/newview/llfloateropenobject.cpp
@@ -0,0 +1,196 @@
+/**
+ * @file llfloateropenobject.cpp
+ * @brief LLFloaterOpenObject class implementation
+ *
+ * Copyright (c) 2004-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+/*
+ * Shows the contents of an object.
+ * A floater wrapper for llpanelinventory
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloateropenobject.h"
+
+#include "llcachename.h"
+#include "llbutton.h"
+#include "lltextbox.h"
+
+#include "llagent.h" // for agent id
+#include "llalertdialog.h"
+#include "llinventoryview.h"
+#include "llinventorymodel.h"
+#include "llpanelinventory.h"
+#include "llselectmgr.h"
+#include "lluiconstants.h"
+#include "llviewerobject.h"
+#include "llvieweruictrlfactory.h"
+#include "llviewerwindow.h"
+
+
+LLFloaterOpenObject* LLFloaterOpenObject::sInstance = NULL;
+
+LLFloaterOpenObject::LLFloaterOpenObject()
+: LLFloater("object_contents"),
+ mPanelInventory(NULL),
+ mDirty(TRUE)
+{
+ LLCallbackMap::map_t factory_map;
+ factory_map["object_contents"] = LLCallbackMap(createPanelInventory, this);
+ gUICtrlFactory->buildFloater(this,"floater_openobject.xml",&factory_map);
+
+ childSetAction("copy_to_inventory_button", onClickMoveToInventory, this);
+ childSetAction("copy_and_wear_button", onClickMoveAndWear, this);
+ childSetTextArg("object_name", "[DESC]", "Object");
+}
+
+LLFloaterOpenObject::~LLFloaterOpenObject()
+{
+ gSelectMgr->deselectAll();
+ sInstance = NULL;
+}
+
+void LLFloaterOpenObject::refresh()
+{
+ mPanelInventory->refresh();
+
+ LLSelectNode* node = gSelectMgr->getFirstRootNode();
+ if (node)
+ {
+ std::string name = node->mName;
+ childSetTextArg("object_name", "[DESC]", name);
+ }
+}
+
+void LLFloaterOpenObject::draw()
+{
+ if (mDirty)
+ {
+ refresh();
+ mDirty = FALSE;
+ }
+ LLFloater::draw();
+}
+
+// static
+void LLFloaterOpenObject::dirty()
+{
+ if (sInstance) sInstance->mDirty = TRUE;
+}
+
+// static
+void LLFloaterOpenObject::show()
+{
+ if (gSelectMgr->getRootObjectCount() != 1)
+ {
+ gViewerWindow->alertXml("UnableToViewContentsMoreThanOne");
+ return;
+ }
+
+ // Create a new instance only if needed
+ if (!sInstance)
+ {
+ sInstance = new LLFloaterOpenObject();
+ sInstance->center();
+ }
+
+ sInstance->open();
+ sInstance->setFocus(TRUE);
+}
+
+
+// static
+void LLFloaterOpenObject::moveToInventory(bool wear)
+{
+ if (gSelectMgr->getRootObjectCount() != 1)
+ {
+ gViewerWindow->alertXml("OnlyCopyContentsOfSingleItem");
+ return;
+ }
+
+ LLSelectNode* node = gSelectMgr->getFirstRootNode();
+ if (!node) return;
+ LLViewerObject* object = node->getObject();
+ if (!object) return;
+
+ LLUUID object_id = object->getID();
+ std::string name = node->mName;
+
+ // Either create a sub-folder of clothing, or of the root folder.
+ LLUUID parent_category_id;
+ if (wear)
+ {
+ parent_category_id = gInventory.findCategoryUUIDForType(
+ LLAssetType::AT_CLOTHING);
+ }
+ else
+ {
+ parent_category_id = gAgent.getInventoryRootID();
+ }
+ LLUUID category_id = gInventory.createNewCategory(parent_category_id,
+ LLAssetType::AT_NONE,
+ name);
+
+ LLCatAndWear* data = new LLCatAndWear;
+ data->mCatID = category_id;
+ data->mWear = wear;
+
+ // Copy and/or move the items into the newly created folder.
+ // Ignore any "you're going to break this item" messages.
+ BOOL success = move_inv_category_world_to_agent(object_id, category_id, TRUE,
+ callbackMoveInventory,
+ (void*)data);
+ if (!success)
+ {
+ delete data;
+ data = NULL;
+
+ gViewerWindow->alertXml("OpenObjectCannotCopy");
+ }
+}
+
+// static
+void LLFloaterOpenObject::callbackMoveInventory(S32 result, void* data)
+{
+ LLCatAndWear* cat = (LLCatAndWear*)data;
+
+ if (result == 0)
+ {
+ LLInventoryView::showAgentInventory();
+ LLInventoryView* view = LLInventoryView::getActiveInventory();
+ if (view)
+ {
+ view->getPanel()->setSelection(cat->mCatID, TAKE_FOCUS_NO);
+ }
+ }
+
+ delete cat;
+}
+
+
+// static
+void LLFloaterOpenObject::onClickMoveToInventory(void* data)
+{
+ LLFloaterOpenObject* self = (LLFloaterOpenObject*)data;
+ moveToInventory(false);
+ self->close();
+}
+
+// static
+void LLFloaterOpenObject::onClickMoveAndWear(void* data)
+{
+ LLFloaterOpenObject* self = (LLFloaterOpenObject*)data;
+ moveToInventory(true);
+ self->close();
+}
+
+//static
+void* LLFloaterOpenObject::createPanelInventory(void* data)
+{
+ LLFloaterOpenObject* floater = (LLFloaterOpenObject*)data;
+ floater->mPanelInventory = new LLPanelInventory("Object Contents", LLRect());
+ return floater->mPanelInventory;
+}