From 9327ef1ea0107df45c4e2066b379206a51a36c25 Mon Sep 17 00:00:00 2001 From: Richard Nelson Date: Wed, 11 Aug 2010 15:00:12 -0700 Subject: cleaned up LLFirstUse and added ignorable_dialogs to project xml --- indra/newview/llfirstuse.cpp | 180 +------------------------------------------ 1 file changed, 1 insertion(+), 179 deletions(-) (limited to 'indra/newview/llfirstuse.cpp') diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index b3fdf60b11..7f74b18fd0 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -45,7 +45,7 @@ #include "llappviewer.h" #include "lltracker.h" -/* + // static std::set LLFirstUse::sConfigVariables; @@ -76,107 +76,7 @@ void LLFirstUse::resetFirstUse() gWarningSettings.setBOOL(*iter, TRUE); } } -*/ -/* - -// Called whenever the viewer detects that your balance went up -void LLFirstUse::useBalanceIncrease(S32 delta) -{ - if (gWarningSettings.getBOOL("FirstBalanceIncrease")) - { - gWarningSettings.setBOOL("FirstBalanceIncrease", FALSE); - - LLSD args; - args["AMOUNT"] = llformat("%d",delta); - LLNotificationsUtil::add("FirstBalanceIncrease", args); - } -} - - -// Called whenever the viewer detects your balance went down -void LLFirstUse::useBalanceDecrease(S32 delta) -{ - if (gWarningSettings.getBOOL("FirstBalanceDecrease")) - { - gWarningSettings.setBOOL("FirstBalanceDecrease", FALSE); - - LLSD args; - args["AMOUNT"] = llformat("%d",-delta); - LLNotificationsUtil::add("FirstBalanceDecrease", args); - } -} - - -// static -void LLFirstUse::useSit() -{ - // Our orientation island uses sitting to teach vehicle driving - // so just never show this message. JC - //if (gWarningSettings.getBOOL("FirstSit")) - //{ - // gWarningSettings.setBOOL("FirstSit", FALSE); - // - // LLNotificationsUtil::add("FirstSit"); - //} -} - -// static -void LLFirstUse::useMap() -{ - if (gWarningSettings.getBOOL("FirstMap")) - { - gWarningSettings.setBOOL("FirstMap", FALSE); - - LLNotificationsUtil::add("FirstMap"); - } -} - -// static -void LLFirstUse::useGoTo() -{ - // nothing for now JC -} - -// static -void LLFirstUse::useBuild() -{ - if (gWarningSettings.getBOOL("FirstBuild")) - { - gWarningSettings.setBOOL("FirstBuild", FALSE); - - LLNotificationsUtil::add("FirstBuild"); - } -} - - */ -/* -// static -void LLFirstUse::useLeftClickNoHit() -{ - if (gWarningSettings.getBOOL("FirstLeftClickNoHit")) - { - gWarningSettings.setBOOL("FirstLeftClickNoHit", FALSE); - - LLNotificationsUtil::add("FirstLeftClickNoHit"); - } -} -*/ -/* -// static -void LLFirstUse::useTeleport() -{ - if (gWarningSettings.getBOOL("FirstTeleport")) - { - LLVector3d teleportDestination = LLTracker::getTrackedPositionGlobal(); - if(teleportDestination != LLVector3d::zero) - { - gWarningSettings.setBOOL("FirstTeleport", FALSE); - LLNotificationsUtil::add("FirstTeleport"); - } - } -} -*/ // static void LLFirstUse::useOverrideKeys() { @@ -192,36 +92,6 @@ void LLFirstUse::useOverrideKeys() } } } -/* -// static -void LLFirstUse::useAttach() -{ - // nothing for now -} - -// static -void LLFirstUse::useAppearance() -{ - if (gWarningSettings.getBOOL("FirstAppearance")) - { - gWarningSettings.setBOOL("FirstAppearance", FALSE); - - LLNotificationsUtil::add("FirstAppearance"); - } -} - -// static -void LLFirstUse::useInventory() -{ - if (gWarningSettings.getBOOL("FirstInventory")) - { - gWarningSettings.setBOOL("FirstInventory", FALSE); - - LLNotificationsUtil::add("FirstInventory"); - } -} - -*/ // static void LLFirstUse::useSandbox() @@ -236,51 +106,3 @@ void LLFirstUse::useSandbox() LLNotificationsUtil::add("FirstSandbox", args); } } -/* -// static -void LLFirstUse::useFlexible() -{ - if (gWarningSettings.getBOOL("FirstFlexible")) - { - gWarningSettings.setBOOL("FirstFlexible", FALSE); - - LLNotificationsUtil::add("FirstFlexible"); - } -} - -// static -void LLFirstUse::useDebugMenus() -{ - if (gWarningSettings.getBOOL("FirstDebugMenus")) - { - gWarningSettings.setBOOL("FirstDebugMenus", FALSE); - - LLNotificationsUtil::add("FirstDebugMenus"); - } -} - -// static -void LLFirstUse::useSculptedPrim() -{ - if (gWarningSettings.getBOOL("FirstSculptedPrim")) - { - gWarningSettings.setBOOL("FirstSculptedPrim", FALSE); - - LLNotificationsUtil::add("FirstSculptedPrim"); - - } -} - -// static -void LLFirstUse::useMedia() -{ - if (gWarningSettings.getBOOL("FirstMedia")) - { - gWarningSettings.setBOOL("FirstMedia", FALSE); - - // Popup removed as a short-term fix for EXT-1643. - // Ultimately, the plan is to kill all First Use dialogs - //LLNotificationsUtil::add("FirstMedia"); - } -} -*/ -- cgit v1.3 From be50a053ed4ae7d0b15fc20f1c6ca0973c56ffd9 Mon Sep 17 00:00:00 2001 From: Richard Nelson Date: Thu, 12 Aug 2010 09:46:45 -0700 Subject: first pass at hints --- indra/newview/CMakeLists.txt | 3 ++ indra/newview/app_settings/ignorable_dialogs.xml | 34 +++++++++++++++++++++ indra/newview/llbottomtray.cpp | 4 ++- indra/newview/llchatbar.cpp | 4 +++ indra/newview/llfirstuse.cpp | 33 ++++++++++++++++++++ indra/newview/llfirstuse.h | 4 +++ indra/newview/llmoveview.cpp | 7 +++++ indra/newview/llnearbychathandler.cpp | 6 +++- indra/newview/llnotificationhandler.h | 14 +++++++++ indra/newview/llnotificationmanager.cpp | 2 ++ indra/newview/llsidetray.cpp | 2 ++ indra/newview/llviewermessage.cpp | 3 ++ indra/newview/llviewerwindow.cpp | 1 + indra/newview/llviewerwindow.h | 2 ++ indra/newview/skins/default/textures/textures.xml | 8 ++++- .../default/textures/windows/hint_arrow_down.png | Bin 0 -> 3239 bytes .../default/textures/windows/hint_arrow_left.png | Bin 0 -> 3163 bytes .../default/textures/windows/hint_arrow_right.png | Bin 0 -> 3155 bytes .../default/textures/windows/hint_arrow_up.png | Bin 0 -> 3248 bytes .../default/textures/windows/hint_background.png | Bin 0 -> 3930 bytes indra/newview/skins/default/xui/en/main_view.xml | 7 +++++ .../newview/skins/default/xui/en/notifications.xml | 24 +++++++++++++++ 22 files changed, 155 insertions(+), 3 deletions(-) create mode 100644 indra/newview/skins/default/textures/windows/hint_arrow_down.png create mode 100644 indra/newview/skins/default/textures/windows/hint_arrow_left.png create mode 100644 indra/newview/skins/default/textures/windows/hint_arrow_right.png create mode 100644 indra/newview/skins/default/textures/windows/hint_arrow_up.png create mode 100644 indra/newview/skins/default/textures/windows/hint_background.png (limited to 'indra/newview/llfirstuse.cpp') diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 3e0aa587b1..7d70b2a49b 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -230,6 +230,7 @@ set(viewer_SOURCE_FILES llgroupiconctrl.cpp llgrouplist.cpp llgroupmgr.cpp + llhints.cpp llhomelocationresponder.cpp llhudeffect.cpp llhudeffectbeam.cpp @@ -300,6 +301,7 @@ set(viewer_SOURCE_FILES llnotificationalerthandler.cpp llnotificationgrouphandler.cpp llnotificationhandlerutil.cpp + llnotificationhinthandler.cpp llnotificationmanager.cpp llnotificationofferhandler.cpp llnotificationscripthandler.cpp @@ -754,6 +756,7 @@ set(viewer_HEADER_FILES llgroupiconctrl.h llgrouplist.h llgroupmgr.h + llhints.h llhomelocationresponder.h llhudeffect.h llhudeffectbeam.h diff --git a/indra/newview/app_settings/ignorable_dialogs.xml b/indra/newview/app_settings/ignorable_dialogs.xml index f11e6b015e..a0b9e33aa9 100644 --- a/indra/newview/app_settings/ignorable_dialogs.xml +++ b/indra/newview/app_settings/ignorable_dialogs.xml @@ -1,6 +1,28 @@ + FirstInventoryOffer + + Comment + Shows hint when a person or object offers you an inventory item + Persist + 1 + Type + Boolean + Value + 1 + + FirstOtherChatBeforeUser + + Comment + Shows hint when someone else chats first + Persist + 1 + Type + Boolean + Value + 1 + FirstOverrideKeys Comment @@ -23,6 +45,18 @@ Value 1 + + FirstSit + + Comment + Shows hint when someone sits for the first time + Persist + 1 + Type + Boolean + Value + 1 + AboutDirectX9 Comment diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 0e5e8d0fe7..7d4c0be3fa 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -47,6 +47,7 @@ #include "llagentcamera.h" #include "llchiclet.h" #include "llfloatercamera.h" +#include "llhints.h" #include "llimfloater.h" // for LLIMFloater #include "llnearbychatbar.h" #include "llspeakbutton.h" @@ -474,8 +475,9 @@ BOOL LLBottomTray::postBuild() mBottomTrayContextMenu = LLUICtrlFactory::getInstance()->createFromFile("menu_bottomtray.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); gMenuHolder->addChild(mBottomTrayContextMenu); - mNearbyChatBar = getChild("chat_bar"); + LLHints::registerHintTarget("nearby_chat_bar", mNearbyChatBar->LLView::getHandle()); + mToolbarStack = getChild("toolbar_stack"); mMovementButton = getChild("movement_btn"); mCamButton = getChild("camera_btn"); diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp index 73fbe78298..96001a07a0 100644 --- a/indra/newview/llchatbar.cpp +++ b/indra/newview/llchatbar.cpp @@ -571,6 +571,10 @@ void LLChatBar::sendChatFromViewer(const std::string &utf8text, EChatType type, void LLChatBar::sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL animate) { + // as soon as we say something, we no longer care about teaching the user + // how to chat + gWarningSettings.setBOOL("FirstOtherChatBeforeUser", FALSE); + // Look for "/20 foo" channel chats. S32 channel = 0; LLWString out_text = stripChannelNumber(wtext, &channel); diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index 7f74b18fd0..8906525676 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -93,6 +93,39 @@ void LLFirstUse::useOverrideKeys() } } +// static +void LLFirstUse::otherAvatarChat() +{ + if (gWarningSettings.getBOOL("FirstOtherChatBeforeUser")) + { + gWarningSettings.setBOOL("FirstOtherChatBeforeUser", FALSE); + + LLNotificationsUtil::add("HintChat", LLSD(), LLSD().with("target", "nearby_chat_bar").with("direction", "top")); + } +} + +// static +void LLFirstUse::sit() +{ + if (gWarningSettings.getBOOL("FirstSit")) + { + gWarningSettings.setBOOL("FirstSit", FALSE); + + LLNotificationsUtil::add("HintSit", LLSD(), LLSD().with("target", "stand_btn").with("direction", "top")); + } +} + +// static +void LLFirstUse::inventoryOffer() +{ + if (gWarningSettings.getBOOL("FirstInventoryOffer")) + { + gWarningSettings.setBOOL("FirstInventoryOffer", FALSE); + + LLNotificationsUtil::add("HintInventory", LLSD(), LLSD().with("target", "inventory_btn").with("direction", "left")); + } +} + // static void LLFirstUse::useSandbox() { diff --git a/indra/newview/llfirstuse.h b/indra/newview/llfirstuse.h index 20ddef04d7..ca7290fe17 100644 --- a/indra/newview/llfirstuse.h +++ b/indra/newview/llfirstuse.h @@ -86,7 +86,11 @@ public: // Sets all controls back to show the dialogs. static void disableFirstUse(); static void resetFirstUse(); + static void useOverrideKeys(); + static void otherAvatarChat(); + static void sit(); + static void inventoryOffer(); static void useSandbox(); diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp index fc41137686..19615def93 100644 --- a/indra/newview/llmoveview.cpp +++ b/indra/newview/llmoveview.cpp @@ -45,7 +45,9 @@ #include "llvoavatarself.h" // to check gAgentAvatarp->isSitting() #include "llbottomtray.h" #include "llbutton.h" +#include "llfirstuse.h" #include "llfloaterreg.h" +#include "llhints.h" #include "lljoystickbutton.h" #include "lluictrlfactory.h" #include "llviewerwindow.h" @@ -566,6 +568,10 @@ void LLPanelStandStopFlying::setStandStopFlyingMode(EStandStopFlyingMode mode) { LLPanelStandStopFlying* panel = getInstance(); + if (mode == SSFM_STAND) + { + LLFirstUse::sit(); + } panel->mStandButton->setVisible(SSFM_STAND == mode); panel->mStopFlyingButton->setVisible(SSFM_STOP_FLYING == mode); @@ -596,6 +602,7 @@ BOOL LLPanelStandStopFlying::postBuild() mStandButton->setCommitCallback(boost::bind(&LLPanelStandStopFlying::onStandButtonClick, this)); mStandButton->setCommitCallback(boost::bind(&LLFloaterMove::enableInstance, TRUE)); mStandButton->setVisible(FALSE); + LLHints::registerHintTarget("stand_btn", mStandButton->getHandle()); mStopFlyingButton = getChild("stop_fly_btn"); //mStopFlyingButton->setCommitCallback(boost::bind(&LLFloaterMove::setFlyingMode, FALSE)); diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index 1fadb126e4..31a59146d6 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -37,6 +37,7 @@ #include "llbottomtray.h" #include "llchatitemscontainerctrl.h" +#include "llfirstuse.h" #include "llfloaterscriptdebug.h" #include "llnearbychat.h" #include "llrecentpeople.h" @@ -347,7 +348,10 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args) if(chat_msg.mMuted == TRUE) return; if(chat_msg.mSourceType == CHAT_SOURCE_AGENT && chat_msg.mFromID.notNull()) - LLRecentPeople::instance().add(chat_msg.mFromID); + { + LLRecentPeople::instance().add(chat_msg.mFromID); + LLFirstUse::otherAvatarChat(); + } if(chat_msg.mText.empty()) return;//don't process empty messages diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h index 99a1fedcf3..7b8f530178 100644 --- a/indra/newview/llnotificationhandler.h +++ b/indra/newview/llnotificationhandler.h @@ -269,6 +269,20 @@ protected: void onRejectToast(LLUUID& id); }; +/** + * Handler for UI hints. + */ +class LLHintHandler : public LLSingleton +{ +public: + LLHintHandler(); + virtual ~LLHintHandler(); + + // base interface functions + virtual bool processNotification(const LLSD& notify); +}; + + class LLHandlerUtil { public: diff --git a/indra/newview/llnotificationmanager.cpp b/indra/newview/llnotificationmanager.cpp index 4401bb953f..86496c9d02 100644 --- a/indra/newview/llnotificationmanager.cpp +++ b/indra/newview/llnotificationmanager.cpp @@ -66,6 +66,7 @@ void LLNotificationManager::init() LLNotificationChannel::buildChannel("AlertModal", "Visible", LLNotificationFilters::filterBy(&LLNotification::getType, "alertmodal")); LLNotificationChannel::buildChannel("IM Notifications", "Visible", LLNotificationFilters::filterBy(&LLNotification::getType, "notifytoast")); LLNotificationChannel::buildChannel("Offer", "Visible", LLNotificationFilters::filterBy(&LLNotification::getType, "offer")); + LLNotificationChannel::buildChannel("Hints", "Visible", LLNotificationFilters::filterBy(&LLNotification::getType, "hint")); LLNotifications::instance().getChannel("Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); LLNotifications::instance().getChannel("NotificationTips")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); @@ -74,6 +75,7 @@ void LLNotificationManager::init() LLNotifications::instance().getChannel("AlertModal")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); LLNotifications::instance().getChannel("IM Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); LLNotifications::instance().getChannel("Offer")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); + LLNotifications::instance().getChannel("Hints")->connectChanged(boost::bind(&LLHintHandler::processNotification, LLHintHandler::getInstance(), _1)); mNotifyHandlers["notify"] = boost::shared_ptr(new LLScriptHandler(NT_NOTIFY, LLSD())); mNotifyHandlers["notifytip"] = boost::shared_ptr(new LLTipHandler(NT_NOTIFY, LLSD())); diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 7104f3934d..066b694618 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -37,6 +37,7 @@ #include "llagentcamera.h" #include "llappviewer.h" #include "llbottomtray.h" +#include "llhints.h" #include "llsidetray.h" #include "llviewerwindow.h" #include "llaccordionctrl.h" @@ -430,6 +431,7 @@ void LLSideTray::createButtons () mTabButtons[name] = button; } } + LLHints::registerHintTarget("inventory_btn", mTabButtons["sidebar_inventory"]->getHandle()); } void LLSideTray::processTriState () diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index a04c919310..9bb734a3d3 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -56,6 +56,7 @@ #include "llagentcamera.h" #include "llcallingcard.h" #include "llbuycurrencyhtml.h" +#include "llfirstuse.h" #include "llfloaterbuyland.h" #include "llfloaterland.h" #include "llfloaterregioninfo.h" @@ -1763,6 +1764,8 @@ void inventory_offer_handler(LLOfferInfo* info) return; } + LLFirstUse::inventoryOffer(); + // Avoid the Accept/Discard dialog if the user so desires. JC if (gSavedSettings.getBOOL("AutoAcceptNewInventory") && (info->mType == LLAssetType::AT_NOTECARD diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index b36af7d95b..566f4b45ba 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1529,6 +1529,7 @@ void LLViewerWindow::initBase() mNonSideTrayView = main_view->getChildView("non_side_tray_view")->getHandle(); mFloaterViewHolder = main_view->getChildView("floater_view_holder")->getHandle(); mPopupView = main_view->getChild("popup_holder"); + mHintHolder = main_view->getChild("hint_holder")->getHandle(); // Constrain floaters to inside the menu and status bar regions. gFloaterView = main_view->getChild("Floater View"); diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index 1e0200a075..cd1ee8a5fd 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -294,6 +294,7 @@ public: void updateWorldViewRect(bool use_full_window=false); LLView* getNonSideTrayView() { return mNonSideTrayView.get(); } LLView* getFloaterViewHolder() { return mFloaterViewHolder.get(); } + LLView* getHintHolder() { return mHintHolder.get(); } BOOL handleKey(KEY key, MASK mask); void handleScrollWheel (S32 clicks); @@ -453,6 +454,7 @@ protected: LLHandle mWorldViewPlaceholder; // widget that spans the portion of screen dedicated to rendering the 3d world LLHandle mNonSideTrayView; // parent of world view + bottom bar, etc...everything but the side tray LLHandle mFloaterViewHolder; // container for floater_view + LLHandle mHintHolder; // container for hints LLPopupView* mPopupView; // container for transient popups class LLDebugText* mDebugText; // Internal class for debug text diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 082b37d80b..9fbbfb1d2b 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -645,5 +645,11 @@ with the same filename but different name - + + + + + + + diff --git a/indra/newview/skins/default/textures/windows/hint_arrow_down.png b/indra/newview/skins/default/textures/windows/hint_arrow_down.png new file mode 100644 index 0000000000..11ab3c2d0c Binary files /dev/null and b/indra/newview/skins/default/textures/windows/hint_arrow_down.png differ diff --git a/indra/newview/skins/default/textures/windows/hint_arrow_left.png b/indra/newview/skins/default/textures/windows/hint_arrow_left.png new file mode 100644 index 0000000000..e5c597a550 Binary files /dev/null and b/indra/newview/skins/default/textures/windows/hint_arrow_left.png differ diff --git a/indra/newview/skins/default/textures/windows/hint_arrow_right.png b/indra/newview/skins/default/textures/windows/hint_arrow_right.png new file mode 100644 index 0000000000..3f89187e13 Binary files /dev/null and b/indra/newview/skins/default/textures/windows/hint_arrow_right.png differ diff --git a/indra/newview/skins/default/textures/windows/hint_arrow_up.png b/indra/newview/skins/default/textures/windows/hint_arrow_up.png new file mode 100644 index 0000000000..1050097efb Binary files /dev/null and b/indra/newview/skins/default/textures/windows/hint_arrow_up.png differ diff --git a/indra/newview/skins/default/textures/windows/hint_background.png b/indra/newview/skins/default/textures/windows/hint_background.png new file mode 100644 index 0000000000..0839a95205 Binary files /dev/null and b/indra/newview/skins/default/textures/windows/hint_background.png differ diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml index a1ca910cbb..0bf5717de8 100644 --- a/indra/newview/skins/default/xui/en/main_view.xml +++ b/indra/newview/skins/default/xui/en/main_view.xml @@ -208,6 +208,13 @@ bottom="-1" height="11" /> + + + Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam + + + + + Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam + + + + + Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam + + + - Your CPU speed does not meet the minimum requirements. -- cgit v1.3 From bd897431e14aff091d5f45425816ddec4b2538c7 Mon Sep 17 00:00:00 2001 From: Richard Linden Date: Thu, 12 Aug 2010 12:20:38 -0700 Subject: remaining hints defined --- indra/newview/app_settings/ignorable_dialogs.xml | 48 +++++++++++- indra/newview/llbottomtray.cpp | 5 +- indra/newview/llfirstuse.cpp | 88 ++++++++++++++-------- indra/newview/llfirstuse.h | 16 +++- indra/newview/llhints.cpp | 40 ++++++---- indra/newview/llhints.h | 3 + indra/newview/llnotificationhinthandler.cpp | 10 ++- indra/newview/llsidepanelinventory.cpp | 3 + indra/newview/llsidetray.cpp | 2 + indra/newview/llstatusbar.cpp | 3 + .../newview/skins/default/xui/en/notifications.xml | 31 +++++++- 11 files changed, 189 insertions(+), 60 deletions(-) (limited to 'indra/newview/llfirstuse.cpp') diff --git a/indra/newview/app_settings/ignorable_dialogs.xml b/indra/newview/app_settings/ignorable_dialogs.xml index a0b9e33aa9..0720ccee49 100644 --- a/indra/newview/app_settings/ignorable_dialogs.xml +++ b/indra/newview/app_settings/ignorable_dialogs.xml @@ -4,7 +4,7 @@ FirstInventoryOffer Comment - Shows hint when a person or object offers you an inventory item + Shows hint when a person or object offers resident an inventory item Persist 1 Type @@ -12,7 +12,51 @@ Value 1 - FirstOtherChatBeforeUser + FirstNotUseDestinationGuide + + Comment + Shows hint when resident doesn't activate destination guide + Persist + 1 + Type + Boolean + Value + 1 + + FirstNotUseSidePanel + + Comment + Shows hint when resident doesn't activate side panel + Persist + 1 + Type + Boolean + Value + 1 + + FirstNotMoving + + Comment + Shows hint when resident doesn't move + Persist + 1 + Type + Boolean + Value + 1 + + FirstReceiveLindens + + Comment + Shows hint when resident receives linden dollars + Persist + 1 + Type + Boolean + Value + 1 + + FirstOtherChatBeforeUser Comment Shows hint when someone else chats first diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 7d4c0be3fa..e0b605a724 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -69,10 +69,6 @@ template class LLBottomTray* LLSingleton::getInstance(); namespace { const std::string& PANEL_CHICLET_NAME = "chiclet_list_panel"; - const std::string& PANEL_CHATBAR_NAME = "chat_bar"; - const std::string& PANEL_MOVEMENT_NAME = "movement_panel"; - const std::string& PANEL_CAMERA_NAME = "cam_panel"; - const std::string& PANEL_GESTURE_NAME = "gesture_panel"; S32 get_panel_min_width(LLLayoutStack* stack, LLView* panel) { @@ -480,6 +476,7 @@ BOOL LLBottomTray::postBuild() mToolbarStack = getChild("toolbar_stack"); mMovementButton = getChild("movement_btn"); + LLHints::registerHintTarget("move_btn", mMovementButton->getHandle()); mCamButton = getChild("camera_btn"); setRightMouseDownCallback(boost::bind(&LLBottomTray::showBottomTrayContextMenu,this, _2, _3,_4)); diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index 8906525676..d2dff49904 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -36,7 +36,7 @@ // library includes #include "indra_constants.h" -#include "llnotificationsutil.h" +#include "llnotifications.h" // viewer includes #include "llagent.h" // for gAgent.inPrelude() @@ -48,6 +48,7 @@ // static std::set LLFirstUse::sConfigVariables; +std::map LLFirstUse::sNotifications; // static void LLFirstUse::addConfigVariable(const std::string& var) @@ -84,58 +85,79 @@ void LLFirstUse::useOverrideKeys() // so don't show this message until you get off OI. JC if (!gAgent.inPrelude()) { - if (gWarningSettings.getBOOL("FirstOverrideKeys")) - { - gWarningSettings.setBOOL("FirstOverrideKeys", FALSE); - - LLNotificationsUtil::add("FirstOverrideKeys"); - } + firstUseNotification("FirstOverrideKeys", true, "FirstOverrideKeys"); } } // static -void LLFirstUse::otherAvatarChat() +void LLFirstUse::otherAvatarChat(bool enable) { - if (gWarningSettings.getBOOL("FirstOtherChatBeforeUser")) - { - gWarningSettings.setBOOL("FirstOtherChatBeforeUser", FALSE); + firstUseNotification("FirstOtherChatBeforeUser", enable, "HintChat", LLSD(), LLSD().with("target", "nearby_chat_bar").with("direction", "top")); +} - LLNotificationsUtil::add("HintChat", LLSD(), LLSD().with("target", "nearby_chat_bar").with("direction", "top")); - } +// static +void LLFirstUse::sit(bool enable) +{ + firstUseNotification("FirstSit", enable, "HintSit", LLSD(), LLSD().with("target", "stand_btn").with("direction", "top")); } // static -void LLFirstUse::sit() +void LLFirstUse::inventoryOffer(bool enable) { - if (gWarningSettings.getBOOL("FirstSit")) - { - gWarningSettings.setBOOL("FirstSit", FALSE); + firstUseNotification("FirstInventoryOffer", enable, "HintInventory", LLSD(), LLSD().with("target", "inventory_btn").with("direction", "left")); +} - LLNotificationsUtil::add("HintSit", LLSD(), LLSD().with("target", "stand_btn").with("direction", "top")); - } +// static +void LLFirstUse::useSandbox() +{ + firstUseNotification("FirstSandbox", true, "FirstSandbox", LLSD().with("HOURS", SANDBOX_CLEAN_FREQ).with("TIME", SANDBOX_FIRST_CLEAN_HOUR)); } // static -void LLFirstUse::inventoryOffer() +void LLFirstUse::notUsingDestinationGuide(bool enable) { - if (gWarningSettings.getBOOL("FirstInventoryOffer")) - { - gWarningSettings.setBOOL("FirstInventoryOffer", FALSE); + firstUseNotification("FirstNotUseDestinationGuide", enable, "HintDestinationGuide", LLSD(), LLSD().with("target", "dest_guide_btn").with("direction", "left")); +} - LLNotificationsUtil::add("HintInventory", LLSD(), LLSD().with("target", "inventory_btn").with("direction", "left")); - } +// static +void LLFirstUse::notUsingSidePanel(bool enable) +{ + firstUseNotification("FirstNotUseSidePanel", enable, "HintSidePanel", LLSD(), LLSD().with("target", "side_panel_btn").with("direction", "left")); } // static -void LLFirstUse::useSandbox() +void LLFirstUse::notMoving(bool enable) { - if (gWarningSettings.getBOOL("FirstSandbox")) - { - gWarningSettings.setBOOL("FirstSandbox", FALSE); + firstUseNotification("FirstNotMoving", enable, "HintMove", LLSD(), LLSD().with("target", "move_btn").with("direction", "top")); +} + +// static +void LLFirstUse::receiveLindens(bool enable) +{ + firstUseNotification("FirstReceiveLindens", enable, "HintLindenDollar", LLSD(), LLSD().with("target", "linden_balance").with("direction", "bottom")); +} + + +//static +void LLFirstUse::firstUseNotification(const std::string& control_var, bool enable, const std::string& notification_name, LLSD args, LLSD payload) +{ + LLNotificationPtr notif = sNotifications[notification_name]; - LLSD args; - args["HOURS"] = llformat("%d",SANDBOX_CLEAN_FREQ); - args["TIME"] = llformat("%d",SANDBOX_FIRST_CLEAN_HOUR); - LLNotificationsUtil::add("FirstSandbox", args); + if (enable) + { + if (!notif && gWarningSettings.getBOOL(control_var)) + { // create new notification + sNotifications[notification_name] = LLNotifications::instance().add(LLNotification::Params().name(notification_name).substitutions(args).payload(payload)); + gWarningSettings.setBOOL(control_var, FALSE); + } + } + else + { // want to hide notification + if (notif) + { // cancel existing notification + LLNotifications::instance().cancel(notif); + sNotifications.erase(notification_name); + } } + } diff --git a/indra/newview/llfirstuse.h b/indra/newview/llfirstuse.h index ca7290fe17..abf7d9836e 100644 --- a/indra/newview/llfirstuse.h +++ b/indra/newview/llfirstuse.h @@ -76,6 +76,9 @@ object or from inventory. 14. First time you create/edit a sculpted prim. */ +class LLNotification; + + class LLFirstUse { public: @@ -88,14 +91,19 @@ public: static void resetFirstUse(); static void useOverrideKeys(); - static void otherAvatarChat(); - static void sit(); - static void inventoryOffer(); - + static void otherAvatarChat(bool enable = true); + static void sit(bool enable = true); + static void notUsingDestinationGuide(bool enable = true); + static void notUsingSidePanel(bool enable = true); + static void notMoving(bool enable = true); + static void inventoryOffer(bool enable = true); + static void receiveLindens(bool enable = true); static void useSandbox(); protected: + static void firstUseNotification(const std::string& control_var, bool enable, const std::string& notification_name, LLSD args = LLSD(), LLSD payload = LLSD()); static std::set sConfigVariables; + static std::map > sNotifications; }; #endif diff --git a/indra/newview/llhints.cpp b/indra/newview/llhints.cpp index a8c3183301..2f3504efed 100644 --- a/indra/newview/llhints.cpp +++ b/indra/newview/llhints.cpp @@ -149,7 +149,7 @@ void LLHintPopup::draw() targetp->localRectToOtherView(targetp->getLocalRect(), &target_rect, getParent()); LLRect my_local_rect = getLocalRect(); - LLRect my_rect = getRect(); + LLRect my_rect; LLRect arrow_rect; LLUIImagePtr arrow_imagep; @@ -158,10 +158,10 @@ void LLHintPopup::draw() switch(mDirection) { case LEFT: - my_rect.setCenterAndSize( target_rect.mLeft - (my_rect.getWidth() / 2 + mDistance), + my_rect.setCenterAndSize( target_rect.mLeft - (my_local_rect.getWidth() / 2 + mDistance), target_rect.getCenterY(), - my_rect.getWidth(), - my_rect.getHeight()); + my_local_rect.getWidth(), + my_local_rect.getHeight()); arrow_rect.setCenterAndSize(my_local_rect.mRight + mArrowRight->getWidth() / 2 - OVERLAP, my_local_rect.getCenterY(), mArrowRight->getWidth(), @@ -170,9 +170,9 @@ void LLHintPopup::draw() break; case TOP: my_rect.setCenterAndSize( target_rect.getCenterX(), - target_rect.mTop + (my_rect.getHeight() / 2 + mDistance), - my_rect.getWidth(), - my_rect.getHeight()); + target_rect.mTop + (my_local_rect.getHeight() / 2 + mDistance), + my_local_rect.getWidth(), + my_local_rect.getHeight()); arrow_rect.setCenterAndSize(my_local_rect.getCenterX(), my_local_rect.mBottom - mArrowDown->getHeight() / 2 + OVERLAP, mArrowDown->getWidth(), @@ -181,9 +181,9 @@ void LLHintPopup::draw() break; case RIGHT: my_rect.setCenterAndSize( target_rect.getCenterX(), - target_rect.mTop - (my_rect.getHeight() / 2 + mDistance), - my_rect.getWidth(), - my_rect.getHeight()); + target_rect.mTop - (my_local_rect.getHeight() / 2 + mDistance), + my_local_rect.getWidth(), + my_local_rect.getHeight()); arrow_rect.setCenterAndSize(my_local_rect.mLeft - mArrowLeft->getWidth() / 2 + OVERLAP, my_local_rect.getCenterY(), mArrowLeft->getWidth(), @@ -191,10 +191,10 @@ void LLHintPopup::draw() arrow_imagep = mArrowLeft; break; case BOTTOM: - my_rect.setCenterAndSize( target_rect.mLeft + (my_rect.getWidth() / 2 + mDistance), + my_rect.setCenterAndSize( target_rect.mLeft + (my_local_rect.getWidth() / 2 + mDistance), target_rect.getCenterY(), - my_rect.getWidth(), - my_rect.getHeight()); + my_local_rect.getWidth(), + my_local_rect.getHeight()); arrow_rect.setCenterAndSize(my_local_rect.getCenterX(), my_local_rect.mTop + mArrowUp->getHeight() / 2 - OVERLAP, mArrowUp->getWidth(), @@ -211,6 +211,7 @@ void LLHintPopup::draw() LLRegistry > LLHints::sTargetRegistry; +std::map LLHints::sHints; //static void LLHints::show(LLNotificationPtr hint) @@ -221,6 +222,9 @@ void LLHints::show(LLNotificationPtr hint) p.notification = hint; LLHintPopup* popup = new LLHintPopup(p); + + sHints[hint] = popup; + LLView* hint_holder = gViewerWindow->getHintHolder(); if (hint_holder) { @@ -229,6 +233,16 @@ void LLHints::show(LLNotificationPtr hint) } } +void LLHints::hide(LLNotificationPtr hint) +{ + hint_map_t::iterator found_it = sHints.find(hint); + if (found_it != sHints.end()) + { + found_it->second->hide(); + sHints.erase(found_it); + } +} + //static void LLHints::registerHintTarget(const std::string& name, LLHandle target) { diff --git a/indra/newview/llhints.h b/indra/newview/llhints.h index b5255db95b..4ecdc9937c 100644 --- a/indra/newview/llhints.h +++ b/indra/newview/llhints.h @@ -41,10 +41,13 @@ class LLHints { public: static void show(LLNotificationPtr hint); + static void hide(LLNotificationPtr hint); static void registerHintTarget(const std::string& name, LLHandle target); static LLHandle getHintTarget(const std::string& name); private: static LLRegistry > sTargetRegistry; + typedef std::map hint_map_t; + static hint_map_t sHints; }; diff --git a/indra/newview/llnotificationhinthandler.cpp b/indra/newview/llnotificationhinthandler.cpp index f5c0330b2a..a9460821b0 100644 --- a/indra/newview/llnotificationhinthandler.cpp +++ b/indra/newview/llnotificationhinthandler.cpp @@ -49,10 +49,16 @@ LLHintHandler::~LLHintHandler() bool LLHintHandler::processNotification(const LLSD& notify) { - if (notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "load") + LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID()); + + std::string sigtype = notify["sigtype"].asString(); + if (sigtype == "add" || sigtype == "load") { - LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID()); LLHints::show(notification); } + else if (sigtype == "delete") + { + LLHints::hide(notification); + } return false; } diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index 0951586dd5..7eda4fad20 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -36,6 +36,7 @@ #include "llappearancemgr.h" #include "llavataractions.h" #include "llbutton.h" +#include "llfirstuse.h" #include "llinventorybridge.h" #include "llinventoryfunctions.h" #include "llinventorypanel.h" @@ -148,6 +149,8 @@ void LLSidepanelInventory::onOpen(const LLSD& key) mTaskPanel->setObjectSelection(LLSelectMgr::getInstance()->getSelection()); showTaskInfoPanel(); } + + LLFirstUse::inventoryOffer(false); } void LLSidepanelInventory::onInfoButtonClicked() diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 066b694618..7e8dc2747b 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -423,6 +423,7 @@ void LLSideTray::createButtons () { mCollapseButton = createButton("",sidebar_tab->mImage,sidebar_tab->getTabTitle(), boost::bind(&LLSideTray::onToggleCollapse, this)); + LLHints::registerHintTarget("side_panel_btn", mCollapseButton->getHandle()); } else { @@ -432,6 +433,7 @@ void LLSideTray::createButtons () } } LLHints::registerHintTarget("inventory_btn", mTabButtons["sidebar_inventory"]->getHandle()); + LLHints::registerHintTarget("dest_guide_btn", mTabButtons["sidebar_places"]->getHandle()); } void LLSideTray::processTriState () diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index a6bb4d4d5f..46d148c088 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -47,6 +47,7 @@ #include "llpanelvolumepulldown.h" #include "llfloaterregioninfo.h" #include "llfloaterscriptdebug.h" +#include "llhints.h" #include "llhudicon.h" #include "llnavigationbar.h" #include "llkeyboard.h" @@ -191,6 +192,8 @@ BOOL LLStatusBar::postBuild() mMediaToggle->setClickedCallback( &LLStatusBar::onClickMediaToggle, this ); mMediaToggle->setMouseEnterCallback(boost::bind(&LLStatusBar::onMouseEnterNearbyMedia, this)); + LLHints::registerHintTarget("linden_balance", getChild("balance_bg")->getHandle()); + gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&LLStatusBar::onVolumeChanged, this, _2)); // Adding Net Stat Graph diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index d7684e434e..8db89a7622 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -6389,12 +6389,33 @@ Mute everyone? label="Hint for Chatting" type="hint"> Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam - + Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam + + + + Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam + + + + Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam + + + + Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam @@ -6405,7 +6426,13 @@ Mute everyone? label="Hint for Inventory" type="hint"> Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam - + + + + Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam -- cgit v1.3 From 2c999688c4c792630865bd97c2b45ff886d9a26c Mon Sep 17 00:00:00 2001 From: Richard Linden Date: Thu, 12 Aug 2010 15:18:25 -0700 Subject: added remaining hints and fade in/fade out behavior --- indra/newview/app_settings/settings.xml | 33 ++++++++++++ indra/newview/llagent.cpp | 21 ++++++++ indra/newview/llagent.h | 1 + indra/newview/llappviewer.cpp | 3 ++ indra/newview/llappviewer.h | 1 + indra/newview/llfirstuse.cpp | 8 +-- indra/newview/llfirstuse.h | 2 +- indra/newview/llhints.cpp | 62 +++++++++++++++++----- indra/newview/llmoveview.cpp | 2 + indra/newview/llnearbychatbar.cpp | 2 + indra/newview/llnearbychathandler.cpp | 5 +- indra/newview/llpanelplaces.cpp | 3 ++ indra/newview/llsidepanelinventory.cpp | 4 +- indra/newview/llsidetray.cpp | 2 + indra/newview/llstatusbar.cpp | 7 +++ indra/newview/llviewerwindow.cpp | 13 +++++ .../newview/skins/default/xui/en/notifications.xml | 28 +++++----- indra/newview/skins/default/xui/en/panel_hint.xml | 1 + 18 files changed, 164 insertions(+), 34 deletions(-) (limited to 'indra/newview/llfirstuse.cpp') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 3326319e2d..12fb8741ca 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -11947,5 +11947,38 @@ Value 10 + NotMovingHintTimeout + + Comment + Number of seconds to wait for resident to move before displaying move hint. + Persist + 1 + Type + F32 + Value + 120.0 + + DestinationGuideHintTimeout + + Comment + Number of seconds to wait before telling resident about destination guide. + Persist + 1 + Type + F32 + Value + 600.0 + + SidePanelHintTimeout + + Comment + Number of seconds to wait before telling resident about side panel. + Persist + 1 + Type + F32 + Value + 300.0 + diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index e85d108bb2..0ff88f7451 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -44,6 +44,7 @@ #include "llcallingcard.h" #include "llchannelmanager.h" #include "llconsole.h" +#include "llfirstuse.h" #include "llfloatercamera.h" #include "llfloaterreg.h" #include "llfloatertools.h" @@ -306,6 +307,9 @@ void LLAgent::ageChat() //----------------------------------------------------------------------------- void LLAgent::moveAt(S32 direction, bool reset) { + mMoveTimer.reset(); + LLFirstUse::notMoving(false); + // age chat timer so it fades more quickly when you are intentionally moving ageChat(); @@ -331,6 +335,9 @@ void LLAgent::moveAt(S32 direction, bool reset) //----------------------------------------------------------------------------- void LLAgent::moveAtNudge(S32 direction) { + mMoveTimer.reset(); + LLFirstUse::notMoving(false); + // age chat timer so it fades more quickly when you are intentionally moving ageChat(); @@ -353,6 +360,9 @@ void LLAgent::moveAtNudge(S32 direction) //----------------------------------------------------------------------------- void LLAgent::moveLeft(S32 direction) { + mMoveTimer.reset(); + LLFirstUse::notMoving(false); + // age chat timer so it fades more quickly when you are intentionally moving ageChat(); @@ -375,6 +385,9 @@ void LLAgent::moveLeft(S32 direction) //----------------------------------------------------------------------------- void LLAgent::moveLeftNudge(S32 direction) { + mMoveTimer.reset(); + LLFirstUse::notMoving(false); + // age chat timer so it fades more quickly when you are intentionally moving ageChat(); @@ -397,6 +410,9 @@ void LLAgent::moveLeftNudge(S32 direction) //----------------------------------------------------------------------------- void LLAgent::moveUp(S32 direction) { + mMoveTimer.reset(); + LLFirstUse::notMoving(false); + // age chat timer so it fades more quickly when you are intentionally moving ageChat(); @@ -1534,6 +1550,11 @@ void LLAgent::propagate(const F32 dt) //----------------------------------------------------------------------------- void LLAgent::updateAgentPosition(const F32 dt, const F32 yaw_radians, const S32 mouse_x, const S32 mouse_y) { + if (mMoveTimer.getElapsedTimeF32() > gSavedSettings.getF32("NotMovingHintTimeout")) + { + LLFirstUse::notMoving(); + } + propagate(dt); // static S32 cameraUpdateCount = 0; diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index 32f9b00135..0185f874f9 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -270,6 +270,7 @@ public: private: LLFrameTimer mFidgetTimer; LLFrameTimer mFocusObjectFadeTimer; + LLFrameTimer mMoveTimer; F32 mNextFidgetTime; S32 mCurrentFidget; diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index d222d94ec6..768be116f6 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -268,6 +268,7 @@ const F64 FRAME_STALL_THRESHOLD = 1.0; LLTimer gRenderStartTime; LLFrameTimer gForegroundTime; +LLFrameTimer gLoggedInTime; LLTimer gLogoutTimer; static const F32 LOGOUT_REQUEST_TIME = 6.f; // this will be cut short by the LogoutReply msg. F32 gLogoutMaxTime = LOGOUT_REQUEST_TIME; @@ -597,6 +598,7 @@ LLAppViewer::LLAppViewer() : setupErrorHandling(); sInstance = this; + gLoggedInTime.stop(); } LLAppViewer::~LLAppViewer() @@ -4281,6 +4283,7 @@ void LLAppViewer::pingMainloopTimeout(const std::string& state, F32 secs) void LLAppViewer::handleLoginComplete() { + gLoggedInTime.start(); initMainloopTimeout("Mainloop Init"); // Store some data to DebugInfo in case of a freeze. diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 0b862a92a1..e5e27dc908 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -313,6 +313,7 @@ extern U32 gFrameStalls; extern LLTimer gRenderStartTime; extern LLFrameTimer gForegroundTime; +extern LLFrameTimer gLoggedInTime; extern F32 gLogoutMaxTime; extern LLTimer gLogoutTimer; diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index d2dff49904..4708087846 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -90,7 +90,7 @@ void LLFirstUse::useOverrideKeys() } // static -void LLFirstUse::otherAvatarChat(bool enable) +void LLFirstUse::otherAvatarChatFirst(bool enable) { firstUseNotification("FirstOtherChatBeforeUser", enable, "HintChat", LLSD(), LLSD().with("target", "nearby_chat_bar").with("direction", "top")); } @@ -116,13 +116,15 @@ void LLFirstUse::useSandbox() // static void LLFirstUse::notUsingDestinationGuide(bool enable) { - firstUseNotification("FirstNotUseDestinationGuide", enable, "HintDestinationGuide", LLSD(), LLSD().with("target", "dest_guide_btn").with("direction", "left")); + // not doing this yet + //firstUseNotification("FirstNotUseDestinationGuide", enable, "HintDestinationGuide", LLSD(), LLSD().with("target", "dest_guide_btn").with("direction", "left")); } // static void LLFirstUse::notUsingSidePanel(bool enable) { - firstUseNotification("FirstNotUseSidePanel", enable, "HintSidePanel", LLSD(), LLSD().with("target", "side_panel_btn").with("direction", "left")); + // not doing this yet + //firstUseNotification("FirstNotUseSidePanel", enable, "HintSidePanel", LLSD(), LLSD().with("target", "side_panel_btn").with("direction", "left")); } // static diff --git a/indra/newview/llfirstuse.h b/indra/newview/llfirstuse.h index abf7d9836e..48943cd9ab 100644 --- a/indra/newview/llfirstuse.h +++ b/indra/newview/llfirstuse.h @@ -91,7 +91,7 @@ public: static void resetFirstUse(); static void useOverrideKeys(); - static void otherAvatarChat(bool enable = true); + static void otherAvatarChatFirst(bool enable = true); static void sit(bool enable = true); static void notUsingDestinationGuide(bool enable = true); static void notUsingSidePanel(bool enable = true); diff --git a/indra/newview/llhints.cpp b/indra/newview/llhints.cpp index 2f3504efed..66799535c1 100644 --- a/indra/newview/llhints.cpp +++ b/indra/newview/llhints.cpp @@ -72,7 +72,13 @@ public: Optional left_arrow, up_arrow, right_arrow, - down_arrow; + down_arrow; + Optional left_arrow_offset, + up_arrow_offset, + right_arrow_offset, + down_arrow_offset; + Optional fade_in_time, + fade_out_time; Params() : direction("direction", TOP), @@ -81,7 +87,13 @@ public: left_arrow("left_arrow", LLUI::getUIImage("hint_arrow_left")), up_arrow("up_arrow", LLUI::getUIImage("hint_arrow_up")), right_arrow("right_arrow", LLUI::getUIImage("hint_arrow_right")), - down_arrow("down_arrow", LLUI::getUIImage("hint_arrow_down")) + down_arrow("down_arrow", LLUI::getUIImage("hint_arrow_down")), + left_arrow_offset("left_arrow_offset", 3), + up_arrow_offset("up_arrow_offset", -2), + right_arrow_offset("right_arrow_offset", -3), + down_arrow_offset("down_arrow_offset", 5), + fade_in_time("fade_in_time", 0.2f), + fade_out_time("fade_out_time", 0.5f) {} }; @@ -92,7 +104,7 @@ public: void onClickClose() { hide(); } void draw(); - void hide() { die(); } + void hide() { mHidden = true; mFadeTimer.reset(); } private: LLNotificationPtr mNotification; @@ -103,6 +115,14 @@ private: mArrowUp, mArrowRight, mArrowDown; + S32 mArrowLeftOffset, + mArrowUpOffset, + mArrowRightOffset, + mArrowDownOffset; + LLFrameTimer mFadeTimer; + F32 mFadeInTime, + mFadeOutTime; + bool mHidden; }; @@ -117,6 +137,13 @@ LLHintPopup::LLHintPopup(const LLHintPopup::Params& p) mArrowUp(p.up_arrow), mArrowRight(p.right_arrow), mArrowDown(p.down_arrow), + mArrowLeftOffset(p.left_arrow_offset), + mArrowUpOffset(p.up_arrow_offset), + mArrowRightOffset(p.right_arrow_offset), + mArrowDownOffset(p.down_arrow_offset), + mHidden(false), + mFadeInTime(p.fade_in_time), + mFadeOutTime(p.fade_out_time), LLPanel(p) { LLUICtrlFactory::getInstance()->buildPanel(this, "panel_hint.xml"); @@ -138,6 +165,17 @@ BOOL LLHintPopup::postBuild() void LLHintPopup::draw() { + F32 alpha = 1.f; + if (mHidden) + { + alpha = clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, mFadeOutTime, 1.f, 0.f); + } + else + { + alpha = clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, mFadeInTime, 0.f, 1.f); + } + LLViewDrawContext context(alpha); + LLView* targetp = mTarget.get(); if (!targetp || !targetp->isInVisibleChain()) { @@ -153,8 +191,6 @@ void LLHintPopup::draw() LLRect arrow_rect; LLUIImagePtr arrow_imagep; - const S32 OVERLAP = 5; - switch(mDirection) { case LEFT: @@ -162,7 +198,7 @@ void LLHintPopup::draw() target_rect.getCenterY(), my_local_rect.getWidth(), my_local_rect.getHeight()); - arrow_rect.setCenterAndSize(my_local_rect.mRight + mArrowRight->getWidth() / 2 - OVERLAP, + arrow_rect.setCenterAndSize(my_local_rect.mRight + mArrowRight->getWidth() / 2 + mArrowRightOffset, my_local_rect.getCenterY(), mArrowRight->getWidth(), mArrowRight->getHeight()); @@ -174,7 +210,7 @@ void LLHintPopup::draw() my_local_rect.getWidth(), my_local_rect.getHeight()); arrow_rect.setCenterAndSize(my_local_rect.getCenterX(), - my_local_rect.mBottom - mArrowDown->getHeight() / 2 + OVERLAP, + my_local_rect.mBottom - mArrowDown->getHeight() / 2 + mArrowDownOffset, mArrowDown->getWidth(), mArrowDown->getHeight()); arrow_imagep = mArrowDown; @@ -184,19 +220,19 @@ void LLHintPopup::draw() target_rect.mTop - (my_local_rect.getHeight() / 2 + mDistance), my_local_rect.getWidth(), my_local_rect.getHeight()); - arrow_rect.setCenterAndSize(my_local_rect.mLeft - mArrowLeft->getWidth() / 2 + OVERLAP, + arrow_rect.setCenterAndSize(my_local_rect.mLeft - mArrowLeft->getWidth() / 2 + mArrowLeftOffset, my_local_rect.getCenterY(), mArrowLeft->getWidth(), mArrowLeft->getHeight()); arrow_imagep = mArrowLeft; break; case BOTTOM: - my_rect.setCenterAndSize( target_rect.mLeft + (my_local_rect.getWidth() / 2 + mDistance), - target_rect.getCenterY(), + my_rect.setCenterAndSize( target_rect.getCenterX(), + target_rect.mBottom - (my_local_rect.getHeight() / 2 + mDistance), my_local_rect.getWidth(), my_local_rect.getHeight()); arrow_rect.setCenterAndSize(my_local_rect.getCenterX(), - my_local_rect.mTop + mArrowUp->getHeight() / 2 - OVERLAP, + my_local_rect.mTop + mArrowUp->getHeight() / 2 + mArrowUpOffset, mArrowUp->getWidth(), mArrowUp->getHeight()); arrow_imagep = mArrowUp; @@ -205,7 +241,7 @@ void LLHintPopup::draw() setShape(my_rect); LLPanel::draw(); - arrow_imagep->draw(arrow_rect); + arrow_imagep->draw(arrow_rect, LLColor4(1.f, 1.f, 1.f, alpha)); } } @@ -217,7 +253,7 @@ std::map LLHints::sHints; void LLHints::show(LLNotificationPtr hint) { LLHintPopup::Params p; - LLParamSDParser::instance().readSD(hint->getPayload(), p); + LLParamSDParser::instance().readSD(hint->getPayload(), p); p.notification = hint; diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp index 19615def93..148a5786cb 100644 --- a/indra/newview/llmoveview.cpp +++ b/indra/newview/llmoveview.cpp @@ -169,6 +169,7 @@ void LLFloaterMove::setVisible(BOOL visible) if (visible) { + LLFirstUse::notMoving(false); // Attach the Stand/Stop Flying panel. LLPanelStandStopFlying* ssf_panel = LLPanelStandStopFlying::getInstance(); ssf_panel->reparent(this); @@ -571,6 +572,7 @@ void LLPanelStandStopFlying::setStandStopFlyingMode(EStandStopFlyingMode mode) if (mode == SSFM_STAND) { LLFirstUse::sit(); + LLFirstUse::notMoving(false); } panel->mStandButton->setVisible(SSFM_STAND == mode); panel->mStopFlyingButton->setVisible(SSFM_STOP_FLYING == mode); diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 6cfd810c10..41a19a54a8 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -38,6 +38,7 @@ #include "llfloaterreg.h" #include "lltrans.h" +#include "llfirstuse.h" #include "llnearbychatbar.h" #include "llbottomtray.h" #include "llagent.h" @@ -490,6 +491,7 @@ BOOL LLNearbyChatBar::matchChatTypeTrigger(const std::string& in_str, std::strin void LLNearbyChatBar::onChatBoxKeystroke(LLLineEditor* caller, void* userdata) { + LLFirstUse::otherAvatarChatFirst(false); LLNearbyChatBar* self = (LLNearbyChatBar *)userdata; diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index 31a59146d6..4011552112 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -350,7 +350,10 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args) if(chat_msg.mSourceType == CHAT_SOURCE_AGENT && chat_msg.mFromID.notNull()) { LLRecentPeople::instance().add(chat_msg.mFromID); - LLFirstUse::otherAvatarChat(); + if (chat_msg.mFromID != gAgentID) + { + LLFirstUse::otherAvatarChatFirst(); + } } if(chat_msg.mText.empty()) diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index abf2b94b09..c8a9176d92 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -42,6 +42,7 @@ #include "llcombobox.h" #include "llfiltereditor.h" +#include "llfirstuse.h" #include "llfloaterreg.h" #include "llnotificationsutil.h" #include "lltabcontainer.h" @@ -351,6 +352,8 @@ BOOL LLPanelPlaces::postBuild() void LLPanelPlaces::onOpen(const LLSD& key) { + LLFirstUse::notUsingDestinationGuide(false); + if (!mPlaceProfile || !mLandmarkInfo) return; diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index 7eda4fad20..f9189bfb22 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -129,6 +129,8 @@ BOOL LLSidepanelInventory::postBuild() void LLSidepanelInventory::onOpen(const LLSD& key) { + LLFirstUse::inventoryOffer(false); + if(key.size() == 0) return; @@ -149,8 +151,6 @@ void LLSidepanelInventory::onOpen(const LLSD& key) mTaskPanel->setObjectSelection(LLSelectMgr::getInstance()->getSelection()); showTaskInfoPanel(); } - - LLFirstUse::inventoryOffer(false); } void LLSidepanelInventory::onInfoButtonClicked() diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 7e8dc2747b..7cfc774883 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -37,6 +37,7 @@ #include "llagentcamera.h" #include "llappviewer.h" #include "llbottomtray.h" +#include "llfirstuse.h" #include "llhints.h" #include "llsidetray.h" #include "llviewerwindow.h" @@ -470,6 +471,7 @@ void LLSideTray::onTabButtonClick(string name) void LLSideTray::onToggleCollapse() { + LLFirstUse::notUsingSidePanel(false); if(mCollapsed) { expandSideBar(); diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index 46d148c088..6a081a573e 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -39,6 +39,7 @@ #include "llagentcamera.h" #include "llbutton.h" #include "llcommandhandler.h" +#include "llfirstuse.h" #include "llviewercontrol.h" #include "llfloaterbuycurrency.h" #include "llbuycurrencyhtml.h" @@ -341,6 +342,11 @@ void LLStatusBar::creditBalance(S32 credit) void LLStatusBar::setBalance(S32 balance) { + if (balance > getBalance() && getBalance() != 0) + { + LLFirstUse::receiveLindens(); + } + std::string money_str = LLResMgr::getInstance()->getMonetaryString( balance ); LLTextBox* balance_box = getChild("balance"); @@ -463,6 +469,7 @@ void LLStatusBar::onClickBuyCurrency() // open a currency floater - actual one open depends on // value specified in settings.xml LLBuyCurrencyHTML::openCurrencyFloater(); + LLFirstUse::receiveLindens(false); } void LLStatusBar::onMouseEnterVolume() diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 566f4b45ba..cfb8b077e5 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -102,6 +102,7 @@ #include "llface.h" #include "llfeaturemanager.h" #include "llfilepicker.h" +#include "llfirstuse.h" #include "llfloater.h" #include "llfloaterbuildoptions.h" #include "llfloaterbuyland.h" @@ -2423,6 +2424,18 @@ void LLViewerWindow::updateUI() static std::string last_handle_msg; + if (gLoggedInTime.getStarted()) + { + if (gLoggedInTime.getElapsedTimeF32() > gSavedSettings.getF32("DestinationGuideHintTimeout")) + { + LLFirstUse::notUsingDestinationGuide(); + } + if (gLoggedInTime.getElapsedTimeF32() > gSavedSettings.getF32("SidePanelHintTimeout")) + { + LLFirstUse::notUsingSidePanel(); + } + } + LLConsole::updateClass(); // animate layout stacks so we have up to date rect for world view diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 8db89a7622..a2d06f77a9 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -6386,53 +6386,53 @@ Mute everyone? - Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam + To join the conversation, type into the chat field below. - Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam + To stand up and exit the sitting position, click the Stand button. - Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam + The Destination Guide contains thousands of new places to discover. Select a location and choose Teleport to start exploring. - Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam + Get quick access to your inventory, outfits, profiles and more in the side panel. - Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam + To walk or run, open the Move Panel and use the directional arrows to navigate. You can also use the directional keys on your keyboard. - Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam + Check your inventory to find items. Newest items can be easily found in the Recent tab. - Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam + Here's your current balance of L$. Click Buy L$ to purchase more Linden Dollars. diff --git a/indra/newview/skins/default/xui/en/panel_hint.xml b/indra/newview/skins/default/xui/en/panel_hint.xml index 7cb8f58c37..54ea08e5d4 100644 --- a/indra/newview/skins/default/xui/en/panel_hint.xml +++ b/indra/newview/skins/default/xui/en/panel_hint.xml @@ -29,6 +29,7 @@ width="16" height="16" name="close" + follows="right|top" image_unselected="Icon_Close_Foreground" image_selected="Icon_Close_Press"/> -- cgit v1.3 From 187c229aca41a2a26caf05bd7d8d6c0d6a378699 Mon Sep 17 00:00:00 2001 From: Richard Nelson Date: Fri, 13 Aug 2010 12:21:28 -0700 Subject: fix for hints reappearing even after criteria passed --- indra/newview/llagent.cpp | 1 + indra/newview/llfirstuse.cpp | 1 + 2 files changed, 2 insertions(+) (limited to 'indra/newview/llfirstuse.cpp') diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index aade16cc7b..70bda3893e 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -1556,6 +1556,7 @@ void LLAgent::updateAgentPosition(const F32 dt, const F32 yaw_radians, const S32 if (mMoveTimer.getStarted() && mMoveTimer.getElapsedTimeF32() > gSavedSettings.getF32("NotMovingHintTimeout")) { LLFirstUse::notMoving(); + mMoveTimer.stop(); } propagate(dt); diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index 4708087846..15de138c95 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -160,6 +160,7 @@ void LLFirstUse::firstUseNotification(const std::string& control_var, bool enabl LLNotifications::instance().cancel(notif); sNotifications.erase(notification_name); } + gWarningSettings.setBOOL(control_var, FALSE); } } -- cgit v1.3 From 32e4cda7dc730d505190db3d6658d6dd94bfc28f Mon Sep 17 00:00:00 2001 From: Richard Nelson Date: Mon, 16 Aug 2010 15:01:39 -0700 Subject: made hints only expire when explicitly responded to, not implicitly after first seeing them added hint_popup.xml for hint styling --- indra/newview/llfirstuse.cpp | 60 +++--- indra/newview/llfirstuse.h | 5 +- indra/newview/llhints.cpp | 234 ++++++++++++--------- .../newview/skins/default/xui/en/notifications.xml | 13 +- indra/newview/skins/default/xui/en/panel_hint.xml | 9 +- .../skins/default/xui/en/widgets/hint_popup.xml | 19 ++ 6 files changed, 205 insertions(+), 135 deletions(-) create mode 100644 indra/newview/skins/default/xui/en/widgets/hint_popup.xml (limited to 'indra/newview/llfirstuse.cpp') diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index 15de138c95..038579c0bd 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -48,7 +48,6 @@ // static std::set LLFirstUse::sConfigVariables; -std::map LLFirstUse::sNotifications; // static void LLFirstUse::addConfigVariable(const std::string& var) @@ -78,21 +77,10 @@ void LLFirstUse::resetFirstUse() } } -// static -void LLFirstUse::useOverrideKeys() -{ - // Our orientation island uses key overrides to teach vehicle driving - // so don't show this message until you get off OI. JC - if (!gAgent.inPrelude()) - { - firstUseNotification("FirstOverrideKeys", true, "FirstOverrideKeys"); - } -} - // static void LLFirstUse::otherAvatarChatFirst(bool enable) { - firstUseNotification("FirstOtherChatBeforeUser", enable, "HintChat", LLSD(), LLSD().with("target", "nearby_chat_bar").with("direction", "top")); + firstUseNotification("FirstOtherChatBeforeUser", enable, "HintChat", LLSD(), LLSD().with("target", "incoming_chat").with("direction", "right")); } // static @@ -143,24 +131,48 @@ void LLFirstUse::receiveLindens(bool enable) //static void LLFirstUse::firstUseNotification(const std::string& control_var, bool enable, const std::string& notification_name, LLSD args, LLSD payload) { - LLNotificationPtr notif = sNotifications[notification_name]; + init(); if (enable) { - if (!notif && gWarningSettings.getBOOL(control_var)) + LL_DEBUGS("LLFirstUse") << "Trigger first use notification " << notification_name << LL_ENDL; + + // if notification doesn't already exist and this notification hasn't been disabled... + if (gWarningSettings.getBOOL(control_var)) { // create new notification - sNotifications[notification_name] = LLNotifications::instance().add(LLNotification::Params().name(notification_name).substitutions(args).payload(payload)); - gWarningSettings.setBOOL(control_var, FALSE); + LLNotifications::instance().add(LLNotification::Params().name(notification_name).substitutions(args).payload(payload.with("control_var", control_var))); } } else - { // want to hide notification - if (notif) - { // cancel existing notification - LLNotifications::instance().cancel(notif); - sNotifications.erase(notification_name); - } - gWarningSettings.setBOOL(control_var, FALSE); + { + LL_DEBUGS("LLFirstUse") << "Disabling first use notification " << notification_name << LL_ENDL; + LLNotifications::instance().cancelByName(notification_name); + } + +} + +// static +void LLFirstUse::init() +{ + static bool initialized = false; + if (!initialized) + { + LLNotifications::instance().getChannel("Hints")->connectChanged(processNotification); } + initialized = true; +} +//static +bool LLFirstUse::processNotification(const LLSD& notify) +{ + if (notify["sigtype"].asString() == "delete") + { + LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID()); + if (notification) + { + // disable any future notifications + gWarningSettings.setBOOL(notification->getPayload()["control_var"], FALSE); + } + } + return false; } diff --git a/indra/newview/llfirstuse.h b/indra/newview/llfirstuse.h index 48943cd9ab..9c4ab14006 100644 --- a/indra/newview/llfirstuse.h +++ b/indra/newview/llfirstuse.h @@ -90,7 +90,6 @@ public: static void disableFirstUse(); static void resetFirstUse(); - static void useOverrideKeys(); static void otherAvatarChatFirst(bool enable = true); static void sit(bool enable = true); static void notUsingDestinationGuide(bool enable = true); @@ -103,7 +102,9 @@ public: protected: static void firstUseNotification(const std::string& control_var, bool enable, const std::string& notification_name, LLSD args = LLSD(), LLSD payload = LLSD()); static std::set sConfigVariables; - static std::map > sNotifications; + + static void init(); + static bool processNotification(const LLSD& notify); }; #endif diff --git a/indra/newview/llhints.cpp b/indra/newview/llhints.cpp index 14a9871a7d..c4cea86a31 100644 --- a/indra/newview/llhints.cpp +++ b/indra/newview/llhints.cpp @@ -63,11 +63,21 @@ public: } }; + struct TargetParams : public LLInitParam::Block + { + Mandatory target; + Mandatory direction; + + TargetParams() + : target("target"), + direction("direction") + {} + }; + struct Params : public LLInitParam::Block { Mandatory notification; - Optional target; - Optional direction; + Optional target_params; Optional distance; Optional left_arrow, up_arrow, @@ -81,34 +91,31 @@ public: fade_out_time; Params() - : direction("direction", TOP), - distance("distance", 24), - target("target"), - left_arrow("left_arrow", LLUI::getUIImage("hint_arrow_left")), - up_arrow("up_arrow", LLUI::getUIImage("hint_arrow_up")), - right_arrow("right_arrow", LLUI::getUIImage("hint_arrow_right")), - down_arrow("down_arrow", LLUI::getUIImage("hint_arrow_down")), - left_arrow_offset("left_arrow_offset", 3), - up_arrow_offset("up_arrow_offset", -2), - right_arrow_offset("right_arrow_offset", -3), - down_arrow_offset("down_arrow_offset", 5), - fade_in_time("fade_in_time", 0.2f), - fade_out_time("fade_out_time", 0.5f) + : distance("distance"), + left_arrow("left_arrow"), + up_arrow("up_arrow"), + right_arrow("right_arrow"), + down_arrow("down_arrow"), + left_arrow_offset("left_arrow_offset"), + up_arrow_offset("up_arrow_offset"), + right_arrow_offset("right_arrow_offset"), + down_arrow_offset("down_arrow_offset"), + fade_in_time("fade_in_time"), + fade_out_time("fade_out_time") {} }; LLHintPopup(const Params&); - void setHintTarget(LLHandle target) { mTarget = target; } /*virtual*/ BOOL postBuild(); - void onClickClose() { hide(); } + void onClickClose() { hide(); LLNotifications::instance().cancel(mNotification); } void draw(); void hide() { if(!mHidden) {mHidden = true; mFadeTimer.reset();} } private: LLNotificationPtr mNotification; - LLHandle mTarget; + std::string mTarget; EPopupDirection mDirection; S32 mDistance; LLUIImagePtr mArrowLeft, @@ -125,14 +132,14 @@ private: bool mHidden; }; - +static LLDefaultChildRegistry::Register r("hint_popup"); LLHintPopup::LLHintPopup(const LLHintPopup::Params& p) : mNotification(p.notification), - mDirection(p.direction), + mDirection(p.target_params.direction), mDistance(p.distance), - mTarget(LLHints::getHintTarget(p.target)), + mTarget(p.target_params.target), mArrowLeft(p.left_arrow), mArrowUp(p.up_arrow), mArrowRight(p.right_arrow), @@ -146,7 +153,7 @@ LLHintPopup::LLHintPopup(const LLHintPopup::Params& p) mFadeOutTime(p.fade_out_time), LLPanel(p) { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_hint.xml"); + buildPanel(this, "panel_hint.xml", NULL, p); } BOOL LLHintPopup::postBuild() @@ -172,80 +179,108 @@ void LLHintPopup::draw() if (alpha == 0.f) { die(); + return; } } else { alpha = clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, mFadeInTime, 0.f, 1.f); } - LLViewDrawContext context(alpha); - - LLView* targetp = mTarget.get(); - if (!targetp || !targetp->isInVisibleChain()) - { - hide(); - } - else - { - LLRect target_rect; - targetp->localRectToOtherView(targetp->getLocalRect(), &target_rect, getParent()); - - LLRect my_local_rect = getLocalRect(); - LLRect my_rect; - LLRect arrow_rect; - LLUIImagePtr arrow_imagep; + + { LLViewDrawContext context(alpha); - switch(mDirection) + if (mTarget.empty()) { - case LEFT: - my_rect.setCenterAndSize( target_rect.mLeft - (my_local_rect.getWidth() / 2 + mDistance), - target_rect.getCenterY(), - my_local_rect.getWidth(), - my_local_rect.getHeight()); - arrow_rect.setCenterAndSize(my_local_rect.mRight + mArrowRight->getWidth() / 2 + mArrowRightOffset, - my_local_rect.getCenterY(), - mArrowRight->getWidth(), - mArrowRight->getHeight()); - arrow_imagep = mArrowRight; - break; - case TOP: - my_rect.setCenterAndSize( target_rect.getCenterX(), - target_rect.mTop + (my_local_rect.getHeight() / 2 + mDistance), - my_local_rect.getWidth(), - my_local_rect.getHeight()); - arrow_rect.setCenterAndSize(my_local_rect.getCenterX(), - my_local_rect.mBottom - mArrowDown->getHeight() / 2 + mArrowDownOffset, - mArrowDown->getWidth(), - mArrowDown->getHeight()); - arrow_imagep = mArrowDown; - break; - case RIGHT: - my_rect.setCenterAndSize( target_rect.getCenterX(), - target_rect.mTop - (my_local_rect.getHeight() / 2 + mDistance), - my_local_rect.getWidth(), - my_local_rect.getHeight()); - arrow_rect.setCenterAndSize(my_local_rect.mLeft - mArrowLeft->getWidth() / 2 + mArrowLeftOffset, - my_local_rect.getCenterY(), - mArrowLeft->getWidth(), - mArrowLeft->getHeight()); - arrow_imagep = mArrowLeft; - break; - case BOTTOM: - my_rect.setCenterAndSize( target_rect.getCenterX(), - target_rect.mBottom - (my_local_rect.getHeight() / 2 + mDistance), - my_local_rect.getWidth(), - my_local_rect.getHeight()); - arrow_rect.setCenterAndSize(my_local_rect.getCenterX(), - my_local_rect.mTop + mArrowUp->getHeight() / 2 + mArrowUpOffset, - mArrowUp->getWidth(), - mArrowUp->getHeight()); - arrow_imagep = mArrowUp; - break; + // just draw contents, no arrow, in default position + LLPanel::draw(); + } + else + { + LLView* targetp = LLHints::getHintTarget(mTarget).get(); + if (!targetp) + { + // target widget is no longer valid, go away + die(); + } + else if (!targetp->isInVisibleChain()) + { + // if target is invisible, don't draw, but keep alive in case widget comes back + } + else + { + LLRect target_rect; + targetp->localRectToOtherView(targetp->getLocalRect(), &target_rect, getParent()); + + LLRect my_local_rect = getLocalRect(); + LLRect my_rect; + LLRect arrow_rect; + LLUIImagePtr arrow_imagep; + + switch(mDirection) + { + case LEFT: + my_rect.setCenterAndSize( target_rect.mLeft - (my_local_rect.getWidth() / 2 + mDistance), + target_rect.getCenterY(), + my_local_rect.getWidth(), + my_local_rect.getHeight()); + if (mArrowRight) + { + arrow_rect.setCenterAndSize(my_local_rect.mRight + mArrowRight->getWidth() / 2 + mArrowRightOffset, + my_local_rect.getCenterY(), + mArrowRight->getWidth(), + mArrowRight->getHeight()); + arrow_imagep = mArrowRight; + } + break; + case TOP: + my_rect.setCenterAndSize( target_rect.getCenterX(), + target_rect.mTop + (my_local_rect.getHeight() / 2 + mDistance), + my_local_rect.getWidth(), + my_local_rect.getHeight()); + if (mArrowDown) + { + arrow_rect.setCenterAndSize(my_local_rect.getCenterX(), + my_local_rect.mBottom - mArrowDown->getHeight() / 2 + mArrowDownOffset, + mArrowDown->getWidth(), + mArrowDown->getHeight()); + arrow_imagep = mArrowDown; + } + break; + case RIGHT: + my_rect.setCenterAndSize( target_rect.mRight + (my_local_rect.getWidth() / 2 + mDistance), + target_rect.getCenterY(), + my_local_rect.getWidth(), + my_local_rect.getHeight()); + if (mArrowLeft) + { + arrow_rect.setCenterAndSize(my_local_rect.mLeft - mArrowLeft->getWidth() / 2 + mArrowLeftOffset, + my_local_rect.getCenterY(), + mArrowLeft->getWidth(), + mArrowLeft->getHeight()); + arrow_imagep = mArrowLeft; + } + break; + case BOTTOM: + my_rect.setCenterAndSize( target_rect.getCenterX(), + target_rect.mBottom - (my_local_rect.getHeight() / 2 + mDistance), + my_local_rect.getWidth(), + my_local_rect.getHeight()); + if (mArrowUp) + { + arrow_rect.setCenterAndSize(my_local_rect.getCenterX(), + my_local_rect.mTop + mArrowUp->getHeight() / 2 + mArrowUpOffset, + mArrowUp->getWidth(), + mArrowUp->getHeight()); + arrow_imagep = mArrowUp; + } + break; + } + setShape(my_rect); + LLPanel::draw(); + + if (arrow_imagep) arrow_imagep->draw(arrow_rect, LLColor4(1.f, 1.f, 1.f, alpha)); + } } - setShape(my_rect); - LLPanel::draw(); - - arrow_imagep->draw(arrow_rect, LLColor4(1.f, 1.f, 1.f, alpha)); } } @@ -256,20 +291,23 @@ std::map LLHints::sHints; //static void LLHints::show(LLNotificationPtr hint) { - LLHintPopup::Params p; - LLParamSDParser::instance().readSD(hint->getPayload(), p); + LLHintPopup::Params p(LLUICtrlFactory::getDefaultParams()); + LLParamSDParser::instance().readSD(hint->getPayload(), p); p.notification = hint; - LLHintPopup* popup = new LLHintPopup(p); - - sHints[hint] = popup; - - LLView* hint_holder = gViewerWindow->getHintHolder(); - if (hint_holder) + if (p.validateBlock()) { - hint_holder->addChild(popup); - popup->centerWithin(hint_holder->getLocalRect()); + LLHintPopup* popup = new LLHintPopup(p); + + sHints[hint] = popup; + + LLView* hint_holder = gViewerWindow->getHintHolder(); + if (hint_holder) + { + hint_holder->addChild(popup); + popup->centerWithin(hint_holder->getLocalRect()); + } } } @@ -286,7 +324,7 @@ void LLHints::hide(LLNotificationPtr hint) //static void LLHints::registerHintTarget(const std::string& name, LLHandle target) { - sTargetRegistry.defaultRegistrar().add(name, target); + sTargetRegistry.defaultRegistrar().replace(name, target); } //static diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 60b0b1e8dc..47bb0fe45b 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -6402,6 +6402,7 @@ Mute everyone? label="Chat" type="hint"> To join the conversation, type into the chat field below. + To stand up and exit the sitting position, click the Stand button. + - + The Destination Guide contains thousands of new places to discover. Select a location and choose Teleport to start exploring. + - + Get quick access to your inventory, outfits, profiles and more in the side panel. - + To walk or run, open the Move Panel and use the directional arrows to navigate. You can also use the directional keys on your keyboard. - + Check your inventory to find items. Newest items can be easily found in the Recent tab. + Here's your current balance of L$. Click Buy L$ to purchase more Linden Dollars. + diff --git a/indra/newview/skins/default/xui/en/panel_hint.xml b/indra/newview/skins/default/xui/en/panel_hint.xml index 54ea08e5d4..839dbc58f2 100644 --- a/indra/newview/skins/default/xui/en/panel_hint.xml +++ b/indra/newview/skins/default/xui/en/panel_hint.xml @@ -1,12 +1,7 @@ + height="100"> diff --git a/indra/newview/skins/default/xui/en/widgets/hint_popup.xml b/indra/newview/skins/default/xui/en/widgets/hint_popup.xml new file mode 100644 index 0000000000..fbd92f982e --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/hint_popup.xml @@ -0,0 +1,19 @@ + + + -- cgit v1.3 From 29bbaef4aac059ca26c35a46f70e655e58f963bf Mon Sep 17 00:00:00 2001 From: Monroe Linden Date: Tue, 17 Aug 2010 17:03:23 -0700 Subject: Fixed a couple of compile errors. --- indra/integration_tests/llui_libtest/llui_libtest.cpp | 8 ++++---- indra/newview/llfirstuse.cpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) (limited to 'indra/newview/llfirstuse.cpp') diff --git a/indra/integration_tests/llui_libtest/llui_libtest.cpp b/indra/integration_tests/llui_libtest/llui_libtest.cpp index abd8f7dbde..c981ba23d7 100644 --- a/indra/integration_tests/llui_libtest/llui_libtest.cpp +++ b/indra/integration_tests/llui_libtest/llui_libtest.cpp @@ -191,10 +191,10 @@ void export_test_floaters() // Build a floater and output new attributes LLXMLNodePtr output_node = new LLXMLNode(); LLFloater* floater = new LLFloater(LLSD()); - LLUICtrlFactory::getInstance()->buildFloater(floater, - filename, - // FALSE, // don't open floater - output_node); + LLFloater::buildFloater(floater, + filename, + // FALSE, // don't open floater + output_node); std::string out_filename = xui_dir + filename; std::string::size_type extension_pos = out_filename.rfind(".xml"); out_filename.resize(extension_pos); diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index 038579c0bd..e9a9203a96 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -157,7 +157,7 @@ void LLFirstUse::init() static bool initialized = false; if (!initialized) { - LLNotifications::instance().getChannel("Hints")->connectChanged(processNotification); + LLNotifications::instance().getChannel("Hints")->connectChanged(&processNotification); } initialized = true; } -- cgit v1.3 From f17e3a6eb42f0f30b8d7a178cd9214a26162dde6 Mon Sep 17 00:00:00 2001 From: Richard Linden Date: Thu, 19 Aug 2010 10:54:03 -0700 Subject: DEV-52666 FIX Chat and Move Hints shown when user performs action... --- indra/newview/llfirstuse.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'indra/newview/llfirstuse.cpp') diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index e9a9203a96..1ede2be978 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -147,6 +147,8 @@ void LLFirstUse::firstUseNotification(const std::string& control_var, bool enabl { LL_DEBUGS("LLFirstUse") << "Disabling first use notification " << notification_name << LL_ENDL; LLNotifications::instance().cancelByName(notification_name); + // redundantly clear settings var here, in case there are no notifications to cancel + gWarningSettings.setBOOL(control_var, FALSE); } } -- cgit v1.3 From af108e324ae45ba3a055e7b55bea3f3b03c7f48d Mon Sep 17 00:00:00 2001 From: Richard Linden Date: Thu, 19 Aug 2010 13:24:37 -0700 Subject: DEV-52669 FIX Inventory notification not given if first item comes from buying contents --- indra/newview/llfirstuse.cpp | 2 +- indra/newview/llfirstuse.h | 2 +- indra/newview/llfloaterbuycontents.cpp | 5 +++++ indra/newview/llsidepanelinventory.cpp | 2 +- indra/newview/llviewermessage.cpp | 14 +++++++++++--- 5 files changed, 19 insertions(+), 6 deletions(-) (limited to 'indra/newview/llfirstuse.cpp') diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index 1ede2be978..c153f8b787 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -90,7 +90,7 @@ void LLFirstUse::sit(bool enable) } // static -void LLFirstUse::inventoryOffer(bool enable) +void LLFirstUse::newInventory(bool enable) { firstUseNotification("FirstInventoryOffer", enable, "HintInventory", LLSD(), LLSD().with("target", "inventory_btn").with("direction", "left")); } diff --git a/indra/newview/llfirstuse.h b/indra/newview/llfirstuse.h index 9c4ab14006..174706f1f4 100644 --- a/indra/newview/llfirstuse.h +++ b/indra/newview/llfirstuse.h @@ -95,7 +95,7 @@ public: static void notUsingDestinationGuide(bool enable = true); static void notUsingSidePanel(bool enable = true); static void notMoving(bool enable = true); - static void inventoryOffer(bool enable = true); + static void newInventory(bool enable = true); static void receiveLindens(bool enable = true); static void useSandbox(); diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp index 3cdd7b801b..8e93a6bf03 100644 --- a/indra/newview/llfloaterbuycontents.cpp +++ b/indra/newview/llfloaterbuycontents.cpp @@ -47,6 +47,7 @@ #include "llinventorydefines.h" #include "llinventoryfunctions.h" #include "llinventorymodel.h" // for gInventory +#include "llfirstuse.h" #include "llfloaterreg.h" #include "llfloaterinventory.h" // for LLInventoryIcon::getIcon #include "llnotificationsutil.h" @@ -289,6 +290,10 @@ void LLFloaterBuyContents::onClickBuy() // it doesn't match region info then sale is canceled. LLSelectMgr::getInstance()->sendBuy(gAgent.getID(), category_id, mSaleInfo); + // NOTE: do this here instead of on receipt of object, since contents are transfered + // via a generic BulkUpdateInventory message with no way of distinguishing it from + // other inventory operations + LLFirstUse::newInventory(); closeFloater(); } diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index aa29f6cb26..66a8a520af 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -129,7 +129,7 @@ BOOL LLSidepanelInventory::postBuild() void LLSidepanelInventory::onOpen(const LLSD& key) { - LLFirstUse::inventoryOffer(false); + LLFirstUse::newInventory(false); if(key.size() == 0) return; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 067c0f3a80..71dff61f41 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -937,6 +937,15 @@ protected: //one global instance to bind them LLOpenTaskOffer* gNewInventoryObserver=NULL; +class LLNewInventoryHintObserver : public LLInventoryAddedObserver +{ +protected: + /*virtual*/ void done() + { + LLFirstUse::newInventory(); + } +}; + void start_new_inventory_observer() { if (!gNewInventoryObserver) //task offer observer @@ -952,6 +961,8 @@ void start_new_inventory_observer() gInventoryMoveObserver = new LLViewerInventoryMoveFromWorldObserver; gInventory.addObserver(gInventoryMoveObserver); } + + gInventory.addObserver(new LLNewInventoryHintObserver()); } class LLDiscardAgentOffer : public LLInventoryFetchItemsObserver @@ -1080,7 +1091,6 @@ bool check_offer_throttle(const std::string& from_name, bool check_only) void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_name) { - LLFirstUse::inventoryOffer(); for (uuid_vec_t::const_iterator obj_iter = objects.begin(); obj_iter != objects.end(); ++obj_iter) @@ -1765,8 +1775,6 @@ void inventory_offer_handler(LLOfferInfo* info) return; } - LLFirstUse::inventoryOffer(); - // Avoid the Accept/Discard dialog if the user so desires. JC if (gSavedSettings.getBOOL("AutoAcceptNewInventory") && (info->mType == LLAssetType::AT_NOTECARD -- cgit v1.3 From fbcde287363f38a4f73a14bbf3501e34b9698c68 Mon Sep 17 00:00:00 2001 From: Richard Nelson Date: Fri, 10 Sep 2010 18:06:42 -0700 Subject: EXP-23 FIX Tail for chat box hint should be slantways instead of horizontal --- indra/newview/llbottomtray.cpp | 2 ++ indra/newview/llfirstuse.cpp | 2 +- indra/newview/llhints.cpp | 26 ++++++++++++++++++--- indra/newview/skins/default/textures/textures.xml | 1 + .../textures/windows/hint_arrow_lower_left.png | Bin 0 -> 3081 bytes .../skins/default/xui/en/widgets/hint_popup.xml | 1 + 6 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 indra/newview/skins/default/textures/windows/hint_arrow_lower_left.png (limited to 'indra/newview/llfirstuse.cpp') diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index fba15693c8..8c3d30237f 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -470,6 +470,8 @@ BOOL LLBottomTray::postBuild() gMenuHolder->addChild(mBottomTrayContextMenu); mNearbyChatBar = findChild("chat_bar"); + LLHints::registerHintTarget("chat_bar", mNearbyChatBar->LLView::getHandle()); + mChatBarContainer = getChild("chat_bar_layout_panel"); mToolbarStack = getChild("toolbar_stack"); diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index ead06d59f9..b864ba6a36 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -74,7 +74,7 @@ void LLFirstUse::resetFirstUse() // static void LLFirstUse::otherAvatarChatFirst(bool enable) { - firstUseNotification("FirstOtherChatBeforeUser", enable, "HintChat", LLSD(), LLSD().with("target", "incoming_chat").with("direction", "right")); + firstUseNotification("FirstOtherChatBeforeUser", enable, "HintChat", LLSD(), LLSD().with("target", "chat_bar").with("direction", "top_right").with("distance", 24)); } // static diff --git a/indra/newview/llhints.cpp b/indra/newview/llhints.cpp index 0c91dd473d..21383109dc 100644 --- a/indra/newview/llhints.cpp +++ b/indra/newview/llhints.cpp @@ -43,7 +43,8 @@ public: LEFT, TOP, RIGHT, - BOTTOM + BOTTOM, + TOP_RIGHT } EPopupDirection; struct PopupDirections : public LLInitParam::TypeValuesHelper @@ -54,6 +55,7 @@ public: declare("right", LLHintPopup::RIGHT); declare("top", LLHintPopup::TOP); declare("bottom", LLHintPopup::BOTTOM); + declare("top_right", LLHintPopup::TOP_RIGHT); } }; @@ -76,7 +78,9 @@ public: Optional left_arrow, up_arrow, right_arrow, - down_arrow; + down_arrow, + lower_left_arrow; + Optional left_arrow_offset, up_arrow_offset, right_arrow_offset, @@ -90,6 +94,7 @@ public: up_arrow("up_arrow"), right_arrow("right_arrow"), down_arrow("down_arrow"), + lower_left_arrow("lower_left_arrow"), left_arrow_offset("left_arrow_offset"), up_arrow_offset("up_arrow_offset"), right_arrow_offset("right_arrow_offset"), @@ -115,7 +120,8 @@ private: LLUIImagePtr mArrowLeft, mArrowUp, mArrowRight, - mArrowDown; + mArrowDown, + mArrowDownAndLeft; S32 mArrowLeftOffset, mArrowUpOffset, mArrowRightOffset, @@ -137,6 +143,7 @@ LLHintPopup::LLHintPopup(const LLHintPopup::Params& p) mArrowUp(p.up_arrow), mArrowRight(p.right_arrow), mArrowDown(p.down_arrow), + mArrowDownAndLeft(p.lower_left_arrow), mArrowLeftOffset(p.left_arrow_offset), mArrowUpOffset(p.up_arrow_offset), mArrowRightOffset(p.right_arrow_offset), @@ -272,6 +279,19 @@ void LLHintPopup::draw() arrow_imagep = mArrowUp; } break; + case TOP_RIGHT: + my_rect.setCenterAndSize( target_rect.mRight + (my_local_rect.getWidth() / 2), + target_rect.mTop + (my_local_rect.getHeight() / 2 + mDistance), + my_local_rect.getWidth(), + my_local_rect.getHeight()); + if (mArrowDownAndLeft) + { + arrow_rect.setCenterAndSize(my_local_rect.mLeft + mArrowDownAndLeft->getWidth() / 2 + mArrowLeftOffset, + my_local_rect.mBottom - mArrowDownAndLeft->getHeight() / 2 + mArrowDownOffset, + mArrowDownAndLeft->getWidth(), + mArrowDownAndLeft->getHeight()); + arrow_imagep = mArrowDownAndLeft; + } } setShape(my_rect); LLPanel::draw(); diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 8d6a564687..7c8574609c 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -651,6 +651,7 @@ with the same filename but different name + diff --git a/indra/newview/skins/default/textures/windows/hint_arrow_lower_left.png b/indra/newview/skins/default/textures/windows/hint_arrow_lower_left.png new file mode 100644 index 0000000000..0dfc99898d Binary files /dev/null and b/indra/newview/skins/default/textures/windows/hint_arrow_lower_left.png differ diff --git a/indra/newview/skins/default/xui/en/widgets/hint_popup.xml b/indra/newview/skins/default/xui/en/widgets/hint_popup.xml index a9975941af..92080df154 100644 --- a/indra/newview/skins/default/xui/en/widgets/hint_popup.xml +++ b/indra/newview/skins/default/xui/en/widgets/hint_popup.xml @@ -11,6 +11,7 @@ up_arrow="hint_arrow_up" right_arrow="hint_arrow_right" down_arrow="hint_arrow_down" + lower_left_arrow="hint_arrow_lower_left" left_arrow_offset="3" up_arrow_offset="-2" right_arrow_offset="-3" -- cgit v1.3 From 99a13feade938a7801aa4323fc63a53dac294a77 Mon Sep 17 00:00:00 2001 From: callum Date: Fri, 17 Sep 2010 14:53:02 -0700 Subject: Turn off new inventory hints until defect EXP-62 is fixed --- indra/newview/llfirstuse.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'indra/newview/llfirstuse.cpp') diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index b864ba6a36..1764d6b145 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -86,7 +86,8 @@ void LLFirstUse::sit(bool enable) // static void LLFirstUse::newInventory(bool enable) { - firstUseNotification("FirstInventoryOffer", enable, "HintInventory", LLSD(), LLSD().with("target", "inventory_btn").with("direction", "left")); + // turning this off until bug EXP-62 can be fixed (inventory hint appears for new users when their initial inventory is acquired) + // firstUseNotification("FirstInventoryOffer", enable, "HintInventory", LLSD(), LLSD().with("target", "inventory_btn").with("direction", "left")); } // static -- cgit v1.3 From 7c0a6df30a1d78611782767763b7710702b96336 Mon Sep 17 00:00:00 2001 From: Richard Nelson Date: Mon, 20 Sep 2010 16:21:00 -0700 Subject: EXP-60 FIX not showing after Re-enabling Hints in same session --- indra/newview/llagent.cpp | 1 - indra/newview/llfirstuse.cpp | 13 ++++++++----- indra/newview/llhints.cpp | 29 +++++++++++++---------------- 3 files changed, 21 insertions(+), 22 deletions(-) (limited to 'indra/newview/llfirstuse.cpp') diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index fec29eac17..c9bd7851ed 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -1557,7 +1557,6 @@ void LLAgent::updateAgentPosition(const F32 dt, const F32 yaw_radians, const S32 if (mMoveTimer.getStarted() && mMoveTimer.getElapsedTimeF32() > gSavedSettings.getF32("NotMovingHintTimeout")) { LLFirstUse::notMoving(); - mMoveTimer.stop(); } propagate(dt); diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index 1764d6b145..dd08706f4f 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -130,12 +130,15 @@ void LLFirstUse::firstUseNotification(const std::string& control_var, bool enabl if (enable) { - LL_DEBUGS("LLFirstUse") << "Trigger first use notification " << notification_name << LL_ENDL; + if (gSavedSettings.getBOOL("EnableUIHints")) + { + LL_DEBUGS("LLFirstUse") << "Trigger first use notification " << notification_name << LL_ENDL; - // if notification doesn't already exist and this notification hasn't been disabled... - if (gWarningSettings.getBOOL(control_var)) - { // create new notification - LLNotifications::instance().add(LLNotification::Params().name(notification_name).substitutions(args).payload(payload.with("control_var", control_var))); + // if notification doesn't already exist and this notification hasn't been disabled... + if (gWarningSettings.getBOOL(control_var)) + { // create new notification + LLNotifications::instance().add(LLNotification::Params().name(notification_name).substitutions(args).payload(payload.with("control_var", control_var))); + } } } else diff --git a/indra/newview/llhints.cpp b/indra/newview/llhints.cpp index 393aa188e1..a8274b3887 100644 --- a/indra/newview/llhints.cpp +++ b/indra/newview/llhints.cpp @@ -310,26 +310,23 @@ std::map LLHints::sHints; //static void LLHints::show(LLNotificationPtr hint) { - if (gSavedSettings.getBOOL("EnableUIHints")) - { - LLHintPopup::Params p(LLUICtrlFactory::getDefaultParams()); + LLHintPopup::Params p(LLUICtrlFactory::getDefaultParams()); - LLParamSDParser parser; - parser.readSD(hint->getPayload(), p, true); - p.notification = hint; + LLParamSDParser parser; + parser.readSD(hint->getPayload(), p, true); + p.notification = hint; - if (p.validateBlock()) - { - LLHintPopup* popup = new LLHintPopup(p); + if (p.validateBlock()) + { + LLHintPopup* popup = new LLHintPopup(p); - sHints[hint] = popup; + sHints[hint] = popup; - LLView* hint_holder = gViewerWindow->getHintHolder(); - if (hint_holder) - { - hint_holder->addChild(popup); - popup->centerWithin(hint_holder->getLocalRect()); - } + LLView* hint_holder = gViewerWindow->getHintHolder(); + if (hint_holder) + { + hint_holder->addChild(popup); + popup->centerWithin(hint_holder->getLocalRect()); } } } -- cgit v1.3 From 2ed5f04b99c4805b8adda9745811e82616d61c9b Mon Sep 17 00:00:00 2001 From: Leyla Farazha Date: Thu, 7 Oct 2010 10:42:31 -0700 Subject: Adding viewer hint for setting display name the when edit profile is opened with no display name set --- indra/newview/app_settings/ignorable_dialogs.xml | 11 +++++++++++ indra/newview/llfirstuse.cpp | 6 ++++++ indra/newview/llfirstuse.h | 1 + indra/newview/llpanelme.cpp | 22 ++++++++++++++++++++-- .../newview/skins/default/xui/en/notifications.xml | 8 ++++++++ 5 files changed, 46 insertions(+), 2 deletions(-) (limited to 'indra/newview/llfirstuse.cpp') diff --git a/indra/newview/app_settings/ignorable_dialogs.xml b/indra/newview/app_settings/ignorable_dialogs.xml index 0720ccee49..9ddf007ce7 100644 --- a/indra/newview/app_settings/ignorable_dialogs.xml +++ b/indra/newview/app_settings/ignorable_dialogs.xml @@ -45,6 +45,17 @@ Value 1 + FirstDisplayName + + Comment + Shows hint when edits profile for the first time + Persist + 1 + Type + Boolean + Value + 1 + FirstReceiveLindens Comment diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index dd08706f4f..b08c113923 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -116,6 +116,12 @@ void LLFirstUse::notMoving(bool enable) firstUseNotification("FirstNotMoving", enable, "HintMove", LLSD(), LLSD().with("target", "move_btn").with("direction", "top")); } +// static +void LLFirstUse::setDisplayName(bool enable) +{ + firstUseNotification("FirstDisplayName", enable, "HintDisplayName", LLSD(), LLSD().with("target", "set_display_name").with("direction", "left")); +} + // static void LLFirstUse::receiveLindens(bool enable) { diff --git a/indra/newview/llfirstuse.h b/indra/newview/llfirstuse.h index 275f134400..3b7ff6383b 100644 --- a/indra/newview/llfirstuse.h +++ b/indra/newview/llfirstuse.h @@ -91,6 +91,7 @@ public: static void notMoving(bool enable = true); static void newInventory(bool enable = true); static void receiveLindens(bool enable = true); + static void setDisplayName(bool enable = true); static void useSandbox(); protected: diff --git a/indra/newview/llpanelme.cpp b/indra/newview/llpanelme.cpp index 79d5195ccf..3cc6b32678 100644 --- a/indra/newview/llpanelme.cpp +++ b/indra/newview/llpanelme.cpp @@ -34,6 +34,8 @@ #include "llagent.h" #include "llagentcamera.h" #include "llagentwearables.h" +#include "llfirstuse.h" +#include "llhints.h" #include "llsidetray.h" #include "llviewercontrol.h" #include "llviewerdisplayname.h" @@ -190,8 +192,20 @@ void LLPanelMyProfileEdit::onOpen(const LLSD& key) set_name->setEnabled(use_display_names); // force new avatar name fetch so we have latest update time LLAvatarNameCache::fetch(gAgent.getID()); - LLPanelMyProfile::onOpen(getAvatarId()); + + LLAvatarName av_name; + if (LLAvatarNameCache::useDisplayNames()) + { + if (LLAvatarNameCache::get(gAgent.getID(), &av_name) && av_name.mIsDisplayNameDefault) + { + LLFirstUse::setDisplayName(); + } + else + { + LLFirstUse::setDisplayName(false); + } + } } void LLPanelMyProfileEdit::processProperties(void* data, EAvatarProcessorType type) @@ -258,6 +272,8 @@ BOOL LLPanelMyProfileEdit::postBuild() getChild("set_name")->setCommitCallback( boost::bind(&LLPanelMyProfileEdit::onClickSetName, this)); + LLHints::registerHintTarget("set_display_name", getChild("set_name")->getHandle()); + return LLPanelAvatarProfile::postBuild(); } /** @@ -386,7 +402,9 @@ void LLPanelMyProfileEdit::onClickSetName() { LLAvatarNameCache::get(getAvatarId(), boost::bind(&LLPanelMyProfileEdit::onAvatarNameCache, - this, _1, _2)); + this, _1, _2)); + + LLFirstUse::setDisplayName(false); } void LLPanelMyProfileEdit::onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name) diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index efd6ed0ac8..88b5613880 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -6537,6 +6537,14 @@ Mute everyone? To walk or run, open the Move Panel and use the directional arrows to navigate. You can also use the directional keys on your keyboard. + + Set your customizable display name here. This is in addition to your unique username, which can't be changed. + +