commit
29a5e29ddb
|
|
@ -42,8 +42,6 @@ static const LLDefaultChildRegistry::Register<LLFlatListView> flat_list_view("fl
|
|||
const LLSD SELECTED_EVENT = LLSD().with("selected", true);
|
||||
const LLSD UNSELECTED_EVENT = LLSD().with("selected", false);
|
||||
|
||||
static const std::string COMMENT_TEXTBOX = "comment_text";
|
||||
|
||||
//forward declaration
|
||||
bool llsds_are_equal(const LLSD& llsd_1, const LLSD& llsd_2);
|
||||
|
||||
|
|
@ -51,7 +49,8 @@ LLFlatListView::Params::Params()
|
|||
: item_pad("item_pad"),
|
||||
allow_select("allow_select"),
|
||||
multi_select("multi_select"),
|
||||
keep_one_selected("keep_one_selected")
|
||||
keep_one_selected("keep_one_selected"),
|
||||
no_items_text("no_items_text")
|
||||
{};
|
||||
|
||||
void LLFlatListView::reshape(S32 width, S32 height, BOOL called_from_parent /* = TRUE */)
|
||||
|
|
@ -295,19 +294,6 @@ void LLFlatListView::resetSelection(bool no_commit_on_deselection /*= false*/)
|
|||
|
||||
void LLFlatListView::setNoItemsCommentText(const std::string& comment_text)
|
||||
{
|
||||
if (NULL == mNoItemsCommentTextbox)
|
||||
{
|
||||
LLRect comment_rect = getRect();
|
||||
comment_rect.setOriginAndSize(0, 0, comment_rect.getWidth(), comment_rect.getHeight());
|
||||
comment_rect.stretch(-getBorderWidth());
|
||||
LLTextBox::Params text_p;
|
||||
text_p.name(COMMENT_TEXTBOX);
|
||||
text_p.border_visible(false);
|
||||
text_p.rect(comment_rect);
|
||||
text_p.follows.flags(FOLLOWS_ALL);
|
||||
mNoItemsCommentTextbox = LLUICtrlFactory::create<LLTextBox>(text_p, this);
|
||||
}
|
||||
|
||||
mNoItemsCommentTextbox->setValue(comment_text);
|
||||
}
|
||||
|
||||
|
|
@ -361,7 +347,6 @@ bool LLFlatListView::updateValue(const LLSD& old_value, const LLSD& new_value)
|
|||
// PROTECTED STUFF
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
LLFlatListView::LLFlatListView(const LLFlatListView::Params& p)
|
||||
: LLScrollContainer(p)
|
||||
, mItemComparator(NULL)
|
||||
|
|
@ -398,6 +383,25 @@ LLFlatListView::LLFlatListView(const LLFlatListView::Params& p)
|
|||
params.bevel_style(LLViewBorder::BEVEL_IN);
|
||||
mSelectedItemsBorder = LLUICtrlFactory::create<LLViewBorder> (params);
|
||||
mItemsPanel->addChild( mSelectedItemsBorder );
|
||||
|
||||
{
|
||||
// create textbox for "No Items" comment text
|
||||
LLTextBox::Params text_p = p.no_items_text;
|
||||
if (!text_p.rect.isProvided())
|
||||
{
|
||||
LLRect comment_rect = getRect();
|
||||
comment_rect.setOriginAndSize(0, 0, comment_rect.getWidth(), comment_rect.getHeight());
|
||||
comment_rect.stretch(-getBorderWidth());
|
||||
text_p.rect(comment_rect);
|
||||
}
|
||||
text_p.border_visible(false);
|
||||
|
||||
if (!text_p.follows.isProvided())
|
||||
{
|
||||
text_p.follows.flags(FOLLOWS_ALL);
|
||||
}
|
||||
mNoItemsCommentTextbox = LLUICtrlFactory::create<LLTextBox>(text_p, this);
|
||||
}
|
||||
};
|
||||
|
||||
// virtual
|
||||
|
|
@ -861,7 +865,11 @@ void LLFlatListView::notifyParentItemsRectChanged()
|
|||
// take into account comment text height if exists
|
||||
if (mNoItemsCommentTextbox && mNoItemsCommentTextbox->getVisible())
|
||||
{
|
||||
// top text padding inside the textbox is included into the height
|
||||
comment_height = mNoItemsCommentTextbox->getTextPixelHeight();
|
||||
|
||||
// take into account a distance from parent's top border to textbox's top
|
||||
comment_height += getRect().getHeight() - mNoItemsCommentTextbox->getRect().mTop;
|
||||
}
|
||||
|
||||
LLRect req_rect = getItemsRect();
|
||||
|
|
@ -892,6 +900,10 @@ void LLFlatListView::setNoItemsCommentVisible(bool visible) const
|
|||
{
|
||||
if (visible)
|
||||
{
|
||||
/*
|
||||
// *NOTE: MA 2010-02-04
|
||||
// Deprecated after params of the comment text box were moved into widget (flat_list_view.xml)
|
||||
// can be removed later if nothing happened.
|
||||
// We have to update child rect here because of issues with rect after reshaping while creating LLTextbox
|
||||
// It is possible to have invalid LLRect if Flat List is in LLAccordionTab
|
||||
LLRect comment_rect = getLocalRect();
|
||||
|
|
@ -903,6 +915,7 @@ void LLFlatListView::setNoItemsCommentVisible(bool visible) const
|
|||
LLViewBorder* scroll_border = getChild<LLViewBorder>("scroll border");
|
||||
comment_rect.stretch(-scroll_border->getBorderWidth());
|
||||
mNoItemsCommentTextbox->setRect(comment_rect);
|
||||
*/
|
||||
}
|
||||
mNoItemsCommentTextbox->setVisible(visible);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,8 +35,8 @@
|
|||
|
||||
#include "llpanel.h"
|
||||
#include "llscrollcontainer.h"
|
||||
#include "lltextbox.h"
|
||||
|
||||
class LLTextBox;
|
||||
|
||||
/**
|
||||
* LLFlatListView represents a flat list ui control that operates on items in a form of LLPanel's.
|
||||
|
|
@ -108,6 +108,9 @@ public:
|
|||
/** padding between items */
|
||||
Optional<U32> item_pad;
|
||||
|
||||
/** textbox with info message when list is empty*/
|
||||
Optional<LLTextBox::Params> no_items_text;
|
||||
|
||||
Params();
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -720,7 +720,10 @@ BOOL LLTextEditor::handleRightMouseDown(S32 x, S32 y, MASK mask)
|
|||
}
|
||||
if (!LLTextBase::handleRightMouseDown(x, y, mask))
|
||||
{
|
||||
showContextMenu(x, y);
|
||||
if(getMouseOpaque())
|
||||
{
|
||||
showContextMenu(x, y);
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -585,9 +585,16 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
|
|||
bool irc_me = prefix == "/me " || prefix == "/me'";
|
||||
|
||||
// Delimiter after a name in header copy/past and in plain text mode
|
||||
std::string delimiter = (chat.mChatType != CHAT_TYPE_SHOUT && chat.mChatType != CHAT_TYPE_WHISPER)
|
||||
? ": "
|
||||
: " ";
|
||||
std::string delimiter = ": ";
|
||||
std::string shout = LLTrans::getString("shout");
|
||||
std::string whisper = LLTrans::getString("whisper");
|
||||
if (chat.mChatType == CHAT_TYPE_SHOUT ||
|
||||
chat.mChatType == CHAT_TYPE_WHISPER ||
|
||||
chat.mText.compare(0, shout.length(), shout) == 0 ||
|
||||
chat.mText.compare(0, whisper.length(), whisper) == 0)
|
||||
{
|
||||
delimiter = " ";
|
||||
}
|
||||
|
||||
// Don't add any delimiter after name in irc styled messages
|
||||
if (irc_me || chat.mChatStyle == CHAT_STYLE_IRC)
|
||||
|
|
|
|||
|
|
@ -34,7 +34,6 @@
|
|||
|
||||
#include "llfavoritesbar.h"
|
||||
|
||||
#include "llbutton.h"
|
||||
#include "llfloaterreg.h"
|
||||
#include "llfocusmgr.h"
|
||||
#include "llinventory.h"
|
||||
|
|
@ -48,7 +47,6 @@
|
|||
#include "llclipboard.h"
|
||||
#include "llinventoryclipboard.h"
|
||||
#include "llinventorybridge.h"
|
||||
#include "llinventorymodel.h"
|
||||
#include "llfloaterworldmap.h"
|
||||
#include "lllandmarkactions.h"
|
||||
#include "llnotificationsutil.h"
|
||||
|
|
@ -674,7 +672,14 @@ void LLFavoritesBarCtrl::updateButtons()
|
|||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if(mItems.empty())
|
||||
{
|
||||
mBarLabel->setVisible(TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
mBarLabel->setVisible(FALSE);
|
||||
}
|
||||
const child_list_t* childs = getChildList();
|
||||
child_list_const_iter_t child_it = childs->begin();
|
||||
int first_changed_item_index = 0;
|
||||
|
|
@ -720,14 +725,22 @@ void LLFavoritesBarCtrl::updateButtons()
|
|||
}
|
||||
}
|
||||
// we have to remove ChevronButton to make sure that the last item will be LandmarkButton to get the right aligning
|
||||
// keep in mind that we are cutting all buttons in space between the last visible child of favbar and ChevronButton
|
||||
if (mChevronButton->getParent() == this)
|
||||
{
|
||||
removeChild(mChevronButton);
|
||||
}
|
||||
int last_right_edge = 0;
|
||||
//calculate new buttons offset
|
||||
if (getChildList()->size() > 0)
|
||||
{
|
||||
last_right_edge = getChildList()->back()->getRect().mRight;
|
||||
//find last visible child to get the rightest button offset
|
||||
child_list_const_reverse_iter_t last_visible_it = std::find_if(childs->rbegin(), childs->rend(),
|
||||
std::mem_fun(&LLView::getVisible));
|
||||
if(last_visible_it != childs->rend())
|
||||
{
|
||||
last_right_edge = (*last_visible_it)->getRect().mRight;
|
||||
}
|
||||
}
|
||||
//last_right_edge is saving coordinates
|
||||
LLButton* last_new_button = NULL;
|
||||
|
|
|
|||
|
|
@ -185,43 +185,46 @@ void LLTeleportHistoryMenuItem::onMouseLeave(S32 x, S32 y, MASK mask)
|
|||
|
||||
static LLDefaultChildRegistry::Register<LLPullButton> menu_button("pull_button");
|
||||
|
||||
LLPullButton::LLPullButton(const LLPullButton::Params& params):
|
||||
LLButton(params)
|
||||
, mClickDraggingSignal(NULL)
|
||||
LLPullButton::LLPullButton(const LLPullButton::Params& params) :
|
||||
LLButton(params)
|
||||
{
|
||||
setDirectionFromName(params.direction);
|
||||
}
|
||||
boost::signals2::connection LLPullButton::setClickDraggingCallback( const commit_signal_t::slot_type& cb )
|
||||
{
|
||||
if (!mClickDraggingSignal) mClickDraggingSignal = new commit_signal_t();
|
||||
return mClickDraggingSignal->connect(cb);
|
||||
boost::signals2::connection LLPullButton::setClickDraggingCallback(const commit_signal_t::slot_type& cb)
|
||||
{
|
||||
return mClickDraggingSignal.connect(cb);
|
||||
}
|
||||
|
||||
/*virtual*/
|
||||
void LLPullButton::onMouseLeave(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
LLButton::onMouseLeave(x, y, mask);
|
||||
|
||||
if(mMouseDownTimer.getStarted() )
|
||||
|
||||
if (mMouseDownTimer.getStarted()) //an user have done a mouse down, if the timer started. see LLButton::handleMouseDown for details
|
||||
{
|
||||
const LLVector2 cursor_direction = LLVector2(F32(x),F32(y)) - mLastMouseDown;
|
||||
if( angle_between(mDraggingDirection, cursor_direction) < 0.5 * F_PI_BY_TWO)//call if angle < pi/4
|
||||
{
|
||||
if(mClickDraggingSignal)
|
||||
{
|
||||
(*mClickDraggingSignal)(this, LLSD());
|
||||
}
|
||||
}
|
||||
const LLVector2 cursor_direction = LLVector2(F32(x), F32(y)) - mLastMouseDown;
|
||||
/* For now cursor_direction points to the direction of mouse movement
|
||||
* Need to decide whether should we fire a signal.
|
||||
* We fire if angle between mDraggingDirection and cursor_direction is less that 45 degree
|
||||
* Note:
|
||||
* 0.5 * F_PI_BY_TWO equals to PI/4 radian that equals to angle of 45 degrees
|
||||
*/
|
||||
if (angle_between(mDraggingDirection, cursor_direction) < 0.5 * F_PI_BY_TWO)//call if angle < pi/4
|
||||
{
|
||||
mClickDraggingSignal(this, LLSD());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*virtual*/
|
||||
BOOL LLPullButton::handleMouseDown(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
BOOL handled = LLButton::handleMouseDown(x, y, mask);
|
||||
if (handled)
|
||||
{
|
||||
BOOL handled = LLButton::handleMouseDown(x,y, mask);
|
||||
if(handled)
|
||||
{
|
||||
//if mouse down was handled by button,
|
||||
//capture mouse position to calculate the direction of mouse move after mouseLeave event
|
||||
mLastMouseDown.set(F32(x), F32(y));
|
||||
}
|
||||
return handled;
|
||||
|
|
@ -230,27 +233,31 @@ BOOL LLPullButton::handleMouseDown(S32 x, S32 y, MASK mask)
|
|||
/*virtual*/
|
||||
BOOL LLPullButton::handleMouseUp(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
// reset data to get ready for next circle
|
||||
mLastMouseDown.clear();
|
||||
return LLButton::handleMouseUp(x, y, mask);
|
||||
}
|
||||
|
||||
/**
|
||||
* this function is setting up dragging direction vector.
|
||||
* Last one is just unit vector. It points to direction of mouse drag that we need to handle
|
||||
*/
|
||||
void LLPullButton::setDirectionFromName(const std::string& name)
|
||||
{
|
||||
if (name == "left")
|
||||
{
|
||||
mDraggingDirection.set(F32(-1), F32(0));
|
||||
mDraggingDirection.set(F32(-1), F32(0));
|
||||
}
|
||||
else if (name == "right")
|
||||
{
|
||||
mDraggingDirection.set(F32(0), F32(1));
|
||||
mDraggingDirection.set(F32(0), F32(1));
|
||||
}
|
||||
else if (name == "down")
|
||||
{
|
||||
mDraggingDirection.set(F32(0), F32(-1));
|
||||
mDraggingDirection.set(F32(0), F32(-1));
|
||||
}
|
||||
else if (name == "up")
|
||||
{
|
||||
mDraggingDirection.set(F32(0), F32(1));
|
||||
mDraggingDirection.set(F32(0), F32(1));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -44,46 +44,41 @@ class LLSearchComboBox;
|
|||
/**
|
||||
* This button is able to handle click-dragging mouse event.
|
||||
* It has appropriated signal for this event.
|
||||
* Dragging direction can be set from xml by attribute called 'direction'
|
||||
* Dragging direction can be set from xml attribute called 'direction'
|
||||
*
|
||||
* *TODO: move to llui?
|
||||
*/
|
||||
|
||||
class LLPullButton : public LLButton
|
||||
class LLPullButton: public LLButton
|
||||
{
|
||||
LOG_CLASS(LLPullButton);
|
||||
|
||||
|
||||
public:
|
||||
|
||||
struct Params : public LLInitParam::Block<Params, LLButton::Params>
|
||||
struct Params: public LLInitParam::Block<Params, LLButton::Params>
|
||||
{
|
||||
Optional<std::string> direction; // left, right, down, up
|
||||
|
||||
Params()
|
||||
: direction("direction","down")
|
||||
{}
|
||||
Optional<std::string> direction; // left, right, down, up
|
||||
|
||||
Params()
|
||||
: direction("direction", "down")
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
|
||||
|
||||
|
||||
/*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
|
||||
|
||||
|
||||
/*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
|
||||
|
||||
boost::signals2::connection setClickDraggingCallback( const commit_signal_t::slot_type& cb );
|
||||
|
||||
/* virtual*/ ~LLPullButton()
|
||||
{
|
||||
delete mClickDraggingSignal;
|
||||
}
|
||||
|
||||
boost::signals2::connection setClickDraggingCallback(const commit_signal_t::slot_type& cb);
|
||||
|
||||
protected:
|
||||
friend class LLUICtrlFactory;
|
||||
// convert string name into direction vector
|
||||
void setDirectionFromName(const std::string& name);
|
||||
LLPullButton(const LLPullButton::Params& params);
|
||||
|
||||
commit_signal_t* mClickDraggingSignal;
|
||||
|
||||
commit_signal_t mClickDraggingSignal;
|
||||
LLVector2 mLastMouseDown;
|
||||
LLVector2 mDraggingDirection;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -203,14 +203,7 @@ void LLNearbyChat::addMessage(const LLChat& chat,bool archive,const LLSD &args)
|
|||
|
||||
if (gSavedPerAccountSettings.getBOOL("LogChat"))
|
||||
{
|
||||
if (chat.mChatType != CHAT_TYPE_WHISPER && chat.mChatType != CHAT_TYPE_SHOUT)
|
||||
{
|
||||
LLLogChat::saveHistory("chat", chat.mFromName, chat.mFromID, chat.mText);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLLogChat::saveHistory("chat", "", chat.mFromID, chat.mFromName + " " + chat.mText);
|
||||
}
|
||||
LLLogChat::saveHistory("chat", chat.mFromName, chat.mFromID, chat.mText);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -274,6 +274,13 @@ void LLNearbyChatScreenChannel::showToastsBottom()
|
|||
toast->setRect(toast_rect);
|
||||
toast->setIsHidden(false);
|
||||
toast->setVisible(TRUE);
|
||||
|
||||
if(!toast->hasFocus())
|
||||
{
|
||||
// Fixing Z-order of toasts (EXT-4862)
|
||||
// Next toast will be positioned under this one.
|
||||
gFloaterView->sendChildToBack(toast);
|
||||
}
|
||||
|
||||
bottom = toast->getRect().mTop;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -171,8 +171,6 @@ BOOL LLLandmarksPanel::postBuild()
|
|||
initLandmarksInventoryPanel();
|
||||
initMyInventoryPanel();
|
||||
initLibraryInventoryPanel();
|
||||
getChild<LLAccordionCtrlTab>("tab_favorites")->setDisplayChildren(true);
|
||||
getChild<LLAccordionCtrlTab>("tab_landmarks")->setDisplayChildren(true);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -462,7 +460,7 @@ void LLLandmarksPanel::initFavoritesInventoryPanel()
|
|||
initLandmarksPanel(mFavoritesInventoryPanel);
|
||||
mFavoritesInventoryPanel->getFilter()->setEmptyLookupMessage("FavoritesNoMatchingItems");
|
||||
|
||||
initAccordion("tab_favorites", mFavoritesInventoryPanel);
|
||||
initAccordion("tab_favorites", mFavoritesInventoryPanel, true);
|
||||
}
|
||||
|
||||
void LLLandmarksPanel::initLandmarksInventoryPanel()
|
||||
|
|
@ -481,7 +479,7 @@ void LLLandmarksPanel::initLandmarksInventoryPanel()
|
|||
// subscribe to have auto-rename functionality while creating New Folder
|
||||
mLandmarksInventoryPanel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, mLandmarksInventoryPanel, _1, _2));
|
||||
|
||||
initAccordion("tab_landmarks", mLandmarksInventoryPanel);
|
||||
initAccordion("tab_landmarks", mLandmarksInventoryPanel, true);
|
||||
}
|
||||
|
||||
void LLLandmarksPanel::initMyInventoryPanel()
|
||||
|
|
@ -490,7 +488,7 @@ void LLLandmarksPanel::initMyInventoryPanel()
|
|||
|
||||
initLandmarksPanel(mMyInventoryPanel);
|
||||
|
||||
initAccordion("tab_inventory", mMyInventoryPanel);
|
||||
initAccordion("tab_inventory", mMyInventoryPanel, false);
|
||||
}
|
||||
|
||||
void LLLandmarksPanel::initLibraryInventoryPanel()
|
||||
|
|
@ -499,7 +497,15 @@ void LLLandmarksPanel::initLibraryInventoryPanel()
|
|||
|
||||
initLandmarksPanel(mLibraryInventoryPanel);
|
||||
|
||||
initAccordion("tab_library", mLibraryInventoryPanel);
|
||||
// We want to fetch only "Landmarks" category from the library.
|
||||
const LLUUID &landmarks_cat = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false, true);
|
||||
if (landmarks_cat.notNull())
|
||||
{
|
||||
gInventory.startBackgroundFetch(landmarks_cat);
|
||||
}
|
||||
|
||||
// Expanding "Library" tab for new users who have no landmarks in "My Inventory".
|
||||
initAccordion("tab_library", mLibraryInventoryPanel, true);
|
||||
}
|
||||
|
||||
void LLLandmarksPanel::initLandmarksPanel(LLPlacesInventoryPanel* inventory_list)
|
||||
|
|
@ -526,14 +532,14 @@ void LLLandmarksPanel::initLandmarksPanel(LLPlacesInventoryPanel* inventory_list
|
|||
inventory_list->saveFolderState();
|
||||
}
|
||||
|
||||
void LLLandmarksPanel::initAccordion(const std::string& accordion_tab_name, LLPlacesInventoryPanel* inventory_list)
|
||||
void LLLandmarksPanel::initAccordion(const std::string& accordion_tab_name, LLPlacesInventoryPanel* inventory_list, bool expand_tab)
|
||||
{
|
||||
LLAccordionCtrlTab* accordion_tab = getChild<LLAccordionCtrlTab>(accordion_tab_name);
|
||||
|
||||
mAccordionTabs.push_back(accordion_tab);
|
||||
accordion_tab->setDropDownStateChangedCallback(
|
||||
boost::bind(&LLLandmarksPanel::onAccordionExpandedCollapsed, this, _2, inventory_list));
|
||||
accordion_tab->setDisplayChildren(false);
|
||||
accordion_tab->setDisplayChildren(expand_tab);
|
||||
}
|
||||
|
||||
void LLLandmarksPanel::onAccordionExpandedCollapsed(const LLSD& param, LLPlacesInventoryPanel* inventory_list)
|
||||
|
|
|
|||
|
|
@ -110,7 +110,7 @@ private:
|
|||
void initMyInventoryPanel();
|
||||
void initLibraryInventoryPanel();
|
||||
void initLandmarksPanel(LLPlacesInventoryPanel* inventory_list);
|
||||
void initAccordion(const std::string& accordion_tab_name, LLPlacesInventoryPanel* inventory_list);
|
||||
void initAccordion(const std::string& accordion_tab_name, LLPlacesInventoryPanel* inventory_list, bool expand_tab);
|
||||
void onAccordionExpandedCollapsed(const LLSD& param, LLPlacesInventoryPanel* inventory_list);
|
||||
void deselectOtherThan(const LLPlacesInventoryPanel* inventory_list);
|
||||
|
||||
|
|
|
|||
|
|
@ -533,9 +533,13 @@ void LLScreenChannel::showToastsBottom()
|
|||
// HACK
|
||||
// EXT-2653: it is necessary to prevent overlapping for secondary showed toasts
|
||||
(*it).toast->setVisible(TRUE);
|
||||
// Show toast behind floaters. (EXT-3089)
|
||||
gFloaterView->sendChildToBack((*it).toast);
|
||||
}
|
||||
if(!(*it).toast->hasFocus())
|
||||
{
|
||||
// Fixing Z-order of toasts (EXT-4862)
|
||||
// Next toast will be positioned under this one.
|
||||
gFloaterView->sendChildToBack((*it).toast);
|
||||
}
|
||||
}
|
||||
|
||||
if(it != mToastList.rend())
|
||||
|
|
|
|||
|
|
@ -1107,16 +1107,17 @@ public:
|
|||
* Sets internal voluem level for specified user.
|
||||
*
|
||||
* @param[in] speaker_id - LLUUID of user to store volume level for
|
||||
* @param[in] volume - internal volume level to be stored for user.
|
||||
* @param[in] volume - external (vivox) volume level to be stored for user.
|
||||
*/
|
||||
void storeSpeakerVolume(const LLUUID& speaker_id, S32 volume);
|
||||
void storeSpeakerVolume(const LLUUID& speaker_id, F32 volume);
|
||||
|
||||
/**
|
||||
* Gets stored internal volume level for specified speaker.
|
||||
* Gets stored external (vivox) volume level for specified speaker and
|
||||
* transforms it into internal (viewer) level.
|
||||
*
|
||||
* If specified user is not found default level will be returned. It is equivalent of
|
||||
* external level 0.5 from the 0.0..1.0 range.
|
||||
* Default internal level is calculated as: internal = 400 * external^2
|
||||
* Internal level is calculated as: internal = 400 * external^2
|
||||
* Maps 0.0 to 1.0 to internal values 0-400 with default 0.5 == 100
|
||||
*
|
||||
* @param[in] speaker_id - LLUUID of user to get his volume level
|
||||
|
|
@ -1133,7 +1134,7 @@ private:
|
|||
void load();
|
||||
void save();
|
||||
|
||||
typedef std::map<LLUUID, S32> speaker_data_map_t;
|
||||
typedef std::map<LLUUID, F32> speaker_data_map_t;
|
||||
speaker_data_map_t mSpeakersData;
|
||||
};
|
||||
|
||||
|
|
@ -1149,7 +1150,7 @@ LLSpeakerVolumeStorage::~LLSpeakerVolumeStorage()
|
|||
save();
|
||||
}
|
||||
|
||||
void LLSpeakerVolumeStorage::storeSpeakerVolume(const LLUUID& speaker_id, S32 volume)
|
||||
void LLSpeakerVolumeStorage::storeSpeakerVolume(const LLUUID& speaker_id, F32 volume)
|
||||
{
|
||||
mSpeakersData[speaker_id] = volume;
|
||||
}
|
||||
|
|
@ -1163,7 +1164,10 @@ S32 LLSpeakerVolumeStorage::getSpeakerVolume(const LLUUID& speaker_id)
|
|||
|
||||
if (it != mSpeakersData.end())
|
||||
{
|
||||
ret_val = it->second;
|
||||
F32 f_val = it->second;
|
||||
// volume can amplify by as much as 4x!
|
||||
S32 ivol = (S32)(400.f * f_val * f_val);
|
||||
ret_val = llclamp(ivol, 0, 400);
|
||||
}
|
||||
return ret_val;
|
||||
}
|
||||
|
|
@ -1184,7 +1188,7 @@ void LLSpeakerVolumeStorage::load()
|
|||
for (LLSD::map_const_iterator iter = settings_llsd.beginMap();
|
||||
iter != settings_llsd.endMap(); ++iter)
|
||||
{
|
||||
mSpeakersData.insert(std::make_pair(LLUUID(iter->first), (S32)iter->second.asInteger()));
|
||||
mSpeakersData.insert(std::make_pair(LLUUID(iter->first), (F32)iter->second.asReal()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -6288,14 +6292,14 @@ void LLVoiceClient::setUserVolume(const LLUUID& id, F32 volume)
|
|||
participantState *participant = findParticipantByID(id);
|
||||
if (participant)
|
||||
{
|
||||
// store this volume setting for future sessions
|
||||
LLSpeakerVolumeStorage::getInstance()->storeSpeakerVolume(id, volume);
|
||||
|
||||
// volume can amplify by as much as 4x!
|
||||
S32 ivol = (S32)(400.f * volume * volume);
|
||||
participant->mUserVolume = llclamp(ivol, 0, 400);
|
||||
participant->mVolumeDirty = TRUE;
|
||||
mAudioSession->mVolumeDirty = TRUE;
|
||||
|
||||
// store this volume setting for future sessions
|
||||
LLSpeakerVolumeStorage::getInstance()->storeSpeakerVolume(id, participant->mUserVolume);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1532,7 +1532,7 @@ Your search terms were too short so no search was performed.
|
|||
icon="alertmodal.tga"
|
||||
name="CouldNotTeleportReason"
|
||||
type="alertmodal">
|
||||
Could not teleport.
|
||||
Teleport failed.
|
||||
[REASON]
|
||||
</notification>
|
||||
|
||||
|
|
|
|||
|
|
@ -137,6 +137,7 @@ background_visible="true"
|
|||
<avatar_list
|
||||
allow_select="true"
|
||||
follows="all"
|
||||
height="235"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
multi_select="true"
|
||||
|
|
@ -152,6 +153,7 @@ background_visible="true"
|
|||
<avatar_list
|
||||
allow_select="true"
|
||||
follows="all"
|
||||
height="235"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
multi_select="true"
|
||||
|
|
|
|||
|
|
@ -64,6 +64,7 @@
|
|||
layout="topleft"
|
||||
left="103"
|
||||
name="picture_descr"
|
||||
textbox.mouse_opaque="false"
|
||||
top_pad="0"
|
||||
width="178"
|
||||
word_wrap="true" />
|
||||
|
|
|
|||
|
|
@ -5,4 +5,12 @@
|
|||
item_pad="0"
|
||||
keep_one_selected="true"
|
||||
multi_select="false"
|
||||
opaque="true" />
|
||||
opaque="true">
|
||||
<flat_list_view.no_items_text
|
||||
follows="all"
|
||||
name="no_items_msg"
|
||||
v_pad="10"
|
||||
h_pad="10"
|
||||
value="There are no any items in the list"
|
||||
wrap="true" />
|
||||
</flat_list_view>
|
||||
Loading…
Reference in New Issue