From 2228e670ca89d3292452673f2630aa2f88e1873b Mon Sep 17 00:00:00 2001 From: Leonardo Sobral Cunha Date: Thu, 6 Aug 2009 14:29:54 +0200 Subject: Fixes autotests in QFileSystemWatcher: watchFileAndItsDirectory dnotify is something from older linux kernels and cannot be trusted, therefore we skip some tests. Also we cannot guarantee that 1 operation on the file give only 1 notification in general, so we relaxed the conditions. Reviewed-by: paul --- .../qfilesystemwatcher/tst_qfilesystemwatcher.cpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/tests/auto/qfilesystemwatcher/tst_qfilesystemwatcher.cpp b/tests/auto/qfilesystemwatcher/tst_qfilesystemwatcher.cpp index c883c63..b89890e 100644 --- a/tests/auto/qfilesystemwatcher/tst_qfilesystemwatcher.cpp +++ b/tests/auto/qfilesystemwatcher/tst_qfilesystemwatcher.cpp @@ -399,6 +399,15 @@ void tst_QFileSystemWatcher::removePaths() watcher.removePaths(paths); } +#if 0 +class SignalTest : public QObject { + Q_OBJECT; + public slots: + void fileSlot(const QString &file) { qDebug() << "file " << file;} + void dirSlot(const QString &dir) { qDebug() << "dir" << dir;} +}; +#endif + void tst_QFileSystemWatcher::watchFileAndItsDirectory() { QFETCH(QString, backend); @@ -423,6 +432,12 @@ void tst_QFileSystemWatcher::watchFileAndItsDirectory() watcher.addPath(testDir.dirName()); watcher.addPath(testFileName); + /* + SignalTest signalTest; + QObject::connect(&watcher, SIGNAL(fileChanged(const QString &)), &signalTest, SLOT(fileSlot(const QString &))); + QObject::connect(&watcher, SIGNAL(directoryChanged(const QString &)), &signalTest, SLOT(dirSlot(const QString &))); + */ + QSignalSpy fileChangedSpy(&watcher, SIGNAL(fileChanged(const QString &))); QSignalSpy dirChangedSpy(&watcher, SIGNAL(directoryChanged(const QString &))); QEventLoop eventLoop; @@ -440,9 +455,12 @@ void tst_QFileSystemWatcher::watchFileAndItsDirectory() timer.start(3000); eventLoop.exec(); - QCOMPARE(fileChangedSpy.count(), 1); + QVERIFY(fileChangedSpy.count() > 0); QCOMPARE(dirChangedSpy.count(), 0); + if (backend == "dnotify") + QSKIP("dnotify is broken, skipping the rest of the test.", SkipSingle); + fileChangedSpy.clear(); QFile secondFile(secondFileName); secondFile.open(QIODevice::WriteOnly | QIODevice::Truncate); @@ -460,7 +478,7 @@ void tst_QFileSystemWatcher::watchFileAndItsDirectory() timer.start(3000); eventLoop.exec(); - QCOMPARE(fileChangedSpy.count(), 1); + QVERIFY(fileChangedSpy.count() > 0); QCOMPARE(dirChangedSpy.count(), 1); fileChangedSpy.clear(); -- cgit v0.12 From 555e5be0e8bd46a351e200cc3af9f93a0d91e87b Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Thu, 6 Aug 2009 14:35:26 +0200 Subject: Fix QXmlQuery autotests before, it asserted; now, the test is not asserting anymore but still failing, because the fix is not yet checked in. Additionally, it now runs from a shadow directory. Reviewed-by: TrustMe --- tests/auto/qxmlquery/qxmlquery.pro | 6 ++++++ tests/auto/qxmlquery/tst_qxmlquery.cpp | 30 +++++++++++++++--------------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/tests/auto/qxmlquery/qxmlquery.pro b/tests/auto/qxmlquery/qxmlquery.pro index e8ab641..3db3734 100644 --- a/tests/auto/qxmlquery/qxmlquery.pro +++ b/tests/auto/qxmlquery/qxmlquery.pro @@ -10,6 +10,12 @@ RESOURCES = input.qrc QT += network +!wince* { +DEFINES += SRCDIR=\\\"$$PWD/\\\" +} else { +DEFINES += SRCDIR=\\\"./\\\" +} + include (../xmlpatterns.pri) wince*: { diff --git a/tests/auto/qxmlquery/tst_qxmlquery.cpp b/tests/auto/qxmlquery/tst_qxmlquery.cpp index 5c14329..6563240 100644 --- a/tests/auto/qxmlquery/tst_qxmlquery.cpp +++ b/tests/auto/qxmlquery/tst_qxmlquery.cpp @@ -259,7 +259,7 @@ void tst_QXmlQuery::checkBaseURI(const QUrl &baseURI, const QString &candidate) QVERIFY(QDir(baseURI.toLocalFile()).relativeFilePath(QFileInfo(candidate).canonicalFilePath()).startsWith("../")); } -const char *const tst_QXmlQuery::queriesDirectory = "../xmlpatterns/queries/"; +const char *const tst_QXmlQuery::queriesDirectory = SRCDIR "../xmlpatterns/queries/"; QStringList tst_QXmlQuery::queries() { @@ -738,7 +738,7 @@ void tst_QXmlQuery::bindVariableQStringQIODeviceWithString() const void tst_QXmlQuery::bindVariableQStringQIODeviceWithQFile() const { QXmlQuery query; - QFile inDevice(QLatin1String("input.xml")); + QFile inDevice(QLatin1String(SRCDIR "input.xml")); QVERIFY(inDevice.open(QIODevice::ReadOnly)); @@ -852,7 +852,7 @@ void tst_QXmlQuery::bindVariableXSLTSuccess() const stylesheet.bindVariable(QLatin1String("paramSelectWithTypeIntBoundWithBindVariableRequired"), QVariant(QLatin1String("param5"))); - stylesheet.setQuery(QUrl(inputFile(QLatin1String("../xmlpatterns/stylesheets/parameters.xsl")))); + stylesheet.setQuery(QUrl(inputFile(QLatin1String(SRCDIR "../xmlpatterns/stylesheets/parameters.xsl")))); QVERIFY(stylesheet.isValid()); @@ -960,7 +960,7 @@ void tst_QXmlQuery::evaluateToReceiver() PushBaseliner push(stream, query.namePool()); query.evaluateTo(&push); - const QString baselineName(inputFile(QLatin1String("pushBaselines/") + inputQuery.left(inputQuery.length() - 2) + QString::fromLatin1("ref"))); + const QString baselineName(inputFile(QLatin1String(SRCDIR "pushBaselines/") + inputQuery.left(inputQuery.length() - 2) + QString::fromLatin1("ref"))); QFile baseline(baselineName); if(baseline.exists()) @@ -1300,7 +1300,7 @@ void tst_QXmlQuery::basicQtToXQueryTypeCheck() const // TODO Do with different QDateTime time specs query.bindVariable(QLatin1String("fromQDateTime"), QXmlItem(QDateTime(QDate(2001, 9, 10), QTime(1, 2, 3)))); query.bindVariable(QLatin1String("fromDouble"), QXmlItem(double(3))); - query.bindVariable(QLatin1String("fromFloat"), QXmlItem(float(4))); +// query.bindVariable(QLatin1String("fromFloat"), QXmlItem(float(4))); query.bindVariable(QLatin1String("integer"), QXmlItem(5)); query.bindVariable(QLatin1String("fromQString"), QXmlItem(QString::fromLatin1("A QString"))); query.bindVariable(QLatin1String("fromQChar"), QXmlItem(QChar::fromLatin1('C'))); @@ -1793,11 +1793,11 @@ void tst_QXmlQuery::setFocusQUrl() const { QXmlQuery query(QXmlQuery::XSLT20); - const TestURIResolver resolver(QUrl(inputFile(QLatin1String("../xmlpatterns/stylesheets/documentElement.xml")))); + const TestURIResolver resolver(QUrl(inputFile(QLatin1String(SRCDIR "../xmlpatterns/stylesheets/documentElement.xml")))); query.setUriResolver(&resolver); QVERIFY(query.setFocus(QUrl(QLatin1String("arbitraryURI")))); - query.setQuery(QUrl(inputFile(QLatin1String("../xmlpatterns/stylesheets/copyWholeDocument.xsl")))); + query.setQuery(QUrl(inputFile(QLatin1String(SRCDIR "../xmlpatterns/stylesheets/copyWholeDocument.xsl")))); QVERIFY(query.isValid()); QBuffer result; @@ -2011,7 +2011,7 @@ void tst_QXmlQuery::fnDocNetworkAccessSuccess_data() const QTest::addColumn("expectedOutput"); QTest::newRow("file scheme") - << inputFileAsURI(QLatin1String("input.xml")) + << inputFileAsURI(QLatin1String(SRCDIR "input.xml")) << QByteArray(""); QTest::newRow("data scheme with ASCII") @@ -2992,7 +2992,7 @@ void tst_QXmlQuery::setInitialTemplateNameQXmlName() const QCOMPARE(query.initialTemplateName(), name); - query.setQuery(QUrl(inputFile(QLatin1String("../xmlpatterns/stylesheets/namedTemplate.xsl")))); + query.setQuery(QUrl(inputFile(QLatin1String(SRCDIR "../xmlpatterns/stylesheets/namedTemplate.xsl")))); QVERIFY(query.isValid()); QBuffer result; @@ -3054,7 +3054,7 @@ void tst_QXmlQuery::setNetworkAccessManager() const /* Ensure fn:doc() picks up the right QNetworkAccessManager. */ { NetworkOverrider networkOverrider(QUrl(QLatin1String("tag:example.com:DOESNOTEXIST")), - QUrl(inputFile(QLatin1String("../xmlpatterns/queries/simpleDocument.xml")))); + QUrl(inputFile(QLatin1String(SRCDIR "../xmlpatterns/queries/simpleDocument.xml")))); QXmlQuery query; query.setNetworkAccessManager(&networkOverrider); @@ -3070,7 +3070,7 @@ void tst_QXmlQuery::setNetworkAccessManager() const /* Ensure setQuery() is using the right network manager. */ { NetworkOverrider networkOverrider(QUrl(QLatin1String("tag:example.com:DOESNOTEXIST")), - QUrl(inputFile(QLatin1String("../xmlpatterns/queries/concat.xq")))); + QUrl(inputFile(QLatin1String(SRCDIR "../xmlpatterns/queries/concat.xq")))); QXmlQuery query; query.setNetworkAccessManager(&networkOverrider); @@ -3128,9 +3128,9 @@ void tst_QXmlQuery::multipleDocsAndFocus() const /* We use string concatenation, since variable bindings might disturb what * we're testing. */ query.setQuery(QLatin1String("string(doc('") + - inputFile(QLatin1String("../xmlpatterns/queries/simpleDocument.xml")) + + inputFile(QLatin1String(SRCDIR "../xmlpatterns/queries/simpleDocument.xml")) + QLatin1String("'))")); - query.setFocus(QUrl(inputFile(QLatin1String("../xmlpatterns/stylesheets/documentElement.xml")))); + query.setFocus(QUrl(inputFile(QLatin1String(SRCDIR "../xmlpatterns/stylesheets/documentElement.xml")))); query.setQuery(QLatin1String("string(.)")); QStringList result; @@ -3154,11 +3154,11 @@ void tst_QXmlQuery::multipleEvaluationsWithDifferentFocus() const QXmlQuery query; QStringList result; - query.setFocus(QUrl(inputFile(QLatin1String("../xmlpatterns/stylesheets/documentElement.xml")))); + query.setFocus(QUrl(inputFile(QLatin1String(SRCDIR "../xmlpatterns/stylesheets/documentElement.xml")))); query.setQuery(QLatin1String("string(.)")); QVERIFY(query.evaluateTo(&result)); - query.setFocus(QUrl(inputFile(QLatin1String("../xmlpatterns/stylesheets/documentElement.xml")))); + query.setFocus(QUrl(inputFile(QLatin1String(SRCDIR "../xmlpatterns/stylesheets/documentElement.xml")))); QVERIFY(query.evaluateTo(&result)); } -- cgit v0.12 From ef07fa46ed352176eba3c58268fd6bb1512cd70f Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Thu, 6 Aug 2009 14:19:04 +0200 Subject: Delay too short after fullscreen window shown. --- tests/auto/qtreeview/tst_qtreeview.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/auto/qtreeview/tst_qtreeview.cpp b/tests/auto/qtreeview/tst_qtreeview.cpp index b21a973..6b42821 100644 --- a/tests/auto/qtreeview/tst_qtreeview.cpp +++ b/tests/auto/qtreeview/tst_qtreeview.cpp @@ -2917,8 +2917,7 @@ void tst_QTreeView::styleOptionViewItem() delegate.count = 0; view.showMaximized(); - QTest::qWait(30); - QVERIFY(delegate.count >= 13); + QTRY_VERIFY(delegate.count >= 13); } class task174627_TreeView : public QTreeView -- cgit v0.12 From d738bfe0f06448d9a6bc2ee1a32225c076c67334 Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Thu, 6 Aug 2009 15:05:32 +0200 Subject: Make sure cursorPositionChanged is emitted when cursor position changes When selecting the text and setting the cursor position, we need to emit the cursorPositionChanged signal. This seems to be a copy-paste error from refactoring QLineEdit, as the function call is there in the original version of setSelection(). The effect was two test breakages in tst_QDateTimeEdit, because the section and cursor position of the QDateTimeEdit would be out of sync. Reviewed-by: Gunnar --- src/gui/widgets/qlinecontrol.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/widgets/qlinecontrol.cpp b/src/gui/widgets/qlinecontrol.cpp index d90d53b..f4a2348 100644 --- a/src/gui/widgets/qlinecontrol.cpp +++ b/src/gui/widgets/qlinecontrol.cpp @@ -257,6 +257,7 @@ void QLineControl::setSelection(int start, int length) m_cursor = m_selstart; } emit selectionChanged(); + emitCursorPositionChanged(); } void QLineControl::_q_clipboardChanged() -- cgit v0.12 From 986ac2b13eb60e10496ecf63dca1ed0de0990da9 Mon Sep 17 00:00:00 2001 From: Leonardo Sobral Cunha Date: Thu, 6 Aug 2009 15:13:42 +0200 Subject: Fixes autotests in QTreeWidget: setHeaderItem & defaultRowSizes defaultRowSizes was broken on oxygen style because of missing icons. Reviewed-by: paul --- tests/auto/qtreewidget/tst_qtreewidget.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/tests/auto/qtreewidget/tst_qtreewidget.cpp b/tests/auto/qtreewidget/tst_qtreewidget.cpp index 7d79d56..fd0fdb1 100644 --- a/tests/auto/qtreewidget/tst_qtreewidget.cpp +++ b/tests/auto/qtreewidget/tst_qtreewidget.cpp @@ -238,6 +238,9 @@ void tst_QTreeWidget::initTestCase() testWidget = new CustomTreeWidget(); testWidget->show(); +#ifdef Q_WS_X11 + qt_x11_wait_for_window_manager(testWidget); +#endif } void tst_QTreeWidget::cleanupTestCase() @@ -2017,7 +2020,7 @@ void tst_QTreeWidget::setHeaderItem() headerItem->setText(0, "0"); headerItem->setText(1, "1"); testWidget->setHeaderItem(headerItem); - qApp->processEvents(); + QTest::qWait(100); QCOMPARE(testWidget->headerItem(), headerItem); QCOMPARE(headerItem->treeWidget(), static_cast(testWidget)); @@ -2762,16 +2765,18 @@ void tst_QTreeWidget::defaultRowSizes() for (int j=0; jcolumnCount() - 1; ++j) { it->setText(j, "This is a test"); } + QPixmap icon = tw->style()->standardPixmap((QStyle::StandardPixmap)(i + QStyle::SP_TitleBarMenuButton)); + if (icon.isNull()) + QSKIP("No pixmap found on current style, skipping this test.", SkipSingle); it->setIcon(tw->columnCount() - 1, - tw->style()->standardPixmap((QStyle::StandardPixmap)(i + QStyle::SP_TitleBarMenuButton)). - scaled(tw->iconSize())); + icon.scaled(tw->iconSize())); } tw->resize(100,100); tw->show(); QApplication::processEvents(); QRect visualRect = tw->visualItemRect(tw->topLevelItem(0)); - QVERIFY(visualRect.height() >=50); + QVERIFY(visualRect.height() >= 50); } void tst_QTreeWidget::task191552_rtl() -- cgit v0.12 From af5cb732ac6caf370f98dd41129a723a81d55e9b Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Thu, 6 Aug 2009 15:16:00 +0200 Subject: Fix QObjectRace test We should not unlock too early, or node might get deleted. --- src/corelib/kernel/qobject.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index e37b6d3..6520170 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -843,9 +843,9 @@ QObject::~QObject() if (senderLists) senderLists->dirty = true; + node = node->next; if (needToUnlock) m->unlock(); - node = node->next; } } -- cgit v0.12 From 4b22dc7d36e9ef38bbfc709c63e73718110ce385 Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Thu, 6 Aug 2009 15:18:01 +0200 Subject: qdoc: Don't include internal or private classes in annotated lists. --- tools/qdoc3/htmlgenerator.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/qdoc3/htmlgenerator.cpp b/tools/qdoc3/htmlgenerator.cpp index d3a1459..26874e1 100644 --- a/tools/qdoc3/htmlgenerator.cpp +++ b/tools/qdoc3/htmlgenerator.cpp @@ -543,7 +543,8 @@ int HtmlGenerator::generateAtom(const Atom *atom, QMap nodeMap; for (int i = 0; i < values.size(); ++i) { const Node* n = values.at(i); - nodeMap.insert(n->name(),n); + if ((n->status() != Node::Internal) && (n->access() != Node::Private)) + nodeMap.insert(n->name(),n); } generateAnnotatedList(relative, marker, nodeMap); } -- cgit v0.12 From e1c47a1d3cd8c2a0f6b40fddc2f1fae1cc7e7307 Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Thu, 6 Aug 2009 15:23:39 +0200 Subject: Fix test failure in tst_QDateTimeEdit::task118867 setCursorPosition() should be able to set the cursor at the end of the string. This is a copy-paste error made when refactoring QLineEdit. Reviewed-by: Gunnar --- src/gui/widgets/qlinecontrol_p.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/widgets/qlinecontrol_p.h b/src/gui/widgets/qlinecontrol_p.h index e047cb0..ad4e4e4 100644 --- a/src/gui/widgets/qlinecontrol_p.h +++ b/src/gui/widgets/qlinecontrol_p.h @@ -641,7 +641,7 @@ inline void QLineControl::setCursorPosition(int pos) { if (pos < 0) pos = 0; - if (pos < m_text.length()) + if (pos <= m_text.length()) moveCursor(pos); } -- cgit v0.12 From 6fb50f9180f990ffa68feb6b5c43030aa36a7093 Mon Sep 17 00:00:00 2001 From: Kent Hansen Date: Tue, 30 Jun 2009 18:03:36 +0200 Subject: make the calculator example use only standard JS __qt_sender__ is evil. Gah. --- examples/script/calculator/calculator.js | 107 ++++++++++++++++++------------- 1 file changed, 62 insertions(+), 45 deletions(-) diff --git a/examples/script/calculator/calculator.js b/examples/script/calculator/calculator.js index 62c2cba..ac3c1b6 100644 --- a/examples/script/calculator/calculator.js +++ b/examples/script/calculator/calculator.js @@ -1,10 +1,19 @@ +Function.prototype.bind = function() { + var func = this; + var thisObject = arguments[0]; + var args = Array.prototype.slice.call(arguments, 1); + return function() { + return func.apply(thisObject, args); + } +} + //! [0] function Calculator(ui) { this.ui = ui; - this.pendingAdditiveOperator = ""; - this.pendingMultiplicativeOperator = ""; + this.pendingAdditiveOperator = Calculator.NO_OPERATOR; + this.pendingMultiplicativeOperator = Calculator.NO_OPERATOR; this.sumInMemory = 0; this.sumSoFar = 0; this.factorSoFar = 0; @@ -13,16 +22,16 @@ function Calculator(ui) with (ui) { display.text = "0"; - zeroButton.clicked.connect(this, this.digitClicked); - oneButton.clicked.connect(this, "digitClicked"); - twoButton.clicked.connect(this, "digitClicked"); - threeButton.clicked.connect(this, "digitClicked"); - fourButton.clicked.connect(this, "digitClicked"); - fiveButton.clicked.connect(this, "digitClicked"); - sixButton.clicked.connect(this, "digitClicked"); - sevenButton.clicked.connect(this, "digitClicked"); - eightButton.clicked.connect(this, "digitClicked"); - nineButton.clicked.connect(this, "digitClicked"); + zeroButton.clicked.connect(this.digitClicked.bind(this, 0)); + oneButton.clicked.connect(this.digitClicked.bind(this, 1)); + twoButton.clicked.connect(this.digitClicked.bind(this, 2)); + threeButton.clicked.connect(this.digitClicked.bind(this, 3)); + fourButton.clicked.connect(this.digitClicked.bind(this, 4)); + fiveButton.clicked.connect(this.digitClicked.bind(this, 5)); + sixButton.clicked.connect(this.digitClicked.bind(this, 6)); + sevenButton.clicked.connect(this.digitClicked.bind(this, 7)); + eightButton.clicked.connect(this.digitClicked.bind(this, 8)); + nineButton.clicked.connect(this.digitClicked.bind(this, 9)); pointButton.clicked.connect(this, "pointClicked"); changeSignButton.clicked.connect(this, "changeSignClicked"); @@ -36,19 +45,28 @@ function Calculator(ui) setMemoryButton.clicked.connect(this, "setMemory"); addToMemoryButton.clicked.connect(this, "addToMemory"); - divisionButton.clicked.connect(this, "multiplicativeOperatorClicked"); - timesButton.clicked.connect(this, "multiplicativeOperatorClicked"); - minusButton.clicked.connect(this, "additiveOperatorClicked"); - plusButton.clicked.connect(this, "additiveOperatorClicked"); - - squareRootButton.clicked.connect(this, "unaryOperatorClicked"); - powerButton.clicked.connect(this, "unaryOperatorClicked"); - reciprocalButton.clicked.connect(this, "unaryOperatorClicked"); + divisionButton.clicked.connect(this.multiplicativeOperatorClicked.bind(this, Calculator.DIVISION_OPERATOR)); + timesButton.clicked.connect(this.multiplicativeOperatorClicked.bind(this, Calculator.TIMES_OPERATOR)); + minusButton.clicked.connect(this.additiveOperatorClicked.bind(this, Calculator.MINUS_OPERATOR)); + plusButton.clicked.connect(this.additiveOperatorClicked.bind(this, Calculator.PLUS_OPERATOR)); + + squareRootButton.clicked.connect(this.unaryOperatorClicked.bind(this, Calculator.SQUARE_OPERATOR)); + powerButton.clicked.connect(this.unaryOperatorClicked.bind(this, Calculator.POWER_OPERATOR)); + reciprocalButton.clicked.connect(this.unaryOperatorClicked.bind(this, Calculator.RECIPROCAL_OPERATOR)); equalButton.clicked.connect(this, "equalClicked"); } } //! [0] +Calculator.NO_OPERATOR = 0; +Calculator.SQUARE_OPERATOR = 1; +Calculator.POWER_OPERATOR = 2; +Calculator.RECIPROCAL_OPERATOR = 3; +Calculator.DIVISION_OPERATOR = 4; +Calculator.TIMES_OPERATOR = 5; +Calculator.MINUS_OPERATOR = 6; +Calculator.PLUS_OPERATOR = 7; + Calculator.prototype.abortOperation = function() { this.clearAll(); @@ -57,24 +75,23 @@ Calculator.prototype.abortOperation = function() Calculator.prototype.calculate = function(rightOperand, pendingOperator) { - if (pendingOperator == "+") { + if (pendingOperator == Calculator.PLUS_OPERATOR) { this.sumSoFar += rightOperand; - } else if (pendingOperator == "-") { + } else if (pendingOperator == Calculator.MINUS_OPERATOR) { this.sumSoFar -= rightOperand; - } else if (pendingOperator == "*") { + } else if (pendingOperator == Calculator.TIMES_OPERATOR) { this.factorSoFar *= rightOperand; - } else if (pendingOperator == "/") { + } else if (pendingOperator == Calculator.DIVISION_OPERATOR) { if (rightOperand == 0) - return false; + return false; this.factorSoFar /= rightOperand; } return true; } //! [1] -Calculator.prototype.digitClicked = function() +Calculator.prototype.digitClicked = function(digitValue) { - var digitValue = __qt_sender__.text - 0; if ((digitValue == 0) && (this.ui.display.text == "0")) return; if (this.waitingForOperand) { @@ -85,19 +102,19 @@ Calculator.prototype.digitClicked = function() } //! [1] -Calculator.prototype.unaryOperatorClicked = function() +Calculator.prototype.unaryOperatorClicked = function(op) { var operand = this.ui.display.text - 0; var result = 0; - if (__qt_sender__.text == "Sqrt") { + if (op == Calculator.SQUARE_OPERATOR) { if (operand < 0) { this.abortOperation(); return; } result = Math.sqrt(operand); - } else if (__qt_sender__.text == "x^2") { + } else if (op == Calculator.POWER_OPERATOR) { result = Math.pow(operand, 2); - } else if (__qt_sender__.text == "1/x") { + } else if (op == Calculator.RECIPROCAL_OPERATOR) { if (operand == 0.0) { this.abortOperation(); return; @@ -108,11 +125,11 @@ Calculator.prototype.unaryOperatorClicked = function() this.waitingForOperand = true; } -Calculator.prototype.additiveOperatorClicked = function() +Calculator.prototype.additiveOperatorClicked = function(op) { var operand = this.ui.display.text - 0; - if (this.pendingMultiplicativeOperator.length != 0) { + if (this.pendingMultiplicativeOperator != Calculator.NO_OPERATOR) { if (!this.calculate(operand, this.pendingMultiplicativeOperator)) { this.abortOperation(); return; @@ -120,10 +137,10 @@ Calculator.prototype.additiveOperatorClicked = function() this.ui.display.text = this.factorSoFar + ""; operand = this.factorSoFar; this.factorSoFar = 0; - this.pendingMultiplicativeOperator = ""; + this.pendingMultiplicativeOperator = Calculator.NO_OPERATOR; } - if (this.pendingAdditiveOperator.length != 0) { + if (this.pendingAdditiveOperator != Calculator.NO_OPERATOR) { if (!this.calculate(operand, this.pendingAdditiveOperator)) { this.abortOperation(); return; @@ -133,15 +150,15 @@ Calculator.prototype.additiveOperatorClicked = function() this.sumSoFar = operand; } - this.pendingAdditiveOperator = __qt_sender__.text; + this.pendingAdditiveOperator = op; this.waitingForOperand = true; } -Calculator.prototype.multiplicativeOperatorClicked = function() +Calculator.prototype.multiplicativeOperatorClicked = function(op) { var operand = this.ui.display.text - 0; - if (this.pendingMultiplicativeOperator.length != 0) { + if (this.pendingMultiplicativeOperator != Calculator.NO_OPERATOR) { if (!this.calculate(operand, this.pendingMultiplicativeOperator)) { this.abortOperation(); return; @@ -151,7 +168,7 @@ Calculator.prototype.multiplicativeOperatorClicked = function() this.factorSoFar = operand; } - this.pendingMultiplicativeOperator = __qt_sender__.text; + this.pendingMultiplicativeOperator = op; this.waitingForOperand = true; } @@ -159,21 +176,21 @@ Calculator.prototype.equalClicked = function() { var operand = this.ui.display.text - 0; - if (this.pendingMultiplicativeOperator.length != 0) { + if (this.pendingMultiplicativeOperator != Calculator.NO_OPERATOR) { if (!this.calculate(operand, this.pendingMultiplicativeOperator)) { this.abortOperation(); return; } operand = this.factorSoFar; this.factorSoFar = 0.0; - this.pendingMultiplicativeOperator = ""; + this.pendingMultiplicativeOperator = Calculator.NO_OPERATOR; } - if (this.pendingAdditiveOperator.length != 0) { + if (this.pendingAdditiveOperator != Calculator.NO_OPERATOR) { if (!this.calculate(operand, this.pendingAdditiveOperator)) { this.abortOperation(); return; } - this.pendingAdditiveOperator = ""; + this.pendingAdditiveOperator = Calculator.NO_OPERATOR; } else { this.sumSoFar = operand; } @@ -234,8 +251,8 @@ Calculator.prototype.clearAll = function() { this.sumSoFar = 0.0; this.factorSoFar = 0.0; - this.pendingAdditiveOperator = ""; - this.pendingMultiplicativeOperator = ""; + this.pendingAdditiveOperator = Calculator.NO_OPERATOR; + this.pendingMultiplicativeOperator = Calculator.NO_OPERATOR; this.ui.display.text = "0"; this.waitingForOperand = true; } -- cgit v0.12 From b4264b12a51ecea93517a84f94c15f8e97b2f50f Mon Sep 17 00:00:00 2001 From: Kent Hansen Date: Wed, 15 Jul 2009 10:59:29 +0200 Subject: implement name() function of custom property iterator --- examples/script/customclass/bytearrayclass.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/script/customclass/bytearrayclass.cpp b/examples/script/customclass/bytearrayclass.cpp index 2044a16..8fe1a96 100644 --- a/examples/script/customclass/bytearrayclass.cpp +++ b/examples/script/customclass/bytearrayclass.cpp @@ -297,7 +297,7 @@ void ByteArrayClassPropertyIterator::toBack() QScriptString ByteArrayClassPropertyIterator::name() const { - return QScriptString(); + return object().engine()->toStringHandle(QString::number(m_last)); } uint ByteArrayClassPropertyIterator::id() const -- cgit v0.12 From 443a7b6f3eb1191b20240b5068da386d669045fc Mon Sep 17 00:00:00 2001 From: Thierry Bastian Date: Thu, 6 Aug 2009 16:02:59 +0200 Subject: Fix warnings on MSVC --- src/corelib/kernel/qobject_p.h | 2 +- src/gui/dialogs/qcolordialog.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h index 056dee3..5d17bfd 100644 --- a/src/corelib/kernel/qobject_p.h +++ b/src/corelib/kernel/qobject_p.h @@ -67,7 +67,7 @@ QT_BEGIN_NAMESPACE class QVariant; class QThreadData; class QObjectConnectionListVector; -namespace QtSharedPointer { class ExternalRefCountData; } +namespace QtSharedPointer { struct ExternalRefCountData; } /* mirrored in QtTestLib, DON'T CHANGE without prior warning */ struct QSignalSpyCallbackSet diff --git a/src/gui/dialogs/qcolordialog.cpp b/src/gui/dialogs/qcolordialog.cpp index aee592c..0357a7a 100644 --- a/src/gui/dialogs/qcolordialog.cpp +++ b/src/gui/dialogs/qcolordialog.cpp @@ -1836,8 +1836,8 @@ QRgb QColorDialog::getRgba(QRgb initial, bool *ok, QWidget *parent) QColorDialog::~QColorDialog() { - Q_D(QColorDialog); #if defined(Q_WS_MAC) + Q_D(QColorDialog); if (d->delegate) { d->releaseCocoaColorPanelDelegate(); QColorDialogPrivate::sharedColorPanelAvailable = true; -- cgit v0.12 From c53004694b49d8e4e6c4cfd294efb6589559c2f3 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Thu, 6 Aug 2009 12:10:16 +0200 Subject: Cocoa: Add support for native gestures Cocoa: Add support for native gestures --- src/gui/kernel/qcocoaview_mac.mm | 54 ++++++++++++++++++++++++++++++++-------- src/gui/kernel/qevent_p.h | 10 +++++--- 2 files changed, 51 insertions(+), 13 deletions(-) diff --git a/src/gui/kernel/qcocoaview_mac.mm b/src/gui/kernel/qcocoaview_mac.mm index 1d352cb..8c6f394 100644 --- a/src/gui/kernel/qcocoaview_mac.mm +++ b/src/gui/kernel/qcocoaview_mac.mm @@ -50,6 +50,7 @@ #include #include #include +#include #include #include @@ -868,32 +869,65 @@ extern "C" { - (void)magnifyWithEvent:(NSEvent *)event; { - Q_UNUSED(event); -// qDebug() << "magnifyWithEvent"; + if (!QApplicationPrivate::tryModalHelper(qwidget, 0)) + return; + + QNativeGestureEvent qNGEvent; + qNGEvent.gestureType = QNativeGestureEvent::Zoom; + NSPoint p = [[event window] convertBaseToScreen:[event locationInWindow]]; + qNGEvent.position = flipPoint(p).toPoint(); + qNGEvent.percentage = [event magnification]; + qApp->sendEvent(qwidget, &qNGEvent); } - (void)rotateWithEvent:(NSEvent *)event; { - Q_UNUSED(event); -// qDebug() << "rotateWithEvent"; + if (!QApplicationPrivate::tryModalHelper(qwidget, 0)) + return; + + QNativeGestureEvent qNGEvent; + qNGEvent.gestureType = QNativeGestureEvent::Rotate; + NSPoint p = [[event window] convertBaseToScreen:[event locationInWindow]]; + qNGEvent.position = flipPoint(p).toPoint(); + qNGEvent.percentage = [event rotation]; + qApp->sendEvent(qwidget, &qNGEvent); } - (void)swipeWithEvent:(NSEvent *)event; { - Q_UNUSED(event); -// qDebug() << "swipeWithEvent"; + if (!QApplicationPrivate::tryModalHelper(qwidget, 0)) + return; + + QNativeGestureEvent qNGEvent; + qNGEvent.gestureType = QNativeGestureEvent::Swipe; + NSPoint p = [[event window] convertBaseToScreen:[event locationInWindow]]; + qNGEvent.position = flipPoint(p).toPoint(); + qNGEvent.direction = QSize(-[event deltaX], -[event deltaY]); + qApp->sendEvent(qwidget, &qNGEvent); } - (void)beginGestureWithEvent:(NSEvent *)event; { - Q_UNUSED(event); -// qDebug() << "beginGestureWithEvent"; + if (!QApplicationPrivate::tryModalHelper(qwidget, 0)) + return; + + QNativeGestureEvent qNGEvent; + qNGEvent.gestureType = QNativeGestureEvent::GestureBegin; + NSPoint p = [[event window] convertBaseToScreen:[event locationInWindow]]; + qNGEvent.position = flipPoint(p).toPoint(); + qApp->sendEvent(qwidget, &qNGEvent); } - (void)endGestureWithEvent:(NSEvent *)event; { - Q_UNUSED(event); -// qDebug() << "endGestureWithEvent"; + if (!QApplicationPrivate::tryModalHelper(qwidget, 0)) + return; + + QNativeGestureEvent qNGEvent; + qNGEvent.gestureType = QNativeGestureEvent::GestureEnd; + NSPoint p = [[event window] convertBaseToScreen:[event locationInWindow]]; + qNGEvent.position = flipPoint(p).toPoint(); + qApp->sendEvent(qwidget, &qNGEvent); } #endif // MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 diff --git a/src/gui/kernel/qevent_p.h b/src/gui/kernel/qevent_p.h index 92c4fc1..b21b35c 100644 --- a/src/gui/kernel/qevent_p.h +++ b/src/gui/kernel/qevent_p.h @@ -127,11 +127,13 @@ public: GestureBegin, GestureEnd, Pan, - Pinch + Zoom, + Rotate, + Swipe }; QNativeGestureEvent() - : QEvent(QEvent::NativeGesture), gestureType(None) + : QEvent(QEvent::NativeGesture), gestureType(None), percentage(0), direction(0, 0) #ifdef Q_WS_WIN , sequenceId(0) #endif @@ -139,8 +141,10 @@ public: } Type gestureType; -#ifdef Q_WS_WIN + float percentage; QPoint position; + QSize direction; +#ifdef Q_WS_WIN ulong sequenceId; #endif }; -- cgit v0.12 From af44be42cfacb85ef783cdd051f5d106d25c6b50 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 6 Aug 2009 16:19:18 +0200 Subject: Designer: Cannot edit menus in an RTL form when Designer uses LTR. Use widget->layoutDirection() instead of QApplication::layoutDirection() where applicable, which caused it to break for the case that Designer's layoutDirection does not match that of a widget [property]. In addition, position the submenu correctly on the left side in the case of RTL. Reviewed-by: Jarek Kobus Task-number: 259238 --- .../src/components/buddyeditor/buddyeditor.cpp | 2 +- .../formeditor/default_actionprovider.cpp | 15 ++-- .../components/formeditor/default_actionprovider.h | 4 +- tools/designer/src/lib/shared/actionprovider_p.h | 2 +- tools/designer/src/lib/shared/qdesigner_menu.cpp | 86 +++++++++++++++------- tools/designer/src/lib/shared/qdesigner_menu_p.h | 3 + .../designer/src/lib/shared/qdesigner_menubar.cpp | 58 +++++++++------ .../designer/src/lib/shared/qdesigner_menubar_p.h | 4 +- .../designer/src/lib/shared/qdesigner_toolbar.cpp | 2 +- 9 files changed, 114 insertions(+), 62 deletions(-) diff --git a/tools/designer/src/components/buddyeditor/buddyeditor.cpp b/tools/designer/src/components/buddyeditor/buddyeditor.cpp index 9984b0d..d5c8670 100644 --- a/tools/designer/src/components/buddyeditor/buddyeditor.cpp +++ b/tools/designer/src/components/buddyeditor/buddyeditor.cpp @@ -404,7 +404,7 @@ QWidget *BuddyEditor::findBuddy(QLabel *l, const QWidgetList &existingBuddies) c const QRect geom = l->geometry(); const int y = geom.center().y(); QWidget *neighbour = 0; - switch (QApplication::layoutDirection()) { + switch (l->layoutDirection()) { case Qt::LeftToRight: { // Walk right to find next managed neighbour const int xEnd = parent->size().width(); for (int x = geom.right() + 1; x < xEnd; x += DeltaX) diff --git a/tools/designer/src/components/formeditor/default_actionprovider.cpp b/tools/designer/src/components/formeditor/default_actionprovider.cpp index 42d1f81..41333f8 100644 --- a/tools/designer/src/components/formeditor/default_actionprovider.cpp +++ b/tools/designer/src/components/formeditor/default_actionprovider.cpp @@ -73,9 +73,8 @@ enum { indicatorSize = 2 }; // Position an indicator horizontally over the rectangle, indicating // 'Insert before' (left or right according to layout direction) -static inline QRect horizontalIndicatorRect(const QRect &rect) +static inline QRect horizontalIndicatorRect(const QRect &rect, Qt::LayoutDirection layoutDirection) { - const Qt::LayoutDirection layoutDirection = QApplication::layoutDirection(); // Position right? QRect rc = QRect(rect.x(), 0, indicatorSize, rect.height() - 1); if (layoutDirection == Qt::RightToLeft) @@ -91,13 +90,13 @@ static inline QRect verticalIndicatorRect(const QRect &rect) // Determine the geometry of the indicator by retrieving // the action under mouse and positioning the bar within its geometry. -QRect ActionProviderBase::indicatorGeometry(const QPoint &pos) const +QRect ActionProviderBase::indicatorGeometry(const QPoint &pos, Qt::LayoutDirection layoutDirection) const { QAction *action = actionAt(pos); if (!action) return QRect(); QRect rc = actionGeometry(action); - return orientation() == Qt::Horizontal ? horizontalIndicatorRect(rc) : verticalIndicatorRect(rc); + return orientation() == Qt::Horizontal ? horizontalIndicatorRect(rc, layoutDirection) : verticalIndicatorRect(rc); } // Adjust the indicator while dragging. (-1,1) is called to finish a DND operation @@ -107,7 +106,7 @@ void ActionProviderBase::adjustIndicator(const QPoint &pos) m_indicator->hide(); return; } - const QRect ig = indicatorGeometry(pos); + const QRect ig = indicatorGeometry(pos, m_indicator->layoutDirection()); if (ig.isValid()) { m_indicator->setGeometry(ig); QPalette p = m_indicator->palette(); @@ -145,9 +144,9 @@ Qt::Orientation QToolBarActionProvider::orientation() const return m_widget->orientation(); } -QRect QToolBarActionProvider::indicatorGeometry(const QPoint &pos) const +QRect QToolBarActionProvider::indicatorGeometry(const QPoint &pos, Qt::LayoutDirection layoutDirection) const { - const QRect actionRect = ActionProviderBase::indicatorGeometry(pos); + const QRect actionRect = ActionProviderBase::indicatorGeometry(pos, layoutDirection); if (actionRect.isValid()) return actionRect; // Toolbar differs in that is has no dummy placeholder to 'insert before' @@ -155,7 +154,7 @@ QRect QToolBarActionProvider::indicatorGeometry(const QPoint &pos) const const QRect freeArea = ToolBarEventFilter::freeArea(m_widget); if (!freeArea.contains(pos)) return QRect(); - return orientation() == Qt::Horizontal ? horizontalIndicatorRect(freeArea) : verticalIndicatorRect(freeArea); + return orientation() == Qt::Horizontal ? horizontalIndicatorRect(freeArea, layoutDirection) : verticalIndicatorRect(freeArea); } // ------------- QMenuBarActionProvider diff --git a/tools/designer/src/components/formeditor/default_actionprovider.h b/tools/designer/src/components/formeditor/default_actionprovider.h index 3660f11..270ea36 100644 --- a/tools/designer/src/components/formeditor/default_actionprovider.h +++ b/tools/designer/src/components/formeditor/default_actionprovider.h @@ -66,7 +66,7 @@ public: virtual Qt::Orientation orientation() const = 0; protected: - virtual QRect indicatorGeometry(const QPoint &pos) const; + virtual QRect indicatorGeometry(const QPoint &pos, Qt::LayoutDirection layoutDirection) const; private: QWidget *m_indicator; @@ -84,7 +84,7 @@ public: Qt::Orientation orientation() const; protected: - virtual QRect indicatorGeometry(const QPoint &pos) const; + virtual QRect indicatorGeometry(const QPoint &pos, Qt::LayoutDirection layoutDirection) const; private: QToolBar *m_widget; diff --git a/tools/designer/src/lib/shared/actionprovider_p.h b/tools/designer/src/lib/shared/actionprovider_p.h index b43dee9..5f9b7a0 100644 --- a/tools/designer/src/lib/shared/actionprovider_p.h +++ b/tools/designer/src/lib/shared/actionprovider_p.h @@ -86,7 +86,7 @@ template // actionGeometry() can be wrong sometimes; it returns a geometry that // stretches to the end of the toolbar/menu bar. So, check from the beginning // in the case of a horizontal right-to-left orientation. - const bool checkTopRight = orientation == Qt::Horizontal && QApplication::layoutDirection() == Qt::RightToLeft; + const bool checkTopRight = orientation == Qt::Horizontal && w->layoutDirection() == Qt::RightToLeft; const QPoint topRight = QPoint(w->rect().width(), 0); for (int index = 0; index < actionCount; ++index) { QRect g = w->actionGeometry(actions.at(index)); diff --git a/tools/designer/src/lib/shared/qdesigner_menu.cpp b/tools/designer/src/lib/shared/qdesigner_menu.cpp index c727d8e..6aba65b 100644 --- a/tools/designer/src/lib/shared/qdesigner_menu.cpp +++ b/tools/designer/src/lib/shared/qdesigner_menu.cpp @@ -73,6 +73,19 @@ QT_BEGIN_NAMESPACE using namespace qdesigner_internal; +// give the user a little more space to click on the sub menu rectangle +static inline void extendClickableArea(QRect *subMenuRect, Qt::LayoutDirection dir) +{ + switch (dir) { + case Qt::LeftToRight: + subMenuRect->setLeft(subMenuRect->left() - 20); + break; + case Qt::RightToLeft: + subMenuRect->setRight(subMenuRect->right() + 20); + break; + } +} + QDesignerMenu::QDesignerMenu(QWidget *parent) : QMenu(parent), m_currentIndex(0), @@ -325,8 +338,7 @@ bool QDesignerMenu::handleMouseDoubleClickEvent(QWidget *, QMouseEvent *event) QRect pm_rect; if (action->menu() || hasSubMenuPixmap(action)) { pm_rect = subMenuPixmapRect(action); - pm_rect.setLeft(pm_rect.left() - 20); // give the user a little more - // space to click + extendClickableArea(&pm_rect, layoutDirection()); } if (!pm_rect.contains(event->pos()) && m_currentIndex != -1) @@ -381,7 +393,7 @@ bool QDesignerMenu::handleMousePressEvent(QWidget * /*widget*/, QMouseEvent *eve QAction *action = safeActionAt(index); QRect pm_rect = subMenuPixmapRect(action); - pm_rect.setLeft(pm_rect.left() - 20); // give the user a little more space to click + extendClickableArea(&pm_rect, layoutDirection()); const int old_index = m_currentIndex; m_currentIndex = index; @@ -540,7 +552,7 @@ QRect QDesignerMenu::subMenuPixmapRect(QAction *action) const { static const QPixmap pm(QLatin1String(":/trolltech/formeditor/images/submenu.png")); const QRect g = actionGeometry(action); - const int x = g.right() - pm.width() - 2; + const int x = layoutDirection() == Qt::LeftToRight ? (g.right() - pm.width() - 2) : 2; const int y = g.top() + (g.height() - pm.height())/2 + 1; return QRect(x, y, pm.width(), pm.height()); } @@ -863,38 +875,52 @@ void QDesignerMenu::closeMenuChain() m_lastSubMenuIndex = -1; } -void QDesignerMenu::moveLeft() +// Close submenu using the left/right keys according to layoutDirection(). +// Return false to indicate the event must be propagated to the menu bar. +bool QDesignerMenu::hideSubMenuOnCursorKey() { if (parentMenu()) { hide(); - } else { - closeMenuChain(); - if (QDesignerMenuBar *mb = parentMenuBar()) { - if (QApplication::layoutDirection() == Qt::LeftToRight) - mb->moveLeft(); - else - mb->moveRight(); - } + return true; } + closeMenuChain(); update(); + if (parentMenuBar()) + return false; + return true; } -void QDesignerMenu::moveRight() +// Open a submenu using the left/right keys according to layoutDirection(). +// Return false to indicate the event must be propagated to the menu bar. +bool QDesignerMenu::showSubMenuOnCursorKey() { - QAction *action = currentAction(); + const QAction *action = currentAction(); - if (qobject_cast(action) || action->isSeparator()) { + if (qobject_cast(action) || action->isSeparator()) { closeMenuChain(); - if (QDesignerMenuBar *mb = parentMenuBar()) { - if (QApplication::layoutDirection() == Qt::LeftToRight) - mb->moveRight(); - else - mb->moveLeft(); - } - } else { - m_lastSubMenuIndex = -1; // force a refresh - slotShowSubMenuNow(); + if (parentMenuBar()) + return false; + return true; } + m_lastSubMenuIndex = -1; // force a refresh + slotShowSubMenuNow(); + return true; +} + +void QDesignerMenu::moveLeft() +{ + const bool handled = layoutDirection() == Qt::LeftToRight ? + hideSubMenuOnCursorKey() : showSubMenuOnCursorKey(); + if (!handled) + parentMenuBar()->moveLeft(); +} + +void QDesignerMenu::moveRight() +{ + const bool handled = layoutDirection() == Qt::LeftToRight ? + showSubMenuOnCursorKey() : hideSubMenuOnCursorKey(); + if (!handled) + parentMenuBar()->moveRight(); } void QDesignerMenu::moveUp(bool ctrl) @@ -1053,7 +1079,15 @@ void QDesignerMenu::slotShowSubMenuNow() if ((menu->windowFlags() & Qt::Popup) != Qt::Popup) menu->setWindowFlags(Qt::Popup); const QRect g = actionGeometry(action); - menu->move(mapToGlobal(g.topRight())); + if (layoutDirection() == Qt::LeftToRight) { + menu->move(mapToGlobal(g.topRight())); + } else { + // The position is not initially correct due to the unknown width, + // causing it to overlap a bit the first time it is invoked. + const QSize menuSize = menu->size(); + QPoint point = g.topLeft() - QPoint(menu->width() + 10, 0); + menu->move(mapToGlobal(point)); + } menu->show(); menu->setFocus(); } else { diff --git a/tools/designer/src/lib/shared/qdesigner_menu_p.h b/tools/designer/src/lib/shared/qdesigner_menu_p.h index 55d8bcd..93735e6 100644 --- a/tools/designer/src/lib/shared/qdesigner_menu_p.h +++ b/tools/designer/src/lib/shared/qdesigner_menu_p.h @@ -181,6 +181,9 @@ protected: void selectCurrentAction(); private: + bool hideSubMenuOnCursorKey(); + bool showSubMenuOnCursorKey(); + QPoint m_startPosition; int m_currentIndex; QAction *m_addItem; diff --git a/tools/designer/src/lib/shared/qdesigner_menubar.cpp b/tools/designer/src/lib/shared/qdesigner_menubar.cpp index b53bb8d..2b19142 100644 --- a/tools/designer/src/lib/shared/qdesigner_menubar.cpp +++ b/tools/designer/src/lib/shared/qdesigner_menubar.cpp @@ -219,18 +219,12 @@ bool QDesignerMenuBar::handleKeyPressEvent(QWidget *, QKeyEvent *e) case Qt::Key_Left: e->accept(); - if (QApplication::layoutDirection() == Qt::LeftToRight) - moveLeft(e->modifiers() & Qt::ControlModifier); - else - moveRight(e->modifiers() & Qt::ControlModifier); + moveLeft(e->modifiers() & Qt::ControlModifier); return true; case Qt::Key_Right: e->accept(); - if (QApplication::layoutDirection() == Qt::LeftToRight) - moveRight(e->modifiers() & Qt::ControlModifier); - else - moveLeft(e->modifiers() & Qt::ControlModifier); + moveRight(e->modifiers() & Qt::ControlModifier); return true; // no update case Qt::Key_Up: @@ -741,28 +735,48 @@ int QDesignerMenuBar::realActionCount() const return actions().count() - 1; // 1 fake actions } -void QDesignerMenuBar::moveLeft(bool ctrl) +bool QDesignerMenuBar::dragging() const { - if (ctrl) - (void) swap(m_currentIndex, m_currentIndex - 1); - - m_currentIndex = qMax(0, --m_currentIndex); - // Always re-select, swapping destroys order - updateCurrentAction(true); + return m_dragging; } -bool QDesignerMenuBar::dragging() const +void QDesignerMenuBar::moveLeft(bool ctrl) { - return m_dragging; + if (layoutDirection() == Qt::LeftToRight) { + movePrevious(ctrl); + } else { + moveNext(ctrl); + } } void QDesignerMenuBar::moveRight(bool ctrl) { - if (ctrl) - (void) swap(m_currentIndex + 1, m_currentIndex); + if (layoutDirection() == Qt::LeftToRight) { + moveNext(ctrl); + } else { + movePrevious(ctrl); + } +} + +void QDesignerMenuBar::movePrevious(bool ctrl) +{ + const bool swapped = ctrl && swapActions(m_currentIndex, m_currentIndex - 1); + const int newIndex = qMax(0, m_currentIndex - 1); + // Always re-select, swapping destroys order + if (swapped || newIndex != m_currentIndex) { + m_currentIndex = newIndex; + updateCurrentAction(true); + } +} - m_currentIndex = qMin(actions().count() - 1, ++m_currentIndex); - updateCurrentAction(!ctrl); +void QDesignerMenuBar::moveNext(bool ctrl) +{ + const bool swapped = ctrl && swapActions(m_currentIndex + 1, m_currentIndex); + const int newIndex = qMin(actions().count() - 1, m_currentIndex + 1); + if (swapped || newIndex != m_currentIndex) { + m_currentIndex = newIndex; + updateCurrentAction(!ctrl); + } } void QDesignerMenuBar::moveUp() @@ -869,7 +883,7 @@ QAction *QDesignerMenuBar::safeActionAt(int index) const return actions().at(index); } -bool QDesignerMenuBar::swap(int a, int b) +bool QDesignerMenuBar::swapActions(int a, int b) { const int left = qMin(a, b); int right = qMax(a, b); diff --git a/tools/designer/src/lib/shared/qdesigner_menubar_p.h b/tools/designer/src/lib/shared/qdesigner_menubar_p.h index 97a655b..fb820e1 100644 --- a/tools/designer/src/lib/shared/qdesigner_menubar_p.h +++ b/tools/designer/src/lib/shared/qdesigner_menubar_p.h @@ -155,10 +155,12 @@ protected: QAction *safeActionAt(int index) const; - bool swap(int a, int b); + bool swapActions(int a, int b); private: void updateCurrentAction(bool selectAction); + void movePrevious(bool ctrl); + void moveNext(bool ctrl); QAction *m_addMenu; QPointer m_activeMenu; diff --git a/tools/designer/src/lib/shared/qdesigner_toolbar.cpp b/tools/designer/src/lib/shared/qdesigner_toolbar.cpp index 2693452..8c0c61d 100644 --- a/tools/designer/src/lib/shared/qdesigner_toolbar.cpp +++ b/tools/designer/src/lib/shared/qdesigner_toolbar.cpp @@ -466,7 +466,7 @@ QRect ToolBarEventFilter::freeArea(const QToolBar *tb) QRect exclusionRectangle = actionList.empty() ? handleArea(tb) : tb->actionGeometry(actionList.back()); switch (tb->orientation()) { case Qt::Horizontal: - switch (QApplication::layoutDirection()) { + switch (tb->layoutDirection()) { case Qt::LeftToRight: rc.setX(exclusionRectangle.right() + 1); break; -- cgit v0.12 From 7d605af42a72f35481e5dad9f279f6b5d5cda2f2 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 6 Aug 2009 16:45:23 +0200 Subject: nicer way to deal with missing support for template class friends --- tools/linguist/shared/profileevaluator.cpp | 2 -- tools/linguist/shared/profileevaluator.h | 15 +++++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/tools/linguist/shared/profileevaluator.cpp b/tools/linguist/shared/profileevaluator.cpp index 5a9095a..fe22067 100644 --- a/tools/linguist/shared/profileevaluator.cpp +++ b/tools/linguist/shared/profileevaluator.cpp @@ -256,10 +256,8 @@ public: ProFile *m_prevProFile; // See m_prevLineNo }; -#if (!defined(__GNUC__) || __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3)) && !defined(__SUNPRO_CC) Q_DECLARE_TYPEINFO(ProFileEvaluator::Private::State, Q_PRIMITIVE_TYPE); Q_DECLARE_TYPEINFO(ProFileEvaluator::Private::ProLoop, Q_MOVABLE_TYPE); -#endif ProFileEvaluator::Private::Private(ProFileEvaluator *q_) : q(q_) diff --git a/tools/linguist/shared/profileevaluator.h b/tools/linguist/shared/profileevaluator.h index f3498c1..ba525b2 100644 --- a/tools/linguist/shared/profileevaluator.h +++ b/tools/linguist/shared/profileevaluator.h @@ -50,10 +50,21 @@ #include #include +#if (!defined(__GNUC__) || __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3)) && !defined(__SUNPRO_CC) +# define HAVE_TEMPLATE_CLASS_FRIENDS +#endif + QT_BEGIN_NAMESPACE class ProFileEvaluator { +#ifdef HAVE_TEMPLATE_CLASS_FRIENDS +private: +#else +public: +#endif + class Private; + public: enum TemplateType { TT_Unknown = 0, @@ -93,11 +104,11 @@ public: virtual void fileMessage(const QString &msg); // error() and message() from .pro file private: - class Private; Private *d; - // This doesn't help gcc 3.3 and sunpro ... +#ifdef HAVE_TEMPLATE_CLASS_FRIENDS template friend class QTypeInfo; +#endif }; QT_END_NAMESPACE -- cgit v0.12 From e5f6edf86de20f86a028842ed6b7c472bbd1d08b Mon Sep 17 00:00:00 2001 From: Jens Bache-Wiig Date: Thu, 6 Aug 2009 16:48:42 +0200 Subject: Fix compile on Windows Reviewed-by: jesper --- src/gui/kernel/qapplication_win.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/kernel/qapplication_win.cpp b/src/gui/kernel/qapplication_win.cpp index 6421ed9..bdee6ec 100644 --- a/src/gui/kernel/qapplication_win.cpp +++ b/src/gui/kernel/qapplication_win.cpp @@ -3740,7 +3740,7 @@ bool QETWidget::translateGestureEvent(const MSG &msg) event.gestureType = QNativeGestureEvent::GestureEnd; break; case GID_ZOOM: - event.gestureType = QNativeGestureEvent::Pinch; + event.gestureType = QNativeGestureEvent::Zoom; break; case GID_PAN: event.gestureType = QNativeGestureEvent::Pan; -- cgit v0.12 From 36ed34763d2ba4d8f5cd71b22224bf1245ed2000 Mon Sep 17 00:00:00 2001 From: Thierry Bastian Date: Thu, 6 Aug 2009 15:24:27 +0200 Subject: build fix for mingw getQApplicationPrivateInternal was not declared --- src/gui/kernel/qwidget_win.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/kernel/qwidget_win.cpp b/src/gui/kernel/qwidget_win.cpp index d8bee55..7cfa111 100644 --- a/src/gui/kernel/qwidget_win.cpp +++ b/src/gui/kernel/qwidget_win.cpp @@ -2058,6 +2058,7 @@ void QWidgetPrivate::winSetupGestures() Q_Q(QWidget); if (!q) return; + extern QApplicationPrivate* getQApplicationPrivateInternal(); QApplicationPrivate *qAppPriv = getQApplicationPrivateInternal(); bool needh = false; bool needv = false; -- cgit v0.12 From 02db4405cd34b4366b4ba7ddb10b54dfb60957f5 Mon Sep 17 00:00:00 2001 From: Thierry Bastian Date: Thu, 6 Aug 2009 16:20:58 +0200 Subject: multimedia: fix warnings on mingw moved static CRITICAL_SECTIONs to cpp files. In header they would be declared more than once depending on what file includes those headers. --- src/multimedia/audio/qaudioinput_win32_p.cpp | 1 + src/multimedia/audio/qaudioinput_win32_p.h | 2 -- src/multimedia/audio/qaudiooutput_win32_p.cpp | 2 ++ src/multimedia/audio/qaudiooutput_win32_p.h | 2 -- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/multimedia/audio/qaudioinput_win32_p.cpp b/src/multimedia/audio/qaudioinput_win32_p.cpp index e5b6e0d..3478e51 100644 --- a/src/multimedia/audio/qaudioinput_win32_p.cpp +++ b/src/multimedia/audio/qaudioinput_win32_p.cpp @@ -55,6 +55,7 @@ //#define DEBUG_AUDIO 1 +static CRITICAL_SECTION waveInCriticalSection; QAudioInputPrivate::QAudioInputPrivate(const QByteArray &device, const QAudioFormat& audioFormat): settings(audioFormat) diff --git a/src/multimedia/audio/qaudioinput_win32_p.h b/src/multimedia/audio/qaudioinput_win32_p.h index 32464f0..aa0d0b3 100644 --- a/src/multimedia/audio/qaudioinput_win32_p.h +++ b/src/multimedia/audio/qaudioinput_win32_p.h @@ -68,8 +68,6 @@ #include -static CRITICAL_SECTION waveInCriticalSection; - class QAudioInputPrivate : public QAbstractAudioInput { Q_OBJECT diff --git a/src/multimedia/audio/qaudiooutput_win32_p.cpp b/src/multimedia/audio/qaudiooutput_win32_p.cpp index f681936..dbf0a66 100644 --- a/src/multimedia/audio/qaudiooutput_win32_p.cpp +++ b/src/multimedia/audio/qaudiooutput_win32_p.cpp @@ -54,6 +54,8 @@ //#define DEBUG_AUDIO 1 +static CRITICAL_SECTION waveOutCriticalSection; + QAudioOutputPrivate::QAudioOutputPrivate(const QByteArray &device, const QAudioFormat& audioFormat): settings(audioFormat) { diff --git a/src/multimedia/audio/qaudiooutput_win32_p.h b/src/multimedia/audio/qaudiooutput_win32_p.h index 91f14f5..50a3992 100644 --- a/src/multimedia/audio/qaudiooutput_win32_p.h +++ b/src/multimedia/audio/qaudiooutput_win32_p.h @@ -67,8 +67,6 @@ #include -static CRITICAL_SECTION waveOutCriticalSection; - class QAudioOutputPrivate : public QAbstractAudioOutput { Q_OBJECT -- cgit v0.12 From 8bd1ac790c9b336d64e407a94b1ae6a4e195fc30 Mon Sep 17 00:00:00 2001 From: Thierry Bastian Date: Thu, 6 Aug 2009 16:34:41 +0200 Subject: Fix warnings on mingw mingw doesn't support format with %llu or %ll. So I used a QString --- src/tools/uic/uic.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tools/uic/uic.cpp b/src/tools/uic/uic.cpp index bbb3af7..f789980 100644 --- a/src/tools/uic/uic.cpp +++ b/src/tools/uic/uic.cpp @@ -184,9 +184,9 @@ DomUI *Uic::parseUiFile(QXmlStreamReader &reader) if (reader.hasError()) { delete ui; ui = 0; - fprintf(stderr, "uic: Error in line %llu, column %llu : %s\n", - reader.lineNumber(), reader.columnNumber(), - reader.errorString().toAscii().constData()); + fprintf(stderr, qPrintable(QString::fromLatin1("uic: Error in line %1, column %2 : %3\n") + .arg(reader.lineNumber()).arg(reader.columnNumber()) + .arg(reader.errorString()))); } return ui; -- cgit v0.12 From a488f0784b265d350441f5e38dc9021e9c2a50fc Mon Sep 17 00:00:00 2001 From: Benjamin Poulain Date: Thu, 6 Aug 2009 16:37:07 +0200 Subject: Fix a bug in QProcess. QProcess was not reentrant on Unix QProcess is supposed to be reentrant but was not on Unix. The constructor of QProcessManager could be exectued several time when QProcess is created. The construction is now protected by a mutex. Task-number: 254246 Reviewed-by: Olivier Goffart --- src/corelib/io/qprocess_unix.cpp | 12 +++++++++++- tests/auto/qprocess/tst_qprocess.cpp | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp index 607b734..168eac2 100644 --- a/src/corelib/io/qprocess_unix.cpp +++ b/src/corelib/io/qprocess_unix.cpp @@ -162,7 +162,17 @@ private: QMap children; }; -Q_GLOBAL_STATIC(QProcessManager, processManager) + +Q_GLOBAL_STATIC(QMutex, processManagerGlobalMutex) + +static QProcessManager *processManager() { + // The constructor of QProcessManager should be called only once + // so we cannot use Q_GLOBAL_STATIC directly for QProcessManager + QMutex *mutex = processManagerGlobalMutex(); + QMutexLocker locker(mutex); + static QProcessManager processManager; + return &processManager; +} QProcessManager::QProcessManager() { diff --git a/tests/auto/qprocess/tst_qprocess.cpp b/tests/auto/qprocess/tst_qprocess.cpp index d235dff..1ffa360 100644 --- a/tests/auto/qprocess/tst_qprocess.cpp +++ b/tests/auto/qprocess/tst_qprocess.cpp @@ -1224,7 +1224,7 @@ private: //----------------------------------------------------------------------------- void tst_QProcess::processInAThread() { - for (int i = 0; i < 3; ++i) { + for (int i = 0; i < 10; ++i) { TestThread thread; thread.start(); QVERIFY(thread.wait(10000)); -- cgit v0.12 From da913bba1a0ecb4b5b8008b120d3951f1b69a2e5 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Thu, 6 Aug 2009 12:42:23 +0200 Subject: fix warning in tst_qlocalsocket Reviewed-by: thartman --- tests/auto/qlocalsocket/tst_qlocalsocket.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/auto/qlocalsocket/tst_qlocalsocket.cpp b/tests/auto/qlocalsocket/tst_qlocalsocket.cpp index a41eecd..b861e62 100644 --- a/tests/auto/qlocalsocket/tst_qlocalsocket.cpp +++ b/tests/auto/qlocalsocket/tst_qlocalsocket.cpp @@ -918,6 +918,7 @@ void tst_QLocalSocket::writeOnlySocket() QVERIFY(server.waitForNewConnection()); QLocalSocket* serverSocket = server.nextPendingConnection(); + QVERIFY(serverSocket); QCOMPARE(client.bytesAvailable(), qint64(0)); QCOMPARE(client.state(), QLocalSocket::ConnectedState); -- cgit v0.12 From 2aeaf16a1e31856a3051e6727c5ff2695fec9625 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Thu, 6 Aug 2009 14:33:23 +0200 Subject: fix tst_qlocalsocket::readBufferOverflow for Windows CE The TCP socket must get the chance to read data into its read buffer after the first read operation emptied it. Reviewed-by: thartman --- tests/auto/qlocalsocket/tst_qlocalsocket.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/auto/qlocalsocket/tst_qlocalsocket.cpp b/tests/auto/qlocalsocket/tst_qlocalsocket.cpp index b861e62..177648d 100644 --- a/tests/auto/qlocalsocket/tst_qlocalsocket.cpp +++ b/tests/auto/qlocalsocket/tst_qlocalsocket.cpp @@ -555,14 +555,17 @@ void tst_QLocalSocket::readBufferOverflow() QVERIFY(server.hasPendingConnections()); QLocalSocket* serverSocket = server.nextPendingConnection(); - char* buffer = (char*)qMalloc(dataBufferSize); + char buffer[dataBufferSize]; memset(buffer, 0, dataBufferSize); serverSocket->write(buffer, dataBufferSize); serverSocket->flush(); - qFree(buffer); QVERIFY(client.waitForReadyRead()); - QCOMPARE(client.readAll().size(), dataBufferSize); + QCOMPARE(client.read(buffer, readBufferSize), qint64(readBufferSize)); +#ifdef QT_LOCALSOCKET_TCP + QTest::qWait(250); +#endif + QCOMPARE(client.read(buffer, readBufferSize), qint64(readBufferSize)); } // QLocalSocket/Server can take a name or path, check that it works as expected -- cgit v0.12 From 68423a4642917122c3902dca4ee2710b95c9fa51 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Thu, 6 Aug 2009 16:34:26 +0200 Subject: fixing outputMessage in qplaintestlogger.cpp for Windows CE There's a restriction to output only 255 characters per line. The loop we had before was wrong and did some read operations somewhere behinde the end of the message string. Reviewed-by: thartman --- src/testlib/qplaintestlogger.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/testlib/qplaintestlogger.cpp b/src/testlib/qplaintestlogger.cpp index 7bebaa1..e075b36 100644 --- a/src/testlib/qplaintestlogger.cpp +++ b/src/testlib/qplaintestlogger.cpp @@ -148,11 +148,13 @@ namespace QTest { static void outputMessage(const char *str) { #if defined(Q_OS_WINCE) - int length = strlen(str); - for (int pos = 0; pos < length; pos +=255) { - QString uniText = QString::fromLatin1(str + pos, 255); - OutputDebugString((wchar_t*)uniText.utf16()); - } + QString strUtf16 = QString::fromLatin1(str); + const int maxOutputLength = 255; + do { + QString tmp = strUtf16.left(maxOutputLength); + OutputDebugString((wchar_t*)tmp.utf16()); + strUtf16.remove(0, maxOutputLength); + } while (!strUtf16.isEmpty()); if (QTestLog::outputFileName()) #elif defined(Q_OS_WIN) EnterCriticalSection(&outputCriticalSection); -- cgit v0.12 From 4be8bdb4ad95263cd9c9c75efe98418c20c4987a Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Thu, 6 Aug 2009 16:46:24 +0200 Subject: tst_qstyle compile fix Reviewed-by: thartman --- tests/auto/qstyle/tst_qstyle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/auto/qstyle/tst_qstyle.cpp b/tests/auto/qstyle/tst_qstyle.cpp index 2cb5080..3c63a50 100644 --- a/tests/auto/qstyle/tst_qstyle.cpp +++ b/tests/auto/qstyle/tst_qstyle.cpp @@ -351,7 +351,7 @@ void tst_QStyle::testAllFunctions(QStyle *style) testScrollBarSubControls(style); } -void tst_QStyle::testScrollBarSubControls(QStyle *) +void tst_QStyle::testScrollBarSubControls(QStyle* style) { #ifdef Q_OS_WINCE_WM if (qobject_cast(style) && qt_wince_is_smartphone()) -- cgit v0.12 From 30655da0d7b41899b10ef662622292be8571f9c4 Mon Sep 17 00:00:00 2001 From: Jocelyn Turcotte Date: Thu, 6 Aug 2009 17:25:04 +0200 Subject: tst_QHostInfo: Disable short name tests for lookupIPv4. These tests run against domain names in troll.no and to allow shorter names the machine has to be in this domain. Removing them since this specific case test the OS more than Qt itself. Reviewed-by: Thiago --- tests/auto/qhostinfo/tst_qhostinfo.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/auto/qhostinfo/tst_qhostinfo.cpp b/tests/auto/qhostinfo/tst_qhostinfo.cpp index c3d7c2d..86b70e1 100644 --- a/tests/auto/qhostinfo/tst_qhostinfo.cpp +++ b/tests/auto/qhostinfo/tst_qhostinfo.cpp @@ -214,10 +214,7 @@ void tst_QHostInfo::lookupIPv4_data() QTest::newRow("empty") << "" << "" << int(QHostInfo::HostNotFound); - QTest::newRow("lupinella_00") << "l" << lupinellaIp << int(QHostInfo::NoError); - QTest::newRow("lupinella_01") << "lupinella" << lupinellaIp << int(QHostInfo::NoError); - QTest::newRow("lupinella_02") << "lupinella.troll.no" << lupinellaIp << int(QHostInfo::NoError); - QTest::newRow("lupinella_03") << "lupinella.trolltech.com" << lupinellaIp << int(QHostInfo::NoError); + QTest::newRow("single_ip4") << "lupinella.troll.no" << lupinellaIp << int(QHostInfo::NoError); QTest::newRow("multiple_ip4") << "multi.dev.troll.no" << "1.2.3.4 1.2.3.5 10.3.3.31" << int(QHostInfo::NoError); QTest::newRow("literal_ip4") << lupinellaIp << lupinellaIp << int(QHostInfo::NoError); QTest::newRow("notfound") << "this-name-does-not-exist-hopefully." << "" << int(QHostInfo::HostNotFound); -- cgit v0.12 From 7ab03e0565bef0f38ff70c069a4b0b0bdb234d68 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Thu, 6 Aug 2009 18:12:28 +0200 Subject: tst_qfileinfo fixed for Windows CE Win CE doesn't support real file permissions (FAT only). Further, we don't have pagefile.sys. Reviewed-by: thartman --- tests/auto/qfileinfo/tst_qfileinfo.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/auto/qfileinfo/tst_qfileinfo.cpp b/tests/auto/qfileinfo/tst_qfileinfo.cpp index 512f2b6..a87e306 100644 --- a/tests/auto/qfileinfo/tst_qfileinfo.cpp +++ b/tests/auto/qfileinfo/tst_qfileinfo.cpp @@ -749,7 +749,7 @@ void tst_QFileInfo::size() void tst_QFileInfo::systemFiles() { -#ifndef Q_OS_WIN +#if !defined(Q_OS_WIN) || defined(Q_OS_WINCE) QSKIP("This is a Windows only test", SkipAll); #endif QFileInfo fi("c:\\pagefile.sys"); @@ -1077,7 +1077,13 @@ void tst_QFileInfo::isWritable() { QVERIFY(QFileInfo("tst_qfileinfo.cpp").isWritable()); #ifdef Q_OS_WIN - QVERIFY(!QFileInfo("c:\\pagefile.sys").isWritable()); +#ifdef Q_OS_WINCE + QFileInfo fi("\\Windows\\wince.nls"); +#else + QFileInfo fi("c:\\pagefile.sys"); +#endif + QVERIFY(fi.exists()); + QVERIFY(!fi.isWritable()); #endif #ifdef Q_OS_UNIX if (::getuid() == 0) -- cgit v0.12 From 16b3825bc4ec3335bac412e7070b12f7340477e0 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Thu, 6 Aug 2009 18:51:28 +0200 Subject: tst_qsharedpointer compile fix for Windows CE There's no time() on Windows CE. Reviewed-by: Daniel Molkentin --- tests/auto/qsharedpointer/tst_qsharedpointer.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/auto/qsharedpointer/tst_qsharedpointer.cpp b/tests/auto/qsharedpointer/tst_qsharedpointer.cpp index 5214edb..1101a08 100644 --- a/tests/auto/qsharedpointer/tst_qsharedpointer.cpp +++ b/tests/auto/qsharedpointer/tst_qsharedpointer.cpp @@ -1407,7 +1407,11 @@ void tst_QSharedPointer::threadStressTest() base.clear(); +#ifdef Q_OS_WINCE + srand(QDateTime::currentDateTime().toTime_t()); +#else srand(time(NULL)); +#endif // start threads for (int i = 0; i < allThreads.count(); ++i) if (allThreads[i]) allThreads[i]->start(); -- cgit v0.12 From 281d3dc3cfff77c185912365130af36f8be632d3 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Thu, 6 Aug 2009 19:20:16 +0200 Subject: tst_QFile::copyAfterFail fixed on Windows We cannot remove a file that's still opened. Reviewed-by: ossi --- tests/auto/qfile/tst_qfile.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/auto/qfile/tst_qfile.cpp b/tests/auto/qfile/tst_qfile.cpp index 66f29dd..249b702 100644 --- a/tests/auto/qfile/tst_qfile.cpp +++ b/tests/auto/qfile/tst_qfile.cpp @@ -915,6 +915,7 @@ void tst_QFile::copyAfterFail() QVERIFY(file1.open(QIODevice::ReadWrite) && "(test-precondition)"); QVERIFY(file2.open(QIODevice::ReadWrite) && "(test-precondition)"); + file2.close(); QVERIFY(!QFile::exists("copied-file-1.txt") && "(test-precondition)"); QVERIFY(!QFile::exists("copied-file-2.txt") && "(test-precondition)"); -- cgit v0.12 From 01f6bb95151f1852020aa7b149f33c49c1229a39 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Fri, 7 Aug 2009 14:21:49 +1000 Subject: Store QObject*'s in the QVariant data structure Rather than requiring an allocation of the "shared data" region, QObject *'s should be stored directly in the data structure. This very marginally, but measurably, improves QVariant performance. Reviewed-by: Thiago Macieira --- src/corelib/kernel/qvariant.cpp | 16 +++++++++++++--- src/corelib/kernel/qvariant.h | 1 + 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index 2b5ea0a..4166944 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -161,6 +161,9 @@ static void construct(QVariant::Private *x, const void *copy) case QMetaType::Float: x->data.f = copy ? *static_cast(copy) : 0.0f; break; + case QMetaType::QObjectStar: + x->data.o = copy ? *static_cast(copy) : 0; + break; case QVariant::LongLong: x->data.ll = copy ? *static_cast(copy) : Q_INT64_C(0); break; @@ -257,6 +260,7 @@ static void clear(QVariant::Private *d) case QVariant::ULongLong: case QVariant::Double: case QMetaType::Float: + case QMetaType::QObjectStar: break; case QVariant::Invalid: case QVariant::UserType: @@ -326,6 +330,7 @@ static bool isNull(const QVariant::Private *d) case QVariant::Bool: case QVariant::Double: case QMetaType::Float: + case QMetaType::QObjectStar: break; } return d->is_null; @@ -419,6 +424,8 @@ static bool compare(const QVariant::Private *a, const QVariant::Private *b) return a->data.d == b->data.d; case QMetaType::Float: return a->data.f == b->data.f; + case QMetaType::QObjectStar: + return a->data.o == b->data.o; case QVariant::Date: return *v_cast(a) == *v_cast(b); case QVariant::Time: @@ -1048,6 +1055,9 @@ static void streamDebug(QDebug dbg, const QVariant &v) case QMetaType::Float: dbg.nospace() << qVariantValue(v); break; + case QMetaType::QObjectStar: + dbg.nospace() << qVariantValue(v); + break; case QVariant::Double: dbg.nospace() << v.toDouble(); break; @@ -1361,7 +1371,7 @@ void QVariant::create(int type, const void *copy) QVariant::~QVariant() { - if (d.type > Char && d.type != QMetaType::Float && (!d.is_shared || !d.data.shared->ref.deref())) + if (d.type > Char && d.type != QMetaType::Float && d.type != QMetaType::QObjectStar && (!d.is_shared || !d.data.shared->ref.deref())) handler->clear(&d); } @@ -1377,7 +1387,7 @@ QVariant::QVariant(const QVariant &p) { if (d.is_shared) { d.data.shared->ref.ref(); - } else if (p.d.type > Char && p.d.type != QMetaType::Float) { + } else if (p.d.type > Char && p.d.type != QMetaType::Float && p.d.type != QMetaType::QObjectStar) { handler->construct(&d, p.constData()); d.is_null = p.d.is_null; } @@ -1733,7 +1743,7 @@ QVariant& QVariant::operator=(const QVariant &variant) if (variant.d.is_shared) { variant.d.data.shared->ref.ref(); d = variant.d; - } else if (variant.d.type > Char && variant.d.type != QMetaType::Float) { + } else if (variant.d.type > Char && variant.d.type != QMetaType::Float && variant.d.type != QMetaType::QObjectStar) { d.type = variant.d.type; handler->construct(&d, variant.constData()); d.is_null = variant.d.is_null; diff --git a/src/corelib/kernel/qvariant.h b/src/corelib/kernel/qvariant.h index a68939d..4489e95 100644 --- a/src/corelib/kernel/qvariant.h +++ b/src/corelib/kernel/qvariant.h @@ -358,6 +358,7 @@ class Q_CORE_EXPORT QVariant float f; qlonglong ll; qulonglong ull; + QObject *o; void *ptr; PrivateShared *shared; } data; -- cgit v0.12 From cfa7d8608283a012887e7ecbe42c50ff56cc153e Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 6 Aug 2009 16:56:41 +0200 Subject: Fixing deployment for shadow builds on Windows CE Reviewed-by: Joerg --- tests/auto/qpluginloader/tst/tst.pro | 2 +- tests/auto/windowsmobile/test/test.pro | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/auto/qpluginloader/tst/tst.pro b/tests/auto/qpluginloader/tst/tst.pro index 5331f09..28f74d4 100644 --- a/tests/auto/qpluginloader/tst/tst.pro +++ b/tests/auto/qpluginloader/tst/tst.pro @@ -13,7 +13,7 @@ win32 { wince*: { - addFiles.sources = ../bin/*.dll + addFiles.sources = $$OUT_PWD/../bin/*.dll addFiles.path = bin DEPLOYMENT += addFiles } diff --git a/tests/auto/windowsmobile/test/test.pro b/tests/auto/windowsmobile/test/test.pro index 2420bf1..b7f65a9 100644 --- a/tests/auto/windowsmobile/test/test.pro +++ b/tests/auto/windowsmobile/test/test.pro @@ -8,8 +8,7 @@ RESOURCES += windowsmobile.qrc TARGET = tst_windowsmobile wincewm*: { - addFiles.sources = \ - ../testQMenuBar/*.exe + addFiles.sources = $$OUT_PWD/../testQMenuBar/*.exe addFiles.path = "\Program Files\tst_windowsmobile" -- cgit v0.12 From c10c20c5fc69ac5f0e406ecdc58d072a846e6743 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 6 Aug 2009 16:57:46 +0200 Subject: Adding QApplication::processEvents to autotest Windows CE is sometimes a little bit slow Reviewed-by: Joerg --- tests/auto/qpushbutton/tst_qpushbutton.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/auto/qpushbutton/tst_qpushbutton.cpp b/tests/auto/qpushbutton/tst_qpushbutton.cpp index 7a81dbf..528f3bb 100644 --- a/tests/auto/qpushbutton/tst_qpushbutton.cpp +++ b/tests/auto/qpushbutton/tst_qpushbutton.cpp @@ -661,6 +661,7 @@ void tst_QPushButton::sizeHint() tabWidget->setCurrentWidget(tab2); tabWidget->setCurrentWidget(tab1); QTest::qWait(100); + QApplication::processEvents(); QCOMPARE(button1_2->size(), button2_2->size()); } -- cgit v0.12 From 478d4dde9f0f6f232136935d93f0b5e3cca9db61 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 6 Aug 2009 16:59:09 +0200 Subject: Extra check in pluginloader autotest This extra check prevents a crash if plugin loading fails Reviewed-by: Joerg --- tests/auto/qpluginloader/tst_qpluginloader.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/auto/qpluginloader/tst_qpluginloader.cpp b/tests/auto/qpluginloader/tst_qpluginloader.cpp index 8221325..0b8ae45 100644 --- a/tests/auto/qpluginloader/tst_qpluginloader.cpp +++ b/tests/auto/qpluginloader/tst_qpluginloader.cpp @@ -264,6 +264,7 @@ void tst_QPluginLoader::deleteinstanceOnUnload() if (pass == 0) loader1.load(); // not recommended, instance() should do the job. PluginInterface *instance1 = qobject_cast(loader1.instance()); + QVERIFY(instance1); QCOMPARE(instance1->pluginName(), QLatin1String("Plugin ok")); QPluginLoader loader2; -- cgit v0.12 From 592462f4101bb2a9d7be58fb72b8f11714490cd5 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 6 Aug 2009 17:00:34 +0200 Subject: fixing qmainwindow autotest On windows mobile with native menubar integration the menubar is not a child of the mainwindow Reviewed-by: Joerg --- tests/auto/qmainwindow/tst_qmainwindow.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/auto/qmainwindow/tst_qmainwindow.cpp b/tests/auto/qmainwindow/tst_qmainwindow.cpp index 6ae7a3e..f81dd82 100644 --- a/tests/auto/qmainwindow/tst_qmainwindow.cpp +++ b/tests/auto/qmainwindow/tst_qmainwindow.cpp @@ -550,6 +550,9 @@ void tst_QMainWindow::menuBar() mw.setMenuBar(mb1); QVERIFY(mw.menuBar() != 0); QCOMPARE(mw.menuBar(), (QMenuBar *)mb1); +#ifdef Q_WS_WINCE_WM + QSKIP("With native menubar integration the menubar is not a child", SkipSingle); +#endif QCOMPARE(mb1->parentWidget(), (QWidget *)&mw); mw.setMenuBar(0); -- cgit v0.12 From aed3faca7dafdc697402cfc99dc5e9ad2fcbdd45 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 7 Aug 2009 09:29:56 +0200 Subject: qmake - add error message if files for deployment are missing If files for deployment for windows ce are missing we get an error message now. Wilcards have to behandled special because QFileInfo::exists() does not work with wildcards. QFileInfo::absoluteFilePath() does work with wildcards Reviewed-by: Mauricek --- qmake/generators/win32/msvc_vcproj.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/qmake/generators/win32/msvc_vcproj.cpp b/qmake/generators/win32/msvc_vcproj.cpp index 5f250bf..9759e7d 100644 --- a/qmake/generators/win32/msvc_vcproj.cpp +++ b/qmake/generators/win32/msvc_vcproj.cpp @@ -1261,7 +1261,13 @@ void VcprojGenerator::initDeploymentTool() searchPath = info.absoluteFilePath(); } else { nameFilter = source.split('\\').last(); - searchPath = info.absolutePath(); + if (source.contains('*')) { + source = source.split('*').first(); + info = QFileInfo(source); + } + searchPath = info.absolutePath(); + if (!info.exists()) + fprintf(stderr, "Deployment file is missing %s\n", source.toLatin1().constData()); } int pathSize = searchPath.size(); -- cgit v0.12 From 43a98b3ddd8d01b8e6453efd49bb6a9064e1ba08 Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Fri, 7 Aug 2009 10:19:11 +0200 Subject: xmlpatterns autotest: make tests work from shadow directory ... by prepending SRCDIR to the loaded files. Reviewed-by: TrustMe --- tests/auto/xmlpatterns/tst_xmlpatterns.cpp | 134 ++++++++++++++--------------- tests/auto/xmlpatterns/xmlpatterns.pro | 6 ++ 2 files changed, 73 insertions(+), 67 deletions(-) diff --git a/tests/auto/xmlpatterns/tst_xmlpatterns.cpp b/tests/auto/xmlpatterns/tst_xmlpatterns.cpp index 2069d03..26dc280 100644 --- a/tests/auto/xmlpatterns/tst_xmlpatterns.cpp +++ b/tests/auto/xmlpatterns/tst_xmlpatterns.cpp @@ -154,7 +154,7 @@ void tst_XmlPatterns::xquerySupport() const QByteArray rawProducedStderr((process.readAllStandardError())); const QString fixedStderr(QString::fromLocal8Bit(rawProducedStderr).remove(m_filenameInStderr)); - const QString errorFileName(inputFile(QLatin1String("stderrBaselines/") + + const QString errorFileName(inputFile(QLatin1String(SRCDIR "stderrBaselines/") + QString::fromUtf8(QTest::currentDataTag()).remove(m_normalizeTestName) + QLatin1String(".txt"))); @@ -221,7 +221,7 @@ void tst_XmlPatterns::xquerySupport_data() const #endif /* Check one file for existence, to avoid possible false positives. */ - QVERIFY(QFile::exists(inputFile(QLatin1String("queries/onePlusOne.xq")))); + QVERIFY(QFile::exists(inputFile(QLatin1String(SRCDIR "queries/onePlusOne.xq")))); QTest::addColumn("expectedExitCode"); QTest::addColumn("expectedQueryOutput"); @@ -232,21 +232,21 @@ void tst_XmlPatterns::xquerySupport_data() const QTest::newRow("A simple math query") << 0 << QByteArray("2\n") - << QStringList((QLatin1String("queries/onePlusOne.xq"))) + << QStringList((QLatin1String(SRCDIR "queries/onePlusOne.xq"))) << QString() << QString(); QTest::newRow("An unbound external variable") << 2 << QByteArray() - << QStringList(QLatin1String("queries/externalVariable.xq")) + << QStringList(QLatin1String(SRCDIR "queries/externalVariable.xq")) << QString() << QString(); QTest::newRow("Bind an external variable") << 0 << QByteArray("1 41true\n") - << (QStringList() << QLatin1String("queries/externalVariable.xq") + << (QStringList() << QLatin1String(SRCDIR "queries/externalVariable.xq") << QLatin1String("-param") << QLatin1String("externalVariable=1")) << QString() @@ -257,21 +257,21 @@ void tst_XmlPatterns::xquerySupport_data() const << QByteArray("1 41true\n") << (QStringList() << QLatin1String("-param") << QLatin1String("externalVariable=1") - << QLatin1String("queries/externalVariable.xq")) + << QLatin1String(SRCDIR "queries/externalVariable.xq")) << QString() << QString(); QTest::newRow("Use fn:doc") << 0 << QByteArray("\n \n \n text text node\n") - << QStringList(QLatin1String("queries/openDocument.xq")) + << QStringList(QLatin1String(SRCDIR "queries/openDocument.xq")) << QString() << QString(); QTest::newRow("Use fn:doc, together with -no-format, last") << 0 << QByteArray("text text node") - << (QStringList() << QLatin1String("queries/openDocument.xq") + << (QStringList() << QLatin1String(SRCDIR "queries/openDocument.xq") << QLatin1String("-no-format")) << QString() << QString(); @@ -280,7 +280,7 @@ void tst_XmlPatterns::xquerySupport_data() const << 0 << QByteArray("text text node") << (QStringList() << QLatin1String("-no-format") - << QLatin1String("queries/openDocument.xq")) + << QLatin1String(SRCDIR "queries/openDocument.xq")) << QString() << QString(); @@ -288,28 +288,28 @@ void tst_XmlPatterns::xquerySupport_data() const QTest::newRow("Make sure query paths are resolved against CWD, not the location of the executable.") << 0 << QByteArray("2\n") - << QStringList(QLatin1String("onePlusOne.xq")) + << QStringList(QLatin1String(SRCDIR "queries/onePlusOne.xq")) << QString::fromLatin1("queries") << QString(); QTest::newRow("Call fn:error()") << 2 << QByteArray() - << QStringList(QLatin1String("queries/errorFunction.xq")) + << QStringList(QLatin1String(SRCDIR "queries/errorFunction.xq")) << QString() << QString(); QTest::newRow("Evaluate a library module") << 2 << QByteArray() - << QStringList(QLatin1String("queries/simpleLibraryModule.xq")) + << QStringList(QLatin1String(SRCDIR "queries/simpleLibraryModule.xq")) << QString() << QString(); QTest::newRow("Trigger a static error.") << 2 << QByteArray() - << QStringList(QLatin1String("queries/staticError.xq")) + << QStringList(QLatin1String(SRCDIR "queries/staticError.xq")) << QString() << QString(); @@ -323,7 +323,7 @@ void tst_XmlPatterns::xquerySupport_data() const QTest::newRow("Open an nonexistent file") << 2 << QByteArray() - << QStringList(QLatin1String("queries/ThisFileDoesNotExist.xq")) + << QStringList(QLatin1String(SRCDIR "queries/ThisFileDoesNotExist.xq")) << QString() << QString(); @@ -332,63 +332,63 @@ void tst_XmlPatterns::xquerySupport_data() const QTest::newRow("XQuery-function message markups") << 2 << QByteArray() - << QStringList(QLatin1String("queries/wrongArity.xq")) + << QStringList(QLatin1String(SRCDIR "queries/wrongArity.xq")) << QString() << QString(); QTest::newRow("XQuery-type message markups") << 2 << QByteArray() - << QStringList(QLatin1String("queries/typeError.xq")) + << QStringList(QLatin1String(SRCDIR "queries/typeError.xq")) << QString() << QString(); QTest::newRow("XQuery-data & XQuery-keyword message markups") << 2 << QByteArray() - << QStringList(QLatin1String("queries/zeroDivision.xq")) + << QStringList(QLatin1String(SRCDIR "queries/zeroDivision.xq")) << QString() << QString(); QTest::newRow("XQuery-uri message markups") << 2 << QByteArray() - << QStringList(QLatin1String("queries/unsupportedCollation.xq")) + << QStringList(QLatin1String(SRCDIR "queries/unsupportedCollation.xq")) << QString() << QString(); QTest::newRow("XQuery-expression message markups") << 2 << QByteArray() - << QStringList(QLatin1String("queries/invalidRegexp.xq")) + << QStringList(QLatin1String(SRCDIR "queries/invalidRegexp.xq")) << QString() << QString(); QTest::newRow("Print a list of available regexp flags(The available flags are formatted in a complex way.)") << 2 << QByteArray() - << QStringList(QLatin1String("queries/invalidRegexpFlag.xq")) + << QStringList(QLatin1String(SRCDIR "queries/invalidRegexpFlag.xq")) << QString() << QString(); QTest::newRow("Trigger an assert in QPatternist::ColorOutput. The query naturally contains an error; XPTY0004.") << 2 << QByteArray() - << QStringList(QLatin1String("queries/flwor.xq")) + << QStringList(QLatin1String(SRCDIR "queries/flwor.xq")) << QString() << QString(); QTest::newRow("Trigger a second assert in QPatternist::ColorOutput. The query naturally contains XPST0003.") << 2 << QByteArray() - << QStringList(QLatin1String("queries/syntaxError.xq")) + << QStringList(QLatin1String(SRCDIR "queries/syntaxError.xq")) << QString() << QString(); QTest::newRow("-param is missing so multiple queries appear") << 2 << QByteArray() - << (QStringList() << QLatin1String("queries/reportGlobals.xq") + << (QStringList() << QLatin1String(SRCDIR "queries/reportGlobals.xq") << QLatin1String("fileToOpen=globals.gccxml")) << QString() << QString(); @@ -403,7 +403,7 @@ void tst_XmlPatterns::xquerySupport_data() const QTest::newRow("Basic use of -output, query first") << 0 << QByteArray("2\n") - << (QStringList() << QLatin1String("queries/onePlusOne.xq") + << (QStringList() << QLatin1String(SRCDIR "queries/onePlusOne.xq") << QLatin1String("-output") << QLatin1String("basicOutput.out")) << QString() @@ -414,22 +414,22 @@ void tst_XmlPatterns::xquerySupport_data() const << QByteArray("\n") << (QStringList() << QLatin1String("-output") << QLatin1String("basicOutput2.out") - << QLatin1String("queries/oneElement.xq")) + << QLatin1String(SRCDIR "queries/oneElement.xq")) << QString() << QString::fromLatin1("basicOutput2.out"); QTest::newRow("A single query, that does not exist") << 2 << QByteArray() - << (QStringList() << QLatin1String("doesNotExist.xq")) + << (QStringList() << QLatin1String(SRCDIR "doesNotExist.xq")) << QString() << QString(); QTest::newRow("Specify two identical query names") << 2 << QByteArray() - << (QStringList() << QLatin1String("query.xq") - << QLatin1String("query.xq")) + << (QStringList() << QLatin1String(SRCDIR "query.xq") + << QLatin1String(SRCDIR "query.xq")) << QString() << QString(); @@ -459,7 +459,7 @@ void tst_XmlPatterns::xquerySupport_data() const << QByteArray() << (QStringList() << QLatin1String("-output") << filename - << QLatin1String("queries/onePlusOne.xq")) + << QLatin1String(SRCDIR "queries/onePlusOne.xq")) << QString() << filename; } @@ -476,7 +476,7 @@ void tst_XmlPatterns::xquerySupport_data() const << QByteArray("2\n") << (QStringList() << QLatin1String("-output") << outName - << QLatin1String("queries/onePlusOne.xq")) + << QLatin1String(SRCDIR "queries/onePlusOne.xq")) << QString() << outName; } @@ -484,7 +484,7 @@ void tst_XmlPatterns::xquerySupport_data() const QTest::newRow("one query, and a terminating dash at the end") << 0 << QByteArray("2\n") - << (QStringList() << QLatin1String("queries/onePlusOne.xq") + << (QStringList() << QLatin1String(SRCDIR "queries/onePlusOne.xq") << QLatin1String("-")) << QString() << QString(); @@ -493,7 +493,7 @@ void tst_XmlPatterns::xquerySupport_data() const << 0 << QByteArray("2\n") << (QStringList() << QLatin1String("-") - << QLatin1String("queries/onePlusOne.xq")) + << QLatin1String(SRCDIR "queries/onePlusOne.xq")) << QString() << QString(); @@ -580,21 +580,21 @@ void tst_XmlPatterns::xquerySupport_data() const QTest::newRow("Run a query which evaluates to the empty sequence.") << 0 << QByteArray("\n") - << (QStringList() << QLatin1String("queries/emptySequence.xq")) + << (QStringList() << QLatin1String(SRCDIR "queries/emptySequence.xq")) << QString() << QString(); QTest::newRow("Run a query which evaluates to a single document node with no children.") << 0 << QByteArray("\n") - << (QStringList() << QLatin1String("queries/onlyDocumentNode.xq")) + << (QStringList() << QLatin1String(SRCDIR "queries/onlyDocumentNode.xq")) << QString() << QString(); QTest::newRow("Invoke with invalid -param value.") << 1 << QByteArray() - << (QStringList() << QLatin1String("queries/externalVariable.xq") + << (QStringList() << QLatin1String(SRCDIR "queries/externalVariable.xq") << QLatin1String("-param") << QLatin1String("EqualSignIsMissing")) << QString() @@ -603,7 +603,7 @@ void tst_XmlPatterns::xquerySupport_data() const QTest::newRow("Invoke with colon in variable name.") << 1 << QByteArray() - << (QStringList() << QLatin1String("queries/externalVariable.xq") + << (QStringList() << QLatin1String(SRCDIR "queries/externalVariable.xq") << QLatin1String("-param") << QLatin1String("xs:name=value")) << QString() @@ -612,7 +612,7 @@ void tst_XmlPatterns::xquerySupport_data() const QTest::newRow("Invoke with missing name in -param arg.") << 1 << QByteArray() - << (QStringList() << QLatin1String("queries/externalVariable.xq") + << (QStringList() << QLatin1String(SRCDIR "queries/externalVariable.xq") << QLatin1String("-param") << QLatin1String("=value")) << QString() @@ -621,7 +621,7 @@ void tst_XmlPatterns::xquerySupport_data() const QTest::newRow("Invoke with -param that has two adjacent equal signs.") << 0 << QByteArray("START =text END\n") - << (QStringList() << QLatin1String("queries/externalStringVariable.xq") + << (QStringList() << QLatin1String(SRCDIR "queries/externalStringVariable.xq") << QLatin1String("-param") << QLatin1String("externalString==text")) << QString() @@ -630,7 +630,7 @@ void tst_XmlPatterns::xquerySupport_data() const QTest::newRow("Pass in an external variable, but the query doesn't use it.") << 0 << QByteArray("2\n") - << (QStringList() << QLatin1String("queries/onePlusOne.xq") + << (QStringList() << QLatin1String(SRCDIR "queries/onePlusOne.xq") << QLatin1String("-param") << QLatin1String("externalString==text")) << QString() @@ -640,7 +640,7 @@ void tst_XmlPatterns::xquerySupport_data() const QTest::newRow("Invoke with -param that has no value.") << 0 << QByteArray("START END\n") - << (QStringList() << QLatin1String("queries/externalStringVariable.xq") + << (QStringList() << QLatin1String(SRCDIR "queries/externalStringVariable.xq") << QLatin1String("-param") << QLatin1String("externalString=")) << QString() @@ -656,7 +656,7 @@ void tst_XmlPatterns::xquerySupport_data() const QTest::newRow("Use a native path") << 0 << QByteArray("2\n") - << (QStringList() << QDir::toNativeSeparators(QLatin1String("queries/onePlusOne.xq"))) + << (QStringList() << QDir::toNativeSeparators(QLatin1String(SRCDIR "queries/onePlusOne.xq"))) << QString() << QString(); @@ -671,8 +671,8 @@ void tst_XmlPatterns::xquerySupport_data() const QTest::newRow("A valid, existing query, followed by a bogus one") << 1 << QByteArray() - << (QStringList() << QLatin1String("queries/onePlusOne.xq") - << QLatin1String("doesNotExist.xq")) + << (QStringList() << QLatin1String(SRCDIR "queries/onePlusOne.xq") + << QLatin1String(SRCDIR "doesNotExist.xq")) << QString() << QString(); */ @@ -681,8 +681,8 @@ void tst_XmlPatterns::xquerySupport_data() const QTest::newRow("Specify two different query names") << 1 << QByteArray() - << (QStringList() << QLatin1String("query1.xq") - << QLatin1String("query2.xq")) + << (QStringList() << QLatin1String(SRCDIR "query1.xq") + << QLatin1String(SRCDIR "query2.xq")) << QString() << QString(); */ @@ -696,7 +696,7 @@ void tst_XmlPatterns::xquerySupport_data() const QTest::newRow("Use -param twice") << 0 << QByteArray("param1 param2\n") - << (QStringList() << QLatin1String("queries/twoVariables.xq") + << (QStringList() << QLatin1String(SRCDIR "queries/twoVariables.xq") << QLatin1String("-param") << QLatin1String("var1=param1") << QLatin1String("-param") @@ -707,7 +707,7 @@ void tst_XmlPatterns::xquerySupport_data() const QTest::newRow("Use -param thrice") << 0 << QByteArray("param1 param2 third\n") - << (QStringList() << QLatin1String("queries/threeVariables.xq") + << (QStringList() << QLatin1String(SRCDIR "queries/threeVariables.xq") << QLatin1String("-param") << QLatin1String("var1=param1") << QLatin1String("-param") @@ -720,7 +720,7 @@ void tst_XmlPatterns::xquerySupport_data() const QTest::newRow("Specify the same parameter twice, different values") << 1 << QByteArray() - << (QStringList() << QLatin1String("queries/onePlusOne.xq") + << (QStringList() << QLatin1String(SRCDIR "queries/onePlusOne.xq") << QLatin1String("-param") << QLatin1String("duplicated=param1") << QLatin1String("-param") @@ -731,7 +731,7 @@ void tst_XmlPatterns::xquerySupport_data() const QTest::newRow("Specify the same parameter twice, same values") << 1 << QByteArray() - << (QStringList() << QLatin1String("queries/onePlusOne.xq") + << (QStringList() << QLatin1String(SRCDIR "queries/onePlusOne.xq") << QLatin1String("-param") << QLatin1String("duplicated=param1") << QLatin1String("-param") @@ -742,7 +742,7 @@ void tst_XmlPatterns::xquerySupport_data() const QTest::newRow("Open a non-existing collection.") << 2 << QByteArray() - << (QStringList() << QLatin1String("queries/nonexistingCollection.xq")) + << (QStringList() << QLatin1String(SRCDIR "queries/nonexistingCollection.xq")) << QString() << QString(); @@ -804,7 +804,7 @@ void tst_XmlPatterns::stdoutFailure() const //process.setStandardOutputFile(outName); process.setWorkingDirectory(QDir::current().absoluteFilePath(QString())); - process.start(m_command, QStringList("queries/onePlusOne.xq")); + process.start(m_command, QStringList(SRCDIR "queries/onePlusOne.xq")); QCOMPARE(process.exitStatus(), QProcess::NormalExit); QVERIFY(process.waitForFinished()); @@ -865,8 +865,8 @@ void tst_XmlPatterns::xsltSupport_data() const QTest::newRow("Pass in a stylesheet file which contains an XQuery query") << 2 << QByteArray() - << (QStringList() << QLatin1String("stylesheets/queryAsStylesheet.xsl") - << QLatin1String("queries/simpleDocument.xml")) + << (QStringList() << QLatin1String(SRCDIR "stylesheets/queryAsStylesheet.xsl") + << QLatin1String(SRCDIR "queries/simpleDocument.xml")) << QString() << QString(); @@ -883,7 +883,7 @@ void tst_XmlPatterns::xsltSupport_data() const << QByteArray() << (QStringList() << QLatin1String("-initial-template") << QLatin1String("name") - << QLatin1String("queries/onePlusOne.xq")) + << QLatin1String(SRCDIR "queries/onePlusOne.xq")) << QString() << QString(); @@ -918,8 +918,8 @@ void tst_XmlPatterns::xsltSupport_data() const << (QStringList() << QLatin1String("-no-format") << QLatin1String("-initial-template") << QLatin1String("main") - << QLatin1String("stylesheets/namedAndRootTemplate.xsl") - << QLatin1String("stylesheets/documentElement.xml")) + << QLatin1String(SRCDIR "stylesheets/namedAndRootTemplate.xsl") + << QLatin1String(SRCDIR "stylesheets/documentElement.xml")) << QString() << QString(); @@ -929,8 +929,8 @@ void tst_XmlPatterns::xsltSupport_data() const << (QStringList() << QLatin1String("-no-format") << QLatin1String("-initial-template") << QLatin1String("no-template-by-this-name") - << QLatin1String("stylesheets/namedAndRootTemplate.xsl") - << QLatin1String("stylesheets/documentElement.xml")) + << QLatin1String(SRCDIR "stylesheets/namedAndRootTemplate.xsl") + << QLatin1String(SRCDIR "stylesheets/documentElement.xml")) << QString() << QString(); @@ -940,7 +940,7 @@ void tst_XmlPatterns::xsltSupport_data() const << (QStringList() << QLatin1String("-no-format") << QLatin1String("-initial-template") << QLatin1String("main") - << QLatin1String("stylesheets/namedAndRootTemplate.xsl")) + << QLatin1String(SRCDIR "stylesheets/namedAndRootTemplate.xsl")) << QString() << QString(); @@ -950,7 +950,7 @@ void tst_XmlPatterns::xsltSupport_data() const << (QStringList() << QLatin1String("-no-format") << QLatin1String("-initial-template") << QLatin1String("{http://example.com/NS}main") - << QLatin1String("stylesheets/namedAndRootTemplate.xsl")) + << QLatin1String(SRCDIR "stylesheets/namedAndRootTemplate.xsl")) << QString() << QString(); @@ -959,7 +959,7 @@ void tst_XmlPatterns::xsltSupport_data() const << QByteArray("defParam overridedDefaultedParam implicitlyRequiredValue\n") << (QStringList() << QLatin1String("-initial-template") << QLatin1String("main") - << QLatin1String("stylesheets/useParameters.xsl") + << QLatin1String(SRCDIR "stylesheets/useParameters.xsl") << QLatin1String("-param") << QLatin1String("overridedDefaultedParam=overridedDefaultedParam") << QLatin1String("-param") @@ -970,24 +970,24 @@ void tst_XmlPatterns::xsltSupport_data() const QTest::newRow("Use a simplified stylesheet module") << 0 << QByteArray("some text\n") - << (QStringList() << QLatin1String("stylesheets/simplifiedStylesheetModule.xsl") - << QLatin1String("stylesheets/simplifiedStylesheetModule.xml")) + << (QStringList() << QLatin1String(SRCDIR "stylesheets/simplifiedStylesheetModule.xsl") + << QLatin1String(SRCDIR "stylesheets/simplifiedStylesheetModule.xml")) << QString() << QString(); QTest::newRow("Not well-formed stylesheet, causes crash in coloring code.") << 2 << QByteArray() - << (QStringList() << QLatin1String("stylesheets/notWellformed.xsl") - << QLatin1String("queries/simpleDocument.xml")) + << (QStringList() << QLatin1String(SRCDIR "stylesheets/notWellformed.xsl") + << QLatin1String(SRCDIR "queries/simpleDocument.xml")) << QString() << QString(); QTest::newRow("Not well-formed instance document, causes crash in coloring code.") << 2 << QByteArray() - << (QStringList() << QLatin1String("stylesheets/bool070.xsl") - << QLatin1String("stylesheets/bool070.xml")) + << (QStringList() << QLatin1String(SRCDIR "stylesheets/bool070.xsl") + << QLatin1String(SRCDIR "stylesheets/bool070.xml")) << QString() << QString(); diff --git a/tests/auto/xmlpatterns/xmlpatterns.pro b/tests/auto/xmlpatterns/xmlpatterns.pro index 569e23f..01e3b2b 100644 --- a/tests/auto/xmlpatterns/xmlpatterns.pro +++ b/tests/auto/xmlpatterns/xmlpatterns.pro @@ -2,4 +2,10 @@ load(qttest_p4) SOURCES += tst_xmlpatterns.cpp \ ../qxmlquery/TestFundament.cpp +!wince* { +DEFINES += SRCDIR=\\\"$$PWD/\\\" +} else { +DEFINES += SRCDIR=\\\"./\\\" +} + include (../xmlpatterns.pri) -- cgit v0.12 From 93c883b5388a5ed6e9dbd01ca6b314163576ede5 Mon Sep 17 00:00:00 2001 From: Leonardo Sobral Cunha Date: Wed, 5 Aug 2009 17:49:23 +0200 Subject: Refactors QGraphicsItemGroup::addToGroup to use QGraphicsItem::itemTransform This does not change the behavior of the method. Reviewed-by: andreas --- src/gui/graphicsview/qgraphicsitem.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/gui/graphicsview/qgraphicsitem.cpp b/src/gui/graphicsview/qgraphicsitem.cpp index beaf42b..8d9a1f8 100644 --- a/src/gui/graphicsview/qgraphicsitem.cpp +++ b/src/gui/graphicsview/qgraphicsitem.cpp @@ -9837,20 +9837,25 @@ void QGraphicsItemGroup::addToGroup(QGraphicsItem *item) } // COMBINE - // ### Use itemTransform() instead. - QTransform oldSceneMatrix = item->sceneTransform(); + bool ok; + QTransform itemTransform = item->itemTransform(this, &ok); + + if (!ok) { + qWarning("QGraphicsItemGroup::addToGroup: could not find a valid transformation from item to group coordinates"); + return; + } + + QTransform newItemTransform(itemTransform); item->setPos(mapFromItem(item, 0, 0)); item->setParentItem(this); - QTransform newItemTransform(oldSceneMatrix); - newItemTransform *= sceneTransform().inverted(); + + // removing position from translation component of the new transform if (!item->pos().isNull()) newItemTransform *= QTransform::fromTranslate(-item->x(), -item->y()); + item->setTransform(newItemTransform); item->d_func()->setIsMemberOfGroup(true); prepareGeometryChange(); - QTransform itemTransform(item->transform()); - if (!item->pos().isNull()) - itemTransform *= QTransform::fromTranslate(item->x(), item->y()); d->itemsBoundingRect |= itemTransform.mapRect(item->boundingRect() | item->childrenBoundingRect()); update(); } -- cgit v0.12 From 8c621378e79a417fc7512691bf07023c1496aac0 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Fri, 7 Aug 2009 09:58:29 +0200 Subject: Fixes: QComboBox keyboard search not working properly when current index is -1 If the current index is invalid, start would be (0,0) but would be skiped Task-number: 220195 Reviewed-by: thierry --- src/gui/itemviews/qabstractitemview.cpp | 2 +- tests/auto/qcombobox/tst_qcombobox.cpp | 36 +++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/gui/itemviews/qabstractitemview.cpp b/src/gui/itemviews/qabstractitemview.cpp index d929590..421d511 100644 --- a/src/gui/itemviews/qabstractitemview.cpp +++ b/src/gui/itemviews/qabstractitemview.cpp @@ -2650,7 +2650,7 @@ void QAbstractItemView::keyboardSearch(const QString &search) if (search.isEmpty() || (d->keyboardInputTime.msecsTo(now) > QApplication::keyboardInputInterval())) { d->keyboardInput = search; - skipRow = true; + skipRow = currentIndex().isValid(); //if it is not valid we should really start at QModelIndex(0,0) } else { d->keyboardInput += search; } diff --git a/tests/auto/qcombobox/tst_qcombobox.cpp b/tests/auto/qcombobox/tst_qcombobox.cpp index bd11fa4..4797698 100644 --- a/tests/auto/qcombobox/tst_qcombobox.cpp +++ b/tests/auto/qcombobox/tst_qcombobox.cpp @@ -139,6 +139,7 @@ private slots: void task190205_setModelAdjustToContents(); void task248169_popupWithMinimalSize(); void task247863_keyBoardSelection(); + void task220195_keyBoardSelection2(); void setModelColumn(); void noScrollbar_data(); void noScrollbar(); @@ -2138,6 +2139,40 @@ void tst_QComboBox::task247863_keyBoardSelection() QCOMPARE(spy.count(), 1); } +void tst_QComboBox::task220195_keyBoardSelection2() +{ + QComboBox combo; + combo.setEditable(false); + combo.addItem( QLatin1String("foo1")); + combo.addItem( QLatin1String("foo2")); + combo.addItem( QLatin1String("foo3")); + combo.show(); + QApplication::setActiveWindow(&combo); + QTest::qWait(100); + + combo.setCurrentIndex(-1); + QVERIFY(combo.currentText().isNull()); + + QTest::keyClick(&combo, 'f'); + QCOMPARE(combo.currentText(), QLatin1String("foo1")); + QTest::qWait(QApplication::keyboardInputInterval() + 30); + QTest::keyClick(&combo, 'f'); + QCOMPARE(combo.currentText(), QLatin1String("foo2")); + QTest::qWait(QApplication::keyboardInputInterval() + 30); + QTest::keyClick(&combo, 'f'); + QCOMPARE(combo.currentText(), QLatin1String("foo3")); + QTest::qWait(QApplication::keyboardInputInterval() + 30); + QTest::keyClick(&combo, 'f'); + QCOMPARE(combo.currentText(), QLatin1String("foo1")); + QTest::qWait(QApplication::keyboardInputInterval() + 30); + + combo.setCurrentIndex(1); + QCOMPARE(combo.currentText(), QLatin1String("foo2")); + QTest::keyClick(&combo, 'f'); + QCOMPARE(combo.currentText(), QLatin1String("foo3")); +} + + void tst_QComboBox::setModelColumn() { QStandardItemModel model(5,3); @@ -2238,5 +2273,6 @@ void tst_QComboBox::task253944_itemDelegateIsReset() QCOMPARE(comboBox.itemDelegate(), itemDelegate); } + QTEST_MAIN(tst_QComboBox) #include "tst_qcombobox.moc" -- cgit v0.12 From 490f135caa35831646dac7e00f1c9422cb09aca9 Mon Sep 17 00:00:00 2001 From: Geir Vattekar Date: Fri, 7 Aug 2009 11:37:33 +0200 Subject: Doc: Integrated the Rogue (state machine) example. Reviewed-by: Kent Hansen --- demos/qtdemo/xml/examples.xml | 1 + doc/src/examples.qdoc | 1 + doc/src/examples/rogue.qdoc | 222 +++++++++++++++++++++++ doc/src/images/rogue-example.png | Bin 0 -> 10364 bytes doc/src/images/rogue-statechart.png | Bin 0 -> 2490 bytes examples/statemachine/rogue/main.cpp | 55 ++++++ examples/statemachine/rogue/movementtransition.h | 108 +++++++++++ examples/statemachine/rogue/rogue.pro | 11 ++ examples/statemachine/rogue/window.cpp | 201 ++++++++++++++++++++ examples/statemachine/rogue/window.h | 89 +++++++++ examples/statemachine/statemachine.pro | 1 + 11 files changed, 689 insertions(+) create mode 100644 doc/src/examples/rogue.qdoc create mode 100644 doc/src/images/rogue-example.png create mode 100644 doc/src/images/rogue-statechart.png create mode 100644 examples/statemachine/rogue/main.cpp create mode 100644 examples/statemachine/rogue/movementtransition.h create mode 100644 examples/statemachine/rogue/rogue.pro create mode 100644 examples/statemachine/rogue/window.cpp create mode 100644 examples/statemachine/rogue/window.h diff --git a/demos/qtdemo/xml/examples.xml b/demos/qtdemo/xml/examples.xml index 1b0b533..6c8ddb0 100644 --- a/demos/qtdemo/xml/examples.xml +++ b/demos/qtdemo/xml/examples.xml @@ -183,6 +183,7 @@ + diff --git a/doc/src/examples.qdoc b/doc/src/examples.qdoc index 74a9bd8..7f9264b 100644 --- a/doc/src/examples.qdoc +++ b/doc/src/examples.qdoc @@ -330,6 +330,7 @@ \o \l{statemachine/eventtransitions}{Event Transitions}\raisedaster \o \l{statemachine/factorial}{Factorial States}\raisedaster \o \l{statemachine/pingpong}{Ping Pong States}\raisedaster + \o \l{statemachine/rogue}{Rogue}\raisedaster \o \l{statemachine/trafficlight}{Traffic Light}\raisedaster \o \l{statemachine/twowaybutton}{Two-way Button}\raisedaster \endlist diff --git a/doc/src/examples/rogue.qdoc b/doc/src/examples/rogue.qdoc new file mode 100644 index 0000000..8fa2c69 --- /dev/null +++ b/doc/src/examples/rogue.qdoc @@ -0,0 +1,222 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \example statemachine/rogue + \title Rogue Example + + The Rogue example shows how to use the Qt state machine for event + handling. + + \image rogue-example.png + + This example implements a simple text based game. Do you see the + \c{@} in the screenshot? That's you, the rogue. The \c{#} + characters are walls, and the dots represent floor. In a real + game, other ASCII characters would represent all kinds of objects + and creatures. For instance, ancient dragons (\c{D}'s) or food + rations (\c{%}'s). But let's not get carried away. In this game, + the rogue is simply running around in an empty room. + + The rogue is moved with the keypad (2, 4, 8, 6). That aside, we + have implemented a \c quit command that triggers if the player + types \c {q}. The player is then asked if he/she really wants to + quit. + + Most games have commands that need more than one key press and + that may require a different sequence of keys based on questions + asked the user. In this game, only the \c quit command falls under + this category, but for the sake of argument, let's imagine a + fully-fledged game with a rich set of commands. If we were to + implement these by catching key events in + \l{QWidget::}{keyPressEvent()}, we would have to keep a lot of + class member variables to track the sequence of keys already typed + (or find some other way of deducing the current state of a + command). This can easily lead to spaghetti, which is--as we all + well know, I'm sure--unpleasant. With a state machine, on the + other hand, separate states can wait for a single key press, and + that makes our lives a lot simpler. + + The example consists of two classes: + + \list + \o \c Window draws the text display of the game and sets + up the state machine. The window also has a status bar + above the area in which the rouge moves. + \o \c MovementTransition is a transition that carries out + a single move of the rogue. + \endlist + + Before we embark on a code walkthrough, it is necessary to take a + closer look at the design of the machine. Here is a state chart + that shows what we want to achieve: + + \image rogue-statechart.png + + The input state waits for a key press to start a new command. + When receiving a key it recognizes, it transitions to one of the + two commands of the game; though, as we will see, movement is + handled by the transition itself. The quit state waits for the + player to answer yes or no (by typing \c y or \c n) when asked + whether he/she really wants to quit the game. + + The chart demonstrates how we use one state to wait for a single + key press. The press received may trigger one of the transitions + connected to the state. + + \section1 Window Class Definition + + The \c Window class is a widget that draws the text display of the + game. It also sets up the state machine, i.e., creates and + connects the states in the machine. It is the key events from this + widget that are used by the machine. + + \snippet examples/statemachine/rogue/window.h 0 + + \c Direction specifies the direction in which the rogue is to + move. We use this in \c movePlayer(), which moves the rogue and + repaints the window. The game has a status line above the area in + which the rogue moves. The \c status property contains the text of + this line. We use a property because the QState class allows + setting any Qt \l{Qt's Property System}{property} when entered. + More on this later. + + \snippet examples/statemachine/rogue/window.h 1 + + The \c map is an array with the characters that are currently + displayed. We set up the array in \c setupMap(), and update it + when the rogue is moved. \c pX and \c pY is the current position + of the rogue. \c WIDTH and \c HEIGHT are macros specifying the + dimensions of the map. + + The \c paintEvent() function is left out of this walkthrough. We + also do not discuss other code that does not concern the state + machine (the \c setupMap(), \c status(), \c setStatus(), \c + movePlayer(), and \c sizeHint() functions). If you wish to take a + look at the code, click on the link for the \c window.cpp file at + the top of this page. + + \section1 Window Class Implementation + + Here is the constructor of \c Window: + + \snippet examples/statemachine/rogue/window.cpp 0 + \dots + \snippet examples/statemachine/rogue/window.cpp 1 + + The player starts off at position (5, 5). We then set up the map + and statemachine. Let's proceed with the \c buildMachine() + function: + + \snippet examples/statemachine/rogue/window.cpp 2 + + We enter \c inputState when the machine is started and from the \c + quitState if the user wants to continue playing. We then set the + status to a helpful reminder of how to play the game. + + First, the \c Movement transition is added to the input state. + This will enable the rogue to be moved with the keypad. Notice + that we don't set a target state for the movement transition. This + will cause the transition to be triggered (and the + \l{QAbstractTransition::}{onTransition()} function to be invoked), + but the machine will not leave the \c inputState. If we had set \c + inputState as the target state, we would first have left and then + entered the \c inputState again. + + \snippet examples/statemachine/rogue/window.cpp 3 + + When we enter \c quitState, we update the status bar of the + window. + + \c QKeyEventTransition is a utility class that removes the hassle + of implementing transitions for \l{QKeyEvent}s. We simply need to + specify the key on which the transition should trigger and the + target state of the transition. + + \snippet examples/statemachine/rogue/window.cpp 4 + + The transition from \c inputState allows triggering the quit state + when the player types \c {q}. + + \snippet examples/statemachine/rogue/window.cpp 5 + + The machine is set up, so it's time to start it. + + \section1 The MovementTransition Class + + \c MovementTransition is triggered when the player request the + rogue to be moved (by typing 2, 4, 6, or 8) when the machine is in + the \c inputState. + + \snippet examples/statemachine/rogue/movementtransition.h 0 + + In the constructor, we tell QEventTransition to only send + \l{QEvent::}{KeyPress} events to the + \l{QAbstractTransition::}{eventTest()} function: + + \snippet examples/statemachine/rogue/movementtransition.h 1 + + The KeyPress events come wrapped in \l{QWrappedEvent}s. \c event + must be confirmed to be a wrapped event because Qt uses other + events internally. After that, it is simply a matter of checking + which key has been pressed. + + Let's move on to the \c onTransition() function: + + \snippet examples/statemachine/rogue/movementtransition.h 2 + + When \c onTransition() is invoked, we know that we have a + \l{QEvent::}{KeyPress} event with 2, 4, 6, or 8, i.e., the event + is already unwrapped. + + \section1 The Roguelike Tradition + + You might have been wondering why the game features a rogue. Well, + these kinds of text based dungeon exploration games date back to a + game called, yes, "Rogue". Although outflanked by the technology + of modern 3D computer games, roguelikes have a solid community of + hard-core, devoted followers. + + Playing these games can be surprisingly addictive (despite the + lack of graphics). Angband, the perhaps most well-known rougelike, + is found here: \l{http://rephial.org/}. +*/ + diff --git a/doc/src/images/rogue-example.png b/doc/src/images/rogue-example.png new file mode 100644 index 0000000..7aeb0e5 Binary files /dev/null and b/doc/src/images/rogue-example.png differ diff --git a/doc/src/images/rogue-statechart.png b/doc/src/images/rogue-statechart.png new file mode 100644 index 0000000..c5f4048 Binary files /dev/null and b/doc/src/images/rogue-statechart.png differ diff --git a/examples/statemachine/rogue/main.cpp b/examples/statemachine/rogue/main.cpp new file mode 100644 index 0000000..0c2fb2d --- /dev/null +++ b/examples/statemachine/rogue/main.cpp @@ -0,0 +1,55 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +#include "window.h" + +int main(int argv, char **args) +{ + QApplication app(argv, args); + + Window window; + window.show(); + + return app.exec(); +} + diff --git a/examples/statemachine/rogue/movementtransition.h b/examples/statemachine/rogue/movementtransition.h new file mode 100644 index 0000000..929077d --- /dev/null +++ b/examples/statemachine/rogue/movementtransition.h @@ -0,0 +1,108 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef MOVEMENTTRANSITION_H +#define MOVEMENTTRANSITION_H + +#include + +#include "window.h" + +//![0] +class MovementTransition : public QEventTransition +{ + Q_OBJECT + +public: + MovementTransition(Window *window) : + QEventTransition(window, QEvent::KeyPress) { + this->window = window; + } +//![0] + +//![1] +protected: + bool eventTest(QEvent *event) { + if (event->type() == QEvent::Wrapped && + static_cast(event)->event()->type() == QEvent::KeyPress) { + QEvent *wrappedEvent = static_cast(event)->event(); + + QKeyEvent *keyEvent = static_cast(wrappedEvent); + int key = keyEvent->key(); + + return key == Qt::Key_2 || key == Qt::Key_8 || key == Qt::Key_6 || + key == Qt::Key_4; + } + return false; + } +//![1] + +//![2] + void onTransition(QEvent *event) { + QKeyEvent *keyEvent = static_cast( + static_cast(event)->event()); + + int key = keyEvent->key(); + switch (key) { + case Qt::Key_4: + window->movePlayer(Window::Left); + break; + case Qt::Key_8: + window->movePlayer(Window::Up); + break; + case Qt::Key_6: + window->movePlayer(Window::Right); + break; + case Qt::Key_2: + window->movePlayer(Window::Down); + break; + default: + ; + } + } +//![2] + +private: + Window *window; +}; + +#endif + diff --git a/examples/statemachine/rogue/rogue.pro b/examples/statemachine/rogue/rogue.pro new file mode 100644 index 0000000..1571854 --- /dev/null +++ b/examples/statemachine/rogue/rogue.pro @@ -0,0 +1,11 @@ +HEADERS = window.h \ + movementtransition.h +SOURCES = main.cpp \ + window.cpp + +# install +target.path = $$[QT_INSTALL_EXAMPLES]/statemachine/rogue +sources.files = $$SOURCES $$HEADERS *.pro +sources.path = $$[QT_INSTALL_EXAMPLES]/statemachine/rogue +INSTALLS += target sources + diff --git a/examples/statemachine/rogue/window.cpp b/examples/statemachine/rogue/window.cpp new file mode 100644 index 0000000..39565a3 --- /dev/null +++ b/examples/statemachine/rogue/window.cpp @@ -0,0 +1,201 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +#include "window.h" +#include "movementtransition.h" + +//![0] +Window::Window() +{ + pX = 5; + pY = 5; +//![0] + + QFontDatabase database; + QFont font; + if (database.families().contains("Monospace")) + font = QFont("Monospace", 12); + else { + foreach (QString family, database.families()) { + if (database.isFixedPitch(family)) { + font = QFont(family, 12); + break; + } + } + } + setFont(font); + +//![1] + setupMap(); + buildMachine(); +} +//![1] + +void Window::setStatus(const QString &status) +{ + myStatus = status; + repaint(); +} + +QString Window::status() const +{ + return myStatus; +} + +void Window::paintEvent(QPaintEvent * /* event */) +{ + QFontMetrics metrics(font()); + QPainter painter(this); + int fontHeight = metrics.height(); + int fontWidth = metrics.width('X'); + int yPos = fontHeight; + int xPos; + + painter.fillRect(rect(), Qt::black); + painter.setPen(Qt::white); + + painter.drawText(QPoint(0, yPos), status()); + + for (int y = 0; y < HEIGHT; ++y) { + yPos += fontHeight; + xPos = 0; + + for (int x = 0; x < WIDTH; ++x) { + if (y == pY && x == pX) { + xPos += fontWidth; + continue; + } + + painter.drawText(QPoint(xPos, yPos), map[x][y]); + xPos += fontWidth; + } + } + painter.drawText(QPoint(pX * fontWidth, (pY + 2) * fontHeight), QChar('@')); +} + +QSize Window::sizeHint() const +{ + QFontMetrics metrics(font()); + + return QSize(metrics.width('X') * WIDTH, metrics.height() * (HEIGHT + 1)); +} + +//![2] +void Window::buildMachine() +{ + machine = new QStateMachine; + + QState *inputState = new QState(machine); + inputState->assignProperty(this, "status", "Move the rogue with 2, 4, 6, and 8"); + + MovementTransition *transition = new MovementTransition(this); + inputState->addTransition(transition); +//![2] + +//![3] + QState *quitState = new QState(machine); + quitState->assignProperty(this, "status", "Really quit(y/n)?"); + + QKeyEventTransition *yesTransition = new + QKeyEventTransition(this, QEvent::KeyPress, Qt::Key_Y); + yesTransition->setTargetState(new QFinalState(machine)); + quitState->addTransition(yesTransition); + + QKeyEventTransition *noTransition = + new QKeyEventTransition(this, QEvent::KeyPress, Qt::Key_N); + noTransition->setTargetState(inputState); + quitState->addTransition(noTransition); +//![3] + +//![4] + QKeyEventTransition *quitTransition = + new QKeyEventTransition(this, QEvent::KeyPress, Qt::Key_Q); + quitTransition->setTargetState(quitState); + inputState->addTransition(quitTransition); +//![4] + +//![5] + machine->setInitialState(inputState); + + connect(machine, SIGNAL(finished()), qApp, SLOT(quit())); + + machine->start(); +} +//![5] + +void Window::movePlayer(Direction direction) +{ + switch (direction) { + case Left: + if (map[pX - 1][pY] != '#') + --pX; + break; + case Right: + if (map[pX + 1][pY] != '#') + ++pX; + break; + case Up: + if (map[pX][pY - 1] != '#') + --pY; + break; + case Down: + if (map[pX][pY + 1] != '#') + ++pY; + break; + } + repaint(); +} + +void Window::setupMap() +{ + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + + for (int x = 0; x < WIDTH; ++x) + for (int y = 0; y < HEIGHT; ++y) { + if (x == 0 || x == WIDTH - 1 || y == 0 || y == HEIGHT - 1 || qrand() % 40 == 0) + map[x][y] = '#'; + else + map[x][y] = '.'; + } +} + diff --git a/examples/statemachine/rogue/window.h b/examples/statemachine/rogue/window.h new file mode 100644 index 0000000..bcd86bd --- /dev/null +++ b/examples/statemachine/rogue/window.h @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef WINDOW_H +#define WINDOW_H + +#include + +class QState; +class QStateMachine; +class QTransition; + +#define WIDTH 35 +#define HEIGHT 20 + +//![0] +class Window : public QWidget +{ + Q_OBJECT + Q_PROPERTY(QString status READ status WRITE setStatus) + +public: + enum Direction { Up, Down, Left, Right }; + + Window(); + + void movePlayer(Direction direction); + void setStatus(const QString &status); + QString status() const; + + QSize sizeHint() const; + +protected: + void paintEvent(QPaintEvent *event); +//![0] + +//![1] +private: + void buildMachine(); + void setupMap(); + + QChar map[WIDTH][HEIGHT]; + int pX, pY; + + QStateMachine *machine; + QString myStatus; +}; +//![1] + +#endif + diff --git a/examples/statemachine/statemachine.pro b/examples/statemachine/statemachine.pro index ea3e7a8..298c0ae 100644 --- a/examples/statemachine/statemachine.pro +++ b/examples/statemachine/statemachine.pro @@ -3,6 +3,7 @@ SUBDIRS = \ eventtransitions \ factorial \ pingpong \ + rogue \ trafficlight \ twowaybutton -- cgit v0.12 From 3c2b9047be4f4f835e59c13d5038b907c629451f Mon Sep 17 00:00:00 2001 From: Kent Hansen Date: Fri, 7 Aug 2009 14:01:11 +0200 Subject: adjust some ifdefs so they are easy to remove with a script In preparation of making the old QtScript back-end a separate package/solution. --- src/script/qscriptable.cpp | 4 ++-- src/script/qscriptable_p.h | 4 ++-- src/script/qscriptclassdata.cpp | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/script/qscriptable.cpp b/src/script/qscriptable.cpp index 5da9e95..94468de 100644 --- a/src/script/qscriptable.cpp +++ b/src/script/qscriptable.cpp @@ -39,10 +39,10 @@ ** ****************************************************************************/ -#ifndef QT_NO_QOBJECT - #include "qscriptable.h" +#ifndef QT_NO_QOBJECT + #ifndef QT_NO_SCRIPT #include "qscriptable_p.h" diff --git a/src/script/qscriptable_p.h b/src/script/qscriptable_p.h index 8ea65ed..1d297d9 100644 --- a/src/script/qscriptable_p.h +++ b/src/script/qscriptable_p.h @@ -55,7 +55,7 @@ // We mean it. // -#if !defined(QT_NO_QOBJECT) && !defined(QT_NO_SCRIPT) +#ifndef QT_NO_SCRIPT QT_BEGIN_NAMESPACE @@ -79,6 +79,6 @@ public: QT_END_NAMESPACE -#endif // QT_NO_QOBJECT && QT_NO_SCRIPT +#endif // QT_NO_SCRIPT #endif diff --git a/src/script/qscriptclassdata.cpp b/src/script/qscriptclassdata.cpp index 08e7220..576a519 100644 --- a/src/script/qscriptclassdata.cpp +++ b/src/script/qscriptclassdata.cpp @@ -114,4 +114,4 @@ QScriptClassDataIterator::~QScriptClassDataIterator() QT_END_NAMESPACE -#endif +#endif // QT_NO_SCRIPT -- cgit v0.12 From f37b4ab8c8116abc2f71128e308b938c90ec5b8a Mon Sep 17 00:00:00 2001 From: Thierry Bastian Date: Fri, 7 Aug 2009 14:01:26 +0200 Subject: QDockWidget: Make visibilityChanged more accurate Task-number: 258459 --- src/gui/widgets/qdockarealayout.cpp | 2 +- src/gui/widgets/qdockwidget.cpp | 2 +- tests/auto/qdockwidget/tst_qdockwidget.cpp | 19 ++++++++++++++++++- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/gui/widgets/qdockarealayout.cpp b/src/gui/widgets/qdockarealayout.cpp index ee29b55..cad6903 100644 --- a/src/gui/widgets/qdockarealayout.cpp +++ b/src/gui/widgets/qdockarealayout.cpp @@ -1545,7 +1545,7 @@ void QDockAreaLayoutInfo::apply(bool animate) QRect geo = w->geometry(); widgetAnimator.animate(w, r, animate); - if (!w->isHidden()) { + if (!w->isHidden() && w->window()->isVisible()) { QDockWidget *dw = qobject_cast(w); if (!r.isValid() && geo.right() >= 0 && geo.bottom() >= 0) { dw->lower(); diff --git a/src/gui/widgets/qdockwidget.cpp b/src/gui/widgets/qdockwidget.cpp index 5810c81..e60f099 100644 --- a/src/gui/widgets/qdockwidget.cpp +++ b/src/gui/widgets/qdockwidget.cpp @@ -1390,7 +1390,7 @@ bool QDockWidget::event(QEvent *event) break; case QEvent::Show: d->toggleViewAction->setChecked(true); - emit visibilityChanged(true); + emit visibilityChanged(geometry().right() >= 0 && geometry().bottom() >= 0); break; #endif case QEvent::ApplicationLayoutDirectionChange: diff --git a/tests/auto/qdockwidget/tst_qdockwidget.cpp b/tests/auto/qdockwidget/tst_qdockwidget.cpp index 9b0e706..16bb12d 100644 --- a/tests/auto/qdockwidget/tst_qdockwidget.cpp +++ b/tests/auto/qdockwidget/tst_qdockwidget.cpp @@ -91,6 +91,7 @@ private slots: void task169808_setFloating(); void task237438_setFloatingCrash(); void task248604_infiniteResize(); + void task258459_visibilityChanged(); }; // Testing get/set functions @@ -730,7 +731,7 @@ void tst_QDockWidget::task169808_setFloating() return QSize(20,20); } - void paintEvent(QPaintEvent *e) + void paintEvent(QPaintEvent *) { QPainter p(this); p.fillRect(rect(), Qt::red); @@ -798,5 +799,21 @@ void tst_QDockWidget::task248604_infiniteResize() } +void tst_QDockWidget::task258459_visibilityChanged() +{ + QMainWindow win; + QDockWidget dock1, dock2; + win.addDockWidget(Qt::RightDockWidgetArea, &dock1); + win.tabifyDockWidget(&dock1, &dock2); + QSignalSpy spy1(&dock1, SIGNAL(visibilityChanged(bool))); + QSignalSpy spy2(&dock2, SIGNAL(visibilityChanged(bool))); + win.show(); + QTest::qWait(200); + QCOMPARE(spy1.count(), 1); + QCOMPARE(spy1.first().first().toBool(), false); //dock1 is invisible + QCOMPARE(spy2.count(), 1); + QCOMPARE(spy2.first().first().toBool(), true); //dock1 is visible +} + QTEST_MAIN(tst_QDockWidget) #include "tst_qdockwidget.moc" -- cgit v0.12 From f419f3f229444f31ca879276713799f6af73195e Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Tue, 12 May 2009 20:26:58 +0200 Subject: Refactor the code that reads the KDE config in one file Move the code out of qapplication_x11.cpp, and qcommonstyle.cpp to qkde.cpp into the QKde namespace. This removes few of the code duplication, and is much cleaner. This will also let us install hook easily later. Reviewed-by: Jens Bache-Wiig --- src/gui/kernel/kernel.pri | 6 +- src/gui/kernel/qapplication_p.h | 1 - src/gui/kernel/qapplication_x11.cpp | 202 ++++++------------------------------ src/gui/kernel/qkde.cpp | 159 ++++++++++++++++++++++++++++ src/gui/kernel/qkde_p.h | 76 ++++++++++++++ src/gui/kernel/qt_x11_p.h | 3 +- src/gui/styles/qcommonstyle.cpp | 39 ++++--- 7 files changed, 297 insertions(+), 189 deletions(-) create mode 100644 src/gui/kernel/qkde.cpp create mode 100644 src/gui/kernel/qkde_p.h diff --git a/src/gui/kernel/kernel.pri b/src/gui/kernel/kernel.pri index e6eff6e..d9deefe 100644 --- a/src/gui/kernel/kernel.pri +++ b/src/gui/kernel/kernel.pri @@ -100,7 +100,8 @@ unix:x11 { INCLUDEPATH += ../3rdparty/xorg HEADERS += \ kernel/qx11embed_x11.h \ - kernel/qx11info_x11.h + kernel/qx11info_x11.h \ + kernel/qkde_p.h SOURCES += \ kernel/qapplication_x11.cpp \ @@ -114,7 +115,8 @@ unix:x11 { kernel/qwidgetcreate_x11.cpp \ kernel/qx11embed_x11.cpp \ kernel/qx11info_x11.cpp \ - kernel/qkeymapper_x11.cpp + kernel/qkeymapper_x11.cpp \ + kernel/qkde.cpp contains(QT_CONFIG, glib) { SOURCES += \ diff --git a/src/gui/kernel/qapplication_p.h b/src/gui/kernel/qapplication_p.h index 700d1ab..c4ce2ea 100644 --- a/src/gui/kernel/qapplication_p.h +++ b/src/gui/kernel/qapplication_p.h @@ -284,7 +284,6 @@ public: #if defined(Q_WS_X11) #ifndef QT_NO_SETTINGS - static QString kdeHome(); static QString x11_desktop_style(); static bool x11_apply_settings(); #endif diff --git a/src/gui/kernel/qapplication_x11.cpp b/src/gui/kernel/qapplication_x11.cpp index 4016563..32e7e3c 100644 --- a/src/gui/kernel/qapplication_x11.cpp +++ b/src/gui/kernel/qapplication_x11.cpp @@ -83,6 +83,7 @@ #include "qtimer.h" #include "qlibrary.h" #include +#include "qkde_p.h" #if !defined (QT_NO_TABLET) extern "C" { @@ -813,33 +814,6 @@ Q_GUI_EXPORT void qt_x11_apply_settings_in_all_apps() PropModeReplace, (unsigned char *)stamp.data(), stamp.size()); } -static int kdeSessionVersion() -{ - static int kdeVersion = 0; - if (!kdeVersion) - kdeVersion = QString::fromLocal8Bit(qgetenv("KDE_SESSION_VERSION")).toInt(); - return kdeVersion; -} - -/*! \internal - Gets the current KDE 3 or 4 home path -*/ -QString QApplicationPrivate::kdeHome() -{ - static QString kdeHomePath; - if (kdeHomePath.isEmpty()) { - kdeHomePath = QString::fromLocal8Bit(qgetenv("KDEHOME")); - if (kdeHomePath.isEmpty()) { - QDir homeDir(QDir::homePath()); - QString kdeConfDir(QLatin1String("/.kde")); - if (4 == kdeSessionVersion() && homeDir.exists(QLatin1String(".kde4"))) - kdeConfDir = QLatin1String("/.kde4"); - kdeHomePath = QDir::homePath() + kdeConfDir; - } - } - return kdeHomePath; -} - /*! \internal apply the settings to the application */ @@ -905,8 +879,8 @@ bool QApplicationPrivate::x11_apply_settings() QFont font(QApplication::font()); QString fontDescription; // Override Qt font if KDE4 settings can be used - if (4 == kdeSessionVersion()) { - QSettings kdeSettings(kdeHome() + QLatin1String("/share/config/kdeglobals"), QSettings::IniFormat); + if (X11->desktopEnvironment == DE_KDE && X11->desktopVersion >= 4) { + QSettings kdeSettings(QKde::kdeHome() + QLatin1String("/share/config/kdeglobals"), QSettings::IniFormat); fontDescription = kdeSettings.value(QLatin1String("font")).toString(); if (fontDescription.isEmpty()) { // KDE stores fonts without quotes @@ -936,7 +910,6 @@ bool QApplicationPrivate::x11_apply_settings() // read new QStyle QString stylename = settings.value(QLatin1String("style")).toString(); - if (stylename.isEmpty() && QApplicationPrivate::styleOverride.isNull() && X11->use_xrender) { stylename = x11_desktop_style(); } @@ -1094,22 +1067,6 @@ static void qt_set_input_encoding() XFree((char *)data); } -// Reads a KDE color setting -static QColor kdeColor(const QString &key, const QSettings &kdeSettings) -{ - QVariant variant = kdeSettings.value(key); - if (variant.isValid()) { - QStringList values = variant.toStringList(); - if (values.size() == 3) { - int r = values[0].toInt(); - int g = values[1].toInt(); - int b = values[2].toInt(); - return QColor(r, g, b); - } - } - return QColor(); -} - // set font, foreground and background from x11 resources. The // arguments may override the resource settings. static void qt_set_x11_resources(const char* font = 0, const char* fg = 0, @@ -1276,9 +1233,10 @@ static void qt_set_x11_resources(const char* font = 0, const char* fg = 0, QApplicationPrivate::setSystemFont(fnt); } + // QGtkStyle sets it's own system palette + bool gtkStyle = QApplicationPrivate::app_style && QApplicationPrivate::app_style->inherits("QGtkStyle"); bool kdeColors = (QApplication::desktopSettingsAware() && X11->desktopEnvironment == DE_KDE); - - if (kdeColors || (button || !resBG.isEmpty() || !resFG.isEmpty())) {// set app colors + if (!gtkStyle && (kdeColors || (button || !resBG.isEmpty() || !resFG.isEmpty()))) {// set app colors bool allowX11ColorNames = QColor::allowX11ColorNames(); QColor::setAllowX11ColorNames(true); @@ -1314,45 +1272,6 @@ static void qt_set_x11_resources(const char* font = 0, const char* fg = 0, bright_mode = true; } - if (kdeColors) { - const QSettings theKdeSettings( - QApplicationPrivate::kdeHome() - + QLatin1String("/share/config/kdeglobals"), QSettings::IniFormat); - - // Setup KDE palette - QColor color; - color = kdeColor(QLatin1String("buttonBackground"), theKdeSettings); - if (!color.isValid()) - color = kdeColor(QLatin1String("Colors:Button/BackgroundNormal"), theKdeSettings); - if (color.isValid()) - btn = color; - - color = kdeColor(QLatin1String("background"), theKdeSettings); - if (!color.isValid()) - color = kdeColor(QLatin1String("Colors:Window/BackgroundNormal"), theKdeSettings); - if (color.isValid()) - bg = color; - - color = kdeColor(QLatin1String("foreground"), theKdeSettings); - if (!color.isValid()) - color = kdeColor(QLatin1String("Colors:View/ForegroundNormal"), theKdeSettings); - if (color.isValid()) { - fg = color; - } - - color = kdeColor(QLatin1String("windowForeground"), theKdeSettings); - if (!color.isValid()) - color = kdeColor(QLatin1String("Colors:Window/ForegroundNormal"), theKdeSettings); - if (color.isValid()) - wfg = color; - - color = kdeColor(QLatin1String("windowBackground"), theKdeSettings); - if (!color.isValid()) - color = kdeColor(QLatin1String("Colors:View/BackgroundNormal"), theKdeSettings); - if (color.isValid()) - base = color; - } - QPalette pal(fg, btn, btn.lighter(125), btn.darker(130), btn.darker(120), wfg.isValid() ? wfg : fg, Qt::white, base, bg); QColor disabled((fg.red() + btn.red()) / 2, (fg.green() + btn.green())/ 2, @@ -1365,50 +1284,6 @@ static void qt_set_x11_resources(const char* font = 0, const char* fg = 0, highlight = QColor(selectBackground); highlightText = QColor(selectForeground); } - // Use KDE3 or KDE4 color settings if present - if (kdeColors) { - const QSettings theKdeSettings( - QApplicationPrivate::kdeHome() - + QLatin1String("/share/config/kdeglobals"), QSettings::IniFormat); - - QColor color = kdeColor(QLatin1String("selectBackground"), theKdeSettings); - if (!color.isValid()) - color = kdeColor(QLatin1String("Colors:Selection/BackgroundNormal"), theKdeSettings); - if (color.isValid()) - highlight = color; - - color = kdeColor(QLatin1String("selectForeground"), theKdeSettings); - if (!color.isValid()) - color = kdeColor(QLatin1String("Colors:Selection/ForegroundNormal"), theKdeSettings); - if (color.isValid()) - highlightText = color; - - color = kdeColor(QLatin1String("alternateBackground"), theKdeSettings); - if (!color.isValid()) - color = kdeColor(QLatin1String("Colors:View/BackgroundAlternate"), theKdeSettings); - if (color.isValid()) - pal.setColor(QPalette::AlternateBase, color); - else - pal.setBrush(QPalette::AlternateBase, pal.base().color().darker(110)); - - color = kdeColor(QLatin1String("buttonForeground"), theKdeSettings); - if (!color.isValid()) - color = kdeColor(QLatin1String("Colors:Button/ForegroundNormal"), theKdeSettings); - if (color.isValid()) - pal.setColor(QPalette::ButtonText, color); - - color = kdeColor(QLatin1String("linkColor"), theKdeSettings); - if (!color.isValid()) - color = kdeColor(QLatin1String("Colors:View/ForegroundLink"), theKdeSettings); - if (color.isValid()) - pal.setColor(QPalette::Link, color); - - color = kdeColor(QLatin1String("visitedLinkColor"), theKdeSettings); - if (!color.isValid()) - color = kdeColor(QLatin1String("Colors:View/ForegroundVisited"), theKdeSettings); - if (color.isValid()) - pal.setColor(QPalette::LinkVisited, color); - } if (highlight.isValid() && highlightText.isValid()) { pal.setColor(QPalette::Highlight, highlight); @@ -1431,10 +1306,9 @@ static void qt_set_x11_resources(const char* font = 0, const char* fg = 0, pal.setColor(QPalette::Disabled, QPalette::Highlight, Qt::darkBlue); } - // QGtkStyle sets it's own system palette - if (!(QApplicationPrivate::app_style && QApplicationPrivate::app_style->inherits("QGtkStyle"))) { - QApplicationPrivate::setSystemPalette(pal); - } + if (kdeColors) + pal = QKde::kdePalette().resolve(pal); + QApplicationPrivate::setSystemPalette(pal); QColor::setAllowX11ColorNames(allowX11ColorNames); } @@ -2315,6 +2189,7 @@ void qt_init(QApplicationPrivate *priv, int, X11->compositingManagerRunning = XGetSelectionOwner(X11->display, ATOM(_NET_WM_CM_S0)); X11->desktopEnvironment = DE_UNKNOWN; + X11->desktopVersion = 0; // See if the current window manager is using the freedesktop.org spec to give its name Window windowManagerWindow = XNone; @@ -2390,6 +2265,9 @@ void qt_init(QApplicationPrivate *priv, int, XFree((char *)data); } + if (X11->desktopEnvironment == DE_KDE) + X11->desktopVersion = QString::fromLocal8Bit(qgetenv("KDE_SESSION_VERSION")).toInt(); + qt_set_input_encoding(); qt_set_x11_resources(appFont, appFGCol, appBGCol, appBTNCol); @@ -2657,44 +2535,30 @@ void qt_init(QApplicationPrivate *priv, int, QString QApplicationPrivate::x11_desktop_style() { QString stylename; - QStringList availableStyles = QStyleFactory::keys(); - // Override Qt style if KDE4 settings can be used - if (4 == kdeSessionVersion()) { - QSettings kdeSettings(kdeHome() + QLatin1String("/share/config/kdeglobals"), QSettings::IniFormat); - QString kde4Style = kdeSettings.value(QLatin1String("widgetStyle"), - QLatin1String("Oxygen")).toString(); - foreach (const QString &style, availableStyles) { - if (style.toLower() == kde4Style.toLower()) - stylename = kde4Style; - } - // Set QGtkStyle for GNOME - } else if (X11->desktopEnvironment == DE_GNOME) { + switch(X11->desktopEnvironment) { + case DE_KDE: + stylename = QKde::kdeStyle(); + break; + case DE_GNOME: { + QStringList availableStyles = QStyleFactory::keys(); + // Set QGtkStyle for GNOME if available QString gtkStyleKey = QString::fromLatin1("GTK+"); - if (availableStyles.contains(gtkStyleKey)) + if (availableStyles.contains(gtkStyleKey)) { stylename = gtkStyleKey; - } - - if (stylename.isEmpty()) { - switch(X11->desktopEnvironment) { - case DE_KDE: - if (X11->use_xrender) - stylename = QLatin1String("plastique"); - else - stylename = QLatin1String("windows"); - break; - case DE_GNOME: - if (X11->use_xrender) - stylename = QLatin1String("cleanlooks"); - else - stylename = QLatin1String("windows"); - break; - case DE_CDE: - stylename = QLatin1String("cde"); - break; - default: - // Don't do anything break; } + if (X11->use_xrender) + stylename = QLatin1String("cleanlooks"); + else + stylename = QLatin1String("windows"); + break; + } + case DE_CDE: + stylename = QLatin1String("cde"); + break; + default: + // Don't do anything + break; } return stylename; } diff --git a/src/gui/kernel/qkde.cpp b/src/gui/kernel/qkde.cpp new file mode 100644 index 0000000..96ff21e --- /dev/null +++ b/src/gui/kernel/qkde.cpp @@ -0,0 +1,159 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include "qkde_p.h" +#include +#include +#include +#include +#include "QtGui/qstylefactory.h" +#include "qt_x11_p.h" + +#if defined(Q_WS_X11) + +QT_BEGIN_NAMESPACE + +/*! \internal +Gets the current KDE home path +like "/home/troll/.kde" +*/ +QString QKde::kdeHome() +{ + static QString kdeHomePath; + if (kdeHomePath.isEmpty()) { + kdeHomePath = QString::fromLocal8Bit(qgetenv("KDEHOME")); + if (kdeHomePath.isEmpty()) { + QDir homeDir(QDir::homePath()); + QString kdeConfDir(QLatin1String("/.kde")); + if (4 == X11->desktopVersion && homeDir.exists(QLatin1String(".kde4"))) + kdeConfDir = QLatin1String("/.kde4"); + kdeHomePath = QDir::homePath() + kdeConfDir; + } + } + return kdeHomePath; +} + +/*!\internal + Reads the color from the config, and store it in the palette with the given color role if found + */ +static bool kdeColor(QPalette *pal, QPalette::ColorRole role, const QSettings &kdeSettings, const QString &kde4Key, const QString &kde3Key = QString()) +{ + QVariant variant = kdeSettings.value(kde4Key); + if (!variant.isValid()) + QVariant variant = kdeSettings.value(kde3Key); + if (variant.isValid()) { + QStringList values = variant.toStringList(); + if (values.size() == 3) { + int r = values[0].toInt(); + int g = values[1].toInt(); + int b = values[2].toInt(); + pal->setBrush(role, QColor(r, g, b)); + return true; + } + } + return false; +} + + +/*!\internal + Returns the KDE palette +*/ +QPalette QKde::kdePalette() +{ + const QSettings theKdeSettings(QKde::kdeHome() + + QLatin1String("/share/config/kdeglobals"), QSettings::IniFormat); + QPalette pal; + + // Setup KDE palette + kdeColor(&pal, QPalette::Button, theKdeSettings, QLatin1String("Colors:Button/BackgroundNormal"), QLatin1String("buttonBackground")); + kdeColor(&pal, QPalette::Window, theKdeSettings, QLatin1String("Colors:Window/BackgroundNormal"), QLatin1String("background")); + kdeColor(&pal, QPalette::Text, theKdeSettings, QLatin1String("Colors:View/ForegroundNormal"), QLatin1String("foreground")); + kdeColor(&pal, QPalette::WindowText, theKdeSettings, QLatin1String("Colors:Window/ForegroundNormal"), QLatin1String("windowForeground")); + kdeColor(&pal, QPalette::Base, theKdeSettings, QLatin1String("Colors:View/BackgroundNormal"), QLatin1String("windowBackground")); + kdeColor(&pal, QPalette::Highlight, theKdeSettings, QLatin1String("Colors:Selection/BackgroundNormal"), QLatin1String("selectBackground")); + kdeColor(&pal, QPalette::HighlightedText, theKdeSettings, QLatin1String("Colors:Selection/ForegroundNormal"), QLatin1String("selectForeground")); + kdeColor(&pal, QPalette::AlternateBase, theKdeSettings, QLatin1String("Colors:View/BackgroundAlternate"), QLatin1String("alternateBackground")); + kdeColor(&pal, QPalette::ButtonText, theKdeSettings, QLatin1String("Colors:Button/ForegroundNormal"), QLatin1String("buttonForeground")); + kdeColor(&pal, QPalette::Link, theKdeSettings, QLatin1String("Colors:View/ForegroundLink"), QLatin1String("linkColor")); + kdeColor(&pal, QPalette::LinkVisited, theKdeSettings, QLatin1String("Colors:View/ForegroundVisited"), QLatin1String("visitedLinkColor")); + //## TODO tooltip color + + return pal; +} + +/*!\internal + Returns the name of the QStyle to use. + (read from the kde config if needed) +*/ +QString QKde::kdeStyle() +{ + if (X11->desktopVersion >= 4) { + QSettings kdeSettings(QKde::kdeHome() + QLatin1String("/share/config/kdeglobals"), QSettings::IniFormat); + QString style = kdeSettings.value(QLatin1String("widgetStyle"), QLatin1String("Oxygen")).toString(); + + QStringList availableStyles = QStyleFactory::keys(); + if(availableStyles.contains(style, Qt::CaseInsensitive)) + return style; + } + + if (X11->use_xrender) + return QLatin1String("plastique"); + else + return QLatin1String("windows"); + + return QString(); +} + +/*!\internal + placeholder to load icon from kde. + to be implemented + */ +QIcon QKde::kdeIcon(const QString &name) +{ + //###todo + return QIcon(); +} + +QT_END_NAMESPACE + +#endif //Q_WS_X11 + diff --git a/src/gui/kernel/qkde_p.h b/src/gui/kernel/qkde_p.h new file mode 100644 index 0000000..ac760bd --- /dev/null +++ b/src/gui/kernel/qkde_p.h @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QKDE_H +#define QKDE_H + +#include +#include +#include + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// +#if defined(Q_WS_X11) + + +QT_BEGIN_NAMESPACE + +// This namespace contains helper function to help KDE integration +namespace QKde { + QString kdeHome(); + QString kdeStyle(); + QPalette kdePalette(); + QIcon kdeIcon(const QString &name); +} + + +QT_END_NAMESPACE + +#endif // Q_WS_X11 +#endif // QKDE_H diff --git a/src/gui/kernel/qt_x11_p.h b/src/gui/kernel/qt_x11_p.h index 1ac51e0..44652d3 100644 --- a/src/gui/kernel/qt_x11_p.h +++ b/src/gui/kernel/qt_x11_p.h @@ -515,7 +515,8 @@ struct QX11Data char *startupId; - DesktopEnvironment desktopEnvironment; + DesktopEnvironment desktopEnvironment : 8; + uint desktopVersion : 8; /* Used only for KDE */ /* Warning: if you modify this list, modify the names of atoms in qapplication_x11.cpp as well! */ enum X11Atom { diff --git a/src/gui/styles/qcommonstyle.cpp b/src/gui/styles/qcommonstyle.cpp index ba28e75..c7feb25 100644 --- a/src/gui/styles/qcommonstyle.cpp +++ b/src/gui/styles/qcommonstyle.cpp @@ -63,7 +63,7 @@ #include #include #include -#include +#include <../kernel/qkde_p.h> #include #include #include @@ -842,12 +842,6 @@ static void drawArrow(const QStyle *style, const QStyleOptionToolButton *toolbut #ifdef Q_WS_X11 // These functions are used to parse the X11 freedesktop icon spec -static int kdeVersion() -{ - static int kdeVersion = qgetenv("KDE_SESSION_VERSION").toInt(); - return kdeVersion; -} - void QCommonStylePrivate::lookupIconTheme() const { if (!themeName.isEmpty()) @@ -856,7 +850,7 @@ void QCommonStylePrivate::lookupIconTheme() const QString dataDirs = QString::fromLocal8Bit(getenv("XDG_DATA_DIRS")); if (dataDirs.isEmpty()) dataDirs = QLatin1String("/usr/local/share/:/usr/share/"); - dataDirs += QLatin1Char(':') + QApplicationPrivate::kdeHome() + QLatin1String("/share"); + dataDirs += QLatin1Char(':') + QKde::kdeHome() + QLatin1String("/share"); dataDirs.prepend(QDir::homePath() + QLatin1String("/:")); QStringList kdeDirs = QString::fromLocal8Bit(getenv("KDEDIRS")).split(QLatin1Char(':'), QString::SkipEmptyParts); foreach (const QString &dirName, kdeDirs) @@ -865,9 +859,10 @@ void QCommonStylePrivate::lookupIconTheme() const QFileInfo fileInfo(QLatin1String("/usr/share/icons/default.kde")); QDir dir(fileInfo.canonicalFilePath()); - QString kdeDefault = kdeVersion() >= 4 ? QString::fromLatin1("oxygen") : QString::fromLatin1("crystalsvg"); + QString kdeDefault = (X11->desktopEnvironment != DE_KDE || X11->desktopVersion >= 4) + ? QString::fromLatin1("oxygen") : QString::fromLatin1("crystalsvg"); QString defaultTheme = fileInfo.exists() ? dir.dirName() : kdeDefault; - QSettings settings(QApplicationPrivate::kdeHome() + + QSettings settings(QKde::kdeHome() + QLatin1String("/share/config/kdeglobals"), QSettings::IniFormat); settings.beginGroup(QLatin1String("Icons")); themeName = settings.value(QLatin1String("Theme"), defaultTheme).toString(); @@ -979,8 +974,15 @@ QPixmap QCommonStylePrivate::findIconHelper(int size, return pixmap; } +/*! \internal + find a pixmap with the given size and name from the freedesktop theme. +*/ QPixmap QCommonStylePrivate::findIcon(int size, const QString &name) const { + QIcon icon = QKde::kdeIcon(name); + if (!icon.isNull()) + return icon.pixmap(size); + QPixmap pixmap; QString pixmapName = QLatin1String("$qt") + name + QString::number(size); @@ -995,12 +997,17 @@ QPixmap QCommonStylePrivate::findIcon(int size, const QString &name) const return pixmap; } +/*! \internal + create an Icon from the freedesktop theme. + */ QIcon QCommonStylePrivate::createIcon(const QString &name) const { - QIcon icon; - icon.addPixmap(findIcon(16, name)); - icon.addPixmap(findIcon(24, name)); - icon.addPixmap(findIcon(32, name)); + QIcon icon = QKde::kdeIcon(name); + if (icon.isNull()) { + icon.addPixmap(findIcon(16, name)); + icon.addPixmap(findIcon(24, name)); + icon.addPixmap(findIcon(32, name)); + } return icon; } /*!internal @@ -1012,8 +1019,8 @@ from the KDE configuration file int QCommonStylePrivate::lookupToolButtonStyle() const { int result = Qt::ToolButtonIconOnly; - if (kdeVersion() >= 4) { - QSettings settings(QApplicationPrivate::kdeHome() + + if (X11->desktopEnvironment == DE_KDE && X11->desktopVersion >= 4) { + QSettings settings(QKde::kdeHome() + QLatin1String("/share/config/kdeglobals"), QSettings::IniFormat); settings.beginGroup(QLatin1String("Toolbar style")); QString toolbarStyle = settings.value(QLatin1String("ToolButtonStyle"), QLatin1String("TextBesideIcon")).toString(); -- cgit v0.12 From 6993e77d2cd147098c6ddab187469a9177ea134e Mon Sep 17 00:00:00 2001 From: Kavindra Devi Palaraja Date: Fri, 7 Aug 2009 15:06:23 +0200 Subject: Doc - Improving the documentation for QListWidget and QListWidgetItem Reviewed-By: TrustMe --- src/gui/itemviews/qlistwidget.cpp | 446 +++++++++++++++++++------------------- 1 file changed, 228 insertions(+), 218 deletions(-) diff --git a/src/gui/itemviews/qlistwidget.cpp b/src/gui/itemviews/qlistwidget.cpp index 2565657..6351496 100644 --- a/src/gui/itemviews/qlistwidget.cpp +++ b/src/gui/itemviews/qlistwidget.cpp @@ -447,21 +447,20 @@ Qt::DropActions QListModel::supportedDropActions() const \ingroup model-view - QListWidgetItem is used to represent items in a list provided by the - QListWidget class. Each item can hold several pieces of information, - and will display these appropriately. + A QListWidgetItem represents a single item in a QListWidget. Each item can + hold several pieces of information, and will display them appropriately. - The item view convenience classes use a classic item-based interface - rather than a pure model/view approach. For a more flexible list view - widget, consider using the QListView class with a standard model. + The item view convenience classes use a classic item-based interface rather + than a pure model/view approach. For a more flexible list view widget, + consider using the QListView class with a standard model. - List items can be automatically inserted into a list when they are - constructed by specifying the list widget: + List items can be inserted automatically into a list, when they are + constructed, by specifying the list widget: \snippet doc/src/snippets/qlistwidget-using/mainwindow.cpp 2 - They can also be created without a parent widget, and later inserted into - a list (see \l{QListWidget::insertItem()}). + Alternatively, list items can also be created without a parent widget, and + later inserted into a list using QListWidget::insertItem(). List items are typically used to display text() and an icon(). These are set with the setText() and setIcon() functions. The appearance of the text @@ -471,22 +470,24 @@ Qt::DropActions QListModel::supportedDropActions() const with setToolTip(), setStatusTip(), and setWhatsThis(). By default, items are enabled, selectable, checkable, and can be the source - of a drag and drop operation. + of drag and drop operations. + Each item's flags can be changed by calling setFlags() with the appropriate - value (see \l{Qt::ItemFlags}). Checkable items can be checked, unchecked and + value (see Qt::ItemFlags). Checkable items can be checked, unchecked and partially checked with the setCheckState() function. The corresponding - checkState() function indicates what check state the item currently has. + checkState() function indicates the item's current check state. + + The isHidden() function can be used to determine whether the item is + hidden. To hide an item, use setHidden(). - The isHidden() function can be used to determine whether the - item is hidden. Items can be hidden with setHidden(). \section1 Subclassing When subclassing QListWidgetItem to provide custom items, it is possible to - define new types for them so that they can be distinguished from standard - items. The constructors for subclasses that require this feature need to - call the base class constructor with a new type value equal to or greater - than \l UserType. + define new types for them enabling them to be distinguished from standard + items. For subclasses that require this feature, ensure that you call the + base class constructor with a new type value equal to or greater than + \l UserType, within \e your constructor. \sa QListWidget, {Model/View Programming}, QTreeWidgetItem, QTableWidgetItem */ @@ -515,59 +516,58 @@ Qt::DropActions QListModel::supportedDropActions() const /*! \fn QListWidget *QListWidgetItem::listWidget() const - Returns the list widget that contains the item. + Returns the list widget containing the item. */ /*! - \fn void QListWidgetItem::setSelected(bool select) - \since 4.2 + \fn void QListWidgetItem::setSelected(bool select) + \since 4.2 - Sets the selected state of the item to \a select. + Sets the selected state of the item to \a select. - \sa isSelected() + \sa isSelected() */ /*! - \fn bool QListWidgetItem::isSelected() const - \since 4.2 + \fn bool QListWidgetItem::isSelected() const + \since 4.2 - Returns true if the item is selected, otherwise returns false. + Returns true if the item is selected; otherwise returns false. - \sa setSelected() + \sa setSelected() */ /*! - \fn void QListWidgetItem::setHidden(bool hide) - \since 4.2 + \fn void QListWidgetItem::setHidden(bool hide) + \since 4.2 - Hides the item if \a hide is true, otherwise shows the item. + Hides the item if \a hide is true; otherwise shows the item. - \sa isHidden() + \sa isHidden() */ /*! - \fn bool QListWidgetItem::isHidden() const - \since 4.2 + \fn bool QListWidgetItem::isHidden() const + \since 4.2 - Returns true if the item is hidden, otherwise returns false. + Returns true if the item is hidden; otherwise returns false. - \sa setHidden() + \sa setHidden() */ /*! \fn QListWidgetItem::QListWidgetItem(QListWidget *parent, int type) Constructs an empty list widget item of the specified \a type with the - given \a parent. - If the parent is not specified, the item will need to be inserted into a - list widget with QListWidget::insertItem(). + given \a parent. If \a parent is not specified, the item will need to be + inserted into a list widget with QListWidget::insertItem(). - \note that this constructor inserts this same object into the model of - the parent that is passed to the constructor. If the model is sorted then - the behavior of the insert is undetermined since the model will call - the '<' operator method on this object which has still not yet been - constructed. In this case it would be better not to specify the parent - and use the QListWidget::insertItem method to insert the item instead. + This constructor inserts the item into the model of the parent that is + passed to the constructor. If the model is sorted then the behavior of the + insert is undetermined since the model will call the \c '<' operator method + on the item which, at this point, is not yet constructed. To avoid the + undetermined behavior, we recommend not to specify the parent and use + QListWidget::insertItem() instead. \sa type() */ @@ -586,16 +586,15 @@ QListWidgetItem::QListWidgetItem(QListWidget *view, int type) \fn QListWidgetItem::QListWidgetItem(const QString &text, QListWidget *parent, int type) Constructs an empty list widget item of the specified \a type with the - given \a text and \a parent. - If the parent is not specified, the item will need to be inserted into a - list widget with QListWidget::insertItem(). + given \a text and \a parent. If the parent is not specified, the item will + need to be inserted into a list widget with QListWidget::insertItem(). - \note that this constructor inserts this same object into the model of - the parent that is passed to the constructor. If the model is sorted then - the behavior of the insert is undetermined since the model will call - the '<' operator method on this object which has still not yet been - constructed. In this case it would be better not to specify the parent - and use the QListWidget::insertItem method to insert the item instead. + This constructor inserts the item into the model of the parent that is + passed to the constructor. If the model is sorted then the behavior of the + insert is undetermined since the model will call the \c '<' operator method + on the item which, at this point, is not yet constructed. To avoid the + undetermined behavior, we recommend not to specify the parent and use + QListWidget::insertItem() instead. \sa type() */ @@ -616,16 +615,16 @@ QListWidgetItem::QListWidgetItem(const QString &text, QListWidget *view, int typ \fn QListWidgetItem::QListWidgetItem(const QIcon &icon, const QString &text, QListWidget *parent, int type) Constructs an empty list widget item of the specified \a type with the - given \a icon, \a text and \a parent. - If the parent is not specified, the item will need to be inserted into a - list widget with QListWidget::insertItem(). + given \a icon, \a text and \a parent. If the parent is not specified, the + item will need to be inserted into a list widget with + QListWidget::insertItem(). - \note that this constructor inserts this same object into the model of - the parent that is passed to the constructor. If the model is sorted then - the behavior of the insert is undetermined since the model will call - the '<' operator method on this object which has still not yet been - constructed. In this case it would be better not to specify the parent - and use the QListWidget::insertItem method to insert the item instead. + This constructor inserts the item into the model of the parent that is + passed to the constructor. If the model is sorted then the behavior of the + insert is undetermined since the model will call the \c '<' operator method + on the item which, at this point, is not yet constructed. To avoid the + undetermined behavior, we recommend not to specify the parent and use + QListWidget::insertItem() instead. \sa type() */ @@ -645,7 +644,7 @@ QListWidgetItem::QListWidgetItem(const QIcon &icon,const QString &text, } /*! - Destroys the list item. + Destroys the list item. */ QListWidgetItem::~QListWidgetItem() { @@ -655,7 +654,7 @@ QListWidgetItem::~QListWidgetItem() } /*! - Creates an exact copy of the item. + Creates an exact copy of the item. */ QListWidgetItem *QListWidgetItem::clone() const { @@ -663,11 +662,10 @@ QListWidgetItem *QListWidgetItem::clone() const } /*! - This function sets the data for a given \a role to the given \a value (see - \l{Qt::ItemDataRole}). Reimplement this function if you need - extra roles or special behavior for certain roles. + Sets the data for a given \a role to the given \a value. Reimplement this + function if you need extra roles or special behavior for certain roles. - \sa Qt::ItemDataRole, data() + \sa Qt::ItemDataRole, data() */ void QListWidgetItem::setData(int role, const QVariant &value) { @@ -689,9 +687,10 @@ void QListWidgetItem::setData(int role, const QVariant &value) } /*! - This function returns the item's data for a given \a role (see - Qt::ItemDataRole). Reimplement this function if you need - extra roles or special behavior for certain roles. + Returns the item's data for a given \a role. Reimplement this function if + you need extra roles or special behavior for certain roles. + + \sa Qt::ItemDataRole, setData() */ QVariant QListWidgetItem::data(int role) const { @@ -703,8 +702,8 @@ QVariant QListWidgetItem::data(int role) const } /*! - Returns true if this item's text is less then \a other item's text; - otherwise returns false. + Returns true if this item's text is less then \a other item's text; + otherwise returns false. */ bool QListWidgetItem::operator<(const QListWidgetItem &other) const { @@ -740,8 +739,8 @@ void QListWidgetItem::write(QDataStream &out) const /*! \since 4.1 - Constructs a copy of \a other. Note that type() and listWidget() - are not copied. + Constructs a copy of \a other. Note that type() and listWidget() are not + copied. This function is useful when reimplementing clone(). @@ -756,8 +755,8 @@ QListWidgetItem::QListWidgetItem(const QListWidgetItem &other) } /*! - Assigns \a other's data and flags to this item. Note that type() - and listWidget() are not copied. + Assigns \a other's data and flags to this item. Note that type() and + listWidget() are not copied. This function is useful when reimplementing clone(). @@ -805,9 +804,9 @@ QDataStream &operator>>(QDataStream &in, QListWidgetItem &item) #endif // QT_NO_DATASTREAM /*! - \fn Qt::ItemFlags QListWidgetItem::flags() const + \fn Qt::ItemFlags QListWidgetItem::flags() const - Returns the item flags for this item (see \l{Qt::ItemFlags}). + Returns the item flags for this item (see \l{Qt::ItemFlags}). */ /*! @@ -851,15 +850,17 @@ QDataStream &operator>>(QDataStream &in, QListWidgetItem &item) */ /*! - \fn QFont QListWidgetItem::font() const + \fn QFont QListWidgetItem::font() const - Returns the font used to display this list item's text. + Returns the font used to display this list item's text. */ /*! - \fn int QListWidgetItem::textAlignment() const + \fn int QListWidgetItem::textAlignment() const + + Returns the text alignment for the list item. - Returns the text alignment for the list item (see \l{Qt::AlignmentFlag}). + \sa Qt::AlignmentFlag */ /*! @@ -905,26 +906,26 @@ QDataStream &operator>>(QDataStream &in, QListWidgetItem &item) */ /*! - \fn QSize QListWidgetItem::sizeHint() const - \since 4.1 + \fn QSize QListWidgetItem::sizeHint() const + \since 4.1 - Returns the size hint set for the list item. + Returns the size hint set for the list item. */ /*! - \fn void QListWidgetItem::setSizeHint(const QSize &size) - \since 4.1 + \fn void QListWidgetItem::setSizeHint(const QSize &size) + \since 4.1 - Sets the size hint for the list item to be \a size. - If no size hint is set, the item delegate will compute the - size hint based on the item data. + Sets the size hint for the list item to be \a size. If no size hint is set, + the item delegate will compute the size hint based on the item data. */ /*! - \fn void QListWidgetItem::setFlags(Qt::ItemFlags flags) + \fn void QListWidgetItem::setFlags(Qt::ItemFlags flags) + + Sets the item flags for the list item to \a flags. - Sets the item flags for the list item to \a flags (see - \l{Qt::ItemFlags}). + \sa Qt::ItemFlags */ void QListWidgetItem::setFlags(Qt::ItemFlags aflags) { itemFlags = aflags; @@ -953,10 +954,10 @@ void QListWidgetItem::setFlags(Qt::ItemFlags aflags) { \fn void QListWidgetItem::setStatusTip(const QString &statusTip) Sets the status tip for the list item to the text specified by - \a statusTip. QListWidget mouse tracking needs to be enabled for this + \a statusTip. QListWidget mouseTracking needs to be enabled for this feature to work. - \sa statusTip() setToolTip() setWhatsThis() + \sa statusTip(), setToolTip(), setWhatsThis(), QWidget::setMouseTracking() */ /*! @@ -964,29 +965,30 @@ void QListWidgetItem::setFlags(Qt::ItemFlags aflags) { Sets the tooltip for the list item to the text specified by \a toolTip. - \sa toolTip() setStatusTip() setWhatsThis() + \sa toolTip(), setStatusTip(), setWhatsThis() */ /*! \fn void QListWidgetItem::setWhatsThis(const QString &whatsThis) - Sets the "What's This?" help for the list item to the text specified - by \a whatsThis. + Sets the "What's This?" help for the list item to the text specified by + \a whatsThis. - \sa whatsThis() setStatusTip() setToolTip() + \sa whatsThis(), setStatusTip(), setToolTip() */ /*! - \fn void QListWidgetItem::setFont(const QFont &font) + \fn void QListWidgetItem::setFont(const QFont &font) - Sets the font used when painting the item to the given \a font. + Sets the font used when painting the item to the given \a font. */ /*! - \fn void QListWidgetItem::setTextAlignment(int alignment) + \fn void QListWidgetItem::setTextAlignment(int alignment) + + Sets the list item's text alignment to \a alignment. - Sets the list item's text alignment to \a alignment (see - \l{Qt::AlignmentFlag}). + \sa Qt::AlignmentFlag */ /*! @@ -1127,10 +1129,10 @@ void QListWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft, \ingroup model-view \mainclass - QListWidget is a convenience class that provides a list view similar to - the one supplied by QListView, but with a classic item-based interface - for adding and removing items. QListWidget uses an internal model to - manage each QListWidgetItem in the list. + QListWidget is a convenience class that provides a list view similar to the + one supplied by QListView, but with a classic item-based interface for + adding and removing items. QListWidget uses an internal model to manage + each QListWidgetItem in the list. For a more flexible list view widget, use the QListView class with a standard model. @@ -1145,23 +1147,23 @@ void QListWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft, function. There are two ways to add items to the list: they can be constructed with - the list widget as their parent widget, or they can be constructed with - no parent widget and added to the list later. If a list widget already - exists when the items are constructed, the first method is easier to use: + the list widget as their parent widget, or they can be constructed with no + parent widget and added to the list later. If a list widget already exists + when the items are constructed, the first method is easier to use: \snippet doc/src/snippets/qlistwidget-using/mainwindow.cpp 1 - If you need to insert a new item into the list at a particular position, - it is more required to construct the item without a parent widget and - use the insertItem() function to place it within the list. The list - widget will take ownership of the item. + If you need to insert a new item into the list at a particular position, it + is more required to construct the item without a parent widget and use the + insertItem() function to place it within the list. The list widget will + take ownership of the item. \snippet doc/src/snippets/qlistwidget-using/mainwindow.cpp 6 \snippet doc/src/snippets/qlistwidget-using/mainwindow.cpp 7 - For multiple items, insertItems() can be used instead. The number of - items in the list is found with the count() function. - To remove items from the list, use takeItem(). + For multiple items, insertItems() can be used instead. The number of items + in the list is found with the count() function. To remove items from the + list, use takeItem(). The current item in the list can be found with currentItem(), and changed with setCurrentItem(). The user can also change the current item by @@ -1187,9 +1189,9 @@ void QListWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft, Inserts the \a item at the end of the list widget. - \warning A QListWidgetItem can only be added to a - QListWidget once. Adding the same QListWidgetItem multiple - times to a QListWidget will result in undefined behavior. + \warning A QListWidgetItem can only be added to a QListWidget once. Adding + the same QListWidgetItem multiple times to a QListWidget will result in + undefined behavior. \sa insertItem() */ @@ -1197,8 +1199,7 @@ void QListWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft, /*! \fn void QListWidget::addItem(const QString &label) - Inserts an item with the text \a label at the end of the list - widget. + Inserts an item with the text \a label at the end of the list widget. */ /*! @@ -1212,8 +1213,8 @@ void QListWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft, /*! \fn void QListWidget::itemPressed(QListWidgetItem *item) - This signal is emitted with the specified \a item when a mouse button is pressed - on an item in the widget. + This signal is emitted with the specified \a item when a mouse button is + pressed on an item in the widget. \sa itemClicked(), itemDoubleClicked() */ @@ -1221,8 +1222,8 @@ void QListWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft, /*! \fn void QListWidget::itemClicked(QListWidgetItem *item) - This signal is emitted with the specified \a item when a mouse button is clicked - on an item in the widget. + This signal is emitted with the specified \a item when a mouse button is + clicked on an item in the widget. \sa itemPressed(), itemDoubleClicked() */ @@ -1230,8 +1231,8 @@ void QListWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft, /*! \fn void QListWidget::itemDoubleClicked(QListWidgetItem *item) - This signal is emitted with the specified \a item when a mouse button is double - clicked on an item in the widget. + This signal is emitted with the specified \a item when a mouse button is + double clicked on an item in the widget. \sa itemClicked(), itemPressed() */ @@ -1239,20 +1240,21 @@ void QListWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft, /*! \fn void QListWidget::itemActivated(QListWidgetItem *item) - This signal is emitted when the \a item is activated. The \a item - is activated when the user clicks or double clicks on it, - depending on the system configuration. It is also activated when - the user presses the activation key (on Windows and X11 this is - the \gui Return key, on Mac OS X it is \key{Ctrl+0}). + This signal is emitted when the \a item is activated. The \a item is + activated when the user clicks or double clicks on it, depending on the + system configuration. It is also activated when the user presses the + activation key (on Windows and X11 this is the \gui Return key, on Mac OS + X it is \key{Ctrl+0}). */ /*! \fn void QListWidget::itemEntered(QListWidgetItem *item) - This signal is emitted when the mouse cursor enters an item. The - \a item is the item entered. This signal is only emitted when - mouseTracking is turned on, or when a mouse button is pressed - while moving into an item. + This signal is emitted when the mouse cursor enters an item. The \a item is + the item entered. This signal is only emitted when mouseTracking is turned + on, or when a mouse button is pressed while moving into an item. + + \sa QWidget::setMouseTracking() */ /*! @@ -1264,24 +1266,28 @@ void QListWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft, /*! \fn void QListWidget::currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous) - This signal is emitted whenever the current item changes. The \a - previous item is the item that previously had the focus, \a - current is the new current item. + This signal is emitted whenever the current item changes. + + \a previous is the item that previously had the focus; \a current is the + new current item. */ /*! - \fn void QListWidget::currentTextChanged(const QString ¤tText) + \fn void QListWidget::currentTextChanged(const QString ¤tText) - This signal is emitted whenever the current item changes. The \a currentText - is the text data in the current item. If there is no current item, the \a currentText - is invalid. + This signal is emitted whenever the current item changes. + + \a currentText is the text data in the current item. If there is no current + item, the \a currentText is invalid. */ /*! - \fn void QListWidget::currentRowChanged(int currentRow) + \fn void QListWidget::currentRowChanged(int currentRow) - This signal is emitted whenever the current item changes. The \a currentRow - is the row of the current item. If there is no current item, the \a currentRow is -1. + This signal is emitted whenever the current item changes. + + \a currentRow is the row of the current item. If there is no current item, + the \a currentRow is -1. */ /*! @@ -1289,15 +1295,15 @@ void QListWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft, This signal is emitted whenever the selection changes. - \sa selectedItems() QListWidgetItem::isSelected() currentItemChanged() + \sa selectedItems(), QListWidgetItem::isSelected(), currentItemChanged() */ /*! - \since 4.3 + \since 4.3 - \fn void QListWidget::removeItemWidget(QListWidgetItem *item) + \fn void QListWidget::removeItemWidget(QListWidgetItem *item) - Removes the widget set on the given \a item. + Removes the widget set on the given \a item. */ /*! @@ -1361,8 +1367,8 @@ void QListWidget::insertItem(int row, QListWidgetItem *item) } /*! - Inserts an item with the text \a label in the list widget at the - position given by \a row. + Inserts an item with the text \a label in the list widget at the position + given by \a row. \sa addItem() */ @@ -1387,11 +1393,11 @@ void QListWidget::insertItems(int row, const QStringList &labels) } /*! - Removes and returns the item from the given \a row in the list widget; otherwise - returns 0. + Removes and returns the item from the given \a row in the list widget; + otherwise returns 0. - Items removed from a list widget will not be managed by Qt, and will need to be - deleted manually. + Items removed from a list widget will not be managed by Qt, and will need + to be deleted manually. \sa insertItem(), addItem() */ @@ -1405,8 +1411,8 @@ QListWidgetItem *QListWidget::takeItem(int row) } /*! - \property QListWidget::count - \brief the number of items in the list including any hidden items. + \property QListWidget::count + \brief the number of items in the list including any hidden items. */ int QListWidget::count() const @@ -1416,7 +1422,7 @@ int QListWidget::count() const } /*! - Returns the current item. + Returns the current item. */ QListWidgetItem *QListWidget::currentItem() const { @@ -1426,9 +1432,9 @@ QListWidgetItem *QListWidget::currentItem() const /*! - Sets the current item to \a item. + Sets the current item to \a item. - Depending on the current selection mode, the item may also be selected. + Depending on the current selection mode, the item may also be selected. */ void QListWidget::setCurrentItem(QListWidgetItem *item) { @@ -1436,8 +1442,8 @@ void QListWidget::setCurrentItem(QListWidgetItem *item) } /*! - \since 4.4 - Set the current item to \a item, using the given \a command. + \since 4.4 + Set the current item to \a item, using the given \a command. */ void QListWidget::setCurrentItem(QListWidgetItem *item, QItemSelectionModel::SelectionFlags command) { @@ -1445,10 +1451,10 @@ void QListWidget::setCurrentItem(QListWidgetItem *item, QItemSelectionModel::Sel } /*! - \property QListWidget::currentRow - \brief the row of the current item. + \property QListWidget::currentRow + \brief the row of the current item. - Depending on the current selection mode, the row may also be selected. + Depending on the current selection mode, the row may also be selected. */ int QListWidget::currentRow() const @@ -1469,9 +1475,9 @@ void QListWidget::setCurrentRow(int row) } /*! - \since 4.4 + \since 4.4 - Sets the current row to be the given \a row, using the given \a command, + Sets the current row to be the given \a row, using the given \a command, */ void QListWidget::setCurrentRow(int row, QItemSelectionModel::SelectionFlags command) { @@ -1498,7 +1504,7 @@ QListWidgetItem *QListWidget::itemAt(const QPoint &p) const /*! - Returns the rectangle on the viewport occupied by the item at \a item. + Returns the rectangle on the viewport occupied by the item at \a item. */ QRect QListWidget::visualItemRect(const QListWidgetItem *item) const { @@ -1508,7 +1514,7 @@ QRect QListWidget::visualItemRect(const QListWidgetItem *item) const } /*! - Sorts all the items in the list widget according to the specified \a order. + Sorts all the items in the list widget according to the specified \a order. */ void QListWidget::sortItems(Qt::SortOrder order) { @@ -1522,8 +1528,10 @@ void QListWidget::sortItems(Qt::SortOrder order) \property QListWidget::sortingEnabled \brief whether sorting is enabled - If this property is true, sorting is enabled for the list; if the - property is false, sorting is not enabled. The default value is false. + If this property is true, sorting is enabled for the list; if the property + is false, sorting is not enabled. + + The default value is false. */ void QListWidget::setSortingEnabled(bool enable) { @@ -1538,7 +1546,7 @@ bool QListWidget::isSortingEnabled() const } /*! - \internal + \internal */ Qt::SortOrder QListWidget::sortOrder() const { @@ -1547,7 +1555,7 @@ Qt::SortOrder QListWidget::sortOrder() const } /*! - Starts editing the \a item if it is editable. + Starts editing the \a item if it is editable. */ void QListWidget::editItem(QListWidgetItem *item) @@ -1557,9 +1565,10 @@ void QListWidget::editItem(QListWidgetItem *item) } /*! - Opens an editor for the given \a item. The editor remains open after editing. + Opens an editor for the given \a item. The editor remains open after + editing. - \sa closePersistentEditor() + \sa closePersistentEditor() */ void QListWidget::openPersistentEditor(QListWidgetItem *item) { @@ -1569,9 +1578,9 @@ void QListWidget::openPersistentEditor(QListWidgetItem *item) } /*! - Closes the persistent editor for the given \a item. + Closes the persistent editor for the given \a item. - \sa openPersistentEditor() + \sa openPersistentEditor() */ void QListWidget::closePersistentEditor(QListWidgetItem *item) { @@ -1597,9 +1606,10 @@ QWidget *QListWidget::itemWidget(QListWidgetItem *item) const Sets the \a widget to be displayed in the give \a item. - This function should only be used to display static content in the place of a list - widget item. If you want to display custom dynamic content or implement a custom - editor widget, use QListView and subclass QItemDelegate instead. + This function should only be used to display static content in the place of + a list widget item. If you want to display custom dynamic content or + implement a custom editor widget, use QListView and subclass QItemDelegate + instead. \sa {Delegate Classes} */ @@ -1611,11 +1621,11 @@ void QListWidget::setItemWidget(QListWidgetItem *item, QWidget *widget) } /*! - Returns true if \a item is selected; otherwise returns false. + Returns true if \a item is selected; otherwise returns false. - \obsolete + \obsolete - This function is deprecated. Use \l{QListWidgetItem::isSelected()} instead. + This function is deprecated. Use QListWidgetItem::isSelected() instead. */ bool QListWidget::isItemSelected(const QListWidgetItem *item) const { @@ -1625,12 +1635,12 @@ bool QListWidget::isItemSelected(const QListWidgetItem *item) const } /*! - Selects or deselects the given \a item depending on whether \a select is - true of false. + Selects or deselects the given \a item depending on whether \a select is + true of false. - \obsolete + \obsolete - This function is deprecated. Use \l{QListWidgetItem::setSelected()} instead. + This function is deprecated. Use QListWidgetItem::setSelected() instead. */ void QListWidget::setItemSelected(const QListWidgetItem *item, bool select) { @@ -1650,7 +1660,7 @@ void QListWidget::setItemSelected(const QListWidgetItem *item, bool select) } /*! - Returns a list of all selected items in the list widget. + Returns a list of all selected items in the list widget. */ QList QListWidget::selectedItems() const @@ -1664,7 +1674,8 @@ QList QListWidget::selectedItems() const } /*! - Finds items with the text that matches the string \a text using the given \a flags. + Finds items with the text that matches the string \a text using the given + \a flags. */ QList QListWidget::findItems(const QString &text, Qt::MatchFlags flags) const @@ -1679,11 +1690,11 @@ QList QListWidget::findItems(const QString &text, Qt::MatchFla } /*! - Returns true if the \a item is explicitly hidden; otherwise returns false. + Returns true if the \a item is explicitly hidden; otherwise returns false. - \obsolete + \obsolete - This function is deprecated. Use \l{QListWidgetItem::isHidden()} instead. + This function is deprecated. Use QListWidgetItem::isHidden() instead. */ bool QListWidget::isItemHidden(const QListWidgetItem *item) const { @@ -1691,11 +1702,11 @@ bool QListWidget::isItemHidden(const QListWidgetItem *item) const } /*! - If \a hide is true, the \a item will be hidden; otherwise it will be shown. + If \a hide is true, the \a item will be hidden; otherwise it will be shown. - \obsolete + \obsolete - This function is deprecated. Use \l{QListWidgetItem::setHidden()} instead. + This function is deprecated. Use QListWidgetItem::setHidden() instead. */ void QListWidget::setItemHidden(const QListWidgetItem *item, bool hide) { @@ -1703,9 +1714,9 @@ void QListWidget::setItemHidden(const QListWidgetItem *item, bool hide) } /*! - Scrolls the view if necessary to ensure that the \a item is - visible. The \a hint parameter specifies more precisely where the - \a item should be located after the operation. + Scrolls the view if necessary to ensure that the \a item is visible. + + \a hint specifies where the \a item should be located after the operation. */ void QListWidget::scrollToItem(const QListWidgetItem *item, QAbstractItemView::ScrollHint hint) @@ -1718,7 +1729,7 @@ void QListWidget::scrollToItem(const QListWidgetItem *item, QAbstractItemView::S /*! Removes all items and selections in the view. - \note All items will be permanently deleted. + \warning All items will be permanently deleted. */ void QListWidget::clear() { @@ -1743,8 +1754,8 @@ QStringList QListWidget::mimeTypes() const \a items. The format used to describe the items is obtained from the mimeTypes() function. - If the list of items is empty, 0 is returned rather than a serialized - empty list. + If the list of items is empty, 0 is returned instead of a serialized empty + list. */ QMimeData *QListWidget::mimeData(const QList) const { @@ -1753,10 +1764,9 @@ QMimeData *QListWidget::mimeData(const QList) const #ifndef QT_NO_DRAGANDDROP /*! - Handles the \a data supplied by an external drag and drop operation - that ended with the given \a action in the given \a index. - Returns true if the data and action can be handled by the model; - otherwise returns false. + Handles \a data supplied by an external drag and drop operation that ended + with the given \a action in the given \a index. Returns true if \a data and + \a action can be handled by the model; otherwise returns false. \sa supportedDropActions() */ @@ -1823,9 +1833,9 @@ void QListWidget::dropEvent(QDropEvent *event) { } /*! - Returns the drop actions supported by this view. + Returns the drop actions supported by this view. - \sa Qt::DropActions + \sa Qt::DropActions */ Qt::DropActions QListWidget::supportedDropActions() const { @@ -1835,9 +1845,9 @@ Qt::DropActions QListWidget::supportedDropActions() const #endif // QT_NO_DRAGANDDROP /*! - Returns a list of pointers to the items contained in the \a data object. - If the object was not created by a QListWidget in the same process, the list - is empty. + Returns a list of pointers to the items contained in the \a data object. If + the object was not created by a QListWidget in the same process, the list + is empty. */ QList QListWidget::items(const QMimeData *data) const { @@ -1848,7 +1858,7 @@ QList QListWidget::items(const QMimeData *data) const } /*! - Returns the QModelIndex assocated with the given \a item. + Returns the QModelIndex assocated with the given \a item. */ QModelIndex QListWidget::indexFromItem(QListWidgetItem *item) const @@ -1858,7 +1868,7 @@ QModelIndex QListWidget::indexFromItem(QListWidgetItem *item) const } /*! - Returns a pointer to the QListWidgetItem assocated with the given \a index. + Returns a pointer to the QListWidgetItem assocated with the given \a index. */ QListWidgetItem *QListWidget::itemFromIndex(const QModelIndex &index) const @@ -1870,7 +1880,7 @@ QListWidgetItem *QListWidget::itemFromIndex(const QModelIndex &index) const } /*! - \internal + \internal */ void QListWidget::setModel(QAbstractItemModel * /*model*/) { -- cgit v0.12 From 658c30c214070e8ff05ddaf1cb7b161c1b73f5ce Mon Sep 17 00:00:00 2001 From: Kavindra Devi Palaraja Date: Fri, 7 Aug 2009 15:09:30 +0200 Subject: Doc - Removing trailing whitespaces Reviewed-By: TrustMe --- src/gui/itemviews/qlistwidget.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/gui/itemviews/qlistwidget.cpp b/src/gui/itemviews/qlistwidget.cpp index 6351496..b518ff2 100644 --- a/src/gui/itemviews/qlistwidget.cpp +++ b/src/gui/itemviews/qlistwidget.cpp @@ -561,7 +561,7 @@ Qt::DropActions QListModel::supportedDropActions() const Constructs an empty list widget item of the specified \a type with the given \a parent. If \a parent is not specified, the item will need to be inserted into a list widget with QListWidget::insertItem(). - + This constructor inserts the item into the model of the parent that is passed to the constructor. If the model is sorted then the behavior of the insert is undetermined since the model will call the \c '<' operator method @@ -588,7 +588,7 @@ QListWidgetItem::QListWidgetItem(QListWidget *view, int type) Constructs an empty list widget item of the specified \a type with the given \a text and \a parent. If the parent is not specified, the item will need to be inserted into a list widget with QListWidget::insertItem(). - + This constructor inserts the item into the model of the parent that is passed to the constructor. If the model is sorted then the behavior of the insert is undetermined since the model will call the \c '<' operator method @@ -618,14 +618,14 @@ QListWidgetItem::QListWidgetItem(const QString &text, QListWidget *view, int typ given \a icon, \a text and \a parent. If the parent is not specified, the item will need to be inserted into a list widget with QListWidget::insertItem(). - + This constructor inserts the item into the model of the parent that is passed to the constructor. If the model is sorted then the behavior of the insert is undetermined since the model will call the \c '<' operator method on the item which, at this point, is not yet constructed. To avoid the undetermined behavior, we recommend not to specify the parent and use QListWidget::insertItem() instead. - + \sa type() */ QListWidgetItem::QListWidgetItem(const QIcon &icon,const QString &text, @@ -1267,7 +1267,7 @@ void QListWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft, \fn void QListWidget::currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous) This signal is emitted whenever the current item changes. - + \a previous is the item that previously had the focus; \a current is the new current item. */ @@ -1276,7 +1276,7 @@ void QListWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft, \fn void QListWidget::currentTextChanged(const QString ¤tText) This signal is emitted whenever the current item changes. - + \a currentText is the text data in the current item. If there is no current item, the \a currentText is invalid. */ @@ -1285,7 +1285,7 @@ void QListWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft, \fn void QListWidget::currentRowChanged(int currentRow) This signal is emitted whenever the current item changes. - + \a currentRow is the row of the current item. If there is no current item, the \a currentRow is -1. */ -- cgit v0.12 From dfa284220498a1e32ab3133f203bcb41cfa136b7 Mon Sep 17 00:00:00 2001 From: Harald Fernengel Date: Fri, 7 Aug 2009 15:08:09 +0200 Subject: Refactor QTestCharBuffer a bit Use a static buffer for small strings, and making it oom safe. We can now see messages up to 512 bytes even if we run out of memory (important for OOM tests). Also, testlogging (< 512 bytes per line) should again work without a single allocation. Reviewed-By: Rohan McGovern --- src/testlib/qabstracttestlogger.cpp | 47 ++++++++++++++++++++++ src/testlib/qabstracttestlogger_p.h | 52 +++++++++++++++++++----- src/testlib/qplaintestlogger.cpp | 10 ++--- src/testlib/qtest_global.h | 1 - src/testlib/qtestbasicstreamer.cpp | 40 +++++++++---------- src/testlib/qtestbasicstreamer.h | 11 ++--- src/testlib/qtestcase.cpp | 37 ----------------- src/testlib/qtestlightxmlstreamer.cpp | 70 ++++++++++++++++---------------- src/testlib/qtestlightxmlstreamer.h | 6 +-- src/testlib/qtestxmlstreamer.cpp | 61 ++++++++++++++-------------- src/testlib/qtestxmlstreamer.h | 6 +-- src/testlib/qtestxunitstreamer.cpp | 43 ++++++++++---------- src/testlib/qtestxunitstreamer.h | 8 ++-- src/testlib/qxmltestlogger.cpp | 75 ++++++++++++++++++----------------- src/testlib/qxmltestlogger_p.h | 8 ++-- 15 files changed, 257 insertions(+), 218 deletions(-) diff --git a/src/testlib/qabstracttestlogger.cpp b/src/testlib/qabstracttestlogger.cpp index 6482ec9..2fa535e 100644 --- a/src/testlib/qabstracttestlogger.cpp +++ b/src/testlib/qabstracttestlogger.cpp @@ -43,8 +43,11 @@ #include "QtTest/private/qtestlog_p.h" #include "QtTest/qtestassert.h" +#include "QtCore/qbytearray.h" + #include #include +#include #ifndef Q_OS_WIN #include @@ -106,4 +109,48 @@ void QAbstractTestLogger::stopLogging() QTest::stream = 0; } +namespace QTest +{ + +extern void filter_unprintable(char *str); + +/*! \internal + */ +int qt_asprintf(QTestCharBuffer *str, const char *format, ...) +{ + static const int MAXSIZE = 1024*1024*2; + + Q_ASSERT(str); + + int size = str->size(); + + va_list ap; + int res = 0; + + for (;;) { + va_start(ap, format); + res = qvsnprintf(str->data(), size, format, ap); + va_end(ap); + str->data()[size - 1] = '\0'; + if (res >= 0 && res < size) { + // We succeeded + break; + } + // buffer wasn't big enough, try again. + // Note, we're assuming that a result of -1 is always due to running out of space. + size *= 2; + if (size > MAXSIZE) { + break; + } + if (!str->reset(size)) + break; // out of memory - take what we have + } + + filter_unprintable(str->data()); + + return res; +} + +} + QT_END_NAMESPACE diff --git a/src/testlib/qabstracttestlogger_p.h b/src/testlib/qabstracttestlogger_p.h index 588184e..1834086 100644 --- a/src/testlib/qabstracttestlogger_p.h +++ b/src/testlib/qabstracttestlogger_p.h @@ -101,27 +101,26 @@ public: struct QTestCharBuffer { - inline QTestCharBuffer() - : buf(0) - {} + enum { InitialSize = 512 }; - inline ~QTestCharBuffer() + inline QTestCharBuffer() + : _size(InitialSize), buf(staticBuf) { - delete[] buf; - buf = 0; + staticBuf[0] = '\0'; } - inline operator void*() + inline ~QTestCharBuffer() { - return buf; + if (buf != staticBuf) + qFree(buf); } - inline operator char*() + inline char *data() { return buf; } - inline operator char**() + inline char **buffer() { return &buf; } @@ -131,10 +130,43 @@ struct QTestCharBuffer return buf; } + inline int size() const + { + return _size; + } + + inline bool reset(int newSize) + { + char *newBuf = 0; + if (buf == staticBuf) { + // if we point to our internal buffer, we need to malloc first + newBuf = reinterpret_cast(qMalloc(newSize)); + } else { + // if we already malloc'ed, just realloc + newBuf = reinterpret_cast(qRealloc(buf, newSize)); + } + + // if the allocation went wrong (newBuf == 0), we leave the object as is + if (!newBuf) + return false; + + _size = newSize; + buf = newBuf; + return true; + } + private: + int _size; char* buf; + char staticBuf[InitialSize]; }; +namespace QTest +{ + int qt_asprintf(QTestCharBuffer *buf, const char *format, ...); +} + + QT_END_NAMESPACE #endif diff --git a/src/testlib/qplaintestlogger.cpp b/src/testlib/qplaintestlogger.cpp index e075b36..2515c51 100644 --- a/src/testlib/qplaintestlogger.cpp +++ b/src/testlib/qplaintestlogger.cpp @@ -180,7 +180,7 @@ namespace QTest { : ""; const char *filler = (tag[0] && gtag[0]) ? ":" : ""; if (file) { - QTest::qt_asprintf(buf, "%s: %s::%s(%s%s%s)%s%s\n" + QTest::qt_asprintf(&buf, "%s: %s::%s(%s%s%s)%s%s\n" #ifdef Q_OS_WIN "%s(%d) : failure location\n" #else @@ -189,14 +189,14 @@ namespace QTest { , type, QTestResult::currentTestObjectName(), fn, gtag, filler, tag, msg[0] ? " " : "", msg, file, line); } else { - QTest::qt_asprintf(buf, "%s: %s::%s(%s%s%s)%s%s\n", + QTest::qt_asprintf(&buf, "%s: %s::%s(%s%s%s)%s%s\n", type, QTestResult::currentTestObjectName(), fn, gtag, filler, tag, msg[0] ? " " : "", msg); } // In colored mode, printf above stripped our nonprintable control characters. // Put them back. - memcpy(buf, type, strlen(type)); - outputMessage(buf); + memcpy(buf.data(), type, strlen(type)); + outputMessage(buf.data()); } template @@ -207,7 +207,7 @@ namespace QTest { int digits = 0; qreal divisor = 1; - + while (num / divisor >= 1) { divisor *= 10; ++digits; diff --git a/src/testlib/qtest_global.h b/src/testlib/qtest_global.h index c40f0ad..b5b0fc0 100644 --- a/src/testlib/qtest_global.h +++ b/src/testlib/qtest_global.h @@ -82,7 +82,6 @@ namespace QTest enum TestFailMode { Abort = 1, Continue = 2 }; int Q_TESTLIB_EXPORT qt_snprintf(char *str, int size, const char *format, ...); - int qt_asprintf(char **str, const char *format, ...); } QT_END_NAMESPACE diff --git a/src/testlib/qtestbasicstreamer.cpp b/src/testlib/qtestbasicstreamer.cpp index aac57ba..89de7d8 100644 --- a/src/testlib/qtestbasicstreamer.cpp +++ b/src/testlib/qtestbasicstreamer.cpp @@ -68,39 +68,39 @@ QTestBasicStreamer::QTestBasicStreamer() QTestBasicStreamer::~QTestBasicStreamer() {} -void QTestBasicStreamer::formatStart(const QTestElement *element, char **formatted) const +void QTestBasicStreamer::formatStart(const QTestElement *element, QTestCharBuffer *formatted) const { if(!element || !formatted ) return; - QTest::qt_asprintf(formatted, ""); + formatted->data()[0] = '\0'; } -void QTestBasicStreamer::formatEnd(const QTestElement *element, char **formatted) const +void QTestBasicStreamer::formatEnd(const QTestElement *element, QTestCharBuffer *formatted) const { if(!element || !formatted ) return; - QTest::qt_asprintf(formatted, ""); + formatted->data()[0] = '\0'; } -void QTestBasicStreamer::formatBeforeAttributes(const QTestElement *element, char **formatted) const +void QTestBasicStreamer::formatBeforeAttributes(const QTestElement *element, QTestCharBuffer *formatted) const { if(!element || !formatted ) return; - QTest::qt_asprintf(formatted, ""); + formatted->data()[0] = '\0'; } -void QTestBasicStreamer::formatAfterAttributes(const QTestElement *element, char **formatted) const +void QTestBasicStreamer::formatAfterAttributes(const QTestElement *element, QTestCharBuffer *formatted) const { if(!element || !formatted ) return; - QTest::qt_asprintf(formatted, ""); + formatted->data()[0] = '\0'; } -void QTestBasicStreamer::formatAttributes(const QTestElement *, const QTestElementAttribute *attribute, char **formatted) const +void QTestBasicStreamer::formatAttributes(const QTestElement *, const QTestElementAttribute *attribute, QTestCharBuffer *formatted) const { if(!attribute || !formatted ) return; - QTest::qt_asprintf(formatted, ""); + formatted->data()[0] = '\0'; } void QTestBasicStreamer::output(QTestElement *element) const @@ -125,22 +125,22 @@ void QTestBasicStreamer::outputElements(QTestElement *element, bool) const while (element) { hasChildren = element->childElements(); - formatStart(element, buf); - outputString(buf); + formatStart(element, &buf); + outputString(buf.data()); - formatBeforeAttributes(element, buf); - outputString(buf); + formatBeforeAttributes(element, &buf); + outputString(buf.data()); outputElementAttributes(element, element->attributes()); - formatAfterAttributes(element, buf); - outputString(buf); + formatAfterAttributes(element, &buf); + outputString(buf.data()); if(hasChildren) outputElements(element->childElements(), true); - formatEnd(element, buf); - outputString(buf); + formatEnd(element, &buf); + outputString(buf.data()); element = element->previousElement(); } @@ -150,8 +150,8 @@ void QTestBasicStreamer::outputElementAttributes(const QTestElement* element, QT { QTestCharBuffer buf; while(attribute){ - formatAttributes(element, attribute, buf); - outputString(buf); + formatAttributes(element, attribute, &buf); + outputString(buf.data()); attribute = attribute->nextElement(); } } diff --git a/src/testlib/qtestbasicstreamer.h b/src/testlib/qtestbasicstreamer.h index 432dd22..cabbf34 100644 --- a/src/testlib/qtestbasicstreamer.h +++ b/src/testlib/qtestbasicstreamer.h @@ -53,6 +53,7 @@ QT_MODULE(Test) class QTestElement; class QTestElementAttribute; class QTestLogger; +class QTestCharBuffer; class QTestBasicStreamer { @@ -71,11 +72,11 @@ class QTestBasicStreamer const QTestLogger *logger() const; protected: - virtual void formatStart(const QTestElement *element, char **formatted) const; - virtual void formatEnd(const QTestElement *element, char **formatted) const; - virtual void formatBeforeAttributes(const QTestElement *element, char **formatted) const; - virtual void formatAfterAttributes(const QTestElement *element, char **formatted) const; - virtual void formatAttributes(const QTestElement *element, const QTestElementAttribute *attribute, char **formatted) const; + virtual void formatStart(const QTestElement *element, QTestCharBuffer *formatted) const; + virtual void formatEnd(const QTestElement *element, QTestCharBuffer *formatted) const; + virtual void formatBeforeAttributes(const QTestElement *element, QTestCharBuffer *formatted) const; + virtual void formatAfterAttributes(const QTestElement *element, QTestCharBuffer *formatted) const; + virtual void formatAttributes(const QTestElement *element, const QTestElementAttribute *attribute, QTestCharBuffer *formatted) const; virtual void outputElements(QTestElement *element, bool isChildElement = false) const; virtual void outputElementAttributes(const QTestElement *element, QTestElementAttribute *attribute) const; diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp index ac4ca83..1866197 100644 --- a/src/testlib/qtestcase.cpp +++ b/src/testlib/qtestcase.cpp @@ -820,43 +820,6 @@ void filter_unprintable(char *str) /*! \internal */ -int qt_asprintf(char **str, const char *format, ...) -{ - static const int MAXSIZE = 1024*1024*2; - - int size = 32; - delete[] *str; - *str = new char[size]; - - va_list ap; - int res = 0; - - for (;;) { - va_start(ap, format); - res = qvsnprintf(*str, size, format, ap); - va_end(ap); - (*str)[size - 1] = '\0'; - if (res >= 0 && res < size) { - // We succeeded - break; - } - // buffer wasn't big enough, try again. - // Note, we're assuming that a result of -1 is always due to running out of space. - size *= 2; - if (size > MAXSIZE) { - break; - } - delete[] *str; - *str = new char[size]; - } - - filter_unprintable(*str); - - return res; -} - -/*! \internal - */ int qt_snprintf(char *str, int size, const char *format, ...) { va_list ap; diff --git a/src/testlib/qtestlightxmlstreamer.cpp b/src/testlib/qtestlightxmlstreamer.cpp index e176201..b84f531 100644 --- a/src/testlib/qtestlightxmlstreamer.cpp +++ b/src/testlib/qtestlightxmlstreamer.cpp @@ -59,7 +59,7 @@ QTestLightXmlStreamer::QTestLightXmlStreamer() QTestLightXmlStreamer::~QTestLightXmlStreamer() {} -void QTestLightXmlStreamer::formatStart(const QTestElement *element, char **formatted) const +void QTestLightXmlStreamer::formatStart(const QTestElement *element, QTestCharBuffer *formatted) const { if(!element || !formatted) return; @@ -67,14 +67,14 @@ void QTestLightXmlStreamer::formatStart(const QTestElement *element, char **form switch(element->elementType()){ case QTest::LET_TestCase: { QTestCharBuffer quotedTf; - QXmlTestLogger::xmlQuote(quotedTf, element->attributeValue(QTest::AI_Name)); + QXmlTestLogger::xmlQuote("edTf, element->attributeValue(QTest::AI_Name)); QTest::qt_asprintf(formatted, "\n", quotedTf.constData()); break; } case QTest::LET_Failure: { QTestCharBuffer cdataDesc; - QXmlTestLogger::xmlCdata(cdataDesc, element->attributeValue(QTest::AI_Description)); + QXmlTestLogger::xmlCdata(&cdataDesc, element->attributeValue(QTest::AI_Description)); QTest::qt_asprintf(formatted, " \n", cdataDesc.constData()); @@ -84,8 +84,8 @@ void QTestLightXmlStreamer::formatStart(const QTestElement *element, char **form // assuming type and attribute names don't need quoting QTestCharBuffer quotedFile; QTestCharBuffer cdataDesc; - QXmlTestLogger::xmlQuote(quotedFile, element->attributeValue(QTest::AI_File)); - QXmlTestLogger::xmlCdata(cdataDesc, element->attributeValue(QTest::AI_Description)); + QXmlTestLogger::xmlQuote("edFile, element->attributeValue(QTest::AI_File)); + QXmlTestLogger::xmlCdata(&cdataDesc, element->attributeValue(QTest::AI_Description)); QTest::qt_asprintf(formatted, "\n \n\n", element->attributeValue(QTest::AI_Type), @@ -100,8 +100,8 @@ void QTestLightXmlStreamer::formatStart(const QTestElement *element, char **form // assuming value and iterations don't need quoting QTestCharBuffer quotedMetric; QTestCharBuffer quotedTag; - QXmlTestLogger::xmlQuote(quotedMetric, element->attributeValue(QTest::AI_Metric)); - QXmlTestLogger::xmlQuote(quotedTag, element->attributeValue(QTest::AI_Tag)); + QXmlTestLogger::xmlQuote("edMetric, element->attributeValue(QTest::AI_Metric)); + QXmlTestLogger::xmlQuote("edTag, element->attributeValue(QTest::AI_Tag)); QTest::qt_asprintf(formatted, "\n", element->attributeName(QTest::AI_Metric), @@ -115,11 +115,11 @@ void QTestLightXmlStreamer::formatStart(const QTestElement *element, char **form break; } default: - QTest::qt_asprintf(formatted, ""); + formatted->data()[0] = '\0'; } } -void QTestLightXmlStreamer::formatEnd(const QTestElement *element, char **formatted) const +void QTestLightXmlStreamer::formatEnd(const QTestElement *element, QTestCharBuffer *formatted) const { if(!element || !formatted) return; @@ -129,47 +129,47 @@ void QTestLightXmlStreamer::formatEnd(const QTestElement *element, char **format QTest::qt_asprintf(formatted, "\n\n"); else QTest::qt_asprintf(formatted, "\n"); + } else { + formatted->data()[0] = '\0'; } - else - QTest::qt_asprintf(formatted, ""); } -void QTestLightXmlStreamer::formatBeforeAttributes(const QTestElement *element, char **formatted) const +void QTestLightXmlStreamer::formatBeforeAttributes(const QTestElement *element, QTestCharBuffer *formatted) const { if(!element || !formatted) return; - if (element->elementType() == QTest::LET_TestCase && element->attribute(QTest::AI_Result)){ - QTestCharBuffer buf; - QTestCharBuffer quotedFile; - QXmlTestLogger::xmlQuote(quotedFile, element->attributeValue(QTest::AI_File)); - - QTest::qt_asprintf(buf, "%s=\"%s\" %s=\"%s\"", - element->attributeName(QTest::AI_File), - quotedFile.constData(), - element->attributeName(QTest::AI_Line), - element->attributeValue(QTest::AI_Line)); - - if( !element->childElements() ) - QTest::qt_asprintf(formatted, "\n", - element->attributeValue(QTest::AI_Result), buf.constData()); - else - QTest::qt_asprintf(formatted, "\n", - element->attributeValue(QTest::AI_Result), buf.constData()); - }else{ - QTest::qt_asprintf(formatted, ""); + if (element->elementType() == QTest::LET_TestCase && element->attribute(QTest::AI_Result)) { + QTestCharBuffer buf; + QTestCharBuffer quotedFile; + QXmlTestLogger::xmlQuote("edFile, element->attributeValue(QTest::AI_File)); + + QTest::qt_asprintf(&buf, "%s=\"%s\" %s=\"%s\"", + element->attributeName(QTest::AI_File), + quotedFile.constData(), + element->attributeName(QTest::AI_Line), + element->attributeValue(QTest::AI_Line)); + + if( !element->childElements() ) + QTest::qt_asprintf(formatted, "\n", + element->attributeValue(QTest::AI_Result), buf.constData()); + else + QTest::qt_asprintf(formatted, "\n", + element->attributeValue(QTest::AI_Result), buf.constData()); + } else { + formatted->data()[0] = '\0'; } } void QTestLightXmlStreamer::output(QTestElement *element) const { QTestCharBuffer buf; - QTest::qt_asprintf(buf, "\n %s\n %s\n", + QTest::qt_asprintf(&buf, "\n %s\n %s\n", qVersion(), QTEST_VERSION_STR ); - outputString(buf); + outputString(buf.constData()); - QTest::qt_asprintf(buf, "\n"); - outputString(buf); + QTest::qt_asprintf(&buf, "\n"); + outputString(buf.constData()); QTestBasicStreamer::output(element); } diff --git a/src/testlib/qtestlightxmlstreamer.h b/src/testlib/qtestlightxmlstreamer.h index 6dafdcc..e147e5c 100644 --- a/src/testlib/qtestlightxmlstreamer.h +++ b/src/testlib/qtestlightxmlstreamer.h @@ -59,9 +59,9 @@ class QTestLightXmlStreamer: public QTestBasicStreamer QTestLightXmlStreamer(); ~QTestLightXmlStreamer(); - void formatStart(const QTestElement *element, char **formatted) const; - void formatEnd(const QTestElement *element, char **formatted) const; - void formatBeforeAttributes(const QTestElement *element, char **formatted) const; + void formatStart(const QTestElement *element, QTestCharBuffer *formatted) const; + void formatEnd(const QTestElement *element, QTestCharBuffer *formatted) const; + void formatBeforeAttributes(const QTestElement *element, QTestCharBuffer *formatted) const; void output(QTestElement *element) const; }; diff --git a/src/testlib/qtestxmlstreamer.cpp b/src/testlib/qtestxmlstreamer.cpp index 1b6e674..c72d648 100644 --- a/src/testlib/qtestxmlstreamer.cpp +++ b/src/testlib/qtestxmlstreamer.cpp @@ -60,7 +60,7 @@ QTestXmlStreamer::QTestXmlStreamer() QTestXmlStreamer::~QTestXmlStreamer() {} -void QTestXmlStreamer::formatStart(const QTestElement *element, char **formatted) const +void QTestXmlStreamer::formatStart(const QTestElement *element, QTestCharBuffer *formatted) const { if(!element || !formatted) return; @@ -68,20 +68,20 @@ void QTestXmlStreamer::formatStart(const QTestElement *element, char **formatted switch(element->elementType()){ case QTest::LET_TestCase: { QTestCharBuffer quotedTf; - QXmlTestLogger::xmlQuote(quotedTf, element->attributeValue(QTest::AI_Name)); + QXmlTestLogger::xmlQuote("edTf, element->attributeValue(QTest::AI_Name)); QTest::qt_asprintf(formatted, "\n", quotedTf.constData()); break; } case QTest::LET_Failure: { QTestCharBuffer cdataDesc; - QXmlTestLogger::xmlCdata(cdataDesc, element->attributeValue(QTest::AI_Description)); + QXmlTestLogger::xmlCdata(&cdataDesc, element->attributeValue(QTest::AI_Description)); QTestCharBuffer location; QTestCharBuffer quotedFile; - QXmlTestLogger::xmlQuote(quotedFile, element->attributeValue(QTest::AI_File)); + QXmlTestLogger::xmlQuote("edFile, element->attributeValue(QTest::AI_File)); - QTest::qt_asprintf(location, "%s=\"%s\" %s=\"%s\"", + QTest::qt_asprintf(&location, "%s=\"%s\" %s=\"%s\"", element->attributeName(QTest::AI_File), quotedFile.constData(), element->attributeName(QTest::AI_Line), @@ -89,7 +89,7 @@ void QTestXmlStreamer::formatStart(const QTestElement *element, char **formatted if (element->attribute(QTest::AI_Tag)) { QTestCharBuffer cdataTag; - QXmlTestLogger::xmlCdata(cdataTag, element->attributeValue(QTest::AI_Tag)); + QXmlTestLogger::xmlCdata(&cdataTag, element->attributeValue(QTest::AI_Tag)); QTest::qt_asprintf(formatted, "\n" " \n" " \n" @@ -108,8 +108,8 @@ void QTestXmlStreamer::formatStart(const QTestElement *element, char **formatted // assuming type and attribute names don't need quoting QTestCharBuffer quotedFile; QTestCharBuffer cdataDesc; - QXmlTestLogger::xmlQuote(quotedFile, element->attributeValue(QTest::AI_File)); - QXmlTestLogger::xmlCdata(cdataDesc, element->attributeValue(QTest::AI_Description)); + QXmlTestLogger::xmlQuote("edFile, element->attributeValue(QTest::AI_File)); + QXmlTestLogger::xmlCdata(&cdataDesc, element->attributeValue(QTest::AI_Description)); QTest::qt_asprintf(formatted, "\n \n\n", element->attributeValue(QTest::AI_Type), @@ -124,8 +124,8 @@ void QTestXmlStreamer::formatStart(const QTestElement *element, char **formatted // assuming value and iterations don't need quoting QTestCharBuffer quotedMetric; QTestCharBuffer quotedTag; - QXmlTestLogger::xmlQuote(quotedMetric, element->attributeValue(QTest::AI_Metric)); - QXmlTestLogger::xmlQuote(quotedTag, element->attributeValue(QTest::AI_Tag)); + QXmlTestLogger::xmlQuote("edMetric, element->attributeValue(QTest::AI_Metric)); + QXmlTestLogger::xmlQuote("edTag, element->attributeValue(QTest::AI_Tag)); QTest::qt_asprintf(formatted, "\n", element->attributeName(QTest::AI_Metric), @@ -139,23 +139,23 @@ void QTestXmlStreamer::formatStart(const QTestElement *element, char **formatted break; } default: - QTest::qt_asprintf(formatted, ""); + formatted->data()[0] = '\0'; } } -void QTestXmlStreamer::formatEnd(const QTestElement *element, char **formatted) const +void QTestXmlStreamer::formatEnd(const QTestElement *element, QTestCharBuffer *formatted) const { if(!element || !formatted) return; if (element->elementType() == QTest::LET_TestCase) { QTest::qt_asprintf(formatted, "\n"); + } else { + formatted->data()[0] = '\0'; } - else - QTest::qt_asprintf(formatted, ""); } -void QTestXmlStreamer::formatBeforeAttributes(const QTestElement *element, char **formatted) const +void QTestXmlStreamer::formatBeforeAttributes(const QTestElement *element, QTestCharBuffer *formatted) const { if(!element || !formatted) return; @@ -163,9 +163,9 @@ void QTestXmlStreamer::formatBeforeAttributes(const QTestElement *element, char if (element->elementType() == QTest::LET_TestCase && element->attribute(QTest::AI_Result)){ QTestCharBuffer buf; QTestCharBuffer quotedFile; - QXmlTestLogger::xmlQuote(quotedFile, element->attributeValue(QTest::AI_File)); + QXmlTestLogger::xmlQuote("edFile, element->attributeValue(QTest::AI_File)); - QTest::qt_asprintf(buf, "%s=\"%s\" %s=\"%s\"", + QTest::qt_asprintf(&buf, "%s=\"%s\" %s=\"%s\"", element->attributeName(QTest::AI_File), quotedFile.constData(), element->attributeName(QTest::AI_Line), @@ -174,12 +174,11 @@ void QTestXmlStreamer::formatBeforeAttributes(const QTestElement *element, char if( !element->childElements() ) { QTest::qt_asprintf(formatted, "\n", element->attributeValue(QTest::AI_Result), buf.constData()); + } else { + formatted->data()[0] = '\0'; } - else { - QTest::qt_asprintf(formatted, ""); - } - }else{ - QTest::qt_asprintf(formatted, ""); + } else { + formatted->data()[0] = '\0'; } } @@ -187,23 +186,23 @@ void QTestXmlStreamer::output(QTestElement *element) const { QTestCharBuffer buf; QTestCharBuffer quotedTc; - QXmlTestLogger::xmlQuote(quotedTc, QTestResult::currentTestObjectName()); + QXmlTestLogger::xmlQuote("edTc, QTestResult::currentTestObjectName()); - QTest::qt_asprintf(buf, "\n\n", + QTest::qt_asprintf(&buf, "\n\n", quotedTc.constData()); - outputString(buf); + outputString(buf.constData()); - QTest::qt_asprintf(buf, "\n %s\n %s\n", + QTest::qt_asprintf(&buf, "\n %s\n %s\n", qVersion(), QTEST_VERSION_STR ); - outputString(buf); + outputString(buf.constData()); - QTest::qt_asprintf(buf, "\n"); - outputString(buf); + QTest::qt_asprintf(&buf, "\n"); + outputString(buf.constData()); QTestBasicStreamer::output(element); - QTest::qt_asprintf(buf, "\n"); - outputString(buf); + QTest::qt_asprintf(&buf, "\n"); + outputString(buf.constData()); } QT_END_NAMESPACE diff --git a/src/testlib/qtestxmlstreamer.h b/src/testlib/qtestxmlstreamer.h index a601f60..6e1ae84 100644 --- a/src/testlib/qtestxmlstreamer.h +++ b/src/testlib/qtestxmlstreamer.h @@ -59,9 +59,9 @@ class QTestXmlStreamer: public QTestBasicStreamer QTestXmlStreamer(); ~QTestXmlStreamer(); - void formatStart(const QTestElement *element, char **formatted) const; - void formatEnd(const QTestElement *element, char **formatted) const; - void formatBeforeAttributes(const QTestElement *element, char **formatted) const; + void formatStart(const QTestElement *element, QTestCharBuffer *formatted) const; + void formatEnd(const QTestElement *element, QTestCharBuffer *formatted) const; + void formatBeforeAttributes(const QTestElement *element, QTestCharBuffer *formatted) const; void output(QTestElement *element) const; }; diff --git a/src/testlib/qtestxunitstreamer.cpp b/src/testlib/qtestxunitstreamer.cpp index d5d2631..932b70b 100644 --- a/src/testlib/qtestxunitstreamer.cpp +++ b/src/testlib/qtestxunitstreamer.cpp @@ -73,7 +73,7 @@ void QTestXunitStreamer::indentForElement(const QTestElement* element, char* buf } } -void QTestXunitStreamer::formatStart(const QTestElement *element, char **formatted) const +void QTestXunitStreamer::formatStart(const QTestElement *element, QTestCharBuffer *formatted) const { if(!element || !formatted ) return; @@ -85,8 +85,7 @@ void QTestXunitStreamer::formatStart(const QTestElement *element, char **formatt if (element->elementType() == QTest::LET_Error) { if (element->parentElement()->elementType() == QTest::LET_SystemError) { QTest::qt_asprintf(formatted, "elementName()); } -void QTestXunitStreamer::formatEnd(const QTestElement *element, char **formatted) const +void QTestXunitStreamer::formatEnd(const QTestElement *element, QTestCharBuffer *formatted) const { - if(!element || !formatted ) + if (!element || !formatted ) return; - if(!element->childElements()){ - QTest::qt_asprintf(formatted, ""); + if (!element->childElements()){ + formatted->data()[0] = '\0'; return; } @@ -111,7 +110,7 @@ void QTestXunitStreamer::formatEnd(const QTestElement *element, char **formatted QTest::qt_asprintf(formatted, "%s\n", indent, element->elementName()); } -void QTestXunitStreamer::formatAttributes(const QTestElement* element, const QTestElementAttribute *attribute, char **formatted) const +void QTestXunitStreamer::formatAttributes(const QTestElement* element, const QTestElementAttribute *attribute, QTestCharBuffer *formatted) const { if(!attribute || !formatted ) return; @@ -136,15 +135,14 @@ void QTestXunitStreamer::formatAttributes(const QTestElement* element, const QTe if (key) { QTestCharBuffer quotedValue; - QXmlTestLogger::xmlQuote(quotedValue, attribute->value()); + QXmlTestLogger::xmlQuote("edValue, attribute->value()); QTest::qt_asprintf(formatted, " %s=\"%s\"", key, quotedValue.constData()); - } - else { - QTest::qt_asprintf(formatted, ""); + } else { + formatted->data()[0] = '\0'; } } -void QTestXunitStreamer::formatAfterAttributes(const QTestElement *element, char **formatted) const +void QTestXunitStreamer::formatAfterAttributes(const QTestElement *element, QTestCharBuffer *formatted) const { if(!element || !formatted ) return; @@ -153,8 +151,7 @@ void QTestXunitStreamer::formatAfterAttributes(const QTestElement *element, char if (element->elementType() == QTest::LET_Error) { if (element->parentElement()->elementType() == QTest::LET_SystemError) { QTest::qt_asprintf(formatted, "]]>\n"); - } - else { + } else { QTest::qt_asprintf(formatted, " -->\n"); } return; @@ -187,22 +184,22 @@ void QTestXunitStreamer::outputElements(QTestElement *element, bool) const hasChildren = element->childElements(); if(element->elementType() != QTest::LET_Benchmark){ - formatStart(element, buf); - outputString(buf); + formatStart(element, &buf); + outputString(buf.data()); - formatBeforeAttributes(element, buf); - outputString(buf); + formatBeforeAttributes(element, &buf); + outputString(buf.data()); outputElementAttributes(element, element->attributes()); - formatAfterAttributes(element, buf); - outputString(buf); + formatAfterAttributes(element, &buf); + outputString(buf.data()); if(hasChildren) outputElements(element->childElements(), true); - formatEnd(element, buf); - outputString(buf); + formatEnd(element, &buf); + outputString(buf.data()); } element = element->previousElement(); } diff --git a/src/testlib/qtestxunitstreamer.h b/src/testlib/qtestxunitstreamer.h index 044307f..43ff03d 100644 --- a/src/testlib/qtestxunitstreamer.h +++ b/src/testlib/qtestxunitstreamer.h @@ -58,10 +58,10 @@ class QTestXunitStreamer: public QTestBasicStreamer QTestXunitStreamer(); ~QTestXunitStreamer(); - void formatStart(const QTestElement *element, char **formatted) const; - void formatEnd(const QTestElement *element, char **formatted) const; - void formatAfterAttributes(const QTestElement *element, char **formatted) const; - void formatAttributes(const QTestElement *element, const QTestElementAttribute *attribute, char **formatted) const; + void formatStart(const QTestElement *element, QTestCharBuffer *formatted) const; + void formatEnd(const QTestElement *element, QTestCharBuffer *formatted) const; + void formatAfterAttributes(const QTestElement *element, QTestCharBuffer *formatted) const; + void formatAttributes(const QTestElement *element, const QTestElementAttribute *attribute, QTestCharBuffer *formatted) const; void output(QTestElement *element) const; void outputElements(QTestElement *element, bool isChildElement = false) const; diff --git a/src/testlib/qxmltestlogger.cpp b/src/testlib/qxmltestlogger.cpp index fca7bfc..494acb4 100644 --- a/src/testlib/qxmltestlogger.cpp +++ b/src/testlib/qxmltestlogger.cpp @@ -108,19 +108,19 @@ void QXmlTestLogger::startLogging() if (xmlmode == QXmlTestLogger::Complete) { QTestCharBuffer quotedTc; - xmlQuote(quotedTc, QTestResult::currentTestObjectName()); - QTest::qt_asprintf(buf, + xmlQuote("edTc, QTestResult::currentTestObjectName()); + QTest::qt_asprintf(&buf, "\n" "\n", quotedTc.constData()); - outputString(buf); + outputString(buf.constData()); } - QTest::qt_asprintf(buf, + QTest::qt_asprintf(&buf, "\n" " %s\n" " "QTEST_VERSION_STR"\n" "\n", qVersion()); - outputString(buf); + outputString(buf.constData()); } void QXmlTestLogger::stopLogging() @@ -136,9 +136,9 @@ void QXmlTestLogger::enterTestFunction(const char *function) { QTestCharBuffer buf; QTestCharBuffer quotedFunction; - xmlQuote(quotedFunction, function); - QTest::qt_asprintf(buf, "\n", quotedFunction.constData()); - outputString(buf); + xmlQuote("edFunction, function); + QTest::qt_asprintf(&buf, "\n", quotedFunction.constData()); + outputString(buf.constData()); } void QXmlTestLogger::leaveTestFunction() @@ -219,12 +219,12 @@ void QXmlTestLogger::addIncident(IncidentTypes type, const char *description, QTestCharBuffer cdataTag; QTestCharBuffer cdataDescription; - xmlQuote(quotedFile, file); - xmlCdata(cdataGtag, gtag); - xmlCdata(cdataTag, tag); - xmlCdata(cdataDescription, description); + xmlQuote("edFile, file); + xmlCdata(&cdataGtag, gtag); + xmlCdata(&cdataTag, tag); + xmlCdata(&cdataDescription, description); - QTest::qt_asprintf(buf, + QTest::qt_asprintf(&buf, QTest::incidentFormatString(QTest::isEmpty(description), notag), QTest::xmlIncidentType2String(type), quotedFile.constData(), line, @@ -233,7 +233,7 @@ void QXmlTestLogger::addIncident(IncidentTypes type, const char *description, cdataTag.constData(), cdataDescription.constData()); - outputString(buf); + outputString(buf.constData()); } void QXmlTestLogger::addBenchmarkResult(const QBenchmarkResult &result) @@ -242,18 +242,18 @@ void QXmlTestLogger::addBenchmarkResult(const QBenchmarkResult &result) QTestCharBuffer quotedMetric; QTestCharBuffer quotedTag; - xmlQuote(quotedMetric, + xmlQuote("edMetric, QBenchmarkGlobalData::current->measurer->metricText().toAscii().constData()); - xmlQuote(quotedTag, result.context.tag.toAscii().constData()); + xmlQuote("edTag, result.context.tag.toAscii().constData()); QTest::qt_asprintf( - buf, + &buf, QTest::benchmarkResultFormatString(), quotedMetric.constData(), quotedTag.constData(), QByteArray::number(result.value).constData(), //no 64-bit qt_snprintf support result.iterations); - outputString(buf); + outputString(buf.constData()); } void QXmlTestLogger::addMessage(MessageTypes type, const char *message, @@ -270,12 +270,12 @@ void QXmlTestLogger::addMessage(MessageTypes type, const char *message, QTestCharBuffer cdataTag; QTestCharBuffer cdataDescription; - xmlQuote(quotedFile, file); - xmlCdata(cdataGtag, gtag); - xmlCdata(cdataTag, tag); - xmlCdata(cdataDescription, message); + xmlQuote("edFile, file); + xmlCdata(&cdataGtag, gtag); + xmlCdata(&cdataTag, tag); + xmlCdata(&cdataDescription, message); - QTest::qt_asprintf(buf, + QTest::qt_asprintf(&buf, QTest::messageFormatString(QTest::isEmpty(message), notag), QTest::xmlMessageType2String(type), quotedFile.constData(), line, @@ -284,7 +284,7 @@ void QXmlTestLogger::addMessage(MessageTypes type, const char *message, cdataTag.constData(), cdataDescription.constData()); - outputString(buf); + outputString(buf.constData()); } /* @@ -292,10 +292,11 @@ void QXmlTestLogger::addMessage(MessageTypes type, const char *message, XML characters as necessary so that dest is suitable for use in an XML quoted attribute string. */ -int QXmlTestLogger::xmlQuote(char* dest, char const* src, size_t n) +int QXmlTestLogger::xmlQuote(QTestCharBuffer* destBuf, char const* src, size_t n) { if (n == 0) return 0; + char *dest = destBuf->data(); *dest = 0; if (!src) return 0; @@ -351,10 +352,12 @@ int QXmlTestLogger::xmlQuote(char* dest, char const* src, size_t n) Copy up to n characters from the src string into dest, escaping any special strings such that dest is suitable for use in an XML CDATA section. */ -int QXmlTestLogger::xmlCdata(char* dest, char const* src, size_t n) +int QXmlTestLogger::xmlCdata(QTestCharBuffer *destBuf, char const* src, size_t n) { if (!n) return 0; + char *dest = destBuf->data(); + if (!src || n == 1) { *dest = 0; return 0; @@ -394,25 +397,23 @@ int QXmlTestLogger::xmlCdata(char* dest, char const* src, size_t n) return (dest-begin); } -typedef int (*StringFormatFunction)(char*,char const*,size_t); +typedef int (*StringFormatFunction)(QTestCharBuffer*,char const*,size_t); /* A wrapper for string functions written to work with a fixed size buffer so they can be called with a dynamically allocated buffer. */ -int allocateStringFn(char** str, char const* src, StringFormatFunction func) +int allocateStringFn(QTestCharBuffer* str, char const* src, StringFormatFunction func) { static const int MAXSIZE = 1024*1024*2; - int size = 32; - delete[] *str; - *str = new char[size]; + int size = str->size(); int res = 0; for (;;) { - res = func(*str, src, size); - (*str)[size - 1] = '\0'; + res = func(str, src, size); + str->data()[size - 1] = '\0'; if (res < size) { // We succeeded or fatally failed break; @@ -422,19 +423,19 @@ int allocateStringFn(char** str, char const* src, StringFormatFunction func) if (size > MAXSIZE) { break; } - delete[] *str; - *str = new char[size]; + if (!str->reset(size)) + break; // ran out of memory - bye } return res; } -int QXmlTestLogger::xmlQuote(char** str, char const* src) +int QXmlTestLogger::xmlQuote(QTestCharBuffer* str, char const* src) { return allocateStringFn(str, src, QXmlTestLogger::xmlQuote); } -int QXmlTestLogger::xmlCdata(char** str, char const* src) +int QXmlTestLogger::xmlCdata(QTestCharBuffer* str, char const* src) { return allocateStringFn(str, src, QXmlTestLogger::xmlCdata); } diff --git a/src/testlib/qxmltestlogger_p.h b/src/testlib/qxmltestlogger_p.h index a7cc00a..e14504c 100644 --- a/src/testlib/qxmltestlogger_p.h +++ b/src/testlib/qxmltestlogger_p.h @@ -79,10 +79,10 @@ public: void addMessage(MessageTypes type, const char *message, const char *file = 0, int line = 0); - static int xmlCdata(char** dest, char const* src); - static int xmlQuote(char** dest, char const* src); - static int xmlCdata(char* dest, char const* src, size_t n); - static int xmlQuote(char* dest, char const* src, size_t n); + static int xmlCdata(QTestCharBuffer *dest, char const* src); + static int xmlQuote(QTestCharBuffer *dest, char const* src); + static int xmlCdata(QTestCharBuffer *dest, char const* src, size_t n); + static int xmlQuote(QTestCharBuffer *dest, char const* src, size_t n); private: XmlMode xmlmode; -- cgit v0.12 From 56d84a7dcbbaee6402d1d43bba879b135839ad61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Arve=20S=C3=A6ther?= Date: Fri, 7 Aug 2009 15:34:31 +0200 Subject: Don't crash if we are drawing an empty image. Reviewed-by: gunnar --- src/gui/painting/qpaintengine_raster.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp index 74456dd..b260f41 100644 --- a/src/gui/painting/qpaintengine_raster.cpp +++ b/src/gui/painting/qpaintengine_raster.cpp @@ -2542,6 +2542,9 @@ void QRasterPaintEngine::drawImage(const QRectF &r, const QImage &img, const QRe qDebug() << " - QRasterPaintEngine::drawImage(), r=" << r << " sr=" << sr << " image=" << img.size() << "depth=" << img.depth(); #endif + if (r.isEmpty()) + return; + Q_D(QRasterPaintEngine); QRasterPaintEngineState *s = state(); const bool aa = s->flags.antialiased || s->flags.bilinear; -- cgit v0.12 From f99e01bccb5e2b686c0d98ea3743e9fcf48ce8d2 Mon Sep 17 00:00:00 2001 From: Harald Fernengel Date: Fri, 7 Aug 2009 16:09:45 +0200 Subject: Fix build warning gcc was complaining about format string not being a string literal. Also fixes the small chance that error messages would be bogus if they contain printf control characters. Reviewed-by: Bradley T. Hughes --- src/tools/uic/uic.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/uic/uic.cpp b/src/tools/uic/uic.cpp index f789980..14576e2 100644 --- a/src/tools/uic/uic.cpp +++ b/src/tools/uic/uic.cpp @@ -184,7 +184,7 @@ DomUI *Uic::parseUiFile(QXmlStreamReader &reader) if (reader.hasError()) { delete ui; ui = 0; - fprintf(stderr, qPrintable(QString::fromLatin1("uic: Error in line %1, column %2 : %3\n") + fprintf(stderr, "%s\n", qPrintable(QString::fromLatin1("uic: Error in line %1, column %2 : %3") .arg(reader.lineNumber()).arg(reader.columnNumber()) .arg(reader.errorString()))); } -- cgit v0.12 From 132a319dc782ef1feebe6582fb6f05dc91df74bb Mon Sep 17 00:00:00 2001 From: Anders Bakken Date: Fri, 7 Aug 2009 07:28:27 -0700 Subject: Fix compiler error on GCC 4.2.0 mips/sh3 Before this patch gcc would fail with this message: internal compiler error: in add_virtual_operand, at tree-ssa-operands.c:1317 Reviewed-by: Volker Hilsheimer --- src/gui/graphicsview/qgraphicsview.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/gui/graphicsview/qgraphicsview.cpp b/src/gui/graphicsview/qgraphicsview.cpp index ca55f2e..92f8816 100644 --- a/src/gui/graphicsview/qgraphicsview.cpp +++ b/src/gui/graphicsview/qgraphicsview.cpp @@ -2209,8 +2209,7 @@ QPolygonF QGraphicsView::mapToScene(const QRect &rect) const QPointF br = scrollOffset + r.bottomRight(); QPointF bl = scrollOffset + r.bottomLeft(); - QPolygonF poly; - poly.resize(4); + QPolygonF poly(4); if (!d->identityMatrix) { QTransform x = d->matrix.inverted(); poly[0] = x.map(tl); @@ -2313,8 +2312,7 @@ QPolygon QGraphicsView::mapFromScene(const QRectF &rect) const br -= scrollOffset; bl -= scrollOffset; - QPolygon poly; - poly.resize(4); + QPolygon poly(4); poly[0] = tl.toPoint(); poly[1] = tr.toPoint(); poly[2] = br.toPoint(); @@ -3647,8 +3645,7 @@ QRectF QGraphicsViewPrivate::mapToScene(const QRectF &rect) const QPointF br = scrollOffset + rect.bottomRight(); QPointF bl = scrollOffset + rect.bottomLeft(); - QPolygonF poly; - poly.resize(4); + QPolygonF poly(4); if (!identityMatrix) { QTransform x = matrix.inverted(); poly[0] = x.map(tl); -- cgit v0.12 From d13418effc5f00474541ae513a30c9a42c2a1cb3 Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Fri, 7 Aug 2009 17:14:31 +0200 Subject: QItemSelectionModel did not send selectionChanged signal when deleting an item in a tree-like model with one of its grand-children being selected. Added recursive deselection for the model. Task-number: 232634 Reviewed-by: thierry --- src/gui/itemviews/qitemselectionmodel.cpp | 22 +++++++++++++++++++- src/gui/itemviews/qitemselectionmodel_p.h | 2 ++ .../tst_qitemselectionmodel.cpp | 24 ++++++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/gui/itemviews/qitemselectionmodel.cpp b/src/gui/itemviews/qitemselectionmodel.cpp index 9dad95f..0f35ac1 100644 --- a/src/gui/itemviews/qitemselectionmodel.cpp +++ b/src/gui/itemviews/qitemselectionmodel.cpp @@ -593,10 +593,30 @@ void QItemSelectionModelPrivate::_q_rowsAboutToBeRemoved(const QModelIndex &pare // update selectionsx QModelIndex tl = model->index(start, 0, parent); QModelIndex br = model->index(end, model->columnCount(parent) - 1, parent); - q->select(QItemSelection(tl, br), QItemSelectionModel::Deselect); + recursiveDeselect(QItemSelectionRange(tl, br)); finalize(); } +void QItemSelectionModelPrivate::recursiveDeselect(const QItemSelectionRange &range) +{ + Q_Q(QItemSelectionModel); + + QItemSelection sel(range.topLeft(), range.bottomRight()); + q->select(sel, QItemSelectionModel::Deselect); + + QModelIndexList idxList = range.indexes(); + QModelIndexList::const_iterator it = idxList.begin(); + for (; it != idxList.end(); ++it) + { + if (!model->hasChildren(*it)) + continue; + + const QModelIndex &firstChild = it->child(0,0); + const QModelIndex &lastChild = it->child(model->rowCount(*it) - 1, model->columnCount(*it) - 1); + recursiveDeselect(QItemSelectionRange(firstChild, lastChild)); + } +} + /*! \internal */ diff --git a/src/gui/itemviews/qitemselectionmodel_p.h b/src/gui/itemviews/qitemselectionmodel_p.h index 18ad506..8176d4c 100644 --- a/src/gui/itemviews/qitemselectionmodel_p.h +++ b/src/gui/itemviews/qitemselectionmodel_p.h @@ -77,6 +77,8 @@ public: void _q_layoutAboutToBeChanged(); void _q_layoutChanged(); + void recursiveDeselect(const QItemSelectionRange &range); + inline void remove(QList &r) { QList::const_iterator it = r.constBegin(); diff --git a/tests/auto/qitemselectionmodel/tst_qitemselectionmodel.cpp b/tests/auto/qitemselectionmodel/tst_qitemselectionmodel.cpp index 0541b46..05e23f1 100644 --- a/tests/auto/qitemselectionmodel/tst_qitemselectionmodel.cpp +++ b/tests/auto/qitemselectionmodel/tst_qitemselectionmodel.cpp @@ -90,6 +90,7 @@ private slots: void merge(); void task119433_isRowSelected(); void task252069_rowIntersectsSelection(); + void task232634_childrenDeselectionSignal(); private: QAbstractItemModel *model; @@ -2187,5 +2188,28 @@ void tst_QItemSelectionModel::task252069_rowIntersectsSelection() QVERIFY(!selected.columnIntersectsSelection(5, QModelIndex())); } +void tst_QItemSelectionModel::task232634_childrenDeselectionSignal() +{ + QStandardItemModel model; + + QStandardItem *parentItem = model.invisibleRootItem(); + for (int i = 0; i < 4; ++i) { + QStandardItem *item = new QStandardItem(QString("item %0").arg(i)); + parentItem->appendRow(item); + parentItem = item; + } + + QModelIndex root = model.index(0,0); + QModelIndex par = root.child(0,0); + QModelIndex sel = par.child(0,0); + + QItemSelectionModel selectionModel(&model); + selectionModel.select(sel, QItemSelectionModel::SelectCurrent); + + QSignalSpy deselectSpy(&selectionModel, SIGNAL(selectionChanged(const QItemSelection& , const QItemSelection&))); + model.removeRows(0, 1, root); + QVERIFY(deselectSpy.count() == 1); +} + QTEST_MAIN(tst_QItemSelectionModel) #include "tst_qitemselectionmodel.moc" -- cgit v0.12 From e54e4f19ec2fd06f9d383b2cd83a565479e3cced Mon Sep 17 00:00:00 2001 From: Rhys Weatherley Date: Mon, 10 Aug 2009 10:36:01 +1000 Subject: Add a private function for conversion a QPixmap into a VGImage Custom OpenVG pixmap filters written by users will need to access the VGImage form of a QPixmap. The qPixmapToVGImage() function is provided for this purpose, as a private API. Reviewed-by: Sarah Smith --- src/openvg/qpixmapdata_vg.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/openvg/qpixmapdata_vg.cpp b/src/openvg/qpixmapdata_vg.cpp index 90fd9a5..6f2024f 100644 --- a/src/openvg/qpixmapdata_vg.cpp +++ b/src/openvg/qpixmapdata_vg.cpp @@ -341,4 +341,29 @@ QImage::Format QVGPixmapData::sourceFormat() const return QImage::Format_ARGB32_Premultiplied; } +/* + \internal + + Returns the VGImage that is storing the contents of \a pixmap. + Returns VG_INVALID_HANDLE if \a pixmap is not owned by the OpenVG + graphics system or \a pixmap is invalid. + + This function is typically used to access the backing store + for a pixmap when executing raw OpenVG calls. It must only + be used when a QPainter is active and the OpenVG paint engine + is in use by the QPainter. + + \sa {QtOpenVG Module} +*/ +Q_OPENVG_EXPORT VGImage qPixmapToVGImage(const QPixmap& pixmap) +{ + QPixmapData *pd = pixmap.pixmapData(); + if (pd->classId() == QPixmapData::OpenVGClass) { + QVGPixmapData *vgpd = static_cast(pd); + if (vgpd->isValid()) + return vgpd->toVGImage(); + } + return VG_INVALID_HANDLE; +} + QT_END_NAMESPACE -- cgit v0.12 From 341ba562a81c4be1264020c207a940d5c7fd5de7 Mon Sep 17 00:00:00 2001 From: Rohan McGovern Date: Mon, 10 Aug 2009 14:27:49 +1000 Subject: Make checksdk give a nonzero exit code when it's asked for an SDK which isn't available. Reviewed-by: Michael Goddard --- tools/checksdk/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/checksdk/main.cpp b/tools/checksdk/main.cpp index 6322eb7..b36aa32 100644 --- a/tools/checksdk/main.cpp +++ b/tools/checksdk/main.cpp @@ -161,5 +161,5 @@ int main(int argc, char **argv) } } qWarning("Could not find specified SDK: %s" , qPrintable(sdkName)); - return 0; -} \ No newline at end of file + return -1; +} -- cgit v0.12 From bb97f90ef340d668f3dc04026aa034b33a997453 Mon Sep 17 00:00:00 2001 From: Rhys Weatherley Date: Mon, 10 Aug 2009 14:47:13 +1000 Subject: Set default QGraphicsTransform3D axis to (0, 0, 1) The docs said that the default axis was (0, 0, 1), but the code and unit tests were using (0, 0, 0). Modify the code to match the docs because (0, 0, 0) is not very useful. Also optimize the calculation of sin/cos values for 90, 180, and 270 degrees. Reviewed-by: Aaron Kennedy --- src/gui/graphicsview/qgraphicstransform.cpp | 37 +++++++++++++++------- .../qgraphicstransform/tst_qgraphicstransform.cpp | 22 ++++++++++++- 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/src/gui/graphicsview/qgraphicstransform.cpp b/src/gui/graphicsview/qgraphicstransform.cpp index 778cd94..ae88641 100644 --- a/src/gui/graphicsview/qgraphicstransform.cpp +++ b/src/gui/graphicsview/qgraphicstransform.cpp @@ -80,11 +80,7 @@ #include "qgraphicsitem_p.h" #include "qgraphicstransform_p.h" #include - -#include -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif +#include QT_BEGIN_NAMESPACE @@ -355,7 +351,6 @@ public: QGraphicsRotationPrivate() : angle(0) {} QPointF origin; - qreal originY; qreal angle; }; @@ -475,13 +470,18 @@ void QGraphicsRotation::applyTo(QTransform *t) const By default the axis is (0, 0, 1), giving QGraphicsRotation3D the same default behavior as QGraphicsRotation (i.e., rotation around the Z axis). + Note: the final rotation is the combined effect of a rotation in + 3D space followed by a projection back to 2D. If several rotations + are performed in succession, they will not behave as expected unless + they were all around the Z axis. + \sa QGraphicsTransform, QGraphicsItem::setRotation(), QTransform::rotate() */ class QGraphicsRotation3DPrivate : public QGraphicsRotationPrivate { public: - QGraphicsRotation3DPrivate() {} + QGraphicsRotation3DPrivate() : axis(0, 0, 1) {} QVector3D axis; }; @@ -526,6 +526,7 @@ void QGraphicsRotation3D::setAxis(const QVector3D &axis) update(); } +const qreal deg2rad = qreal(0.017453292519943295769); // pi/180 static const qreal inv_dist_to_plane = 1. / 1024.; /*! @@ -535,13 +536,27 @@ void QGraphicsRotation3D::applyTo(QTransform *t) const { Q_D(const QGraphicsRotation3D); - if (d->angle == 0. || + qreal a = d->angle; + + if (a == 0. || (d->axis.z() == 0. && d->axis.y() == 0 && d->axis.x() == 0)) return; - qreal rad = d->angle * 2. * M_PI / 360.; - qreal c = ::cos(rad); - qreal s = ::sin(rad); + qreal c, s; + if (a == 90. || a == -270.) { + s = 1.; + c = 0.; + } else if (a == 270. || a == -90.) { + s = -1.; + c = 0.; + } else if (a == 180.) { + s = 0.; + c = -1.; + } else { + qreal b = deg2rad*a; + s = qSin(b); + c = qCos(b); + } qreal x = d->axis.x(); qreal y = d->axis.y(); diff --git a/tests/auto/qgraphicstransform/tst_qgraphicstransform.cpp b/tests/auto/qgraphicstransform/tst_qgraphicstransform.cpp index 672b1f1..c9481da 100644 --- a/tests/auto/qgraphicstransform/tst_qgraphicstransform.cpp +++ b/tests/auto/qgraphicstransform/tst_qgraphicstransform.cpp @@ -137,7 +137,10 @@ void tst_QGraphicsTransform::rotation() void tst_QGraphicsTransform::rotation3d() { QGraphicsRotation3D rotation; - rotation.setOrigin(QPointF(10, 10)); + QCOMPARE(rotation.axis().x(), (qreal)0); + QCOMPARE(rotation.axis().y(), (qreal)0); + QCOMPARE(rotation.axis().z(), (qreal)1); + QCOMPARE(rotation.angle(), (qreal)0); QTransform t; rotation.applyTo(&t); @@ -147,6 +150,23 @@ void tst_QGraphicsTransform::rotation3d() rotation.setAngle(180); + QTransform t180; + t180.rotate(180.0f); + + QCOMPARE(t, QTransform()); + QVERIFY(qFuzzyCompare(rotation.transform(), t180)); + + rotation.setAxis(QVector3D(0, 0, 0)); + rotation.setOrigin(QPointF(10, 10)); + + t = QTransform(); + rotation.applyTo(&t); + + QCOMPARE(t, QTransform()); + QCOMPARE(rotation.transform(), QTransform()); + + rotation.setAngle(180); + QCOMPARE(t, QTransform()); QCOMPARE(rotation.transform(), QTransform()); -- cgit v0.12 From 5d01d0cde28f2ac1ff9b5d8ca731edcf38725051 Mon Sep 17 00:00:00 2001 From: Rhys Weatherley Date: Mon, 10 Aug 2009 15:31:00 +1000 Subject: Emit axisChanged() when the QGraphicsRotation3D axis changes. Reviewed-by: Aaron Kennedy --- src/gui/graphicsview/qgraphicstransform.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gui/graphicsview/qgraphicstransform.cpp b/src/gui/graphicsview/qgraphicstransform.cpp index ae88641..775a0d5 100644 --- a/src/gui/graphicsview/qgraphicstransform.cpp +++ b/src/gui/graphicsview/qgraphicstransform.cpp @@ -522,8 +522,11 @@ QVector3D QGraphicsRotation3D::axis() void QGraphicsRotation3D::setAxis(const QVector3D &axis) { Q_D(QGraphicsRotation3D); + if (d->axis == axis) + return; d->axis = axis; update(); + emit axisChanged(); } const qreal deg2rad = qreal(0.017453292519943295769); // pi/180 -- cgit v0.12 From 6cc14b9bd84de30471db40f73b119ba33356a6ba Mon Sep 17 00:00:00 2001 From: Keith Isdale Date: Mon, 10 Aug 2009 17:19:20 +1000 Subject: In a .pro file the include() function does not warn if specified file can not be found change that behavior to warn by default. Currently the default behavior of include() in a .pro file is not to warn if the supplied file argument can not be found which can lead to hard to find build errors. The include() will now,by default, warn if the specified file can not be found. If a warning is not required because the included file is optional then example use in the .pro file: include(SomePriFile.pri", "", true) Task-number:259398 Reviewed-by:Marius Storm-Olsen --- mkspecs/features/qt_config.prf | 2 +- qmake/project.cpp | 13 +++++++++---- src/3rdparty/webkit/WebCore/WebCore.pro | 2 +- src/corelib/arch/arch.pri | 2 +- src/qbase.pri | 2 +- src/xmlpatterns/query.pri | 2 +- src/xmlpatterns/xmlpatterns.pro | 2 +- tests/auto/qaccessibility_mac/qaccessibility_mac.pro | 2 +- tests/auto/qmake/testdata/functions/functions.pro | 2 +- tools/assistant/compat/lib/lib.pro | 2 +- tools/designer/src/components/lib/lib.pro | 2 +- tools/designer/src/lib/lib.pro | 2 +- tools/designer/src/uitools/uitools.pro | 2 +- 13 files changed, 21 insertions(+), 16 deletions(-) diff --git a/mkspecs/features/qt_config.prf b/mkspecs/features/qt_config.prf index 779c2e5..0a2d985 100644 --- a/mkspecs/features/qt_config.prf +++ b/mkspecs/features/qt_config.prf @@ -4,7 +4,7 @@ isEmpty(QMAKE_QT_CONFIG)|!exists($$QMAKE_QT_CONFIG) { else:exists($$_QMAKE_CACHE_):infile($$_QMAKE_CACHE_, QT_BUILD_TREE):QMAKE_QT_CONFIG = $$fromfile($$_QMAKE_CACHE_, QT_BUILD_TREE)/mkspecs/qconfig.pri else:exists($$[QT_INSTALL_DATA]/mkspecs/qconfig.pri):QMAKE_QT_CONFIG = $$[QT_INSTALL_DATA]/mkspecs/qconfig.pri } -!exists($$QMAKE_QT_CONFIG)|!include($$QMAKE_QT_CONFIG) { +!exists($$QMAKE_QT_CONFIG)|!include($$QMAKE_QT_CONFIG, "", true) { debug(1, "Cannot load qconfig.pri!") } else { debug(1, "Loaded .qconfig.pri from ($$QMAKE_QT_CONFIG)") diff --git a/qmake/project.cpp b/qmake/project.cpp index 4fefbab..6687e9a 100644 --- a/qmake/project.cpp +++ b/qmake/project.cpp @@ -2693,10 +2693,15 @@ QMakeProject::doProjectTest(QString func, QList args_list, QMap= 2) { if(func_t == T_INCLUDE) { parseInto = args[1]; + if (args.count() == 3){ + QString sarg = args[2]; + if (sarg.toLower() == "true" || sarg.toInt()) + ignore_error = true; + } } else { QString sarg = args[1]; ignore_error = (sarg.toLower() == "true" || sarg.toInt()); @@ -2738,8 +2743,8 @@ QMakeProject::doProjectTest(QString func, QList args_list, QMap= IncludeFailure) { diff --git a/src/3rdparty/webkit/WebCore/WebCore.pro b/src/3rdparty/webkit/WebCore/WebCore.pro index e49ab13..2eb7c08 100644 --- a/src/3rdparty/webkit/WebCore/WebCore.pro +++ b/src/3rdparty/webkit/WebCore/WebCore.pro @@ -3159,7 +3159,7 @@ xpathbison.dependency_type = TYPE_C xpathbison.variable_out = GENERATED_SOURCES addExtraCompilerWithHeader(xpathbison) -include($$PWD/../WebKit/qt/Api/headers.pri) +include($$PWD/../WebKit/qt/Api/headers.pri, "", true) HEADERS += $$WEBKIT_API_HEADERS !CONFIG(QTDIR_build) { target.path = $$[QT_INSTALL_LIBS] diff --git a/src/corelib/arch/arch.pri b/src/corelib/arch/arch.pri index dd3141a..18f54ee 100644 --- a/src/corelib/arch/arch.pri +++ b/src/corelib/arch/arch.pri @@ -25,4 +25,4 @@ vxworks:HEADERS += arch/qatomic_vxworks.h QT_ARCH_CPP = $$QT_SOURCE_TREE/src/corelib/arch/$$QT_ARCH DEPENDPATH += $$QT_ARCH_CPP -include($$QT_ARCH_CPP/arch.pri) +include($$QT_ARCH_CPP/arch.pri, "", true) diff --git a/src/qbase.pri b/src/qbase.pri index 0ab04e6..9e2d26f 100644 --- a/src/qbase.pri +++ b/src/qbase.pri @@ -13,7 +13,7 @@ mac:!contains(QMAKE_EXT_C, .mm):QMAKE_EXT_C += .mm #load up the headers info CONFIG += qt_install_headers HEADERS_PRI = $$QT_BUILD_TREE/include/$$TARGET/headers.pri -include($$HEADERS_PRI)|clear(HEADERS_PRI) +include($$HEADERS_PRI, "", true)|clear(HEADERS_PRI) #version overriding win32 { diff --git a/src/xmlpatterns/query.pri b/src/xmlpatterns/query.pri index e09a618..fab1940 100644 --- a/src/xmlpatterns/query.pri +++ b/src/xmlpatterns/query.pri @@ -11,4 +11,4 @@ include($$PWD/parser/parser.pri) include($$PWD/projection/projection.pri) include($$PWD/type/type.pri) include($$PWD/utils/utils.pri) -include($$PWD/qobjectmodel/qobjectmodel.pri) +include($$PWD/qobjectmodel/qobjectmodel.pri, "", true) diff --git a/src/xmlpatterns/xmlpatterns.pro b/src/xmlpatterns/xmlpatterns.pro index fb6aa1a..0e6270e 100644 --- a/src/xmlpatterns/xmlpatterns.pro +++ b/src/xmlpatterns/xmlpatterns.pro @@ -25,7 +25,7 @@ include($$PWD/schema/schema.pri) include($$PWD/schematron/schematron.pri) include($$PWD/type/type.pri) include($$PWD/utils/utils.pri) -include($$PWD/qobjectmodel/qobjectmodel.pri) +include($$PWD/qobjectmodel/qobjectmodel.pri, "", true) wince*: { # The Microsoft MIPS compiler crashes if /Og is specified diff --git a/tests/auto/qaccessibility_mac/qaccessibility_mac.pro b/tests/auto/qaccessibility_mac/qaccessibility_mac.pro index b32a7e5..47f72d1 100644 --- a/tests/auto/qaccessibility_mac/qaccessibility_mac.pro +++ b/tests/auto/qaccessibility_mac/qaccessibility_mac.pro @@ -11,7 +11,7 @@ requires(mac) # builds (where QTDIR points to the build directory). # autotest + shadow build is not supported :) exists($$(QTDIR)/tools/designer/src/lib/uilib/uilib.pri) { - include($$(QTDIR)/tools/designer/src/lib/uilib/uilib.pri) + include($$(QTDIR)/tools/designer/src/lib/uilib/uilib.pri, "", true) INCLUDEPATH += $$(QTDIR)/tools/designer/src/uitools SOURCES += $$(QTDIR)/tools/designer/src/uitools/quiloader.cpp HEADERS += $$(QTDIR)/tools/designer/src/uitools/quiloader.h diff --git a/tests/auto/qmake/testdata/functions/functions.pro b/tests/auto/qmake/testdata/functions/functions.pro index 9ed92f96..5e089e4 100644 --- a/tests/auto/qmake/testdata/functions/functions.pro +++ b/tests/auto/qmake/testdata/functions/functions.pro @@ -46,7 +46,7 @@ isEmpty( CONFIG ) { } #include -include( infiletest.pro ) +include( infiletest.pro, "", true ) !contains( DEFINES, QT_DLL ) { message( "FAILED: include function: $$DEFINES" ) } diff --git a/tools/assistant/compat/lib/lib.pro b/tools/assistant/compat/lib/lib.pro index d4b5a47..e50d470 100644 --- a/tools/assistant/compat/lib/lib.pro +++ b/tools/assistant/compat/lib/lib.pro @@ -32,7 +32,7 @@ contains(CONFIG, static) { #load up the headers info CONFIG += qt_install_headers HEADERS_PRI = $$QT_BUILD_TREE/include/QtAssistant/headers.pri -include($$HEADERS_PRI)|clear(HEADERS_PRI) +include($$HEADERS_PRI, "", true)|clear(HEADERS_PRI) #mac frameworks mac:!static:contains(QT_CONFIG, qt_framework) { diff --git a/tools/designer/src/components/lib/lib.pro b/tools/designer/src/components/lib/lib.pro index 4515b66..92cf387 100644 --- a/tools/designer/src/components/lib/lib.pro +++ b/tools/designer/src/components/lib/lib.pro @@ -24,7 +24,7 @@ QMAKE_TARGET_DESCRIPTION = Graphical user interface designer. #load up the headers info CONFIG += qt_install_headers HEADERS_PRI = $$QT_BUILD_TREE/include/QtDesigner/headers.pri -include($$HEADERS_PRI)|clear(HEADERS_PRI) +include($$HEADERS_PRI, "", true)|clear(HEADERS_PRI) #mac frameworks mac:!static:contains(QT_CONFIG, qt_framework) { diff --git a/tools/designer/src/lib/lib.pro b/tools/designer/src/lib/lib.pro index e0f2f23..495976d 100644 --- a/tools/designer/src/lib/lib.pro +++ b/tools/designer/src/lib/lib.pro @@ -34,7 +34,7 @@ QMAKE_TARGET_DESCRIPTION = Graphical user interface designer. #load up the headers info CONFIG += qt_install_headers HEADERS_PRI = $$QT_BUILD_TREE/include/QtDesigner/headers.pri -include($$HEADERS_PRI)|clear(HEADERS_PRI) +include($$HEADERS_PRI, "", true)|clear(HEADERS_PRI) #mac frameworks mac:CONFIG += explicitlib diff --git a/tools/designer/src/uitools/uitools.pro b/tools/designer/src/uitools/uitools.pro index a20abf0..34e4877 100644 --- a/tools/designer/src/uitools/uitools.pro +++ b/tools/designer/src/uitools/uitools.pro @@ -22,7 +22,7 @@ include(../lib/uilib/uilib.pri) HEADERS += quiloader.h SOURCES += quiloader.cpp -include($$QT_BUILD_TREE/include/QtUiTools/headers.pri) +include($$QT_BUILD_TREE/include/QtUiTools/headers.pri, "", true) quitools_headers.files = $$SYNCQT.HEADER_FILES $$SYNCQT.HEADER_CLASSES quitools_headers.path = $$[QT_INSTALL_HEADERS]/QtUiTools INSTALLS += quitools_headers -- cgit v0.12 From 2be387f3e94f84cf0167cdc3871de0d0af85c62d Mon Sep 17 00:00:00 2001 From: David Faure Date: Mon, 10 Aug 2009 09:37:18 +0200 Subject: Make QTimeLine::start() restart from the beginning as the documentation says. The documentation implies that start restarts. Which it did, but only if the timeline was finished _and_ the duration hadn't been changed meanwhile. So after a setDuration(), start() would do nothing, which was unexpected. Merge-request: 1145 Reviewed-by: Olivier Goffart --- src/corelib/tools/qtimeline.cpp | 9 ++++---- tests/auto/qtimeline/tst_qtimeline.cpp | 41 +++++++++++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/corelib/tools/qtimeline.cpp b/src/corelib/tools/qtimeline.cpp index e32fc03..7402ba6 100644 --- a/src/corelib/tools/qtimeline.cpp +++ b/src/corelib/tools/qtimeline.cpp @@ -663,6 +663,7 @@ qreal QTimeLine::valueForTime(int msec) const second). You can change the update interval by calling setUpdateInterval(). + The timeline will start from position 0, or the end if going backward. If you want to resume a stopped timeline without restarting, you can call resume() instead. @@ -675,10 +676,8 @@ void QTimeLine::start() qWarning("QTimeLine::start: already running"); return; } - int curTime = d->currentTime; - if (curTime == d->duration && d->direction == Forward) - curTime = 0; - else if (curTime == 0 && d->direction == Backward) + int curTime = 0; + if (d->direction == Backward) curTime = d->duration; d->timerId = startTimer(d->updateInterval); d->startTime = curTime; @@ -694,7 +693,7 @@ void QTimeLine::start() frame and value at regular intervals. In contrast to start(), this function does not restart the timeline before - is resumes. + it resumes. \sa start(), updateInterval(), frameChanged(), valueChanged() */ diff --git a/tests/auto/qtimeline/tst_qtimeline.cpp b/tests/auto/qtimeline/tst_qtimeline.cpp index e6e75ff..4ce1f4b 100644 --- a/tests/auto/qtimeline/tst_qtimeline.cpp +++ b/tests/auto/qtimeline/tst_qtimeline.cpp @@ -81,6 +81,7 @@ private slots: void outOfRange(); void stateInFinishedSignal(); void resume(); + void restart(); protected slots: void finishedSlot(); @@ -177,7 +178,7 @@ void tst_QTimeLine::currentTime() QCOMPARE(spy.count(), 1); spy.clear(); QCOMPARE(timeLine.currentTime(), timeLine.duration()/2); - timeLine.start(); + timeLine.resume(); // Let it update on its own QTest::qWait(timeLine.duration()/4); QCOMPARE(timeLine.state(), QTimeLine::Running); @@ -699,5 +700,43 @@ void tst_QTimeLine::resume() } } +void tst_QTimeLine::restart() +{ + QTimeLine timeLine(100); + timeLine.setFrameRange(0,9); + + timeLine.start(); + QTest::qWait(timeLine.duration()*2); + QCOMPARE(timeLine.currentFrame(), timeLine.endFrame()); + QCOMPARE(timeLine.state(), QTimeLine::NotRunning); + + // A restart with the same duration + timeLine.start(); + QCOMPARE(timeLine.state(), QTimeLine::Running); + QCOMPARE(timeLine.currentFrame(), timeLine.startFrame()); + QCOMPARE(timeLine.currentTime(), 0); + QTest::qWait(250); + QCOMPARE(timeLine.currentFrame(), timeLine.endFrame()); + QCOMPARE(timeLine.state(), QTimeLine::NotRunning); + + // Set a smaller duration and restart + timeLine.setDuration(50); + timeLine.start(); + QCOMPARE(timeLine.state(), QTimeLine::Running); + QCOMPARE(timeLine.currentFrame(), timeLine.startFrame()); + QCOMPARE(timeLine.currentTime(), 0); + QTest::qWait(250); + QCOMPARE(timeLine.currentFrame(), timeLine.endFrame()); + QCOMPARE(timeLine.state(), QTimeLine::NotRunning); + + // Set a longer duration and restart + timeLine.setDuration(150); + timeLine.start(); + QCOMPARE(timeLine.state(), QTimeLine::Running); + QCOMPARE(timeLine.currentFrame(), timeLine.startFrame()); + QCOMPARE(timeLine.currentTime(), 0); +} + QTEST_MAIN(tst_QTimeLine) + #include "tst_qtimeline.moc" -- cgit v0.12 From 7aa2d76dfc4a107f38c5cb0aac00a0b31d0fbbb6 Mon Sep 17 00:00:00 2001 From: Morten Sorvig Date: Mon, 10 Aug 2009 10:14:12 +0200 Subject: Add QBENCMARK_ONCE to QTestLib. The code block associated with QBENCHMARK_ONCE macro will only be executed once, whether the backend returns a valid result or not. The "-iterations" command line argument is also ignored. This is useful for benchmarking code that has side effects. Revby: jasplin --- src/testlib/qbenchmark.cpp | 13 +++++++++++-- src/testlib/qbenchmark.h | 10 ++++++++-- src/testlib/qbenchmark_p.h | 1 + src/testlib/qtestcase.cpp | 19 +++++++++++++++++++ .../benchlibwalltime/tst_benchlibwalltime.cpp | 11 +++++++++++ tests/auto/selftests/expected_benchlibwalltime.txt | 5 ++++- 6 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/testlib/qbenchmark.cpp b/src/testlib/qbenchmark.cpp index 9cdf232..bad3379 100644 --- a/src/testlib/qbenchmark.cpp +++ b/src/testlib/qbenchmark.cpp @@ -116,7 +116,7 @@ int QBenchmarkGlobalData::adjustMedianIterationCount() QBenchmarkTestMethodData *QBenchmarkTestMethodData::current; QBenchmarkTestMethodData::QBenchmarkTestMethodData() -:resultAccepted(false), iterationCount(-1) +:resultAccepted(false), runOnce(false), iterationCount(-1) { } @@ -157,6 +157,11 @@ void QBenchmarkTestMethodData::setResult(qint64 value) if (QBenchmarkGlobalData::current->iterationCount != -1) accepted = true; + if (QBenchmarkTestMethodData::current->runOnce) { + iterationCount = 1; + accepted = true; + } + // Test the result directly without calling the measurer if the minimum time // has been specifed on the command line with -minimumvalue. else if (QBenchmarkGlobalData::current->walltimeMinimum != -1) @@ -179,10 +184,12 @@ void QBenchmarkTestMethodData::setResult(qint64 value) drive the benchmarking loop. It is repsonsible for starting and stopping the timing measurements as well as calling the result reporting functions. */ -QTest::QBenchmarkIterationController::QBenchmarkIterationController() +QTest::QBenchmarkIterationController::QBenchmarkIterationController(RunMode runMode) { QTest::beginBenchmarkMeasurement(); i = 0; + if (runMode == RunOnce) + QBenchmarkTestMethodData::current->runOnce = true; } /*! \internal */ @@ -195,6 +202,8 @@ QTest::QBenchmarkIterationController::~QBenchmarkIterationController() */ bool QTest::QBenchmarkIterationController::isDone() { + if (QBenchmarkTestMethodData::current->runOnce) + return i > 0; return i >= QTest::iterationCount(); } diff --git a/src/testlib/qbenchmark.h b/src/testlib/qbenchmark.h index c06bfc0..87d34e7 100644 --- a/src/testlib/qbenchmark.h +++ b/src/testlib/qbenchmark.h @@ -64,7 +64,8 @@ namespace QTest class Q_TESTLIB_EXPORT QBenchmarkIterationController { public: - QBenchmarkIterationController(); + enum RunMode { RepeatUntilValidMeasurement, RunOnce }; + QBenchmarkIterationController(RunMode runMode); ~QBenchmarkIterationController(); bool isDone(); void next(); @@ -74,7 +75,12 @@ public: } #define QBENCHMARK \ - for (QTest::QBenchmarkIterationController __iteration_controller; __iteration_controller.isDone() == false; __iteration_controller.next()) + for (QTest::QBenchmarkIterationController __iteration_controller(QTest::QBenchmarkIterationController::RepeatUntilValidMeasurement); \ + __iteration_controller.isDone() == false; __iteration_controller.next()) + +#define QBENCHMARK_ONCE \ + for (QTest::QBenchmarkIterationController __iteration_controller(QTest::QBenchmarkIterationController::RunOnce); \ + __iteration_controller.isDone() == false; __iteration_controller.next()) QT_END_NAMESPACE diff --git a/src/testlib/qbenchmark_p.h b/src/testlib/qbenchmark_p.h index 25f9cdc..185d656 100644 --- a/src/testlib/qbenchmark_p.h +++ b/src/testlib/qbenchmark_p.h @@ -171,6 +171,7 @@ public: QBenchmarkResult result; bool resultAccepted; + bool runOnce; int iterationCount; }; diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp index 1866197..21a686e 100644 --- a/src/testlib/qtestcase.cpp +++ b/src/testlib/qtestcase.cpp @@ -351,6 +351,25 @@ QT_BEGIN_NAMESPACE {Chapter 5: Writing a Benchmark}{Writing a Benchmark} */ +/*! + \macro QBENCHMARK_ONCE + + \relates QTest + + This macro is used to measure the performance of code within a test. + The code to be benchmarked is contained within a code block following + this macro. + + Unlike QBENCHMARK, the contents of the contained code block is only run + once. The elapsed time will be reported as "0" if it's to short to + be measured by the selected backend. (Use) + + \sa {QTestLib Manual#Creating a Benchmark}{Creating a Benchmark}, + {Chapter 5: Writing a Benchmark}{Writing a Benchmark} +*/ + + + /*! \enum QTest::SkipMode This enum describes the modes for skipping tests during execution diff --git a/tests/auto/selftests/benchlibwalltime/tst_benchlibwalltime.cpp b/tests/auto/selftests/benchlibwalltime/tst_benchlibwalltime.cpp index de65599..8474144f 100644 --- a/tests/auto/selftests/benchlibwalltime/tst_benchlibwalltime.cpp +++ b/tests/auto/selftests/benchlibwalltime/tst_benchlibwalltime.cpp @@ -50,6 +50,7 @@ class tst_BenchlibWalltime: public QObject private slots: void waitForOneThousand(); void waitForFourThousand(); + void qbenchmark_once(); }; void tst_BenchlibWalltime::waitForOneThousand() @@ -66,6 +67,16 @@ void tst_BenchlibWalltime::waitForFourThousand() } } +void tst_BenchlibWalltime::qbenchmark_once() +{ + int iterations = 0; + QBENCHMARK_ONCE { + ++iterations; + } + QCOMPARE(iterations, 1); +} + + QTEST_MAIN(tst_BenchlibWalltime) #include "tst_benchlibwalltime.moc" diff --git a/tests/auto/selftests/expected_benchlibwalltime.txt b/tests/auto/selftests/expected_benchlibwalltime.txt index 03f2465..ec2d020 100644 --- a/tests/auto/selftests/expected_benchlibwalltime.txt +++ b/tests/auto/selftests/expected_benchlibwalltime.txt @@ -7,6 +7,9 @@ PASS : tst_BenchlibWalltime::waitForOneThousand() RESULT : tst_BenchlibWalltime::waitForFourThousand(): 4,000 msec per iteration (total: 4000, iterations: 1) PASS : tst_BenchlibWalltime::waitForFourThousand() +RESULT : tst_BenchlibWalltime::qbenchmark_once(): + 0 msec per iteration (total: 0, iterations: 1) +PASS : tst_BenchlibWalltime::qbenchmark_once() PASS : tst_BenchlibWalltime::cleanupTestCase() -Totals: 4 passed, 0 failed, 0 skipped +Totals: 5 passed, 0 failed, 0 skipped ********* Finished testing of tst_BenchlibWalltime ********* -- cgit v0.12