fluidlauncher.cpp Example File demos/embedded/fluidlauncher/fluidlauncher.cpp
#include <QXmlStreamReader>
#include "fluidlauncher.h"
#define DEFAULT_INPUT_TIMEOUT 10000
#define SIZING_FACTOR_HEIGHT 6/10
#define SIZING_FACTOR_WIDTH 6/10
FluidLauncher::FluidLauncher(QStringList* args)
{
pictureFlowWidget = new PictureFlow();
slideShowWidget = new SlideShow();
inputTimer = new QTimer();
addWidget(pictureFlowWidget);
addWidget(slideShowWidget);
setCurrentWidget(pictureFlowWidget);
pictureFlowWidget->setFocus();
QRect screen_size = QApplication::desktop()->screenGeometry();
QObject::connect(pictureFlowWidget, SIGNAL(itemActivated(int)), this, SLOT(launchApplication(int)));
QObject::connect(pictureFlowWidget, SIGNAL(inputReceived()), this, SLOT(resetInputTimeout()));
QObject::connect(slideShowWidget, SIGNAL(inputReceived()), this, SLOT(switchToLauncher()));
QObject::connect(inputTimer, SIGNAL(timeout()), this, SLOT(inputTimedout()));
inputTimer->setSingleShot(true);
inputTimer->setInterval(DEFAULT_INPUT_TIMEOUT);
const int h = screen_size.height() * SIZING_FACTOR_HEIGHT;
const int w = screen_size.width() * SIZING_FACTOR_WIDTH;
const int hh = qMin(h, w);
const int ww = hh / 3 * 2;
pictureFlowWidget->setSlideSize(QSize(ww, hh));
bool success;
int configIndex = args->indexOf("-config");
if ( (configIndex != -1) && (configIndex != args->count()-1) )
success = loadConfig(args->at(configIndex+1));
else
success = loadConfig("config.xml");
if (success) {
populatePictureFlow();
showFullScreen();
inputTimer->start();
} else {
pictureFlowWidget->setAttribute(Qt::WA_DeleteOnClose, true);
pictureFlowWidget->close();
}
}
FluidLauncher::~FluidLauncher()
{
delete pictureFlowWidget;
delete slideShowWidget;
}
bool FluidLauncher::loadConfig(QString configPath)
{
QFile xmlFile(configPath);
if (!xmlFile.exists() || (xmlFile.error() != QFile::NoError)) {
qDebug() << "ERROR: Unable to open config file " << configPath;
return false;
}
slideShowWidget->clearImages();
xmlFile.open(QIODevice::ReadOnly);
QXmlStreamReader reader(&xmlFile);
while (!reader.atEnd()) {
reader.readNext();
if (reader.isStartElement()) {
if (reader.name() == "demos")
parseDemos(reader);
else if(reader.name() == "slideshow")
parseSlideshow(reader);
}
}
if (reader.hasError()) {
qDebug() << QString("Error parsing %1 on line %2 column %3: \n%4")
.arg(configPath)
.arg(reader.lineNumber())
.arg(reader.columnNumber())
.arg(reader.errorString());
}
DemoApplication* exitItem = new DemoApplication(QString(), QLatin1String("Exit Embedded Demo"), QString(), QStringList());
demoList.append(exitItem);
return true;
}
void FluidLauncher::parseDemos(QXmlStreamReader& reader)
{
while (!reader.atEnd()) {
reader.readNext();
if (reader.isStartElement() && reader.name() == "example") {
QXmlStreamAttributes attrs = reader.attributes();
QStringRef filename = attrs.value("filename");
if (!filename.isEmpty()) {
QStringRef name = attrs.value("name");
QStringRef image = attrs.value("image");
QStringRef args = attrs.value("args");
DemoApplication* newDemo = new DemoApplication(
filename.toString(),
name.isEmpty() ? "Unamed Demo" : name.toString(),
image.toString(),
args.toString().split(" "));
demoList.append(newDemo);
}
} else if(reader.isEndElement() && reader.name() == "demos") {
return;
}
}
}
void FluidLauncher::parseSlideshow(QXmlStreamReader& reader)
{
QXmlStreamAttributes attrs = reader.attributes();
QStringRef timeout = attrs.value("timeout");
bool valid;
if (!timeout.isEmpty()) {
int t = timeout.toString().toInt(&valid);
if (valid)
inputTimer->setInterval(t);
}
QStringRef interval = attrs.value("interval");
if (!interval.isEmpty()) {
int i = interval.toString().toInt(&valid);
if (valid)
slideShowWidget->setSlideInterval(i);
}
while (!reader.atEnd()) {
reader.readNext();
if (reader.isStartElement()) {
QXmlStreamAttributes attrs = reader.attributes();
if (reader.name() == "imagedir") {
QStringRef dir = attrs.value("dir");
slideShowWidget->addImageDir(dir.toString());
} else if(reader.name() == "image") {
QStringRef image = attrs.value("image");
slideShowWidget->addImage(image.toString());
}
} else if(reader.isEndElement() && reader.name() == "slideshow") {
return;
}
}
}
void FluidLauncher::populatePictureFlow()
{
pictureFlowWidget->setSlideCount(demoList.count());
for (int i=demoList.count()-1; i>=0; --i) {
pictureFlowWidget->setSlide(i, *(demoList[i]->getImage()));
pictureFlowWidget->setSlideCaption(i, demoList[i]->getCaption());
}
pictureFlowWidget->setCurrentSlide(demoList.count()/2);
}
void FluidLauncher::launchApplication(int index)
{
if (index == demoList.size() -1) {
qApp->quit();
return;
}
inputTimer->stop();
QObject::connect(demoList[index], SIGNAL(demoFinished()), this, SLOT(demoFinished()));
demoList[index]->launch();
}
void FluidLauncher::switchToLauncher()
{
slideShowWidget->stopShow();
inputTimer->start();
setCurrentWidget(pictureFlowWidget);
}
void FluidLauncher::resetInputTimeout()
{
if (inputTimer->isActive())
inputTimer->start();
}
void FluidLauncher::inputTimedout()
{
switchToSlideshow();
}
void FluidLauncher::switchToSlideshow()
{
inputTimer->stop();
slideShowWidget->startShow();
setCurrentWidget(slideShowWidget);
}
void FluidLauncher::demoFinished()
{
setCurrentWidget(pictureFlowWidget);
inputTimer->start();
raise();
activateWindow();
}
void FluidLauncher::changeEvent(QEvent* event)
{
if (event->type() == QEvent::ActivationChange) {
if (isActiveWindow()) {
if(currentWidget() == pictureFlowWidget) {
resetInputTimeout();
} else {
slideShowWidget->startShow();
}
} else {
inputTimer->stop();
slideShowWidget->stopShow();
}
}
QStackedWidget::changeEvent(event);
}
|
|
Best Of
Actualités les plus lues
Le blog Digia au hasard
Le blog Digia est l'endroit privilégié pour la communication sur l'édition commerciale de Qt, où des réponses publiques sont apportées aux questions les plus posées au support. Lire l'article.
Communauté
Ressources
Liens utiles
Contact
- Vous souhaitez rejoindre la rédaction ou proposer un tutoriel, une traduction, une question... ? Postez dans le forum Contribuez ou contactez-nous par MP ou par email (voir en bas de page).
Qt dans le magazine
|