Files
SingularityViewer/indra/newview/llprogressview.cpp
Inusaito Sayori af58636c7c Fix the Login Panel such that it persists until a successful login and maintains ui values between failed logins
When the login panel used to die, it now hides instead, we only truly kill it upon successful login.
Much of the opening and setting behaviors have been cleaned up to ensure fields are autofilled by the viewer without any user action once
Everything else like changing saved logins will still work the same.
2014-02-02 16:45:37 -05:00

336 lines
8.8 KiB
C++

/**
* @file llprogressview.cpp
* @brief LLProgressView class implementation
*
* $LicenseInfo:firstyear=2002&license=viewergpl$
*
* Copyright (c) 2002-2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "llprogressview.h"
#include "indra_constants.h"
#include "llmath.h"
#include "llgl.h"
#include "llrender.h"
#include "llui.h"
#include "llfontgl.h"
#include "llimagegl.h"
#include "lltimer.h"
#include "llglheaders.h"
#include "llagent.h"
#include "llbutton.h"
#include "llcallbacklist.h"
#include "llfocusmgr.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;
// XUI:translate
LLProgressView::LLProgressView(const std::string& name, const LLRect &rect)
: LLPanel(name, rect, FALSE),
mPercentDone( 0.f ),
mURLInMessage(false),
mMouseDownInActiveArea( false ),
mFadeToWorldTimer(),
mFadeFromLoginTimer(),
mStartupComplete(false)
{
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_progress.xml");
reshape(rect.getWidth(), rect.getHeight());
mFadeToWorldTimer.stop();
mFadeFromLoginTimer.stop();
}
BOOL LLProgressView::postBuild()
{
mProgressBar = getChild<LLProgressBar>("login_progress_bar");
mCancelBtn = getChild<LLButton>("cancel_btn");
mCancelBtn->setClickedCallback( boost::bind(&LLProgressView::onCancelButtonClicked) );
getChild<LLTextBox>("title_text")->setText(LLStringExplicit(LLAppViewer::instance()->getSecondLifeTitle()));
getChild<LLTextBox>("message_text")->setClickedCallback(boost::bind(&LLProgressView::onClickMessage, this));
// hidden initially, until we need it
setVisible(FALSE);
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()
{
getParent()->sendChildToFront(this);
mFadeFromLoginTimer.start();
gIdleCallbacks.addFunction(onIdle, this);
}
void LLProgressView::setStartupComplete()
{
mStartupComplete = true;
mFadeFromLoginTimer.stop();
mFadeToWorldTimer.start();
}
void LLProgressView::setVisible(BOOL visible)
{
// 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::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);
drawStartTexture(alpha);
LLPanel::draw();
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();
// faded out completely - remove panel and reveal world
if (mFadeToWorldTimer.getElapsedTimeF32() > FADE_TO_WORLD_TIME )
{
mFadeToWorldTimer.stop();
// Fade is complete, release focus
gFocusMgr.releaseFocusIfNeeded( this );
// turn off panel that hosts intro so we see the world
setVisible(FALSE);
gStartTexture = NULL;
}
return;
}
drawStartTexture(1.0f);
// draw children
LLPanel::draw();
}
void LLProgressView::setText(const std::string& text)
{
getChild<LLTextBox>("progress_text")->setWrappedText(LLStringExplicit(text));
}
void LLProgressView::setPercent(const F32 percent)
{
mProgressBar->setPercent(percent);
}
void LLProgressView::setMessage(const std::string& msg)
{
mMessage = msg;
mURLInMessage = (mMessage.find( "https://" ) != std::string::npos ||
mMessage.find( "http://" ) != std::string::npos ||
mMessage.find( "ftp://" ) != std::string::npos);
getChild<LLTextBox>("message_text")->setWrappedText(LLStringExplicit(mMessage));
getChild<LLTextBox>("message_text")->setHoverActive(mURLInMessage);
}
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()
{
// 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)
{
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 );
}
}
}
// 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::hide();
// Nothing to do anymore.
gIdleCallbacks.deleteFunction(onIdle, user_data);
}
}