From 8fbae648db3bc51bafacfe1f88e40561d357e60a Mon Sep 17 00:00:00 2001 From: Samuel Gaist Date: Mon, 11 Apr 2016 10:17:23 +0200 Subject: Implement QFormLayout row removal QFormLayout currently allows to remove a row only through takeAt, which doesn't resize the internal structure used to store the layout-related data. The implementation of rowCount uses that structure so it returns a row count that doesn't match what the user sees. The removeRow methods complement that be doing a "real" removal which will also keep the row count in sync. [ChangeLog][QtWidgets][QFormLayout] Added removeRow(), takeRow(). Task-number: QTBUG-15990 Change-Id: I204b219a837887e4bf95d1bc77407f1c53ae9819 Reviewed-by: Marc Mutz --- .../widgets/kernel/qformlayout/tst_qformlayout.cpp | 237 +++++++++++++++++++++ 1 file changed, 237 insertions(+) (limited to 'tests/auto/widgets/kernel/qformlayout') diff --git a/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp b/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp index a19f4aea56..b7ca5d21c7 100644 --- a/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp +++ b/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp @@ -84,6 +84,12 @@ private slots: void insertRow_QString_QLayout(); void insertRow_QWidget(); void insertRow_QLayout(); + void removeRow(); + void removeRow_QWidget(); + void removeRow_QLayout(); + void takeRow(); + void takeRow_QWidget(); + void takeRow_QLayout(); void setWidget(); void setLayout(); @@ -687,6 +693,237 @@ void tst_QFormLayout::insertRow_QLayout() // ### come back to this later } +void tst_QFormLayout::removeRow() +{ + QWidget topLevel; + QFormLayout *layout = new QFormLayout(&topLevel); + + QCOMPARE(layout->count(), 0); + QCOMPARE(layout->rowCount(), 0); + + QPointer w1 = new QWidget; + QPointer w2 = new QWidget; + + layout->addRow("test1", w1); + layout->addRow(w2); + + QCOMPARE(layout->count(), 3); + QCOMPARE(layout->rowCount(), 2); + + layout->removeRow(1); + + QVERIFY(!w1); + QCOMPARE(layout->count(), 1); + QCOMPARE(layout->rowCount(), 1); + + layout->removeRow(0); + + QVERIFY(!w2); + QCOMPARE(layout->count(), 0); + QCOMPARE(layout->rowCount(), 0); +} + +void tst_QFormLayout::removeRow_QWidget() +{ + QWidget topLevel; + QFormLayout *layout = new QFormLayout(&topLevel); + + QCOMPARE(layout->count(), 0); + QCOMPARE(layout->rowCount(), 0); + + QPointer w1 = new QWidget; + QPointer w2 = new QWidget; + + layout->addRow("test1", w1); + layout->addRow(w2); + + QCOMPARE(layout->count(), 3); + QCOMPARE(layout->rowCount(), 2); + + layout->removeRow(w1); + + QVERIFY(!w1); + QCOMPARE(layout->count(), 1); + QCOMPARE(layout->rowCount(), 1); + + layout->removeRow(w2); + + QVERIFY(!w2); + QCOMPARE(layout->count(), 0); + QCOMPARE(layout->rowCount(), 0); + + QWidget *w3 = new QWidget; + layout->removeRow(w3); + delete w3; +} + +void tst_QFormLayout::removeRow_QLayout() +{ + QWidget topLevel; + QFormLayout *layout = new QFormLayout(&topLevel); + + QCOMPARE(layout->count(), 0); + QCOMPARE(layout->rowCount(), 0); + + QPointer l1 = new QHBoxLayout; + QPointer w1 = new QWidget; + l1->addWidget(w1); + QPointer l2 = new QHBoxLayout; + QPointer w2 = new QWidget; + l2->addWidget(w2); + + layout->addRow("test1", l1); + layout->addRow(l2); + + QCOMPARE(layout->count(), 3); + QCOMPARE(layout->rowCount(), 2); + + layout->removeRow(l1); + + QVERIFY(!l1); + QVERIFY(!w1); + QCOMPARE(layout->count(), 1); + QCOMPARE(layout->rowCount(), 1); + + layout->removeRow(l2); + + QVERIFY(!l2); + QVERIFY(!w2); + QCOMPARE(layout->count(), 0); + QCOMPARE(layout->rowCount(), 0); + + QHBoxLayout *l3 = new QHBoxLayout; + layout->removeRow(l3); + delete l3; +} + +void tst_QFormLayout::takeRow() +{ + QWidget topLevel; + QFormLayout *layout = new QFormLayout(&topLevel); + + QCOMPARE(layout->count(), 0); + QCOMPARE(layout->rowCount(), 0); + + QPointer w1 = new QWidget; + QPointer w2 = new QWidget; + + layout->addRow("test1", w1); + layout->addRow(w2); + + QCOMPARE(layout->count(), 3); + QCOMPARE(layout->rowCount(), 2); + + QFormLayout::TakeRowResult result = layout->takeRow(1); + + QVERIFY(w2); + QVERIFY(result.fieldItem); + QVERIFY(result.labelItem); + QCOMPARE(layout->count(), 1); + QCOMPARE(layout->rowCount(), 1); + + result = layout->takeRow(0); + + QVERIFY(w1); + QVERIFY(result.fieldItem); + QVERIFY(!result.labelItem); + QCOMPARE(layout->count(), 0); + QCOMPARE(layout->rowCount(), 0); + + result = layout->takeRow(0); + + QVERIFY(!result.fieldItem); + QVERIFY(!result.labelItem); +} + +void tst_QFormLayout::takeRow_QWidget() +{ + QWidget topLevel; + QFormLayout *layout = new QFormLayout(&topLevel); + + QCOMPARE(layout->count(), 0); + QCOMPARE(layout->rowCount(), 0); + + QPointer w1 = new QWidget; + QPointer w2 = new QWidget; + + layout->addRow("test1", w1); + layout->addRow(w2); + + QCOMPARE(layout->count(), 3); + QCOMPARE(layout->rowCount(), 2); + + QFormLayout::TakeRowResult result = layout->takeRow(w1); + + QVERIFY(w1); + QVERIFY(result.fieldItem); + QVERIFY(result.labelItem); + QCOMPARE(layout->count(), 1); + QCOMPARE(layout->rowCount(), 1); + + result = layout->takeRow(w2); + + QVERIFY(w2); + QVERIFY(result.fieldItem); + QVERIFY(!result.labelItem); + QCOMPARE(layout->count(), 0); + QCOMPARE(layout->rowCount(), 0); + + QWidget *w3 = new QWidget; + result = layout->takeRow(w3); + delete w3; + + QVERIFY(!result.fieldItem); + QVERIFY(!result.labelItem); +} + +void tst_QFormLayout::takeRow_QLayout() +{ + QWidget topLevel; + QFormLayout *layout = new QFormLayout(&topLevel); + + QCOMPARE(layout->count(), 0); + QCOMPARE(layout->rowCount(), 0); + + QPointer l1 = new QHBoxLayout; + QPointer w1 = new QWidget; + l1->addWidget(w1); + QPointer l2 = new QHBoxLayout; + QPointer w2 = new QWidget; + l2->addWidget(w2); + + layout->addRow("test1", l1); + layout->addRow(l2); + + QCOMPARE(layout->count(), 3); + QCOMPARE(layout->rowCount(), 2); + + QFormLayout::TakeRowResult result = layout->takeRow(l1); + + QVERIFY(l1); + QVERIFY(w1); + QVERIFY(result.fieldItem); + QVERIFY(result.labelItem); + QCOMPARE(layout->count(), 1); + QCOMPARE(layout->rowCount(), 1); + + result = layout->takeRow(l2); + + QVERIFY(l2); + QVERIFY(w2); + QVERIFY(result.fieldItem); + QVERIFY(!result.labelItem); + QCOMPARE(layout->count(), 0); + QCOMPARE(layout->rowCount(), 0); + + QHBoxLayout *l3 = new QHBoxLayout; + result = layout->takeRow(l3); + delete l3; + + QVERIFY(!result.fieldItem); + QVERIFY(!result.labelItem); +} + void tst_QFormLayout::setWidget() { QFormLayout layout; -- cgit v1.2.3