diff options
Diffstat (limited to 'indra/newview')
192 files changed, 8188 insertions, 3786 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 91f43137c5..dd3fc10fa2 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -316,6 +316,7 @@ set(viewer_SOURCE_FILES llpanelgrouplandmoney.cpp llpanelgroupnotices.cpp llpanelgrouproles.cpp + llpanelhome.cpp llpanelimcontrolpanel.cpp llpanelland.cpp llpanellandaudio.cpp @@ -813,6 +814,7 @@ set(viewer_HEADER_FILES llpanelgrouplandmoney.h llpanelgroupnotices.h llpanelgrouproles.h + llpanelhome.h llpanelimcontrolpanel.h llpanelland.h llpanellandaudio.h @@ -1113,22 +1115,13 @@ if (WINDOWS) # the .pch file. # All sources added to viewer_SOURCE_FILES # at this point use it. - set_source_files_properties(llviewerprecompiledheaders.cpp - PROPERTIES - COMPILE_FLAGS "/Ycllviewerprecompiledheaders.h" - ) - foreach( src_file ${viewer_SOURCE_FILES} ) - set_source_files_properties( - ${src_file} + if(USE_PRECOMPILED_HEADERS) + set_source_files_properties(llviewerprecompiledheaders.cpp PROPERTIES - COMPILE_FLAGS "/Yullviewerprecompiledheaders.h" - ) - endforeach( src_file ${viewer_SOURCE_FILES} ) - list(APPEND viewer_SOURCE_FILES llviewerprecompiledheaders.cpp) - # llstartup.cpp needs special symbols for audio libraries, so it resets - # COMPILE_FLAGS below. Make sure it maintains precompiled header settings. - set(LLSTARTUP_COMPILE_FLAGS - "${LLSTARTUP_COMPILE_FLAGS} /Yullviewerprecompiledheaders.h") + COMPILE_FLAGS "/Ycllviewerprecompiledheaders.h" + ) + set(viewer_SOURCE_FILES "${viewer_SOURCE_FILES}" llviewerprecompiledheaders.cpp) + endif(USE_PRECOMPILED_HEADERS) # Add resource files to the project. # viewerRes.rc is the only buildable file, but @@ -1380,6 +1373,13 @@ if (WINDOWS) LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\" /INCREMENTAL:NO" LINK_FLAGS_RELEASE ${release_flags} ) + if(USE_PRECOMPILED_HEADERS) + set_target_properties( + ${VIEWER_BINARY_NAME} + PROPERTIES + COMPILE_FLAGS "/Yullviewerprecompiledheaders.h" + ) + endif(USE_PRECOMPILED_HEADERS) # sets the 'working directory' for debugging from visual studio. if (NOT UNATTENDED) @@ -1655,48 +1655,61 @@ if (INSTALL) include(${CMAKE_CURRENT_SOURCE_DIR}/ViewerInstall.cmake) endif (INSTALL) -# To add a viewer unit test, just add the test .cpp file below -# This creates a separate test project per file listed. -include(LLAddBuildTest) -SET(viewer_TEST_SOURCE_FILES - llagentaccess.cpp - lldateutil.cpp - llmediadataclient.cpp - llviewerhelputil.cpp - lllogininstance.cpp - ) -set_source_files_properties( - ${viewer_TEST_SOURCE_FILES} - PROPERTIES - LL_TEST_ADDITIONAL_SOURCE_FILES llviewerprecompiledheaders.cpp - ) -LL_ADD_PROJECT_UNIT_TESTS(${VIEWER_BINARY_NAME} "${viewer_TEST_SOURCE_FILES}") - -#set(TEST_DEBUG on) -set(test_sources llcapabilitylistener.cpp llviewerprecompiledheaders.cpp) -set(test_libs - ${LLMESSAGE_LIBRARIES} - ${WINDOWS_LIBRARIES} - ${LLVFS_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ${GOOGLEMOCK_LIBRARIES} +if (LL_TESTS) + # To add a viewer unit test, just add the test .cpp file below + # This creates a separate test project per file listed. + include(LLAddBuildTest) + SET(viewer_TEST_SOURCE_FILES + llagentaccess.cpp + lldateutil.cpp + llmediadataclient.cpp + llviewerhelputil.cpp + lllogininstance.cpp ) + ################################################## + # DISABLING PRECOMPILED HEADERS USAGE FOR TESTS + ################################################## + # if(USE_PRECOMPILED_HEADERS) + # set_source_files_properties( + # ${viewer_TEST_SOURCE_FILES} + # PROPERTIES + # LL_TEST_ADDITIONAL_SOURCE_FILES llviewerprecompiledheaders.cpp + # ) + # endif(USE_PRECOMPILED_HEADERS) + LL_ADD_PROJECT_UNIT_TESTS(${VIEWER_BINARY_NAME} "${viewer_TEST_SOURCE_FILES}") + + #set(TEST_DEBUG on) + set(test_sources llcapabilitylistener.cpp) + ################################################## + # DISABLING PRECOMPILED HEADERS USAGE FOR TESTS + ################################################## + # if(USE_PRECOMPILED_HEADERS) + # set(test_sources "${test_sources}" llviewerprecompiledheaders.cpp) + # endif(USE_PRECOMPILED_HEADERS) + set(test_libs + ${LLMESSAGE_LIBRARIES} + ${WINDOWS_LIBRARIES} + ${LLVFS_LIBRARIES} + ${LLMATH_LIBRARIES} + ${LLCOMMON_LIBRARIES} + ${GOOGLEMOCK_LIBRARIES} + ) -LL_ADD_INTEGRATION_TEST(llcapabilitylistener - "${test_sources}" - "${test_libs}" - ${PYTHON_EXECUTABLE} - "${CMAKE_SOURCE_DIR}/llmessage/tests/test_llsdmessage_peer.py" - ) + LL_ADD_INTEGRATION_TEST(llcapabilitylistener + "${test_sources}" + "${test_libs}" + ${PYTHON_EXECUTABLE} + "${CMAKE_SOURCE_DIR}/llmessage/tests/test_llsdmessage_peer.py" + ) -#ADD_VIEWER_BUILD_TEST(llmemoryview viewer) -#ADD_VIEWER_BUILD_TEST(llagentaccess viewer) -#ADD_VIEWER_BUILD_TEST(llworldmap viewer) -#ADD_VIEWER_BUILD_TEST(llworldmipmap viewer) -#ADD_VIEWER_BUILD_TEST(lltextureinfo viewer) -#ADD_VIEWER_BUILD_TEST(lltextureinfodetails viewer) -#ADD_VIEWER_BUILD_TEST(lltexturestatsuploader viewer) + #ADD_VIEWER_BUILD_TEST(llmemoryview viewer) + #ADD_VIEWER_BUILD_TEST(llagentaccess viewer) + #ADD_VIEWER_BUILD_TEST(llworldmap viewer) + #ADD_VIEWER_BUILD_TEST(llworldmipmap viewer) + #ADD_VIEWER_BUILD_TEST(lltextureinfo viewer) + #ADD_VIEWER_BUILD_TEST(lltextureinfodetails viewer) + #ADD_VIEWER_BUILD_TEST(lltexturestatsuploader viewer) +endif (LL_TESTS) # Don't do these for DARWIN or LINUX here -- they're taken care of by viewer_manifest.py diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index b0f782622c..fa4dfe767b 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1385,6 +1385,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>ChatWindow</key> + <map> + <key>Comment</key> + <string>Show chat in multiple windows(by default) or in one multi-tabbed window(requires restart)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>0</integer> + </map> <key>CheesyBeacon</key> <map> <key>Comment</key> @@ -9260,7 +9271,7 @@ <key>Type</key> <string>S32</string> <key>Value</key> - <integer>3</integer> + <integer>4</integer> </map> <key>UIMaxComboWidth</key> <map> @@ -9722,7 +9733,7 @@ <key>Type</key> <string>S32</string> <key>Value</key> - <integer>8</integer> + <integer>11</integer> </map> <key>UISpinctrlBtnWidth</key> <map> diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 18a8396451..b52b58f9e2 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -50,6 +50,10 @@ #include "llgesturemgr.h" #include "llappearancemgr.h" #include "lltexlayer.h" +#include "llsidetray.h" +#include "llpaneloutfitsinventory.h" +#include "llfolderview.h" +#include "llaccordionctrltab.h" #include <boost/scoped_ptr.hpp> @@ -409,7 +413,7 @@ void LLAgentWearables::saveWearable(const EWearableType type, const U32 index, B return; } - gAgent.getAvatarObject()->wearableUpdated( type ); + gAgent.getAvatarObject()->wearableUpdated( type, TRUE ); if (send_update) { @@ -699,7 +703,7 @@ U32 LLAgentWearables::pushWearable(const EWearableType type, LLWearable *wearabl void LLAgentWearables::wearableUpdated(LLWearable *wearable) { - mAvatarObject->wearableUpdated(wearable->getType()); + mAvatarObject->wearableUpdated(wearable->getType(), TRUE); wearable->setLabelUpdated(); // Hack pt 2. If the wearable we just loaded has definition version 24, @@ -740,7 +744,7 @@ void LLAgentWearables::popWearable(const EWearableType type, U32 index) if (wearable) { mWearableDatas[type].erase(mWearableDatas[type].begin() + index); - mAvatarObject->wearableUpdated(wearable->getType()); + mAvatarObject->wearableUpdated(wearable->getType(), TRUE); wearable->setLabelUpdated(); } } @@ -1296,6 +1300,41 @@ void LLAgentWearables::makeNewOutfit(const std::string& new_folder_name, } } +class LLAutoRenameFolder: public LLInventoryCallback +{ +public: + LLAutoRenameFolder(LLUUID& folder_id): + mFolderID(folder_id) + { + } + + virtual ~LLAutoRenameFolder() + { + LLSD key; + LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key); + LLPanelOutfitsInventory *outfit_panel = + dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory")); + if (outfit_panel) + { + outfit_panel->getRootFolder()->clearSelection(); + outfit_panel->getRootFolder()->setSelectionByID(mFolderID, TRUE); + outfit_panel->getRootFolder()->setNeedsAutoRename(TRUE); + } + LLAccordionCtrlTab* tab_outfits = outfit_panel ? outfit_panel->findChild<LLAccordionCtrlTab>("tab_outfits") : 0; + if (tab_outfits && !tab_outfits->getDisplayChildren()) + { + tab_outfits->changeOpenClose(tab_outfits->getDisplayChildren()); + } + } + + virtual void fire(const LLUUID&) + { + } + +private: + LLUUID mFolderID; +}; + LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name) { if (mAvatarObject.isNull()) @@ -1310,17 +1349,9 @@ LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name) LLFolderType::FT_OUTFIT, new_folder_name); - LLAppearanceManager::instance().shallowCopyCategory(LLAppearanceManager::instance().getCOF(),folder_id, NULL); + LLPointer<LLInventoryCallback> cb = new LLAutoRenameFolder(folder_id); + LLAppearanceManager::instance().shallowCopyCategory(LLAppearanceManager::instance().getCOF(),folder_id, cb); -#if 0 // BAP - fix to go into rename state automatically after outfit is created. - LLViewerInventoryCategory *parent_category = gInventory.getCategory(parent_id); - if (parent_category) - { - parent_category->setSelectionByID(folder_id,TRUE); - parent_category->setNeedsAutoRename(TRUE); - } -#endif - return folder_id; } diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp index 8f3eba98a6..44cbbbb6b2 100644 --- a/indra/newview/llavatariconctrl.cpp +++ b/indra/newview/llavatariconctrl.cpp @@ -303,5 +303,9 @@ void LLAvatarIconCtrl::nameUpdatedCallback( { setToolTip(mFirstName + " " + mLastName); } + else + { + setToolTip(std::string("")); + } } } diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp index efc9538fa6..59ed391c06 100644 --- a/indra/newview/llavatarlistitem.cpp +++ b/indra/newview/llavatarlistitem.cpp @@ -42,7 +42,7 @@ #include "llavatariconctrl.h" #include "llbutton.h" -LLAvatarListItem::LLAvatarListItem() +LLAvatarListItem::LLAvatarListItem(bool not_from_ui_factory/* = true*/) : LLPanel(), mAvatarIcon(NULL), mAvatarName(NULL), @@ -55,14 +55,12 @@ LLAvatarListItem::LLAvatarListItem() mShowInfoBtn(true), mShowProfileBtn(true) { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_avatar_list_item.xml"); - // Remember avatar icon width including its padding from the name text box, - // so that we can hide and show the icon again later. - - mIconWidth = mAvatarName->getRect().mLeft - mAvatarIcon->getRect().mLeft; - mInfoBtnWidth = mInfoBtn->getRect().mRight - mSpeakingIndicator->getRect().mRight; - mProfileBtnWidth = mProfileBtn->getRect().mRight - mInfoBtn->getRect().mRight; - mSpeakingIndicatorWidth = mSpeakingIndicator->getRect().mRight - mAvatarName->getRect().mRight; + if (not_from_ui_factory) + { + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_avatar_list_item.xml"); + } + // *NOTE: mantipov: do not use any member here. They can be uninitialized here in case instance + // is created from the UICtrlFactory } LLAvatarListItem::~LLAvatarListItem() @@ -87,6 +85,13 @@ BOOL LLAvatarListItem::postBuild() mProfileBtn->setVisible(false); mProfileBtn->setClickedCallback(boost::bind(&LLAvatarListItem::onProfileBtnClick, this)); + // Remember avatar icon width including its padding from the name text box, + // so that we can hide and show the icon again later. + mIconWidth = mAvatarName->getRect().mLeft - mAvatarIcon->getRect().mLeft; + mInfoBtnWidth = mInfoBtn->getRect().mRight - mSpeakingIndicator->getRect().mRight; + mProfileBtnWidth = mProfileBtn->getRect().mRight - mInfoBtn->getRect().mRight; + mSpeakingIndicatorWidth = mSpeakingIndicator->getRect().mRight - mAvatarName->getRect().mRight; + /* if(!p.buttons.profile) { @@ -260,7 +265,7 @@ void LLAvatarListItem::setAvatarIconVisible(bool visible) void LLAvatarListItem::onInfoBtnClick() { - LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", mAvatarId)); + LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", mAvatarId)); /* TODO fix positioning of inspector localPointToScreen(mXPos, mYPos, &mXPos, &mYPos); diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h index 341f5a6bcf..a7b080098d 100644 --- a/indra/newview/llavatarlistitem.h +++ b/indra/newview/llavatarlistitem.h @@ -51,7 +51,16 @@ public: virtual void show(LLView* spawning_view, const std::vector<LLUUID>& selected_uuids, S32 x, S32 y) = 0; }; - LLAvatarListItem(); + /** + * Creates an instance of LLAvatarListItem. + * + * It is not registered with LLDefaultChildRegistry. It is built via LLUICtrlFactory::buildPanel + * or via registered LLCallbackMap depend on passed parameter. + * + * @param not_from_ui_factory if true instance will be build with LLUICtrlFactory::buildPanel + * otherwise it should be registered via LLCallbackMap before creating. + */ + LLAvatarListItem(bool not_from_ui_factory = true); virtual ~LLAvatarListItem(); virtual BOOL postBuild(); @@ -82,8 +91,19 @@ public: void setContextMenu(ContextMenu* menu) { mContextMenu = menu; } + /** + * This method was added to fix EXT-2364 (Items in group/ad-hoc IM participant list (avatar names) should be reshaped when adding/removing the "(Moderator)" label) + * But this is a *HACK. The real reason of it was in incorrect logic while hiding profile/info/speaker buttons + * *TODO: new reshape method should be provided in lieu of this one to be called when visibility if those buttons is changed + */ void reshapeAvatarName(); +protected: + /** + * Contains indicator to show voice activity. + */ + LLOutputMonitorCtrl* mSpeakingIndicator; + private: typedef enum e_online_status { @@ -100,7 +120,6 @@ private: LLTextBox* mAvatarName; LLTextBox* mLastInteractionTime; - LLOutputMonitorCtrl* mSpeakingIndicator; LLButton* mInfoBtn; LLButton* mProfileBtn; ContextMenu* mContextMenu; diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 9cc7b8c785..96c06b1665 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -31,6 +31,8 @@ */ #include "llviewerprecompiledheaders.h" // must be first include + +#define LLBOTTOMTRAY_CPP #include "llbottomtray.h" #include "llagent.h" @@ -45,6 +47,10 @@ #include "llsplitbutton.h" #include "llsyswellwindow.h" #include "llfloatercamera.h" +#include "lltexteditor.h" + +// Build time optimization, generate extern template once in .cpp file +template class LLBottomTray* LLSingleton<class LLBottomTray>::getInstance(); LLBottomTray::LLBottomTray(const LLSD&) : mChicletPanel(NULL), @@ -254,7 +260,9 @@ void LLBottomTray::showBottomTrayContextMenu(S32 x, S32 y, MASK mask) // We should show BottomTrayContextMenu in last turn if (mBottomTrayContextMenu && !LLMenuGL::sMenuContainer->getVisibleMenu()) { - //there are no other context menu (IM chiclet etc ), so we can show BottomTrayContextMenu + //there are no other context menu (IM chiclet etc ), so we can show BottomTrayContextMenu + + updateContextMenu(x, y, mask); mBottomTrayContextMenu->buildDrawLabels(); mBottomTrayContextMenu->updateParent(LLMenuGL::sMenuContainer); LLMenuGL::showPopup(this, mBottomTrayContextMenu, x, y); @@ -262,6 +270,33 @@ void LLBottomTray::showBottomTrayContextMenu(S32 x, S32 y, MASK mask) } } +void LLBottomTray::updateContextMenu(S32 x, S32 y, MASK mask) +{ + LLUICtrl* edit_box = mNearbyChatBar->getChild<LLUICtrl>("chat_box"); + + S32 local_x = x - mNearbyChatBar->getRect().mLeft - edit_box->getRect().mLeft; + S32 local_y = y - mNearbyChatBar->getRect().mBottom - edit_box->getRect().mBottom; + + bool in_edit_box = edit_box->pointInView(local_x, local_y); + + LLMenuItemGL* menu_item; + menu_item = mBottomTrayContextMenu->findChild<LLMenuItemGL>("NearbyChatBar_Cut"); + if(menu_item) + menu_item->setVisible(in_edit_box); + menu_item = mBottomTrayContextMenu->findChild<LLMenuItemGL>("NearbyChatBar_Copy"); + if(menu_item) + menu_item->setVisible(in_edit_box); + menu_item = mBottomTrayContextMenu->findChild<LLMenuItemGL>("NearbyChatBar_Paste"); + if(menu_item) + menu_item->setVisible(in_edit_box); + menu_item = mBottomTrayContextMenu->findChild<LLMenuItemGL>("NearbyChatBar_Delete"); + if(menu_item) + menu_item->setVisible(in_edit_box); + menu_item = mBottomTrayContextMenu->findChild<LLMenuItemGL>("NearbyChatBar_Select_All"); + if(menu_item) + menu_item->setVisible(in_edit_box); +} + void LLBottomTray::showGestureButton(BOOL visible) { setTrayButtonVisibleIfPossible(RS_BUTTON_GESTURES, visible); @@ -293,9 +328,14 @@ namespace BOOL LLBottomTray::postBuild() { + + LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("NearbyChatBar.Action", boost::bind(&LLBottomTray::onContextMenuItemClicked, this, _2)); + LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("NearbyChatBar.EnableMenuItem", boost::bind(&LLBottomTray::onContextMenuItemEnabled, this, _2)); + mBottomTrayContextMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_bottomtray.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); gMenuHolder->addChild(mBottomTrayContextMenu); + mNearbyChatBar = getChild<LLNearbyChatBar>("chat_bar"); mToolbarStack = getChild<LLLayoutStack>("toolbar_stack"); mMovementPanel = getChild<LLPanel>("movement_panel"); @@ -328,6 +368,62 @@ BOOL LLBottomTray::postBuild() return TRUE; } +bool LLBottomTray::onContextMenuItemEnabled(const LLSD& userdata) +{ + std::string item = userdata.asString(); + LLLineEditor* edit_box = mNearbyChatBar->findChild<LLLineEditor>("chat_box"); + + if (item == "can_cut") + { + return edit_box->canCut(); + } + else if (item == "can_copy") + { + return edit_box->canCopy(); + } + else if (item == "can_paste") + { + return edit_box->canPaste(); + } + else if (item == "can_delete") + { + return edit_box->canDoDelete(); + } + else if (item == "can_select_all") + { + return edit_box->canSelectAll(); + } + return true; +} + + +void LLBottomTray::onContextMenuItemClicked(const LLSD& userdata) +{ + std::string item = userdata.asString(); + LLLineEditor* edit_box = mNearbyChatBar->findChild<LLLineEditor>("chat_box"); + + if (item == "cut") + { + edit_box->cut(); + } + else if (item == "copy") + { + edit_box->copy(); + } + else if (item == "paste") + { + edit_box->paste(); + } + else if (item == "delete") + { + edit_box->doDelete(); + } + else if (item == "select_all") + { + edit_box->selectAll(); + } +} + void LLBottomTray::log(LLView* panel, const std::string& descr) { if (NULL == panel) return; diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index 7640cdcf9d..91ec01654b 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -47,6 +47,11 @@ class LLSpeakButton; class LLNearbyChatBar; class LLIMChiclet; +// Build time optimization, generate once in .cpp file +#ifndef LLBOTTOMTRAY_CPP +extern template class LLBottomTray* LLSingleton<class LLBottomTray>::getInstance(); +#endif + class LLBottomTray : public LLSingleton<LLBottomTray> , public LLPanel @@ -174,6 +179,10 @@ protected: static void* createNearbyChatBar(void* userdata); + void updateContextMenu(S32 x, S32 y, MASK mask); + void onContextMenuItemClicked(const LLSD& userdata); + bool onContextMenuItemEnabled(const LLSD& userdata); + /** * Creates IM Chiclet based on session type (IM chat or Group chat) */ diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp index b41f962ffa..ad59c780f3 100644 --- a/indra/newview/llcallfloater.cpp +++ b/indra/newview/llcallfloater.cpp @@ -35,23 +35,57 @@ #include "llcallfloater.h" +#include "llagentdata.h" // for gAgentID #include "llavatarlist.h" #include "llbottomtray.h" #include "llparticipantlist.h" #include "llspeakers.h" +class LLNonAvatarCaller : public LLAvatarListItem +{ +public: + LLNonAvatarCaller() : LLAvatarListItem(false) + { + + } + BOOL postBuild() + { + BOOL rv = LLAvatarListItem::postBuild(); + + if (rv) + { + setOnline(true); + showLastInteractionTime(false); + setShowProfileBtn(false); + setShowInfoBtn(false); + } + return rv; + } + + void setSpeakerId(const LLUUID& id) { mSpeakingIndicator->setSpeakerId(id); } +}; + + +static void* create_non_avatar_caller(void*) +{ + return new LLNonAvatarCaller; +} + LLCallFloater::LLCallFloater(const LLSD& key) : LLDockableFloater(NULL, key) , mSpeakerManager(NULL) , mPaticipants(NULL) , mAvatarList(NULL) +, mNonAvatarCaller(NULL) +, mVoiceType(VC_LOCAL_CHAT) { - + mFactoryMap["non_avatar_caller"] = LLCallbackMap(create_non_avatar_caller, NULL); } LLCallFloater::~LLCallFloater() { + mChannelChangedConnection.disconnect(); delete mPaticipants; mPaticipants = NULL; } @@ -61,7 +95,9 @@ BOOL LLCallFloater::postBuild() { LLDockableFloater::postBuild(); mAvatarList = getChild<LLAvatarList>("speakers_list"); + childSetAction("leave_call_btn", boost::bind(&LLCallFloater::leaveCall, this)); + mNonAvatarCaller = getChild<LLNonAvatarCaller>("non_avatar_caller"); LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("speak_panel"); @@ -69,11 +105,13 @@ BOOL LLCallFloater::postBuild() anchor_panel, this, getDockTongue(), LLDockControl::TOP)); + initAgentData(); + // update list for current session updateSession(); // subscribe to to be notified Voice Channel is changed - LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::onCurrentChannelChanged, this, _1)); + mChannelChangedConnection = LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::onCurrentChannelChanged, this, _1)); return TRUE; } @@ -85,6 +123,16 @@ void LLCallFloater::onOpen(const LLSD& /*key*/) ////////////////////////////////////////////////////////////////////////// /// PRIVATE SECTION ////////////////////////////////////////////////////////////////////////// + +void LLCallFloater::leaveCall() +{ + LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel(); + if (voice_channel && voice_channel->isActive()) + { + voice_channel->deactivate(); + } +} + void LLCallFloater::updateSession() { LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel(); @@ -110,6 +158,19 @@ void LLCallFloater::updateSession() if (im_session) { mSpeakerManager = LLIMModel::getInstance()->getSpeakerManager(session_id); + switch (im_session->mType) + { + case IM_NOTHING_SPECIAL: + case IM_SESSION_P2P_INVITE: + mVoiceType = VC_PEER_TO_PEER; + break; + case IM_SESSION_CONFERENCE_START: + mVoiceType = VC_AD_HOC_CHAT; + break; + default: + mVoiceType = VC_GROUP_CHAT; + break; + } } if (NULL == mSpeakerManager) @@ -117,22 +178,98 @@ void LLCallFloater::updateSession() // by default let show nearby chat participants mSpeakerManager = LLLocalSpeakerMgr::getInstance(); lldebugs << "Set DEFAULT speaker manager" << llendl; + mVoiceType = VC_LOCAL_CHAT; } + updateTitle(); + + //hide "Leave Call" button for nearby chat + bool is_local_chat = mVoiceType == VC_LOCAL_CHAT; + childSetVisible("leave_btn_panel", !is_local_chat); + refreshPartisipantList(); } void LLCallFloater::refreshPartisipantList() { delete mPaticipants; + mPaticipants = NULL; mAvatarList->clear(); - bool do_not_use_context_menu_in_local_chat = LLLocalSpeakerMgr::getInstance() != mSpeakerManager; - mPaticipants = new LLParticipantList(mSpeakerManager, mAvatarList, do_not_use_context_menu_in_local_chat); + bool non_avatar_caller = false; + if (VC_PEER_TO_PEER == mVoiceType) + { + LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(mSpeakerManager->getSessionID()); + non_avatar_caller = !session->mOtherParticipantIsAvatar; + if (non_avatar_caller) + { + mNonAvatarCaller->setSpeakerId(session->mOtherParticipantID); + mNonAvatarCaller->setName(session->mName); + } + } + + mNonAvatarCaller->setVisible(non_avatar_caller); + mAvatarList->setVisible(!non_avatar_caller); + + if (!non_avatar_caller) + { + bool do_not_use_context_menu_in_local_chat = LLLocalSpeakerMgr::getInstance() != mSpeakerManager; + mPaticipants = new LLParticipantList(mSpeakerManager, mAvatarList, do_not_use_context_menu_in_local_chat); + + if (!do_not_use_context_menu_in_local_chat) + { + mAvatarList->setNoItemsCommentText(getString("no_one_near")); + } + } } void LLCallFloater::onCurrentChannelChanged(const LLUUID& /*session_id*/) { + // Forget speaker manager from the previous session to avoid using it after session was destroyed. + mSpeakerManager = NULL; updateSession(); } + +void LLCallFloater::updateTitle() +{ + LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel(); + std::string title; + switch (mVoiceType) + { + case VC_LOCAL_CHAT: + title = getString("title_nearby"); + break; + case VC_PEER_TO_PEER: + { + LLStringUtil::format_map_t args; + args["[NAME]"] = voice_channel->getSessionName(); + title = getString("title_peer_2_peer", args); + } + break; + case VC_AD_HOC_CHAT: + title = getString("title_adhoc"); + break; + case VC_GROUP_CHAT: + { + LLStringUtil::format_map_t args; + args["[GROUP]"] = voice_channel->getSessionName(); + title = getString("title_group", args); + } + break; + } + + setTitle(title); +} + +void LLCallFloater::initAgentData() +{ + childSetValue("user_icon", gAgentID); + + std::string name; + gCacheName->getFullName(gAgentID, name); + childSetValue("user_text", name); + + LLOutputMonitorCtrl* speaking_indicator = getChild<LLOutputMonitorCtrl>("speaking_indicator"); + speaking_indicator->setSpeakerId(gAgentID); +} //EOF diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h index bfaa1075c4..b615f57d5b 100644 --- a/indra/newview/llcallfloater.h +++ b/indra/newview/llcallfloater.h @@ -37,6 +37,7 @@ #include "lldockablefloater.h" class LLAvatarList; +class LLNonAvatarCaller; class LLParticipantList; class LLSpeakerMgr; @@ -48,8 +49,8 @@ class LLSpeakerMgr; * the Resident's own microphone input volume, the audible volume of each of the other participants, * the Resident's own Voice Morphing settings (if she has subscribed to enable the feature), and Voice Recording. * - * When the Resident is engaged in Group Voice Chat, the Voice Control Panel also provides an - * 'End Call' button to allow the Resident to leave that voice channel. + * When the Resident is engaged in any chat except Nearby Chat, the Voice Control Panel also provides an + * 'Leave Call' button to allow the Resident to leave that voice channel. */ class LLCallFloater : public LLDockableFloater { @@ -61,6 +62,16 @@ public: /*virtual*/ void onOpen(const LLSD& key); private: + typedef enum e_voice_controls_type + { + VC_LOCAL_CHAT, + VC_GROUP_CHAT, + VC_AD_HOC_CHAT, + VC_PEER_TO_PEER + }EVoiceControls; + + void leaveCall(); + /** * Updates mSpeakerManager and list according to current Voice Channel * @@ -74,11 +85,17 @@ private: */ void refreshPartisipantList(); void onCurrentChannelChanged(const LLUUID& session_id); + void updateTitle(); + void initAgentData(); private: LLSpeakerMgr* mSpeakerManager; LLParticipantList* mPaticipants; LLAvatarList* mAvatarList; + LLNonAvatarCaller* mNonAvatarCaller; + EVoiceControls mVoiceType; + + boost::signals2::connection mChannelChangedConnection; }; diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index caf9c08057..5e17770314 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -78,7 +78,7 @@ public: { LLMuteList::getInstance()->add(LLMute(getAvatarId(), mFrom, LLMute::OBJECT)); - LLSideTray::getInstance()->showPanel("panel_block_list_sidetray", LLSD().insert("blocked_to_select", getAvatarId())); + LLSideTray::getInstance()->showPanel("panel_block_list_sidetray", LLSD().with("blocked_to_select", getAvatarId())); } } @@ -160,11 +160,11 @@ public: { if (mSourceType == CHAT_SOURCE_OBJECT) { - LLFloaterReg::showInstance("inspect_object", LLSD().insert("object_id", mAvatarID)); + LLFloaterReg::showInstance("inspect_object", LLSD().with("object_id", mAvatarID)); } else if (mSourceType == CHAT_SOURCE_AGENT) { - LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", mAvatarID)); + LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", mAvatarID)); } //if chat source is system, you may add "else" here to define behaviour. } @@ -267,30 +267,13 @@ protected: } private: - std::string appendTime(const LLChat& chat)
- {
- time_t utc_time;
- utc_time = time_corrected();
- std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:["
- +LLTrans::getString("TimeMin")+"] ";
-
- LLSD substitution;
-
- substitution["datetime"] = (S32) utc_time;
- LLStringUtil::format (timeStr, substitution);
-
- return timeStr;
- }
- void setTimeField(const LLChat& chat) { LLTextBox* time_box = getChild<LLTextBox>("time_box"); LLRect rect_before = time_box->getRect(); - std::string time_value = appendTime(chat); - - time_box->setValue(time_value); + time_box->setValue(chat.mTimeStr); // set necessary textbox width to fit all text time_box->reshapeToFitText(); @@ -302,7 +285,7 @@ private: time_box->translate(delta_pos_x, delta_pos_y); //... & change width of the name control - LLTextBox* user_name = getChild<LLTextBox>("user_name"); + LLView* user_name = getChild<LLView>("user_name"); const LLRect& user_rect = user_name->getRect(); user_name->reshape(user_rect.getWidth() + delta_pos_x, user_rect.getHeight()); } diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index f41e326dd0..588855d088 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -595,8 +595,49 @@ void LLAdHocChiclet::setCounter(S32 counter) setShowNewMessagesIcon(counter); } +void LLAdHocChiclet::createPopupMenu() +{ + if(mPopupMenu) + { + llwarns << "Menu already exists" << llendl; + return; + } + if(getSessionId().isNull()) + { + return; + } + + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + registrar.add("IMChicletMenu.Action", boost::bind(&LLAdHocChiclet::onMenuItemClicked, this, _2)); + + mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL> + ("menu_imchiclet_adhoc.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); +} + +void LLAdHocChiclet::onMenuItemClicked(const LLSD& user_data) +{ + std::string level = user_data.asString(); + LLUUID group_id = getSessionId(); + + if("end" == level) + { + LLGroupActions::endIM(group_id); + } +} + BOOL LLAdHocChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask) { + if(!mPopupMenu) + { + createPopupMenu(); + } + + if (mPopupMenu) + { + mPopupMenu->arrangeAndClear(); + LLMenuGL::showPopup(this, mPopupMenu, x, y); + } + return TRUE; } @@ -1362,7 +1403,7 @@ void LLChicletNotificationCounterCtrl::setCounter(S32 counter) LLRect LLChicletNotificationCounterCtrl::getRequiredRect() { LLRect rc; - S32 text_width = getContentsRect().getWidth(); + S32 text_width = getTextPixelWidth(); rc.mRight = rc.mLeft + llmax(text_width, mInitialWidth); @@ -1415,6 +1456,28 @@ void LLChicletGroupIconCtrl::setValue(const LLSD& value ) ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// +LLChicletInvOfferIconCtrl::LLChicletInvOfferIconCtrl(const Params& p) +: LLChicletAvatarIconCtrl(p) + , mDefaultIcon(p.default_icon) +{ +} + +void LLChicletInvOfferIconCtrl::setValue(const LLSD& value ) +{ + if(value.asUUID().isNull()) + { + LLIconCtrl::setValue(mDefaultIcon); + } + else + { + LLChicletAvatarIconCtrl::setValue(value); + } +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + LLChicletSpeakerCtrl::LLChicletSpeakerCtrl(const Params&p) : LLOutputMonitorCtrl(p) { @@ -1466,4 +1529,60 @@ BOOL LLScriptChiclet::handleMouseDown(S32 x, S32 y, MASK mask) return LLChiclet::handleMouseDown(x, y, mask); } +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +static const std::string INVENTORY_USER_OFFER ("UserGiveItem"); + +LLInvOfferChiclet::Params::Params() +{ + // *TODO Vadim: Get rid of hardcoded values. + rect(CHICLET_RECT); + icon.rect(CHICLET_ICON_RECT); +} + +LLInvOfferChiclet::LLInvOfferChiclet(const Params&p) + : LLIMChiclet(p) + , mChicletIconCtrl(NULL) +{ + LLChicletInvOfferIconCtrl::Params icon_params = p.icon; + mChicletIconCtrl = LLUICtrlFactory::create<LLChicletInvOfferIconCtrl>(icon_params); + // Let "new message" icon be on top, else it will be hidden behind chiclet icon. + addChildInBack(mChicletIconCtrl); +} + +void LLInvOfferChiclet::setSessionId(const LLUUID& session_id) +{ + setShowNewMessagesIcon( getSessionId() != session_id ); + + LLIMChiclet::setSessionId(session_id); + LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(session_id); + LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id); + if(notification) + { + setToolTip(notification->getSubstitutions()["TITLE"].asString()); + } + + if ( notification && notification->getName() == INVENTORY_USER_OFFER ) + { + mChicletIconCtrl->setValue(notification->getPayload()["from_id"]); + } + else + { + mChicletIconCtrl->setValue(LLUUID::null); + } +} + +void LLInvOfferChiclet::onMouseDown() +{ + LLScriptFloaterManager::instance().toggleScriptFloater(getSessionId()); +} + +BOOL LLInvOfferChiclet::handleMouseDown(S32 x, S32 y, MASK mask) +{ + onMouseDown(); + return LLChiclet::handleMouseDown(x, y, mask); +} + // EOF diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h index 1ea141e6c4..c75ad2b546 100644 --- a/indra/newview/llchiclet.h +++ b/indra/newview/llchiclet.h @@ -148,6 +148,39 @@ protected: }; /** + * Class for displaying icon in inventory offer chiclet. + */ +class LLChicletInvOfferIconCtrl : public LLChicletAvatarIconCtrl +{ +public: + + struct Params : + public LLInitParam::Block<Params, LLChicletAvatarIconCtrl::Params> + { + Optional<std::string> default_icon; + + Params() + : default_icon("default_icon", "Generic_Object_Small") + { + avatar_id = LLUUID::null; + }; + }; + + /** + * Sets icon, if value is LLUUID::null - default icon will be set. + */ + virtual void setValue(const LLSD& value ); + +protected: + + LLChicletInvOfferIconCtrl(const Params& p); + friend class LLUICtrlFactory; + +private: + std::string mDefaultIcon; +}; + +/** * Class for displaying of speaker's voice indicator */ class LLChicletSpeakerCtrl : public LLOutputMonitorCtrl @@ -518,6 +551,17 @@ protected: friend class LLUICtrlFactory; /** + * Creates chiclet popup menu. Will create AdHoc Chat menu + * based on other participant's id. + */ + virtual void createPopupMenu(); + + /** + * Processes clicks on chiclet popup menu. + */ + virtual void onMenuItemClicked(const LLSD& user_data); + + /** * Displays popup menu. */ virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); @@ -574,6 +618,45 @@ private: }; /** + * Chiclet for inventory offer script floaters. + */ +class LLInvOfferChiclet: public LLIMChiclet +{ +public: + + struct Params : public LLInitParam::Block<Params, LLIMChiclet::Params> + { + Optional<LLChicletInvOfferIconCtrl::Params> icon; + + Params(); + }; + + /*virtual*/ void setSessionId(const LLUUID& session_id); + + /*virtual*/ void setCounter(S32 counter){} + + /*virtual*/ S32 getCounter() { return 0; } + + /** + * Toggle script floater + */ + /*virtual*/ void onMouseDown(); + + /** + * Override default handler + */ + /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask); + + +protected: + LLInvOfferChiclet(const Params&); + friend class LLUICtrlFactory; + +private: + LLChicletInvOfferIconCtrl* mChicletIconCtrl; +}; + +/** * Implements Group chat chiclet. */ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver diff --git a/indra/newview/llcurrencyuimanager.cpp b/indra/newview/llcurrencyuimanager.cpp index 319cbf8209..544711a862 100644 --- a/indra/newview/llcurrencyuimanager.cpp +++ b/indra/newview/llcurrencyuimanager.cpp @@ -85,6 +85,7 @@ public: S32 mUSDCurrencyEstimatedCost; bool mLocalCurrencyEstimated; std::string mLocalCurrencyEstimatedCost; + bool mSupportsInternationalBilling; std::string mSiteConfirm; bool mBought; @@ -137,6 +138,7 @@ LLCurrencyUIManager::Impl::Impl(LLPanel& dialog) mError(false), mUserCurrencyBuy(2000), // note, this is a default, real value set in llfloaterbuycurrency.cpp mUserEnteredCurrencyBuy(false), + mSupportsInternationalBilling(false), mBought(false), mTransactionType(TransactionNone), mTransaction(0), mCurrencyChanged(false) @@ -207,6 +209,7 @@ void LLCurrencyUIManager::Impl::finishCurrencyInfo() if (mLocalCurrencyEstimated) { mLocalCurrencyEstimatedCost = currency["estimatedLocalCost"].asString(); + mSupportsInternationalBilling = true; } S32 newCurrencyBuy = currency["currencyBuy"].asInt(); @@ -464,6 +467,9 @@ void LLCurrencyUIManager::Impl::updateUI() mPanel.childSetTextArg("currency_est", "[LOCALAMOUNT]", getLocalEstimate()); mPanel.childSetVisible("currency_est", hasEstimate() && mUserCurrencyBuy > 0); + mPanel.childSetVisible("currency_links", mSupportsInternationalBilling); + mPanel.childSetVisible("exchange_rate_note", mSupportsInternationalBilling); + if (mPanel.childIsEnabled("buy_btn") ||mPanel.childIsVisible("currency_est") || mPanel.childIsVisible("error_web")) diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp index 9bc7221dc8..c7c79401a0 100644 --- a/indra/newview/lldynamictexture.cpp +++ b/indra/newview/lldynamictexture.cpp @@ -141,11 +141,12 @@ void LLViewerDynamicTexture::preRender(BOOL clear_depth) gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); } // Set up camera - mCamera.setOrigin(*LLViewerCamera::getInstance()); - mCamera.setAxes(*LLViewerCamera::getInstance()); - mCamera.setAspect(LLViewerCamera::getInstance()->getAspect()); - mCamera.setView(LLViewerCamera::getInstance()->getView()); - mCamera.setNear(LLViewerCamera::getInstance()->getNear()); + LLViewerCamera* camera = LLViewerCamera::getInstance(); + mCamera.setOrigin(*camera); + mCamera.setAxes(*camera); + mCamera.setAspect(camera->getAspect()); + mCamera.setView(camera->getView()); + mCamera.setNear(camera->getNear()); glViewport(mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight); if (clear_depth) @@ -174,11 +175,12 @@ void LLViewerDynamicTexture::postRender(BOOL success) gViewerWindow->setup2DViewport(); // restore camera - LLViewerCamera::getInstance()->setOrigin(mCamera); - LLViewerCamera::getInstance()->setAxes(mCamera); - LLViewerCamera::getInstance()->setAspect(mCamera.getAspect()); - LLViewerCamera::getInstance()->setView(mCamera.getView()); - LLViewerCamera::getInstance()->setNear(mCamera.getNear()); + LLViewerCamera* camera = LLViewerCamera::getInstance(); + camera->setOrigin(mCamera); + camera->setAxes(mCamera); + camera->setAspect(mCamera.getAspect()); + camera->setView(mCamera.getView()); + camera->setNear(mCamera.getNear()); } //----------------------------------------------------------------------------- diff --git a/indra/newview/lleventnotifier.cpp b/indra/newview/lleventnotifier.cpp index 9c8af16535..b64799bd86 100644 --- a/indra/newview/lleventnotifier.cpp +++ b/indra/newview/lleventnotifier.cpp @@ -197,7 +197,7 @@ bool LLEventNotification::handleResponse(const LLSD& notification, const LLSD& r break; } case 1: - LLFloaterReg::showInstance("search", LLSD().insert("category", "events").insert("id", S32(getEventID()))); + LLFloaterReg::showInstance("search", LLSD().with("category", "events").with("id", S32(getEventID()))); break; case 2: break; diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 31f1462a12..eef774426a 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -1378,7 +1378,8 @@ F32 LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) LLVector3 center = getPositionAgent(); LLVector3 size = (mExtents[1] - mExtents[0]) * 0.5f; - LLVector3 lookAt = center - LLViewerCamera::getInstance()->getOrigin(); + LLViewerCamera* camera = LLViewerCamera::getInstance(); + LLVector3 lookAt = center - camera->getOrigin(); F32 dist = lookAt.normVec() ; //get area of circle around node @@ -1393,7 +1394,7 @@ F32 LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) } else { - cos_angle_to_view_dir = lookAt * LLViewerCamera::getInstance()->getXAxis() ; + cos_angle_to_view_dir = lookAt * camera->getXAxis() ; mImportanceToCamera = LLFace::calcImportanceToCamera(cos_angle_to_view_dir, dist) ; } @@ -1443,8 +1444,9 @@ F32 LLFace::calcImportanceToCamera(F32 cos_angle_to_view_dir, F32 dist) if(cos_angle_to_view_dir > LLViewerCamera::getInstance()->getCosHalfFov() && dist < FACE_IMPORTANCE_TO_CAMERA_OVER_DISTANCE[FACE_IMPORTANCE_LEVEL - 1][0]) { - F32 camera_moving_speed = LLViewerCamera::getInstance()->getAverageSpeed() ; - F32 camera_angular_speed = LLViewerCamera::getInstance()->getAverageAngularSpeed(); + LLViewerCamera* camera = LLViewerCamera::getInstance(); + F32 camera_moving_speed = camera->getAverageSpeed() ; + F32 camera_angular_speed = camera->getAverageAngularSpeed(); if(camera_moving_speed > 10.0f || camera_angular_speed > 1.0f) { diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 8406ddeeca..17b0710813 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -355,8 +355,8 @@ struct LLFavoritesSort }; LLFavoritesBarCtrl::Params::Params() -: chevron_button_tool_tip("chevron_button_tool_tip"), - image_drag_indication("image_drag_indication") +: image_drag_indication("image_drag_indication"), + chevron_button("chevron_button") { } @@ -365,7 +365,6 @@ LLFavoritesBarCtrl::LLFavoritesBarCtrl(const LLFavoritesBarCtrl::Params& p) mFont(p.font.isProvided() ? p.font() : LLFontGL::getFontSansSerifSmall()), mPopupMenuHandle(), mInventoryItemsPopupMenuHandle(), - mChevronButtonToolTip(p.chevron_button_tool_tip), mImageDragIndication(p.image_drag_indication), mShowDragMarker(FALSE), mLandingTab(NULL), @@ -381,6 +380,12 @@ LLFavoritesBarCtrl::LLFavoritesBarCtrl(const LLFavoritesBarCtrl::Params& p) boost::bind(&LLFavoritesBarCtrl::enableSelected, this, _2)); gInventory.addObserver(this); + + //make chevron button + LLButton::Params chevron_button_params(p.chevron_button); + chevron_button_params.click_callback.function(boost::bind(&LLFavoritesBarCtrl::showDropDownMenu, this)); + mChevronButton = LLUICtrlFactory::create<LLButton> (chevron_button_params); + addChild(mChevronButton); } LLFavoritesBarCtrl::~LLFavoritesBarCtrl() @@ -653,10 +658,6 @@ void LLFavoritesBarCtrl::updateButtons(U32 bar_width) buttonXMLNode->getAttributeS32("left", buttonHGap); S32 count = mItems.count(); - - const S32 buttonHPad = LLUI::sSettingGroups["config"]->getS32("ButtonHPad"); - const S32 chevron_button_width = mFont->getWidth(">>") + buttonHPad * 2; - S32 buttons_space = bar_width - buttonHGap; S32 first_drop_down_item = count; @@ -670,7 +671,7 @@ void LLFavoritesBarCtrl::updateButtons(U32 bar_width) { // There is no space for all buttons. // Calculating the number of buttons, that are fit with chevron button - buttons_space -= chevron_button_width + buttonHGap; + buttons_space -= mChevronButton->getRect().getWidth() + buttonHGap; while (i >= 0 && buttons_width > buttons_space) { buttons_width -= buttonWidth + buttonHGap; @@ -718,7 +719,7 @@ void LLFavoritesBarCtrl::updateButtons(U32 bar_width) child_list_const_iter_t cur_it = child_it++; LLView* viewp = *cur_it; LLButton* button = dynamic_cast<LLButton*>(viewp); - if (button) + if (button && (button != mChevronButton)) { removeChild(button); delete button; @@ -732,55 +733,15 @@ void LLFavoritesBarCtrl::updateButtons(U32 bar_width) if (mFirstDropDownItem != count) { // Chevron button should stay right aligned - LLView *chevron_button = findChildView(std::string(">>"), FALSE); - if (chevron_button) - { - LLRect rect; - rect.setOriginAndSize(bar_width - chevron_button_width - buttonHGap, 0, chevron_button_width, getRect().getHeight()); - chevron_button->setRect(rect); - chevron_button->setVisible(TRUE); - mChevronRect = rect; - } - else - { - static LLButton::Params default_button_params(LLUICtrlFactory::getDefaultParams<LLButton>()); - std::string flat_icon = "transparent.j2c"; - std::string hover_icon = default_button_params.image_unselected.name; - std::string hover_icon_selected = default_button_params.image_selected.name; - - LLButton::Params bparams; - - LLRect rect; - rect.setOriginAndSize(bar_width - chevron_button_width - buttonHGap, 0, chevron_button_width, getRect().getHeight()); - - bparams.follows.flags (FOLLOWS_LEFT | FOLLOWS_BOTTOM); - bparams.image_unselected.name(flat_icon); - bparams.image_disabled.name(flat_icon); - bparams.image_selected.name(hover_icon_selected); - bparams.image_hover_selected.name(hover_icon_selected); - bparams.image_disabled_selected.name(hover_icon_selected); - bparams.image_hover_unselected.name(hover_icon); - bparams.rect (rect); - bparams.tab_stop(false); - bparams.font(mFont); - bparams.name(">>"); - bparams.label(">>"); - bparams.tool_tip(mChevronButtonToolTip); - bparams.click_callback.function(boost::bind(&LLFavoritesBarCtrl::showDropDownMenu, this)); - - addChildInBack(LLUICtrlFactory::create<LLButton> (bparams)); - - mChevronRect = rect; - } + LLRect rect; + rect.setOriginAndSize(bar_width - mChevronButton->getRect().getWidth() - buttonHGap, 0, mChevronButton->getRect().getWidth(), mChevronButton->getRect().getHeight()); + mChevronButton->setRect(rect); + mChevronButton->setVisible(TRUE); } else { // Hide chevron button if all items are visible on bar - LLView *chevron_button = findChildView(std::string(">>"), FALSE); - if (chevron_button) - { - chevron_button->setVisible(FALSE); - } + mChevronButton->setVisible(FALSE); } } @@ -917,7 +878,7 @@ void LLFavoritesBarCtrl::showDropDownMenu() if (menu->getButtonRect().isEmpty()) { - menu->setButtonRect(mChevronRect, this); + menu->setButtonRect(mChevronButton->getRect(), this); } LLMenuGL::showPopup(this, menu, getRect().getWidth() - menu->getRect().getWidth(), 0); @@ -981,7 +942,7 @@ void LLFavoritesBarCtrl::showDropDownMenu() menu->buildDrawLabels(); menu->updateParent(LLMenuGL::sMenuContainer); - menu->setButtonRect(mChevronRect, this); + menu->setButtonRect(mChevronButton->getRect(), this); LLMenuGL::showPopup(this, menu, getRect().getWidth() - max_width, 0); diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h index 20a324c67c..b2fe3cc651 100644 --- a/indra/newview/llfavoritesbar.h +++ b/indra/newview/llfavoritesbar.h @@ -33,6 +33,7 @@ #ifndef LL_LLFAVORITESBARCTRL_H #define LL_LLFAVORITESBARCTRL_H +#include "llbutton.h" #include "lluictrl.h" #include "llinventoryobserver.h" @@ -43,8 +44,8 @@ class LLFavoritesBarCtrl : public LLUICtrl, public LLInventoryObserver public: struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> { - Optional<std::string> chevron_button_tool_tip; Optional<LLUIImage*> image_drag_indication; + Optional<LLButton::Params> chevron_button; Params(); }; @@ -105,9 +106,7 @@ protected: item_names_array_t mItemNamesCache; LLUUID mSelectedItemID; - LLRect mChevronRect; - std::string mChevronButtonToolTip; LLUIImage* mImageDragIndication; private: @@ -150,6 +149,7 @@ private: BOOL mShowDragMarker; LLUICtrl* mLandingTab; LLUICtrl* mLastTab; + LLButton* mChevronButton; LLUUID mDragItemId; BOOL mStartDrag; diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index 80b0a430e0..68fc69b4f7 100644 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -269,10 +269,10 @@ LLSD LLFloaterAbout::getInfo() info["J2C_VERSION"] = LLImageJ2C::getEngineInfo(); bool want_fullname = true; info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : LLSD(); - info["VIVOX_VERSION"] = gVoiceClient ? gVoiceClient->getAPIVersion() : "Unknown"; + info["VIVOX_VERSION"] = gVoiceClient ? gVoiceClient->getAPIVersion() : LLTrans::getString("NotConnected"); // TODO: Implement media plugin version query - info["QT_WEBKIT_VERSION"] = "4.5.2"; + info["QT_WEBKIT_VERSION"] = "4.5.2 (version number hard-coded)"; if (gPacketsIn > 0) { @@ -312,7 +312,7 @@ public: add("getInfo", "Request an LLSD::Map containing information used to populate About box", &LLFloaterAboutListener::getInfo, - LLSD().insert("reply", LLSD())); + LLSD().with("reply", LLSD())); } private: diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index 9d05d9de34..5072bc8c82 100644 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -168,6 +168,7 @@ LLFloaterGesture::~LLFloaterGesture() LLGestureManager::instance().removeObserver(mObserver); delete mObserver; mObserver = NULL; + gInventory.removeObserver(this); } // virtual diff --git a/indra/newview/llfloaterinventory.cpp b/indra/newview/llfloaterinventory.cpp index db38fc0fb3..4a2e1913cd 100644 --- a/indra/newview/llfloaterinventory.cpp +++ b/indra/newview/llfloaterinventory.cpp @@ -107,10 +107,14 @@ LLInventoryPanel* LLFloaterInventory::getPanel() // static LLFloaterInventory* LLFloaterInventory::showAgentInventory() { + // Hack to generate semi-unique key for each inventory floater. + static S32 instance_num = 0; + instance_num = (instance_num + 1) % S32_MAX; + LLFloaterInventory* iv = NULL; if (!gAgent.cameraMouselook()) { - iv = LLFloaterReg::showTypedInstance<LLFloaterInventory>("inventory", LLSD()); + iv = LLFloaterReg::showTypedInstance<LLFloaterInventory>("inventory", LLSD(instance_num)); } return iv; } diff --git a/indra/newview/llfloatermediasettings.cpp b/indra/newview/llfloatermediasettings.cpp index 44e68d7745..16a76723eb 100644 --- a/indra/newview/llfloatermediasettings.cpp +++ b/indra/newview/llfloatermediasettings.cpp @@ -41,6 +41,7 @@ #include "lluictrlfactory.h" #include "llbutton.h" #include "llselectmgr.h" +#include "llsdutil.h" LLFloaterMediaSettings* LLFloaterMediaSettings::sInstance = NULL; @@ -57,7 +58,6 @@ LLFloaterMediaSettings::LLFloaterMediaSettings(const LLSD& key) mMultipleMedia(false), mMultipleValidMedia(false) { -// LLUICtrlFactory::getInstance()->buildFloater(this, "floater_media_settings.xml"); } //////////////////////////////////////////////////////////////////////////////// @@ -145,15 +145,15 @@ LLFloaterMediaSettings* LLFloaterMediaSettings::getInstance() //static void LLFloaterMediaSettings::apply() { - LLSD settings; + LLSD settings; sInstance->mPanelMediaSettingsGeneral->preApply(); - sInstance->mPanelMediaSettingsGeneral->getValues( settings ); + sInstance->mPanelMediaSettingsGeneral->getValues( settings ); sInstance->mPanelMediaSettingsSecurity->preApply(); sInstance->mPanelMediaSettingsSecurity->getValues( settings ); sInstance->mPanelMediaSettingsPermissions->preApply(); - sInstance->mPanelMediaSettingsPermissions->getValues( settings ); + sInstance->mPanelMediaSettingsPermissions->getValues( settings ); LLSelectMgr::getInstance()->selectionSetMedia( LLTextureEntry::MF_HAS_MEDIA ); - LLSelectMgr::getInstance()->selectionSetMediaData(settings); + LLSelectMgr::getInstance()->selectionSetMediaData(settings); sInstance->mPanelMediaSettingsGeneral->postApply(); sInstance->mPanelMediaSettingsSecurity->postApply(); sInstance->mPanelMediaSettingsPermissions->postApply(); @@ -183,7 +183,12 @@ void LLFloaterMediaSettings::initValues( const LLSD& media_settings, bool editab sInstance->mPanelMediaSettingsPermissions-> initValues( sInstance->mPanelMediaSettingsPermissions, media_settings, editable ); - + + // Squirrel away initial values + sInstance->mInitialValues.clear(); + sInstance->mPanelMediaSettingsGeneral->getValues( sInstance->mInitialValues ); + sInstance->mPanelMediaSettingsSecurity->getValues( sInstance->mInitialValues ); + sInstance->mPanelMediaSettingsPermissions->getValues( sInstance->mInitialValues ); } //////////////////////////////////////////////////////////////////////////////// @@ -206,11 +211,10 @@ void LLFloaterMediaSettings::clearValues( bool editable) { // clean up all panels before updating sInstance->mPanelMediaSettingsGeneral ->clearValues(sInstance->mPanelMediaSettingsGeneral, editable); - sInstance->mPanelMediaSettingsSecurity ->clearValues(sInstance->mPanelMediaSettingsSecurity, editable); + sInstance->mPanelMediaSettingsSecurity ->clearValues(sInstance->mPanelMediaSettingsSecurity, editable); sInstance->mPanelMediaSettingsPermissions->clearValues(sInstance->mPanelMediaSettingsPermissions, editable); } - //////////////////////////////////////////////////////////////////////////////// // static void LLFloaterMediaSettings::onBtnOK( void* userdata ) @@ -235,7 +239,7 @@ void LLFloaterMediaSettings::onBtnApply( void* userdata ) // static void LLFloaterMediaSettings::onBtnCancel( void* userdata ) { - sInstance->closeFloater(); + sInstance->closeFloater(); } //////////////////////////////////////////////////////////////////////////////// @@ -250,7 +254,6 @@ void LLFloaterMediaSettings::onTabChanged(void* user_data, bool from_click) // void LLFloaterMediaSettings::enableOkApplyBtns( bool enable ) { - setCtrlsEnabled( enable ); childSetEnabled( "OK", enable ); childSetEnabled( "Apply", enable ); } @@ -265,17 +268,36 @@ const std::string LLFloaterMediaSettings::getHomeUrl() return std::string( "" ); } - //////////////////////////////////////////////////////////////////////////////// -// -bool LLFloaterMediaSettings::passesWhiteList( const std::string& test_url ) +// virtual +void LLFloaterMediaSettings::draw() { - // sanity check - don't think this can happen - if ( mPanelMediaSettingsSecurity ) - // version in security dialog code is specialized so we pass in - // empty string for first parameter since it's not used - return mPanelMediaSettingsSecurity->passesWhiteList( "", test_url ); - else - // this is all we can do - return false; + // *NOTE: The code below is very inefficient. Better to do this + // only when data change. + // Every frame, check to see what the values are. If they are not + // the same as the default media data, enable the OK/Apply buttons + LLSD settings; + sInstance->mPanelMediaSettingsGeneral->getValues( settings ); + sInstance->mPanelMediaSettingsSecurity->getValues( settings ); + sInstance->mPanelMediaSettingsPermissions->getValues( settings ); + + bool values_changed = false; + + LLSD::map_const_iterator iter = settings.beginMap(); + LLSD::map_const_iterator end = settings.endMap(); + for ( ; iter != end; ++iter ) + { + const std::string ¤t_key = iter->first; + const LLSD ¤t_value = iter->second; + if ( ! llsd_equals(current_value, mInitialValues[current_key])) + { + values_changed = true; + break; + } + } + + enableOkApplyBtns(values_changed); + + LLFloater::draw(); } + diff --git a/indra/newview/llfloatermediasettings.h b/indra/newview/llfloatermediasettings.h index 17a47cb0f5..b72e3d855d 100644 --- a/indra/newview/llfloatermediasettings.h +++ b/indra/newview/llfloatermediasettings.h @@ -54,10 +54,12 @@ public: static void apply(); static void initValues( const LLSD& media_settings , bool editable); static void clearValues( bool editable); - void enableOkApplyBtns( bool enable ); - LLPanelMediaSettingsSecurity* getPanelSecurity(){return mPanelMediaSettingsSecurity;}; - const std::string getHomeUrl(); - bool passesWhiteList( const std::string& test_url ); + + LLPanelMediaSettingsSecurity* getPanelSecurity(){return mPanelMediaSettingsSecurity;}; + const std::string getHomeUrl(); + //bool passesWhiteList( const std::string& test_url ); + + virtual void draw(); bool mIdenticalHasMediaInfo; bool mMultipleMedia; @@ -73,7 +75,6 @@ protected: LLPanelMediaSettingsSecurity* mPanelMediaSettingsSecurity; LLPanelMediaSettingsPermissions* mPanelMediaSettingsPermissions; - static void onBtnOK(void*); static void onBtnCancel(void*); static void onBtnApply(void*); @@ -83,6 +84,10 @@ protected: static LLFloaterMediaSettings* sInstance; private: + + void enableOkApplyBtns( bool enable ); + + LLSD mInitialValues; bool mWaitingToClose; }; diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 83c784c1f7..1c1f27a259 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -60,6 +60,7 @@ #include "llkeyboard.h" #include "llmodaldialog.h" #include "llnavigationbar.h" +#include "llnearbychat.h" #include "llnotifications.h" #include "llnotificationsutil.h" #include "llpanellogin.h" @@ -362,11 +363,17 @@ BOOL LLFloaterPreference::postBuild() { gSavedSettings.getControl("PlainTextChatHistory")->getSignal()->connect(boost::bind(&LLIMFloater::processChatHistoryStyleUpdate, _2)); + gSavedSettings.getControl("PlainTextChatHistory")->getSignal()->connect(boost::bind(&LLNearbyChat::processChatHistoryStyleUpdate, _2)); + LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core"); if (!tabcontainer->selectTab(gSavedSettings.getS32("LastPrefTab"))) tabcontainer->selectFirstTab(); S32 show_avatar_nametag_options = gSavedSettings.getS32("AvatarNameTagMode"); handleNameTagOptionChanged(LLSD(show_avatar_nametag_options)); + + std::string cache_location = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""); + childSetText("cache_location", cache_location); + return TRUE; } diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp index e2df2ffdf7..4d3724a758 100644 --- a/indra/newview/llfloatersearch.cpp +++ b/indra/newview/llfloatersearch.cpp @@ -37,9 +37,11 @@ #include "lllogininstance.h" #include "lluri.h" #include "llagent.h" +#include "llui.h" LLFloaterSearch::LLFloaterSearch(const LLSD& key) : LLFloater(key), + LLViewerMediaObserver(), mBrowser(NULL) { // declare a map that transforms a category name into @@ -139,6 +141,9 @@ void LLFloaterSearch::search(const LLSD &key) } url += "&r=" + maturity; + // add the current localization information + url += "&lang=" + LLUI::getLanguage(); + // and load the URL in the web view mBrowser->navigateTo(url); } diff --git a/indra/newview/llfloatertestinspectors.cpp b/indra/newview/llfloatertestinspectors.cpp index 09996b0b92..58d5197eaa 100644 --- a/indra/newview/llfloatertestinspectors.cpp +++ b/indra/newview/llfloatertestinspectors.cpp @@ -82,12 +82,12 @@ void LLFloaterTestInspectors::showAvatarInspector(LLUICtrl*, const LLSD& avatar_ id = avatar_id.asUUID(); } // spawns off mouse position automatically - LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", id)); + LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", id)); } void LLFloaterTestInspectors::showObjectInspector(LLUICtrl*, const LLSD& object_id) { - LLFloaterReg::showInstance("inspect_object", LLSD().insert("object_id", object_id)); + LLFloaterReg::showInstance("inspect_object", LLSD().with("object_id", object_id)); } void LLFloaterTestInspectors::onClickAvatar2D() diff --git a/indra/newview/llfloaterwhitelistentry.cpp b/indra/newview/llfloaterwhitelistentry.cpp index 551a5191fc..04dbd38153 100644 --- a/indra/newview/llfloaterwhitelistentry.cpp +++ b/indra/newview/llfloaterwhitelistentry.cpp @@ -81,7 +81,7 @@ void LLFloaterWhiteListEntry::onBtnOK( void* userdata ) { std::string white_list_item = self->mWhiteListEdit->getText(); - panel->addWhiteListItem( white_list_item ); + panel->addWhiteListEntry( white_list_item ); }; self->closeFloater(); diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index 6fe8ed0e4d..fdb2b886a6 100644 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -100,9 +100,9 @@ public: } if (tokens[1].asString() == "inspect") { - LLSD key; - key["group_id"] = group_id; - LLFloaterReg::showInstance("inspect_group", key); + if (group_id.isNull()) + return true; + LLGroupActions::show(group_id); return true; } return false; @@ -113,7 +113,7 @@ LLGroupHandler gGroupHandler; // static void LLGroupActions::search() { - LLFloaterReg::showInstance("search", LLSD().insert("category", "groups")); + LLFloaterReg::showInstance("search", LLSD().with("category", "groups")); } // static diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp index cdb85f5b1c..97cf139f1d 100644 --- a/indra/newview/llgrouplist.cpp +++ b/indra/newview/llgrouplist.cpp @@ -329,7 +329,7 @@ void LLGroupListItem::setActive(bool active) void LLGroupListItem::onInfoBtnClick() { - LLFloaterReg::showInstance("inspect_group", LLSD().insert("group_id", mGroupID)); + LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", mGroupID)); } void LLGroupListItem::onProfileBtnClick() diff --git a/indra/newview/llhudicon.cpp b/indra/newview/llhudicon.cpp index 040027c70d..28b0e7356a 100644 --- a/indra/newview/llhudicon.cpp +++ b/indra/newview/llhudicon.cpp @@ -103,28 +103,29 @@ void LLHUDIcon::renderIcon(BOOL for_select) // put icon above object, and in front // RN: don't use drawable radius, it's fricking HUGE - LLVector3 icon_relative_pos = (LLViewerCamera::getInstance()->getUpAxis() * ~mSourceObject->getRenderRotation()); + LLViewerCamera* camera = LLViewerCamera::getInstance(); + LLVector3 icon_relative_pos = (camera->getUpAxis() * ~mSourceObject->getRenderRotation()); icon_relative_pos.abs(); F32 distance_scale = llmin(mSourceObject->getScale().mV[VX] / icon_relative_pos.mV[VX], mSourceObject->getScale().mV[VY] / icon_relative_pos.mV[VY], mSourceObject->getScale().mV[VZ] / icon_relative_pos.mV[VZ]); F32 up_distance = 0.5f * distance_scale; - LLVector3 icon_position = obj_position + (up_distance * LLViewerCamera::getInstance()->getUpAxis()) * 1.2f; + LLVector3 icon_position = obj_position + (up_distance * camera->getUpAxis()) * 1.2f; LLVector3 icon_to_cam = LLViewerCamera::getInstance()->getOrigin() - icon_position; icon_to_cam.normVec(); icon_position += icon_to_cam * mSourceObject->mDrawable->getRadius() * 1.1f; - mDistance = dist_vec(icon_position, LLViewerCamera::getInstance()->getOrigin()); + mDistance = dist_vec(icon_position, camera->getOrigin()); F32 alpha_factor = for_select ? 1.f : clamp_rescale(mDistance, DIST_START_FADE, DIST_END_FADE, 1.f, 0.f); LLVector3 x_pixel_vec; LLVector3 y_pixel_vec; - LLViewerCamera::getInstance()->getPixelVectors(icon_position, y_pixel_vec, x_pixel_vec); + camera->getPixelVectors(icon_position, y_pixel_vec, x_pixel_vec); F32 scale_factor = 1.f; if (mAnimTimer.getElapsedTimeF32() < ANIM_TIME) @@ -226,26 +227,27 @@ BOOL LLHUDIcon::lineSegmentIntersect(const LLVector3& start, const LLVector3& en // put icon above object, and in front // RN: don't use drawable radius, it's fricking HUGE - LLVector3 icon_relative_pos = (LLViewerCamera::getInstance()->getUpAxis() * ~mSourceObject->getRenderRotation()); + LLViewerCamera* camera = LLViewerCamera::getInstance(); + LLVector3 icon_relative_pos = (camera->getUpAxis() * ~mSourceObject->getRenderRotation()); icon_relative_pos.abs(); F32 distance_scale = llmin(mSourceObject->getScale().mV[VX] / icon_relative_pos.mV[VX], mSourceObject->getScale().mV[VY] / icon_relative_pos.mV[VY], mSourceObject->getScale().mV[VZ] / icon_relative_pos.mV[VZ]); F32 up_distance = 0.5f * distance_scale; - LLVector3 icon_position = obj_position + (up_distance * LLViewerCamera::getInstance()->getUpAxis()) * 1.2f; + LLVector3 icon_position = obj_position + (up_distance * camera->getUpAxis()) * 1.2f; LLVector3 icon_to_cam = LLViewerCamera::getInstance()->getOrigin() - icon_position; icon_to_cam.normVec(); icon_position += icon_to_cam * mSourceObject->mDrawable->getRadius() * 1.1f; - mDistance = dist_vec(icon_position, LLViewerCamera::getInstance()->getOrigin()); + mDistance = dist_vec(icon_position, camera->getOrigin()); LLVector3 x_pixel_vec; LLVector3 y_pixel_vec; - LLViewerCamera::getInstance()->getPixelVectors(icon_position, y_pixel_vec, x_pixel_vec); + camera->getPixelVectors(icon_position, y_pixel_vec, x_pixel_vec); F32 scale_factor = 1.f; if (mAnimTimer.getElapsedTimeF32() < ANIM_TIME) diff --git a/indra/newview/llhudrender.cpp b/indra/newview/llhudrender.cpp index ab0be90def..a02dc3355b 100644 --- a/indra/newview/llhudrender.cpp +++ b/indra/newview/llhudrender.cpp @@ -64,11 +64,12 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent, const LLColor4& color, const BOOL orthographic) { + LLViewerCamera* camera = LLViewerCamera::getInstance(); // Do cheap plane culling - LLVector3 dir_vec = pos_agent - LLViewerCamera::getInstance()->getOrigin(); + LLVector3 dir_vec = pos_agent - camera->getOrigin(); dir_vec /= dir_vec.magVec(); - if (wstr.empty() || (!orthographic && dir_vec * LLViewerCamera::getInstance()->getAtAxis() <= 0.f)) + if (wstr.empty() || (!orthographic && dir_vec * camera->getAtAxis() <= 0.f)) { return; } @@ -82,15 +83,15 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent, } else { - LLViewerCamera::getInstance()->getPixelVectors(pos_agent, up_axis, right_axis); + camera->getPixelVectors(pos_agent, up_axis, right_axis); } - LLCoordFrame render_frame = *LLViewerCamera::getInstance(); + LLCoordFrame render_frame = *camera; LLQuaternion rot; if (!orthographic) { rot = render_frame.getQuaternion(); - rot = rot * LLQuaternion(-F_PI_BY_TWO, LLViewerCamera::getInstance()->getYAxis()); - rot = rot * LLQuaternion(F_PI_BY_TWO, LLViewerCamera::getInstance()->getXAxis()); + rot = rot * LLQuaternion(-F_PI_BY_TWO, camera->getYAxis()); + rot = rot * LLQuaternion(F_PI_BY_TWO, camera->getXAxis()); } else { diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 310eaaec27..9de0b1f827 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -34,6 +34,8 @@ #include "llimfloater.h" +#include "llnotificationsutil.h" + #include "llagent.h" #include "llappviewer.h" #include "llbutton.h" @@ -42,6 +44,7 @@ #include "llchiclet.h" #include "llfloaterchat.h" #include "llfloaterreg.h" +#include "llimfloatercontainer.h" // to replace separate IM Floaters with multifloater container #include "lllineeditor.h" #include "lllogchat.h" #include "llpanelimcontrolpanel.h" @@ -53,10 +56,6 @@ #include "lltransientfloatermgr.h" #include "llinventorymodel.h" -#ifdef USE_IM_CONTAINER - #include "llimfloatercontainer.h" // to replace separate IM Floaters with multifloater container -#endif - LLIMFloater::LLIMFloater(const LLUUID& session_id) @@ -261,11 +260,14 @@ BOOL LLIMFloater::postBuild() //*TODO if session is not initialized yet, add some sort of a warning message like "starting session...blablabla" //see LLFloaterIMPanel for how it is done (IB) -#ifdef USE_IM_CONTAINER - return LLFloater::postBuild(); -#else - return LLDockableFloater::postBuild(); -#endif + if(isChatMultiTab()) + { + return LLFloater::postBuild(); + } + else + { + return LLDockableFloater::postBuild(); + } } // virtual @@ -326,59 +328,69 @@ void LLIMFloater::onSlide() //static LLIMFloater* LLIMFloater::show(const LLUUID& session_id) { -#ifdef USE_IM_CONTAINER - LLIMFloater* target_floater = findInstance(session_id); - bool not_existed = NULL == target_floater; + bool not_existed = true; -#else - //hide all - LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("impanel"); - for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); - iter != inst_list.end(); ++iter) + if(isChatMultiTab()) { - LLIMFloater* floater = dynamic_cast<LLIMFloater*>(*iter); - if (floater && floater->isDocked()) + LLIMFloater* target_floater = findInstance(session_id); + not_existed = NULL == target_floater; + } + else + { + //hide all + LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("impanel"); + for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); + iter != inst_list.end(); ++iter) { - floater->setVisible(false); + LLIMFloater* floater = dynamic_cast<LLIMFloater*>(*iter); + if (floater && floater->isDocked()) + { + floater->setVisible(false); + } } } -#endif LLIMFloater* floater = LLFloaterReg::showTypedInstance<LLIMFloater>("impanel", session_id); - floater->updateMessages(); - floater->mInputEditor->setFocus(TRUE); - -#ifdef USE_IM_CONTAINER - // do not add existed floaters to avoid adding torn off instances - if (not_existed) + if(isChatMultiTab()) { - // LLTabContainer::eInsertionPoint i_pt = user_initiated ? LLTabContainer::RIGHT_OF_CURRENT : LLTabContainer::END; - // TODO: mantipov: use LLTabContainer::RIGHT_OF_CURRENT if it exists - LLTabContainer::eInsertionPoint i_pt = LLTabContainer::END; + // do not add existed floaters to avoid adding torn off instances + if (not_existed) + { + // LLTabContainer::eInsertionPoint i_pt = user_initiated ? LLTabContainer::RIGHT_OF_CURRENT : LLTabContainer::END; + // TODO: mantipov: use LLTabContainer::RIGHT_OF_CURRENT if it exists + LLTabContainer::eInsertionPoint i_pt = LLTabContainer::END; - LLIMFloaterContainer* floater_container = LLFloaterReg::showTypedInstance<LLIMFloaterContainer>("im_container"); - floater_container->addFloater(floater, TRUE, i_pt); + LLIMFloaterContainer* floater_container = LLFloaterReg::showTypedInstance<LLIMFloaterContainer>("im_container"); + floater_container->addFloater(floater, TRUE, i_pt); + } } -#else - if (floater->getDockControl() == NULL) + else { - LLChiclet* chiclet = - LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>( - session_id); - if (chiclet == NULL) - { - llerror("Dock chiclet for LLIMFloater doesn't exists", 0); - } - else + // Docking may move chat window, hide it before moving, or user will see how window "jumps" + floater->setVisible(false); + + if (floater->getDockControl() == NULL) { - LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet); + LLChiclet* chiclet = + LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>( + session_id); + if (chiclet == NULL) + { + llerror("Dock chiclet for LLIMFloater doesn't exists", 0); + } + else + { + LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet); + } + + floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(), + LLDockControl::TOP, boost::bind(&LLIMFloater::getAllowedRect, floater, _1))); } - floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(), - LLDockControl::TOP, boost::bind(&LLIMFloater::getAllowedRect, floater, _1))); + // window is positioned, now we can show it. + floater->setVisible(true); } -#endif return floater; } @@ -395,9 +407,10 @@ void LLIMFloater::setDocked(bool docked, bool pop_on_undock) (LLNotificationsUI::LLChannelManager::getInstance()-> findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID")))); -#ifndef USE_IM_CONTAINER - LLTransientDockableFloater::setDocked(docked, pop_on_undock); -#endif + if(!isChatMultiTab()) + { + LLTransientDockableFloater::setDocked(docked, pop_on_undock); + } // update notification channel state if(channel) @@ -406,6 +419,16 @@ void LLIMFloater::setDocked(bool docked, bool pop_on_undock) } } +void LLIMFloater::setTornOff(bool torn_off) +{ + // When IM Floater isn't torn off, "close" button should be hidden. + // This call will just disables it, since there is a hack in LLFloater::updateButton, + // which prevents hiding of close button in that case. + setCanClose(torn_off); + + LLTransientDockableFloater::setTornOff(torn_off); +} + void LLIMFloater::setVisible(BOOL visible) { LLNotificationsUI::LLScreenChannel* channel = dynamic_cast<LLNotificationsUI::LLScreenChannel*> @@ -418,33 +441,39 @@ void LLIMFloater::setVisible(BOOL visible) { channel->updateShowToastsState(); } + + if (visible && mChatHistory && mInputEditor) + { + //only if floater was construced and initialized from xml + updateMessages(); + mInputEditor->setFocus(TRUE); + } } //static bool LLIMFloater::toggle(const LLUUID& session_id) { -#ifndef USE_IM_CONTAINER - LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id); - if (floater && floater->getVisible() && floater->isDocked()) - { - // 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()) + if(!isChatMultiTab()) { - floater->setVisible(TRUE); - floater->setFocus(TRUE); - return true; - } - else -#endif - { - // ensure the list of messages is updated when floater is made visible - show(session_id); - return true; + LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id); + if (floater && floater->getVisible() && floater->isDocked()) + { + // 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()) + { + floater->setVisible(TRUE); + floater->setFocus(TRUE); + return true; + } } + + // ensure the list of messages is updated when floater is made visible + show(session_id); + return true; } //static @@ -634,6 +663,9 @@ void LLIMFloater::processAgentListUpdates(const LLSD& body) else label = LLTrans::getString("IM_to_label") + " " + LLIMModel::instance().getName(mSessionID); mInputEditor->setLabel(label); + + if (moderator_muted_text) + LLNotificationsUtil::add("TextChatIsMutedByModerator"); } } } @@ -887,3 +919,18 @@ void LLIMFloater::removeTypingIndicator(const LLIMInfo* im_info) } } +// static +bool LLIMFloater::isChatMultiTab() +{ + // Restart is required in order to change chat window type. + static bool is_single_window = gSavedSettings.getS32("ChatWindow") == 1; + return is_single_window; +} + +// static +void LLIMFloater::initIMFloater() +{ + // This is called on viewer start up + // init chat window type before user changed it in preferences + isChatMultiTab(); +} diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h index 9e1330ff49..f90bc35c34 100644 --- a/indra/newview/llimfloater.h +++ b/indra/newview/llimfloater.h @@ -33,11 +33,6 @@ #ifndef LL_IMFLOATER_H #define LL_IMFLOATER_H -// This variable is used to show floaters related to chiclets in a Multi Floater Container -// So, this functionality does not require to have IM Floaters as Dockable & Transient -// See EXT-2640. -#define USE_IM_CONTAINER - #include "lltransientdockablefloater.h" #include "lllogchat.h" #include "lltooldraganddrop.h" @@ -68,6 +63,7 @@ public: // LLFloater overrides /*virtual*/ void onClose(bool app_quitting); /*virtual*/ void setDocked(bool docked, bool pop_on_undock = true); + /*virtual*/ void setTornOff(bool torn_off); // Make IM conversion visible and update the message history static LLIMFloater* show(const LLUUID& session_id); @@ -105,6 +101,14 @@ public: void *cargo_data, EAcceptance *accept, std::string& tooltip_msg); + /** + * Returns true if chat is displayed in multi tabbed floater + * false if chat is displayed in multiple windows + */ + static bool isChatMultiTab(); + + static void initIMFloater(); + private: // process focus events to set a currently active session /* virtual */ void onFocusLost(); diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp index 6e4b3ae214..2d7333f7e4 100644 --- a/indra/newview/llimfloatercontainer.cpp +++ b/indra/newview/llimfloatercontainer.cpp @@ -1,96 +1,96 @@ -/**
- * @file llimfloatercontainer.cpp
- * @brief Multifloater containing active IM sessions in separate tab container tabs
- *
- * $LicenseInfo:firstyear=2009&license=viewergpl$
- *
- * Copyright (c) 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
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("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.
- * $/LicenseInfo$
- */
-
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llimfloatercontainer.h"
-
-//
-// LLIMFloaterContainer
-//
-LLIMFloaterContainer::LLIMFloaterContainer(const LLSD& seed)
-: LLMultiFloater(seed),
- mActiveVoiceFloater(NULL)
-{
- mAutoResize = FALSE;
-}
-
-LLIMFloaterContainer::~LLIMFloaterContainer()
-{
-}
-
-BOOL LLIMFloaterContainer::postBuild()
-{
- // Do not call base postBuild to not connect to mCloseSignal to not close all floaters via Close button
- // mTabContainer will be initialized in LLMultiFloater::addChild()
- return TRUE;
-}
-
-void LLIMFloaterContainer::onOpen(const LLSD& key)
-{
- LLMultiFloater::onOpen(key);
-/*
- if (key.isDefined())
- {
- LLIMFloater* im_floater = LLIMFloater::findInstance(key.asUUID());
- if (im_floater)
- {
- im_floater->openFloater();
- }
- }
-*/
-}
-
-void LLIMFloaterContainer::addFloater(LLFloater* floaterp,
- BOOL select_added_floater,
- LLTabContainer::eInsertionPoint insertion_point)
-{
- if(!floaterp) return;
-
- // already here
- if (floaterp->getHost() == this)
- {
- openFloater(floaterp->getKey());
- return;
- }
-
- LLMultiFloater::addFloater(floaterp, select_added_floater, insertion_point);
-
- // make sure active voice icon shows up for new tab
- if (floaterp == mActiveVoiceFloater)
- {
- mTabContainer->setTabImage(floaterp, "active_voice_tab.tga");
- }
-}
-
-// EOF
+/** + * @file llimfloatercontainer.cpp + * @brief Multifloater containing active IM sessions in separate tab container tabs + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 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 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("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. + * $/LicenseInfo$ + */ + + +#include "llviewerprecompiledheaders.h" + +#include "llimfloatercontainer.h" + +// +// LLIMFloaterContainer +// +LLIMFloaterContainer::LLIMFloaterContainer(const LLSD& seed) +: LLMultiFloater(seed), + mActiveVoiceFloater(NULL) +{ + mAutoResize = FALSE; +} + +LLIMFloaterContainer::~LLIMFloaterContainer() +{ +} + +BOOL LLIMFloaterContainer::postBuild() +{ + // Do not call base postBuild to not connect to mCloseSignal to not close all floaters via Close button + // mTabContainer will be initialized in LLMultiFloater::addChild() + return TRUE; +} + +void LLIMFloaterContainer::onOpen(const LLSD& key) +{ + LLMultiFloater::onOpen(key); +/* + if (key.isDefined()) + { + LLIMFloater* im_floater = LLIMFloater::findInstance(key.asUUID()); + if (im_floater) + { + im_floater->openFloater(); + } + } +*/ +} + +void LLIMFloaterContainer::addFloater(LLFloater* floaterp, + BOOL select_added_floater, + LLTabContainer::eInsertionPoint insertion_point) +{ + if(!floaterp) return; + + // already here + if (floaterp->getHost() == this) + { + openFloater(floaterp->getKey()); + return; + } + + LLMultiFloater::addFloater(floaterp, select_added_floater, insertion_point); + + // make sure active voice icon shows up for new tab + if (floaterp == mActiveVoiceFloater) + { + mTabContainer->setTabImage(floaterp, "active_voice_tab.tga"); + } +} + +// EOF diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h index 10cde56c6e..ead7cf4730 100644 --- a/indra/newview/llimfloatercontainer.h +++ b/indra/newview/llimfloatercontainer.h @@ -1,61 +1,61 @@ -/**
- * @file llimfloatercontainer.h
- * @brief Multifloater containing active IM sessions in separate tab container tabs
- *
- * $LicenseInfo:firstyear=2009&license=viewergpl$
- *
- * Copyright (c) 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
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("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.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLIMFLOATERCONTAINER_H
-#define LL_LLIMFLOATERCONTAINER_H
-
-#include "llfloater.h"
-#include "llmultifloater.h"
-
-class LLTabContainer;
-
-class LLIMFloaterContainer : public LLMultiFloater
-{
-public:
- LLIMFloaterContainer(const LLSD& seed);
- virtual ~LLIMFloaterContainer();
-
- /*virtual*/ BOOL postBuild();
- /*virtual*/ void onOpen(const LLSD& key);
-
- /*virtual*/ void addFloater(LLFloater* floaterp,
- BOOL select_added_floater,
- LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END);
-
- static LLFloater* getCurrentVoiceFloater();
-
-protected:
-
- LLFloater* mActiveVoiceFloater;
-};
-
-#endif // LL_LLIMFLOATERCONTAINER_H
+/** + * @file llimfloatercontainer.h + * @brief Multifloater containing active IM sessions in separate tab container tabs + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 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 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("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. + * $/LicenseInfo$ + */ + +#ifndef LL_LLIMFLOATERCONTAINER_H +#define LL_LLIMFLOATERCONTAINER_H + +#include "llfloater.h" +#include "llmultifloater.h" + +class LLTabContainer; + +class LLIMFloaterContainer : public LLMultiFloater +{ +public: + LLIMFloaterContainer(const LLSD& seed); + virtual ~LLIMFloaterContainer(); + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + + /*virtual*/ void addFloater(LLFloater* floaterp, + BOOL select_added_floater, + LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END); + + static LLFloater* getCurrentVoiceFloater(); + +protected: + + LLFloater* mActiveVoiceFloater; +}; + +#endif // LL_LLIMFLOATERCONTAINER_H diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 2f88578739..5481ca97cd 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -83,19 +83,16 @@ #include "llfirstuse.h" #include "llagentui.h" +const static std::string IM_TIME("time"); +const static std::string IM_TEXT("message"); +const static std::string IM_FROM("from"); +const static std::string IM_FROM_ID("from_id"); + // // Globals // LLIMMgr* gIMMgr = NULL; -// -// Statics -// -// *FIXME: make these all either UIStrings or Strings - -const static std::string IM_SEPARATOR(": "); - - void toast_callback(const LLSD& msg){ // do not show toast in busy mode or it goes from agent if (gAgent.getBusy() || gAgent.getID() == msg["from_id"]) @@ -193,7 +190,13 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& } if ( gSavedPerAccountSettings.getBOOL("LogShowHistory") ) - LLLogChat::loadHistory(mName, &chatFromLogFile, (void *)this); + { + std::list<LLSD> chat_history; + + //involves parsing of a chat history + LLLogChat::loadAllHistory(mName, chat_history); + addMessagesFromHistory(chat_history); + } } void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state) @@ -233,6 +236,12 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES break; } } + + // Update speakers list when connected + if (LLVoiceChannel::STATE_CONNECTED == new_state) + { + mSpeakers->update(true); + } } else // group || ad-hoc calls { @@ -297,6 +306,30 @@ void LLIMModel::LLIMSession::addMessage(const std::string& from, const LLUUID& f } } +void LLIMModel::LLIMSession::addMessagesFromHistory(const std::list<LLSD>& history) +{ + std::list<LLSD>::const_iterator it = history.begin(); + while (it != history.end()) + { + const LLSD& msg = *it; + + std::string from = msg[IM_FROM]; + LLUUID from_id = LLUUID::null; + if (msg[IM_FROM_ID].isUndefined()) + { + gCacheName->getUUID(from, from_id); + } + + + std::string timestamp = msg[IM_TIME]; + std::string text = msg[IM_TEXT]; + + addMessage(from, from_id, text, timestamp); + + it++; + } +} + void LLIMModel::LLIMSession::chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata) { if (!userdata) return; @@ -445,6 +478,19 @@ 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) +{ + if (gSavedPerAccountSettings.getBOOL("LogInstantMessages")) + { + LLLogChat::saveHistory(session_name, from, from_id, utf8_text); + return true; + } + else + { + return false; + } +} + bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text) { if (gSavedPerAccountSettings.getBOOL("LogInstantMessages")) @@ -476,8 +522,7 @@ bool LLIMModel::proccessOnlineOfflineNotification( } bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, - const std::string& utf8_text, bool log2file /* = true */) -{ + const std::string& utf8_text, bool log2file /* = true */) { LLIMSession* session = findIMSession(session_id); if (!session) @@ -486,7 +531,10 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co return false; } - addMessageSilently(*session, from, from_id, utf8_text, log2file); + addToHistory(session_id, from, from_id, utf8_text); + if (log2file) logToFile(session_id, from, from_id, utf8_text); + + session->mNumUnread++; // notify listeners LLSD arg; @@ -501,15 +549,6 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co return true; } -void LLIMModel::addMessageSilently(LLIMSession& session, const std::string& from, const LLUUID& from_id, - const std::string& utf8_text, bool log2file /* = true */) -{ - addToHistory(session.mSessionID, from, from_id, utf8_text); - if (log2file) logToFile(session.mSessionID, from, from_id, utf8_text); - - session.mNumUnread++; -} - const std::string& LLIMModel::getName(const LLUUID& session_id) const { @@ -1336,7 +1375,8 @@ void LLIncomingCallDialog::processCallResponse(S32 response) session_id = gIMMgr->addP2PSession( mPayload["session_name"].asString(), mPayload["caller_id"].asUUID(), - mPayload["session_handle"].asString()); + mPayload["session_handle"].asString(), + mPayload["session_uri"].asString()); if (voice) { diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index 72fd006222..66f92c83a5 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -60,6 +60,8 @@ public: virtual ~LLIMSession(); void sessionInitReplyReceived(const LLUUID& new_session_id); + + 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); static void chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata); @@ -146,11 +148,6 @@ public: bool addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& other_participant_id, const std::string& utf8_text, bool log2file = true); /** - * Adds message without new message notification. - */ - void addMessageSilently(LLIMSession& session, const std::string& from, const LLUUID& other_participant_id, const std::string& utf8_text, bool log2file = true); - - /** * Add a system message to an IM Model */ bool proccessOnlineOfflineNotification(const LLUUID& session_id, const std::string& utf8_text); @@ -205,6 +202,11 @@ public: void testMessages(); + /** + * 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); + private: /** @@ -277,11 +279,16 @@ public: const LLUUID& other_participant_id, const LLDynamicArray<LLUUID>& ids); - // Creates a P2P session with the requisite handle for responding to voice calls + /** + * Creates a P2P session with the requisite handle for responding to voice calls. + * + * @param caller_uri - sip URI of caller. It should be always be passed into the method to avoid + * incorrect working of LLVoiceChannel instances. See EXT-2985. + */ LLUUID addP2PSession(const std::string& name, const LLUUID& other_participant_id, const std::string& voice_session_handle, - const std::string& caller_uri = LLStringUtil::null); + const std::string& caller_uri); /** * Leave the session with session id. Send leave session notification diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index d216872363..ac6aa307f2 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -1313,6 +1313,16 @@ BOOL LLItemBridge::isItemPermissive() const return FALSE; } +bool LLItemBridge::isAddAction(std::string action) const +{ + return ("wear" == action || "attach" == action || "activate" == action); +} + +bool LLItemBridge::isRemoveAction(std::string action) const +{ + return ("take_off" == action || "detach" == action || "deactivate" == action); +} + // +=================================================+ // | LLFolderBridge | // +=================================================+ @@ -2387,6 +2397,8 @@ void LLFolderBridge::folderOptionsMenu() if (is_sidepanel) { mItems.clear(); + mItems.push_back("Rename"); + mItems.push_back("Delete"); } // Only enable calling-card related options for non-default folders. @@ -3671,7 +3683,7 @@ std::string LLGestureBridge::getLabelSuffix() const // virtual void LLGestureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) { - if ("activate" == action) + if (isAddAction(action)) { LLGestureManager::instance().activateGesture(mUUID); @@ -3683,7 +3695,7 @@ void LLGestureBridge::performAction(LLFolderView* folder, LLInventoryModel* mode gInventory.updateItem(item); gInventory.notifyObservers(); } - else if ("deactivate" == action) + else if (isRemoveAction(action)) { LLGestureManager::instance().deactivateGesture(mUUID); @@ -3868,7 +3880,7 @@ LLInventoryObject* LLObjectBridge::getObject() const // virtual void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) { - if ("attach" == action) + if (isAddAction(action)) { LLUUID object_id = mUUID; LLViewerInventoryItem* item; @@ -3891,7 +3903,7 @@ void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model } gFocusMgr.setKeyboardFocus(NULL); } - else if ("detach" == action) + else if (isRemoveAction(action)) { LLInventoryItem* item = gInventory.getItem(mUUID); if(item) @@ -4384,7 +4396,7 @@ LLUIImagePtr LLWearableBridge::getIcon() const // virtual void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) { - if ("wear" == action) + if (isAddAction(action)) { wearOnAvatar(); } @@ -4397,7 +4409,7 @@ void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* mod editOnAvatar(); return; } - else if ("take_off" == action) + else if (isRemoveAction(action)) { if(gAgentWearables.isWearingItem(mUUID)) { diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 6a284e0550..ef340af0cb 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -259,6 +259,9 @@ public: virtual void clearDisplayName() { mDisplayName.clear(); } LLViewerInventoryItem* getItem() const; + + bool isAddAction(std::string action) const; + bool isRemoveAction(std::string action) const; protected: virtual BOOL isItemPermissive() const; diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp index 944676ad7a..2d9ea21b5f 100644 --- a/indra/newview/llinventoryobserver.cpp +++ b/indra/newview/llinventoryobserver.cpp @@ -63,6 +63,15 @@ #include "llsdutil.h" #include <deque> +LLInventoryObserver::LLInventoryObserver() +{ +} + +// virtual +LLInventoryObserver::~LLInventoryObserver() +{ +} + void LLInventoryCompletionObserver::changed(U32 mask) { // scan through the incomplete items and move or erase them as diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h index 73b25a8ed0..4ee6c48cb1 100644 --- a/indra/newview/llinventoryobserver.h +++ b/indra/newview/llinventoryobserver.h @@ -63,7 +63,8 @@ public: CALLING_CARD = 32, // online, grant status, cancel, etc change ALL = 0xffffffff }; - virtual ~LLInventoryObserver() {}; + LLInventoryObserver(); + virtual ~LLInventoryObserver(); virtual void changed(U32 mask) = 0; std::string mMessageName; // used by Agent Inventory Service only. [DEV-20328] }; diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index fd23b375fa..fd83729630 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -192,6 +192,7 @@ protected: //-------------------------------------------------------------------- public: BOOL getIsViewsInitialized() const { return mViewsInitialized; } + const LLUUID& getStartFolderID() const { return mStartFolderID; } private: // Builds the UI. Call this once the inventory is usable. void initializeViews(); diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index 45c60df84f..d97f1d4d18 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -473,7 +473,7 @@ void LLLocationInputCtrl::draw() void LLLocationInputCtrl::onInfoButtonClicked() { - LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "agent")); + LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "agent")); } void LLLocationInputCtrl::onForSaleButtonClicked() @@ -495,7 +495,7 @@ void LLLocationInputCtrl::onAddLandmarkButtonClicked() } else { - LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark")); + LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark")); } } @@ -638,7 +638,7 @@ static S32 layout_widget(LLUICtrl* widget, S32 right) void LLLocationInputCtrl::refreshParcelIcons() { // Our "cursor" moving right to left - S32 x = mAddLandmarkBtn->getRect().mLeft - mIconHPad; + S32 x = mAddLandmarkBtn->getRect().mLeft; static LLUICachedControl<bool> show_properties("NavBarShowParcelProperties", false); if (show_properties) @@ -844,12 +844,12 @@ void LLLocationInputCtrl::onLocationContextMenuItemClicked(const LLSD& userdata) if(!landmark) { - LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark")); + LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark")); } else { LLSideTray::getInstance()->showPanel("panel_places", - LLSD().insert("type", "landmark").insert("id",landmark->getUUID())); + LLSD().with("type", "landmark").with("id",landmark->getUUID())); } } else if (item == "cut") diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 9caa863bd8..33fd3e3bf1 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -32,15 +32,59 @@ #include "llviewerprecompiledheaders.h" +#include "llagent.h" +#include "llagentui.h" #include "lllogchat.h" -#include "llappviewer.h" #include "llfloaterchat.h" #include "lltrans.h" #include "llviewercontrol.h" -#include "llsdserialize.h" + +#include <boost/algorithm/string/trim.hpp> +#include <boost/algorithm/string/replace.hpp> +#include <boost/regex.hpp> +#include <boost/regex/v4/match_results.hpp> const S32 LOG_RECALL_SIZE = 2048; +const static std::string IM_TIME("time"); +const static std::string IM_TEXT("message"); +const static std::string IM_FROM("from"); +const static std::string IM_FROM_ID("from_id"); +const static std::string IM_SEPARATOR(": "); + +const static std::string NEW_LINE("\n"); +const static std::string NEW_LINE_SPACE_PREFIX("\n "); +const static std::string TWO_SPACES(" "); +const static std::string MULTI_LINE_PREFIX(" "); + +//viewer 1.23 may have used "You" for Agent's entries +const static std::string YOU("You"); + +/** + * Chat log lines - timestamp and name are optional but message text is mandatory. + * + * Typical plain text chat log lines: + * + * SuperCar: You aren't the owner + * [2:59] SuperCar: You aren't the owner + * [2009/11/20 3:00] SuperCar: You aren't the owner + * Katar Ivercourt is Offline + * [3:00] Katar Ivercourt is Offline + * [2009/11/20 3:01] Corba ProductEngine is Offline + */ +const static boost::regex TIMESTAMP_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}\\]\\s+|\\[\\d{1,2}:\\d{2}\\]\\s+)?(.*)$"); + +/** + * Regular expression suitable to match names like + * "You", "Second Life", "Igor ProductEngine", "Object", "Mega House" + */ +const static boost::regex NAME_AND_TEXT("(You:|Second Life:|[^\\s:]+\\s*[:]{1}|\\S+\\s+[^\\s:]+[:]{1})?(\\s*)(.*)"); + +const static int IDX_TIMESTAMP = 1; +const static int IDX_STUFF = 2; +const static int IDX_NAME = 1; +const static int IDX_TEXT = 3; + //static std::string LLLogChat::makeLogFileName(std::string filename) { @@ -118,7 +162,7 @@ void LLLogChat::saveHistory(const std::string& filename, item["from_id"] = from_id; item["message"] = line; - file << LLSDOStreamer <LLSDNotationFormatter>(item) << std::endl; + file << LLChatLogFormatter(item) << std::endl; file.close(); } @@ -154,9 +198,6 @@ void LLLogChat::loadHistory(const std::string& filename, void (*callback)(ELogLi } } - // the parser's destructor is protected so we cannot create in the stack. - LLPointer<LLSDParser> parser = new LLSDNotationParser(); - while ( fgets(buffer, LOG_RECALL_SIZE, fptr) && !feof(fptr) ) { len = strlen(buffer) - 1; /*Flawfinder: ignore*/ @@ -167,7 +208,8 @@ void LLLogChat::loadHistory(const std::string& filename, void (*callback)(ELogLi LLSD item; std::string line(buffer); std::istringstream iss(line); - if (parser->parse(iss, item, line.length()) == LLSDParser::PARSE_FAILURE) + + if (!LLChatLogParser::parse(line, item)) { item["message"] = line; callback(LOG_LINE, item, userdata); @@ -187,3 +229,197 @@ void LLLogChat::loadHistory(const std::string& filename, void (*callback)(ELogLi fclose(fptr); } } + +void append_to_last_message(std::list<LLSD>& messages, const std::string& line) +{ + if (!messages.size()) return; + + std::string im_text = messages.back()[IM_TEXT].asString(); + im_text.append(line); + messages.back()[IM_TEXT] = im_text; +} + +void LLLogChat::loadAllHistory(const std::string& session_name, std::list<LLSD>& messages) +{ + if (session_name.empty()) + { + llwarns << "Session name is Empty!" << llendl; + return ; + } + + LLFILE* fptr = LLFile::fopen(makeLogFileName(session_name), "r"); /*Flawfinder: ignore*/ + if (!fptr) return; //No previous conversation with this name. + + char buffer[LOG_RECALL_SIZE]; /*Flawfinder: ignore*/ + char *bptr; + S32 len; + bool firstline = TRUE; + + if (fseek(fptr, (LOG_RECALL_SIZE - 1) * -1 , SEEK_END)) + { //File is smaller than recall size. Get it all. + firstline = FALSE; + if (fseek(fptr, 0, SEEK_SET)) + { + fclose(fptr); + return; + } + } + + while (fgets(buffer, LOG_RECALL_SIZE, fptr) && !feof(fptr)) + { + len = strlen(buffer) - 1; /*Flawfinder: ignore*/ + for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--) *bptr='\0'; + + if (firstline) + { + firstline = FALSE; + continue; + } + + std::string line(buffer); + + //updated 1.23 plaint text log format requires a space added before subsequent lines in a multilined message + if (' ' == line[0]) + { + line.erase(0, MULTI_LINE_PREFIX.length()); + append_to_last_message(messages, '\n' + line); + } + else if (0 == len && ('\n' == line[0] || '\r' == line[0])) + { + //to support old format's multilined messages with new lines used to divide paragraphs + append_to_last_message(messages, line); + } + else + { + LLSD item; + if (!LLChatLogParser::parse(line, item)) + { + item[IM_TEXT] = line; + } + messages.push_back(item); + } + } + fclose(fptr); +} + +//*TODO mark object's names in a special way so that they will be distinguishable form avatar name +//which are more strict by its nature (only firstname and secondname) +//Example, an object's name can be writen like "Object <actual_object's_name>" +void LLChatLogFormatter::format(const LLSD& im, std::ostream& ostr) const +{ + if (!im.isMap()) + { + llwarning("invalid LLSD type of an instant message", 0); + return; + } + + if (im[IM_TIME].isDefined()) + { + std::string timestamp = im[IM_TIME].asString(); + boost::trim(timestamp); + ostr << '[' << timestamp << ']' << TWO_SPACES; + } + + //*TODO mark object's names in a special way so that they will be distinguishable form avatar name + //which are more strict by its nature (only firstname and secondname) + //Example, an object's name can be writen like "Object <actual_object's_name>" + if (im[IM_FROM].isDefined()) + { + std::string from = im[IM_FROM].asString(); + boost::trim(from); + if (from.size()) + { + ostr << from << IM_SEPARATOR; + } + } + + if (im[IM_TEXT].isDefined()) + { + std::string im_text = im[IM_TEXT].asString(); + + //multilined text will be saved with prepended spaces + boost::replace_all(im_text, NEW_LINE, NEW_LINE_SPACE_PREFIX); + ostr << im_text; + } +} + +bool LLChatLogParser::parse(std::string& raw, LLSD& im) +{ + if (!raw.length()) return false; + + im = LLSD::emptyMap(); + + //matching a timestamp + boost::match_results<std::string::const_iterator> matches; + if (!boost::regex_match(raw, matches, TIMESTAMP_AND_STUFF)) return false; + + bool has_timestamp = matches[IDX_TIMESTAMP].matched; + if (has_timestamp) + { + //timestamp was successfully parsed + std::string timestamp = matches[IDX_TIMESTAMP]; + boost::trim(timestamp); + timestamp.erase(0, 1); + timestamp.erase(timestamp.length()-1, 1); + im[IM_TIME] = timestamp; + } + else + { + //timestamp is optional + im[IM_TIME] = ""; + } + + bool has_stuff = matches[IDX_STUFF].matched; + if (!has_stuff) + { + return false; //*TODO should return false or not? + } + + //matching a name and a text + std::string stuff = matches[IDX_STUFF]; + boost::match_results<std::string::const_iterator> name_and_text; + if (!boost::regex_match(stuff, name_and_text, NAME_AND_TEXT)) return false; + + bool has_name = name_and_text[IDX_NAME].matched; + std::string name = name_and_text[IDX_NAME]; + + //we don't need a name/text separator + if (has_name && name.length() && name[name.length()-1] == ':') + { + name.erase(name.length()-1, 1); + } + + if (!has_name || name == SYSTEM_FROM) + { + //name is optional too + im[IM_FROM] = SYSTEM_FROM; + im[IM_FROM_ID] = LLUUID::null; + } + + if (!has_name) + { + //text is mandatory + im[IM_TEXT] = stuff; + return true; //parse as a message from Second Life + } + + bool has_text = name_and_text[IDX_TEXT].matched; + if (!has_text) return false; + + //for parsing logs created in very old versions of a viewer + if (name == "You") + { + std::string agent_name; + LLAgentUI::buildFullname(agent_name); + im[IM_FROM] = agent_name; + im[IM_FROM_ID] = gAgentID; + } + else + { + im[IM_FROM] = name; + } + + + im[IM_TEXT] = name_and_text[IDX_TEXT]; + return true; //parsed name and message text, maybe have a timestamp too +} diff --git a/indra/newview/lllogchat.h b/indra/newview/lllogchat.h index e252cd7d41..3d3f5c4458 100644 --- a/indra/newview/lllogchat.h +++ b/indra/newview/lllogchat.h @@ -51,11 +51,66 @@ public: const LLUUID& from_id, const std::string& line); + /** @deprecated @see loadAllHistory() */ static void loadHistory(const std::string& filename, void (*callback)(ELogLineType, const LLSD&, void*), void* userdata); + + static void loadAllHistory(const std::string& session_name, std::list<LLSD>& messages); private: static std::string cleanFileName(std::string filename); }; +/** + * Formatter for the plain text chat log files + */ +class LLChatLogFormatter +{ +public: + LLChatLogFormatter(const LLSD& im) : mIM(im) {} + virtual ~LLChatLogFormatter() {}; + + friend std::ostream& operator<<(std::ostream& str, const LLChatLogFormatter& formatter) + { + formatter.format(formatter.mIM, str); + return str; + } + +protected: + + /** + * Format an instant message to a stream + * Timestamps and sender names are required + * New lines of multilined messages are prepended with a space + */ + void format(const LLSD& im, std::ostream& ostr) const; + + LLSD mIM; +}; + +/** + * Parser for the plain text chat log files + */ +class LLChatLogParser +{ +public: + + /** + * Parse a line from the plain text chat log file + * General plain text log format is like: "[timestamp] [name]: [message]" + * [timestamp] and [name] are optional + * Examples of plain text chat log lines: + * "[2009/11/20 2:53] Igor ProductEngine: howdy" + * "Igor ProductEngine: howdy" + * "Dserduk ProductEngine is Online" + * + * @return false if failed to parse mandatory data - message text + */ + static bool parse(std::string& raw, LLSD& im); + +protected: + LLChatLogParser(); + virtual ~LLChatLogParser() {}; +}; + #endif diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp index 932a3d8a83..765b504afe 100644 --- a/indra/newview/llmaniptranslate.cpp +++ b/indra/newview/llmaniptranslate.cpp @@ -1440,7 +1440,7 @@ void LLManipTranslate::renderSnapGuides() LLVector3 help_text_pos = selection_center_start + (snap_offset_meters_up * 3.f * mSnapOffsetAxis); const LLFontGL* big_fontp = LLFontGL::getFontSansSerif(); - std::string help_text = "Move mouse cursor over ruler to snap"; + std::string help_text = "Move mouse cursor over ruler"; LLColor4 help_text_color = LLColor4::white; help_text_color.mV[VALPHA] = clamp_rescale(mHelpTextTimer.getElapsedTimeF32(), sHelpTextVisibleTime, sHelpTextVisibleTime + sHelpTextFadeTime, line_alpha, 0.f); hud_render_utf8text(help_text, help_text_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -0.5f * big_fontp->getWidthF32(help_text), 3.f, help_text_color, mObjectSelection->getSelectType() == SELECT_TYPE_HUD); diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index 41376c4c09..e65b7d8a0c 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -561,7 +561,7 @@ void LLNavigationBar::handleLoginComplete() void LLNavigationBar::invokeSearch(std::string search_text) { - LLFloaterReg::showInstance("search", LLSD().insert("category", "all").insert("id", LLSD(search_text))); + LLFloaterReg::showInstance("search", LLSD().with("category", "all").with("id", LLSD(search_text))); } void LLNavigationBar::clearHistoryCache() diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 8f1dec1431..ee3be0a5e3 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -57,6 +57,7 @@ #include "lltrans.h" #include "llbottomtray.h" #include "llnearbychatbar.h" +#include "llfloaterreg.h" static const S32 RESIZE_BAR_THICKNESS = 3; @@ -145,7 +146,7 @@ std::string appendTime() return timeStr; } -void LLNearbyChat::addMessage(const LLChat& chat) +void LLNearbyChat::addMessage(const LLChat& chat,bool archive) { if (chat.mChatType == CHAT_TYPE_DEBUG_MSG) { @@ -207,6 +208,13 @@ void LLNearbyChat::addMessage(const LLChat& chat) mChatHistory->appendMessage(chat,use_plain_text_chat_history); } } + + if(archive) + { + mMessageArchive.push_back(chat); + if(mMessageArchive.size()>200) + mMessageArchive.erase(mMessageArchive.begin()); + } } void LLNearbyChat::onNearbySpeakers() @@ -256,3 +264,19 @@ void LLNearbyChat::getAllowedRect(LLRect& rect) { rect = gViewerWindow->getWorldViewRectScaled(); } + +void LLNearbyChat::updateChatHistoryStyle() +{ + mChatHistory->clear(); + for(std::vector<LLChat>::iterator it = mMessageArchive.begin();it!=mMessageArchive.end();++it) + { + addMessage(*it,false); + } +} +//static +void LLNearbyChat::processChatHistoryStyleUpdate(const LLSD& newvalue) +{ + LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD()); + if(nearby_chat) + nearby_chat->updateChatHistoryStyle(); +} diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h index efcaf4263b..1cbc2a3478 100644 --- a/indra/newview/llnearbychat.h +++ b/indra/newview/llnearbychat.h @@ -47,7 +47,7 @@ public: ~LLNearbyChat(); BOOL postBuild (); - void addMessage (const LLChat& message); + void addMessage (const LLChat& message,bool archive = true); void onNearbyChatContextMenuItemClicked(const LLSD& userdata); bool onNearbyChatCheckContextMenuItem(const LLSD& userdata); @@ -57,6 +57,10 @@ public: virtual void setRect (const LLRect &rect); + virtual void updateChatHistoryStyle(); + + static void processChatHistoryStyleUpdate(const LLSD& newvalue); + private: virtual void applySavedVariables(); @@ -68,6 +72,8 @@ private: private: LLHandle<LLView> mPopupMenuHandle; LLChatHistory* mChatHistory; + + std::vector<LLChat> mMessageArchive; }; #endif diff --git a/indra/newview/llnotificationgrouphandler.cpp b/indra/newview/llnotificationgrouphandler.cpp index 2e7f95660a..6889931956 100644 --- a/indra/newview/llnotificationgrouphandler.cpp +++ b/indra/newview/llnotificationgrouphandler.cpp @@ -88,6 +88,8 @@ bool LLGroupHandler::processNotification(const LLSD& notify) if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change") { + LLHandlerUtil::logGroupNoticeToIMGroup(notification); + LLPanel* notify_box = new LLToastGroupNotifyPanel(notification); LLToast::Params p; p.notif_id = notification->getID(); diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h index d42b0148d6..da8928321a 100644 --- a/indra/newview/llnotificationhandler.h +++ b/indra/newview/llnotificationhandler.h @@ -268,7 +268,20 @@ public: /** * Writes notification message to IM session. */ - static void logToIM(const LLNotificationPtr& notification); + static void logToIM(const EInstantMessage& session_type, + const std::string& session_name, const std::string& from_name, + const std::string& message, const LLUUID& session_owner_id, + const LLUUID& from_id); + + /** + * Writes notification message to IM p2p session. + */ + static void logToIMP2P(const LLNotificationPtr& notification); + + /** + * Writes group notice notification message to IM group session. + */ + static void logGroupNoticeToIMGroup(const LLNotificationPtr& notification); }; } diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp index e1236b935e..857b7e9796 100644 --- a/indra/newview/llnotificationhandlerutil.cpp +++ b/indra/newview/llnotificationhandlerutil.cpp @@ -36,53 +36,95 @@ #include "llnotificationhandler.h" #include "llnotifications.h" #include "llimview.h" +#include "llagent.h" using namespace LLNotificationsUI; const static std::string GRANTED_MODIFY_RIGHTS("GrantedModifyRights"), REVOKED_MODIFY_RIGHTS("RevokedModifyRights"), OBJECT_GIVE_ITEM( "ObjectGiveItem"), OBJECT_GIVE_ITEM_UNKNOWN_USER( - "ObjectGiveItemUnknownUser"); + "ObjectGiveItemUnknownUser"), PAYMENT_RECIVED("PaymentRecived"); // static bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification) { return GRANTED_MODIFY_RIGHTS == notification->getName() - || REVOKED_MODIFY_RIGHTS == notification->getName(); + || REVOKED_MODIFY_RIGHTS == notification->getName() + || PAYMENT_RECIVED == notification->getName(); } // static -void LLHandlerUtil::logToIM(const LLNotificationPtr& notification) +void LLHandlerUtil::logToIM(const EInstantMessage& session_type, + const std::string& session_name, const std::string& from_name, + const std::string& message, const LLUUID& session_owner_id, + const LLUUID& from_id) +{ + LLUUID session_id = LLIMMgr::computeSessionID(session_type, + session_owner_id); + LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession( + session_id); + if (session == NULL) + { + LLIMModel::instance().logToFile(session_name, from_name, from_id, message); + } + else + { + // store active session id + const LLUUID & active_session_id = + LLIMModel::instance().getActiveSessionID(); + + // set searched session as active to avoid IM toast popup + LLIMModel::instance().setActiveSessionID(session_id); + + LLIMModel::instance().addMessage(session_id, from_name, from_id, + message); + + // restore active session id + LLIMModel::instance().setActiveSessionID(active_session_id); + } +} + +// static +void LLHandlerUtil::logToIMP2P(const LLNotificationPtr& notification) { - // add message to IM const std::string name = notification->getSubstitutions().has("NAME") ? notification->getSubstitutions()["NAME"] : notification->getSubstitutions()["[NAME]"]; - // don't create IM session with objects, it's necessary condition to log + // don't create IM p2p session with objects, it's necessary condition to log if (notification->getName() != OBJECT_GIVE_ITEM && notification->getName() != OBJECT_GIVE_ITEM_UNKNOWN_USER) { LLUUID from_id = notification->getPayload()["from_id"]; - LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, - from_id); - - LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(session_id); - if (session == NULL) - { - session_id = LLIMMgr::instance().addSession(name, - IM_NOTHING_SPECIAL, from_id); - session = LLIMModel::instance().findIMSession(session_id); - } - - if (session == NULL) - { - llerrs << "session " << session_id << "does not exist " << llendl; - return; - } - - LLIMModel::instance().addMessageSilently(*session, name, from_id, - notification->getMessage()); + + logToIM(IM_NOTHING_SPECIAL, name, name, notification->getMessage(), + from_id, from_id); } } + +// static +void LLHandlerUtil::logGroupNoticeToIMGroup( + const LLNotificationPtr& notification) +{ + + const LLSD& payload = notification->getPayload(); + LLGroupData groupData; + if (!gAgent.getGroupData(payload["group_id"].asUUID(), groupData)) + { + llwarns + << "Group notice for unkown group: " + << payload["group_id"].asUUID() << llendl; + } + + const std::string group_name = groupData.mName; + const std::string sender_name = payload["sender_name"].asString(); + + // we can't retrieve sender id from group notice system message, so try to lookup it from cache + LLUUID sender_id; + gCacheName->getUUID(sender_name, sender_id); + + logToIM(IM_SESSION_GROUP_START, group_name, sender_name, payload["message"], + payload["group_id"], sender_id); +} + diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp index cfe7fd09ac..4f353bf6a5 100644 --- a/indra/newview/llnotificationofferhandler.cpp +++ b/indra/newview/llnotificationofferhandler.cpp @@ -39,6 +39,7 @@ #include "llviewerwindow.h" #include "llnotificationmanager.h" #include "llnotifications.h" +#include "llscriptfloater.h" using namespace LLNotificationsUI; @@ -90,26 +91,44 @@ bool LLOfferHandler::processNotification(const LLSD& notify) if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change") { - LLHandlerUtil::logToIM(notification); - - LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification); - - LLToast::Params p; - p.notif_id = notification->getID(); - p.notification = notification; - p.panel = notify_box; - p.on_delete_toast = boost::bind(&LLOfferHandler::onDeleteToast, this, _1); - - LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel); - if(channel) - channel->addToast(p); - - // send a signal to the counter manager - mNewNotificationSignal(); + LLHandlerUtil::logToIMP2P(notification); + + if( notification->getPayload().has("give_inventory_notification") + && !notification->getPayload()["give_inventory_notification"] ) + { + // This is an original inventory offer, so add a script floater + LLScriptFloaterManager::instance().onAddNotification(notification->getID()); + } + else + { + LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification); + + LLToast::Params p; + p.notif_id = notification->getID(); + p.notification = notification; + p.panel = notify_box; + p.on_delete_toast = boost::bind(&LLOfferHandler::onDeleteToast, this, _1); + + LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel); + if(channel) + channel->addToast(p); + + // send a signal to the counter manager + mNewNotificationSignal(); + } } else if (notify["sigtype"].asString() == "delete") { - mChannel->killToastByNotificationID(notification->getID()); + if( notification->getPayload().has("give_inventory_notification") + && !notification->getPayload()["give_inventory_notification"] ) + { + // Remove original inventory offer script floater + LLScriptFloaterManager::instance().onRemoveNotification(notification->getID()); + } + else + { + mChannel->killToastByNotificationID(notification->getID()); + } } return true; diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp index 6f91b6e58b..c7261199e3 100644 --- a/indra/newview/llnotificationscripthandler.cpp +++ b/indra/newview/llnotificationscripthandler.cpp @@ -98,7 +98,7 @@ bool LLScriptHandler::processNotification(const LLSD& notify) { if (LLHandlerUtil::canLogToIM(notification)) { - LLHandlerUtil::logToIM(notification); + LLHandlerUtil::logToIMP2P(notification); } if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName() || SCRIPT_LOAD_URL == notification->getName()) diff --git a/indra/newview/lloverlaybar.cpp b/indra/newview/lloverlaybar.cpp index ea24638b6d..67e048885f 100644 --- a/indra/newview/lloverlaybar.cpp +++ b/indra/newview/lloverlaybar.cpp @@ -349,14 +349,8 @@ void LLOverlayBar::toggleMediaPlay(void*) //static void LLOverlayBar::toggleMusicPlay(void*) { - if (!gOverlayBar) - { - return; - } - - if (gOverlayBar->mMusicState != PLAYING) + if (gAudiop->isInternetStreamPlaying() != 1) { - gOverlayBar->mMusicState = PLAYING; // desired state if (gAudiop) { LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); @@ -381,7 +375,6 @@ void LLOverlayBar::toggleMusicPlay(void*) //} else { - gOverlayBar->mMusicState = STOPPED; // desired state if (gAudiop) { gAudiop->stopInternetStream(); diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 97c1e96175..eb9cb10d56 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -254,11 +254,19 @@ void LLPanelAvatarNotes::onCommitRights() const LLRelationship* buddy_relationship = LLAvatarTracker::instance().getBuddyInfo(getAvatarId()); bool allow_modify_objects = childGetValue("objects_check").asBoolean(); + + // if modify objects checkbox clicked if (buddy_relationship->isRightGrantedTo( LLRelationship::GRANT_MODIFY_OBJECTS) != allow_modify_objects) { confirmModifyRights(allow_modify_objects, rights); } + // only one checkbox can trigger commit, so store the rest of rights + else + { + LLAvatarPropertiesProcessor::getInstance()->sendFriendRights( + getAvatarId(), rights); + } } void LLPanelAvatarNotes::processProperties(void* data, EAvatarProcessorType type) @@ -522,20 +530,19 @@ void LLPanelAvatarProfile::processGroupProperties(const LLAvatarGroups* avatar_g for(; it_end != it; ++it) { LLAvatarGroups::LLGroupData group_data = *it; - - // Check if there is no duplicates for this group - if (std::find(mGroups.begin(), mGroups.end(), group_data.group_name) == mGroups.end()) - mGroups.push_back(group_data.group_name); + mGroups[group_data.group_name] = group_data.group_id; } // Creating string, containing group list std::string groups = ""; - for (group_list_t::const_iterator it = mGroups.begin(); it != mGroups.end(); ++it) + for (group_map_t::iterator it = mGroups.begin(); it != mGroups.end(); ++it) { if (it != mGroups.begin()) groups += ", "; - groups += *it; + + std::string group_url="[secondlife:///app/group/" + it->second.asString() + "/about " + it->first + "]"; + groups += group_url; } childSetValue("sl_groups", groups); diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h index f54aeee4eb..b19c5cca49 100644 --- a/indra/newview/llpanelavatar.h +++ b/indra/newview/llpanelavatar.h @@ -192,8 +192,8 @@ protected: private: - typedef std::list<std::string> group_list_t; - group_list_t mGroups; + typedef std::map< std::string,LLUUID> group_map_t; + group_map_t mGroups; LLToggleableMenu* mProfileMenu; }; diff --git a/indra/newview/llpanelblockedlist.cpp b/indra/newview/llpanelblockedlist.cpp index 73cffaa7ed..ae703ebd8e 100644 --- a/indra/newview/llpanelblockedlist.cpp +++ b/indra/newview/llpanelblockedlist.cpp @@ -104,7 +104,7 @@ void LLPanelBlockedList::selectBlocked(const LLUUID& mute_id) void LLPanelBlockedList::showPanelAndSelect(const LLUUID& idToSelect) { - LLSideTray::getInstance()->showPanel("panel_block_list_sidetray", LLSD().insert(BLOCKED_PARAM_NAME, idToSelect)); + LLSideTray::getInstance()->showPanel("panel_block_list_sidetray", LLSD().with(BLOCKED_PARAM_NAME, idToSelect)); } diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp index e04c830036..5834c50fbb 100644 --- a/indra/newview/llpanelgroupnotices.cpp +++ b/indra/newview/llpanelgroupnotices.cpp @@ -510,6 +510,9 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg) S32 i=0; S32 count = msg->getNumberOfBlocks("Data"); + + mNoticesList->setEnabled(TRUE); + for (;i<count;++i) { msg->getUUID("Data","NoticeID",id,i); diff --git a/indra/newview/llpanelhome.cpp b/indra/newview/llpanelhome.cpp new file mode 100644 index 0000000000..de7a85836d --- /dev/null +++ b/indra/newview/llpanelhome.cpp @@ -0,0 +1,112 @@ +/** +* @file llpanelhome.cpp +* @author Martin Reddy +* @brief The Home side tray panel +* +* $LicenseInfo:firstyear=2009&license=viewergpl$ +* +* Copyright (c) 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 +* ("GPL"), unless you have obtained a separate licensing agreement +* ("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. +* $/LicenseInfo$ +*/ + +#include "llviewerprecompiledheaders.h" +#include "llpanelhome.h" + +#include "llmediactrl.h" + +static LLRegisterPanelClassWrapper<LLPanelHome> t_people("panel_sidetray_home"); + +LLPanelHome::LLPanelHome() : + LLPanel(), + LLViewerMediaObserver(), + mBrowser(NULL), + mFirstView(true) +{ +} + +void LLPanelHome::onOpen(const LLSD& key) +{ + // display the home page the first time we open the panel + // *NOTE: this seems to happen during login. Can we avoid that? + if (mFirstView && mBrowser) + { + mBrowser->navigateHome(); + } + mFirstView = false; +} + +BOOL LLPanelHome::postBuild() +{ + mBrowser = getChild<LLMediaCtrl>("browser"); + if (mBrowser) + { + mBrowser->addObserver(this); + mBrowser->setTrusted(true); + mBrowser->setHomePageUrl("http://www.secondlife.com/"); + + childSetAction("back", onClickBack, this); + childSetAction("forward", onClickForward, this); + childSetAction("home", onClickHome, this); + } + + return TRUE; +} + +//static +void LLPanelHome::onClickBack(void* user_data) +{ + LLPanelHome *self = (LLPanelHome*)user_data; + if (self && self->mBrowser) + { + self->mBrowser->navigateBack(); + } +} + +//static +void LLPanelHome::onClickForward(void* user_data) +{ + LLPanelHome *self = (LLPanelHome*)user_data; + if (self && self->mBrowser) + { + self->mBrowser->navigateForward(); + } +} + +//static +void LLPanelHome::onClickHome(void* user_data) +{ + LLPanelHome *self = (LLPanelHome*)user_data; + if (self && self->mBrowser) + { + self->mBrowser->navigateHome(); + } +} + +void LLPanelHome::handleMediaEvent(LLPluginClassMedia *self, EMediaEvent event) +{ + // update back/forward button state + childSetEnabled("back", mBrowser->canNavigateBack()); + childSetEnabled("forward", mBrowser->canNavigateForward()); +} diff --git a/indra/newview/llpanelhome.h b/indra/newview/llpanelhome.h new file mode 100644 index 0000000000..b5ca48b23f --- /dev/null +++ b/indra/newview/llpanelhome.h @@ -0,0 +1,68 @@ +/** +* @file llpanelhome.h +* @author Martin Reddy +* @brief The Home side tray panel +* +* $LicenseInfo:firstyear=2009&license=viewergpl$ +* +* Copyright (c) 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 +* ("GPL"), unless you have obtained a separate licensing agreement +* ("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. +* $/LicenseInfo$ +*/ + +#ifndef LL_LLPANELHOME_H +#define LL_LLPANELHOME_H + +#include "llpanel.h" +#include "llsd.h" +#include "llviewermediaobserver.h" + +class LLMediaCtrl; + +/** + * Base class for web-based Home side tray + */ +class LLPanelHome : + public LLPanel, + public LLViewerMediaObserver +{ +public: + LLPanelHome(); + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + + static void onClickBack(void* user_data); + static void onClickForward(void* user_data); + static void onClickHome(void* user_data); + +private: + // inherited from LLViewerMediaObserver + /*virtual*/ void handleMediaEvent(LLPluginClassMedia *self, EMediaEvent event); + + LLMediaCtrl *mBrowser; + bool mFirstView; +}; + +#endif //LL_LLPANELHOME_H diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index dafb970b30..4ce6d14faa 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -67,28 +67,6 @@ static const std::string TRASH_BUTTON_NAME = "trash_btn"; // helper functions static void filter_list(LLInventorySubTreePanel* inventory_list, const std::string& string); -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLLandmarksPanelObserver -// -// Bridge to support knowing when the inventory has changed to update -// landmarks accordions visibility. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLLandmarksPanelObserver : public LLInventoryObserver -{ -public: - LLLandmarksPanelObserver(LLLandmarksPanel* lp) : mLP(lp) {} - virtual ~LLLandmarksPanelObserver() {} - /*virtual*/ void changed(U32 mask); - -private: - LLLandmarksPanel* mLP; -}; - -void LLLandmarksPanelObserver::changed(U32 mask) -{ - mLP->updateFilteredAccordions(); -} - LLLandmarksPanel::LLLandmarksPanel() : LLPanelPlacesTab() , mFavoritesInventoryPanel(NULL) @@ -99,18 +77,12 @@ LLLandmarksPanel::LLLandmarksPanel() , mListCommands(NULL) , mGearFolderMenu(NULL) , mGearLandmarkMenu(NULL) - , mDirtyFilter(false) { - mInventoryObserver = new LLLandmarksPanelObserver(this); - gInventory.addObserver(mInventoryObserver); - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_landmarks.xml"); } LLLandmarksPanel::~LLLandmarksPanel() { - if (gInventory.containsObserver(mInventoryObserver)) - gInventory.removeObserver(mInventoryObserver); } BOOL LLLandmarksPanel::postBuild() @@ -137,39 +109,34 @@ BOOL LLLandmarksPanel::postBuild() // virtual void LLLandmarksPanel::onSearchEdit(const std::string& string) { - static std::string prev_string(""); - - if (prev_string == string) return; - // show all folders in Landmarks Accordion for empty filter - mLandmarksInventoryPanel->setShowFolderState(string.empty() ? - LLInventoryFilter::SHOW_ALL_FOLDERS : - LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS - ); - - filter_list(mFavoritesInventoryPanel, string); - filter_list(mLandmarksInventoryPanel, string); - filter_list(mMyInventoryPanel, string); - filter_list(mLibraryInventoryPanel, string); - - prev_string = string; - mDirtyFilter = true; + if (mLandmarksInventoryPanel->getFilter()) + { + mLandmarksInventoryPanel->setShowFolderState(string.empty() ? + LLInventoryFilter::SHOW_ALL_FOLDERS : + LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS + ); + } // give FolderView a chance to be refreshed. So, made all accordions visible for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter) { LLAccordionCtrlTab* tab = *iter; - tab->setVisible(true); + if (tab && !tab->getVisible()) + tab->setVisible(TRUE); // expand accordion to see matched items in each one. See EXT-2014. tab->changeOpenClose(false); - // refresh all accordions to display their contents in case of less restrictive filter LLInventorySubTreePanel* inventory_list = dynamic_cast<LLInventorySubTreePanel*>(tab->getAccordionView()); if (NULL == inventory_list) continue; - LLFolderView* fv = inventory_list->getRootFolder(); - fv->refresh(); + + if (inventory_list->getFilter()) + filter_list(inventory_list, string); } + + if (sFilterSubString != string) + sFilterSubString = string; } // virtual @@ -255,31 +222,6 @@ void LLLandmarksPanel::onSelectorButtonClicked() } } -void LLLandmarksPanel::updateFilteredAccordions() -{ - LLInventoryPanel* inventory_list = NULL; - LLAccordionCtrlTab* accordion_tab = NULL; - for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter) - { - accordion_tab = *iter; - inventory_list = dynamic_cast<LLInventorySubTreePanel*> (accordion_tab->getAccordionView()); - if (NULL == inventory_list) continue; - LLFolderView* fv = inventory_list->getRootFolder(); - - bool has_descendants = fv->hasFilteredDescendants(); - - accordion_tab->setVisible(has_descendants); - } - - // we have to arrange accordion tabs for cases when filter string is less restrictive but - // all items are still filtered. - static LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("landmarks_accordion"); - accordion->arrange(); - - // now filter state is applied to accordion tabs - mDirtyFilter = false; -} - ////////////////////////////////////////////////////////////////////////// // PROTECTED METHODS ////////////////////////////////////////////////////////////////////////// @@ -391,7 +333,8 @@ void LLLandmarksPanel::initLandmarksInventoryPanel() initLandmarksPanel(mLandmarksInventoryPanel); - mLandmarksInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS); + if (mLandmarksInventoryPanel->getFilter()) + mLandmarksInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS); // subscribe to have auto-rename functionality while creating New Folder mLandmarksInventoryPanel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, mLandmarksInventoryPanel, _1, _2)); @@ -419,6 +362,9 @@ void LLLandmarksPanel::initLibraryInventoryPanel() void LLLandmarksPanel::initLandmarksPanel(LLInventorySubTreePanel* inventory_list) { + if (!inventory_list->getFilter()) + return; + inventory_list->setFilterTypes(0x1 << LLInventoryType::IT_LANDMARK); inventory_list->setSelectCallback(boost::bind(&LLLandmarksPanel::onSelectionChange, this, inventory_list, _1, _2)); @@ -432,6 +378,8 @@ void LLLandmarksPanel::initLandmarksPanel(LLInventorySubTreePanel* inventory_lis root_folder->setupMenuHandle(LLInventoryType::IT_LANDMARK, mGearLandmarkMenu->getHandle()); } + root_folder->setParentLandmarksPanel(this); + // save initial folder state to avoid incorrect work while switching between Landmarks & Teleport History tabs // See EXT-1609. inventory_list->saveFolderState(); @@ -440,6 +388,9 @@ void LLLandmarksPanel::initLandmarksPanel(LLInventorySubTreePanel* inventory_lis void LLLandmarksPanel::initAccordion(const std::string& accordion_tab_name, LLInventorySubTreePanel* inventory_list) { LLAccordionCtrlTab* accordion_tab = getChild<LLAccordionCtrlTab>(accordion_tab_name); + if (!accordion_tab) + return; + mAccordionTabs.push_back(accordion_tab); accordion_tab->setDropDownStateChangedCallback( boost::bind(&LLLandmarksPanel::onAccordionExpandedCollapsed, this, _2, inventory_list)); @@ -457,6 +408,19 @@ void LLLandmarksPanel::onAccordionExpandedCollapsed(const LLSD& param, LLInvento mCurrentSelectedList = NULL; updateVerbs(); } + + // Start background fetch, mostly for My Inventory and Library + if (expanded) + { + const LLUUID &cat_id = inventory_list->getStartFolderID(); + // Just because the category itself has been fetched, doesn't mean its child folders have. + /* + if (!gInventory.isCategoryComplete(cat_id)) + */ + { + gInventory.startBackgroundFetch(cat_id); + } + } } void LLLandmarksPanel::deselectOtherThan(const LLInventorySubTreePanel* inventory_list) @@ -580,11 +544,11 @@ void LLLandmarksPanel::onAddAction(const LLSD& userdata) const if(landmark) { LLSideTray::getInstance()->showPanel("panel_places", - LLSD().insert("type", "landmark").insert("id",landmark->getUUID())); + LLSD().with("type", "landmark").with("id",landmark->getUUID())); } else { - LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark")); + LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark")); } } else if ("category" == command_name) @@ -771,6 +735,46 @@ void LLLandmarksPanel::onCustomAction(const LLSD& userdata) } } +void LLLandmarksPanel::updateFilteredAccordions() +{ + LLInventoryPanel* inventory_list = NULL; + LLAccordionCtrlTab* accordion_tab = NULL; +// bool needs_arrange = false; + + for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter) + { + accordion_tab = *iter; + if (accordion_tab && !accordion_tab->getVisible()) + accordion_tab->setVisible(TRUE); + + inventory_list = dynamic_cast<LLInventorySubTreePanel*> (accordion_tab->getAccordionView()); + if (NULL == inventory_list) continue; + + // This doesn't seem to work correctly. Disabling for now. -Seraph + /* + LLFolderView* fv = inventory_list->getRootFolder(); + + // arrange folder view contents to draw its descendants if it has any + fv->arrangeFromRoot(); + + bool has_descendants = fv->hasFilteredDescendants(); + if (!has_descendants) + needs_arrange = true; + + accordion_tab->setVisible(has_descendants); + */ + accordion_tab->setVisible(TRUE); + } + + // we have to arrange accordion tabs for cases when filter string is less restrictive but + // all items are still filtered. +// if (needs_arrange) +// { + static LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("landmarks_accordion"); + accordion->arrange(); +// } +} + /* Processes such actions: cut/rename/delete/paste actions @@ -883,12 +887,7 @@ bool LLLandmarksPanel::handleDragAndDropToTrash(BOOL drop, EDragAndDropType carg void LLLandmarksPanel::doIdle(void* landmarks_panel) { LLLandmarksPanel* panel = (LLLandmarksPanel* ) landmarks_panel; - - if (panel->mDirtyFilter) - { - panel->updateFilteredAccordions(); - } - + panel->updateFilteredAccordions(); } void LLLandmarksPanel::doShowOnMap(LLLandmark* landmark) diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h index c65abc178b..bee141d051 100644 --- a/indra/newview/llpanellandmarks.h +++ b/indra/newview/llpanellandmarks.h @@ -46,7 +46,6 @@ class LLAccordionCtrlTab; class LLFolderViewItem; class LLMenuGL; class LLInventoryPanel; -class LLInventoryObserver; class LLInventorySubTreePanel; class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver @@ -63,13 +62,10 @@ public: void onSelectionChange(LLInventorySubTreePanel* inventory_list, const std::deque<LLFolderViewItem*> &items, BOOL user_action); void onSelectorButtonClicked(); - - /** - * Updates accordions according to filtered items in lists. - * - * It hides accordion for empty lists - */ - void updateFilteredAccordions(); + void setCurrentSelectedList(LLInventorySubTreePanel* inventory_list) + { + mCurrentSelectedList = inventory_list; + } protected: /** @@ -111,6 +107,13 @@ private: void onCustomAction(const LLSD& command_name); /** + * Updates accordions according to filtered items in lists. + * + * It hides accordion for empty lists + */ + void updateFilteredAccordions(); + + /** * Determines if selected item can be modified via context/gear menu. * * It validates Places Landmarks rules first. And then LLFolderView permissions. @@ -148,11 +151,9 @@ private: LLMenuGL* mGearFolderMenu; LLMenuGL* mMenuAdd; LLInventorySubTreePanel* mCurrentSelectedList; - LLInventoryObserver* mInventoryObserver; LLPanel* mListCommands; bool mSortByDate; - bool mDirtyFilter; typedef std::vector<LLAccordionCtrlTab*> accordion_tabs_t; accordion_tabs_t mAccordionTabs; diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp index 5bb266a01d..3fa0e7bf8f 100644 --- a/indra/newview/llpanelmediasettingsgeneral.cpp +++ b/indra/newview/llpanelmediasettingsgeneral.cpp @@ -59,6 +59,8 @@ #include "llfloatermediasettings.h" #include "llfloatertools.h" #include "lltrans.h" +#include "lltextbox.h" +#include "llpanelmediasettingssecurity.h" const char *CHECKERBOARD_DATA_URL = "data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22100%%22 height=%22100%%22 %3E%3Cdefs%3E%3Cpattern id=%22checker%22 patternUnits=%22userSpaceOnUse%22 x=%220%22 y=%220%22 width=%22128%22 height=%22128%22 viewBox=%220 0 128 128%22 %3E%3Crect x=%220%22 y=%220%22 width=%2264%22 height=%2264%22 fill=%22#ddddff%22 /%3E%3Crect x=%2264%22 y=%2264%22 width=%2264%22 height=%2264%22 fill=%22#ddddff%22 /%3E%3C/pattern%3E%3C/defs%3E%3Crect x=%220%22 y=%220%22 width=%22100%%22 height=%22100%%22 fill=%22url(#checker)%22 /%3E%3C/svg%3E"; @@ -98,10 +100,12 @@ BOOL LLPanelMediaSettingsGeneral::postBuild() mHomeURL = getChild< LLLineEditor >( LLMediaEntry::HOME_URL_KEY ); mWidthPixels = getChild< LLSpinCtrl >( LLMediaEntry::WIDTH_PIXELS_KEY ); mPreviewMedia = getChild<LLMediaCtrl>("preview_media"); + mFailWhiteListText = getChild<LLTextBox>( "home_fails_whitelist_label" ); // watch commit action for HOME URL childSetCommitCallback( LLMediaEntry::HOME_URL_KEY, onCommitHomeURL, this); childSetCommitCallback( "current_url_reset_btn",onBtnResetCurrentUrl, this); + // interrogates controls and updates widgets as required updateMediaPreview(); @@ -121,6 +125,11 @@ void LLPanelMediaSettingsGeneral::draw() // housekeeping LLPanel::draw(); + // TODO: we need to call this repeatedly until the floater panels are fully + // created but once we have a valid answer, we should stop looking here - the + // commit callback will handle it + checkHomeUrlPassesWhitelist(); + // enable/disable pixel values image entry based on auto scale checkbox if ( mAutoScale->getValue().asBoolean() == false ) { @@ -250,10 +259,6 @@ void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& media_ LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata; self->mMediaEditable = editable; - //llinfos << "---------------" << llendl; - //llinfos << ll_pretty_print_sd(media_settings) << llendl; - //llinfos << "---------------" << llendl; - if ( LLPanelMediaSettingsGeneral::isMultiple() ) { self->clearValues(self, self->mMediaEditable); @@ -316,7 +321,7 @@ void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& media_ data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() ); }; }; - + // interrogates controls and updates widgets as required self->updateMediaPreview(); } @@ -355,20 +360,35 @@ void LLPanelMediaSettingsGeneral::onClose(bool app_quitting) } //////////////////////////////////////////////////////////////////////////////// +// +void LLPanelMediaSettingsGeneral::checkHomeUrlPassesWhitelist() +{ + // parent floater has not constructed the security panel yet + if ( mParent->getPanelSecurity() == 0 ) + return; + + std::string home_url = getHomeUrl(); + if ( home_url.empty() || mParent->getPanelSecurity()->urlPassesWhiteList( home_url ) ) + { + // Home URL is empty or passes the white list so hide the warning message + mFailWhiteListText->setVisible( false ); + } + else + { + // Home URL does not pass the white list so show the warning message + mFailWhiteListText->setVisible( true ); + }; +} + +//////////////////////////////////////////////////////////////////////////////// // static void LLPanelMediaSettingsGeneral::onCommitHomeURL( LLUICtrl* ctrl, void *userdata ) { LLPanelMediaSettingsGeneral* self =(LLPanelMediaSettingsGeneral *)userdata; - // check url user is trying to enter for home URL will pass whitelist - // and decline to accept it if it doesn't. - std::string home_url = self->mHomeURL->getValue().asString(); - if ( ! self->mParent->passesWhiteList( home_url ) ) - { - LLNotificationsUtil::add("WhiteListInvalidatesHomeUrl"); - return; - }; - + // check home url passes whitelist and display warning if not + self->checkHomeUrlPassesWhitelist(); + self->updateMediaPreview(); } @@ -392,19 +412,19 @@ void LLPanelMediaSettingsGeneral::preApply() // void LLPanelMediaSettingsGeneral::getValues( LLSD &fill_me_in ) { - fill_me_in[LLMediaEntry::AUTO_LOOP_KEY] = mAutoLoop->getValue(); - fill_me_in[LLMediaEntry::AUTO_PLAY_KEY] = mAutoPlay->getValue(); - fill_me_in[LLMediaEntry::AUTO_SCALE_KEY] = mAutoScale->getValue(); - fill_me_in[LLMediaEntry::AUTO_ZOOM_KEY] = mAutoZoom->getValue(); - fill_me_in[LLMediaEntry::CONTROLS_KEY] = mControls->getCurrentIndex(); + fill_me_in[LLMediaEntry::AUTO_LOOP_KEY] = (LLSD::Boolean)mAutoLoop->getValue(); + fill_me_in[LLMediaEntry::AUTO_PLAY_KEY] = (LLSD::Boolean)mAutoPlay->getValue(); + fill_me_in[LLMediaEntry::AUTO_SCALE_KEY] = (LLSD::Boolean)mAutoScale->getValue(); + fill_me_in[LLMediaEntry::AUTO_ZOOM_KEY] = (LLSD::Boolean)mAutoZoom->getValue(); + fill_me_in[LLMediaEntry::CONTROLS_KEY] = (LLSD::Integer)mControls->getCurrentIndex(); //Don't fill in current URL: this is only supposed to get changed via navigate // fill_me_in[LLMediaEntry::CURRENT_URL_KEY] = mCurrentURL->getValue(); - fill_me_in[LLMediaEntry::HEIGHT_PIXELS_KEY] = mHeightPixels->getValue(); + fill_me_in[LLMediaEntry::HEIGHT_PIXELS_KEY] = (LLSD::Integer)mHeightPixels->getValue(); // Don't fill in the home URL if it is the special "Multiple Media" string! if (LLTrans::getString("Multiple Media") != mHomeURL->getValue()) - fill_me_in[LLMediaEntry::HOME_URL_KEY] = mHomeURL->getValue(); - fill_me_in[LLMediaEntry::FIRST_CLICK_INTERACT_KEY] = mFirstClick->getValue(); - fill_me_in[LLMediaEntry::WIDTH_PIXELS_KEY] = mWidthPixels->getValue(); + fill_me_in[LLMediaEntry::HOME_URL_KEY] = (LLSD::String)mHomeURL->getValue(); + fill_me_in[LLMediaEntry::FIRST_CLICK_INTERACT_KEY] = (LLSD::Boolean)mFirstClick->getValue(); + fill_me_in[LLMediaEntry::WIDTH_PIXELS_KEY] = (LLSD::Integer)mWidthPixels->getValue(); } //////////////////////////////////////////////////////////////////////////////// @@ -461,7 +481,7 @@ bool LLPanelMediaSettingsGeneral::navigateHomeSelectedFace(bool only_if_current_ selected_objects->getSelectedTEValue( &functor_navigate_media, all_face_media_navigated ); // Note: we don't update the 'current URL' field until the media data itself changes - + return all_face_media_navigated; } @@ -477,7 +497,6 @@ const std::string LLPanelMediaSettingsGeneral::getHomeUrl() void LLPanelMediaSettingsGeneral::updateCurrentUrl() { // Get the current URL from the selection - const LLMediaEntry default_media_data; std::string value_str = default_media_data.getCurrentURL(); struct functor_getter_current_url : public LLSelectedTEGetFunctor< std::string > diff --git a/indra/newview/llpanelmediasettingsgeneral.h b/indra/newview/llpanelmediasettingsgeneral.h index f8b8f0d224..7782b25d63 100644 --- a/indra/newview/llpanelmediasettingsgeneral.h +++ b/indra/newview/llpanelmediasettingsgeneral.h @@ -42,6 +42,7 @@ class LLLineEditor; class LLSpinCtrl; class LLTextureCtrl; class LLMediaCtrl; +class LLTextBox; class LLFloaterMediaSettings; class LLPanelMediaSettingsGeneral : public LLPanel @@ -87,6 +88,8 @@ private: static bool isMultiple(); + void checkHomeUrlPassesWhitelist(); + LLComboBox* mControls; LLCheckBoxCtrl* mAutoLoop; LLCheckBoxCtrl* mFirstClick; @@ -98,6 +101,7 @@ private: LLLineEditor* mHomeURL; LLLineEditor* mCurrentURL; LLMediaCtrl* mPreviewMedia; + LLTextBox* mFailWhiteListText; }; #endif // LL_LLPANELMEDIAMEDIASETTINGSGENERAL_H diff --git a/indra/newview/llpanelmediasettingssecurity.cpp b/indra/newview/llpanelmediasettingssecurity.cpp index 94e137b0f4..d87c7608d5 100644 --- a/indra/newview/llpanelmediasettingssecurity.cpp +++ b/indra/newview/llpanelmediasettingssecurity.cpp @@ -46,8 +46,10 @@ #include "llsdutil.h" #include "llselectmgr.h" #include "llmediaentry.h" +#include "lltextbox.h" #include "llfloaterwhitelistentry.h" #include "llfloatermediasettings.h" + //////////////////////////////////////////////////////////////////////////////// // LLPanelMediaSettingsSecurity::LLPanelMediaSettingsSecurity() : @@ -55,9 +57,9 @@ LLPanelMediaSettingsSecurity::LLPanelMediaSettingsSecurity() : { mCommitCallbackRegistrar.add("Media.whitelistAdd", boost::bind(&LLPanelMediaSettingsSecurity::onBtnAdd, this)); mCommitCallbackRegistrar.add("Media.whitelistDelete", boost::bind(&LLPanelMediaSettingsSecurity::onBtnDel, this)); + // build dialog from XML LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_settings_security.xml"); - } //////////////////////////////////////////////////////////////////////////////// @@ -66,6 +68,7 @@ BOOL LLPanelMediaSettingsSecurity::postBuild() { mEnableWhiteList = getChild< LLCheckBoxCtrl >( LLMediaEntry::WHITELIST_ENABLE_KEY ); mWhiteListList = getChild< LLScrollListCtrl >( LLMediaEntry::WHITELIST_KEY ); + mHomeUrlFailsWhiteListText = getChild<LLTextBox>( "home_url_fails_whitelist" ); setDefaultBtn("whitelist_add"); @@ -84,30 +87,6 @@ void LLPanelMediaSettingsSecurity::draw() { // housekeeping LLPanel::draw(); - - // if list is empty, disable DEL button and checkbox to enable use of list - if ( mWhiteListList->isEmpty() ) - { - childSetEnabled( "whitelist_del", false ); - childSetEnabled( LLMediaEntry::WHITELIST_KEY, false ); - childSetEnabled( LLMediaEntry::WHITELIST_ENABLE_KEY, false ); - } - else - { - childSetEnabled( "whitelist_del", true ); - childSetEnabled( LLMediaEntry::WHITELIST_KEY, true ); - childSetEnabled( LLMediaEntry::WHITELIST_ENABLE_KEY, true ); - }; - - // if nothing is selected, disable DEL button - if ( mWhiteListList->getSelectedValue().asString().empty() ) - { - childSetEnabled( "whitelist_del", false ); - } - else - { - childSetEnabled( "whitelist_del", true ); - }; } //////////////////////////////////////////////////////////////////////////////// @@ -179,9 +158,8 @@ void LLPanelMediaSettingsSecurity::initValues( void* userdata, const LLSD& media LLSD::array_iterator iter = url_list.beginArray(); while( iter != url_list.endArray() ) { - // TODO: is iter guaranteed to be valid here? - std::string url = *iter; - list->addSimpleElement( url ); + std::string entry = *iter; + self->addWhiteListEntry( entry ); ++iter; }; }; @@ -213,18 +191,21 @@ void LLPanelMediaSettingsSecurity::preApply() // void LLPanelMediaSettingsSecurity::getValues( LLSD &fill_me_in ) { - fill_me_in[LLMediaEntry::WHITELIST_ENABLE_KEY] = mEnableWhiteList->getValue(); + fill_me_in[LLMediaEntry::WHITELIST_ENABLE_KEY] = (LLSD::Boolean)mEnableWhiteList->getValue(); // iterate over white list and extract items - std::vector< LLScrollListItem* > white_list_items = mWhiteListList->getAllData(); - std::vector< LLScrollListItem* >::iterator iter = white_list_items.begin(); + std::vector< LLScrollListItem* > whitelist_items = mWhiteListList->getAllData(); + std::vector< LLScrollListItem* >::iterator iter = whitelist_items.begin(); + // *NOTE: need actually set the key to be an emptyArray(), or the merge // we do with this LLSD will think there's nothing to change. fill_me_in[LLMediaEntry::WHITELIST_KEY] = LLSD::emptyArray(); - while( iter != white_list_items.end() ) + while( iter != whitelist_items.end() ) { - std::string white_list_url = (*iter)->getValue().asString(); - fill_me_in[ LLMediaEntry::WHITELIST_KEY ].append( white_list_url ); + LLScrollListCell* cell = (*iter)->getColumn( ENTRY_COLUMN ); + std::string whitelist_url = cell->getValue().asString(); + + fill_me_in[ LLMediaEntry::WHITELIST_KEY ].append( whitelist_url ); ++iter; }; } @@ -260,11 +241,8 @@ const std::string LLPanelMediaSettingsSecurity::makeValidUrl( const std::string& /////////////////////////////////////////////////////////////////////////////// // wrapper for testing a URL against the whitelist. We grab entries from -// white list list box widget and build a list to test against. Can also -// optionally pass the URL that you are trying to add to the widget since -// it won't be added until this call returns. -bool LLPanelMediaSettingsSecurity::passesWhiteList( const std::string& added_url, - const std::string& test_url ) +// white list list box widget and build a list to test against. +bool LLPanelMediaSettingsSecurity::urlPassesWhiteList( const std::string& test_url ) { // the checkUrlAgainstWhitelist(..) function works on a vector // of strings for the white list entries - in this panel, the white list @@ -273,20 +251,18 @@ bool LLPanelMediaSettingsSecurity::passesWhiteList( const std::string& added_url whitelist_strings.clear(); // may not be required - I forget what the spec says. // step through whitelist widget entries and grab them as strings - std::vector< LLScrollListItem* > white_list_items = mWhiteListList->getAllData(); - std::vector< LLScrollListItem* >::iterator iter = white_list_items.begin(); - while( iter != white_list_items.end() ) + std::vector< LLScrollListItem* > whitelist_items = mWhiteListList->getAllData(); + std::vector< LLScrollListItem* >::iterator iter = whitelist_items.begin(); + while( iter != whitelist_items.end() ) { - const std::string whitelist_url = (*iter)->getValue().asString(); + LLScrollListCell* cell = (*iter)->getColumn( ENTRY_COLUMN ); + std::string whitelist_url = cell->getValue().asString(); + whitelist_strings.push_back( whitelist_url ); ++iter; }; - // add in the URL that might be added to the whitelist so we can test that too - if ( added_url.length() ) - whitelist_strings.push_back( added_url ); - // possible the URL is just a fragment so we validize it const std::string valid_url = makeValidUrl( test_url ); @@ -296,32 +272,68 @@ bool LLPanelMediaSettingsSecurity::passesWhiteList( const std::string& added_url /////////////////////////////////////////////////////////////////////////////// // -void LLPanelMediaSettingsSecurity::addWhiteListItem(const std::string& url) +void LLPanelMediaSettingsSecurity::updateWhitelistEnableStatus() { - // grab home URL from the general panel (via the parent floater) + // get the value for home URL and make it a valid URL + const std::string valid_url = makeValidUrl( mParent->getHomeUrl() ); + + // now check to see if the home url passes the whitelist in its entirity + if ( urlPassesWhiteList( valid_url ) ) + { + mEnableWhiteList->setEnabled( true ); + mHomeUrlFailsWhiteListText->setVisible( false ); + } + else + { + mEnableWhiteList->set( false ); + mEnableWhiteList->setEnabled( false ); + mHomeUrlFailsWhiteListText->setVisible( true ); + }; +} + +/////////////////////////////////////////////////////////////////////////////// +// Add an entry to the whitelist scrollbox and indicate if the current +// home URL passes this entry or not using an icon +void LLPanelMediaSettingsSecurity::addWhiteListEntry( const std::string& entry ) +{ + // grab the home url std::string home_url( "" ); if ( mParent ) home_url = mParent->getHomeUrl(); - // if the home URL is blank (user hasn't entered it yet) then - // don't bother to check if it passes the white list - if ( home_url.empty() ) - { - mWhiteListList->addSimpleElement( url ); - return; - }; + // try to make a valid URL based on what the user entered - missing scheme for example + const std::string valid_url = makeValidUrl( home_url ); + + // check the home url against this single whitelist entry + std::vector< std::string > whitelist_entries; + whitelist_entries.push_back( entry ); + bool home_url_passes_entry = LLMediaEntry::checkUrlAgainstWhitelist( valid_url, whitelist_entries ); - // if the URL passes the white list, add it - if ( passesWhiteList( url, home_url ) ) + // build an icon cell based on whether or not the home url pases it or not + LLSD row; + if ( home_url_passes_entry || home_url.empty() ) { - mWhiteListList->addSimpleElement( url ); + row[ "columns" ][ ICON_COLUMN ][ "type" ] = "icon"; + row[ "columns" ][ ICON_COLUMN ][ "value" ] = ""; + row[ "columns" ][ ICON_COLUMN ][ "width" ] = 20; } else - // display a message indicating you can't do that { - LLNotificationsUtil::add("WhiteListInvalidatesHomeUrl"); + row[ "columns" ][ ICON_COLUMN ][ "type" ] = "icon"; + row[ "columns" ][ ICON_COLUMN ][ "value" ] = "parcel_color_EXP"; + row[ "columns" ][ ICON_COLUMN ][ "width" ] = 20; }; -} + + // always add in the entry itself + row[ "columns" ][ ENTRY_COLUMN ][ "type" ] = "text"; + row[ "columns" ][ ENTRY_COLUMN ][ "value" ] = entry; + + // add to the white list scroll box + mWhiteListList->addElement( row ); + + // update whitelist enable checkbox based on whether the home url passes the whitelist + updateWhitelistEnableStatus(); +}; /////////////////////////////////////////////////////////////////////////////// // static @@ -337,6 +349,9 @@ void LLPanelMediaSettingsSecurity::onBtnDel( void* userdata ) LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata; self->mWhiteListList->deleteSelectedItems(); + + // contents of whitelist changed so recheck it against home url + self->updateWhitelistEnableStatus(); } //////////////////////////////////////////////////////////////////////////////// @@ -345,4 +360,3 @@ void LLPanelMediaSettingsSecurity::setParent( LLFloaterMediaSettings* parent ) { mParent = parent; }; - diff --git a/indra/newview/llpanelmediasettingssecurity.h b/indra/newview/llpanelmediasettingssecurity.h index 638664e59d..937bfb1bf9 100644 --- a/indra/newview/llpanelmediasettingssecurity.h +++ b/indra/newview/llpanelmediasettingssecurity.h @@ -37,6 +37,7 @@ class LLCheckBoxCtrl; class LLScrollListCtrl; +class LLTextBox; class LLFloaterMediaSettings; class LLPanelMediaSettingsSecurity : public LLPanel @@ -58,18 +59,27 @@ public: static void initValues( void* userdata, const LLSD& media_settings,bool editable ); static void clearValues( void* userdata, bool editable); - void addWhiteListItem(const std::string& url); + void addWhiteListEntry( const std::string& url ); void setParent( LLFloaterMediaSettings* parent ); + bool urlPassesWhiteList( const std::string& test_url ); const std::string makeValidUrl( const std::string& src_url ); - bool passesWhiteList( const std::string& added_url, const std::string& test_url ); protected: LLFloaterMediaSettings* mParent; private: + enum ColumnIndex + { + ICON_COLUMN = 0, + ENTRY_COLUMN = 1, + }; + LLCheckBoxCtrl* mEnableWhiteList; LLScrollListCtrl* mWhiteListList; - + LLTextBox* mHomeUrlFailsWhiteListText; + + void updateWhitelistEnableStatus(); + static void onBtnAdd(void*); static void onBtnDel(void*); }; diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp index 5af26c1ad9..951e74abf9 100644 --- a/indra/newview/llpaneloutfitsinventory.cpp +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -144,16 +144,13 @@ void LLPanelOutfitsInventory::onNew() { const std::string& outfit_name = LLViewerFolderType::lookupNewCategoryName(LLFolderType::FT_OUTFIT); LLUUID outfit_folder = gAgentWearables.makeNewOutfitLinks(outfit_name); - - getRootFolder()->setSelectionByID(outfit_folder, TRUE); - getRootFolder()->setNeedsAutoRename(TRUE); } void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action) { updateListCommands(); updateParent(); - if (getRootFolder()->needsAutoRename()) + if (getRootFolder()->needsAutoRename() && items.size()) { getRootFolder()->startRenamingSelectedItem(); getRootFolder()->setNeedsAutoRename(FALSE); diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h index 7769a7d172..aa0ab4efbc 100644 --- a/indra/newview/llpaneloutfitsinventory.h +++ b/indra/newview/llpaneloutfitsinventory.h @@ -65,10 +65,12 @@ public: // Otherwise, return NULL. LLFolderViewEventListener* getCorrectListenerForAction(); void setParent(LLSidepanelAppearance *parent); + + LLFolderView* getRootFolder(); + protected: void updateParent(); bool getIsCorrectType(const LLFolderViewEventListener *listenerp) const; - LLFolderView* getRootFolder(); private: LLSidepanelAppearance* mParent; diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 6771bb4170..1743df52fc 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -1298,7 +1298,7 @@ void LLPanelPeople::notifyChildren(const LLSD& info) if (container->getCurrentPanelIndex() > 0) { // if not on the default panel, switch to it - container->onOpen(LLSD().insert(LLSideTrayPanelContainer::PARAM_SUB_PANEL_NAME, getName())); + container->onOpen(LLSD().with(LLSideTrayPanelContainer::PARAM_SUB_PANEL_NAME, getName())); } else LLSideTray::getInstance()->collapseSideBar(); diff --git a/indra/newview/llpanelpick.cpp b/indra/newview/llpanelpick.cpp index da0c8d5020..541361324a 100644 --- a/indra/newview/llpanelpick.cpp +++ b/indra/newview/llpanelpick.cpp @@ -558,6 +558,11 @@ void LLPanelPickEdit::initTexturePickerMouseEvents() text_icon = getChild<LLIconCtrl>(XML_BTN_ON_TXTR); mSnapshotCtrl->setMouseEnterCallback(boost::bind(&LLPanelPickEdit::onTexturePickerMouseEnter, this, _1)); mSnapshotCtrl->setMouseLeaveCallback(boost::bind(&LLPanelPickEdit::onTexturePickerMouseLeave, this, _1)); + + // *WORKAROUND: Needed for EXT-1625: enabling save button each time when picker is opened, even if + // texture wasn't changed (see Steve's comment). + mSnapshotCtrl->setMouseDownCallback(boost::bind(&LLPanelPickEdit::enableSaveButton, this, true)); + text_icon->setVisible(FALSE); } diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index 4abb60dded..cc6e88a9d2 100644 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -61,7 +61,6 @@ static const std::string XML_BTN_DELETE = "trash_btn"; static const std::string XML_BTN_INFO = "info_btn"; static const std::string XML_BTN_TELEPORT = "teleport_btn"; static const std::string XML_BTN_SHOW_ON_MAP = "show_on_map_btn"; -static const std::string XML_BTN_OVERFLOW = "overflow_btn"; static const std::string PICK_ID("pick_id"); static const std::string PICK_CREATOR_ID("pick_creator_id"); @@ -113,7 +112,6 @@ LLPanelPicks::LLPanelPicks() mClassifiedsList(NULL), mPanelPickInfo(NULL), mPanelPickEdit(NULL), - mOverflowMenu(NULL), mPlusMenu(NULL), mPicksAccTab(NULL), mClassifiedsAccTab(NULL), @@ -273,7 +271,6 @@ BOOL LLPanelPicks::postBuild() childSetAction(XML_BTN_TELEPORT, boost::bind(&LLPanelPicks::onClickTeleport, this)); childSetAction(XML_BTN_SHOW_ON_MAP, boost::bind(&LLPanelPicks::onClickMap, this)); childSetAction(XML_BTN_INFO, boost::bind(&LLPanelPicks::onClickInfo, this)); - childSetAction(XML_BTN_OVERFLOW, boost::bind(&LLPanelPicks::onOverflowButtonClicked, this)); mPicksAccTab = getChild<LLAccordionCtrlTab>("tab_picks"); mPicksAccTab->setDropDownStateChangedCallback(boost::bind(&LLPanelPicks::onAccordionStateChanged, this, mPicksAccTab)); @@ -291,10 +288,6 @@ BOOL LLPanelPicks::postBuild() registar.add("Pick.Delete", boost::bind(&LLPanelPicks::onClickDelete, this)); mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>("menu_picks.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); - LLUICtrl::CommitCallbackRegistry::ScopedRegistrar overflow_registar; - overflow_registar.add("PicksList.Overflow", boost::bind(&LLPanelPicks::onOverflowMenuItemClicked, this, _2)); - mOverflowMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_picks_overflow.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); - LLUICtrl::CommitCallbackRegistry::ScopedRegistrar plus_registar; plus_registar.add("Picks.Plus.Action", boost::bind(&LLPanelPicks::onPlusMenuItemClicked, this, _2)); mPlusMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_picks_plus.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); @@ -302,24 +295,6 @@ BOOL LLPanelPicks::postBuild() return TRUE; } -void LLPanelPicks::onOverflowMenuItemClicked(const LLSD& param) -{ - std::string value = param.asString(); - - if("info" == value) - { - onClickInfo(); - } - else if("teleport" == value) - { - onClickTeleport(); - } - else if("map" == value) - { - onClickMap(); - } -} - void LLPanelPicks::onPlusMenuItemClicked(const LLSD& param) { std::string value = param.asString(); @@ -348,23 +323,6 @@ void LLPanelPicks::onAccordionStateChanged(const LLAccordionCtrlTab* acc_tab) updateButtons(); } -void LLPanelPicks::onOverflowButtonClicked() -{ - if (!mOverflowMenu->toggleVisibility()) - return; - - LLView* btn = getChild<LLView>(XML_BTN_OVERFLOW); - - if (mOverflowMenu->getButtonRect().isEmpty()) - { - mOverflowMenu->setButtonRect(btn); - } - mOverflowMenu->updateParent(LLMenuGL::sMenuContainer); - - LLRect rect = btn->getRect(); - LLMenuGL::showPopup(this, mOverflowMenu, rect.mRight, rect.mTop); -} - void LLPanelPicks::onOpen(const LLSD& key) { const LLUUID id(key.asUUID()); @@ -568,7 +526,6 @@ void LLPanelPicks::updateButtons() childSetEnabled(XML_BTN_INFO, has_selected); childSetEnabled(XML_BTN_TELEPORT, has_selected); childSetEnabled(XML_BTN_SHOW_ON_MAP, has_selected); - childSetEnabled(XML_BTN_OVERFLOW, has_selected); } void LLPanelPicks::setProfilePanel(LLPanelProfile* profile_panel) diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h index b21b1c64b1..21794d56b2 100644 --- a/indra/newview/llpanelpicks.h +++ b/indra/newview/llpanelpicks.h @@ -94,8 +94,6 @@ private: void onClickTeleport(); void onClickMap(); - void onOverflowMenuItemClicked(const LLSD& param); - void onOverflowButtonClicked(); void onPlusMenuItemClicked(const LLSD& param); void onListCommit(const LLFlatListView* f_list); @@ -149,7 +147,6 @@ private: LLPanelClassifiedInfo* mPanelClassifiedInfo; LLPanelClassifiedEdit* mPanelClassifiedEdit; LLPanelPickEdit* mPanelPickEdit; - LLToggleableMenu* mOverflowMenu; LLToggleableMenu* mPlusMenu; LLAccordionCtrlTab* mPicksAccTab; diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 839b2ec45e..cd4bcb6c0a 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -118,7 +118,6 @@ static LLRegisterPanelClassWrapper<LLPanelPlaces> t_places("panel_places"); LLPanelPlaces::LLPanelPlaces() : LLPanel(), - mFilterSubString(LLStringUtil::null), mActivePanel(NULL), mFilterEditor(NULL), mPlaceProfile(NULL), @@ -385,16 +384,16 @@ void LLPanelPlaces::onLandmarkLoaded(LLLandmark* landmark) void LLPanelPlaces::onFilterEdit(const std::string& search_string, bool force_filter) { - if (force_filter || mFilterSubString != search_string) + if (force_filter || LLPanelPlacesTab::sFilterSubString != search_string) { - mFilterSubString = search_string; + std::string string = search_string; // Searches are case-insensitive - LLStringUtil::toUpper(mFilterSubString); - LLStringUtil::trimHead(mFilterSubString); + LLStringUtil::toUpper(string); + LLStringUtil::trimHead(string); if (mActivePanel) - mActivePanel->onSearchEdit(mFilterSubString); + mActivePanel->onSearchEdit(string); } } @@ -404,7 +403,7 @@ void LLPanelPlaces::onTabSelected() if (!mActivePanel) return; - onFilterEdit(mFilterSubString, true); + onFilterEdit(LLPanelPlacesTab::sFilterSubString, true); mActivePanel->updateVerbs(); } @@ -815,7 +814,7 @@ void LLPanelPlaces::changedInventory(U32 mask) // Filter applied to show all items. if (mActivePanel) - mActivePanel->onSearchEdit(mFilterSubString); + mActivePanel->onSearchEdit(LLPanelPlacesTab::sFilterSubString); // we don't need to monitor inventory changes anymore, // so remove the observer diff --git a/indra/newview/llpanelplaces.h b/indra/newview/llpanelplaces.h index 0d97353b66..5f9aed6357 100644 --- a/indra/newview/llpanelplaces.h +++ b/indra/newview/llpanelplaces.h @@ -120,10 +120,6 @@ private: // be available (hence zero) LLVector3d mPosGlobal; - // Search string for filtering landmarks and teleport - // history locations - std::string mFilterSubString; - // Information type currently shown in Place Information panel std::string mPlaceInfoType; diff --git a/indra/newview/llpanelplacestab.cpp b/indra/newview/llpanelplacestab.cpp index b7669fd63d..9806b8c64d 100644 --- a/indra/newview/llpanelplacestab.cpp +++ b/indra/newview/llpanelplacestab.cpp @@ -33,14 +33,17 @@ #include "llpanelplacestab.h" -#include "llwindow.h" - +#include "llbutton.h" #include "llnotificationsutil.h" -#include "llbutton.h" +#include "llwindow.h" + +#include "llpanelplaces.h" #include "llslurl.h" #include "llworldmap.h" +std::string LLPanelPlacesTab::sFilterSubString = LLStringUtil::null; + bool LLPanelPlacesTab::isTabVisible() { LLUICtrl* parent = getParentUICtrl(); diff --git a/indra/newview/llpanelplacestab.h b/indra/newview/llpanelplacestab.h index 458694d766..b4d839452e 100644 --- a/indra/newview/llpanelplacestab.h +++ b/indra/newview/llpanelplacestab.h @@ -34,7 +34,7 @@ #include "llpanel.h" -#include "llpanelplaces.h" +class LLPanelPlaces; class LLPanelPlacesTab : public LLPanel { @@ -55,6 +55,11 @@ public: const std::string& url, const LLUUID& snapshot_id, bool teleport); + +public: + // Search string for filtering landmarks and teleport history locations + static std::string sFilterSubString; + protected: LLButton* mTeleportBtn; LLButton* mShowOnMapBtn; diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index 71c1b0cbb9..e86123d565 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -66,10 +66,6 @@ glh::matrix4f glh_get_current_modelview(); glh::matrix4f glh_get_current_projection(); -const F32 ZOOM_NEAR_PADDING = 1.0f; -const F32 ZOOM_MEDIUM_PADDING = 1.15f; -const F32 ZOOM_FAR_PADDING = 1.5f; - // Warning: make sure these two match! const LLPanelPrimMediaControls::EZoomLevel LLPanelPrimMediaControls::kZoomLevels[] = { ZOOM_NONE, ZOOM_MEDIUM }; const int LLPanelPrimMediaControls::kNumZoomLevels = 2; @@ -86,7 +82,13 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() : mUpdateSlider(true), mClearFaceOnFade(false), mCurrentRate(0.0), - mMovieDuration(0.0) + mMovieDuration(0.0), + mTargetObjectID(LLUUID::null), + mTargetObjectFace(0), + mTargetImplID(LLUUID::null), + mTargetObjectNormal(LLVector3::zero), + mZoomObjectID(LLUUID::null), + mZoomObjectFace(0) { mCommitCallbackRegistrar.add("MediaCtrl.Close", boost::bind(&LLPanelPrimMediaControls::onClickClose, this)); mCommitCallbackRegistrar.add("MediaCtrl.Back", boost::bind(&LLPanelPrimMediaControls::onClickBack, this)); @@ -152,6 +154,11 @@ BOOL LLPanelPrimMediaControls::postBuild() mRightBookend = getChild<LLUICtrl>("right_bookend"); mBackgroundImage = LLUI::getUIImage(getString("control_background_image_name")); LLStringUtil::convertToF32(getString("skip_step"), mSkipStep); + LLStringUtil::convertToS32(getString("min_width"), mMinWidth); + LLStringUtil::convertToS32(getString("min_height"), mMinHeight); + LLStringUtil::convertToF32(getString("zoom_near_padding"), mZoomNearPadding); + LLStringUtil::convertToF32(getString("zoom_medium_padding"), mZoomMediumPadding); + LLStringUtil::convertToF32(getString("zoom_far_padding"), mZoomFarPadding); // These are currently removed...but getChild creates a "dummy" widget. // This class handles them missing. @@ -257,9 +264,6 @@ LLPluginClassMedia* LLPanelPrimMediaControls::getTargetMediaPlugin() void LLPanelPrimMediaControls::updateShape() { - const S32 MIN_HUD_WIDTH=400; - const S32 MIN_HUD_HEIGHT=120; - LLViewerMediaImpl* media_impl = getTargetMediaImpl(); LLViewerObject* objectp = getTargetObject(); @@ -279,7 +283,7 @@ void LLPanelPrimMediaControls::updateShape() bool can_navigate = parcel->getMediaAllowNavigate(); bool enabled = false; - bool is_zoomed = (mCurrentZoom != ZOOM_NONE); + bool is_zoomed = (mCurrentZoom != ZOOM_NONE) && (mTargetObjectID == mZoomObjectID) && (mTargetObjectFace == mZoomObjectFace); // There is no such thing as "has_focus" being different from normal controls set // anymore (as of user feedback from bri 10/09). So we cheat here and force 'has_focus' // to 'true' (or, actually, we use a setting) @@ -309,7 +313,7 @@ void LLPanelPrimMediaControls::updateShape() mStopCtrl->setVisible(false); mHomeCtrl->setVisible(has_focus); mZoomCtrl->setVisible(!is_zoomed); - mUnzoomCtrl->setVisible(has_focus && is_zoomed); + mUnzoomCtrl->setVisible(is_zoomed); mOpenCtrl->setVisible(true); mMediaAddressCtrl->setVisible(has_focus && !mini_controls); mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls); @@ -332,13 +336,12 @@ void LLPanelPrimMediaControls::updateShape() if(media_plugin && media_plugin->pluginSupportsMediaTime()) { - mReloadCtrl->setEnabled(FALSE); - mReloadCtrl->setVisible(FALSE); + mReloadCtrl->setEnabled(false); + mReloadCtrl->setVisible(false); mMediaStopCtrl->setVisible(has_focus); - mHomeCtrl->setVisible(FALSE); - // No nav controls - mBackCtrl->setVisible(FALSE); - mFwdCtrl->setEnabled(FALSE); + mHomeCtrl->setVisible(has_focus); + mBackCtrl->setVisible(false); + mFwdCtrl->setVisible(false); mMediaAddressCtrl->setVisible(false); mMediaAddressCtrl->setEnabled(false); mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls); @@ -416,7 +419,6 @@ void LLPanelPrimMediaControls::updateShape() mPlayCtrl->setVisible(FALSE); mPauseCtrl->setEnabled(TRUE); mPauseCtrl->setVisible(has_focus); - mMediaStopCtrl->setEnabled(TRUE); break; case LLPluginClassMediaOwner::MEDIA_PAUSED: @@ -425,7 +427,6 @@ void LLPanelPrimMediaControls::updateShape() mPauseCtrl->setVisible(FALSE); mPlayCtrl->setEnabled(TRUE); mPlayCtrl->setVisible(has_focus); - mMediaStopCtrl->setEnabled(FALSE); break; } } @@ -508,12 +509,10 @@ void LLPanelPrimMediaControls::updateShape() { mMediaProgressPanel->setVisible(true); mMediaProgressBar->setPercent(media_plugin->getProgressPercent()); - gFocusMgr.setTopCtrl(mMediaProgressPanel); } - else if (mMediaProgressPanel->getVisible()) + else { mMediaProgressPanel->setVisible(false); - gFocusMgr.setTopCtrl(NULL); } } @@ -599,12 +598,12 @@ void LLPanelPrimMediaControls::updateShape() } LLCoordGL screen_min; - screen_min.mX = llround((F32)gViewerWindow->getWorldViewWidthRaw() * (min.mV[VX] + 1.f) * 0.5f); - screen_min.mY = llround((F32)gViewerWindow->getWorldViewHeightRaw() * (min.mV[VY] + 1.f) * 0.5f); + screen_min.mX = llround((F32)gViewerWindow->getWorldViewWidthScaled() * (min.mV[VX] + 1.f) * 0.5f); + screen_min.mY = llround((F32)gViewerWindow->getWorldViewHeightScaled() * (min.mV[VY] + 1.f) * 0.5f); LLCoordGL screen_max; - screen_max.mX = llround((F32)gViewerWindow->getWorldViewWidthRaw() * (max.mV[VX] + 1.f) * 0.5f); - screen_max.mY = llround((F32)gViewerWindow->getWorldViewHeightRaw() * (max.mV[VY] + 1.f) * 0.5f); + screen_max.mX = llround((F32)gViewerWindow->getWorldViewWidthScaled() * (max.mV[VX] + 1.f) * 0.5f); + screen_max.mY = llround((F32)gViewerWindow->getWorldViewHeightScaled() * (max.mV[VY] + 1.f) * 0.5f); // grow panel so that screenspace bounding box fits inside "media_region" element of HUD LLRect media_controls_rect; @@ -613,14 +612,15 @@ void LLPanelPrimMediaControls::updateShape() media_controls_rect.mBottom -= mMediaRegion->getRect().mBottom; media_controls_rect.mTop += getRect().getHeight() - mMediaRegion->getRect().mTop; media_controls_rect.mRight += getRect().getWidth() - mMediaRegion->getRect().mRight; - - LLRect old_hud_rect = media_controls_rect; + // keep all parts of HUD on-screen media_controls_rect.intersectWith(getParent()->getLocalRect()); + if (mCurrentZoom != ZOOM_NONE) + media_controls_rect.mBottom -= mMediaControlsStack->getRect().getHeight() + mMediaProgressPanel->getRect().getHeight(); // clamp to minimum size, keeping centered media_controls_rect.setCenterAndSize(media_controls_rect.getCenterX(), media_controls_rect.getCenterY(), - llmax(MIN_HUD_WIDTH, media_controls_rect.getWidth()), llmax(MIN_HUD_HEIGHT, media_controls_rect.getHeight())); + llmax(mMinWidth, media_controls_rect.getWidth()), llmax(mMinHeight, media_controls_rect.getHeight())); setShape(media_controls_rect, true); @@ -968,17 +968,17 @@ void LLPanelPrimMediaControls::updateZoom() } case ZOOM_FAR: { - zoom_padding = ZOOM_FAR_PADDING; + zoom_padding = mZoomFarPadding; break; } case ZOOM_MEDIUM: { - zoom_padding = ZOOM_MEDIUM_PADDING; + zoom_padding = mZoomMediumPadding; break; } case ZOOM_NEAR: { - zoom_padding = ZOOM_NEAR_PADDING; + zoom_padding = mZoomNearPadding; break; } default: @@ -988,9 +988,16 @@ void LLPanelPrimMediaControls::updateZoom() } } - if (zoom_padding > 0.0f) + if (zoom_padding > 0.0f) + { LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding); + } + + // Remember the object ID/face we zoomed into, so we can update the zoom icon appropriately + mZoomObjectID = mTargetObjectID; + mZoomObjectFace = mTargetObjectFace; } + void LLPanelPrimMediaControls::onScrollUp(void* user_data) { LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data); diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h index accfb72a04..fe8f100abe 100644 --- a/indra/newview/llpanelprimmediacontrols.h +++ b/indra/newview/llpanelprimmediacontrols.h @@ -160,6 +160,11 @@ private: LLUICtrl *mRightBookend; LLUIImage* mBackgroundImage; F32 mSkipStep; + S32 mMinWidth; + S32 mMinHeight; + F32 mZoomNearPadding; + F32 mZoomMediumPadding; + F32 mZoomFarPadding; LLUICtrl *mMediaPanelScroll; LLButton *mScrollUpCtrl; @@ -190,6 +195,9 @@ private: S32 mTargetObjectFace; LLUUID mTargetImplID; LLVector3 mTargetObjectNormal; + + LLUUID mZoomObjectID; + S32 mZoomObjectFace; }; #endif // LL_PANELPRIMMEDIACONTROLS_H diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp index 4d152a13f3..1830d00f68 100644 --- a/indra/newview/llpanelprofile.cpp +++ b/indra/newview/llpanelprofile.cpp @@ -68,7 +68,7 @@ public: if (verb == "inspect") { - LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", avatar_id)); + LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", avatar_id)); return true; } diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index 327048d4f3..523487fa14 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -220,7 +220,6 @@ void LLTeleportHistoryPanel::ContextMenu::onCopyToClipboard() LLTeleportHistoryPanel::LLTeleportHistoryPanel() : LLPanelPlacesTab(), - mFilterSubString(LLStringUtil::null), mDirty(true), mCurrentItem(0), mTeleportHistory(NULL), @@ -317,9 +316,9 @@ void LLTeleportHistoryPanel::draw() // virtual void LLTeleportHistoryPanel::onSearchEdit(const std::string& string) { - if (mFilterSubString != string) + if (sFilterSubString != string) { - mFilterSubString = string; + sFilterSubString = string; showTeleportHistory(); } } @@ -482,8 +481,8 @@ void LLTeleportHistoryPanel::refresh() std::string landmark_title = items[mCurrentItem].mTitle; LLStringUtil::toUpper(landmark_title); - std::string::size_type match_offset = mFilterSubString.size() ? landmark_title.find(mFilterSubString) : std::string::npos; - bool passed = mFilterSubString.size() == 0 || match_offset != std::string::npos; + std::string::size_type match_offset = sFilterSubString.size() ? landmark_title.find(sFilterSubString) : std::string::npos; + bool passed = sFilterSubString.size() == 0 || match_offset != std::string::npos; if (!passed) { diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 68dc1b511f..13f195a1be 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -64,10 +64,10 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av mSpeakerMgr->addListener(mSpeakerModeratorListener, "update_moderator"); mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData")); - mAvatarList->setDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList)); - mAvatarList->setRefreshCompleteCallback(boost::bind(&LLParticipantList::onAvatarListRefreshed, this, _1, _2)); + mAvatarListDoubleClickConnection = mAvatarList->setDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList)); + mAvatarListRefreshConnection = mAvatarList->setRefreshCompleteCallback(boost::bind(&LLParticipantList::onAvatarListRefreshed, this, _1, _2)); // Set onAvatarListDoubleClicked as default on_return action. - mAvatarList->setReturnCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList)); + mAvatarListReturnConnection = mAvatarList->setReturnCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList)); if (use_context_menu) { @@ -87,7 +87,7 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av for(LLSpeakerMgr::speaker_list_t::iterator it = speaker_list.begin(); it != speaker_list.end(); it++) { const LLPointer<LLSpeaker>& speakerp = *it; - group_members.push_back(speakerp->mID); + addAvatarIDExceptAgent(group_members, speakerp->mID); if ( speakerp->mIsModerator ) { mModeratorList.insert(speakerp->mID); @@ -99,6 +99,10 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av LLParticipantList::~LLParticipantList() { + mAvatarListDoubleClickConnection.disconnect(); + mAvatarListRefreshConnection.disconnect(); + mAvatarListReturnConnection.disconnect(); + delete mParticipantListMenu; mParticipantListMenu = NULL; } @@ -192,7 +196,7 @@ bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, co return true; } - group_members.push_back(uu_id); + addAvatarIDExceptAgent(group_members, uu_id); // Mark AvatarList as dirty one mAvatarList->setDirty(); sort(); @@ -260,6 +264,15 @@ void LLParticipantList::sort() } } +// static +void LLParticipantList::addAvatarIDExceptAgent(std::vector<LLUUID>& existing_list, const LLUUID& avatar_id) +{ + if (gAgent.getID() != avatar_id) + { + existing_list.push_back(avatar_id); + } +} + // // LLParticipantList::SpeakerAddListener // diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h index ce61dd9b96..86b38f5f1e 100644 --- a/indra/newview/llparticipantlist.h +++ b/indra/newview/llparticipantlist.h @@ -132,6 +132,11 @@ class LLParticipantList void onAvatarListDoubleClicked(LLAvatarList* list); void onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param); + /** + * Adds specified avatar ID to the existing list if it is not Agent's ID + */ + static void addAvatarIDExceptAgent(std::vector<LLUUID>& existing_list, const LLUUID& avatar_id); + LLSpeakerMgr* mSpeakerMgr; LLAvatarList* mAvatarList; @@ -146,4 +151,9 @@ class LLParticipantList LLParticipantListMenu* mParticipantListMenu; EParticipantSortOrder mSortOrder; + + // boost::connections + boost::signals2::connection mAvatarListDoubleClickConnection; + boost::signals2::connection mAvatarListRefreshConnection; + boost::signals2::connection mAvatarListReturnConnection; }; diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp index c58caf9c60..155172128b 100644 --- a/indra/newview/llscriptfloater.cpp +++ b/indra/newview/llscriptfloater.cpp @@ -41,6 +41,7 @@ #include "llscreenchannel.h" #include "lltoastnotifypanel.h" #include "llviewerwindow.h" +#include "llimfloater.h" ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// @@ -211,7 +212,18 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id) LLNotificationData nd = {notification_id}; mNotifications.insert(std::make_pair(object_id, nd)); - LLBottomTray::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(object_id); + // Create inventory offer chiclet for offer type notifications + LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id); + if( notification && notification->getType() == "offer" ) + { + LLBottomTray::instance().getChicletPanel()->createChiclet<LLInvOfferChiclet>(object_id); + } + else + { + LLBottomTray::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(object_id); + } + + toggleScriptFloater(object_id); } void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id) diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 2554f1ccd5..1605838b94 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -33,6 +33,7 @@ #include "llviewerprecompiledheaders.h" // file include +#define LLSELECTMGR_CPP #include "llselectmgr.h" // library includes @@ -175,6 +176,8 @@ LLObjectSelection *get_null_object_selection() return sNullSelection; } +// Build time optimization, generate this function once here +template class LLSelectMgr* LLSingleton<class LLSelectMgr>::getInstance(); //----------------------------------------------------------------------------- // LLSelectMgr() diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index 2050a73f26..6641be335a 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -323,6 +323,11 @@ private: typedef LLSafeHandle<LLObjectSelection> LLObjectSelectionHandle; +// Build time optimization, generate this once in .cpp file +#ifndef LLSELECTMGR_CPP +extern template class LLSelectMgr* LLSingleton<class LLSelectMgr>::getInstance(); +#endif + class LLSelectMgr : public LLEditMenuHandler, public LLSingleton<LLSelectMgr> { public: diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index 5081c33f8e..ad6428e515 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -159,6 +159,7 @@ void LLSidepanelItemInfo::refresh() setIsEditing(FALSE); return; } + mEditBtn->setEnabled(FALSE); } if (!getIsEditing()) @@ -868,7 +869,11 @@ void LLSidepanelItemInfo::updateVerbs() const LLPermissions& perm = item->getPermissions(); BOOL is_modifiable = gAgent.allowOperation(PERM_MODIFY, perm, GP_OBJECT_MANIPULATE); - mEditBtn->setEnabled(is_modifiable); + + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); + bool item_in_trash = item->getUUID() == trash_id || gInventory.isObjectDescendentOf(item->getUUID(), trash_id); + mEditBtn->setEnabled(is_modifiable && !item_in_trash); + } } diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index ee62d689b5..9333465052 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -66,37 +66,6 @@ static const std::string TAB_PANEL_CAPTION_TITLE_BOX = "sidetray_tab_title"; LLSideTray* LLSideTray::sInstance = 0; -class LLSideTrayInfoPanel: public LLPanel -{ - -public: - LLSideTrayInfoPanel():LLPanel() - { - setBorderVisible(true); - } - - BOOL handleHover(S32 x, S32 y, MASK mask) - { - getWindow()->setCursor(UI_CURSOR_HAND); - return TRUE; - } - - BOOL handleMouseUp(S32 x, S32 y, MASK mask) - { - std::string name = getName(); - onCommit(); - LLSideTray::getInstance()->selectTabByName(name); - return LLPanel::handleMouseUp(x,y,mask); - } - void reshape (S32 width, S32 height, BOOL called_from_parent ) - { - return LLPanel::reshape(width, height, called_from_parent); - } - -}; - -static LLRegisterPanelClassWrapper<LLSideTrayInfoPanel> t_people("panel_sidetray_home_info"); - LLSideTray* LLSideTray::getInstance() { if (!sInstance) diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index db8bda008e..58df2ffb19 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -59,6 +59,7 @@ #include "llfloaterreg.h" #include "llfocusmgr.h" #include "llhttpsender.h" +#include "llimfloater.h" #include "lllocationhistory.h" #include "llimageworker.h" #include "llloginflags.h" @@ -482,7 +483,7 @@ bool idle_startup() { std::string diagnostic = "Could not start address resolution system"; LL_WARNS("AppInit") << diagnostic << LL_ENDL; - LLAppViewer::instance()->earlyExit("LoginFailedNoNetwork", LLSD().insert("DIAGNOSTIC", diagnostic)); + LLAppViewer::instance()->earlyExit("LoginFailedNoNetwork", LLSD().with("DIAGNOSTIC", diagnostic)); } // @@ -553,7 +554,7 @@ bool idle_startup() { std::string diagnostic = llformat(" Error: %d", gMessageSystem->getErrorCode()); LL_WARNS("AppInit") << diagnostic << LL_ENDL; - LLAppViewer::instance()->earlyExit("LoginFailedNoNetwork", LLSD().insert("DIAGNOSTIC", diagnostic)); + LLAppViewer::instance()->earlyExit("LoginFailedNoNetwork", LLSD().with("DIAGNOSTIC", diagnostic)); } #if LL_WINDOWS @@ -576,7 +577,7 @@ bool idle_startup() } else { - LLAppViewer::instance()->earlyExit("MessageTemplateNotFound", LLSD().insert("PATH", message_template_path)); + LLAppViewer::instance()->earlyExit("MessageTemplateNotFound", LLSD().with("PATH", message_template_path)); } if(gMessageSystem && gMessageSystem->isOK()) @@ -2085,6 +2086,8 @@ bool idle_startup() LLAgentPicksInfo::getInstance()->requestNumberOfPicks(); + LLIMFloater::initIMFloater(); + return TRUE; } diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp index a90f3ee181..8d3dcf8a99 100644 --- a/indra/newview/lltexlayer.cpp +++ b/indra/newview/lltexlayer.cpp @@ -689,24 +689,24 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height ) } } + LLGLSUIDefault gls_ui; + LLGLDepthTest gls_depth(GL_FALSE, GL_FALSE); + gGL.setColorMask(true, true); + + // clear buffer area to ensure we don't pick up UI elements + { + gGL.flush(); + LLGLDisable no_alpha(GL_ALPHA_TEST); + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + gGL.color4f( 0.f, 0.f, 0.f, 1.f ); + + gl_rect_2d_simple( width, height ); + + gGL.flush(); + } + if (mIsVisible) { - LLGLSUIDefault gls_ui; - LLGLDepthTest gls_depth(GL_FALSE, GL_FALSE); - gGL.setColorMask(true, true); - - // clear buffer area to ensure we don't pick up UI elements - { - gGL.flush(); - LLGLDisable no_alpha(GL_ALPHA_TEST); - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gGL.color4f( 0.f, 0.f, 0.f, 1.f ); - - gl_rect_2d_simple( width, height ); - - gGL.flush(); - } - // composite color layers for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) { @@ -723,6 +723,21 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height ) stop_glerror(); } + else + { + gGL.flush(); + + gGL.setSceneBlendType(LLRender::BT_REPLACE); + LLGLDisable no_alpha(GL_ALPHA_TEST); + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + gGL.color4f( 0.f, 0.f, 0.f, 0.f ); + + gl_rect_2d_simple( width, height ); + gGL.setSceneBlendType(LLRender::BT_ALPHA); + + gGL.flush(); + + } return success; } diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 266fa4dd74..2d0a14dc70 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -31,53 +31,37 @@ */ #include "llviewerprecompiledheaders.h" - -#include "message.h" #include "lltooldraganddrop.h" // library headers -#include "llfloaterreg.h" -#include "llinstantmessage.h" -#include "lldir.h" #include "llnotificationsutil.h" - // project headers #include "llagent.h" +#include "llagentui.h" #include "llagentwearables.h" -#include "llviewercontrol.h" +#include "llappearancemgr.h" +#include "lldictionary.h" #include "llfirstuse.h" -#include "llfloater.h" +#include "llfloaterreg.h" #include "llfloatertools.h" -#include "llfocusmgr.h" #include "llgesturemgr.h" -#include "llhudeffecttrail.h" #include "llhudmanager.h" +#include "llhudeffecttrail.h" +#include "llimview.h" #include "llinventorybridge.h" -#include "llinventorymodel.h" #include "llmutelist.h" -#include "llnotify.h" #include "llpreviewnotecard.h" #include "llrecentpeople.h" +#include "llrootview.h" #include "llselectmgr.h" #include "lltoolmgr.h" #include "lltooltip.h" #include "lltrans.h" -#include "llui.h" -#include "llviewertexturelist.h" -#include "llviewerinventory.h" -#include "llviewerobject.h" #include "llviewerobjectlist.h" -#include "llviewerregion.h" #include "llviewerstats.h" #include "llviewerwindow.h" #include "llvoavatarself.h" -#include "llvolume.h" #include "llworld.h" -#include "object_flags.h" -#include "llimview.h" -#include "llrootview.h" -#include "llagentui.h" -#include "llappearancemgr.h" // MAX ITEMS is based on (sizeof(uuid)+2) * count must be < MTUBYTES // or 18 * count < 1200 => count < 1200/18 => 66. I've cut it down a @@ -358,134 +342,51 @@ void LLCategoryDropDescendentsObserver::done() delete this; } -// This array is used to more easily control what happens when a 3d -// drag and drop event occurs. Since there's an array of drop target -// and cargo type, it's implemented as an array of pointers to member -// functions which correctly carry out the actual drop. -LLToolDragAndDrop::dragOrDrop3dImpl LLToolDragAndDrop::sDragAndDrop3d[DAD_COUNT][LLToolDragAndDrop::DT_COUNT] = -{ - // Source: DAD_NONE - { - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_AVATAR - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_OBJECT - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_LAND - }, - // Source: DAD_TEXTURE - { - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF - &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR - &LLToolDragAndDrop::dad3dTextureObject, // Dest: DT_OBJECT - &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND - }, - // Source: DAD_SOUND - { - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF - &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR - &LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT - &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND - }, - // Source: DAD_CALLINGCARD - { - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF - &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR - &LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_LAND - }, - // Source: DAD_LANDMARK - { - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF - &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR - &LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT - &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND - }, - // Source: DAD_SCRIPT - { - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF - &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR - &LLToolDragAndDrop::dad3dRezScript, // Dest: DT_OBJECT - &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND - }, - // Source: DAD_CLOTHING - { - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE - &LLToolDragAndDrop::dad3dWearItem, // Dest: DT_SELF - &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR - &LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT - &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND - }, - // Source: DAD_OBJECT - { - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE - &LLToolDragAndDrop::dad3dRezAttachmentFromInv, // Dest: DT_SELF - &LLToolDragAndDrop::dad3dGiveInventoryObject, // Dest: DT_AVATAR - &LLToolDragAndDrop::dad3dRezObjectOnObject, // Dest: DT_OBJECT - &LLToolDragAndDrop::dad3dRezObjectOnLand, // Dest: DT_LAND - }, - // Source: DAD_NOTECARD - { - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF - &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR - &LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT - &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND - }, - // Source: DAD_CATEGORY - { - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE - &LLToolDragAndDrop::dad3dWearCategory, // Dest: DT_SELF - &LLToolDragAndDrop::dad3dGiveInventoryCategory, // Dest: DT_AVATAR - &LLToolDragAndDrop::dad3dUpdateInventoryCategory, // Dest: DT_OBJECT - &LLToolDragAndDrop::dad3dNULL,//dad3dCategoryOnLand, // Dest: DT_LAND - }, - // Source: DAD_ROOT - { - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_AVATAR - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_OBJECT - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_LAND - }, - // Source: DAD_BODYPART - { - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE - &LLToolDragAndDrop::dad3dWearItem, // Dest: DT_SELF - &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR - &LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT - &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND - }, - // Source: DAD_ANIMATION - // TODO: animation on self could play it? edit it? +LLToolDragAndDrop::DragAndDropEntry::DragAndDropEntry(dragOrDrop3dImpl f_none, + dragOrDrop3dImpl f_self, + dragOrDrop3dImpl f_avatar, + dragOrDrop3dImpl f_object, + dragOrDrop3dImpl f_land) : + LLDictionaryEntry("") +{ + mFunctions[DT_NONE] = f_none; + mFunctions[DT_SELF] = f_self; + mFunctions[DT_AVATAR] = f_avatar; + mFunctions[DT_OBJECT] = f_object; + mFunctions[DT_LAND] = f_land; +} + +LLToolDragAndDrop::dragOrDrop3dImpl LLToolDragAndDrop::LLDragAndDropDictionary::get(EDragAndDropType dad_type, LLToolDragAndDrop::EDropTarget drop_target) +{ + const DragAndDropEntry *entry = lookup(dad_type); + if (entry) { - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF - &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR - &LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT - &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND - }, - // Source: DAD_GESTURE + return (entry->mFunctions[(U8)drop_target]); + } + return &LLToolDragAndDrop::dad3dNULL; +} + +LLToolDragAndDrop::LLDragAndDropDictionary::LLDragAndDropDictionary() +{ + // DT_NONE DT_SELF DT_AVATAR DT_OBJECT DT_LAND + // |--------------|---------------------------|---------------------------|-------------------------------|--------------| + addEntry(DAD_NONE, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL)); + addEntry(DAD_TEXTURE, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dTextureObject, &LLToolDragAndDrop::dad3dNULL)); + addEntry(DAD_SOUND, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL)); + addEntry(DAD_CALLINGCARD, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL)); + addEntry(DAD_LANDMARK, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL)); + addEntry(DAD_SCRIPT, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dRezScript, &LLToolDragAndDrop::dad3dNULL)); + addEntry(DAD_CLOTHING, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearItem, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL)); + addEntry(DAD_OBJECT, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dRezAttachmentFromInv, &LLToolDragAndDrop::dad3dGiveInventoryObject, &LLToolDragAndDrop::dad3dRezObjectOnObject, &LLToolDragAndDrop::dad3dRezObjectOnLand)); + addEntry(DAD_NOTECARD, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL)); + addEntry(DAD_CATEGORY, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearCategory, &LLToolDragAndDrop::dad3dGiveInventoryCategory,&LLToolDragAndDrop::dad3dUpdateInventoryCategory, &LLToolDragAndDrop::dad3dNULL)); + addEntry(DAD_ROOT_CATEGORY, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL)); + addEntry(DAD_BODYPART, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearItem, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL)); + addEntry(DAD_ANIMATION, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL)); + addEntry(DAD_GESTURE, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dActivateGesture, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL)); + addEntry(DAD_LINK, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL)); + // TODO: animation on self could play it? edit it? // TODO: gesture on self could play it? edit it? - { - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE - &LLToolDragAndDrop::dad3dActivateGesture, // Dest: DT_SELF - &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR - &LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT - &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND - }, - // Source: DAD_LINK - { - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_AVATAR - &LLToolDragAndDrop::dad3dNULL, // Dest: DT_OBJECT - &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND - }, }; LLToolDragAndDrop::LLToolDragAndDrop() @@ -928,7 +829,7 @@ void LLToolDragAndDrop::dragOrDrop3D( S32 x, S32 y, MASK mask, BOOL drop, EAccep if (mDrop) { // don't allow drag and drop onto transparent objects - pickCallback(gViewerWindow->pickImmediate(x, y, FALSE)); + pick(gViewerWindow->pickImmediate(x, y, FALSE)); } else { @@ -941,6 +842,14 @@ void LLToolDragAndDrop::dragOrDrop3D( S32 x, S32 y, MASK mask, BOOL drop, EAccep void LLToolDragAndDrop::pickCallback(const LLPickInfo& pick_info) { + if (getInstance() != NULL) + { + getInstance()->pick(pick_info); + } +} + +void LLToolDragAndDrop::pick(const LLPickInfo& pick_info) +{ EDropTarget target = DT_NONE; S32 hit_face = -1; @@ -948,31 +857,30 @@ void LLToolDragAndDrop::pickCallback(const LLPickInfo& pick_info) LLSelectMgr::getInstance()->unhighlightAll(); // Treat attachments as part of the avatar they are attached to. - if (hit_obj) + if (hit_obj != NULL) { // don't allow drag and drop on grass, trees, etc. - if(pick_info.mPickType == LLPickInfo::PICK_FLORA) + if (pick_info.mPickType == LLPickInfo::PICK_FLORA) { - LLToolDragAndDrop::getInstance()->mCursor = UI_CURSOR_NO; - gViewerWindow->getWindow()->setCursor( LLToolDragAndDrop::getInstance()->mCursor ); + mCursor = UI_CURSOR_NO; + gViewerWindow->getWindow()->setCursor( mCursor ); return; } - if(hit_obj->isAttachment() && !hit_obj->isHUDAttachment()) + if (hit_obj->isAttachment() && !hit_obj->isHUDAttachment()) { LLVOAvatar* avatar = LLVOAvatar::findAvatarFromAttachment( hit_obj ); if( !avatar ) { - LLToolDragAndDrop::getInstance()->mLastAccept = ACCEPT_NO; - LLToolDragAndDrop::getInstance()->mCursor = UI_CURSOR_NO; - gViewerWindow->getWindow()->setCursor( LLToolDragAndDrop::getInstance()->mCursor ); + mLastAccept = ACCEPT_NO; + mCursor = UI_CURSOR_NO; + gViewerWindow->getWindow()->setCursor( mCursor ); return; } - hit_obj = avatar; } - if(hit_obj->isAvatar()) + if (hit_obj->isAvatar()) { if(((LLVOAvatar*) hit_obj)->isSelf()) { @@ -991,9 +899,9 @@ void LLToolDragAndDrop::pickCallback(const LLPickInfo& pick_info) hit_face = pick_info.mObjectFace; // if any item being dragged will be applied to the object under our cursor // highlight that object - for (S32 i = 0; i < (S32)LLToolDragAndDrop::getInstance()->mCargoIDs.size(); i++) + for (S32 i = 0; i < (S32)mCargoIDs.size(); i++) { - if (LLToolDragAndDrop::getInstance()->mCargoTypes[i] != DAD_OBJECT || (pick_info.mKeyMask & MASK_CONTROL)) + if (mCargoTypes[i] != DAD_OBJECT || (pick_info.mKeyMask & MASK_CONTROL)) { LLSelectMgr::getInstance()->highlightObjectAndFamily(hit_obj); break; @@ -1001,55 +909,54 @@ void LLToolDragAndDrop::pickCallback(const LLPickInfo& pick_info) } } } - else if(pick_info.mPickType == LLPickInfo::PICK_LAND) + else if (pick_info.mPickType == LLPickInfo::PICK_LAND) { target = DT_LAND; hit_face = -1; } - LLToolDragAndDrop::getInstance()->mLastAccept = ACCEPT_YES_MULTI; + mLastAccept = ACCEPT_YES_MULTI; - for (LLToolDragAndDrop::getInstance()->mCurItemIndex = 0; LLToolDragAndDrop::getInstance()->mCurItemIndex < (S32)LLToolDragAndDrop::getInstance()->mCargoIDs.size(); - LLToolDragAndDrop::getInstance()->mCurItemIndex++) + for (mCurItemIndex = 0; mCurItemIndex < (S32)mCargoIDs.size(); mCurItemIndex++) { + const S32 item_index = mCurItemIndex; + const EDragAndDropType dad_type = mCargoTypes[item_index]; // Call the right implementation function - LLToolDragAndDrop::getInstance()->mLastAccept = (EAcceptance)llmin( - (U32)LLToolDragAndDrop::getInstance()->mLastAccept, - (U32)callMemberFunction((*LLToolDragAndDrop::getInstance()), - LLToolDragAndDrop::getInstance()->sDragAndDrop3d[LLToolDragAndDrop::getInstance()->mCargoTypes[LLToolDragAndDrop::getInstance()->mCurItemIndex]][target]) - (hit_obj, hit_face, pick_info.mKeyMask, FALSE)); + mLastAccept = (EAcceptance)llmin( + (U32)mLastAccept, + (U32)callMemberFunction(*this, + LLDragAndDropDictionary::instance().get(dad_type, target)) + (hit_obj, hit_face, pick_info.mKeyMask, FALSE)); } - if (LLToolDragAndDrop::getInstance()->mDrop && - (U32)LLToolDragAndDrop::getInstance()->mLastAccept >= ACCEPT_YES_COPY_SINGLE) + if (mDrop && ((U32)mLastAccept >= ACCEPT_YES_COPY_SINGLE)) { // if target allows multi-drop or there is only one item being dropped, go ahead - if (LLToolDragAndDrop::getInstance()->mLastAccept >= ACCEPT_YES_COPY_MULTI || - LLToolDragAndDrop::getInstance()->mCargoIDs.size() == 1) + if ((mLastAccept >= ACCEPT_YES_COPY_MULTI) || (mCargoIDs.size() == 1)) { // Target accepts multi, or cargo is a single-drop - for (LLToolDragAndDrop::getInstance()->mCurItemIndex = 0; - LLToolDragAndDrop::getInstance()->mCurItemIndex < (S32)LLToolDragAndDrop::getInstance()->mCargoIDs.size(); - LLToolDragAndDrop::getInstance()->mCurItemIndex++) + for (mCurItemIndex = 0; mCurItemIndex < (S32)mCargoIDs.size(); mCurItemIndex++) { + const S32 item_index = mCurItemIndex; + const EDragAndDropType dad_type = mCargoTypes[item_index]; // Call the right implementation function - (U32)callMemberFunction((*LLToolDragAndDrop::getInstance()), - LLToolDragAndDrop::getInstance()->sDragAndDrop3d[LLToolDragAndDrop::getInstance()->mCargoTypes[LLToolDragAndDrop::getInstance()->mCurItemIndex]][target]) + (U32)callMemberFunction(*this, + LLDragAndDropDictionary::instance().get(dad_type, target)) (hit_obj, hit_face, pick_info.mKeyMask, TRUE); } } else { // Target does not accept multi, but cargo is multi - LLToolDragAndDrop::getInstance()->mLastAccept = ACCEPT_NO; + mLastAccept = ACCEPT_NO; } } - ECursorType cursor = LLToolDragAndDrop::getInstance()->acceptanceToCursor( LLToolDragAndDrop::getInstance()->mLastAccept ); + ECursorType cursor = acceptanceToCursor( mLastAccept ); gViewerWindow->getWindow()->setCursor( cursor ); - LLToolDragAndDrop::getInstance()->mLastHitPos = pick_info.mPosGlobal; - LLToolDragAndDrop::getInstance()->mLastCameraPos = gAgent.getCameraPositionGlobal(); + mLastHitPos = pick_info.mPosGlobal; + mLastCameraPos = gAgent.getCameraPositionGlobal(); } // static @@ -1923,10 +1830,11 @@ BOOL LLToolDragAndDrop::isInventoryGroupGiveAcceptable(LLInventoryItem* item) EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LLInventoryItem* item) { // check the basics - if(!item || !obj) return ACCEPT_NO; + if (!item || !obj) return ACCEPT_NO; // HACK: downcast LLViewerInventoryItem* vitem = (LLViewerInventoryItem*)item; - if(!vitem->isComplete()) return ACCEPT_NO; + if (!vitem->isComplete()) return ACCEPT_NO; + if (vitem->getIsLinkType()) return ACCEPT_NO; // No giving away links // deny attempts to drop from an object onto itself. This is to // help make sure that drops that are from an object to an object @@ -1936,7 +1844,7 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL { return ACCEPT_NO; } - + //BOOL copy = (perm.allowCopyBy(gAgent.getID(), // gAgent.getGroupID()) // && (obj->mPermModify || obj->mFlagAllowInventoryAdd)); @@ -2575,24 +2483,30 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory( LLViewerObject* obj, S32 face, MASK mask, BOOL drop) { lldebugs << "LLToolDragAndDrop::dad3dUpdateInventoryCategory()" << llendl; - if (NULL==obj) + if (obj == NULL) { llwarns << "obj is NULL; aborting func with ACCEPT_NO" << llendl; return ACCEPT_NO; } - if (mSource != SOURCE_AGENT && mSource != SOURCE_LIBRARY) + if ((mSource != SOURCE_AGENT) && (mSource != SOURCE_LIBRARY)) { return ACCEPT_NO; } - if(obj->isAttachment()) return ACCEPT_NO_LOCKED; - LLViewerInventoryItem* item; - LLViewerInventoryCategory* cat; + if (obj->isAttachment()) + { + return ACCEPT_NO_LOCKED; + } + + LLViewerInventoryItem* item = NULL; + LLViewerInventoryCategory* cat = NULL; locateInventory(item, cat); - if(!cat) return ACCEPT_NO; - EAcceptance rv = ACCEPT_NO; + if (!cat) + { + return ACCEPT_NO; + } - // find all the items in the category + // Find all the items in the category LLDroppableItem droppable(!obj->permYouOwner()); LLInventoryModel::cat_array_t cats; LLInventoryModel::item_array_t items; @@ -2602,7 +2516,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory( LLInventoryModel::EXCLUDE_TRASH, droppable); cats.put(cat); - if(droppable.countNoCopy() > 0) + if (droppable.countNoCopy() > 0) { llwarns << "*** Need to confirm this step" << llendl; } @@ -2616,46 +2530,57 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory( } } + EAcceptance rv = ACCEPT_NO; + // Check for accept - S32 i; - S32 count = cats.count(); - for(i = 0; i < count; ++i) + for (LLInventoryModel::cat_array_t::const_iterator cat_iter = cats.begin(); + cat_iter != cats.end(); + ++cat_iter) { - rv = gInventory.isCategoryComplete(cats.get(i)->getUUID()) ? ACCEPT_YES_MULTI : ACCEPT_NO; + const LLViewerInventoryCategory *cat = (*cat_iter); + rv = gInventory.isCategoryComplete(cat->getUUID()) ? ACCEPT_YES_MULTI : ACCEPT_NO; if(rv < ACCEPT_YES_SINGLE) { - lldebugs << "Category " << cats.get(i)->getUUID() - << "is not complete." << llendl; + lldebugs << "Category " << cat->getUUID() << "is not complete." << llendl; break; } } - if(ACCEPT_YES_COPY_SINGLE <= rv) + if (ACCEPT_YES_COPY_SINGLE <= rv) { - count = items.count(); - for(i = 0; i < count; ++i) + for (LLInventoryModel::item_array_t::const_iterator item_iter = items.begin(); + item_iter != items.end(); + ++item_iter) { - rv = willObjectAcceptInventory(root_object, items.get(i)); - if(rv < ACCEPT_YES_COPY_SINGLE) + LLViewerInventoryItem *item = (*item_iter); + /* + // Pass the base objects, not the links. + if (item && item->getIsLinkType()) + { + item = item->getLinkedItem(); + (*item_iter) = item; + } + */ + rv = willObjectAcceptInventory(root_object, item); + if (rv < ACCEPT_YES_COPY_SINGLE) { - lldebugs << "Object will not accept " - << items.get(i)->getUUID() << llendl; + lldebugs << "Object will not accept " << item->getUUID() << llendl; break; } } } - // if every item is accepted, go ahead and send it on. - if(drop && (ACCEPT_YES_COPY_SINGLE <= rv)) + // If every item is accepted, send it on + if (drop && (ACCEPT_YES_COPY_SINGLE <= rv)) { - S32 count = items.count(); LLInventoryFetchObserver::item_ref_t ids; - for(i = 0; i < count; ++i) + for (LLInventoryModel::item_array_t::const_iterator item_iter = items.begin(); + item_iter != items.end(); + ++item_iter) { - //dropInventory(root_object, items.get(i), mSource, mSourceID); - ids.push_back(items.get(i)->getUUID()); + const LLViewerInventoryItem *item = (*item_iter); + ids.push_back(item->getUUID()); } - LLCategoryDropObserver* dropper; - dropper = new LLCategoryDropObserver(obj->getID(), mSource); + LLCategoryDropObserver* dropper = new LLCategoryDropObserver(obj->getID(), mSource); dropper->fetchItems(ids); if(dropper->isEverythingComplete()) { diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h index e1536acf75..79b2bc32a3 100644 --- a/indra/newview/lltooldraganddrop.h +++ b/indra/newview/lltooldraganddrop.h @@ -33,6 +33,7 @@ #ifndef LL_TOOLDRAGANDDROP_H #define LL_TOOLDRAGANDDROP_H +#include "lldictionary.h" #include "lltool.h" #include "llview.h" #include "lluuid.h" @@ -102,6 +103,7 @@ protected: DT_COUNT = 5 }; +protected: // dragOrDrop3dImpl points to a member of LLToolDragAndDrop that // takes parameters (LLViewerObject* obj, S32 face, MASK, BOOL // drop) and returns a BOOL if drop is ok @@ -112,7 +114,9 @@ protected: EAcceptance* acceptance); void dragOrDrop3D(S32 x, S32 y, MASK mask, BOOL drop, EAcceptance* acceptance); + static void pickCallback(const LLPickInfo& pick_info); + void pick(const LLPickInfo& pick_info); protected: @@ -137,10 +141,6 @@ protected: enddrag_signal_t mEndDragSignal; - // array of pointers to functions that implement the logic to - // dragging and dropping into the simulator. - static dragOrDrop3dImpl sDragAndDrop3d[DAD_COUNT][DT_COUNT]; - protected: // 3d drop functions. these call down into the static functions // named drop<ThingToDrop> if drop is TRUE and permissions allow @@ -272,6 +272,25 @@ public: EDragAndDropType cargo_type, void* cargo_data, EAcceptance* accept); + + // Classes used for determining 3d drag and drop types. +private: + struct DragAndDropEntry : public LLDictionaryEntry + { + DragAndDropEntry(dragOrDrop3dImpl f_none, + dragOrDrop3dImpl f_self, + dragOrDrop3dImpl f_avatar, + dragOrDrop3dImpl f_object, + dragOrDrop3dImpl f_land); + dragOrDrop3dImpl mFunctions[DT_COUNT]; + }; + class LLDragAndDropDictionary : public LLSingleton<LLDragAndDropDictionary>, + public LLDictionary<EDragAndDropType, DragAndDropEntry> + { + public: + LLDragAndDropDictionary(); + dragOrDrop3dImpl get(EDragAndDropType dad_type, EDropTarget drop_target); + }; }; // utility functions diff --git a/indra/newview/lluilistener.cpp b/indra/newview/lluilistener.cpp index 8b4cfa7248..3ad9887bec 100644 --- a/indra/newview/lluilistener.cpp +++ b/indra/newview/lluilistener.cpp @@ -29,7 +29,7 @@ LLUIListener::LLUIListener(): "Invoke the operation named by [\"function\"], passing [\"parameter\"],\n" "as if from a user gesture on a menu -- or a button click.", &LLUIListener::call, - LLSD().insert("function", LLSD())); + LLSD().with("function", LLSD())); } void LLUIListener::call(const LLSD& event) const diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp index f3c64088c9..bd4f172907 100644 --- a/indra/newview/llviewercamera.cpp +++ b/indra/newview/llviewercamera.cpp @@ -32,6 +32,7 @@ #include "llviewerprecompiledheaders.h" +#define LLVIEWERCAMERA_CPP #include "llviewercamera.h" // Viewer includes @@ -105,6 +106,9 @@ glh::matrix4f gl_lookat(LLVector3 eye, LLVector3 center, LLVector3 up) } +// Build time optimization, generate this once in .cpp file +template class LLViewerCamera* LLSingleton<class LLViewerCamera>::getInstance(); + LLViewerCamera::LLViewerCamera() : LLCamera() { calcProjection(getFar()); diff --git a/indra/newview/llviewercamera.h b/indra/newview/llviewercamera.h index 2b8a0892bf..cd67af5fef 100644 --- a/indra/newview/llviewercamera.h +++ b/indra/newview/llviewercamera.h @@ -52,6 +52,11 @@ const F32 OGL_TO_CFR_ROTATION[16] = { 0.f, 0.f, -1.f, 0.f, // -Z becomes X const BOOL FOR_SELECTION = TRUE; const BOOL NOT_FOR_SELECTION = FALSE; +// Build time optimization, generate this once in .cpp file +#ifndef LLVIEWERCAMERA_CPP +extern template class LLViewerCamera* LLSingleton<class LLViewerCamera>::getInstance(); +#endif + class LLViewerCamera : public LLCamera, public LLSingleton<LLViewerCamera> { public: diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 1a8edb1f6a..b5454e7298 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -225,7 +225,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("telehubs", "floater_telehub.xml",&LLFloaterReg::build<LLFloaterTelehub>); LLFloaterReg::add("test_inspectors", "floater_test_inspectors.xml", &LLFloaterReg::build<LLFloaterTestInspectors>); - LLFloaterReg::add("test_list_view", "floater_test_list_view.xml",&LLFloaterReg::build<LLFloaterTestListView>); + //LLFloaterReg::add("test_list_view", "floater_test_list_view.xml",&LLFloaterReg::build<LLFloaterTestListView>); LLFloaterReg::add("test_widgets", "floater_test_widgets.xml", &LLFloaterReg::build<LLFloater>); LLFloaterReg::add("top_objects", "floater_top_objects.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTopObjects>); diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index d0ae5d1e38..f9e1a94def 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -509,7 +509,10 @@ bool LLViewerInventoryCategory::fetchDescendents() // This comes from LLInventoryFilter from llfolderview.h U32 sort_order = gSavedSettings.getU32("InventorySortOrder") & 0x1; - std::string url = gAgent.getRegion()->getCapability("WebFetchInventoryDescendents"); + // *NOTE + // Temporary workaround for bug EXT-2879, see ticket for details. + // Commented gAgent.getRegion()->getCapability in order to use the old system. + std::string url;//= gAgent.getRegion()->getCapability("WebFetchInventoryDescendents"); if (!url.empty()) //Capability found. Build up LLSD and use it. { diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index f2ddb0b1f1..d5fd23ac51 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -171,7 +171,16 @@ public: else if(status == 404) { - // Treat 404s like an html page. + // 404 is content not found - sites often have bespoke 404 pages so + // treat them like an html page. + completeAny(status, "text/html"); + } + else + if(status == 406) + { + // 406 means the server sent something that we didn't indicate was acceptable + // Eventually we should send what we accept in the headers but for now, + // treat 406s like an html page. completeAny(status, "text/html"); } else @@ -1281,16 +1290,36 @@ void LLViewerMediaImpl::mouseMove(S32 x, S32 y, MASK mask) } ////////////////////////////////////////////////////////////////////////////////////////// +//static +void LLViewerMediaImpl::scaleTextureCoords(const LLVector2& texture_coords, S32 *x, S32 *y) +{ + F32 texture_x = texture_coords.mV[VX]; + F32 texture_y = texture_coords.mV[VY]; + + // Deal with repeating textures by wrapping the coordinates into the range [0, 1.0) + texture_x = fmodf(texture_x, 1.0f); + if(texture_x < 0.0f) + texture_x = 1.0 + texture_x; + + texture_y = fmodf(texture_y, 1.0f); + if(texture_y < 0.0f) + texture_y = 1.0 + texture_y; + + // scale x and y to texel units. + *x = llround(texture_x * mMediaSource->getTextureWidth()); + *y = llround((1.0f - texture_y) * mMediaSource->getTextureHeight()); + + // Adjust for the difference between the actual texture height and the amount of the texture in use. + *y -= (mMediaSource->getTextureHeight() - mMediaSource->getHeight()); +} + +////////////////////////////////////////////////////////////////////////////////////////// void LLViewerMediaImpl::mouseDown(const LLVector2& texture_coords, MASK mask, S32 button) { if(mMediaSource) { - // scale x and y to texel units. - S32 x = llround(texture_coords.mV[VX] * mMediaSource->getTextureWidth()); - S32 y = llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight()); - - // Adjust for the difference between the actual texture height and the amount of the texture in use. - y -= (mMediaSource->getTextureHeight() - mMediaSource->getHeight()); + S32 x, y; + scaleTextureCoords(texture_coords, &x, &y); mouseDown(x, y, mask, button); } @@ -1300,12 +1329,8 @@ void LLViewerMediaImpl::mouseUp(const LLVector2& texture_coords, MASK mask, S32 { if(mMediaSource) { - // scale x and y to texel units. - S32 x = llround(texture_coords.mV[VX] * mMediaSource->getTextureWidth()); - S32 y = llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight()); - - // Adjust for the difference between the actual texture height and the amount of the texture in use. - y -= (mMediaSource->getTextureHeight() - mMediaSource->getHeight()); + S32 x, y; + scaleTextureCoords(texture_coords, &x, &y); mouseUp(x, y, mask, button); } @@ -1315,12 +1340,8 @@ void LLViewerMediaImpl::mouseMove(const LLVector2& texture_coords, MASK mask) { if(mMediaSource) { - // scale x and y to texel units. - S32 x = llround(texture_coords.mV[VX] * mMediaSource->getTextureWidth()); - S32 y = llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight()); - - // Adjust for the difference between the actual texture height and the amount of the texture in use. - y -= (mMediaSource->getTextureHeight() - mMediaSource->getHeight()); + S32 x, y; + scaleTextureCoords(texture_coords, &x, &y); mouseMove(x, y, mask); } diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index ac12112ed4..e2d159304f 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -185,6 +185,7 @@ public: void setHomeURL(const std::string& home_url) { mHomeURL = home_url; }; std::string getMimeType() { return mMimeType; } void scaleMouse(S32 *mouse_x, S32 *mouse_y); + void scaleTextureCoords(const LLVector2& texture_coords, S32 *x, S32 *y); void update(); void updateImagesMediaStreams(); diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp index fd74c9c2fc..f639c841e7 100644 --- a/indra/newview/llviewermediafocus.cpp +++ b/indra/newview/llviewermediafocus.cpp @@ -138,15 +138,6 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac } else { - if(mFocusedImplID.notNull()) - { - if(mMediaControls.get()) - { - // Don't reset camera zoom by default, just tell the controls they're no longer controlling zoom. - mMediaControls.get()->resetZoomLevel(false); - } - } - if(hasFocus()) { gFocusMgr.setKeyboardFocus(NULL); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 4307002980..0b40492391 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -5360,7 +5360,7 @@ class LLWorldCreateLandmark : public view_listener_t { bool handleEvent(const LLSD& userdata) { - LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark")); + LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark")); return true; } @@ -6221,6 +6221,7 @@ BOOL object_selected_and_point_valid() return (selection->getRootObjectCount() == 1) && (selection->getFirstRootObject()->getPCode() == LL_PCODE_VOLUME) && selection->getFirstRootObject()->permYouOwner() && + selection->getFirstRootObject()->flagObjectMove() && !((LLViewerObject*)selection->getFirstRootObject()->getRoot())->isAvatar() && (selection->getFirstRootObject()->getNVPair("AssetContainer") == NULL); } diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 9fc818e1ff..23d02af73d 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -1240,6 +1240,10 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& gInventory.addObserver(opener); } + // Remove script dialog because there is no need in it no more. + LLUUID object_id = notification["payload"]["object_id"].asUUID(); + LLScriptFloaterManager::instance().removeNotificationByObjectId(object_id); + delete this; return false; } @@ -1414,7 +1418,11 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const { gInventory.addObserver(opener); } - + + // Remove script dialog because there is no need in it no more. + LLUUID object_id = notification["payload"]["object_id"].asUUID(); + LLScriptFloaterManager::instance().removeNotificationByObjectId(object_id); + delete this; return false; } @@ -1502,7 +1510,18 @@ void inventory_offer_handler(LLOfferInfo* info) } } + // If mObjectID is null then generate the object_id based on msg to prevent + // multiple creation of chiclets for same object. + LLUUID object_id = info->mObjectID; + if (object_id.isNull()) + object_id.generate(msg); + payload["from_id"] = info->mFromID; + // Needed by LLScriptFloaterManager to bind original notification with + // faked for toast one. + payload["object_id"] = object_id; + // Flag indicating that this notification is faked for toast. + payload["give_inventory_notification"] = FALSE; args["OBJECTFROMNAME"] = info->mFromName; args["NAME"] = info->mFromName; args["NAME_SLURL"] = LLSLURL::buildCommand("agent", info->mFromID, "about"); @@ -1543,9 +1562,16 @@ void inventory_offer_handler(LLOfferInfo* info) // In viewer 2 we're now auto receiving inventory offers and messaging as such (not sending reject messages). info->send_auto_receive_response(); } - + // Pop up inv offer notification and let the user accept (keep), or reject (and silently delete) the inventory. - LLNotifications::instance().add(p); + LLNotifications::instance().add(p); + + // Inform user that there is a script floater via toast system + { + payload["give_inventory_notification"] = TRUE; + LLNotificationPtr notification = LLNotifications::instance().add(p.payload(payload)); + LLScriptFloaterManager::getInstance()->setNotificationToastId(object_id, notification->getID()); + } } bool lure_callback(const LLSD& notification, const LLSD& response) @@ -4347,7 +4373,28 @@ void process_money_balance_reply( LLMessageSystem* msg, void** ) // *TODO: Translate LLSD args; args["MESSAGE"] = desc; - LLNotificationsUtil::add("SystemMessage", args); + + // this is a marker to retrieve avatar name from server message: + // "<avatar name> paid you L$" + const std::string marker = "paid you L$"; + + // extract avatar name from system message + std::string name = desc.substr(0, desc.find(marker, 0)); + LLStringUtil::trim(name); + + // if name extracted and name cache contains avatar id send loggable notification + LLUUID from_id; + if(name.size() > 0 && gCacheName->getUUID(name, from_id)) + { + args["NAME"] = name; + LLSD payload; + payload["from_id"] = from_id; + LLNotificationsUtil::add("PaymentRecived", args, payload); + } + else + { + LLNotificationsUtil::add("SystemMessage", args); + } // Once the 'recent' container gets large enough, chop some // off the beginning. diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index e491e11960..3c79045cc5 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -2767,22 +2767,23 @@ void LLViewerObject::setPixelAreaAndAngle(LLAgent &agent) // I don't think there's a better way to do this without calculating distance per-poly F32 range = sqrt(dx*dx + dy*dy + dz*dz) - min_scale/2; + LLViewerCamera* camera = LLViewerCamera::getInstance(); if (range < 0.001f || isHUDAttachment()) // range == zero { mAppAngle = 180.f; - mPixelArea = (F32)LLViewerCamera::getInstance()->getScreenPixelArea(); + mPixelArea = (F32)camera->getScreenPixelArea(); } else { mAppAngle = (F32) atan2( max_scale, range) * RAD_TO_DEG; - F32 pixels_per_meter = LLViewerCamera::getInstance()->getPixelMeterRatio() / range; + F32 pixels_per_meter = camera->getPixelMeterRatio() / range; mPixelArea = (pixels_per_meter * max_scale) * (pixels_per_meter * mid_scale); - if (mPixelArea > LLViewerCamera::getInstance()->getScreenPixelArea()) + if (mPixelArea > camera->getScreenPixelArea()) { mAppAngle = 180.f; - mPixelArea = (F32)LLViewerCamera::getInstance()->getScreenPixelArea(); + mPixelArea = (F32)camera->getScreenPixelArea(); } } } diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 01b213a87d..266c40d493 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -457,6 +457,7 @@ public: inline BOOL flagAnimSource() const { return ((mFlags & FLAGS_ANIM_SOURCE) != 0); } inline BOOL flagCameraSource() const { return ((mFlags & FLAGS_CAMERA_SOURCE) != 0); } inline BOOL flagCameraDecoupled() const { return ((mFlags & FLAGS_CAMERA_DECOUPLED) != 0); } + inline BOOL flagObjectMove() const { return ((mFlags & FLAGS_OBJECT_MOVE) != 0); } bool getIncludeInSearch() const; void setIncludeInSearch(bool include_in_search); diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp index 9896adad97..9de1ef7190 100644 --- a/indra/newview/llviewerparceloverlay.cpp +++ b/indra/newview/llviewerparceloverlay.cpp @@ -808,6 +808,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines () S32 drawn = 0; F32* vertexp; U8* colorp; + bool render_hidden = LLSelectMgr::sRenderHiddenSelections && LLFloaterReg::instanceVisible("build"); const F32 PROPERTY_LINE_CLIP_DIST = 256.f; @@ -849,7 +850,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines () gGL.end(); - if (LLSelectMgr::sRenderHiddenSelections && LLFloaterReg::instanceVisible("build")) + if (render_hidden) { LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_GREATER); diff --git a/indra/newview/llviewerpartsim.cpp b/indra/newview/llviewerpartsim.cpp index cfb8340462..841a7ccc5e 100644 --- a/indra/newview/llviewerpartsim.cpp +++ b/indra/newview/llviewerpartsim.cpp @@ -71,9 +71,9 @@ const F32 LLViewerPartSim::PART_ADAPT_RATE_MULT_RECIP = 1.0f/PART_ADAPT_RATE_MUL U32 LLViewerPart::sNextPartID = 1; -F32 calc_desired_size(LLVector3 pos, LLVector2 scale) +F32 calc_desired_size(LLViewerCamera* camera, LLVector3 pos, LLVector2 scale) { - F32 desired_size = (pos-LLViewerCamera::getInstance()->getOrigin()).magVec(); + F32 desired_size = (pos - camera->getOrigin()).magVec(); desired_size /= 4; return llclamp(desired_size, scale.magVec()*0.5f, PART_SIM_BOX_SIDE*2); } @@ -273,6 +273,7 @@ void LLViewerPartGroup::updateParticles(const F32 lastdt) LLViewerPartSim::checkParticleCount(mParticles.size()); + LLViewerCamera* camera = LLViewerCamera::getInstance(); LLViewerRegion *regionp = getRegion(); S32 end = (S32) mParticles.size(); for (S32 i = 0 ; i < (S32)mParticles.size();) @@ -394,7 +395,7 @@ void LLViewerPartGroup::updateParticles(const F32 lastdt) } else { - F32 desired_size = calc_desired_size(part->mPosAgent, part->mScale); + F32 desired_size = calc_desired_size(camera, part->mPosAgent, part->mScale); if (!posInGroup(part->mPosAgent, desired_size)) { // Transfer particles between groups @@ -557,7 +558,8 @@ LLViewerPartGroup *LLViewerPartSim::put(LLViewerPart* part) } else { - F32 desired_size = calc_desired_size(part->mPosAgent, part->mScale); + LLViewerCamera* camera = LLViewerCamera::getInstance(); + F32 desired_size = calc_desired_size(camera, part->mPosAgent, part->mScale); S32 count = (S32) mViewerPartGroups.size(); for (S32 i = 0; i < count; i++) diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index f12937194d..9ba056a17c 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1417,10 +1417,12 @@ void LLViewerWindow::initBase() // placeholder widget that controls where "world" is rendered mWorldViewPlaceholder = main_view->getChildView("world_view_rect")->getHandle(); + mNonSideTrayView = main_view->getChildView("non_side_tray_view")->getHandle(); + mFloaterViewHolder = main_view->getChildView("floater_view_holder")->getHandle(); // Constrain floaters to inside the menu and status bar regions. - gFloaterView = getRootView()->getChild<LLFloaterView>("Floater View"); - gSnapshotFloaterView = getRootView()->getChild<LLSnapshotFloaterView>("Snapshot Floater View"); + gFloaterView = main_view->getChild<LLFloaterView>("Floater View"); + gSnapshotFloaterView = main_view->getChild<LLSnapshotFloaterView>("Snapshot Floater View"); // Console llassert( !gConsole ); diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index 747fd3b253..1d564a1338 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -298,7 +298,8 @@ public: void updateKeyboardFocus(); void updateWorldViewRect(bool use_full_window=false); - + LLView* getNonSideTrayView() { return mNonSideTrayView.get(); } + LLView* getFloaterViewHolder() { return mFloaterViewHolder.get(); } BOOL handleKey(KEY key, MASK mask); void handleScrollWheel (S32 clicks); @@ -459,6 +460,8 @@ protected: std::string mInitAlert; // Window / GL initialization requires an alert LLHandle<LLView> mWorldViewPlaceholder; // widget that spans the portion of screen dedicated to rendering the 3d world + LLHandle<LLView> mNonSideTrayView; // parent of world view + bottom bar, etc...everything but the side tray + LLHandle<LLView> mFloaterViewHolder; // container for floater_view class LLDebugText* mDebugText; // Internal class for debug text diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 9882dcd6af..a9194c0c3b 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -3621,6 +3621,16 @@ void LLVOAvatar::updateVisibility() mVisible = visible; } +// private +bool LLVOAvatar::shouldAlphaMask() +{ + const bool should_alpha_mask = mSupportsAlphaLayers && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked + && !LLDrawPoolAvatar::sSkipTransparent; + + return should_alpha_mask; + +} + //----------------------------------------------------------------------------- // renderSkinned() //----------------------------------------------------------------------------- @@ -3754,9 +3764,8 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass) if (pass == AVATAR_RENDER_PASS_SINGLE) { - const bool should_alpha_mask = mSupportsAlphaLayers && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked - && !LLDrawPoolAvatar::sSkipTransparent; + bool should_alpha_mask = shouldAlphaMask(); LLGLState test(GL_ALPHA_TEST, should_alpha_mask); if (should_alpha_mask) @@ -3825,6 +3834,15 @@ U32 LLVOAvatar::renderTransparent(BOOL first_pass) gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f); } + bool should_alpha_mask = shouldAlphaMask(); + + LLGLState test(GL_ALPHA_TEST, should_alpha_mask); + + if (should_alpha_mask) + { + gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f); + } + if (isTextureVisible(TEX_HEAD_BAKED)) { num_indices += mMeshLOD[MESH_ID_EYELASH]->render(mAdjustedPixelArea, first_pass, mIsDummy); @@ -3868,11 +3886,21 @@ U32 LLVOAvatar::renderRigid() return 0; } + bool should_alpha_mask = shouldAlphaMask(); + LLGLState test(GL_ALPHA_TEST, should_alpha_mask); + + if (should_alpha_mask) + { + gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f); + } + if (isTextureVisible(TEX_EYES_BAKED) || mIsDummy) { num_indices += mMeshLOD[MESH_ID_EYEBALL_LEFT]->render(mAdjustedPixelArea, TRUE, mIsDummy); num_indices += mMeshLOD[MESH_ID_EYEBALL_RIGHT]->render(mAdjustedPixelArea, TRUE, mIsDummy); } + + gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); return num_indices; } @@ -5943,6 +5971,9 @@ void LLVOAvatar::updateMeshTextures() } + // Turn on alpha masking correctly for yourself and other avatars on 1.23+ + mSupportsAlphaLayers = isSelf() || is_layer_baked[BAKED_HAIR]; + // Baked textures should be requested from the sim this avatar is on. JC const LLHost target_host = getObjectHost(); if (!target_host.isOk()) @@ -5981,7 +6012,7 @@ void LLVOAvatar::updateMeshTextures() } else if (mBakedTextureDatas[i].mTexLayerSet && !other_culled - && (i != BAKED_HAIR || is_layer_baked[i] || isSelf())) // ! BACKWARDS COMPATIBILITY ! workaround for old viewers. + && (i != BAKED_HAIR || mSupportsAlphaLayers)) // ! BACKWARDS COMPATIBILITY ! workaround for old viewers. { mBakedTextureDatas[i].mTexLayerSet->createComposite(); mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled( TRUE ); @@ -5992,10 +6023,10 @@ void LLVOAvatar::updateMeshTextures() } } } - + // ! BACKWARDS COMPATIBILITY ! // Workaround for viewing avatars from old viewers that haven't baked hair textures. - if (!is_layer_baked[BAKED_HAIR] || self_customizing) + if (!mSupportsAlphaLayers) { const LLColor4 color = mTexHairColor ? mTexHairColor->getColor() : LLColor4(1,1,1,1); LLViewerTexture* hair_img = getImage( TEX_HAIR, 0 ); @@ -6006,8 +6037,6 @@ void LLVOAvatar::updateMeshTextures() } } - // Turn on alpha masking correctly for yourself and other avatars on 1.23+ - mSupportsAlphaLayers = isSelf() || is_layer_baked[BAKED_HAIR]; for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin(); baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end(); @@ -6510,7 +6539,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) } - if( !mFirstTEMessageReceived ) + if( !is_first_appearance_message ) { onFirstTEMessageReceived(); } diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 4b3e850e7a..a5815df20a 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -347,6 +347,8 @@ public: BOOL mIsDummy; // for special views S32 mSpecialRenderMode; // special lighting private: + bool shouldAlphaMask(); + BOOL mNeedsSkin; // avatar has been animated and verts have not been updated S32 mUpdatePeriod; S32 mNumInitFaces; //number of faces generated when creating the avatar drawable, does not inculde splitted faces due to long vertex buffer. diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index f3e787ae7e..7d6401acde 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -918,9 +918,9 @@ void LLVOAvatarSelf::updateAttachmentVisibility(U32 camera_mode) //----------------------------------------------------------------------------- // updatedWearable( EWearableType type ) // forces an update to any baked textures relevant to type. -// Should be called only on saving the wearable +// will force an upload of the resulting bake if the second parameter is TRUE //----------------------------------------------------------------------------- -void LLVOAvatarSelf::wearableUpdated( EWearableType type ) +void LLVOAvatarSelf::wearableUpdated( EWearableType type, BOOL upload_result ) { for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin(); baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end(); @@ -939,7 +939,7 @@ void LLVOAvatarSelf::wearableUpdated( EWearableType type ) { if (mBakedTextureDatas[index].mTexLayerSet) { - invalidateComposite(mBakedTextureDatas[index].mTexLayerSet, TRUE); + invalidateComposite(mBakedTextureDatas[index].mTexLayerSet, upload_result); } break; } diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index e376e5e9ef..6bf4ef5496 100644 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -270,7 +270,7 @@ protected: public: /*virtual*/ BOOL isWearingWearableType(EWearableType type) const; - void wearableUpdated(EWearableType type); + void wearableUpdated(EWearableType type, BOOL upload_result); protected: U32 getNumWearables(LLVOAvatarDefines::ETextureIndex i) const; diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index 3554528d19..a0396bc790 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -750,6 +750,8 @@ LLVoiceChannelP2P::LLVoiceChannelP2P(const LLUUID& session_id, const std::string mReceivedCall(FALSE) { // make sure URI reflects encoded version of other user's agent id + // *NOTE: in case of Avaline call generated SIP URL will be incorrect. + // But it will be overridden in LLVoiceChannelP2P::setSessionHandle() called when agent accepts call setURI(LLVoiceClient::getInstance()->sipURIFromID(other_user_id)); } @@ -867,6 +869,10 @@ void LLVoiceChannelP2P::setSessionHandle(const std::string& handle, const std::s } else { + LL_WARNS("Voice") << "incoming SIP URL is not provided. Channel may not work properly." << LL_ENDL; + // In case of incoming AvaLine call generated URI will be differ from original one. + // This is because Avatar-2-Avatar URI is based on avatar UUID but Avaline is not. + // See LLVoiceClient::sessionAddedEvent() -> setUUIDFromStringHash() setURI(LLVoiceClient::getInstance()->sipURIFromID(mOtherUserID)); } diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index d677634be6..7e1e7c940f 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -63,6 +63,7 @@ #include "llparcel.h" #include "llviewerparcelmgr.h" #include "llfirstuse.h" +#include "lltrans.h" #include "llviewerwindow.h" #include "llviewercamera.h" #include "llvoavatarself.h" @@ -1161,11 +1162,12 @@ LLVoiceClient::LLVoiceClient() : mVoiceEnabled(false), mWriteInProgress(false), - mLipSyncEnabled(false), - mAPIVersion("Unknown") + mLipSyncEnabled(false) { gVoiceClient = this; + mAPIVersion = LLTrans::getString("NotConnected"); + #if LL_DARWIN || LL_LINUX || LL_SOLARIS // HACK: THIS DOES NOT BELONG HERE // When the vivox daemon dies, the next write attempt on our socket generates a SIGPIPE, which kills us. diff --git a/indra/newview/llvoicevisualizer.cpp b/indra/newview/llvoicevisualizer.cpp index e777d7362f..4794cab32e 100644 --- a/indra/newview/llvoicevisualizer.cpp +++ b/indra/newview/llvoicevisualizer.cpp @@ -369,8 +369,9 @@ void LLVoiceVisualizer::render() //------------------------------------------------------------- // create coordinates of the geometry for the dot //------------------------------------------------------------- - LLVector3 l = LLViewerCamera::getInstance()->getLeftAxis() * DOT_SIZE; - LLVector3 u = LLViewerCamera::getInstance()->getUpAxis() * DOT_SIZE; + LLViewerCamera* camera = LLViewerCamera::getInstance(); + LLVector3 l = camera->getLeftAxis() * DOT_SIZE; + LLVector3 u = camera->getUpAxis() * DOT_SIZE; LLVector3 bottomLeft = mSoundSymbol.mPosition + l - u; LLVector3 bottomRight = mSoundSymbol.mPosition - l - u; @@ -496,8 +497,8 @@ void LLVoiceVisualizer::render() F32 width = i * WAVE_WIDTH_SCALE * mSoundSymbol.mWaveExpansion[i]; F32 height = i * WAVE_HEIGHT_SCALE * mSoundSymbol.mWaveExpansion[i]; - LLVector3 l = LLViewerCamera::getInstance()->getLeftAxis() * width; - LLVector3 u = LLViewerCamera::getInstance()->getUpAxis() * height; + LLVector3 l = camera->getLeftAxis() * width; + LLVector3 u = camera->getUpAxis() * height; LLVector3 bottomLeft = mSoundSymbol.mPosition + l - u; LLVector3 bottomRight = mSoundSymbol.mPosition - l - u; diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp index 9dd0b598dc..139d2fbd88 100644 --- a/indra/newview/llvopartgroup.cpp +++ b/indra/newview/llvopartgroup.cpp @@ -386,6 +386,7 @@ void LLParticlePartition::addGeometryCount(LLSpatialGroup* group, U32& vertex_co mFaceList.clear(); + LLViewerCamera* camera = LLViewerCamera::getInstance(); for (LLSpatialGroup::element_iter i = group->getData().begin(); i != group->getData().end(); ++i) { LLDrawable* drawablep = *i; @@ -415,7 +416,7 @@ void LLParticlePartition::addGeometryCount(LLSpatialGroup* group, U32& vertex_co } count++; - facep->mDistance = (facep->mCenterLocal - LLViewerCamera::getInstance()->getOrigin()) * LLViewerCamera::getInstance()->getAtAxis(); + facep->mDistance = (facep->mCenterLocal - camera->getOrigin()) * camera->getAtAxis(); obj->mDepth += facep->mDistance; mFaceList.push_back(facep); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 48bd387022..cf61994fea 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -622,6 +622,7 @@ void LLVOVolume::updateTextureVirtualSize() const S32 num_faces = mDrawable->getNumFaces(); F32 min_vsize=999999999.f, max_vsize=0.f; + LLViewerCamera* camera = LLViewerCamera::getInstance(); for (S32 i = 0; i < num_faces; i++) { LLFace* face = mDrawable->getFace(i); @@ -638,7 +639,7 @@ void LLVOVolume::updateTextureVirtualSize() if (isHUDAttachment()) { - F32 area = (F32) LLViewerCamera::getInstance()->getScreenPixelArea(); + F32 area = (F32) camera->getScreenPixelArea(); vsize = area; imagep->setBoostLevel(LLViewerTexture::BOOST_HUD); face->setPixelArea(area); // treat as full screen @@ -704,9 +705,9 @@ void LLVOVolume::updateTextureVirtualSize() //if the sculpty very close to the view point, load first { - LLVector3 lookAt = getPositionAgent() - LLViewerCamera::getInstance()->getOrigin(); + LLVector3 lookAt = getPositionAgent() - camera->getOrigin(); F32 dist = lookAt.normVec() ; - F32 cos_angle_to_view_dir = lookAt * LLViewerCamera::getInstance()->getXAxis() ; + F32 cos_angle_to_view_dir = lookAt * camera->getXAxis() ; mSculptTexture->setAdditionalDecodePriority(0.8f * LLFace::calcImportanceToCamera(cos_angle_to_view_dir, dist)) ; } } @@ -741,7 +742,7 @@ void LLVOVolume::updateTextureVirtualSize() F32 rad = getLightRadius(); mLightTexture->addTextureStats(gPipeline.calcPixelArea(getPositionAgent(), LLVector3(rad,rad,rad), - *LLViewerCamera::getInstance())); + *camera)); } } @@ -1133,6 +1134,20 @@ void LLVOVolume::regenFaces() facep->setTEOffset(i); facep->setTexture(getTEImage(i)); facep->setViewerObject(this); + + // If the face had media on it, this will have broken the link between the LLViewerMediaTexture and the face. + // Re-establish the link. + if((int)mMediaImplList.size() > i) + { + if(mMediaImplList[i]) + { + LLViewerMediaTexture* media_tex = LLViewerTextureManager::findMediaTexture(mMediaImplList[i]->getMediaTextureID()) ; + if(media_tex) + { + media_tex->addMediaToFace(facep) ; + } + } + } } if (!count_changed) diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp index 807434c397..3cb0ec4bad 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -704,7 +704,7 @@ void LLWearable::removeFromAvatar( EWearableType type, BOOL upload_bake ) } avatar->updateVisualParams(); - avatar->wearableUpdated(type); + avatar->wearableUpdated(type, TRUE); // if( upload_bake ) // { diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 60b1e59645..e6857ea780 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -1728,20 +1728,20 @@ BOOL LLWorldMapView::handleDoubleClick( S32 x, S32 y, MASK mask ) id.toString(uuid_str); uuid_str = uuid_str.substr(28); sscanf(uuid_str.c_str(), "%X", &event_id); - LLFloaterReg::showInstance("search", LLSD().insert("category", "events").insert("id", event_id)); + LLFloaterReg::showInstance("search", LLSD().with("category", "events").with("id", event_id)); break; } case MAP_ITEM_LAND_FOR_SALE: case MAP_ITEM_LAND_FOR_SALE_ADULT: { LLFloaterReg::hideInstance("world_map"); - LLFloaterReg::showInstance("search", LLSD().insert("category", "destinations").insert("id", id)); + LLFloaterReg::showInstance("search", LLSD().with("category", "destinations").with("id", id)); break; } case MAP_ITEM_CLASSIFIED: { LLFloaterReg::hideInstance("world_map"); - LLFloaterReg::showInstance("search", LLSD().insert("category", "classifieds").insert("id", id)); + LLFloaterReg::showInstance("search", LLSD().with("category", "classifieds").with("id", id)); break; } default: diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index f908a015df..282eddf380 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -3768,9 +3768,10 @@ void LLPipeline::renderForSelect(std::set<LLViewerObject*>& objects, BOOL render gGL.setColorMask(true, false); gPipeline.resetDrawOrders(); + LLViewerCamera* camera = LLViewerCamera::getInstance(); for (std::set<LLViewerObject*>::iterator iter = objects.begin(); iter != objects.end(); ++iter) { - stateSort((*iter)->mDrawable, *LLViewerCamera::getInstance()); + stateSort((*iter)->mDrawable, *camera); } LLMemType mt(LLMemType::MTYPE_PIPELINE_RENDER_SELECT); @@ -6248,6 +6249,7 @@ void LLPipeline::renderDeferredLighting() { LLFastTimer ftm(FTM_RENDER_DEFERRED); + LLViewerCamera* camera = LLViewerCamera::getInstance(); { LLGLDepthTest depth(GL_TRUE); mDeferredDepth.copyContents(mDeferredScreen, 0, 0, mDeferredScreen.getWidth(), mDeferredScreen.getHeight(), @@ -6641,7 +6643,7 @@ void LLPipeline::renderDeferredLighting() continue; } - if (LLViewerCamera::getInstance()->AABBInFrustumNoFarClip(center, LLVector3(s,s,s)) == 0) + if (camera->AABBInFrustumNoFarClip(center, LLVector3(s,s,s)) == 0) { continue; } @@ -6665,12 +6667,12 @@ void LLPipeline::renderDeferredLighting() v[18] = c[0]+s; v[19] = c[1]+s; v[20] = c[2]-s; // 6 - 0110 v[21] = c[0]+s; v[22] = c[1]+s; v[23] = c[2]+s; // 7 - 0111 - if (LLViewerCamera::getInstance()->getOrigin().mV[0] > c[0] + s + 0.2f || - LLViewerCamera::getInstance()->getOrigin().mV[0] < c[0] - s - 0.2f || - LLViewerCamera::getInstance()->getOrigin().mV[1] > c[1] + s + 0.2f || - LLViewerCamera::getInstance()->getOrigin().mV[1] < c[1] - s - 0.2f || - LLViewerCamera::getInstance()->getOrigin().mV[2] > c[2] + s + 0.2f || - LLViewerCamera::getInstance()->getOrigin().mV[2] < c[2] - s - 0.2f) + if (camera->getOrigin().mV[0] > c[0] + s + 0.2f || + camera->getOrigin().mV[0] < c[0] - s - 0.2f || + camera->getOrigin().mV[1] > c[1] + s + 0.2f || + camera->getOrigin().mV[1] < c[1] - s - 0.2f || + camera->getOrigin().mV[2] > c[2] + s + 0.2f || + camera->getOrigin().mV[2] < c[2] - s - 0.2f) { //draw box if camera is outside box if (render_local) { @@ -6685,7 +6687,7 @@ void LLPipeline::renderDeferredLighting() glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], s*s); glColor4f(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f); glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8, - GL_UNSIGNED_BYTE, get_box_fan_indices(LLViewerCamera::getInstance(), center)); + GL_UNSIGNED_BYTE, get_box_fan_indices(camera, center)); stop_glerror(); } } @@ -6750,7 +6752,7 @@ void LLPipeline::renderDeferredLighting() glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], s*s); glColor4f(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f); glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8, - GL_UNSIGNED_BYTE, get_box_fan_indices(LLViewerCamera::getInstance(), center)); + GL_UNSIGNED_BYTE, get_box_fan_indices(camera, center)); } gDeferredSpotLightProgram.disableTexture(LLViewerShaderMgr::DEFERRED_PROJECTION); unbindDeferredShader(gDeferredSpotLightProgram); @@ -7187,6 +7189,10 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in) gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); glClearColor(0,0,0,0); mWaterRef.bindTarget(); + gGL.setColorMask(true, true); + mWaterRef.clear(); + gGL.setColorMask(true, false); + mWaterRef.getViewport(gGLViewport); stop_glerror(); @@ -7219,6 +7225,21 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in) U32 ref_mask = 0; if (LLDrawPoolWater::sNeedsDistortionUpdate) { + //initial sky pass (no user clip plane) + { //mask out everything but the sky + U32 tmp = mRenderTypeMask; + mRenderTypeMask = tmp & ((1 << LLPipeline::RENDER_TYPE_SKY) | + (1 << LLPipeline::RENDER_TYPE_WL_SKY)); + static LLCullResult result; + updateCull(camera, result); + stateSort(camera, result); + mRenderTypeMask = tmp & ((1 << LLPipeline::RENDER_TYPE_SKY) | + (1 << LLPipeline::RENDER_TYPE_CLOUDS) | + (1 << LLPipeline::RENDER_TYPE_WL_SKY)); + renderGeom(camera, TRUE); + mRenderTypeMask = tmp; + } + U32 mask = mRenderTypeMask; mRenderTypeMask &= ~((1<<LLPipeline::RENDER_TYPE_WATER) | (1<<LLPipeline::RENDER_TYPE_GROUND) | @@ -7246,10 +7267,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in) LLGLDisable cull(GL_CULL_FACE); updateCull(camera, ref_result, 1); stateSort(camera, ref_result); - gGL.setColorMask(true, true); - mWaterRef.clear(); - gGL.setColorMask(true, false); - } else { @@ -7262,22 +7279,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in) mRenderTypeMask = mask; } - //initial sky pass (no user clip plane) - { //mask out everything but the sky - U32 tmp = mRenderTypeMask; - mRenderTypeMask = tmp & ((1 << LLPipeline::RENDER_TYPE_SKY) | - (1 << LLPipeline::RENDER_TYPE_WL_SKY)); - static LLCullResult result; - updateCull(camera, result); - stateSort(camera, result); - mRenderTypeMask = tmp & ((1 << LLPipeline::RENDER_TYPE_SKY) | - (1 << LLPipeline::RENDER_TYPE_CLOUDS) | - (1 << LLPipeline::RENDER_TYPE_WL_SKY)); - renderGeom(camera, TRUE); - mRenderTypeMask = tmp; - } - - if (LLDrawPoolWater::sNeedsDistortionUpdate) { mRenderTypeMask = ref_mask; @@ -8684,7 +8685,8 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar) sShadowRender = TRUE; sImpostorRender = TRUE; - markVisible(avatar->mDrawable, *LLViewerCamera::getInstance()); + LLViewerCamera* viewer_camera = LLViewerCamera::getInstance(); + markVisible(avatar->mDrawable, *viewer_camera); LLVOAvatar::sUseImpostors = FALSE; LLVOAvatar::attachment_map_t::iterator iter; @@ -8699,7 +8701,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar) { if (LLViewerObject* attached_object = (*attachment_iter)) { - markVisible(attached_object->mDrawable->getSpatialBridge(), *LLViewerCamera::getInstance()); + markVisible(attached_object->mDrawable->getSpatialBridge(), *viewer_camera); } } } @@ -8709,9 +8711,9 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar) const LLVector3* ext = avatar->mDrawable->getSpatialExtents(); LLVector3 pos(avatar->getRenderPosition()+avatar->getImpostorOffset()); - LLCamera camera = *LLViewerCamera::getInstance(); + LLCamera camera = *viewer_camera; - camera.lookAt(LLViewerCamera::getInstance()->getOrigin(), pos, LLViewerCamera::getInstance()->getUpAxis()); + camera.lookAt(viewer_camera->getOrigin(), pos, viewer_camera->getUpAxis()); LLVector2 tdim; @@ -8754,7 +8756,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar) glClearStencil(0); // get the number of pixels per angle - F32 pa = gViewerWindow->getWindowHeightRaw() / (RAD_TO_DEG * LLViewerCamera::getInstance()->getView()); + F32 pa = gViewerWindow->getWindowHeightRaw() / (RAD_TO_DEG * viewer_camera->getView()); //get resolution based on angle width and height of impostor (double desired resolution to prevent aliasing) U32 resY = llmin(nhpo2((U32) (fov*pa)), (U32) 512); diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index 295f4259fd..85cb145dbc 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -270,10 +270,10 @@ reference="White" /> <color name="FilterBackgroundColor" - reference="DkGray" /> + reference="MouseGray" /> <color name="FilterTextColor" - value="1 0.78 0.27 1" /> + value="0.38 0.69 0.57 1" /> <color name="FloaterButtonImageColor" reference="LtGray" /> @@ -459,7 +459,7 @@ value="0 0.5 0 1" /> <color name="MenuPopupBgColor" - reference="DkGray_66" /> + reference="DkGray2" /> <color name="MultiSliderDisabledThumbColor" reference="Unused?" /> diff --git a/indra/newview/skins/default/textures/icon_event_adult.tga b/indra/newview/skins/default/textures/icon_event_adult.tga Binary files differindex c344fb1e78..f548126e5a 100644 --- a/indra/newview/skins/default/textures/icon_event_adult.tga +++ b/indra/newview/skins/default/textures/icon_event_adult.tga diff --git a/indra/newview/skins/default/textures/icon_top_pick.tga b/indra/newview/skins/default/textures/icon_top_pick.tga Binary files differindex 7fe119a818..0b34882d2f 100644 --- a/indra/newview/skins/default/textures/icon_top_pick.tga +++ b/indra/newview/skins/default/textures/icon_top_pick.tga diff --git a/indra/newview/skins/default/textures/map_avatar_16.tga b/indra/newview/skins/default/textures/map_avatar_16.tga Binary files differindex ce129e3590..f59e9e9193 100644 --- a/indra/newview/skins/default/textures/map_avatar_16.tga +++ b/indra/newview/skins/default/textures/map_avatar_16.tga diff --git a/indra/newview/skins/default/textures/map_avatar_8.tga b/indra/newview/skins/default/textures/map_avatar_8.tga Binary files differindex 28552f2237..8500eadeba 100644 --- a/indra/newview/skins/default/textures/map_avatar_8.tga +++ b/indra/newview/skins/default/textures/map_avatar_8.tga diff --git a/indra/newview/skins/default/textures/map_event.tga b/indra/newview/skins/default/textures/map_event.tga Binary files differindex c229b379a2..2c06d08fd2 100644 --- a/indra/newview/skins/default/textures/map_event.tga +++ b/indra/newview/skins/default/textures/map_event.tga diff --git a/indra/newview/skins/default/textures/map_event_adult.tga b/indra/newview/skins/default/textures/map_event_adult.tga Binary files differindex c344fb1e78..f548126e5a 100644 --- a/indra/newview/skins/default/textures/map_event_adult.tga +++ b/indra/newview/skins/default/textures/map_event_adult.tga diff --git a/indra/newview/skins/default/textures/map_event_mature.tga b/indra/newview/skins/default/textures/map_event_mature.tga Binary files differindex 61c879bc92..71067c0dfd 100644 --- a/indra/newview/skins/default/textures/map_event_mature.tga +++ b/indra/newview/skins/default/textures/map_event_mature.tga diff --git a/indra/newview/skins/default/textures/map_home.tga b/indra/newview/skins/default/textures/map_home.tga Binary files differindex 7478de371a..acaaa3db44 100644 --- a/indra/newview/skins/default/textures/map_home.tga +++ b/indra/newview/skins/default/textures/map_home.tga diff --git a/indra/newview/skins/default/textures/map_infohub.tga b/indra/newview/skins/default/textures/map_infohub.tga Binary files differindex d0134fa5fe..545b8e532c 100644 --- a/indra/newview/skins/default/textures/map_infohub.tga +++ b/indra/newview/skins/default/textures/map_infohub.tga diff --git a/indra/newview/skins/default/textures/map_telehub.tga b/indra/newview/skins/default/textures/map_telehub.tga Binary files differindex ef63a3eb72..545b8e532c 100644 --- a/indra/newview/skins/default/textures/map_telehub.tga +++ b/indra/newview/skins/default/textures/map_telehub.tga diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 3576b6ed77..607b33fbb1 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -1,19 +1,19 @@ <!-- This file contains metadata about how to load, display, and scale textures for rendering in the UI. -Images do *NOT* have to appear in this file in order to use them as textures in the UI...simply refer +Images do *NOT* have to appear in this file in order to use them as textures in the UI...simply refer to them by filename (relative to textures directory). -NOTE: if you want to reuse an image file with different metadata, simply create a new texture entry +NOTE: if you want to reuse an image file with different metadata, simply create a new texture entry with the same filename but different name <texture name="MyTexture" (mandatory) - this is the name you reference the texture by in XUI. For example, <button image_unselected="MyTexture"/> file_name="images/my_texture.png" (optional) - - this is the path to the actual file asset, relative to the current skins "textures" directory. - If not supplied, the filename will be taken from the texture name itself, "MyTexture" in this case. + - this is the path to the actual file asset, relative to the current skins "textures" directory. + If not supplied, the filename will be taken from the texture name itself, "MyTexture" in this case. NOTE: you need to provide an extension on the filename (".png", ".tga", ".jpg") for us to decode the image properly preload="true" (optional, false by default) - - If true, we will attempt to load the image before displaying any UI. + - If true, we will attempt to load the image before displaying any UI. If false, we will load in the background after initializing the UI. use_mips="true" (currently unused) scale.left="1" @@ -23,8 +23,8 @@ with the same filename but different name - Specifies the segmentation for 9-slice image scaling. Specifically, the pixel offsets from the LOWER LEFT corner that define the region of the image that is stretched to make the whole image fit in the required space. In this example, if the source image is 32x16 pixels, we have defined a center region that starts one pixel up - and to the right from the bottom left corner and extends to 31 pixels right and 15 pixels up from the bottom left - corner. The end result is that the image will keep a 1 pixel border all around while stretching to fit the required + and to the right from the bottom left corner and extends to 31 pixels right and 15 pixels up from the bottom left + corner. The end result is that the image will keep a 1 pixel border all around while stretching to fit the required region. --> @@ -400,9 +400,12 @@ with the same filename but different name <texture name="ProgressBar" file_name="widgets/ProgressBar.png" preload="true" scale.left="4" scale.top="10" scale.right="48" scale.bottom="2" /> <texture name="ProgressTrack" file_name="widgets/ProgressTrack.png" preload="true" scale.left="4" scale.top="13" scale.right="148" scale.bottom="2" /> + <texture name="PushButton_Disabled" file_name="widgets/PushButton_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> <texture name="PushButton_Off" file_name="widgets/PushButton_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> + <texture name="PushButton_On" file_name="widgets/PushButton_On.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> + <texture name="PushButton_On_Selected" file_name="widgets/PushButton_On_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> + <texture name="PushButton_On_Disabled" file_name="widgets/PushButton_On_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> <texture name="PushButton_Press" file_name="widgets/PushButton_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> - <texture name="PushButton_Disabled" file_name="widgets/PushButton_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> <texture name="PushButton_Selected" file_name="widgets/PushButton_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> <texture name="PushButton_Selected_Press" file_name="widgets/PushButton_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> <texture name="PushButton_Selected_Disabled" file_name="widgets/PushButton_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> diff --git a/indra/newview/skins/default/xui/da/floater_about.xml b/indra/newview/skins/default/xui/da/floater_about.xml index f0c9c45d04..cdf1915d5e 100644 --- a/indra/newview/skins/default/xui/da/floater_about.xml +++ b/indra/newview/skins/default/xui/da/floater_about.xml @@ -1,44 +1,81 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_about" title="OM [APP_NAME]"> -<tab_container name="about_tab"> - <panel 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 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> - <string name="you_are_at"> - Du er ved [POSITION] - </string> -</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>
diff --git a/indra/newview/skins/default/xui/da/floater_mute_object.xml b/indra/newview/skins/default/xui/da/floater_mute_object.xml index 4145918b49..edda8b44e9 100644 --- a/indra/newview/skins/default/xui/da/floater_mute_object.xml +++ b/indra/newview/skins/default/xui/da/floater_mute_object.xml @@ -1,12 +1,14 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="mute by name" title="BLOKER OBJEKT VIA NAVN"> - <text name="message"> - Blokering via navn har ikke betydning for lyde. -Du skal skrive det præcise navn på objektet. - </text> - <line_editor name="object_name"> - Objekt navn - </line_editor> - <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>
diff --git a/indra/newview/skins/default/xui/da/floater_report_abuse.xml b/indra/newview/skins/default/xui/da/floater_report_abuse.xml index 6f1e2884eb..b249fc5654 100644 --- a/indra/newview/skins/default/xui/da/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/da/floater_report_abuse.xml @@ -1,103 +1,103 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_report_abuse" title="RAPPORTÉR MISBRUG"> - <texture_picker label="" name="screenshot"/> - <check_box label="Inkludér billede" name="screen_check"/> - <text name="reporter_title"> - Anmelder: - </text> - <text name="reporter_field"> - Loremipsum Dolorsitamut - </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 name="object_name" left_delta="64" width="140"> - Consetetur Sadipscing - </text> - <text name="owner_name_label"> - Ejer: - </text> - <text name="owner_name" left_delta="64"> - Hendrerit Vulputate - </text> - <combo_box name="category_combo" tool_tip="Kategori -- Vælg en kategori der passer bedst på denne rapport"> - <combo_box.item name="Select_category" label="Vælg kategori"/> - <combo_box.item name="Age__Age_play" label="Alder > Falsk alder"/> - <combo_box.item name="Age__Adult_resident_on_Teen_Second_Life" label="Alder > Voksen beboer på Teen Second Life"/> - <combo_box.item name="Age__Underage_resident_outside_of_Teen_Second_Life" label="Alder > Mindreårig beboer udenfor Teen Second Life"/> - <combo_box.item name="Assault__Combat_sandbox___unsafe_area" label="Overfald > Kamp sandkasse / Usikkert område"/> - <combo_box.item name="Assault__Safe_area" label="Overfald > Sikkert område"/> - <combo_box.item name="Assault__Weapons_testing_sandbox" label="Overfald > Sandkasse til våbentest"/> - <combo_box.item name="Commerce__Failure_to_deliver_product_or_service" label="Handel > Vare eller ydelse ikke leveret"/> - <combo_box.item name="Disclosure__Real_world_information" label="Offentliggørelse > Om oplysninger i den virkelige verden"/> - <combo_box.item name="Disclosure__Remotely_monitoring chat" label="Offentliggørelse > Fjernaflytning af chat"/> - <combo_box.item name="Disclosure__Second_Life_information_chat_IMs" label="Offentliggørelse > Information/chat/IM fra Second Life"/> - <combo_box.item name="Disturbing_the_peace__Unfair_use_of_region_resources" label="Forstyrrelse af fred > Unfair brug af region ressourcer"/> - <combo_box.item name="Disturbing_the_peace__Excessive_scripted_objects" label="Forstyrrelse af fred > Overdreven brug af objekter med script"/> - <combo_box.item name="Disturbing_the_peace__Object_littering" label="Forstyrrelse af fred > Object affald"/> - <combo_box.item name="Disturbing_the_peace__Repetitive_spam" label="Forstyrring af fred > Gentagen spam"/> - <combo_box.item name="Disturbing_the_peace__Unwanted_advert_spam" label="Forstyrrelse af fred > Uønsket reklame spam"/> - <combo_box.item name="Fraud__L$" label="Bedrageri > L$"/> - <combo_box.item name="Fraud__Land" label="Bedrageri > Land"/> - <combo_box.item name="Fraud__Pyramid_scheme_or_chain_letter" label="Bedrageri > Pyramide spil eller kædebreve"/> - <combo_box.item name="Fraud__US$" label="Bedrageri > US$"/> - <combo_box.item name="Harassment__Advert_farms___visual_spam" label="Chikane > reklame farm / billedeligt spam"/> - <combo_box.item name="Harassment__Defaming_individuals_or_groups" label="Chikane > Injurier/bagvask enkeltpersoner eller grupper"/> - <combo_box.item name="Harassment__Impeding_movement" label="Chikane > Hindre bevægelse"/> - <combo_box.item name="Harassment__Sexual_harassment" label="Chikane > Sex chikane"/> - <combo_box.item name="Harassment__Solicting_inciting_others_to_violate_ToS" label="Chikane > Opfordrer/kræver at andre overtræder licensbetingelser"/> - <combo_box.item name="Harassment__Verbal_abuse" label="Chikane > Verbalt chikane"/> - <combo_box.item name="Indecency__Broadly_offensive_content_or_conduct" label="Uanstændighed > Meget stødende indhold eller adfærd"/> - <combo_box.item name="Indecency__Inappropriate_avatar_name" label="Uanstændighed > Upassende avatar navn"/> - <combo_box.item name="Indecency__Mature_content_in_PG_region" label="Usømmelighed > Upassende inhold eller opførsel i en 'PG' region"/> - <combo_box.item name="Indecency__Inappropriate_content_in_Mature_region" label="Usømmelighed > Upassende inhold eller opførsel i en 'Mature' region"/> - <combo_box.item name="Intellectual_property_infringement_Content_Removal" label="Krænkelse af intellektuelle ejendomsrettigheder > Indholds fjernelse"/> - <combo_box.item name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit" label="Krænkelse af intellektuelle ejendomsrettigheder > CopyBot eller omgåelse af rettighedsbeskyttelse"/> - <combo_box.item name="Intolerance" label="Intolerance"/> - <combo_box.item name="Land__Abuse_of_sandbox_resources" label="Land > Misbrug af sandkasse resourcer"/> - <combo_box.item name="Land__Encroachment__Objects_textures" label="Land > Overgreb > Objekter/teksturer"/> - <combo_box.item name="Land__Encroachment__Particles" label="Land > Overgreb > Partikler"/> - <combo_box.item name="Land__Encroachment__Trees_plants" label="Land > Overgreb > Træer/planter"/> - <combo_box.item name="Wagering_gambling" label="Væddemål/gambling"/> - <combo_box.item name="Other" label="Andet"/> - </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"/> - <check_box label="Kender ikke udøvers navn" name="omit_abuser_name" tool_tip="Afkryds her, hvis du ikke kender navn på udøvers"/> - <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 præcis omkring dato, sted, overgrebets -natur, relevant chat/IM og vælg objekt hvis muligt. - </text> - <text name="incomplete_title"> - Note: Ufuldstændige rapporter vil ikke blive undersøgt. - </text> - <button label="Annullér" label_selected="Annullér" name="cancel_btn"/> - <button label="Rapporter misbrug" label_selected="Rapporter misbrug" name="send_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>
diff --git a/indra/newview/skins/default/xui/da/floater_stats.xml b/indra/newview/skins/default/xui/da/floater_stats.xml new file mode 100644 index 0000000000..06b795c3b9 --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_stats.xml @@ -0,0 +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>
diff --git a/indra/newview/skins/default/xui/da/menu_inventory.xml b/indra/newview/skins/default/xui/da/menu_inventory.xml index fd5ebe5c82..b24fd80607 100644 --- a/indra/newview/skins/default/xui/da/menu_inventory.xml +++ b/indra/newview/skins/default/xui/da/menu_inventory.xml @@ -1,66 +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 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> - <menu 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_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="å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="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="Teleport To 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="Tag af dig selv" name="Detach From Yourself" /> - <menu_item_call label="Tilbage til sidste position" name="Restore to Last Position"/> - <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>
diff --git a/indra/newview/skins/default/xui/da/menu_inventory_add.xml b/indra/newview/skins/default/xui/da/menu_inventory_add.xml new file mode 100644 index 0000000000..b2a144c9f0 --- /dev/null +++ b/indra/newview/skins/default/xui/da/menu_inventory_add.xml @@ -0,0 +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>
diff --git a/indra/newview/skins/default/xui/da/menu_picks.xml b/indra/newview/skins/default/xui/da/menu_picks.xml new file mode 100644 index 0000000000..a47ef49ca0 --- /dev/null +++ b/indra/newview/skins/default/xui/da/menu_picks.xml @@ -0,0 +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>
diff --git a/indra/newview/skins/default/xui/da/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/da/menu_places_gear_landmark.xml new file mode 100644 index 0000000000..ed00c91508 --- /dev/null +++ b/indra/newview/skins/default/xui/da/menu_places_gear_landmark.xml @@ -0,0 +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>
diff --git a/indra/newview/skins/default/xui/da/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/da/panel_block_list_sidetray.xml new file mode 100644 index 0000000000..d16f7535fc --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_block_list_sidetray.xml @@ -0,0 +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>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_profile.xml b/indra/newview/skins/default/xui/da/panel_edit_profile.xml index b4d0fa20ef..a8a02a34b7 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_profile.xml @@ -1,7 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel name="edit_profile_panel"> <string name="CaptionTextAcctInfo"> - [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] + [ACCTTYPE] +[PAYMENTINFO] [AGEVERIFICATION] </string> <string name="AcctTypeResident" value="Beboer" /> diff --git a/indra/newview/skins/default/xui/da/panel_group_roles.xml b/indra/newview/skins/default/xui/da/panel_group_roles.xml index 5c2fd356d8..99f5bac89d 100644 --- a/indra/newview/skins/default/xui/da/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/da/panel_group_roles.xml @@ -1,161 +1,121 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel label="Medlemmer & roller" name="roles_tab"> - <string name="default_needs_apply_text"> - Der er ændringer her, der ikke er gemt. - </string> - <string name="want_apply_text"> - Vil du gemme disse ændringer? - </string> - <button label="?" name="help_button" /> - <panel name="members_header"> - <text name="static"> - Medlemmer & roller - </text> - <text name="static2" width="400"> - Gruppemedlemmer får tildelt roller med rettigheder. Disse indstillinger kan -let tilpasses efter ønske, så gruppen kan vokse og blive mere fleksibel. - </text> - </panel> - <panel name="roles_header"> - <text name="static"> - Roller - </text> - <text name="role_properties_modifiable" width="400"> - Vælg en rolle nedenfor. Du kan ændre dens navn, beskrivelse og medlemstitel. - </text> - <text name="role_properties_not_modifiable" width="400"> - Vælg rolle forneden for at se dens egenskaber, medlemmer og rettigheder. - </text> - <text name="role_actions_modifiable"> - Du kan også tildele rettigheder til rollen. - </text> - <text name="role_actions_not_modifiable"> - Du kan se, men ikke ændre, tildelte rettigheder. - </text> - </panel> - <panel name="actions_header"> - <text name="static"> - Rettigheder - </text> - <text name="static2"> - Du kan se en rettigheds beskrivelse og hvilke roller og medlemmer, -der har denne rettighed. - </text> - </panel> - <tab_container name="roles_tab_container"> - <panel label="Medlemmer" name="members_sub_tab" tool_tip="Medlemmer"> - <button label="Søg" name="search_button" /> - <button label="Vis alle" name="show_all_button" /> - <name_list name="member_list"> - <column label="Medlemsnavn" name="name" /> - <column label="Doneret leje" name="donated" /> - <column label="Sidst på den" name="online" /> - </name_list> - <button label="Invitér nyt medlem..." name="member_invite"/> - <button label="Udmeld" name="member_eject" /> - <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. - </string> - </panel> - <panel label="Roller" name="roles_sub_tab"> - <button label="Søg" name="search_button" /> - <button label="Vis alle" name="show_all_button" /> - <scroll_list name="role_list"> - <column label="Rollenavn" name="name" /> - <column label="Titel" name="title" /> - <column label="Medlemmer" name="members" /> - </scroll_list> - <button label="Opret ny rolle..." name="role_create" /> - <button label="Slet rolle" name="role_delete" /> - <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. - </string> - <string name="cant_delete_role"> - 'Alle-' og 'Ejerroller' er specielle og kan ikke slettes. - </string> - </panel> - <panel label="Rettigheder" name="actions_sub_tab"> - <button label="Søg" name="search_button" /> - <button label="Vis alle" name="show_all_button" /> - <scroll_list name="action_list" tool_tip="Vælg en rettighed for at se flere detaljer"> - <column label="" name="icon" /> - <column label="" name="action" /> - </scroll_list> - <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. - </string> - </panel> - </tab_container> - <panel name="members_footer"> - <text name="static"> - Tildelte roller - </text> - <text name="static2"> - Tilladte rettigheder - </text> - <scroll_list name="member_assigned_roles"> - <column label="" name="checkbox" /> - <column label="" name="role" /> - </scroll_list> - <scroll_list name="member_allowed_actions" - tool_tip="For detaljer om hver tilladte rettighed, se rettighedsfanebladet."> - <column label="" name="icon" /> - <column label="" name="action" /> - </scroll_list> - </panel> - <panel name="roles_footer"> - <text name="static"> - Navn - </text> - <text name="static2"> - Beskrivelse - </text> - <line_editor name="role_name"> - Ansatte - </line_editor> - <text name="static3"> - Titel - </text> - <line_editor name="role_title"> - (venter) - </line_editor> - <text_editor name="role_description"> - (venter) - </text_editor> - <text name="static4"> - Tildelte medlemmer - </text> - <text name="static5" - tool_tip="A list of Abilities the currently selected role can perform."> - Tilladte rettigheder - </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." /> - <scroll_list name="role_allowed_actions" - tool_tip="For detaljer om hver rettighed se under rettigheder fanebladet."> - <column label="" name="icon" /> - <column label="" name="checkbox" /> - <column 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>
diff --git a/indra/newview/skins/default/xui/da/panel_login.xml b/indra/newview/skins/default/xui/da/panel_login.xml index 1c5b013104..fbef93de69 100644 --- a/indra/newview/skins/default/xui/da/panel_login.xml +++ b/indra/newview/skins/default/xui/da/panel_login.xml @@ -1,37 +1,38 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel name="panel_login"> - <string name="real_url"> - http://secondlife.com/app/login/ - </string> - <string name="forgot_password_url"> - http://secondlife.com/account/request.php - </string> - <text name="first_name_text"> - Fornavn: - </text> - <text name="last_name_text"> - Efternavn: - </text> - <text name="password_text"> - Password: - </text> - <text name="start_location_text"> - Start lokation: - </text> - <combo_box name="start_location_combo"> - <combo_box.item name="MyHome" label="Hjem" /> - <combo_box.item name="MyLastLocation" label="Min sidste lokation" /> - <combo_box.item name="Typeregionname" label="<Skriv navn på region>" /> - </combo_box> - <check_box label="Husk password" name="remember_check" /> - <button label="Log ind" label_selected="Log ind" name="connect_btn" /> - <text name="create_new_account_text"> - Opret bruger - </text> - <text name="forgot_password_text"> - Glemt navn eller password? - </text> - <text name="channel_text"> - [VERSION] - </text> -</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>
diff --git a/indra/newview/skins/default/xui/da/panel_main_inventory.xml b/indra/newview/skins/default/xui/da/panel_main_inventory.xml new file mode 100644 index 0000000000..e0f99bee93 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_main_inventory.xml @@ -0,0 +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>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml index d3d017914d..e8f30c185d 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml @@ -1,12 +1,48 @@ -<?xml version="1.0" encoding="utf-8"?> -<panel name="advanced"> - <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> -</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>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/da/panel_preferences_alerts.xml index c7a49ef307..cc3972238e 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_alerts.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_alerts.xml @@ -1,20 +1,14 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel label="Popups" name="popups" title="Popups"> - <text name="dont_show_label"> - Vis ikke disse popups: - </text> - <button label="Aktivér denne popup" name="enable_popup" /> - <button label="Aktivér alle popups..." name="reset_dialogs_btn" - tool_tip="Viser alle de valgfrie popups og 'første gangs' beskeder." /> - <text name="show_label"> - Vis disse popups: - </text> - <button label="Deaktivér alle disse popups..." name="skip_dialogs_btn" - tool_tip="Viser ingen af de valgfrie popups og 'første gangs' beskeder." /> - <text name="text_box2" width="310"> - Ved tilbud om tekstdokumenter, teksturer og landemærker: - </text> - <check_box label="Accepter automatisk" name="accept_new_inventory" /> - <check_box label="Vis automatisk efter accept" name="show_new_inventory" /> - <check_box label="Vis nye objekter i beholdning automatisk" name="show_in_inventory" /> -</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>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml index dee42b4de5..b141998451 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml @@ -1,61 +1,42 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel label="Tekst chat" name="chat"> - <text name="text_box"> - Chat skriftstørrelse: - </text> - <radio_group name="chat_font_size"> - <radio_item name="radio" label="Lille" /> - <radio_item name="radio2" label="Mellem" /> - <radio_item name="radio3" label="Stor" /> - </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="Bobler" name="background"/> - <text name="text_box8"> - Bobler - </text> - <color_swatch label="URL'er" name="links"/> - <text name="text_box9"> - URL'er - </text> - <check_box label="Vis script fejl og advarsler i almindelig chat" - name="script_errors_as_chat" /> - <spinner label="Udfas chat efter" name="fade_chat_time" label_width="90" width="140" /> - <spinner left="350" name="max_chat_count"/> - <slider label="Gennemsigtighed" name="console_opacity" /> - <check_box label="Brug fuldskærms bredde (Kræver genstart)" - name="chat_full_width_check" /> - <check_box label="Luk chat efter tryk på enter" name="close_chat_on_return_check" /> - <check_box label="Piletaster flytter altid figur under chat" - name="arrow_keys_move_avatar_check" /> - <check_box label="Vis klokkeslæt i lokal chat" name="show_timestamps_check" /> - <check_box label="Afspil skrive animation ved chat" name="play_typing_animation" /> - <check_box label="Vis chat bobler" name="bubble_text_chat" /> - <slider label="Gennemsigtighed" name="bubble_chat_opacity" /> -</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>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml index d50c05a192..c032e414c1 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml @@ -1,40 +1,38 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel label="Lyd & video" name="Preference Media panel"> - <slider label="Generel" name="System Volume"/> - <slider label="Omgivelser" name="Wind Volume"/> - <slider label="Effekter" name="SFX Volume"/> - <slider label="Media" name="Media Volume"/> - <slider label="Brugerflade" name="UI Volume"/> - <slider label="Musik" name="Music Volume"/> - <slider label="Tale" name="Voice Volume"/> - <text_editor name="voice_unavailable"> - Stemme chat er ikke tilgængelig - </text_editor> - <check_box label="Aktivér stemme chat" name="enable_voice_check"/> - <radio_group name="ear_location"> - <radio_item name="0" label="Hør stemmer fra kamera position" /> - <radio_item name="1" label="Hør stemmer fra avatar position" /> - </radio_group> - <button label="Enheds Indstillinger" name="device_settings_btn"/> - <text name="muting_text"> - Lydstyrke: - </text> - <text name="streaming_prefs_text"> - Streaming indstillinger: - </text> - <text name="audio_prefs_text"> - Lyd indstillinger: - </text> - <panel label="Lydstyrke" name="Volume Panel" /> - <check_box label="Afspil musik når det er muligt" - name="streaming_music" /> - <check_box label="Afspil video når det er muligt" - name="streaming_video" /> - <check_box label="Afspil automatisk medie" name="auto_streaming_video" /> - <check_box label="Sluk lyd når vinduet er minimeret" name="mute_when_minimized" /> - <slider label="Doppler effekt" name="Doppler Effect" /> - <slider label="Rækkevidde" name="Distance Factor" /> - <slider label="Styrkefald/afstand" name="Rolloff Factor" /> - <spinner label="Penge lydstyrke" name="L$ Change Threshold" /> - <spinner label="Livspoint lydstyrke" name="Health Change Threshold" /> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Lyde" name="Preference Media panel">
+ <slider label="Generel" name="System Volume"/>
+ <check_box initial_value="true" label="Sluk lyd når vinduet er minimeret" name="mute_when_minimized"/>
+ <slider label="Omgivelser" name="Wind Volume"/>
+ <slider label="Knapper" name="UI Volume"/>
+ <slider label="Media" name="Media Volume"/>
+ <slider label="Effekter" name="SFX Volume"/>
+ <slider label="Musik" name="Music Volume"/>
+ <check_box label="Tale" name="enable_voice_check"/>
+ <slider label="Tale" name="Voice Volume"/>
+ <text name="Listen from">
+ Hør stemmer fra:
+ </text>
+ <radio_group name="ear_location">
+ <radio_item label="Kamera position" name="0"/>
+ <radio_item label="Avatar position" name="1"/>
+ </radio_group>
+ <button label="Input/Output enheder" name="device_settings_btn"/>
+ <panel label="Enhedsopsætning" name="device_settings_panel">
+ <panel.string name="default_text">
+ Standard
+ </panel.string>
+ <text name="Input">
+ Input
+ </text>
+ <text name="My volume label">
+ Min lydstyrke:
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Ændre lydstyrke med denne skyder"/>
+ <text name="wait_text">
+ Vent venligst
+ </text>
+ <text name="Output">
+ Output
+ </text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_world_map.xml b/indra/newview/skins/default/xui/da/panel_world_map.xml index d2ae3ab116..f8bdaa9953 100644 --- a/indra/newview/skins/default/xui/da/panel_world_map.xml +++ b/indra/newview/skins/default/xui/da/panel_world_map.xml @@ -1,51 +1,57 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="world_map"> - <panel.string name="world_map_north"> - N - </panel.string> - <panel.string name="world_map_east"> - Ø - </panel.string> - <panel.string name="world_map_west"> - V - </panel.string> - <panel.string name="world_map_south"> - S - </panel.string> - <panel.string name="world_map_southeast"> - SØ - </panel.string> - <panel.string name="world_map_northeast"> - NØ - </panel.string> - <panel.string name="world_map_southwest"> - SV - </panel.string> - <panel.string name="world_map_northwest"> - NV - </panel.string> - <text label="N" name="floater_map_north" text="N"> - N - </text> - <text label="Ø" name="floater_map_east" text="Ø"> - Ø - </text> - <text label="V" name="floater_map_west" text="V"> - V - </text> - <text label="S" name="floater_map_south" text="S"> - S - </text> - <text label="SØ" name="floater_map_southeast" text="SØ"> - SØ - </text> - <text label="NØ" name="floater_map_northeast" text="NØ"> - NØ - </text> - <text label="SV" name="floater_map_southwest" text="SV"> - SV - </text> - <text label="NV" name="floater_map_northwest" text="NV"> - NV - </text> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="world_map">
+ <panel.string name="Loading">
+ Henter...
+ </panel.string>
+ <panel.string name="InvalidLocation">
+ Ugyldig lokation
+ </panel.string>
+ <panel.string name="world_map_north">
+ N
+ </panel.string>
+ <panel.string name="world_map_east">
+ Ø
+ </panel.string>
+ <panel.string name="world_map_west">
+ V
+ </panel.string>
+ <panel.string name="world_map_south">
+ S
+ </panel.string>
+ <panel.string name="world_map_southeast">
+ SØ
+ </panel.string>
+ <panel.string name="world_map_northeast">
+ NØ
+ </panel.string>
+ <panel.string name="world_map_southwest">
+ SV
+ </panel.string>
+ <panel.string name="world_map_northwest">
+ NV
+ </panel.string>
+ <text label="N" name="floater_map_north" text="N">
+ N
+ </text>
+ <text label="Ø" name="floater_map_east" text="Ø">
+ Ø
+ </text>
+ <text label="V" name="floater_map_west" text="V">
+ V
+ </text>
+ <text label="S" name="floater_map_south" text="S">
+ S
+ </text>
+ <text label="SØ" name="floater_map_southeast" text="SØ">
+ SØ
+ </text>
+ <text label="NØ" name="floater_map_northeast" text="NØ">
+ NØ
+ </text>
+ <text label="SV" name="floater_map_southwest" text="SV">
+ SV
+ </text>
+ <text label="NV" name="floater_map_northwest" text="NV">
+ NV
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml index 945833d57a..155714363e 100644 --- a/indra/newview/skins/default/xui/da/strings.xml +++ b/indra/newview/skins/default/xui/da/strings.xml @@ -1,654 +1,3242 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<!-- This file contains strings that used to be hardcoded in the source. - It is only for those strings which do not belong in a floater. - For example, the strings used in avatar chat bubbles, and strings - that are returned from one component and may appear in many places--> -<strings> - <string name="LoginInProgress"> - Logger p. [APP_NAME] kan virke laast. Vent venligst. - </string> - <string name="LoginAuthenticating"> - Validerer adgang - </string> - <string name="LoginMaintenance"> - Udfører konto vedligeholdelse... - </string> - <string name="LoginAttempt"> - Tidligere forsø på login fejlede. Logger på, forsøg [NUMBER] - </string> - <string name="LoginPrecaching"> - verden... - </string> - <string name="LoginInitializingBrowser"> - Klargør indbyggede web browser... - </string> - <string name="LoginInitializingMultimedia"> - Klargør multimedia... - </string> - <string name="LoginVerifyingCache"> - Verificérer cache filer (kan tage 60-90 sekunder)... - </string> - <string name="LoginProcessingResponse"> - Behandler svar... - </string> - <string name="LoginInitializingWorld"> - Initialiserer verden... - </string> - <string name="LoginDecodingImages"> - Behandler billeder... - </string> - <string name="LoginInitializingQuicktime"> - Initialiserer QuickTime... - </string> - <string name="LoginQuicktimeNotFound"> - QuickTime ikke fundet- kunne derfor ikke initialisere. - </string> - <string name="LoginQuicktimeOK"> - QuickTime initialiseret. - </string> - <string name="LoginWaitingForRegionHandshake"> - Venter på svar fra region... - </string> - <string name="LoginConnectingToRegion"> - Tilslutter til region... - </string> - <string name="LoginDownloadingClothing"> - Henter tøj... - </string> - <string name="AgentLostConnection"> - Denne region kan have problemer. Tjek venligst din forbindelse til internettet. - </string> - <string name="TooltipPerson"> - Person - </string> - <string name="TooltipNoName"> - (intet navn) - </string> - <string name="TooltipOwner"> - Ejer: - </string> - <string name="TooltipPublic"> - Offentlig - </string> - <string name="TooltipIsGroup"> - (Gruppe) - </string> - <string name="TooltipFlagScript"> - Script - </string> - <string name="TooltipFlagPhysics"> - Fysik - </string> - <string name="TooltipFlagTouch"> - Rør - </string> - <string name="TooltipFlagL$"> - L$ - </string> - <string name="TooltipFlagDropInventory"> - Drop beholdning - </string> - <string name="TooltipFlagPhantom"> - Fantom - </string> - <string name="TooltipFlagTemporary"> - Temporær - </string> - <string name="TooltipFlagRightClickMenu"> - (Højre-klik for menu) - </string> - <string name="TooltipFreeToCopy"> - Kan kopieres - </string> - <string name="TooltipForSaleL$"> - Til salg: L$[AMOUNT] - </string> - <string name="TooltipForSaleMsg"> - Til salg: [MESSAGE] - </string> - <string name="TooltipFlagGroupBuild"> - Gruppe byg - </string> - <string name="TooltipFlagNoBuild"> - Må ikke bygge - </string> - <string name="TooltipFlagNoEdit"> - Gruppe byg - </string> - <string name="TooltipFlagNotSafe"> - Ikke sikker område - </string> - <string name="TooltipFlagNoFly"> - Ingen flyvning - </string> - <string name="TooltipFlagGroupScripts"> - Gruppe scripts - </string> - <string name="TooltipFlagNoScripts"> - Ingen Scripts - </string> - <string name="TooltipLand"> - Land: - </string> - <string name="TooltipMustSingleDrop"> - Kun et enkelt element kan trækkes ind her - </string> - <string name="RetrievingData"> - Henter... - </string> - <string name="ReleaseNotes"> - Noter om version - </string> - <string name="LoadingData"> - Henter... - </string> - <string name="AvatarNameNobody"> - (ingen) - </string> - <string name="AvatarNameWaiting"> - (venter) - </string> - <string name="AvatarNameHippos"> - (hippos) - </string> - <string name="GroupNameNone"> - (ingen) - </string> - <string name="AssetErrorNone"> - Ingen fejl - </string> - <string name="AssetErrorRequestFailed"> - Element forespørgsel: fejlede - </string> - <string name="AssetErrorNonexistentFile"> - Element forespørgsel: fil findes ikke - </string> - <string name="AssetErrorNotInDatabase"> - Element forespørgsel: element ikke fundet i database - </string> - <string name="AssetErrorEOF"> - Slutning af fil - </string> - <string name="AssetErrorCannotOpenFile"> - Kan ikke åbne fil - </string> - <string name="AssetErrorFileNotFound"> - Fil ikke fundet - </string> - <string name="AssetErrorTCPTimeout"> - Tidsgrænse overskredet ved filhentning - </string> - <string name="AssetErrorCircuitGone"> - Forbindelsen mistet - </string> - <string name="AssetErrorPriceMismatch"> - [APP_NAME] klient og server er uenige om prisen - </string> - <string name="AssetErrorUnknownStatus"> - Ukendt status - </string> - <string name="AvatarEditingApparance"> - (Ændrer udseende) - </string> - <string name="AvatarAway"> - Væk - </string> - <string name="AvatarBusy"> - Optaget - </string> - <string name="AvatarMuted"> - Blokeret - </string> - <string name="anim_express_afraid"> - Bange - </string> - <string name="anim_express_anger"> - Vred - </string> - <string name="anim_away"> - Væk - </string> - <string name="anim_backflip"> - Baglæns salto - </string> - <string name="anim_express_laugh"> - Hjertelig latter - </string> - <string name="anim_express_toothsmile"> - Stort smil - </string> - <string name="anim_blowkiss"> - Sende kys - </string> - <string name="anim_express_bored"> - Keder sig - </string> - <string name="anim_bow"> - Buk - </string> - <string name="anim_clap"> - Klap - </string> - <string name="anim_courtbow"> - Højtideligt buk - </string> - <string name="anim_express_cry"> - Græd - </string> - <string name="anim_dance1"> - Dans 1 - </string> - <string name="anim_dance2"> - Dans 2 - </string> - <string name="anim_dance3"> - Dans 3 - </string> - <string name="anim_dance4"> - Dans 4 - </string> - <string name="anim_dance5"> - Dans 5 - </string> - <string name="anim_dance6"> - Dans 6 - </string> - <string name="anim_dance7"> - Dans 7 - </string> - <string name="anim_dance8"> - Dans 8 - </string> - <string name="anim_express_disdain"> - Foragt - </string> - <string name="anim_drink"> - Drik - </string> - <string name="anim_express_embarrased"> - Flov - </string> - <string name="anim_angry_fingerwag"> - Løftet finger - </string> - <string name="anim_fist_pump"> - Knytnæve - </string> - <string name="anim_yoga_float"> - Svævende yoga - </string> - <string name="anim_express_frown"> - Mistroisk - </string> - <string name="anim_impatient"> - Utålmodig - </string> - <string name="anim_jumpforjoy"> - Glædeshop - </string> - <string name="anim_kissmybutt"> - Kys min r.. - </string> - <string name="anim_express_kiss"> - Kys - </string> - <string name="anim_laugh_short"> - Grin - </string> - <string name="anim_musclebeach"> - Bodybuilder - </string> - <string name="anim_no_unhappy"> - Nej (sur) - </string> - <string name="anim_no_head"> - Nej - </string> - <string name="anim_nyanya"> - Æv-bæv - </string> - <string name="anim_punch_onetwo"> - Et-to slag - </string> - <string name="anim_express_open_mouth"> - Åben mund - </string> - <string name="anim_peace"> - Peace - </string> - <string name="anim_point_you"> - Peg på andre - </string> - <string name="anim_point_me"> - Peg på dig selv - </string> - <string name="anim_punch_l"> - Slå venstre - </string> - <string name="anim_punch_r"> - Slå højre - </string> - <string name="anim_rps_countdown"> - SSP - Tæl - </string> - <string name="anim_rps_paper"> - SSP - Papir - </string> - <string name="anim_rps_rock"> - SSP - Sten - </string> - <string name="anim_rps_scissors"> - SSP - Saks - </string> - <string name="anim_express_repulsed"> - Misfornøjet - </string> - <string name="anim_kick_roundhouse_r"> - Karatepark - </string> - <string name="anim_express_sad"> - Ked af det - </string> - <string name="anim_salute"> - Honnør - </string> - <string name="anim_shout"> - Råb - </string> - <string name="anim_express_shrug"> - Skuldertræk - </string> - <string name="anim_express_smile"> - Smil - </string> - <string name="anim_smoke_idle"> - Ryg - </string> - <string name="anim_smoke_inhale"> - Indhalér - </string> - <string name="anim_smoke_throw_down"> - Smid cigaret - </string> - <string name="anim_express_surprise"> - Overrasket - </string> - <string name="anim_sword_strike_r"> - Sværdslag - </string> - <string name="anim_angry_tantrum"> - Ekstatisk - </string> - <string name="anim_express_tongue_out"> - Tunge ud - </string> - <string name="anim_hello"> - Vink - </string> - <string name="anim_whisper"> - Knib øje i - </string> - <string name="anim_whistle"> - Pift - </string> - <string name="anim_express_wink"> - Blink - </string> - <string name="anim_wink_hollywood"> - Blink (Hollywood) - </string> - <string name="anim_express_worry"> - Bekymret - </string> - <string name="anim_yes_happy"> - Ja (glad) - </string> - <string name="anim_yes_head"> - Ja - </string> - <string name="texture_loading"> - Henter... - </string> - <string name="worldmap_offline"> - Offline - </string> - <string name="whisper"> - hvisker: - </string> - <string name="shout"> - råber: - </string> - <string name="SIM_ACCESS_PG"> - PG - </string> - <string name="SIM_ACCESS_MATURE"> - Mature - </string> - <string name="SIM_ACCESS_ADULT"> - Adult - </string> - <string name="SIM_ACCESS_DOWN"> - logget af - </string> - <string name="SIM_ACCESS_MIN"> - Ukendt - </string> - <string name="land_type_unknown"> - (ukendt) - </string> - <string name="covenant_never_modified">Sidst ændret: (aldrig)</string> - <string name="covenant_modified">Sidst ændret: </string> - <string name="all_files"> - Alle filer - </string> - <string name="sound_files"> - Lyde - </string> - <string name="animation_files"> - Animationer - </string> - <string name="image_files"> - Billeder - </string> - <string name="save_file_verb"> - Gem - </string> - <string name="load_file_verb"> - Hent - </string> - <string name="targa_image_files"> - Targa billeder - </string> - <string name="bitmap_image_files"> - Bitmap billeder - </string> - <string name="avi_movie_file"> - AVI film fil - </string> - <string name="xaf_animation_file"> - XAF Anim Fil - </string> - <string name="xml_file"> - XML Fil - </string> - <string name="dot_raw_file"> - RAW Fil - </string> - <string name="compressed_image_files"> - Komprimerede billeder - </string> - <string name="load_files"> - Hent filer - </string> - <string name="choose_the_directory"> - Vælg bibliotek - </string> - <string name="accel-mac-control"> - ⌃ - </string> - <string name="accel-mac-command"> - ⌘ - </string> - <string name="accel-mac-option"> - ⌥ - </string> - <string name="accel-mac-shift"> - ⇧ - </string> - <string name="accel-win-control"> - Ctrl+ - </string> - <string name="accel-win-alt"> - Alt+ - </string> - <string name="accel-win-shift"> - Shift+ - </string> - <string name="GraphicsQualityLow"> - Lav - </string> - <string name="GraphicsQualityMid"> - Middel - </string> - <string name="GraphicsQualityHigh"> - Høj - </string> - - <!-- PARCEL_CATEGORY_UI_STRING --> - <string name="Linden Location">Linden sted</string> - <string name="Adult">Adult</string> - <string name="Arts&Culture">Kunst & kultur</string> - <string name="Business">Business</string> - <string name="Educational">Uddannelse</string> - <string name="Gaming">Spil</string> - <string name="Hangout">Afslapning</string> - <string name="Newcomer Friendly">Nybegynder venligt</string> - <string name="Parks&Nature">Parker & natur</string> - <string name="Residential">Beboelse</string> - <string name="Shopping">Indkøb</string> - <string name="Other">Andet</string> - - <string name="ringing"> - Forbinder til stemmechat... - </string> - <string name="connected"> - Forbundet - </string> - <string name="unavailable"> - Stemmechat er ikke tilladt hvor du befinder dig - </string> - <string name="hang_up"> - Stemme chat er afbrudt - </string> - <string name="ScriptQuestionCautionChatGranted"> - '[OBJECTNAME]', en genstand, ejet af '[OWNERNAME]', lokaliseret i [REGIONNAME] på [REGIONPOS], har fået tilladelse til: [PERMISSIONS]. - </string> - <string name="ScriptQuestionCautionChatDenied"> - '[OBJECTNAME]', en genstand, ejet af '[OWNERNAME]', lokaliseret i [REGIONNAME] på [REGIONPOS], er afvist tilladelse til: [PERMISSIONS]. - </string> - <string name="ScriptTakeMoney"> - Tag Linden dollars (L$) fra dig - </string> - <string name="ActOnControlInputs"> - Reagér på dine kontrol-taster - </string> - <string name="RemapControlInputs"> - Ændre dine kontrol-taster - </string> - <string name="AnimateYourAvatar"> - Animér din avatar - </string> - <string name="AttachToYourAvatar"> - Sæt på din avatar - </string> - <string name="ReleaseOwnership"> - Fjern ejerskabet og sæt til offentlig - </string> - <string name="LinkAndDelink"> - Sammenkæd og adskil andre genstande - </string> - <string name="AddAndRemoveJoints"> - Tilføj og fjern sammenkødninger med andre genstande - </string> - <string name="ChangePermissions"> - Ændre dens tilladelser - </string> - <string name="TrackYourCamera"> - Spor dit kamera - </string> - <string name="ControlYourCamera"> - Kontrollér dit kamera - </string> - <string name="only_user_message"> - Du er den eneste deltager i denne samtale - </string> - <string name="offline_message"> - [FIRST] [LAST] er ikke logget på. - </string> - <string name="invite_message"> - Tryk på [BUTTON NAME] knappen for at acceptére/tilslutte til denne stemme chat. - </string> - <string name="muted_message"> - Du har blokeret denne beboer. Hvis du starter en samtale vil denne blokering automatisk blive fjernet. - </string> - <string name="generic_request_error"> - Kunne ikke etablere forbindelse, prøv igen senere - </string> - <string name="insufficient_perms_error"> - Du har ikke de fornødne rettigheder. - </string> - <string name="session_does_not_exist_error"> - Denne samtale er lukket ned - </string> - <string name="no_ability_error"> - Du har ikke den mulighed. - </string> - <string name="no_ability"> - Du har ikke den mulighed. - </string> - <string name="not_a_mod_error"> - Du er ikke moderator for denne samtale. - </string> - <string name="muted_error"> - Du er blevet "blokeret". - </string> - <string name="add_session_event"> - Ikke muligt at tilføge brugere til samtale med [RECIPIENT]. - </string> - <string name="message_session_event"> - Ikke muligt at sende din besked til samtalen med [RECIPIENT]. - </string> - <string name="removed_from_group"> - Du er blevet fjernet fra gruppen. - </string> - <string name="close_on_no_ability"> - Du har ikke længere mulighed for at deltage i samtalen - </string> - <string name="AcctTypeResident"> - Beboer - </string> - <string name="AcctTypeTrial"> - På prøve - </string> - <string name="AcctTypeCharterMember"> - æresmedlem - </string> - <string name="AcctTypeEmployee"> - Linden Lab medarbejder - </string> - <string name="PaymentInfoUsed"> - Betalende medlem - </string> - <string name="PaymentInfoOnFile"> - Registreret betalende - </string> - <string name="NoPaymentInfoOnFile"> - Ingen betalingsinfo - </string> - <string name="AgeVerified"> - Alders-checket - </string> - <string name="NotAgeVerified"> - Ikke alders-checket - </string> -</strings> +<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- This file contains strings that used to be hardcoded in the source.
+ It is only for those strings which do not belong in a floater.
+ For example, the strings used in avatar chat bubbles, and strings
+ that are returned from one component and may appear in many places-->
+<strings>
+ <string name="SUPPORT_SITE">
+ Second Life Support Portal
+ </string>
+ <string name="StartupDetectingHardware">
+ Detekterer hardware...
+ </string>
+ <string name="StartupLoading">
+ Indlæser
+ </string>
+ <string name="LoginInProgress">
+ Logger p. [APP_NAME] kan virke laast. Vent venligst.
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ Logger på...
+ </string>
+ <string name="LoginAuthenticating">
+ Validerer adgang
+ </string>
+ <string name="LoginMaintenance">
+ Udfører konto vedligeholdelse...
+ </string>
+ <string name="LoginAttempt">
+ Tidligere forsø på login fejlede. Logger på, forsøg [NUMBER]
+ </string>
+ <string name="LoginPrecaching">
+ verden...
+ </string>
+ <string name="LoginInitializingBrowser">
+ Klargør indbyggede web browser...
+ </string>
+ <string name="LoginInitializingMultimedia">
+ Klargør multimedia...
+ </string>
+ <string name="LoginInitializingFonts">
+ Indlæser fonts...
+ </string>
+ <string name="LoginVerifyingCache">
+ Checker cache filer (kan tage 60-90 sekunder)...
+ </string>
+ <string name="LoginProcessingResponse">
+ Behandler svar ...
+ </string>
+ <string name="LoginInitializingWorld">
+ Initialiserer verden...
+ </string>
+ <string name="LoginDecodingImages">
+ Behandler billeder...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ Initialiserer QuickTime...
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ QuickTime ikke fundet- kunne derfor ikke initialisere.
+ </string>
+ <string name="LoginQuicktimeOK">
+ QuickTime initialiseret.
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ Venter på svar fra region...
+ </string>
+ <string name="LoginConnectingToRegion">
+ Tilslutter til region...
+ </string>
+ <string name="LoginDownloadingClothing">
+ Henter tøj...
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Netværksfejl: Kunne ikke etablere forbindelse, check venligst din netværksforbindelse.
+ </string>
+ <string name="Quit">
+ Afslut
+ </string>
+ <string name="AgentLostConnection">
+ Denne region kan have problemer. Tjek venligst din forbindelse til internettet.
+ </string>
+ <string name="TooltipPerson">
+ Person
+ </string>
+ <string name="TooltipNoName">
+ (intet navn)
+ </string>
+ <string name="TooltipOwner">
+ Ejer:
+ </string>
+ <string name="TooltipPublic">
+ Offentlig
+ </string>
+ <string name="TooltipIsGroup">
+ (Gruppe)
+ </string>
+ <string name="TooltipForSaleL$">
+ Til salg: L$[AMOUNT]
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ Gruppe byg
+ </string>
+ <string name="TooltipFlagNoBuild">
+ Må ikke bygge
+ </string>
+ <string name="TooltipFlagNoEdit">
+ Gruppe byg
+ </string>
+ <string name="TooltipFlagNotSafe">
+ Ikke sikker område
+ </string>
+ <string name="TooltipFlagNoFly">
+ Ingen flyvning
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ Gruppe scripts
+ </string>
+ <string name="TooltipFlagNoScripts">
+ Ingen Scripts
+ </string>
+ <string name="TooltipLand">
+ Land:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ Kun et enkelt element kan trækkes ind her
+ </string>
+ <string name="TooltipHttpUrl">
+ Klik for at se denne hjemmeside
+ </string>
+ <string name="TooltipSLURL">
+ Klik for at se information om denne lokation
+ </string>
+ <string name="TooltipAgentUrl">
+ Klik for at denne beboers profil
+ </string>
+ <string name="TooltipGroupUrl">
+ Klik for at se denne gruppes beskrivelse
+ </string>
+ <string name="TooltipEventUrl">
+ Klik for at se beskrivelse af denne event
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Klik for at se denne annonce
+ </string>
+ <string name="TooltipParcelUrl">
+ Klik for at se beskrivelse for denne parcel
+ </string>
+ <string name="TooltipTeleportUrl">
+ Klik for at teleportere til denne lokation
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Klik for at se beskrivelse for dette objekt
+ </string>
+ <string name="TooltipMapUrl">
+ Klik for at se denne lokation på kortet
+ </string>
+ <string name="TooltipSLAPP">
+ Klik for at starte secondlife:// kommando
+ </string>
+ <string name="CurrentURL" value=" Nuværende URL: [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ Teleportér til
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Vis kort for
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Luk (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Luk (Ctrl+W)
+ </string>
+ <string name="BUTTON_RESTORE">
+ Gendan
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimér
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Løsriv
+ </string>
+ <string name="BUTTON_DOCK">
+ Fastgør
+ </string>
+ <string name="BUTTON_UNDOCK">
+ Frigør
+ </string>
+ <string name="BUTTON_HELP">
+ Vis hjælp
+ </string>
+ <string name="Searching">
+ Søger...
+ </string>
+ <string name="NoneFound">
+ Intet fundet.
+ </string>
+ <string name="RetrievingData">
+ Henter...
+ </string>
+ <string name="ReleaseNotes">
+ Noter om version
+ </string>
+ <string name="LoadingData">
+ Henter...
+ </string>
+ <string name="AvatarNameNobody">
+ (ingen)
+ </string>
+ <string name="AvatarNameWaiting">
+ (venter)
+ </string>
+ <string name="AvatarNameHippos">
+ (hippos)
+ </string>
+ <string name="GroupNameNone">
+ (ingen)
+ </string>
+ <string name="AssetErrorNone">
+ Ingen fejl
+ </string>
+ <string name="AssetErrorRequestFailed">
+ Element forespørgsel: fejlede
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ Element forespørgsel: fil findes ikke
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ Element forespørgsel: element ikke fundet i database
+ </string>
+ <string name="AssetErrorEOF">
+ Slutning af fil
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ Kan ikke åbne fil
+ </string>
+ <string name="AssetErrorFileNotFound">
+ Fil ikke fundet
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ Tidsgrænse overskredet ved filhentning
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Forbindelsen mistet
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ [APP_NAME] klient og server er uenige om prisen
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ Ukendt status
+ </string>
+ <string name="texture">
+ tekstur
+ </string>
+ <string name="sound">
+ lyd
+ </string>
+ <string name="calling card">
+ visitkort
+ </string>
+ <string name="landmark">
+ landemærke
+ </string>
+ <string name="legacy script">
+ ældre script
+ </string>
+ <string name="clothing">
+ tøj
+ </string>
+ <string name="object">
+ objekt
+ </string>
+ <string name="note card">
+ note
+ </string>
+ <string name="folder">
+ mappe
+ </string>
+ <string name="root">
+ rod
+ </string>
+ <string name="lsl2 script">
+ LSL2 script
+ </string>
+ <string name="lsl bytecode">
+ LSL bytecode
+ </string>
+ <string name="tga texture">
+ tga texture
+ </string>
+ <string name="body part">
+ kropsdel
+ </string>
+ <string name="snapshot">
+ foto
+ </string>
+ <string name="lost and found">
+ Fundne genstande
+ </string>
+ <string name="targa image">
+ targa billede
+ </string>
+ <string name="trash">
+ Papirkurv
+ </string>
+ <string name="jpeg image">
+ jpeg billede
+ </string>
+ <string name="animation">
+ animation
+ </string>
+ <string name="gesture">
+ bevægelse
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ favorit
+ </string>
+ <string name="symbolic link">
+ link
+ </string>
+ <string name="AvatarAway">
+ Væk
+ </string>
+ <string name="AvatarBusy">
+ Optaget
+ </string>
+ <string name="AvatarMuted">
+ Blokeret
+ </string>
+ <string name="anim_express_afraid">
+ Bange
+ </string>
+ <string name="anim_express_anger">
+ Vred
+ </string>
+ <string name="anim_away">
+ Væk
+ </string>
+ <string name="anim_backflip">
+ Baglæns salto
+ </string>
+ <string name="anim_express_laugh">
+ Hjertelig latter
+ </string>
+ <string name="anim_express_toothsmile">
+ Stort smil
+ </string>
+ <string name="anim_blowkiss">
+ Sende kys
+ </string>
+ <string name="anim_express_bored">
+ Keder sig
+ </string>
+ <string name="anim_bow">
+ Buk
+ </string>
+ <string name="anim_clap">
+ Klap
+ </string>
+ <string name="anim_courtbow">
+ Højtideligt buk
+ </string>
+ <string name="anim_express_cry">
+ Græd
+ </string>
+ <string name="anim_dance1">
+ Dans 1
+ </string>
+ <string name="anim_dance2">
+ Dans 2
+ </string>
+ <string name="anim_dance3">
+ Dans 3
+ </string>
+ <string name="anim_dance4">
+ Dans 4
+ </string>
+ <string name="anim_dance5">
+ Dans 5
+ </string>
+ <string name="anim_dance6">
+ Dans 6
+ </string>
+ <string name="anim_dance7">
+ Dans 7
+ </string>
+ <string name="anim_dance8">
+ Dans 8
+ </string>
+ <string name="anim_express_disdain">
+ Foragt
+ </string>
+ <string name="anim_drink">
+ Drik
+ </string>
+ <string name="anim_express_embarrased">
+ Flov
+ </string>
+ <string name="anim_angry_fingerwag">
+ Løftet finger
+ </string>
+ <string name="anim_fist_pump">
+ Knytnæve
+ </string>
+ <string name="anim_yoga_float">
+ Svævende yoga
+ </string>
+ <string name="anim_express_frown">
+ Mistroisk
+ </string>
+ <string name="anim_impatient">
+ Utålmodig
+ </string>
+ <string name="anim_jumpforjoy">
+ Glædeshop
+ </string>
+ <string name="anim_kissmybutt">
+ Kys min r..
+ </string>
+ <string name="anim_express_kiss">
+ Kys
+ </string>
+ <string name="anim_laugh_short">
+ Grin
+ </string>
+ <string name="anim_musclebeach">
+ Bodybuilder
+ </string>
+ <string name="anim_no_unhappy">
+ Nej (sur)
+ </string>
+ <string name="anim_no_head">
+ Nej
+ </string>
+ <string name="anim_nyanya">
+ Æv-bæv
+ </string>
+ <string name="anim_punch_onetwo">
+ Et-to slag
+ </string>
+ <string name="anim_express_open_mouth">
+ Åben mund
+ </string>
+ <string name="anim_peace">
+ Peace
+ </string>
+ <string name="anim_point_you">
+ Peg på andre
+ </string>
+ <string name="anim_point_me">
+ Peg på dig selv
+ </string>
+ <string name="anim_punch_l">
+ Slå venstre
+ </string>
+ <string name="anim_punch_r">
+ Slå højre
+ </string>
+ <string name="anim_rps_countdown">
+ SSP - Tæl
+ </string>
+ <string name="anim_rps_paper">
+ SSP - Papir
+ </string>
+ <string name="anim_rps_rock">
+ SSP - Sten
+ </string>
+ <string name="anim_rps_scissors">
+ SSP - Saks
+ </string>
+ <string name="anim_express_repulsed">
+ Misfornøjet
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ Karatepark
+ </string>
+ <string name="anim_express_sad">
+ Ked af det
+ </string>
+ <string name="anim_salute">
+ Honnør
+ </string>
+ <string name="anim_shout">
+ Råb
+ </string>
+ <string name="anim_express_shrug">
+ Skuldertræk
+ </string>
+ <string name="anim_express_smile">
+ Smil
+ </string>
+ <string name="anim_smoke_idle">
+ Ryg
+ </string>
+ <string name="anim_smoke_inhale">
+ Indhalér
+ </string>
+ <string name="anim_smoke_throw_down">
+ Smid cigaret
+ </string>
+ <string name="anim_express_surprise">
+ Overrasket
+ </string>
+ <string name="anim_sword_strike_r">
+ Sværdslag
+ </string>
+ <string name="anim_angry_tantrum">
+ Ekstatisk
+ </string>
+ <string name="anim_express_tongue_out">
+ Tunge ud
+ </string>
+ <string name="anim_hello">
+ Vink
+ </string>
+ <string name="anim_whisper">
+ Knib øje i
+ </string>
+ <string name="anim_whistle">
+ Pift
+ </string>
+ <string name="anim_express_wink">
+ Blink
+ </string>
+ <string name="anim_wink_hollywood">
+ Blink (Hollywood)
+ </string>
+ <string name="anim_express_worry">
+ Bekymret
+ </string>
+ <string name="anim_yes_happy">
+ Ja (glad)
+ </string>
+ <string name="anim_yes_head">
+ Ja
+ </string>
+ <string name="texture_loading">
+ Indlæser...
+ </string>
+ <string name="worldmap_offline">
+ Offline
+ </string>
+ <string name="worldmap_results_none_found">
+ Ingen fundet.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ Fil slutter for tidligt
+ </string>
+ <string name="ST_NO_JOINT">
+ Kan ikke funde ROOT eller JOINT.
+ </string>
+ <string name="whisper">
+ hvisker:
+ </string>
+ <string name="shout">
+ råber:
+ </string>
+ <string name="ringing">
+ Forbinder til stemmechat...
+ </string>
+ <string name="connected">
+ Forbundet
+ </string>
+ <string name="unavailable">
+ Stemmechat er ikke tilladt hvor du befinder dig
+ </string>
+ <string name="hang_up">
+ Stemme chat er afbrudt
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ '[OBJECTNAME]', en genstand, ejet af '[OWNERNAME]', lokaliseret i [REGIONNAME] på [REGIONPOS], har fået tilladelse til: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ '[OBJECTNAME]', en genstand, ejet af '[OWNERNAME]', lokaliseret i [REGIONNAME] på [REGIONPOS], er afvist tilladelse til: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Tag Linden dollars (L$) fra dig
+ </string>
+ <string name="ActOnControlInputs">
+ Reagér på dine kontrol-taster
+ </string>
+ <string name="RemapControlInputs">
+ Ændre dine kontrol-taster
+ </string>
+ <string name="AnimateYourAvatar">
+ Animér din avatar
+ </string>
+ <string name="AttachToYourAvatar">
+ Sæt på din avatar
+ </string>
+ <string name="ReleaseOwnership">
+ Fjern ejerskabet og sæt til offentlig
+ </string>
+ <string name="LinkAndDelink">
+ Sammenkæd og adskil andre genstande
+ </string>
+ <string name="AddAndRemoveJoints">
+ Tilføj og fjern sammenkødninger med andre genstande
+ </string>
+ <string name="ChangePermissions">
+ Ændre dens tilladelser
+ </string>
+ <string name="TrackYourCamera">
+ Spor dit kamera
+ </string>
+ <string name="ControlYourCamera">
+ Kontrollér dit kamera
+ </string>
+ <string name="SIM_ACCESS_PG">
+ PG
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ Mature
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ Adult
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ logget af
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ Ukendt
+ </string>
+ <string name="land_type_unknown">
+ (ukendt)
+ </string>
+ <string name="all_files">
+ Alle filer
+ </string>
+ <string name="sound_files">
+ Lyde
+ </string>
+ <string name="animation_files">
+ Animationer
+ </string>
+ <string name="image_files">
+ Billeder
+ </string>
+ <string name="save_file_verb">
+ Gem
+ </string>
+ <string name="load_file_verb">
+ Hent
+ </string>
+ <string name="targa_image_files">
+ Targa billeder
+ </string>
+ <string name="bitmap_image_files">
+ Bitmap billeder
+ </string>
+ <string name="avi_movie_file">
+ AVI film fil
+ </string>
+ <string name="xaf_animation_file">
+ XAF Anim Fil
+ </string>
+ <string name="xml_file">
+ XML Fil
+ </string>
+ <string name="dot_raw_file">
+ RAW Fil
+ </string>
+ <string name="compressed_image_files">
+ Komprimerede billeder
+ </string>
+ <string name="load_files">
+ Hent filer
+ </string>
+ <string name="choose_the_directory">
+ Vælg bibliotek
+ </string>
+ <string name="AvatarSetNotAway">
+ Sæt "til stede"
+ </string>
+ <string name="AvatarSetAway">
+ Sæt "væk"
+ </string>
+ <string name="AvatarSetNotBusy">
+ Sæt "ledig"
+ </string>
+ <string name="AvatarSetBusy">
+ Sæt "optaget"
+ </string>
+ <string name="shape">
+ Form
+ </string>
+ <string name="skin">
+ Hud
+ </string>
+ <string name="hair">
+ Hår
+ </string>
+ <string name="eyes">
+ Øjne
+ </string>
+ <string name="shirt">
+ Trøje
+ </string>
+ <string name="pants">
+ Bukser
+ </string>
+ <string name="shoes">
+ Sko
+ </string>
+ <string name="socks">
+ Strømper
+ </string>
+ <string name="jacket">
+ Jakke
+ </string>
+ <string name="gloves">
+ Handsker
+ </string>
+ <string name="undershirt">
+ Undertrøje
+ </string>
+ <string name="underpants">
+ Underbukser
+ </string>
+ <string name="skirt">
+ Nederdel
+ </string>
+ <string name="alpha">
+ Alpha
+ </string>
+ <string name="tattoo">
+ Tatovering
+ </string>
+ <string name="invalid">
+ ugyldig
+ </string>
+ <string name="next">
+ Næste
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Gruppe besked
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Gruppe besked
+ </string>
+ <string name="GroupNotifySentBy">
+ Sendt af
+ </string>
+ <string name="GroupNotifyAttached">
+ Vedhæftet:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Se tidligere beskeder eller slå modtagelse af beskeder fra her.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Åben vedhæng
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Gem vedhæng
+ </string>
+ <string name="TeleportOffer">
+ Teleport tilbud
+ </string>
+ <string name="StartUpNotification">
+ %d nye besked modtaget mens du var væk...
+ </string>
+ <string name="StartUpNotifications">
+ %d nye beskeder modtaget mens du var væk......
+ </string>
+ <string name="OverflowInfoChannelString">
+ Du har %d mere besked(er)
+ </string>
+ <string name="BodyPartsRightArm">
+ Højre arm
+ </string>
+ <string name="BodyPartsHead">
+ Hoved
+ </string>
+ <string name="BodyPartsLeftArm">
+ Venstre arm
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Venstre ben
+ </string>
+ <string name="BodyPartsTorso">
+ Overkrop
+ </string>
+ <string name="BodyPartsRightLeg">
+ Højre ben
+ </string>
+ <string name="GraphicsQualityLow">
+ Lav
+ </string>
+ <string name="GraphicsQualityMid">
+ Middel
+ </string>
+ <string name="GraphicsQualityHigh">
+ Høj
+ </string>
+ <string name="LeaveMouselook">
+ Tryk ESC for at skift til normalt udsyn
+ </string>
+ <string name="InventoryNoMatchingItems">
+ No matching items found in inventory.
+ </string>
+ <string name="InventoryNoTexture">
+ Du har ikke en kopi af denne
+tekstur i din beholdning.
+ </string>
+ <string name="no_transfer" value=" (ikke overdragbar)"/>
+ <string name="no_modify" value=" (ikke redigere)"/>
+ <string name="no_copy" value=" (ikke kopiere)"/>
+ <string name="worn" value=" (båret)"/>
+ <string name="link" value=" (sammenkæde)"/>
+ <string name="broken_link" value=" (brudt_kæde)""/>
+ <string name="LoadingContents">
+ Henter indhold...
+ </string>
+ <string name="NoContents">
+ Intet indhold
+ </string>
+ <string name="WornOnAttachmentPoint" value=" (båret på [ATTACHMENT_POINT])"/>
+ <string name="Chat" value=" Chat : "/>
+ <string name="Sound" value=" Lyd : "/>
+ <string name="Wait" value=" --- Vent : "/>
+ <string name="AnimFlagStop" value=" Stop Animation : "/>
+ <string name="AnimFlagStart" value=" Start Animation : "/>
+ <string name="Wave" value=" Vink "/>
+ <string name="HelloAvatar" value=" Hej, avatar! "/>
+ <string name="ViewAllGestures" value=" Se alle >>"/>
+ <string name="Animations" value=" Animationer,"/>
+ <string name="Calling Cards" value=" Visitkort,"/>
+ <string name="Clothing" value=" Tøj,"/>
+ <string name="Gestures" value=" Bevægelser,"/>
+ <string name="Landmarks" value=" Landemærker,"/>
+ <string name="Notecards" value=" Note,"/>
+ <string name="Objects" value=" Objekter,"/>
+ <string name="Scripts" value=" Scripts,"/>
+ <string name="Sounds" value=" Lyde,"/>
+ <string name="Textures" value=" Teksturer,"/>
+ <string name="Snapshots" value=" Fotos,"/>
+ <string name="No Filters" value="Nej "/>
+ <string name="Since Logoff" value=" - Siden log ud"/>
+ <string name="InvFolder My Inventory">
+ Min beholdning
+ </string>
+ <string name="InvFolder My Favorites">
+ Mine favoritter
+ </string>
+ <string name="InvFolder Library">
+ Bibliotek
+ </string>
+ <string name="InvFolder Textures">
+ Teksturer
+ </string>
+ <string name="InvFolder Sounds">
+ Lyde
+ </string>
+ <string name="InvFolder Calling Cards">
+ Visitkort
+ </string>
+ <string name="InvFolder Landmarks">
+ Landemærker
+ </string>
+ <string name="InvFolder Scripts">
+ Scripts
+ </string>
+ <string name="InvFolder Clothing">
+ Tøj
+ </string>
+ <string name="InvFolder Objects">
+ Objekter
+ </string>
+ <string name="InvFolder Notecards">
+ Noter
+ </string>
+ <string name="InvFolder New Folder">
+ Ny mappe
+ </string>
+ <string name="InvFolder Inventory">
+ Beholdning
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Ukomprimerede billeder
+ </string>
+ <string name="InvFolder Body Parts">
+ Kropsdele
+ </string>
+ <string name="InvFolder Trash">
+ Papirkurv
+ </string>
+ <string name="InvFolder Photo Album">
+ Fotoalbum
+ </string>
+ <string name="InvFolder Lost And Found">
+ Fundne genstande
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Ukomprimerede lyde
+ </string>
+ <string name="InvFolder Animations">
+ Animationer
+ </string>
+ <string name="InvFolder Gestures">
+ Bevægelser
+ </string>
+ <string name="InvFolder favorite">
+ Favoritter
+ </string>
+ <string name="InvFolder Current Outfit">
+ Nuværende sæt
+ </string>
+ <string name="InvFolder My Outfits">
+ Mine sæt
+ </string>
+ <string name="InvFolder Friends">
+ Venner
+ </string>
+ <string name="InvFolder All">
+ Alle
+ </string>
+ <string name="Buy">
+ Køb
+ </string>
+ <string name="BuyforL$">
+ Køb for L$
+ </string>
+ <string name="Stone">
+ Sten
+ </string>
+ <string name="Metal">
+ Metal
+ </string>
+ <string name="Glass">
+ Glas
+ </string>
+ <string name="Wood">
+ Træ
+ </string>
+ <string name="Flesh">
+ Kød
+ </string>
+ <string name="Plastic">
+ Plastik
+ </string>
+ <string name="Rubber">
+ Gummi
+ </string>
+ <string name="Light">
+ Lys
+ </string>
+ <string name="KBShift">
+ Shift
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Bryst
+ </string>
+ <string name="Skull">
+ Hovedskal
+ </string>
+ <string name="Left Shoulder">
+ Venstre skulder
+ </string>
+ <string name="Right Shoulder">
+ Højre skulder
+ </string>
+ <string name="Left Hand">
+ Venstre hånd
+ </string>
+ <string name="Right Hand">
+ Højre hånd
+ </string>
+ <string name="Left Foot">
+ Venstre fod
+ </string>
+ <string name="Right Foot">
+ Højre fod
+ </string>
+ <string name="Spine">
+ Rygsøjle
+ </string>
+ <string name="Pelvis">
+ Bækken
+ </string>
+ <string name="Mouth">
+ Mund
+ </string>
+ <string name="Chin">
+ Hage
+ </string>
+ <string name="Left Ear">
+ Venstre øre
+ </string>
+ <string name="Right Ear">
+ Højre øre
+ </string>
+ <string name="Left Eyeball">
+ Venstre øje
+ </string>
+ <string name="Right Eyeball">
+ Højre øje
+ </string>
+ <string name="Nose">
+ Næse
+ </string>
+ <string name="R Upper Arm">
+ H overarm
+ </string>
+ <string name="R Forearm">
+ H underarm
+ </string>
+ <string name="L Upper Arm">
+ V overarm
+ </string>
+ <string name="L Forearm">
+ V underarm
+ </string>
+ <string name="Right Hip">
+ Højre hofte
+ </string>
+ <string name="R Upper Leg">
+ Højre lår
+ </string>
+ <string name="R Lower Leg">
+ H underben
+ </string>
+ <string name="Left Hip">
+ Venstre hofte
+ </string>
+ <string name="L Upper Leg">
+ Venstre lår
+ </string>
+ <string name="L Lower Leg">
+ V underben
+ </string>
+ <string name="Stomach">
+ Mave
+ </string>
+ <string name="Left Pec">
+ Venstre bryst
+ </string>
+ <string name="Right Pec">
+ Højre bryst
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS] gammel
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS] gammel
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS] gammel
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS] gammel
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS] gammel
+ </string>
+ <string name="TodayOld">
+ Med fra i dag
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] år
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] år
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] år
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] måned
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] måneder
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] måneder
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] uge
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] uger
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] uger
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] dag
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] dage
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] dage
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] medlem
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] medlemmer
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] medlemmer
+ </string>
+ <string name="AcctTypeResident">
+ Beboer
+ </string>
+ <string name="AcctTypeTrial">
+ På prøve
+ </string>
+ <string name="AcctTypeCharterMember">
+ Æresmedlemmer
+ </string>
+ <string name="AcctTypeEmployee">
+ Linden Lab medarbejder
+ </string>
+ <string name="PaymentInfoUsed">
+ Betalende medlem
+ </string>
+ <string name="PaymentInfoOnFile">
+ Betalingsinfo registreret
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Ingen betalingsinfo
+ </string>
+ <string name="AgeVerified">
+ Alders-checket
+ </string>
+ <string name="NotAgeVerified">
+ Ikke alders-checket
+ </string>
+ <string name="Center 2">
+ Center 2
+ </string>
+ <string name="Top Right">
+ Øverst højre
+ </string>
+ <string name="Top">
+ Top
+ </string>
+ <string name="Top Left">
+ Øverst venstre
+ </string>
+ <string name="Center">
+ Centrum
+ </string>
+ <string name="Bottom Left">
+ Nederst venstre
+ </string>
+ <string name="Bottom">
+ Nederst midt
+ </string>
+ <string name="Bottom Right">
+ nederst højre
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Hentet, kompilerer nu
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Script ikke fundet på server.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Problem ved download
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Ikke rettigheder til at downloade script.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Ikke nok rettigheder til at
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Ukendt fejl ved download
+ </string>
+ <string name="CompileQueueTitle">
+ Rekompilering fremskridt
+ </string>
+ <string name="CompileQueueStart">
+ Rekompilér
+ </string>
+ <string name="ResetQueueTitle">
+ Nulstil fremskridt
+ </string>
+ <string name="ResetQueueStart">
+ nulstil
+ </string>
+ <string name="RunQueueTitle">
+ Sæt "running" fremskridt
+ </string>
+ <string name="RunQueueStart">
+ sæt til "running"
+ </string>
+ <string name="NotRunQueueTitle">
+ Sæt "Not Running" fremskridt
+ </string>
+ <string name="NotRunQueueStart">
+ sæt til "not running"
+ </string>
+ <string name="CompileSuccessful">
+ Kompleret uden fejl!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Kompileret uden fejl, gemmer...
+ </string>
+ <string name="SaveComplete">
+ Gemt.
+ </string>
+ <string name="ObjectOutOfRange">
+ Script ("object out of range")
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ Objekt [OBJECT] ejet af [OWNER]
+ </string>
+ <string name="GroupsNone">
+ ingen
+ </string>
+ <string name="Group" value=" (gruppe)"/>
+ <string name="Unknown">
+ (ukendt)
+ </string>
+ <string name="SummaryForTheWeek" value="Opsummering for denne uge, begyndende med "/>
+ <string name="NextStipendDay" value="Næste stipendie dag er "/>
+ <string name="GroupIndividualShare" value=" Gruppe Individuel Delt"/>
+ <string name="Balance">
+ Balance
+ </string>
+ <string name="Credits">
+ Kredit
+ </string>
+ <string name="Debits">
+ Debet
+ </string>
+ <string name="Total">
+ Total
+ </string>
+ <string name="NoGroupDataFound">
+ Ingen gruppedata fundet for gruppe
+ </string>
+ <string name="IMParentEstate">
+ overordnet estate
+ </string>
+ <string name="IMMainland">
+ mainland
+ </string>
+ <string name="IMTeen">
+ teen
+ </string>
+ <string name="RegionInfoError">
+ fejl
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ alle estates ejet af [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ alle estates du ejer
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ alle estates du administrerer for [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Godkendte beboere: ([ALLOWEDAGENTS], max. [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Godkendte grupper: ([ALLOWEDGROUPS], max. [MAXACCESS])
+ </string>
+ <string name="CursorPos">
+ Linie [LINE], Kolonne [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] fundet
+ </string>
+ <string name="PanelContentsNewScript">
+ Nyt script
+ </string>
+ <string name="MuteByName">
+ (efter navn)
+ </string>
+ <string name="MuteAgent">
+ (beboer)
+ </string>
+ <string name="MuteObject">
+ (objekt)
+ </string>
+ <string name="MuteGroup">
+ (gruppe)
+ </string>
+ <string name="RegionNoCovenant">
+ Der er ingen regler for dette estate.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ Der er ingen regler for dette estate. Land på dette estate sælges af estate ejeren, ikke af Linden Lab. Kontakt venligst estate ejeren for detaljer om salg.
+ </string>
+ <string name="covenant_last_modified">
+ Sidst ændret:
+ </string>
+ <string name="none_text" value=" (ingen) "/>
+ <string name="never_text" value=" (aldrig) "/>
+ <string name="GroupOwned">
+ Gruppe ejet
+ </string>
+ <string name="Public">
+ Offentlig
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Klik: [TELEPORT] teleport, [MAP] kort, [PROFILE] profil
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (vil blive opdateret efter offentliggørelse)
+ </string>
+ <string name="MultiPreviewTitle">
+ Vis først
+ </string>
+ <string name="MultiPropertiesTitle">
+ Egenskaber
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Et objekt med navnet
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ ejet af gruppen
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ ejet af en ukendt gruppe
+ </string>
+ <string name="InvOfferOwnedBy">
+ ejet af
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ ejet af en ukendt bruger
+ </string>
+ <string name="InvOfferGaveYou">
+ gav dig
+ </string>
+ <string name="InvOfferYouDecline">
+ Du afslår
+ </string>
+ <string name="InvOfferFrom">
+ fra
+ </string>
+ <string name="GroupMoneyTotal">
+ Total
+ </string>
+ <string name="GroupMoneyBought">
+ købt
+ </string>
+ <string name="GroupMoneyPaidYou">
+ betalte dig
+ </string>
+ <string name="GroupMoneyPaidInto">
+ betalt til
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ købte adgang til
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ betalte gebyr for event
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ betalte prisen for event
+ </string>
+ <string name="GroupMoneyBalance">
+ Balance
+ </string>
+ <string name="GroupMoneyCredits">
+ Kredit
+ </string>
+ <string name="GroupMoneyDebits">
+ Debet
+ </string>
+ <string name="ViewerObjectContents">
+ Indhold
+ </string>
+ <string name="AcquiredItems">
+ Anskaffede genstande
+ </string>
+ <string name="Cancel">
+ Annullér
+ </string>
+ <string name="UploadingCosts">
+ Uploader [%s] omkostninger
+ </string>
+ <string name="UnknownFileExtension">
+ Ukendt fil efternavn [.%s]
+Forventet .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Tilføj landemærke...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Redigér landemærke...
+ </string>
+ <string name="accel-mac-control">⌃</string>
+ <string name="accel-mac-command">⌘</string>
+ <string name="accel-mac-option">⌥</string>
+ <string name="accel-mac-shift">⇧</string>
+ <string name="accel-win-control">
+ Ctrl+
+ </string>
+ <string name="accel-win-alt">
+ Alt+
+ </string>
+ <string name="accel-win-shift">
+ Shift+
+ </string>
+ <string name="FileSaved">
+ Fil gemt
+ </string>
+ <string name="Receiving">
+ Modtager
+ </string>
+ <string name="AM">
+ AM
+ </string>
+ <string name="PM">
+ PM
+ </string>
+ <string name="PST">
+ PST
+ </string>
+ <string name="PDT">
+ PDT
+ </string>
+ <string name="Forward">
+ Fremad
+ </string>
+ <string name="Left">
+ Venstre
+ </string>
+ <string name="Right">
+ Højre
+ </string>
+ <string name="Back">
+ Bagud
+ </string>
+ <string name="North">
+ Nord
+ </string>
+ <string name="South">
+ Syd
+ </string>
+ <string name="West">
+ Vest
+ </string>
+ <string name="East">
+ Øst
+ </string>
+ <string name="Up">
+ Op
+ </string>
+ <string name="Down">
+ Ned
+ </string>
+ <string name="Any Category">
+ Enhver kategori
+ </string>
+ <string name="Shopping">
+ Shopping
+ </string>
+ <string name="Land Rental">
+ Land til leje
+ </string>
+ <string name="Property Rental">
+ Grunde til leje
+ </string>
+ <string name="Special Attraction">
+ Speciel attraktion
+ </string>
+ <string name="New Products">
+ Nye produkter
+ </string>
+ <string name="Employment">
+ Jobs
+ </string>
+ <string name="Wanted">
+ Søges
+ </string>
+ <string name="Service">
+ Service
+ </string>
+ <string name="Personal">
+ Personlig
+ </string>
+ <string name="None">
+ Ingen
+ </string>
+ <string name="Linden Location">
+ Linden sted
+ </string>
+ <string name="Adult">
+ Adult
+ </string>
+ <string name="Arts&Culture">
+ Kunst & kultur
+ </string>
+ <string name="Business">
+ Business
+ </string>
+ <string name="Educational">
+ Uddannelse
+ </string>
+ <string name="Gaming">
+ Spil
+ </string>
+ <string name="Hangout">
+ Afslapning
+ </string>
+ <string name="Newcomer Friendly">
+ Nybegynder venligt
+ </string>
+ <string name="Parks&Nature">
+ Parker & natur
+ </string>
+ <string name="Residential">
+ Beboelse
+ </string>
+ <string name="Stage">
+ Fase
+ </string>
+ <string name="Other">
+ Andet
+ </string>
+ <string name="Any">
+ Enhver
+ </string>
+ <string name="You">
+ Dig
+ </string>
+ <string name="Multiple Media">
+ Flere medietyper
+ </string>
+ <string name="Play Media">
+ Afspil/Pause medie
+ </string>
+ <string name="MBCmdLineError">
+ Der opstod en fejl ved afvikling af kommandolinie.
+Se venligst: http://wiki.secondlife.com/wiki/Client_parameters
+Fejl:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] Kommando linie brug:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] kan ikke få adgang til fil den/det skal bruge.
+
+Dette kan skyldes at du har flere kopier kørende eller operativsystemet tror at filen allerede er åben.
+Hvis fejlen bliver ved, genstart computer og prøv igen.
+Hvis fejlen stadig bliver ved, kan det være nødvendigt at afinstallere [APP_NAME] og installere igen.
+ </string>
+ <string name="MBFatalError">
+ Fatal fejl
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] kræver en processor med AltiVec (G4 eller nyere).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] kører allerede.
+Undersøg din "task bar" for at se efter minimeret version af programmet.
+Hvis fejlen fortsætter, prøv at genstarte din computer.
+ </string>
+ <string name="MBFrozenCrashed">
+ [APP_NAME] ser ud til at være "frosset" eller gået ned tidligere.
+Ønsker du at sende en fejlrapport?
+ </string>
+ <string name="MBAlert">
+ Besked
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME] kan ikke detektere DirectX 9.0b eller nyere.
+[APP_NAME] benytte DirectX til at detektere hardware og/eller forældede drivere der kan give problemer med stabilitet, dårlig hastighed eller nedbrud. Selvom du kan køre [APP_NAME] uden det, anbefaler vi meget at køre med DirectX 9.0b.
+
+Ønsker du at fortsætte?
+ </string>
+ <string name="MBWarning">
+ Advarsel
+ </string>
+ <string name="MBNoAutoUpdate">
+ Automatisk opdatering er endnu ikke implementeret på Linux.
+Hent venligst den nyeste version på www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass fejlede
+ </string>
+ <string name="MBError">
+ Fejl
+ </string>
+ <string name="MBFullScreenErr">
+ Ikke muligt at køre i fuldskærm med [WIDTH] x [HEIGHT].
+Afvikler i vindue.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Nedlukningsfejl ved lukning af vindue (DestroyWindow() fejlede)
+ </string>
+ <string name="MBShutdownErr">
+ Fejl ved nedlukning
+ </string>
+ <string name="MBDevContextErr">
+ Kan ikke oprette "GL device context"
+ </string>
+ <string name="MBPixelFmtErr">
+ Kan ikke finde passende "pixel format"
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Kan ikke finde "pixel format" beskrivelse
+ </string>
+ <string name="MBTrueColorWindow">
+ [APP_NAME] kræver "True Color (32-bit)" for at kunne køre.
+Gå venligst til din computers skærmopsætning og sæt "color mode" til 32-bit.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] kan ikke køre, da den ikke kan finde en "8 bit alpha channel". Normalt skyldes dette et problem med en video driver.
+Venligst undersøg om du har de nyeste drivere til dit videokort installeret.
+Din skærm skal også være sat op til at køre "True Color (32-bit)" i din displayopsætning.
+Hvis du bliver ved med at modtage denne besked, kontakt [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Kan ikke sætte "pixel format"
+ </string>
+ <string name="MBGLContextErr">
+ Kan ikke oprette "GL rendering context"
+ </string>
+ <string name="MBGLContextActErr">
+ Kan ikke aktivere "GL rendering context"
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] kan ikke afvikles da driverne til dit videokort ikke blev installeret korrekt, er forældede, eller du benytter hardware der ikke er supporteret. Undersøg venligst om du har installeret de nyeste drivere til dit grafikkort, og selv om du har de nyeste, prøv at geninstallere dem.
+
+Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
+ </string>
+ <string name="5 O'Clock Shadow">
+ Skægstubbe
+ </string>
+ <string name="All White">
+ Helt hvidt
+ </string>
+ <string name="Anime Eyes">
+ Store øjne
+ </string>
+ <string name="Arced">
+ Spidst
+ </string>
+ <string name="Arm Length">
+ Armængde
+ </string>
+ <string name="Attached">
+ Vedhæftet
+ </string>
+ <string name="Attached Earlobes">
+ Vedhæftede øreflipper
+ </string>
+ <string name="Back Bangs">
+ Nakkehår
+ </string>
+ <string name="Back Bangs Down">
+ Nakkehår langt
+ </string>
+ <string name="Back Bangs Up">
+ Nakkehår kort
+ </string>
+ <string name="Back Fringe">
+ Nakkehår
+ </string>
+ <string name="Back Hair">
+ Volumen
+ </string>
+ <string name="Back Hair Down">
+ Volumen nedad
+ </string>
+ <string name="Back Hair Up">
+ Volumen op
+ </string>
+ <string name="Baggy">
+ Posede
+ </string>
+ <string name="Bangs">
+ Pandehår
+ </string>
+ <string name="Bangs Down">
+ Pandehår ned
+ </string>
+ <string name="Bangs Up">
+ Pandehår op
+ </string>
+ <string name="Beady Eyes">
+ Stikkende øjne
+ </string>
+ <string name="Belly Size">
+ Mave størrelse
+ </string>
+ <string name="Big">
+ Stor
+ </string>
+ <string name="Big Butt">
+ Stor bagdel
+ </string>
+ <string name="Big Eyeball">
+ Store øjenæbler
+ </string>
+ <string name="Big Hair Back">
+ Stort hår: Bag
+ </string>
+ <string name="Big Hair Front">
+ Stort hår: Foran
+ </string>
+ <string name="Big Hair Top">
+ Stort hår: Top
+ </string>
+ <string name="Big Head">
+ Stort hovede
+ </string>
+ <string name="Big Pectorals">
+ Store brystmuskler
+ </string>
+ <string name="Big Spikes">
+ Store spikes
+ </string>
+ <string name="Black">
+ Sort
+ </string>
+ <string name="Blonde">
+ Blond
+ </string>
+ <string name="Blonde Hair">
+ Blondt hår
+ </string>
+ <string name="Blush">
+ Rødmen
+ </string>
+ <string name="Blush Color">
+ Rødme farve
+ </string>
+ <string name="Blush Opacity">
+ Rødme gennemsigtighed
+ </string>
+ <string name="Body Definition">
+ Kropskontur
+ </string>
+ <string name="Body Fat">
+ Kropsfedt
+ </string>
+ <string name="Body Freckles">
+ Fregner på kroppen
+ </string>
+ <string name="Body Thick">
+ Tyk krop
+ </string>
+ <string name="Body Thickness">
+ Kropstykkelse
+ </string>
+ <string name="Body Thin">
+ Tynd krop
+ </string>
+ <string name="Bow Legged">
+ Hjulbenet
+ </string>
+ <string name="Breast Buoyancy">
+ Bryst tyngdepåvirkning
+ </string>
+ <string name="Breast Cleavage">
+ Kavalergang
+ </string>
+ <string name="Breast Size">
+ Bryststørrelse
+ </string>
+ <string name="Bridge Width">
+ Bredde næseryg
+ </string>
+ <string name="Broad">
+ Bred
+ </string>
+ <string name="Brow Size">
+ Størrelse øjenbryn
+ </string>
+ <string name="Bug Eyes">
+ Udstående øjne
+ </string>
+ <string name="Bugged Eyes">
+ Udstående øjne
+ </string>
+ <string name="Bulbous">
+ Kartoffelnæse
+ </string>
+ <string name="Bulbous Nose">
+ Kartoffelnæse
+ </string>
+ <string name="Bushy Eyebrows">
+ Buskede øjenbryn
+ </string>
+ <string name="Bushy Hair">
+ Busket hår
+ </string>
+ <string name="Butt Size">
+ Størrelse bagdel
+ </string>
+ <string name="bustle skirt">
+ Tournure
+ </string>
+ <string name="no bustle">
+ Ingen tournure
+ </string>
+ <string name="more bustle">
+ Mere tournure
+ </string>
+ <string name="Chaplin">
+ Chaplin
+ </string>
+ <string name="Cheek Bones">
+ Kindben
+ </string>
+ <string name="Chest Size">
+ Bryst størrelse
+ </string>
+ <string name="Chin Angle">
+ Hage form
+ </string>
+ <string name="Chin Cleft">
+ Hagekløft
+ </string>
+ <string name="Chin Curtains">
+ Hageskæg
+ </string>
+ <string name="Chin Depth">
+ Hage dybde
+ </string>
+ <string name="Chin Heavy">
+ Stort forneden
+ </string>
+ <string name="Chin In">
+ Vigende hage
+ </string>
+ <string name="Chin Out">
+ Hage frem
+ </string>
+ <string name="Chin-Neck">
+ Hals under hage
+ </string>
+ <string name="Clear">
+ Slet
+ </string>
+ <string name="Cleft">
+ Kløft
+ </string>
+ <string name="Close Set Eyes">
+ Tætsiddende øjne
+ </string>
+ <string name="Closed">
+ Lukket
+ </string>
+ <string name="Closed Back">
+ Lukket bagtil
+ </string>
+ <string name="Closed Front">
+ Lukket foran
+ </string>
+ <string name="Closed Left">
+ Lukket til venstre
+ </string>
+ <string name="Closed Right">
+ Lukket til højre
+ </string>
+ <string name="Coin Purse">
+ Lille
+ </string>
+ <string name="Collar Back">
+ Krave bagtil
+ </string>
+ <string name="Collar Front">
+ Krave foran
+ </string>
+ <string name="Corner Down">
+ Nedadvendt
+ </string>
+ <string name="Corner Normal">
+ Normalt
+ </string>
+ <string name="Corner Up">
+ Opadvendt
+ </string>
+ <string name="Creased">
+ Rynket
+ </string>
+ <string name="Crooked Nose">
+ Skæv næse
+ </string>
+ <string name="Cropped Hair">
+ Kort hår
+ </string>
+ <string name="Cuff Flare">
+ Svaj
+ </string>
+ <string name="Dark">
+ Mørk
+ </string>
+ <string name="Dark Green">
+ Mørkegrøn
+ </string>
+ <string name="Darker">
+ Mørkere
+ </string>
+ <string name="Deep">
+ Dyb
+ </string>
+ <string name="Default Heels">
+ Standard hæle
+ </string>
+ <string name="Default Toe">
+ Standard snude
+ </string>
+ <string name="Dense">
+ Tæt
+ </string>
+ <string name="Dense hair">
+ Tæt hår
+ </string>
+ <string name="Double Chin">
+ Dobbelthage
+ </string>
+ <string name="Downturned">
+ Peger nedad
+ </string>
+ <string name="Duffle Bag">
+ Stort
+ </string>
+ <string name="Ear Angle">
+ Øre vinkel
+ </string>
+ <string name="Ear Size">
+ Øre størrelse
+ </string>
+ <string name="Ear Tips">
+ Ørespidser
+ </string>
+ <string name="Egg Head">
+ Ovalt hovede
+ </string>
+ <string name="Eye Bags">
+ Poser under øjne
+ </string>
+ <string name="Eye Color">
+ Øjenfarve
+ </string>
+ <string name="Eye Depth">
+ Øjendybde
+ </string>
+ <string name="Eye Lightness">
+ Øjennuance
+ </string>
+ <string name="Eye Opening">
+ Øjenåbning
+ </string>
+ <string name="Eye Pop">
+ Øjensymmetri
+ </string>
+ <string name="Eye Size">
+ Øjenstørrelse
+ </string>
+ <string name="Eye Spacing">
+ Øjenafstand
+ </string>
+ <string name="Eyeball Size">
+ Størrelse øjenæble
+ </string>
+ <string name="Eyebrow Arc">
+ Bue på øjenbryn
+ </string>
+ <string name="Eyebrow Density">
+ Tæthed øjenbryn
+ </string>
+ <string name="Eyebrow Height">
+ Højde på øjenbryn
+ </string>
+ <string name="Eyebrow Points">
+ Løftede øjenbryn
+ </string>
+ <string name="Eyebrow Size">
+ Størrelse øjenbryn
+ </string>
+ <string name="Eyelash Length">
+ Længde øjenvipper
+ </string>
+ <string name="Eyeliner">
+ Eyeliner
+ </string>
+ <string name="Eyeliner Color">
+ Eyeliner farve
+ </string>
+ <string name="Eyes Back">
+ Dybtliggende øjne
+ </string>
+ <string name="Eyes Bugged">
+ Udstående øjne
+ </string>
+ <string name="Eyes Forward">
+ Øjne fremme
+ </string>
+ <string name="Eyes Long Head">
+ Eyes Long Head
+ </string>
+ <string name="Eyes Shear Left Up">
+ Eyes Shear Left Up
+ </string>
+ <string name="Eyes Shear Right Up">
+ Eyes Shear Right Up
+ </string>
+ <string name="Eyes Short Head">
+ Eyes Short Head
+ </string>
+ <string name="Eyes Spread">
+ Stor afstand
+ </string>
+ <string name="Eyes Sunken">
+ Indsunkne øjne
+ </string>
+ <string name="Eyes Together">
+ Tætsiddende
+ </string>
+ <string name="Face Shear">
+ Ansigts symmetri
+ </string>
+ <string name="Facial Definition">
+ Ansigtskonturer
+ </string>
+ <string name="Far Set Eyes">
+ Stor afstand mellem øjne
+ </string>
+ <string name="Fat">
+ Tyk
+ </string>
+ <string name="Fat Head">
+ Tykt hovede
+ </string>
+ <string name="Fat Lips">
+ Tykke læber
+ </string>
+ <string name="Fat Lower">
+ Tyk nedre
+ </string>
+ <string name="Fat Lower Lip">
+ Tyk underlæbe
+ </string>
+ <string name="Fat Torso">
+ Tyk overkrop
+ </string>
+ <string name="Fat Upper">
+ Tyk øvre
+ </string>
+ <string name="Fat Upper Lip">
+ Tyk overlæbe
+ </string>
+ <string name="Female">
+ Kvinde
+ </string>
+ <string name="Fingerless">
+ Fingerløse
+ </string>
+ <string name="Fingers">
+ Fingre
+ </string>
+ <string name="Flared Cuffs">
+ Stor vidde
+ </string>
+ <string name="Flat">
+ Flad
+ </string>
+ <string name="Flat Butt">
+ Flad bagdel
+ </string>
+ <string name="Flat Head">
+ Fladt hovede
+ </string>
+ <string name="Flat Toe">
+ Flad snude
+ </string>
+ <string name="Foot Size">
+ Størrelse fod
+ </string>
+ <string name="Forehead Angle">
+ Pande vinkel
+ </string>
+ <string name="Forehead Heavy">
+ Stort foroven
+ </string>
+ <string name="Freckles">
+ Fregner
+ </string>
+ <string name="Front Bangs Down">
+ Pandehår - ned
+ </string>
+ <string name="Front Bangs Up">
+ Pandehår - op
+ </string>
+ <string name="Front Fringe">
+ Frynser foran
+ </string>
+ <string name="Front Hair">
+ Hår foran
+ </string>
+ <string name="Front Hair Down">
+ Hår foran - ned
+ </string>
+ <string name="Front Hair Up">
+ Hår foran - op
+ </string>
+ <string name="Full Back">
+ Langt ud bagtil
+ </string>
+ <string name="Full Eyeliner">
+ Meget eyeliner
+ </string>
+ <string name="Full Front">
+ Langt frem fortil
+ </string>
+ <string name="Full Hair Sides">
+ Hår i siderne
+ </string>
+ <string name="Full Sides">
+ Meget hår
+ </string>
+ <string name="Glossy">
+ Skinnende
+ </string>
+ <string name="Glove Fingers">
+ Fingre i handsker
+ </string>
+ <string name="Glove Length">
+ Handskelængde
+ </string>
+ <string name="Hair">
+ Hår
+ </string>
+ <string name="Hair Back">
+ Hår: Bagtil
+ </string>
+ <string name="Hair Front">
+ Hår: Foran
+ </string>
+ <string name="Hair Sides">
+ Hår: Siderne
+ </string>
+ <string name="Hair Sweep">
+ Strøget hår
+ </string>
+ <string name="Hair Thickess">
+ Hår tykkelse
+ </string>
+ <string name="Hair Thickness">
+ Hår tykkelse
+ </string>
+ <string name="Hair Tilt">
+ Hældning
+ </string>
+ <string name="Hair Tilted Left">
+ mest hår venstre
+ </string>
+ <string name="Hair Tilted Right">
+ Mest hår højre
+ </string>
+ <string name="Hair Volume">
+ Hår: Volumen
+ </string>
+ <string name="Hand Size">
+ Størrelse hånd
+ </string>
+ <string name="Handlebars">
+ Cykelstyr
+ </string>
+ <string name="Head Length">
+ Længde på hovede
+ </string>
+ <string name="Head Shape">
+ Hovedform
+ </string>
+ <string name="Head Size">
+ Hovedstørrelse
+ </string>
+ <string name="Head Stretch">
+ Hovedhøjde
+ </string>
+ <string name="Heel Height">
+ Hælhøjde
+ </string>
+ <string name="Heel Shape">
+ Hælform
+ </string>
+ <string name="Height">
+ Højde
+ </string>
+ <string name="High">
+ Høj
+ </string>
+ <string name="High Heels">
+ Hæje hæle
+ </string>
+ <string name="High Jaw">
+ Høj kæbe
+ </string>
+ <string name="High Platforms">
+ Høje såle
+ </string>
+ <string name="High and Tight">
+ Høj og tæt
+ </string>
+ <string name="Higher">
+ Højere
+ </string>
+ <string name="Hip Length">
+ Hoftelængde
+ </string>
+ <string name="Hip Width">
+ Hoftebredde
+ </string>
+ <string name="In">
+ Inde
+ </string>
+ <string name="In Shdw Color">
+ Indre skygge farve
+ </string>
+ <string name="In Shdw Opacity">
+ Indre skygge gennemsigtighed
+ </string>
+ <string name="Inner Eye Corner">
+ Inderste del af øje
+ </string>
+ <string name="Inner Eye Shadow">
+ Inderste øjenskygge
+ </string>
+ <string name="Inner Shadow">
+ Indre skygge
+ </string>
+ <string name="Jacket Length">
+ Jakkelængde
+ </string>
+ <string name="Jacket Wrinkles">
+ Jakkerynker
+ </string>
+ <string name="Jaw Angle">
+ Kæbevinkel
+ </string>
+ <string name="Jaw Jut">
+ Kæbefremspring
+ </string>
+ <string name="Jaw Shape">
+ Kæbeform
+ </string>
+ <string name="Join">
+ Saml
+ </string>
+ <string name="Jowls">
+ Kindehud
+ </string>
+ <string name="Knee Angle">
+ Knævinkel
+ </string>
+ <string name="Knock Kneed">
+ Kalveknæet
+ </string>
+ <string name="Large">
+ Stor
+ </string>
+ <string name="Large Hands">
+ Store hænder
+ </string>
+ <string name="Left Part">
+ Venstre side
+ </string>
+ <string name="Leg Length">
+ Benlængde
+ </string>
+ <string name="Leg Muscles">
+ Benmuskler
+ </string>
+ <string name="Less">
+ Mindre
+ </string>
+ <string name="Less Body Fat">
+ Mindre kropsfedt
+ </string>
+ <string name="Less Curtains">
+ Mindre
+ </string>
+ <string name="Less Freckles">
+ Færre fregner
+ </string>
+ <string name="Less Full">
+ Mindre
+ </string>
+ <string name="Less Gravity">
+ Mindre
+ </string>
+ <string name="Less Love">
+ Mindre bildæk
+ </string>
+ <string name="Less Muscles">
+ Færre muskler
+ </string>
+ <string name="Less Muscular">
+ Mindre muskuløs
+ </string>
+ <string name="Less Rosy">
+ Mindre rosa
+ </string>
+ <string name="Less Round">
+ Mindre rund
+ </string>
+ <string name="Less Saddle">
+ Mindre
+ </string>
+ <string name="Less Square">
+ Mindre
+ </string>
+ <string name="Less Volume">
+ Mindre
+ </string>
+ <string name="Less soul">
+ Mindre
+ </string>
+ <string name="Lighter">
+ Lettere
+ </string>
+ <string name="Lip Cleft">
+ Læbekløft
+ </string>
+ <string name="Lip Cleft Depth">
+ Dybde læbekløft
+ </string>
+ <string name="Lip Fullness">
+ Fyldige læber
+ </string>
+ <string name="Lip Pinkness">
+ Lyserøde læber
+ </string>
+ <string name="Lip Ratio">
+ Læbeproportioner
+ </string>
+ <string name="Lip Thickness">
+ Læbetykkelse
+ </string>
+ <string name="Lip Width">
+ Læbebredde
+ </string>
+ <string name="Lipgloss">
+ Lipgloss
+ </string>
+ <string name="Lipstick">
+ Læbestift
+ </string>
+ <string name="Lipstick Color">
+ Læbestift farve
+ </string>
+ <string name="Long">
+ Lang
+ </string>
+ <string name="Long Head">
+ Langt hovede
+ </string>
+ <string name="Long Hips">
+ Lange hofter
+ </string>
+ <string name="Long Legs">
+ Bange ben
+ </string>
+ <string name="Long Neck">
+ Lang hals
+ </string>
+ <string name="Long Pigtails">
+ Lange rottehaler
+ </string>
+ <string name="Long Ponytail">
+ Lang hestehale
+ </string>
+ <string name="Long Torso">
+ Lang overkrop
+ </string>
+ <string name="Long arms">
+ Lange arme
+ </string>
+ <string name="Longcuffs">
+ Longcuffs
+ </string>
+ <string name="Loose Pants">
+ Løse bukser
+ </string>
+ <string name="Loose Shirt">
+ Løs trøje
+ </string>
+ <string name="Loose Sleeves">
+ Løse ærmer
+ </string>
+ <string name="Love Handles">
+ Bildæk
+ </string>
+ <string name="Low">
+ Lav
+ </string>
+ <string name="Low Heels">
+ Flade hæle
+ </string>
+ <string name="Low Jaw">
+ Lav kæbe
+ </string>
+ <string name="Low Platforms">
+ Flade såler
+ </string>
+ <string name="Low and Loose">
+ Lav og løs
+ </string>
+ <string name="Lower">
+ Nedre
+ </string>
+ <string name="Lower Bridge">
+ Nedre næseryg
+ </string>
+ <string name="Lower Cheeks">
+ Nedre kinder
+ </string>
+ <string name="Male">
+ Mand
+ </string>
+ <string name="Middle Part">
+ Midterste del
+ </string>
+ <string name="More">
+ Mere
+ </string>
+ <string name="More Blush">
+ Mere rødmen
+ </string>
+ <string name="More Body Fat">
+ Mere kropsfedt
+ </string>
+ <string name="More Curtains">
+ Mere
+ </string>
+ <string name="More Eyeshadow">
+ Mere øjenskygge
+ </string>
+ <string name="More Freckles">
+ Flere fregner
+ </string>
+ <string name="More Full">
+ Mere
+ </string>
+ <string name="More Gravity">
+ More
+ </string>
+ <string name="More Lipstick">
+ Mere læbestift
+ </string>
+ <string name="More Love">
+ Mere bildæk
+ </string>
+ <string name="More Lower Lip">
+ Mere underlæbe
+ </string>
+ <string name="More Muscles">
+ Flere muskler
+ </string>
+ <string name="More Muscular">
+ Mere muskuløs
+ </string>
+ <string name="More Rosy">
+ Mere rosa
+ </string>
+ <string name="More Round">
+ Mere rund
+ </string>
+ <string name="More Saddle">
+ Mere
+ </string>
+ <string name="More Sloped">
+ Mere skrå
+ </string>
+ <string name="More Square">
+ Mere firkantet
+ </string>
+ <string name="More Upper Lip">
+ Mere overlæbe
+ </string>
+ <string name="More Vertical">
+ Mere lodret
+ </string>
+ <string name="More Volume">
+ Mere
+ </string>
+ <string name="More soul">
+ Mere
+ </string>
+ <string name="Moustache">
+ Overskæg
+ </string>
+ <string name="Mouth Corner">
+ Mundvige
+ </string>
+ <string name="Mouth Position">
+ Position mund
+ </string>
+ <string name="Mowhawk">
+ Intet hår
+ </string>
+ <string name="Muscular">
+ Muskuløs
+ </string>
+ <string name="Mutton Chops">
+ Lange
+ </string>
+ <string name="Nail Polish">
+ Neglelak
+ </string>
+ <string name="Nail Polish Color">
+ Neglelak farve
+ </string>
+ <string name="Narrow">
+ Smal
+ </string>
+ <string name="Narrow Back">
+ Smal bagtil
+ </string>
+ <string name="Narrow Front">
+ Smal fortil
+ </string>
+ <string name="Narrow Lips">
+ Smalle læber
+ </string>
+ <string name="Natural">
+ Naturlig
+ </string>
+ <string name="Neck Length">
+ Halslængde
+ </string>
+ <string name="Neck Thickness">
+ Halstykkelse
+ </string>
+ <string name="No Blush">
+ Ingen rødmen
+ </string>
+ <string name="No Eyeliner">
+ Ingen eyeliner
+ </string>
+ <string name="No Eyeshadow">
+ Ingen øjenskygge
+ </string>
+ <string name="No Heels">
+ Ingen hæle
+ </string>
+ <string name="No Lipgloss">
+ Ingen lipgloss
+ </string>
+ <string name="No Lipstick">
+ Ingen læbestift
+ </string>
+ <string name="No Part">
+ Ingen dele
+ </string>
+ <string name="No Polish">
+ Ingen lak
+ </string>
+ <string name="No Red">
+ Ingen rød
+ </string>
+ <string name="No Spikes">
+ Ingen spikes
+ </string>
+ <string name="No White">
+ Ingen hvid
+ </string>
+ <string name="No Wrinkles">
+ Ingen rynker
+ </string>
+ <string name="Normal Lower">
+ Normal nedre
+ </string>
+ <string name="Normal Upper">
+ Normal øvre
+ </string>
+ <string name="Nose Left">
+ Højre
+ </string>
+ <string name="Nose Right">
+ Venstre
+ </string>
+ <string name="Nose Size">
+ Næse størrelse
+ </string>
+ <string name="Nose Thickness">
+ Næse tykkelse
+ </string>
+ <string name="Nose Tip Angle">
+ Næsetip vinkel
+ </string>
+ <string name="Nose Tip Shape">
+ Næsetip form
+ </string>
+ <string name="Nose Width">
+ Næse bredde
+ </string>
+ <string name="Nostril Division">
+ Næsebor adskillelse
+ </string>
+ <string name="Nostril Width">
+ Næsebor bredde
+ </string>
+ <string name="Old">
+ Gammel
+ </string>
+ <string name="Opaque">
+ Uigennemsigtig
+ </string>
+ <string name="Open">
+ Åben
+ </string>
+ <string name="Open Back">
+ Åben bagtil
+ </string>
+ <string name="Open Front">
+ Åben foran
+ </string>
+ <string name="Open Left">
+ Åben til venstre
+ </string>
+ <string name="Open Right">
+ Åben til højre
+ </string>
+ <string name="Orange">
+ Orange
+ </string>
+ <string name="Out">
+ Ud
+ </string>
+ <string name="Out Shdw Color">
+ Ydre skygge farve
+ </string>
+ <string name="Out Shdw Opacity">
+ Ydre skygge uigennemsigtighed
+ </string>
+ <string name="Outer Eye Corner">
+ Yderste del af øje
+ </string>
+ <string name="Outer Eye Shadow">
+ Ydre øjenskygge
+ </string>
+ <string name="Outer Shadow">
+ Ydre skygge
+ </string>
+ <string name="Overbite">
+ Overbid
+ </string>
+ <string name="Package">
+ Skridt
+ </string>
+ <string name="Painted Nails">
+ Malede negle
+ </string>
+ <string name="Pale">
+ Bleg
+ </string>
+ <string name="Pants Crotch">
+ Bukser skridt
+ </string>
+ <string name="Pants Fit">
+ Pasform bukser
+ </string>
+ <string name="Pants Length">
+ Bukser - længde
+ </string>
+ <string name="Pants Waist">
+ Bukser - vidde
+ </string>
+ <string name="Pants Wrinkles">
+ Bukser - rynker
+ </string>
+ <string name="Part">
+ Skilning
+ </string>
+ <string name="Part Bangs">
+ Skilning
+ </string>
+ <string name="Pectorals">
+ Brystmuskler
+ </string>
+ <string name="Pigment">
+ Pigmentering
+ </string>
+ <string name="Pigtails">
+ Rottehaler
+ </string>
+ <string name="Pink">
+ Pink
+ </string>
+ <string name="Pinker">
+ Mere pink
+ </string>
+ <string name="Platform Height">
+ Højde sål
+ </string>
+ <string name="Platform Width">
+ Bredde sål
+ </string>
+ <string name="Pointy">
+ Spids
+ </string>
+ <string name="Pointy Heels">
+ Spidse hæle
+ </string>
+ <string name="Pointy Toe">
+ Spids snude
+ </string>
+ <string name="Ponytail">
+ Hestehale
+ </string>
+ <string name="Poofy Skirt">
+ Strutskørt
+ </string>
+ <string name="Pop Left Eye">
+ Forstør venstre øje
+ </string>
+ <string name="Pop Right Eye">
+ Forstør højre øje
+ </string>
+ <string name="Puffy">
+ Posede
+ </string>
+ <string name="Puffy Eyelids">
+ Posede øjenlåg
+ </string>
+ <string name="Rainbow Color">
+ Regnbue farver
+ </string>
+ <string name="Red Hair">
+ Rødt hår
+ </string>
+ <string name="Red Skin">
+ Rød hud
+ </string>
+ <string name="Regular">
+ Almindelig
+ </string>
+ <string name="Regular Muscles">
+ Almindelige muskler
+ </string>
+ <string name="Right Part">
+ Højre skildning
+ </string>
+ <string name="Rosy Complexion">
+ Rosa teint
+ </string>
+ <string name="Round">
+ Rund
+ </string>
+ <string name="Round Forehead">
+ Rund pande
+ </string>
+ <string name="Ruddiness">
+ Rødmossethed
+ </string>
+ <string name="Ruddy">
+ Rødmosset
+ </string>
+ <string name="Rumpled Hair">
+ Krøllet hår
+ </string>
+ <string name="Saddle Bags">
+ Ridebukselår
+ </string>
+ <string name="Saddlebags">
+ Ridebukselår
+ </string>
+ <string name="Scrawny">
+ Radmager
+ </string>
+ <string name="Scrawny Leg">
+ Magert ben
+ </string>
+ <string name="Separate">
+ Separat
+ </string>
+ <string name="Shading">
+ Skygger
+ </string>
+ <string name="Shadow hair">
+ Skygge hår
+ </string>
+ <string name="Shallow">
+ Lille
+ </string>
+ <string name="Shear Back">
+ Afklippet bagi
+ </string>
+ <string name="Shear Face">
+ Skævt ansigt
+ </string>
+ <string name="Shear Front">
+ "Måne"
+ </string>
+ <string name="Shear Left">
+ Venstre
+ </string>
+ <string name="Shear Left Up">
+ Venstre op
+ </string>
+ <string name="Shear Right">
+ Højre
+ </string>
+ <string name="Shear Right Up">
+ Højre op
+ </string>
+ <string name="Sheared Back">
+ Afklippet bagtil
+ </string>
+ <string name="Sheared Front">
+ Måne
+ </string>
+ <string name="Shift Left">
+ Mod venstre
+ </string>
+ <string name="Shift Mouth">
+ Flyt mund
+ </string>
+ <string name="Shift Right">
+ Mod højre
+ </string>
+ <string name="Shirt Bottom">
+ Trøje - bund
+ </string>
+ <string name="Shirt Fit">
+ Trøje - pasform
+ </string>
+ <string name="Shirt Wrinkles">
+ Trøje - rynker
+ </string>
+ <string name="Shoe Height">
+ Sko højde
+ </string>
+ <string name="Short">
+ Kort
+ </string>
+ <string name="Short Arms">
+ Korte arme
+ </string>
+ <string name="Short Legs">
+ Korte ben
+ </string>
+ <string name="Short Neck">
+ Kort hals
+ </string>
+ <string name="Short Pigtails">
+ Korte rottehaler
+ </string>
+ <string name="Short Ponytail">
+ Kort hestehale
+ </string>
+ <string name="Short Sideburns">
+ Korte
+ </string>
+ <string name="Short Torso">
+ Kort overkrop
+ </string>
+ <string name="Short hips">
+ Korte hofter
+ </string>
+ <string name="Shoulders">
+ Skuldre
+ </string>
+ <string name="Side Bangs">
+ Sidehår
+ </string>
+ <string name="Side Bangs Down">
+ Ned
+ </string>
+ <string name="Side Bangs Up">
+ Op
+ </string>
+ <string name="Side Fringe">
+ Side frynser
+ </string>
+ <string name="Sideburns">
+ Bakkenbarter
+ </string>
+ <string name="Sides Hair">
+ Sidehår
+ </string>
+ <string name="Sides Hair Down">
+ Ned
+ </string>
+ <string name="Sides Hair Up">
+ Op
+ </string>
+ <string name="Skinny">
+ Tynd
+ </string>
+ <string name="Skinny Neck">
+ Tynd hals
+ </string>
+ <string name="Skirt Fit">
+ Omfang
+ </string>
+ <string name="Skirt Length">
+ Længde nederdel
+ </string>
+ <string name="Slanted Forehead">
+ Skrånende pande
+ </string>
+ <string name="Sleeve Length">
+ Ærmelængde
+ </string>
+ <string name="Sleeve Looseness">
+ Ærmer - stramhed
+ </string>
+ <string name="Slit Back">
+ Slids: Bag
+ </string>
+ <string name="Slit Front">
+ Slids: Foran
+ </string>
+ <string name="Slit Left">
+ Slids: Venstre
+ </string>
+ <string name="Slit Right">
+ Slids: Højre
+ </string>
+ <string name="Small">
+ Lille
+ </string>
+ <string name="Small Hands">
+ Små hænder
+ </string>
+ <string name="Small Head">
+ Lille hovede
+ </string>
+ <string name="Smooth">
+ Glat
+ </string>
+ <string name="Smooth Hair">
+ Glat hår
+ </string>
+ <string name="Socks Length">
+ Strømper - længde
+ </string>
+ <string name="Some">
+ Nogen
+ </string>
+ <string name="Soulpatch">
+ Soulpatch
+ </string>
+ <string name="Sparse">
+ Sparsomt
+ </string>
+ <string name="Spiked Hair">
+ Hår med "spikes"
+ </string>
+ <string name="Square">
+ Firkantet
+ </string>
+ <string name="Square Toe">
+ Firkantet snude
+ </string>
+ <string name="Squash Head">
+ Bredt hovede
+ </string>
+ <string name="Squash/Stretch Head">
+ Sammentryk/stræk hovede
+ </string>
+ <string name="Stretch Head">
+ Stræk hovede
+ </string>
+ <string name="Sunken">
+ Indsunket
+ </string>
+ <string name="Sunken Chest">
+ Indsunket bryst
+ </string>
+ <string name="Sunken Eyes">
+ Dybtliggende øjne
+ </string>
+ <string name="Sweep Back">
+ Stryge tilbage
+ </string>
+ <string name="Sweep Forward">
+ Stryge fremad
+ </string>
+ <string name="Swept Back">
+ Tilbagestrøget
+ </string>
+ <string name="Swept Back Hair">
+ Tilbagestrøget hår
+ </string>
+ <string name="Swept Forward">
+ Fremadstrøget
+ </string>
+ <string name="Swept Forward Hair">
+ Fremadstrøget hår
+ </string>
+ <string name="Tall">
+ Høj
+ </string>
+ <string name="Taper Back">
+ Indsnævring bag
+ </string>
+ <string name="Taper Front">
+ Indsnævring foran
+ </string>
+ <string name="Thick Heels">
+ Brede hæle
+ </string>
+ <string name="Thick Neck">
+ Bred nakke
+ </string>
+ <string name="Thick Toe">
+ Bred snude
+ </string>
+ <string name="Thickness">
+ Tykkelse
+ </string>
+ <string name="Thin">
+ Tynd
+ </string>
+ <string name="Thin Eyebrows">
+ Tynde øjenbryn
+ </string>
+ <string name="Thin Lips">
+ Tynde læber
+ </string>
+ <string name="Thin Nose">
+ Tynd næse
+ </string>
+ <string name="Tight Chin">
+ Stram hage
+ </string>
+ <string name="Tight Cuffs">
+ Smalle bukseben
+ </string>
+ <string name="Tight Pants">
+ Stramme bukser
+ </string>
+ <string name="Tight Shirt">
+ Stram trøje
+ </string>
+ <string name="Tight Skirt">
+ Stram nederdel
+ </string>
+ <string name="Tight Sleeves">
+ Stramme ærmer
+ </string>
+ <string name="Tilt Left">
+ Hæld til venstre
+ </string>
+ <string name="Tilt Right">
+ Hæld til højre
+ </string>
+ <string name="Toe Shape">
+ Sko form
+ </string>
+ <string name="Toe Thickness">
+ Tykkelse af snud
+ </string>
+ <string name="Torso Length">
+ Overkrop - længde
+ </string>
+ <string name="Torso Muscles">
+ Overkrop - muskler
+ </string>
+ <string name="Torso Scrawny">
+ Overkrop - mager
+ </string>
+ <string name="Unattached">
+ Ikke vedhæftet
+ </string>
+ <string name="Uncreased">
+ Glat
+ </string>
+ <string name="Underbite">
+ Underbid
+ </string>
+ <string name="Unnatural">
+ Unaturlig
+ </string>
+ <string name="Upper Bridge">
+ Øverste næseryg
+ </string>
+ <string name="Upper Cheeks">
+ Øvre kinder
+ </string>
+ <string name="Upper Chin Cleft">
+ Øvre hagekløft
+ </string>
+ <string name="Upper Eyelid Fold">
+ Øvre øjenlåg
+ </string>
+ <string name="Upturned">
+ Opadvendt
+ </string>
+ <string name="Very Red">
+ Meget rød
+ </string>
+ <string name="Waist Height">
+ Talje højde
+ </string>
+ <string name="Well-Fed">
+ Velnæret
+ </string>
+ <string name="White Hair">
+ Hvidt hår
+ </string>
+ <string name="Wide">
+ Bred
+ </string>
+ <string name="Wide Back">
+ Bredt
+ </string>
+ <string name="Wide Front">
+ Bredt
+ </string>
+ <string name="Wide Lips">
+ Brede læber
+ </string>
+ <string name="Wild">
+ Vildt
+ </string>
+ <string name="Wrinkles">
+ Rynker
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Tilføj til mine landemærker
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Rediger mit landemærke
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ Se yderligere information om nuværende lokation
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Min lokationshistorik
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] Opdatér
+ </string>
+ <string name="UpdaterNowUpdating">
+ Opdaterer nu [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ Installerer [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Din [APP_NAME] klient bliver opdateret til nyeste version. Dette kan tage noget tid, så venligst vær tålmodig.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Download færdig...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Downloader opdatering
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Download af opdatering fejlede
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ Der opstod en fejl ved opdatering af [APP_NAME]. Hent venligst den nyeste version fra www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Installation af opdatering fejlede
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Opstart af klient fejlede
+ </string>
+ <string name="IM_logging_string">
+ -- Logning af IM aktiveret --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] skriver...
+ </string>
+ <string name="Unnamed">
+ (Uden navn)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Modereret: Stemmer deaktiveret)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Tekst chat er ikke tilgængelig i denne samtale.
+ </string>
+ <string name="IM_muted_text_label">
+ Din tekst chat er blevet deaktiveret af en gruppe moderator.
+ </string>
+ <string name="IM_default_text_label">
+ Klik her for privat besked (IM).
+ </string>
+ <string name="IM_to_label">
+ Til
+ </string>
+ <string name="IM_moderator_label">
+ (Moderator)
+ </string>
+ <string name="only_user_message">
+ Du er den eneste deltager i denne samtale
+ </string>
+ <string name="offline_message">
+ [FIRST] [LAST] er ikke logget på.
+ </string>
+ <string name="invite_message">
+ Tryk på [BUTTON NAME] knappen for at acceptére/tilslutte til denne stemme chat.
+ </string>
+ <string name="muted_message">
+ Du har blokeret denne beboer. Hvis du starter en samtale vil denne blokering automatisk blive fjernet.
+ </string>
+ <string name="generic_request_error">
+ Kunne ikke etablere forbindelse, prøv igen senere
+ </string>
+ <string name="insufficient_perms_error">
+ Du har ikke de fornødne rettigheder.
+ </string>
+ <string name="session_does_not_exist_error">
+ Denne samtale er lukket ned
+ </string>
+ <string name="no_ability_error">
+ Du har ikke den mulighed.
+ </string>
+ <string name="no_ability">
+ Du har ikke den mulighed.
+ </string>
+ <string name="not_a_mod_error">
+ Du er ikke moderator for denne samtale.
+ </string>
+ <string name="muted_error">
+ Du er blevet "blokeret".
+ </string>
+ <string name="add_session_event">
+ Ikke muligt at tilføge brugere til samtale med [RECIPIENT].
+ </string>
+ <string name="message_session_event">
+ Ikke muligt at sende din besked til samtalen med [RECIPIENT].
+ </string>
+ <string name="removed_from_group">
+ Du er blevet fjernet fra gruppen.
+ </string>
+ <string name="close_on_no_ability">
+ Du har ikke længere mulighed for at deltage i samtalen
+ </string>
+</strings>
diff --git a/indra/newview/skins/default/xui/da/teleport_strings.xml b/indra/newview/skins/default/xui/da/teleport_strings.xml index cc75abbb26..680806c8ac 100644 --- a/indra/newview/skins/default/xui/da/teleport_strings.xml +++ b/indra/newview/skins/default/xui/da/teleport_strings.xml @@ -1,81 +1,79 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<teleport_messages> - <message_set name="errors"> - <message name="invalid_tport"> - Der er problemer med at håndtere din teleport. Det kan være nødvendigt at logge ud og ind for at kunne skifte teleportere. -Hvis du bliver ved med at have problemet kan du checke teknisk support på: -www.secondlife.com/support - </message> - <message name="invalid_region_handoff"> - Problem registreret i forbindelse med skift til ny region. Det kan være nødvendigt at logge ud og ind for at kunne skifte regioner. -Hvis du bliver ved med at have problemet kan du checke teknisk support på: -www.secondlife.com/support - </message> - <message name="blocked_tport"> - Beklager, teleport er blokeret lige nu. Prøv igen senere. -Hvis du stadig ikke kan teleporte, prøv venligst at logge ud og ligge ind for at løse dette problem. - </message> - <message name="nolandmark_tport"> - Beklager, systemet kunne ikke finde landmærke destinationen. - </message> - <message name="timeout_tport"> - Beklager, systemet kunne ikke fuldføre teleport forbindelse. -Prøv igen om lidt. - </message> - <message name="noaccess_tport"> - Beklager, du har ikke adgang til denne teleport destination. - </message> - <message name="missing_attach_tport"> - Dine vedhæng er ikke ankommet endnu. Prøv at vente lidt endnu eller log ud og ind igen før du prøver at teleporte igen. - </message> - <message name="too_many_uploads_tport"> - Tekniske problemer hindrer at din teleport kan gennemføres. -Prøv venligst igen om lidt eller vælg et mindre travlt område. - </message> - <message name="expired_tport"> - Beklager, men systemet kunne ikke fuldføre din teleport i rimelig tid. Prøv venligst igen om lidt. - </message> - <message name="expired_region_handoff"> - Beklager, men systemet kunne ikke fuldføre skift til anden region i rimelig tid. Prøv venligst igen om lidt. - </message> - <message name="no_host"> - Ikke muligt at fine teleport destination. Destinationen kan være midlertidig utilgængelig eller findes ikke mere. -Prøv evt. igen om lidt. - </message> - <message name="no_inventory_host"> - Beholdningssystemet er ikke tilgængelig lige nu. - </message> - </message_set> - <message_set name="progress"> - <message name="sending_dest"> - Sender til destination. - </message> - <message name="redirecting"> - Omdirigerer til en anden lokation. - </message> - <message name="relaying"> - Overfører til destination. - </message> - <message name="sending_home"> - Sender forespørgsel på hjem-position. - </message> - <message name="sending_landmark"> - Semder anmodning om landmærke. - </message> - <message name="completing"> - Fuldfører teleport. - </message> - <message name="resolving"> - Finder destination. - </message> - <message name="contacting"> - Kontakter ny region. - </message> - <message name="arriving"> - Ankommer... - </message> - <message name="requesting"> - Anmoder om teleport... - </message> - </message_set> -</teleport_messages> +<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<teleport_messages>
+ <message_set name="errors">
+ <message name="invalid_tport">
+ Der er problemer med at håndtere din teleport. Det kan være nødvendigt at logge ud og ind for at kunne skifte teleportere.
+Hvis du bliver ved med at have problemet kan du checke teknisk support på: [SUPPORT_SITE].
+ </message>
+ <message name="invalid_region_handoff">
+ Problem registreret i forbindelse med skift til ny region. Det kan være nødvendigt at logge ud og ind for at kunne skifte regioner.
+Hvis du bliver ved med at have problemet kan du checke teknisk support på: [SUPPORT_SITE].
+ </message>
+ <message name="blocked_tport">
+ Beklager, teleport er blokeret lige nu. Prøv igen senere.
+Hvis du stadig ikke kan teleporte, prøv venligst at logge ud og ligge ind for at løse dette problem.
+ </message>
+ <message name="nolandmark_tport">
+ Beklager, systemet kunne ikke finde landmærke destinationen.
+ </message>
+ <message name="timeout_tport">
+ Beklager, systemet kunne ikke fuldføre teleport forbindelse.
+Prøv igen om lidt.
+ </message>
+ <message name="noaccess_tport">
+ Beklager, du har ikke adgang til denne teleport destination.
+ </message>
+ <message name="missing_attach_tport">
+ Dine vedhæng er ikke ankommet endnu. Prøv at vente lidt endnu eller log ud og ind igen før du prøver at teleporte igen.
+ </message>
+ <message name="too_many_uploads_tport">
+ Tekniske problemer hindrer at din teleport kan gennemføres.
+Prøv venligst igen om lidt eller vælg et mindre travlt område.
+ </message>
+ <message name="expired_tport">
+ Beklager, men systemet kunne ikke fuldføre din teleport i rimelig tid. Prøv venligst igen om lidt.
+ </message>
+ <message name="expired_region_handoff">
+ Beklager, men systemet kunne ikke fuldføre skift til anden region i rimelig tid. Prøv venligst igen om lidt.
+ </message>
+ <message name="no_host">
+ Ikke muligt at fine teleport destination. Destinationen kan være midlertidig utilgængelig eller findes ikke mere.
+Prøv evt. igen om lidt.
+ </message>
+ <message name="no_inventory_host">
+ Beholdningssystemet er ikke tilgængelig lige nu.
+ </message>
+ </message_set>
+ <message_set name="progress">
+ <message name="sending_dest">
+ Sender til destination.
+ </message>
+ <message name="redirecting">
+ Omdirigerer til en anden lokation.
+ </message>
+ <message name="relaying">
+ Overfører til destination.
+ </message>
+ <message name="sending_home">
+ Sender forespørgsel på hjem-position.
+ </message>
+ <message name="sending_landmark">
+ Semder anmodning om landmærke.
+ </message>
+ <message name="completing">
+ Fuldfører teleport.
+ </message>
+ <message name="resolving">
+ Finder destination.
+ </message>
+ <message name="contacting">
+ Kontakter ny region.
+ </message>
+ <message name="arriving">
+ Ankommer...
+ </message>
+ <message name="requesting">
+ Anmoder om teleport...
+ </message>
+ </message_set>
+</teleport_messages>
diff --git a/indra/newview/skins/default/xui/en/floater_aaa.xml b/indra/newview/skins/default/xui/en/floater_aaa.xml index 0c64408b50..6ecdd76573 100644 --- a/indra/newview/skins/default/xui/en/floater_aaa.xml +++ b/indra/newview/skins/default/xui/en/floater_aaa.xml @@ -1,10 +1,53 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater - height="768" + legacy_header_height="18" + can_minimize="false" + can_tear_off="false" + can_resize="true" + can_drag_on_left="false" + can_close="true" + can_dock="true" + bevel_style="in" + height="300" layout="topleft" - name="floater_aaa" - can_resize="true" - width="1024"> - <string name="Nudge Parabuild">4</string> - <panel filename="main_view.xml" follows="all" width="1024" height="768" top="0"/> + name="Test Floater" + save_rect="true" + title="TEST FLOATER" + save_dock_state="true" + save_visibility="true" + single_instance="true" + width="320"> + <chat_history + allow_html="true" + bg_readonly_color="ChatHistoryBgColor" + bg_writeable_color="ChatHistoryBgColor" + border_visible="false" + follows="all" + font="SansSerif" + left="1" + top="20" + layout="topleft" + height="260" + name="chat_history" + parse_highlights="true" + text_color="ChatHistoryTextColor" + text_readonly_color="ChatHistoryTextColor" + width="320"> +Really long line that is long enough to wrap once with jyg descenders. +Really long line that is long enough to wrap once with jyg descenders. +Really long line that is long enough to wrap once with jyg descenders. +Really long line that is long enough to wrap once with jyg descenders. +Really long line that is long enough to wrap once with jyg descenders. +Really long line that is long enough to wrap once with jyg descenders. +Really long line that is long enough to wrap once with jyg descenders. +Really long line that is long enough to wrap once with jyg descenders. +Really long line that is long enough to wrap once with jyg descenders. +Really long line that is long enough to wrap once with jyg descenders. +Really long line that is long enough to wrap once with jyg descenders. +Really long line that is long enough to wrap once with jyg descenders. +Really long line that is long enough to wrap once with jyg descenders. +Really long line that is long enough to wrap once with jyg descenders. +Really long line that is long enough to wrap once with jyg descenders. +Really long line that is long enough to wrap once with jyg descenders. + </chat_history> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_animation_preview.xml b/indra/newview/skins/default/xui/en/floater_animation_preview.xml index bb45e51137..a8f875754e 100644 --- a/indra/newview/skins/default/xui/en/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_animation_preview.xml @@ -2,7 +2,7 @@ <floater legacy_header_height="18" can_minimize="false" - height="556" + height="610" layout="topleft" name="Animation Preview" help_topic="animation_preview" @@ -508,21 +508,21 @@ Maximum animation length is [MAX_LENGTH] seconds. We recommend BVH files exported from Poser 4. </text> <button - bottom="546" - follows="bottom|right" + top="580" + follows="bottom|left" height="23" - label="Cancel" + label="Upload (L$[AMOUNT])" layout="topleft" - name="cancel_btn" - right="265" - width="123" /> + left="10" + name="ok_btn" + width="128" /> <button + top="580" follows="bottom|left" height="23" - label="Upload (L$[AMOUNT])" + label="Cancel" layout="topleft" - left_delta="-129" - name="ok_btn" - top_delta="0" - width="123" /> + name="cancel_btn" + left="142" + width="128" /> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_help_browser.xml b/indra/newview/skins/default/xui/en/floater_help_browser.xml index f50ff01230..55a6179afb 100644 --- a/indra/newview/skins/default/xui/en/floater_help_browser.xml +++ b/indra/newview/skins/default/xui/en/floater_help_browser.xml @@ -43,6 +43,7 @@ left="0" name="browser" top="0" + start_url="data:text/html,%3Chtml%3E%3Cbody bgcolor=%22#2A2A2A%22%3E%3C/body%3E%3C/html%3E" width="570" /> <button follows="bottom|left" diff --git a/indra/newview/skins/default/xui/en/floater_im_container.xml b/indra/newview/skins/default/xui/en/floater_im_container.xml index cf6a4e45bd..cd297af99d 100644 --- a/indra/newview/skins/default/xui/en/floater_im_container.xml +++ b/indra/newview/skins/default/xui/en/floater_im_container.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<multi_floater
-background_visible="true"
-bg_color="yellow"
+ can_minimize="false"
can_resize="true"
height="390"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_inventory.xml b/indra/newview/skins/default/xui/en/floater_inventory.xml index dca1692e4a..ff9f0daee6 100644 --- a/indra/newview/skins/default/xui/en/floater_inventory.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory.xml @@ -11,7 +11,7 @@ help_topic="inventory" save_rect="true" save_visibility="true" - single_instance="true" + single_instance="false" title="INVENTORY" width="467"> <floater.string diff --git a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml index d8534bfe0b..0856049374 100644 --- a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml @@ -22,13 +22,15 @@ bg_readonly_color="ChatHistoryBgColor" bg_writeable_color="ChatHistoryBgColor" follows="all" - left="1" + left="5" top="20" layout="topleft" - height="280" + height="275" name="chat_history" parse_highlights="true" text_color="ChatHistoryTextColor" text_readonly_color="ChatHistoryTextColor" - width="320" /> + right_widget_pad="5" + left_widget_pad="0" + width="315" /> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml index d9498586af..d363452204 100644 --- a/indra/newview/skins/default/xui/en/floater_search.xml +++ b/indra/newview/skins/default/xui/en/floater_search.xml @@ -47,6 +47,7 @@ left="0" name="browser" top="0" + start_url="data:text/html,%3Chtml%3E%3Cbody bgcolor=%22#2A2A2A%22%3E%3C/body%3E%3C/html%3E" width="570" /> <text follows="bottom|left" diff --git a/indra/newview/skins/default/xui/en/floater_test_textbox.xml b/indra/newview/skins/default/xui/en/floater_test_textbox.xml index 3aeb7c93e7..033070607b 100644 --- a/indra/newview/skins/default/xui/en/floater_test_textbox.xml +++ b/indra/newview/skins/default/xui/en/floater_test_textbox.xml @@ -2,11 +2,11 @@ <floater legacy_header_height="18" can_resize="true" - height="450" + height="600" layout="topleft" name="floater_test_textbox" help_topic="floater_test_textbox" - width="600"> + width="800"> <text type="string" length="1" @@ -21,128 +21,218 @@ Third line of multiple lines Fourth line of multiple lines Fifth line of multiple lines </text> - <text - top_pad="10" - left="10" - right="-10" - height="20" - follows="top|left" - font.name="SansSerifSmall" - name="test_text10" - tool_tip="text"> - SansSerifSmall -The 华文细黑 brown fox ヒラキjumped over the lazy dog. - </text> - <text - top_pad="10" - left="10" - right="-10" - height="25" - follows="top|left" - font.name="SansSerifMedium" - name="test_text11" - tool_tip="text"> - SansSerif -The 华文细黑 brown fox ヒラキjumped over the lazy dog. - </text> - <text - top_pad="10" - left="10" - right="-10" - follows="top|left" - height="26" - font.name="SansSerifLarge" - name="test_text12" - tool_tip="text"> - SansSerifLarge -The 华文细黑 brown fox ヒラキjumped over the lazy dog. - </text> - <text - top_pad="10" - left="10" - height="35" - right="-10" - follows="top|left" - font.name="SansSerifHuge" - name="test_text13" - tool_tip="text"> - SansSerifHuge -The 华文细黑 brown fox ヒラキjumped over the lazy dog. - </text> - <text - type="string" - length="1" - font="SansSerif" - font.style="BOLD" - height="10" - layout="topleft" - left_delta="0" - top_pad="40" - width="300"> - SansSerif BOLD - </text> - <text - type="string" - length="1" - font="SansSerif" - font.style="BOLD|UNDERLINE" - height="10" - layout="topleft" - left_delta="0" - top_pad="10" - width="300"> - SansSerif BOLD UNDERLINE - </text> - <text - type="string" - length="1" - bottom="390" - label="N" + + <text + font="SansSerif" + font.style="BOLD" + height="10" layout="topleft" - left="10" - name="right_aligned_text" - width="380" - halign="right" - top_pad="10"> + left_delta="0" + top_pad="40" + width="300"> + SansSerif BOLD + </text> + <text + font="SansSerif" + font.style="BOLD|UNDERLINE" + height="10" + layout="topleft" + left_delta="0" + top_pad="10" + width="300"> + SansSerif BOLD UNDERLINE + </text> + <text + bottom="390" + left="10" + name="right_aligned_text" + width="300" + halign="right" + top_pad="10"> Right aligned text </text> <text - type="string" - length="1" bottom="390" - label="N" - layout="topleft" left="10" name="centered_text" - width="380" + width="300" halign="center" top_pad="10"> Centered text </text> <text - type="string" - length="1" - height="60" - label="N" - layout="topleft" left="10" name="left_aligned_text" - width="380" + width="300" halign="left" top_pad="10"> Left aligned text </text> <text - type="string" - length="1" - bottom="390" - label="N" - layout="topleft" + left="10" + name="v_pad_text" + height="40" + width="300" + halign="left" + top_pad="10" + v_pad="10"> + v_pad = 10, height = 40 + </text> + <text + left="10" + name="v_pad_text" + height="40" + width="300" + halign="left" + top_pad="10" + h_pad="30"> + h_pad = 30, height = 40 + </text> + <text + top_pad="10" + left="10" + right="-10" + height="20" + follows="top|left" + font.name="SansSerifSmall" + name="test_text10" + tool_tip="text"> + SansSerifSmall + The 华文细黑 brown fox ヒラキjumped over the lazy dog. + </text> + <text + top_pad="10" + left="10" + right="-10" + height="25" + follows="top|left" + font.name="SansSerifMedium" + name="test_text11" + tool_tip="text"> + SansSerif + The 华文细黑 brown fox ヒラキjumped over the lazy dog. + </text> + <text + top_pad="10" left="10" - name="floater_map_north" - right="30" - top="370"> - N + right="-10" + follows="top|left" + height="26" + font.name="SansSerifLarge" + name="test_text12" + tool_tip="text"> + SansSerifLarge + The 华文细黑 brown fox ヒラキjumped over the lazy dog. </text> + <text + top_pad="10" + left="10" + height="35" + right="-10" + follows="top|left" + font.name="SansSerifHuge" + name="test_text13" + tool_tip="text"> + SansSerifHuge + The 华文细黑 brown fox ヒラキjumped over the lazy dog. + </text> + +<!-- next column --> + <text_editor + height="50" + follows="top|left|bottom" + left="400" + name="test_text_editor" + tool_tip="text editor" + top="25" + width="200"> + Text Editor + </text_editor> + <text_editor + height="50" + follows="top|left|bottom" + left_delta="0" + name="long_text_editor" + tool_tip="text editor" + top_pad="10" + width="200"> +Text Editor +with multiple +lines of text +and hence a +scroll bar + </text_editor> + <text_editor + height="50" + follows="top|left|bottom" + left_delta="0" + max_length="65536" + name="blob_text_editor" + tool_tip="text editor" + top_pad="10" + width="200" + word_wrap="true"> +Second Life is brought to you by 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 and many others. + </text_editor> + <text_editor + height="50" + follows="top|left|bottom" + font="Monospace" + left_delta="0" + name="monospace_text_editor" + tool_tip="text editor" + top_pad="10" + width="200"> +Text Editor +with multiple +lines of text +and hence a +scroll bar gjyrrr + </text_editor> + <text_editor + border_visible="true" + height="50" + follows="top|left|bottom" + font="Monospace" + left_delta="0" + name="monospace_text_editor" + tool_tip="text editor" + top_pad="10" + width="200"> +Text Editor +with multiple +lines of text +and hence a +scroll bar gjyrrr + </text_editor> + <text_editor + height="50" + follows="top|left|bottom" + font="SansSerif" + left_delta="0" + name="sansserif_text_editor" + tool_tip="text editor" + top_pad="10" + width="200"> +Text Editor +with multiple +lines of text +and hence a +scroll bar gjyrrr + </text_editor> + <text + height="40" + follows="top|left|bottom" + layout="topleft" + name="test_text_box" + tool_tip="text box" + top_pad="5" + width="200"> +Text box +with +multiple lines +and too many lines +to actually fit + </text> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index 636e9d465a..e3851de8e7 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -303,7 +303,7 @@ name="checkbox snap to grid" width="134" /> <combo_box - height="19" + height="23" layout="topleft" follows="left|top" name="combobox grid mode" @@ -2338,16 +2338,16 @@ even though the user gets a free copy. left="10" name="tex gen" top_pad="5" - width="87"> + width="85"> Mapping </text> <combo_box - height="22" + height="23" layout="topleft" left_delta="0" name="combobox texgen" top_pad="4" - width="60"> + width="85"> <combo_box.item label="Default" name="Default" @@ -2364,18 +2364,18 @@ even though the user gets a free copy. height="10" layout="topleft" name="label shininess" - left_pad="5" + left_pad="4" top_pad="-36" - width="60"> + width="85"> Shininess </text> <combo_box - height="22" + height="23" layout="topleft" left_delta="0" name="combobox shininess" top_pad="4" - width="60"> + width="85"> <combo_box.item label="None" name="None" @@ -2399,19 +2399,19 @@ even though the user gets a free copy. follows="left|top" height="10" layout="topleft" - left_pad="5" + left_pad="4" name="label bumpiness" top_pad="-36" - width="87"> + width="85"> Bumpiness </text> <combo_box - height="22" + height="23" layout="topleft" left_delta="0" name="combobox bumpiness" top_pad="4" - width="87"> + width="85"> <combo_box.item label="None" name="None" @@ -2604,7 +2604,7 @@ even though the user gets a free copy. width="170" /> <button follows="left|top" - height="19" + height="23" label="Apply" label_selected="Apply" layout="topleft" @@ -2739,13 +2739,14 @@ even though the user gets a free copy. decouple_texture_size="true" /> <button follows="left|top" - height="19" + height="23" label="Align" label_selected="Align Media" layout="topleft" left="10" name="button align" top_pad="5" + tool_tip="Align media texture (must load first)" width="100" /> </panel> </panel> @@ -2780,7 +2781,7 @@ even though the user gets a free copy. width="130" /> <panel_inventory_object follows="left|top" - height="210" + height="325" layout="topleft" left="10" name="contents_inventory" diff --git a/indra/newview/skins/default/xui/en/floater_voice_controls.xml b/indra/newview/skins/default/xui/en/floater_voice_controls.xml index 4434fe7403..1ebc51f504 100644 --- a/indra/newview/skins/default/xui/en/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml @@ -1,39 +1,62 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater can_resize="true" - height="300" + height="270" layout="topleft" + min_height="146" + min_width="190" name="floater_voice_controls" title="Voice Controls" save_visibility="true" single_instance="true" width="282"> + <string + name="title_nearby"> + NEARBY VOICE + </string> + <string + name="title_group"> + Group Call with [GROUP] + </string> + <string + name="title_adhoc"> + Conference Call + </string> + <string + name="title_peer_2_peer"> + Call with [NAME] + </string> + <string + name="no_one_near"> + No one near + </string> <panel bevel_style="in" follows="left|right|top" - height="73" + height="62" layout="topleft" left="0" name="control_panel" - width="285"> + width="282"> <panel - height="20" + height="18" + follows="top|left|right" layout="topleft" left="10" name="my_panel" - width="262"> + width="263"> <avatar_icon enabled="false" follows="left|top" height="18" - image_name="Generic_Person" + default_icon_name="Generic_Person" layout="topleft" left="0" name="user_icon" top="0" width="18" /> <text - follows="top|left" + follows="top|left|right" font="SansSerifSmallBold" height="16" layout="topleft" @@ -41,10 +64,23 @@ name="user_text" text_color="white" top="4" + use_ellipses="true" value="Mya Avatar:" - width="80" /> + width="210" /> + <output_monitor + auto_update="true" + draw_border="false" + follows="right" + height="16" + layout="topleft" + name="speaking_indicator" + right="-1" + top="2" + visible="true" + width="20" /> </panel> <layout_stack + animate="false" bottom="10" clip="false" follows="left|right|top" @@ -53,9 +89,11 @@ orientation="horizontal" width="262"> <layout_panel + auto_resize="false" follows="left" layout="topleft" min_width="24" + name="microphone_icon_panel" top="0" user_resize="false" width="24"> @@ -69,9 +107,10 @@ </layout_panel> <layout_panel layout="topleft" + name="volume_slider_panel" top="0" user_resize="false" - width="258"> + width="138"> <slider_bar control_name="AudioLevelMic" follows="left|right|top" @@ -84,7 +123,25 @@ tool_tip="Master Volume" top="0" value="0.75" - width="258" /> + width="138" /> + </layout_panel> + <layout_panel + auto_resize="false" + layout="topleft" + min_width="100" + name="leave_btn_panel" + top="0" + user_resize="false" + visible="false" + width="100"> + <button + follows="left|right|top" + height="24" + label="Leave Call" + left="0" + name="leave_call_btn" + top="0" + width="100" /> </layout_panel> </layout_stack> </panel> @@ -97,4 +154,13 @@ multi_select="true" name="speakers_list" width="282" /> + <panel + filename="panel_avatar_list_item.xml" + follows="left|right|top" + height="24" + layout="topleft" + left="0" + name="non_avatar_caller" + top="70" + width="282" /> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml index e3db0972ec..c0eca91a46 100644 --- a/indra/newview/skins/default/xui/en/floater_world_map.xml +++ b/indra/newview/skins/default/xui/en/floater_world_map.xml @@ -4,7 +4,7 @@ can_resize="true" center_horiz="true" center_vert="true" - height="600" + height="535" layout="topleft" min_height="520" min_width="520" @@ -17,388 +17,493 @@ width="800"> <panel filename="panel_world_map.xml" - follows="left|top|right|bottom" - height="565" + follows="all" + height="500" layout="topleft" - left="15" + left="10" name="objects_mapview" top="25" width="542" /> - <icon - follows="top|right" - height="16" - image_name="map_avatar_16.tga" - layout="topleft" - left="-230" - mouse_opaque="true" - name="self" - top="34" - width="16" /> + <panel + name="layout_panel_1" + height="22" + width="238" + follows="right|top" + top="25" + left_pad="5" + background_visible="true" + bg_alpha_color="DkGray2"> <text + text_color="White" + font="SansSerifLarge" type="string" length="1" follows="top|right" + halign="left" height="16" layout="topleft" - left_pad="4" - name="you_label" - top_delta="0" - width="145"> - You + left="15" + name="events_label" + top="3" + width="215"> + Legend </text> - <icon - follows="top|right" - height="16" - image_name="map_home.tga" + </panel> +<panel + follows="right|top" + height="126" + top_pad="0" + width="238"> +<button + follows="right|top" + height="22" + image_overlay="map_avatar_16.tga" + scale_image="true" + left="4" layout="topleft" - left_delta="50" - mouse_opaque="true" - name="home" - top_delta="0" - width="16" /> - <text + name="Show My Location" + tool_tip="Center map on your avatar's location" + top="6" + width="24" > + <button.commit_callback + function="WMap.ShowAgent" /> + </button> + <text type="string" length="1" follows="top|right" - height="16" + halign="left" + height="13" + top_delta="6" + left_pad="5" layout="topleft" - left_pad="4" - name="home_label" - top_delta="0" - width="145"> - Home + name="person_label" + width="90"> + Me </text> - <icon - color="0.5 0.25 1 1" + <check_box + control_name="MapShowPeople" follows="top|right" height="16" - image_name="legend.tga" layout="topleft" - left="-230" + left="3" + name="people_chk" + top_pad="9" + width="22" /> + <icon + color="0 1 0 1" + follows="top|right" + height="8" + image_name="map_avatar_8.tga" + layout="topleft" + left_pad="3" mouse_opaque="true" - name="square2" - top="54" - width="16" /> - <text + name="person" + top_delta="3" + width="8" /> + <text type="string" length="1" follows="top|right" + halign="left" height="16" + top_delta="-2" + left_pad="7" layout="topleft" - left_pad="4" - name="auction_label" - top_delta="0" - width="145"> - Auction + name="person_label" + width="90"> + Person </text> - <icon - color="1 1 0.25 1" + <check_box + control_name="MapShowInfohubs" follows="top|right" height="16" - image_name="legend.tga" layout="topleft" - left_delta="50" + left="3" + name="infohub_chk" + top_pad="3" + width="22" /> + <icon + follows="top|right" + height="16" + image_name="map_infohub.tga" + layout="topleft" + left_pad="0" mouse_opaque="true" - name="square" + name="infohub" top_delta="0" width="16" /> - <text + <text type="string" length="1" follows="top|right" + halign="left" height="16" + top_delta="2" + left_pad="3" layout="topleft" - left_pad="4" - name="land_for_sale_label" - top_delta="0" - width="145"> - Land For Sale + name="infohub_label" + width="90"> + Infohub </text> - <button + <check_box + control_name="MapShowLandForSale" follows="top|right" height="16" - label="Go Home" - label_selected="Go Home" layout="topleft" - left="-90" - name="Go Home" - tool_tip="Teleport to your home" - top="34" - width="88" > - <button.commit_callback - function="WMap.GoHome" /> - </button> + left="3" + name="land_for_sale_chk" + top_pad="2" + width="22" /> <icon - color="0 1 0 1" follows="top|right" - height="8" - image_name="map_avatar_8.tga" + height="16" + image_name="icon_for_sale.tga" layout="topleft" - left="-226" mouse_opaque="true" - name="person" - top="84" - width="8" /> - <check_box - control_name="MapShowPeople" + name="landforsale" + top_delta="0" + left_pad="0" + width="16" /> + <text + type="string" + length="1" follows="top|right" + halign="left" height="16" - label="Resident" + top_delta="2" + left_pad="3" layout="topleft" - left_pad="8" - name="people_chk" - top_delta="-4" - width="110" /> + name="land_sale_label" + width="90"> + Land Sale + </text> <icon + color="1 1 0.25 1" follows="top|right" height="16" - image_name="map_infohub.tga" + image_name="legend.tga" layout="topleft" - left="-230" mouse_opaque="true" - name="infohub" - top="100" + name="square2" + left="41" + top_pad="-2" width="16" /> - <check_box - control_name="MapShowInfohubs" + <text + type="string" + length="1" follows="top|right" height="16" - label="Infohub" layout="topleft" - left_pad="4" - name="infohub_chk" - top_delta="0" - width="110" /> - <icon + left_pad="0" + name="auction_label" + top_delta="3" + width="100"> + by owner + </text> + <icon + color="0.5 0.25 1 1" follows="top|right" height="16" - image_name="map_telehub.tga" + image_name="legend.tga" layout="topleft" - left="-230" mouse_opaque="true" - name="telehub" - top="120" + name="square2" + left="41" + top_pad="-3" width="16" /> - <check_box - control_name="MapShowTelehubs" + <text + type="string" + length="1" follows="top|right" height="16" - label="Telehub" layout="topleft" - left_pad="4" - name="telehub_chk" - top_delta="0" - width="110" /> - <icon + left_pad="0" + name="auction_label" + top_delta="3" + width="170"> + land auction + </text> + + <button follows="top|right" - height="16" - image_name="icon_for_sale.tga" + height="22" + image_overlay="map_home.tga" + scale_image="true" + label_color="White" layout="topleft" - left="-230" - mouse_opaque="true" - name="landforsale" - top="140" - width="16" /> - <check_box - control_name="MapShowLandForSale" + left="136" + top="6" + name="Go Home" + tool_tip="Teleport home" + width="24" > + <button.commit_callback + function="WMap.GoHome" /> + </button> + <text + type="string" + length="1" follows="top|right" - height="16" - label="Land for Sale" + halign="left" + height="13" + top_delta="6" + left_pad="5" layout="topleft" - left_pad="4" - name="land_for_sale_chk" - top_delta="0" - width="110" /> + name="Home_label" + width="70"> + Home + </text> <text type="string" length="1" follows="top|right" + halign="left" height="16" layout="topleft" - left="-104" + left="137" name="events_label" - top="80" - width="145"> + top_pad="9" + width="66"> Events: </text> - <icon + + <check_box + control_name="MapShowEvents" + follows="top|right" + height="16" + layout="topleft" + left="135" + top_pad="1" + name="event_chk" + width="22" /> + <icon follows="top|right" height="16" image_name="map_event.tga" layout="topleft" - left="-92" mouse_opaque="true" name="event" - top="100" + left_pad="0" width="16" /> + <text + type="string" + length="1" + follows="top|right" + halign="left" + height="16" + top_delta="2" + left_pad="3" + layout="topleft" + name="pg_label" + width="60"> + PG + </text> + <check_box - control_name="MapShowEvents" + control_name="ShowMatureEvents" follows="top|right" height="16" - label="PG" + initial_value="true" layout="topleft" - left_pad="4" - name="event_chk" - top_delta="0" - width="55" /> + left="135" + name="event_mature_chk" + top_pad="3" + width="22" /> <icon follows="top|right" height="16" image_name="map_event_mature.tga" layout="topleft" - left="-92" mouse_opaque="true" name="events_mature_icon" - top="120" + top_delta="0" + left_pad="0" width="16" /> + <text + type="string" + length="1" + follows="top|right" + halign="left" + height="16" + top_delta="2" + left_pad="3" + layout="topleft" + name="mature_label" + width="66"> + Mature + </text> + <check_box - control_name="ShowMatureEvents" + control_name="ShowAdultEvents" follows="top|right" height="16" - initial_value="true" - label="Mature" layout="topleft" - left_pad="4" - name="event_mature_chk" - top_delta="0" - width="55" /> + left="135" + name="event_adult_chk" + top_pad="3" + width="22" /> <icon follows="top|right" height="16" image_name="map_event_adult.tga" layout="topleft" - left="-92" + left_pad="0" mouse_opaque="true" name="events_adult_icon" - top="140" + top_delta="0" width="16" /> - <check_box - control_name="ShowAdultEvents" + <text + type="string" + length="1" follows="top|right" + halign="left" height="16" - label="Adult" + top_delta="2" + left_pad="3" layout="topleft" - left_pad="4" - name="event_adult_chk" - top_delta="0" - width="55" /> - <icon + name="pg_label" + width="66"> + Adult + </text> +</panel> + + + <panel + follows="right|top" + height="22" + top_pad="0" + width="238" + background_visible="true" + bg_alpha_color="DkGray2"> + <text + text_color="White" + font="SansSerifLarge" + type="string" + length="1" + follows="top|right" + halign="left" + height="16" + layout="topleft" + left="15" + name="find_on_map_label" + top="3" + width="215"> + Find on Map + </text> + </panel> + + <panel + follows="right|top|bottom" + height="270" + top_pad="0" + width="238"> + <icon color="0.5 0 0 1" follows="top|right" height="16" image_name="map_track_16.tga" layout="topleft" - left="-230" + left="5" + top="11" mouse_opaque="true" - name="avatar_icon" - top="164" + name="friends_icon" width="16" /> <combo_box allow_text_entry="true" follows="top|right" - height="20" + height="23" label="Online Friends" layout="topleft" - left_pad="4" + top_delta="-4" + left_pad="5" max_chars="60" name="friend combo" - tool_tip="Friend to show on map" - top_delta="-4" - width="202"> + tool_tip="Show friends on map" + width="182"> <combo_box.item - label="Online Friends" + label="My Friends Online" name="item1" value="None" /> <combo_box.commit_callback function="WMap.AvatarCombo"/> </combo_box> - <icon + <icon color="0.5 0 0 1" follows="top|right" height="16" image_name="map_track_16.tga" layout="topleft" - left="-230" + left="5" + top_pad="8" mouse_opaque="true" name="landmark_icon" - top="189" width="16" /> <combo_box allow_text_entry="true" follows="top|right" - height="20" - label="Landmarks" + height="23" + label="My Landmarks" layout="topleft" - left_pad="4" + top_delta="-3" + left_pad="5" max_chars="64" name="landmark combo" tool_tip="Landmark to show on map" - top_delta="-4" - width="202"> + width="182"> <combo_box.item - label="Landmarks" + label="My Landmarks" name="item1" value="None" /> <combo_box.commit_callback function="WMap.Landmark"/> </combo_box> - <icon + <icon color="0.5 0 0 1" follows="top|right" height="16" image_name="map_track_16.tga" layout="topleft" - left="-230" + left="5" + top_pad="7" mouse_opaque="true" - name="location_icon" - top="214" + name="region_icon" width="16" /> - <line_editor + <search_editor follows="top|right" - height="20" - label="Search by Region Name" + search_button_visible="false" + height="22" + text_readonly_color="DkGray" + label="Regions by Name" layout="topleft" - left_pad="4" + top_delta="-2" + left_pad="5" name="location" select_on_focus="true" tool_tip="Type the name of a region" - top_delta="-4" - width="140" /> - <button + width="152" /> + <button follows="top|right" - height="20" - label="Search" + height="23" + label="Find" layout="topleft" - left_pad="5" + left_pad="2" + top_delta="-1" name="DoSearch" tool_tip="Search for region" - top_delta="0" - width="60"> + width="58"> <button.commit_callback function="WMap.Location" /> - </button> - <text - type="string" - length="1" - follows="top|right" - font="SansSerif" - height="16" - layout="topleft" - left="-230" - name="search_label" - top="234" - width="222"> - Search Results: - </text> + </button> <scroll_list draw_stripes="false" - follows="top|right|bottom" - height="200" + bg_writeable_color="MouseGray" + follows="all" + height="115" layout="topleft" - left_delta="0" + left="28" name="search_results" - top_pad="10" - width="222" + top_pad="5" + width="209" sort_column="1"> <scroll_list.columns label="" @@ -407,35 +512,87 @@ <scroll_list.columns label="" name="sim_name" - width="206" /> + width="193" /> <scroll_list.commit_callback function="WMap.SearchResult" /> </scroll_list> - <text + <button + follows="right|bottom" + height="23" + label="Teleport" + layout="topleft" + left="25" + name="Teleport" + tool_tip="Teleport to selected location" + top_pad="7" + width="104"> + <button.commit_callback + function="WMap.Teleport" /> + </button> + <button + follows="right|bottom" + height="23" + label="Copy SLurl" + layout="topleft" + left_pad="5" + name="copy_slurl" + tool_tip="Copies current location as SLurl to be used on the web." + top_delta="0" + width="104"> + <button.commit_callback + function="WMap.CopySLURL" /> + </button> + <!-- <button + follows="right|bottom" + height="23" + label="Clear" + layout="topleft" + left="10" + name="Clear" + tool_tip="Stop tracking" + top_pad="5" + width="105"> + <button.commit_callback + function="WMap.Clear" /> + </button>--> + <button + enabled="false" + follows="right|bottom" + height="23" + label="Show Selection" + left="25" + top_pad="5" + name="Show Destination" + tool_tip="Center map on selected location" + width="213"> + <button.commit_callback + function="WMap.ShowTarget" /> + </button> + +<!-- <text type="string" length="1" follows="bottom|right" - font="SansSerif" + halign="left" height="16" - layout="topleft" - left_delta="0" - name="location_label" top_pad="4" - width="98"> + left="25" + layout="topleft" + name="land_sale_label" + width="250"> Location: </text> - <spinner + <spinner decimal_digits="0" follows="bottom|right" - height="16" increment="1" initial_value="128" layout="topleft" - left_delta="70" + top_pad="0" + left="25" max_val="255" name="spin x" tool_tip="X coordinate of location to show on map" - top_delta="0" width="48"> <spinner.commit_callback function="WMap.CommitLocation" /> @@ -459,7 +616,6 @@ <spinner decimal_digits="0" follows="bottom|right" - height="16" increment="1" initial_value="0" layout="topleft" @@ -471,89 +627,58 @@ width="48"> <spinner.commit_callback function="WMap.CommitLocation" /> - </spinner> - <button - follows="right|bottom" - height="20" - label="Teleport" - label_selected="Teleport" - layout="topleft" - left="-230" - name="Teleport" - tool_tip="Teleport to selected location" - top="494" - width="90"> - <button.commit_callback - function="WMap.Teleport" /> - </button> - <button - follows="right|bottom" - height="20" - label="Show Destination" - label_selected="Show Destination" - layout="topleft" - left_pad="10" - name="Show Destination" - tool_tip="Center map on selected location" - top_delta="0" - width="125"> - <button.commit_callback - function="WMap.ShowTarget" /> - </button> - <button - follows="right|bottom" - height="20" - label="Clear" - label_selected="Clear" - layout="topleft" - left="-230" - name="Clear" - tool_tip="Stop tracking" - top="518" - width="90"> - <button.commit_callback - function="WMap.Clear" /> - </button> - <button - follows="right|bottom" - height="20" - label="Show My Location" - label_selected="Show My Location" + </spinner>--> + </panel> + <panel + follows="right|bottom" + height="22" + top_pad="0" + width="238" + background_visible="true" + bg_alpha_color="DkGray2"> + <text + text_color="White" + font="SansSerifLarge" + type="string" + length="1" + follows="top|right" + halign="left" + height="16" layout="topleft" - left_pad="10" - name="Show My Location" - tool_tip="Center map on your avatar's location" - top_delta="0" - width="125" > - <button.commit_callback - function="WMap.ShowAgent" /> - </button> - <button - enabled="false" - follows="bottom|right" - height="20" - label="Copy SLurl to clipboard" + left="15" + name="zoom_label" + top="3" + width="210"> + Zoom + </text> + </panel> + <panel + follows="right|bottom" + height="30" + min_height="30" + top_pad="0" + width="238"> + <icon + follows="left|bottom" + height="16" + image_name="Zoom_Off" layout="topleft" - left="-230" - name="copy_slurl" - tool_tip="Copies current location as SLurl to be used on the web." - top="542" - width="222"> - <button.commit_callback - function="WMap.CopySLURL" /> - </button> + left="20" + mouse_opaque="true" + name="zoom_icon" + top_pad="7" + width="16" /> <slider - follows="right|bottom" + follows="left|bottom" height="16" increment="0.2" - initial_value="48.5029" - label="Zoom" + initial_value="-2" + left_pad="0" layout="topleft" - left_delta="0" max_val="0" min_val="-8" name="zoom slider" show_text="false" - top_pad="8" - width="222" /> + width="200" /> + </panel> </floater> diff --git a/indra/newview/skins/default/xui/en/inspect_group.xml b/indra/newview/skins/default/xui/en/inspect_group.xml index f48af2f97e..3929e3277a 100644 --- a/indra/newview/skins/default/xui/en/inspect_group.xml +++ b/indra/newview/skins/default/xui/en/inspect_group.xml @@ -4,106 +4,100 @@ Single instance - only have one at a time, recycle it each spawn --> <floater - legacy_header_height="18" + legacy_header_height="25" bevel_style="in" bg_opaque_image="Inspector_Background" can_close="false" can_minimize="false" - height="138" + height="148" layout="topleft" name="inspect_group" single_instance="true" sound_flags="0" visible="true" - width="245"> + width="228"> <string name="PrivateGroup">Private group</string> <string name="FreeToJoin">Free to join</string> <string name="CostToJoin">L$[AMOUNT] to join</string> <string name="YouAreMember">You are a member</string> <text follows="all" - font="SansSerifLargeBold" - height="18" + font="SansSerifLarge" + height="16" left="8" name="group_name" - top="5" - text_color="white" + top="10" + text_color="White" use_ellipses="true" - width="240" + width="175" word_wrap="false"> Grumpity's Grumpy Group of Moose </text> <text follows="all" - font="SansSerifSmallBold" + font="SansSerifSmall" text_color="White" - height="18" + height="16" left="8" name="group_subtitle" use_ellipses="true" - top_pad="0" - width="170"> + width="175"> 123 members </text> <text follows="all" - height="50" + height="45" left="8" name="group_details" - top_pad="0" - width="170" + top_pad="6" + width="220" word_wrap="true"> A group of folks charged with creating a room with a moose. Fear the moose! Fear it! And the mongoose too! </text> <text follows="all" - height="15" + height="13" left="8" name="group_cost" - top_pad="2" - width="170"> + top_pad="3" + width="220"> L$123 to join </text> <icon follows="all" height="38" - right="-25" + right="-10" mouse_opaque="true" name="group_icon" - top="24" - width="38" /> - <!-- Must be tab_stop="true" so something can hold focus even when the - other buttons are disabled or invisible, otherwise inspector closes --> - <button - follows="top|left" - height="18" - image_disabled="ForwardArrow_Disabled" - image_selected="ForwardArrow_Press" - image_unselected="ForwardArrow_Off" - name="view_profile_btn" - right="-8" - top="35" - left_delta="110" - tab_stop="true" - width="18" - commit_callback.function="InspectGroup.ViewProfile" /> + top="10" + width="38" + bevel_style="in" /> <button follows="bottom|left" height="23" label="Join" left="8" - top="246" + top="266" name="join_btn" - width="100" + width="103" commit_callback.function="InspectGroup.Join"/> <button follows="bottom|left" height="23" label="Leave" left="8" - top="246" + top="266" name="leave_btn" - width="100" + width="103" commit_callback.function="InspectGroup.Leave"/> + <button + follows="bottom|left" + height="23" + label="View Profile" + name="view_profile_btn" + top="266" + left="117" + width="103" + commit_callback.function="InspectGroup.ViewProfile" /> </floater> diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml index 3bf7f50a2c..eee1134d15 100644 --- a/indra/newview/skins/default/xui/en/main_view.xml +++ b/indra/newview/skins/default/xui/en/main_view.xml @@ -48,7 +48,7 @@ height="500" layout="topleft" mouse_opaque="false" - name="main_view" + name="non_side_tray_view" user_resize="true" width="500"> <view bottom="500" @@ -104,19 +104,29 @@ min_width="333" mouse_opaque="false" name="side_tray_container" - user_resize="true" + user_resize="false" visible="false" width="333"/> </layout_stack> - <floater_view follows="all" + <panel follows="all" height="500" left="0" mouse_opaque="false" - name="Floater View" + name="floater_view_holder" tab_group="-1" tab_stop="false" top="0" - width="1024"/> + width="1024"> + <floater_view follows="all" + height="500" + left="0" + mouse_opaque="false" + name="Floater View" + tab_group="-1" + tab_stop="false" + top="0" + width="1024"/> + </panel> <debug_view follows="all" left="0" top="0" diff --git a/indra/newview/skins/default/xui/en/menu_bottomtray.xml b/indra/newview/skins/default/xui/en/menu_bottomtray.xml index a7abb223ba..7ef91a1d85 100644 --- a/indra/newview/skins/default/xui/en/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/menu_bottomtray.xml @@ -52,4 +52,57 @@ function="CheckControl" parameter="ShowSnapshotButton" /> </menu_item_check> + <menu_item_separator + name="Separator" /> + <menu_item_call + label="Cut" + name="NearbyChatBar_Cut"> + <menu_item_call.on_click + function="NearbyChatBar.Action" + parameter="cut" /> + <menu_item_call.on_enable + function="NearbyChatBar.EnableMenuItem" + parameter="can_cut" /> + </menu_item_call> + <menu_item_call + label="Copy" + name="NearbyChatBar_Copy"> + <menu_item_call.on_click + function="NearbyChatBar.Action" + parameter="copy" /> + <menu_item_call.on_enable + function="NearbyChatBar.EnableMenuItem" + parameter="can_copy" /> + </menu_item_call> + <menu_item_call + label="Paste" + name="NearbyChatBar_Paste"> + <menu_item_call.on_click + function="NearbyChatBar.Action" + parameter="paste" /> + <menu_item_call.on_enable + function="NearbyChatBar.EnableMenuItem" + parameter="can_paste" /> + </menu_item_call> + <menu_item_call + label="Delete" + name="NearbyChatBar_Delete"> + <menu_item_call.on_click + function="NearbyChatBar.Action" + parameter="delete" /> + <menu_item_call.on_enable + function="NearbyChatBar.EnableMenuItem" + parameter="can_delete" /> + </menu_item_call> + <menu_item_call + label="Select All" + name="NearbyChatBar_Select_All"> + <menu_item_call.on_click + function="NearbyChatBar.Action" + parameter="select_all" /> + <menu_item_call.on_enable + function="NearbyChatBar.EnableMenuItem" + parameter="can_select_all" /> + </menu_item_call> + </menu> diff --git a/indra/newview/skins/default/xui/en/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/en/menu_imchiclet_adhoc.xml new file mode 100644 index 0000000000..eb5e31b57d --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_imchiclet_adhoc.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu + height="101" + layout="topleft" + left="100" + mouse_opaque="false" + name="IMChiclet AdHoc Menu" + top="724" + visible="false" + width="128"> + <menu_item_call + label="End Session" + layout="topleft" + name="End Session"> + <menu_item_call.on_click + function="IMChicletMenu.Action" + parameter="end" /> + </menu_item_call> +</menu> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 49276172d5..f48cc6d4bf 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -586,20 +586,7 @@ To place the media on only one face, choose Select Texture and click on the desi notext="Cancel" yestext="OK"/> </notification> - - <notification - icon="alertmodal.tga" - name="WhiteListInvalidatesHomeUrl" - type="alertmodal"> -Adding this entry to the whitelist will invalidate the home URL you -specified for this instance of media. You are not allowed to do this -so the entry cannot be added to the whitelist. - <usetemplate - name="okbutton" - yestext="Ok"/> - </notification> - - + <notification icon="alertmodal.tga" name="MustBeInParcel" @@ -4611,6 +4598,13 @@ Please select at least one type of content to search (PG, Mature, or Adult). <notification icon="notify.tga" + name="PaymentRecived" + type="notify"> +[MESSAGE] + </notification> + + <notification + icon="notify.tga" name="EventNotification" type="notify"> Event Notification: @@ -5783,6 +5777,26 @@ Server Error: Media update or get failed. yestext="OK"/> </notification> + <notification + icon="alertmodal.tga" + name="TextChatIsMutedByModerator" + type="alertmodal"> +Your text chat has been muted by moderator. + <usetemplate + name="okbutton" + yestext="OK"/> + </notification> + + <notification + icon="alertmodal.tga" + name="VoiceIsMutedByModerator" + type="alertmodal"> +Your voice has been muted by moderator. + <usetemplate + name="okbutton" + yestext="OK"/> + </notification> + <notification icon="alertmodal.tga" name="ConfirmClearTeleportHistory" diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml index c1090a1686..3e6ea84bf2 100644 --- a/indra/newview/skins/default/xui/en/panel_chat_header.xml +++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml @@ -8,7 +8,7 @@ label="im_header" layout="topleft" name="im_header" - width="300"> + width="310"> <avatar_icon follows="left" height="18" @@ -20,19 +20,21 @@ top="3" width="18" /> <text_editor - v_pad = "0" - read_only = "true" - follows="left|right" - font.style="BOLD" - height="12" - layout="topleft" - left_pad="5" - right="-60" - name="user_name" - text_color="white" - top="8" - use_ellipses="true" - value="Ericag Vader" /> + allow_scroll="false" + v_pad = "0" + read_only = "true" + follows="left|right" + font.style="BOLD" + height="12" + layout="topleft" + left_pad="5" + right="-60" + name="user_name" + text_color="white" + bg_readonly_color="black" + top="8" + use_ellipses="true" + value="Ericag Vader" /> <text font="SansSerifSmall" follows="right" diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml index 0a5812882d..0a3fd1699f 100644 --- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml @@ -76,7 +76,6 @@ visible="false" width="100" /> <button - enabled="false" bottom="10" height="20" label="Voice Controls" diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml index 4b91dc6294..c52b0c83d0 100644 --- a/indra/newview/skins/default/xui/en/panel_landmarks.xml +++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml @@ -6,6 +6,7 @@ layout="topleft" left="0" width="380" + help_topic="panel_landmarks" border="true" background_visible="true" bg_alpha_color="DkGray2" diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index a9a02e8fc7..d07d4ea25f 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -6,7 +6,7 @@ left="0" name="panel_login" top="600" - width="800"> + width="996"> <panel.string name="create_account_url"> http://join.secondlife.com/ @@ -27,128 +27,79 @@ border_visible="false" bottom="600" follows="all" - hide_loading="true" + hide_loading="true" left="0" name="login_html" start_url="" top="0" height="600" - width="800"/> + width="996" /> <panel follows="left|bottom|right" name="login_widgets" layout="topleft" - left="0" - top="0"> + top="519" + width="996" + height="80"> <text follows="left|bottom" - font="SansSerif" + font="SansSerifSmall" height="16" - left="32" + left="20" name="first_name_text" - top="530" - width="120"> - First Name: + top="20" + width="135"> + Name: </text> <line_editor follows="left|bottom" - font="SansSerif" handle_edit_keys_directly="true" - height="20" + height="23" + label="First" left_delta="0" max_length="31" name="first_name_edit" select_on_focus="true" tool_tip="[SECOND_LIFE] First Name" - top_pad="2" - width="120" /> - <text - follows="left|bottom" - font="SansSerif" - height="16" - left="164" - name="last_name_text" - top="530" - width="120"> - Last Name: - </text> + top_pad="0" + width="135" /> <line_editor follows="left|bottom" - font="SansSerif" handle_edit_keys_directly="true" - height="20" - left_delta="0" + height="23" + label="Last" + left_pad="8" max_length="31" name="last_name_edit" select_on_focus="true" tool_tip="[SECOND_LIFE] Last Name" - top_pad="2" - width="120" /> - <text - follows="left|bottom" - font="SansSerif" - height="16" - left="296" - name="password_text" - top="530" - width="120"> - Password: - </text> - <line_editor - follows="left|bottom" - font="SansSerif" - handle_edit_keys_directly="true" - height="20" - left_delta="0" - max_length="16" - name="password_edit" - select_on_focus="true" - top_pad="2" - width="120" /> - <button - follows="left|bottom" - height="23" - label="Log In" - label_selected="Log In" - layout="topleft" - left="425" - name="connect_btn" - top="546" - width="100" /> - <combo_box - allow_text_entry="true" - follows="left|bottom" - height="23" - layout="topleft" - left_pad="5" - name="server_combo" - width="100" /> + top_delta="0" + width="135" /> <text follows="left|bottom" - font="SansSerif" - height="16" - left="32" + font="SansSerifSmall" + height="15" + left_pad="8" name="start_location_text" - top="576" - width="95"> - Start location: + top="20" + width="135"> + Starting location: </text> <combo_box allow_text_entry="true" control_name="LoginLocation" follows="left|bottom" height="23" - left_pad="0" max_chars="128" + top_pad="0" name="start_location_combo" - top_delta="-2" - width="155"> + width="135"> <combo_box.item - label="My Last Location" + label="My last location" name="MyLastLocation" value="last" /> <combo_box.item - label="My Home" + label="My home" name="MyHome" value="home" /> <combo_box.item @@ -156,43 +107,91 @@ name="Typeregionname" value="" /> </combo_box> + <combo_box + allow_text_entry="true" + font="SansSerifSmall" + follows="left|bottom" + height="23" + layout="topleft" + top="60" + name="server_combo" + width="135" + visible="false" /> + <text + follows="left|bottom" + font="SansSerifSmall" + height="15" + left_pad="3" + name="password_text" + top="20" + width="135"> + Password: + </text> + <line_editor + follows="left|bottom" + handle_edit_keys_directly="true" + height="23" + left_delta="0" + max_length="16" + name="password_edit" + select_on_focus="true" + top_pad="0" + width="135" /> <check_box control_name="RememberPassword" follows="left|bottom" + font="SansSerifSmall" height="16" - label="Remember password" - left_pad="10" + label="Remember" + left_pad="5" name="remember_check" - top_delta="3" - width="138" /> + top_delta="5" + width="90" /> + <button + follows="left|bottom" + height="23" + image_unselected="PushButton_On" + image_selected="PushButton_On_Selected" + label="Log In" + label_color="White" + layout="topleft" + left_pad="20" + name="connect_btn" + top="35" + width="90" /> <text follows="right|bottom" + font="SansSerifSmall" + text_color="EmphasisColor" halign="right" height="16" - left="-210" + top="17" + left_pad="10" + right="-10" name="create_new_account_text" - top="539" - width="200"> - Create a new account + width="180"> + Sign up for account </text> <text follows="right|bottom" + font="SansSerifSmall" + text_color="EmphasisColor" halign="right" height="16" - left_delta="0" name="forgot_password_text" - top_pad="4" - width="200"> + top_pad="2" + width="180"> Forgot your name or password? </text> <text follows="right|bottom" + font="SansSerifSmall" halign="right" - height="16" - left="-310" + height="28" + top_pad="2" name="channel_text" - top="579" - width="300"> + width="180" + word_wrap="true"> [VERSION] </text> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml index e00f654750..b82a435b41 100644 --- a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml +++ b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml @@ -10,17 +10,27 @@ name="Media Settings General" help_topic = "media_settings_general" width="365"> - - <text - bottom_delta="-17" - follows="top|left" - height="15" - left="10" + + <text + bottom_delta="-25" + follows="top|left" + height="15" + left="10" name="home_label"> Home URL: </text> + <text + visible="false" + bottom_delta="0" + follows="top|left" + height="15" + left_delta="64" + text_color="red" + name="home_fails_whitelist_label"> + (This URL does not pass the specified whitelist) + </text> <line_editor - bottom_delta="-21" + bottom_delta="-24" enabled="true" follows="left|top" font="SansSerif" @@ -221,12 +231,23 @@ width="50" /> <text bottom_delta="0" follows="top|left" height="15" left_delta="60" name="X_label"> - X + X </text> - <spinner bottom_delta="0" - decimal_digits="0" enabled="true" follows="left|top" height="16" - increment="1" initial_val="256" label="" label_width="0" - left_delta="20" max_val="2048" min_val="0" mouse_opaque="true" - name="height_pixels" width="50" /> + <spinner + bottom_delta="0" + decimal_digits="0" + enabled="true" + follows="left|top" + height="16" + increment="1" + initial_val="256" + label="" + label_width="0" + left_delta="20" + max_val="2048" + min_val="0" + mouse_opaque="true" + name="height_pixels" + width="50" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_security.xml b/indra/newview/skins/default/xui/en/panel_media_settings_security.xml index a26f74844e..7d9350b45f 100644 --- a/indra/newview/skins/default/xui/en/panel_media_settings_security.xml +++ b/indra/newview/skins/default/xui/en/panel_media_settings_security.xml @@ -30,8 +30,28 @@ name="whitelist" width="315" enabled="true" /> + <icon + bottom_delta="-23" + right="-35" + width="16" + height="16" + image_name="parcel_color_EXP" + mouse_opaque="true" + follows="top|left" + name="parcel_color_EXP" + /> + <text + visible="true" + follows="top|left" + height="15" + left="30" + bottom_delta="0" + text_color="0.4 0.4 0.4 1.0" + name="home_url_fails_some_items_in_whitelist"> + Entries that the home URL fails against are marked: + </text> <button - bottom_delta="-30" + bottom_delta="-36" follows="top|left" height="20" label="Add" @@ -54,4 +74,17 @@ <button.commit_callback function="Media.whitelistDelete"/> </button> + <text + visible="true" + bottom_delta="-75" + follows="top|left" + height="40" + left="30" + text_color="0.6 0.0 0.0 1.0" + name="home_url_fails_whitelist"> +Warning: the home URL specified in the General tab +fails to pass this whitelist. It has been disabled +until a valid entry has been added. + </text> + </panel> diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml index 9702bd41c8..e8e4a9dbb2 100644 --- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml @@ -154,7 +154,15 @@ left="0" name="favorite" image_drag_indication="arrow_down.tga" - chevron_button_tool_tip="Show more of My Favorites" - bottom="62" - width="590" /> + bottom="62" + width="590"> + <chevron_button name=">>" + image_unselected="TabIcon_Close_Off" + image_selected="TabIcon_Close_Off" + tab_stop="false" + follows="left|bottom" + tool_tip="Show more of My Favorites" + width="15" + height="15"/> + </favorites_bar> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml index 4f0d155876..4c2bd67337 100644 --- a/indra/newview/skins/default/xui/en/panel_picks.xml +++ b/indra/newview/skins/default/xui/en/panel_picks.xml @@ -162,16 +162,5 @@ tab_stop="false" top="0" width="50" /> - <button - enabled="false" - follows="bottom|right" - height="25" - label="▼" - layout="topleft" - name="overflow_btn" - right="-10" - tab_stop="false" - top="0" - width="30" /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml index fac0d5c60f..3aa5d3fae4 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml @@ -318,4 +318,37 @@ name="plain_text_chat_history" top_pad="5" width="400" /> + <text + left="30" + height="20" + width="300" + top_pad="20"> + Show IMs in: + </text> + <radio_group + height="30" + layout="topleft" + left="30" + control_name="ChatWindow" + name="chat_window" + top_pad="10" + tool_tip="Show chat in multiple windows(by default) or in one multi-tabbed window (requires restart)" + width="331"> + <radio_item + height="16" + label="Multiple windows" + layout="topleft" + left="0" + name="radio" + top="0" + width="150" /> + <radio_item + height="16" + label="One window" + layout="topleft" + left_delta="145" + name="radio2" + top_delta="0" + width="150" /> + </radio_group> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml index af4c01185a..8b86067b03 100644 --- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml @@ -9,6 +9,11 @@ width="800"> <string name="control_background_image_name">Inspector_Background</string> <string name="skip_step">0.2</string> + <string name="min_width">400</string> + <string name="min_height">120</string> + <string name="zoom_near_padding">1.0</string> + <string name="zoom_medium_padding">1.25</string> + <string name="zoom_far_padding">1.5</string> <panel name="media_region" bottom="125" @@ -20,7 +25,7 @@ name="media_controls" follows="left|right" animate="false" - height="32" + height="26" layout="topleft" left="0" orientation="horizontal" @@ -235,18 +240,17 @@ width="190" min_width="90"> <!-- - RE-ENABLE THIS WHEN WE HAVE A HISTORY DROP-DOWN AGAIN - -<combo_box -name="media_address_url" -allow_text_entry="true" -height="22" -layout="topleft" -max_chars="1024" -tool_tip = "Media URL" -<combo_box.commit_callback -function="MediaCtrl.CommitURL" /> -</combo_box> + RE-ENABLE THIS WHEN WE HAVE A HISTORY DROP-DOWN AGAIN + <combo_box + name="media_address_url" + allow_text_entry="true" + height="22" + layout="topleft" + max_chars="1024" + tool_tip = "Media URL"> + <combo_box.commit_callback + function="MediaCtrl.CommitURL" /> + </combo_box> --> <line_editor name="media_address_url" @@ -304,17 +308,17 @@ function="MediaCtrl.CommitURL" /> user_resize="false" follows="left|right|top|bottom" layout="topleft" + height="16" min_width="100" width="200"> <slider_bar name="media_play_slider" follows="left|right|top" - height="22" + height="16" increment="0.05" initial_value="0.5" layout="topleft" tool_tip="Movie play progress" - top="8" min_width="100" width="200"> <slider_bar.commit_callback @@ -619,7 +623,7 @@ function="MediaCtrl.CommitURL" /> </layout_stack> <layout_stack follows="left|right|bottom" - height="32" + height="20" layout="topleft" animate="false" left="0" @@ -632,7 +636,7 @@ function="MediaCtrl.CommitURL" /> user_resize="false" /> <panel name="media_progress_indicator" - height="22" + height="20" layout="topleft" left="0" top="0" @@ -644,6 +648,7 @@ function="MediaCtrl.CommitURL" /> name="media_progress_bar" color_bar="1 1 1 0.96" follows="left|right|top" + top="5" height="8" layout="topleft" left="0" diff --git a/indra/newview/skins/default/xui/en/panel_region_general_layout.xml b/indra/newview/skins/default/xui/en/panel_region_general_layout.xml deleted file mode 100644 index bffd84877f..0000000000 --- a/indra/newview/skins/default/xui/en/panel_region_general_layout.xml +++ /dev/null @@ -1,242 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - border="true" - follows="top|left" - height="360" - label="Region" - layout="topleft" - left="0" - name="General" - top="360" - width="280"> - <text - follows="left|top" - font="SansSerif" - height="20" - layout="topleft" - left="10" - name="region_text_lbl" - top="10" - width="100"> - Region: - </text> - <text - follows="left|top" - font="SansSerif" - height="20" - layout="topleft" - left_delta="50" - name="region_text" - top_delta="0" - width="200"> - unknown - </text> - <text - follows="left|top" - font="SansSerif" - height="20" - layout="topleft" - left="10" - name="version_channel_text_lbl" - top="30" - width="100"> - Version: - </text> - <text - follows="left|top" - font="SansSerif" - height="20" - layout="topleft" - left_delta="50" - name="version_channel_text" - top_delta="0" - width="200"> - unknown - </text> - <text - follows="left|top" - font="SansSerif" - height="20" - layout="topleft" - left="10" - name="region_type_lbl" - top="50" - width="100"> - Type: - </text> - <text - follows="left|top" - font="SansSerif" - height="20" - layout="topleft" - left_delta="50" - name="region_type" - top_delta="0" - width="200"> - unknown - </text> - <check_box - height="20" - label="Block Terraform" - layout="topleft" - left="10" - name="block_terraform_check" - top="70" - width="80" /> - <check_box - height="20" - label="Block Fly" - layout="topleft" - left="10" - name="block_fly_check" - top="90" - width="80" /> - <check_box - height="20" - label="Allow Damage" - layout="topleft" - left="10" - name="allow_damage_check" - top="110" - width="80" /> - <check_box - height="20" - label="Restrict Pushing" - layout="topleft" - left="10" - name="restrict_pushobject" - top="130" - width="80" /> - <check_box - height="20" - label="Allow Land Resell" - layout="topleft" - left="10" - name="allow_land_resell_check" - top="160" - width="80" /> - <check_box - height="20" - label="Allow Land Join/Divide" - layout="topleft" - left="10" - name="allow_parcel_changes_check" - top="180" - width="80" /> - <check_box - height="20" - label="Block Land Show in Search" - layout="topleft" - left="10" - name="block_parcel_search_check" - tool_tip="Let people see this region and its parcels in search results" - top="200" - width="80" /> - <spinner - follows="left|top" - height="20" - increment="1" - label="Agent Limit" - label_width="97" - layout="topleft" - left="10" - max_val="100" - min_val="1" - name="agent_limit_spin" - top="240" - width="170" /> - <spinner - follows="left|top" - height="20" - increment="0.5" - label="Object Bonus" - label_width="97" - layout="topleft" - left="10" - max_val="10" - min_val="1" - name="object_bonus_spin" - top="260" - width="170" /> - <text - follows="left|top" - height="20" - label="Maturity" - layout="topleft" - left="10" - name="access_text" - top="290" - width="100"> - Rating: - </text> - <combo_box - height="20" - label="Mature" - layout="topleft" - left_delta="100" - name="access_combo" - top_delta="0" - width="85"> - <combo_box.item - label="Adult" - name="Adult" - value="42" /> - <combo_box.item - label="Mature" - name="Mature" - value="21" /> - <combo_box.item - label="PG" - name="PG" - value="13" /> - </combo_box> - <button - enabled="false" - follows="left|top" - height="20" - label="Apply" - layout="topleft" - left="108" - name="apply_btn" - top="320" - width="100"/> - <button - follows="left|top" - height="20" - label="Teleport Home One User..." - layout="topleft" - left="10" - name="kick_btn" - top_pad="10" - width="250" /> - <button - follows="left|top" - height="20" - label="Teleport Home All Users..." - layout="topleft" - left_delta="0" - name="kick_all_btn" - top_pad="3" - width="250" /> - <button - follows="left|top" - height="20" - label="Send Message To Region..." - layout="topleft" - left_delta="0" - name="im_btn" - top_pad="20" - width="200" /> - <button - follows="left|top" - height="20" - label="Manage Telehub..." - layout="topleft" - left_delta="0" - name="manage_telehub_btn" - top_pad="20" - width="150" > - <button.commit_callback - function="RegionInfo.ManageTelehub" /> - </button> -</panel> diff --git a/indra/newview/skins/default/xui/en/panel_side_tray.xml b/indra/newview/skins/default/xui/en/panel_side_tray.xml index 95242a9639..63b7112c17 100644 --- a/indra/newview/skins/default/xui/en/panel_side_tray.xml +++ b/indra/newview/skins/default/xui/en/panel_side_tray.xml @@ -23,6 +23,7 @@ background_visible="true" > <panel + class="panel_sidetray_home" name="panel_home" filename="panel_sidetray_home_tab.xml" label="home" diff --git a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml index 9839075862..4b841b0a09 100644 --- a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml +++ b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml @@ -1,265 +1,92 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<!-- Part of side tray, see that XML file for panel config --> +<!-- the web-based Home panel of the side tray --> <panel follows="all" - height="560" + height="570" + min_height="350" label="home_tab" + help_topic="sidetray_home" layout="topleft" + top="0" + left="0" name="home_tab" width="333"> - <scroll_container - color="DkGray" + <layout_stack follows="all" + height="550" layout="topleft" - left="0" - name="profile_scroll" - opaque="true" - height="560" - width="333" - top="0"> - <panel - background_visible="true" - height="560" - layout="topleft" - name="profile_scroll_panel" - top="0" - left="0" - width="311"> - <panel - background_visible="true" - bg_alpha_color="DkGray2" - class="panel_sidetray_home_info" - follows="left|top|right" - height="90" - layout="topleft" - left="15" - top="17" - name="sidebar_people" - width="303"> - <text - follows="left|right|top" - font="SansSerifBigBold" - height="30" - layout="topleft" - left="10" - mouse_opaque="false" - name="tab_name" - text_color="EmphasisColor" - top="10" - value="People" - width="200" - word_wrap="true" /> - <icon - follows="top|right" - height="20" - layout="topleft" - name="tab_icon" - right="-10" - top="10" - image_name="TabIcon_People_Selected" - width="20" /> - <text - follows="left|right|bottom" - height="90" - layout="topleft" - left="10" - mouse_opaque="false" - name="tab_description" - right="-10" - text_color="white" - top="40" - word_wrap="true"> - Find your friends, your groups, contacts and people nearby. - </text> - </panel> - <panel - background_visible="true" - bg_alpha_color="DkGray2" - class="panel_sidetray_home_info" - follows="left|top|right" - height="90" - layout="topleft" - left="15" - top_pad="15" - name="sidebar_places" - width="303"> - <text - follows="left|right|top" - font="SansSerifBigBold" - height="30" - layout="topleft" - left="10" - mouse_opaque="false" - name="tab_name" - text_color="EmphasisColor" - top="10" - value="Places" - width="200" - word_wrap="true" /> - <icon - follows="top|right" - height="20" - layout="topleft" - name="tab_icon" - right="-10" - top="10" - width="20" - image_name="TabIcon_Places_Selected"/> - <text - follows="all" - height="90" - layout="topleft" - left="10" - mouse_opaque="false" - name="tab_description" - right="-10" - text_color="white" - top="40" - word_wrap="true"> - Find places to go and places you've visited before. - </text> - </panel> - <panel - background_visible="true" - bg_alpha_color="DkGray2" - class="panel_sidetray_home_info" - follows="left|top|right" - height="90" - layout="topleft" - left="15" - top_pad="15" - name="sidebar_me" - width="303"> - <text - follows="left|right|top" - font="SansSerifBigBold" - height="30" - layout="topleft" - left="10" - mouse_opaque="false" - name="tab_name" - text_color="EmphasisColor" - top="10" - value="My Profile" - width="200" - word_wrap="true" /> - <icon - follows="top|right" - height="20" - layout="topleft" - name="tab_icon" - right="-10" - top="10" - width="20" - image_name="TabIcon_Me_Selected"/> - <text - follows="all" - height="90" - layout="topleft" - left="10" - mouse_opaque="false" - name="tab_description" - right="-10" - text_color="white" - top="40" - word_wrap="true"> - Edit your public profile. - </text> - </panel> - <panel - background_visible="true" - bg_alpha_color="DkGray2" - class="panel_sidetray_home_info" - follows="left|top|right" - height="90" + left="10" + name="stack" + top_pad="10" + width="313"> + <layout_panel + auto_resize="false" + height="20" layout="topleft" - left="15" - top_pad="15" - name="sidebar_appearance" - width="303"> - <text - follows="left|right|top" - font="SansSerifBigBold" - height="30" - layout="topleft" - left="10" - mouse_opaque="false" - name="tab_name" - text_color="EmphasisColor" - top="10" - value="My Appearance" - width="200" - word_wrap="true" /> - <icon - follows="top|right" - height="20" - layout="topleft" - name="tab_icon" - right="-10" - top="10" - width="20" - image_name="TabIcon_Appearance_Selected"/> - <text - follows="all" - height="90" - layout="topleft" - left="10" - mouse_opaque="false" - name="tab_description" - right="-10" - text_color="white" - top="40" - word_wrap="true"> - Change your appearance and current look. - </text> - </panel> - <panel - background_visible="true" - bg_alpha_color="DkGray2" - class="panel_sidetray_home_info" - follows="left|top|right" - height="90" + left="0" + name="nav_controls" + top="0" + user_resize="false" + width="313"> + <button + follows="left|top" + enabled="false" + height="20" + label="Back" + layout="topleft" + tab_stop="false" + left="0" + name="back" + top="0" + width="70"> + <button.commit_callback + function="MediaBrowser.Back" /> + </button> + <button + follows="left|top" + height="20" + enabled="false" + label="Forward" + layout="topleft" + tab_stop="false" + left_pad="3" + name="forward" + top_delta="0" + width="70"> + <button.commit_callback + function="MediaBrowser.Forward" /> + </button> + <button + follows="left|top" + height="20" + label="Home" + layout="topleft" + tab_stop="false" + left_pad="2" + name="home" + top_delta="0" + width="70"> + <button.commit_callback + function="MediaBrowser.Home" /> + </button> + </layout_panel> + <layout_panel + height="530" layout="topleft" - left="15" - top_pad="15" - name="sidebar_inventory" - width="303"> - <text - follows="left|right|top" - font="SansSerifBigBold" - height="30" - layout="topleft" - left="10" - mouse_opaque="false" - name="tab_name" - text_color="EmphasisColor" - top="10" - value="My Inventory" - width="200" - word_wrap="true" /> - <icon - follows="top|right" - height="20" - layout="topleft" - name="tab_icon" - right="-10" - top="10" - width="20" - image_name="TabIcon_Things_Selected"/> - <text - follows="all" - height="90" - layout="topleft" - left="10" - mouse_opaque="false" - name="tab_description" - right="-10" - text_color="white" - top="40" - word_wrap="true"> - Browse your inventory. - </text> - </panel> - </panel> - </scroll_container> + left_delta="0" + name="browser_layout" + top_delta="0" + width="313"> + <web_browser + border_visible="false" + follows="all" + height="530" + layout="topleft" + left="0" + name="browser" + start_url="data:text/html,%3Chtml%3E%3Cbody bgcolor=%22#2A2A2A%22 text=%22eeeeee%22%3E %3Ch3%3E %0D%0A%0D%0ALoading... %3C/h3%3E %3C/body%3E%3C/html%3E" + top="0" + width="313" /> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml index 9c66653e3c..5dcee9e965 100644 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -42,28 +42,27 @@ <button auto_resize="true" halign="right" - follows="right|bottom" + follows="right|top" image_selected="BuyArrow_Over" image_unselected="BuyArrow_Off" image_pressed="BuyArrow_Press" height="16" - left="-200" + right="-120" name="buycurrency" pad_right="20px" tool_tip="My Balance: Click to buy more L$" - top="1" + top="0" width="90" /> <text type="string" - length="1" font="SansSerifSmall" text_readonly_color="TimeTextColor" follows="right|bottom" halign="right" height="16" - top="5" + top="4" layout="topleft" - left_pad="-5" + left_pad="-7" name="TimeText" text_color="TimeTextColor" tool_tip="Current time (Pacific)" @@ -76,7 +75,7 @@ image_selected="parcel_drk_VoiceNo" image_unselected="parcel_drk_Voice" is_toggle="true" - left_pad="5" + left_pad="18" top="1" name="volume_btn" tool_tip="Global Volume Control" diff --git a/indra/newview/skins/default/xui/en/panel_sys_well_item.xml b/indra/newview/skins/default/xui/en/panel_sys_well_item.xml index ccb57b6552..2822f7b841 100644 --- a/indra/newview/skins/default/xui/en/panel_sys_well_item.xml +++ b/indra/newview/skins/default/xui/en/panel_sys_well_item.xml @@ -14,6 +14,7 @@ background_visible="true" bg_alpha_color="0.0 0.0 0.0 0.0" > <text + clip_partial="true" top="2" left="10" width="267" diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history.xml b/indra/newview/skins/default/xui/en/panel_teleport_history.xml index 01204ba779..32fc9fce01 100644 --- a/indra/newview/skins/default/xui/en/panel_teleport_history.xml +++ b/indra/newview/skins/default/xui/en/panel_teleport_history.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel name="Teleport History" bottom="0" height="326" left="0" width="380" + help_topic="panel_teleport_history" border="true" follows="left|top|right|bottom"> <accordion follows="left|top|right|bottom" diff --git a/indra/newview/skins/default/xui/en/panel_toast.xml b/indra/newview/skins/default/xui/en/panel_toast.xml index f16329f8d7..4293051dbd 100644 --- a/indra/newview/skins/default/xui/en/panel_toast.xml +++ b/indra/newview/skins/default/xui/en/panel_toast.xml @@ -29,6 +29,7 @@ > <!-- Don't remove this wiget! It is needed for Overflow and Start-Up toasts!--> <text + clip_partial="true" visible="false" follows="left|top|right|bottom" font="SansSerifBold" @@ -39,6 +40,7 @@ word_wrap="true" text_color="white" top="5" + use_ellipses="true" width="260"> Toast text; </text> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 4b727e36ab..e47ec1ebda 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -267,6 +267,7 @@ <string name="ChangePermissions">Change its permissions</string> <string name="TrackYourCamera">Track your camera</string> <string name="ControlYourCamera">Control your camera</string> + <string name="NotConnected">Not Connected</string> <!-- Sim Access labels --> <string name="SIM_ACCESS_PG">PG</string> diff --git a/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml b/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml index 08c337455c..c0e1944f56 100644 --- a/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml +++ b/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <accordion_tab - font="SansSerifBold" header_bg_color="DkGray2" header_collapse_img="Accordion_ArrowClosed_Off" header_collapse_img_pressed="Accordion_ArrowClosed_Press" diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml index 90887dead6..d32952b04f 100644 --- a/indra/newview/skins/default/xui/en/widgets/location_input.xml +++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml @@ -11,7 +11,7 @@ add_landmark_image_disabled="Favorite_Star_Off" add_landmark_image_hover="Favorite_Star_Over" add_landmark_image_selected="Favorite_Star_Press" - add_landmark_hpad="10" + add_landmark_hpad="12" icon_hpad="2" allow_text_entry="true" list_position="below" @@ -42,6 +42,7 @@ <for_sale_button name="for_sale_btn" image_unselected="parcel_lght_ForSale" + image_selected="parcel_lght_ForSale" width="22" height="18" follows="right|top" @@ -52,35 +53,40 @@ name="voice_icon" width="22" height="18" - top="21" + top="21" + follows="right|top" image_name="parcel_lght_VoiceNo" /> <fly_icon name="fly_icon" width="22" height="18" - top="21" + top="21" + follows="right|top" image_name="parcel_lght_FlyNo" /> <push_icon name="push_icon" width="22" height="18" - top="21" + top="21" + follows="right|top" image_name="parcel_lght_PushNo" /> <build_icon name="build_icon" width="22" height="18" - top="21" + top="21" + follows="right|top" image_name="parcel_lght_BuildNo" /> <scripts_icon name="scripts_icon" width="22" height="18" - top="21" + top="21" + follows="right|top" image_name="parcel_lght_ScriptsNo" /> <!-- NOTE: Placeholder icon, there is no dark grayscale version --> @@ -88,7 +94,8 @@ name="damage_icon" width="22" height="18" - top="21" + top="21" + follows="right|top" image_name="parcel_lght_Damage" /> <!-- Default text color is invisible on top of nav bar background --> @@ -97,6 +104,7 @@ width="35" height="18" top="16" + follows="right|top" halign="right" font="SansSerifSmall" text_color="TextFgColor" diff --git a/indra/newview/skins/default/xui/en/widgets/textbase.xml b/indra/newview/skins/default/xui/en/widgets/textbase.xml index 6dd92ea34b..166e8555fe 100644 --- a/indra/newview/skins/default/xui/en/widgets/textbase.xml +++ b/indra/newview/skins/default/xui/en/widgets/textbase.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<textbase/> +<textbase clip_partial="false"/> diff --git a/indra/newview/skins/default/xui/nl/role_actions.xml b/indra/newview/skins/default/xui/nl/role_actions.xml new file mode 100644 index 0000000000..1f0a6e4235 --- /dev/null +++ b/indra/newview/skins/default/xui/nl/role_actions.xml @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<role_actions> + <action_set description="Deze Mogelijkheden regelen het toevoegen en verwijderen van Groepsleden, en om aan te geven dat nieuwe Leden lid kunnen worden zonder uitnodiging." name="Membership"> + <action description="Personen uitnodigen voor deze Groep" longdescription="Personen uitnodigen voor deze Groep door de 'Uitnodigen Nieuwe Leden...' knop in de leden & Rollen tab > Leden sub-tab." name="member invite"/> + <action description="Leden uit deze Groep zetten" longdescription="Leden uit deze Groep zetten door de 'Uit Groep Zetten' knop in de leden tab & Rollen tab > Leden sub-tab. Een Eigenaar kan iedereen uit de groep zetten behalve een andere Eigenaar. Als je geen Eigenaar bent, kan een Lid worden uitgezet als, en alleen als, het Lid deel uitmaakt van de Iedereen Rol, en NIET van andere Rollen. Om Leden uit Rollen te verwijderen, moet je de 'Leden uit Rollen Verwijderen' mogelijkheid hebben." name="member eject"/> + <action description="Selecteer 'Vrije Toegang' en wijzig 'Contibutie Bijdrage'" longdescription="Selecteer 'Vrije Toegang' zodat nieuwe Leden lid kunnen worden zonder uitnodiging, en wijzig 'Contributie Bijdrage' in de Groep Voorkeuren sectie van de Algemene tab." name="member options"/> + </action_set> + <action_set description="Deze Mogelijkheden regelen het toevoegen, verwijderen, en wijzigen van Groepsrollen, toevoegen en verwijderen van Leden in Rollen, en toewijzen van Mogelijkheden aan Rollen." name="Roles"> + <action description="Creëren nieuwe Rollen" longdescription="Creëren nieuwe Rollen in de Leden & Rollen tab > Rollen sub-tab." name="role create"/> + <action description="Verwijderen Rollen" longdescription="Verwijderen Rollen in de Leden & Rollen tab > Rollen sub-tab." name="role delete"/> + <action description="Wijzigen Rol-naam, titel, beschrijving, en of de Rol leden publiekelijk zichtbaar zijn" longdescription="Wijzigen Rol-naam, titel, beschrijving, en of de Rol leden publiekelijk zichtbaar zijn. Dit kan worden gedaan onderaan de de Leden & Rollen tab > Rollen sub-tab na de selectie van een rol." name="role properties"/> + <action description="Toewijzen Leden aan Toewijzers Rollen" longdescription="Toewijzen Leden aan Rollen in de Toegewezen Rollen sectie van de Leden & Rol tab > Leden sub-tab. Een Lid met deze Mogelijkheid kan alleen Leden toevoegen aan een Rol waartoe men zelf al behoort." name="role assign member limited"/> + <action description="Toewijzen Leden aan Alle Rollen" longdescription="Toewijzen van Leden aan Alle Rollen in the Toegewezen Rollen sectie van de Leden & Rollen tab > Leden sub-tab. *WAARSCHUWING* Ieder Lid in een Rol met deze Mogelijkheid kan zichzelf--en ieder ander niet-Eigenaar Lid--toewijzen aan rollen met meer rechten dan zijzelf op dat moment hebben, hierdoor ontstaat de mogelijkheid om zichzelf bijna-Eigenaar rechten toewijzen. Wees er zeker van en controleer voordat deze Mogelijkheid wordt toegekend." name="role assign member"/> + <action description="Verwijderen Leden uit Rollen" longdescription="Verwijderen Leden uit Rollen in the Toegewezen Rollen sectie van de Leden & Rollen tab > Leden sub-tab. Eigenaars kunnen niet worcen verwijderd." name="role remove member"/> + <action description="Toewijzen en Verwijderen Mogelijkheden in Rollen" longdescription="Toewijzen en Verwijderen Mogelijkheden in Rollen in de Toegestane Mogelijkheden van de Leden & Rollen tab > Leden sub-tab. *WAARSCHUWING* Ieder Lid in een Rol met deze Mogelijkheid kan kan zichzelf--en ieder ander niet-Eigenaar Lid--toewijzen aan rollen met meer rechten dan zijzelf op dat moment hebben, hierdoor ontstaat de mogelijkheid om zichzelf bijna-Eigenaar rechten toewijzen. Wees er zeker van en controleer voordat deze Mogelijkheid wordt toegekend." name="role change actions"/> + </action_set> + <action_set description="Deze Mogelijkheden regelen het wijzigen van de Groepsidentiteit, zoals het veranderen van publieke zichtbaarheid, charter en insigne." name="Group Identity"> + <action description="Wijzigen Charter, Insigne, en 'Toon in zoeken'" longdescription="Wijzigen Charter, Insigne, en 'Toon in zoeken'. Dit kan worden gedaan in de Algemeen tab." name="group change identity"/> + </action_set> + <action_set description="Deze Mogelijkheden regelen het overdragen, wijzigen, en verkopen van land dat in bezit is van deze groep. Om naar het Over Land venster te gaan, rechts-klik de grond selecteer 'Over Land...', of klik op de perceel info in de menubalk." name="Parcel Management"> + <action description="Land overdragen en land kopen voor groep" longdescription="Land overdragen en land kopen voor groep. Dit kan worden gedaan in Over Land > Algemeen tab." name="land deed"/> + <action description="Land overdragen aan Govenor Linden" longdescription="Land overdragen aan Govenor Linden. *WAARSCHUWING* Ieder Lid in een Rol met deze Mogelijkheid kan land in eigendom van de groep laten vervallen in Over Land > Algemeen tab, teruggeven in Linden eigendom zonder verkoop! Wees er zeker van en controleer voordat deze Mogelijkheid wordt toegekend." name="land release"/> + <action description="Activeer land te koop info" longdescription="Activeer land te koop info. *WAARSCHUWING* Ieder Lid in een Rol met deze Mogelijkheid kan land in eigendom van de groep verkopen in Over Land > Algemeen tab als ze dat willen! Wees er zeker van en controleer voordat deze Mogelijkheid wordt toegekend." name="land set sale info"/> + <action description="Opdelen en samenvoegen van percelen" longdescription="Opdelen en samenvoegen van percelen. Dit kan worden gedaan door rechts klikken op de grond, 'Terrein Bewerken, en de muis te slepen naar het land om een selectie te maken. Om te verdelen, selecteer wat je wil splitsen en klik 'Opdelen...'. Om samen te voegen, selecteer twee of meer aaneengesloten percelen en klik 'Samenvoegen...'." name="land divide join"/> + </action_set> + <action_set description="Deze Mogelijkheden regelen het veranderen van de perceelnaam en publicatie instelling, zichtbaarheid in 'Tonen in zoeken', en landingspunt & TP routering." name="Parcel Identity"> + <action description="Selecteer 'Tonen in zoeken' en instellen categorie" longdescription="Selecteer 'Tonen in zoeken' en instellen van de categorie voor een perceel in Over Land > Opties tab." name="land find places"/> + <action description="Veranderen perceel naam, omschrijving, en 'Tonen in zoeken' instellingen" longdescription="Veranderen perceel naam, omschrijving en 'Tonen in zoeken' instellingen. Dit kan worden gedaan in Overland > Opties tab." name="land change identity"/> + <action description="Instellen landingsplaats en instellen teleport routering" longdescription="Op een perceel in groepseigendom, Leden in een Rol met die mogelijkheid kunnen een landingsplaats instellen om te bepalen waar inkomende teleports aankomen, en ook een teleport routering instelling voor meer controle. Dit kan worden gedaan in About Land > Opties tab." name="land set landing point"/> + </action_set> + <action_set description="Deze Mogelijkheden regelen het aanpassen van perceel opties, zoals 'Maak Objecten', 'Bewerken Terrein', en muziek & media instellingen." name="Parcel Settings"> + <action description="Veranderen muziek & media instellingen" longdescription="Veranderen streaming muziek en film instellingen in Over Land> Media tab." name="land change media"/> + <action description="Instellen 'Bewerken Terrein'" longdescription="Instellen 'Bewerken Terrein'. *WAARSCHUWING* Over Land > Opties tab > Bewerken Terrein staat toe dat iedereen de vorm van het terrein kan aanpassen, en Linden planten kan plaatsen en verplaatsen. Wees er zeker van en controleer voordat deze Mogelijkheid wordt toegekend. Bewerken terrein kan worden aangezet in Over Land> Opties tab." name="land edit"/> + <action description="Instellen diversen Over Land > Optie instellingen" longdescription="Instellen 'Veilig (geen letsel)', 'Vliegen' and andere Inwoners toestaan om: 'Objecten te maken', 'Terrein te bewerken', en 'Scripts uit te voeren' op land in groepseigendom in Over Land > Opties tab." name="land options"/> + </action_set> + <action_set description="Deze Mogelijkheden regelend de toestemming voor leden om beperkingen te omzeilen op percelen in groepseigendom." name="Parcel Powers"> + <action description="'Bewerken Terrein' altijd toestaan" longdescription="Leden in een Rol met deze Mogelijkheid kunnen terrein bewerken op een perceel in groepseigendom, zelfs als de optie uitstaat in Over Land > Opties tab." name="land allow edit land"/> + <action description="'Vliegen' altijd toestaan" longdescription="Leden in een Rol met deze Mogelijkheid kunnen vliegen op een perceel in groepseigendom, zelfs als de optie uitstaat in Over Land > Opties tab." name="land allow fly"/> + <action description="'Maak Objecten' altijd toestaan" longdescription="Leden in een Rol met deze Mogelijkheid kunnen objecten maken op een perceel in groepseigendom, zelfs als de optie uitstaat in Over Land > Opties tab." name="land allow create"/> + <action description="'Maak Landmarkering' altijd toestaan" longdescription="Leden in een Rol met deze Mogelijkheid kunnen een landmarkering maken op een perceel in groepseigendom, zelfs als de optie uitstaat in Over Land > Opties tab." name="land allow landmark"/> + <action description="Toestaan 'Thuis hier Instellen' op land in groepseigendom" longdescription="Leden in een Rol met deze Mogelijkheid kunnen gebruik maken van Wereld menu > Thuis hier Instellen op een perceel afgestaan aan deze groep." name="land allow set home"/> + </action_set> + <action_set description="Deze Mogelijkheden regelen het toestaan of beperken van toegang van percelen in groepseigendom, inclusief het bevriezen en verbannen van Inwoners." name="Parcel Access"> + <action description="Beheren perceel Toegang lijsten" longdescription="Beheren perceel Toegang lijsten in Over Land > Toegang tab." name="land manage allowed"/> + <action description="Beheren perceel Verbannen lijst" longdescription="Beheren perceel Verbannen lijst in Over Land > Verbannen tab." name="land manage banned"/> + <action description="Veranderen perceel 'Verkoop toegangspassen...' instellingen" longdescription="Verandere perceel 'Verkoop toegangspassen...'instellingen" name="land manage passes"/> + <action description="Uitwerpen en bevriezen Inwoners op percelen" longdescription="Leden in een Rol met deze mogelijkheid kunnen een onwelkome Inwoners aanpakken op een perceel in groepseigendom door een rechter-klik op deze inwoner > en 'Uitwerpen...'of 'Bevriezen...'te selecteren." name="land admin"/> + </action_set> + <action_set description="Deze Mogelijkheden regelen de toestemming voor leden om objecten te retourneren en Linden planten te plaatsen en te verplaatsen. Dit is nuttig voor Leden om rommel op te ruimen en landschappen te maken, echter het moet ook met omzichtigheid worden gebruikt, omdat er geen herstelfunktie is voor retourneren objecten." name="Parcel Content"> + <action description="Retourneren objecten in groepseigendom" longdescription="Retourneren van objecten die in eigendom zijn van de groep op percelen in groepseigendom in Over Land > Objecten tab." name="land return group owned"/> + <action description="Retourneren objecten toegewezen aan de groep" longdescriotion="Retourneren van objecten die aan de groep zijn toegewezen op percelen in groepseigendom in Over Land > Objecten tab." name="land return group set"/> + <action description="Retourneren objecten die niet van de groep zijn" longdescription="Retourneren objecten die niet van de groep zijn op percelen in groepeigendom in Over Land > Objecten tab." name="land return non group"/> + <action description="Landschappen maken met Linden planten" longdescription="Landschappen maken om Linden bomen, planten en grassen te plaatsen en te verplaatsen. Deze opties zijn te vinden in de inventaris Library > Objects folder of ze kunnen worden gemaakt via de Bouwen knop." name="land gardening"/> + </action_set> + <action_set description="Deze Mogelijkheden regelen het afstaan, wijzigen, en verkopen van objecten in groepseigendom. Deze veranderingen worden gedaan in Bewerken Gereedschap > Algemeen tab. Rechts-klik een object en selecteer Bewerken om de instellingen ervan te bekijken." name="Object Management"> + <action description="Overdragen objecten aan groep" longdescription="Overdragen objecten aan groep in de Bewerkings Hulpmiddelen > Algemeen tab." name="object deed"/> + <action description="Manipuleren (verplaatsen, copieren, wijzigen) van objecten in groepseigendom" longdescription="Manipuleren (verplaatsen, copieren, wijzigen) van objecten in groepseigendom in de Bewerkings Hulpmiddelen > Algemeen tab." name="object manipulate"/> + <action description="Te koop zetten van objecten in groepseigendom" longdescription="Te koop zetten van objecten in groepseigendom in de Bewerkings Hulpmiddelen > Algemeen tab." name="object set sale"/> + </action_set> + <action_set description="Deze Mogelijkheden regelen dat Leden groepsverplichtingen betalen en groepsdividenden ontvangen, en toegang beperken tot de financiele historie van de groep." name="Accounting"> + <action description="Betalen groepsverplichtingen en ontvangen van groepsdividenden" longdescription="Leden in een Rol met deze mogelijkheid betalen groepsverplichtingen en ontvangen groepsdividenden automatisch. Dit betekent dat ze een deel ontvangen van de verkoop van land in groepseigendom die dagelijks worden verdeeld, maar ook dat ze bijdragen aan zaken zoals lijstbijdrage voor het perceel." name="accounting accountable"/> + </action_set> + <action_set description="Deze Mogelijkheden regelen de toestemming dat Leden Groepsberichten kunnen versturen, ontvangen en inzien." name="Notices"> + <action description="Versturen Berichten" longdescription="Leden in een Rol met deze Mogelijkheid kunnen Berichten versturen in Groep Informatie > Berichten tab." name="notices send"/> + <action description="Ontvangen Berichten en inzien van oude Berichten" longdescription="Leden in een Rol met deze Mogelijkheid kunnen Berichten ontvangen en oude Berichten inzien in Groep Informatie > Berichten tab." name="notices receive"/> + </action_set> + <action_set description="Deze Mogelijkheden regelen de toestemming dat Leden Voorstellen kunnen maken, Voorstellen kunnen inzien, en het stemverloop kunnen bekijken." name="Proposals"> + <action description="Maken Voorstellen" longdescription="Leden in een Rol met deze Mogelijkheid kunnen Voorstellen maken waarop kan worden gestemd in Groep Informatie > Voorstellen tab." name="proposal start"/> + <action description="Stemmen op Voorstellen" longdescription="Leden in een Rol met deze Mogelijkheid kunnen stemmen op Voorstellen in Groep Informatie > Voorstellen tab." name="proposal vote"/> + </action_set> + <action_set description="Deze Mogelijkheden regelen de toegang (en de beperking ervan) tot groep chat sessies en groep voice chat." name="Chat"> + <action description="Deelname aan Groep Chat" longdescription="Leden in een Rol met deze Mogelijkheid kunnen deelnemen aan groep chat sessies, zowel voor tekst als voice." name="join group chat"/> + <action description="Deelname aan Groep Voice Chat" longdescription="Leden in een Rol met deze Mogelijkheid kunnen deelnemen aan groep voice chat sessies. OPMERKING: De Deelname Group Chat is vereist om toegang te krijgen to de voice chat sessie." name="join voice chat"/> + <action description="Modereren Groep Chat" longdescription="Leden in een Rol met deze Mogelijkheid kunnen toegang en deelname controleren in groep voice en tekst chat sessies." name="moderate group chat"/> + </action_set> +</role_actions>
\ No newline at end of file diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 4193343d64..4133315480 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -278,10 +278,12 @@ class WindowsManifest(ViewerManifest): # Vivox runtimes self.path("SLVoice.exe") - self.path("alut.dll") self.path("vivoxsdk.dll") self.path("ortp.dll") - self.path("wrap_oal.dll") + self.path("libsndfile-1.dll") + self.path("zlib1.dll") + self.path("vivoxplatform.dll") + self.path("vivoxoal.dll") # For google-perftools tcmalloc allocator. try: @@ -537,10 +539,11 @@ class DarwinManifest(ViewerManifest): self.path("zh-Hans.lproj") # SLVoice and vivox lols - self.path("vivox-runtime/universal-darwin/libalut.dylib", "libalut.dylib") - self.path("vivox-runtime/universal-darwin/libopenal.dylib", "libopenal.dylib") + self.path("vivox-runtime/universal-darwin/libsndfile.dylib", "libsndfile.dylib") + self.path("vivox-runtime/universal-darwin/libvivoxoal.dylib", "libvivoxoal.dylib") self.path("vivox-runtime/universal-darwin/libortp.dylib", "libortp.dylib") self.path("vivox-runtime/universal-darwin/libvivoxsdk.dylib", "libvivoxsdk.dylib") + self.path("vivox-runtime/universal-darwin/libvivoxplatform.dylib", "libvivoxplatform.dylib") self.path("vivox-runtime/universal-darwin/SLVoice", "SLVoice") libdir = "../../libraries/universal-darwin/lib_release" @@ -839,7 +842,10 @@ class Linux_i686Manifest(LinuxManifest): self.end_prefix() if self.prefix(src="vivox-runtime/i686-linux", dst="lib"): self.path("libortp.so") + self.path("libsndfile.so.1") + self.path("libvivoxoal.so.1") self.path("libvivoxsdk.so") + self.path("libvivoxplatform.so") self.end_prefix("lib") class Linux_x86_64Manifest(LinuxManifest): |