Tutorial dialog files i forgot in last commit

This commit is contained in:
Roman Bovsunivskiy
2010-02-13 23:16:24 +00:00
parent ae36dce42e
commit 27f80e27cc
6 changed files with 477 additions and 0 deletions
+267
View File
@@ -0,0 +1,267 @@
#include "TutorialAnimator.h"
#include "../../config.h"
#include "global.h"
#include "utils.h"
#include "utils_no_qt.h"
#include "platforms.h"
#include "FWWindow.h"
#include <QApplication>
#include <QDebug>
#include <QTest>
#include <QTimer>
Q_DECLARE_METATYPE(QMenu*);
using namespace libfwbuilder;
using namespace std;
TutorialAnimator::TutorialAnimator(QObject *parent, QString commands) :
QThread(parent)
{
qRegisterMetaType<QMenu*>("QMenu*");
// widget = new QWidget(dynamic_cast<QWidget*>(this->parent()));
// widget->setFocus(Qt::ActiveWindowFocusReason);
// dynamic_cast<QWidget*>(parent)->grabKeyboard();
// dynamic_cast<QWidget*>(parent)->grabMouse();
dynamic_cast<QWidget*>(parent)->hide();
currentCommand = 0;
this->commands = commands.split('\n');
helper = new TutorialHelper();
connect(this, SIGNAL(finished()), this, SLOT(scenarioFinished()));
this->start();
}
void TutorialAnimator::scenarioFinished()
{
dynamic_cast<QWidget*>(this->parent())->releaseKeyboard();
dynamic_cast<QWidget*>(this->parent())->releaseMouse();
dynamic_cast<QWidget*>(this->parent())->show();
dynamic_cast<QWidget*>(this->parent())->raise();
}
void TutorialAnimator::run()
{
for (int i=0; i<this->commands.count(); i++)
animate(i);
// dynamic_cast<QWidget*>(this->parent())->show();
//w->releaseKeyboard();
//w->releaseMouse();
}
void TutorialAnimator::animate(int command)
{
if (command == -1) command = currentCommand;
QStringList input = commands.at(command).split(QRegExp("\\s+"));
for(int i=0; i<input.size(); i++)
{
QString str = input.at(i);
input[i] = str.replace(QRegExp("\\\\_"), " ");
}
QString baseCommand = input.first().trimmed();
input.removeFirst();
if (baseCommand == "moveMouse")
moveMouse(input);
if (baseCommand == "clickWidget")
clickWidget(input);
if (baseCommand == "typeWidget")
typeWidget(input);
if (baseCommand == "hoverMenuItem")
hoverMenuItem(input);
if (baseCommand == "clickMenuItem")
clickMenuItem(input);
if (baseCommand == "wait")
wait(input);
}
QObject* TutorialAnimator::findChild(QObject *parent, QString name)
{
QObjectList queue;
queue.append(parent);
while(queue.size())
{
QObject *obj = queue.first();
queue.removeFirst();
if (obj->objectName() == name)
{
return obj;
}
else
{
queue += obj->children();
}
}
return NULL;
}
QWidget* TutorialAnimator::findWidget(QString name)
{
foreach(QWidget *w, app->allWidgets())
{
if (w->objectName() == name)
return w;
}
return NULL;
}
QObject* TutorialAnimator::getWidget(QStringList input)
{
QObject *obj = findChild(mw, input.first());
if (obj == NULL)
{
qDebug() << "could not find such object";
return NULL;
}
input.removeFirst();
if (!input.empty())
foreach (QString name, input)
{
obj = findChild(obj, name);
if (obj == NULL)
{
qDebug() << "could not find such object";
return NULL;
}
}
if (obj == NULL)
{
qDebug() << "could not find such object";
return NULL;
}
return obj;
}
void TutorialAnimator::moveMouse(QStringList input)
{
qDebug() << "input:" << input;
// is first two arguments are ints, click mouse at this coordintates
bool isInt1 = false, isInt2 = false;
int x, y;
if (input.length() == 2)
{
x = input.at(0).toInt(&isInt1, 10);
y = input.at(1).toInt(&isInt2, 10);
}
if (isInt1 && isInt2)
{
qDebug() << "moving mouse to (" << x << "," << y << ")";
QTest::mouseMove(mw, QPoint(x,y));
}
// if not, they should be widget names
// find widget with name of last argument who's parent is previous argument recursively
else
{
QObject *obj = getWidget(input);
QTest::mouseMove(dynamic_cast<QWidget*>(obj));
}
}
QPoint TutorialAnimator::findMenuItemPos(QMenu *menu, QString item)
{
int x = menu->width()/2;
int top, bottom;
for (int i=1; i<menu->height()-1; i++)
{
QAction *action = menu->actionAt(QPoint(x,i));
if (action == NULL) continue;
if (action->text() == item)
{
top = i;
break;
}
}
for (int i=menu->height()-1; i>1; i--)
{
QAction *action = menu->actionAt(QPoint(x,i));
if (action == NULL) continue;
if (action->text() == item)
{
bottom = i;
break;
}
}
if (top==bottom) return QPoint();
return QPoint(x, (top+bottom)/2);
}
void TutorialAnimator::hoverMenuItem(QStringList input)
{
QMenu *menu = dynamic_cast<QMenu*>(findWidget(input.first()));
if (menu == NULL)
{
qDebug() << "could not find menu" << input.first();
return;
}
QPoint pos = findMenuItemPos(menu, input.at(1));
QTest::mouseMove(menu, pos);
}
void TutorialAnimator::clickMenuItem(QStringList input)
{
QMenu *menu = dynamic_cast<QMenu*>(findWidget(input.first()));
if (menu == NULL)
{
qDebug() << "could not find menu" << input.first();
return;
}
QPoint pos = findMenuItemPos(menu, input.at(1));
QTest::mouseMove(menu, pos);
QMetaObject::invokeMethod(helper, "clickMenuItem", Qt::QueuedConnection,
Q_ARG(QMenu*, menu), Q_ARG(QPoint, pos));
}
void TutorialAnimator::wait(QStringList input)
{
if (input.size() < 1)
{
qDebug() << "Wrong command";
return;
}
bool isInt = false;
int n = input.first().toInt(&isInt, 10);
if (isInt == false)
{
qDebug() << "Wrong command";
return;
}
QTest::qWait(n);
}
void TutorialAnimator::clickWidget(QStringList input)
{
if (input.size() < 1)
{
qDebug() << "Wrong command";
return;
}
QWidget *w = dynamic_cast<QWidget*>(getWidget(input));
if (w == NULL)
{
qDebug() << "Could not find widget:" << input;
return;
}
QTest::mouseMove(w);
QMetaObject::invokeMethod(helper, "clickWidget", Qt::QueuedConnection, Q_ARG(QWidget*, w));
}
void TutorialAnimator::typeWidget(QStringList input)
{
if (input.size() < 2)
{
qDebug() << "Wrong command";
return;
}
QString text = input.last();
input.pop_back();
QWidget *w = dynamic_cast<QWidget*>(getWidget(input));
if (w == NULL)
{
qDebug() << "Could not find widget:" << input;
return;
}
QMetaObject::invokeMethod(helper, "typeWidget", Qt::QueuedConnection,
Q_ARG(QWidget*, w), Q_ARG(QString, text));
}
+43
View File
@@ -0,0 +1,43 @@
#ifndef TUTORIALANIMATOR_H
#define TUTORIALANIMATOR_H
#include <QMenu>
#include <QPoint>
#include <QThread>
#include <QObject>
#include <QStringList>
#include <QAction>
#include "TutorialHelper.h"
class TutorialAnimator : public QThread
{
Q_OBJECT
TutorialHelper *helper;
QWidget *widget;
QStringList commands;
int currentCommand;
void animate(int command);
void moveMouse(QStringList input);
void clickWidget(QStringList input);
void typeWidget(QStringList input);
void wait(QStringList input);
void hoverMenuItem(QStringList input);
void clickMenuItem(QStringList input);
QObject* findChild(QObject *parent, QString name);
QWidget* findWidget(QString name);
QPoint findMenuItemPos(QMenu *menu, QString item);
QObject* getWidget(QStringList input);
public:
explicit TutorialAnimator(QObject *parent, QString commands);
void run();
public slots:
void scenarioFinished();
};
#endif // TUTORIALANIMATOR_H
+87
View File
@@ -0,0 +1,87 @@
#include "TutorialDialog.h"
#include "ui_TutorialDialog.h"
#include <QDebug>
#include <QFile>
#define TUTORIALS_DIR "/Users/a2k/prog/fwbuilder/fwbuilder400.app/Contents/Resources/tutorials"
//../Contents/Resources/tutorials"
#define FS_SEPARATOR "/"
TutorialDialog::TutorialDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::TutorialDialog_q)
{
ui->setupUi(this);
animator = NULL;
currentPage = 0;
showPage(currentPage);
this->setWindowFlags(this->windowFlags() | Qt::WindowStaysOnTopHint);
// ui->content->setMaximumWidth(ui->scrollArea->viewport()->width());
}
void TutorialDialog::resizeEvent(QResizeEvent *)
{
// ui->content->setMaximumWidth(ui->scrollArea->viewport()->width());
}
TutorialDialog::~TutorialDialog()
{
delete ui;
}
void TutorialDialog::changeEvent(QEvent *e)
{
QDialog::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
void TutorialDialog::next()
{
currentPage++;
showPage(currentPage);
}
void TutorialDialog::previous()
{
currentPage--;
showPage(currentPage);
}
void TutorialDialog::reset()
{
currentPage = 0;
showPage(currentPage);
}
QString TutorialDialog::getScenarioForPage(int page)
{
QFile src(QString(":/Tutorial/commands/page") + QString::number(page) + ".txt");
src.open(QFile::ReadOnly);
return QString(src.readAll());
}
void TutorialDialog::showPage(int page)
{
QString filename = QString(":/Tutorial/html/page") + QString::number(page) + ".html";
qDebug() << filename;
QFile src(filename);
src.open(QFile::ReadOnly);
QString text = src.readAll();
qDebug() << text;
ui->content->setText(text);
ui->next->setEnabled(QFile::exists(QString(":/Tutorial/html/page") + QString::number(page+1) + ".html"));
ui->prev->setEnabled(QFile::exists(QString(":/Tutorial/html/page") + QString::number(page-1) + ".html"));
}
void TutorialDialog::demonstrate()
{
if (animator != NULL) delete animator;
animator = new TutorialAnimator(this, getScenarioForPage(currentPage));
}
+38
View File
@@ -0,0 +1,38 @@
#ifndef TUTORIALDIALOG_H
#define TUTORIALDIALOG_H
#include <QDialog>
#include "TutorialAnimator.h"
namespace Ui {
class TutorialDialog_q;
}
class TutorialDialog : public QDialog {
Q_OBJECT
public:
TutorialDialog(QWidget *parent = 0);
~TutorialDialog();
QString getScenarioForPage(int page);
void resizeEvent(QResizeEvent *);
protected:
void changeEvent(QEvent *e);
private:
Ui::TutorialDialog_q *ui;
int currentPage;
TutorialAnimator *animator;
public slots:
void previous();
void next();
void reset();
void demonstrate();
void showPage(int page);
};
#endif // TUTORIALDIALOG_H
+23
View File
@@ -0,0 +1,23 @@
#include "TutorialHelper.h"
#include <QTest>
#include <QDebug>
#include <QMenu>
TutorialHelper::TutorialHelper()
{
}
void TutorialHelper::clickWidget(QWidget *w)
{
QTest::mouseClick(w, Qt::LeftButton, Qt::NoModifier);
}
void TutorialHelper::clickMenuItem(QMenu *menu, QPoint pos)
{
QTest::mouseClick(menu, Qt::LeftButton, Qt::NoModifier, pos);
}
void TutorialHelper::typeWidget(QWidget *w, QString text)
{
QTest::keyClicks(w, text);
}
+19
View File
@@ -0,0 +1,19 @@
#ifndef TUTORIALHELPER_H
#define TUTORIALHELPER_H
#include <QObject>
#include <QMenu>
class TutorialHelper : public QObject
{
Q_OBJECT
QWidget *widget;
public:
TutorialHelper();
public slots:
void clickWidget(QWidget*);
void clickMenuItem(QMenu *menu, QPoint pos);
void typeWidget(QWidget *w, QString text);
};
#endif // TUTORIALHELPER_H