SL-19109 Turn LLSidepanelItemInfo into a normal panel
parent
25b42dd190
commit
13a65319e0
|
|
@ -955,20 +955,13 @@ LLFloaterItemProperties::~LLFloaterItemProperties()
|
|||
|
||||
BOOL LLFloaterItemProperties::postBuild()
|
||||
{
|
||||
// On the standalone properties floater, we have no need for a back button...
|
||||
LLSidepanelInventorySubpanel* panel = findChild<LLSidepanelInventorySubpanel>("sidepanel");
|
||||
if (panel)
|
||||
{
|
||||
LLButton* back_btn = panel->getChild<LLButton>("back_btn");
|
||||
back_btn->setVisible(FALSE);
|
||||
}
|
||||
return LLFloater::postBuild();
|
||||
}
|
||||
|
||||
void LLFloaterItemProperties::onOpen(const LLSD& key)
|
||||
{
|
||||
// Tell the panel which item it needs to visualize
|
||||
LLSidepanelInventorySubpanel* panel = findChild<LLSidepanelInventorySubpanel>("sidepanel");
|
||||
LLPanel* panel = findChild<LLPanel>("sidepanel");
|
||||
|
||||
LLSidepanelItemInfo* item_panel = dynamic_cast<LLSidepanelItemInfo*>(panel);
|
||||
if (item_panel)
|
||||
|
|
@ -978,6 +971,7 @@ void LLFloaterItemProperties::onOpen(const LLSD& key)
|
|||
{
|
||||
item_panel->setObjectID(key["object"].asUUID());
|
||||
}
|
||||
item_panel->setParentFloater(this);
|
||||
}
|
||||
|
||||
LLSidepanelTaskInfo* task_panel = dynamic_cast<LLSidepanelTaskInfo*>(panel);
|
||||
|
|
|
|||
|
|
@ -32,8 +32,9 @@
|
|||
#include "llagent.h"
|
||||
#include "llavataractions.h"
|
||||
#include "llbutton.h"
|
||||
#include "llcallbacklist.h"
|
||||
#include "llcombobox.h"
|
||||
#include "llfloaterreg.h"
|
||||
#include "llfloater.h"
|
||||
#include "llgroupactions.h"
|
||||
#include "llinventorydefines.h"
|
||||
#include "llinventorymodel.h"
|
||||
|
|
@ -72,49 +73,6 @@ private:
|
|||
S32 mId;
|
||||
};
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// Class LLItemPropertiesObserver
|
||||
//
|
||||
// Helper class to watch for changes to the item.
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
class LLItemPropertiesObserver : public LLInventoryObserver
|
||||
{
|
||||
public:
|
||||
LLItemPropertiesObserver(LLSidepanelItemInfo* floater)
|
||||
: mFloater(floater)
|
||||
{
|
||||
gInventory.addObserver(this);
|
||||
}
|
||||
virtual ~LLItemPropertiesObserver()
|
||||
{
|
||||
gInventory.removeObserver(this);
|
||||
}
|
||||
virtual void changed(U32 mask);
|
||||
private:
|
||||
LLSidepanelItemInfo* mFloater; // Not a handle because LLSidepanelItemInfo is managing LLItemPropertiesObserver
|
||||
};
|
||||
|
||||
void LLItemPropertiesObserver::changed(U32 mask)
|
||||
{
|
||||
const std::set<LLUUID>& mChangedItemIDs = gInventory.getChangedIDs();
|
||||
std::set<LLUUID>::const_iterator it;
|
||||
|
||||
const LLUUID& item_id = mFloater->getItemID();
|
||||
|
||||
for (it = mChangedItemIDs.begin(); it != mChangedItemIDs.end(); it++)
|
||||
{
|
||||
// set dirty for 'item profile panel' only if changed item is the item for which 'item profile panel' is shown (STORM-288)
|
||||
if (*it == item_id)
|
||||
{
|
||||
// if there's a change we're interested in.
|
||||
if((mask & (LLInventoryObserver::LABEL | LLInventoryObserver::INTERNAL | LLInventoryObserver::REMOVE)) != 0)
|
||||
{
|
||||
mFloater->dirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// Class LLObjectInventoryObserver
|
||||
//
|
||||
|
|
@ -158,19 +116,22 @@ static LLPanelInjector<LLSidepanelItemInfo> t_item_info("sidepanel_item_info");
|
|||
|
||||
// Default constructor
|
||||
LLSidepanelItemInfo::LLSidepanelItemInfo(const LLPanel::Params& p)
|
||||
: LLSidepanelInventorySubpanel(p)
|
||||
: LLPanel(p)
|
||||
, mItemID(LLUUID::null)
|
||||
, mObjectInventoryObserver(NULL)
|
||||
, mUpdatePendingId(-1)
|
||||
, mIsDirty(false) /*Not ready*/
|
||||
, mParentFloater(NULL)
|
||||
{
|
||||
mPropertiesObserver = new LLItemPropertiesObserver(this);
|
||||
gInventory.addObserver(this);
|
||||
gIdleCallbacks.addFunction(&LLSidepanelItemInfo::onIdle, (void*)this);
|
||||
}
|
||||
|
||||
// Destroys the object
|
||||
LLSidepanelItemInfo::~LLSidepanelItemInfo()
|
||||
{
|
||||
delete mPropertiesObserver;
|
||||
mPropertiesObserver = NULL;
|
||||
gInventory.removeObserver(this);
|
||||
gIdleCallbacks.deleteFunction(&LLSidepanelItemInfo::onIdle, (void*)this);
|
||||
|
||||
stopObjectInventoryObserver();
|
||||
}
|
||||
|
|
@ -178,8 +139,6 @@ LLSidepanelItemInfo::~LLSidepanelItemInfo()
|
|||
// virtual
|
||||
BOOL LLSidepanelItemInfo::postBuild()
|
||||
{
|
||||
LLSidepanelInventorySubpanel::postBuild();
|
||||
|
||||
getChild<LLLineEditor>("LabelItemName")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
|
||||
getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitName,this));
|
||||
getChild<LLLineEditor>("LabelItemDesc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
|
||||
|
|
@ -226,6 +185,12 @@ void LLSidepanelItemInfo::setItemID(const LLUUID& item_id)
|
|||
mItemID = item_id;
|
||||
mUpdatePendingId = -1;
|
||||
}
|
||||
dirty();
|
||||
}
|
||||
|
||||
void LLSidepanelItemInfo::setParentFloater(LLFloater* parent)
|
||||
{
|
||||
mParentFloater = parent;
|
||||
}
|
||||
|
||||
const LLUUID& LLSidepanelItemInfo::getObjectID() const
|
||||
|
|
@ -249,12 +214,11 @@ void LLSidepanelItemInfo::onUpdateCallback(const LLUUID& item_id, S32 received_u
|
|||
|
||||
void LLSidepanelItemInfo::reset()
|
||||
{
|
||||
LLSidepanelInventorySubpanel::reset();
|
||||
|
||||
mObjectID = LLUUID::null;
|
||||
mItemID = LLUUID::null;
|
||||
|
||||
stopObjectInventoryObserver();
|
||||
dirty();
|
||||
}
|
||||
|
||||
void LLSidepanelItemInfo::refresh()
|
||||
|
|
@ -263,45 +227,8 @@ void LLSidepanelItemInfo::refresh()
|
|||
if(item)
|
||||
{
|
||||
refreshFromItem(item);
|
||||
updateVerbs();
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (getIsEditing())
|
||||
{
|
||||
setIsEditing(FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
if (!getIsEditing())
|
||||
{
|
||||
const std::string no_item_names[]={
|
||||
"LabelItemName",
|
||||
"LabelItemDesc",
|
||||
"LabelCreatorName",
|
||||
"LabelOwnerName"
|
||||
};
|
||||
|
||||
for(size_t t=0; t<LL_ARRAY_SIZE(no_item_names); ++t)
|
||||
{
|
||||
getChildView(no_item_names[t])->setEnabled(false);
|
||||
}
|
||||
|
||||
setPropertiesFieldsEnabled(false);
|
||||
|
||||
const std::string hide_names[]={
|
||||
"BaseMaskDebug",
|
||||
"OwnerMaskDebug",
|
||||
"GroupMaskDebug",
|
||||
"EveryoneMaskDebug",
|
||||
"NextMaskDebug"
|
||||
};
|
||||
for(size_t t=0; t<LL_ARRAY_SIZE(hide_names); ++t)
|
||||
{
|
||||
getChildView(hide_names[t])->setVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
if (!item)
|
||||
{
|
||||
|
|
@ -314,8 +241,12 @@ void LLSidepanelItemInfo::refresh()
|
|||
getChildView(no_edit_mode_names[t])->setEnabled(false);
|
||||
}
|
||||
}
|
||||
|
||||
updateVerbs();
|
||||
|
||||
if (mParentFloater)
|
||||
{
|
||||
// if we failed to get item, it likely no longer exists
|
||||
mParentFloater->closeFloater();
|
||||
}
|
||||
}
|
||||
|
||||
void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
|
||||
|
|
@ -731,6 +662,48 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
|
|||
}
|
||||
}
|
||||
|
||||
void LLSidepanelItemInfo::changed(U32 mask)
|
||||
{
|
||||
const LLUUID& item_id = getItemID();
|
||||
if (getObjectID().notNull() || item_id.isNull())
|
||||
{
|
||||
// Tasl inventory or not set up yet
|
||||
return;
|
||||
}
|
||||
|
||||
const std::set<LLUUID>& mChangedItemIDs = gInventory.getChangedIDs();
|
||||
std::set<LLUUID>::const_iterator it;
|
||||
|
||||
for (it = mChangedItemIDs.begin(); it != mChangedItemIDs.end(); it++)
|
||||
{
|
||||
// set dirty for 'item profile panel' only if changed item is the item for which 'item profile panel' is shown (STORM-288)
|
||||
if (*it == item_id)
|
||||
{
|
||||
// if there's a change we're interested in.
|
||||
if((mask & (LLInventoryObserver::LABEL | LLInventoryObserver::INTERNAL | LLInventoryObserver::REMOVE)) != 0)
|
||||
{
|
||||
dirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLSidepanelItemInfo::dirty()
|
||||
{
|
||||
mIsDirty = true;
|
||||
}
|
||||
|
||||
// static
|
||||
void LLSidepanelItemInfo::onIdle( void* user_data )
|
||||
{
|
||||
LLSidepanelItemInfo* self = reinterpret_cast<LLSidepanelItemInfo*>(user_data);
|
||||
|
||||
if( self->mIsDirty )
|
||||
{
|
||||
self->refresh();
|
||||
self->mIsDirty = false;
|
||||
}
|
||||
}
|
||||
|
||||
void LLSidepanelItemInfo::setAssociatedExperience( LLHandle<LLSidepanelItemInfo> hInfo, const LLSD& experience )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -27,7 +27,8 @@
|
|||
#ifndef LL_LLSIDEPANELITEMINFO_H
|
||||
#define LL_LLSIDEPANELITEMINFO_H
|
||||
|
||||
#include "llsidepanelinventorysubpanel.h"
|
||||
#include "llinventoryobserver.h"
|
||||
#include "llpanel.h"
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// Class LLSidepanelItemInfo
|
||||
|
|
@ -35,34 +36,40 @@
|
|||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
class LLButton;
|
||||
class LLFloater;
|
||||
class LLViewerInventoryItem;
|
||||
class LLItemPropertiesObserver;
|
||||
class LLObjectInventoryObserver;
|
||||
class LLViewerObject;
|
||||
class LLPermissions;
|
||||
|
||||
class LLSidepanelItemInfo : public LLSidepanelInventorySubpanel
|
||||
class LLSidepanelItemInfo : public LLPanel, public LLInventoryObserver
|
||||
{
|
||||
public:
|
||||
LLSidepanelItemInfo(const LLPanel::Params& p = getDefaultParams());
|
||||
virtual ~LLSidepanelItemInfo();
|
||||
|
||||
/*virtual*/ BOOL postBuild();
|
||||
/*virtual*/ BOOL postBuild() override;
|
||||
/*virtual*/ void reset();
|
||||
|
||||
void setObjectID(const LLUUID& object_id);
|
||||
void setItemID(const LLUUID& item_id);
|
||||
void setEditMode(BOOL edit);
|
||||
void setParentFloater(LLFloater* parent); // For simplicity
|
||||
|
||||
const LLUUID& getObjectID() const;
|
||||
const LLUUID& getItemID() const;
|
||||
|
||||
// if received update and item id (from callback) matches internal ones, update UI
|
||||
void onUpdateCallback(const LLUUID& item_id, S32 received_update_id);
|
||||
|
||||
void changed(U32 mask) override;
|
||||
void dirty();
|
||||
|
||||
static void onIdle( void* user_data );
|
||||
|
||||
protected:
|
||||
/*virtual*/ void refresh();
|
||||
/*virtual*/ void save();
|
||||
void refresh() override;
|
||||
void save();
|
||||
|
||||
LLViewerInventoryItem* findItem() const;
|
||||
LLViewerObject* findObject() const;
|
||||
|
|
@ -78,11 +85,12 @@ private:
|
|||
|
||||
LLUUID mItemID; // inventory UUID for the inventory item.
|
||||
LLUUID mObjectID; // in-world task UUID, or null if in agent inventory.
|
||||
LLItemPropertiesObserver* mPropertiesObserver; // for syncing changes to item
|
||||
LLObjectInventoryObserver* mObjectInventoryObserver; // for syncing changes to items inside an object
|
||||
|
||||
// We can send multiple properties updates simultaneously, make sure only last response counts and there won't be a race condition.
|
||||
S32 mUpdatePendingId;
|
||||
bool mIsDirty; // item properties need to be updated
|
||||
LLFloater* mParentFloater;
|
||||
|
||||
//
|
||||
// UI Elements
|
||||
|
|
|
|||
|
|
@ -53,25 +53,12 @@
|
|||
name="IconLocked"
|
||||
top="8"
|
||||
width="18" />
|
||||
<button
|
||||
follows="top|left"
|
||||
height="24"
|
||||
image_hover_unselected="BackButton_Over"
|
||||
image_pressed="BackButton_Press"
|
||||
image_unselected="BackButton_Off"
|
||||
layout="topleft"
|
||||
left="12"
|
||||
name="back_btn"
|
||||
tab_stop="false"
|
||||
top="2"
|
||||
width="30"
|
||||
use_draw_context_alpha="false" />
|
||||
<text
|
||||
follows="top|left|right"
|
||||
font="SansSerifHugeBold"
|
||||
height="26"
|
||||
layout="topleft"
|
||||
left_pad="3"
|
||||
left="45"
|
||||
name="title"
|
||||
text_color="LtGray"
|
||||
top="2"
|
||||
|
|
@ -528,21 +515,4 @@
|
|||
</text>
|
||||
</panel>
|
||||
</scroll_container>
|
||||
<panel
|
||||
height="30"
|
||||
layout="topleft"
|
||||
name="button_panel"
|
||||
left="5"
|
||||
top_pad="0"
|
||||
width="313"
|
||||
follows="top|right|left">
|
||||
<button
|
||||
follows="top|right"
|
||||
height="23"
|
||||
label="Cancel"
|
||||
layout="topleft"
|
||||
name="cancel_btn"
|
||||
right="-1"
|
||||
width="100" />
|
||||
</panel>
|
||||
</panel>
|
||||
|
|
|
|||
Loading…
Reference in New Issue