automated merge from trunk
commit
0ac14158bc
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]</string>
|
||||
<string>http://search.secondlife.com/viewer/[CATEGORY]?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&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>
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
||||
|
|
|
|||
|
|
@ -688,7 +688,7 @@ void LLInspectAvatar::onToggleMute()
|
|||
|
||||
void LLInspectAvatar::onClickReport()
|
||||
{
|
||||
LLFloaterReporter::showFromObject(mAvatarID);
|
||||
LLFloaterReporter::showFromAvatar(mAvatarID, mAvatarName);
|
||||
closeFloater();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 |
|
||||
// +=================================================+
|
||||
|
|
|
|||
|
|
@ -448,7 +448,6 @@ public:
|
|||
EDragAndDropType cargo_type,
|
||||
void* cargo_data);
|
||||
void refreshFolderViewItem();
|
||||
BOOL removeItem();
|
||||
|
||||
protected:
|
||||
LLCallingCardBridge( LLInventoryPanel* inventory, const LLUUID& uuid );
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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*/
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -1689,7 +1689,7 @@ void LLPanelClassifiedEdit::onSaveClick()
|
|||
{
|
||||
if(gStatusBar->getBalance() < getPriceForListing())
|
||||
{
|
||||
LLNotificationsUtil::add("ClassifiedInsuffisientFunds");
|
||||
LLNotificationsUtil::add("ClassifiedInsufficientFunds");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -149,6 +149,8 @@ protected:
|
|||
|
||||
icon_map_t mActionIcons;
|
||||
|
||||
bool mActivated;
|
||||
|
||||
void setOthersVisible(BOOL b);
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -52,7 +52,9 @@ private:
|
|||
|
||||
private:
|
||||
LLCheckBoxCtrl* mCheckSoundLocal;
|
||||
LLRadioGroup* mRadioVoiceChat;
|
||||
LLCheckBoxCtrl* mCheckParcelEnableVoice;
|
||||
LLCheckBoxCtrl* mCheckEstateDisabledVoice;
|
||||
LLCheckBoxCtrl* mCheckParcelVoiceLocal;
|
||||
LLLineEditor* mMusicURLEdit;
|
||||
LLCheckBoxCtrl* mMusicUrlCheck;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -97,6 +97,8 @@ private:
|
|||
void togglePickPanel(BOOL visible);
|
||||
void togglePlaceInfoPanel(BOOL visible);
|
||||
|
||||
/*virtual*/ void handleVisibilityChange(BOOL new_visibility);
|
||||
|
||||
void updateVerbs();
|
||||
|
||||
LLPanelPlaceInfo* getCurrentInfoPanel();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@ LLTransientDockableFloater::LLTransientDockableFloater(LLDockControl* dockContro
|
|||
LLDockableFloater(dockControl, uniqueDocking, key, params)
|
||||
{
|
||||
LLTransientFloaterMgr::getInstance()->registerTransientFloater(this);
|
||||
LLTransientFloater::init(this);
|
||||
}
|
||||
|
||||
LLTransientDockableFloater::~LLTransientDockableFloater()
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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) ;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
//@{
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 > Falsk alder" name="Age__Age_play"/>
|
||||
<combo_box.item label="Alder > Voksen beboer på Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
|
||||
<combo_box.item label="Alder > Mindreårig beboer udenfor Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
|
||||
<combo_box.item label="Overfald > Kamp sandkasse / Usikkert område" name="Assault__Combat_sandbox___unsafe_area"/>
|
||||
<combo_box.item label="Overfald > Sikkert område" name="Assault__Safe_area"/>
|
||||
<combo_box.item label="Overfald > Sandkasse til våbentest" name="Assault__Weapons_testing_sandbox"/>
|
||||
<combo_box.item label="Handel > Vare eller ydelse ikke leveret" name="Commerce__Failure_to_deliver_product_or_service"/>
|
||||
<combo_box.item label="Offentliggørelse > Om oplysninger i den virkelige verden" name="Disclosure__Real_world_information"/>
|
||||
<combo_box.item label="Offentliggørelse > Fjernaflytning af chat" name="Disclosure__Remotely_monitoring chat"/>
|
||||
<combo_box.item label="Offentliggørelse > Information/chat/IM fra Second Life" name="Disclosure__Second_Life_information_chat_IMs"/>
|
||||
<combo_box.item label="Forstyrrelse af fred > Unfair brug af region ressourcer" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
|
||||
<combo_box.item label="Forstyrrelse af fred > Overdreven brug af objekter med script" name="Disturbing_the_peace__Excessive_scripted_objects"/>
|
||||
<combo_box.item label="Forstyrrelse af fred > Object affald" name="Disturbing_the_peace__Object_littering"/>
|
||||
<combo_box.item label="Forstyrring af fred > Gentagen spam" name="Disturbing_the_peace__Repetitive_spam"/>
|
||||
<combo_box.item label="Forstyrrelse af fred > Uønsket reklame spam" name="Disturbing_the_peace__Unwanted_advert_spam"/>
|
||||
<combo_box.item label="Bedrageri > L$" name="Fraud__L$"/>
|
||||
<combo_box.item label="Bedrageri > Land" name="Fraud__Land"/>
|
||||
<combo_box.item label="Bedrageri > Pyramide spil eller kædebreve" name="Fraud__Pyramid_scheme_or_chain_letter"/>
|
||||
<combo_box.item label="Bedrageri > US$" name="Fraud__US$"/>
|
||||
<combo_box.item label="Chikane > reklame farm / billedeligt spam" name="Harassment__Advert_farms___visual_spam"/>
|
||||
<combo_box.item label="Chikane > Injurier/bagvask enkeltpersoner eller grupper" name="Harassment__Defaming_individuals_or_groups"/>
|
||||
<combo_box.item label="Chikane > Hindre bevægelse" name="Harassment__Impeding_movement"/>
|
||||
<combo_box.item label="Chikane > Sex chikane" name="Harassment__Sexual_harassment"/>
|
||||
<combo_box.item label="Chikane > Opfordrer/kræver at andre overtræder licensbetingelser" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
|
||||
<combo_box.item label="Chikane > Verbalt chikane" name="Harassment__Verbal_abuse"/>
|
||||
<combo_box.item label="Uanstændighed > Meget stødende indhold eller adfærd" name="Indecency__Broadly_offensive_content_or_conduct"/>
|
||||
<combo_box.item label="Uanstændighed > Upassende avatar navn" name="Indecency__Inappropriate_avatar_name"/>
|
||||
<combo_box.item label="Usømmelighed > Upassende inhold eller opførsel i en 'PG' region" name="Indecency__Mature_content_in_PG_region"/>
|
||||
<combo_box.item label="Usømmelighed > Upassende inhold eller opførsel i en 'Mature' region" name="Indecency__Inappropriate_content_in_Mature_region"/>
|
||||
<combo_box.item label="Krænkelse af intellektuelle ejendomsrettigheder > Indholds fjernelse" name="Intellectual_property_infringement_Content_Removal"/>
|
||||
<combo_box.item label="Krænkelse af intellektuelle ejendomsrettigheder > 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 > Misbrug af sandkasse resourcer" name="Land__Abuse_of_sandbox_resources"/>
|
||||
<combo_box.item label="Land > Overgreb > Objekter/teksturer" name="Land__Encroachment__Objects_textures"/>
|
||||
<combo_box.item label="Land > Overgreb > Partikler" name="Land__Encroachment__Particles"/>
|
||||
<combo_box.item label="Land > Overgreb > 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 > Falsk alder" name="Age__Age_play"/>
|
||||
<combo_box.item label="Alder > Voksen beboer på Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
|
||||
<combo_box.item label="Alder > Mindreårig beboer udenfor Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
|
||||
<combo_box.item label="Overfald > Kamp sandkasse / Usikkert område" name="Assault__Combat_sandbox___unsafe_area"/>
|
||||
<combo_box.item label="Overfald > Sikkert område" name="Assault__Safe_area"/>
|
||||
<combo_box.item label="Overfald > Sandkasse til våbentest" name="Assault__Weapons_testing_sandbox"/>
|
||||
<combo_box.item label="Handel > Vare eller ydelse ikke leveret" name="Commerce__Failure_to_deliver_product_or_service"/>
|
||||
<combo_box.item label="Offentliggørelse > Om oplysninger i den virkelige verden" name="Disclosure__Real_world_information"/>
|
||||
<combo_box.item label="Offentliggørelse > Fjernaflytning af chat" name="Disclosure__Remotely_monitoring chat"/>
|
||||
<combo_box.item label="Offentliggørelse > Information/chat/IM fra Second Life" name="Disclosure__Second_Life_information_chat_IMs"/>
|
||||
<combo_box.item label="Forstyrrelse af fred > Unfair brug af region ressourcer" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
|
||||
<combo_box.item label="Forstyrrelse af fred > Overdreven brug af objekter med script" name="Disturbing_the_peace__Excessive_scripted_objects"/>
|
||||
<combo_box.item label="Forstyrrelse af fred > Object affald" name="Disturbing_the_peace__Object_littering"/>
|
||||
<combo_box.item label="Forstyrring af fred > Gentagen spam" name="Disturbing_the_peace__Repetitive_spam"/>
|
||||
<combo_box.item label="Forstyrrelse af fred > Uønsket reklame spam" name="Disturbing_the_peace__Unwanted_advert_spam"/>
|
||||
<combo_box.item label="Bedrageri > L$" name="Fraud__L$"/>
|
||||
<combo_box.item label="Bedrageri > Land" name="Fraud__Land"/>
|
||||
<combo_box.item label="Bedrageri > Pyramide spil eller kædebreve" name="Fraud__Pyramid_scheme_or_chain_letter"/>
|
||||
<combo_box.item label="Bedrageri > US$" name="Fraud__US$"/>
|
||||
<combo_box.item label="Chikane > reklame farm / billedeligt spam" name="Harassment__Advert_farms___visual_spam"/>
|
||||
<combo_box.item label="Chikane > Injurier/bagvask enkeltpersoner eller grupper" name="Harassment__Defaming_individuals_or_groups"/>
|
||||
<combo_box.item label="Chikane > Hindre bevægelse" name="Harassment__Impeding_movement"/>
|
||||
<combo_box.item label="Chikane > Sex chikane" name="Harassment__Sexual_harassment"/>
|
||||
<combo_box.item label="Chikane > Opfordrer/kræver at andre overtræder licensbetingelser" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
|
||||
<combo_box.item label="Chikane > Verbalt chikane" name="Harassment__Verbal_abuse"/>
|
||||
<combo_box.item label="Uanstændighed > Meget stødende indhold eller adfærd" name="Indecency__Broadly_offensive_content_or_conduct"/>
|
||||
<combo_box.item label="Uanstændighed > Upassende avatar navn" name="Indecency__Inappropriate_avatar_name"/>
|
||||
<combo_box.item label="Usømmelighed > Upassende inhold eller opførsel i en 'PG' region" name="Indecency__Mature_content_in_PG_region"/>
|
||||
<combo_box.item label="Usømmelighed > Upassende inhold eller opførsel i en 'Mature' region" name="Indecency__Inappropriate_content_in_Mature_region"/>
|
||||
<combo_box.item label="Krænkelse af intellektuelle ejendomsrettigheder > Indholds fjernelse" name="Intellectual_property_infringement_Content_Removal"/>
|
||||
<combo_box.item label="Krænkelse af intellektuelle ejendomsrettigheder > 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 > Misbrug af sandkasse resourcer" name="Land__Abuse_of_sandbox_resources"/>
|
||||
<combo_box.item label="Land > Overgreb > Objekter/teksturer" name="Land__Encroachment__Objects_textures"/>
|
||||
<combo_box.item label="Land > Overgreb > Partikler" name="Land__Encroachment__Particles"/>
|
||||
<combo_box.item label="Land > Overgreb > 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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 'Lost and found'" 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 'Lost and found'" 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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -1,121 +1,121 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<panel label="Medlemmer & 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">
|
||||
'Alle-' og 'Ejerroller' 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 'Generelt' 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 'Udmeld medlemmer fra denne gruppe'. 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 & 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">
|
||||
'Alle-' og 'Ejerroller' 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 'Generelt' 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 'Udmeld medlemmer fra denne gruppe'. 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>
|
||||
|
|
|
|||
|
|
@ -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="<Skriv navn på region>" 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="<Skriv navn på region>" 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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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'er" name="links"/>
|
||||
<text name="text_box9">
|
||||
URL'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'er" name="links"/>
|
||||
<text name="text_box9">
|
||||
URL'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
Loading…
Reference in New Issue