From 762855f2554393dd3bcacd9b5d205765409f6a95 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 1 Feb 2024 23:00:53 +0200 Subject: SL-19585 Try replacing fmod with openal Since now VLC is responsible for played parcel media (should be since SL-19042) should be possible to switch remaining audio to OpenAL with no loss of functionality --- indra/newview/llprogressview.cpp | 15 --------------- 1 file changed, 15 deletions(-) (limited to 'indra/newview/llprogressview.cpp') diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp index 416848f9af..6eb55c8b6a 100644 --- a/indra/newview/llprogressview.cpp +++ b/indra/newview/llprogressview.cpp @@ -399,21 +399,6 @@ void LLProgressView::initLogos() temp_str += gDirUtilp->getDirDelimiter(); -#ifdef LL_FMODSTUDIO - // original image size is 264x96, it is on longer side but - // with no internal paddings so it gets additional padding - icon_width = 77; - icon_height = 21; - S32 pad_fmod_y = 4; - texture_start_x++; - loadLogo(temp_str + "fmod_logo.png", - image_codec, - LLRect(texture_start_x, texture_start_y + pad_fmod_y + icon_height, texture_start_x + icon_width, texture_start_y + pad_fmod_y), - default_clip, - default_clip); - - texture_start_x += icon_width + default_pad + 1; -#endif //LL_FMODSTUDIO #ifdef LL_HAVOK // original image size is 342x113, central element is on a larger side // plus internal padding, so it gets slightly more height than desired 32 -- cgit v1.2.3 From c285f59ce2a05703e3a1232fcaf3ee3aea714b3f Mon Sep 17 00:00:00 2001 From: Ansariel Date: Sun, 18 Feb 2024 12:52:19 +0100 Subject: Replace BOOL with bool in llwindow and dependent classes --- indra/newview/llprogressview.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'indra/newview/llprogressview.cpp') diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp index 6eb55c8b6a..d4811c0828 100644 --- a/indra/newview/llprogressview.cpp +++ b/indra/newview/llprogressview.cpp @@ -115,13 +115,13 @@ LLProgressView::~LLProgressView() sInstance = NULL; } -BOOL LLProgressView::handleHover(S32 x, S32 y, MASK mask) +bool LLProgressView::handleHover(S32 x, S32 y, MASK mask) { if( childrenHandleHover( x, y, mask ) == NULL ) { gViewerWindow->setCursor(UI_CURSOR_WAIT); } - return TRUE; + return true; } -- cgit v1.2.3 From 8c16ec2b53153a10f40181e0e8108d24331451d4 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Tue, 20 Feb 2024 13:57:07 +0100 Subject: Convert BOOL to bool in LLControlGroup and related classes --- indra/newview/llprogressview.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/llprogressview.cpp') diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp index d4811c0828..6799e20de0 100644 --- a/indra/newview/llprogressview.cpp +++ b/indra/newview/llprogressview.cpp @@ -152,7 +152,7 @@ void LLProgressView::revealIntroPanel() // flag as having seen the new user post login intro - gSavedSettings.setBOOL("PostFirstLoginIntroViewed", TRUE ); + gSavedSettings.setBOOL("PostFirstLoginIntroViewed", true ); mMediaCtrl->setFocus(TRUE); } -- cgit v1.2.3 From a5261a5fa8fad810ecb5c260d92c3e771822bf58 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Tue, 20 Feb 2024 23:46:23 +0100 Subject: Convert BOOL to bool in llui --- indra/newview/llprogressview.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'indra/newview/llprogressview.cpp') diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp index 6799e20de0..40925cd7da 100644 --- a/indra/newview/llprogressview.cpp +++ b/indra/newview/llprogressview.cpp @@ -77,7 +77,7 @@ LLProgressView::LLProgressView() mFadeFromLoginTimer.stop(); } -BOOL LLProgressView::postBuild() +bool LLProgressView::postBuild() { mProgressBar = getChild("login_progress_bar"); @@ -96,12 +96,12 @@ BOOL LLProgressView::postBuild() getChild("message_text")->setClickedCallback(onClickMessage, this); // hidden initially, until we need it - setVisible(FALSE); + setVisible(false); LLNotifications::instance().getChannel("AlertModal")->connectChanged(boost::bind(&LLProgressView::onAlertModal, this, _1)); sInstance = this; - return TRUE; + return true; } @@ -125,14 +125,14 @@ bool LLProgressView::handleHover(S32 x, S32 y, MASK mask) } -BOOL LLProgressView::handleKeyHere(KEY key, MASK mask) +bool LLProgressView::handleKeyHere(KEY key, MASK mask) { // Suck up all keystokes except CTRL-Q. if( ('Q' == key) && (MASK_CONTROL == mask) ) { LLAppViewer::instance()->userQuit(); } - return TRUE; + return true; } void LLProgressView::revealIntroPanel() @@ -173,7 +173,7 @@ void LLProgressView::setStartupComplete() } } -void LLProgressView::setVisible(BOOL visible) +void LLProgressView::setVisible(bool visible) { if (!visible && mFadeFromLoginTimer.getStarted()) { @@ -182,14 +182,14 @@ void LLProgressView::setVisible(BOOL visible) // hiding progress view if (getVisible() && !visible) { - LLPanel::setVisible(FALSE); + LLPanel::setVisible(false); } // showing progress view else if (visible && (!getVisible() || mFadeToWorldTimer.getStarted())) { setFocus(TRUE); mFadeToWorldTimer.stop(); - LLPanel::setVisible(TRUE); + LLPanel::setVisible(true); } } -- cgit v1.2.3 From 60d3dd98a44230c21803c1606552ee098ed9fa7c Mon Sep 17 00:00:00 2001 From: Ansariel Date: Wed, 21 Feb 2024 21:05:14 +0100 Subject: Convert remaining BOOL to bool --- indra/newview/llprogressview.cpp | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'indra/newview/llprogressview.cpp') diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp index 40925cd7da..7c22514264 100644 --- a/indra/newview/llprogressview.cpp +++ b/indra/newview/llprogressview.cpp @@ -141,20 +141,20 @@ void LLProgressView::revealIntroPanel() std::string intro_url = gSavedSettings.getString("PostFirstLoginIntroURL"); if ( intro_url.length() > 0 && gSavedSettings.getBOOL("BrowserJavascriptEnabled") && - gSavedSettings.getBOOL("PostFirstLoginIntroViewed" ) == FALSE ) + gSavedSettings.getBOOL("PostFirstLoginIntroViewed" ) == false ) { // hide the progress bar getChild("stack1")->setVisible(false); // navigate to intro URL and reveal widget mMediaCtrl->navigateTo( intro_url ); - mMediaCtrl->setVisible( TRUE ); + mMediaCtrl->setVisible( true ); // flag as having seen the new user post login intro gSavedSettings.setBOOL("PostFirstLoginIntroViewed", true ); - mMediaCtrl->setFocus(TRUE); + mMediaCtrl->setFocus(true); } mFadeFromLoginTimer.start(); @@ -187,7 +187,7 @@ void LLProgressView::setVisible(bool visible) // showing progress view else if (visible && (!getVisible() || mFadeToWorldTimer.getStarted())) { - setFocus(TRUE); + setFocus(true); mFadeToWorldTimer.stop(); LLPanel::setVisible(true); } @@ -251,7 +251,7 @@ void LLProgressView::drawLogos(F32 alpha) iter->mDrawRect.getHeight(), iter->mTexturep.get(), UI_VERTEX_COLOR % alpha, - FALSE, + false, iter->mClipRect, iter->mOffsetRect); } @@ -298,7 +298,7 @@ void LLProgressView::draw() gFocusMgr.releaseFocusIfNeeded( this ); // turn off panel that hosts intro so we see the world - setVisible(FALSE); + setVisible(false); // stop observing events since we no longer care mMediaCtrl->remObserver( this ); @@ -368,7 +368,7 @@ void LLProgressView::loadLogo(const std::string &path, raw->expandToPowerOfTwo(); TextureData data; - data.mTexturep = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE); + data.mTexturep = LLViewerTextureManager::getLocalTexture(raw.get(), false); data.mDrawRect = pos_rect; data.mClipRect = clip_rect; data.mOffsetRect = offset_rect; @@ -487,7 +487,7 @@ void LLProgressView::initStartTexture(S32 location_id, bool is_in_production) { // HACK: getLocalTexture allows only power of two dimentions raw->expandToPowerOfTwo(); - gStartTexture = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE); + gStartTexture = LLViewerTextureManager::getLocalTexture(raw.get(), false); } } @@ -504,8 +504,8 @@ void LLProgressView::initTextures(S32 location_id, bool is_in_production) initStartTexture(location_id, is_in_production); initLogos(); - childSetVisible("panel_icons", mLogosList.empty() ? FALSE : TRUE); - childSetVisible("panel_top_spacer", mLogosList.empty() ? TRUE : FALSE); + childSetVisible("panel_icons", mLogosList.empty() ? false : true); + childSetVisible("panel_top_spacer", mLogosList.empty() ? true : false); } void LLProgressView::releaseTextures() @@ -513,11 +513,11 @@ void LLProgressView::releaseTextures() gStartTexture = NULL; mLogosList.clear(); - childSetVisible("panel_top_spacer", TRUE); - childSetVisible("panel_icons", FALSE); + childSetVisible("panel_top_spacer", true); + childSetVisible("panel_icons", false); } -void LLProgressView::setCancelButtonVisible(BOOL b, const std::string& label) +void LLProgressView::setCancelButtonVisible(bool b, const std::string& label) { mCancelBtn->setVisible( b ); mCancelBtn->setEnabled( b ); @@ -539,8 +539,8 @@ void LLProgressView::onCancelButtonClicked(void*) else { gAgent.teleportCancel(); - sInstance->mCancelBtn->setEnabled(FALSE); - sInstance->setVisible(FALSE); + sInstance->mCancelBtn->setEnabled(false); + sInstance->setVisible(false); } } -- cgit v1.2.3 From f9473e8afcb624cc1b101195bf15943ec372b56f Mon Sep 17 00:00:00 2001 From: Alexander Gavriliuk Date: Mon, 6 May 2024 16:52:34 +0200 Subject: secondlife/viewer#1333 BOOL to bool conversion leftovers: ternaries --- indra/newview/llprogressview.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'indra/newview/llprogressview.cpp') diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp index 7c22514264..a46c444eb9 100644 --- a/indra/newview/llprogressview.cpp +++ b/indra/newview/llprogressview.cpp @@ -141,7 +141,7 @@ void LLProgressView::revealIntroPanel() std::string intro_url = gSavedSettings.getString("PostFirstLoginIntroURL"); if ( intro_url.length() > 0 && gSavedSettings.getBOOL("BrowserJavascriptEnabled") && - gSavedSettings.getBOOL("PostFirstLoginIntroViewed" ) == false ) + !gSavedSettings.getBOOL("PostFirstLoginIntroViewed")) { // hide the progress bar getChild("stack1")->setVisible(false); @@ -504,8 +504,8 @@ void LLProgressView::initTextures(S32 location_id, bool is_in_production) initStartTexture(location_id, is_in_production); initLogos(); - childSetVisible("panel_icons", mLogosList.empty() ? false : true); - childSetVisible("panel_top_spacer", mLogosList.empty() ? true : false); + childSetVisible("panel_icons", !mLogosList.empty()); + childSetVisible("panel_top_spacer", mLogosList.empty()); } void LLProgressView::releaseTextures() @@ -519,8 +519,8 @@ void LLProgressView::releaseTextures() void LLProgressView::setCancelButtonVisible(bool b, const std::string& label) { - mCancelBtn->setVisible( b ); - mCancelBtn->setEnabled( b ); + mCancelBtn->setVisible(b); + mCancelBtn->setEnabled(b); mCancelBtn->setLabelSelected(label); mCancelBtn->setLabelUnselected(label); } -- cgit v1.2.3 From e2e37cced861b98de8c1a7c9c0d3a50d2d90e433 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Wed, 22 May 2024 21:25:21 +0200 Subject: Fix line endlings --- indra/newview/llprogressview.cpp | 1310 +++++++++++++++++++------------------- 1 file changed, 655 insertions(+), 655 deletions(-) (limited to 'indra/newview/llprogressview.cpp') diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp index 623f617d29..e03984a44c 100644 --- a/indra/newview/llprogressview.cpp +++ b/indra/newview/llprogressview.cpp @@ -1,655 +1,655 @@ -/** - * @file llprogressview.cpp - * @brief LLProgressView class implementation - * - * $LicenseInfo:firstyear=2002&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "llprogressview.h" - -#include "indra_constants.h" -#include "llmath.h" -#include "llgl.h" -#include "llrender.h" -#include "llui.h" -#include "llfontgl.h" -#include "lltimer.h" -#include "lltextbox.h" -#include "llglheaders.h" - -#include "llagent.h" -#include "llbutton.h" -#include "llcallbacklist.h" -#include "llfocusmgr.h" -#include "llnotifications.h" -#include "llprogressbar.h" -#include "llstartup.h" -#include "llviewercontrol.h" -#include "llviewertexturelist.h" -#include "llviewerwindow.h" -#include "llappviewer.h" -#include "llweb.h" -#include "lluictrlfactory.h" -#include "llpanellogin.h" - -LLProgressView* LLProgressView::sInstance = NULL; - -S32 gStartImageWidth = 1; -S32 gStartImageHeight = 1; -const F32 FADE_TO_WORLD_TIME = 1.0f; - -static LLPanelInjector r("progress_view"); - -// XUI: Translate -LLProgressView::LLProgressView() -: LLPanel(), - mPercentDone( 0.f ), - mMediaCtrl( NULL ), - mMouseDownInActiveArea( false ), - mUpdateEvents("LLProgressView"), - mFadeToWorldTimer(), - mFadeFromLoginTimer(), - mStartupComplete(false) -{ - mUpdateEvents.listen("self", boost::bind(&LLProgressView::handleUpdate, this, _1)); - mFadeToWorldTimer.stop(); - mFadeFromLoginTimer.stop(); -} - -bool LLProgressView::postBuild() -{ - mProgressBar = getChild("login_progress_bar"); - - // media control that is used to play intro video - mMediaCtrl = getChild("login_media_panel"); - mMediaCtrl->setVisible( false ); // hidden initially - mMediaCtrl->addObserver( this ); // watch events - - LLViewerMedia::getInstance()->setOnlyAudibleMediaTextureID(mMediaCtrl->getTextureID()); - - mCancelBtn = getChild("cancel_btn"); - mCancelBtn->setClickedCallback( LLProgressView::onCancelButtonClicked, NULL ); - - getChild("title_text")->setText(LLStringExplicit(LLAppViewer::instance()->getSecondLifeTitle())); - - getChild("message_text")->setClickedCallback(onClickMessage, this); - - // hidden initially, until we need it - setVisible(false); - - LLNotifications::instance().getChannel("AlertModal")->connectChanged(boost::bind(&LLProgressView::onAlertModal, this, _1)); - - sInstance = this; - return true; -} - - -LLProgressView::~LLProgressView() -{ - // Just in case something went wrong, make sure we deregister our idle callback. - gIdleCallbacks.deleteFunction(onIdle, this); - - gFocusMgr.releaseFocusIfNeeded( this ); - - sInstance = NULL; -} - -bool LLProgressView::handleHover(S32 x, S32 y, MASK mask) -{ - if( childrenHandleHover( x, y, mask ) == NULL ) - { - gViewerWindow->setCursor(UI_CURSOR_WAIT); - } - return true; -} - - -bool LLProgressView::handleKeyHere(KEY key, MASK mask) -{ - // Suck up all keystokes except CTRL-Q. - if( ('Q' == key) && (MASK_CONTROL == mask) ) - { - LLAppViewer::instance()->userQuit(); - } - return true; -} - -void LLProgressView::revealIntroPanel() -{ - // if user hasn't yet seen intro video - std::string intro_url = gSavedSettings.getString("PostFirstLoginIntroURL"); - if ( intro_url.length() > 0 && - gSavedSettings.getBOOL("BrowserJavascriptEnabled") && - !gSavedSettings.getBOOL("PostFirstLoginIntroViewed")) - { - // hide the progress bar - getChild("stack1")->setVisible(false); - - // navigate to intro URL and reveal widget - mMediaCtrl->navigateTo( intro_url ); - mMediaCtrl->setVisible( true ); - - - // flag as having seen the new user post login intro - gSavedSettings.setBOOL("PostFirstLoginIntroViewed", true ); - - mMediaCtrl->setFocus(true); - } - - mFadeFromLoginTimer.start(); - gIdleCallbacks.addFunction(onIdle, this); -} - -void LLProgressView::setStartupComplete() -{ - mStartupComplete = true; - - // if we are not showing a video, fade into world - if (!mMediaCtrl->getVisible()) - { - mFadeFromLoginTimer.stop(); - mFadeToWorldTimer.start(); - } -} - -void LLProgressView::setVisible(bool visible) -{ - if (!visible && mFadeFromLoginTimer.getStarted()) - { - mFadeFromLoginTimer.stop(); - } - // hiding progress view - if (getVisible() && !visible) - { - LLPanel::setVisible(false); - } - // showing progress view - else if (visible && (!getVisible() || mFadeToWorldTimer.getStarted())) - { - setFocus(true); - mFadeToWorldTimer.stop(); - LLPanel::setVisible(true); - } -} - - -void LLProgressView::drawStartTexture(F32 alpha) -{ - gGL.pushMatrix(); - if (gStartTexture) - { - LLGLSUIDefault gls_ui; - gGL.getTexUnit(0)->bind(gStartTexture.get()); - gGL.color4f(1.f, 1.f, 1.f, alpha); - F32 image_aspect = (F32)gStartImageWidth / (F32)gStartImageHeight; - S32 width = getRect().getWidth(); - S32 height = getRect().getHeight(); - F32 view_aspect = (F32)width / (F32)height; - // stretch image to maintain aspect ratio - if (image_aspect > view_aspect) - { - gGL.translatef(-0.5f * (image_aspect / view_aspect - 1.f) * width, 0.f, 0.f); - gGL.scalef(image_aspect / view_aspect, 1.f, 1.f); - } - else - { - gGL.translatef(0.f, -0.5f * (view_aspect / image_aspect - 1.f) * height, 0.f); - gGL.scalef(1.f, view_aspect / image_aspect, 1.f); - } - gl_rect_2d_simple_tex( getRect().getWidth(), getRect().getHeight() ); - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - } - else - { - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gGL.color4f(0.f, 0.f, 0.f, 1.f); - gl_rect_2d(getRect()); - } - gGL.popMatrix(); -} - -void LLProgressView::drawLogos(F32 alpha) -{ - if (mLogosList.empty()) - { - return; - } - - // logos are tied to label, - // due to potential resizes we have to figure offsets out on draw or resize - LLTextBox *logos_label = getChild("logos_lbl"); - S32 offset_x, offset_y; - logos_label->localPointToScreen(0, 0, &offset_x, &offset_y); - std::vector::const_iterator iter = mLogosList.begin(); - std::vector::const_iterator end = mLogosList.end(); - for (; iter != end; iter++) - { - gl_draw_scaled_image_with_border(iter->mDrawRect.mLeft + offset_x, - iter->mDrawRect.mBottom + offset_y, - iter->mDrawRect.getWidth(), - iter->mDrawRect.getHeight(), - iter->mTexturep.get(), - UI_VERTEX_COLOR % alpha, - false, - iter->mClipRect, - iter->mOffsetRect); - } -} - -void LLProgressView::draw() -{ - static LLTimer timer; - - if (mFadeFromLoginTimer.getStarted()) - { - F32 alpha = clamp_rescale(mFadeFromLoginTimer.getElapsedTimeF32(), 0.f, FADE_TO_WORLD_TIME, 0.f, 1.f); - LLViewDrawContext context(alpha); - - if (!mMediaCtrl->getVisible()) - { - drawStartTexture(alpha); - } - - LLPanel::draw(); - drawLogos(alpha); - return; - } - - // handle fade out to world view when we're asked to - if (mFadeToWorldTimer.getStarted()) - { - // draw fading panel - F32 alpha = clamp_rescale(mFadeToWorldTimer.getElapsedTimeF32(), 0.f, FADE_TO_WORLD_TIME, 1.f, 0.f); - LLViewDrawContext context(alpha); - - drawStartTexture(alpha); - LLPanel::draw(); - drawLogos(alpha); - - // faded out completely - remove panel and reveal world - if (mFadeToWorldTimer.getElapsedTimeF32() > FADE_TO_WORLD_TIME ) - { - mFadeToWorldTimer.stop(); - - LLViewerMedia::getInstance()->setOnlyAudibleMediaTextureID(LLUUID::null); - - // Fade is complete, release focus - gFocusMgr.releaseFocusIfNeeded( this ); - - // turn off panel that hosts intro so we see the world - setVisible(false); - - // stop observing events since we no longer care - mMediaCtrl->remObserver( this ); - - // hide the intro - mMediaCtrl->setVisible( false ); - - // navigate away from intro page to something innocuous since 'unload' is broken right now - //mMediaCtrl->navigateTo( "about:blank" ); - - // FIXME: this causes a crash that i haven't been able to fix - mMediaCtrl->unloadMediaSource(); - - releaseTextures(); - } - return; - } - - drawStartTexture(1.0f); - // draw children - LLPanel::draw(); - drawLogos(1.0f); -} - -void LLProgressView::setText(const std::string& text) -{ - getChild("progress_text")->setValue(text); -} - -void LLProgressView::setPercent(const F32 percent) -{ - mProgressBar->setValue(percent); -} - -void LLProgressView::setMessage(const std::string& msg) -{ - mMessage = msg; - getChild("message_text")->setValue(mMessage); -} - -void LLProgressView::loadLogo(const std::string &path, - const U8 image_codec, - const LLRect &pos_rect, - const LLRectf &clip_rect, - const LLRectf &offset_rect) -{ - // We need these images very early, so we have to force-load them, otherwise they might not load in time. - if (!gDirUtilp->fileExists(path)) - { - return; - } - - LLPointer start_image_frmted = LLImageFormatted::createFromType(image_codec); - if (!start_image_frmted->load(path)) - { - LL_WARNS("AppInit") << "Image load failed: " << path << LL_ENDL; - return; - } - - LLPointer raw = new LLImageRaw; - if (!start_image_frmted->decode(raw, 0.0f)) - { - LL_WARNS("AppInit") << "Image decode failed " << path << LL_ENDL; - return; - } - // HACK: getLocalTexture allows only power of two dimentions - raw->expandToPowerOfTwo(); - - TextureData data; - data.mTexturep = LLViewerTextureManager::getLocalTexture(raw.get(), false); - data.mDrawRect = pos_rect; - data.mClipRect = clip_rect; - data.mOffsetRect = offset_rect; - mLogosList.push_back(data); -} - -void LLProgressView::initLogos() -{ - mLogosList.clear(); - - const U8 image_codec = IMG_CODEC_PNG; - const LLRectf default_clip(0.f, 1.f, 1.f, 0.f); - const S32 default_height = 28; - const S32 default_pad = 15; - - S32 icon_width, icon_height; - - // We don't know final screen rect yet, so we can't precalculate position fully - LLTextBox *logos_label = getChild("logos_lbl"); - S32 texture_start_x = logos_label->getFont()->getWidthF32(logos_label->getText()) + default_pad; - S32 texture_start_y = -7; - - // Normally we would just preload these textures from textures.xml, - // and display them via icon control, but they are only needed on - // startup and preloaded/UI ones stay forever - // (and this code was done already so simply reused it) - std::string temp_str = gDirUtilp->getExpandedFilename(LL_PATH_DEFAULT_SKIN, "textures", "3p_icons"); - - temp_str += gDirUtilp->getDirDelimiter(); - -#ifdef LL_HAVOK - // original image size is 342x113, central element is on a larger side - // plus internal padding, so it gets slightly more height than desired 32 - icon_width = 88; - icon_height = 29; - S32 pad_havok_y = -1; - loadLogo(temp_str + "havok_logo.png", - image_codec, - LLRect(texture_start_x, texture_start_y + pad_havok_y + icon_height, texture_start_x + icon_width, texture_start_y + pad_havok_y), - default_clip, - default_clip); - - texture_start_x += icon_width + default_pad; -#endif //LL_HAVOK - - // 108x41 - icon_width = 74; - icon_height = default_height; - loadLogo(temp_str + "vivox_logo.png", - image_codec, - LLRect(texture_start_x, texture_start_y + icon_height, texture_start_x + icon_width, texture_start_y), - default_clip, - default_clip); -} - -void LLProgressView::initStartTexture(S32 location_id, bool is_in_production) -{ - if (gStartTexture.notNull()) - { - gStartTexture = NULL; - LL_INFOS("AppInit") << "re-initializing start screen" << LL_ENDL; - } - - LL_DEBUGS("AppInit") << "Loading startup bitmap..." << LL_ENDL; - - U8 image_codec = IMG_CODEC_PNG; - std::string temp_str = gDirUtilp->getLindenUserDir() + gDirUtilp->getDirDelimiter(); - - if ((S32)START_LOCATION_ID_LAST == location_id) - { - temp_str += LLStartUp::getScreenLastFilename(); - } - else - { - std::string path = temp_str + LLStartUp::getScreenHomeFilename(); - - if (!gDirUtilp->fileExists(path) && is_in_production) - { - // Fallback to old file, can be removed later - // Home image only sets when user changes home, so it will take time for users to switch to pngs - temp_str += "screen_home.bmp"; - image_codec = IMG_CODEC_BMP; - } - else - { - temp_str = path; - } - } - - LLPointer start_image_frmted = LLImageFormatted::createFromType(image_codec); - - // Turn off start screen to get around the occasional readback - // driver bug - if (!gSavedSettings.getBOOL("UseStartScreen")) - { - LL_INFOS("AppInit") << "Bitmap load disabled" << LL_ENDL; - return; - } - else if (!start_image_frmted->load(temp_str)) - { - LL_WARNS("AppInit") << "Bitmap load failed" << LL_ENDL; - gStartTexture = NULL; - } - else - { - gStartImageWidth = start_image_frmted->getWidth(); - gStartImageHeight = start_image_frmted->getHeight(); - - LLPointer raw = new LLImageRaw; - if (!start_image_frmted->decode(raw, 0.0f)) - { - LL_WARNS("AppInit") << "Bitmap decode failed" << LL_ENDL; - gStartTexture = NULL; - } - else - { - // HACK: getLocalTexture allows only power of two dimentions - raw->expandToPowerOfTwo(); - gStartTexture = LLViewerTextureManager::getLocalTexture(raw.get(), false); - } - } - - if (gStartTexture.isNull()) - { - gStartTexture = LLViewerTexture::sBlackImagep; - gStartImageWidth = gStartTexture->getWidth(); - gStartImageHeight = gStartTexture->getHeight(); - } -} - -void LLProgressView::initTextures(S32 location_id, bool is_in_production) -{ - initStartTexture(location_id, is_in_production); - initLogos(); - - childSetVisible("panel_icons", !mLogosList.empty()); - childSetVisible("panel_top_spacer", mLogosList.empty()); -} - -void LLProgressView::releaseTextures() -{ - gStartTexture = NULL; - mLogosList.clear(); - - childSetVisible("panel_top_spacer", true); - childSetVisible("panel_icons", false); -} - -void LLProgressView::setCancelButtonVisible(bool b, const std::string& label) -{ - mCancelBtn->setVisible(b); - mCancelBtn->setEnabled(b); - mCancelBtn->setLabelSelected(label); - mCancelBtn->setLabelUnselected(label); -} - -// static -void LLProgressView::onCancelButtonClicked(void*) -{ - // Quitting viewer here should happen only when "Quit" button is pressed while starting up. - // Check for startup state is used here instead of teleport state to avoid quitting when - // cancel is pressed while teleporting inside region (EXT-4911) - if (LLStartUp::getStartupState() < STATE_STARTED) - { - LL_INFOS() << "User requesting quit during login" << LL_ENDL; - LLAppViewer::instance()->requestQuit(); - } - else - { - gAgent.teleportCancel(); - sInstance->mCancelBtn->setEnabled(false); - sInstance->setVisible(false); - } -} - -// static -void LLProgressView::onClickMessage(void* data) -{ - LLProgressView* viewp = (LLProgressView*)data; - if ( viewp != NULL && ! viewp->mMessage.empty() ) - { - std::string url_to_open( "" ); - - size_t start_pos; - start_pos = viewp->mMessage.find( "https://" ); - if (start_pos == std::string::npos) - start_pos = viewp->mMessage.find( "http://" ); - if (start_pos == std::string::npos) - start_pos = viewp->mMessage.find( "ftp://" ); - - if ( start_pos != std::string::npos ) - { - size_t end_pos = viewp->mMessage.find_first_of( " \n\r\t", start_pos ); - if ( end_pos != std::string::npos ) - url_to_open = viewp->mMessage.substr( start_pos, end_pos - start_pos ); - else - url_to_open = viewp->mMessage.substr( start_pos ); - - LLWeb::loadURLExternal( url_to_open ); - } - } -} - -bool LLProgressView::handleUpdate(const LLSD& event_data) -{ - LLSD message = event_data.get("message"); - LLSD desc = event_data.get("desc"); - LLSD percent = event_data.get("percent"); - - if(message.isDefined()) - { - setMessage(message.asString()); - } - - if(desc.isDefined()) - { - setText(desc.asString()); - } - - if(percent.isDefined()) - { - setPercent(percent.asReal()); - } - return false; -} - -bool LLProgressView::onAlertModal(const LLSD& notify) -{ - // if the progress view is visible, it will obscure the notification window - // in this case, we want to auto-accept WebLaunchExternalTarget notifications - if (isInVisibleChain() && notify["sigtype"].asString() == "add") - { - LLNotificationPtr notifyp = LLNotifications::instance().find(notify["id"].asUUID()); - if (notifyp && notifyp->getName() == "WebLaunchExternalTarget") - { - notifyp->respondWithDefault(); - } - } - return false; -} - -void LLProgressView::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) -{ - // the intro web content calls javascript::window.close() when it's done - if( event == MEDIA_EVENT_CLOSE_REQUEST ) - { - if (mStartupComplete) - { - //make sure other timer has stopped - mFadeFromLoginTimer.stop(); - mFadeToWorldTimer.start(); - } - else - { - // hide the media ctrl and wait for startup to be completed before fading to world - mMediaCtrl->setVisible(false); - if (mMediaCtrl->getMediaPlugin()) - { - mMediaCtrl->getMediaPlugin()->stop(); - } - - // show the progress bar - getChild("stack1")->setVisible(true); - } - } -} - - -// static -void LLProgressView::onIdle(void* user_data) -{ - LLProgressView* self = (LLProgressView*) user_data; - - // Close login panel on mFadeToWorldTimer expiration. - if (self->mFadeFromLoginTimer.getStarted() && - self->mFadeFromLoginTimer.getElapsedTimeF32() > FADE_TO_WORLD_TIME) - { - self->mFadeFromLoginTimer.stop(); - LLPanelLogin::closePanel(); - - // Nothing to do anymore. - gIdleCallbacks.deleteFunction(onIdle, user_data); - } -} +/** + * @file llprogressview.cpp + * @brief LLProgressView class implementation + * + * $LicenseInfo:firstyear=2002&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llprogressview.h" + +#include "indra_constants.h" +#include "llmath.h" +#include "llgl.h" +#include "llrender.h" +#include "llui.h" +#include "llfontgl.h" +#include "lltimer.h" +#include "lltextbox.h" +#include "llglheaders.h" + +#include "llagent.h" +#include "llbutton.h" +#include "llcallbacklist.h" +#include "llfocusmgr.h" +#include "llnotifications.h" +#include "llprogressbar.h" +#include "llstartup.h" +#include "llviewercontrol.h" +#include "llviewertexturelist.h" +#include "llviewerwindow.h" +#include "llappviewer.h" +#include "llweb.h" +#include "lluictrlfactory.h" +#include "llpanellogin.h" + +LLProgressView* LLProgressView::sInstance = NULL; + +S32 gStartImageWidth = 1; +S32 gStartImageHeight = 1; +const F32 FADE_TO_WORLD_TIME = 1.0f; + +static LLPanelInjector r("progress_view"); + +// XUI: Translate +LLProgressView::LLProgressView() +: LLPanel(), + mPercentDone( 0.f ), + mMediaCtrl( NULL ), + mMouseDownInActiveArea( false ), + mUpdateEvents("LLProgressView"), + mFadeToWorldTimer(), + mFadeFromLoginTimer(), + mStartupComplete(false) +{ + mUpdateEvents.listen("self", boost::bind(&LLProgressView::handleUpdate, this, _1)); + mFadeToWorldTimer.stop(); + mFadeFromLoginTimer.stop(); +} + +bool LLProgressView::postBuild() +{ + mProgressBar = getChild("login_progress_bar"); + + // media control that is used to play intro video + mMediaCtrl = getChild("login_media_panel"); + mMediaCtrl->setVisible( false ); // hidden initially + mMediaCtrl->addObserver( this ); // watch events + + LLViewerMedia::getInstance()->setOnlyAudibleMediaTextureID(mMediaCtrl->getTextureID()); + + mCancelBtn = getChild("cancel_btn"); + mCancelBtn->setClickedCallback( LLProgressView::onCancelButtonClicked, NULL ); + + getChild("title_text")->setText(LLStringExplicit(LLAppViewer::instance()->getSecondLifeTitle())); + + getChild("message_text")->setClickedCallback(onClickMessage, this); + + // hidden initially, until we need it + setVisible(false); + + LLNotifications::instance().getChannel("AlertModal")->connectChanged(boost::bind(&LLProgressView::onAlertModal, this, _1)); + + sInstance = this; + return true; +} + + +LLProgressView::~LLProgressView() +{ + // Just in case something went wrong, make sure we deregister our idle callback. + gIdleCallbacks.deleteFunction(onIdle, this); + + gFocusMgr.releaseFocusIfNeeded( this ); + + sInstance = NULL; +} + +bool LLProgressView::handleHover(S32 x, S32 y, MASK mask) +{ + if( childrenHandleHover( x, y, mask ) == NULL ) + { + gViewerWindow->setCursor(UI_CURSOR_WAIT); + } + return true; +} + + +bool LLProgressView::handleKeyHere(KEY key, MASK mask) +{ + // Suck up all keystokes except CTRL-Q. + if( ('Q' == key) && (MASK_CONTROL == mask) ) + { + LLAppViewer::instance()->userQuit(); + } + return true; +} + +void LLProgressView::revealIntroPanel() +{ + // if user hasn't yet seen intro video + std::string intro_url = gSavedSettings.getString("PostFirstLoginIntroURL"); + if ( intro_url.length() > 0 && + gSavedSettings.getBOOL("BrowserJavascriptEnabled") && + !gSavedSettings.getBOOL("PostFirstLoginIntroViewed")) + { + // hide the progress bar + getChild("stack1")->setVisible(false); + + // navigate to intro URL and reveal widget + mMediaCtrl->navigateTo( intro_url ); + mMediaCtrl->setVisible( true ); + + + // flag as having seen the new user post login intro + gSavedSettings.setBOOL("PostFirstLoginIntroViewed", true ); + + mMediaCtrl->setFocus(true); + } + + mFadeFromLoginTimer.start(); + gIdleCallbacks.addFunction(onIdle, this); +} + +void LLProgressView::setStartupComplete() +{ + mStartupComplete = true; + + // if we are not showing a video, fade into world + if (!mMediaCtrl->getVisible()) + { + mFadeFromLoginTimer.stop(); + mFadeToWorldTimer.start(); + } +} + +void LLProgressView::setVisible(bool visible) +{ + if (!visible && mFadeFromLoginTimer.getStarted()) + { + mFadeFromLoginTimer.stop(); + } + // hiding progress view + if (getVisible() && !visible) + { + LLPanel::setVisible(false); + } + // showing progress view + else if (visible && (!getVisible() || mFadeToWorldTimer.getStarted())) + { + setFocus(true); + mFadeToWorldTimer.stop(); + LLPanel::setVisible(true); + } +} + + +void LLProgressView::drawStartTexture(F32 alpha) +{ + gGL.pushMatrix(); + if (gStartTexture) + { + LLGLSUIDefault gls_ui; + gGL.getTexUnit(0)->bind(gStartTexture.get()); + gGL.color4f(1.f, 1.f, 1.f, alpha); + F32 image_aspect = (F32)gStartImageWidth / (F32)gStartImageHeight; + S32 width = getRect().getWidth(); + S32 height = getRect().getHeight(); + F32 view_aspect = (F32)width / (F32)height; + // stretch image to maintain aspect ratio + if (image_aspect > view_aspect) + { + gGL.translatef(-0.5f * (image_aspect / view_aspect - 1.f) * width, 0.f, 0.f); + gGL.scalef(image_aspect / view_aspect, 1.f, 1.f); + } + else + { + gGL.translatef(0.f, -0.5f * (view_aspect / image_aspect - 1.f) * height, 0.f); + gGL.scalef(1.f, view_aspect / image_aspect, 1.f); + } + gl_rect_2d_simple_tex( getRect().getWidth(), getRect().getHeight() ); + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + } + else + { + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + gGL.color4f(0.f, 0.f, 0.f, 1.f); + gl_rect_2d(getRect()); + } + gGL.popMatrix(); +} + +void LLProgressView::drawLogos(F32 alpha) +{ + if (mLogosList.empty()) + { + return; + } + + // logos are tied to label, + // due to potential resizes we have to figure offsets out on draw or resize + LLTextBox *logos_label = getChild("logos_lbl"); + S32 offset_x, offset_y; + logos_label->localPointToScreen(0, 0, &offset_x, &offset_y); + std::vector::const_iterator iter = mLogosList.begin(); + std::vector::const_iterator end = mLogosList.end(); + for (; iter != end; iter++) + { + gl_draw_scaled_image_with_border(iter->mDrawRect.mLeft + offset_x, + iter->mDrawRect.mBottom + offset_y, + iter->mDrawRect.getWidth(), + iter->mDrawRect.getHeight(), + iter->mTexturep.get(), + UI_VERTEX_COLOR % alpha, + false, + iter->mClipRect, + iter->mOffsetRect); + } +} + +void LLProgressView::draw() +{ + static LLTimer timer; + + if (mFadeFromLoginTimer.getStarted()) + { + F32 alpha = clamp_rescale(mFadeFromLoginTimer.getElapsedTimeF32(), 0.f, FADE_TO_WORLD_TIME, 0.f, 1.f); + LLViewDrawContext context(alpha); + + if (!mMediaCtrl->getVisible()) + { + drawStartTexture(alpha); + } + + LLPanel::draw(); + drawLogos(alpha); + return; + } + + // handle fade out to world view when we're asked to + if (mFadeToWorldTimer.getStarted()) + { + // draw fading panel + F32 alpha = clamp_rescale(mFadeToWorldTimer.getElapsedTimeF32(), 0.f, FADE_TO_WORLD_TIME, 1.f, 0.f); + LLViewDrawContext context(alpha); + + drawStartTexture(alpha); + LLPanel::draw(); + drawLogos(alpha); + + // faded out completely - remove panel and reveal world + if (mFadeToWorldTimer.getElapsedTimeF32() > FADE_TO_WORLD_TIME ) + { + mFadeToWorldTimer.stop(); + + LLViewerMedia::getInstance()->setOnlyAudibleMediaTextureID(LLUUID::null); + + // Fade is complete, release focus + gFocusMgr.releaseFocusIfNeeded( this ); + + // turn off panel that hosts intro so we see the world + setVisible(false); + + // stop observing events since we no longer care + mMediaCtrl->remObserver( this ); + + // hide the intro + mMediaCtrl->setVisible( false ); + + // navigate away from intro page to something innocuous since 'unload' is broken right now + //mMediaCtrl->navigateTo( "about:blank" ); + + // FIXME: this causes a crash that i haven't been able to fix + mMediaCtrl->unloadMediaSource(); + + releaseTextures(); + } + return; + } + + drawStartTexture(1.0f); + // draw children + LLPanel::draw(); + drawLogos(1.0f); +} + +void LLProgressView::setText(const std::string& text) +{ + getChild("progress_text")->setValue(text); +} + +void LLProgressView::setPercent(const F32 percent) +{ + mProgressBar->setValue(percent); +} + +void LLProgressView::setMessage(const std::string& msg) +{ + mMessage = msg; + getChild("message_text")->setValue(mMessage); +} + +void LLProgressView::loadLogo(const std::string &path, + const U8 image_codec, + const LLRect &pos_rect, + const LLRectf &clip_rect, + const LLRectf &offset_rect) +{ + // We need these images very early, so we have to force-load them, otherwise they might not load in time. + if (!gDirUtilp->fileExists(path)) + { + return; + } + + LLPointer start_image_frmted = LLImageFormatted::createFromType(image_codec); + if (!start_image_frmted->load(path)) + { + LL_WARNS("AppInit") << "Image load failed: " << path << LL_ENDL; + return; + } + + LLPointer raw = new LLImageRaw; + if (!start_image_frmted->decode(raw, 0.0f)) + { + LL_WARNS("AppInit") << "Image decode failed " << path << LL_ENDL; + return; + } + // HACK: getLocalTexture allows only power of two dimentions + raw->expandToPowerOfTwo(); + + TextureData data; + data.mTexturep = LLViewerTextureManager::getLocalTexture(raw.get(), false); + data.mDrawRect = pos_rect; + data.mClipRect = clip_rect; + data.mOffsetRect = offset_rect; + mLogosList.push_back(data); +} + +void LLProgressView::initLogos() +{ + mLogosList.clear(); + + const U8 image_codec = IMG_CODEC_PNG; + const LLRectf default_clip(0.f, 1.f, 1.f, 0.f); + const S32 default_height = 28; + const S32 default_pad = 15; + + S32 icon_width, icon_height; + + // We don't know final screen rect yet, so we can't precalculate position fully + LLTextBox *logos_label = getChild("logos_lbl"); + S32 texture_start_x = logos_label->getFont()->getWidthF32(logos_label->getText()) + default_pad; + S32 texture_start_y = -7; + + // Normally we would just preload these textures from textures.xml, + // and display them via icon control, but they are only needed on + // startup and preloaded/UI ones stay forever + // (and this code was done already so simply reused it) + std::string temp_str = gDirUtilp->getExpandedFilename(LL_PATH_DEFAULT_SKIN, "textures", "3p_icons"); + + temp_str += gDirUtilp->getDirDelimiter(); + +#ifdef LL_HAVOK + // original image size is 342x113, central element is on a larger side + // plus internal padding, so it gets slightly more height than desired 32 + icon_width = 88; + icon_height = 29; + S32 pad_havok_y = -1; + loadLogo(temp_str + "havok_logo.png", + image_codec, + LLRect(texture_start_x, texture_start_y + pad_havok_y + icon_height, texture_start_x + icon_width, texture_start_y + pad_havok_y), + default_clip, + default_clip); + + texture_start_x += icon_width + default_pad; +#endif //LL_HAVOK + + // 108x41 + icon_width = 74; + icon_height = default_height; + loadLogo(temp_str + "vivox_logo.png", + image_codec, + LLRect(texture_start_x, texture_start_y + icon_height, texture_start_x + icon_width, texture_start_y), + default_clip, + default_clip); +} + +void LLProgressView::initStartTexture(S32 location_id, bool is_in_production) +{ + if (gStartTexture.notNull()) + { + gStartTexture = NULL; + LL_INFOS("AppInit") << "re-initializing start screen" << LL_ENDL; + } + + LL_DEBUGS("AppInit") << "Loading startup bitmap..." << LL_ENDL; + + U8 image_codec = IMG_CODEC_PNG; + std::string temp_str = gDirUtilp->getLindenUserDir() + gDirUtilp->getDirDelimiter(); + + if ((S32)START_LOCATION_ID_LAST == location_id) + { + temp_str += LLStartUp::getScreenLastFilename(); + } + else + { + std::string path = temp_str + LLStartUp::getScreenHomeFilename(); + + if (!gDirUtilp->fileExists(path) && is_in_production) + { + // Fallback to old file, can be removed later + // Home image only sets when user changes home, so it will take time for users to switch to pngs + temp_str += "screen_home.bmp"; + image_codec = IMG_CODEC_BMP; + } + else + { + temp_str = path; + } + } + + LLPointer start_image_frmted = LLImageFormatted::createFromType(image_codec); + + // Turn off start screen to get around the occasional readback + // driver bug + if (!gSavedSettings.getBOOL("UseStartScreen")) + { + LL_INFOS("AppInit") << "Bitmap load disabled" << LL_ENDL; + return; + } + else if (!start_image_frmted->load(temp_str)) + { + LL_WARNS("AppInit") << "Bitmap load failed" << LL_ENDL; + gStartTexture = NULL; + } + else + { + gStartImageWidth = start_image_frmted->getWidth(); + gStartImageHeight = start_image_frmted->getHeight(); + + LLPointer raw = new LLImageRaw; + if (!start_image_frmted->decode(raw, 0.0f)) + { + LL_WARNS("AppInit") << "Bitmap decode failed" << LL_ENDL; + gStartTexture = NULL; + } + else + { + // HACK: getLocalTexture allows only power of two dimentions + raw->expandToPowerOfTwo(); + gStartTexture = LLViewerTextureManager::getLocalTexture(raw.get(), false); + } + } + + if (gStartTexture.isNull()) + { + gStartTexture = LLViewerTexture::sBlackImagep; + gStartImageWidth = gStartTexture->getWidth(); + gStartImageHeight = gStartTexture->getHeight(); + } +} + +void LLProgressView::initTextures(S32 location_id, bool is_in_production) +{ + initStartTexture(location_id, is_in_production); + initLogos(); + + childSetVisible("panel_icons", !mLogosList.empty()); + childSetVisible("panel_top_spacer", mLogosList.empty()); +} + +void LLProgressView::releaseTextures() +{ + gStartTexture = NULL; + mLogosList.clear(); + + childSetVisible("panel_top_spacer", true); + childSetVisible("panel_icons", false); +} + +void LLProgressView::setCancelButtonVisible(bool b, const std::string& label) +{ + mCancelBtn->setVisible(b); + mCancelBtn->setEnabled(b); + mCancelBtn->setLabelSelected(label); + mCancelBtn->setLabelUnselected(label); +} + +// static +void LLProgressView::onCancelButtonClicked(void*) +{ + // Quitting viewer here should happen only when "Quit" button is pressed while starting up. + // Check for startup state is used here instead of teleport state to avoid quitting when + // cancel is pressed while teleporting inside region (EXT-4911) + if (LLStartUp::getStartupState() < STATE_STARTED) + { + LL_INFOS() << "User requesting quit during login" << LL_ENDL; + LLAppViewer::instance()->requestQuit(); + } + else + { + gAgent.teleportCancel(); + sInstance->mCancelBtn->setEnabled(false); + sInstance->setVisible(false); + } +} + +// static +void LLProgressView::onClickMessage(void* data) +{ + LLProgressView* viewp = (LLProgressView*)data; + if ( viewp != NULL && ! viewp->mMessage.empty() ) + { + std::string url_to_open( "" ); + + size_t start_pos; + start_pos = viewp->mMessage.find( "https://" ); + if (start_pos == std::string::npos) + start_pos = viewp->mMessage.find( "http://" ); + if (start_pos == std::string::npos) + start_pos = viewp->mMessage.find( "ftp://" ); + + if ( start_pos != std::string::npos ) + { + size_t end_pos = viewp->mMessage.find_first_of( " \n\r\t", start_pos ); + if ( end_pos != std::string::npos ) + url_to_open = viewp->mMessage.substr( start_pos, end_pos - start_pos ); + else + url_to_open = viewp->mMessage.substr( start_pos ); + + LLWeb::loadURLExternal( url_to_open ); + } + } +} + +bool LLProgressView::handleUpdate(const LLSD& event_data) +{ + LLSD message = event_data.get("message"); + LLSD desc = event_data.get("desc"); + LLSD percent = event_data.get("percent"); + + if(message.isDefined()) + { + setMessage(message.asString()); + } + + if(desc.isDefined()) + { + setText(desc.asString()); + } + + if(percent.isDefined()) + { + setPercent(percent.asReal()); + } + return false; +} + +bool LLProgressView::onAlertModal(const LLSD& notify) +{ + // if the progress view is visible, it will obscure the notification window + // in this case, we want to auto-accept WebLaunchExternalTarget notifications + if (isInVisibleChain() && notify["sigtype"].asString() == "add") + { + LLNotificationPtr notifyp = LLNotifications::instance().find(notify["id"].asUUID()); + if (notifyp && notifyp->getName() == "WebLaunchExternalTarget") + { + notifyp->respondWithDefault(); + } + } + return false; +} + +void LLProgressView::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) +{ + // the intro web content calls javascript::window.close() when it's done + if( event == MEDIA_EVENT_CLOSE_REQUEST ) + { + if (mStartupComplete) + { + //make sure other timer has stopped + mFadeFromLoginTimer.stop(); + mFadeToWorldTimer.start(); + } + else + { + // hide the media ctrl and wait for startup to be completed before fading to world + mMediaCtrl->setVisible(false); + if (mMediaCtrl->getMediaPlugin()) + { + mMediaCtrl->getMediaPlugin()->stop(); + } + + // show the progress bar + getChild("stack1")->setVisible(true); + } + } +} + + +// static +void LLProgressView::onIdle(void* user_data) +{ + LLProgressView* self = (LLProgressView*) user_data; + + // Close login panel on mFadeToWorldTimer expiration. + if (self->mFadeFromLoginTimer.getStarted() && + self->mFadeFromLoginTimer.getElapsedTimeF32() > FADE_TO_WORLD_TIME) + { + self->mFadeFromLoginTimer.stop(); + LLPanelLogin::closePanel(); + + // Nothing to do anymore. + gIdleCallbacks.deleteFunction(onIdle, user_data); + } +} -- cgit v1.2.3