--HG--
branch : product-engine
meow-7.2.2
Ychebotarev ProductEngine 2010-02-04 17:12:36 +02:00
commit 29a5e29ddb
17 changed files with 170 additions and 104 deletions

View File

@ -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);
}

View File

@ -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();
};

View File

@ -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;
}

View File

@ -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)

View File

@ -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;

View File

@ -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));
}
}

View File

@ -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;
};

View File

@ -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);
}
}
}

View File

@ -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;
}

View File

@ -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)

View File

@ -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);

View File

@ -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())

View File

@ -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);
}
}
}

View File

@ -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>

View File

@ -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"

View File

@ -64,6 +64,7 @@
layout="topleft"
left="103"
name="picture_descr"
textbox.mouse_opaque="false"
top_pad="0"
width="178"
word_wrap="true" />

View File

@ -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>