summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/src/snippets/code/doc_src_properties.qdoc17
-rw-r--r--doc/src/snippets/moc/myclass2.h7
-rw-r--r--src/corelib/thread/qthread.cpp4
-rw-r--r--src/corelib/thread/qthread_unix.cpp13
-rw-r--r--src/corelib/tools/qlocale.cpp1
-rw-r--r--src/gui/dialogs/qmessagebox.cpp88
-rw-r--r--src/gui/graphicsview/qgraphicsgridlayout.cpp11
-rw-r--r--src/gui/graphicsview/qgraphicslayoutitem.cpp35
-rw-r--r--src/gui/graphicsview/qgraphicslayoutitem_p.h2
-rw-r--r--src/gui/graphicsview/qgraphicslinearlayout.cpp4
-rw-r--r--src/gui/graphicsview/qgridlayoutengine.cpp185
-rw-r--r--src/gui/graphicsview/qgridlayoutengine_p.h7
-rw-r--r--src/gui/styles/qs60style.cpp59
-rw-r--r--src/gui/text/qfontengine_x11.cpp2
-rw-r--r--src/openvg/qpaintengine_vg.cpp4
-rw-r--r--src/plugins/s60/feedback/feedback.pro2
-rw-r--r--src/plugins/s60/s60.pro2
-rw-r--r--src/s60installs/s60installs.pro2
-rw-r--r--tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp366
-rw-r--r--tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp118
-rw-r--r--tests/auto/qthread/tst_qthread.cpp41
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro6
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp133
-rw-r--r--tools/qmeegographicssystemhelper/qmeegoswitchevent.cpp12
-rw-r--r--tools/qmeegographicssystemhelper/qmeegoswitchevent.h12
25 files changed, 935 insertions, 198 deletions
diff --git a/doc/src/snippets/code/doc_src_properties.qdoc b/doc/src/snippets/code/doc_src_properties.qdoc
index 7704160..a4ed409 100644
--- a/doc/src/snippets/code/doc_src_properties.qdoc
+++ b/doc/src/snippets/code/doc_src_properties.qdoc
@@ -91,7 +91,7 @@ for (int i=0; i<count; ++i) {
class MyClass : public QObject
{
Q_OBJECT
- Q_PROPERTY(Priority priority READ priority WRITE setPriority)
+ Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)
Q_ENUMS(Priority)
public:
@@ -100,8 +100,19 @@ public:
enum Priority { High, Low, VeryHigh, VeryLow };
- void setPriority(Priority priority);
- Priority priority() const;
+ void setPriority(Priority priority)
+ {
+ m_priority = priority;
+ emit priorityChanged(priority);
+ }
+ Priority priority() const
+ { return m_priority; }
+
+signals:
+ void priorityChanged(Priority);
+
+private:
+ Priority m_priority;
};
//! [5]
diff --git a/doc/src/snippets/moc/myclass2.h b/doc/src/snippets/moc/myclass2.h
index ca79515..daea23c 100644
--- a/doc/src/snippets/moc/myclass2.h
+++ b/doc/src/snippets/moc/myclass2.h
@@ -58,8 +58,11 @@ public:
MyClass(QObject *parent = 0);
~MyClass();
- void setPriority(Priority priority);
- Priority priority() const;
+ void setPriority(Priority priority) { m_priority = priority; }
+ Priority priority() const { return m_priority; }
+
+private:
+ Priority m_priority;
};
//! [0]
diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp
index 69b70cb..6fb182b 100644
--- a/src/corelib/thread/qthread.cpp
+++ b/src/corelib/thread/qthread.cpp
@@ -482,8 +482,10 @@ int QThread::exec()
Q_D(QThread);
QMutexLocker locker(&d->mutex);
d->data->quitNow = false;
- if (d->exited)
+ if (d->exited) {
+ d->exited = false;
return d->returnCode;
+ }
locker.unlock();
QEventLoop eventLoop;
diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp
index a44a0e8..e3b587d 100644
--- a/src/corelib/thread/qthread_unix.cpp
+++ b/src/corelib/thread/qthread_unix.cpp
@@ -97,6 +97,11 @@
# define SCHED_IDLE 5
#endif
+#if defined(Q_OS_DARWIN) || !defined(Q_OS_OPENBSD) && defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && (_POSIX_THREAD_PRIORITY_SCHEDULING-0 >= 0)
+#define QT_HAS_THREAD_PRIORITY_SCHEDULING
+#endif
+
+
QT_BEGIN_NAMESPACE
#ifndef QT_NO_THREAD
@@ -503,6 +508,7 @@ void QThread::usleep(unsigned long usecs)
thread_sleep(&ti);
}
+#ifdef QT_HAS_THREAD_PRIORITY_SCHEDULING
// Does some magic and calculate the Unix scheduler priorities
// sched_policy is IN/OUT: it must be set to a valid policy before calling this function
// sched_priority is OUT only
@@ -533,6 +539,7 @@ static bool calculateUnixPriority(int priority, int *sched_policy, int *sched_pr
*sched_priority = prio;
return true;
}
+#endif
void QThread::start(Priority priority)
{
@@ -553,7 +560,7 @@ void QThread::start(Priority priority)
d->priority = priority;
-#if defined(Q_OS_DARWIN) || !defined(Q_OS_OPENBSD) && !defined(Q_OS_SYMBIAN) && defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && (_POSIX_THREAD_PRIORITY_SCHEDULING-0 >= 0)
+#if defined(QT_HAS_THREAD_PRIORITY_SCHEDULING) && !defined(Q_OS_SYMBIAN)
// ### Need to implement thread sheduling and priorities for symbian os. Implementation removed for now
switch (priority) {
case InheritPriority:
@@ -594,7 +601,7 @@ void QThread::start(Priority priority)
break;
}
}
-#endif // _POSIX_THREAD_PRIORITY_SCHEDULING
+#endif // QT_HAS_THREAD_PRIORITY_SCHEDULING
#ifdef Q_OS_SYMBIAN
if (d->stackSize == 0)
@@ -757,7 +764,7 @@ void QThread::setPriority(Priority priority)
// copied from start() with a few modifications:
-#if defined(Q_OS_DARWIN) || !defined(Q_OS_OPENBSD) && defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && (_POSIX_THREAD_PRIORITY_SCHEDULING-0 >= 0)
+#ifdef QT_HAS_THREAD_PRIORITY_SCHEDULING
int sched_policy;
sched_param param;
diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index d152682..83d6dcd 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -7308,6 +7308,7 @@ Q_CORE_EXPORT char *qdtoa( double d, int mode, int ndigits, int *decpt, int *sig
Q_CORE_EXPORT double qstrtod(const char *s00, const char **se, bool *ok)
{
+ errno = 0;
double ret = strtod((char*)s00, (char**)se);
if (ok) {
if((ret == 0.0l && errno == ERANGE)
diff --git a/src/gui/dialogs/qmessagebox.cpp b/src/gui/dialogs/qmessagebox.cpp
index fe25b0f..2f8b9e2 100644
--- a/src/gui/dialogs/qmessagebox.cpp
+++ b/src/gui/dialogs/qmessagebox.cpp
@@ -776,10 +776,8 @@ QMessageBox::QMessageBox(QWidget *parent)
added at any time using addButton(). The \a parent and \a f
arguments are passed to the QDialog constructor.
- If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
- {application modal} dialog box. If \a parent is a widget, the
- message box is \l{Qt::WindowModal} {window modal} relative to \a
- parent.
+ The message box is an \l{Qt::ApplicationModal} {application modal}
+ dialog box.
On Mac OS X, if \a parent is not 0 and you want your message box
to appear as a Qt::Sheet of that parent, set the message box's
@@ -1549,10 +1547,8 @@ static QMessageBox::StandardButton showNewMessageBox(QWidget *parent,
\key Esc was pressed instead, the \l{Default and Escape Keys}
{escape button} is returned.
- If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
- {application modal} dialog box. If \a parent is a widget, the
- message box is \l{Qt::WindowModal} {window modal} relative to \a
- parent.
+ The message box is an \l{Qt::ApplicationModal} {application modal}
+ dialog box.
\sa question(), warning(), critical()
*/
@@ -1579,10 +1575,8 @@ QMessageBox::StandardButton QMessageBox::information(QWidget *parent, const QStr
\key Esc was pressed instead, the \l{Default and Escape Keys}
{escape button} is returned.
- If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
- {application modal} dialog box. If \a parent is a widget, the
- message box is \l{Qt::WindowModal} {window modal} relative to \a
- parent.
+ The message box is an \l{Qt::ApplicationModal} {application modal}
+ dialog box.
\sa information(), warning(), critical()
*/
@@ -1607,10 +1601,8 @@ QMessageBox::StandardButton QMessageBox::question(QWidget *parent, const QString
\key Esc was pressed instead, the \l{Default and Escape Keys}
{escape button} is returned.
- If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
- {application modal} dialog box. If \a parent is a widget, the
- message box is \l{Qt::WindowModal} {window modal} relative to \a
- parent.
+ The message box is an \l{Qt::ApplicationModal} {application modal}
+ dialog box.
\sa question(), information(), critical()
*/
@@ -1635,10 +1627,8 @@ QMessageBox::StandardButton QMessageBox::warning(QWidget *parent, const QString
\key Esc was pressed instead, the \l{Default and Escape Keys}
{escape button} is returned.
- If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
- {application modal} dialog box. If \a parent is a widget, the
- message box is \l{Qt::WindowModal} {window modal} relative to \a
- parent.
+ The message box is an \l{Qt::ApplicationModal} {application modal}
+ dialog box.
\warning Do not delete \a parent during the execution of the dialog.
If you want to do this, you should create the dialog
@@ -1670,7 +1660,7 @@ QMessageBox::StandardButton QMessageBox::critical(QWidget *parent, const QString
The about box has a single button labelled "OK". On Mac OS X, the
about box is popped up as a modeless window; on other platforms,
- it is currently a window modal.
+ it is currently application modal.
\sa QWidget::windowIcon(), QApplication::activeWindow()
*/
@@ -1723,7 +1713,7 @@ void QMessageBox::about(QWidget *parent, const QString &title, const QString &te
QApplication provides this functionality as a slot.
On Mac OS X, the about box is popped up as a modeless window; on
- other platforms, it is currently window modal.
+ other platforms, it is currently application modal.
\sa QApplication::aboutQt()
*/
@@ -1983,10 +1973,8 @@ void QMessageBoxPrivate::retranslateStrings()
\snippet doc/src/snippets/dialogs/dialogs.cpp 2
- If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
- {application modal} dialog box. If \a parent is a widget, the
- message box is \l{Qt::WindowModal} {window modal} relative to \a
- parent.
+ The message box is an \l{Qt::ApplicationModal} {application modal}
+ dialog box.
The \a parent and \a f arguments are passed to
the QDialog constructor.
@@ -2035,10 +2023,8 @@ QMessageBox::QMessageBox(const QString &title, const QString &text, Icon icon,
Returns the identity (QMessageBox::Ok, or QMessageBox::No, etc.)
of the button that was clicked.
- If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
- {application modal} dialog box. If \a parent is a widget, the
- message box is \l{Qt::WindowModal} {window modal} relative to \a
- parent.
+ The message box is an \l{Qt::ApplicationModal} {application modal}
+ dialog box.
\warning Do not delete \a parent during the execution of the dialog.
If you want to do this, you should create the dialog
@@ -2073,10 +2059,8 @@ int QMessageBox::information(QWidget *parent, const QString &title, const QStrin
supply 0, 1 or 2 to make pressing \key Esc equivalent to clicking
the relevant button.
- If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
- {application modal} dialog box. If \a parent is a widget, the
- message box is \l{Qt::WindowModal} {window modal} relative to \a
- parent.
+ The message box is an \l{Qt::ApplicationModal} {application modal}
+ dialog box.
\warning Do not delete \a parent during the execution of the dialog.
If you want to do this, you should create the dialog
@@ -2125,10 +2109,8 @@ int QMessageBox::information(QWidget *parent, const QString &title, const QStrin
Returns the identity (QMessageBox::Yes, or QMessageBox::No, etc.)
of the button that was clicked.
- If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
- {application modal} dialog box. If \a parent is a widget, the
- message box is \l{Qt::WindowModal} {window modal} relative to \a
- parent.
+ The message box is an \l{Qt::ApplicationModal} {application modal}
+ dialog box.
\warning Do not delete \a parent during the execution of the dialog.
If you want to do this, you should create the dialog
@@ -2163,10 +2145,8 @@ int QMessageBox::question(QWidget *parent, const QString &title, const QString&
supply 0, 1 or 2 to make pressing Escape equivalent to clicking
the relevant button.
- If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
- {application modal} dialog box. If \a parent is a widget, the
- message box is \l{Qt::WindowModal} {window modal} relative to \a
- parent.
+ The message box is an \l{Qt::ApplicationModal} {application modal}
+ dialog box.
\warning Do not delete \a parent during the execution of the dialog.
If you want to do this, you should create the dialog
@@ -2215,10 +2195,8 @@ int QMessageBox::question(QWidget *parent, const QString &title, const QString&
Returns the identity (QMessageBox::Ok or QMessageBox::No or ...)
of the button that was clicked.
- If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
- {application modal} dialog box. If \a parent is a widget, the
- message box is \l{Qt::WindowModal} {window modal} relative to \a
- parent.
+ The message box is an \l{Qt::ApplicationModal} {application modal}
+ dialog box.
\warning Do not delete \a parent during the execution of the dialog.
If you want to do this, you should create the dialog
@@ -2253,10 +2231,8 @@ int QMessageBox::warning(QWidget *parent, const QString &title, const QString& t
supply 0, 1, or 2 to make pressing Escape equivalent to clicking
the relevant button.
- If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
- {application modal} dialog box. If \a parent is a widget, the
- message box is \l{Qt::WindowModal} {window modal} relative to \a
- parent.
+ The message box is an \l{Qt::ApplicationModal} {application modal}
+ dialog box.
\warning Do not delete \a parent during the execution of the dialog.
If you want to do this, you should create the dialog
@@ -2304,10 +2280,8 @@ int QMessageBox::warning(QWidget *parent, const QString &title, const QString& t
Returns the identity (QMessageBox::Ok, or QMessageBox::No, etc.)
of the button that was clicked.
- If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
- {application modal} dialog box. If \a parent is a widget, the
- message box is \l{Qt::WindowModal} {window modal} relative to \a
- parent.
+ The message box is an \l{Qt::ApplicationModal} {application modal}
+ dialog box.
\warning Do not delete \a parent during the execution of the dialog.
If you want to do this, you should create the dialog
@@ -2343,10 +2317,8 @@ int QMessageBox::critical(QWidget *parent, const QString &title, const QString&
supply 0, 1, or 2 to make pressing Escape equivalent to clicking
the relevant button.
- If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
- {application modal} dialog box. If \a parent is a widget, the
- message box is \l{Qt::WindowModal} {window modal} relative to \a
- parent.
+ The message box is an \l{Qt::ApplicationModal} {application modal}
+ dialog box.
\warning Do not delete \a parent during the execution of the dialog.
If you want to do this, you should create the dialog
diff --git a/src/gui/graphicsview/qgraphicsgridlayout.cpp b/src/gui/graphicsview/qgraphicsgridlayout.cpp
index 3fc7f10..20ebab6 100644
--- a/src/gui/graphicsview/qgraphicsgridlayout.cpp
+++ b/src/gui/graphicsview/qgraphicsgridlayout.cpp
@@ -64,6 +64,17 @@
removeAt() will remove an item from the layout, without
destroying it.
+ \section1 Size Hints and Size Policies in QGraphicsGridLayout
+
+ QGraphicsGridLayout respects each item's size hints and size policies,
+ and when a cell in the grid has more space than the items can fill, each item
+ is arranged according to the layout's alignment for that item. You can set
+ an alignment for each item by calling setAlignment(), and check the
+ alignment for any item by calling alignment(). You can also set the alignment
+ for an entire row or column by calling setRowAlignment() and setColumnAlignment()
+ respectively. By default, items are aligned to the top left.
+
+
\sa QGraphicsLinearLayout, QGraphicsWidget
*/
diff --git a/src/gui/graphicsview/qgraphicslayoutitem.cpp b/src/gui/graphicsview/qgraphicslayoutitem.cpp
index e43f7fa..016cfbf 100644
--- a/src/gui/graphicsview/qgraphicslayoutitem.cpp
+++ b/src/gui/graphicsview/qgraphicslayoutitem.cpp
@@ -137,19 +137,28 @@ void QGraphicsLayoutItemPrivate::init()
QSizeF *QGraphicsLayoutItemPrivate::effectiveSizeHints(const QSizeF &constraint) const
{
Q_Q(const QGraphicsLayoutItem);
- if (!sizeHintCacheDirty && cachedConstraint == constraint)
- return cachedSizeHints;
+ QSizeF *sizeHintCache;
+ const bool hasConstraint = constraint.width() >= 0 || constraint.height() >= 0;
+ if (hasConstraint) {
+ if (!sizeHintWithConstraintCacheDirty && constraint == cachedConstraint)
+ return cachedSizeHintsWithConstraints;
+ sizeHintCache = cachedSizeHintsWithConstraints;
+ } else {
+ if (!sizeHintCacheDirty)
+ return cachedSizeHints;
+ sizeHintCache = cachedSizeHints;
+ }
for (int i = 0; i < Qt::NSizeHints; ++i) {
- cachedSizeHints[i] = constraint;
+ sizeHintCache[i] = constraint;
if (userSizeHints)
- combineSize(cachedSizeHints[i], userSizeHints[i]);
+ combineSize(sizeHintCache[i], userSizeHints[i]);
}
- QSizeF &minS = cachedSizeHints[Qt::MinimumSize];
- QSizeF &prefS = cachedSizeHints[Qt::PreferredSize];
- QSizeF &maxS = cachedSizeHints[Qt::MaximumSize];
- QSizeF &descentS = cachedSizeHints[Qt::MinimumDescent];
+ QSizeF &minS = sizeHintCache[Qt::MinimumSize];
+ QSizeF &prefS = sizeHintCache[Qt::PreferredSize];
+ QSizeF &maxS = sizeHintCache[Qt::MaximumSize];
+ QSizeF &descentS = sizeHintCache[Qt::MinimumDescent];
normalizeHints(minS.rwidth(), prefS.rwidth(), maxS.rwidth(), descentS.rwidth());
normalizeHints(minS.rheight(), prefS.rheight(), maxS.rheight(), descentS.rheight());
@@ -175,9 +184,13 @@ QSizeF *QGraphicsLayoutItemPrivate::effectiveSizeHints(const QSizeF &constraint)
// Not supported yet
// COMBINE_SIZE(descentS, q->sizeHint(Qt::MinimumDescent, constraint));
- cachedConstraint = constraint;
- sizeHintCacheDirty = false;
- return cachedSizeHints;
+ if (hasConstraint) {
+ cachedConstraint = constraint;
+ sizeHintWithConstraintCacheDirty = false;
+ } else {
+ sizeHintCacheDirty = false;
+ }
+ return sizeHintCache;
}
diff --git a/src/gui/graphicsview/qgraphicslayoutitem_p.h b/src/gui/graphicsview/qgraphicslayoutitem_p.h
index b752e03..d72ee9f 100644
--- a/src/gui/graphicsview/qgraphicslayoutitem_p.h
+++ b/src/gui/graphicsview/qgraphicslayoutitem_p.h
@@ -85,8 +85,10 @@ public:
QSizeF *userSizeHints;
mutable QSizeF cachedSizeHints[Qt::NSizeHints];
mutable QSizeF cachedConstraint;
+ mutable QSizeF cachedSizeHintsWithConstraints[Qt::NSizeHints];
mutable quint32 sizeHintCacheDirty : 1;
+ mutable quint32 sizeHintWithConstraintCacheDirty : 1;
quint32 isLayout : 1;
quint32 ownedByLayout : 1;
diff --git a/src/gui/graphicsview/qgraphicslinearlayout.cpp b/src/gui/graphicsview/qgraphicslinearlayout.cpp
index 7e8d19f..244a728 100644
--- a/src/gui/graphicsview/qgraphicslinearlayout.cpp
+++ b/src/gui/graphicsview/qgraphicslinearlayout.cpp
@@ -75,7 +75,7 @@
is arranged according to the layout's alignment for that item. You can set
an alignment for each item by calling setAlignment(), and check the
alignment for any item by calling alignment(). By default, items are
- centered both vertically and horizontally.
+ aligned to the top left.
\section1 Spacing within QGraphicsLinearLayout
@@ -446,7 +446,7 @@ void QGraphicsLinearLayout::setAlignment(QGraphicsLayoutItem *item, Qt::Alignmen
/*!
Returns the alignment for \a item. The default alignment is
- Qt::AlignCenter.
+ Qt::AlignTop | Qt::AlignLeft.
The alignment decides how the item is positioned within its assigned space
in the case where there's more space available in the layout than the
diff --git a/src/gui/graphicsview/qgridlayoutengine.cpp b/src/gui/graphicsview/qgridlayoutengine.cpp
index e486b4d..f1055ba 100644
--- a/src/gui/graphicsview/qgridlayoutengine.cpp
+++ b/src/gui/graphicsview/qgridlayoutengine.cpp
@@ -166,7 +166,7 @@ void QGridLayoutRowData::reset(int count)
hasIgnoreFlag = false;
}
-void QGridLayoutRowData::distributeMultiCells()
+void QGridLayoutRowData::distributeMultiCells(const QGridLayoutRowInfo &rowInfo)
{
MultiCellMap::const_iterator i = multiCellMap.constBegin();
for (; i != multiCellMap.constEnd(); ++i) {
@@ -185,7 +185,7 @@ void QGridLayoutRowData::distributeMultiCells()
qreal extra = compare(box, totalBox, j);
if (extra > 0.0) {
calculateGeometries(start, end, box.q_sizes(j), dummy.data(), newSizes.data(),
- 0, totalBox);
+ 0, totalBox, rowInfo);
for (int k = 0; k < span; ++k)
extras[k].q_sizes(j) = newSizes[k];
@@ -202,11 +202,12 @@ void QGridLayoutRowData::distributeMultiCells()
void QGridLayoutRowData::calculateGeometries(int start, int end, qreal targetSize, qreal *positions,
qreal *sizes, qreal *descents,
- const QGridLayoutBox &totalBox)
+ const QGridLayoutBox &totalBox,
+ const QGridLayoutRowInfo &rowInfo)
{
Q_ASSERT(end > start);
- targetSize = qBound(totalBox.q_minimumSize, targetSize, totalBox.q_maximumSize);
+ targetSize = qMax(totalBox.q_minimumSize, targetSize);
int n = end - start;
QVarLengthArray<qreal> newSizes(n);
@@ -246,16 +247,22 @@ void QGridLayoutRowData::calculateGeometries(int start, int end, qreal targetSiz
}
}
} else {
- stealBox(start, end, PreferredSize, positions, sizes);
+ bool isLargerThanMaximum = (targetSize > totalBox.q_maximumSize);
+ if (isLargerThanMaximum) {
+ stealBox(start, end, MaximumSize, positions, sizes);
+ sumAvailable = targetSize - totalBox.q_maximumSize;
+ } else {
+ stealBox(start, end, PreferredSize, positions, sizes);
+ sumAvailable = targetSize - totalBox.q_preferredSize;
+ }
- sumAvailable = targetSize - totalBox.q_preferredSize;
if (sumAvailable > 0.0) {
qreal sumCurrentAvailable = sumAvailable;
bool somethingHasAMaximumSize = false;
- qreal sumPreferredSizes = 0.0;
+ qreal sumSizes = 0.0;
for (int i = 0; i < n; ++i)
- sumPreferredSizes += sizes[i];
+ sumSizes += sizes[i];
for (int i = 0; i < n; ++i) {
if (ignore.testBit(start + i)) {
@@ -265,7 +272,16 @@ void QGridLayoutRowData::calculateGeometries(int start, int end, qreal targetSiz
}
const QGridLayoutBox &box = boxes.at(start + i);
- qreal desired = box.q_maximumSize - box.q_preferredSize;
+ qreal boxSize;
+
+ qreal desired;
+ if (isLargerThanMaximum) {
+ boxSize = box.q_maximumSize;
+ desired = rowInfo.boxes.value(start + i).q_maximumSize - boxSize;
+ } else {
+ boxSize = box.q_preferredSize;
+ desired = box.q_maximumSize - boxSize;
+ }
if (desired == 0.0) {
newSizes[i] = sizes[i];
factors[i] = 0.0;
@@ -284,17 +300,17 @@ void QGridLayoutRowData::calculateGeometries(int start, int end, qreal targetSiz
} else if (stretch <= 0) {
factors[i] = 0.0;
} else {
- qreal ultimatePreferredSize;
- qreal ultimateSumPreferredSizes;
- qreal x = ((stretch * sumPreferredSizes)
- - (sumStretches * box.q_preferredSize))
+ qreal ultimateSize;
+ qreal ultimateSumSizes;
+ qreal x = ((stretch * sumSizes)
+ - (sumStretches * boxSize))
/ (sumStretches - stretch);
if (x >= 0.0) {
- ultimatePreferredSize = box.q_preferredSize + x;
- ultimateSumPreferredSizes = sumPreferredSizes + x;
+ ultimateSize = boxSize + x;
+ ultimateSumSizes = sumSizes + x;
} else {
- ultimatePreferredSize = box.q_preferredSize;
- ultimateSumPreferredSizes = (sumStretches * box.q_preferredSize)
+ ultimateSize = boxSize;
+ ultimateSumSizes = (sumStretches * boxSize)
/ stretch;
}
@@ -303,17 +319,17 @@ void QGridLayoutRowData::calculateGeometries(int start, int end, qreal targetSiz
(at the expense of the stretch factors, which are not fully respected
during the transition).
*/
- ultimatePreferredSize = ultimatePreferredSize * 3 / 2;
- ultimateSumPreferredSizes = ultimateSumPreferredSizes * 3 / 2;
+ ultimateSize = ultimateSize * 3 / 2;
+ ultimateSumSizes = ultimateSumSizes * 3 / 2;
- qreal beta = ultimateSumPreferredSizes - sumPreferredSizes;
+ qreal beta = ultimateSumSizes - sumSizes;
if (!beta) {
factors[i] = 1;
} else {
qreal alpha = qMin(sumCurrentAvailable, beta);
- qreal ultimateFactor = (stretch * ultimateSumPreferredSizes / sumStretches)
- - (box.q_preferredSize);
- qreal transitionalFactor = sumCurrentAvailable * (ultimatePreferredSize - box.q_preferredSize) / beta;
+ qreal ultimateFactor = (stretch * ultimateSumSizes / sumStretches)
+ - (boxSize);
+ qreal transitionalFactor = sumCurrentAvailable * (ultimateSize - boxSize) / beta;
factors[i] = ((alpha * ultimateFactor)
+ ((beta - alpha) * transitionalFactor)) / beta;
@@ -336,11 +352,16 @@ void QGridLayoutRowData::calculateGeometries(int start, int end, qreal targetSiz
if (newSizes[i] >= 0.0)
continue;
- const QGridLayoutBox &box = boxes.at(start + i);
+ qreal maxBoxSize;
+ if (isLargerThanMaximum)
+ maxBoxSize = rowInfo.boxes.value(start + i).q_maximumSize;
+ else
+ maxBoxSize = boxes.at(start + i).q_maximumSize;
+
qreal avail = sumCurrentAvailable * factors[i] / sumFactors;
- if (sizes[i] + avail >= box.q_maximumSize) {
- newSizes[i] = box.q_maximumSize;
- sumCurrentAvailable -= box.q_maximumSize - sizes[i];
+ if (sizes[i] + avail >= maxBoxSize) {
+ newSizes[i] = maxBoxSize;
+ sumCurrentAvailable -= maxBoxSize - sizes[i];
sumFactors -= factors[i];
keepGoing = (sumCurrentAvailable > 0.0);
if (!keepGoing)
@@ -637,7 +658,7 @@ QRectF QGridLayoutItem::geometryWithin(qreal x, qreal y, qreal width, qreal heig
if (dynamicConstraintOrientation() == Qt::Vertical) {
if (size.width() > cellWidth)
size = effectiveMaxSize(QSizeF(cellWidth, -1));
- } else if(size.height() > cellHeight) {
+ } else if (size.height() > cellHeight) {
size = effectiveMaxSize(QSizeF(-1, cellHeight));
}
}
@@ -1107,63 +1128,58 @@ QSizeF QGridLayoutEngine::sizeHint(const QLayoutStyleInfo &styleInfo, Qt::SizeHi
{
QGridLayoutBox sizehint_totalBoxes[NOrientations];
- if(rowCount() < 1 || columnCount() < 1 || !hasDynamicConstraint()) {
+ bool sizeHintCalculated = false;
+
+ if (hasDynamicConstraint() && rowCount() > 0 && columnCount() > 0) {
+ if (constraintOrientation() == Qt::Vertical) {
+ //We have items whose height depends on their width
+ if (constraint.width() >= 0) {
+ if (q_cachedDataForStyleInfo != styleInfo)
+ ensureColumnAndRowData(&q_columnData, &sizehint_totalBoxes[Hor], styleInfo, NULL, NULL, Qt::Horizontal);
+ else
+ sizehint_totalBoxes[Hor] = q_totalBoxes[Hor];
+ QVector<qreal> sizehint_xx;
+ QVector<qreal> sizehint_widths;
+
+ sizehint_xx.resize(columnCount());
+ sizehint_widths.resize(columnCount());
+ qreal width = constraint.width();
+ //Calculate column widths and positions, and put results in q_xx.data() and q_widths.data() so that we can use this information as
+ //constraints to find the row heights
+ q_columnData.calculateGeometries(0, columnCount(), width, sizehint_xx.data(), sizehint_widths.data(),
+ 0, sizehint_totalBoxes[Hor], q_infos[Hor]);
+ ensureColumnAndRowData(&q_rowData, &sizehint_totalBoxes[Ver], styleInfo, sizehint_xx.data(), sizehint_widths.data(), Qt::Vertical);
+ sizeHintCalculated = true;
+ }
+ } else {
+ if (constraint.height() >= 0) {
+ //We have items whose width depends on their height
+ ensureColumnAndRowData(&q_rowData, &sizehint_totalBoxes[Ver], styleInfo, NULL, NULL, Qt::Vertical);
+ QVector<qreal> sizehint_yy;
+ QVector<qreal> sizehint_heights;
+
+ sizehint_yy.resize(rowCount());
+ sizehint_heights.resize(rowCount());
+ qreal height = constraint.height();
+ //Calculate row heights and positions, and put results in q_yy.data() and q_heights.data() so that we can use this information as
+ //constraints to find the column widths
+ q_rowData.calculateGeometries(0, rowCount(), height, sizehint_yy.data(), sizehint_heights.data(),
+ 0, sizehint_totalBoxes[Ver], q_infos[Ver]);
+ ensureColumnAndRowData(&q_columnData, &sizehint_totalBoxes[Hor], styleInfo, sizehint_yy.data(), sizehint_heights.data(), Qt::Vertical);
+ sizeHintCalculated = true;
+ }
+ }
+ }
+
+ if (!sizeHintCalculated) {
//No items with height for width, so it doesn't matter which order we do these in
- if(q_cachedDataForStyleInfo != styleInfo) {
+ if (q_cachedDataForStyleInfo != styleInfo) {
ensureColumnAndRowData(&q_columnData, &sizehint_totalBoxes[Hor], styleInfo, NULL, NULL, Qt::Horizontal);
ensureColumnAndRowData(&q_rowData, &sizehint_totalBoxes[Ver], styleInfo, NULL, NULL, Qt::Vertical);
} else {
sizehint_totalBoxes[Hor] = q_totalBoxes[Hor];
sizehint_totalBoxes[Ver] = q_totalBoxes[Ver];
}
- } else if(constraintOrientation() == Qt::Vertical) {
- //We have items whose width depends on their height
- if(q_cachedDataForStyleInfo != styleInfo)
- ensureColumnAndRowData(&q_columnData, &sizehint_totalBoxes[Hor], styleInfo, NULL, NULL, Qt::Horizontal);
- else
- sizehint_totalBoxes[Hor] = q_totalBoxes[Hor];
- QVector<qreal> sizehint_xx;
- QVector<qreal> sizehint_widths;
-
- sizehint_xx.resize(columnCount());
- sizehint_widths.resize(columnCount());
- qreal width = constraint.width();
- if(width < 0) {
- /* It's not obvious what the behaviour should be. */
-/* if(which == Qt::MaximumSize)
- width = sizehint_totalBoxes[Hor].q_maximumSize;
- else if(which == Qt::MinimumSize)
- width = sizehint_totalBoxes[Hor].q_minimumSize;
- else*/
- width = sizehint_totalBoxes[Hor].q_preferredSize;
- }
- //Calculate column widths and positions, and put results in q_xx.data() and q_widths.data() so that we can use this information as
- //constraints to find the row heights
- q_columnData.calculateGeometries(0, columnCount(), width, sizehint_xx.data(), sizehint_widths.data(),
- 0, sizehint_totalBoxes[Hor]);
- ensureColumnAndRowData(&q_rowData, &sizehint_totalBoxes[Ver], styleInfo, sizehint_xx.data(), sizehint_widths.data(), Qt::Vertical);
- } else {
- //We have items whose height depends on their width
- ensureColumnAndRowData(&q_rowData, &sizehint_totalBoxes[Ver], styleInfo, NULL, NULL, Qt::Vertical);
- QVector<qreal> sizehint_yy;
- QVector<qreal> sizehint_heights;
-
- sizehint_yy.resize(rowCount());
- sizehint_heights.resize(rowCount());
- qreal height = constraint.height();
- if(height < 0) {
-/* if(which == Qt::MaximumSize)
- height = sizehint_totalBoxes[Ver].q_maximumSize;
- else if(which == Qt::MinimumSize)
- height = sizehint_totalBoxes[Ver].q_minimumSize;
- else*/
- height = sizehint_totalBoxes[Ver].q_preferredSize;
- }
- //Calculate row heights and positions, and put results in q_yy.data() and q_heights.data() so that we can use this information as
- //constraints to find the column widths
- q_rowData.calculateGeometries(0, rowCount(), height, sizehint_yy.data(), sizehint_heights.data(),
- 0, sizehint_totalBoxes[Ver]);
- ensureColumnAndRowData(&q_columnData, &sizehint_totalBoxes[Hor], styleInfo, sizehint_yy.data(), sizehint_heights.data(), Qt::Vertical);
}
switch (which) {
@@ -1622,7 +1638,8 @@ void QGridLayoutEngine::ensureColumnAndRowData(QGridLayoutRowData *rowData, QGri
{
rowData->reset(rowCount(orientation));
fillRowData(rowData, styleInfo, colPositions, colSizes, orientation);
- rowData->distributeMultiCells();
+ const QGridLayoutRowInfo &rowInfo = q_infos[orientation == Qt::Vertical];
+ rowData->distributeMultiCells(rowInfo);
*totalBox = rowData->totalBox(0, rowCount(orientation));
//We have items whose width depends on their height
}
@@ -1685,28 +1702,28 @@ void QGridLayoutEngine::ensureGeometries(const QLayoutStyleInfo &styleInfo,
q_heights.resize(rowCount());
q_descents.resize(rowCount());
- if(constraintOrientation() != Qt::Horizontal) {
+ if (constraintOrientation() != Qt::Horizontal) {
//We might have items whose width depends on their height
ensureColumnAndRowData(&q_columnData, &q_totalBoxes[Hor], styleInfo, NULL, NULL, Qt::Horizontal);
//Calculate column widths and positions, and put results in q_xx.data() and q_widths.data() so that we can use this information as
//constraints to find the row heights
q_columnData.calculateGeometries(0, columnCount(), size.width(), q_xx.data(), q_widths.data(),
- 0, q_totalBoxes[Hor]);
+ 0, q_totalBoxes[Hor], q_infos[Hor] );
ensureColumnAndRowData(&q_rowData, &q_totalBoxes[Ver], styleInfo, q_xx.data(), q_widths.data(), Qt::Vertical);
//Calculate row heights and positions, and put results in q_yy.data() and q_heights.data()
q_rowData.calculateGeometries(0, rowCount(), size.height(), q_yy.data(), q_heights.data(),
- q_descents.data(), q_totalBoxes[Ver]);
+ q_descents.data(), q_totalBoxes[Ver], q_infos[Ver]);
} else {
//We have items whose height depends on their width
ensureColumnAndRowData(&q_rowData, &q_totalBoxes[Ver], styleInfo, NULL, NULL, Qt::Vertical);
//Calculate row heights and positions, and put results in q_yy.data() and q_heights.data() so that we can use this information as
//constraints to find the column widths
q_rowData.calculateGeometries(0, rowCount(), size.height(), q_yy.data(), q_heights.data(),
- q_descents.data(), q_totalBoxes[Ver]);
+ q_descents.data(), q_totalBoxes[Ver], q_infos[Ver]);
ensureColumnAndRowData(&q_columnData, &q_totalBoxes[Hor], styleInfo, q_yy.data(), q_heights.data(), Qt::Horizontal);
//Calculate row heights and positions, and put results in q_yy.data() and q_heights.data()
q_columnData.calculateGeometries(0, columnCount(), size.width(), q_xx.data(), q_widths.data(),
- 0, q_totalBoxes[Hor]);
+ 0, q_totalBoxes[Hor], q_infos[Hor]);
}
}
diff --git a/src/gui/graphicsview/qgridlayoutengine_p.h b/src/gui/graphicsview/qgridlayoutengine_p.h
index 02c74b0..44efbba 100644
--- a/src/gui/graphicsview/qgridlayoutengine_p.h
+++ b/src/gui/graphicsview/qgridlayoutengine_p.h
@@ -224,13 +224,16 @@ public:
typedef QMap<QPair<int, int>, QGridLayoutMultiCellData> MultiCellMap;
+class QGridLayoutRowInfo;
+
class QGridLayoutRowData
{
public:
void reset(int count);
- void distributeMultiCells();
+ void distributeMultiCells(const QGridLayoutRowInfo &rowInfo);
void calculateGeometries(int start, int end, qreal targetSize, qreal *positions, qreal *sizes,
- qreal *descents, const QGridLayoutBox &totalBox);
+ qreal *descents, const QGridLayoutBox &totalBox,
+ const QGridLayoutRowInfo &rowInfo);
QGridLayoutBox totalBox(int start, int end) const;
void stealBox(int start, int end, int which, qreal *positions, qreal *sizes);
diff --git a/src/gui/styles/qs60style.cpp b/src/gui/styles/qs60style.cpp
index 5fe9050..2f09529 100644
--- a/src/gui/styles/qs60style.cpp
+++ b/src/gui/styles/qs60style.cpp
@@ -1438,10 +1438,11 @@ void QS60Style::drawControl(ControlElement element, const QStyleOption *option,
const QRect iconRect = subElementRect(SE_ItemViewItemDecoration, &voptAdj, widget);
QRect textRect = subElementRect(SE_ItemViewItemText, &voptAdj, widget);
const QAbstractItemView *itemView = qobject_cast<const QAbstractItemView *>(widget);
- const bool singleSelection =
- (itemView->selectionMode() == QAbstractItemView::SingleSelection ||
- itemView->selectionMode() == QAbstractItemView::NoSelection);
- const bool selectItems = (itemView->selectionBehavior() == QAbstractItemView::SelectItems);
+
+ const bool singleSelection = itemView &&
+ ((itemView->selectionMode() == QAbstractItemView::SingleSelection ||
+ itemView->selectionMode() == QAbstractItemView::NoSelection));
+ const bool selectItems = itemView && (itemView->selectionBehavior() == QAbstractItemView::SelectItems);
// draw themed background for itemview unless background brush has been defined.
if (vopt->backgroundBrush == Qt::NoBrush) {
@@ -2536,6 +2537,56 @@ QSize QS60Style::sizeFromContents(ContentsType ct, const QStyleOption *opt,
if (const QStyleOptionToolButton *toolBtn = qstyleoption_cast<const QStyleOptionToolButton *>(opt))
if (toolBtn->subControls & SC_ToolButtonMenu)
sz += QSize(pixelMetric(PM_MenuButtonIndicator), 0);
+
+ //Make toolbuttons in toolbar stretch the whole screen area
+ if (widget && qobject_cast<const QToolBar *>(widget->parentWidget())) {
+ const QToolBar *tb = qobject_cast<const QToolBar *>(widget->parentWidget());
+ const bool parentCanGrowHorizontally = !(tb->sizePolicy().horizontalPolicy() == QSizePolicy::Fixed ||
+ tb->sizePolicy().horizontalPolicy() == QSizePolicy::Maximum) && tb->orientation() == Qt::Horizontal;
+
+ if (parentCanGrowHorizontally) {
+ int visibleButtons = 0;
+ //Make the auto-stretch to happen only for horizontal orientation
+ if (tb && tb->orientation() == Qt::Horizontal) {
+ QList<QAction*> actionList = tb->actions();
+ for (int i = 0; i < actionList.count(); i++) {
+ if (actionList.at(i)->isVisible())
+ visibleButtons++;
+ }
+ }
+
+ if (widget->parentWidget() && visibleButtons > 0) {
+ QWidget *w = const_cast<QWidget *>(widget);
+ int toolBarMaxWidth = 0;
+ int totalMargin = 0;
+ while (w) {
+ //honor fixed width parents
+ if (w->maximumWidth() == w->minimumWidth())
+ toolBarMaxWidth = qMax(toolBarMaxWidth, w->maximumWidth());
+ if (w->layout() && w->windowType() == Qt::Widget) {
+ totalMargin += w->layout()->contentsMargins().left() +
+ w->layout()->contentsMargins().right();
+ }
+ w = w->parentWidget();
+ }
+ totalMargin += 2 * pixelMetric(QStyle::PM_ToolBarFrameWidth);
+
+ if (toolBarMaxWidth == 0)
+ toolBarMaxWidth =
+ QApplication::desktop()->availableGeometry(widget->parentWidget()).width();
+ //Reduce the margins, toolbar frame, item spacing and internal margin from available area
+ toolBarMaxWidth -= totalMargin;
+
+ //ensure that buttons are side-by-side and not on top of each other
+ const int toolButtonWidth = (toolBarMaxWidth / visibleButtons)
+ - pixelMetric(QStyle::PM_ToolBarItemSpacing)
+ - pixelMetric(QStyle::PM_ToolBarItemMargin)
+ //toolbar frame needs to be reduced again, since QToolBarLayout adds it for each toolbar action
+ - 2 * pixelMetric(QStyle::PM_ToolBarFrameWidth) - 1;
+ sz.setWidth(qMax(toolButtonWidth, sz.width()));
+ }
+ }
+ }
break;
case CT_PushButton:
sz = QCommonStyle::sizeFromContents( ct, opt, csz, widget);
diff --git a/src/gui/text/qfontengine_x11.cpp b/src/gui/text/qfontengine_x11.cpp
index b7e4be2..c06be3b 100644
--- a/src/gui/text/qfontengine_x11.cpp
+++ b/src/gui/text/qfontengine_x11.cpp
@@ -429,7 +429,7 @@ void QFontEngineXLFD::recalcAdvances(QGlyphLayout *glyphs, QTextEngine::ShaperFl
{
int i = glyphs->numGlyphs;
XCharStruct *xcs;
- // inlined for better perfomance
+ // inlined for better performance
if (!_fs->per_char) {
xcs = &_fs->min_bounds;
while (i != 0) {
diff --git a/src/openvg/qpaintengine_vg.cpp b/src/openvg/qpaintengine_vg.cpp
index 03d756d..b8e8bad 100644
--- a/src/openvg/qpaintengine_vg.cpp
+++ b/src/openvg/qpaintengine_vg.cpp
@@ -3546,8 +3546,8 @@ void QVGPaintEngine::drawStaticTextItem(QStaticTextItem *textItem)
// Set the glyph drawing origin.
VGfloat origin[2];
- origin[0] = positions[0].x.toReal();
- origin[1] = positions[0].y.toReal();
+ origin[0] = positions[0].x.round().toReal();
+ origin[1] = positions[0].y.round().toReal();
vgSetfv(VG_GLYPH_ORIGIN, 2, origin);
// Fast anti-aliasing for paths, better for images.
diff --git a/src/plugins/s60/feedback/feedback.pro b/src/plugins/s60/feedback/feedback.pro
index 1069220..5e577ec 100644
--- a/src/plugins/s60/feedback/feedback.pro
+++ b/src/plugins/s60/feedback/feedback.pro
@@ -6,7 +6,7 @@ QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/s60/feedback
INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
-contains(S60_VERSION, 5.0)|contains(S60_VERSION, symbian3) {
+!contains(S60_VERSION, 3.1):!contains(S60_VERSION, 3.2) {
HEADERS += qtactileFeedback.h
SOURCES += qtactileFeedback_s60.cpp
diff --git a/src/plugins/s60/s60.pro b/src/plugins/s60/s60.pro
index ffcd170..1ddf326 100644
--- a/src/plugins/s60/s60.pro
+++ b/src/plugins/s60/s60.pro
@@ -6,7 +6,7 @@ symbian {
SUBDIRS += 3_1 3_2
}
- contains(S60_VERSION, 5.0)|contains(S60_VERSION, symbian3) {
+ !contains(S60_VERSION, 3.1):!contains(S60_VERSION, 3.2) {
SUBDIRS += feedback
}
diff --git a/src/s60installs/s60installs.pro b/src/s60installs/s60installs.pro
index a236028..ff67bcf 100644
--- a/src/s60installs/s60installs.pro
+++ b/src/s60installs/s60installs.pro
@@ -87,7 +87,7 @@ symbian: {
DEPLOYMENT += bearer_plugin
}
- contains(S60_VERSION, 5.0)|contains(S60_VERSION, symbian3) {
+ !contains(S60_VERSION, 3.1):!contains(S60_VERSION, 3.2) {
feedback_plugin.sources = $$QT_BUILD_TREE/plugins/s60/feedback/qtactilefeedback$${QT_LIBINFIX}.dll
feedback_plugin.path = c:$$QT_PLUGINS_BASE_DIR/feedback
DEPLOYMENT += feedback_plugin
diff --git a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
index 174e4aa..35ea059 100644
--- a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
+++ b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
@@ -122,6 +122,8 @@ private slots:
void task236367_maxSizeHint();
void heightForWidth();
void heightForWidthWithSpanning();
+ void stretchAndHeightForWidth();
+ void testDefaultAlignment();
};
class RectWidget : public QGraphicsWidget
@@ -699,6 +701,10 @@ void tst_QGraphicsGridLayout::columnMaximumWidth()
layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(0);
+ QCOMPARE(layout->minimumSize(), QSizeF(10+10+10, 10+10));
+ QCOMPARE(layout->preferredSize(), QSizeF(25+25+25, 25+25));
+ QCOMPARE(layout->maximumSize(), QSizeF(50+50+50, 50+50));
+
// should at least be a very large number
QVERIFY(layout->columnMaximumWidth(0) >= 10000);
QCOMPARE(layout->columnMaximumWidth(0), layout->columnMaximumWidth(1));
@@ -706,17 +712,65 @@ void tst_QGraphicsGridLayout::columnMaximumWidth()
layout->setColumnMaximumWidth(0, 20);
layout->setColumnMaximumWidth(2, 60);
- view.show();
- widget->show();
+ QCOMPARE(layout->minimumSize(), QSizeF(10+10+10, 10+10));
+ QCOMPARE(layout->preferredSize(), QSizeF(20+25+25, 25+25));
+ QCOMPARE(layout->maximumSize(), QSizeF(20+50+60, 50+50));
+ QCOMPARE(layout->maximumSize(), widget->maximumSize());
+
widget->resize(widget->effectiveSizeHint(Qt::PreferredSize));
- QApplication::processEvents();
+ layout->activate();
- QCOMPARE(layout->itemAt(0,0)->geometry().width(), 20.0);
- QCOMPARE(layout->itemAt(1,0)->geometry().width(), 20.0);
- QCOMPARE(layout->itemAt(0,1)->geometry().width(), 25.0);
- QCOMPARE(layout->itemAt(1,1)->geometry().width(), 25.0);
- QCOMPARE(layout->itemAt(0,2)->geometry().width(), 25.0);
- QCOMPARE(layout->itemAt(1,2)->geometry().width(), 25.0);
+ QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 0, 20, 25));
+ QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 25, 20, 25));
+ QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(20, 0, 25, 25));
+ QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(20, 25, 25, 25));
+ QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(45, 0, 25, 25));
+ QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(45, 25, 25, 25));
+
+ layout->setColumnAlignment(2, Qt::AlignCenter);
+ widget->resize(widget->effectiveSizeHint(Qt::MaximumSize));
+ layout->activate();
+ QCOMPARE(layout->geometry(), QRectF(0,0,20+50+60, 50+50));
+ QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 0, 20, 50));
+ QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 50, 20, 50));
+ QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(20, 0, 50, 50));
+ QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(20, 50, 50, 50));
+ QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(75, 0, 50, 50));
+ QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(75, 50, 50, 50));
+
+ for (int i = 0; i < layout->count(); i++)
+ layout->setAlignment(layout->itemAt(i), Qt::AlignRight | Qt::AlignBottom);
+ layout->activate();
+ QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 0, 20, 50));
+ QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 50, 20, 50));
+ QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(20, 0, 50, 50));
+ QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(20, 50, 50, 50));
+ QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(80, 0, 50, 50));
+ QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(80, 50, 50, 50));
+ for (int i = 0; i < layout->count(); i++)
+ layout->setAlignment(layout->itemAt(i), Qt::AlignCenter);
+
+ layout->setMaximumSize(layout->maximumSize() + QSizeF(60,60));
+ widget->resize(widget->effectiveSizeHint(Qt::MaximumSize));
+ layout->activate();
+
+ QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 15, 20, 50));
+ QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 95, 20, 50));
+ QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(20+30, 15, 50, 50));
+ QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(20+30, 95, 50, 50));
+ QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(20+60+50+5, 15, 50, 50));
+ QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(20+60+50+5, 95, 50, 50));
+
+ layout->setMaximumSize(layout->preferredSize() + QSizeF(20,20));
+ widget->resize(widget->effectiveSizeHint(Qt::MaximumSize));
+ layout->activate();
+
+ QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 0, 20, 35));
+ QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 35, 20, 35));
+ QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(20, 0, 35, 35));
+ QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(20, 35, 35, 35));
+ QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(55, 0, 35, 35));
+ QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(55, 35, 35, 35));
delete widget;
}
@@ -2306,6 +2360,11 @@ static QSizeF hfw1(Qt::SizeHint, const QSizeF &constraint)
return result;
}
+static QSizeF hfw2(Qt::SizeHint /*which*/, const QSizeF &constraint)
+{
+ return QSizeF(constraint.width(), constraint.width());
+}
+
void tst_QGraphicsGridLayout::geometries_data()
{
@@ -2361,6 +2420,31 @@ void tst_QGraphicsGridLayout::geometries_data()
<< QRectF(0, 1, 50,100) << QRectF(50, 1, 50,400)
);
+
+ QTest::newRow("hfw-h408") << (ItemList()
+ << ItemDesc(0,0)
+ .minSize(QSizeF(1,1))
+ .preferredSize(QSizeF(50,10))
+ .maxSize(QSizeF(100, 100))
+ << ItemDesc(0,1)
+ .minSize(QSizeF(1,1))
+ .preferredSize(QSizeF(50,10))
+ .maxSize(QSizeF(100, 100))
+ << ItemDesc(1,0)
+ .minSize(QSizeF(1,1))
+ .preferredSize(QSizeF(50,10))
+ .maxSize(QSizeF(100, 100))
+ << ItemDesc(1,1)
+ .sizeHint(Qt::MinimumSize, QSizeF(40,40))
+ .sizeHint(Qt::PreferredSize, QSizeF(50,400))
+ .sizeHint(Qt::MaximumSize, QSizeF(500, 500))
+ .heightForWidth(hfw1)
+ )
+ << QSizeF(100, 408)
+ << (RectList()
+ << QRectF(0, 0, 50, 8) << QRectF(50, 0, 50, 8)
+ << QRectF(0, 8, 50,100) << QRectF(50, 8, 50,400)
+ );
QTest::newRow("hfw-h410") << (ItemList()
<< ItemDesc(0,0)
.minSize(QSizeF(1,1))
@@ -2386,6 +2470,150 @@ void tst_QGraphicsGridLayout::geometries_data()
<< QRectF(0, 10, 50,100) << QRectF(50, 10, 50,400)
);
+ QTest::newRow("hfw-h470") << (ItemList()
+ << ItemDesc(0,0)
+ .minSize(QSizeF(1,1))
+ .preferredSize(QSizeF(50,10))
+ .maxSize(QSizeF(100, 100))
+ << ItemDesc(0,1)
+ .minSize(QSizeF(1,1))
+ .preferredSize(QSizeF(50,10))
+ .maxSize(QSizeF(100, 100))
+ << ItemDesc(1,0)
+ .minSize(QSizeF(1,1))
+ .preferredSize(QSizeF(50,10))
+ .maxSize(QSizeF(100, 100))
+ << ItemDesc(1,1)
+ .sizeHint(Qt::MinimumSize, QSizeF(40,40))
+ .sizeHint(Qt::PreferredSize, QSizeF(50,400))
+ .sizeHint(Qt::MaximumSize, QSizeF(500,500))
+ .heightForWidth(hfw1)
+ )
+ << QSizeF(100, 470)
+ << (RectList()
+ << QRectF(0, 0, 50,70) << QRectF(50, 0, 50,70)
+ << QRectF(0, 70, 50,100) << QRectF(50, 70, 50,400)
+ );
+
+
+ // change layout width and verify
+ QTest::newRow("hfw-w100") << (ItemList()
+ << ItemDesc(0,0)
+ .minSize(QSizeF(1,1))
+ .preferredSize(QSizeF(50,10))
+ .maxSize(QSizeF(100, 100))
+ << ItemDesc(0,1)
+ .minSize(QSizeF(1,1))
+ .preferredSize(QSizeF(50,10))
+ .maxSize(QSizeF(100, 100))
+ << ItemDesc(1,0)
+ .minSize(QSizeF(1,1))
+ .preferredSize(QSizeF(50,10))
+ .maxSize(QSizeF(100, 100))
+ << ItemDesc(1,1)
+ .sizeHint(Qt::MinimumSize, QSizeF(40,40))
+ .sizeHint(Qt::PreferredSize, QSizeF(50,400))
+ .sizeHint(Qt::MaximumSize, QSizeF(5000,5000))
+ .heightForWidth(hfw1)
+ )
+ << QSizeF(100, 401)
+ << (RectList()
+ << QRectF( 0, 0, 50, 1) << QRectF( 50, 0, 50, 1)
+ << QRectF( 0, 1, 50, 100) << QRectF( 50, 1, 50, 400)
+ );
+
+ QTest::newRow("hfw-w160") << (ItemList()
+ << ItemDesc(0,0)
+ .minSize(QSizeF(1,1))
+ .preferredSize(QSizeF(50,10))
+ .maxSize(QSizeF(100, 100))
+ << ItemDesc(0,1)
+ .minSize(QSizeF(1,1))
+ .preferredSize(QSizeF(50,10))
+ .maxSize(QSizeF(100, 100))
+ << ItemDesc(1,0)
+ .minSize(QSizeF(1,1))
+ .preferredSize(QSizeF(50,10))
+ .maxSize(QSizeF(100, 100))
+ << ItemDesc(1,1)
+ .sizeHint(Qt::MinimumSize, QSizeF(40,40))
+ .sizeHint(Qt::PreferredSize, QSizeF(50,400))
+ .sizeHint(Qt::MaximumSize, QSizeF(5000,5000))
+ .heightForWidth(hfw1)
+ )
+ << QSizeF(160, 350)
+ << (RectList()
+ << QRectF( 0, 0, 80, 100) << QRectF( 80, 0, 80, 100)
+ << QRectF( 0, 100, 80, 100) << QRectF( 80, 100, 80, 250)
+ );
+
+ QTest::newRow("hfw-w500") << (ItemList()
+ << ItemDesc(0,0)
+ .minSize(QSizeF(1,1))
+ .preferredSize(QSizeF(50,10))
+ .maxSize(QSizeF(100, 100))
+ << ItemDesc(0,1)
+ .minSize(QSizeF(1,1))
+ .preferredSize(QSizeF(50,10))
+ .maxSize(QSizeF(100, 100))
+ << ItemDesc(1,0)
+ .minSize(QSizeF(1,1))
+ .preferredSize(QSizeF(50,10))
+ .maxSize(QSizeF(100, 100))
+ << ItemDesc(1,1)
+ .sizeHint(Qt::MinimumSize, QSizeF(40,40))
+ .sizeHint(Qt::PreferredSize, QSizeF(50,400))
+ .sizeHint(Qt::MaximumSize, QSizeF(5000,5000))
+ .heightForWidth(hfw1)
+ )
+ << QSizeF(500, 200)
+ << (RectList()
+ << QRectF( 0, 0, 100, 100) << QRectF(100, 0, 100, 100)
+ << QRectF( 0, 100, 100, 100) << QRectF(100, 100, 400, 50)
+ );
+
+ QTest::newRow("hfw-alignment-defaults") << (ItemList()
+ << ItemDesc(0,0)
+ .minSize(QSizeF(100, 100))
+ .maxSize(QSizeF(100, 100))
+ .heightForWidth(hfw2)
+ << ItemDesc(1,0)
+ .minSize(QSizeF(200, 200))
+ .maxSize(QSizeF(200, 200))
+ .heightForWidth(hfw2)
+ << ItemDesc(2,0)
+ .minSize(QSizeF(300, 300))
+ .maxSize(QSizeF(300, 300))
+ )
+ << QSizeF(300, 600)
+ << (RectList()
+ << QRectF(0, 0, 100, 100)
+ << QRectF(0, 100, 200, 200)
+ << QRectF(0, 300, 300, 300)
+ );
+
+ QTest::newRow("hfw-alignment2") << (ItemList()
+ << ItemDesc(0,0)
+ .minSize(QSizeF(100, 100))
+ .maxSize(QSizeF(100, 100))
+ .heightForWidth(hfw2)
+ .alignment(Qt::AlignRight)
+ << ItemDesc(1,0)
+ .minSize(QSizeF(200, 200))
+ .maxSize(QSizeF(200, 200))
+ .heightForWidth(hfw2)
+ .alignment(Qt::AlignHCenter)
+ << ItemDesc(2,0)
+ .minSize(QSizeF(300, 300))
+ .maxSize(QSizeF(300, 300))
+ )
+ << QSizeF(300, 600)
+ << (RectList()
+ << QRectF(200, 0, 100, 100)
+ << QRectF( 50, 100, 200, 200)
+ << QRectF( 0, 300, 300, 300)
+ );
+
}
void tst_QGraphicsGridLayout::geometries()
@@ -2556,8 +2784,9 @@ void tst_QGraphicsGridLayout::heightForWidth()
w11->setSizePolicy(sp);
layout->addItem(w11, 1, 1);
- QSizeF prefSize = layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(-1, -1));
- QCOMPARE(prefSize, QSizeF(10+200, 10+100));
+ QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(-1, -1)), QSizeF(2, 2));
+ QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(-1, -1)), QSizeF(210, 110));
+ QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(-1, -1)), QSizeF(30100, 30100));
QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(2, -1)), QSizeF(2, 20001));
QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(2, -1)), QSizeF(2, 20010));
@@ -2610,23 +2839,128 @@ void tst_QGraphicsGridLayout::heightForWidthWithSpanning()
w->setSizePolicy(sp);
layout->addItem(w, 0,0,2,2);
- QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(-1, -1)), QSizeF(1, 100));
+ QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(-1, -1)), QSizeF(1, 1));
QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(-1, -1)), QSizeF(200, 100));
- QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(-1, -1)), QSizeF(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX));
+ QEXPECT_FAIL("", "Due to an old bug this wrongly returns QWIDGETSIZE_MAX", Continue);
+ QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(-1, -1)), QSizeF(30000, 30000));
QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(200, -1)), QSizeF(200, 100));
QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(200, -1)), QSizeF(200, 100));
- QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(200, -1)), QSizeF(200, QWIDGETSIZE_MAX));
+ QEXPECT_FAIL("", "Due to an old bug this wrongly returns QWIDGETSIZE_MAX", Continue);
+ QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(200, -1)), QSizeF(200, 100));
QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(2, -1)), QSizeF(2, 10000));
QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(2, -1)), QSizeF(2, 10000));
- QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(2, -1)), QSizeF(2, QWIDGETSIZE_MAX));
+ QEXPECT_FAIL("", "Due to an old bug this wrongly returns QWIDGETSIZE_MAX", Continue);
+ QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(2, -1)), QSizeF(2, 10000));
QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(200, -1)), QSizeF(200, 100));
QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(200, -1)), QSizeF(200, 100));
- QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(200, -1)), QSizeF(200, QWIDGETSIZE_MAX));
+ QEXPECT_FAIL("", "Due to an old bug this wrongly returns QWIDGETSIZE_MAX", Continue);
+ QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(200, -1)), QSizeF(200, 10000));
+}
+
+void tst_QGraphicsGridLayout::stretchAndHeightForWidth()
+{
+ QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
+ QGraphicsGridLayout *layout = new QGraphicsGridLayout;
+ widget->setLayout(layout);
+ layout->setContentsMargins(0, 0, 0, 0);
+ layout->setSpacing(0);
+
+ RectWidget *w1 = new RectWidget;
+ w1->setSizeHint(Qt::MinimumSize, QSizeF(10, 10));
+ w1->setSizeHint(Qt::PreferredSize, QSizeF(100, 100));
+ w1->setSizeHint(Qt::MaximumSize, QSizeF(500, 500));
+ layout->addItem(w1, 0,0,1,1);
+
+ RectWidget *w2 = new RectWidget;
+ w2->setSizeHint(Qt::MinimumSize, QSizeF(10, 10));
+ w2->setSizeHint(Qt::PreferredSize, QSizeF(100, 100));
+ w2->setSizeHint(Qt::MaximumSize, QSizeF(500, 500));
+ layout->addItem(w2, 0,1,1,1);
+ layout->setColumnStretchFactor(1, 2);
+
+ QApplication::sendPostedEvents();
+ QGraphicsScene scene;
+ QGraphicsView *view = new QGraphicsView(&scene);
+
+ scene.addItem(widget);
+
+ view->show();
+
+ widget->resize(500, 100);
+ // w1 should stay at its preferred size
+ QCOMPARE(w1->geometry(), QRectF(0, 0, 100, 100));
+ QCOMPARE(w2->geometry(), QRectF(100, 0, 400, 100));
+
+
+ // only w1 has hfw
+ w1->setConstraintFunction(hfw);
+ QSizePolicy sp(QSizePolicy::Preferred, QSizePolicy::Preferred);
+ sp.setHeightForWidth(true);
+ w1->setSizePolicy(sp);
+ QApplication::sendPostedEvents();
+
+ QCOMPARE(w1->geometry(), QRectF(0, 0, 100, 200));
+ QCOMPARE(w2->geometry(), QRectF(100, 0, 400, 200));
+
+ // only w2 has hfw
+ w2->setConstraintFunction(hfw);
+ w2->setSizePolicy(sp);
+
+ w1->setConstraintFunction(0);
+ sp.setHeightForWidth(false);
+ w1->setSizePolicy(sp);
+ QApplication::sendPostedEvents();
+
+ QCOMPARE(w1->geometry(), QRectF(0, 0, 100, 100));
+ QCOMPARE(w2->geometry(), QRectF(100, 0, 400, 50));
+
}
+void tst_QGraphicsGridLayout::testDefaultAlignment()
+{
+ QGraphicsWidget *widget = new QGraphicsWidget;
+ QGraphicsGridLayout *layout = new QGraphicsGridLayout(widget);
+ layout->setContentsMargins(0, 0, 0, 0);
+ layout->setSpacing(0);
+
+ QGraphicsWidget *w = new QGraphicsWidget;
+ w->setMinimumSize(50,50);
+ w->setMaximumSize(50,50);
+ layout->addItem(w,0,0);
+
+ //Default alignment should be to the top-left
+
+ //First, check by forcing the layout to be bigger
+ layout->setMinimumSize(100,100);
+ layout->activate();
+ QCOMPARE(layout->geometry(), QRectF(0,0,100,100));
+ QCOMPARE(w->geometry(), QRectF(0,0,50,50));
+ layout->setMinimumSize(-1,-1);
+
+ //Second, check by forcing the column and row to be bigger instead
+ layout->setColumnMinimumWidth(0, 100);
+ layout->setRowMinimumHeight(0, 100);
+ layout->activate();
+ QCOMPARE(layout->geometry(), QRectF(0,0,100,100));
+ QCOMPARE(w->geometry(), QRectF(0,0,50,50));
+ layout->setMinimumSize(-1,-1);
+ layout->setColumnMinimumWidth(0, 0);
+ layout->setRowMinimumHeight(0, 0);
+
+
+ //Third, check by adding a larger item in the column
+ QGraphicsWidget *w2 = new QGraphicsWidget;
+ w2->setMinimumSize(100,100);
+ w2->setMaximumSize(100,100);
+ layout->addItem(w2,1,0);
+ layout->activate();
+ QCOMPARE(layout->geometry(), QRectF(0,0,100,150));
+ QCOMPARE(w->geometry(), QRectF(0,0,50,50));
+ QCOMPARE(w2->geometry(), QRectF(0,50,100,100));
+}
QTEST_MAIN(tst_QGraphicsGridLayout)
#include "tst_qgraphicsgridlayout.moc"
diff --git a/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp b/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
index 6107fa1..965e340 100644
--- a/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
+++ b/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
@@ -103,6 +103,9 @@ private slots:
void removeLayout();
void avoidRecursionInInsertItem();
void styleInfoLeak();
+ void testAlignmentInLargerLayout();
+ void testOffByOneInLargerLayout();
+ void testDefaultAlignment();
// Task specific tests
void task218400_insertStretchCrash();
@@ -1465,6 +1468,121 @@ void tst_QGraphicsLinearLayout::task218400_insertStretchCrash()
form->setLayout(layout); // crash
}
+void tst_QGraphicsLinearLayout::testAlignmentInLargerLayout()
+{
+ QGraphicsScene *scene = new QGraphicsScene;
+ QGraphicsWidget *form = new QGraphicsWidget;
+ scene->addItem(form);
+ QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical, form);
+ layout->setSpacing(0);
+ layout->setContentsMargins(0,0,0,0);
+
+ QGraphicsWidget *a = new QGraphicsWidget;
+ a->setMaximumSize(100,100);
+ layout->addItem(a);
+
+ QCOMPARE(form->maximumSize(), QSizeF(100,100));
+ QCOMPARE(layout->maximumSize(), QSizeF(100,100));
+ layout->setMinimumSize(QSizeF(200,200));
+ layout->setMaximumSize(QSizeF(200,200));
+
+ layout->setAlignment(a, Qt::AlignCenter);
+ layout->activate();
+ QCOMPARE(a->geometry(), QRectF(50,50,100,100));
+
+ layout->setAlignment(a, Qt::AlignRight | Qt::AlignBottom);
+ layout->activate();
+ QCOMPARE(a->geometry(), QRectF(100,100,100,100));
+
+ layout->setAlignment(a, Qt::AlignHCenter | Qt::AlignTop);
+ layout->activate();
+ QCOMPARE(a->geometry(), QRectF(50,0,100,100));
+
+ QGraphicsWidget *b = new QGraphicsWidget;
+ b->setMaximumSize(100,100);
+ layout->addItem(b);
+
+ layout->setAlignment(a, Qt::AlignCenter);
+ layout->setAlignment(b, Qt::AlignCenter);
+ layout->activate();
+ QCOMPARE(a->geometry(), QRectF(50,0,100,100));
+ QCOMPARE(b->geometry(), QRectF(50,100,100,100));
+
+ layout->setAlignment(a, Qt::AlignRight | Qt::AlignBottom);
+ layout->setAlignment(b, Qt::AlignLeft | Qt::AlignTop);
+ layout->activate();
+ QCOMPARE(a->geometry(), QRectF(100,0,100,100));
+ QCOMPARE(b->geometry(), QRectF(0,100,100,100));
+}
+
+void tst_QGraphicsLinearLayout::testOffByOneInLargerLayout() {
+ QGraphicsScene *scene = new QGraphicsScene;
+ QGraphicsWidget *form = new QGraphicsWidget;
+ scene->addItem(form);
+ QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical, form);
+ layout->setSpacing(0);
+ layout->setContentsMargins(0,0,0,0);
+
+ QGraphicsWidget *a = new QGraphicsWidget;
+ QGraphicsWidget *b = new QGraphicsWidget;
+ a->setMaximumSize(100,100);
+ b->setMaximumSize(100,100);
+ layout->addItem(a);
+ layout->addItem(b);
+
+ layout->setAlignment(a, Qt::AlignRight | Qt::AlignBottom);
+ layout->setAlignment(b, Qt::AlignLeft | Qt::AlignTop);
+ layout->setMinimumSize(QSizeF(101,201));
+ layout->setMaximumSize(QSizeF(101,201));
+ layout->activate();
+ QCOMPARE(a->geometry(), QRectF(1,0.5,100,100));
+ QCOMPARE(b->geometry(), QRectF(0,100.5,100,100));
+
+ layout->setMinimumSize(QSizeF(100,200));
+ layout->setMaximumSize(QSizeF(100,200));
+ layout->activate();
+ QCOMPARE(a->geometry(), QRectF(0,0,100,100));
+ QCOMPARE(b->geometry(), QRectF(0,100,100,100));
+
+ layout->setMinimumSize(QSizeF(99,199));
+ layout->setMaximumSize(QSizeF(99,199));
+ layout->activate();
+ QCOMPARE(a->geometry(), QRectF(0,0,99,99.5));
+ QCOMPARE(b->geometry(), QRectF(0,99.5,99,99.5));
+}
+void tst_QGraphicsLinearLayout::testDefaultAlignment()
+{
+ QGraphicsWidget *widget = new QGraphicsWidget;
+ QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical, widget);
+ layout->setContentsMargins(0, 0, 0, 0);
+ layout->setSpacing(0);
+
+ QGraphicsWidget *w = new QGraphicsWidget;
+ w->setMinimumSize(50,50);
+ w->setMaximumSize(50,50);
+ layout->addItem(w);
+
+ //Default alignment should be to the top-left
+ QCOMPARE(layout->alignment(w), 0);
+
+ //First, check by forcing the layout to be bigger
+ layout->setMinimumSize(100,100);
+ layout->activate();
+ QCOMPARE(layout->geometry(), QRectF(0,0,100,100));
+ QCOMPARE(w->geometry(), QRectF(0,0,50,50));
+ layout->setMinimumSize(-1,-1);
+
+ //Second, check by adding a larger item in the column
+ QGraphicsWidget *w2 = new QGraphicsWidget;
+ w2->setMinimumSize(100,100);
+ w2->setMaximumSize(100,100);
+ layout->addItem(w2);
+ layout->activate();
+ QCOMPARE(layout->geometry(), QRectF(0,0,100,150));
+ QCOMPARE(w->geometry(), QRectF(0,0,50,50));
+ QCOMPARE(w2->geometry(), QRectF(0,50,100,100));
+}
+
QTEST_MAIN(tst_QGraphicsLinearLayout)
#include "tst_qgraphicslinearlayout.moc"
diff --git a/tests/auto/qthread/tst_qthread.cpp b/tests/auto/qthread/tst_qthread.cpp
index 843749a..b0efb5a 100644
--- a/tests/auto/qthread/tst_qthread.cpp
+++ b/tests/auto/qthread/tst_qthread.cpp
@@ -106,6 +106,7 @@ private slots:
void adoptMultipleThreads();
void QTBUG13810_exitAndStart();
+ void QTBUG15378_exitAndExec();
void stressTest();
};
@@ -976,5 +977,45 @@ void tst_QThread::QTBUG13810_exitAndStart()
}
+void tst_QThread::QTBUG15378_exitAndExec()
+{
+ class Thread : public QThread {
+ public:
+ QSemaphore sem1;
+ QSemaphore sem2;
+ volatile int value;
+ void run() {
+ sem1.acquire();
+ value = exec(); //First entrence
+ sem2.release();
+ value = exec(); // Second loop
+ }
+ };
+ Thread thread;
+ thread.value = 0;
+ thread.start();
+ thread.exit(556);
+ thread.sem1.release(); //should exit the first loop
+ thread.sem2.acquire();
+ int v = thread.value;
+ QCOMPARE(v, 556);
+
+ //test that the thread is running by executing queued connected signal there
+ Syncronizer sync1;
+ sync1.moveToThread(&thread);
+ Syncronizer sync2;
+ sync2.moveToThread(&thread);
+ connect(&sync2, SIGNAL(propChanged(int)), &sync1, SLOT(setProp(int)), Qt::QueuedConnection);
+ connect(&sync1, SIGNAL(propChanged(int)), &thread, SLOT(quit()), Qt::QueuedConnection);
+ QMetaObject::invokeMethod(&sync2, "setProp", Qt::QueuedConnection , Q_ARG(int, 89));
+ QTest::qWait(50);
+ while(!thread.wait(10))
+ QTest::qWait(10);
+ QCOMPARE(sync2.m_prop, 89);
+ QCOMPARE(sync1.m_prop, 89);
+}
+
+
+
QTEST_MAIN(tst_QThread)
#include "tst_qthread.moc"
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro b/tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro
new file mode 100644
index 0000000..ff85fe8
--- /dev/null
+++ b/tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro
@@ -0,0 +1,6 @@
+load(qttest_p4)
+TEMPLATE = app
+TARGET = tst_bench_qgraphicslinearlayout
+
+SOURCES += tst_qgraphicslinearlayout.cpp
+
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp b/tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
new file mode 100644
index 0000000..dc415fb
--- /dev/null
+++ b/tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
@@ -0,0 +1,133 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite 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 Technology Preview License Agreement accompanying
+** this package.
+**
+** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+#include <QtGui/qgraphicslinearlayout.h>
+#include <QtGui/qgraphicswidget.h>
+#include <QtGui/qgraphicsview.h>
+
+class tst_QGraphicsLinearLayout : public QObject
+{
+ Q_OBJECT
+public:
+ tst_QGraphicsLinearLayout() {}
+ ~tst_QGraphicsLinearLayout() {}
+
+private slots:
+ void heightForWidth_data();
+ void heightForWidth();
+};
+
+
+struct MySquareWidget : public QGraphicsWidget
+{
+ MySquareWidget() {}
+ virtual QSizeF sizeHint ( Qt::SizeHint which, const QSizeF & constraint = QSizeF() ) const
+ {
+ if (which != Qt::PreferredSize)
+ return QGraphicsWidget::sizeHint(which, constraint);
+ if (constraint.width() < 0)
+ return QGraphicsWidget::sizeHint(which, constraint);
+ return QSizeF(constraint.width(), constraint.width());
+ }
+};
+
+void tst_QGraphicsLinearLayout::heightForWidth_data()
+{
+ QTest::addColumn<bool>("hfw");
+ QTest::addColumn<bool>("nested");
+
+ QTest::newRow("hfw") << true << false;
+ QTest::newRow("hfw, nested") << true << true;
+ QTest::newRow("not hfw") << false << false;
+ QTest::newRow("not hfw, nested") << false << true;
+}
+
+void tst_QGraphicsLinearLayout::heightForWidth()
+{
+ QFETCH(bool, hfw);
+ QFETCH(bool, nested);
+
+ QGraphicsScene scene;
+ QGraphicsWidget *form = new QGraphicsWidget;
+ scene.addItem(form);
+
+ QGraphicsLinearLayout *outerlayout = 0;
+ if (nested) {
+ outerlayout = new QGraphicsLinearLayout(form);
+ for (int i = 0; i < 8; i++) {
+ QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical);
+ outerlayout->addItem(layout);
+ outerlayout = layout;
+ }
+ }
+
+ QGraphicsLinearLayout *qlayout = 0;
+ qlayout = new QGraphicsLinearLayout(Qt::Vertical);
+ if (nested)
+ outerlayout->addItem(qlayout);
+ else
+ form->setLayout(qlayout);
+
+ MySquareWidget *widget = new MySquareWidget;
+ for (int i = 0; i < 1; i++) {
+ widget = new MySquareWidget;
+ QSizePolicy sizepolicy = widget->sizePolicy();
+ sizepolicy.setHeightForWidth(hfw);
+ widget->setSizePolicy(sizepolicy);
+ qlayout->addItem(widget);
+ }
+ // make sure only one iteration is done.
+ // run with tst_QGraphicsLinearLayout.exe "heightForWidth" -tickcounter -iterations 6
+ // this will iterate 6 times the whole test, (not only the benchmark)
+ // which should reduce warmup time and give a realistic picture of the performance of
+ // effectiveSizeHint()
+ QSizeF constraint(hfw ? 100 : -1, -1);
+ QBENCHMARK {
+ (void)form->effectiveSizeHint(Qt::PreferredSize, constraint);
+ }
+
+}
+
+
+QTEST_MAIN(tst_QGraphicsLinearLayout)
+
+#include "tst_qgraphicslinearlayout.moc"
diff --git a/tools/qmeegographicssystemhelper/qmeegoswitchevent.cpp b/tools/qmeegographicssystemhelper/qmeegoswitchevent.cpp
index b136ce8..22ea0fe 100644
--- a/tools/qmeegographicssystemhelper/qmeegoswitchevent.cpp
+++ b/tools/qmeegographicssystemhelper/qmeegoswitchevent.cpp
@@ -41,7 +41,9 @@
#include "qmeegoswitchevent.h"
-QMeeGoSwitchEvent::QMeeGoSwitchEvent(const QString &graphicsSystemName, QMeeGoSwitchEvent::State s) : QEvent((QEvent::Type) QMeeGoSwitchEvent::SwitchEvent)
+static int switchEventNumber = -1;
+
+QMeeGoSwitchEvent::QMeeGoSwitchEvent(const QString &graphicsSystemName, QMeeGoSwitchEvent::State s) : QEvent(QMeeGoSwitchEvent::eventNumber())
{
name = graphicsSystemName;
switchState = s;
@@ -55,4 +57,12 @@ QString QMeeGoSwitchEvent::graphicsSystemName() const
QMeeGoSwitchEvent::State QMeeGoSwitchEvent::state() const
{
return switchState;
+}
+
+QEvent::Type QMeeGoSwitchEvent::eventNumber()
+{
+ if (switchEventNumber < 0)
+ switchEventNumber = QEvent::registerEventType();
+
+ return (QEvent::Type) switchEventNumber;
} \ No newline at end of file
diff --git a/tools/qmeegographicssystemhelper/qmeegoswitchevent.h b/tools/qmeegographicssystemhelper/qmeegoswitchevent.h
index 2d8371e..0ddbd3d 100644
--- a/tools/qmeegographicssystemhelper/qmeegoswitchevent.h
+++ b/tools/qmeegographicssystemhelper/qmeegoswitchevent.h
@@ -62,11 +62,6 @@ public:
DidSwitch
};
- //! The event type id to use to detect this event.
- enum Type {
- SwitchEvent = QEvent::User + 1024
- };
-
//! Constructor for the event.
/*!
Creates a new event with the given name and the given state.
@@ -83,6 +78,13 @@ public:
//! Returns the state represented by this event.
State state() const;
+ //! Returns the event type/number for QMeeGoSwitchEvent.
+ /*!
+ The type is registered on first access. Use this to detect incoming
+ QMeeGoSwitchEvents.
+ */
+ QEvent::Type eventNumber();
+
private:
QString name;
State switchState;