automated merge from trunk

Roxie Linden 2010-02-25 14:12:18 -08:00
commit 0ac14158bc
830 changed files with 48153 additions and 47594 deletions

View File

@ -75,6 +75,10 @@ const int LL_ERR_PRICE_MISMATCH = -23018;
#define SHOW_ASSERT
#else // _DEBUG
#ifdef LL_RELEASE_WITH_DEBUG_INFO
#define SHOW_ASSERT
#endif // LL_RELEASE_WITH_DEBUG_INFO
#ifdef RELEASE_SHOW_DEBUG
#define SHOW_DEBUG
#endif

View File

@ -1,11 +1,11 @@
/**
/**
* @file llfasttimer.h
* @brief Declaration of a fast timer.
*
* $LicenseInfo:firstyear=2004&license=viewergpl$
*
*
* Copyright (c) 2004-2009, Linden Research, Inc.
*
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
@ -13,17 +13,17 @@
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
@ -69,7 +69,7 @@
inline U32 get_cpu_clock_count_32()
{
U32 ret_val;
__asm
__asm
{
_emit 0x0f
_emit 0x31
@ -85,7 +85,7 @@ inline U32 get_cpu_clock_count_32()
inline U64 get_cpu_clock_count_64()
{
U64 ret_val;
__asm
__asm
{
_emit 0x0f
_emit 0x31
@ -99,21 +99,21 @@ inline U64 get_cpu_clock_count_64()
#else
#define LL_INLINE
#endif
#if (LL_LINUX || LL_SOLARIS || LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
inline U32 get_cpu_clock_count_32()
{
U64 x;
__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
return (U32)x >> 8;
}
inline U32 get_cpu_clock_count_64()
{
U64 x;
__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
return x >> 8;
}
#if (LL_LINUX || LL_SOLARIS || LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
inline U32 get_cpu_clock_count_32()
{
U64 x;
__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
return (U32)x >> 8;
}
inline U32 get_cpu_clock_count_64()
{
U64 x;
__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
return x >> 8;
}
#endif
#if ( LL_DARWIN && !(defined(__i386__) || defined(__amd64__))) || (LL_SOLARIS && defined(__sparc__))
@ -128,7 +128,7 @@ inline U32 get_cpu_clock_count_32()
}
inline U32 get_cpu_clock_count_64()
{
{
return get_clock_count();
}
#endif
@ -158,7 +158,7 @@ public:
};
// stores a "named" timer instance to be reused via multiple LLFastTimer stack instances
class LL_COMMON_API NamedTimer
class LL_COMMON_API NamedTimer
: public LLInstanceTracker<NamedTimer>
{
friend class DeclareTimer;
@ -193,7 +193,7 @@ public:
FrameState& getFrameState() const;
private:
private:
friend class LLFastTimer;
friend class NamedTimerFactory;
@ -204,14 +204,14 @@ public:
// recursive call to gather total time from children
static void accumulateTimings();
// updates cumulative times and hierarchy,
// updates cumulative times and hierarchy,
// can be called multiple times in a frame, at any point
static void processTimes();
static void buildHierarchy();
static void resetFrame();
static void reset();
//
// members
//
@ -247,7 +247,7 @@ public:
private:
NamedTimer& mTimer;
FrameState* mFrameState;
FrameState* mFrameState;
};
public:
@ -267,7 +267,7 @@ public:
frame_state->mCalls++;
// keep current parent as long as it is active when we are
frame_state->mMoveUpTree |= (frame_state->mParent->mActiveCount == 0);
LLFastTimer::CurTimerData* cur_timer_data = &LLFastTimer::sCurTimerData;
mLastTimerData = *cur_timer_data;
cur_timer_data->mCurTimer = this;
@ -305,7 +305,7 @@ public:
U64 timer_end = get_cpu_clock_count_64();
sTimerCycles += timer_end - timer_start;
sTimerCalls++;
#endif
#endif
}
public:
@ -321,13 +321,13 @@ public:
typedef std::vector<FrameState> info_list_t;
static info_list_t& getFrameStateList();
// call this once a frame to reset timers
static void nextFrame();
// dumps current cumulative frame stats to log
// call nextFrame() to reset timers
static void dumpCurTimes();
static void dumpCurTimes();
// call this to reset timer hierarchy, averages, etc.
static void reset();

View File

@ -1736,12 +1736,25 @@ BOOL LLImageGL::getMask(const LLVector2 &tc)
if (u < 0.f || u > 1.f ||
v < 0.f || v > 1.f)
{
llerrs << "WTF?" << llendl;
LL_WARNS_ONCE("render") << "Ugh, u/v out of range in image mask pick" << LL_ENDL;
u = v = 0.f;
llassert(false);
}
S32 x = (S32)(u * width);
S32 y = (S32)(v * height);
if (x >= width)
{
LL_WARNS_ONCE("render") << "Ooh, width overrun on pick mask read, that coulda been bad." << LL_ENDL;
x = llmax(0, width-1);
}
if (y >= height)
{
LL_WARNS_ONCE("render") << "Ooh, height overrun on pick mask read, that woulda been bad." << LL_ENDL;
y = llmax(0, height-1);
}
S32 idx = y*width+x;
S32 offset = idx%8;

View File

@ -1022,6 +1022,20 @@ void LLButton::setImageOverlay(const std::string& image_name, LLFontGL::HAlign a
}
}
void LLButton::setImageOverlay(const LLUUID& image_id, LLFontGL::HAlign alignment, const LLColor4& color)
{
if (image_id.isNull())
{
mImageOverlay = NULL;
}
else
{
mImageOverlay = LLUI::getUIImageByID(image_id);
mImageOverlayAlignment = alignment;
mImageOverlayColor = color;
}
}
void LLButton::onMouseCaptureLost()
{
resetMouseDownTimer();

View File

@ -200,6 +200,7 @@ public:
void setDisabledSelectedLabelColor( const LLColor4& c ) { mDisabledSelectedLabelColor = c; }
void setImageOverlay(const std::string& image_name, LLFontGL::HAlign alignment = LLFontGL::HCENTER, const LLColor4& color = LLColor4::white);
void setImageOverlay(const LLUUID& image_id, LLFontGL::HAlign alignment = LLFontGL::HCENTER, const LLColor4& color = LLColor4::white);
LLPointer<LLUIImage> getImageOverlay() { return mImageOverlay; }
void autoResize(); // resize with label of current btn state

View File

@ -1360,6 +1360,7 @@ void LLFloater::bringToFront( S32 x, S32 y )
// virtual
void LLFloater::setVisibleAndFrontmost(BOOL take_focus)
{
gFocusMgr.setTopCtrl(NULL);
setVisible(TRUE);
setFrontmost(take_focus);
}

View File

@ -1507,6 +1507,37 @@ void LLTabContainer::setTabImage(LLPanel* child, std::string image_name, const L
}
}
void LLTabContainer::setTabImage(LLPanel* child, const LLUUID& image_id, const LLColor4& color)
{
static LLUICachedControl<S32> tab_padding ("UITabPadding", 0);
LLTabTuple* tuple = getTabByPanel(child);
if( tuple )
{
tuple->mButton->setImageOverlay(image_id, LLFontGL::RIGHT, color);
if (!mIsVertical)
{
// remove current width from total tab strip width
mTotalTabWidth -= tuple->mButton->getRect().getWidth();
S32 image_overlay_width = tuple->mButton->getImageOverlay().notNull() ?
tuple->mButton->getImageOverlay()->getImage()->getWidth(0) :
0;
tuple->mPadding = image_overlay_width;
tuple->mButton->setRightHPad(6);
tuple->mButton->reshape(llclamp(mFont->getWidth(tuple->mButton->getLabelSelected()) + tab_padding + tuple->mPadding, mMinTabWidth, mMaxTabWidth),
tuple->mButton->getRect().getHeight());
// add back in button width to total tab strip width
mTotalTabWidth += tuple->mButton->getRect().getWidth();
// tabs have changed size, might need to scroll to see current tab
updateMaxScrollPos();
}
}
}
void LLTabContainer::setTitle(const std::string& title)
{
if (mTitleBox)

View File

@ -172,6 +172,7 @@ public:
BOOL getTabPanelFlashing(LLPanel* child);
void setTabPanelFlashing(LLPanel* child, BOOL state);
void setTabImage(LLPanel* child, std::string img_name, const LLColor4& color = LLColor4::white);
void setTabImage(LLPanel* child, const LLUUID& img_id, const LLColor4& color = LLColor4::white);
void setTitle( const std::string& title );
const std::string getPanelTitle(S32 index);

View File

@ -1145,17 +1145,6 @@
<key>Value</key>
<integer>5</integer>
</map>
<key>CallFloaterMaxItems</key>
<map>
<key>Comment</key>
<string>Max number of visible participants in voice controls window</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>5</integer>
</map>
<key>CameraAngle</key>
<map>
<key>Comment</key>
@ -3651,7 +3640,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>http://int.searchwww-phx0.damballah.lindenlab.com/viewer/[CATEGORY]?q=[QUERY]&amp;p=[AUTH_TOKEN]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]&amp;sid=[SESSION_ID]&amp;rid=[REGION_ID]&amp;pid=[PARCEL_ID]</string>
<string>http://search.secondlife.com/viewer/[CATEGORY]?q=[QUERY]&amp;p=[AUTH_TOKEN]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]&amp;sid=[SESSION_ID]&amp;rid=[REGION_ID]&amp;pid=[PARCEL_ID]</string>
</map>
<key>HighResSnapshot</key>
<map>
@ -10114,6 +10103,18 @@
<key>Value</key>
<integer>1</integer>
</map>
<key>SpeakerParticipantRemoveDelay</key>
<map>
<key>Comment</key>
<string>Timeout to remove participants who is not in channel before removed from list of active speakers (text/voice chat)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>10.0</real>
</map>
<key>UseStartScreen</key>
<map>
<key>Comment</key>

View File

@ -274,6 +274,7 @@ private:
struct LLFoundData
{
LLFoundData() {}
LLFoundData(const LLUUID& item_id,
const LLUUID& asset_id,
const std::string& name,
@ -292,20 +293,94 @@ struct LLFoundData
};
struct LLWearableHoldingPattern
class LLWearableHoldingPattern
{
LLWearableHoldingPattern() : mResolved(0) {}
~LLWearableHoldingPattern()
{
for_each(mFoundList.begin(), mFoundList.end(), DeletePointer());
mFoundList.clear();
}
typedef std::list<LLFoundData*> found_list_t;
public:
LLWearableHoldingPattern();
~LLWearableHoldingPattern();
bool pollCompletion();
bool isDone();
bool isTimedOut();
typedef std::list<LLFoundData> found_list_t;
found_list_t mFoundList;
LLInventoryModel::item_array_t mObjItems;
LLInventoryModel::item_array_t mGestItems;
S32 mResolved;
bool append;
LLTimer mWaitTime;
};
LLWearableHoldingPattern::LLWearableHoldingPattern():
mResolved(0)
{
}
LLWearableHoldingPattern::~LLWearableHoldingPattern()
{
}
bool LLWearableHoldingPattern::isDone()
{
if (mResolved >= (S32)mFoundList.size())
return true; // have everything we were waiting for
else if (isTimedOut())
{
llwarns << "Exceeded max wait time, updating appearance based on what has arrived" << llendl;
return true;
}
return false;
}
bool LLWearableHoldingPattern::isTimedOut()
{
static F32 max_wait_time = 15.0; // give up if wearable fetches haven't completed in max_wait_time seconds.
return mWaitTime.getElapsedTimeF32() > max_wait_time;
}
bool LLWearableHoldingPattern::pollCompletion()
{
bool done = isDone();
llinfos << "polling, done status: " << done << " elapsed " << mWaitTime.getElapsedTimeF32() << llendl;
if (done)
{
// Activate all gestures in this folder
if (mGestItems.count() > 0)
{
llinfos << "Activating " << mGestItems.count() << " gestures" << llendl;
LLGestureManager::instance().activateGestures(mGestItems);
// Update the inventory item labels to reflect the fact
// they are active.
LLViewerInventoryCategory* catp =
gInventory.getCategory(LLAppearanceManager::instance().getCOF());
if (catp)
{
gInventory.updateCategory(catp);
gInventory.notifyObservers();
}
}
// Update wearables.
llinfos << "Updating agent wearables with " << mResolved << " wearable items " << llendl;
LLAppearanceManager::instance().updateAgentWearables(this, false);
// Update attachments to match those requested.
LLVOAvatar* avatar = gAgent.getAvatarObject();
if( avatar )
{
llinfos << "Updating " << mObjItems.count() << " attachments" << llendl;
LLAgentWearables::userUpdateAttachments(mObjItems);
}
delete this;
}
return done;
}
static void removeDuplicateItems(LLInventoryModel::item_array_t& items)
{
LLInventoryModel::item_array_t new_items;
@ -336,26 +411,21 @@ static void removeDuplicateItems(LLInventoryModel::item_array_t& items)
static void onWearableAssetFetch(LLWearable* wearable, void* data)
{
LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data;
bool append = holder->append;
if(wearable)
{
for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin();
iter != holder->mFoundList.end(); ++iter)
{
LLFoundData* data = *iter;
if(wearable->getAssetID() == data->mAssetID)
LLFoundData& data = *iter;
if(wearable->getAssetID() == data.mAssetID)
{
data->mWearable = wearable;
data.mWearable = wearable;
break;
}
}
}
holder->mResolved += 1;
if(holder->mResolved >= (S32)holder->mFoundList.size())
{
LLAppearanceManager::instance().updateAgentWearables(holder, append);
}
}
LLUUID LLAppearanceManager::getCOF()
@ -662,12 +732,12 @@ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder,
for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin();
iter != holder->mFoundList.end(); ++iter)
{
LLFoundData* data = *iter;
LLWearable* wearable = data->mWearable;
LLFoundData& data = *iter;
LLWearable* wearable = data.mWearable;
if( wearable && ((S32)wearable->getType() == i) )
{
LLViewerInventoryItem* item;
item = (LLViewerInventoryItem*)gInventory.getItem(data->mItemID);
item = (LLViewerInventoryItem*)gInventory.getItem(data.mItemID);
if( item && (item->getAssetUUID() == wearable->getAssetID()) )
{
items.put(item);
@ -683,8 +753,6 @@ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder,
gAgentWearables.setWearableOutfit(items, wearables, !append);
}
delete holder;
// dec_busy_count();
}
@ -706,86 +774,66 @@ void LLAppearanceManager::updateAppearanceFromCOF()
LLInventoryModel::item_array_t gest_items;
getUserDescendents(current_outfit_id, wear_items, obj_items, gest_items, follow_folder_links);
if( !wear_items.count() && !obj_items.count() && !gest_items.count())
if(!wear_items.count())
{
LLNotificationsUtil::add("CouldNotPutOnOutfit");
return;
}
LLWearableHoldingPattern* holder = new LLWearableHoldingPattern;
holder->mObjItems = obj_items;
holder->mGestItems = gest_items;
// Processes that take time should show the busy cursor
//inc_busy_count(); // BAP this is currently a no-op in llinventorybridge.cpp - do we need it?
// Activate all gestures in this folder
if (gest_items.count() > 0)
// Note: can't do normal iteration, because if all the
// wearables can be resolved immediately, then the
// callback will be called (and this object deleted)
// before the final getNextData().
LLDynamicArray<LLFoundData> found_container;
for(S32 i = 0; i < wear_items.count(); ++i)
{
llinfos << "Activating " << gest_items.count() << " gestures" << llendl;
LLGestureManager::instance().activateGestures(gest_items);
// Update the inventory item labels to reflect the fact
// they are active.
LLViewerInventoryCategory* catp = gInventory.getCategory(current_outfit_id);
if (catp)
LLViewerInventoryItem *item = wear_items.get(i);
LLViewerInventoryItem *linked_item = item ? item->getLinkedItem() : NULL;
if (item && linked_item)
{
gInventory.updateCategory(catp);
gInventory.notifyObservers();
LLFoundData found(linked_item->getUUID(),
linked_item->getAssetUUID(),
linked_item->getName(),
linked_item->getType());
holder->mFoundList.push_front(found);
found_container.put(found);
}
else
{
if (!item)
{
llwarns << "attempt to wear a null item " << llendl;
}
else if (!linked_item)
{
llwarns << "attempt to wear a broken link " << item->getName() << llendl;
}
}
}
if(wear_items.count() > 0)
for(S32 i = 0; i < found_container.count(); ++i)
{
// Note: can't do normal iteration, because if all the
// wearables can be resolved immediately, then the
// callback will be called (and this object deleted)
// before the final getNextData().
LLWearableHoldingPattern* holder = new LLWearableHoldingPattern;
LLFoundData* found;
LLDynamicArray<LLFoundData*> found_container;
for(S32 i = 0; i < wear_items.count(); ++i)
{
LLViewerInventoryItem *item = wear_items.get(i);
LLViewerInventoryItem *linked_item = item ? item->getLinkedItem() : NULL;
if (item && linked_item)
{
found = new LLFoundData(linked_item->getUUID(),
linked_item->getAssetUUID(),
linked_item->getName(),
linked_item->getType());
holder->mFoundList.push_front(found);
found_container.put(found);
}
else
{
if (!item)
{
llwarns << "attempt to wear a null item " << llendl;
}
else if (!linked_item)
{
llwarns << "attempt to wear a broken link " << item->getName() << llendl;
}
}
}
for(S32 i = 0; i < found_container.count(); ++i)
{
holder->append = false;
found = found_container.get(i);
LLFoundData& found = found_container.get(i);
// Fetch the wearables about to be worn.
LLWearableList::instance().getAsset(found->mAssetID,
found->mName,
found->mAssetType,
onWearableAssetFetch,
(void*)holder);
}
// Fetch the wearables about to be worn.
LLWearableList::instance().getAsset(found.mAssetID,
found.mName,
found.mAssetType,
onWearableAssetFetch,
(void*)holder);
}
// Update attachments to match those requested.
LLVOAvatar* avatar = gAgent.getAvatarObject();
if( avatar )
if (!holder->pollCompletion())
{
LLAgentWearables::userUpdateAttachments(obj_items);
doOnIdleRepeating(boost::bind(&LLWearableHoldingPattern::pollCompletion,holder));
}
}
void LLAppearanceManager::getDescendentsOfAssetType(const LLUUID& category,

View File

@ -39,7 +39,7 @@
#include "llcallbacklist.h"
class LLWearable;
struct LLWearableHoldingPattern;
class LLWearableHoldingPattern;
class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
{
@ -168,4 +168,40 @@ void doOnIdle(T callable)
gIdleCallbacks.addFunction(&OnIdleCallback<T>::onIdle,cb_functor);
}
// Shim class and template function to allow arbitrary boost::bind
// expressions to be run as recurring idle callbacks.
template <typename T>
class OnIdleCallbackRepeating
{
public:
OnIdleCallbackRepeating(T callable):
mCallable(callable)
{
}
// Will keep getting called until the callable returns false.
static void onIdle(void *data)
{
OnIdleCallbackRepeating<T>* self = reinterpret_cast<OnIdleCallbackRepeating<T>*>(data);
bool done = self->call();
if (done)
{
gIdleCallbacks.deleteFunction(onIdle, data);
delete self;
}
}
bool call()
{
return mCallable();
}
private:
T mCallable;
};
template <typename T>
void doOnIdleRepeating(T callable)
{
OnIdleCallbackRepeating<T>* cb_functor = new OnIdleCallbackRepeating<T>(callable);
gIdleCallbacks.addFunction(&OnIdleCallbackRepeating<T>::onIdle,cb_functor);
}
#endif

View File

@ -907,7 +907,6 @@ bool LLAppViewer::mainLoop()
{
LLMemType mt1(LLMemType::MTYPE_MAIN);
mMainloopTimeout = new LLWatchdogTimeout();
// *FIX:Mani - Make this a setting, once new settings exist in this branch.
//-------------------------------------------
// Run main loop until time to quit
@ -917,11 +916,11 @@ bool LLAppViewer::mainLoop()
gServicePump = new LLPumpIO(gAPRPoolp);
LLHTTPClient::setPump(*gServicePump);
LLCurl::setCAFile(gDirUtilp->getCAFile());
// Note: this is where gLocalSpeakerMgr and gActiveSpeakerMgr used to be instantiated.
LLVoiceChannel::initClass();
LLVoiceClient::getInstance()->init(gServicePump);
LLTimer frameTimer,idleTimer;
LLTimer debugTime;
LLViewerJoystick* joystick(LLViewerJoystick::getInstance());

View File

@ -263,18 +263,9 @@ bool LLAvatarActions::isCalling(const LLUUID &id)
}
//static
bool LLAvatarActions::canCall(const LLUUID &id)
bool LLAvatarActions::canCall()
{
// For now we do not need to check whether passed UUID is ID of agent's friend.
// Use common check of Voice Client state.
{
// don't need to check online/offline status because "usual resident" (resident that is not a friend)
// can be only ONLINE. There is no way to see "usual resident" in OFFLINE status. If we see "usual
// resident" it automatically means that the resident is ONLINE. So to make a call to the "usual resident"
// we need to check only that "our" voice is enabled.
return LLVoiceClient::getInstance()->voiceEnabled();
}
return LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
}
// static

View File

@ -129,10 +129,10 @@ public:
static bool isCalling(const LLUUID &id);
/**
* @return true if call to the resident can be made (resident is online and voice is enabled)
* @return true if call to the resident can be made
*/
static bool canCall(const LLUUID &id);
static bool canCall();
/**
* Invite avatar to a group.
*/

View File

@ -440,17 +440,17 @@ LLAvatarListItem::icon_color_map_t& LLAvatarListItem::getItemIconColorMap()
// static
void LLAvatarListItem::initChildrenWidths(LLAvatarListItem* avatar_item)
{
//speaking indicator width + padding
S32 speaking_indicator_width = avatar_item->getRect().getWidth() - avatar_item->mSpeakingIndicator->getRect().mLeft;
//profile btn width + padding
S32 profile_btn_width = avatar_item->getRect().getWidth() - avatar_item->mProfileBtn->getRect().mLeft;
S32 profile_btn_width = avatar_item->mSpeakingIndicator->getRect().mLeft - avatar_item->mProfileBtn->getRect().mLeft;
//info btn width + padding
S32 info_btn_width = avatar_item->mProfileBtn->getRect().mLeft - avatar_item->mInfoBtn->getRect().mLeft;
//speaking indicator width + padding
S32 speaking_indicator_width = avatar_item->mInfoBtn->getRect().mLeft - avatar_item->mSpeakingIndicator->getRect().mLeft;
// last interaction time textbox width + padding
S32 last_interaction_time_width = avatar_item->mSpeakingIndicator->getRect().mLeft - avatar_item->mLastInteractionTime->getRect().mLeft;
S32 last_interaction_time_width = avatar_item->mInfoBtn->getRect().mLeft - avatar_item->mLastInteractionTime->getRect().mLeft;
// icon width + padding
S32 icon_width = avatar_item->mAvatarName->getRect().mLeft - avatar_item->mAvatarIcon->getRect().mLeft;
@ -462,9 +462,9 @@ void LLAvatarListItem::initChildrenWidths(LLAvatarListItem* avatar_item)
sChildrenWidths[--index] = icon_width;
sChildrenWidths[--index] = 0; // for avatar name we don't need its width, it will be calculated as "left available space"
sChildrenWidths[--index] = last_interaction_time_width;
sChildrenWidths[--index] = speaking_indicator_width;
sChildrenWidths[--index] = info_btn_width;
sChildrenWidths[--index] = profile_btn_width;
sChildrenWidths[--index] = speaking_indicator_width;
}
void LLAvatarListItem::updateChildren()

View File

@ -129,9 +129,9 @@ private:
* @see updateChildren()
*/
typedef enum e_avatar_item_child {
ALIC_SPEAKER_INDICATOR,
ALIC_PROFILE_BUTTON,
ALIC_INFO_BUTTON,
ALIC_SPEAKER_INDICATOR,
ALIC_INTERACTION_TIME,
ALIC_NAME,
ALIC_ICON,

View File

@ -322,7 +322,7 @@ void LLBottomTray::setVisible(BOOL visible)
// Chat bar and gesture button are shown even in mouselook mode.
// But the move, camera and snapshot buttons shouldn't be displayed. See EXT-3988.
if ("chat_bar" == name || "gesture_panel" == name)
if ("chat_bar" == name || "gesture_panel" == name || (visibility && ("movement_panel" == name || "cam_panel" == name || "snapshot_panel" == name)))
continue;
else
{

View File

@ -51,7 +51,6 @@
#include "lltransientfloatermgr.h"
#include "llviewerwindow.h"
#include "llvoicechannel.h"
#include "lllayoutstack.h"
static void get_voice_participants_uuids(std::vector<LLUUID>& speakers_uuids);
void reshape_floater(LLCallFloater* floater, S32 delta_height);
@ -94,22 +93,6 @@ static void* create_non_avatar_caller(void*)
return new LLNonAvatarCaller;
}
LLCallFloater::LLAvatarListItemRemoveTimer::LLAvatarListItemRemoveTimer(callback_t remove_cb, F32 period, const LLUUID& speaker_id)
: LLEventTimer(period)
, mRemoveCallback(remove_cb)
, mSpeakerId(speaker_id)
{
}
BOOL LLCallFloater::LLAvatarListItemRemoveTimer::tick()
{
if (mRemoveCallback)
{
mRemoveCallback(mSpeakerId);
}
return TRUE;
}
LLVoiceChannel* LLCallFloater::sCurrentVoiceCanel = NULL;
LLCallFloater::LLCallFloater(const LLSD& key)
@ -123,10 +106,9 @@ LLCallFloater::LLCallFloater(const LLSD& key)
, mSpeakingIndicator(NULL)
, mIsModeratorMutedVoice(false)
, mInitParticipantsVoiceState(false)
, mVoiceLeftRemoveDelay(10)
{
static LLUICachedControl<S32> voice_left_remove_delay ("VoiceParticipantLeftRemoveDelay", 10);
mVoiceLeftRemoveDelay = voice_left_remove_delay;
mSpeakerDelayRemover = new LLSpeakersDelayActionsStorage(boost::bind(&LLCallFloater::removeVoiceLeftParticipant, this, _1), voice_left_remove_delay);
mFactoryMap["non_avatar_caller"] = LLCallbackMap(create_non_avatar_caller, NULL);
LLVoiceClient::getInstance()->addObserver(this);
@ -136,6 +118,7 @@ LLCallFloater::LLCallFloater(const LLSD& key)
LLCallFloater::~LLCallFloater()
{
resetVoiceRemoveTimers();
delete mSpeakerDelayRemover;
delete mParticipants;
mParticipants = NULL;
@ -225,16 +208,6 @@ void LLCallFloater::onChange()
}
}
S32 LLCallFloater::notifyParent(const LLSD& info)
{
if("size_changes" == info["action"])
{
reshapeToFitContent();
return 1;
}
return LLDockableFloater::notifyParent(info);
}
//////////////////////////////////////////////////////////////////////////
/// PRIVATE SECTION
//////////////////////////////////////////////////////////////////////////
@ -315,32 +288,7 @@ void LLCallFloater::updateSession()
//hide "Leave Call" button for nearby chat
bool is_local_chat = mVoiceType == VC_LOCAL_CHAT;
LLPanel* leave_panel = findChild<LLPanel>("leave_call_btn_panel");
if (leave_panel)
{
S32 delta = 0;
bool visible = !is_local_chat;
if ((bool)leave_panel->getVisible() != visible)
{
delta = visible
? leave_panel->getRect().getHeight()
: -leave_panel->getRect().getHeight();
}
leave_panel->setVisible(visible);
if (delta)
{
LLLayoutStack* stack = getChild<LLLayoutStack>("my_call_stack");
BOOL animate = stack->getAnimate();
// Disable animation to prevent layout updating in several frames.
// We need this to get work reshapeToFitContent properly, otherwise
// the height of leave_call_btn_panel won't be completely included.
stack->setAnimate(FALSE);
reshape_floater(this, delta);
// Restore animate state.
stack->setAnimate(animate);
}
}
childSetVisible("leave_call_btn_panel", !is_local_chat);
refreshParticipantList();
updateAgentModeratorState();
@ -682,33 +630,11 @@ void LLCallFloater::setState(LLAvatarListItem* item, ESpeakerState state)
void LLCallFloater::setVoiceRemoveTimer(const LLUUID& voice_speaker_id)
{
// If there is already a started timer for the current panel don't do anything.
bool no_timer_for_current_panel = true;
if (mVoiceLeftTimersMap.size() > 0)
{
timers_map::iterator found_it = mVoiceLeftTimersMap.find(voice_speaker_id);
if (found_it != mVoiceLeftTimersMap.end())
{
no_timer_for_current_panel = false;
}
}
if (no_timer_for_current_panel)
{
// Starting a timer to remove an avatar row panel after timeout
mVoiceLeftTimersMap.insert(timer_pair(voice_speaker_id,
new LLAvatarListItemRemoveTimer(boost::bind(&LLCallFloater::removeVoiceLeftParticipant, this, _1), mVoiceLeftRemoveDelay, voice_speaker_id)));
}
mSpeakerDelayRemover->setActionTimer(voice_speaker_id);
}
void LLCallFloater::removeVoiceLeftParticipant(const LLUUID& voice_speaker_id)
bool LLCallFloater::removeVoiceLeftParticipant(const LLUUID& voice_speaker_id)
{
if (mVoiceLeftTimersMap.size() > 0)
{
mVoiceLeftTimersMap.erase(mVoiceLeftTimersMap.find(voice_speaker_id));
}
LLAvatarList::uuid_vector_t& speaker_uuids = mAvatarList->getIDs();
LLAvatarList::uuid_vector_t::iterator pos = std::find(speaker_uuids.begin(), speaker_uuids.end(), voice_speaker_id);
if(pos != speaker_uuids.end())
@ -716,34 +642,19 @@ void LLCallFloater::removeVoiceLeftParticipant(const LLUUID& voice_speaker_id)
speaker_uuids.erase(pos);
mAvatarList->setDirty();
}
return false;
}
void LLCallFloater::resetVoiceRemoveTimers()
{
if (mVoiceLeftTimersMap.size() > 0)
{
for (timers_map::iterator iter = mVoiceLeftTimersMap.begin();
iter != mVoiceLeftTimersMap.end(); ++iter)
{
delete iter->second;
}
}
mVoiceLeftTimersMap.clear();
mSpeakerDelayRemover->removeAllTimers();
}
void LLCallFloater::removeVoiceRemoveTimer(const LLUUID& voice_speaker_id)
{
// Remove the timer if it has been already started
if (mVoiceLeftTimersMap.size() > 0)
{
timers_map::iterator found_it = mVoiceLeftTimersMap.find(voice_speaker_id);
if (found_it != mVoiceLeftTimersMap.end())
{
delete found_it->second;
mVoiceLeftTimersMap.erase(found_it);
}
}
mSpeakerDelayRemover->unsetActionTimer(voice_speaker_id);
}
bool LLCallFloater::validateSpeaker(const LLUUID& speaker_id)
@ -822,90 +733,4 @@ void LLCallFloater::reset()
mSpeakerManager = NULL;
}
void reshape_floater(LLCallFloater* floater, S32 delta_height)
{
// Try to update floater top side if it is docked(to bottom bar).
// Try to update floater bottom side or top side if it is un-docked.
// If world rect is too small, floater will not be reshaped at all.
LLRect floater_rect = floater->getRect();
LLRect world_rect = gViewerWindow->getWorldViewRectScaled();
// floater is docked to bottom bar
if(floater->isDocked())
{
// can update floater top side
if(floater_rect.mTop + delta_height < world_rect.mTop)
{
floater_rect.set(floater_rect.mLeft, floater_rect.mTop + delta_height,
floater_rect.mRight, floater_rect.mBottom);
}
}
// floater is un-docked
else
{
// can update floater bottom side
if( floater_rect.mBottom - delta_height >= world_rect.mBottom )
{
floater_rect.set(floater_rect.mLeft, floater_rect.mTop,
floater_rect.mRight, floater_rect.mBottom - delta_height);
}
// could not update floater bottom side, check if we can update floater top side
else if( floater_rect.mTop + delta_height < world_rect.mTop )
{
floater_rect.set(floater_rect.mLeft, floater_rect.mTop + delta_height,
floater_rect.mRight, floater_rect.mBottom);
}
}
floater->setShape(floater_rect);
floater->getChild<LLLayoutStack>("my_call_stack")->updateLayout(FALSE);
}
void LLCallFloater::reshapeToFitContent()
{
const S32 ITEM_HEIGHT = getParticipantItemHeight();
static const S32 MAX_VISIBLE_ITEMS = getMaxVisibleItems();
static S32 items_pad = mAvatarList->getItemsPad();
S32 list_height = mAvatarList->getRect().getHeight();
S32 items_height = mAvatarList->getItemsRect().getHeight();
if(items_height <= 0)
{
// make "no one near" text visible
items_height = ITEM_HEIGHT + items_pad;
}
S32 max_list_height = MAX_VISIBLE_ITEMS * ITEM_HEIGHT + items_pad * (MAX_VISIBLE_ITEMS - 1);
max_list_height += 2* mAvatarList->getBorderWidth();
S32 delta = items_height - list_height;
// too many items, don't reshape floater anymore, let scroll bar appear.
if(items_height > max_list_height)
{
delta = max_list_height - list_height;
}
reshape_floater(this, delta);
}
S32 LLCallFloater::getParticipantItemHeight()
{
std::vector<LLPanel*> items;
mAvatarList->getItems(items);
if(items.size() > 0)
{
return items[0]->getRect().getHeight();
}
else
{
return getChild<LLPanel>("non_avatar_caller")->getRect().getHeight();
}
}
S32 LLCallFloater::getMaxVisibleItems()
{
static LLCachedControl<S32> max_visible_items(*LLUI::sSettingGroups["config"],"CallFloaterMaxItems");
return max_visible_items;
}
//EOF

View File

@ -44,6 +44,8 @@ class LLNonAvatarCaller;
class LLOutputMonitorCtrl;
class LLParticipantList;
class LLSpeakerMgr;
class LLSpeakersDelayActionsStorage;
/**
* The Voice Control Panel is an ambient window summoned by clicking the flyout chevron on the Speak button.
* It can be torn-off and freely positioned onscreen.
@ -75,11 +77,6 @@ public:
*/
/*virtual*/ void onChange();
/**
* Will reshape floater when participant list size changes
*/
/*virtual*/ S32 notifyParent(const LLSD& info);
static void sOnCurrentChannelChanged(const LLUUID& session_id);
private:
@ -174,7 +171,7 @@ private:
*
* @param voice_speaker_id LLUUID of Avatar List item to be removed from the list.
*/
void removeVoiceLeftParticipant(const LLUUID& voice_speaker_id);
bool removeVoiceLeftParticipant(const LLUUID& voice_speaker_id);
/**
* Deletes all timers from the list to prevent started timers from ticking after destruction
@ -221,21 +218,6 @@ private:
*/
void reset();
/**
* Reshapes floater to fit participant list height
*/
void reshapeToFitContent();
/**
* Returns height of participant list item
*/
S32 getParticipantItemHeight();
/**
* Returns predefined max visible participants.
*/
S32 getMaxVisibleItems();
private:
speaker_state_map_t mSpeakerStateMap;
LLSpeakerMgr* mSpeakerManager;
@ -260,32 +242,11 @@ private:
boost::signals2::connection mAvatarListRefreshConnection;
/**
* class LLAvatarListItemRemoveTimer
*
* Implements a timer that removes avatar list item of a participant
* who has left the call.
* time out speakers when they are not part of current session
*/
class LLAvatarListItemRemoveTimer : public LLEventTimer
{
public:
typedef boost::function<void(const LLUUID&)> callback_t;
LLAvatarListItemRemoveTimer(callback_t remove_cb, F32 period, const LLUUID& speaker_id);
virtual ~LLAvatarListItemRemoveTimer() {};
virtual BOOL tick();
private:
callback_t mRemoveCallback;
LLUUID mSpeakerId;
};
typedef std::pair<LLUUID, LLAvatarListItemRemoveTimer*> timer_pair;
typedef std::map<LLUUID, LLAvatarListItemRemoveTimer*> timers_map;
timers_map mVoiceLeftTimersMap;
S32 mVoiceLeftRemoveDelay;
LLSpeakersDelayActionsStorage* mSpeakerDelayRemover;
/**
* Stores reference to current voice channel.

View File

@ -1272,6 +1272,7 @@ bool LLChicletPanel::addChiclet(LLChiclet* chiclet, S32 index)
chiclet->setChicletSizeChangedCallback(boost::bind(&LLChicletPanel::onChicletSizeChanged, this, _1, index));
arrange();
LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::IM, chiclet);
return true;
}
@ -1299,6 +1300,7 @@ void LLChicletPanel::removeChiclet(chiclet_list_t::iterator it)
mChicletList.erase(it);
arrange();
LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::IM, chiclet);
chiclet->die();
}

View File

@ -51,6 +51,7 @@
#include "llinventorymodel.h"
#include "llfloaterworldmap.h"
#include "lllandmarkactions.h"
#include "llnotificationsutil.h"
#include "llsidetray.h"
#include "lltoggleablemenu.h"
#include "llviewerinventory.h"
@ -975,6 +976,10 @@ BOOL LLFavoritesBarCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
void copy_slurl_to_clipboard_cb(std::string& slurl)
{
gClipboard.copyFromString(utf8str_to_wstring(slurl));
LLSD args;
args["SLURL"] = slurl;
LLNotificationsUtil::add("CopySLURL", args);
}

View File

@ -75,7 +75,7 @@ LLFloaterGroupPicker::~LLFloaterGroupPicker()
void LLFloaterGroupPicker::setPowersMask(U64 powers_mask)
{
mPowersMask = powers_mask;
postBuild();
init_group_list(getChild<LLScrollListCtrl>("group list"), gAgent.getGroupID(), mPowersMask);
}

View File

@ -277,13 +277,7 @@ void LLFloaterReporter::getObjectInfo(const LLUUID& object_id)
{
object_owner.append("Unknown");
}
childSetText("object_name", object_owner);
std::string owner_link =
LLSLURL("agent", mObjectID, "inspect").getSLURLString();
childSetText("owner_name", owner_link);
childSetText("abuser_name_edit", object_owner);
mAbuserID = object_id;
mOwnerName = object_owner;
setFromAvatar(object_id, object_owner);
}
else
{
@ -305,7 +299,6 @@ void LLFloaterReporter::getObjectInfo(const LLUUID& object_id)
}
}
void LLFloaterReporter::onClickSelectAbuser()
{
gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLFloaterReporter::callbackAvatarID, this, _1, _2), FALSE, TRUE ));
@ -323,6 +316,18 @@ void LLFloaterReporter::callbackAvatarID(const std::vector<std::string>& names,
}
void LLFloaterReporter::setFromAvatar(const LLUUID& avatar_id, const std::string& avatar_name)
{
mAbuserID = mObjectID = avatar_id;
mOwnerName = avatar_name;
std::string avatar_link =
LLSLURL("agent", mObjectID, "inspect").getSLURLString();
childSetText("owner_name", avatar_link);
childSetText("object_name", avatar_name);
childSetText("abuser_name_edit", avatar_name);
}
// static
void LLFloaterReporter::onClickSend(void *userdata)
{
@ -458,9 +463,8 @@ void LLFloaterReporter::showFromMenu(EReportType report_type)
}
}
// static
void LLFloaterReporter::showFromObject(const LLUUID& object_id)
void LLFloaterReporter::show(const LLUUID& object_id, const std::string& avatar_name)
{
LLFloaterReporter* f = LLFloaterReg::showTypedInstance<LLFloaterReporter>("reporter");
@ -469,8 +473,11 @@ void LLFloaterReporter::showFromObject(const LLUUID& object_id)
LLAgentUI::buildFullname(fullname);
f->childSetText("reporter_field", fullname);
// Request info for this object
f->getObjectInfo(object_id);
if (avatar_name.empty())
// Request info for this object
f->getObjectInfo(object_id);
else
f->setFromAvatar(object_id, avatar_name);
// Need to deselect on close
f->mDeselectOnClose = TRUE;
@ -479,6 +486,18 @@ void LLFloaterReporter::showFromObject(const LLUUID& object_id)
}
// static
void LLFloaterReporter::showFromObject(const LLUUID& object_id)
{
show(object_id);
}
// static
void LLFloaterReporter::showFromAvatar(const LLUUID& avatar_id, const std::string avatar_name)
{
show(avatar_id, avatar_name);
}
void LLFloaterReporter::setPickedObjectProperties(const std::string& object_name, const std::string& owner_name, const LLUUID owner_id)
{
childSetText("object_name", object_name);

View File

@ -93,6 +93,7 @@ public:
static void showFromMenu(EReportType report_type);
static void showFromObject(const LLUUID& object_id);
static void showFromAvatar(const LLUUID& avatar_id, const std::string avatar_name);
static void onClickSend (void *userdata);
static void onClickCancel (void *userdata);
@ -109,6 +110,8 @@ public:
void setPickedObjectProperties(const std::string& object_name, const std::string& owner_name, const LLUUID owner_id);
private:
static void show(const LLUUID& object_id, const std::string& avatar_name = LLStringUtil::null);
void takeScreenshot();
void sendReportViaCaps(std::string url);
void uploadImage();
@ -121,6 +124,7 @@ private:
void enableControls(BOOL own_avatar);
void getObjectInfo(const LLUUID& object_id);
void callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids);
void setFromAvatar(const LLUUID& avatar_id, const std::string& avatar_name = LLStringUtil::null);
private:
EReportType mReportType;

View File

@ -1391,6 +1391,7 @@ void LLFolderView::startRenamingSelectedItem( void )
// set focus will fail unless item is visible
mRenamer->setFocus( TRUE );
mRenamer->setTopLostCallback(boost::bind(onRenamerLost, _1));
mRenamer->setFocusLostCallback(boost::bind(onRenamerLost, _1));
gFocusMgr.setTopCtrl( mRenamer );
}
}

View File

@ -48,6 +48,7 @@
#include "lltextutil.h"
#include "llviewercontrol.h" // for gSavedSettings
#include "llviewermenu.h" // for gMenuHolder
#include "llvoiceclient.h"
static LLDefaultChildRegistry::Register<LLGroupList> r("group_list");
S32 LLGroupListItem::sIconWidth = 0;
@ -271,6 +272,9 @@ bool LLGroupList::onContextMenuItemEnable(const LLSD& userdata)
if (userdata.asString() == "activate")
return gAgent.getGroupID() != selected_group_id;
if (userdata.asString() == "call")
return LLVoiceClient::getInstance()->voiceEnabled()&&LLVoiceClient::getInstance()->isVoiceWorking();
return real_group_selected;
}

View File

@ -109,6 +109,8 @@ LLIMFloater::LLIMFloater(const LLUUID& session_id)
}
}
setOverlapsScreenChannel(true);
LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::IM, this);
}
void LLIMFloater::onFocusLost()
@ -227,6 +229,7 @@ void LLIMFloater::sendMsg()
LLIMFloater::~LLIMFloater()
{
LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::IM, this);
}
//virtual
@ -350,13 +353,15 @@ void* LLIMFloater::createPanelAdHocControl(void* userdata)
void LLIMFloater::onSlide()
{
LLPanel* im_control_panel = getChild<LLPanel>("panel_im_control_panel");
im_control_panel->setVisible(!im_control_panel->getVisible());
mControlPanel->setVisible(!mControlPanel->getVisible());
gSavedSettings.setBOOL("IMShowControlPanel", im_control_panel->getVisible());
gSavedSettings.setBOOL("IMShowControlPanel", mControlPanel->getVisible());
getChild<LLButton>("slide_left_btn")->setVisible(im_control_panel->getVisible());
getChild<LLButton>("slide_right_btn")->setVisible(!im_control_panel->getVisible());
getChild<LLButton>("slide_left_btn")->setVisible(mControlPanel->getVisible());
getChild<LLButton>("slide_right_btn")->setVisible(!mControlPanel->getVisible());
LLLayoutStack* stack = getChild<LLLayoutStack>("im_panels");
if (stack) stack->setAnimate(true);
}
//static
@ -510,14 +515,14 @@ bool LLIMFloater::toggle(const LLUUID& session_id)
if(!isChatMultiTab())
{
LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
if (floater && floater->getVisible())
if (floater && floater->getVisible() && floater->hasFocus())
{
// clicking on chiclet to close floater just hides it to maintain existing
// scroll/text entry state
floater->setVisible(false);
return false;
}
else if(floater && !floater->isDocked())
else if(floater && (!floater->isDocked() || floater->getVisible() && !floater->hasFocus()))
{
floater->setVisible(TRUE);
floater->setFocus(TRUE);

View File

@ -116,6 +116,8 @@ public:
static void onIMChicletCreated(const LLUUID& session_id);
virtual LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::IM; }
private:
// process focus events to set a currently active session
/* virtual */ void onFocusLost();

View File

@ -35,19 +35,22 @@
#include "llimfloatercontainer.h"
#include "llfloaterreg.h"
#include "llimview.h"
#include "llavatariconctrl.h"
#include "llagent.h"
//
// LLIMFloaterContainer
//
LLIMFloaterContainer::LLIMFloaterContainer(const LLSD& seed)
: LLMultiFloater(seed),
mActiveVoiceFloater(NULL)
: LLMultiFloater(seed)
{
mAutoResize = FALSE;
}
LLIMFloaterContainer::~LLIMFloaterContainer()
{
LLGroupMgr::getInstance()->removeObserver(this);
}
BOOL LLIMFloaterContainer::postBuild()
@ -87,11 +90,82 @@ void LLIMFloaterContainer::addFloater(LLFloater* floaterp,
LLMultiFloater::addFloater(floaterp, select_added_floater, insertion_point);
// make sure active voice icon shows up for new tab
if (floaterp == mActiveVoiceFloater)
LLUUID session_id = floaterp->getKey();
if(gAgent.isInGroup(session_id))
{
mTabContainer->setTabImage(floaterp, "active_voice_tab.tga");
mSessions[session_id] = floaterp;
mID = session_id;
mGroupID.push_back(session_id);
LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(session_id);
LLGroupMgr* gm = LLGroupMgr::getInstance();
gm->addObserver(this);
if (group_data && group_data->mInsigniaID.notNull())
{
mTabContainer->setTabImage(get_ptr_in_map(mSessions, session_id), group_data->mInsigniaID);
}
else
{
gm->sendGroupPropertiesRequest(session_id);
}
}
else
{
LLUUID avatar_id = LLIMModel::getInstance()->getOtherParticipantID(session_id);
LLAvatarPropertiesProcessor& app = LLAvatarPropertiesProcessor::instance();
app.addObserver(avatar_id, this);
floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, avatar_id));
mSessions[avatar_id] = floaterp;
LLUUID* icon_id_ptr = LLAvatarIconIDCache::getInstance()->get(avatar_id);
if(!icon_id_ptr)
{
app.sendAvatarPropertiesRequest(avatar_id);
}
else
{
mTabContainer->setTabImage(floaterp, *icon_id_ptr);
}
}
}
void LLIMFloaterContainer::processProperties(void* data, enum EAvatarProcessorType type)
{
if (APT_PROPERTIES == type)
{
LLAvatarData* avatar_data = static_cast<LLAvatarData*>(data);
if (avatar_data)
{
LLUUID avatar_id = avatar_data->avatar_id;
if(avatar_data->image_id != *LLAvatarIconIDCache::getInstance()->get(avatar_id))
{
LLAvatarIconIDCache::getInstance()->add(avatar_id,avatar_data->image_id);
}
mTabContainer->setTabImage(get_ptr_in_map(mSessions, avatar_id), avatar_data->image_id);
}
}
}
void LLIMFloaterContainer::changed(LLGroupChange gc)
{
if (GC_PROPERTIES == gc)
{
for(groupIDs_t::iterator it = mGroupID.begin(); it!=mGroupID.end(); it++)
{
LLUUID group_id = *it;
LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(group_id);
if (group_data && group_data->mInsigniaID.notNull())
{
mTabContainer->setTabImage(get_ptr_in_map(mSessions, group_id), group_data->mInsigniaID);
}
}
}
}
void LLIMFloaterContainer::onCloseFloater(LLUUID id)
{
LLAvatarPropertiesProcessor::instance().removeObserver(id, this);
}
LLIMFloaterContainer* LLIMFloaterContainer::findInstance()

View File

@ -33,12 +33,17 @@
#ifndef LL_LLIMFLOATERCONTAINER_H
#define LL_LLIMFLOATERCONTAINER_H
#include <map>
#include <vector>
#include "llfloater.h"
#include "llmultifloater.h"
#include "llavatarpropertiesprocessor.h"
#include "llgroupmgr.h"
class LLTabContainer;
class LLIMFloaterContainer : public LLMultiFloater
class LLIMFloaterContainer : public LLMultiFloater, public LLAvatarPropertiesObserver, public LLGroupMgrObserver
{
public:
LLIMFloaterContainer(const LLSD& seed);
@ -51,15 +56,23 @@ public:
BOOL select_added_floater,
LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END);
void processProperties(void* data, EAvatarProcessorType type);
void changed(LLGroupChange gc);
static LLFloater* getCurrentVoiceFloater();
static LLIMFloaterContainer* findInstance();
static LLIMFloaterContainer* getInstance();
protected:
LLFloater* mActiveVoiceFloater;
private:
typedef std::map<LLUUID,LLPanel*> avatarID_panel_map_t;
avatarID_panel_map_t mSessions;
typedef std::vector<LLUUID> groupIDs_t;
groupIDs_t mGroupID;
void onCloseFloater(LLUUID avatar_id);
};
#endif // LL_LLIMFLOATERCONTAINER_H

View File

@ -55,6 +55,7 @@
#include "llfloaterchatterbox.h"
#include "llimfloater.h"
#include "llgroupiconctrl.h"
#include "llmd5.h"
#include "llmutelist.h"
#include "llrecentpeople.h"
#include "llviewermessage.h"
@ -215,12 +216,14 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
mTextIMPossible = LLVoiceClient::getInstance()->isSessionTextIMPossible(mSessionID);
}
buildHistoryFileName();
if ( gSavedPerAccountSettings.getBOOL("LogShowHistory") )
{
std::list<LLSD> chat_history;
//involves parsing of a chat history
LLLogChat::loadAllHistory(mName, chat_history);
LLLogChat::loadAllHistory(mHistoryFileName, chat_history);
addMessagesFromHistory(chat_history);
}
}
@ -467,6 +470,44 @@ bool LLIMModel::LLIMSession::isOtherParticipantAvaline()
return !mOtherParticipantIsAvatar;
}
void LLIMModel::LLIMSession::buildHistoryFileName()
{
mHistoryFileName = mName;
//ad-hoc requires sophisticated chat history saving schemes
if (isAdHoc())
{
//in case of outgoing ad-hoc sessions
if (mInitialTargetIDs.size())
{
std::set<LLUUID> sorted_uuids(mInitialTargetIDs.begin(), mInitialTargetIDs.end());
mHistoryFileName = mName + " hash" + generateHash(sorted_uuids);
return;
}
//in case of incoming ad-hoc sessions
mHistoryFileName = mName + " " + LLLogChat::timestamp(true) + " " + mSessionID.asString().substr(0, 4);
}
}
//static
std::string LLIMModel::LLIMSession::generateHash(const std::set<LLUUID>& sorted_uuids)
{
LLMD5 md5_uuid;
std::set<LLUUID>::const_iterator it = sorted_uuids.begin();
while (it != sorted_uuids.end())
{
md5_uuid.update((unsigned char*)(*it).mData, 16);
it++;
}
md5_uuid.finalize();
LLUUID participants_md5_hash;
md5_uuid.raw_digest((unsigned char*) participants_md5_hash.mData);
return participants_md5_hash.asString();
}
void LLIMModel::processSessionInitializedReply(const LLUUID& old_session_id, const LLUUID& new_session_id)
{
@ -614,11 +655,11 @@ bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from,
return true;
}
bool LLIMModel::logToFile(const std::string& session_name, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
bool LLIMModel::logToFile(const std::string& file_name, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
{
if (gSavedPerAccountSettings.getBOOL("LogInstantMessages"))
{
LLLogChat::saveHistory(session_name, from, from_id, utf8_text);
LLLogChat::saveHistory(file_name, from, from_id, utf8_text);
return true;
}
else
@ -629,15 +670,7 @@ bool LLIMModel::logToFile(const std::string& session_name, const std::string& fr
bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
{
if (gSavedPerAccountSettings.getBOOL("LogInstantMessages"))
{
LLLogChat::saveHistory(LLIMModel::getInstance()->getName(session_id), from, from_id, utf8_text);
return true;
}
else
{
return false;
}
return logToFile(LLIMModel::getInstance()->getHistoryFileName(session_id), from, from_id, utf8_text);
}
bool LLIMModel::proccessOnlineOfflineNotification(
@ -782,6 +815,18 @@ LLIMSpeakerMgr* LLIMModel::getSpeakerManager( const LLUUID& session_id ) const
return session->mSpeakers;
}
const std::string& LLIMModel::getHistoryFileName(const LLUUID& session_id) const
{
LLIMSession* session = findIMSession(session_id);
if (!session)
{
llwarns << "session " << session_id << " does not exist " << llendl;
return LLStringUtil::null;
}
return session->mHistoryFileName;
}
// TODO get rid of other participant ID
void LLIMModel::sendTypingState(LLUUID session_id, LLUUID other_participant_id, BOOL typing)

View File

@ -69,6 +69,8 @@ public:
void addMessagesFromHistory(const std::list<LLSD>& history);
void addMessage(const std::string& from, const LLUUID& from_id, const std::string& utf8_text, const std::string& time);
void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction);
/** @deprecated */
static void chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata);
bool isAdHoc();
@ -80,12 +82,20 @@ public:
bool isGroupSessionType() const { return mSessionType == GROUP_SESSION;}
bool isAvalineSessionType() const { return mSessionType == AVALINE_SESSION;}
//*TODO make private
/** ad-hoc sessions involve sophisticated chat history file naming schemes */
void buildHistoryFileName();
//*TODO make private
static std::string generateHash(const std::set<LLUUID>& sorted_uuids);
LLUUID mSessionID;
std::string mName;
EInstantMessage mType;
SType mSessionType;
LLUUID mOtherParticipantID;
std::vector<LLUUID> mInitialTargetIDs;
std::string mHistoryFileName;
// connection to voice channel state change signal
boost::signals2::connection mVoiceChannelStateChangeConnection;
@ -231,6 +241,8 @@ public:
*/
LLIMSpeakerMgr* getSpeakerManager(const LLUUID& session_id) const;
const std::string& getHistoryFileName(const LLUUID& session_id) const;
static void sendLeaveSession(const LLUUID& session_id, const LLUUID& other_participant_id);
static bool sendStartSession(const LLUUID& temp_session_id, const LLUUID& other_participant_id,
const std::vector<LLUUID>& ids, EInstantMessage dialog);
@ -243,7 +255,7 @@ public:
/**
* Saves an IM message into a file
*/
bool logToFile(const std::string& session_name, const std::string& from, const LLUUID& from_id, const std::string& utf8_text);
bool logToFile(const std::string& file_name, const std::string& from, const LLUUID& from_id, const std::string& utf8_text);
private:

View File

@ -688,7 +688,7 @@ void LLInspectAvatar::onToggleMute()
void LLInspectAvatar::onClickReport()
{
LLFloaterReporter::showFromObject(mAvatarID);
LLFloaterReporter::showFromAvatar(mAvatarID, mAvatarName);
closeFloater();
}

View File

@ -3687,18 +3687,6 @@ BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop,
return rv;
}
BOOL LLCallingCardBridge::removeItem()
{
if (LLFriendCardsManager::instance().isItemInAnyFriendsList(getItem()))
{
LLAvatarActions::removeFriendDialog(getItem()->getCreatorUUID());
return FALSE;
}
else
{
return LLItemBridge::removeItem();
}
}
// +=================================================+
// | LLNotecardBridge |
// +=================================================+

View File

@ -448,7 +448,6 @@ public:
EDragAndDropType cargo_type,
void* cargo_data);
void refreshFolderViewItem();
BOOL removeItem();
protected:
LLCallingCardBridge( LLInventoryPanel* inventory, const LLUUID& uuid );

View File

@ -43,8 +43,11 @@
#include "lltrans.h"
#include "lluictrlfactory.h"
#include "lltooltip.h"
#include "llnotificationsutil.h"
#include "llregionflags.h"
// newview includes
#include "llagent.h"
#include "llinventoryobserver.h"
#include "lllandmarkactions.h"
#include "lllandmarklist.h"
@ -56,6 +59,7 @@
#include "lltrans.h"
#include "llviewerinventory.h"
#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
#include "llviewercontrol.h"
#include "llviewermenu.h"
#include "llurllineeditorctrl.h"
@ -256,36 +260,42 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
voice_icon.tool_tip = LLTrans::getString("LocationCtrlVoiceTooltip");
voice_icon.mouse_opaque = true;
mParcelIcon[VOICE_ICON] = LLUICtrlFactory::create<LLIconCtrl>(voice_icon);
mParcelIcon[VOICE_ICON]->setMouseDownCallback(boost::bind(&LLLocationInputCtrl::onParcelIconClick, this, VOICE_ICON));
addChild(mParcelIcon[VOICE_ICON]);
LLIconCtrl::Params fly_icon = p.fly_icon;
fly_icon.tool_tip = LLTrans::getString("LocationCtrlFlyTooltip");
fly_icon.mouse_opaque = true;
mParcelIcon[FLY_ICON] = LLUICtrlFactory::create<LLIconCtrl>(fly_icon);
mParcelIcon[FLY_ICON]->setMouseDownCallback(boost::bind(&LLLocationInputCtrl::onParcelIconClick, this, FLY_ICON));
addChild(mParcelIcon[FLY_ICON]);
LLIconCtrl::Params push_icon = p.push_icon;
push_icon.tool_tip = LLTrans::getString("LocationCtrlPushTooltip");
push_icon.mouse_opaque = true;
mParcelIcon[PUSH_ICON] = LLUICtrlFactory::create<LLIconCtrl>(push_icon);
mParcelIcon[PUSH_ICON]->setMouseDownCallback(boost::bind(&LLLocationInputCtrl::onParcelIconClick, this, PUSH_ICON));
addChild(mParcelIcon[PUSH_ICON]);
LLIconCtrl::Params build_icon = p.build_icon;
build_icon.tool_tip = LLTrans::getString("LocationCtrlBuildTooltip");
build_icon.mouse_opaque = true;
mParcelIcon[BUILD_ICON] = LLUICtrlFactory::create<LLIconCtrl>(build_icon);
mParcelIcon[BUILD_ICON]->setMouseDownCallback(boost::bind(&LLLocationInputCtrl::onParcelIconClick, this, BUILD_ICON));
addChild(mParcelIcon[BUILD_ICON]);
LLIconCtrl::Params scripts_icon = p.scripts_icon;
scripts_icon.tool_tip = LLTrans::getString("LocationCtrlScriptsTooltip");
scripts_icon.mouse_opaque = true;
mParcelIcon[SCRIPTS_ICON] = LLUICtrlFactory::create<LLIconCtrl>(scripts_icon);
mParcelIcon[SCRIPTS_ICON]->setMouseDownCallback(boost::bind(&LLLocationInputCtrl::onParcelIconClick, this, SCRIPTS_ICON));
addChild(mParcelIcon[SCRIPTS_ICON]);
LLIconCtrl::Params damage_icon = p.damage_icon;
damage_icon.tool_tip = LLTrans::getString("LocationCtrlDamageTooltip");
damage_icon.mouse_opaque = true;
mParcelIcon[DAMAGE_ICON] = LLUICtrlFactory::create<LLIconCtrl>(damage_icon);
mParcelIcon[DAMAGE_ICON]->setMouseDownCallback(boost::bind(&LLLocationInputCtrl::onParcelIconClick, this, DAMAGE_ICON));
addChild(mParcelIcon[DAMAGE_ICON]);
LLTextBox::Params damage_text = p.damage_text;
@ -917,3 +927,45 @@ bool LLLocationInputCtrl::onLocationContextMenuItemEnabled(const LLSD& userdata)
return false;
}
void LLLocationInputCtrl::onParcelIconClick(EParcelIcon icon)
{
switch (icon)
{
case VOICE_ICON:
LLNotificationsUtil::add("NoVoice");
break;
case FLY_ICON:
LLNotificationsUtil::add("NoFly");
break;
case PUSH_ICON:
LLNotificationsUtil::add("PushRestricted");
break;
case BUILD_ICON:
LLNotificationsUtil::add("NoBuild");
break;
case SCRIPTS_ICON:
{
LLViewerRegion* region = gAgent.getRegion();
if(region && region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS)
{
LLNotificationsUtil::add("ScriptsStopped");
}
else if(region && region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS)
{
LLNotificationsUtil::add("ScriptsNotRunning");
}
else
{
LLNotificationsUtil::add("NoOutsideScripts");
}
break;
}
case DAMAGE_ICON:
LLNotificationsUtil::add("NotSafe");
break;
case ICON_COUNT:
break;
// no default to get compiler warning when a new icon gets added
}
}

View File

@ -102,6 +102,18 @@ public:
void handleLoginComplete();
private:
enum EParcelIcon
{
VOICE_ICON = 0,
FLY_ICON,
PUSH_ICON,
BUILD_ICON,
SCRIPTS_ICON,
DAMAGE_ICON,
ICON_COUNT
};
friend class LLUICtrlFactory;
LLLocationInputCtrl(const Params&);
virtual ~LLLocationInputCtrl();
@ -138,6 +150,7 @@ private:
// callbacks
bool onLocationContextMenuItemEnabled(const LLSD& userdata);
void onLocationContextMenuItemClicked(const LLSD& userdata);
void onParcelIconClick(EParcelIcon icon);
LLMenuGL* mLocationContextMenu;
LLButton* mAddLandmarkBtn;
@ -146,16 +159,6 @@ private:
S32 mIconHPad; // pad between all icons
S32 mAddLandmarkHPad; // pad to left of landmark star
enum EParcelIcon
{
VOICE_ICON = 0,
FLY_ICON,
PUSH_ICON,
BUILD_ICON,
SCRIPTS_ICON,
DAMAGE_ICON,
ICON_COUNT
};
LLIconCtrl* mParcelIcon[ICON_COUNT];
LLTextBox* mDamageText;

View File

@ -237,15 +237,15 @@ void append_to_last_message(std::list<LLSD>& messages, const std::string& line)
messages.back()[IM_TEXT] = im_text;
}
void LLLogChat::loadAllHistory(const std::string& session_name, std::list<LLSD>& messages)
void LLLogChat::loadAllHistory(const std::string& file_name, std::list<LLSD>& messages)
{
if (session_name.empty())
if (file_name.empty())
{
llwarns << "Session name is Empty!" << llendl;
return ;
}
LLFILE* fptr = LLFile::fopen(makeLogFileName(session_name), "r"); /*Flawfinder: ignore*/
LLFILE* fptr = LLFile::fopen(makeLogFileName(file_name), "r"); /*Flawfinder: ignore*/
if (!fptr) return; //No previous conversation with this name.
char buffer[LOG_RECALL_SIZE]; /*Flawfinder: ignore*/

View File

@ -56,7 +56,7 @@ public:
void (*callback)(ELogLineType, const LLSD&, void*),
void* userdata);
static void loadAllHistory(const std::string& session_name, std::list<LLSD>& messages);
static void loadAllHistory(const std::string& file_name, std::list<LLSD>& messages);
private:
static std::string cleanFileName(std::string filename);
};

View File

@ -165,6 +165,8 @@ BOOL LLPanelAvatarNotes::postBuild()
resetControls();
resetData();
LLVoiceClient::getInstance()->addObserver((LLVoiceClientStatusObserver*)this);
return TRUE;
}
@ -337,6 +339,8 @@ LLPanelAvatarNotes::~LLPanelAvatarNotes()
if(getAvatarId().notNull())
{
LLAvatarTracker::instance().removeParticularFriendObserver(getAvatarId(), this);
if(LLVoiceClient::getInstance())
LLVoiceClient::getInstance()->removeObserver((LLVoiceClientStatusObserver*)this);
}
}
@ -346,6 +350,17 @@ void LLPanelAvatarNotes::changed(U32 mask)
childSetEnabled("teleport", LLAvatarTracker::instance().isBuddyOnline(getAvatarId()));
}
// virtual
void LLPanelAvatarNotes::onChange(EStatusType status, const std::string &channelURI, bool proximal)
{
if(status == STATUS_JOINING || status == STATUS_LEFT_CHANNEL)
{
return;
}
childSetEnabled("call", LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking());
}
void LLPanelAvatarNotes::setAvatarId(const LLUUID& id)
{
if(id.notNull())
@ -437,7 +452,6 @@ void LLPanelProfileTab::updateButtons()
bool enable_map_btn = is_avatar_online && gAgent.isGodlike() || is_agent_mappable(getAvatarId());
childSetEnabled("show_on_map_btn", enable_map_btn);
childSetEnabled("call", LLAvatarActions::canCall(getAvatarId()));
}
//////////////////////////////////////////////////////////////////////////
@ -485,6 +499,8 @@ BOOL LLPanelAvatarProfile::postBuild()
pic = getChild<LLTextureCtrl>("real_world_pic");
pic->setFallbackImageName("default_profile_picture.j2c");
LLVoiceClient::getInstance()->addObserver((LLVoiceClientStatusObserver*)this);
resetControls();
resetData();
@ -757,6 +773,8 @@ LLPanelAvatarProfile::~LLPanelAvatarProfile()
if(getAvatarId().notNull())
{
LLAvatarTracker::instance().removeParticularFriendObserver(getAvatarId(), this);
if(LLVoiceClient::getInstance())
LLVoiceClient::getInstance()->removeObserver((LLVoiceClientStatusObserver*)this);
}
}
@ -766,6 +784,17 @@ void LLPanelAvatarProfile::changed(U32 mask)
childSetEnabled("teleport", LLAvatarTracker::instance().isBuddyOnline(getAvatarId()));
}
// virtual
void LLPanelAvatarProfile::onChange(EStatusType status, const std::string &channelURI, bool proximal)
{
if(status == STATUS_JOINING || status == STATUS_LEFT_CHANNEL)
{
return;
}
childSetEnabled("call", LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking());
}
void LLPanelAvatarProfile::setAvatarId(const LLUUID& id)
{
if(id.notNull())

View File

@ -36,6 +36,7 @@
#include "llpanel.h"
#include "llavatarpropertiesprocessor.h"
#include "llcallingcard.h"
#include "llvoiceclient.h"
class LLComboBox;
class LLLineEditor;
@ -122,6 +123,7 @@ private:
class LLPanelAvatarProfile
: public LLPanelProfileTab
, public LLFriendObserver
, public LLVoiceClientStatusObserver
{
public:
LLPanelAvatarProfile();
@ -134,6 +136,10 @@ public:
*/
virtual void changed(U32 mask);
// Implements LLVoiceClientStatusObserver::onChange() to enable the call
// button when voice is available
/*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
/*virtual*/ void setAvatarId(const LLUUID& id);
/**
@ -257,6 +263,7 @@ private:
class LLPanelAvatarNotes
: public LLPanelProfileTab
, public LLFriendObserver
, public LLVoiceClientStatusObserver
{
public:
LLPanelAvatarNotes();
@ -269,6 +276,10 @@ public:
*/
virtual void changed(U32 mask);
// Implements LLVoiceClientStatusObserver::onChange() to enable the call
// button when voice is available
/*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
/*virtual*/ void onOpen(const LLSD& key);
/*virtual*/ BOOL postBuild();

View File

@ -1689,7 +1689,7 @@ void LLPanelClassifiedEdit::onSaveClick()
{
if(gStatusBar->getBalance() < getPriceForListing())
{
LLNotificationsUtil::add("ClassifiedInsuffisientFunds");
LLNotificationsUtil::add("ClassifiedInsufficientFunds");
return;
}
}

View File

@ -65,6 +65,7 @@
#include "llvovolume.h"
#include "lluictrlfactory.h"
#include "llpluginclassmedia.h"
#include "llviewertexturelist.h"
//
// Methods
@ -406,14 +407,40 @@ void LLPanelFace::getState()
LLUUID id;
struct f1 : public LLSelectedTEGetFunctor<LLUUID>
{
LLUUID get(LLViewerObject* object, S32 te)
LLUUID get(LLViewerObject* object, S32 te_index)
{
LLViewerTexture* image = object->getTEImage(te);
return image ? image->getID() : LLUUID::null;
LLUUID id;
LLViewerTexture* image = object->getTEImage(te_index);
if (image) id = image->getID();
if (!id.isNull() && LLViewerMedia::textureHasMedia(id))
{
LLTextureEntry *te = object->getTE(te_index);
if (te)
{
LLViewerTexture* tex = te->getID().notNull() ? gTextureList.findImage(te->getID()) : NULL ;
if(!tex)
{
tex = LLViewerFetchedTexture::sDefaultImagep;
}
if (tex)
{
id = tex->getID();
}
}
}
return id;
}
} func;
identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, id );
if(LLViewerMedia::textureHasMedia(id))
{
childSetEnabled("textbox autofix",editable);
childSetEnabled("button align",editable);
}
if (identical)
{
// All selected have the same texture
@ -444,13 +471,6 @@ void LLPanelFace::getState()
}
}
}
if(LLViewerMedia::textureHasMedia(id))
{
childSetEnabled("textbox autofix",editable);
childSetEnabled("button align",editable);
}
}

View File

@ -101,6 +101,8 @@ LLPanelGroup::LLPanelGroup()
LLPanelGroup::~LLPanelGroup()
{
LLGroupMgr::getInstance()->removeObserver(this);
if(LLVoiceClient::getInstance())
LLVoiceClient::getInstance()->removeObserver(this);
}
void LLPanelGroup::onOpen(const LLSD& key)
@ -188,6 +190,8 @@ BOOL LLPanelGroup::postBuild()
if(panel_general)
panel_general->setupCtrls(this);
LLVoiceClient::getInstance()->addObserver(this);
return TRUE;
}
@ -300,6 +304,17 @@ void LLPanelGroup::changed(LLGroupChange gc)
update(gc);
}
// virtual
void LLPanelGroup::onChange(EStatusType status, const std::string &channelURI, bool proximal)
{
if(status == STATUS_JOINING || status == STATUS_LEFT_CHANNEL)
{
return;
}
childSetEnabled("btn_call", LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking());
}
void LLPanelGroup::notifyObservers()
{
changed(GC_ALL);
@ -425,6 +440,11 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
getChild<LLUICtrl>("group_name")->setVisible(false);
getChild<LLUICtrl>("group_name_editor")->setVisible(true);
if(button_call)
button_call->setVisible(false);
if(button_chat)
button_chat->setVisible(false);
}
else
{
@ -452,6 +472,10 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
if(button_apply)
button_apply->setVisible(is_member);
if(button_call)
button_call->setVisible(is_member);
if(button_chat)
button_chat->setVisible(is_member);
}
reposButtons();

View File

@ -35,6 +35,7 @@
#include "llgroupmgr.h"
#include "llpanel.h"
#include "lltimer.h"
#include "llvoiceclient.h"
struct LLOfferInfo;
@ -47,7 +48,8 @@ class LLAgent;
class LLPanelGroup : public LLPanel,
public LLGroupMgrObserver
public LLGroupMgrObserver,
public LLVoiceClientStatusObserver
{
public:
LLPanelGroup();
@ -64,6 +66,10 @@ public:
// Group manager observer trigger.
virtual void changed(LLGroupChange gc);
// Implements LLVoiceClientStatusObserver::onChange() to enable the call
// button when voice is available
/*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
void showNotice(const std::string& subject,
const std::string& message,
const bool& has_inventory,

View File

@ -452,6 +452,7 @@ LLPanelGroupSubTab::LLPanelGroupSubTab()
: LLPanelGroupTab(),
mHeader(NULL),
mFooter(NULL),
mActivated(false),
mSearchEditor(NULL)
{
}
@ -504,13 +505,14 @@ void LLPanelGroupSubTab::setGroupID(const LLUUID& id)
mSearchEditor->clear();
setSearchFilter("");
}
mActivated = false;
}
void LLPanelGroupSubTab::setSearchFilter(const std::string& filter)
{
if(mSearchFilter == filter)
return;
lldebugs << "LLPanelGroupSubTab::setSearchFilter() ==> '" << filter << "'" << llendl;
mSearchFilter = filter;
LLStringUtil::toLower(mSearchFilter);
update(GC_ALL);
@ -518,13 +520,11 @@ void LLPanelGroupSubTab::setSearchFilter(const std::string& filter)
void LLPanelGroupSubTab::activate()
{
lldebugs << "LLPanelGroupSubTab::activate()" << llendl;
setOthersVisible(TRUE);
}
void LLPanelGroupSubTab::deactivate()
{
lldebugs << "LLPanelGroupSubTab::deactivate()" << llendl;
setOthersVisible(FALSE);
}
@ -534,19 +534,11 @@ void LLPanelGroupSubTab::setOthersVisible(BOOL b)
{
mHeader->setVisible( b );
}
else
{
llwarns << "LLPanelGroupSubTab missing header!" << llendl;
}
if (mFooter)
{
mFooter->setVisible( b );
}
else
{
llwarns << "LLPanelGroupSubTab missing footer!" << llendl;
}
}
bool LLPanelGroupSubTab::matchesActionSearchFilter(std::string action)
@ -875,10 +867,12 @@ void LLPanelGroupMembersSubTab::handleMemberSelect()
for (itor = selection.begin();
itor != selection.end(); ++itor)
{
selected_members.push_back( (*itor)->getUUID() );
LLUUID member_id = (*itor)->getValue()["uuid"];
selected_members.push_back( member_id );
// Get this member's power mask including any unsaved changes
U64 powers = getAgentPowersBasedOnRoleChanges((*itor)->getUUID());
U64 powers = getAgentPowersBasedOnRoleChanges( member_id );
allowed_by_all &= powers;
allowed_by_some |= powers;
@ -1022,6 +1016,7 @@ void LLPanelGroupMembersSubTab::handleMemberSelect()
//last owner. We should check for this special case
// -jwolk
check->setEnabled(cb_enable);
item->setEnabled(cb_enable);
}
}
else
@ -1098,7 +1093,8 @@ void LLPanelGroupMembersSubTab::handleEjectMembers()
for (itor = selection.begin() ;
itor != selection.end(); ++itor)
{
selected_members.push_back((*itor)->getUUID());
LLUUID member_id = (*itor)->getValue()["uuid"];
selected_members.push_back( member_id );
}
mMembersList->deleteSelectedItems();
@ -1154,7 +1150,8 @@ void LLPanelGroupMembersSubTab::handleRoleCheck(const LLUUID& role_id,
for (std::vector<LLScrollListItem*>::iterator itor = selection.begin() ;
itor != selection.end(); ++itor)
{
member_id = (*itor)->getUUID();
member_id = (*itor)->getValue()["uuid"];
//see if we requested a change for this member before
if ( mMemberRoleChangeData.find(member_id) == mMemberRoleChangeData.end() )
@ -1245,15 +1242,19 @@ void LLPanelGroupMembersSubTab::handleMemberDoubleClick()
LLScrollListItem* selected = mMembersList->getFirstSelected();
if (selected)
{
LLAvatarActions::showProfile(selected->getUUID());
LLUUID member_id = selected->getValue()["uuid"];
LLAvatarActions::showProfile( member_id );
}
}
void LLPanelGroupMembersSubTab::activate()
{
LLPanelGroupSubTab::activate();
update(GC_ALL);
if(!mActivated)
{
update(GC_ALL);
mActivated = true;
}
}
void LLPanelGroupMembersSubTab::deactivate()
@ -1629,7 +1630,9 @@ void LLPanelGroupMembersSubTab::updateMembers()
row["columns"][2]["value"] = mMemberProgress->second->getOnlineStatus();
row["columns"][2]["font"] = "SANSSERIF_SMALL";
mMembersList->addElement(row);//, ADD_SORTED);
LLScrollListItem* member = mMembersList->addElement(row);//, ADD_SORTED);
LLUUID id = member->getValue()["uuid"];
mHasMatch = TRUE;
}
}

View File

@ -149,6 +149,8 @@ protected:
icon_map_t mActionIcons;
bool mActivated;
void setOthersVisible(BOOL b);
};

View File

@ -64,36 +64,25 @@ void LLPanelChatControlPanel::onOpenVoiceControlsClicked()
LLFloaterReg::showInstance("voice_controls");
}
void LLPanelChatControlPanel::onChange(EStatusType status, const std::string &channelURI, bool proximal)
{
if(status == STATUS_JOINING || status == STATUS_LEFT_CHANNEL)
{
return;
}
updateCallButton();
}
void LLPanelChatControlPanel::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state)
{
updateButtons(new_state >= LLVoiceChannel::STATE_CALL_STARTED);
}
void LLPanelChatControlPanel::updateButtons(bool is_call_started)
void LLPanelChatControlPanel::updateCallButton()
{
childSetVisible("end_call_btn_panel", is_call_started);
childSetVisible("voice_ctrls_btn_panel", is_call_started);
childSetVisible("call_btn_panel", ! is_call_started);
}
LLPanelChatControlPanel::~LLPanelChatControlPanel()
{
mVoiceChannelStateChangeConnection.disconnect();
}
BOOL LLPanelChatControlPanel::postBuild()
{
childSetAction("call_btn", boost::bind(&LLPanelChatControlPanel::onCallButtonClicked, this));
childSetAction("end_call_btn", boost::bind(&LLPanelChatControlPanel::onEndCallButtonClicked, this));
childSetAction("voice_ctrls_btn", boost::bind(&LLPanelChatControlPanel::onOpenVoiceControlsClicked, this));
return TRUE;
}
void LLPanelChatControlPanel::draw()
{
// hide/show start call and end call buttons
bool voice_enabled = LLVoiceClient::getInstance()->voiceEnabled();
// hide/show call button
bool voice_enabled = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(mSessionId);
if (!session) return;
@ -105,8 +94,33 @@ void LLPanelChatControlPanel::draw()
&& voice_enabled
&& callback_enabled;
childSetEnabled("call_btn", enable_connect);
}
LLPanel::draw();
void LLPanelChatControlPanel::updateButtons(bool is_call_started)
{
childSetVisible("end_call_btn_panel", is_call_started);
childSetVisible("voice_ctrls_btn_panel", is_call_started);
childSetVisible("call_btn_panel", ! is_call_started);
updateCallButton();
}
LLPanelChatControlPanel::~LLPanelChatControlPanel()
{
mVoiceChannelStateChangeConnection.disconnect();
if(LLVoiceClient::getInstance())
LLVoiceClient::getInstance()->removeObserver(this);
}
BOOL LLPanelChatControlPanel::postBuild()
{
childSetAction("call_btn", boost::bind(&LLPanelChatControlPanel::onCallButtonClicked, this));
childSetAction("end_call_btn", boost::bind(&LLPanelChatControlPanel::onEndCallButtonClicked, this));
childSetAction("voice_ctrls_btn", boost::bind(&LLPanelChatControlPanel::onOpenVoiceControlsClicked, this));
LLVoiceClient::getInstance()->addObserver(this);
return TRUE;
}
void LLPanelChatControlPanel::setSessionId(const LLUUID& session_id)
@ -245,7 +259,6 @@ void LLPanelIMControlPanel::nameUpdatedCallback(const LLUUID& id, const std::str
LLPanelGroupControlPanel::LLPanelGroupControlPanel(const LLUUID& session_id):
mParticipantList(NULL)
{
mSpeakerManager = LLIMModel::getInstance()->getSpeakerManager(session_id);
}
BOOL LLPanelGroupControlPanel::postBuild()
@ -264,12 +277,11 @@ LLPanelGroupControlPanel::~LLPanelGroupControlPanel()
// virtual
void LLPanelGroupControlPanel::draw()
{
//Remove event does not raised until speakerp->mActivityTimer.hasExpired() is false, see LLSpeakerManager::update()
//so we need update it to raise needed event
mSpeakerManager->update(true);
// Need to resort the participant list if it's in sort by recent speaker order.
if (mParticipantList)
mParticipantList->updateRecentSpeakersOrder();
//* TODO: find better way to properly enable call button for group and remove this call from draw()
updateCallButton();
LLPanelChatControlPanel::draw();
}
@ -307,7 +319,10 @@ void LLPanelGroupControlPanel::setSessionId(const LLUUID& session_id)
// for group and Ad-hoc chat we need to include agent into list
if(!mParticipantList)
mParticipantList = new LLParticipantList(mSpeakerManager, getChild<LLAvatarList>("speakers_list"), true,false);
{
LLSpeakerMgr* speaker_manager = LLIMModel::getInstance()->getSpeakerManager(session_id);
mParticipantList = new LLParticipantList(speaker_manager, getChild<LLAvatarList>("speakers_list"), true,false);
}
}

View File

@ -37,11 +37,11 @@
#include "llvoicechannel.h"
#include "llcallingcard.h"
class LLSpeakerMgr;
class LLAvatarList;
class LLParticipantList;
class LLPanelChatControlPanel : public LLPanel
class LLPanelChatControlPanel
: public LLPanel
, public LLVoiceClientStatusObserver
{
public:
LLPanelChatControlPanel() :
@ -49,15 +49,21 @@ public:
~LLPanelChatControlPanel();
virtual BOOL postBuild();
virtual void draw();
void onCallButtonClicked();
void onEndCallButtonClicked();
void onOpenVoiceControlsClicked();
// Implements LLVoiceClientStatusObserver::onChange() to enable the call
// button when voice is available
/*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
virtual void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state);
void updateButtons(bool is_call_started);
// Enables/disables call button depending on voice availability
void updateCallButton();
virtual void setSessionId(const LLUUID& session_id);
const LLUUID& getSessionId() { return mSessionId; }
@ -110,7 +116,6 @@ public:
protected:
LLUUID mGroupID;
LLSpeakerMgr* mSpeakerManager;
LLParticipantList* mParticipantList;

View File

@ -37,6 +37,7 @@
// viewer includes
#include "llmimetypes.h"
#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
#include "lluictrlfactory.h"
// library includes
@ -83,8 +84,14 @@ BOOL LLPanelLandAudio::postBuild()
mCheckSoundLocal = getChild<LLCheckBoxCtrl>("check sound local");
childSetCommitCallback("check sound local", onCommitAny, this);
mRadioVoiceChat = getChild<LLRadioGroup>("parcel_voice_channel");
childSetCommitCallback("parcel_voice_channel", onCommitAny, this);
mCheckParcelEnableVoice = getChild<LLCheckBoxCtrl>("parcel_enable_voice_channel");
childSetCommitCallback("parcel_enable_voice_channel", onCommitAny, this);
// This one is always disabled so no need for a commit callback
mCheckEstateDisabledVoice = getChild<LLCheckBoxCtrl>("parcel_enable_voice_channel_is_estate_disabled");
mCheckParcelVoiceLocal = getChild<LLCheckBoxCtrl>("parcel_enable_voice_channel_local");
childSetCommitCallback("parcel_enable_voice_channel_local", onCommitAny, this);
mMusicURLEdit = getChild<LLLineEditor>("music_url");
childSetCommitCallback("music_url", onCommitAny, this);
@ -118,19 +125,33 @@ void LLPanelLandAudio::refresh()
mMusicUrlCheck->set( parcel->getObscureMusic() );
mMusicUrlCheck->setEnabled( can_change_media );
if(parcel->getParcelFlagAllowVoice())
bool allow_voice = parcel->getParcelFlagAllowVoice();
LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
if (region && region->isVoiceEnabled())
{
if(parcel->getParcelFlagUseEstateVoiceChannel())
mRadioVoiceChat->setSelectedIndex(kRadioVoiceChatEstate);
else
mRadioVoiceChat->setSelectedIndex(kRadioVoiceChatPrivate);
mCheckEstateDisabledVoice->setVisible(false);
mCheckParcelEnableVoice->setVisible(true);
mCheckParcelEnableVoice->setEnabled( can_change_media );
mCheckParcelEnableVoice->set(allow_voice);
mCheckParcelVoiceLocal->setEnabled( can_change_media && allow_voice );
}
else
{
mRadioVoiceChat->setSelectedIndex(kRadioVoiceChatDisable);
// Voice disabled at estate level, overrides parcel settings
// Replace the parcel voice checkbox with a disabled one
// labelled with an explanatory message
mCheckEstateDisabledVoice->setVisible(true);
mCheckParcelEnableVoice->setVisible(false);
mCheckParcelEnableVoice->setEnabled(false);
mCheckParcelVoiceLocal->setEnabled(false);
}
mRadioVoiceChat->setEnabled( can_change_media );
mCheckParcelEnableVoice->set(allow_voice);
mCheckParcelVoiceLocal->set(!parcel->getParcelFlagUseEstateVoiceChannel());
mMusicURLEdit->setText(parcel->getMusicURL());
mMusicURLEdit->setEnabled( can_change_media );
@ -149,30 +170,11 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)
// Extract data from UI
BOOL sound_local = self->mCheckSoundLocal->get();
int voice_setting = self->mRadioVoiceChat->getSelectedIndex();
std::string music_url = self->mMusicURLEdit->getText();
U8 obscure_music = self->mMusicUrlCheck->get();
BOOL voice_enabled;
BOOL voice_estate_chan;
switch(voice_setting)
{
default:
case kRadioVoiceChatEstate:
voice_enabled = TRUE;
voice_estate_chan = TRUE;
break;
case kRadioVoiceChatPrivate:
voice_enabled = TRUE;
voice_estate_chan = FALSE;
break;
case kRadioVoiceChatDisable:
voice_enabled = FALSE;
voice_estate_chan = FALSE;
break;
}
BOOL voice_enabled = self->mCheckParcelEnableVoice->get();
BOOL voice_estate_chan = !self->mCheckParcelVoiceLocal->get();
// Remove leading/trailing whitespace (common when copying/pasting)
LLStringUtil::trim(music_url);

View File

@ -52,7 +52,9 @@ private:
private:
LLCheckBoxCtrl* mCheckSoundLocal;
LLRadioGroup* mRadioVoiceChat;
LLCheckBoxCtrl* mCheckParcelEnableVoice;
LLCheckBoxCtrl* mCheckEstateDisabledVoice;
LLCheckBoxCtrl* mCheckParcelVoiceLocal;
LLLineEditor* mMusicURLEdit;
LLCheckBoxCtrl* mMusicUrlCheck;

View File

@ -305,6 +305,29 @@ void LLLandmarksPanel::updateShowFolderState()
);
}
void LLLandmarksPanel::setItemSelected(const LLUUID& obj_id, BOOL take_keyboard_focus)
{
if (selectItemInAccordionTab(mFavoritesInventoryPanel, "tab_favorites", obj_id, take_keyboard_focus))
{
return;
}
if (selectItemInAccordionTab(mLandmarksInventoryPanel, "tab_landmarks", obj_id, take_keyboard_focus))
{
return;
}
if (selectItemInAccordionTab(mMyInventoryPanel, "tab_inventory", obj_id, take_keyboard_focus))
{
return;
}
if (selectItemInAccordionTab(mLibraryInventoryPanel, "tab_library", obj_id, take_keyboard_focus))
{
return;
}
}
//////////////////////////////////////////////////////////////////////////
// PROTECTED METHODS
//////////////////////////////////////////////////////////////////////////
@ -350,6 +373,36 @@ LLFolderViewItem* LLLandmarksPanel::getCurSelectedItem() const
return mCurrentSelectedList ? mCurrentSelectedList->getRootFolder()->getCurSelectedItem() : NULL;
}
LLFolderViewItem* LLLandmarksPanel::selectItemInAccordionTab(LLPlacesInventoryPanel* inventory_list,
const std::string& tab_name,
const LLUUID& obj_id,
BOOL take_keyboard_focus) const
{
if (!inventory_list)
return NULL;
LLFolderView* folder_view = inventory_list->getRootFolder();
LLFolderViewItem* item = folder_view->getItemByID(obj_id);
if (!item)
return NULL;
LLAccordionCtrlTab* tab = getChild<LLAccordionCtrlTab>(tab_name);
if (!tab->isExpanded())
{
tab->changeOpenClose(false);
}
folder_view->setSelection(item, FALSE, take_keyboard_focus);
LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("landmarks_accordion");
LLRect screen_rc;
localRectToScreen(item->getRect(), &screen_rc);
accordion->notifyParent(LLSD().with("scrollToShowRect", screen_rc.getValue()));
return item;
}
void LLLandmarksPanel::updateSortOrder(LLInventoryPanel* panel, bool byDate)
{
if(!panel) return;

View File

@ -73,6 +73,11 @@ public:
*/
void updateShowFolderState();
/**
* Selects item with "obj_id" in one of accordion tabs.
*/
void setItemSelected(const LLUUID& obj_id, BOOL take_keyboard_focus);
protected:
/**
* @return true - if current selected panel is not null and selected item is a landmark
@ -81,6 +86,17 @@ protected:
bool isReceivedFolderSelected() const;
void doActionOnCurSelectedLandmark(LLLandmarkList::loaded_callback_t cb);
LLFolderViewItem* getCurSelectedItem() const;
/**
* Selects item with "obj_id" in "inventory_list" and scrolls accordion
* scrollbar to show the item.
* Returns pointer to the item if it is found in "inventory_list", otherwise NULL.
*/
LLFolderViewItem* selectItemInAccordionTab(LLPlacesInventoryPanel* inventory_list,
const std::string& tab_name,
const LLUUID& obj_id,
BOOL take_keyboard_focus) const;
void updateSortOrder(LLInventoryPanel* panel, bool byDate);
//LLRemoteParcelInfoObserver interface

View File

@ -462,6 +462,9 @@ LLPanelPeople::~LLPanelPeople()
delete mFriendListUpdater;
delete mRecentListUpdater;
if(LLVoiceClient::getInstance())
LLVoiceClient::getInstance()->removeObserver(this);
LLView::deleteViewByHandle(mGroupPlusMenuHandle);
LLView::deleteViewByHandle(mNearbyViewSortMenuHandle);
LLView::deleteViewByHandle(mFriendsViewSortMenuHandle);
@ -612,6 +615,8 @@ BOOL LLPanelPeople::postBuild()
if(recent_view_sort)
mRecentViewSortMenuHandle = recent_view_sort->getHandle();
LLVoiceClient::getInstance()->addObserver(this);
// call this method in case some list is empty and buttons can be in inconsistent state
updateButtons();
@ -621,6 +626,17 @@ BOOL LLPanelPeople::postBuild()
return TRUE;
}
// virtual
void LLPanelPeople::onChange(EStatusType status, const std::string &channelURI, bool proximal)
{
if(status == STATUS_JOINING || status == STATUS_LEFT_CHANNEL)
{
return;
}
updateButtons();
}
void LLPanelPeople::updateFriendList()
{
if (!mOnlineFriendList || !mAllFriendList)
@ -775,41 +791,20 @@ void LLPanelPeople::updateButtons()
}
}
bool enable_calls = LLVoiceClient::getInstance()->isVoiceWorking() && LLVoiceClient::getInstance()->voiceEnabled();
buttonSetEnabled("teleport_btn", friends_tab_active && item_selected && isFriendOnline(selected_uuids.front()));
buttonSetEnabled("view_profile_btn", item_selected);
buttonSetEnabled("im_btn", multiple_selected); // allow starting the friends conference for multiple selection
buttonSetEnabled("call_btn", multiple_selected && canCall());
buttonSetEnabled("call_btn", multiple_selected && enable_calls);
buttonSetEnabled("share_btn", item_selected); // not implemented yet
bool none_group_selected = item_selected && selected_id.isNull();
buttonSetEnabled("group_info_btn", !none_group_selected);
buttonSetEnabled("group_call_btn", !none_group_selected);
buttonSetEnabled("group_call_btn", !none_group_selected && enable_calls);
buttonSetEnabled("chat_btn", !none_group_selected);
}
bool LLPanelPeople::canCall()
{
std::vector<LLUUID> selected_uuids;
getCurrentItemIDs(selected_uuids);
bool result = false;
std::vector<LLUUID>::const_iterator
id = selected_uuids.begin(),
uuids_end = selected_uuids.end();
for (;id != uuids_end; ++id)
{
if (LLAvatarActions::canCall(*id))
{
result = true;
break;
}
}
return result;
}
std::string LLPanelPeople::getActiveTabName() const
{
return mTabContainer->getCurrentPanel()->getName();

View File

@ -36,13 +36,16 @@
#include <llpanel.h>
#include "llcallingcard.h" // for avatar tracker
#include "llvoiceclient.h"
class LLFilterEditor;
class LLTabContainer;
class LLAvatarList;
class LLGroupList;
class LLPanelPeople : public LLPanel
class LLPanelPeople
: public LLPanel
, public LLVoiceClientStatusObserver
{
LOG_CLASS(LLPanelPeople);
public:
@ -52,6 +55,9 @@ public:
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
/*virtual*/ bool notifyChildren(const LLSD& info);
// Implements LLVoiceClientStatusObserver::onChange() to enable call buttons
// when voice is available
/*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
// internals
class Updater;
@ -73,7 +79,6 @@ private:
bool isFriendOnline(const LLUUID& id);
bool isItemsFreeOfFriends(const std::vector<LLUUID>& uuids);
bool canCall();
void updateButtons();
std::string getActiveTabName() const;

View File

@ -183,20 +183,7 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
}
else if (item == std::string("can_call"))
{
bool result = false;
std::vector<LLUUID>::const_iterator
id = mUUIDs.begin(),
uuids_end = mUUIDs.end();
for (;id != uuids_end; ++id)
{
if (LLAvatarActions::canCall(*id))
{
result = true;
break;
}
}
return result;
return LLAvatarActions::canCall();
}
return false;
}

View File

@ -34,26 +34,20 @@
#include "llpanelplaceinfo.h"
#include "roles_constants.h"
#include "llsdutil.h"
#include "llsecondlifeurls.h"
#include "llsdutil_math.h"
#include "llregionhandle.h"
#include "message.h"
#include "lliconctrl.h"
#include "lltextbox.h"
#include "llagent.h"
#include "llavatarpropertiesprocessor.h"
#include "llexpandabletextbox.h"
#include "llpanelpick.h"
#include "lltexturectrl.h"
#include "llviewerinventory.h"
#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
#include "llviewertexteditor.h"
LLPanelPlaceInfo::LLPanelPlaceInfo()
: LLPanel(),
@ -265,25 +259,6 @@ void LLPanelPlaceInfo::reshape(S32 width, S32 height, BOOL called_from_parent)
}
}
// virtual
void LLPanelPlaceInfo::handleVisibilityChange(BOOL new_visibility)
{
LLPanel::handleVisibilityChange(new_visibility);
LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance();
if (!parcel_mgr)
return;
// Remove land selection when panel hides.
if (!new_visibility)
{
if (!parcel_mgr->selectionEmpty())
{
parcel_mgr->deselectLand();
}
}
}
void LLPanelPlaceInfo::createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel)
{
std::string region_name = mRegionName->getText();

View File

@ -94,7 +94,6 @@ public:
/*virtual*/ void processParcelInfo(const LLParcelData& parcel_data);
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
/*virtual*/ void handleVisibilityChange (BOOL new_visibility);
// Create a pick for the location specified
// by global_pos.

View File

@ -257,6 +257,25 @@ void LLPanelPlaceProfile::processParcelInfo(const LLParcelData& parcel_data)
}
}
// virtual
void LLPanelPlaceProfile::handleVisibilityChange(BOOL new_visibility)
{
LLPanel::handleVisibilityChange(new_visibility);
LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance();
if (!parcel_mgr)
return;
// Remove land selection when panel hides.
if (!new_visibility)
{
if (!parcel_mgr->selectionEmpty())
{
parcel_mgr->deselectUnused();
}
}
}
void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
LLViewerRegion* region,
const LLVector3d& pos_global,

View File

@ -52,6 +52,8 @@ public:
/*virtual*/ void processParcelInfo(const LLParcelData& parcel_data);
/*virtual*/ void handleVisibilityChange(BOOL new_visibility);
// Displays information about the currently selected parcel
// without sending a request to the server.
// If is_current_parcel true shows "You Are Here" banner.

View File

@ -289,88 +289,91 @@ BOOL LLPanelPlaces::postBuild()
void LLPanelPlaces::onOpen(const LLSD& key)
{
if(!mPlaceProfile || !mLandmarkInfo || key.size() == 0)
if (!mPlaceProfile || !mLandmarkInfo)
return;
mFilterEditor->clear();
onFilterEdit("", false);
mPlaceInfoType = key["type"].asString();
mPosGlobal.setZero();
mItem = NULL;
isLandmarkEditModeOn = false;
togglePlaceInfoPanel(TRUE);
if (mPlaceInfoType == AGENT_INFO_TYPE)
if (key.size() != 0)
{
mPlaceProfile->setInfoType(LLPanelPlaceInfo::AGENT);
}
else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE)
{
mLandmarkInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK);
mFilterEditor->clear();
onFilterEdit("", false);
if (key.has("x") && key.has("y") && key.has("z"))
mPlaceInfoType = key["type"].asString();
mPosGlobal.setZero();
mItem = NULL;
isLandmarkEditModeOn = false;
togglePlaceInfoPanel(TRUE);
if (mPlaceInfoType == AGENT_INFO_TYPE)
{
mPosGlobal = LLVector3d(key["x"].asReal(),
key["y"].asReal(),
key["z"].asReal());
mPlaceProfile->setInfoType(LLPanelPlaceInfo::AGENT);
}
else
else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE)
{
mPosGlobal = gAgent.getPositionGlobal();
mLandmarkInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK);
if (key.has("x") && key.has("y") && key.has("z"))
{
mPosGlobal = LLVector3d(key["x"].asReal(),
key["y"].asReal(),
key["z"].asReal());
}
else
{
mPosGlobal = gAgent.getPositionGlobal();
}
mLandmarkInfo->displayParcelInfo(LLUUID(), mPosGlobal);
// Disable Save button because there is no item to save yet.
// The button will be enabled in onLandmarkLoaded callback.
mSaveBtn->setEnabled(FALSE);
}
mLandmarkInfo->displayParcelInfo(LLUUID(), mPosGlobal);
// Disable Save button because there is no item to save yet.
// The button will be enabled in onLandmarkLoaded callback.
mSaveBtn->setEnabled(FALSE);
}
else if (mPlaceInfoType == LANDMARK_INFO_TYPE)
{
mLandmarkInfo->setInfoType(LLPanelPlaceInfo::LANDMARK);
LLInventoryItem* item = gInventory.getItem(key["id"].asUUID());
if (!item)
return;
setItem(item);
}
else if (mPlaceInfoType == REMOTE_PLACE_INFO_TYPE)
{
if (key.has("id"))
else if (mPlaceInfoType == LANDMARK_INFO_TYPE)
{
LLUUID parcel_id = key["id"].asUUID();
mPlaceProfile->setParcelID(parcel_id);
mLandmarkInfo->setInfoType(LLPanelPlaceInfo::LANDMARK);
// query the server to get the global 3D position of this
// parcel - we need this for teleport/mapping functions.
mRemoteParcelObserver->setParcelID(parcel_id);
LLInventoryItem* item = gInventory.getItem(key["id"].asUUID());
if (!item)
return;
setItem(item);
}
else
else if (mPlaceInfoType == REMOTE_PLACE_INFO_TYPE)
{
mPosGlobal = LLVector3d(key["x"].asReal(),
key["y"].asReal(),
key["z"].asReal());
if (key.has("id"))
{
LLUUID parcel_id = key["id"].asUUID();
mPlaceProfile->setParcelID(parcel_id);
// query the server to get the global 3D position of this
// parcel - we need this for teleport/mapping functions.
mRemoteParcelObserver->setParcelID(parcel_id);
}
else
{
mPosGlobal = LLVector3d(key["x"].asReal(),
key["y"].asReal(),
key["z"].asReal());
mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);
}
mPlaceProfile->setInfoType(LLPanelPlaceInfo::PLACE);
}
else if (mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE)
{
S32 index = key["id"].asInteger();
const LLTeleportHistoryStorage::slurl_list_t& hist_items =
LLTeleportHistoryStorage::getInstance()->getItems();
mPosGlobal = hist_items[index].mGlobalPos;
mPlaceProfile->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY);
mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);
}
mPlaceProfile->setInfoType(LLPanelPlaceInfo::PLACE);
updateVerbs();
}
else if (mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE)
{
S32 index = key["id"].asInteger();
const LLTeleportHistoryStorage::slurl_list_t& hist_items =
LLTeleportHistoryStorage::getInstance()->getItems();
mPosGlobal = hist_items[index].mGlobalPos;
mPlaceProfile->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY);
mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);
}
updateVerbs();
LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance();
if (!parcel_mgr)
@ -388,9 +391,12 @@ void LLPanelPlaces::onOpen(const LLSD& key)
{
parcel_mgr->removeObserver(mParcelObserver);
// Clear the reference to selection to allow its removal in deselectUnused().
mParcel.clear();
if (!parcel_mgr->selectionEmpty())
{
parcel_mgr->deselectLand();
parcel_mgr->deselectUnused();
}
}
}
@ -765,23 +771,23 @@ void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param)
mPickPanel->reshape(rect.getWidth(), rect.getHeight());
mPickPanel->setRect(rect);
}
else if (item == "add_to_favbar")
{
if ( mItem.notNull() )
{
const LLUUID& favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
if ( favorites_id.notNull() )
{
copy_inventory_item(gAgent.getID(),
mItem->getPermissions().getOwner(),
mItem->getUUID(),
favorites_id,
std::string(),
LLPointer<LLInventoryCallback>(NULL));
llinfos << "Copied inventory item #" << mItem->getUUID() << " to favorites." << llendl;
}
}
}
else if (item == "add_to_favbar")
{
if ( mItem.notNull() )
{
const LLUUID& favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
if ( favorites_id.notNull() )
{
copy_inventory_item(gAgent.getID(),
mItem->getPermissions().getOwner(),
mItem->getUUID(),
favorites_id,
std::string(),
LLPointer<LLInventoryCallback>(NULL));
llinfos << "Copied inventory item #" << mItem->getUUID() << " to favorites." << llendl;
}
}
}
}
void LLPanelPlaces::onBackButtonClicked()
@ -826,6 +832,14 @@ void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible)
mLandmarkInfo->setVisible(FALSE);
}
else if (mPlaceInfoType == AGENT_INFO_TYPE)
{
LLViewerParcelMgr::getInstance()->removeObserver(mParcelObserver);
// Clear reference to parcel selection when closing place profile panel.
// LLViewerParcelMgr removes the selection if it has 1 reference to it.
mParcel.clear();
}
}
else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE ||
mPlaceInfoType == LANDMARK_INFO_TYPE)
@ -842,6 +856,33 @@ void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible)
mPlaceProfile->setVisible(FALSE);
}
else
{
LLLandmarksPanel* landmarks_panel =
dynamic_cast<LLLandmarksPanel*>(mTabContainer->getPanelByName("Landmarks"));
if (landmarks_panel && mItem.notNull())
{
// If a landmark info is being closed we open the landmarks tab
// and set this landmark selected.
mTabContainer->selectTabPanel(landmarks_panel);
landmarks_panel->setItemSelected(mItem->getUUID(), TRUE);
}
}
}
}
// virtual
void LLPanelPlaces::handleVisibilityChange(BOOL new_visibility)
{
LLPanel::handleVisibilityChange(new_visibility);
if (!new_visibility && mPlaceInfoType == AGENT_INFO_TYPE)
{
LLViewerParcelMgr::getInstance()->removeObserver(mParcelObserver);
// Clear reference to parcel selection when closing places panel.
mParcel.clear();
}
}

View File

@ -97,6 +97,8 @@ private:
void togglePickPanel(BOOL visible);
void togglePlaceInfoPanel(BOOL visible);
/*virtual*/ void handleVisibilityChange(BOOL new_visibility);
void updateVerbs();
LLPanelPlaceInfo* getCurrentInfoPanel();

View File

@ -125,6 +125,8 @@ LLParticipantList::~LLParticipantList()
delete mParticipantListMenu;
mParticipantListMenu = NULL;
}
mAvatarList->setContextMenu(NULL);
}
void LLParticipantList::setSpeakingIndicatorsVisible(BOOL visible)
@ -430,6 +432,10 @@ LLContextMenu* LLParticipantList::LLParticipantListMenu::createMenu()
LLContextMenu* main_menu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>(
"menu_participant_list.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance());
// Don't show sort options for P2P chat
bool is_sort_visible = (mParent.mAvatarList && mParent.mAvatarList->size() > 1);
main_menu->setItemVisible("SortByName", is_sort_visible);
main_menu->setItemVisible("SortByRecentSpeakers", is_sort_visible);
main_menu->setItemVisible("Moderator Options", isGroupModerator());
main_menu->arrangeAndClear();
@ -455,11 +461,6 @@ void LLParticipantList::LLParticipantListMenu::show(LLView* spawning_view, const
LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceUnMuteSelected", false);
LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceUnMuteOthers", false);
}
// Don't show sort options for P2P chat
bool is_sort_visible = (mParent.mAvatarList && mParent.mAvatarList->size() > 1);
LLMenuGL::sMenuContainer->childSetVisible("SortByName", is_sort_visible);
LLMenuGL::sMenuContainer->childSetVisible("SortByRecentSpeakers", is_sort_visible);
}
void LLParticipantList::LLParticipantListMenu::sortParticipantList(const LLSD& userdata)
@ -626,7 +627,7 @@ bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD&
}
else if (item == "can_call")
{
return LLVoiceClient::getInstance()->voiceEnabled();
return LLVoiceClient::getInstance()->voiceEnabled()&&LLVoiceClient::getInstance()->isVoiceWorking();
}
return true;

View File

@ -380,138 +380,53 @@ void LLPreviewTexture::updateDimensions()
mUpdateDimensions = FALSE;
S32 image_height = llmax(1, mImage->getFullHeight());
S32 image_width = llmax(1, mImage->getFullWidth());
// Attempt to make the image 1:1 on screen.
// If that fails, cut width by half.
S32 client_width = image_width;
S32 client_height = image_height;
S32 horiz_pad = 2 * (LLPANEL_BORDER_WIDTH + PREVIEW_PAD) + PREVIEW_RESIZE_HANDLE_SIZE;
S32 vert_pad = PREVIEW_HEADER_SIZE + 2 * CLIENT_RECT_VPAD + LLPANEL_BORDER_WIDTH;
S32 max_client_width = gViewerWindow->getWindowWidthScaled() - horiz_pad;
S32 max_client_height = gViewerWindow->getWindowHeightScaled() - vert_pad;
if (mAspectRatio > 0.f)
{
client_height = llceil((F32)client_width / mAspectRatio);
}
while ((client_width > max_client_width) ||
(client_height > max_client_height ))
{
client_width /= 2;
client_height /= 2;
}
S32 view_width = client_width + horiz_pad;
S32 view_height = client_height + vert_pad;
// set text on dimensions display (should be moved out of here and into a callback of some sort)
childSetTextArg("dimensions", "[WIDTH]", llformat("%d", mImage->getFullWidth()));
childSetTextArg("dimensions", "[HEIGHT]", llformat("%d", mImage->getFullHeight()));
LLRect dim_rect;
childGetRect("dimensions", dim_rect);
S32 horiz_pad = 2 * (LLPANEL_BORDER_WIDTH + PREVIEW_PAD) + PREVIEW_RESIZE_HANDLE_SIZE;
// add space for dimensions and aspect ratio
S32 info_height = 0;
LLRect aspect_rect;
childGetRect("combo_aspect_ratio", aspect_rect);
S32 aspect_height = aspect_rect.getHeight();
info_height += aspect_height + CLIENT_RECT_VPAD;
view_height += info_height;
S32 button_height = 0;
// add space for buttons
view_height += (BTN_HEIGHT + CLIENT_RECT_VPAD) * 3;
button_height = (BTN_HEIGHT + PREVIEW_PAD) * 3;
S32 info_height = dim_rect.mTop + CLIENT_RECT_VPAD;
view_width = llmax(view_width, getMinWidth());
view_height = llmax(view_height, getMinHeight());
if (view_height != mLastHeight || view_width != mLastWidth)
{
if (getHost())
{
getHost()->growToFit(view_width, view_height);
reshape( view_width, view_height );
setOrigin( 0, getHost()->getRect().getHeight() - (view_height + PREVIEW_HEADER_SIZE) );
}
else
{
S32 old_top = getRect().mTop;
S32 old_left = getRect().mLeft;
reshape( view_width, view_height );
S32 new_bottom = old_top - getRect().getHeight();
setOrigin( old_left, new_bottom );
}
// Try to keep whole view onscreen, don't allow partial offscreen.
if (getHost())
gFloaterView->adjustToFitScreen(getHost(), FALSE);
else
gFloaterView->adjustToFitScreen(this, FALSE);
if (image_height > 1 && image_width > 1)
{
// Resize until we know the image's height
mLastWidth = view_width;
mLastHeight = view_height;
}
}
if (!mUserResized)
{
// clamp texture size to fit within actual size of floater after attempting resize
client_width = llmin(client_width, getRect().getWidth() - horiz_pad);
client_height = llmin(client_height, getRect().getHeight() - PREVIEW_HEADER_SIZE
- (2 * CLIENT_RECT_VPAD) - LLPANEL_BORDER_WIDTH - info_height);
LLRect client_rect(horiz_pad, getRect().getHeight(), getRect().getWidth() - horiz_pad, 0);
client_rect.mTop -= (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD);
client_rect.mBottom += PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height ;
}
else
{
client_width = getRect().getWidth() - horiz_pad;
if (mAspectRatio > 0)
{
client_height = llround(client_width / mAspectRatio);
}
else
{
client_height = getRect().getHeight() - vert_pad;
}
}
S32 max_height = getRect().getHeight() - PREVIEW_BORDER - button_height
- CLIENT_RECT_VPAD - info_height - CLIENT_RECT_VPAD - PREVIEW_HEADER_SIZE;
S32 client_width = client_rect.getWidth();
S32 client_height = client_rect.getHeight();
if (mAspectRatio > 0.f)
{
max_height = llmax(max_height, 1);
if (client_height > max_height)
if(mAspectRatio > 1.f)
{
client_height = max_height;
client_width = llround(client_height * mAspectRatio);
client_height = llceil((F32)client_width / mAspectRatio);
if(client_height > client_rect.getHeight())
{
client_height = client_rect.getHeight();
client_width = llceil((F32)client_height * mAspectRatio);
}
}
else
{
client_width = llceil((F32)client_height * mAspectRatio);
if(client_width > client_rect.getWidth())
{
client_width = client_rect.getWidth();
client_height = llceil((F32)client_width / mAspectRatio);
}
}
}
else
{
S32 max_width = getRect().getWidth() - horiz_pad;
client_height = llclamp(client_height, 1, max_height);
client_width = llclamp(client_width, 1, max_width);
}
LLRect window_rect(0, getRect().getHeight(), getRect().getWidth(), 0);
window_rect.mTop -= (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD);
window_rect.mBottom += PREVIEW_BORDER + button_height + CLIENT_RECT_VPAD + info_height + CLIENT_RECT_VPAD;
mClientRect.setLeftTopAndSize(client_rect.getCenterX() - (client_width / 2), client_rect.getCenterY() + (client_height / 2), client_width, client_height);
mClientRect.setLeftTopAndSize(window_rect.getCenterX() - (client_width / 2), window_rect.mTop, client_width, client_height);
// Hide the aspect ratio label if the window is too narrow
// Assumes the label should be to the right of the dimensions
LLRect dim_rect, aspect_label_rect;
LLRect aspect_label_rect;
childGetRect("aspect_ratio", aspect_label_rect);
childGetRect("dimensions", dim_rect);
childSetVisible("aspect_ratio", dim_rect.mRight < aspect_label_rect.mLeft);
}

View File

@ -44,7 +44,6 @@
#include "llvoavatar.h"
#include "llworld.h"
const F32 SPEAKER_TIMEOUT = 10.f; // seconds of not being on voice channel before removed from list of active speakers
const LLColor4 INACTIVE_COLOR(0.3f, 0.3f, 0.3f, 0.5f);
const LLColor4 ACTIVE_COLOR(0.5f, 0.5f, 0.5f, 1.f);
@ -73,8 +72,6 @@ LLSpeaker::LLSpeaker(const LLUUID& id, const std::string& name, const ESpeakerTy
}
LLVoiceClient::getInstance()->setUserVolume(id, LLMuteList::getInstance()->getSavedResidentVolume(id));
mActivityTimer.resetWithExpiry(SPEAKER_TIMEOUT);
}
@ -164,6 +161,89 @@ bool LLSortRecentSpeakers::operator()(const LLPointer<LLSpeaker> lhs, const LLPo
return( lhs->mDisplayName.compare(rhs->mDisplayName) < 0 );
}
LLSpeakerActionTimer::LLSpeakerActionTimer(action_callback_t action_cb, F32 action_period, const LLUUID& speaker_id)
: LLEventTimer(action_period)
, mActionCallback(action_cb)
, mSpeakerId(speaker_id)
{
}
BOOL LLSpeakerActionTimer::tick()
{
if (mActionCallback)
{
return (BOOL)mActionCallback(mSpeakerId);
}
return TRUE;
}
LLSpeakersDelayActionsStorage::LLSpeakersDelayActionsStorage(LLSpeakerActionTimer::action_callback_t action_cb, F32 action_delay)
: mActionCallback(action_cb)
, mActionDelay(action_delay)
{
}
LLSpeakersDelayActionsStorage::~LLSpeakersDelayActionsStorage()
{
removeAllTimers();
}
void LLSpeakersDelayActionsStorage::setActionTimer(const LLUUID& speaker_id)
{
bool not_found = true;
if (mActionTimersMap.size() > 0)
{
not_found = mActionTimersMap.find(speaker_id) == mActionTimersMap.end();
}
// If there is already a started timer for the passed UUID don't do anything.
if (not_found)
{
// Starting a timer to remove an participant after delay is completed
mActionTimersMap.insert(LLSpeakerActionTimer::action_value_t(speaker_id,
new LLSpeakerActionTimer(
boost::bind(&LLSpeakersDelayActionsStorage::onTimerActionCallback, this, _1),
mActionDelay, speaker_id)));
}
}
void LLSpeakersDelayActionsStorage::unsetActionTimer(const LLUUID& speaker_id)
{
if (mActionTimersMap.size() == 0) return;
LLSpeakerActionTimer::action_timer_iter_t it_speaker = mActionTimersMap.find(speaker_id);
if (it_speaker != mActionTimersMap.end())
{
delete it_speaker->second;
mActionTimersMap.erase(it_speaker);
}
}
void LLSpeakersDelayActionsStorage::removeAllTimers()
{
LLSpeakerActionTimer::action_timer_iter_t iter = mActionTimersMap.begin();
for (; iter != mActionTimersMap.end(); ++iter)
{
delete iter->second;
}
mActionTimersMap.clear();
}
bool LLSpeakersDelayActionsStorage::onTimerActionCallback(const LLUUID& speaker_id)
{
unsetActionTimer(speaker_id);
if (mActionCallback)
{
mActionCallback(speaker_id);
}
// do not return true to avoid deleting of an timer twice:
// in LLSpeakersDelayActionsStorage::unsetActionTimer() & LLEventTimer::updateClass()
return false;
}
//
// LLSpeakerMgr
@ -172,10 +252,14 @@ bool LLSortRecentSpeakers::operator()(const LLPointer<LLSpeaker> lhs, const LLPo
LLSpeakerMgr::LLSpeakerMgr(LLVoiceChannel* channelp) :
mVoiceChannel(channelp)
{
static LLUICachedControl<F32> remove_delay ("SpeakerParticipantRemoveDelay", 10.0);
mSpeakerDelayRemover = new LLSpeakersDelayActionsStorage(boost::bind(&LLSpeakerMgr::removeSpeaker, this, _1), remove_delay);
}
LLSpeakerMgr::~LLSpeakerMgr()
{
delete mSpeakerDelayRemover;
}
LLPointer<LLSpeaker> LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::string& name, LLSpeaker::ESpeakerStatus status, LLSpeaker::ESpeakerType type)
@ -198,7 +282,6 @@ LLPointer<LLSpeaker> LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::strin
{
// keep highest priority status (lowest value) instead of overriding current value
speakerp->mStatus = llmin(speakerp->mStatus, status);
speakerp->mActivityTimer.resetWithExpiry(SPEAKER_TIMEOUT);
// RN: due to a weird behavior where IMs from attached objects come from the wearer's agent_id
// we need to override speakers that we think are objects when we find out they are really
// residents
@ -210,6 +293,8 @@ LLPointer<LLSpeaker> LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::strin
}
}
mSpeakerDelayRemover->unsetActionTimer(speakerp->mID);
return speakerp;
}
@ -314,7 +399,7 @@ void LLSpeakerMgr::update(BOOL resort_ok)
S32 sort_index = 0;
speaker_list_t::iterator sorted_speaker_it;
for(sorted_speaker_it = mSpeakersSorted.begin();
sorted_speaker_it != mSpeakersSorted.end(); )
sorted_speaker_it != mSpeakersSorted.end(); ++sorted_speaker_it)
{
LLPointer<LLSpeaker> speakerp = *sorted_speaker_it;
@ -327,19 +412,6 @@ void LLSpeakerMgr::update(BOOL resort_ok)
// stuff sort ordinal into speaker so the ui can sort by this value
speakerp->mSortIndex = sort_index++;
// remove speakers that have been gone too long
if (speakerp->mStatus == LLSpeaker::STATUS_NOT_IN_CHANNEL && speakerp->mActivityTimer.hasExpired())
{
fireEvent(new LLSpeakerListChangeEvent(this, speakerp->mID), "remove");
mSpeakers.erase(speakerp->mID);
sorted_speaker_it = mSpeakersSorted.erase(sorted_speaker_it);
}
else
{
++sorted_speaker_it;
}
}
}
@ -365,6 +437,35 @@ void LLSpeakerMgr::updateSpeakerList()
}
}
void LLSpeakerMgr::setSpeakerNotInChannel(LLSpeaker* speakerp)
{
speakerp->mStatus = LLSpeaker::STATUS_NOT_IN_CHANNEL;
speakerp->mDotColor = INACTIVE_COLOR;
mSpeakerDelayRemover->setActionTimer(speakerp->mID);
}
bool LLSpeakerMgr::removeSpeaker(const LLUUID& speaker_id)
{
mSpeakers.erase(speaker_id);
speaker_list_t::iterator sorted_speaker_it = mSpeakersSorted.begin();
for(; sorted_speaker_it != mSpeakersSorted.end(); ++sorted_speaker_it)
{
if (speaker_id == (*sorted_speaker_it)->mID)
{
mSpeakersSorted.erase(sorted_speaker_it);
break;
}
}
fireEvent(new LLSpeakerListChangeEvent(this, speaker_id), "remove");
update(TRUE);
return false;
}
LLPointer<LLSpeaker> LLSpeakerMgr::findSpeaker(const LLUUID& speaker_id)
{
//In some conditions map causes crash if it is empty(Windows only), adding check (EK)
@ -513,9 +614,7 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)
{
if (agent_data["transition"].asString() == "LEAVE" && speakerp.notNull())
{
speakerp->mStatus = LLSpeaker::STATUS_NOT_IN_CHANNEL;
speakerp->mDotColor = INACTIVE_COLOR;
speakerp->mActivityTimer.resetWithExpiry(SPEAKER_TIMEOUT);
setSpeakerNotInChannel(speakerp);
}
else if (agent_data["transition"].asString() == "ENTER")
{
@ -565,9 +664,7 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)
std::string agent_transition = update_it->second.asString();
if (agent_transition == "LEAVE" && speakerp.notNull())
{
speakerp->mStatus = LLSpeaker::STATUS_NOT_IN_CHANNEL;
speakerp->mDotColor = INACTIVE_COLOR;
speakerp->mActivityTimer.resetWithExpiry(SPEAKER_TIMEOUT);
setSpeakerNotInChannel(speakerp);
}
else if ( agent_transition == "ENTER")
{
@ -736,12 +833,13 @@ void LLActiveSpeakerMgr::updateSpeakerList()
mVoiceChannel = LLVoiceChannel::getCurrentVoiceChannel();
// always populate from active voice channel
if (LLVoiceChannel::getCurrentVoiceChannel() != mVoiceChannel)
if (LLVoiceChannel::getCurrentVoiceChannel() != mVoiceChannel) //MA: seems this is always false
{
fireEvent(new LLSpeakerListChangeEvent(this, LLUUID::null), "clear");
mSpeakers.clear();
mSpeakersSorted.clear();
mVoiceChannel = LLVoiceChannel::getCurrentVoiceChannel();
mSpeakerDelayRemover->removeAllTimers();
}
LLSpeakerMgr::updateSpeakerList();
@ -802,9 +900,7 @@ void LLLocalSpeakerMgr::updateSpeakerList()
LLVOAvatar* avatarp = (LLVOAvatar*)gObjectList.findObject(speaker_id);
if (!avatarp || dist_vec(avatarp->getPositionAgent(), gAgent.getPositionAgent()) > CHAT_NORMAL_RADIUS)
{
speakerp->mStatus = LLSpeaker::STATUS_NOT_IN_CHANNEL;
speakerp->mDotColor = INACTIVE_COLOR;
speakerp->mActivityTimer.resetWithExpiry(SPEAKER_TIMEOUT);
setSpeakerNotInChannel(speakerp);
}
}
}

View File

@ -73,7 +73,6 @@ public:
F32 mLastSpokeTime; // timestamp when this speaker last spoke
F32 mSpeechVolume; // current speech amplitude (timea average rms amplitude?)
std::string mDisplayName; // cache user name for this speaker
LLFrameTimer mActivityTimer; // time out speakers when they are not part of current voice channel
BOOL mHasSpoken; // has this speaker said anything this session?
BOOL mHasLeftCurrentCall; // has this speaker left the current voice call?
LLColor4 mDotColor;
@ -120,6 +119,92 @@ private:
const LLUUID& mSpeakerID;
};
/**
* class LLSpeakerActionTimer
*
* Implements a timer that calls stored callback action for stored speaker after passed period.
*
* Action is called until callback returns "true".
* In this case the timer will be removed via LLEventTimer::updateClass().
* Otherwise it should be deleted manually in place where it is used.
* If action callback is not set timer will tick only once and deleted.
*/
class LLSpeakerActionTimer : public LLEventTimer
{
public:
typedef boost::function<bool(const LLUUID&)> action_callback_t;
typedef std::map<LLUUID, LLSpeakerActionTimer*> action_timers_map_t;
typedef action_timers_map_t::value_type action_value_t;
typedef action_timers_map_t::const_iterator action_timer_const_iter_t;
typedef action_timers_map_t::iterator action_timer_iter_t;
/**
* Constructor.
*
* @param action_cb - callback which will be called each time after passed action period.
* @param action_period - time in seconds timer should tick.
* @param speaker_id - LLUUID of speaker which will be passed into action callback.
*/
LLSpeakerActionTimer(action_callback_t action_cb, F32 action_period, const LLUUID& speaker_id);
virtual ~LLSpeakerActionTimer() {};
/**
* Implements timer "tick".
*
* If action callback is not specified returns true. Instance will be deleted by LLEventTimer::updateClass().
*/
virtual BOOL tick();
private:
action_callback_t mActionCallback;
LLUUID mSpeakerId;
};
/**
* Represents a functionality to store actions for speakers with delay.
* Is based on LLSpeakerActionTimer.
*/
class LLSpeakersDelayActionsStorage
{
public:
LLSpeakersDelayActionsStorage(LLSpeakerActionTimer::action_callback_t action_cb, F32 action_delay);
~LLSpeakersDelayActionsStorage();
/**
* Sets new LLSpeakerActionTimer with passed speaker UUID.
*/
void setActionTimer(const LLUUID& speaker_id);
/**
* Removes stored LLSpeakerActionTimer for passed speaker UUID from internal map and deletes it.
*
* @see onTimerActionCallback()
*/
void unsetActionTimer(const LLUUID& speaker_id);
void removeAllTimers();
private:
/**
* Callback of the each instance of LLSpeakerActionTimer.
*
* Unsets an appropriate timer instance and calls action callback for specified speacker_id.
* It always returns false to not use LLEventTimer::updateClass functionality of timer deleting.
*
* @see unsetActionTimer()
*/
bool onTimerActionCallback(const LLUUID& speaker_id);
LLSpeakerActionTimer::action_timers_map_t mActionTimersMap;
LLSpeakerActionTimer::action_callback_t mActionCallback;
/**
* Delay to call action callback for speakers after timer was set.
*/
F32 mActionDelay;
};
class LLSpeakerMgr : public LLOldEvents::LLObservable
{
public:
@ -144,6 +229,8 @@ public:
protected:
virtual void updateSpeakerList();
void setSpeakerNotInChannel(LLSpeaker* speackerp);
bool removeSpeaker(const LLUUID& speaker_id);
typedef std::map<LLUUID, LLPointer<LLSpeaker> > speaker_map_t;
speaker_map_t mSpeakers;
@ -151,6 +238,11 @@ protected:
speaker_list_t mSpeakersSorted;
LLFrameTimer mSpeechTimer;
LLVoiceChannel* mVoiceChannel;
/**
* time out speakers when they are not part of current session
*/
LLSpeakersDelayActionsStorage* mSpeakerDelayRemover;
};
class LLIMSpeakerMgr : public LLSpeakerMgr

View File

@ -310,59 +310,6 @@ void update_texture_fetch()
gTextureList.updateImages(0.10f);
}
//Copies landmarks from the "Library" to "My Favorites"
void populate_favorites_bar()
{
//*TODO consider extending LLInventoryModel::findCategoryUUIDForType(...) to support both root's
LLInventoryModel::cat_array_t* lib_cats = NULL;
LLInventoryModel::item_array_t* lib_items = NULL;
gInventory.getDirectDescendentsOf(gInventory.getLibraryRootFolderID(), lib_cats, lib_items);
if (!lib_cats) return;
LLUUID lib_landmarks(LLUUID::null);
S32 count = lib_cats->count();
for(S32 i = 0; i < count; ++i)
{
if(lib_cats->get(i)->getPreferredType() == LLFolderType::FT_LANDMARK)
{
lib_landmarks = lib_cats->get(i)->getUUID();
break;
}
}
if (lib_landmarks.isNull())
{
llerror("Library inventory is missing Landmarks", 0);
return;
}
LLInventoryModel::cat_array_t* lm_cats = NULL;
LLInventoryModel::item_array_t* lm_items = NULL;
gInventory.getDirectDescendentsOf(lib_landmarks, lm_cats, lm_items);
if (!lm_items) return;
const LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
if (favorites_id.isNull())
{
llerror("My Inventory is missing My Favorites", 0);
return;
}
S32 lm_count = lm_items->count();
for (S32 i = 0; i < lm_count; ++i)
{
LLInventoryItem* item = lm_items->get(i);
if (item->getUUID().isNull()) continue;
copy_inventory_item(gAgent.getID(),
item->getPermissions().getOwner(),
item->getUUID(),
favorites_id,
std::string(),
LLPointer<LLInventoryCallback>(NULL));
}
}
// Returns false to skip other idle processing. Should only return
// true when all initialization done.
bool idle_startup()
@ -1703,12 +1650,6 @@ bool idle_startup()
llinfos << "Creating Inventory Views" << llendl;
LLFloaterReg::getInstance("inventory");
//default initial content for Favorites Bar
if (gAgent.isFirstLogin())
{
populate_favorites_bar();
}
LLStartUp::setStartupState( STATE_MISC );
return FALSE;
}

View File

@ -1140,6 +1140,10 @@ LLTexLayerInterface::LLTexLayerInterface(const LLTexLayerInterface &layer, LLWea
BOOL LLTexLayerInterface::setInfo(const LLTexLayerInfo *info, LLWearable* wearable ) // This sets mInfo and calls initialization functions
{
//llassert(mInfo == NULL); // nyx says this is probably bogus but needs investigating
if (mInfo != NULL) // above llassert(), but softened into a warning
{
llwarns << "BAD STUFF! mInfo != NULL" << llendl;
}
mInfo = info;
//mID = info->mID; // No ID

View File

@ -1103,7 +1103,10 @@ void LLTextureCtrl::onFloaterCommit(ETexturePickOp op)
{
if (op == TEXTURE_CANCEL)
mViewModel->resetDirty();
else
// If the "no_commit_on_selection" parameter is set
// we get dirty only when user presses OK in the picker
// (i.e. op == TEXTURE_SELECT) or texture changes via DnD.
else if (mCommitOnSelection || op == TEXTURE_SELECT)
mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here?
if( floaterp->isDirty() )
@ -1125,7 +1128,7 @@ void LLTextureCtrl::onFloaterCommit(ETexturePickOp op)
{
// If the "no_commit_on_selection" parameter is set
// we commit only when user presses OK in the picker
// (i.e. op == TEXTURE_SELECT) or changes texture via DnD.
// (i.e. op == TEXTURE_SELECT) or texture changes via DnD.
if (mCommitOnSelection || op == TEXTURE_SELECT)
onCommit();
}
@ -1165,6 +1168,9 @@ BOOL LLTextureCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask,
{
if(doDrop(item))
{
if (!mCommitOnSelection)
mViewModel->setDirty();
// This removes the 'Multiple' overlay, since
// there is now only one texture selected.
setTentative( FALSE );

View File

@ -74,7 +74,8 @@ public:
Optional<std::string> default_image_name;
Optional<bool> allow_no_texture;
Optional<bool> can_apply_immediately;
Optional<bool> no_commit_on_selection; // don't commit unless it's DnD or OK button press
Optional<bool> no_commit_on_selection; // alternative mode: commit occurs and the widget gets dirty
// only on DnD or when OK is pressed in the picker
Optional<S32> label_width;
Optional<LLUIColor> border_color;

View File

@ -42,6 +42,7 @@ LLTransientDockableFloater::LLTransientDockableFloater(LLDockControl* dockContro
LLDockableFloater(dockControl, uniqueDocking, key, params)
{
LLTransientFloaterMgr::getInstance()->registerTransientFloater(this);
LLTransientFloater::init(this);
}
LLTransientDockableFloater::~LLTransientDockableFloater()

View File

@ -37,12 +37,13 @@
#include "llfloater.h"
#include "lldockcontrol.h"
#include "lldockablefloater.h"
#include "lltransientfloatermgr.h"
/**
* Represents floater that can dock and managed by transient floater manager.
* Transient floaters should be hidden if user click anywhere except defined view list.
*/
class LLTransientDockableFloater : public LLDockableFloater
class LLTransientDockableFloater : public LLDockableFloater, LLTransientFloater
{
public:
LOG_CLASS(LLTransientDockableFloater);
@ -52,6 +53,7 @@ public:
/*virtual*/ void setVisible(BOOL visible);
/* virtual */void setDocked(bool docked, bool pop_on_undock = true);
virtual LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::GLOBAL; }
};
#endif /* LL_TRANSIENTDOCKABLEFLOATER_H */

View File

@ -44,57 +44,68 @@ LLTransientFloaterMgr::LLTransientFloaterMgr()
{
gViewerWindow->getRootView()->addMouseDownCallback(boost::bind(
&LLTransientFloaterMgr::leftMouseClickCallback, this, _1, _2, _3));
mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(GLOBAL, std::set<LLView*>()));
mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(IM, std::set<LLView*>()));
}
void LLTransientFloaterMgr::registerTransientFloater(LLFloater* floater)
void LLTransientFloaterMgr::registerTransientFloater(LLTransientFloater* floater)
{
mTransSet.insert(floater);
}
void LLTransientFloaterMgr::unregisterTransientFloater(LLFloater* floater)
void LLTransientFloaterMgr::unregisterTransientFloater(LLTransientFloater* floater)
{
mTransSet.erase(floater);
}
void LLTransientFloaterMgr::addControlView(ETransientGroup group, LLView* view)
{
mGroupControls.find(group)->second.insert(view);
}
void LLTransientFloaterMgr::removeControlView(ETransientGroup group, LLView* view)
{
mGroupControls.find(group)->second.erase(view);
}
void LLTransientFloaterMgr::addControlView(LLView* view)
{
mControlsSet.insert(view);
addControlView(GLOBAL, view);
}
void LLTransientFloaterMgr::removeControlView(LLView* view)
{
// we will still get focus lost callbacks on this view, but that's ok
// since we run sanity checking logic every time
mControlsSet.erase(view);
removeControlView(GLOBAL, view);
}
void LLTransientFloaterMgr::hideTransientFloaters()
void LLTransientFloaterMgr::hideTransientFloaters(S32 x, S32 y)
{
for (std::set<LLFloater*>::iterator it = mTransSet.begin(); it
for (std::set<LLTransientFloater*>::iterator it = mTransSet.begin(); it
!= mTransSet.end(); it++)
{
LLFloater* floater = *it;
if (floater->isDocked())
LLTransientFloater* floater = *it;
if (floater->isTransientDocked())
{
floater->setVisible(FALSE);
ETransientGroup group = floater->getGroup();
bool hide = isControlClicked(mGroupControls.find(group)->second, x, y);
if (hide)
{
floater->setTransientVisible(FALSE);
}
}
}
}
void LLTransientFloaterMgr::leftMouseClickCallback(S32 x, S32 y,
MASK mask)
bool LLTransientFloaterMgr::isControlClicked(std::set<LLView*>& set, S32 x, S32 y)
{
bool hide = true;
for (controls_set_t::iterator it = mControlsSet.begin(); it
!= mControlsSet.end(); it++)
bool res = true;
for (controls_set_t::iterator it = set.begin(); it
!= set.end(); it++)
{
// don't hide transient floater if any context menu opened
if (LLMenuGL::sMenuContainer->getVisibleMenu() != NULL)
{
hide = false;
break;
}
LLView* control_view = *it;
if (!control_view->getVisible())
{
@ -105,14 +116,32 @@ void LLTransientFloaterMgr::leftMouseClickCallback(S32 x, S32 y,
// if click inside view rect
if (rect.pointInRect(x, y))
{
hide = false;
res = false;
break;
}
}
return res;
}
void LLTransientFloaterMgr::leftMouseClickCallback(S32 x, S32 y,
MASK mask)
{
// don't hide transient floater if any context menu opened
if (LLMenuGL::sMenuContainer->getVisibleMenu() != NULL)
{
return;
}
bool hide = isControlClicked(mGroupControls.find(GLOBAL)->second, x, y);
if (hide)
{
hideTransientFloaters();
hideTransientFloaters(x, y);
}
}
void LLTransientFloater::init(LLFloater* thiz)
{
// used since LLTransientFloater(this) can't be used in descendant constructor parameter initialization.
mFloater = thiz;
}

View File

@ -37,27 +37,60 @@
#include "llsingleton.h"
#include "llfloater.h"
class LLTransientFloater;
/**
* Provides functionality to hide transient floaters.
*/
class LLTransientFloaterMgr: public LLSingleton<LLTransientFloaterMgr>
{
public:
protected:
LLTransientFloaterMgr();
void registerTransientFloater(LLFloater* floater);
void unregisterTransientFloater(LLFloater* floater);
friend class LLSingleton<LLTransientFloaterMgr>;
public:
enum ETransientGroup
{
GLOBAL, IM
};
void registerTransientFloater(LLTransientFloater* floater);
void unregisterTransientFloater(LLTransientFloater* floater);
void addControlView(ETransientGroup group, LLView* view);
void removeControlView(ETransientGroup group, LLView* view);
void addControlView(LLView* view);
void removeControlView(LLView* view);
private:
void hideTransientFloaters();
void hideTransientFloaters(S32 x, S32 y);
void leftMouseClickCallback(S32 x, S32 y, MASK mask);
bool isControlClicked(std::set<LLView*>& set, S32 x, S32 y);
private:
std::set<LLTransientFloater*> mTransSet;
typedef std::set<LLView*> controls_set_t;
typedef std::map<ETransientGroup, std::set<LLView*> > group_controls_t;
group_controls_t mGroupControls;
};
/**
* An abstract class declares transient floater interfaces.
*/
class LLTransientFloater
{
protected:
/**
* Class initialization method.
* Should be called from descendant constructor.
*/
void init(LLFloater* thiz);
public:
virtual LLTransientFloaterMgr::ETransientGroup getGroup() = 0;
bool isTransientDocked() { return mFloater->isDocked(); };
void setTransientVisible(BOOL visible) {mFloater->setVisible(visible); }
private:
std::set<LLFloater*> mTransSet;
typedef std::set<LLView*> controls_set_t;
controls_set_t mControlsSet;
LLFloater* mFloater;
};
#endif // LL_LLTRANSIENTFLOATERMGR_H

View File

@ -483,7 +483,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
{
LLAppViewer::instance()->pingMainloopTimeout("Display:Disconnected");
render_ui();
render_disconnected_background();
}
//////////////////////////
@ -1141,6 +1140,10 @@ void render_ui(F32 zoom_factor, int subfield)
render_ui_3d();
LLGLState::checkStates();
}
else
{
render_disconnected_background();
}
render_ui_2d();
LLGLState::checkStates();

View File

@ -752,6 +752,11 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
impl_count_interest_normal++;
}
else if(pimpl->isParcelMedia())
{
new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
impl_count_interest_normal++;
}
else
{
// Look at interest and CPU usage for instances that aren't in any of the above states.

View File

@ -1472,7 +1472,12 @@ void inventory_offer_handler(LLOfferInfo* info)
{
LLStringUtil::truncate(msg, indx);
}
if(LLAssetType::AT_LANDMARK == info->mType)
{
msg = LLViewerInventoryItem::getDisplayName(msg);
}
LLSD args;
args["[OBJECTNAME]"] = msg;
@ -2009,7 +2014,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
// Someone has offered us some inventory.
{
LLOfferInfo* info = new LLOfferInfo;
bool mute_im = false;
if (IM_INVENTORY_OFFERED == dialog)
{
struct offer_agent_bucket_t
@ -2026,11 +2030,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
bucketp = (struct offer_agent_bucket_t*) &binary_bucket[0];
info->mType = (LLAssetType::EType) bucketp->asset_type;
info->mObjectID = bucketp->object_id;
if(accept_im_from_only_friend&&!is_friend)
{
mute_im = true;
}
}
else
{
@ -2061,7 +2060,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
info->mDesc = message;
info->mHost = msg->getSender();
//if (((is_busy && !is_owned_by_me) || is_muted))
if ( is_muted || mute_im)
if (is_muted)
{
// Prefetch the offered item so that it can be discarded by the appropriate observer. (EXT-4331)
LLInventoryFetchObserver::item_ref_t items;

View File

@ -212,22 +212,15 @@ void LLViewerParcelMedia::play(LLParcel* parcel)
else
{
// Since the texture id is different, we need to generate a new impl
LL_DEBUGS("Media") << "new media impl with mime type " << mime_type << ", url " << media_url << LL_ENDL;
// Delete the old one first so they don't fight over the texture.
sMediaImpl = NULL;
sMediaImpl = LLViewerMedia::newMediaImpl(
placeholder_texture_id,
media_width,
media_height,
media_auto_scale,
media_loop);
sMediaImpl->setIsParcelMedia(true);
sMediaImpl->navigateTo(media_url, mime_type, true);
// A new impl will be created below.
}
}
else
if(!sMediaImpl)
{
LL_DEBUGS("Media") << "new media impl with mime type " << mime_type << ", url " << media_url << LL_ENDL;

View File

@ -1560,7 +1560,11 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
void LLViewerFetchedTexture::setDecodePriority(F32 priority)
{
llassert(!mInImageList);
//llassert(!mInImageList); // firing a lot, figure out why
if (mInImageList) // above llassert() softened to a warning
{
llwarns << "BAD STUFF! mInImageList" << llendl;
}
mDecodePriority = priority;
}

View File

@ -502,7 +502,10 @@ void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image)
{
llerrs << "LLViewerTextureList::addImageToList - Image already in list" << llendl;
}
llverify((mImageList.insert(image)).second == true);
if ((mImageList.insert(image)).second != true)
{
llwarns << "BAD STUFF! (mImageList.insert(image)).second != true" << llendl;
}
image->setInImageList(TRUE) ;
}
@ -519,7 +522,10 @@ void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image)
}
llerrs << "LLViewerTextureList::removeImageFromList - Image not in list" << llendl;
}
llverify(mImageList.erase(image) == 1);
if (mImageList.erase(image) != 1)
{
llwarns << "BAD STUFF! mImageList.erase(image) != 1" << llendl;
}
image->setInImageList(FALSE) ;
}

View File

@ -552,6 +552,15 @@ std::string LLVoiceClient::getDisplayName(const LLUUID& id)
}
}
bool LLVoiceClient::isVoiceWorking()
{
if (mVoiceModule)
{
return mVoiceModule->isVoiceWorking();
}
return false;
}
BOOL LLVoiceClient::isParticipantAvatar(const LLUUID& id)
{
if (mVoiceModule)

View File

@ -109,6 +109,8 @@ public:
virtual void updateSettings()=0; // call after loading settings and whenever they change
virtual bool isVoiceWorking()=0; // connected to a voice server and voice channel
virtual const LLVoiceVersionInfo& getVersion()=0;
/////////////////////
@ -274,6 +276,8 @@ static const F32 OVERDRIVEN_POWER_LEVEL;
void updateSettings(); // call after loading settings and whenever they change
bool isVoiceWorking(); // connected to a voice server and voice channel
// tuning
void tuningStart();
void tuningStop();
@ -397,7 +401,6 @@ static const F32 OVERDRIVEN_POWER_LEVEL;
protected:
LLVoiceModuleInterface* mVoiceModule;
LLPumpIO *m_servicePump;
};

View File

@ -4584,6 +4584,11 @@ BOOL LLVivoxVoiceClient::isOnlineSIP(const LLUUID &id)
return result;
}
bool LLVivoxVoiceClient::isVoiceWorking()
{
return (stateLoggedIn <= mState) && (mState <= stateLeavingSession);
}
// Returns true if the indicated participant in the current audio session is really an SL avatar.
// Currently this will be false only for PSTN callers into group chats, and PSTN p2p calls.
BOOL LLVivoxVoiceClient::isParticipantAvatar(const LLUUID &id)

View File

@ -82,7 +82,9 @@ public:
virtual const LLVoiceVersionInfo& getVersion();
virtual void updateSettings(); // call after loading settings and whenever they change
virtual bool isVoiceWorking(); // connected to a voice server and voice channel
/////////////////////
/// @name Tuning
//@{

View File

@ -1852,12 +1852,22 @@ void LLVOVolume::mediaNavigateBounceBack(U8 texture_index)
if (mep && impl)
{
std::string url = mep->getCurrentURL();
// Look for a ":", if not there, assume "http://"
if (!url.empty() && std::string::npos == url.find(':'))
{
url = "http://" + url;
}
// If the url we're trying to "bounce back" to is either empty or not
// allowed by the whitelist, try the home url. If *that* doesn't work,
// set the media as failed and unload it
if (url.empty() || !mep->checkCandidateUrl(url))
{
url = mep->getHomeURL();
// Look for a ":", if not there, assume "http://"
if (!url.empty() && std::string::npos == url.find(':'))
{
url = "http://" + url;
}
}
if (url.empty() || !mep->checkCandidateUrl(url))
{

View File

@ -1,81 +1,81 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="OM [APP_NAME]">
<floater.string name="AboutHeader">
[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
</floater.string>
<floater.string name="AboutCompiler">
Bygget med [COMPILER] version [COMPILER_VERSION]
</floater.string>
<floater.string name="AboutPosition">
Du er ved [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] i [REGION] lokaliseret på [HOSTNAME] ([HOSTIP])
[SERVER_VERSION]
[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
</floater.string>
<floater.string name="AboutSystem">
CPU: [CPU]
Memory: [MEMORY_MB] MB
OS Version: [OS_VERSION]
Grafik kort mærke: [GRAPHICS_CARD_VENDOR]
Grafik kort: [GRAPHICS_CARD]
</floater.string>
<floater.string name="AboutDriver">
Windows Graphics Driver Version: [GRAPHICS_DRIVER_VERSION]
</floater.string>
<floater.string name="AboutLibs">
OpenGL Version: [OPENGL_VERSION]
libcurl Version: [LIBCURL_VERSION]
J2C Decoder Version: [J2C_VERSION]
Audio Driver Version: [AUDIO_DRIVER_VERSION]
Qt Webkit Version: [QT_WEBKIT_VERSION]
Vivox Version: [VIVOX_VERSION]
</floater.string>
<floater.string name="none">
(ingen)
</floater.string>
<floater.string name="AboutTraffic">
Pakker tabt: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</floater.string>
<tab_container name="about_tab">
<panel label="Info" name="support_panel">
<button label="Kopiér til udklipsholder" name="copy_btn"/>
</panel>
<panel label="Tak til" name="credits_panel">
<text_editor name="credits_editor">
Second Life er gjort muligt for dig af Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl and many others.
Tak til følgende beboerne for at bidrage til at sikre, at dette er den bedste version til dato: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
I get by with a little help from my friends. --Richard Starkey
</text_editor>
</panel>
<panel label="Licenser" name="licenses_panel">
<text_editor name="credits_editor">
3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
APR Copyright (C) 2000-2004 The Apache Software Foundation
cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
GL Copyright (C) 1999-2004 Brian Paul.
Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
ogg/vorbis Copyright (C) 2001, Xiphophorus
OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
google-perftools Copyright (c) 2005, Google Inc.
Alle rettigheder forbeholdes. Se licenses.txt for detaljer.
Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
</text_editor>
</panel>
</tab_container>
</floater>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="OM [APP_NAME]">
<floater.string name="AboutHeader">
[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
</floater.string>
<floater.string name="AboutCompiler">
Bygget med [COMPILER] version [COMPILER_VERSION]
</floater.string>
<floater.string name="AboutPosition">
Du er ved [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] i [REGION] lokaliseret på [HOSTNAME] ([HOSTIP])
[SERVER_VERSION]
[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
</floater.string>
<floater.string name="AboutSystem">
CPU: [CPU]
Memory: [MEMORY_MB] MB
OS Version: [OS_VERSION]
Grafik kort mærke: [GRAPHICS_CARD_VENDOR]
Grafik kort: [GRAPHICS_CARD]
</floater.string>
<floater.string name="AboutDriver">
Windows Graphics Driver Version: [GRAPHICS_DRIVER_VERSION]
</floater.string>
<floater.string name="AboutLibs">
OpenGL Version: [OPENGL_VERSION]
libcurl Version: [LIBCURL_VERSION]
J2C Decoder Version: [J2C_VERSION]
Audio Driver Version: [AUDIO_DRIVER_VERSION]
Qt Webkit Version: [QT_WEBKIT_VERSION]
Vivox Version: [VIVOX_VERSION]
</floater.string>
<floater.string name="none">
(ingen)
</floater.string>
<floater.string name="AboutTraffic">
Pakker tabt: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</floater.string>
<tab_container name="about_tab">
<panel label="Info" name="support_panel">
<button label="Kopiér til udklipsholder" name="copy_btn"/>
</panel>
<panel label="Tak til" name="credits_panel">
<text_editor name="credits_editor">
Second Life er gjort muligt for dig af Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl and many others.
Tak til følgende beboerne for at bidrage til at sikre, at dette er den bedste version til dato: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
I get by with a little help from my friends. --Richard Starkey
</text_editor>
</panel>
<panel label="Licenser" name="licenses_panel">
<text_editor name="credits_editor">
3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
APR Copyright (C) 2000-2004 The Apache Software Foundation
cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
GL Copyright (C) 1999-2004 Brian Paul.
Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
ogg/vorbis Copyright (C) 2001, Xiphophorus
OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
google-perftools Copyright (c) 2005, Google Inc.
Alle rettigheder forbeholdes. Se licenses.txt for detaljer.
Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
</text_editor>
</panel>
</tab_container>
</floater>

View File

@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="mute by name" title="BLOKÉR OBJEKT VIA NAVN">
<text name="message">
Blokér et objekt:
</text>
<line_editor name="object_name">
Objekt navn
</line_editor>
<text name="note">
* Blokérer kun tekst fra objekt, ikke lyde
</text>
<button label="OK" name="OK"/>
<button label="Annullér" name="Cancel"/>
</floater>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="mute by name" title="BLOKÉR OBJEKT VIA NAVN">
<text name="message">
Blokér et objekt:
</text>
<line_editor name="object_name">
Objekt navn
</line_editor>
<text name="note">
* Blokérer kun tekst fra objekt, ikke lyde
</text>
<button label="OK" name="OK"/>
<button label="Annullér" name="Cancel"/>
</floater>

View File

@ -1,103 +1,103 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_report_abuse" title="RAPPORTÉR MISBRUG">
<floater.string name="Screenshot">
Screenshot
</floater.string>
<check_box label="Inkludér billede" name="screen_check"/>
<text name="reporter_title">
Anmelder:
</text>
<text name="reporter_field">
Loremipsum Dolorsitamut Longnamez
</text>
<text name="sim_title">
Region:
</text>
<text name="sim_field">
Region navn
</text>
<text name="pos_title">
Position:
</text>
<text name="pos_field">
{128.1, 128.1, 15.4}
</text>
<text name="select_object_label">
Klik på knappen derefter objektet:
</text>
<button label="" label_selected="" name="pick_btn" tool_tip="Objekt vælger - Identificér et objekt denne rapport omhandler"/>
<text name="object_name_label">
Navn:
</text>
<text left_delta="64" name="object_name" width="140">
Consetetur Sadipscing
</text>
<text name="owner_name_label">
Ejer:
</text>
<text left_delta="64" name="owner_name">
Hendrerit Vulputate Kamawashi Longname
</text>
<combo_box name="category_combo" tool_tip="Kategori -- Vælg en kategori der passer bedst på denne rapport">
<combo_box.item label="Vælg kategori" name="Select_category"/>
<combo_box.item label="Alder &gt; Falsk alder" name="Age__Age_play"/>
<combo_box.item label="Alder &gt; Voksen beboer på Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
<combo_box.item label="Alder &gt; Mindreårig beboer udenfor Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
<combo_box.item label="Overfald &gt; Kamp sandkasse / Usikkert område" name="Assault__Combat_sandbox___unsafe_area"/>
<combo_box.item label="Overfald &gt; Sikkert område" name="Assault__Safe_area"/>
<combo_box.item label="Overfald &gt; Sandkasse til våbentest" name="Assault__Weapons_testing_sandbox"/>
<combo_box.item label="Handel &gt; Vare eller ydelse ikke leveret" name="Commerce__Failure_to_deliver_product_or_service"/>
<combo_box.item label="Offentliggørelse &gt; Om oplysninger i den virkelige verden" name="Disclosure__Real_world_information"/>
<combo_box.item label="Offentliggørelse &gt; Fjernaflytning af chat" name="Disclosure__Remotely_monitoring chat"/>
<combo_box.item label="Offentliggørelse &gt; Information/chat/IM fra Second Life" name="Disclosure__Second_Life_information_chat_IMs"/>
<combo_box.item label="Forstyrrelse af fred &gt; Unfair brug af region ressourcer" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
<combo_box.item label="Forstyrrelse af fred &gt; Overdreven brug af objekter med script" name="Disturbing_the_peace__Excessive_scripted_objects"/>
<combo_box.item label="Forstyrrelse af fred &gt; Object affald" name="Disturbing_the_peace__Object_littering"/>
<combo_box.item label="Forstyrring af fred &gt; Gentagen spam" name="Disturbing_the_peace__Repetitive_spam"/>
<combo_box.item label="Forstyrrelse af fred &gt; Uønsket reklame spam" name="Disturbing_the_peace__Unwanted_advert_spam"/>
<combo_box.item label="Bedrageri &gt; L$" name="Fraud__L$"/>
<combo_box.item label="Bedrageri &gt; Land" name="Fraud__Land"/>
<combo_box.item label="Bedrageri &gt; Pyramide spil eller kædebreve" name="Fraud__Pyramid_scheme_or_chain_letter"/>
<combo_box.item label="Bedrageri &gt; US$" name="Fraud__US$"/>
<combo_box.item label="Chikane &gt; reklame farm / billedeligt spam" name="Harassment__Advert_farms___visual_spam"/>
<combo_box.item label="Chikane &gt; Injurier/bagvask enkeltpersoner eller grupper" name="Harassment__Defaming_individuals_or_groups"/>
<combo_box.item label="Chikane &gt; Hindre bevægelse" name="Harassment__Impeding_movement"/>
<combo_box.item label="Chikane &gt; Sex chikane" name="Harassment__Sexual_harassment"/>
<combo_box.item label="Chikane &gt; Opfordrer/kræver at andre overtræder licensbetingelser" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
<combo_box.item label="Chikane &gt; Verbalt chikane" name="Harassment__Verbal_abuse"/>
<combo_box.item label="Uanstændighed &gt; Meget stødende indhold eller adfærd" name="Indecency__Broadly_offensive_content_or_conduct"/>
<combo_box.item label="Uanstændighed &gt; Upassende avatar navn" name="Indecency__Inappropriate_avatar_name"/>
<combo_box.item label="Usømmelighed &gt; Upassende inhold eller opførsel i en &apos;PG&apos; region" name="Indecency__Mature_content_in_PG_region"/>
<combo_box.item label="Usømmelighed &gt; Upassende inhold eller opførsel i en &apos;Mature&apos; region" name="Indecency__Inappropriate_content_in_Mature_region"/>
<combo_box.item label="Krænkelse af intellektuelle ejendomsrettigheder &gt; Indholds fjernelse" name="Intellectual_property_infringement_Content_Removal"/>
<combo_box.item label="Krænkelse af intellektuelle ejendomsrettigheder &gt; CopyBot eller omgåelse af rettighedsbeskyttelse" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
<combo_box.item label="Intolerance" name="Intolerance"/>
<combo_box.item label="Land &gt; Misbrug af sandkasse resourcer" name="Land__Abuse_of_sandbox_resources"/>
<combo_box.item label="Land &gt; Overgreb &gt; Objekter/teksturer" name="Land__Encroachment__Objects_textures"/>
<combo_box.item label="Land &gt; Overgreb &gt; Partikler" name="Land__Encroachment__Particles"/>
<combo_box.item label="Land &gt; Overgreb &gt; Træer/planter" name="Land__Encroachment__Trees_plants"/>
<combo_box.item label="Væddemål/gambling" name="Wagering_gambling"/>
<combo_box.item label="Andet" name="Other"/>
</combo_box>
<text name="abuser_name_title">
Udøvers navn:
</text>
<button label="Vælg beboer" label_selected="" name="select_abuser" tool_tip="Vælg navnet på udøveren fra denne liste"/>
<text name="abuser_name_title2">
Sted for misbrug/overgreb:
</text>
<text name="sum_title">
Opsummering:
</text>
<text name="dscr_title">
Detaljer:
</text>
<text name="bug_aviso">
Vær venligst så præcis som muligt
</text>
<text name="incomplete_title">
* Note: Ufuldstændige rapporter vil ikke blive undersøgt.
</text>
<button label="Rapporter misbrug" label_selected="Rapporter misbrug" name="send_btn"/>
<button label="Annullér" label_selected="Annullér" name="cancel_btn"/>
</floater>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_report_abuse" title="RAPPORTÉR MISBRUG">
<floater.string name="Screenshot">
Screenshot
</floater.string>
<check_box label="Inkludér billede" name="screen_check"/>
<text name="reporter_title">
Anmelder:
</text>
<text name="reporter_field">
Loremipsum Dolorsitamut Longnamez
</text>
<text name="sim_title">
Region:
</text>
<text name="sim_field">
Region navn
</text>
<text name="pos_title">
Position:
</text>
<text name="pos_field">
{128.1, 128.1, 15.4}
</text>
<text name="select_object_label">
Klik på knappen derefter objektet:
</text>
<button label="" label_selected="" name="pick_btn" tool_tip="Objekt vælger - Identificér et objekt denne rapport omhandler"/>
<text name="object_name_label">
Navn:
</text>
<text left_delta="64" name="object_name" width="140">
Consetetur Sadipscing
</text>
<text name="owner_name_label">
Ejer:
</text>
<text left_delta="64" name="owner_name">
Hendrerit Vulputate Kamawashi Longname
</text>
<combo_box name="category_combo" tool_tip="Kategori -- Vælg en kategori der passer bedst på denne rapport">
<combo_box.item label="Vælg kategori" name="Select_category"/>
<combo_box.item label="Alder &gt; Falsk alder" name="Age__Age_play"/>
<combo_box.item label="Alder &gt; Voksen beboer på Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
<combo_box.item label="Alder &gt; Mindreårig beboer udenfor Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
<combo_box.item label="Overfald &gt; Kamp sandkasse / Usikkert område" name="Assault__Combat_sandbox___unsafe_area"/>
<combo_box.item label="Overfald &gt; Sikkert område" name="Assault__Safe_area"/>
<combo_box.item label="Overfald &gt; Sandkasse til våbentest" name="Assault__Weapons_testing_sandbox"/>
<combo_box.item label="Handel &gt; Vare eller ydelse ikke leveret" name="Commerce__Failure_to_deliver_product_or_service"/>
<combo_box.item label="Offentliggørelse &gt; Om oplysninger i den virkelige verden" name="Disclosure__Real_world_information"/>
<combo_box.item label="Offentliggørelse &gt; Fjernaflytning af chat" name="Disclosure__Remotely_monitoring chat"/>
<combo_box.item label="Offentliggørelse &gt; Information/chat/IM fra Second Life" name="Disclosure__Second_Life_information_chat_IMs"/>
<combo_box.item label="Forstyrrelse af fred &gt; Unfair brug af region ressourcer" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
<combo_box.item label="Forstyrrelse af fred &gt; Overdreven brug af objekter med script" name="Disturbing_the_peace__Excessive_scripted_objects"/>
<combo_box.item label="Forstyrrelse af fred &gt; Object affald" name="Disturbing_the_peace__Object_littering"/>
<combo_box.item label="Forstyrring af fred &gt; Gentagen spam" name="Disturbing_the_peace__Repetitive_spam"/>
<combo_box.item label="Forstyrrelse af fred &gt; Uønsket reklame spam" name="Disturbing_the_peace__Unwanted_advert_spam"/>
<combo_box.item label="Bedrageri &gt; L$" name="Fraud__L$"/>
<combo_box.item label="Bedrageri &gt; Land" name="Fraud__Land"/>
<combo_box.item label="Bedrageri &gt; Pyramide spil eller kædebreve" name="Fraud__Pyramid_scheme_or_chain_letter"/>
<combo_box.item label="Bedrageri &gt; US$" name="Fraud__US$"/>
<combo_box.item label="Chikane &gt; reklame farm / billedeligt spam" name="Harassment__Advert_farms___visual_spam"/>
<combo_box.item label="Chikane &gt; Injurier/bagvask enkeltpersoner eller grupper" name="Harassment__Defaming_individuals_or_groups"/>
<combo_box.item label="Chikane &gt; Hindre bevægelse" name="Harassment__Impeding_movement"/>
<combo_box.item label="Chikane &gt; Sex chikane" name="Harassment__Sexual_harassment"/>
<combo_box.item label="Chikane &gt; Opfordrer/kræver at andre overtræder licensbetingelser" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
<combo_box.item label="Chikane &gt; Verbalt chikane" name="Harassment__Verbal_abuse"/>
<combo_box.item label="Uanstændighed &gt; Meget stødende indhold eller adfærd" name="Indecency__Broadly_offensive_content_or_conduct"/>
<combo_box.item label="Uanstændighed &gt; Upassende avatar navn" name="Indecency__Inappropriate_avatar_name"/>
<combo_box.item label="Usømmelighed &gt; Upassende inhold eller opførsel i en &apos;PG&apos; region" name="Indecency__Mature_content_in_PG_region"/>
<combo_box.item label="Usømmelighed &gt; Upassende inhold eller opførsel i en &apos;Mature&apos; region" name="Indecency__Inappropriate_content_in_Mature_region"/>
<combo_box.item label="Krænkelse af intellektuelle ejendomsrettigheder &gt; Indholds fjernelse" name="Intellectual_property_infringement_Content_Removal"/>
<combo_box.item label="Krænkelse af intellektuelle ejendomsrettigheder &gt; CopyBot eller omgåelse af rettighedsbeskyttelse" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
<combo_box.item label="Intolerance" name="Intolerance"/>
<combo_box.item label="Land &gt; Misbrug af sandkasse resourcer" name="Land__Abuse_of_sandbox_resources"/>
<combo_box.item label="Land &gt; Overgreb &gt; Objekter/teksturer" name="Land__Encroachment__Objects_textures"/>
<combo_box.item label="Land &gt; Overgreb &gt; Partikler" name="Land__Encroachment__Particles"/>
<combo_box.item label="Land &gt; Overgreb &gt; Træer/planter" name="Land__Encroachment__Trees_plants"/>
<combo_box.item label="Væddemål/gambling" name="Wagering_gambling"/>
<combo_box.item label="Andet" name="Other"/>
</combo_box>
<text name="abuser_name_title">
Udøvers navn:
</text>
<button label="Vælg beboer" label_selected="" name="select_abuser" tool_tip="Vælg navnet på udøveren fra denne liste"/>
<text name="abuser_name_title2">
Sted for misbrug/overgreb:
</text>
<text name="sum_title">
Opsummering:
</text>
<text name="dscr_title">
Detaljer:
</text>
<text name="bug_aviso">
Vær venligst så præcis som muligt
</text>
<text name="incomplete_title">
* Note: Ufuldstændige rapporter vil ikke blive undersøgt.
</text>
<button label="Rapporter misbrug" label_selected="Rapporter misbrug" name="send_btn"/>
<button label="Annullér" label_selected="Annullér" name="cancel_btn"/>
</floater>

View File

@ -1,71 +1,71 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Statistics" title="STATISTIK">
<scroll_container name="statistics_scroll">
<container_view name="statistics_view">
<stat_view label="Grundlæggende" name="basic">
<stat_bar label="FPS" name="fps"/>
<stat_bar label="Båndbredde" name="bandwidth"/>
<stat_bar label="Pakketab" name="packet_loss"/>
<stat_bar label="Ping Sim" name="ping"/>
</stat_view>
<stat_view label="Avanceret" name="advanced">
<stat_view label="Render" name="render">
<stat_bar label="KTris tegnet" name="ktrisframe"/>
<stat_bar label="KTris tegnet" name="ktrissec"/>
<stat_bar label="Total antal objekter" name="objs"/>
<stat_bar label="Nye objekter" name="newobjs"/>
</stat_view>
<stat_view label="Texture" name="texture">
<stat_bar label="Count" name="numimagesstat"/>
<stat_bar label="Raw Count" name="numrawimagesstat"/>
<stat_bar label="GL Mem" name="gltexmemstat"/>
<stat_bar label="Formatted Mem" name="formattedmemstat"/>
<stat_bar label="Raw Mem" name="rawmemstat"/>
<stat_bar label="Bound Mem" name="glboundmemstat"/>
</stat_view>
<stat_view label="Netværk" name="network">
<stat_bar label="Packets In" name="packetsinstat"/>
<stat_bar label="Packets Out" name="packetsoutstat"/>
<stat_bar label="Objekter" name="objectkbitstat"/>
<stat_bar label="Texture" name="texturekbitstat"/>
<stat_bar label="Asset" name="assetkbitstat"/>
<stat_bar label="Layers" name="layerskbitstat"/>
<stat_bar label="Actual In" name="actualinkbitstat"/>
<stat_bar label="Actual Out" name="actualoutkbitstat"/>
<stat_bar label="VFS Pending Ops" name="vfspendingoperations"/>
</stat_view>
</stat_view>
<stat_view label="Simulator" name="sim">
<stat_bar label="Time Dilation" name="simtimedilation"/>
<stat_bar label="Sim FPS" name="simfps"/>
<stat_bar label="Physics FPS" name="simphysicsfps"/>
<stat_view label="Physics Details" name="physicsdetail">
<stat_bar label="Pinned Objects" name="physicspinnedtasks"/>
<stat_bar label="Low LOD Objects" name="physicslodtasks"/>
<stat_bar label="Memory Allocated" name="physicsmemoryallocated"/>
<stat_bar label="Agent Updates/Sec" name="simagentups"/>
<stat_bar label="Main Agents" name="simmainagents"/>
<stat_bar label="Child Agents" name="simchildagents"/>
<stat_bar label="Objects" name="simobjects"/>
<stat_bar label="Active Objects" name="simactiveobjects"/>
<stat_bar label="Active Scripts" name="simactivescripts"/>
<stat_bar label="Script Events" name="simscripteps"/>
<stat_bar label="Packets In" name="siminpps"/>
<stat_bar label="Packets Out" name="simoutpps"/>
<stat_bar label="Pending Downloads" name="simpendingdownloads"/>
<stat_bar label="Pending Uploads" name="simpendinguploads"/>
<stat_bar label="Total Unacked Bytes" name="simtotalunackedbytes"/>
</stat_view>
<stat_view label="Time (ms)" name="simperf">
<stat_bar label="Total Frame Time" name="simframemsec"/>
<stat_bar label="Net Time" name="simnetmsec"/>
<stat_bar label="Physics Time" name="simsimphysicsmsec"/>
<stat_bar label="Simulation Time" name="simsimothermsec"/>
<stat_bar label="Agent Time" name="simagentmsec"/>
<stat_bar label="Images Time" name="simimagesmsec"/>
<stat_bar label="Script Time" name="simscriptmsec"/>
</stat_view>
</stat_view>
</container_view>
</scroll_container>
</floater>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Statistics" title="STATISTIK">
<scroll_container name="statistics_scroll">
<container_view name="statistics_view">
<stat_view label="Grundlæggende" name="basic">
<stat_bar label="FPS" name="fps"/>
<stat_bar label="Båndbredde" name="bandwidth"/>
<stat_bar label="Pakketab" name="packet_loss"/>
<stat_bar label="Ping Sim" name="ping"/>
</stat_view>
<stat_view label="Avanceret" name="advanced">
<stat_view label="Render" name="render">
<stat_bar label="KTris tegnet" name="ktrisframe"/>
<stat_bar label="KTris tegnet" name="ktrissec"/>
<stat_bar label="Total antal objekter" name="objs"/>
<stat_bar label="Nye objekter" name="newobjs"/>
</stat_view>
<stat_view label="Texture" name="texture">
<stat_bar label="Count" name="numimagesstat"/>
<stat_bar label="Raw Count" name="numrawimagesstat"/>
<stat_bar label="GL Mem" name="gltexmemstat"/>
<stat_bar label="Formatted Mem" name="formattedmemstat"/>
<stat_bar label="Raw Mem" name="rawmemstat"/>
<stat_bar label="Bound Mem" name="glboundmemstat"/>
</stat_view>
<stat_view label="Netværk" name="network">
<stat_bar label="Packets In" name="packetsinstat"/>
<stat_bar label="Packets Out" name="packetsoutstat"/>
<stat_bar label="Objekter" name="objectkbitstat"/>
<stat_bar label="Texture" name="texturekbitstat"/>
<stat_bar label="Asset" name="assetkbitstat"/>
<stat_bar label="Layers" name="layerskbitstat"/>
<stat_bar label="Actual In" name="actualinkbitstat"/>
<stat_bar label="Actual Out" name="actualoutkbitstat"/>
<stat_bar label="VFS Pending Ops" name="vfspendingoperations"/>
</stat_view>
</stat_view>
<stat_view label="Simulator" name="sim">
<stat_bar label="Time Dilation" name="simtimedilation"/>
<stat_bar label="Sim FPS" name="simfps"/>
<stat_bar label="Physics FPS" name="simphysicsfps"/>
<stat_view label="Physics Details" name="physicsdetail">
<stat_bar label="Pinned Objects" name="physicspinnedtasks"/>
<stat_bar label="Low LOD Objects" name="physicslodtasks"/>
<stat_bar label="Memory Allocated" name="physicsmemoryallocated"/>
<stat_bar label="Agent Updates/Sec" name="simagentups"/>
<stat_bar label="Main Agents" name="simmainagents"/>
<stat_bar label="Child Agents" name="simchildagents"/>
<stat_bar label="Objects" name="simobjects"/>
<stat_bar label="Active Objects" name="simactiveobjects"/>
<stat_bar label="Active Scripts" name="simactivescripts"/>
<stat_bar label="Script Events" name="simscripteps"/>
<stat_bar label="Packets In" name="siminpps"/>
<stat_bar label="Packets Out" name="simoutpps"/>
<stat_bar label="Pending Downloads" name="simpendingdownloads"/>
<stat_bar label="Pending Uploads" name="simpendinguploads"/>
<stat_bar label="Total Unacked Bytes" name="simtotalunackedbytes"/>
</stat_view>
<stat_view label="Time (ms)" name="simperf">
<stat_bar label="Total Frame Time" name="simframemsec"/>
<stat_bar label="Net Time" name="simnetmsec"/>
<stat_bar label="Physics Time" name="simsimphysicsmsec"/>
<stat_bar label="Simulation Time" name="simsimothermsec"/>
<stat_bar label="Agent Time" name="simagentmsec"/>
<stat_bar label="Images Time" name="simimagesmsec"/>
<stat_bar label="Script Time" name="simscriptmsec"/>
</stat_view>
</stat_view>
</container_view>
</scroll_container>
</floater>

View File

@ -1,82 +1,82 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
<menu_item_call label="Køb" name="Task Buy"/>
<menu_item_call label="åben" name="Task Open"/>
<menu_item_call label="Afspil" name="Task Play"/>
<menu_item_call label="Egenskaber" name="Task Properties"/>
<menu_item_call label="Omdøb" name="Task Rename"/>
<menu_item_call label="Slet" name="Task Remove"/>
<menu_item_call label="Tøm papirkurv" name="Empty Trash"/>
<menu_item_call label="Tøm &apos;Lost and found&apos;" name="Empty Lost And Found"/>
<menu_item_call label="Ny mappe" name="New Folder"/>
<menu_item_call label="Nyt script" name="New Script"/>
<menu_item_call label="Ny note" name="New Note"/>
<menu_item_call label="Ny bevægelse" name="New Gesture"/>
<menu label="Nyt tøj" name="New Clothes">
<menu_item_call label="Ny trøje" name="New Shirt"/>
<menu_item_call label="Nye bukser" name="New Pants"/>
<menu_item_call label="Nye sko" name="New Shoes"/>
<menu_item_call label="Nye strømper" name="New Socks"/>
<menu_item_call label="Ny jakke" name="New Jacket"/>
<menu_item_call label="Ny nederdel" name="New Skirt"/>
<menu_item_call label="Nye handsker" name="New Gloves"/>
<menu_item_call label="Ny undertrøje" name="New Undershirt"/>
<menu_item_call label="Nye underbukser" name="New Underpants"/>
<menu_item_call label="Nyt alpha lag" name="New Alpha Mask"/>
<menu_item_call label="Ny tatovering" name="New Tattoo"/>
</menu>
<menu label="Nye kropsdele" name="New Body Parts">
<menu_item_call label="Ny figur" name="New Shape"/>
<menu_item_call label="Nyt hud" name="New Skin"/>
<menu_item_call label="Nyt hår" name="New Hair"/>
<menu_item_call label="Nye øjne" name="New Eyes"/>
</menu>
<menu label="Ændre type" name="Change Type">
<menu_item_call label="Standard" name="Default"/>
<menu_item_call label="Handsker" name="Gloves"/>
<menu_item_call label="Jakke" name="Jacket"/>
<menu_item_call label="Bukser" name="Pants"/>
<menu_item_call label="Kropsbygning" name="Shape"/>
<menu_item_call label="Sko" name="Shoes"/>
<menu_item_call label="Trøje" name="Shirt"/>
<menu_item_call label="Nederdel" name="Skirt"/>
<menu_item_call label="Underbukser" name="Underpants"/>
<menu_item_call label="Undertrøje" name="Undershirt"/>
</menu>
<menu_item_call label="Teleport" name="Landmark Open"/>
<menu_item_call label="åben" name="Animation Open"/>
<menu_item_call label="åben" name="Sound Open"/>
<menu_item_call label="Slet ting" name="Purge Item"/>
<menu_item_call label="Genskab ting" name="Restore Item"/>
<menu_item_call label="Gå til link" name="Goto Link"/>
<menu_item_call label="åben" name="Open"/>
<menu_item_call label="Egenskaber" name="Properties"/>
<menu_item_call label="Omdøb" name="Rename"/>
<menu_item_call label="Kopiér asset UUID" name="Copy Asset UUID"/>
<menu_item_call label="Kopiér" name="Copy"/>
<menu_item_call label="Indsæt" name="Paste"/>
<menu_item_call label="Sæt ind som link" name="Paste As Link"/>
<menu_item_call label="Slet" name="Delete"/>
<menu_item_call label="Tag ting af" name="Take Off Items"/>
<menu_item_call label="Tilføj til påklædning" name="Add To Outfit"/>
<menu_item_call label="Erstat påklædning" name="Replace Outfit"/>
<menu_item_call label="start konference chat" name="Conference Chat Folder"/>
<menu_item_call label="Afspil" name="Sound Play"/>
<menu_item_call label="Om landemærke" name="About Landmark"/>
<menu_item_call label="Afspil offentligt" name="Animation Play"/>
<menu_item_call label="Afspil lokalt" name="Animation Audition"/>
<menu_item_call label="Send privat besked (IM)" name="Send Instant Message"/>
<menu_item_call label="Tilbyd teleport..." name="Offer Teleport..."/>
<menu_item_call label="start konference Chat" name="Conference Chat"/>
<menu_item_call label="Aktivér" name="Activate"/>
<menu_item_call label="Deaktivér" name="Deactivate"/>
<menu_item_call label="Gem som" name="Save As"/>
<menu_item_call label="Tag af dig selv" name="Detach From Yourself"/>
<menu_item_call label="Tag på" name="Object Wear"/>
<menu label="Vedhæft" name="Attach To"/>
<menu label="Vedhæft til HUD" name="Attach To HUD"/>
<menu_item_call label="Redigér" name="Wearable Edit"/>
<menu_item_call label="Tag på" name="Wearable Wear"/>
<menu_item_call label="Tag af" name="Take Off"/>
<menu_item_call label="--ingen valg--" name="--no options--"/>
</menu>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
<menu_item_call label="Køb" name="Task Buy"/>
<menu_item_call label="åben" name="Task Open"/>
<menu_item_call label="Afspil" name="Task Play"/>
<menu_item_call label="Egenskaber" name="Task Properties"/>
<menu_item_call label="Omdøb" name="Task Rename"/>
<menu_item_call label="Slet" name="Task Remove"/>
<menu_item_call label="Tøm papirkurv" name="Empty Trash"/>
<menu_item_call label="Tøm &apos;Lost and found&apos;" name="Empty Lost And Found"/>
<menu_item_call label="Ny mappe" name="New Folder"/>
<menu_item_call label="Nyt script" name="New Script"/>
<menu_item_call label="Ny note" name="New Note"/>
<menu_item_call label="Ny bevægelse" name="New Gesture"/>
<menu label="Nyt tøj" name="New Clothes">
<menu_item_call label="Ny trøje" name="New Shirt"/>
<menu_item_call label="Nye bukser" name="New Pants"/>
<menu_item_call label="Nye sko" name="New Shoes"/>
<menu_item_call label="Nye strømper" name="New Socks"/>
<menu_item_call label="Ny jakke" name="New Jacket"/>
<menu_item_call label="Ny nederdel" name="New Skirt"/>
<menu_item_call label="Nye handsker" name="New Gloves"/>
<menu_item_call label="Ny undertrøje" name="New Undershirt"/>
<menu_item_call label="Nye underbukser" name="New Underpants"/>
<menu_item_call label="Nyt alpha lag" name="New Alpha Mask"/>
<menu_item_call label="Ny tatovering" name="New Tattoo"/>
</menu>
<menu label="Nye kropsdele" name="New Body Parts">
<menu_item_call label="Ny figur" name="New Shape"/>
<menu_item_call label="Nyt hud" name="New Skin"/>
<menu_item_call label="Nyt hår" name="New Hair"/>
<menu_item_call label="Nye øjne" name="New Eyes"/>
</menu>
<menu label="Ændre type" name="Change Type">
<menu_item_call label="Standard" name="Default"/>
<menu_item_call label="Handsker" name="Gloves"/>
<menu_item_call label="Jakke" name="Jacket"/>
<menu_item_call label="Bukser" name="Pants"/>
<menu_item_call label="Kropsbygning" name="Shape"/>
<menu_item_call label="Sko" name="Shoes"/>
<menu_item_call label="Trøje" name="Shirt"/>
<menu_item_call label="Nederdel" name="Skirt"/>
<menu_item_call label="Underbukser" name="Underpants"/>
<menu_item_call label="Undertrøje" name="Undershirt"/>
</menu>
<menu_item_call label="Teleport" name="Landmark Open"/>
<menu_item_call label="åben" name="Animation Open"/>
<menu_item_call label="åben" name="Sound Open"/>
<menu_item_call label="Slet ting" name="Purge Item"/>
<menu_item_call label="Genskab ting" name="Restore Item"/>
<menu_item_call label="Gå til link" name="Goto Link"/>
<menu_item_call label="åben" name="Open"/>
<menu_item_call label="Egenskaber" name="Properties"/>
<menu_item_call label="Omdøb" name="Rename"/>
<menu_item_call label="Kopiér asset UUID" name="Copy Asset UUID"/>
<menu_item_call label="Kopiér" name="Copy"/>
<menu_item_call label="Indsæt" name="Paste"/>
<menu_item_call label="Sæt ind som link" name="Paste As Link"/>
<menu_item_call label="Slet" name="Delete"/>
<menu_item_call label="Tag ting af" name="Take Off Items"/>
<menu_item_call label="Tilføj til påklædning" name="Add To Outfit"/>
<menu_item_call label="Erstat påklædning" name="Replace Outfit"/>
<menu_item_call label="start konference chat" name="Conference Chat Folder"/>
<menu_item_call label="Afspil" name="Sound Play"/>
<menu_item_call label="Om landemærke" name="About Landmark"/>
<menu_item_call label="Afspil offentligt" name="Animation Play"/>
<menu_item_call label="Afspil lokalt" name="Animation Audition"/>
<menu_item_call label="Send privat besked (IM)" name="Send Instant Message"/>
<menu_item_call label="Tilbyd teleport..." name="Offer Teleport..."/>
<menu_item_call label="start konference Chat" name="Conference Chat"/>
<menu_item_call label="Aktivér" name="Activate"/>
<menu_item_call label="Deaktivér" name="Deactivate"/>
<menu_item_call label="Gem som" name="Save As"/>
<menu_item_call label="Tag af dig selv" name="Detach From Yourself"/>
<menu_item_call label="Tag på" name="Object Wear"/>
<menu label="Vedhæft" name="Attach To"/>
<menu label="Vedhæft til HUD" name="Attach To HUD"/>
<menu_item_call label="Redigér" name="Wearable Edit"/>
<menu_item_call label="Tag på" name="Wearable Wear"/>
<menu_item_call label="Tag af" name="Take Off"/>
<menu_item_call label="--ingen valg--" name="--no options--"/>
</menu>

View File

@ -1,32 +1,32 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_inventory_add">
<menu label="Hent" name="upload">
<menu_item_call label="Billede (L$[COST])..." name="Upload Image"/>
<menu_item_call label="Lyd (L$[COST])..." name="Upload Sound"/>
<menu_item_call label="Animation (L$[COST])..." name="Upload Animation"/>
<menu_item_call label="Hent mange (L$[COST] pr. fil)..." name="Bulk Upload"/>
</menu>
<menu_item_call label="Ny mappe" name="New Folder"/>
<menu_item_call label="Nyt script" name="New Script"/>
<menu_item_call label="Ny note" name="New Note"/>
<menu_item_call label="Ny bevægelse" name="New Gesture"/>
<menu label="Nyt tøj" name="New Clothes">
<menu_item_call label="Ny trøje" name="New Shirt"/>
<menu_item_call label="Nye bukser" name="New Pants"/>
<menu_item_call label="Nye sko" name="New Shoes"/>
<menu_item_call label="Nye strømper" name="New Socks"/>
<menu_item_call label="Ny jakke" name="New Jacket"/>
<menu_item_call label="Ny nederdel" name="New Skirt"/>
<menu_item_call label="Nye handsker" name="New Gloves"/>
<menu_item_call label="Ny undertrøje" name="New Undershirt"/>
<menu_item_call label="Nye underbukser" name="New Underpants"/>
<menu_item_call label="Nyt alpha lag" name="New Alpha"/>
<menu_item_call label="Ny tatovering" name="New Tattoo"/>
</menu>
<menu label="Nye kropsdele" name="New Body Parts">
<menu_item_call label="Ny kropsbygning" name="New Shape"/>
<menu_item_call label="Ny hud" name="New Skin"/>
<menu_item_call label="Nyt hår" name="New Hair"/>
<menu_item_call label="Nye øjne" name="New Eyes"/>
</menu>
</menu>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_inventory_add">
<menu label="Hent" name="upload">
<menu_item_call label="Billede (L$[COST])..." name="Upload Image"/>
<menu_item_call label="Lyd (L$[COST])..." name="Upload Sound"/>
<menu_item_call label="Animation (L$[COST])..." name="Upload Animation"/>
<menu_item_call label="Hent mange (L$[COST] pr. fil)..." name="Bulk Upload"/>
</menu>
<menu_item_call label="Ny mappe" name="New Folder"/>
<menu_item_call label="Nyt script" name="New Script"/>
<menu_item_call label="Ny note" name="New Note"/>
<menu_item_call label="Ny bevægelse" name="New Gesture"/>
<menu label="Nyt tøj" name="New Clothes">
<menu_item_call label="Ny trøje" name="New Shirt"/>
<menu_item_call label="Nye bukser" name="New Pants"/>
<menu_item_call label="Nye sko" name="New Shoes"/>
<menu_item_call label="Nye strømper" name="New Socks"/>
<menu_item_call label="Ny jakke" name="New Jacket"/>
<menu_item_call label="Ny nederdel" name="New Skirt"/>
<menu_item_call label="Nye handsker" name="New Gloves"/>
<menu_item_call label="Ny undertrøje" name="New Undershirt"/>
<menu_item_call label="Nye underbukser" name="New Underpants"/>
<menu_item_call label="Nyt alpha lag" name="New Alpha"/>
<menu_item_call label="Ny tatovering" name="New Tattoo"/>
</menu>
<menu label="Nye kropsdele" name="New Body Parts">
<menu_item_call label="Ny kropsbygning" name="New Shape"/>
<menu_item_call label="Ny hud" name="New Skin"/>
<menu_item_call label="Nyt hår" name="New Hair"/>
<menu_item_call label="Nye øjne" name="New Eyes"/>
</menu>
</menu>

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Picks">
<menu_item_call label="Info" name="pick_info"/>
<menu_item_call label="Redigér" name="pick_edit"/>
<menu_item_call label="Teleportér" name="pick_teleport"/>
<menu_item_call label="Vis på kort" name="pick_map"/>
<menu_item_call label="Slet" name="pick_delete"/>
</context_menu>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Picks">
<menu_item_call label="Info" name="pick_info"/>
<menu_item_call label="Redigér" name="pick_edit"/>
<menu_item_call label="Teleportér" name="pick_teleport"/>
<menu_item_call label="Vis på kort" name="pick_map"/>
<menu_item_call label="Slet" name="pick_delete"/>
</context_menu>

View File

@ -1,18 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_ladmark_gear">
<menu_item_call label="Teleportér" name="teleport"/>
<menu_item_call label="Mere information" name="more_info"/>
<menu_item_call label="Vis på kort" name="show_on_map"/>
<menu_item_call label="Tilføj landemærke" name="add_landmark"/>
<menu_item_call label="Tilføj mappe" name="add_folder"/>
<menu_item_call label="Klip" name="cut"/>
<menu_item_call label="Kopiér landemærke" name="copy_landmark"/>
<menu_item_call label="Kopiér SLurl" name="copy_slurl"/>
<menu_item_call label="Sæt ind" name="paste"/>
<menu_item_call label="Omdøb" name="rename"/>
<menu_item_call label="Slet" name="delete"/>
<menu_item_call label="Åben alle mapper" name="expand_all"/>
<menu_item_call label="Luk alle mapper" name="collapse_all"/>
<menu_item_check label="Sortér efter dato" name="sort_by_date"/>
<menu_item_call label="Opret favorit" name="create_pick"/>
</menu>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_ladmark_gear">
<menu_item_call label="Teleportér" name="teleport"/>
<menu_item_call label="Mere information" name="more_info"/>
<menu_item_call label="Vis på kort" name="show_on_map"/>
<menu_item_call label="Tilføj landemærke" name="add_landmark"/>
<menu_item_call label="Tilføj mappe" name="add_folder"/>
<menu_item_call label="Klip" name="cut"/>
<menu_item_call label="Kopiér landemærke" name="copy_landmark"/>
<menu_item_call label="Kopiér SLurl" name="copy_slurl"/>
<menu_item_call label="Sæt ind" name="paste"/>
<menu_item_call label="Omdøb" name="rename"/>
<menu_item_call label="Slet" name="delete"/>
<menu_item_call label="Åben alle mapper" name="expand_all"/>
<menu_item_call label="Luk alle mapper" name="collapse_all"/>
<menu_item_check label="Sortér efter dato" name="sort_by_date"/>
<menu_item_call label="Opret favorit" name="create_pick"/>
</menu>

View File

@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="block_list_panel">
<text name="title_text">
Blokérede avatarer
</text>
<scroll_list name="blocked" tool_tip="Vis liste over blokerede avatarer"/>
<button label="Blokér beboer..." label_selected="Blokér beboer..." name="Block resident..." tool_tip="Vælg en beboer der skal blokeres"/>
<button label="Blokér objekt via navn..." label_selected="Blokér objekt via navn..." name="Block object by name..."/>
<button label="Fjern blokering" label_selected="Fjern blokering" name="Unblock" tool_tip="Fjern beboer fra liste med blokeringer"/>
</panel>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="block_list_panel">
<text name="title_text">
Blokérede avatarer
</text>
<scroll_list name="blocked" tool_tip="Vis liste over blokerede avatarer"/>
<button label="Blokér beboer..." label_selected="Blokér beboer..." name="Block resident..." tool_tip="Vælg en beboer der skal blokeres"/>
<button label="Blokér objekt via navn..." label_selected="Blokér objekt via navn..." name="Block object by name..."/>
<button label="Fjern blokering" label_selected="Fjern blokering" name="Unblock" tool_tip="Fjern beboer fra liste med blokeringer"/>
</panel>

View File

@ -1,121 +1,121 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Medlemmer &amp; roller" name="roles_tab">
<panel.string name="default_needs_apply_text">
Der er ændringer her, der ikke er gemt.
</panel.string>
<panel.string name="want_apply_text">
Vil du gemme disse ændringer?
</panel.string>
<tab_container name="roles_tab_container">
<panel label="MEDLEMMER" name="members_sub_tab" tool_tip="Medlemmer">
<panel.string name="help_text">
Du kan tilføje eller fjerne roller, der er tildelt medlemmerne.
Vælg flere medlemmer ved at holde Ctrl-tasten nede og
klik på deres navne.
</panel.string>
<filter_editor label="Filtrér medlemmer" name="filter_input"/>
<name_list name="member_list">
<name_list.columns label="Medlemsnavn" name="name"/>
<name_list.columns label="Doneret leje" name="donated"/>
<name_list.columns label="Sidst på den" name="online"/>
</name_list>
<button label="Invitér nyt medlem" name="member_invite"/>
<button label="Udmeld" name="member_eject"/>
</panel>
<panel label="ROLLER" name="roles_sub_tab">
<panel.string name="help_text">
Roller har en titel og en tilladelsesliste med rettigheder,
som medlemmerne kan bruge. Medlemmer kan høre til
en eller flere roller. En gruppe kan have op til 10 roller,
inkluderet alle- og ejerroller.
</panel.string>
<panel.string name="cant_delete_role">
&apos;Alle-&apos; og &apos;Ejerroller&apos; er specielle og kan ikke slettes.
</panel.string>
<panel.string name="power_folder_icon">
Inv_FolderClosed
</panel.string>
<filter_editor label="Filtrér roller" name="filter_input"/>
<scroll_list name="role_list">
<scroll_list.columns label="Rollenavn" name="name"/>
<scroll_list.columns label="Titel" name="title"/>
<scroll_list.columns label="Medlemmer" name="members"/>
</scroll_list>
<button label="Opret ny rolle" name="role_create"/>
<button label="Slet rolle" name="role_delete"/>
</panel>
<panel label="RETTIGHEDER" name="actions_sub_tab" tool_tip="Du kan se beskrivelse af rettighed og hvilke roller og medlemmer der har denne rettighed.">
<panel.string name="help_text">
Rettigheder giver medlemmer i roller mulighed for at gøre specifikke
ting i denne gruppe. Der er en bred vifte af rettigheder.
</panel.string>
<filter_editor label="Filtrér rettigheder" name="filter_input"/>
<scroll_list name="action_list" tool_tip="Vælg en rettighed for at se flere detaljer">
<scroll_list.columns label="" name="icon"/>
<scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
</tab_container>
<panel name="members_footer">
<text name="static">
Tildelte roller
</text>
<scroll_list name="member_assigned_roles">
<scroll_list.columns label="" name="checkbox"/>
<scroll_list.columns label="" name="role"/>
</scroll_list>
<text name="static2">
Tilladte rettigheder
</text>
<scroll_list name="member_allowed_actions" tool_tip="For detaljer om hver tilladte rettighed, se rettighedsfanebladet.">
<scroll_list.columns label="" name="icon"/>
<scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
<panel name="roles_footer">
<text name="static">
Navn
</text>
<line_editor name="role_name">
Ansatte
</line_editor>
<text name="static3">
Titel
</text>
<line_editor name="role_title">
(venter)
</line_editor>
<text name="static2">
Beskrivelse
</text>
<text_editor name="role_description">
(venter)
</text_editor>
<text name="static4">
Tildelte roller
</text>
<check_box label="Medlemmer er synlige" name="role_visible_in_list" tool_tip="Angiver om medlemmer med denne rolle er synlige i fanen &apos;Generelt&apos; for avatarer uden for gruppen."/>
<text name="static5" tool_tip="A list of Abilities the currently selected role can perform.">
Tilladte rettigheder
</text>
<scroll_list name="role_allowed_actions" tool_tip="For detaljer om hver rettighed se under rettigheder fanebladet.">
<scroll_list.columns label="" name="icon"/>
<scroll_list.columns label="" name="checkbox"/>
<scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
<panel name="actions_footer">
<text name="static">
Beskrivelse
</text>
<text_editor name="action_description">
Denne rettigheder &apos;Udmeld medlemmer fra denne gruppe&apos;. Kun en ejer kan udmelde en anden ejer.
</text_editor>
<text name="static2">
Roller med rettighed
</text>
<text name="static3">
Medlemmer med rettighed
</text>
</panel>
</panel>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Medlemmer &amp; roller" name="roles_tab">
<panel.string name="default_needs_apply_text">
Der er ændringer her, der ikke er gemt.
</panel.string>
<panel.string name="want_apply_text">
Vil du gemme disse ændringer?
</panel.string>
<tab_container name="roles_tab_container">
<panel label="MEDLEMMER" name="members_sub_tab" tool_tip="Medlemmer">
<panel.string name="help_text">
Du kan tilføje eller fjerne roller, der er tildelt medlemmerne.
Vælg flere medlemmer ved at holde Ctrl-tasten nede og
klik på deres navne.
</panel.string>
<filter_editor label="Filtrér medlemmer" name="filter_input"/>
<name_list name="member_list">
<name_list.columns label="Medlemsnavn" name="name"/>
<name_list.columns label="Doneret leje" name="donated"/>
<name_list.columns label="Sidst på den" name="online"/>
</name_list>
<button label="Invitér nyt medlem" name="member_invite"/>
<button label="Udmeld" name="member_eject"/>
</panel>
<panel label="ROLLER" name="roles_sub_tab">
<panel.string name="help_text">
Roller har en titel og en tilladelsesliste med rettigheder,
som medlemmerne kan bruge. Medlemmer kan høre til
en eller flere roller. En gruppe kan have op til 10 roller,
inkluderet alle- og ejerroller.
</panel.string>
<panel.string name="cant_delete_role">
&apos;Alle-&apos; og &apos;Ejerroller&apos; er specielle og kan ikke slettes.
</panel.string>
<panel.string name="power_folder_icon">
Inv_FolderClosed
</panel.string>
<filter_editor label="Filtrér roller" name="filter_input"/>
<scroll_list name="role_list">
<scroll_list.columns label="Rollenavn" name="name"/>
<scroll_list.columns label="Titel" name="title"/>
<scroll_list.columns label="Medlemmer" name="members"/>
</scroll_list>
<button label="Opret ny rolle" name="role_create"/>
<button label="Slet rolle" name="role_delete"/>
</panel>
<panel label="RETTIGHEDER" name="actions_sub_tab" tool_tip="Du kan se beskrivelse af rettighed og hvilke roller og medlemmer der har denne rettighed.">
<panel.string name="help_text">
Rettigheder giver medlemmer i roller mulighed for at gøre specifikke
ting i denne gruppe. Der er en bred vifte af rettigheder.
</panel.string>
<filter_editor label="Filtrér rettigheder" name="filter_input"/>
<scroll_list name="action_list" tool_tip="Vælg en rettighed for at se flere detaljer">
<scroll_list.columns label="" name="icon"/>
<scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
</tab_container>
<panel name="members_footer">
<text name="static">
Tildelte roller
</text>
<scroll_list name="member_assigned_roles">
<scroll_list.columns label="" name="checkbox"/>
<scroll_list.columns label="" name="role"/>
</scroll_list>
<text name="static2">
Tilladte rettigheder
</text>
<scroll_list name="member_allowed_actions" tool_tip="For detaljer om hver tilladte rettighed, se rettighedsfanebladet.">
<scroll_list.columns label="" name="icon"/>
<scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
<panel name="roles_footer">
<text name="static">
Navn
</text>
<line_editor name="role_name">
Ansatte
</line_editor>
<text name="static3">
Titel
</text>
<line_editor name="role_title">
(venter)
</line_editor>
<text name="static2">
Beskrivelse
</text>
<text_editor name="role_description">
(venter)
</text_editor>
<text name="static4">
Tildelte roller
</text>
<check_box label="Medlemmer er synlige" name="role_visible_in_list" tool_tip="Angiver om medlemmer med denne rolle er synlige i fanen &apos;Generelt&apos; for avatarer uden for gruppen."/>
<text name="static5" tool_tip="A list of Abilities the currently selected role can perform.">
Tilladte rettigheder
</text>
<scroll_list name="role_allowed_actions" tool_tip="For detaljer om hver rettighed se under rettigheder fanebladet.">
<scroll_list.columns label="" name="icon"/>
<scroll_list.columns label="" name="checkbox"/>
<scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
<panel name="actions_footer">
<text name="static">
Beskrivelse
</text>
<text_editor name="action_description">
Denne rettigheder &apos;Udmeld medlemmer fra denne gruppe&apos;. Kun en ejer kan udmelde en anden ejer.
</text_editor>
<text name="static2">
Roller med rettighed
</text>
<text name="static3">
Medlemmer med rettighed
</text>
</panel>
</panel>

View File

@ -1,38 +1,38 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
<panel.string name="real_url">
http://secondlife.com/app/login/
</panel.string>
<panel.string name="forgot_password_url">
http://secondlife.com/account/request.php
</panel.string>
<panel name="login_widgets">
<text name="first_name_text">
Fornavn:
</text>
<line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] Fornavn"/>
<text name="last_name_text">
Efternavn:
</text>
<line_editor name="last_name_edit" tool_tip="[SECOND_LIFE] Efternavn"/>
<text name="password_text">
Password:
</text>
<button label="Log Ind" label_selected="Log Ind" name="connect_btn"/>
<text name="start_location_text">
Start lokation:
</text>
<combo_box name="start_location_combo">
<combo_box.item label="Min sidste lokation" name="MyLastLocation"/>
<combo_box.item label="Hjem" name="MyHome"/>
<combo_box.item label="&lt;Skriv navn på region&gt;" name="Typeregionname"/>
</combo_box>
<check_box label="Husk password" name="remember_check"/>
<text name="create_new_account_text">
Opret bruger
</text>
<text name="forgot_password_text">
Glemt navn eller password?
</text>
</panel>
</panel>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
<panel.string name="real_url">
http://secondlife.com/app/login/
</panel.string>
<panel.string name="forgot_password_url">
http://secondlife.com/account/request.php
</panel.string>
<panel name="login_widgets">
<text name="first_name_text">
Fornavn:
</text>
<line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] Fornavn"/>
<text name="last_name_text">
Efternavn:
</text>
<line_editor name="last_name_edit" tool_tip="[SECOND_LIFE] Efternavn"/>
<text name="password_text">
Password:
</text>
<button label="Log Ind" label_selected="Log Ind" name="connect_btn"/>
<text name="start_location_text">
Start lokation:
</text>
<combo_box name="start_location_combo">
<combo_box.item label="Min sidste lokation" name="MyLastLocation"/>
<combo_box.item label="Hjem" name="MyHome"/>
<combo_box.item label="&lt;Skriv navn på region&gt;" name="Typeregionname"/>
</combo_box>
<check_box label="Husk password" name="remember_check"/>
<text name="create_new_account_text">
Opret bruger
</text>
<text name="forgot_password_text">
Glemt navn eller password?
</text>
</panel>
</panel>

View File

@ -1,64 +1,64 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Ting" name="main inventory panel">
<panel.string name="Title">
Ting
</panel.string>
<filter_editor label="Filter" name="inventory search editor"/>
<tab_container name="inventory filter tabs">
<inventory_panel label="Alle ting" name="All Items"/>
<inventory_panel label="Nye ting" name="Recent Items"/>
</tab_container>
<panel name="bottom_panel">
<button name="options_gear_btn" tool_tip="Vis flere valgmuligheder"/>
<button name="add_btn" tool_tip="Opret ny genstand"/>
<dnd_button name="trash_btn" tool_tip="Fjern valgt genstand"/>
</panel>
<menu_bar name="Inventory Menu">
<menu label="Filer" name="File">
<menu_item_call label="Åben" name="Open"/>
<menu label="Send fil" name="upload">
<menu_item_call label="Billede (L$[COST])..." name="Upload Image"/>
<menu_item_call label="Lyd (L$[COST])..." name="Upload Sound"/>
<menu_item_call label="Animation (L$[COST])..." name="Upload Animation"/>
<menu_item_call label="Flere filer (L$[COST] pr. fil)..." name="Bulk Upload"/>
</menu>
<menu_item_call label="Nyt vindue" name="New Window"/>
<menu_item_call label="Vis filtre" name="Show Filters"/>
<menu_item_call label="Nulstil filtre" name="Reset Current"/>
<menu_item_call label="Luk alle mapper" name="Close All Folders"/>
<menu_item_call label="Tøm papirkurv" name="Empty Trash"/>
<menu_item_call label="Tøm fundne genstande" name="Empty Lost And Found"/>
</menu>
<menu label="Opret" name="Create">
<menu_item_call label="Ny mappe" name="New Folder"/>
<menu_item_call label="Nyt script" name="New Script"/>
<menu_item_call label="Ny note" name="New Note"/>
<menu_item_call label="Ny bevægelse" name="New Gesture"/>
<menu label="Nyt tøj" name="New Clothes">
<menu_item_call label="Ny trøje" name="New Shirt"/>
<menu_item_call label="Nye bukser" name="New Pants"/>
<menu_item_call label="Nye sko" name="New Shoes"/>
<menu_item_call label="Nye strømper" name="New Socks"/>
<menu_item_call label="Ny jakke" name="New Jacket"/>
<menu_item_call label="Ny nederdel" name="New Skirt"/>
<menu_item_call label="Nye handsker" name="New Gloves"/>
<menu_item_call label="Ny undertrøje" name="New Undershirt"/>
<menu_item_call label="Nye underbukser" name="New Underpants"/>
<menu_item_call label="Nyt alpha lag" name="New Alpha"/>
<menu_item_call label="Ny tatovering" name="New Tattoo"/>
</menu>
<menu label="Nye kropsdele" name="New Body Parts">
<menu_item_call label="Ny kropsbygning" name="New Shape"/>
<menu_item_call label="Ny hud" name="New Skin"/>
<menu_item_call label="Nyt hår" name="New Hair"/>
<menu_item_call label="Nye øjne" name="New Eyes"/>
</menu>
</menu>
<menu label="Sortér" name="Sort">
<menu_item_check label="Efter navn" name="By Name"/>
<menu_item_check label="Efter dato" name="By Date"/>
<menu_item_check label="Altid mapper efter navn" name="Folders Always By Name"/>
<menu_item_check label="System-mapper i toppen" name="System Folders To Top"/>
</menu>
</menu_bar>
</panel>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Ting" name="main inventory panel">
<panel.string name="Title">
Ting
</panel.string>
<filter_editor label="Filter" name="inventory search editor"/>
<tab_container name="inventory filter tabs">
<inventory_panel label="Alle ting" name="All Items"/>
<inventory_panel label="Nye ting" name="Recent Items"/>
</tab_container>
<panel name="bottom_panel">
<button name="options_gear_btn" tool_tip="Vis flere valgmuligheder"/>
<button name="add_btn" tool_tip="Opret ny genstand"/>
<dnd_button name="trash_btn" tool_tip="Fjern valgt genstand"/>
</panel>
<menu_bar name="Inventory Menu">
<menu label="Filer" name="File">
<menu_item_call label="Åben" name="Open"/>
<menu label="Send fil" name="upload">
<menu_item_call label="Billede (L$[COST])..." name="Upload Image"/>
<menu_item_call label="Lyd (L$[COST])..." name="Upload Sound"/>
<menu_item_call label="Animation (L$[COST])..." name="Upload Animation"/>
<menu_item_call label="Flere filer (L$[COST] pr. fil)..." name="Bulk Upload"/>
</menu>
<menu_item_call label="Nyt vindue" name="New Window"/>
<menu_item_call label="Vis filtre" name="Show Filters"/>
<menu_item_call label="Nulstil filtre" name="Reset Current"/>
<menu_item_call label="Luk alle mapper" name="Close All Folders"/>
<menu_item_call label="Tøm papirkurv" name="Empty Trash"/>
<menu_item_call label="Tøm fundne genstande" name="Empty Lost And Found"/>
</menu>
<menu label="Opret" name="Create">
<menu_item_call label="Ny mappe" name="New Folder"/>
<menu_item_call label="Nyt script" name="New Script"/>
<menu_item_call label="Ny note" name="New Note"/>
<menu_item_call label="Ny bevægelse" name="New Gesture"/>
<menu label="Nyt tøj" name="New Clothes">
<menu_item_call label="Ny trøje" name="New Shirt"/>
<menu_item_call label="Nye bukser" name="New Pants"/>
<menu_item_call label="Nye sko" name="New Shoes"/>
<menu_item_call label="Nye strømper" name="New Socks"/>
<menu_item_call label="Ny jakke" name="New Jacket"/>
<menu_item_call label="Ny nederdel" name="New Skirt"/>
<menu_item_call label="Nye handsker" name="New Gloves"/>
<menu_item_call label="Ny undertrøje" name="New Undershirt"/>
<menu_item_call label="Nye underbukser" name="New Underpants"/>
<menu_item_call label="Nyt alpha lag" name="New Alpha"/>
<menu_item_call label="Ny tatovering" name="New Tattoo"/>
</menu>
<menu label="Nye kropsdele" name="New Body Parts">
<menu_item_call label="Ny kropsbygning" name="New Shape"/>
<menu_item_call label="Ny hud" name="New Skin"/>
<menu_item_call label="Nyt hår" name="New Hair"/>
<menu_item_call label="Nye øjne" name="New Eyes"/>
</menu>
</menu>
<menu label="Sortér" name="Sort">
<menu_item_check label="Efter navn" name="By Name"/>
<menu_item_check label="Efter dato" name="By Date"/>
<menu_item_check label="Altid mapper efter navn" name="Folders Always By Name"/>
<menu_item_check label="System-mapper i toppen" name="System Folders To Top"/>
</menu>
</menu_bar>
</panel>

View File

@ -1,48 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="advanced">
<panel.string name="resolution_format">
[RES_X] x [RES_Y]
</panel.string>
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
<check_box label="Talebobler" name="bubble_text_chat"/>
<color_swatch name="background" tool_tip="Vælg farve for talebobler"/>
<slider label="Gennemsigtighed" name="bubble_chat_opacity"/>
<text name="AspectRatioLabel1" tool_tip="bredde / højde">
Format
</text>
<combo_box name="aspect_ratio" tool_tip="bredde/ højde">
<combo_box.item label="4:3 (Standard CRT)" name="item1"/>
<combo_box.item label="5:4 (1280x1024 LCD)" name="item2"/>
<combo_box.item label="8:5 (Widescreen)" name="item3"/>
<combo_box.item label="16:9 (Widescreen)" name="item4"/>
</combo_box>
<check_box label="Registrér automatisk" name="aspect_auto_detect"/>
<text name="heading1">
Kamera:
</text>
<slider label="Synsvinkel" name="camera_fov"/>
<slider label="Distance" name="camera_offset_scale"/>
<text name="heading2">
Automatisk positionering for:
</text>
<check_box label="Byg/Redigér" name="edit_camera_movement" tool_tip="Benyt automatisk kamera positionering ved start og slut af editerings modus"/>
<check_box label="Udseende" name="appearance_camera_movement" tool_tip="Benyt automatisk kamera positionering ved redigering"/>
<text name="heading3">
Avatarer:
</text>
<check_box label="Vis avatar i førsteperson" name="first_person_avatar_visible"/>
<check_box label="Piletaster bruges altid til bevægelse" name="arrow_keys_move_avatar_check"/>
<check_box label="Tast-tast-hold for at løbe" name="tap_tap_hold_to_run"/>
<check_box label="Bevæg avatarlæber når der tales" name="enable_lip_sync"/>
<check_box label="Vis scriptfejl" name="show_script_errors"/>
<radio_group name="show_location">
<radio_item label="I chat" name="0"/>
<radio_item label="I et vindue" name="1"/>
</radio_group>
<check_box label="Knap til aktivering af mikrofon:" name="push_to_talk_toggle_check" tool_tip="I walkie-talkie-modus sendes stemme kun når knappen er trykket ned, ellers vil tryk på knap tænde og slukke mikrofon."/>
<line_editor label="Brug walkie-talkie modus" name="modifier_combo"/>
<button label="Angiv taste" name="set_voice_hotkey_button"/>
<button label="Midterste museknap" name="set_voice_middlemouse_button"/>
</panel>
<?xml version="1.0" encoding="utf-8"?>
<panel name="advanced">
<panel.string name="resolution_format">
[RES_X] x [RES_Y]
</panel.string>
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
<check_box label="Talebobler" name="bubble_text_chat"/>
<color_swatch name="background" tool_tip="Vælg farve for talebobler"/>
<slider label="Gennemsigtighed" name="bubble_chat_opacity"/>
<text name="AspectRatioLabel1" tool_tip="bredde / højde">
Format
</text>
<combo_box name="aspect_ratio" tool_tip="bredde/ højde">
<combo_box.item label="4:3 (Standard CRT)" name="item1"/>
<combo_box.item label="5:4 (1280x1024 LCD)" name="item2"/>
<combo_box.item label="8:5 (Widescreen)" name="item3"/>
<combo_box.item label="16:9 (Widescreen)" name="item4"/>
</combo_box>
<check_box label="Registrér automatisk" name="aspect_auto_detect"/>
<text name="heading1">
Kamera:
</text>
<slider label="Synsvinkel" name="camera_fov"/>
<slider label="Distance" name="camera_offset_scale"/>
<text name="heading2">
Automatisk positionering for:
</text>
<check_box label="Byg/Redigér" name="edit_camera_movement" tool_tip="Benyt automatisk kamera positionering ved start og slut af editerings modus"/>
<check_box label="Udseende" name="appearance_camera_movement" tool_tip="Benyt automatisk kamera positionering ved redigering"/>
<text name="heading3">
Avatarer:
</text>
<check_box label="Vis avatar i førsteperson" name="first_person_avatar_visible"/>
<check_box label="Piletaster bruges altid til bevægelse" name="arrow_keys_move_avatar_check"/>
<check_box label="Tast-tast-hold for at løbe" name="tap_tap_hold_to_run"/>
<check_box label="Bevæg avatarlæber når der tales" name="enable_lip_sync"/>
<check_box label="Vis scriptfejl" name="show_script_errors"/>
<radio_group name="show_location">
<radio_item label="I chat" name="0"/>
<radio_item label="I et vindue" name="1"/>
</radio_group>
<check_box label="Knap til aktivering af mikrofon:" name="push_to_talk_toggle_check" tool_tip="I walkie-talkie-modus sendes stemme kun når knappen er trykket ned, ellers vil tryk på knap tænde og slukke mikrofon."/>
<line_editor label="Brug walkie-talkie modus" name="modifier_combo"/>
<button label="Angiv taste" name="set_voice_hotkey_button"/>
<button label="Midterste museknap" name="set_voice_middlemouse_button"/>
</panel>

View File

@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Popups" name="popups" title="Popups">
<text name="tell_me_label">
Vis mig når:
</text>
<check_box label="Når jeg bruger eller får L$" name="notify_money_change_checkbox"/>
<check_box label="Når mine venner logger af eller på" name="friends_online_notify_checkbox"/>
<text name="show_label">
Vis altid disse beskeder:
</text>
<text name="dont_show_label">
Vis aldrig disse beskeder:
</text>
</panel>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Popups" name="popups" title="Popups">
<text name="tell_me_label">
Vis mig når:
</text>
<check_box label="Når jeg bruger eller får L$" name="notify_money_change_checkbox"/>
<check_box label="Når mine venner logger af eller på" name="friends_online_notify_checkbox"/>
<text name="show_label">
Vis altid disse beskeder:
</text>
<text name="dont_show_label">
Vis aldrig disse beskeder:
</text>
</panel>

View File

@ -1,42 +1,42 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Tekst chat" name="chat">
<radio_group name="chat_font_size">
<radio_item label="Lille" name="radio"/>
<radio_item label="Mellem" name="radio2"/>
<radio_item label="Stor" name="radio3"/>
</radio_group>
<color_swatch label="Dig" name="user"/>
<text name="text_box1">
Dig
</text>
<color_swatch label="Andre" name="agent"/>
<text name="text_box2">
Andre
</text>
<color_swatch label="IM" name="im"/>
<text name="text_box3">
IM
</text>
<color_swatch label="System" name="system"/>
<text name="text_box4">
System
</text>
<color_swatch label="Fejl" name="script_error"/>
<text name="text_box5">
Fejl
</text>
<color_swatch label="Objekter" name="objects"/>
<text name="text_box6">
Objekter
</text>
<color_swatch label="Ejer" name="owner"/>
<text name="text_box7">
Ejer
</text>
<color_swatch label="URL&apos;er" name="links"/>
<text name="text_box9">
URL&apos;er
</text>
<check_box initial_value="true" label="Afspil skrive animation ved chat" name="play_typing_animation"/>
<check_box label="Send e-mail til mig når jeg modtager IM og er offline" name="send_im_to_email"/>
</panel>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Tekst chat" name="chat">
<radio_group name="chat_font_size">
<radio_item label="Lille" name="radio"/>
<radio_item label="Mellem" name="radio2"/>
<radio_item label="Stor" name="radio3"/>
</radio_group>
<color_swatch label="Dig" name="user"/>
<text name="text_box1">
Dig
</text>
<color_swatch label="Andre" name="agent"/>
<text name="text_box2">
Andre
</text>
<color_swatch label="IM" name="im"/>
<text name="text_box3">
IM
</text>
<color_swatch label="System" name="system"/>
<text name="text_box4">
System
</text>
<color_swatch label="Fejl" name="script_error"/>
<text name="text_box5">
Fejl
</text>
<color_swatch label="Objekter" name="objects"/>
<text name="text_box6">
Objekter
</text>
<color_swatch label="Ejer" name="owner"/>
<text name="text_box7">
Ejer
</text>
<color_swatch label="URL&apos;er" name="links"/>
<text name="text_box9">
URL&apos;er
</text>
<check_box initial_value="true" label="Afspil skrive animation ved chat" name="play_typing_animation"/>
<check_box label="Send e-mail til mig når jeg modtager IM og er offline" name="send_im_to_email"/>
</panel>

Some files were not shown because too many files have changed in this diff Show More