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:
@@ -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 )
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 ¶m);
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
// **************************************************
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 ) );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user