Skip to content
Snippets Groups Projects
Commit b7d020e7 authored by Loren Shih's avatar Loren Shih
Browse files

EXT-2168 : Rename ObjectInfo to ItemInfo

Renaming for better clarity as to what llsidepaneliteminfo does.
Also fixed an error where Edit was not enabling the panel.
Also did some superficial cleanup and reorganization of llsidepanel- files.

--HG--
branch : avatar-pipeline
parent e8797528
Branches
No related tags found
No related merge requests found
......@@ -370,7 +370,7 @@ set(viewer_SOURCE_FILES
llsearchhistory.cpp
llselectmgr.cpp
llsidepanelinventory.cpp
llsidepanelobjectinfo.cpp
llsidepaneliteminfo.cpp
llsidetray.cpp
llsidetraypanelcontainer.cpp
llsky.cpp
......@@ -855,7 +855,7 @@ set(viewer_HEADER_FILES
llsearchhistory.h
llselectmgr.h
llsidepanelinventory.h
llsidepanelobjectinfo.h
llsidepaneliteminfo.h
llsidetray.h
llsidetraypanelcontainer.h
llsky.h
......
......@@ -37,21 +37,14 @@
#include "llinventorybridge.h"
#include "llinventorypanel.h"
#include "llpanelmaininventory.h"
#include "llsidepanelobjectinfo.h"
#include "llsidepaneliteminfo.h"
#include "lltabcontainer.h"
static const S32 LANDMARK_FOLDERS_MENU_WIDTH = 250;
static const std::string AGENT_INFO_TYPE = "agent";
static const std::string CREATE_LANDMARK_INFO_TYPE = "create_landmark";
static const std::string LANDMARK_INFO_TYPE = "landmark";
static const std::string REMOTE_PLACE_INFO_TYPE = "remote_place";
static const std::string TELEPORT_HISTORY_INFO_TYPE = "teleport_history";
static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_inventory");
LLSidepanelInventory::LLSidepanelInventory()
: LLPanel(),
mSidepanelObjectInfo(NULL)
mSidepanelItemInfo(NULL)
{
//LLUICtrlFactory::getInstance()->buildPanel(this, "panel_inventory.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder()
......@@ -85,12 +78,12 @@ BOOL LLSidepanelInventory::postBuild()
mOverflowBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onOverflowButtonClicked, this));
mTabContainer = getChild<LLTabContainer>("Inventory Tabs");
mSidepanelObjectInfo = getChild<LLSidepanelObjectInfo>("sidepanel_object_info");
mSidepanelItemInfo = getChild<LLSidepanelItemInfo>("sidepanel_item_info");
mPanelMainInventory = getChild<LLPanelMainInventory>("panel_main_inventory");
mPanelMainInventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2));
LLButton* back_btn = mSidepanelObjectInfo->getChild<LLButton>("back_btn");
LLButton* back_btn = mSidepanelItemInfo->getChild<LLButton>("back_btn");
back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this));
return TRUE;
......@@ -101,19 +94,19 @@ void LLSidepanelInventory::onOpen(const LLSD& key)
if(key.size() == 0)
return;
mSidepanelObjectInfo->reset();
mSidepanelItemInfo->reset();
if (key.has("id"))
{
mSidepanelObjectInfo->setItemID(key["id"].asUUID());
mSidepanelItemInfo->setItemID(key["id"].asUUID());
}
if (key.has("object"))
{
mSidepanelObjectInfo->setObjectID(key["object"].asUUID());
mSidepanelItemInfo->setObjectID(key["object"].asUUID());
}
toggleObjectInfoPanel(TRUE);
toggleItemInfoPanel(TRUE);
}
void LLSidepanelInventory::onInfoButtonClicked()
......@@ -121,9 +114,9 @@ void LLSidepanelInventory::onInfoButtonClicked()
LLInventoryItem *item = getSelectedItem();
if (item)
{
mSidepanelObjectInfo->reset();
mSidepanelObjectInfo->setItemID(item->getUUID());
toggleObjectInfoPanel(TRUE);
mSidepanelItemInfo->reset();
mSidepanelItemInfo->setItemID(item->getUUID());
toggleItemInfoPanel(TRUE);
}
}
......@@ -164,7 +157,7 @@ void LLSidepanelInventory::onOverflowButtonClicked()
void LLSidepanelInventory::onBackButtonClicked()
{
toggleObjectInfoPanel(FALSE);
toggleItemInfoPanel(FALSE);
updateVerbs();
}
......@@ -173,19 +166,19 @@ void LLSidepanelInventory::onSelectionChange(const std::deque<LLFolderViewItem*>
updateVerbs();
}
void LLSidepanelInventory::toggleObjectInfoPanel(BOOL visible)
void LLSidepanelInventory::toggleItemInfoPanel(BOOL visible)
{
mSidepanelObjectInfo->setVisible(visible);
mSidepanelItemInfo->setVisible(visible);
mTabContainer->setVisible(!visible);
if (visible)
{
mSidepanelObjectInfo->reset();
mSidepanelObjectInfo->setEditMode(FALSE);
mSidepanelItemInfo->dirty();
mSidepanelItemInfo->setEditMode(FALSE);
LLRect rect = getRect();
LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom);
mSidepanelObjectInfo->reshape(new_rect.getWidth(),new_rect.getHeight());
mSidepanelItemInfo->reshape(new_rect.getWidth(),new_rect.getHeight());
}
}
......
......@@ -35,7 +35,7 @@
#include "llpanel.h"
class LLInventoryItem;
class LLSidepanelObjectInfo;
class LLSidepanelItemInfo;
class LLTabContainer;
class LLPanelMainInventory;
class LLFolderViewItem;
......@@ -50,17 +50,19 @@ class LLSidepanelInventory : public LLPanel
/*virtual*/ void onOpen(const LLSD& key);
protected:
// Tracks highlighted (selected) item in inventory panel.
LLInventoryItem *getSelectedItem();
void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
void onTabSelected();
void toggleObjectInfoPanel(BOOL visible);
void updateVerbs();
// "wear", "teleport", etc.
void performActionOnSelection(const std::string &action);
LLTabContainer* mTabContainer;
LLSidepanelObjectInfo* mSidepanelObjectInfo;
LLPanelMainInventory* mPanelMainInventory;
void toggleItemInfoPanel(BOOL visible);
void updateVerbs();
//
// UI Elements
//
protected:
void onInfoButtonClicked();
void onShareButtonClicked();
void onWearButtonClicked();
......@@ -68,13 +70,17 @@ class LLSidepanelInventory : public LLPanel
void onTeleportButtonClicked();
void onOverflowButtonClicked();
void onBackButtonClicked();
private:
LLButton* mInfoBtn;
LLButton* mShareBtn;
LLButton* mWearBtn;
LLButton* mPlayBtn;
LLButton* mTeleportBtn;
LLButton* mOverflowBtn;
LLTabContainer* mTabContainer;
LLSidepanelItemInfo* mSidepanelItemInfo;
LLPanelMainInventory* mPanelMainInventory;
};
#endif //LL_LLSIDEPANELINVENTORY_H
/**
* @file llsidepaneliteminfo.cpp
* @brief A floater which shows an inventory item's properties.
*
* $LicenseInfo:firstyear=2002&license=viewergpl$
*
* Copyright (c) 2002-2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "llsidepaneliteminfo.h"
#include "roles_constants.h"
#include "llagent.h"
#include "llavataractions.h"
#include "llbutton.h"
#include "llfloaterreg.h"
#include "llgroupactions.h"
#include "llinventorymodel.h"
#include "lllineeditor.h"
#include "llradiogroup.h"
#include "llviewercontrol.h"
#include "llviewerinventory.h"
#include "llviewerobjectlist.h"
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 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;
};
void LLItemPropertiesObserver::changed(U32 mask)
{
// if there's a change we're interested in.
if((mask & (LLInventoryObserver::LABEL | LLInventoryObserver::INTERNAL | LLInventoryObserver::REMOVE)) != 0)
{
mFloater->dirty();
}
}
///----------------------------------------------------------------------------
/// Class LLSidepanelItemInfo
///----------------------------------------------------------------------------
static LLRegisterPanelClassWrapper<LLSidepanelItemInfo> t_item_info("sidepanel_item_info");
// Default constructor
LLSidepanelItemInfo::LLSidepanelItemInfo()
: LLPanel(),
mItemID(LLUUID::null),
mDirty(TRUE),
mEditMode(FALSE)
{
mPropertiesObserver = new LLItemPropertiesObserver(this);
//LLUICtrlFactory::getInstance()->buildFloater(this,"floater_inventory_item_properties.xml");
}
// Destroys the object
LLSidepanelItemInfo::~LLSidepanelItemInfo()
{
delete mPropertiesObserver;
mPropertiesObserver = NULL;
}
// virtual
BOOL LLSidepanelItemInfo::postBuild()
{
mEditBtn = getChild<LLButton>("edit_btn");
mEditBtn->setClickedCallback(boost::bind(&LLSidepanelItemInfo::onEditButtonClicked, this));
mSaveBtn = getChild<LLButton>("save_btn");
mSaveBtn->setClickedCallback(boost::bind(&LLSidepanelItemInfo::onSaveButtonClicked, this));
mCancelBtn = getChild<LLButton>("cancel_btn");
mCancelBtn->setClickedCallback(boost::bind(&LLSidepanelItemInfo::onCancelButtonClicked, this));
// build the UI
// item name & description
childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidatePrintableNotPipe);
//getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitName,this));
childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidatePrintableNotPipe);
//getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this));
// Creator information
getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickCreator,this));
// owner information
getChild<LLUICtrl>("BtnOwner")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickOwner,this));
// acquired date
// owner permissions
// Permissions debug text
// group permissions
// getChild<LLUICtrl>("CheckShareWithGroup")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this));
// everyone permissions
// getChild<LLUICtrl>("CheckEveryoneCopy")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this));
// next owner permissions
// getChild<LLUICtrl>("CheckNextOwnerModify")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this));
// getChild<LLUICtrl>("CheckNextOwnerCopy")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this));
// getChild<LLUICtrl>("CheckNextOwnerTransfer")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this));
// Mark for sale or not, and sale info
// getChild<LLUICtrl>("CheckPurchase")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleInfo, this));
// getChild<LLUICtrl>("RadioSaleType")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleType, this));
// "Price" label for edit
// getChild<LLUICtrl>("Edit Cost")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleInfo, this));
// The UI has been built, now fill in all the values
refresh();
return TRUE;
}
void LLSidepanelItemInfo::setVisible(BOOL visible)
{
if (visible)
{
mDirty = TRUE;
}
LLPanel::setVisible(visible);
}
void LLSidepanelItemInfo::setObjectID(const LLUUID& object_id)
{
mObjectID = object_id;
}
void LLSidepanelItemInfo::setItemID(const LLUUID& item_id)
{
mItemID = item_id;
}
void LLSidepanelItemInfo::setEditMode(BOOL edit)
{
mEditMode = edit;
mDirty = TRUE;
}
void LLSidepanelItemInfo::reset()
{
mObjectID = LLUUID::null;
mItemID = LLUUID::null;
mDirty = TRUE;
}
void LLSidepanelItemInfo::refresh()
{
LLInventoryItem* item = findItem();
if(item)
{
refreshFromItem(item);
updateVerbs();
}
if (!mEditMode || !item)
{
//RN: it is possible that the container object is in the middle of an inventory refresh
// causing findItem() to fail, so just temporarily disable everything
mDirty = TRUE;
const std::string no_item_names[]={
"LabelItemName",
"LabelItemDesc",
"LabelCreatorName",
"LabelOwnerName",
"CheckOwnerModify",
"CheckOwnerCopy",
"CheckOwnerTransfer",
"CheckShareWithGroup",
"CheckEveryoneCopy",
"CheckNextOwnerModify",
"CheckNextOwnerCopy",
"CheckNextOwnerTransfer",
"CheckPurchase",
"RadioSaleType",
"Edit Cost"
};
for(size_t t=0; t<LL_ARRAY_SIZE(no_item_names); ++t)
{
childSetEnabled(no_item_names[t],false);
}
const std::string hide_names[]={
"BaseMaskDebug",
"OwnerMaskDebug",
"GroupMaskDebug",
"EveryoneMaskDebug",
"NextMaskDebug"
};
for(size_t t=0; t<LL_ARRAY_SIZE(hide_names); ++t)
{
childSetVisible(hide_names[t],false);
}
}
if (!item)
{
const std::string no_edit_mode_names[]={
"BtnCreator",
"BtnOwner",
};
for(size_t t=0; t<LL_ARRAY_SIZE(no_edit_mode_names); ++t)
{
childSetEnabled(no_edit_mode_names[t],false);
}
}
updateVerbs();
}
void LLSidepanelItemInfo::draw()
{
if (mDirty)
{
// RN: clear dirty first because refresh can set dirty to TRUE
mDirty = FALSE;
refresh();
}
LLPanel::draw();
}
void LLSidepanelItemInfo::dirty()
{
mDirty = TRUE;
}
void LLSidepanelItemInfo::refreshFromItem(LLInventoryItem* item)
{
////////////////////////
// PERMISSIONS LOOKUP //
////////////////////////
// do not enable the UI for incomplete items.
LLViewerInventoryItem* i = (LLViewerInventoryItem*)item;
BOOL is_complete = i->isComplete();
const BOOL cannot_restrict_permissions = LLInventoryType::cannotRestrictPermissions(i->getInventoryType());
const BOOL is_calling_card = (i->getInventoryType() == LLInventoryType::IT_CALLINGCARD);
const LLPermissions& perm = item->getPermissions();
const BOOL can_agent_manipulate = gAgent.allowOperation(PERM_OWNER, perm,
GP_OBJECT_MANIPULATE);
const BOOL can_agent_sell = gAgent.allowOperation(PERM_OWNER, perm,
GP_OBJECT_SET_SALE) &&
!cannot_restrict_permissions;
const BOOL is_link = i->getIsLinkType();
// You need permission to modify the object to modify an inventory
// item in it.
LLViewerObject* object = NULL;
if(!mObjectID.isNull()) object = gObjectList.findObject(mObjectID);
BOOL is_obj_modify = TRUE;
if(object)
{
is_obj_modify = object->permOwnerModify();
}
//////////////////////
// ITEM NAME & DESC //
//////////////////////
BOOL is_modifiable = gAgent.allowOperation(PERM_MODIFY, perm,
GP_OBJECT_MANIPULATE)
&& is_obj_modify && is_complete;
childSetEnabled("LabelItemNameTitle",TRUE);
childSetEnabled("LabelItemName",is_modifiable && !is_calling_card); // for now, don't allow rename of calling cards
childSetText("LabelItemName",item->getName());
childSetEnabled("LabelItemDescTitle",TRUE);
childSetEnabled("LabelItemDesc",is_modifiable);
childSetVisible("IconLocked",!is_modifiable);
childSetText("LabelItemDesc",item->getDescription());
//////////////////
// CREATOR NAME //
//////////////////
if(!gCacheName) return;
if(!gAgent.getRegion()) return;
if (item->getCreatorUUID().notNull())
{
std::string name;
gCacheName->getFullName(item->getCreatorUUID(), name);
childSetEnabled("BtnCreator",TRUE);
childSetEnabled("LabelCreatorTitle",TRUE);
childSetEnabled("LabelCreatorName",TRUE);
childSetText("LabelCreatorName",name);
}
else
{
childSetEnabled("BtnCreator",FALSE);
childSetEnabled("LabelCreatorTitle",FALSE);
childSetEnabled("LabelCreatorName",FALSE);
childSetText("LabelCreatorName",getString("unknown"));
}
////////////////
// OWNER NAME //
////////////////
if(perm.isOwned())
{
std::string name;
if (perm.isGroupOwned())
{
gCacheName->getGroupName(perm.getGroup(), name);
}
else
{
gCacheName->getFullName(perm.getOwner(), name);
}
childSetEnabled("BtnOwner",TRUE);
childSetEnabled("LabelOwnerTitle",TRUE);
childSetEnabled("LabelOwnerName",TRUE);
childSetText("LabelOwnerName",name);
}
else
{
childSetEnabled("BtnOwner",FALSE);
childSetEnabled("LabelOwnerTitle",FALSE);
childSetEnabled("LabelOwnerName",FALSE);
childSetText("LabelOwnerName",getString("public"));
}
//////////////////
// ACQUIRE DATE //
//////////////////
time_t time_utc = item->getCreationDate();
if (0 == time_utc)
{
childSetText("LabelAcquiredDate",getString("unknown"));
}
else
{
std::string timeStr = getString("acquiredDate");
LLSD substitution;
substitution["datetime"] = (S32) time_utc;
LLStringUtil::format (timeStr, substitution);
childSetText ("LabelAcquiredDate", timeStr);
}
///////////////////////
// OWNER PERMISSIONS //
///////////////////////
if(can_agent_manipulate)
{
childSetText("OwnerLabel",getString("you_can"));
}
else
{
childSetText("OwnerLabel",getString("owner_can"));
}
U32 base_mask = perm.getMaskBase();
U32 owner_mask = perm.getMaskOwner();
U32 group_mask = perm.getMaskGroup();
U32 everyone_mask = perm.getMaskEveryone();
U32 next_owner_mask = perm.getMaskNextOwner();
childSetEnabled("OwnerLabel",TRUE);
childSetEnabled("CheckOwnerModify",FALSE);
childSetValue("CheckOwnerModify",LLSD((BOOL)(owner_mask & PERM_MODIFY)));
childSetEnabled("CheckOwnerCopy",FALSE);
childSetValue("CheckOwnerCopy",LLSD((BOOL)(owner_mask & PERM_COPY)));
childSetEnabled("CheckOwnerTransfer",FALSE);
childSetValue("CheckOwnerTransfer",LLSD((BOOL)(owner_mask & PERM_TRANSFER)));
///////////////////////
// DEBUG PERMISSIONS //
///////////////////////
if( gSavedSettings.getBOOL("DebugPermissions") )
{
BOOL slam_perm = FALSE;
BOOL overwrite_group = FALSE;
BOOL overwrite_everyone = FALSE;
if (item->getType() == LLAssetType::AT_OBJECT)
{
U32 flags = item->getFlags();
slam_perm = flags & LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM;
overwrite_everyone = flags & LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE;
overwrite_group = flags & LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP;
}
std::string perm_string;
perm_string = "B: ";
perm_string += mask_to_string(base_mask);
childSetText("BaseMaskDebug",perm_string);
childSetVisible("BaseMaskDebug",TRUE);
perm_string = "O: ";
perm_string += mask_to_string(owner_mask);
childSetText("OwnerMaskDebug",perm_string);
childSetVisible("OwnerMaskDebug",TRUE);
perm_string = "G";
perm_string += overwrite_group ? "*: " : ": ";
perm_string += mask_to_string(group_mask);
childSetText("GroupMaskDebug",perm_string);
childSetVisible("GroupMaskDebug",TRUE);
perm_string = "E";
perm_string += overwrite_everyone ? "*: " : ": ";
perm_string += mask_to_string(everyone_mask);
childSetText("EveryoneMaskDebug",perm_string);
childSetVisible("EveryoneMaskDebug",TRUE);
perm_string = "N";
perm_string += slam_perm ? "*: " : ": ";
perm_string += mask_to_string(next_owner_mask);
childSetText("NextMaskDebug",perm_string);
childSetVisible("NextMaskDebug",TRUE);
}
else
{
childSetVisible("BaseMaskDebug",FALSE);
childSetVisible("OwnerMaskDebug",FALSE);
childSetVisible("GroupMaskDebug",FALSE);
childSetVisible("EveryoneMaskDebug",FALSE);
childSetVisible("NextMaskDebug",FALSE);
}
/////////////
// SHARING //
/////////////
// Check for ability to change values.
if (is_link || cannot_restrict_permissions)
{
childSetEnabled("CheckShareWithGroup",FALSE);
childSetEnabled("CheckEveryoneCopy",FALSE);
}
else if (is_obj_modify && can_agent_manipulate)
{
childSetEnabled("CheckShareWithGroup",TRUE);
childSetEnabled("CheckEveryoneCopy",(owner_mask & PERM_COPY) && (owner_mask & PERM_TRANSFER));
}
else
{
childSetEnabled("CheckShareWithGroup",FALSE);
childSetEnabled("CheckEveryoneCopy",FALSE);
}
// Set values.
BOOL is_group_copy = (group_mask & PERM_COPY) ? TRUE : FALSE;
BOOL is_group_modify = (group_mask & PERM_MODIFY) ? TRUE : FALSE;
BOOL is_group_move = (group_mask & PERM_MOVE) ? TRUE : FALSE;
if (is_group_copy && is_group_modify && is_group_move)
{
childSetValue("CheckShareWithGroup",LLSD((BOOL)TRUE));
LLCheckBoxCtrl* ctl = getChild<LLCheckBoxCtrl>("CheckShareWithGroup");
if(ctl)
{
ctl->setTentative(FALSE);
}
}
else if (!is_group_copy && !is_group_modify && !is_group_move)
{
childSetValue("CheckShareWithGroup",LLSD((BOOL)FALSE));
LLCheckBoxCtrl* ctl = getChild<LLCheckBoxCtrl>("CheckShareWithGroup");
if(ctl)
{
ctl->setTentative(FALSE);
}
}
else
{
LLCheckBoxCtrl* ctl = getChild<LLCheckBoxCtrl>("CheckShareWithGroup");
if(ctl)
{
ctl->setTentative(TRUE);
ctl->set(TRUE);
}
}
childSetValue("CheckEveryoneCopy",LLSD((BOOL)(everyone_mask & PERM_COPY)));
///////////////
// SALE INFO //
///////////////
const LLSaleInfo& sale_info = item->getSaleInfo();
BOOL is_for_sale = sale_info.isForSale();
// Check for ability to change values.
if (is_obj_modify && can_agent_sell
&& gAgent.allowOperation(PERM_TRANSFER, perm, GP_OBJECT_MANIPULATE))
{
childSetEnabled("SaleLabel",is_complete);
childSetEnabled("CheckPurchase",is_complete);
childSetEnabled("NextOwnerLabel",TRUE);
childSetEnabled("CheckNextOwnerModify",(base_mask & PERM_MODIFY) && !cannot_restrict_permissions);
childSetEnabled("CheckNextOwnerCopy",(base_mask & PERM_COPY) && !cannot_restrict_permissions);
childSetEnabled("CheckNextOwnerTransfer",(next_owner_mask & PERM_COPY) && !cannot_restrict_permissions);
childSetEnabled("RadioSaleType",is_complete && is_for_sale);
childSetEnabled("TextPrice",is_complete && is_for_sale);
childSetEnabled("Edit Cost",is_complete && is_for_sale);
}
else
{
childSetEnabled("SaleLabel",FALSE);
childSetEnabled("CheckPurchase",FALSE);
childSetEnabled("NextOwnerLabel",FALSE);
childSetEnabled("CheckNextOwnerModify",FALSE);
childSetEnabled("CheckNextOwnerCopy",FALSE);
childSetEnabled("CheckNextOwnerTransfer",FALSE);
childSetEnabled("RadioSaleType",FALSE);
childSetEnabled("TextPrice",FALSE);
childSetEnabled("Edit Cost",FALSE);
}
// Set values.
childSetValue("CheckPurchase", is_for_sale);
childSetEnabled("combobox sale copy", is_for_sale);
childSetEnabled("Edit Cost", is_for_sale);
childSetValue("CheckNextOwnerModify",LLSD(BOOL(next_owner_mask & PERM_MODIFY)));
childSetValue("CheckNextOwnerCopy",LLSD(BOOL(next_owner_mask & PERM_COPY)));
childSetValue("CheckNextOwnerTransfer",LLSD(BOOL(next_owner_mask & PERM_TRANSFER)));
LLRadioGroup* radioSaleType = getChild<LLRadioGroup>("RadioSaleType");
if (is_for_sale)
{
radioSaleType->setSelectedIndex((S32)sale_info.getSaleType() - 1);
S32 numerical_price;
numerical_price = sale_info.getSalePrice();
childSetText("Edit Cost",llformat("%d",numerical_price));
}
else
{
radioSaleType->setSelectedIndex(-1);
childSetText("Edit Cost",llformat("%d",0));
}
}
void LLSidepanelItemInfo::onClickCreator()
{
LLInventoryItem* item = findItem();
if(!item) return;
if(!item->getCreatorUUID().isNull())
{
LLAvatarActions::showProfile(item->getCreatorUUID());
}
}
// static
void LLSidepanelItemInfo::onClickOwner()
{
LLInventoryItem* item = findItem();
if(!item) return;
if(item->getPermissions().isGroupOwned())
{
LLGroupActions::show(item->getPermissions().getGroup());
}
else
{
LLAvatarActions::showProfile(item->getPermissions().getOwner());
}
}
// static
void LLSidepanelItemInfo::onCommitName()
{
//llinfos << "LLSidepanelItemInfo::onCommitName()" << llendl;
LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem();
if(!item)
{
return;
}
LLLineEditor* labelItemName = getChild<LLLineEditor>("LabelItemName");
if(labelItemName&&
(item->getName() != labelItemName->getText()) &&
(gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE)) )
{
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
new_item->rename(labelItemName->getText());
if(mObjectID.isNull())
{
new_item->updateServer(FALSE);
gInventory.updateItem(new_item);
gInventory.notifyObservers();
}
else
{
LLViewerObject* object = gObjectList.findObject(mObjectID);
if(object)
{
object->updateInventory(
new_item,
TASK_INVENTORY_ITEM_KEY,
false);
}
}
}
}
void LLSidepanelItemInfo::onCommitDescription()
{
//llinfos << "LLSidepanelItemInfo::onCommitDescription()" << llendl;
LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem();
if(!item) return;
LLLineEditor* labelItemDesc = getChild<LLLineEditor>("LabelItemDesc");
if(!labelItemDesc)
{
return;
}
if((item->getDescription() != labelItemDesc->getText()) &&
(gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE)))
{
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
new_item->setDescription(labelItemDesc->getText());
if(mObjectID.isNull())
{
new_item->updateServer(FALSE);
gInventory.updateItem(new_item);
gInventory.notifyObservers();
}
else
{
LLViewerObject* object = gObjectList.findObject(mObjectID);
if(object)
{
object->updateInventory(
new_item,
TASK_INVENTORY_ITEM_KEY,
false);
}
}
}
}
// static
void LLSidepanelItemInfo::onCommitPermissions()
{
//llinfos << "LLSidepanelItemInfo::onCommitPermissions()" << llendl;
LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem();
if(!item) return;
LLPermissions perm(item->getPermissions());
LLCheckBoxCtrl* CheckShareWithGroup = getChild<LLCheckBoxCtrl>("CheckShareWithGroup");
if(CheckShareWithGroup)
{
perm.setGroupBits(gAgent.getID(), gAgent.getGroupID(),
CheckShareWithGroup->get(),
PERM_MODIFY | PERM_MOVE | PERM_COPY);
}
LLCheckBoxCtrl* CheckEveryoneCopy = getChild<LLCheckBoxCtrl>("CheckEveryoneCopy");
if(CheckEveryoneCopy)
{
perm.setEveryoneBits(gAgent.getID(), gAgent.getGroupID(),
CheckEveryoneCopy->get(), PERM_COPY);
}
LLCheckBoxCtrl* CheckNextOwnerModify = getChild<LLCheckBoxCtrl>("CheckNextOwnerModify");
if(CheckNextOwnerModify)
{
perm.setNextOwnerBits(gAgent.getID(), gAgent.getGroupID(),
CheckNextOwnerModify->get(), PERM_MODIFY);
}
LLCheckBoxCtrl* CheckNextOwnerCopy = getChild<LLCheckBoxCtrl>("CheckNextOwnerCopy");
if(CheckNextOwnerCopy)
{
perm.setNextOwnerBits(gAgent.getID(), gAgent.getGroupID(),
CheckNextOwnerCopy->get(), PERM_COPY);
}
LLCheckBoxCtrl* CheckNextOwnerTransfer = getChild<LLCheckBoxCtrl>("CheckNextOwnerTransfer");
if(CheckNextOwnerTransfer)
{
perm.setNextOwnerBits(gAgent.getID(), gAgent.getGroupID(),
CheckNextOwnerTransfer->get(), PERM_TRANSFER);
}
if(perm != item->getPermissions()
&& item->isComplete())
{
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
new_item->setPermissions(perm);
U32 flags = new_item->getFlags();
// If next owner permissions have changed (and this is an object)
// then set the slam permissions flag so that they are applied on rez.
if((perm.getMaskNextOwner()!=item->getPermissions().getMaskNextOwner())
&& (item->getType() == LLAssetType::AT_OBJECT))
{
flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM;
}
// If everyone permissions have changed (and this is an object)
// then set the overwrite everyone permissions flag so they
// are applied on rez.
if ((perm.getMaskEveryone()!=item->getPermissions().getMaskEveryone())
&& (item->getType() == LLAssetType::AT_OBJECT))
{
flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE;
}
// If group permissions have changed (and this is an object)
// then set the overwrite group permissions flag so they
// are applied on rez.
if ((perm.getMaskGroup()!=item->getPermissions().getMaskGroup())
&& (item->getType() == LLAssetType::AT_OBJECT))
{
flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP;
}
new_item->setFlags(flags);
if(mObjectID.isNull())
{
new_item->updateServer(FALSE);
gInventory.updateItem(new_item);
gInventory.notifyObservers();
}
else
{
LLViewerObject* object = gObjectList.findObject(mObjectID);
if(object)
{
object->updateInventory(
new_item,
TASK_INVENTORY_ITEM_KEY,
false);
}
}
}
else
{
// need to make sure we don't just follow the click
refresh();
}
}
// static
void LLSidepanelItemInfo::onCommitSaleInfo()
{
//llinfos << "LLSidepanelItemInfo::onCommitSaleInfo()" << llendl;
updateSaleInfo();
}
// static
void LLSidepanelItemInfo::onCommitSaleType()
{
//llinfos << "LLSidepanelItemInfo::onCommitSaleType()" << llendl;
updateSaleInfo();
}
void LLSidepanelItemInfo::updateSaleInfo()
{
LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem();
if(!item) return;
LLSaleInfo sale_info(item->getSaleInfo());
if(!gAgent.allowOperation(PERM_TRANSFER, item->getPermissions(), GP_OBJECT_SET_SALE))
{
childSetValue("CheckPurchase",LLSD((BOOL)FALSE));
}
if((BOOL)childGetValue("CheckPurchase"))
{
// turn on sale info
LLSaleInfo::EForSale sale_type = LLSaleInfo::FS_COPY;
LLRadioGroup* RadioSaleType = getChild<LLRadioGroup>("RadioSaleType");
if(RadioSaleType)
{
switch (RadioSaleType->getSelectedIndex())
{
case 0:
sale_type = LLSaleInfo::FS_ORIGINAL;
break;
case 1:
sale_type = LLSaleInfo::FS_COPY;
break;
case 2:
sale_type = LLSaleInfo::FS_CONTENTS;
break;
default:
sale_type = LLSaleInfo::FS_COPY;
break;
}
}
if (sale_type == LLSaleInfo::FS_COPY
&& !gAgent.allowOperation(PERM_COPY, item->getPermissions(),
GP_OBJECT_SET_SALE))
{
sale_type = LLSaleInfo::FS_ORIGINAL;
}
S32 price = -1;
price = getChild<LLUICtrl>("Edit Cost")->getValue().asInteger();;
// Invalid data - turn off the sale
if (price < 0)
{
sale_type = LLSaleInfo::FS_NOT;
price = 0;
}
sale_info.setSaleType(sale_type);
sale_info.setSalePrice(price);
}
else
{
sale_info.setSaleType(LLSaleInfo::FS_NOT);
}
if(sale_info != item->getSaleInfo()
&& item->isComplete())
{
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
// Force an update on the sale price at rez
if (item->getType() == LLAssetType::AT_OBJECT)
{
U32 flags = new_item->getFlags();
flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_SALE;
new_item->setFlags(flags);
}
new_item->setSaleInfo(sale_info);
if(mObjectID.isNull())
{
// This is in the agent's inventory.
new_item->updateServer(FALSE);
gInventory.updateItem(new_item);
gInventory.notifyObservers();
}
else
{
// This is in an object's contents.
LLViewerObject* object = gObjectList.findObject(mObjectID);
if(object)
{
object->updateInventory(
new_item,
TASK_INVENTORY_ITEM_KEY,
false);
}
}
}
else
{
// need to make sure we don't just follow the click
refresh();
}
}
LLInventoryItem* LLSidepanelItemInfo::findItem() const
{
LLInventoryItem* item = NULL;
if(mObjectID.isNull())
{
// it is in agent inventory
item = gInventory.getItem(mItemID);
}
else
{
LLViewerObject* object = gObjectList.findObject(mObjectID);
if(object)
{
item = (LLInventoryItem*)object->getInventoryObject(mItemID);
}
}
return item;
}
void LLSidepanelItemInfo::updateVerbs()
{
mEditBtn->setVisible(!mEditMode);
mSaveBtn->setVisible(mEditMode);
mCancelBtn->setVisible(mEditMode);
const LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem();
if (item)
{
const LLPermissions& perm = item->getPermissions();
BOOL is_modifiable = gAgent.allowOperation(PERM_MODIFY, perm,
GP_OBJECT_MANIPULATE);
mEditBtn->setEnabled(is_modifiable);
}
}
void LLSidepanelItemInfo::onEditButtonClicked()
{
setEditMode(TRUE);
refresh();
updateVerbs();
}
void LLSidepanelItemInfo::onSaveButtonClicked()
{
onCommitName();
onCommitDescription();
onCommitPermissions();
onCommitSaleInfo();
onCommitSaleType();
setEditMode(FALSE);
refresh();
updateVerbs();
}
void LLSidepanelItemInfo::onCancelButtonClicked()
{
setEditMode(FALSE);
refresh();
updateVerbs();
}
/**
* @file llsidepaneliteminfo.h
* @brief A panel which shows an inventory item's properties.
*
* $LicenseInfo:firstyear=2002&license=viewergpl$
*
* Copyright (c) 2002-2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
#ifndef LL_LLSIDEPANELITEMINFO_H
#define LL_LLSIDEPANELITEMINFO_H
#include <map>
#include "llmultifloater.h"
#include "lliconctrl.h"
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLSidepanelItemInfo
// Object properties for inventory side panel.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLButton;
class LLInventoryItem;
class LLItemPropertiesObserver;
class LLSidepanelItemInfo : public LLPanel
{
public:
LLSidepanelItemInfo();
virtual ~LLSidepanelItemInfo();
/*virtual*/ BOOL postBuild();
/*virtual*/ void setVisible(BOOL visible);
/*virtual*/ void draw();
void setObjectID(const LLUUID& object_id);
void setItemID(const LLUUID& item_id);
void setEditMode(BOOL edit);
void reset();
void dirty();
protected:
LLInventoryItem* findItem() const;
void refresh();
void refreshFromItem(LLInventoryItem* item);
void updateVerbs();
private:
// The item id of the inventory item in question.
LLUUID mItemID;
// mObjectID will have a value if it is associated with a task in
// the world, and will be == LLUUID::null if it's in the agent
// inventory.
LLUUID mObjectID;
BOOL mDirty;
BOOL mEditMode;
LLItemPropertiesObserver* mPropertiesObserver;
//
// UI Elements
//
protected:
void onEditButtonClicked();
void onSaveButtonClicked();
void onCancelButtonClicked();
void onClickCreator();
void onClickOwner();
void onCommitName();
void onCommitDescription();
void onCommitPermissions();
void onCommitSaleInfo();
void onCommitSaleType();
void updateSaleInfo();
private:
LLButton* mEditBtn;
LLButton* mSaveBtn;
LLButton* mCancelBtn;
};
#endif // LL_LLSIDEPANELITEMINFO_H
......@@ -35,7 +35,7 @@
height="25"
layout="bottomright"
left="0"
help_topic="objects_button_tab"
help_topic="item_button_tab"
name="button_panel"
bottom="0"
width="313">
......@@ -109,14 +109,14 @@
</tab_container>
<panel
class="sidepanel_object_info"
filename="sidepanel_object_info.xml"
class="sidepanel_item_info"
filename="sidepanel_item_info.xml"
follows="all"
height="360"
layout="topleft"
left="0"
help_topic="objects_info_tab"
name="sidepanel_object_info"
help_topic="item_info_tab"
name="sidepanel_item_info"
top="30"
visible="false" />
</panel>
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
auto_tile="true"
height="560"
layout="topleft"
name="item properties"
help_topic="item_properties"
save_rect="true"
title="Inventory Item Properties"
width="325">
<panel.string
name="unknown">
(unknown)
</panel.string>
<panel.string
name="public">
(public)
</panel.string>
<panel.string
name="you_can">
You can:
</panel.string>
<panel.string
name="owner_can">
Owner can:
</panel.string>
<panel.string
name="acquiredDate">
[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
</panel.string>
<icon
follows="top|right"
height="18"
image_name="Lock"
layout="topleft"
right="-50"
mouse_opaque="true"
name="IconLocked"
top="4"
width="18" />
<button
follows="top|right"
height="25"
image_overlay="BackArrow_Off"
layout="topleft"
name="back_btn"
picture_style="true"
right="-5"
tab_stop="false"
top="0"
width="25" />
<tab_container
follows="all"
height="450"
layout="topleft"
left="10"
name="tabs"
tab_min_width="70"
tab_height="0"
tab_position="top"
top_pad="10"
width="313">
<panel
follows="all"
height="500"
label=""
layout="topleft"
left="0"
help_topic="people_nearby_tab"
name="nearby_panel"
top="0"
border="1"
width="313">
<text
type="string"
length="1"
follows="left|top"
height="10"
layout="topleft"
left="5"
name="LabelItemNameTitle"
top="5"
width="78">
Name:
</text>
<line_editor
border_style="line"
border_thickness="1"
follows="left|top|right"
height="16"
layout="topleft"
left_delta="78"
max_length="63"
name="LabelItemName"
top_delta="0"
width="225" />
<text
type="string"
length="1"
follows="left|top"
height="10"
layout="topleft"
left="5"
name="LabelItemDescTitle"
top_delta="20"
width="78">
Description:
</text>
<line_editor
border_style="line"
border_thickness="1"
follows="left|top|right"
height="16"
layout="topleft"
left_delta="78"
max_length="127"
name="LabelItemDesc"
top_delta="0"
width="225" />
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
left="10"
name="LabelCreatorTitle"
top="65"
width="78">
Creator:
</text>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
left_delta="78"
name="LabelCreatorName"
top_delta="0"
width="200">
Nicole Linden
</text>
<button
follows="top|right"
font="SansSerifSmall"
height="16"
label="Profile..."
layout="topleft"
left_delta="144"
name="BtnCreator"
top_delta="0"
width="78" />
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
left="10"
name="LabelOwnerTitle"
top="85"
width="78">
Owner:
</text>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
left_delta="78"
name="LabelOwnerName"
top_delta="0"
width="200">
Thrax Linden
</text>
<button
follows="top|right"
font="SansSerifSmall"
height="16"
label="Profile..."
layout="topleft"
left_delta="144"
name="BtnOwner"
top_delta="0"
width="78" />
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
left="10"
name="LabelAcquiredTitle"
top="105"
width="78">
Acquired:
</text>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
left_delta="78"
name="LabelAcquiredDate"
top_delta="0"
width="252">
Wed May 24 12:50:46 2006
</text>
<text
type="string"
length="1"
follows="left|top"
height="10"
layout="topleft"
left="10"
name="OwnerLabel"
top="125"
width="78">
You:
</text>
<check_box
height="16"
label="Edit"
layout="topleft"
left_pad="5"
name="CheckOwnerModify"
top_delta="0"
width="78" />
<check_box
height="16"
label="Copy"
layout="topleft"
left_delta="0"
name="CheckOwnerCopy"
top_pad="5"
width="88" />
<check_box
height="16"
label="Resell"
layout="topleft"
left_delta="0"
name="CheckOwnerTransfer"
top_pad="5"
width="106" />
<text
type="string"
length="1"
follows="left|top"
height="10"
layout="topleft"
left="10"
name="AnyoneLabel"
top_pad="5"
width="78">
Anyone:
</text>
<check_box
height="16"
label="Copy"
layout="topleft"
left_pad="5"
name="CheckEveryoneCopy"
top_delta="0"
width="130" />
<text
type="string"
length="1"
follows="left|top"
height="10"
layout="topleft"
left="10"
name="GroupLabel"
top_pad="5"
width="78">
Group:
</text>
<check_box
height="16"
label="Share"
layout="topleft"
left_pad="5"
name="CheckShareWithGroup"
top_delta="5"
width="106" />
<text
type="string"
length="1"
follows="left|top"
height="10"
layout="topleft"
left="10"
name="NextOwnerLabel"
top_pad="5"
width="78">
Next owner:
</text>
<check_box
height="16"
label="Edit"
layout="topleft"
left_pad="5"
name="CheckNextOwnerModify"
top_delta="0"
width="78" />
<check_box
height="16"
label="Copy"
layout="topleft"
left_delta="0"
name="CheckNextOwnerCopy"
top_pad="5"
width="88" />
<check_box
height="16"
label="Resell"
layout="topleft"
left_delta="0"
name="CheckNextOwnerTransfer"
top_pad="5"
width="106" />
<check_box
height="16"
label="For Sale"
layout="topleft"
left="10"
name="CheckPurchase"
top_pad="5"
width="78" />
<combo_box
height="19"
left_pad="5"
layout="topleft"
follows="left|top"
name="combobox sale copy"
width="90">
<combo_box.item
label="Copy"
name="Copy"
value="Copy" />
<combo_box.item
label="Original"
name="Original"
value="Original" />
</combo_box>
<spinner
follows="left|top"
decimal_digits="0"
increment="1"
control_name="Edit Cost"
name="Edit Cost"
label="Price: L$"
label_width="60"
left="10"
width="180"
min_val="1"
height="19"
max_val="999999999"
top_pad="5"/>
<!--line_editor
border_style="line"
border_thickness="1"
follows="left|top|right"
height="16"
layout="topleft"
left_pad="5"
max_length="25"
name="EditPrice"
top_delta="0"
width="242" /-->
<!--text
type="string"
length="1"
follows="left|top"
height="10"
layout="topleft"
left="10"
name="BaseMaskDebug"
top="155"
width="330">
B:
</text>
<text
type="string"
length="1"
follows="left|top"
height="10"
layout="topleft"
left_delta="60"
name="OwnerMaskDebug"
top_delta="0"
width="270">
O:
</text>
<text
type="string"
length="1"
follows="left|top"
height="10"
layout="topleft"
left_delta="60"
name="GroupMaskDebug"
top_delta="0"
width="210">
G:
</text>
<text
type="string"
length="1"
follows="left|top"
height="10"
layout="topleft"
left_delta="60"
name="EveryoneMaskDebug"
top_delta="0"
width="150">
E:
</text>
<text
type="string"
length="1"
follows="left|top"
height="10"
layout="topleft"
left_delta="60"
name="NextMaskDebug"
top_delta="0"
width="90">
N:
</text-->
<!--text
type="string"
length="1"
follows="left|top"
height="10"
layout="topleft"
left="10"
name="SaleLabel"
top_pad="5"
width="330">
Mark Item:
</text-->
<!--radio_group
draw_border="false"
follows="left|top|right"
height="16"
layout="topleft"
left_delta="78"
name="RadioSaleType"
top_delta="0"
width="252">
<radio_item
height="16"
label="Original"
layout="topleft"
left="0"
name="radio"
top="0"
width="70" />
<radio_item
height="16"
label="Copy"
layout="topleft"
left_delta="60"
name="radio2"
top_delta="0"
width="70" />
</radio_group-->
<!--text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
left="10"
name="TextPrice"
top_pad="5"
width="78">
Price: L$
</text-->
</panel>
</tab_container>
<panel
height="25"
layout="bottomright"
left="0"
help_topic="places_button_tab"
name="button_panel"
bottom="5"
width="325">
<button
follows="bottom|left"
font="SansSerifSmallBold"
height="25"
label="Edit"
layout="topleft"
left="10"
name="edit_btn"
top="0"
width="50" />
<button
follows="bottom|right"
font="SansSerifSmallBold"
height="25"
label="Cancel"
layout="topleft"
name="cancel_btn"
right="-10"
top="0"
width="70" />
<button
follows="bottom|right"
font="SansSerifSmallBold"
height="25"
label="Save"
layout="topleft"
name="save_btn"
left_pad="-135"
top="0"
width="60" />
</panel>
</panel>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment