Commit ac9159f8 authored by Daniel Molkentin's avatar Daniel Molkentin
Browse files

Add our own description file to show all possible QML examples.

Reviewed-By: con
parent 1f09c6bc
<?xml version="1.0" encoding="iso-8859-1"?>
<categories name="Qt Examples and Demos">
<category dirname="declarative/toys" name="Toys">
<example filename="dynamicscene" name="Dynamic Scene" executable="false" qml="true" />
<example filename="tic-tac-toe" name="Tic Tac Toe" executable="false" qml="true" />
<example filename="clocks" name="Clocks" executable="false" qml="true" />
<example filename="corkboards" name="Corkboards" executable="false" qml="true" />
<example filename="tvtennis" name="TV Tennis" executable="false" qml="true" />
</category>
<category dirname="declarative/ui-components" name="QML UI Components">
<example filename="dialcontrol" name="Dial" executable="false" qml="true" />
<example filename="flipable" name="Flipable" executable="false" qml="true" />
<example filename="progressbar" name="Progress Bar" executable="false" qml="true" />
<example filename="scrollbar" name="Scroll Bar" executable="false" qml="true" />
<example filename="searchbox" name="Search Box" executable="false" qml="true" />
<example filename="slideswitch" name="Slide Switch" executable="false" qml="true" />
<example filename="spinner" name="Spinner" executable="false" qml="true" />
<example filename="tabwidget" name="Tab Widget" executable="false" qml="true" />
</category>
<category dirname="declarative/text" name="Text">
<example filename="fonts" name="Fonts" executable="false" qml="true" />
<example filename="textselection" name="Text selection" executable="false" qml="true" />
</category>
<category dirname="declarative/modelviews" name="Models and Views">
<example filename="package" name="Package" executable="false" qml="true" />
<example filename="gridview" name="GridView" executable="false" qml="true" />
<example filename="visualitemmodel" name="VisualItemModel" executable="false" qml="true" />
<example filename="webview" name="WebView" executable="false" qml="true" />
<example filename="pathview" name="PathView" executable="false" qml="true" />
<example filename="parallax" name="Parallax Sliding" executable="false" qml="true" />
<example filename="listview" name="ListView" executable="false" qml="true" />
<example filename="objectlistmodel" name="Object List Model" executable="false" qml="true" />
</category>
<category dirname="declarative/threading" name="Threading">
<example filename="threadedlistmodel" name="Threaded ListModel" executable="false" qml="true" />
<example filename="workerscript" name="WorkerScript" executable="false" qml="true" />
</category>
<category dirname="declarative/animation" name="Animation">
<example filename="basics" name="Basics" executable="false" qml="true" />
<example filename="behaviors" name="Behaviors" executable="false" qml="true" />
<example filename="easing" name="Easing Curves" executable="false" qml="true" />
<example filename="states" name="States" executable="false" qml="true" />
</category>
<category dirname="declarative/imageelements" name="Image elements">
<example filename="image" name="Image" executable="false" qml="true" />
<example filename="borderimage" name="Border Image" executable="false" qml="true" />
</category>
<category dirname="declarative/touchinteraction" name="Touch interaction">
<example filename="gestures" name="Gestures" executable="false" qml="true" />
<example filename="mousearea" name="MouseArea" executable="false" qml="true" />
</category>
<category dirname="declarative" name="Miscellaneous">
<example filename="positioners" name="Positioners" executable="false" qml="true" />
<example filename="screenorientation" name="Screen Orientation" executable="false" qml="true" />
<example filename="xml/xmlhttprequest" name="XmlHttpRequest" executable="false" qml="true" />
<example filename="sqllocalstorage" name="SQL Local Storage" executable="false" qml="true" />
<example filename="keyinteraction/focus" name="Focus" executable="false" qml="true" />
</category>
</categories>
......@@ -24,6 +24,7 @@ isEmpty(vcproj) {
}
DATA_DIRS = \
examplebrowser \
snippets \
templates \
designer \
......
......@@ -140,87 +140,97 @@ GettingStartedWelcomePageWidget::~GettingStartedWelcomePageWidget()
delete ui;
}
void GettingStartedWelcomePageWidget::updateExamples(const QString &examplePath,
const QString &demosPath,
const QString &sourcePath)
void GettingStartedWelcomePageWidget::parseXmlFile(QFile *file, QMenuHash &cppSubMenuHash, QMenuHash &qmlSubMenuHash,
const QString &examplePath, const QString &sourcePath)
{
QString demoXml = demosPath + "/qtdemo/xml/examples.xml";
if (!QFile::exists(demoXml)) {
demoXml = sourcePath + "/demos/qtdemo/xml/examples.xml";
if (!QFile::exists(demoXml))
return;
}
QFile description(demoXml);
if (!description.open(QFile::ReadOnly))
return;
const QString dropDownLabel = tr("Choose an Example...");
ui->qmlExamplesButton->setEnabled(true);
ui->qmlExamplesButton->setText(dropDownLabel);
QMenu *qmlMenu = new QMenu(ui->qmlExamplesButton);
ui->qmlExamplesButton->setMenu(qmlMenu);
ui->cppExamplesButton->setEnabled(true);
ui->cppExamplesButton->setText(dropDownLabel);
QMenu *cppMenu = new QMenu(ui->cppExamplesButton);
ui->cppExamplesButton->setMenu(cppMenu);
QScopedPointer<QMenu> subMenu;
QMenu *cppSubMenu = 0;
QMenu *qmlSubMenu = 0;
bool inExamples = false;
QString dirName;
QXmlStreamReader reader(&description);
QXmlStreamReader reader(file);
while (!reader.atEnd()) {
switch (reader.readNext()) {
case QXmlStreamReader::StartElement:
if (reader.name() == QLatin1String("category")) {
QString name = reader.attributes().value(QLatin1String("name")).toString();
if (name.contains(QLatin1String("tutorial")))
if (name.contains(QLatin1String("Tutorial")))
break;
dirName = reader.attributes().value(QLatin1String("dirname")).toString();
subMenu.reset(new QMenu(name));
if (!cppSubMenuHash.contains(dirName)) {
cppSubMenu = new QMenu(name, this);
cppSubMenu->setObjectName(dirName);
cppSubMenuHash.insert(dirName, cppSubMenu);
} else {
cppSubMenu = cppSubMenuHash.value(dirName);
}
if (!qmlSubMenuHash.contains(dirName)) {
qmlSubMenu = new QMenu(name, this);
qmlSubMenu->setObjectName(dirName);
qmlSubMenuHash.insert(dirName, qmlSubMenu);
} else {
qmlSubMenu = qmlSubMenuHash.value(dirName);
}
inExamples = true;
}
if (inExamples && reader.name() == QLatin1String("example")) {
const QChar slash = QLatin1Char('/');
const QString name = reader.attributes().value(QLatin1String("name")).toString();
const bool isQml = reader.attributes().value(QLatin1String("qml")).toString() == "true";
const QString fn = reader.attributes().value(QLatin1String("filename")).toString();
const QString localDir = reader.attributes().value(QLatin1String("filename")).toString();
const QString extension = isQml ? QLatin1String(".qmlproject") : QLatin1String(".pro");
const QString relativeProPath = slash + dirName + slash + fn + slash + fn + extension;
const QString fileName = localDir.section(',', -1);
const QString relativeProPath = slash + dirName + slash + localDir + slash + fileName + extension;
QString fileName = examplePath + relativeProPath;
if (!QFile::exists(fileName))
fileName = sourcePath + QLatin1String("/examples") + relativeProPath;
QString finaleFileName = examplePath + relativeProPath;
if (!QFile::exists(finaleFileName))
finaleFileName = sourcePath + QLatin1String("/examples") + relativeProPath;
if (!QFile::exists(finaleFileName))
break;
QString dirName1 = dirName;
dirName1.replace(slash, QLatin1Char('-'));
QString helpPath = QLatin1String("qthelp://com.trolltech.qt/qdoc/") +
dirName1 +
QLatin1Char('-') + fn + QLatin1String(".html");
QAction *exampleAction;
if (isQml)
exampleAction = qmlMenu->addAction(name);
else
exampleAction = subMenu->addAction(name);
connect(exampleAction, SIGNAL(triggered()), SLOT(slotOpenExample()));
exampleAction->setProperty(ExamplePathPropertyName, fileName);
exampleAction->setProperty(HelpPathPropertyName, helpPath);
QLatin1Char('-') + fileName + QLatin1String(".html");
QAction *exampleAction = 0;
QAction *beforeAction = 0;
bool duplicate = false;
QMenu *subMenu;
subMenu = isQml ? qmlSubMenu : cppSubMenu;
foreach (beforeAction, subMenu->actions()) {
int res = beforeAction->text().compare(name, Qt::CaseInsensitive);
if (res==0) {
duplicate = true;
break;
} else if (res<0)
beforeAction = 0;
else if (res>0) {
break;
}
}
if (!duplicate) {
exampleAction = new QAction(name, subMenu);
subMenu->insertAction(beforeAction, exampleAction);
connect(exampleAction, SIGNAL(triggered()), SLOT(slotOpenExample()));
exampleAction->setProperty(ExamplePathPropertyName, finaleFileName);
exampleAction->setProperty(HelpPathPropertyName, helpPath);
}
}
break;
case QXmlStreamReader::EndElement:
if (reader.name() == QLatin1String("category")) {
if (!subMenu->actions().isEmpty())
cppMenu->addMenu(subMenu.take());
if (inExamples && reader.name() == QLatin1String("category")) {
if (cppSubMenu->actions().isEmpty())
delete cppSubMenuHash.take(dirName);
if (qmlSubMenu->actions().isEmpty())
delete qmlSubMenuHash.take(dirName);
inExamples = false;
}
break;
......@@ -230,6 +240,67 @@ void GettingStartedWelcomePageWidget::updateExamples(const QString &examplePath,
}
}
bool menuEntryCompare(QMenu* first, QMenu* second)
{
return (QString::localeAwareCompare(first->title(), second->title()) < 0);
}
void GettingStartedWelcomePageWidget::updateExamples(const QString &examplePath,
const QString &demosPath,
const QString &sourcePath)
{
QString demoXml = demosPath + "/qtdemo/xml/examples.xml";
if (!QFile::exists(demoXml)) {
demoXml = sourcePath + "/demos/qtdemo/xml/examples.xml";
if (!QFile::exists(demoXml))
return;
}
QMenuHash cppSubMenuHash;
QMenuHash qmlSubMenuHash;
const QString dropDownLabel = tr("Choose an Example...");
QMenu *cppMenu = new QMenu(ui->cppExamplesButton);
ui->cppExamplesButton->setMenu(cppMenu);
QMenu *qmlMenu = new QMenu(ui->qmlExamplesButton);
// let Creator's files take precedence
QString localQmlExamplesXml =
Core::ICore::instance()->resourcePath()+QLatin1String("/examplebrowser/qmlexamples.xml");
QFile localDescriptions(localQmlExamplesXml);
if (localDescriptions.open(QFile::ReadOnly)) {
parseXmlFile(&localDescriptions, cppSubMenuHash, qmlSubMenuHash, examplePath, sourcePath);
}
QFile descriptions(demoXml);
if (!descriptions.open(QFile::ReadOnly))
return;
ui->cppExamplesButton->setEnabled(true);
ui->cppExamplesButton->setText(dropDownLabel);
parseXmlFile(&descriptions, cppSubMenuHash, qmlSubMenuHash, examplePath, sourcePath);
QList<QMenu*> cppSubMenus = cppSubMenuHash.values();
qSort(cppSubMenus.begin(), cppSubMenus.end(), menuEntryCompare);
QList<QMenu*> qmlSubMenus = qmlSubMenuHash.values();
qSort(qmlSubMenus.begin(), qmlSubMenus.end(), menuEntryCompare);
foreach (QMenu *menu, cppSubMenus)
cppMenu->addMenu(menu);
foreach (QMenu *menu, qmlSubMenus)
qmlMenu->addMenu(menu);
if (!qmlMenu->isEmpty()) {
ui->qmlExamplesButton->setMenu(qmlMenu);
ui->qmlExamplesButton->setEnabled(true);
ui->qmlExamplesButton->setText(dropDownLabel);
}
}
namespace {
void copyRecursive(const QDir& from, const QDir& to, const QString& dir)
{
......
......@@ -37,6 +37,8 @@
QT_BEGIN_NAMESPACE
class QUrl;
class QLabel;
class QFile;
class QMenu;
QT_END_NAMESPACE
namespace Core {
......@@ -55,6 +57,8 @@ namespace Ui {
class GettingStartedWelcomePageWidget;
}
typedef QHash<QString, QMenu*> QMenuHash;
class PixmapDownloader : public QNetworkAccessManager {
Q_OBJECT
public:
......@@ -101,6 +105,8 @@ signals:
void startRssFetching(const QUrl&);
private:
void parseXmlFile(QFile *file, QMenuHash &cppSubMenuHash, QMenuHash &qmlSubMenuHash,
const QString &examplePath, const QString &sourcePath);
QStringList tipsOfTheDay();
Ui::GettingStartedWelcomePageWidget *ui;
int m_currentTip;
......
......@@ -40,15 +40,6 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
<height>0</height>
</size>
</property>
<property name="styleSheet">
<string/>
</property>
<layout class="QGridLayout" name="gridLayout_6">
<property name="verticalSpacing">
<number>12</number>
......@@ -76,12 +67,12 @@
</property>
<property name="minimumSize">
<size>
<width>250</width>
<width>230</width>
<height>0</height>
</size>
</property>
<property name="styleSheet">
<string/>
<string notr="true"/>
</property>
<layout class="QGridLayout" name="gridLayout_11">
<property name="verticalSpacing">
......@@ -90,7 +81,57 @@
<property name="rightMargin">
<number>9</number>
</property>
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="Utils::WelcomeModeLabel" name="didYouKnowTitleLabel">
<property name="text">
<string>Did You Know?</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="0" column="1">
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="2">
<layout class="QGridLayout" name="gridLayout_10">
<property name="spacing">
<number>0</number>
......@@ -170,10 +211,10 @@
</item>
</layout>
</item>
<item row="1" column="0" colspan="2">
<item row="1" column="0" colspan="3">
<widget class="QTextBrowser" name="didYouKnowTextBrowser">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
......@@ -195,69 +236,17 @@
</property>
</widget>
</item>
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="Utils::WelcomeModeLabel" name="didYouKnowTitleLabel">
<property name="text">
<string>Did You Know?</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QFrame" name="demosExamplesFrame_2">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>500</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>500</width>
<height>16777215</height>
</size>
</property>
<property name="styleSheet">
<string/>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="Utils::WelcomeModeLabel" name="demoTitleLabel_4">
......@@ -324,39 +313,10 @@
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="demoTitleLabel_3">
<property name="text">
<string>Explore Qt C++ mobile examples:</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QPushButton" name="mobileExamplesButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>30</height>
</size>
</property>
<property name="text">
<string>Examples Not Installed...</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="2" column="0" colspan="2">
<item row="3" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="spacing">
<number>6</number>
......@@ -408,6 +368,22 @@
</item>
</layout>
</item>
<item row="2" column="0">
<spacer name="verticalSpacer_8">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::MinimumExpanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment