342 lines
11 KiB
C++
342 lines
11 KiB
C++
/* Copyright (c) 2006-2010, Linden Research, Inc.
|
|
*
|
|
* LLQtWebKit 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 GPL-license.txt in this distribution, or online at
|
|
* http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/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 FLOSS-exception.txt in this software distribution, or
|
|
* online at
|
|
* http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/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.
|
|
*/
|
|
|
|
#include <QtGui/QtGui>
|
|
#include <llqtwebkit.h>
|
|
|
|
class WebPage : public QWidget, LLEmbeddedBrowserWindowObserver
|
|
{
|
|
Q_OBJECT
|
|
|
|
signals:
|
|
void locationChanged(const QString &);
|
|
void canGoBack(bool);
|
|
void canGoForward(bool);
|
|
|
|
public:
|
|
WebPage(QWidget *parent = 0);
|
|
~WebPage();
|
|
|
|
void onCursorChanged(const EventType& event);
|
|
void onPageChanged(const EventType& event);
|
|
void onNavigateBegin(const EventType& event);
|
|
void onNavigateComplete(const EventType& event);
|
|
void onUpdateProgress(const EventType& event);
|
|
void onStatusTextChange(const EventType& event);
|
|
void onLocationChange(const EventType& event);
|
|
void onClickLinkHref(const EventType& event);
|
|
void onClickLinkNoFollow(const EventType& event);
|
|
|
|
public slots:
|
|
void goBack();
|
|
void goForward();
|
|
void reload();
|
|
void loadUrl(const QString &);
|
|
|
|
protected:
|
|
void resizeEvent(QResizeEvent *event);
|
|
void paintEvent(QPaintEvent *event);
|
|
void mouseDoubleClickEvent(QMouseEvent *event);
|
|
void mouseMoveEvent(QMouseEvent *event);
|
|
void mousePressEvent(QMouseEvent *event);
|
|
void mouseReleaseEvent(QMouseEvent *event);
|
|
void keyPressEvent(QKeyEvent *event);
|
|
void keyReleaseEvent(QKeyEvent *event);
|
|
private:
|
|
void updateSLvariables();
|
|
int mBrowserWindowId;
|
|
};
|
|
|
|
WebPage::WebPage(QWidget *parent)
|
|
: QWidget(parent)
|
|
{
|
|
setMouseTracking(true);
|
|
std::string applicationDir = std::string();
|
|
std::string componentDir = applicationDir;
|
|
std::string profileDir = applicationDir + "\\" + "testGL_profile";
|
|
LLQtWebKit::getInstance()->init(applicationDir, componentDir, profileDir, 0);
|
|
|
|
mBrowserWindowId = LLQtWebKit::getInstance()->createBrowserWindow(width(), height());
|
|
|
|
// observer events that LLQtWebKit emits
|
|
LLQtWebKit::getInstance()->addObserver( mBrowserWindowId, this );
|
|
|
|
// append details to agent string
|
|
LLQtWebKit::getInstance()->setBrowserAgentId("testqtapp");
|
|
|
|
// don't flip bitmap
|
|
LLQtWebKit::getInstance()->flipWindow(mBrowserWindowId, false);
|
|
|
|
// test Second Life viewer specific functions
|
|
LLQtWebKit::getInstance()->setSLObjectEnabled( true ); // true means feature is turned on
|
|
LLQtWebKit::getInstance()->setAgentLanguage( "tst-en" ); // viewer language selected by agent
|
|
LLQtWebKit::getInstance()->setAgentRegion( "QtTestAppRegion" ); // name of region where agent is located
|
|
LLQtWebKit::getInstance()->setAgentLocation( 9.8, 7.6, 5.4 ); // agent's x,y,z location within a region
|
|
LLQtWebKit::getInstance()->setAgentGlobalLocation( 119.8, 227.6, 335.4 ); // agent's x,y,z location within the grid
|
|
LLQtWebKit::getInstance()->setAgentMaturity( "Very immature" ); // selected maturity level of agent
|
|
LLQtWebKit::getInstance()->setAgentOrientation( (rand()%36000)/100.0f ); // direction avatar is facing
|
|
LLQtWebKit::getInstance()->emitLocation();
|
|
LLQtWebKit::getInstance()->emitLanguage();
|
|
LLQtWebKit::getInstance()->emitMaturity();
|
|
|
|
// go to the "home page"
|
|
LLQtWebKit::getInstance()->navigateTo(mBrowserWindowId, "http://callum-linden.s3.amazonaws.com/browsertest.html");
|
|
}
|
|
|
|
WebPage::~WebPage()
|
|
{
|
|
// unhook observer
|
|
LLQtWebKit::getInstance()->remObserver( mBrowserWindowId, this );
|
|
|
|
// clean up
|
|
LLQtWebKit::getInstance()->reset();
|
|
}
|
|
|
|
void WebPage::updateSLvariables()
|
|
{
|
|
// randomly update SL values to test
|
|
LLQtWebKit::getInstance()->setAgentOrientation( (rand()%36000)/100.0f );
|
|
LLQtWebKit::getInstance()->setAgentLocation( (rand()%25600)/100.0f, (rand()%25600)/100.0f, (rand()%25600)/100.0f );
|
|
LLQtWebKit::getInstance()->setAgentGlobalLocation( (rand()%25600)/100.0f, (rand()%25600)/100.0f, (rand()%25600)/100.0f );
|
|
|
|
if ( rand() % 2 )
|
|
LLQtWebKit::getInstance()->setAgentLanguage( "One language" );
|
|
else
|
|
LLQtWebKit::getInstance()->setAgentLanguage( "Another language" );
|
|
|
|
if ( rand() % 2 )
|
|
LLQtWebKit::getInstance()->setAgentRegion( "Region Wibble" );
|
|
else
|
|
LLQtWebKit::getInstance()->setAgentRegion( "Region Flasm" );
|
|
|
|
if ( rand() % 2 )
|
|
LLQtWebKit::getInstance()->setAgentMaturity( "Adults only" );
|
|
else
|
|
LLQtWebKit::getInstance()->setAgentMaturity( "Children only" );
|
|
|
|
LLQtWebKit::getInstance()->emitLocation();
|
|
LLQtWebKit::getInstance()->emitLanguage();
|
|
LLQtWebKit::getInstance()->emitMaturity();
|
|
}
|
|
|
|
void WebPage::onCursorChanged(const EventType& event)
|
|
{
|
|
//qDebug() << __FUNCTION__ << QString::fromStdString(event.getEventUri());
|
|
switch (event.getIntValue()) {
|
|
case LLQtWebKit::C_ARROW: setCursor(QCursor(Qt::ArrowCursor)); break;
|
|
case LLQtWebKit::C_IBEAM: setCursor(QCursor(Qt::IBeamCursor)); break;
|
|
case LLQtWebKit::C_SPLITV: setCursor(QCursor(Qt::SplitHCursor)); break;
|
|
case LLQtWebKit::C_SPLITH: setCursor(QCursor(Qt::SplitVCursor)); break;
|
|
case LLQtWebKit::C_POINTINGHAND: setCursor(QCursor(Qt::PointingHandCursor)); break;
|
|
default: break;
|
|
}
|
|
}
|
|
|
|
void WebPage::onPageChanged(const EventType& event)
|
|
{
|
|
Q_UNUSED(event);
|
|
LLQtWebKit::getInstance()->grabBrowserWindow( mBrowserWindowId );
|
|
//qDebug() << __FUNCTION__ << QString::fromStdString(event.getEventUri());
|
|
update();
|
|
}
|
|
|
|
void WebPage::onNavigateBegin(const EventType& event)
|
|
{
|
|
Q_UNUSED(event);
|
|
//qDebug() << __FUNCTION__ << QString::fromStdString(event.getEventUri());
|
|
}
|
|
|
|
void WebPage::onNavigateComplete(const EventType& event)
|
|
{
|
|
Q_UNUSED(event);
|
|
//qDebug() << __FUNCTION__ << QString::fromStdString(event.getEventUri());
|
|
}
|
|
|
|
void WebPage::onUpdateProgress(const EventType& event)
|
|
{
|
|
Q_UNUSED(event);
|
|
}
|
|
|
|
void WebPage::onStatusTextChange(const EventType& event)
|
|
{
|
|
Q_UNUSED(event);
|
|
}
|
|
|
|
void WebPage::onLocationChange(const EventType& event)
|
|
{
|
|
//qDebug() << __FUNCTION__;
|
|
emit locationChanged(QString::fromStdString(event.getEventUri()));
|
|
//void canGoBack(bool);
|
|
//void canGoForward(bool);
|
|
}
|
|
|
|
void WebPage::onClickLinkHref(const EventType& event)
|
|
{
|
|
Q_UNUSED(event);
|
|
}
|
|
|
|
void WebPage::onClickLinkNoFollow(const EventType& event)
|
|
{
|
|
Q_UNUSED(event);
|
|
}
|
|
|
|
void WebPage::resizeEvent(QResizeEvent *event)
|
|
{
|
|
LLQtWebKit::getInstance()->setSize(mBrowserWindowId, event->size().width(), event->size().height());
|
|
QWidget::resizeEvent(event);
|
|
}
|
|
|
|
void WebPage::paintEvent(QPaintEvent *event)
|
|
{
|
|
Q_UNUSED(event);
|
|
|
|
int width = LLQtWebKit::getInstance()->getBrowserWidth(mBrowserWindowId);
|
|
int height = LLQtWebKit::getInstance()->getBrowserHeight(mBrowserWindowId);
|
|
const unsigned char* pixels = LLQtWebKit::getInstance()->getBrowserWindowPixels(mBrowserWindowId);
|
|
QImage image(pixels, width, height, QImage::Format_RGB32);
|
|
image = image.rgbSwapped();
|
|
QPainter painter(this);
|
|
painter.drawImage(QPoint(0, 0), image);
|
|
}
|
|
|
|
void WebPage::mouseDoubleClickEvent(QMouseEvent *event)
|
|
{
|
|
LLQtWebKit::getInstance()->mouseEvent( mBrowserWindowId,
|
|
LLQtWebKit::ME_MOUSE_DOUBLE_CLICK,
|
|
LLQtWebKit::MB_MOUSE_BUTTON_LEFT,
|
|
event->x(), event->y(),
|
|
LLQtWebKit::KM_MODIFIER_NONE );
|
|
}
|
|
|
|
void WebPage::mouseMoveEvent(QMouseEvent *event)
|
|
{
|
|
updateSLvariables();
|
|
|
|
LLQtWebKit::getInstance()->mouseEvent( mBrowserWindowId,
|
|
LLQtWebKit::ME_MOUSE_MOVE,
|
|
LLQtWebKit::MB_MOUSE_BUTTON_LEFT,
|
|
event->x(), event->y(),
|
|
LLQtWebKit::KM_MODIFIER_NONE );
|
|
}
|
|
|
|
void WebPage::mousePressEvent(QMouseEvent *event)
|
|
{
|
|
LLQtWebKit::getInstance()->mouseEvent( mBrowserWindowId,
|
|
LLQtWebKit::ME_MOUSE_DOWN,
|
|
LLQtWebKit::MB_MOUSE_BUTTON_LEFT,
|
|
event->x(), event->y(),
|
|
LLQtWebKit::KM_MODIFIER_NONE );
|
|
}
|
|
|
|
void WebPage::mouseReleaseEvent(QMouseEvent *event)
|
|
{
|
|
LLQtWebKit::getInstance()->mouseEvent( mBrowserWindowId,
|
|
LLQtWebKit::ME_MOUSE_UP,
|
|
LLQtWebKit::MB_MOUSE_BUTTON_LEFT,
|
|
event->x(), event->y(),
|
|
LLQtWebKit::KM_MODIFIER_NONE );
|
|
|
|
LLQtWebKit::getInstance()->focusBrowser(mBrowserWindowId, true);
|
|
}
|
|
|
|
void WebPage::keyPressEvent(QKeyEvent *event)
|
|
{
|
|
Q_UNUSED(event);
|
|
}
|
|
|
|
void WebPage::keyReleaseEvent(QKeyEvent *event)
|
|
{
|
|
Q_UNUSED(event);
|
|
//LLQtWebKit::getInstance()->unicodeInput(mBrowserWindowId, event->text().at(0).unicode(),LLQtWebKit::KM_MODIFIER_NONE);
|
|
}
|
|
|
|
void WebPage::goBack()
|
|
{
|
|
LLQtWebKit::getInstance()->userAction(mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_BACK);
|
|
}
|
|
|
|
void WebPage::goForward()
|
|
{
|
|
LLQtWebKit::getInstance()->userAction(mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_FORWARD);
|
|
}
|
|
|
|
void WebPage::reload()
|
|
{
|
|
LLQtWebKit::getInstance()->userAction(mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_RELOAD);
|
|
}
|
|
|
|
void WebPage::loadUrl(const QString &url)
|
|
{
|
|
LLQtWebKit::getInstance()->navigateTo(mBrowserWindowId, url.toStdString());
|
|
}
|
|
|
|
#include "ui_window.h"
|
|
|
|
class Window : public QDialog, public Ui_Dialog
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
Window(QWidget *parent = 0);
|
|
|
|
public slots:
|
|
void loadUrl();
|
|
};
|
|
|
|
Window::Window(QWidget *parent)
|
|
: QDialog(parent)
|
|
{
|
|
setupUi(this);
|
|
connect(webpage, SIGNAL(locationChanged(const QString &)),
|
|
location, SLOT(setText(const QString &)));
|
|
connect(webpage, SIGNAL(canGoBack(bool)),
|
|
backButton, SLOT(setEnabled(bool)));
|
|
connect(webpage, SIGNAL(canGoForward(bool)),
|
|
forwardButton, SLOT(setEnabled(bool)));
|
|
connect(backButton, SIGNAL(clicked()),
|
|
webpage, SLOT(goBack()));
|
|
connect(forwardButton, SIGNAL(clicked()),
|
|
webpage, SLOT(goForward()));
|
|
connect(reloadButton, SIGNAL(clicked()),
|
|
webpage, SLOT(reload()));
|
|
connect(location, SIGNAL(returnPressed()),
|
|
this, SLOT(loadUrl()));
|
|
}
|
|
|
|
void Window::loadUrl()
|
|
{
|
|
webpage->loadUrl(location->text());
|
|
}
|
|
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
QApplication application(argc, argv);
|
|
Window window;
|
|
window.show();
|
|
return application.exec();
|
|
}
|
|
|
|
#include "main.moc"
|