Inital full retooling of appearance editor for multi-wearables. Also updated LLTabContainer to use standard commit and validate callback signals.

This commit is contained in:
Shyotl
2012-06-15 09:51:11 -05:00
parent 3796a216d2
commit 4c45e9a9d1
41 changed files with 717 additions and 682 deletions

View File

@@ -297,8 +297,7 @@ boost::signals2::connection LLButton::setHeldDownCallback(const CommitCallbackPa
boost::signals2::connection LLButton::setClickedCallback( const commit_signal_t::slot_type& cb )
{
if (!mCommitSignal) mCommitSignal = new commit_signal_t();
return mCommitSignal->connect(cb);
return LLUICtrl::setCommitCallback(cb);
}
boost::signals2::connection LLButton::setMouseDownCallback( const commit_signal_t::slot_type& cb )
{

View File

@@ -280,7 +280,7 @@ void LLMultiFloater::addFloater(LLFloater* floaterp, BOOL select_added_floater,
}
//add the panel, add it to proper maps
mTabContainer->addTabPanel(floaterp, floaterp->getShortTitle(), FALSE, onTabSelected, this, 0, FALSE, insertion_point);
mTabContainer->addTabPanel(floaterp, floaterp->getShortTitle(), FALSE, 0, FALSE, insertion_point);
mFloaterDataMap[floaterp->getHandle()] = floater_data;
updateResizeLimits();
@@ -366,10 +366,10 @@ void LLMultiFloater::removeFloater(LLFloater* floaterp)
updateResizeLimits();
tabOpen((LLFloater*)mTabContainer->getCurrentPanel(), false);
tabOpen((LLFloater*)mTabContainer->getCurrentPanel());
}
void LLMultiFloater::tabOpen(LLFloater* opened_floater, bool from_click)
void LLMultiFloater::tabOpen(LLFloater* opened_floater)
{
// default implementation does nothing
}
@@ -464,12 +464,9 @@ void LLMultiFloater::setFloaterFlashing(LLFloater* floaterp, BOOL flashing)
mTabContainer->setTabPanelFlashing(floaterp, flashing);
}
//static
void LLMultiFloater::onTabSelected(void* userdata, bool from_click)
void LLMultiFloater::onTabSelected()
{
LLMultiFloater* floaterp = (LLMultiFloater*)userdata;
floaterp->tabOpen((LLFloater*)floaterp->mTabContainer->getCurrentPanel(), from_click);
tabOpen((LLFloater*)mTabContainer->getCurrentPanel());
}
void LLMultiFloater::setCanResize(BOOL can_resize)
@@ -499,6 +496,7 @@ BOOL LLMultiFloater::postBuild()
if (checkRequirements())
{
mTabContainer = getChild<LLTabContainer>("Preview Tabs");
mTabContainer->setCommitCallback(boost::bind(&LLMultiFloater::onTabSelected, this));
return TRUE;
}

View File

@@ -60,7 +60,7 @@ public:
virtual void showFloater(LLFloater* floaterp);
virtual void removeFloater(LLFloater* floaterp);
virtual void tabOpen(LLFloater* opened_floater, bool from_click);
virtual void tabOpen(LLFloater* opened_floater);
virtual void tabClose();
virtual BOOL selectFloater(LLFloater* floaterp);
@@ -74,7 +74,7 @@ public:
virtual void setFloaterFlashing(LLFloater* floaterp, BOOL flashing);
virtual BOOL closeAllFloaters(); //Returns FALSE if the floater could not be closed due to pending confirmation dialogs
void setTabContainer(LLTabContainer* tab_container) { if (!mTabContainer) mTabContainer = tab_container; }
static void onTabSelected(void* userdata, bool);
void onTabSelected();
virtual void updateResizeLimits();

View File

@@ -931,24 +931,6 @@ LLPanel *LLPanel::childGetVisibleTab(const std::string& id) const
return NULL;
}
void LLPanel::childSetTabChangeCallback(const std::string& id, const std::string& tabname, void (*on_tab_clicked)(void*, bool), void *userdata, void (*on_precommit)(void*,bool))
{
LLTabContainer* child = getChild<LLTabContainer>(id);
if (child)
{
LLPanel *panel = child->getPanelByName(tabname);
if (panel)
{
child->setTabChangeCallback(panel, on_tab_clicked);
child->setTabUserData(panel, userdata);
if (on_precommit)
{
child->setTabPrecommitChangeCallback(panel, on_precommit);
}
}
}
}
void LLPanel::childSetKeystrokeCallback(const std::string& id, void (*keystroke_callback)(LLLineEditor* caller, void* user_data), void *user_data)
{
LLLineEditor* child = getChild<LLLineEditor>(id);

View File

@@ -198,7 +198,6 @@ public:
// LLTabContainer
void childShowTab(const std::string& id, const std::string& tabname, bool visible = true);
LLPanel *childGetVisibleTab(const std::string& id) const;
void childSetTabChangeCallback(const std::string& id, const std::string& tabname, void (*on_tab_clicked)(void*, bool), void *userdata, void (*on_precommit)(void*,bool) = NULL);
// LLTextBox
void childSetWrappedText(const std::string& id, const std::string& text, bool visible = true);

View File

@@ -69,12 +69,33 @@ const S32 TABCNTRV_PAD = 0;
static LLRegisterWidget<LLTabContainer> r("tab_container");
// Structure used to map tab buttons to and from tab panels
class LLTabTuple
{
public:
LLTabTuple( LLTabContainer* c, LLPanel* p, LLButton* b, LLTextBox* placeholder = NULL)
:
mTabContainer(c),
mTabPanel(p),
mButton(b),
mOldState(FALSE),
mPlaceholderText(placeholder),
mPadding(0)
{}
LLTabContainer* mTabContainer;
LLPanel* mTabPanel;
LLButton* mButton;
BOOL mOldState;
LLTextBox* mPlaceholderText;
S32 mPadding;
};
LLTabContainer::LLTabContainer(const std::string& name, const LLRect& rect, TabPosition pos,
BOOL bordered, BOOL is_vertical )
:
LLPanel(name, rect, bordered),
mCurrentTabIdx(-1),
mNextTabIdx(-1),
mTabsHidden(FALSE),
mScrolled(FALSE),
mScrollPos(0),
@@ -221,10 +242,13 @@ void LLTabContainer::draw()
}
// Hide all the buttons
for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter)
if (getTabsHidden())
{
LLTabTuple* tuple = *iter;
tuple->mButton->setVisible( FALSE );
for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter)
{
LLTabTuple* tuple = *iter;
tuple->mButton->setVisible( FALSE );
}
}
LLPanel::draw();
@@ -320,7 +344,7 @@ void LLTabContainer::draw()
BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask )
{
BOOL handled = FALSE;
BOOL has_scroll_arrows = (getMaxScrollPos() > 0);
BOOL has_scroll_arrows = (getMaxScrollPos() > 0) && !getTabsHidden();
if (has_scroll_arrows)
{
@@ -355,7 +379,7 @@ BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask )
}
S32 tab_count = getTabCount();
if (tab_count > 0)
if (tab_count > 0 && !getTabsHidden())
{
LLTabTuple* firsttuple = getTab(0);
LLRect tab_rect;
@@ -379,7 +403,7 @@ BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask )
index = llclamp(index, 0, tab_count-1);
LLButton* tab_button = getTab(index)->mButton;
gFocusMgr.setMouseCapture(this);
gFocusMgr.setKeyboardFocus(tab_button);
tab_button->setFocus(TRUE);
}
}
return handled;
@@ -389,7 +413,7 @@ BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask )
BOOL LLTabContainer::handleHover( S32 x, S32 y, MASK mask )
{
BOOL handled = FALSE;
BOOL has_scroll_arrows = (getMaxScrollPos() > 0);
BOOL has_scroll_arrows = (getMaxScrollPos() > 0) && !getTabsHidden();
if (has_scroll_arrows)
{
@@ -431,7 +455,7 @@ BOOL LLTabContainer::handleHover( S32 x, S32 y, MASK mask )
BOOL LLTabContainer::handleMouseUp( S32 x, S32 y, MASK mask )
{
BOOL handled = FALSE;
BOOL has_scroll_arrows = (getMaxScrollPos() > 0);
BOOL has_scroll_arrows = (getMaxScrollPos() > 0) && !getTabsHidden();
if (has_scroll_arrows)
{
@@ -487,7 +511,7 @@ BOOL LLTabContainer::handleMouseUp( S32 x, S32 y, MASK mask )
BOOL LLTabContainer::handleToolTip( S32 x, S32 y, std::string& msg, LLRect* sticky_rect )
{
BOOL handled = LLPanel::handleToolTip( x, y, msg, sticky_rect );
if (!handled && getTabCount() > 0)
if (!handled && getTabCount() > 0 && !getTabsHidden())
{
LLTabTuple* firsttuple = getTab(0);
@@ -523,12 +547,6 @@ BOOL LLTabContainer::handleToolTip( S32 x, S32 y, std::string& msg, LLRect* stic
}
}
}
for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter)
{
LLTabTuple* tuple = *iter;
tuple->mButton->setVisible( FALSE );
}
}
return handled;
}
@@ -695,8 +713,6 @@ BOOL LLTabContainer::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDrag
void LLTabContainer::addTabPanel(LLPanel* child,
const std::string& label,
BOOL select,
void (*on_tab_clicked)(void*, bool),
void* userdata,
S32 indent,
BOOL placeholder,
eInsertionPoint insertion_point)
@@ -722,20 +738,28 @@ void LLTabContainer::addTabPanel(LLPanel* child,
// Tab panel
S32 tab_panel_top;
S32 tab_panel_bottom;
if( getTabPosition() == LLTabContainer::TOP )
if (!getTabsHidden())
{
S32 tab_height = mIsVertical ? BTN_HEIGHT : TABCNTR_TAB_HEIGHT;
tab_panel_top = getRect().getHeight() - getTopBorderHeight() - (tab_height - TABCNTR_BUTTON_PANEL_OVERLAP);
tab_panel_bottom = LLPANEL_BORDER_WIDTH;
if( getTabPosition() == LLTabContainer::TOP )
{
S32 tab_height = mIsVertical ? BTN_HEIGHT : TABCNTR_TAB_HEIGHT;
tab_panel_top = getRect().getHeight() - getTopBorderHeight() - (tab_height - TABCNTR_BUTTON_PANEL_OVERLAP);
tab_panel_bottom = LLPANEL_BORDER_WIDTH;
}
else
{
tab_panel_top = getRect().getHeight() - getTopBorderHeight();
tab_panel_bottom = (TABCNTR_TAB_HEIGHT - TABCNTR_BUTTON_PANEL_OVERLAP); // Run to the edge, covering up the border
}
}
else
{
tab_panel_top = getRect().getHeight() - getTopBorderHeight();
tab_panel_bottom = (TABCNTR_TAB_HEIGHT - TABCNTR_BUTTON_PANEL_OVERLAP); // Run to the edge, covering up the border
//Scip tab button space if they are invisible(EXT - 576)
tab_panel_top = getRect().getHeight();
tab_panel_bottom = LLPANEL_BORDER_WIDTH;
}
LLRect tab_panel_rect;
if (mIsVertical)
if (!getTabsHidden() && mIsVertical)
{
tab_panel_rect = LLRect(mMinTabWidth + (LLPANEL_BORDER_WIDTH * 2) + TABCNTRV_PAD,
getRect().getHeight() - LLPANEL_BORDER_WIDTH,
@@ -854,7 +878,7 @@ void LLTabContainer::addTabPanel(LLPanel* child,
}
}
LLTabTuple* tuple = new LLTabTuple( this, child, btn, on_tab_clicked, userdata, textbox );
LLTabTuple* tuple = new LLTabTuple( this, child, btn, textbox );
insertTuple( tuple, insertion_point );
if (textbox)
@@ -883,7 +907,7 @@ void LLTabContainer::addTabPanel(LLPanel* child,
void LLTabContainer::addPlaceholder(LLPanel* child, const std::string& label)
{
addTabPanel(child, label, FALSE, NULL, NULL, 0, TRUE);
addTabPanel(child, label, FALSE, 0, TRUE);
}
void LLTabContainer::removeTabPanel(LLPanel* child)
@@ -1154,8 +1178,8 @@ BOOL LLTabContainer::selectTabPanel(LLPanel* child)
BOOL LLTabContainer::selectTab(S32 which)
{
if (which >= getTabCount()) return FALSE;
if (which < 0) return FALSE;
if (which >= getTabCount() || which < 0)
return FALSE;
//if( gFocusMgr.childHasKeyboardFocus( this ) )
//{
@@ -1167,28 +1191,26 @@ BOOL LLTabContainer::selectTab(S32 which)
{
return FALSE;
}
LLSD cbdata;
if (selected_tuple->mTabPanel)
cbdata = selected_tuple->mTabPanel->getName();
if (!selected_tuple->mPrecommitChangeCallback)
BOOL res = FALSE;
if( !mValidateSignal || (*mValidateSignal)( this, cbdata ) )
{
return setTab(which);
res = setTab(which);
if (res && mCommitSignal)
{
(*mCommitSignal)(this, cbdata);
}
}
mNextTabIdx = which;
selected_tuple->mPrecommitChangeCallback(selected_tuple->mUserData, false);
return TRUE;
return res;
}
BOOL LLTabContainer::setTab(S32 which)
{
if (which == -1)
{
if (mNextTabIdx == -1)
{
return FALSE;
}
which = mNextTabIdx;
mNextTabIdx = -1;
}
LLTabTuple* selected_tuple = getTab(which);
if (!selected_tuple)
@@ -1212,7 +1234,7 @@ BOOL LLTabContainer::setTab(S32 which)
// RN: this limits tab-stops to active button only, which would require arrow keys to switch tabs
tuple->mButton->setTabStop( is_selected );
if( is_selected && (mIsVertical || (getMaxScrollPos() > 0)))
if (is_selected)
{
// Make sure selected tab is within scroll region
if (mIsVertical)
@@ -1228,7 +1250,7 @@ BOOL LLTabContainer::setTab(S32 which)
is_visible = FALSE;
}
}
else
else if (getMaxScrollPos() > 0)
{
if( i < getScrollPos() )
{
@@ -1259,13 +1281,13 @@ BOOL LLTabContainer::setTab(S32 which)
}
is_visible = TRUE;
}
else
{
is_visible = TRUE;
}
}
i++;
}
if( selected_tuple->mOnChangeCallback )
{
selected_tuple->mOnChangeCallback( selected_tuple->mUserData, false );
}
}
if (mIsVertical && getCurrentPanelIndex() >= 0)
{
@@ -1368,33 +1390,6 @@ S32 LLTabContainer::getTopBorderHeight() const
return mTopBorderHeight;
}
void LLTabContainer::setTabChangeCallback(LLPanel* tab, void (*on_tab_clicked)(void*, bool))
{
LLTabTuple* tuplep = getTabByPanel(tab);
if (tuplep)
{
tuplep->mOnChangeCallback = on_tab_clicked;
}
}
void LLTabContainer::setTabPrecommitChangeCallback(LLPanel* tab, void (*on_precommit)(void*, bool))
{
LLTabTuple* tuplep = getTabByPanel(tab);
if (tuplep)
{
tuplep->mPrecommitChangeCallback = on_precommit;
}
}
void LLTabContainer::setTabUserData(LLPanel* tab, void* userdata)
{
LLTabTuple* tuplep = getTabByPanel(tab);
if (tuplep)
{
tuplep->mUserData = userdata;
}
}
void LLTabContainer::setRightTabBtnOffset(S32 offset)
{
mNextArrowBtn->translate( -offset - mRightTabBtnOffset, 0 );
@@ -1583,8 +1578,7 @@ LLView* LLTabContainer::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFacto
}
BOOL placeholder = FALSE;
child->getAttributeBOOL("placeholder", placeholder);
tab_container->addTabPanel(panelp, label, false,
NULL, NULL, 0, placeholder);
tab_container->addTabPanel(panelp, label, false, 0, placeholder);
}
}
@@ -1745,7 +1739,7 @@ void LLTabContainer::initButtons()
setDefaultTabGroup(1);
}
LLTabContainer::LLTabTuple* LLTabContainer::getTabByPanel(LLPanel* child)
LLTabTuple* LLTabContainer::getTabByPanel(LLPanel* child)
{
for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter)
{
@@ -1846,7 +1840,7 @@ void LLTabContainer::updateMaxScrollPos()
void LLTabContainer::commitHoveredButton(S32 x, S32 y)
{
if (hasMouseCapture())
if (!getTabsHidden() && hasMouseCapture())
{
for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter)
{

View File

@@ -36,6 +36,7 @@
#include "llpanel.h"
#include "lltextbox.h"
#include "llframetimer.h"
class LLTabTuple;
extern const S32 TABCNTR_HEADER_HEIGHT;
@@ -79,9 +80,7 @@ public:
void addTabPanel(LLPanel* child,
const std::string& label,
BOOL select = FALSE,
void (*on_tab_clicked)(void*, bool) = NULL,
void* userdata = NULL,
BOOL select = FALSE,
S32 indent = 0,
BOOL placeholder = FALSE,
eInsertionPoint insertion_point = END);
@@ -108,7 +107,6 @@ public:
BOOL selectTabPanel( LLPanel* child );
BOOL selectTab(S32 which);
BOOL selectTabByName(const std::string& title);
BOOL setTab(S32 which);
BOOL getTabPanelFlashing(LLPanel* child);
void setTabPanelFlashing(LLPanel* child, BOOL state);
@@ -118,10 +116,6 @@ public:
void setTopBorderHeight(S32 height);
S32 getTopBorderHeight() const;
void setTabChangeCallback(LLPanel* tab, void (*on_tab_clicked)(void*,bool));
void setTabPrecommitChangeCallback(LLPanel* tab, void (*on_precommit)(void*, bool));
void setTabUserData(LLPanel* tab, void* userdata);
void setRightTabBtnOffset( S32 offset );
void setPanelTitle(S32 index, const std::string& title);
@@ -146,39 +140,11 @@ public:
static LLView* fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *factory);
private:
// Structure used to map tab buttons to and from tab panels
struct LLTabTuple
{
LLTabTuple( LLTabContainer* c, LLPanel* p, LLButton* b,
void (*cb)(void*,bool), void* userdata, LLTextBox* placeholder = NULL,
void (*pcb)(void*,bool) = NULL)
:
mTabContainer(c),
mTabPanel(p),
mButton(b),
mOnChangeCallback( cb ),
mPrecommitChangeCallback( pcb ),
mUserData( userdata ),
mOldState(FALSE),
mPlaceholderText(placeholder),
mPadding(0)
{}
LLTabContainer* mTabContainer;
LLPanel* mTabPanel;
LLButton* mButton;
void (*mOnChangeCallback)(void*, bool);
void (*mPrecommitChangeCallback)(void*,bool); // Precommit callback gets called before tab is changed and
// can prevent it from being changed. onChangeCallback is called
// immediately after tab is actually changed - Nyx
void* mUserData;
BOOL mOldState;
LLTextBox* mPlaceholderText;
S32 mPadding;
};
void initButtons();
BOOL setTab(S32 which);
LLTabTuple* getTab(S32 index) { return mTabList[index]; }
LLTabTuple* getTabByPanel(LLPanel* child);
void insertTuple(LLTabTuple * tuple, eInsertionPoint insertion_point);

View File

@@ -281,8 +281,6 @@ void LLAgentWearables::addWearabletoAgentInventoryDone(const LLWearableType::ETy
const LLUUID& item_id,
LLWearable* wearable)
{
//llassert_always(index == 0);
llinfos << "type " << type << " index " << index << " item " << item_id.asString() << llendl;
if (item_id.isNull())
@@ -472,29 +470,28 @@ void LLAgentWearables::saveWearable(const LLWearableType::EType type, const U32
}
}
void LLAgentWearables::saveWearableAs(const LLWearableType::EType type,
LLWearable* LLAgentWearables::saveWearableAs(const LLWearableType::EType type,
const U32 index,
const std::string& new_name,
BOOL save_in_lost_and_found)
{
//llassert_always(index == 0);
if (!isWearableCopyable(type, index))
{
llwarns << "LLAgent::saveWearableAs() not copyable." << llendl;
return;
return NULL;
}
LLWearable* old_wearable = getWearable(type, index);
if (!old_wearable)
{
llwarns << "LLAgent::saveWearableAs() no old wearable." << llendl;
return;
return NULL;
}
LLInventoryItem* item = gInventory.getItem(getWearableItemID(type,index));
if (!item)
{
llwarns << "LLAgent::saveWearableAs() no inventory item." << llendl;
return;
return NULL;
}
std::string trunc_name(new_name);
LLStringUtil::truncate(trunc_name, DB_INV_ITEM_NAME_STR_LEN);
@@ -532,6 +529,7 @@ void LLAgentWearables::saveWearableAs(const LLWearableType::EType type,
// unsaved changes so other inventory items aren't affected by the changes
// that were just saved.
old_wearable->revertValues();
return new_wearable;
}
void LLAgentWearables::revertWearable(const LLWearableType::EType type, const U32 index)
@@ -755,7 +753,7 @@ void LLAgentWearables::setWearable(const LLWearableType::EType type, U32 index,
pushWearable(type,wearable);
return;
}
wearableentry_map_t::iterator wearable_iter = mWearableDatas.find(type);
if (wearable_iter == mWearableDatas.end())
{
@@ -835,9 +833,8 @@ void LLAgentWearables::wearableUpdated(LLWearable *wearable)
//while the wearable being created has not yet been stuffed into the wearable list.
//This results in the param hints being buggered and screwing up the current wearable during LLVisualParamHint::preRender,
//thus making the wearable 'dirty'. The code below basically 'forces' a refresh of the panel to fix this.
U32 index = gAgentWearables.getWearableIndex(wearable);
if(gFloaterCustomize && index==0)
gFloaterCustomize->setWearable(wearable->getType(), wearable);
if(gFloaterCustomize)
gFloaterCustomize->wearablesChanged(wearable->getType());
}
@@ -1712,21 +1709,21 @@ bool LLAgentWearables::onSetWearableDialog( const LLSD& notification, const LLSD
switch( option )
{
case 0: // "Save"
case 0: // "Save"
gAgentWearables.saveWearable(wearable->getType(),index);
gAgentWearables.setWearableFinal( new_item, wearable );
break;
gAgentWearables.setWearableFinal( new_item, wearable );
break;
case 1: // "Don't Save"
gAgentWearables.setWearableFinal( new_item, wearable );
break;
case 1: // "Don't Save"
gAgentWearables.setWearableFinal( new_item, wearable );
break;
case 2: // "Cancel"
break;
case 2: // "Cancel"
break;
default:
llassert(0);
break;
default:
llassert(0);
break;
}
delete wearable;
@@ -1742,10 +1739,11 @@ void LLAgentWearables::setWearableFinal(LLInventoryItem* new_item, LLWearable* n
if (do_append && getWearableItemID(type,0).notNull())
{
new_wearable->setItemID(new_item->getUUID());
mWearableDatas[type].push_back(new_wearable);
/*mWearableDatas[type].push_back(new_wearable);
llinfos << "Added additional wearable for type " << type
<< " size is now " << mWearableDatas[type].size() << llendl;
checkWearableAgainstInventory(new_wearable);
checkWearableAgainstInventory(new_wearable);*/
pushWearable(type,new_wearable); //To call LLAgentWearables::wearableUpdated
}
else
{
@@ -2228,6 +2226,12 @@ bool LLAgentWearables::moveWearable(const LLViewerInventoryItem* item, bool clos
U32 swap_i = closer_to_body ? i-1 : i+1;
wearable_vec[i] = wearable_vec[swap_i];
wearable_vec[swap_i] = wearable;
if(gFloaterCustomize)
{
gFloaterCustomize->wearablesChanged(item->getWearableType());
}
return true;
}

View File

@@ -205,7 +205,7 @@ private:
// Save Wearables
//--------------------------------------------------------------------
public:
void saveWearableAs(const LLWearableType::EType type, const U32 index, const std::string& new_name, BOOL save_in_lost_and_found);
LLWearable* saveWearableAs(const LLWearableType::EType type, const U32 index, const std::string& new_name, BOOL save_in_lost_and_found);
void saveWearable(const LLWearableType::EType type, const U32 index, BOOL send_update = TRUE,
const std::string new_name = "");
void saveAllWearables();

View File

@@ -2508,7 +2508,21 @@ void LLAppearanceMgr::addCOFItemLink(const LLInventoryItem *item, bool do_update
{
cb = new ModifiedCOFCallback;
}
const std::string description = vitem->getIsLinkType() ? vitem->getDescription() : "";
std::string description = vitem->getIsLinkType() ? vitem->getDescription() : "";
if(description.empty())
{
LLWearable* wearable = gAgentWearables.getWearableFromItemID(vitem->getLinkedUUID());
if(wearable)
{
U32 index = gAgentWearables.getWearableIndex(wearable);
if(index < LLAgentWearables::MAX_CLOTHING_PER_TYPE)
{
std::ostringstream order_num;
order_num << ORDER_NUMBER_SEPARATOR << wearable->getType() * 100 + index;
description = order_num.str();
}
}
}
link_inventory_item( gAgent.getID(),
vitem->getLinkedUUID(),
getCOF(),

View File

@@ -142,24 +142,16 @@ BOOL LLFloaterAvatarPicker::postBuild()
inventory_panel->openDefaultFolderForType(LLAssetType::AT_CALLINGCARD);
inventory_panel->setSelectCallback(boost::bind(&LLFloaterAvatarPicker::onCallingCardSelectionChange, _1, _2, (void*)this));
childSetTabChangeCallback("ResidentChooserTabs", "SearchPanel", onTabChanged, this);
childSetTabChangeCallback("ResidentChooserTabs", "CallingCardsPanel", onTabChanged, this);
childSetTabChangeCallback("ResidentChooserTabs", "NearMePanel", onTabChanged, this);
childSetTabChangeCallback("ResidentChooserTabs", "KeyPanel", onTabChanged, this);
getChild<LLTabContainer>("ResidentChooserTabs")->setCommitCallback(boost::bind(&LLFloaterAvatarPicker::onTabChanged,this));
setAllowMultiple(FALSE);
return TRUE;
}
void LLFloaterAvatarPicker::onTabChanged(void* userdata, bool from_click)
void LLFloaterAvatarPicker::onTabChanged()
{
LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)userdata;
if (!self)
{
return;
}
self->childSetEnabled("Select", self->visibleItemsSelected());
childSetEnabled("Select", visibleItemsSelected());
}
// Destroys the object

View File

@@ -62,7 +62,7 @@ private:
static void onRangeAdjust(LLUICtrl* source, void* data);
static void onBtnClose(void* userdata);
static void onList(class LLUICtrl* ctrl, void* userdata);
static void onTabChanged(void* userdata, bool from_click);
void onTabChanged();
void doCallingCardSelectionChange(const std::deque<class LLFolderViewItem*> &items, BOOL user_action, void* data);
static void onCallingCardSelectionChange(const std::deque<class LLFolderViewItem*> &items, BOOL user_action, void* data);

View File

@@ -405,25 +405,19 @@ BOOL LLFloaterCustomize::postBuild()
initWearablePanels();
// Tab container
const std::string &invalid_name = LLWearableType::getTypeName(LLWearableType::WT_INVALID);
for(U32 type=LLWearableType::WT_SHAPE;type<LLWearableType::WT_INVALID;++type)
LLTabContainer* tab_container = getChild<LLTabContainer>("customize tab container");
if(tab_container)
{
std::string name = LLWearableType::getTypeName((LLWearableType::EType)type);
if(name != invalid_name)
{
name[0] = toupper(name[0]);
childSetTabChangeCallback("customize tab container", name, onTabChanged, (void*)type, onTabPrecommit );
}
tab_container->setCommitCallback(boost::bind(&LLFloaterCustomize::onTabChanged, _2));
tab_container->setValidateCallback(boost::bind(&LLFloaterCustomize::onTabPrecommit, this, _1, _2));
}
// Remove underwear panels for teens
if (gAgent.isTeen())
{
LLTabContainer* tab_container = getChild<LLTabContainer>("customize tab container");
if (tab_container)
{
LLPanel* panel;
panel = tab_container->getPanelByName("Undershirt");
LLPanel* panel = tab_container->getPanelByName("Undershirt");
if (panel) tab_container->removeTabPanel(panel);
panel = tab_container->getPanelByName("Underpants");
if (panel) tab_container->removeTabPanel(panel);
@@ -553,7 +547,7 @@ void LLFloaterCustomize::onBtnExport_continued(AIFilePicker* filepicker)
LLWearable* old_wearable = gAgentWearables.getWearable((LLWearableType::EType)i, 0); // TODO: MULTI-WEARABLE
if( old_wearable )
{
item = (LLViewerInventoryItem*)gAgentWearables.getWearableInventoryItem((LLWearableType::EType)i, 0); // TODO: MULTI-WEARABLE
item = gInventory.getItem(old_wearable->getItemID());
if(item)
{
const LLPermissions& perm = item->getPermissions();
@@ -577,7 +571,7 @@ void LLFloaterCustomize::onBtnExport_continued(AIFilePicker* filepicker)
LLWearable* old_wearable = gAgentWearables.getWearable((LLWearableType::EType)i, 0); // TODO: MULTI-WEARABLE
if( old_wearable )
{
item = (LLViewerInventoryItem*)gAgentWearables.getWearableInventoryItem((LLWearableType::EType)i, 0); // TODO: MULTI-WEARABLE
item = gInventory.getItem(old_wearable->getItemID());
if(item)
{
const LLPermissions& perm = item->getPermissions();
@@ -728,39 +722,51 @@ void LLFloaterCustomize::draw()
BOOL LLFloaterCustomize::isDirty() const
{
for(S32 i = 0; i < LLWearableType::WT_COUNT; i++)
LLWearableType::EType cur = getCurrentWearableType();
for(U32 i = 0; i < gAgentWearables.getWearableCount(cur); ++i)
{
if( mWearablePanelList[i]
&& mWearablePanelList[i]->isDirty() )
{
LLWearable* wearable = gAgentWearables.getWearable(cur,i);
if(wearable && wearable->isDirty())
return TRUE;
}
}
return FALSE;
}
// static
void LLFloaterCustomize::onTabPrecommit( void* userdata, bool from_click )
bool LLFloaterCustomize::onTabPrecommit( LLUICtrl* ctrl, const LLSD& param )
{
LLWearableType::EType type = (LLWearableType::EType)(intptr_t) userdata;
if (type != LLWearableType::WT_INVALID && gFloaterCustomize && gFloaterCustomize->getCurrentWearableType() != type)
std::string panel_name = param.asString();
for(U32 type=LLWearableType::WT_SHAPE;type<LLWearableType::WT_INVALID;++type)
{
gFloaterCustomize->askToSaveIfDirty(boost::bind(&onCommitChangeTab, _1));
}
else
{
onCommitChangeTab(true);
std::string type_name = LLWearableType::getTypeName((LLWearableType::EType)type);
std::transform(panel_name.begin(), panel_name.end(), panel_name.begin(), tolower);
if(type_name == panel_name)
{
if(LLFloaterCustomize::sCurrentWearableType != type)
{
askToSaveIfDirty(boost::bind(&LLFloaterCustomize::onCommitChangeTab, _1, (LLTabContainer*)ctrl, param.asString(), (LLWearableType::EType)type));
return false;
}
}
}
return true;
}
// static
void LLFloaterCustomize::onTabChanged( void* userdata, bool from_click )
void LLFloaterCustomize::onTabChanged( const LLSD& param )
{
LLWearableType::EType wearable_type = (LLWearableType::EType) (intptr_t)userdata;
if (wearable_type != LLWearableType::WT_INVALID)
std::string panel_name = param.asString();
for(U32 type=LLWearableType::WT_SHAPE;type<LLWearableType::WT_INVALID;++type)
{
LLFloaterCustomize::setCurrentWearableType(wearable_type);
std::string type_name = LLWearableType::getTypeName((LLWearableType::EType)type);
std::transform(panel_name.begin(), panel_name.end(), panel_name.begin(), tolower);
if(type_name == panel_name)
{
LLFloaterCustomize::setCurrentWearableType((LLWearableType::EType)type);
break;
}
}
}
@@ -772,18 +778,15 @@ void LLFloaterCustomize::onClose(bool app_quitting)
}
// static
void LLFloaterCustomize::onCommitChangeTab(BOOL proceed)
void LLFloaterCustomize::onCommitChangeTab(BOOL proceed, LLTabContainer* ctrl, std::string panel_name, LLWearableType::EType type)
{
if (!proceed || !gFloaterCustomize)
{
return;
}
LLTabContainer* tab_container = gFloaterCustomize->getChild<LLTabContainer>("customize tab container");
if (tab_container)
{
tab_container->setTab(-1);
}
LLFloaterCustomize::setCurrentWearableType(type);
ctrl->selectTabByName(panel_name);
}
@@ -812,7 +815,7 @@ void LLFloaterCustomize::initScrollingPanelList()
}
}
void LLFloaterCustomize::setWearable(LLWearableType::EType type, LLWearable* wearable)
void LLFloaterCustomize::wearablesChanged(LLWearableType::EType type)
{
llassert( type < LLWearableType::WT_COUNT );
gSavedSettings.setU32("AvatarSex", (gAgentAvatarp->getSex() == SEX_MALE) );
@@ -820,22 +823,7 @@ void LLFloaterCustomize::setWearable(LLWearableType::EType type, LLWearable* wea
LLPanelEditWearable* panel = mWearablePanelList[ type ];
if( panel )
{
U32 perm_mask = wearable ? PERM_NONE : PERM_ALL;
BOOL is_complete = wearable ? FALSE : TRUE;
if(wearable)
{
LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(gAgentWearables.getWearableItemID(type, 0)); // TODO: MULTI-WEARABLE
if(item)
{
perm_mask = item->getPermissions().getMaskOwner();
is_complete = item->isComplete();
if(!is_complete)
{
item->fetchFromServer();
}
}
}
panel->setWearable(wearable, perm_mask, is_complete);
panel->wearablesChanged();
}
}
@@ -846,7 +834,7 @@ void LLFloaterCustomize::updateScrollingPanelList()
void LLFloaterCustomize::askToSaveIfDirty( boost::function<void (BOOL)> cb )
{
if( isDirty())
if(isDirty())
{
// Ask if user wants to save, then continue to next step afterwards
mNextStepAfterSaveCallback.connect(cb);
@@ -857,7 +845,7 @@ void LLFloaterCustomize::askToSaveIfDirty( boost::function<void (BOOL)> cb )
}
else
{
cb(TRUE); //just clal it immediately.
cb(TRUE); //just call it immediately.
}
}
@@ -869,28 +857,36 @@ bool LLFloaterCustomize::onSaveDialog(const LLSD& notification, const LLSD& resp
BOOL proceed = FALSE;
LLWearableType::EType cur = getCurrentWearableType();
switch( option )
for(U32 i = 0;i < gAgentWearables.getWearableCount(cur);++i)
{
case 0: // "Save"
gAgentWearables.saveWearable( cur, 0 ); // TODO: MULTI-WEARABLE
proceed = TRUE;
break;
case 1: // "Don't Save"
LLWearable* wearable = gAgentWearables.getWearable(cur,i);
if(wearable && wearable->isDirty())
{
gAgentWearables.revertWearable( cur, 0 ); // TODO: MULTI-WEARABLE
proceed = TRUE;
switch( option )
{
case 0: // "Save"
gAgentWearables.saveWearable( cur, i );
proceed = TRUE;
break;
case 1: // "Don't Save"
{
gAgentWearables.revertWearable( cur, i );
proceed = TRUE;
}
break;
case 2: // "Cancel"
break;
default:
llassert(0);
break;
}
}
break;
case 2: // "Cancel"
break;
default:
llassert(0);
break;
}
mNextStepAfterSaveCallback(proceed);
mNextStepAfterSaveCallback.disconnect_all_slots(); //Should this be done?
@@ -913,10 +909,13 @@ void LLFloaterCustomize::fetchInventory()
LLUUID item_id;
for(S32 type = (S32)LLWearableType::WT_SHAPE; type < (S32)LLWearableType::WT_COUNT; ++type)
{
item_id = gAgentWearables.getWearableItemID((LLWearableType::EType)type, 0); // TODO: MULTI-WEARABLE
if(item_id.notNull())
for(U32 i = 0; i < gAgentWearables.getWearableCount((LLWearableType::EType)type); ++i)
{
ids.push_back(item_id);
item_id = gAgentWearables.getWearableItemID((LLWearableType::EType)type, i);
if(item_id.notNull())
{
ids.push_back(item_id);
}
}
}
@@ -939,7 +938,9 @@ void LLFloaterCustomize::updateInventoryUI()
panel = mWearablePanelList[i];
if(panel)
{
item = (LLViewerInventoryItem*)gAgentWearables.getWearableInventoryItem(panel->getType(), 0); // TODO: MULTI-WEARABLE
LLWearable* wearable = panel->getWearable();
if(wearable)
item = gInventory.getItem(wearable->getItemID());
}
if(item)
{
@@ -961,8 +962,8 @@ void LLFloaterCustomize::updateInventoryUI()
{
panel->setUIPermissions(perm_mask, is_complete);
}
BOOL is_vis = panel && item && is_complete && (perm_mask & PERM_MODIFY);
childSetVisible("panel_container", is_vis);
//BOOL is_vis = panel && item && is_complete && (perm_mask & PERM_MODIFY);
//childSetVisible("panel_container", is_vis);
}
}

View File

@@ -55,7 +55,7 @@ class LLMakeOutfitDialog;
class LLRadioGroup;
class LLScrollableContainerView;
class LLScrollingPanelList;
class LLTabContainerVertical;
class LLTabContainer;
class LLTextBox;
class LLTextureCtrl;
class LLViewerJointMesh;
@@ -84,7 +84,7 @@ public:
// New methods
void setWearable(LLWearableType::EType type, LLWearable* wearable);
void wearablesChanged(LLWearableType::EType type);
void updateScrollingPanelList();
LLPanelEditWearable* getCurrentWearablePanel() { return mWearablePanelList[ sCurrentWearableType ]; }
@@ -106,10 +106,10 @@ public:
static void onBtnExport( void* userdata );
static void onBtnExport_continued(AIFilePicker* filepicker);
static void onTabChanged( void* userdata, bool from_click );
static void onTabPrecommit( void* userdata, bool from_click );
static void onTabChanged( const LLSD& param );
bool onTabPrecommit( LLUICtrl* ctrl, const LLSD& param );
bool onSaveDialog(const LLSD& notification, const LLSD& response);
static void onCommitChangeTab(BOOL proceed);
static void onCommitChangeTab(BOOL proceed, LLTabContainer* ctrl, std::string panel_name, LLWearableType::EType type);
void fetchInventory();
void updateInventoryUI();

View File

@@ -144,23 +144,7 @@ LLFloaterDirectory::LLFloaterDirectory(const std::string& name)
mPanelAvatarp->selectTab(0);
}
childSetTabChangeCallback("Directory Tabs", "classified_panel", onTabChanged, this);
childSetTabChangeCallback("Directory Tabs", "events_panel", onTabChanged, this);
childSetTabChangeCallback("Directory Tabs", "places_panel", onTabChanged, this);
childSetTabChangeCallback("Directory Tabs", "land_sales_panel", onTabChanged, this);
childSetTabChangeCallback("Directory Tabs", "people_panel", onTabChanged, this);
childSetTabChangeCallback("Directory Tabs", "groups_panel", onTabChanged, this);
if (enableWebSearch)
{
// web search and showcase for SecondLife
childSetTabChangeCallback("Directory Tabs", "find_all_panel", onTabChanged, this);
childSetTabChangeCallback("Directory Tabs", "showcase_panel", onTabChanged, this);
}
if(enableClassicAllSearch)
{
childSetTabChangeCallback("Directory Tabs", "find_all_old_panel", onTabChanged, this);
}
getChild<LLTabContainer>("Directory Tabs")->setCommitCallback(boost::bind(&LLFloaterDirectory::onTabChanged,_2));
}
LLFloaterDirectory::~LLFloaterDirectory()
@@ -508,16 +492,9 @@ void LLFloaterDirectory::onClose(bool app_quitting)
}
// static
void LLFloaterDirectory::onTabChanged(void* data, bool from_click)
void LLFloaterDirectory::onTabChanged( const LLSD& param )
{
LLFloaterDirectory* self = (LLFloaterDirectory*)data;
if (!self) return;
LLPanel *panel = self->childGetVisibleTab("Directory Tabs");
if (panel)
{
gSavedSettings.setString("LastFindPanel", panel->getName());
}
gSavedSettings.setString("LastFindPanel", param.asString());
}
void LLFloaterDirectory::hideAllDetailPanels()

View File

@@ -81,7 +81,7 @@ public:
static void toggleEvents(void*);
static void toggleFind(void*);
static void onTabChanged(void*, bool);
static void onTabChanged( const LLSD& param );
void hideAllDetailPanels();

View File

@@ -130,10 +130,7 @@ LLFloaterGodTools::LLFloaterGodTools()
factory_map["request"] = LLCallbackMap(createPanelRequest, this);
LLUICtrlFactory::getInstance()->buildFloater(this, "floater_god_tools.xml", &factory_map);
childSetTabChangeCallback("GodTools Tabs", "grid", onTabChanged, this);
childSetTabChangeCallback("GodTools Tabs", "region", onTabChanged, this);
childSetTabChangeCallback("GodTools Tabs", "objects", onTabChanged, this);
childSetTabChangeCallback("GodTools Tabs", "request", onTabChanged, this);
getChild<LLTabContainer>("GodTools Tabs")->setCommitCallback(boost::bind(&LLFloaterGodTools::onTabChanged,_1,_2));
sendRegionInfoRequest();
@@ -244,15 +241,12 @@ void LLFloaterGodTools::showPanel(const std::string& panel_name)
if (panel) panel->setFocus(TRUE);
}
// static
void LLFloaterGodTools::onTabChanged(void* data, bool from_click)
//static
void LLFloaterGodTools::onTabChanged(LLUICtrl* ctrl, const LLSD& param)
{
LLPanel* panel = (LLPanel*)data;
if (panel)
{
LLPanel* panel = (LLPanel*)ctrl->getChildView(param.asString(),false,false);
if(panel)
panel->setFocus(TRUE);
}
}

View File

@@ -101,7 +101,7 @@ public:
// Send possibly changed values to simulator.
void sendGodUpdateRegionInfo();
static void onTabChanged(void *data, bool from_click);
static void onTabChanged(LLUICtrl* ctrl, const LLSD& param);
protected:
U32 computeRegionFlags() const;

View File

@@ -144,39 +144,39 @@ LLPreferenceCore::LLPreferenceCore(LLTabContainer* tab_container, LLButton * def
mPrefsAscentVan(NULL)
{
mGeneralPanel = new LLPanelGeneral();
mTabContainer->addTabPanel(mGeneralPanel, mGeneralPanel->getLabel(), FALSE, onTabChanged, mTabContainer);
mTabContainer->addTabPanel(mGeneralPanel, mGeneralPanel->getLabel());
mGeneralPanel->setDefaultBtn(default_btn);
mInputPanel = new LLPanelInput();
mTabContainer->addTabPanel(mInputPanel, mInputPanel->getLabel(), FALSE, onTabChanged, mTabContainer);
mTabContainer->addTabPanel(mInputPanel, mInputPanel->getLabel());
mInputPanel->setDefaultBtn(default_btn);
mNetworkPanel = new LLPanelNetwork();
mTabContainer->addTabPanel(mNetworkPanel, mNetworkPanel->getLabel(), FALSE, onTabChanged, mTabContainer);
mTabContainer->addTabPanel(mNetworkPanel, mNetworkPanel->getLabel());
mNetworkPanel->setDefaultBtn(default_btn);
mWebPanel = new LLPanelWeb();
mTabContainer->addTabPanel(mWebPanel, mWebPanel->getLabel(), FALSE, onTabChanged, mTabContainer);
mTabContainer->addTabPanel(mWebPanel, mWebPanel->getLabel());
mWebPanel->setDefaultBtn(default_btn);
mDisplayPanel = new LLPanelDisplay();
mTabContainer->addTabPanel(mDisplayPanel, mDisplayPanel->getLabel(), FALSE, onTabChanged, mTabContainer);
mTabContainer->addTabPanel(mDisplayPanel, mDisplayPanel->getLabel());
mDisplayPanel->setDefaultBtn(default_btn);
mAudioPanel = new LLPanelAudioPrefs();
mTabContainer->addTabPanel(mAudioPanel, mAudioPanel->getLabel(), FALSE, onTabChanged, mTabContainer);
mTabContainer->addTabPanel(mAudioPanel, mAudioPanel->getLabel());
mAudioPanel->setDefaultBtn(default_btn);
mPrefsChat = new LLPrefsChat();
mTabContainer->addTabPanel(mPrefsChat->getPanel(), mPrefsChat->getPanel()->getLabel(), FALSE, onTabChanged, mTabContainer);
mTabContainer->addTabPanel(mPrefsChat->getPanel(), mPrefsChat->getPanel()->getLabel());
mPrefsChat->getPanel()->setDefaultBtn(default_btn);
mPrefsVoice = new LLPrefsVoice();
mTabContainer->addTabPanel(mPrefsVoice, mPrefsVoice->getLabel(), FALSE, onTabChanged, mTabContainer);
mTabContainer->addTabPanel(mPrefsVoice, mPrefsVoice->getLabel());
mPrefsVoice->setDefaultBtn(default_btn);
mPrefsIM = new LLPrefsIM();
mTabContainer->addTabPanel(mPrefsIM->getPanel(), mPrefsIM->getPanel()->getLabel(), FALSE, onTabChanged, mTabContainer);
mTabContainer->addTabPanel(mPrefsIM->getPanel(), mPrefsIM->getPanel()->getLabel());
mPrefsIM->getPanel()->setDefaultBtn(default_btn);
#if LL_LCD_COMPILE
@@ -185,7 +185,7 @@ LLPreferenceCore::LLPreferenceCore(LLTabContainer* tab_container, LLButton * def
if (gLcdScreen->Enabled())
{
mLCDPanel = new LLPanelLCD();
mTabContainer->addTabPanel(mLCDPanel, mLCDPanel->getLabel(), FALSE, onTabChanged, mTabContainer);
mTabContainer->addTabPanel(mLCDPanel, mLCDPanel->getLabel());
mLCDPanel->setDefaultBtn(default_btn);
}
@@ -194,29 +194,31 @@ LLPreferenceCore::LLPreferenceCore(LLTabContainer* tab_container, LLButton * def
#endif
mMsgPanel = new LLPanelMsgs();
mTabContainer->addTabPanel(mMsgPanel, mMsgPanel->getLabel(), FALSE, onTabChanged, mTabContainer);
mTabContainer->addTabPanel(mMsgPanel, mMsgPanel->getLabel());
mMsgPanel->setDefaultBtn(default_btn);
mSkinsPanel = new LLPanelSkins();
mTabContainer->addTabPanel(mSkinsPanel, mSkinsPanel->getLabel(), FALSE, onTabChanged, mTabContainer);
mTabContainer->addTabPanel(mSkinsPanel, mSkinsPanel->getLabel());
mSkinsPanel->setDefaultBtn(default_btn);
mGridsPanel = HippoPanelGrids::create();
mTabContainer->addTabPanel(mGridsPanel, mGridsPanel->getLabel(), FALSE, onTabChanged, mTabContainer);
mTabContainer->addTabPanel(mGridsPanel, mGridsPanel->getLabel());
mGridsPanel->setDefaultBtn(default_btn);
mPrefsAscentChat = new LLPrefsAscentChat();
mTabContainer->addTabPanel(mPrefsAscentChat, mPrefsAscentChat->getLabel(), FALSE, onTabChanged, mTabContainer);
mTabContainer->addTabPanel(mPrefsAscentChat, mPrefsAscentChat->getLabel());
mPrefsAscentChat->setDefaultBtn(default_btn);
mPrefsAscentSys = new LLPrefsAscentSys();
mTabContainer->addTabPanel(mPrefsAscentSys, mPrefsAscentSys->getLabel(), FALSE, onTabChanged, mTabContainer);
mTabContainer->addTabPanel(mPrefsAscentSys, mPrefsAscentSys->getLabel());
mPrefsAscentSys->setDefaultBtn(default_btn);
mPrefsAscentVan = new LLPrefsAscentVan();
mTabContainer->addTabPanel(mPrefsAscentVan, mPrefsAscentVan->getLabel(), FALSE, onTabChanged, mTabContainer);
mTabContainer->addTabPanel(mPrefsAscentVan, mPrefsAscentVan->getLabel());
mPrefsAscentVan->setDefaultBtn(default_btn);
mTabContainer->setCommitCallback(boost::bind(LLPreferenceCore::onTabChanged,_1));
if (!mTabContainer->selectTab(gSavedSettings.getS32("LastPrefTab")))
{
mTabContainer->selectFirstTab();
@@ -363,9 +365,9 @@ void LLPreferenceCore::cancel()
}
// static
void LLPreferenceCore::onTabChanged(void* user_data, bool from_click)
void LLPreferenceCore::onTabChanged(LLUICtrl* ctrl)
{
LLTabContainer* self = (LLTabContainer*)user_data;
LLTabContainer* self = (LLTabContainer*)ctrl;
gSavedSettings.setS32("LastPrefTab", self->getCurrentPanelIndex());
}

View File

@@ -78,7 +78,7 @@ public:
void setPersonalInfo(const std::string& visibility, bool im_via_email, const std::string& email);
static void onTabChanged(void* user_data, bool from_click);
static void onTabChanged(LLUICtrl* ctrl);
// refresh all the graphics preferences menus
void refreshEnabledGraphics();

View File

@@ -160,6 +160,8 @@ LLFloaterTestImpl::LLFloaterTestImpl()
addChild(tab);
mTab = tab;
tab->setCommitCallback(boost::bind(&LLFloaterTestImpl::onClickTab,_1,_2));
//-----------------------------------------------------------------------
// First tab container panel
//-----------------------------------------------------------------------
@@ -167,8 +169,7 @@ LLFloaterTestImpl::LLFloaterTestImpl()
LLRect(0, 400, 400, 0), // dummy rect
TRUE); // bordered
tab->addTabPanel(panel, std::string("First"),
TRUE, // select
onClickTab, this);
TRUE); // select
y = panel->getRect().getHeight() - VPAD;
@@ -284,8 +285,7 @@ LLFloaterTestImpl::LLFloaterTestImpl()
LLRect(0, 400, 400, 0), // dummy rect
TRUE); // bordered
tab->addTabPanel(panel, std::string("Second"),
FALSE, // select
onClickTab, this);
FALSE); // select
y = panel->getRect().getHeight() - VPAD;

View File

@@ -607,12 +607,14 @@ private:
std::string mItemName;
void (*mCommitCallback)(LLWearableSaveAsDialog*,void*);
void* mCallbackUserData;
LLPanelEditWearable* mParent;
public:
LLWearableSaveAsDialog( const std::string& desc, void(*commit_cb)(LLWearableSaveAsDialog*,void*), void* userdata )
LLWearableSaveAsDialog( const std::string& desc, LLPanelEditWearable* parent, void(*commit_cb)(LLWearableSaveAsDialog*,void*), void* userdata )
: LLModalDialog( LLStringUtil::null, 240, 100 ),
mCommitCallback( commit_cb ),
mCallbackUserData( userdata )
mCallbackUserData( userdata ),
mParent( parent )
{
LLUICtrlFactory::getInstance()->buildFloater(this, "floater_wearable_save_as.xml");
@@ -621,7 +623,11 @@ public:
childSetTextArg("name ed", "[DESC]", desc);
}
~LLWearableSaveAsDialog()
{
if(mParent && mParent->mActiveModal == this)
mParent->mActiveModal = NULL;
}
virtual void startModal()
{
LLModalDialog::startModal();
@@ -658,11 +664,20 @@ public:
LLPanelEditWearable::LLPanelEditWearable( LLWearableType::EType type )
: LLPanel( LLWearableType::getTypeLabel( type ) ),
mType( type )
mType( type ),
mActiveModal( NULL ),
mCurrentIndex( 0 ),
mCurrentWearable( NULL ),
mPendingWearable( NULL ),
mPendingRefresh( false )
{
}
LLPanelEditWearable::~LLPanelEditWearable()
{
if(mActiveModal)
{
mActiveModal->close();
}
}
BOOL LLPanelEditWearable::postBuild()
@@ -729,6 +744,23 @@ BOOL LLPanelEditWearable::postBuild()
for_each_picker_ctrl_entry <LLColorSwatchCtrl> (this, mType, boost::bind(init_color_swatch_ctrl, this, _1, _2));
for_each_picker_ctrl_entry <LLTextureCtrl> (this, mType, boost::bind(init_texture_ctrl, this, _1, _2));
}
LLTabContainer* tab = getChild<LLTabContainer>("layer_tabs", true, false);
if(tab)
{
for(U32 i = 1; i <= LLAgentWearables::MAX_CLOTHING_PER_TYPE; ++i)
{
LLPanel* new_panel = new LLPanel(llformat("%i",i));
tab->addTabPanel(new_panel, llformat("Layer %i",i));
}
tab->setCommitCallback(boost::bind(&LLPanelEditWearable::onTabChanged, this, _1));
tab->setValidateCallback(boost::bind(&LLPanelEditWearable::onTabPrecommit, this));
}
childSetTextArg("title_not_worn", "[DESC]", LLWearableType::getTypeLabel( mType ));
childSetTextArg("title_loading", "[DESC]", LLWearableType::getTypeLabel( mType ));
childSetTextArg("title_no_modify", "[DESC]", LLWearableType::getTypeLabel( mType ));
childSetTextArg("title", "[DESC]", LLWearableType::getTypeLabel( mType ));
return TRUE;
}
@@ -743,8 +775,11 @@ void LLPanelEditWearable::draw()
if( gFloaterCustomize->isMinimized() || !isAgentAvatarValid())
return;
refreshWearables(false);
LLWearable* wearable = getWearable();
BOOL has_wearable = (wearable != NULL );
BOOL has_any_wearable = has_wearable || gAgentWearables.getWearableCount(mType);
BOOL is_dirty = isDirty();
BOOL is_modifiable = FALSE;
BOOL is_copyable = FALSE;
@@ -758,16 +793,49 @@ void LLPanelEditWearable::draw()
is_complete = ((LLViewerInventoryItem*)item)->isComplete();
}
childSetEnabled("Save", is_modifiable && is_complete && has_wearable && is_dirty);
childSetEnabled("Save As", is_copyable && is_complete && has_wearable);
childSetEnabled("Revert", has_wearable && is_dirty );
childSetEnabled("Take Off", has_wearable );
childSetVisible("Take Off", mCanTakeOff && has_wearable );
childSetVisible("Create New", !has_wearable );
childSetEnabled("Save", has_wearable && is_modifiable && is_complete && is_dirty);
childSetEnabled("Save As", has_wearable && is_copyable && is_complete);
childSetEnabled("Revert", has_wearable && is_dirty );
childSetEnabled("Take Off", has_wearable);
childSetVisible("Take Off", has_wearable && mCanTakeOff);
childSetVisible("Create New", !has_any_wearable);
childSetVisible("not worn instructions", !has_any_wearable);
childSetVisible("title_not_worn", !has_any_wearable);
childSetVisible("no modify instructions",has_wearable && !is_modifiable);
childSetVisible("title_no_modify", has_wearable && !is_modifiable);
childSetVisible("title", has_wearable && is_modifiable && is_complete);
childSetVisible("title_loading", (!has_wearable && has_any_wearable) || (has_wearable && is_modifiable && !is_complete));
childSetVisible("path", has_wearable);
childSetVisible("square", has_wearable && !is_modifiable); //lock icon
childSetVisible("not worn instructions", !has_wearable );
childSetVisible("no modify instructions", has_wearable && !is_modifiable);
/*LLTabContainer* tab = getChild<LLTabContainer>("layer_tabs", true, false);
if(tab)
{
tab->setEnabled(has_any_wearable);
tab->setVisible(has_any_wearable);
}*/
if(has_wearable && is_modifiable)
{
for_each_picker_ctrl_entry <LLColorSwatchCtrl> (this, mType, boost::bind(update_color_swatch_ctrl, this, _1, _2));
for_each_picker_ctrl_entry <LLTextureCtrl> (this, mType, boost::bind(update_texture_ctrl, this, _1, _2));
for_each_picker_ctrl_entry <LLColorSwatchCtrl> (this, mType, boost::bind(set_enabled_color_swatch_ctrl, is_complete, _1, _2));
for_each_picker_ctrl_entry <LLTextureCtrl> (this, mType, boost::bind(set_enabled_texture_ctrl, is_complete, _1, _2));
for(string_texture_index_map_t::iterator iter = mAlphaCheckbox2Index.begin();
iter != mAlphaCheckbox2Index.end(); ++iter )
{
LLCheckBoxCtrl* ctrl = getChild<LLCheckBoxCtrl>(iter->first, true, false);
if (ctrl)
{
ctrl->setEnabled(is_copyable && is_complete);
ctrl->setVisible(is_copyable && is_complete);
}
}
}
else
{
hideTextureControls();
}
const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(mType);
if (wearable_entry)
@@ -798,15 +866,6 @@ void LLPanelEditWearable::draw()
}
}
childSetVisible("square", !is_modifiable);
childSetVisible("title", FALSE);
childSetVisible("title_no_modify", FALSE);
childSetVisible("title_not_worn", FALSE);
childSetVisible("title_loading", FALSE);
childSetVisible("path", FALSE);
LLTextBox *av_height = getChild<LLTextBox>("avheight",FALSE,FALSE);
if(av_height) //Only display this if the element exists
{
@@ -825,65 +884,6 @@ void LLPanelEditWearable::draw()
av_height->setVisible(TRUE);
av_height->setTextArg("[AVHEIGHT]",avheight.str());
}
if(has_wearable && !is_modifiable)
{
// *TODO:Translate
childSetVisible("title_no_modify", TRUE);
childSetTextArg("title_no_modify", "[DESC]", std::string(LLWearableType::getTypeLabel( mType )));
hideTextureControls();
}
else if(has_wearable && !is_complete)
{
// *TODO:Translate
childSetVisible("title_loading", TRUE);
childSetTextArg("title_loading", "[DESC]", std::string(LLWearableType::getTypeLabel( mType )));
std::string path;
const LLUUID& item_id = wearable->getItemID();
append_path(item_id, path);
childSetVisible("path", TRUE);
childSetTextArg("path", "[PATH]", path);
hideTextureControls();
}
else if(has_wearable && is_modifiable)
{
childSetVisible("title", TRUE);
childSetTextArg("title", "[DESC]", wearable->getName() );
std::string path;
const LLUUID& item_id = wearable->getItemID();
append_path(item_id, path);
childSetVisible("path", TRUE);
childSetTextArg("path", "[PATH]", path);
for_each_picker_ctrl_entry <LLColorSwatchCtrl> (this, mType, boost::bind(update_color_swatch_ctrl, this, _1, _2));
for_each_picker_ctrl_entry <LLTextureCtrl> (this, mType, boost::bind(update_texture_ctrl, this, _1, _2));
for_each_picker_ctrl_entry <LLColorSwatchCtrl> (this, mType, boost::bind(set_enabled_color_swatch_ctrl, is_complete, _1, _2));
for_each_picker_ctrl_entry <LLTextureCtrl> (this, mType, boost::bind(set_enabled_texture_ctrl, is_complete, _1, _2));
for(string_texture_index_map_t::iterator iter = mAlphaCheckbox2Index.begin();
iter != mAlphaCheckbox2Index.end(); ++iter )
{
LLCheckBoxCtrl* ctrl = getChild<LLCheckBoxCtrl>(iter->first, true, false);
if (ctrl)
{
ctrl->setEnabled(is_copyable && is_complete);
ctrl->setVisible(is_copyable && is_complete);
}
}
}
else
{
// *TODO:Translate
childSetVisible("title_not_worn", TRUE);
childSetTextArg("title_not_worn", "[DESC]", std::string(LLWearableType::getTypeLabel( mType )));
hideTextureControls();
}
childSetVisible("icon", has_wearable && is_modifiable);
LLPanel::draw();
}
@@ -897,17 +897,84 @@ void LLPanelEditWearable::setVisible(BOOL visible)
}
}
void LLPanelEditWearable::setWearable(LLWearable* wearable, U32 perm_mask, BOOL is_complete)
void LLPanelEditWearable::onTabChanged(LLUICtrl* ctrl)
{
if( wearable )
if(mPendingWearable)
return;
U32 tab_index = ((LLTabContainer*)ctrl)->getCurrentPanelIndex();
U32 wearable_index = gAgentWearables.getWearableCount(mType) - tab_index - 1;
if(wearable_index != mCurrentIndex )
{
setUIPermissions(perm_mask, is_complete);
if (mType == LLWearableType::WT_ALPHA)
setWearableIndex(wearable_index);
}
}
bool LLPanelEditWearable::onTabPrecommit()
{
return !mPendingWearable;
}
void LLPanelEditWearable::setWearableIndex(S32 index)
{
if(mPendingWearable)
return;
mCurrentIndex = index;
LLTabContainer* tab = getChild<LLTabContainer>("layer_tabs", true, false);
if(tab)
{
U32 tab_index = gAgentWearables.getWearableCount(mType) - index - 1;
if(tab->getCurrentPanelIndex() != tab_index)
tab->selectTab(tab_index);
}
LLWearable* wearable = gAgentWearables.getWearable(mType,mCurrentIndex);
if(wearable == getWearable())
return;
mCurrentWearable = wearable;
if(wearable)
{
childSetTextArg("title", "[DESC]", wearable->getName() );
childSetTextArg("title_no_modify", "[DESC]", wearable->getName());
}
else
{
childSetTextArg("title", "[DESC]", std::string(LLWearableType::getTypeLabel( mType )) );
childSetTextArg("title_no_modify", "[DESC]", std::string(LLWearableType::getTypeLabel( mType )));
}
if(mActiveModal)
mActiveModal->close();
U32 perm_mask = wearable ? PERM_NONE : PERM_ALL;
BOOL is_complete = wearable ? FALSE : TRUE;
if(wearable)
{
LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(wearable->getItemID());
if(item)
{
initPreviousAlphaTextures();
updateAlphaCheckboxes();
perm_mask = item->getPermissions().getMaskOwner();
is_complete = item->isComplete();
if(!is_complete)
{
item->fetchFromServer();
}
}
}
setUIPermissions(perm_mask, is_complete);
if (mType == LLWearableType::WT_ALPHA)
{
initPreviousAlphaTextures();
updateAlphaCheckboxes();
}
const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(mCurrentSubpart);
if(subpart_entry)
{
@@ -916,7 +983,60 @@ void LLPanelEditWearable::setWearable(LLWearable* wearable, U32 perm_mask, BOOL
buildParamList(gFloaterCustomize->getScrollingPanelList(), sorted_params);
}
if(wearable)
{
std::string path;
const LLUUID& item_id = wearable->getItemID();
append_path(item_id, path);
childSetTextArg("path", "[PATH]", path);
}
updateScrollingPanelList();
}
void LLPanelEditWearable::refreshWearables(bool force_immediate)
{
if(!force_immediate && !mPendingRefresh)
return;
mPendingRefresh = false;
U32 index;
if(mPendingWearable)
{
index = gAgentWearables.getWearableIndex(mPendingWearable);
if(index == LLAgentWearables::MAX_CLOTHING_PER_TYPE)
return;
mPendingWearable = NULL;
}
else
{
index = gAgentWearables.getWearableIndex(getWearable());
if(index == LLAgentWearables::MAX_CLOTHING_PER_TYPE)
{
index = gAgentWearables.getWearableCount(mType);
if(index)
--index;
}
}
LLTabContainer* tab = getChild<LLTabContainer>("layer_tabs", true, false);
if(tab)
{
for(U32 i = 0; i < LLAgentWearables::MAX_CLOTHING_PER_TYPE; ++i)
{
tab->enableTabButton(i, i < gAgentWearables.getWearableCount(mType));
}
}
setWearableIndex(index);
}
void LLPanelEditWearable::wearablesChanged()
{
mPendingRefresh = true;
}
// static
@@ -936,11 +1056,13 @@ void LLPanelEditWearable::onBtnSave( void* userdata )
void LLPanelEditWearable::onBtnSaveAs( void* userdata )
{
LLPanelEditWearable* self = (LLPanelEditWearable*) userdata;
LLWearable* wearable = gAgentWearables.getWearable( self->getType(), 0 ); // TODO: MULTI-WEARABLE
if(self->mActiveModal)
return;
LLWearable* wearable = self->getWearable();
if( wearable )
{
LLWearableSaveAsDialog* save_as_dialog = new LLWearableSaveAsDialog( wearable->getName(), onSaveAsCommit, self );
save_as_dialog->startModal();
self->mActiveModal = new LLWearableSaveAsDialog( wearable->getName(), self, onSaveAsCommit, self );
self->mActiveModal->startModal();
// LLWearableSaveAsDialog deletes itself.
}
}
@@ -958,7 +1080,7 @@ void LLPanelEditWearable::onCommitSexChange()
if (!isAgentAvatarValid()) return;
LLWearableType::EType type = mType; // TODO: MULTI-WEARABLE
U32 index = 0; // TODO: MULTI-WEARABLE
U32 index = mCurrentIndex; // TODO: MULTI-WEARABLE
if( !gAgentWearables.isWearableModifiable(type, index))
{
@@ -1039,7 +1161,7 @@ bool LLPanelEditWearable::onSelectAutoWearOption(const LLSD& notification, const
LLWearable* LLPanelEditWearable::getWearable() const
{
return gAgentWearables.getWearable(mType, 0); // TODO: MULTI-WEARABLE
return mCurrentWearable;//gAgentWearables.getWearable(mType, mCurrentIndex); // TODO: MULTI-WEARABLE
}
@@ -1132,7 +1254,7 @@ void LLPanelEditWearable::hideTextureControls()
void LLPanelEditWearable::saveChanges(bool force_save_as, std::string new_name)
{
if (!getWearable() || !isDirty())
if (!getWearable() || (!force_save_as && !isDirty()))
{
// do nothing if no unsaved changes
return;
@@ -1144,9 +1266,15 @@ void LLPanelEditWearable::saveChanges(bool force_save_as, std::string new_name)
{
// the name of the wearable has changed, re-save wearable with new name
LLAppearanceMgr::instance().removeCOFItemLinks(getWearable()->getItemID(),false);
gAgentWearables.saveWearableAs(mType, index, new_name, FALSE);
childSetTextArg("title", "[DESC]", new_name );
}
LLWearable* new_wearable = gAgentWearables.saveWearableAs(mType, index, new_name, FALSE);
if(new_wearable)
{
mPendingWearable = new_wearable;
mCurrentWearable = new_wearable;
childSetTextArg("title", "[DESC]", new_wearable->getName());
childSetTextArg("title_no_modify", "[DESC]", new_wearable->getName());
}
}
else
{
gAgentWearables.saveWearable(mType, index, TRUE, new_name);
@@ -1173,6 +1301,7 @@ void LLPanelEditWearable::revertChanges()
void LLPanelEditWearable::showDefaultSubpart()
{
refreshWearables(true);
changeCamera(0);
}
@@ -1312,7 +1441,7 @@ void LLPanelEditWearable::updateScrollingPanelUI()
return;
}
llinfos << llformat("%#.8lX",wearable) << llendl;
llinfos << llformat("%#.8lX",wearable) << llendl;
llinfos << "cur_wearable->isDirty()=" << wearable->isDirty() << llendl;
LLViewerInventoryItem* item = gInventory.getItem(wearable->getItemID());
@@ -1330,13 +1459,14 @@ void LLPanelEditWearable::onBtnTakeOff( void* userdata )
{
LLPanelEditWearable* self = (LLPanelEditWearable*) userdata;
LLWearable* wearable = gAgentWearables.getWearable( self->mType, 0 ); // TODO: MULTI-WEARABLE
LLWearable* wearable = self->getWearable();
if( !wearable )
{
return;
}
gAgentWearables.removeWearable( self->mType, false, 0 ); // TODO: MULTI-WEARABLE
LLAppearanceMgr::instance().removeItemFromAvatar(wearable->getItemID());
self->refreshWearables(true);
}
// static
@@ -1382,7 +1512,7 @@ void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value
for(value_map_t::iterator it = sorted_params.begin(); it != end; ++it)
{
LLScrollingPanelParam *panel_param = NULL;
panel_param = new LLScrollingPanelParam( "LLScrollingPanelParam", NULL, (*it).second.second, (*it).second.first, (mType != LLWearableType::WT_PHYSICS));
panel_param = new LLScrollingPanelParam( "LLScrollingPanelParam", NULL, (*it).second.second, (*it).second.first, getWearable(), (mType != LLWearableType::WT_PHYSICS));
panel_list->addPanel( panel_param );
}
}

View File

@@ -67,7 +67,12 @@ public:
LLWearableType::EType getType() const{ return mType; }
LLWearable* getWearable() const;
void setWearable(LLWearable* wearable, U32 perm_mask, BOOL is_complete);
void onTabChanged(LLUICtrl* ctrl);
bool onTabPrecommit();
void setWearableIndex(S32 index);
void refreshWearables(bool force_immediate);
void wearablesChanged();
void saveChanges(bool force_save_as = false, std::string new_name = std::string());
@@ -124,6 +129,14 @@ private:
typedef std::map<LLVOAvatarDefines::ETextureIndex, LLUUID> s32_uuid_map_t;
s32_uuid_map_t mPreviousAlphaTexture;
ESubpart mCurrentSubpart;
U32 mCurrentIndex;
LLWearable* mCurrentWearable;
LLWearable* mPendingWearable; //For SaveAs. There's a period where the old wearable will be removed, but the new one will still be pending,
//so this is needed to retain focus on this wearables tab over the messy transition.
bool mPendingRefresh; //LLAgentWearables::setWearableOutfit fires a buttload of remove/wear calls which spams wearablesChanged
//a bazillion pointless (and not particularly valid) times. Deferring to draw effectively sorts it all out.
public:
LLModalDialog* mActiveModal;
};
#endif

View File

@@ -250,10 +250,8 @@ BOOL LLPanelGroup::postBuild()
// Pass on whether or not to allow edit to tabs.
panelp->setAllowEdit(mAllowEdit);
panelp->addObserver(this);
mTabContainer->setTabChangeCallback(panelp, onClickTab);
mTabContainer->setTabUserData(panelp, this);
}
mTabContainer->setCommitCallback(boost::bind(&LLPanelGroup::handleClickTab,this));
updateTabVisibility();
// Act as though this tab was just activated.
@@ -321,13 +319,6 @@ void LLPanelGroup::tabChanged()
}
}
// static
void LLPanelGroup::onClickTab(void* user_data, bool from_click)
{
LLPanelGroup* self = static_cast<LLPanelGroup*>(user_data);
self->handleClickTab();
}
void LLPanelGroup::handleClickTab()
{
// If we are already handling a transition,
@@ -377,7 +368,7 @@ void LLPanelGroup::selectTab(std::string tab_name)
if ( tabp && mTabContainer )
{
mTabContainer->selectTabPanel(tabp);
onClickTab(this, false);
handleClickTab();
}
}

View File

@@ -70,7 +70,6 @@ public:
static void onBtnCancel(void*);
static void onBtnApply(void*);
static void onBtnRefresh(void*);
static void onClickTab(void*,bool);
void handleClickTab();
void setGroupID(const LLUUID& group_id);

View File

@@ -82,7 +82,7 @@ public:
static void clickEarlierCallback(void* data);
static void clickLaterCallback(void* data);
static void clickTabCallback(void* user_data, bool from_click);
void clickTabCallback(const LLSD &param);
static LLMap<LLUUID, LLGroupMoneyTabEventHandler*> sInstanceIDs;
static std::map<LLPanel*, LLGroupMoneyTabEventHandler*> sTabsToHandlers;
@@ -924,8 +924,7 @@ LLGroupMoneyTabEventHandler::LLGroupMoneyTabEventHandler(LLButton* earlier_butto
if ( tab_containerp && panelp )
{
tab_containerp->setTabChangeCallback(panelp, clickTabCallback);
tab_containerp->setTabUserData(panelp, this);
tab_containerp->setCommitCallback(boost::bind(&LLGroupMoneyTabEventHandler::clickTabCallback, this, _2));
}
sInstanceIDs.addData(mImplementationp->mPanelID, this);
@@ -997,11 +996,10 @@ void LLGroupMoneyTabEventHandler::clickLaterCallback(void* data)
if ( selfp ) selfp->onClickLater();
}
//static
void LLGroupMoneyTabEventHandler::clickTabCallback(void* data, bool from_click)
void LLGroupMoneyTabEventHandler::clickTabCallback(const LLSD& param)
{
LLGroupMoneyTabEventHandler* selfp = (LLGroupMoneyTabEventHandler*) data;
if ( selfp ) selfp->onClickTab();
if(param.asString() == "group_money_details_tab")
onClickTab();
}
// **************************************************

View File

@@ -147,10 +147,6 @@ BOOL LLPanelGroupRoles::postBuild()
{
LLPanelGroupSubTab* subtabp = (LLPanelGroupSubTab*) mSubTabContainer->getPanelByIndex(i);
// Add click callbacks to all the tabs.
mSubTabContainer->setTabChangeCallback(subtabp, onClickSubTab);
mSubTabContainer->setTabUserData(subtabp, this);
// Hand the subtab a pointer to this LLPanelGroupRoles, so that it can
// look around for the widgets it is interested in.
if (!subtabp->postBuildSubTab(this)) return FALSE;
@@ -158,6 +154,9 @@ BOOL LLPanelGroupRoles::postBuild()
subtabp->addObserver(this);
}
// Add click callbacks to all the tabs.
mSubTabContainer->setCommitCallback(boost::bind(&LLPanelGroupRoles::handleClickSubTab,this));
// Set the current tab to whatever is currently being shown.
mCurrentTab = (LLPanelGroupTab*) mSubTabContainer->getCurrentPanel();
if (!mCurrentTab)
@@ -198,13 +197,6 @@ BOOL LLPanelGroupRoles::isVisibleByAgent(LLAgent* agentp)
}
// static
void LLPanelGroupRoles::onClickSubTab(void* user_data, bool from_click)
{
LLPanelGroupRoles* self = static_cast<LLPanelGroupRoles*>(user_data);
self->handleClickSubTab();
}
void LLPanelGroupRoles::handleClickSubTab()
{
// If we are already handling a transition,

View File

@@ -64,7 +64,6 @@ public:
virtual BOOL isVisibleByAgent(LLAgent* agentp);
static void* createTab(void* data);
static void onClickSubTab(void*,bool);
void handleClickSubTab();
// Checks if the current tab needs to be applied, and tries to switch to the requested tab.

View File

@@ -215,9 +215,7 @@ BOOL LLInventoryView::postBuild()
sActiveViews.put(this);
childSetTabChangeCallback("inventory filter tabs", "All Items", onFilterSelected, this);
childSetTabChangeCallback("inventory filter tabs", "Recent Items", onFilterSelected, this);
childSetTabChangeCallback("inventory filter tabs", "Worn Items", onFilterSelected, this);
getChild<LLTabContainer>("inventory filter tabs")->setCommitCallback(boost::bind(&LLInventoryView::onFilterSelected,this));
childSetAction("Inventory.ResetAll",onResetAll,this);
childSetAction("Inventory.ExpandAll",onExpandAll,this);
@@ -764,21 +762,19 @@ void LLInventoryView::onCollapseAll(void* userdata)
self->mActivePanel->closeAllFolders();
}
//static
void LLInventoryView::onFilterSelected(void* userdata, bool from_click)
void LLInventoryView::onFilterSelected()
{
LLInventoryView* self = (LLInventoryView*) userdata;
// Find my index
self->mActivePanel = (LLInventoryPanel*)self->childGetVisibleTab("inventory filter tabs");
mActivePanel = (LLInventoryPanel*)childGetVisibleTab("inventory filter tabs");
if (!self->mActivePanel)
if (!mActivePanel)
{
return;
}
//self->setFilterSubString(self->mFilterSubString);
LLInventoryFilter* filter = self->mActivePanel->getFilter();
LLFloaterInventoryFinder *finder = self->getFinder();
//>setFilterSubString(self->mFilterSubString);
LLInventoryFilter* filter = mActivePanel->getFilter();
LLFloaterInventoryFinder *finder = getFinder();
if (finder)
{
finder->changeFilter(filter);
@@ -788,8 +784,8 @@ void LLInventoryView::onFilterSelected(void* userdata, bool from_click)
// If our filter is active we may be the first thing requiring a fetch so we better start it here.
LLInventoryModelBackgroundFetch::instance().start();
}
self->setFilterTextFromFilter();
self->updateSortControls();
setFilterTextFromFilter();
updateSortControls();
}
const std::string LLInventoryView::getFilterSubString()

View File

@@ -107,7 +107,7 @@ public:
static BOOL checkFoldersByName(void *user_data);
static void onFilterSelected(void* userdata, bool from_click);
void onFilterSelected();
const std::string getFilterSubString();
void setFilterSubString(const std::string& string);

View File

@@ -577,7 +577,7 @@ void LLMultiPreview::handleReshape(const LLRect& new_rect, bool by_user)
}
void LLMultiPreview::tabOpen(LLFloater* opened_floater, bool from_click)
void LLMultiPreview::tabOpen(LLFloater* opened_floater)
{
LLPreview* opened_preview = (LLPreview*)opened_floater;
if (opened_preview && opened_preview->getAssetStatus() == LLPreview::PREVIEW_ASSET_UNLOADED)

View File

@@ -53,7 +53,7 @@ public:
LLMultiPreview(const LLRect& rect);
/*virtual*/void open(); /*Flawfinder: ignore*/
/*virtual*/void tabOpen(LLFloater* opened_floater, bool from_click);
/*virtual*/void tabOpen(LLFloater* opened_floater);
/*virtual*/ void handleReshape(const LLRect& new_rect, bool by_user = false);
static LLMultiPreview* getAutoOpenInstance(const LLUUID& id);

View File

@@ -57,8 +57,8 @@ const S32 PARAM_PANEL_HEIGHT = 2 * BTN_BORDER + LLScrollingPanelParam::PARAM_HIN
S32 LLScrollingPanelParam::sUpdateDelayFrames = 0;
LLScrollingPanelParam::LLScrollingPanelParam( const std::string& name,
LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, bool bVisualHint )
: LLScrollingPanelParamBase( name, mesh, param, allow_modify, bVisualHint, LLRect( 0, PARAM_PANEL_HEIGHT, PARAM_PANEL_WIDTH, 0 )),
LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, bool bVisualHint )
: LLScrollingPanelParamBase( name, mesh, param, allow_modify, wearable, bVisualHint, LLRect( 0, PARAM_PANEL_HEIGHT, PARAM_PANEL_WIDTH, 0 )),
mLess(NULL),
mMore(NULL)
{
@@ -70,9 +70,9 @@ LLScrollingPanelParam::LLScrollingPanelParam( const std::string& name,
F32 min_weight = param->getMinWeight();
F32 max_weight = param->getMaxWeight();
mHintMin = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, param, min_weight);
mHintMin = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, param, mWearable, min_weight);
pos_x += PARAM_HINT_WIDTH + 3 * BTN_BORDER;
mHintMax = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, param, max_weight );
mHintMax = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, param, mWearable, max_weight );
mHintMin->setAllowsUpdates( FALSE );
mHintMax->setAllowsUpdates( FALSE );
@@ -107,9 +107,7 @@ LLScrollingPanelParam::~LLScrollingPanelParam()
void LLScrollingPanelParam::updatePanel(BOOL allow_modify)
{
LLWearable* wearable = gAgentWearables.getWearable((LLWearableType::EType)mParam->getWearableType(),0); // TODO: MULTI-WEARABLE
if(!wearable)
if(!mWearable)
{
// not editing a wearable just now, no update necessary
return;
@@ -150,9 +148,7 @@ void LLScrollingPanelParam::setVisible( BOOL visible )
void LLScrollingPanelParam::draw()
{
LLWearable* wearable = gAgentWearables.getWearable((LLWearableType::EType)mParam->getWearableType(),0); // TODO: MULTI-WEARABLE
if( !wearable || gFloaterCustomize->isMinimized() )
if( !mWearable || gFloaterCustomize->isMinimized() )
{
return;
}
@@ -219,15 +215,14 @@ void LLScrollingPanelParam::onHintMouseDown( bool max )
{
LLVisualParamHint* hint = max ? mHintMax : mHintMin;
LLViewerVisualParam* param = hint->getVisualParam();
LLWearable* wearable = gAgentWearables.getWearable((LLWearableType::EType)mParam->getWearableType(),0); // TODO: MULTI-WEARABLE
if(!wearable || !param)
if(!mWearable || !param)
{
return;
}
// morph towards this result
F32 current_weight = wearable->getVisualParamWeight( hint->getVisualParam()->getID() );
F32 current_weight = mWearable->getVisualParamWeight( hint->getVisualParam()->getID() );
// if we have maxed out on this morph, we shouldn't be able to click it
if( hint->getVisualParamWeight() != current_weight )
@@ -241,14 +236,13 @@ void LLScrollingPanelParam::onHintHeldDown( bool max )
{
LLVisualParamHint* hint = max ? mHintMax : mHintMin;
LLViewerVisualParam* param = hint->getVisualParam();
LLWearable* wearable = gAgentWearables.getWearable((LLWearableType::EType)param->getWearableType(),0); // TODO: MULTI-WEARABLE
if(!wearable || !param)
if(!mWearable || !param)
{
return;
}
F32 current_weight = wearable->getVisualParamWeight( param->getID() );
F32 current_weight = mWearable->getVisualParamWeight( param->getID() );
if (current_weight != hint->getVisualParamWeight() )
{
@@ -275,8 +269,8 @@ void LLScrollingPanelParam::onHintHeldDown( bool max )
if (slider->getMinValue() < new_percent
&& new_percent < slider->getMaxValue())
{
wearable->setVisualParamWeight(param->getID(), new_weight, FALSE);
wearable->writeToAvatar();
mWearable->setVisualParamWeight(param->getID(), new_weight, FALSE);
mWearable->writeToAvatar();
gAgentAvatarp->updateVisualParams();
slider->setValue( weightToPercent( new_weight ) );
@@ -297,11 +291,10 @@ void LLScrollingPanelParam::onHintMouseUp( bool max )
{
LLViewerVisualParam* param = hint->getVisualParam();
LLWearable* wearable = gAgentWearables.getWearable((LLWearableType::EType)param->getWearableType(),0); // TODO: MULTI-WEARABLE
if(wearable)
if(mWearable)
{
// step in direction
F32 current_weight = wearable->getVisualParamWeight( param->getID() );
F32 current_weight = mWearable->getVisualParamWeight( param->getID() );
F32 range = mHintMax->getVisualParamWeight() - mHintMin->getVisualParamWeight();
//if min, range should be negative.
if(!max)
@@ -315,8 +308,8 @@ void LLScrollingPanelParam::onHintMouseUp( bool max )
if (slider->getMinValue() < new_percent
&& new_percent < slider->getMaxValue())
{
wearable->setVisualParamWeight(param->getID(), new_weight, FALSE);
wearable->writeToAvatar();
mWearable->setVisualParamWeight(param->getID(), new_weight, FALSE);
mWearable->writeToAvatar();
slider->setValue( weightToPercent( new_weight ) );
}
}

View File

@@ -40,7 +40,7 @@ class LLJoint;
class LLScrollingPanelParam : public LLScrollingPanelParamBase
{
public:
LLScrollingPanelParam( const std::string& name, LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, bool bVisualHint );
LLScrollingPanelParam( const std::string& name, LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, bool bVisualHint );
virtual ~LLScrollingPanelParam();
virtual void draw();
@@ -69,7 +69,6 @@ public:
protected:
LLTimer mMouseDownTimer; // timer for how long mouse has been held down on a hint.
F32 mLastHeldTime;
BOOL mAllowModify;
};

View File

@@ -41,10 +41,11 @@
#include "llagentwearables.h"
LLScrollingPanelParamBase::LLScrollingPanelParamBase( const std::string& name,
LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, bool bVisualHint, LLRect rect )
LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, bool bVisualHint, LLRect rect )
: LLScrollingPanel( name, rect ),
mParam(param),
mAllowModify(allow_modify)
mAllowModify(allow_modify),
mWearable(wearable)
{
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_scrolling_param.xml");
//Set up the slider
@@ -87,14 +88,14 @@ LLScrollingPanelParamBase::~LLScrollingPanelParamBase()
void LLScrollingPanelParamBase::updatePanel(BOOL allow_modify)
{
LLViewerVisualParam* param = mParam;
LLWearable* wearable = gAgentWearables.getWearable( (LLWearableType::EType)param->getWearableType(), 0 ); // TODO: MULTI-WEARABLE
if(!wearable)
if(!mWearable)
{
// not editing a wearable just now, no update necessary
return;
}
F32 current_weight = wearable->getVisualParamWeight( param->getID() );
F32 current_weight = mWearable->getVisualParamWeight( param->getID() );
childSetValue("param slider", weightToPercent( current_weight ) );
mAllowModify = allow_modify;
childSetEnabled("param slider", mAllowModify);
@@ -107,21 +108,19 @@ void LLScrollingPanelParamBase::onSliderMoved(LLUICtrl* ctrl)
return;
}
LLWearable* wearable = gAgentWearables.getWearable( (LLWearableType::EType)mParam->getWearableType(), 0 ); // TODO: MULTI-WEARABLE
if(!wearable)
if(!mWearable)
{
return;
}
LLSliderCtrl* slider = (LLSliderCtrl*) ctrl;
F32 current_weight = wearable->getVisualParamWeight(mParam->getID());
F32 current_weight = mWearable->getVisualParamWeight(mParam->getID());
F32 new_weight = percentToWeight( (F32)slider->getValue().asReal() );
if (current_weight != new_weight )
{
wearable->setVisualParamWeight( mParam->getID(), new_weight, FALSE);
wearable->writeToAvatar();
mWearable->setVisualParamWeight( mParam->getID(), new_weight, FALSE);
mWearable->writeToAvatar();
gAgentAvatarp->updateVisualParams();
}
}

View File

@@ -42,7 +42,7 @@ class LLScrollingPanelParamBase : public LLScrollingPanel
{
public:
LLScrollingPanelParamBase( const std::string& name,
LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, bool bVisualHint, LLRect rect );
LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, bool bVisualHint, LLRect rect );
virtual ~LLScrollingPanelParamBase();
virtual void updatePanel(BOOL allow_modify);
@@ -56,6 +56,7 @@ public:
LLViewerVisualParam* mParam;
protected:
BOOL mAllowModify;
LLWearable *mWearable;
};
#endif

View File

@@ -81,6 +81,7 @@ LLVisualParamHint::LLVisualParamHint(
S32 width, S32 height,
LLViewerJointMesh *mesh,
LLViewerVisualParam *param,
LLWearable *wearable,
F32 param_weight)
:
LLViewerDynamicTexture(width, height, 3, LLViewerDynamicTexture::ORDER_MIDDLE, TRUE ),
@@ -88,6 +89,7 @@ LLVisualParamHint::LLVisualParamHint(
mIsVisible( FALSE ),
mJointMesh( mesh ),
mVisualParam( param ),
mWearablePtr( wearable ),
mVisualParamWeight( param_weight ),
mAllowsUpdates( TRUE ),
mDelayFrames( 0 ),
@@ -153,12 +155,7 @@ BOOL LLVisualParamHint::needsRender()
void LLVisualParamHint::preRender(BOOL clear_depth)
{
mLastParamWeight = mVisualParam->getWeight();
LLWearable* wearable = gAgentWearables.getWearable((LLWearableType::EType)mVisualParam->getWearableType(),0); // TODO: MULTI-WEARABLE
if(wearable)
{
llinfos << llformat("%#.8lX",wearable) << llendl;
wearable->setVisualParamWeight(mVisualParam->getID(), mVisualParamWeight, FALSE);
}
if(mWearablePtr)mWearablePtr->setVisualParamWeight(mVisualParam->getID(), mVisualParamWeight, FALSE);
gAgentAvatarp->setVisualParamWeight(mVisualParam->getID(), mVisualParamWeight, FALSE);
gAgentAvatarp->setVisualParamWeight("Blink_Left", 0.f);
gAgentAvatarp->setVisualParamWeight("Blink_Right", 0.f);
@@ -259,8 +256,7 @@ BOOL LLVisualParamHint::render()
gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
}
gAgentAvatarp->setVisualParamWeight(mVisualParam->getID(), mLastParamWeight);
LLWearable* wearable = gAgentWearables.getWearable((LLWearableType::EType)mVisualParam->getWearableType(),0); // TODO: MULTI-WEARABLE
if(wearable)wearable->setVisualParamWeight(mVisualParam->getID(), mLastParamWeight, FALSE);
if(mWearablePtr)mWearablePtr->setVisualParamWeight(mVisualParam->getID(), mLastParamWeight, FALSE);
gAgentAvatarp->updateVisualParams();
gGL.color4f(1,1,1,1);
mGLTexturep->setGLTextureCreated(true);

View File

@@ -62,6 +62,7 @@ public:
S32 width, S32 height,
LLViewerJointMesh *mesh,
LLViewerVisualParam *param,
LLWearable *wearable,
F32 param_weight);
/*virtual*/ S8 getType() const ;
@@ -89,6 +90,7 @@ protected:
BOOL mIsVisible; // is this distortion hint visible?
LLViewerJointMesh* mJointMesh; // mesh that this distortion applies to
LLViewerVisualParam* mVisualParam; // visual param applied by this hint
LLWearable* mWearablePtr; // wearable we're editing
F32 mVisualParamWeight; // weight for this visual parameter
BOOL mAllowsUpdates; // updates are blocked unless this is true
S32 mDelayFrames; // updates are blocked for this many frames

View File

@@ -817,17 +817,6 @@ const LLSD SHClientTagMgr::generateClientTag(const LLVOAvatar* pAvatar) const
if(!mClientDefinitions.empty())
{
std::map<LLUUID, LLSD>::const_iterator it = mClientDefinitions.find(id);
/*S32 idx = ll_rand(mClientDefinitions.size()-1);
for(;it!=mClientDefinitions.end();++it)
{
if(!idx--)
{
llinfos << "[" << idx << "] Returning " << it->second["name"] << " : " << it->second["id"] << llendl;
return it->second;
}
else
llinfos << "[" << idx << "] Skipping " << it->second["name"] << " : " << it->second["id"] << llendl;
}*/
if(it != mClientDefinitions.end())
{
return it->second;

View File

@@ -763,7 +763,7 @@ void LLWearable::removeFromAvatar( LLWearableType::EType type, BOOL upload_bake
if(gAgentCamera.cameraCustomizeAvatar())
{
gFloaterCustomize->setWearable(type, NULL);
gFloaterCustomize->wearablesChanged(type);
}
gAgentAvatarp->updateVisualParams();

View File

@@ -86,17 +86,17 @@
mouse_opaque="true" name="path" v_pad="0" width="373">
Located in [PATH]
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="373">
Put on a new shape by dragging one from your inventory
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-104" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="center" height="28" left="102"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="284">
Put on a new shape by dragging one from your inventory
to your avatar. Alternately, you create a new one from
scratch and wear it.
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
bottom="-50" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="14" left="8"
mouse_opaque="true" name="no modify instructions" v_pad="0" width="373">
You do not have permission to modify this wearable.
</text>
@@ -106,8 +106,8 @@ scratch and wear it.
mouse_opaque="true" name="Item Action Label" v_pad="0" width="100">
Shape:
</text>
<button bottom="-128" follows="left|top" halign="center" height="24"
label="Create New Shape" label_selected="Create New Shape" left="8"
<button bottom="-148" follows="left|top" halign="center" height="24"
label="Create New Shape" label_selected="Create New Shape" left="160"
mouse_opaque="true" name="Create New" scale_image="true" width="170" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-420" drop_shadow_visible="true" follows="right|bottom"
@@ -184,16 +184,16 @@ scratch and wear it.
Located in [PATH]
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="373">
Put on a new skin by dragging one from your inventory
bottom="-104" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="center" height="28" left="102"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="284">
Put on a new skin by dragging one from your inventory
to your avatar. Alternately, you create a new one from
scratch and wear it.
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
bottom="-50" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="14" left="8"
mouse_opaque="true" name="no modify instructions" v_pad="0" width="373">
You do not have permission to modify this wearable.
</text>
@@ -215,8 +215,8 @@ scratch and wear it.
default_image_name="Default" follows="left|top" height="80"
label="Lower Tattoos" left="8" mouse_opaque="true" name="Lower Tattoos"
tool_tip="Click to choose a picture" width="74" />
<button bottom="-128" follows="left|top" halign="center" height="24"
label="Create New Skin" label_selected="Create New Skin" left="8"
<button bottom="-148" follows="left|top" halign="center" height="24"
label="Create New Skin" label_selected="Create New Skin" left="160"
mouse_opaque="true" name="Create New" scale_image="true" width="170" />
<button bottom="-478" follows="right|bottom" font="SansSerif" halign="center"
height="20" label="Save" label_selected="Save" left="123"
@@ -278,16 +278,16 @@ scratch and wear it.
Located in [PATH]
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="373">
Put on a new hair by dragging one from your inventory
bottom="-104" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="102"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="284">
Put on a new hair by dragging one from your inventory
to your avatar. Alternately, you create a new one from
scratch and wear it.
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
bottom="-50" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="14" left="8"
mouse_opaque="true" name="no modify instructions" v_pad="0" width="373">
You do not have permission to modify this wearable.
</text>
@@ -301,8 +301,8 @@ scratch and wear it.
default_image_name="Default" follows="left|top" height="80" label="Texture"
left="8" mouse_opaque="true" name="Texture"
tool_tip="Click to choose a picture" width="64" />
<button bottom="-128" follows="left|top" halign="center" height="24"
label="Create New Hair" label_selected="Create New Hair" left="8"
<button bottom="-148" follows="left|top" halign="center" height="24"
label="Create New Hair" label_selected="Create New Hair" left="160"
mouse_opaque="true" name="Create New" scale_image="true" width="170" />
<button bottom="-478" follows="right|bottom" font="SansSerif" halign="center"
height="20" label="Save" label_selected="Save" left="123"
@@ -351,17 +351,17 @@ scratch and wear it.
mouse_opaque="true" name="path" v_pad="0" width="373">
Located in [PATH]
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="373">
Put on a new eyes by dragging one from your inventory
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-104" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="102"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="284">
Put on new eyes by dragging one from your inventory
to your avatar. Alternately, you create a new one from
scratch and wear it.
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
bottom="-50" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="14" left="8"
mouse_opaque="true" name="no modify instructions" v_pad="0" width="373">
You do not have permission to modify this wearable.
</text>
@@ -375,8 +375,8 @@ scratch and wear it.
default_image_name="Default" follows="left|top" height="80" label="Iris"
left="8" mouse_opaque="true" name="Iris"
tool_tip="Click to choose a picture" width="64" />
<button bottom="-128" follows="left|top" halign="center" height="24"
label="Create New Eyes" label_selected="Create New Eyes" left="8"
<button bottom="-148" follows="left|top" halign="center" height="24"
label="Create New Eyes" label_selected="Create New Eyes" left="160"
mouse_opaque="true" name="Create New" scale_image="true" width="170" />
<button bottom="-478" follows="right|bottom" font="SansSerif" halign="center"
height="20" label="Save" label_selected="Save" left="123"
@@ -404,8 +404,8 @@ scratch and wear it.
can_apply_immediately="true" color="1 1 1 1" follows="left|top" height="80"
label="Color/Tint" left="8" mouse_opaque="true" name="Color/Tint"
tool_tip="Click to open Color Picker" width="64" />
<button bottom="-128" follows="left|top" halign="center" height="24"
label="Create New Shirt" label_selected="Create New Shirt" left="8"
<button bottom="-148" follows="left|top" halign="center" height="24"
label="Create New Shirt" label_selected="Create New Shirt" left="160"
mouse_opaque="true" name="Create New" scale_image="true" width="170" />
<button bottom="-250" follows="left|top" font="SansSerif" halign="center"
height="20" label="Take Off" label_selected="Take Off" left="8"
@@ -449,17 +449,18 @@ scratch and wear it.
mouse_opaque="true" name="path" v_pad="0" width="373">
Located in [PATH]
</text>
<tab_container name="layer_tabs" left_delta="85" bottom_delta="-30" height="16" width="300" tab_min_width="55"/>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="373">
Put on a new shirt by dragging one from your inventory
bottom="-104" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="102"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="284">
Put on a new shirt by dragging one from your inventory
to your avatar. Alternately, you create a new one from
scratch and wear it.
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
bottom="-50" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="14" left="8"
mouse_opaque="true" name="no modify instructions" v_pad="0" width="373">
You do not have permission to modify this wearable.
</text>
@@ -485,8 +486,8 @@ scratch and wear it.
can_apply_immediately="true" color="1 1 1 1" follows="left|top" height="80"
label="Color/Tint" left="8" mouse_opaque="true" name="Color/Tint"
tool_tip="Click to open Color Picker" width="64" />
<button bottom="-128" follows="left|top" halign="center" height="24"
label="Create New Pants" label_selected="Create New Pants" left="8"
<button bottom="-148" follows="left|top" halign="center" height="24"
label="Create New Pants" label_selected="Create New Pants" left="160"
mouse_opaque="true" name="Create New" scale_image="true" width="170" />
<button bottom="-250" follows="left|top" font="SansSerif" halign="center"
height="20" label="Take Off" label_selected="Take Off" left="8"
@@ -530,17 +531,18 @@ scratch and wear it.
mouse_opaque="true" name="path" v_pad="0" width="373">
Located in [PATH]
</text>
<tab_container name="layer_tabs" left_delta="85" bottom_delta="-30" height="16" width="300" tab_min_width="55"/>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="373">
Put on a new pants by dragging one from your inventory
bottom="-104" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="102"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="284">
Put on new pants by dragging one from your inventory
to your avatar. Alternately, you create a new one from
scratch and wear it.
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
bottom="-50" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="14" left="8"
mouse_opaque="true" name="no modify instructions" v_pad="0" width="373">
You do not have permission to modify this wearable.
</text>
@@ -588,17 +590,18 @@ scratch and wear it.
mouse_opaque="true" name="path" v_pad="0" width="373">
Located in [PATH]
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="373">
Put on a new shoes by dragging one from your inventory
<tab_container name="layer_tabs" left_delta="85" bottom_delta="-30" height="16" width="300" tab_min_width="55"/>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-104" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="102"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="284">
Put on new shoes by dragging one from your inventory
to your avatar. Alternately, you create a new one from
scratch and wear it.
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
bottom="-50" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="14" left="8"
mouse_opaque="true" name="no modify instructions" v_pad="0" width="373">
You do not have permission to modify this wearable.
</text>
@@ -616,8 +619,8 @@ scratch and wear it.
can_apply_immediately="true" color="1 1 1 1" follows="left|top" height="80"
label="Color/Tint" left="8" mouse_opaque="true" name="Color/Tint"
tool_tip="Click to open Color Picker" width="64" />
<button bottom="-128" follows="left|top" halign="center" height="24"
label="Create New Shoes" label_selected="Create New Shoes" left="8"
<button bottom="-148" follows="left|top" halign="center" height="24"
label="Create New Shoes" label_selected="Create New Shoes" left="160"
mouse_opaque="true" name="Create New" scale_image="true" width="170" />
<button bottom="-250" follows="left|top" font="SansSerif" halign="center"
height="20" label="Take Off" label_selected="Take Off" left="8"
@@ -669,17 +672,18 @@ scratch and wear it.
mouse_opaque="true" name="path" v_pad="0" width="373">
Located in [PATH]
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="373">
Put on a new socks by dragging one from your inventory
<tab_container name="layer_tabs" left_delta="85" bottom_delta="-30" height="16" width="300" tab_min_width="55"/>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-104" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="102"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="284">
Put on new socks by dragging one from your inventory
to your avatar. Alternately, you create a new one from
scratch and wear it.
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
bottom="-50" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="14" left="8"
mouse_opaque="true" name="no modify instructions" v_pad="0" width="373">
You do not have permission to modify this wearable.
</text>
@@ -697,8 +701,8 @@ scratch and wear it.
can_apply_immediately="true" color="1 1 1 1" follows="left|top" height="80"
label="Color/Tint" left="8" mouse_opaque="true" name="Color/Tint"
tool_tip="Click to open Color Picker" width="64" />
<button bottom="-128" follows="left|top" halign="center" height="24"
label="Create New Socks" label_selected="Create New Socks" left="8"
<button bottom="-148" follows="left|top" halign="center" height="24"
label="Create New Socks" label_selected="Create New Socks" left="160"
mouse_opaque="true" name="Create New" scale_image="true" width="170" />
<button bottom="-250" follows="left|top" font="SansSerif" halign="center"
height="20" label="Take Off" label_selected="Take Off" left="8"
@@ -750,17 +754,18 @@ scratch and wear it.
mouse_opaque="true" name="path" v_pad="0" width="373">
Located in [PATH]
</text>
<tab_container name="layer_tabs" left_delta="85" bottom_delta="-30" height="16" width="300" tab_min_width="55"/>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="373">
Put on a new jacket by dragging one from your inventory
bottom="-104" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="102"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="284">
Put on a new jacket by dragging one from your inventory
to your avatar. Alternately, you create a new one from
scratch and wear it.
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
bottom="-50" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="14" left="8"
mouse_opaque="true" name="no modify instructions" v_pad="0" width="373">
You do not have permission to modify this wearable.
</text>
@@ -782,8 +787,8 @@ scratch and wear it.
can_apply_immediately="true" color="1 1 1 1" follows="left|top" height="80"
label="Color/Tint" left="8" mouse_opaque="true" name="Color/Tint"
tool_tip="Click to open Color Picker" width="66" />
<button bottom="-128" follows="left|top" halign="center" height="24"
label="Create New Jacket" label_selected="Create New Jacket" left="8"
<button bottom="-148" follows="left|top" halign="center" height="24"
label="Create New Jacket" label_selected="Create New Jacket" left="160"
mouse_opaque="true" name="Create New" scale_image="true" width="170" />
<button bottom="-330" follows="left|top" font="SansSerif" halign="center"
height="20" label="Take Off" label_selected="Take Off" left="8"
@@ -835,17 +840,18 @@ scratch and wear it.
mouse_opaque="true" name="path" v_pad="0" width="373">
Located in [PATH]
</text>
<tab_container name="layer_tabs" left_delta="85" bottom_delta="-30" height="16" width="300" tab_min_width="55"/>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="373">
Put on a new gloves by dragging one from your inventory
bottom="-104" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="102"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="284">
Put on new gloves by dragging one from your inventory
to your avatar. Alternately, you create a new one from
scratch and wear it.
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
bottom="-50" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="14" left="8"
mouse_opaque="true" name="no modify instructions" v_pad="0" width="373">
You do not have permission to modify this wearable.
</text>
@@ -863,8 +869,8 @@ scratch and wear it.
can_apply_immediately="true" color="1 1 1 1" follows="left|top" height="80"
label="Color/Tint" left="8" mouse_opaque="true" name="Color/Tint"
tool_tip="Click to open Color Picker" width="64" />
<button bottom="-128" follows="left|top" halign="center" height="24"
label="Create New Gloves" label_selected="Create New Gloves" left="8"
<button bottom="-148" follows="left|top" halign="center" height="24"
label="Create New Gloves" label_selected="Create New Gloves" left="160"
mouse_opaque="true" name="Create New" scale_image="true" width="170" />
<button bottom="-250" follows="left|top" font="SansSerif" halign="center"
height="20" label="Take Off" label_selected="Take Off" left="8"
@@ -917,17 +923,18 @@ scratch and wear it.
mouse_opaque="true" name="path" v_pad="0" width="373">
Located in [PATH]
</text>
<tab_container name="layer_tabs" left_delta="85" bottom_delta="-30" height="16" width="300" tab_min_width="55"/>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="373">
Put on a new undershirt by dragging one from your inventory
to your avatar. Alternately, you create a new one from
scratch and wear it.
bottom="-104" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="102"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="284">
Put on a new undershirt by dragging one from your
inventory to your avatar. Alternately, you create a new
one from scratch and wear it.
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
bottom="-50" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="14" left="8"
mouse_opaque="true" name="no modify instructions" v_pad="0" width="373">
You do not have permission to modify this wearable.
</text>
@@ -945,9 +952,9 @@ scratch and wear it.
can_apply_immediately="true" color="1 1 1 1" follows="left|top" height="80"
label="Color/Tint" left="8" mouse_opaque="true" name="Color/Tint"
tool_tip="Click to open Color Picker" width="64" />
<button bottom="-128" follows="left|top" halign="center" height="24"
<button bottom="-148" follows="left|top" halign="center" height="24"
label="Create New Undershirt" label_selected="Create New Undershirt"
left="8" mouse_opaque="true" name="Create New" scale_image="true"
left="160" mouse_opaque="true" name="Create New" scale_image="true"
width="170" />
<button bottom="-250" follows="left|top" font="SansSerif" halign="center"
height="20" label="Take Off" label_selected="Take Off" left="8"
@@ -1000,17 +1007,18 @@ scratch and wear it.
mouse_opaque="true" name="path" v_pad="0" width="373">
Located in [PATH]
</text>
<tab_container name="layer_tabs" left_delta="85" bottom_delta="-30" height="16" width="300" tab_min_width="55"/>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="373">
Put on a new underpants by dragging one from your inventory
to your avatar. Alternately, you create a new one from
scratch and wear it.
bottom="-104" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="102"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="284">
Put on new underpants by dragging one from your
inventory to your avatar. Alternately, you create a new
one from scratch and wear it.
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
bottom="-50" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="14" left="8"
mouse_opaque="true" name="no modify instructions" v_pad="0" width="373">
You do not have permission to modify this wearable.
</text>
@@ -1028,9 +1036,9 @@ scratch and wear it.
can_apply_immediately="true" color="1 1 1 1" follows="left|top" height="80"
label="Color/Tint" left="8" mouse_opaque="true" name="Color/Tint"
tool_tip="Click to open Color Picker" width="64" />
<button bottom="-128" follows="left|top" halign="center" height="24"
<button bottom="-148" follows="left|top" halign="center" height="24"
label="Create New Underpants" label_selected="Create New Underpants"
left="8" mouse_opaque="true" name="Create New" scale_image="true"
left="160" mouse_opaque="true" name="Create New" scale_image="true"
width="170" />
<button bottom="-250" follows="left|top" font="SansSerif" halign="center"
height="20" label="Take Off" label_selected="Take Off" left="8"
@@ -1082,20 +1090,21 @@ scratch and wear it.
mouse_opaque="true" name="path" v_pad="0" width="373">
Located in [PATH]
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="373">
Put on a new skirt by dragging one from your inventory
<tab_container name="layer_tabs" left_delta="85" bottom_delta="-30" height="16" width="300" tab_min_width="55"/>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-104" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="102"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="284">
Put on a new skirt by dragging one from your inventory
to your avatar. Alternately, you create a new one from
scratch and wear it.
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-50" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="14" left="8"
mouse_opaque="true" name="no modify instructions" v_pad="0" width="373">
You do not have permission to modify this wearable.
</text>
You do not have permission to modify this wearable.
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-486" drop_shadow_visible="true" follows="left|top|right"
font="SansSerif" h_pad="0" halign="right" height="28" right="117"
@@ -1110,8 +1119,8 @@ scratch and wear it.
can_apply_immediately="true" color="1 1 1 1" follows="left|top" height="80"
label="Color/Tint" left="8" mouse_opaque="true" name="Color/Tint"
tool_tip="Click to open Color Picker" width="64" />
<button bottom="-128" follows="left|top" halign="center" height="24"
label="Create New Skirt" label_selected="Create New Skirt" left="8"
<button bottom="-148" follows="left|top" halign="center" height="24"
label="Create New Skirt" label_selected="Create New Skirt" left="160"
mouse_opaque="true" name="Create New" scale_image="true" width="170" />
<button bottom="-250" follows="left|top" font="SansSerif" halign="center"
height="20" label="Take Off" label_selected="Take Off" left="8"
@@ -1163,15 +1172,18 @@ scratch and wear it.
mouse_opaque="true" name="path" v_pad="0" width="373">
Located in [PATH]
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="373">
Put on a new tattoo by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
<tab_container name="layer_tabs" left_delta="85" bottom_delta="-30" height="16" width="300" tab_min_width="55"/>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-104" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="102"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="284">
Put on a new tattoo by dragging one from your inventory
to your avatar. Alternately, you create a new one from
scratch and wear it.
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
bottom="-50" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="14" left="8"
mouse_opaque="true" name="no modify instructions" v_pad="0" width="373">
You do not have permission to modify this wearable.
</text>
@@ -1195,7 +1207,7 @@ scratch and wear it.
label="Color/Tint" left="14" mouse_opaque="true" name="Color/Tint"
tool_tip="Click to open Color Picker" width="70" />
<button name="Create New" label="Create New Tattoo" label_selected="Create New Tattoo"
follows="left|top" halign="center" width="170" height="24" left="8" bottom="-128"
follows="left|top" halign="center" width="170" height="24" left="160" bottom="-148"
mouse_opaque="true" scale_image="true"/>
<button name="Take Off" label="Take Off" label_selected="Take Off"
follows="left|top" width="82" height="20" left="8" bottom="-440"/>
@@ -1243,15 +1255,18 @@ scratch and wear it.
mouse_opaque="true" name="path" v_pad="0" width="373">
Located in [PATH]
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="373">
Put on a new alpha mask by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
<tab_container name="layer_tabs" left_delta="85" bottom_delta="-30" height="16" width="300" tab_min_width="55"/>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-104" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="102"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="284">
Put on a new alpha mask by dragging one from your
inventory to your avatar. Alternately, you create a new
one from scratch and wear it.
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
bottom="-50" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="14" left="8"
mouse_opaque="true" name="no modify instructions" v_pad="0" width="373">
You do not have permission to modify this wearable.
</text>
@@ -1287,7 +1302,7 @@ scratch and wear it.
<check_box name="eye alpha texture invisible"
follows="left" width="16" height="16" left_delta="90" bottom="-300"/>
<button name="Create New" label="Create New Alpha" label_selected="Create New Alpha"
follows="left|top" halign="center" width="170" height="24" left="8" bottom="-128"
follows="left|top" halign="center" width="170" height="24" left="160" bottom="-148"
mouse_opaque="true" scale_image="true"/>
<button name="Take Off" label="Take Off" label_selected="Take Off"
follows="left|top" width="82" height="20" left="123" bottom="-340"/>
@@ -1359,17 +1374,18 @@ scratch and wear it.
mouse_opaque="true" name="path" v_pad="0" width="373">
Located in [PATH]
</text>
<tab_container name="layer_tabs" left_delta="85" bottom_delta="-30" height="16" width="300" tab_min_width="55"/>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="373">
Put on a new physics wearable by dragging one from your inventory
to your avatar. Alternately, you create a new one from
scratch and wear it.
bottom="-104" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="102"
mouse_opaque="true" name="not worn instructions" v_pad="0" width="284">
Put on a new physics wearable by dragging one from your
inventory to your avatar. Alternately, you create a new
one from scratch and wear it.
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-74" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="28" left="8"
bottom="-50" drop_shadow_visible="true" follows="left|top|right"
font="SansSerifSmall" h_pad="0" halign="left" height="14" left="8"
mouse_opaque="true" name="no modify instructions" v_pad="0" width="373">
You do not have permission to modify this wearable.
</text>
@@ -1379,8 +1395,8 @@ scratch and wear it.
mouse_opaque="true" name="Item Action Label" v_pad="0" width="100">
Physics:
</text>
<button bottom="-128" follows="left|top" halign="center" height="24"
label="Create New Physics" label_selected="Create New Physics" left="8"
<button bottom="-148" follows="left|top" halign="center" height="24"
label="Create New Physics" label_selected="Create New Physics" left="160"
mouse_opaque="true" name="Create New" scale_image="true" width="170" />
<button bottom="-478" follows="right|bottom" font="SansSerif" halign="center"
height="20" label="Save" label_selected="Save" left="123"