merge
commit
5e56b2d4ac
|
|
@ -50,6 +50,7 @@ void LLDockableFloater::init(LLDockableFloater* thiz)
|
|||
thiz->setCanDock(true);
|
||||
thiz->setCanMinimize(TRUE);
|
||||
thiz->setOverlapsScreenChannel(false);
|
||||
thiz->mForceDocking = false;
|
||||
}
|
||||
|
||||
LLDockableFloater::LLDockableFloater(LLDockControl* dockControl,
|
||||
|
|
@ -81,6 +82,12 @@ LLDockableFloater::~LLDockableFloater()
|
|||
|
||||
BOOL LLDockableFloater::postBuild()
|
||||
{
|
||||
// Remember we should force docking when the floater is opened for the first time
|
||||
if (mIsDockedStateForcedCallback != NULL && mIsDockedStateForcedCallback())
|
||||
{
|
||||
mForceDocking = true;
|
||||
}
|
||||
|
||||
mDockTongue = LLUI::getUIImage("windows/Flyout_Pointer.png");
|
||||
LLFloater::setDocked(true);
|
||||
return LLView::postBuild();
|
||||
|
|
@ -134,6 +141,14 @@ void LLDockableFloater::resetInstance()
|
|||
|
||||
void LLDockableFloater::setVisible(BOOL visible)
|
||||
{
|
||||
// Force docking if requested
|
||||
if (visible && mForceDocking)
|
||||
{
|
||||
setCanDock(true);
|
||||
setDocked(true);
|
||||
mForceDocking = false;
|
||||
}
|
||||
|
||||
if(visible && isDocked())
|
||||
{
|
||||
resetInstance();
|
||||
|
|
|
|||
|
|
@ -130,6 +130,10 @@ protected:
|
|||
void setDockControl(LLDockControl* dockControl);
|
||||
const LLUIImagePtr& getDockTongue();
|
||||
|
||||
// Checks if docking should be forced.
|
||||
// It may be useful e.g. if floater created in mouselook mode (see EXT-5609)
|
||||
boost::function<BOOL ()> mIsDockedStateForcedCallback;
|
||||
|
||||
private:
|
||||
std::auto_ptr<LLDockControl> mDockControl;
|
||||
LLUIImagePtr mDockTongue;
|
||||
|
|
@ -143,6 +147,9 @@ private:
|
|||
bool mUseTongue;
|
||||
|
||||
bool mOverlapsScreenChannel;
|
||||
|
||||
// Force docking when the floater is being shown for the first time.
|
||||
bool mForceDocking;
|
||||
};
|
||||
|
||||
#endif /* LL_DOCKABLEFLOATER_H */
|
||||
|
|
|
|||
|
|
@ -477,8 +477,8 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTex
|
|||
}
|
||||
|
||||
// add in offset of current image to current ui translation
|
||||
const LLVector3 ui_translation = gGL.getUITranslation() + LLVector3(x, y, 0.f);
|
||||
const LLVector3 ui_scale = gGL.getUIScale();
|
||||
const LLVector3 ui_translation = (gGL.getUITranslation() + LLVector3(x, y, 0.f)).scaledVec(ui_scale);
|
||||
|
||||
F32 uv_width = uv_outer_rect.getWidth();
|
||||
F32 uv_height = uv_outer_rect.getHeight();
|
||||
|
|
@ -514,8 +514,8 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTex
|
|||
F32 shrink_scale = 1.f - llmax(shrink_width_ratio, shrink_height_ratio);
|
||||
|
||||
draw_center_rect.mLeft = llround(ui_translation.mV[VX] + (F32)draw_center_rect.mLeft * shrink_scale * ui_scale.mV[VX]);
|
||||
draw_center_rect.mTop = llround(ui_translation.mV[VY] + lerp((F32)height, (F32)draw_center_rect.mTop, shrink_scale * ui_scale.mV[VY]));
|
||||
draw_center_rect.mRight = llround(ui_translation.mV[VX] + lerp((F32)width, (F32)draw_center_rect.mRight, shrink_scale * ui_scale.mV[VX]));
|
||||
draw_center_rect.mTop = llround(ui_translation.mV[VY] + lerp((F32)height, (F32)draw_center_rect.mTop, shrink_scale) * ui_scale.mV[VY]);
|
||||
draw_center_rect.mRight = llround(ui_translation.mV[VX] + lerp((F32)width, (F32)draw_center_rect.mRight, shrink_scale) * ui_scale.mV[VX]);
|
||||
draw_center_rect.mBottom = llround(ui_translation.mV[VY] + (F32)draw_center_rect.mBottom * shrink_scale * ui_scale.mV[VY]);
|
||||
}
|
||||
|
||||
|
|
@ -735,17 +735,21 @@ void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degre
|
|||
|
||||
gGL.begin(LLRender::QUADS);
|
||||
{
|
||||
LLVector3 ui_scale = gGL.getUIScale();
|
||||
LLVector3 ui_translation = gGL.getUITranslation();
|
||||
ui_translation.mV[VX] += x;
|
||||
ui_translation.mV[VY] += y;
|
||||
ui_translation.scaleVec(ui_scale);
|
||||
S32 index = 0;
|
||||
S32 scaled_width = llround(width * ui_scale.mV[VX]);
|
||||
S32 scaled_height = llround(height * ui_scale.mV[VY]);
|
||||
|
||||
uv[index] = LLVector2(uv_rect.mRight, uv_rect.mTop);
|
||||
pos[index] = LLVector3(ui_translation.mV[VX] + width, ui_translation.mV[VY] + height, 0.f);
|
||||
pos[index] = LLVector3(ui_translation.mV[VX] + scaled_width, ui_translation.mV[VY] + scaled_height, 0.f);
|
||||
index++;
|
||||
|
||||
uv[index] = LLVector2(uv_rect.mLeft, uv_rect.mTop);
|
||||
pos[index] = LLVector3(ui_translation.mV[VX], ui_translation.mV[VY] + height, 0.f);
|
||||
pos[index] = LLVector3(ui_translation.mV[VX], ui_translation.mV[VY] + scaled_height, 0.f);
|
||||
index++;
|
||||
|
||||
uv[index] = LLVector2(uv_rect.mLeft, uv_rect.mBottom);
|
||||
|
|
@ -753,7 +757,7 @@ void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degre
|
|||
index++;
|
||||
|
||||
uv[index] = LLVector2(uv_rect.mRight, uv_rect.mBottom);
|
||||
pos[index] = LLVector3(ui_translation.mV[VX] + width, ui_translation.mV[VY], 0.f);
|
||||
pos[index] = LLVector3(ui_translation.mV[VX] + scaled_width, ui_translation.mV[VY], 0.f);
|
||||
index++;
|
||||
|
||||
gGL.vertexBatchPreTransformed(pos, uv, NUM_VERTICES);
|
||||
|
|
|
|||
|
|
@ -35,17 +35,6 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>AddWearableSortOrder</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Specifies sort order for add wearable panel (0 = name, 1 = date, 2 = by type)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>U32</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>AgentPause</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -191,9 +191,9 @@ NVIDIA G102M .*NVIDIA.*GeForce G *102M.* 0 1
|
|||
NVIDIA G103M .*NVIDIA.*GeForce G *103M.* 0 1
|
||||
NVIDIA G105M .*NVIDIA.*GeForce G *105M.* 0 1
|
||||
NVIDIA G210M .*NVIDIA.*GeForce G210M.* 0 1
|
||||
NVIDIA GT 120 .*NVIDIA.*GeForce GT 12.* 0 1
|
||||
NVIDIA GT 120 .*NVIDIA.*GeForce GT 12.* 1 1
|
||||
NVIDIA GT 130 .*NVIDIA.*GeForce GT 13.* 1 1
|
||||
NVIDIA GT 220 .*NVIDIA.*GeForce GT 22.* 0 1
|
||||
NVIDIA GT 220 .*NVIDIA.*GeForce GT 22.* 1 1
|
||||
NVIDIA GT 230 .*NVIDIA.*GeForce GT 23.* 1 1
|
||||
NVIDIA GT 240 .*NVIDIA.*GeForce GT 24.* 1 1
|
||||
NVIDIA GT 320 .*NVIDIA.*GeForce GT 32.* 0 1
|
||||
|
|
|
|||
|
|
@ -284,8 +284,8 @@ LLCOFWearables::LLCOFWearables() : LLPanel(),
|
|||
mAttachmentsTab(NULL),
|
||||
mBodyPartsTab(NULL),
|
||||
mLastSelectedTab(NULL),
|
||||
mCOFVersion(-1),
|
||||
mAccordionCtrl(NULL)
|
||||
mAccordionCtrl(NULL),
|
||||
mCOFVersion(-1)
|
||||
{
|
||||
mClothingMenu = new CofClothingContextMenu(this);
|
||||
mAttachmentMenu = new CofAttachmentContextMenu(this);
|
||||
|
|
@ -396,8 +396,7 @@ void LLCOFWearables::refresh()
|
|||
return;
|
||||
}
|
||||
|
||||
// BAP - removed check; does not detect item name changes.
|
||||
//if (mCOFVersion == catp->getVersion()) return;
|
||||
if (mCOFVersion == catp->getVersion()) return;
|
||||
mCOFVersion = catp->getVersion();
|
||||
|
||||
typedef std::vector<LLSD> values_vector_t;
|
||||
|
|
|
|||
|
|
@ -62,6 +62,7 @@ const F32 CAMERA_BUTTON_DELAY = 0.0f;
|
|||
#define CONTROLS "controls"
|
||||
|
||||
bool LLFloaterCamera::sFreeCamera = false;
|
||||
bool LLFloaterCamera::sAppearanceEditing = false;
|
||||
|
||||
// Zoom the camera in and out
|
||||
class LLPanelCameraZoom
|
||||
|
|
@ -250,16 +251,21 @@ void LLFloaterCamera::resetCameraMode()
|
|||
|
||||
void LLFloaterCamera::onAvatarEditingAppearance(bool editing)
|
||||
{
|
||||
sAppearanceEditing = editing;
|
||||
LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance();
|
||||
if (!floater_camera) return;
|
||||
floater_camera->handleAvatarEditingAppearance(editing);
|
||||
}
|
||||
|
||||
void LLFloaterCamera::handleAvatarEditingAppearance(bool editing)
|
||||
{
|
||||
//camera presets (rear, front, etc.)
|
||||
floater_camera->getChildView("preset_views_list")->setEnabled(!editing);
|
||||
floater_camera->getChildView("presets_btn")->setEnabled(!editing);
|
||||
getChildView("preset_views_list")->setEnabled(!editing);
|
||||
getChildView("presets_btn")->setEnabled(!editing);
|
||||
|
||||
//camera modes (object view, mouselook view)
|
||||
floater_camera->getChildView("camera_modes_list")->setEnabled(!editing);
|
||||
floater_camera->getChildView("avatarview_btn")->setEnabled(!editing);
|
||||
getChildView("camera_modes_list")->setEnabled(!editing);
|
||||
getChildView("avatarview_btn")->setEnabled(!editing);
|
||||
}
|
||||
|
||||
void LLFloaterCamera::update()
|
||||
|
|
@ -354,6 +360,9 @@ BOOL LLFloaterCamera::postBuild()
|
|||
|
||||
update();
|
||||
|
||||
// ensure that appearance mode is handled while building. See EXT-7796.
|
||||
handleAvatarEditingAppearance(sAppearanceEditing);
|
||||
|
||||
return LLDockableFloater::postBuild();
|
||||
}
|
||||
|
||||
|
|
@ -376,6 +385,12 @@ void LLFloaterCamera::fillFlatlistFromPanel (LLFlatListView* list, LLPanel* pane
|
|||
|
||||
ECameraControlMode LLFloaterCamera::determineMode()
|
||||
{
|
||||
if (sAppearanceEditing)
|
||||
{
|
||||
// this is the only enabled camera mode while editing agent appearance.
|
||||
return CAMERA_CTRL_MODE_PAN;
|
||||
}
|
||||
|
||||
LLTool* curr_tool = LLToolMgr::getInstance()->getCurrentTool();
|
||||
if (curr_tool == LLToolCamera::getInstance())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -124,9 +124,12 @@ private:
|
|||
// fills flatlist with items from given panel
|
||||
void fillFlatlistFromPanel (LLFlatListView* list, LLPanel* panel);
|
||||
|
||||
void handleAvatarEditingAppearance(bool editing);
|
||||
|
||||
// set to true when free camera mode is selected in modes list
|
||||
// remains true until preset camera mode is chosen, or pan button is clicked, or escape pressed
|
||||
static bool sFreeCamera;
|
||||
static bool sAppearanceEditing;
|
||||
BOOL mClosed;
|
||||
ECameraControlMode mPrevMode;
|
||||
ECameraControlMode mCurrMode;
|
||||
|
|
|
|||
|
|
@ -262,8 +262,8 @@ public:
|
|||
BOOL needsAutoSelect() { return mNeedsAutoSelect && !mAutoSelectOverride; }
|
||||
BOOL needsAutoRename() { return mNeedsAutoRename; }
|
||||
void setNeedsAutoRename(BOOL val) { mNeedsAutoRename = val; }
|
||||
void setAutoSelectOverride(BOOL val) { mAutoSelectOverride = val; }
|
||||
void setPinningSelectedItem(BOOL val) { mPinningSelectedItem = val; }
|
||||
void setAutoSelectOverride(BOOL val) { mAutoSelectOverride = val; }
|
||||
|
||||
void setCallbackRegistrar(LLUICtrl::CommitCallbackRegistry::ScopedRegistrar* registrar) { mCallbackRegistrar = registrar; }
|
||||
|
||||
|
|
|
|||
|
|
@ -44,7 +44,6 @@
|
|||
// newview
|
||||
#include "llinventorymodel.h"
|
||||
#include "llviewerinventory.h"
|
||||
#include "llinventorydefines.h"
|
||||
|
||||
static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelInventoryListItemBaseParams(&typeid(LLPanelInventoryListItemBase::Params), "inventory_list_item");
|
||||
|
||||
|
|
@ -97,12 +96,9 @@ void LLPanelInventoryListItemBase::draw()
|
|||
|
||||
if (mSeparatorVisible && mSeparatorImage)
|
||||
{
|
||||
// place under bottom of listitem, using image height
|
||||
// item_pad in list using the item should be >= image height
|
||||
// to avoid cropping of top of the next item.
|
||||
// stretch along bottom of listitem, using image height
|
||||
LLRect separator_rect = getLocalRect();
|
||||
separator_rect.mTop = separator_rect.mBottom;
|
||||
separator_rect.mBottom -= mSeparatorImage->getHeight();
|
||||
separator_rect.mTop = mSeparatorImage->getHeight();
|
||||
mSeparatorImage->draw(separator_rect);
|
||||
}
|
||||
|
||||
|
|
@ -167,7 +163,7 @@ BOOL LLPanelInventoryListItemBase::postBuild()
|
|||
LLViewerInventoryItem* inv_item = getItem();
|
||||
if (inv_item)
|
||||
{
|
||||
mIconImage = LLInventoryIcon::getIcon(inv_item->getType(), inv_item->getInventoryType(), inv_item->getFlags(), LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS & inv_item->getFlags());
|
||||
mIconImage = LLInventoryIcon::getIcon(inv_item->getType(), inv_item->getInventoryType(), inv_item->getFlags(), FALSE);
|
||||
updateItem(inv_item->getName());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -151,7 +151,7 @@ void LLPanelLandMedia::refresh()
|
|||
mMediaDescEdit->setEnabled( can_change_media );
|
||||
|
||||
std::string mime_type = parcel->getMediaType();
|
||||
if (mime_type.empty())
|
||||
if (mime_type.empty() || mime_type == LLMIMETypes::getDefaultMimeType())
|
||||
{
|
||||
mime_type = LLMIMETypes::getDefaultMimeTypeTranslation();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -86,6 +86,11 @@ const U64 ALL_ITEMS_MASK = WEARABLE_MASK | ATTACHMENT_MASK;
|
|||
|
||||
static const std::string REVERT_BTN("revert_btn");
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// LLShopURLDispatcher
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class LLShopURLDispatcher
|
||||
{
|
||||
public:
|
||||
|
|
@ -145,6 +150,10 @@ std::string LLShopURLDispatcher::resolveURL(LLAssetType::EType asset_type, ESex
|
|||
return gSavedSettings.getString(setting_name);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// LLPanelOutfitEditGearMenu
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class LLPanelOutfitEditGearMenu
|
||||
{
|
||||
public:
|
||||
|
|
@ -160,7 +169,6 @@ public:
|
|||
if (menu)
|
||||
{
|
||||
populateCreateWearableSubmenus(menu);
|
||||
menu->buildDrawLabels();
|
||||
}
|
||||
|
||||
return menu;
|
||||
|
|
@ -209,6 +217,147 @@ private:
|
|||
}
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// LLAddWearablesGearMenu
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class LLAddWearablesGearMenu : public LLInitClass<LLAddWearablesGearMenu>
|
||||
{
|
||||
public:
|
||||
static LLMenuGL* create(LLWearableItemsList* flat_list, LLInventoryPanel* inventory_panel)
|
||||
{
|
||||
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
|
||||
LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
|
||||
|
||||
llassert(flat_list);
|
||||
llassert(inventory_panel);
|
||||
|
||||
LLHandle<LLView> flat_list_handle = flat_list->getHandle();
|
||||
LLHandle<LLPanel> inventory_panel_handle = inventory_panel->getHandle();
|
||||
|
||||
registrar.add("AddWearable.Gear.Sort", boost::bind(onSort, flat_list_handle, inventory_panel_handle, _2));
|
||||
enable_registrar.add("AddWearable.Gear.Check", boost::bind(onCheck, flat_list_handle, inventory_panel_handle, _2));
|
||||
enable_registrar.add("AddWearable.Gear.Visible", boost::bind(onVisible, inventory_panel_handle, _2));
|
||||
|
||||
LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>(
|
||||
"menu_add_wearable_gear.xml",
|
||||
LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
|
||||
return menu;
|
||||
}
|
||||
|
||||
private:
|
||||
static void onSort(LLHandle<LLView> flat_list_handle,
|
||||
LLHandle<LLPanel> inventory_panel_handle,
|
||||
LLSD::String sort_order_str)
|
||||
{
|
||||
if (flat_list_handle.isDead() || inventory_panel_handle.isDead()) return;
|
||||
|
||||
LLWearableItemsList* flat_list = dynamic_cast<LLWearableItemsList*>(flat_list_handle.get());
|
||||
LLInventoryPanel* inventory_panel = dynamic_cast<LLInventoryPanel*>(inventory_panel_handle.get());
|
||||
|
||||
if (!flat_list || !inventory_panel) return;
|
||||
|
||||
LLWearableItemsList::ESortOrder sort_order;
|
||||
|
||||
if ("by_most_recent" == sort_order_str)
|
||||
{
|
||||
sort_order = LLWearableItemsList::E_SORT_BY_MOST_RECENT;
|
||||
}
|
||||
else if ("by_name" == sort_order_str)
|
||||
{
|
||||
sort_order = LLWearableItemsList::E_SORT_BY_NAME;
|
||||
}
|
||||
else if ("by_type" == sort_order_str)
|
||||
{
|
||||
sort_order = LLWearableItemsList::E_SORT_BY_TYPE_NAME;
|
||||
}
|
||||
else
|
||||
{
|
||||
llwarns << "Unrecognized sort order action" << llendl;
|
||||
return;
|
||||
}
|
||||
|
||||
if (inventory_panel->getVisible())
|
||||
{
|
||||
inventory_panel->setSortOrder(sort_order);
|
||||
}
|
||||
else
|
||||
{
|
||||
flat_list->setSortOrder(sort_order);
|
||||
}
|
||||
}
|
||||
|
||||
static bool onCheck(LLHandle<LLView> flat_list_handle,
|
||||
LLHandle<LLPanel> inventory_panel_handle,
|
||||
LLSD::String sort_order_str)
|
||||
{
|
||||
if (flat_list_handle.isDead() || inventory_panel_handle.isDead()) return false;
|
||||
|
||||
LLWearableItemsList* flat_list = dynamic_cast<LLWearableItemsList*>(flat_list_handle.get());
|
||||
LLInventoryPanel* inventory_panel = dynamic_cast<LLInventoryPanel*>(inventory_panel_handle.get());
|
||||
|
||||
if (!inventory_panel || !flat_list) return false;
|
||||
|
||||
// Inventory panel uses its own sort order independent from
|
||||
// flat list view so this flag is used to distinguish between
|
||||
// currently visible "tree" or "flat" representation of inventory.
|
||||
bool inventory_tree_visible = inventory_panel->getVisible();
|
||||
|
||||
if (inventory_tree_visible)
|
||||
{
|
||||
U32 sort_order = inventory_panel->getSortOrder();
|
||||
|
||||
if ("by_most_recent" == sort_order_str)
|
||||
{
|
||||
return LLWearableItemsList::E_SORT_BY_MOST_RECENT & sort_order;
|
||||
}
|
||||
else if ("by_name" == sort_order_str)
|
||||
{
|
||||
// If inventory panel is not sorted by date then it is sorted by name.
|
||||
return LLWearableItemsList::E_SORT_BY_MOST_RECENT & ~sort_order;
|
||||
}
|
||||
llwarns << "Unrecognized inventory panel sort order" << llendl;
|
||||
}
|
||||
else
|
||||
{
|
||||
LLWearableItemsList::ESortOrder sort_order = flat_list->getSortOrder();
|
||||
|
||||
if ("by_most_recent" == sort_order_str)
|
||||
{
|
||||
return LLWearableItemsList::E_SORT_BY_MOST_RECENT == sort_order;
|
||||
}
|
||||
else if ("by_name" == sort_order_str)
|
||||
{
|
||||
return LLWearableItemsList::E_SORT_BY_NAME == sort_order;
|
||||
}
|
||||
else if ("by_type" == sort_order_str)
|
||||
{
|
||||
return LLWearableItemsList::E_SORT_BY_TYPE_NAME == sort_order;
|
||||
}
|
||||
llwarns << "Unrecognized wearable list sort order" << llendl;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool onVisible(LLHandle<LLPanel> inventory_panel_handle,
|
||||
LLSD::String sort_order_str)
|
||||
{
|
||||
if (inventory_panel_handle.isDead()) return false;
|
||||
|
||||
LLInventoryPanel* inventory_panel = dynamic_cast<LLInventoryPanel*>(inventory_panel_handle.get());
|
||||
|
||||
// Enable sorting by type only for the flat list of items
|
||||
// because inventory panel doesn't support this kind of sorting.
|
||||
return ( "by_type" == sort_order_str )
|
||||
&& ( !inventory_panel || !inventory_panel->getVisible() );
|
||||
}
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// LLCOFDragAndDropObserver
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class LLCOFDragAndDropObserver : public LLInventoryAddItemByAssetObserver
|
||||
{
|
||||
public:
|
||||
|
|
@ -244,12 +393,17 @@ void LLCOFDragAndDropObserver::done()
|
|||
LLAppearanceMgr::instance().updateAppearanceFromCOF();
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// LLPanelOutfitEdit
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
LLPanelOutfitEdit::LLPanelOutfitEdit()
|
||||
: LLPanel(),
|
||||
mSearchFilter(NULL),
|
||||
mCOFWearables(NULL),
|
||||
mInventoryItemsPanel(NULL),
|
||||
mGearMenu(NULL),
|
||||
mAddWearablesGearMenu(NULL),
|
||||
mCOFDragAndDropObserver(NULL),
|
||||
mInitialized(false),
|
||||
mAddWearablesPanel(NULL),
|
||||
|
|
@ -284,8 +438,6 @@ LLPanelOutfitEdit::~LLPanelOutfitEdit()
|
|||
|
||||
delete mCOFDragAndDropObserver;
|
||||
|
||||
delete mWearableListViewItemsComparator;
|
||||
|
||||
while (!mListViewItemTypes.empty()) {
|
||||
delete mListViewItemTypes.back();
|
||||
mListViewItemTypes.pop_back();
|
||||
|
|
@ -391,24 +543,11 @@ BOOL LLPanelOutfitEdit::postBuild()
|
|||
|
||||
childSetAction(REVERT_BTN, boost::bind(&LLAppearanceMgr::wearBaseOutfit, LLAppearanceMgr::getInstance()));
|
||||
|
||||
/*
|
||||
* By default AT_CLOTHING are sorted by (in in MY OUTFITS):
|
||||
* - by type (types order determined in LLWearableType::EType)
|
||||
* - each LLWearableType::EType by outer layer on top
|
||||
*
|
||||
* In Add More panel AT_CLOTHING should be sorted in a such way:
|
||||
* - by type (types order determined in LLWearableType::EType)
|
||||
* - each LLWearableType::EType by name (EXT-8205)
|
||||
*/
|
||||
mWearableListViewItemsComparator = new LLWearableItemTypeNameComparator();
|
||||
mWearableListViewItemsComparator->setOrder(LLAssetType::AT_CLOTHING, LLWearableItemTypeNameComparator::ORDER_RANK_1, false, true);
|
||||
|
||||
mWearablesListViewPanel = getChild<LLPanel>("filtered_wearables_panel");
|
||||
mWearableItemsList = getChild<LLInventoryItemsList>("list_view");
|
||||
mWearableItemsList = getChild<LLWearableItemsList>("list_view");
|
||||
mWearableItemsList->setCommitOnSelectionChange(true);
|
||||
mWearableItemsList->setCommitCallback(boost::bind(&LLPanelOutfitEdit::updatePlusButton, this));
|
||||
mWearableItemsList->setDoubleClickCallback(boost::bind(&LLPanelOutfitEdit::onPlusBtnClicked, this));
|
||||
mWearableItemsList->setComparator(mWearableListViewItemsComparator);
|
||||
|
||||
mSaveComboBtn.reset(new LLSaveOutfitComboBtn(this));
|
||||
return TRUE;
|
||||
|
|
@ -462,6 +601,17 @@ void LLPanelOutfitEdit::showAddWearablesPanel(bool show_add_wearables)
|
|||
|
||||
showWearablesFilter();
|
||||
|
||||
/*
|
||||
* By default AT_CLOTHING are sorted by (in in MY OUTFITS):
|
||||
* - by type (types order determined in LLWearableType::EType)
|
||||
* - each LLWearableType::EType by outer layer on top
|
||||
*
|
||||
* In Add More panel AT_CLOTHING should be sorted in a such way:
|
||||
* - by type (types order determined in LLWearableType::EType)
|
||||
* - each LLWearableType::EType by name (EXT-8205)
|
||||
*/
|
||||
mWearableItemsList->setSortOrder(LLWearableItemsList::E_SORT_BY_TYPE_NAME);
|
||||
|
||||
// Reset mWearableItemsList position to top. See EXT-8180.
|
||||
mWearableItemsList->goToTop();
|
||||
}
|
||||
|
|
@ -1063,13 +1213,33 @@ void LLPanelOutfitEdit::resetAccordionState()
|
|||
|
||||
void LLPanelOutfitEdit::onGearButtonClick(LLUICtrl* clicked_button)
|
||||
{
|
||||
if(!mGearMenu)
|
||||
LLMenuGL* menu = NULL;
|
||||
|
||||
if (mAddWearablesPanel->getVisible())
|
||||
{
|
||||
mGearMenu = LLPanelOutfitEditGearMenu::create();
|
||||
if (!mAddWearablesGearMenu)
|
||||
{
|
||||
mAddWearablesGearMenu = LLAddWearablesGearMenu::create(mWearableItemsList, mInventoryItemsPanel);
|
||||
}
|
||||
|
||||
menu = mAddWearablesGearMenu;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!mGearMenu)
|
||||
{
|
||||
mGearMenu = LLPanelOutfitEditGearMenu::create();
|
||||
}
|
||||
|
||||
menu = mGearMenu;
|
||||
}
|
||||
|
||||
S32 menu_y = mGearMenu->getRect().getHeight() + clicked_button->getRect().getHeight();
|
||||
LLMenuGL::showPopup(clicked_button, mGearMenu, 0, menu_y);
|
||||
if (!menu) return;
|
||||
|
||||
menu->arrangeAndClear(); // update menu height
|
||||
S32 menu_y = menu->getRect().getHeight() + clicked_button->getRect().getHeight();
|
||||
menu->buildDrawLabels();
|
||||
LLMenuGL::showPopup(clicked_button, menu, 0, menu_y);
|
||||
}
|
||||
|
||||
void LLPanelOutfitEdit::onAddMoreButtonClicked()
|
||||
|
|
|
|||
|
|
@ -43,8 +43,8 @@
|
|||
#include "llremoteparcelrequest.h"
|
||||
#include "llinventory.h"
|
||||
#include "llinventoryfunctions.h"
|
||||
#include "llinventoryitemslist.h"
|
||||
#include "llinventorymodel.h"
|
||||
#include "llwearableitemslist.h"
|
||||
|
||||
class LLButton;
|
||||
class LLCOFWearables;
|
||||
|
|
@ -230,9 +230,8 @@ private:
|
|||
LLComboBox* mListViewFilterCmbBox;
|
||||
|
||||
LLFilteredWearableListManager* mWearableListManager;
|
||||
LLInventoryItemsList* mWearableItemsList;
|
||||
LLWearableItemsList* mWearableItemsList;
|
||||
LLPanel* mWearablesListViewPanel;
|
||||
LLWearableItemTypeNameComparator* mWearableListViewItemsComparator;
|
||||
|
||||
LLCOFDragAndDropObserver* mCOFDragAndDropObserver;
|
||||
|
||||
|
|
@ -241,6 +240,7 @@ private:
|
|||
|
||||
LLCOFWearables* mCOFWearables;
|
||||
LLMenuGL* mGearMenu;
|
||||
LLMenuGL* mAddWearablesGearMenu;
|
||||
bool mInitialized;
|
||||
std::auto_ptr<LLSaveOutfitComboBtn> mSaveComboBtn;
|
||||
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@
|
|||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
#include "llscriptfloater.h"
|
||||
#include "llagentcamera.h"
|
||||
|
||||
#include "llbottomtray.h"
|
||||
#include "llchannelmanager.h"
|
||||
|
|
@ -71,6 +72,7 @@ LLScriptFloater::LLScriptFloater(const LLSD& key)
|
|||
{
|
||||
setMouseDownCallback(boost::bind(&LLScriptFloater::onMouseDown, this));
|
||||
setOverlapsScreenChannel(true);
|
||||
mIsDockedStateForcedCallback = boost::bind(&LLAgentCamera::cameraMouselook, &gAgentCamera);
|
||||
}
|
||||
|
||||
bool LLScriptFloater::toggle(const LLUUID& notification_id)
|
||||
|
|
|
|||
|
|
@ -429,7 +429,7 @@ void LLViewerRegion::saveCache()
|
|||
|
||||
std::string filename;
|
||||
filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"") + gDirUtilp->getDirDelimiter() +
|
||||
llformat("sobjects_%d_%d.slc", U32(mHandle>>32)/REGION_WIDTH_UNITS, U32(mHandle)/REGION_WIDTH_UNITS );
|
||||
llformat("objects_%d_%d.slc", U32(mHandle>>32)/REGION_WIDTH_UNITS, U32(mHandle)/REGION_WIDTH_UNITS );
|
||||
|
||||
LLFILE* fp = LLFile::fopen(filename, "wb"); /* Flawfinder: ignore */
|
||||
if (!fp)
|
||||
|
|
|
|||
|
|
@ -4142,7 +4142,7 @@ void LLVOAvatar::updateTextures()
|
|||
}
|
||||
}
|
||||
}
|
||||
if (isIndexBakedTexture((ETextureIndex) texture_index))
|
||||
if (isIndexBakedTexture((ETextureIndex) texture_index) && render_avatar)
|
||||
{
|
||||
const S32 boost_level = getAvatarBakedBoostLevel();
|
||||
imagep = LLViewerTextureManager::staticCastToFetchedTexture(getImage(texture_index,0), TRUE);
|
||||
|
|
@ -4219,7 +4219,10 @@ void LLVOAvatar::checkTextureLoading()
|
|||
}
|
||||
else//unpause
|
||||
{
|
||||
tex->unpauseLoadedCallbacks(&mCallbackTextureList) ;
|
||||
static const F32 START_AREA = 100.f ;
|
||||
|
||||
tex->unpauseLoadedCallbacks(&mCallbackTextureList) ;
|
||||
tex->addTextureStats(START_AREA); //jump start the fetching again
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -6063,7 +6066,7 @@ void LLVOAvatar::updateMeshTextures()
|
|||
}
|
||||
}
|
||||
|
||||
const BOOL self_customizing = isSelf() && !gAgentAvatarp->isUsingBakedTextures(); // During face edit mode, we don't use baked textures
|
||||
const BOOL self_customizing = isSelf() && gAgentCamera.cameraCustomizeAvatar(); // During face edit mode, we don't use baked textures
|
||||
const BOOL other_culled = !isSelf() && mCulled;
|
||||
LLLoadedCallbackEntry::source_callback_list_t* src_callback_list = NULL ;
|
||||
BOOL paused = FALSE;
|
||||
|
|
|
|||
|
|
@ -1049,7 +1049,7 @@ protected: // Shared with LLVOAvatarSelf
|
|||
*******************************************************************************/
|
||||
|
||||
}; // LLVOAvatar
|
||||
extern const F32 SELF_ADDITIONAL_PRI;
|
||||
extern const F32 SELF_ADDITIONAL_PRI;
|
||||
extern const S32 MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL;
|
||||
|
||||
#endif // LL_VO_AVATAR_H
|
||||
|
|
|
|||
|
|
@ -583,11 +583,28 @@ bool LLWearableItemTypeNameComparator::sortWearableTypeByName(LLAssetType::EType
|
|||
|
||||
return const_it->second.mSortWearableTypeByName;
|
||||
}
|
||||
|
||||
/*virtual*/
|
||||
bool LLWearableItemCreationDateComparator::doCompare(const LLPanelInventoryListItemBase* item1, const LLPanelInventoryListItemBase* item2) const
|
||||
{
|
||||
time_t date1 = item1->getCreationDate();
|
||||
time_t date2 = item2->getCreationDate();
|
||||
|
||||
if (date1 == date2)
|
||||
{
|
||||
return LLWearableItemNameComparator::doCompare(item1, item2);
|
||||
}
|
||||
|
||||
return date1 > date2;
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static const LLWearableItemTypeNameComparator WEARABLE_TYPE_NAME_COMPARATOR;
|
||||
static LLWearableItemTypeNameComparator WEARABLE_TYPE_NAME_COMPARATOR;
|
||||
static const LLWearableItemTypeNameComparator WEARABLE_TYPE_LAYER_COMPARATOR;
|
||||
static const LLWearableItemNameComparator WEARABLE_NAME_COMPARATOR;
|
||||
static const LLWearableItemCreationDateComparator WEARABLE_CREATION_DATE_COMPARATOR;
|
||||
|
||||
static const LLDefaultChildRegistry::Register<LLWearableItemsList> r("wearable_items_list");
|
||||
|
||||
|
|
@ -599,7 +616,7 @@ LLWearableItemsList::Params::Params()
|
|||
LLWearableItemsList::LLWearableItemsList(const LLWearableItemsList::Params& p)
|
||||
: LLInventoryItemsList(p)
|
||||
{
|
||||
setComparator(&WEARABLE_TYPE_NAME_COMPARATOR);
|
||||
setSortOrder(E_SORT_BY_TYPE_LAYER, false);
|
||||
mIsStandalone = p.standalone;
|
||||
if (mIsStandalone)
|
||||
{
|
||||
|
|
@ -699,6 +716,38 @@ void LLWearableItemsList::onRightClick(S32 x, S32 y)
|
|||
ContextMenu::instance().show(this, selected_uuids, x, y);
|
||||
}
|
||||
|
||||
void LLWearableItemsList::setSortOrder(ESortOrder sort_order, bool sort_now)
|
||||
{
|
||||
switch (sort_order)
|
||||
{
|
||||
case E_SORT_BY_MOST_RECENT:
|
||||
setComparator(&WEARABLE_CREATION_DATE_COMPARATOR);
|
||||
break;
|
||||
case E_SORT_BY_NAME:
|
||||
setComparator(&WEARABLE_NAME_COMPARATOR);
|
||||
break;
|
||||
case E_SORT_BY_TYPE_LAYER:
|
||||
setComparator(&WEARABLE_TYPE_LAYER_COMPARATOR);
|
||||
break;
|
||||
case E_SORT_BY_TYPE_NAME:
|
||||
{
|
||||
WEARABLE_TYPE_NAME_COMPARATOR.setOrder(LLAssetType::AT_CLOTHING, LLWearableItemTypeNameComparator::ORDER_RANK_1, false, true);
|
||||
setComparator(&WEARABLE_TYPE_NAME_COMPARATOR);
|
||||
break;
|
||||
}
|
||||
|
||||
// No "default:" to raise compiler warning
|
||||
// if we're not handling something
|
||||
}
|
||||
|
||||
mSortOrder = sort_order;
|
||||
|
||||
if (sort_now)
|
||||
{
|
||||
sort();
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
/// ContextMenu
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -379,6 +379,19 @@ private:
|
|||
wearable_type_order_map_t mWearableOrder;
|
||||
};
|
||||
|
||||
/**
|
||||
* @class LLWearableItemCreationDateComparator
|
||||
*
|
||||
* Comparator for sorting wearable list items by creation date (newest go first).
|
||||
*/
|
||||
class LLWearableItemCreationDateComparator : public LLWearableItemNameComparator
|
||||
{
|
||||
LOG_CLASS(LLWearableItemCreationDateComparator);
|
||||
|
||||
protected:
|
||||
/*virtual*/ bool doCompare(const LLPanelInventoryListItemBase* item1, const LLPanelInventoryListItemBase* item2) const;
|
||||
};
|
||||
|
||||
/**
|
||||
* @class LLWearableItemsList
|
||||
*
|
||||
|
|
@ -431,6 +444,14 @@ public:
|
|||
Params();
|
||||
};
|
||||
|
||||
typedef enum e_sort_order {
|
||||
// Values should be compatible with InventorySortOrder setting.
|
||||
E_SORT_BY_NAME = 0,
|
||||
E_SORT_BY_MOST_RECENT = 1,
|
||||
E_SORT_BY_TYPE_LAYER = 2,
|
||||
E_SORT_BY_TYPE_NAME = 3,
|
||||
} ESortOrder;
|
||||
|
||||
virtual ~LLWearableItemsList();
|
||||
|
||||
/*virtual*/ void addNewItem(LLViewerInventoryItem* item, bool rearrange = true);
|
||||
|
|
@ -445,6 +466,10 @@ public:
|
|||
|
||||
bool isStandalone() const { return mIsStandalone; }
|
||||
|
||||
ESortOrder getSortOrder() const { return mSortOrder; }
|
||||
|
||||
void setSortOrder(ESortOrder sort_order, bool sort_now = true);
|
||||
|
||||
protected:
|
||||
friend class LLUICtrlFactory;
|
||||
LLWearableItemsList(const LLWearableItemsList::Params& p);
|
||||
|
|
@ -453,6 +478,8 @@ protected:
|
|||
|
||||
bool mIsStandalone;
|
||||
bool mWornIndicationEnabled;
|
||||
|
||||
ESortOrder mSortOrder;
|
||||
};
|
||||
|
||||
#endif //LL_LLWEARABLEITEMSLIST_H
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@ clicking on their names.
|
|||
height="23"
|
||||
follows="top|left"
|
||||
label="Invite"
|
||||
left="0"
|
||||
left="5"
|
||||
name="member_invite"
|
||||
width="100" />
|
||||
<button
|
||||
|
|
|
|||
|
|
@ -14,6 +14,9 @@
|
|||
background_visible="true"
|
||||
bg_alpha_color="DkGray2"
|
||||
bg_opaque_color="DkGray2"
|
||||
no_matched_tabs_text.value="Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search]."
|
||||
no_matched_tabs_text.v_pad="10"
|
||||
no_visible_tabs_text.value="You don't have any outfits yet. Try [secondlife:///app/search/all/ Search]"
|
||||
follows="all"
|
||||
height="400"
|
||||
layout="topleft"
|
||||
|
|
@ -21,13 +24,6 @@
|
|||
name="outfits_accordion"
|
||||
top="0"
|
||||
width="309">
|
||||
<no_matched_tabs_text
|
||||
name="no_matched_outfits_msg"
|
||||
value="Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search]."
|
||||
v_pad="10" />
|
||||
<no_visible_tabs_text
|
||||
name="no_outfits_msg"
|
||||
value="You don't have any outfits yet. Try [secondlife:///app/search/all/ Search]." />
|
||||
</accordion>
|
||||
<panel
|
||||
background_visible="true"
|
||||
|
|
|
|||
|
|
@ -427,7 +427,17 @@ Mídia:
|
|||
<check_box label="Repetir mídia" name="media_loop" tool_tip="Executar a mídia repetidamente. Quando a mídia chegar ao fim, ela recomeça."/>
|
||||
</panel>
|
||||
<panel label="SOM" name="land_audio_panel">
|
||||
<text name="MusicURL:">
|
||||
URL de música:
|
||||
</text>
|
||||
<check_box label="Ocultar URL" name="hide_music_url" tool_tip="Selecionar esta opção oculta o URL de música a visitantes não autorizados aos dados do terreno."/>
|
||||
<text name="Sound:">
|
||||
Som:
|
||||
</text>
|
||||
<check_box label="Limitar sons de gestos e objetos a esta parcela" name="check sound local"/>
|
||||
<text name="Voice settings:">
|
||||
Voz:
|
||||
</text>
|
||||
<check_box label="Ativar voz" name="parcel_enable_voice_channel"/>
|
||||
<check_box label="Ativar voz (definições do terreno)" name="parcel_enable_voice_channel_is_estate_disabled"/>
|
||||
<check_box label="Limitar bate-papo de voz a este lote" name="parcel_enable_voice_channel_local"/>
|
||||
|
|
|
|||
|
|
@ -79,6 +79,11 @@ LLSD LLControlGroup::getLLSD(const std::string& name)
|
|||
return LLSD();
|
||||
}
|
||||
|
||||
LLPointer<LLControlVariable> LLControlGroup::getControl(const std::string& name)
|
||||
{
|
||||
ctrl_name_table_t::iterator iter = mNameTable.find(name);
|
||||
return iter == mNameTable.end() ? LLPointer<LLControlVariable>() : iter->second;
|
||||
}
|
||||
|
||||
LLControlGroup gSavedSettings("test");
|
||||
|
||||
|
|
|
|||
|
|
@ -79,6 +79,11 @@ LLSD LLControlGroup::getLLSD(const std::string& name)
|
|||
return LLSD();
|
||||
}
|
||||
|
||||
LLPointer<LLControlVariable> LLControlGroup::getControl(const std::string& name)
|
||||
{
|
||||
ctrl_name_table_t::iterator iter = mNameTable.find(name);
|
||||
return iter == mNameTable.end() ? LLPointer<LLControlVariable>() : iter->second;
|
||||
}
|
||||
|
||||
LLControlGroup gSavedSettings("test");
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue