From 0e456bf74dfea10c0f5c164eb5a920e4661a91b2 Mon Sep 17 00:00:00 2001
From: Jarek Kobus <jkobus@trolltech.com>
Date: Tue, 1 Feb 2011 13:15:28 +0100
Subject: Fix a crash when undoing form layout

In a rare case when breaking a layout might
make widgets overlap, the internal heuristic
failed when recreating an original layout during undo.
Some widgets were removed from the grid.
The patch fixes this heuristic (makes sure
we don't remove other widgets). Creating
a form layout from overlapping widgets works
better now.

Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Task-number: QTCREATORBUG-3616
---
 tools/designer/src/lib/shared/layout.cpp         | 22 ++++++++++++++--------
 tools/designer/src/lib/shared/qlayout_widget.cpp |  3 +--
 2 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/tools/designer/src/lib/shared/layout.cpp b/tools/designer/src/lib/shared/layout.cpp
index c9ffe71..9fe438b 100644
--- a/tools/designer/src/lib/shared/layout.cpp
+++ b/tools/designer/src/lib/shared/layout.cpp
@@ -996,13 +996,23 @@ bool Grid::shrinkFormLayoutSpans()
     for (WidgetSet::const_iterator it = widgets.constBegin(); it != cend ; ++it) {
         QWidget *w = *it;
         int row, col,  rowspan, colspan;
-        locateWidget(w, row, col, rowspan, colspan);
+        if (!locateWidget(w, row, col, rowspan, colspan))
+            qDebug("ooops, widget '%s' does not fit in layout", w->objectName().toUtf8().constData());
         const int maxColSpan = col == 0 ? 2 : 1;
         const int newColSpan = qMin(colspan, maxColSpan);
         const int newRowSpan = qMin(rowspan, maxRowSpan);
         if (newColSpan != colspan || newRowSpan != rowspan) {
-            setCells(QRect(col, row, colspan, rowspan), 0);
-            setCells(QRect(col, row, newColSpan, newRowSpan), w);
+            // in case like this:
+            // W1 W1
+            // W1 W2
+            // do:
+            // W1 0
+            // 0  W2
+            for (int i = row; i < row + rowspan - 1; i++)
+                for (int j = col; j < col + colspan - 1; j++)
+                    if (i > row + newColSpan - 1 || j > col + newRowSpan - 1)
+                        if (cell(i, j) == w)
+                            setCell(i, j, 0);
             shrunk = true;
         }
     }
@@ -1177,11 +1187,7 @@ void GridLayout<GridLikeLayout, LayoutType, GridMode>::doLayout()
             if (const Spacer *spacer = qobject_cast<const Spacer*>(w))
                 alignment = spacer->alignment();
 
-            if (rs * cs == 1) {
-                addWidgetToGrid(layout, w, r, c, 1, 1, alignment);
-            } else {
-                addWidgetToGrid(layout, w, r, c, rs, cs, alignment);
-            }
+            addWidgetToGrid(layout, w, r, c, rs, cs, alignment);
 
             w->show();
         } else {
diff --git a/tools/designer/src/lib/shared/qlayout_widget.cpp b/tools/designer/src/lib/shared/qlayout_widget.cpp
index 20db606..4debb5e 100644
--- a/tools/designer/src/lib/shared/qlayout_widget.cpp
+++ b/tools/designer/src/lib/shared/qlayout_widget.cpp
@@ -1181,8 +1181,7 @@ QRect LayoutHelper::itemInfo(QLayout *lt, const QWidget *widget) const
             } else {
                 for (int c = 0; c < FormLayoutColumns; c++) {
                     const QFormLayout::ItemRole role = c == 0 ? QFormLayout::LabelRole : QFormLayout::FieldRole;
-                    if (widgets[c]) {
-                        Q_ASSERT(BoxLayoutHelper::findItemOfWidget(items, widgets[c]));
+                    if (widgets[c] && BoxLayoutHelper::findItemOfWidget(items, widgets[c])) {
                         formLayout->setWidget(r, role, widgets[c]);
                     } else {
                         formLayout->setItem(r, role, createFormSpacer());
-- 
cgit v0.12


From bb84c5ef4f620af659395b66e6ed792a380b9a1f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= <tor.arne.vestbo@nokia.com>
Date: Tue, 1 Feb 2011 15:17:53 +0100
Subject: Don't ignore source-text when generating qsTrId translations for QML

Reviewed-by: ossi
---
 tests/auto/linguist/lupdate/testdata/good/parseqml/main.qml          | 3 +++
 tests/auto/linguist/lupdate/testdata/good/parseqml/project.ts.result | 5 +++++
 tools/linguist/lupdate/qdeclarative.cpp                              | 2 +-
 3 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/tests/auto/linguist/lupdate/testdata/good/parseqml/main.qml b/tests/auto/linguist/lupdate/testdata/good/parseqml/main.qml
index 768a4e2..c966fa1 100644
--- a/tests/auto/linguist/lupdate/testdata/good/parseqml/main.qml
+++ b/tests/auto/linguist/lupdate/testdata/good/parseqml/main.qml
@@ -93,5 +93,8 @@ QtObject {
         //: qsTrId() with comment, meta-data and plurals.
         //~ well-tested True
         qsTrId("qtn_bar_baz", 10);
+
+        //% "Source text"
+        qsTrId("qtn_baz_biz");
     }
 }
diff --git a/tests/auto/linguist/lupdate/testdata/good/parseqml/project.ts.result b/tests/auto/linguist/lupdate/testdata/good/parseqml/project.ts.result
index 7dac8cb..4843902 100644
--- a/tests/auto/linguist/lupdate/testdata/good/parseqml/project.ts.result
+++ b/tests/auto/linguist/lupdate/testdata/good/parseqml/project.ts.result
@@ -27,6 +27,11 @@
         </translation>
         <extra-well-tested>True</extra-well-tested>
     </message>
+    <message id="qtn_baz_biz">
+        <location filename="main.qml" line="98"/>
+        <source>Source text</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>BarContext</name>
diff --git a/tools/linguist/lupdate/qdeclarative.cpp b/tools/linguist/lupdate/qdeclarative.cpp
index b85b1a7..1c1e9ad 100644
--- a/tools/linguist/lupdate/qdeclarative.cpp
+++ b/tools/linguist/lupdate/qdeclarative.cpp
@@ -225,7 +225,7 @@ protected:
                     const QString id = literal->value->asString();
                     bool plural = node->arguments->next;
 
-                    TranslatorMessage msg(QString(), QString(),
+                    TranslatorMessage msg(QString(), sourcetext,
                         QString(), QString(), m_fileName,
                         node->firstSourceLocation().startLine, QStringList(),
                         TranslatorMessage::Unfinished, plural);
-- 
cgit v0.12