File indexing completed on 2024-05-12 04:20:16

0001 /**
0002  * SPDX-FileCopyrightText: 2001-2015 Klaralvdalens Datakonsult AB. All rights reserved.
0003  *
0004  * This file is part of the KD Chart library.
0005  *
0006  * SPDX-License-Identifier: GPL-2.0-or-later
0007  */
0008 
0009 #include <QApplication>
0010 #include <QWidget>
0011 #include <QDebug>
0012 #include <QBoxLayout>
0013 #include <QStyle>
0014 #include <QtTest/QtTest>
0015 #include <QGridLayout>
0016 #include <QLineEdit>
0017 
0018 #define KDAB_REIMP
0019 
0020 class MyLegendWidget : public QWidget
0021 {
0022     Q_OBJECT
0023 
0024 public:
0025     explicit MyLegendWidget( QWidget* parent ) : QWidget( parent ) {
0026     }
0027 
0028     void makeSizeFixed() {
0029         setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ); // like Legend
0030         setFixedSize( 50, 50 ); // hmm Legend has a layout instead.
0031         //QGridLayout* layout = new QGridLayout( this );
0032         // ...
0033     }
0034 
0035 protected:
0036     KDAB_REIMP void resizeEvent( QResizeEvent* ) override {
0037         // Note that this is never called unless the widget is shown.
0038         qDebug() << "resizeEvent " << size();
0039     }
0040 };
0041 
0042 class MyWidgetItem : public QWidgetItem
0043 {
0044 public:
0045     explicit MyWidgetItem(QWidget *w) : QWidgetItem(w) { }
0046 
0047     KDAB_REIMP bool isEmpty() const override { return false; }
0048 };
0049 
0050 class TestQLayout : public QObject
0051 {
0052     Q_OBJECT
0053 
0054 private Q_SLOTS:
0055 
0056     // This is very much like KChart::Chart does with legends
0057     void testBoxLayoutHiddenWidget() {
0058         QBoxLayout* vLayout = new QVBoxLayout;
0059         MyLegendWidget* widget1 = new MyLegendWidget( nullptr );
0060         widget1->resize( 10, 10 );
0061 
0062         // Adding a hidden widget doesn't work, the layout ignores it
0063         // This is why we created MyWidgetItem above, then the layout works
0064         //vLayout->addWidget( widget1 );
0065         MyWidgetItem* widgetItem = new MyWidgetItem( widget1 );
0066         vLayout->addItem( widgetItem );
0067 
0068         QRect geom( 100, 100, 800, 800 );
0069         vLayout->setGeometry( geom );
0070 
0071         //vLayout->activate(); // not needed
0072 
0073         QCOMPARE( vLayout->geometry(), geom );
0074         qDebug() << "widget1: " << widget1->geometry();
0075         QCOMPARE( widget1->geometry(), geom );
0076 
0077         delete widget1;
0078         delete vLayout;
0079     }
0080 
0081     void testBoxLayoutChildWidget() {
0082         QWidget* topLevelWidget = new QWidget( nullptr );
0083         // This time the layout is associated with a widget, like d->layout in KChart::Chart.
0084         QBoxLayout* vLayout = new QVBoxLayout( topLevelWidget );
0085         MyLegendWidget* widget1 = new MyLegendWidget( topLevelWidget );
0086         MyWidgetItem* widgetItem = new MyWidgetItem( widget1 );
0087         vLayout->addItem( widgetItem );
0088         //vLayout->activate();
0089 
0090         QRect geom( 100, 100, 800, 800 );
0091         vLayout->setGeometry( geom );
0092         qDebug() << "widget1: " << widget1->geometry();
0093         // int marg = topLevelWidget->style()->pixelMetric( QStyle::PM_DefaultTopLevelMargin );
0094         // int marg = vLayout->margin();
0095         // QCOMPARE( widget1->geometry(), geom.adjusted(marg,marg,-marg,-marg) );
0096 
0097         geom = QRect( 10, 10, 80, 80 );
0098         vLayout->setGeometry( geom );
0099         qDebug() << "widget1: " << widget1->geometry();
0100         //QCOMPARE( widget1->geometry(), geom.adjusted(marg,marg,-marg,-marg) );
0101 
0102         // And now let's show the widget for real
0103         geom = QRect( 0, 0, 500, 100 );
0104         topLevelWidget->resize( geom.size() );
0105         topLevelWidget->show();
0106         QApplication::sendPostedEvents();
0107         // QRect expected = geom.adjusted(marg,marg,-marg,-marg);
0108         // qDebug() << "widget1: " << widget1->frameGeometry() << "expecting" << expected;
0109         // this test is quite useless...
0110         //QCOMPARE( widget1->frameGeometry(), expected );
0111         QVERIFY( widget1->isVisible() );
0112 
0113         delete topLevelWidget;
0114     }
0115 
0116     void testSubGridLayout() {
0117         QWidget* topLevelWidget = new QWidget( nullptr );
0118         QBoxLayout* vLayout = new QVBoxLayout( topLevelWidget );
0119         QGridLayout* gridLayout = new QGridLayout();
0120 
0121         QLineEdit* lineEdit = new QLineEdit( topLevelWidget );
0122         MyWidgetItem* lineEditWidgetItem = new MyWidgetItem( lineEdit );
0123         gridLayout->addItem( lineEditWidgetItem, 0, 0 );
0124 
0125         MyLegendWidget* widget1 = new MyLegendWidget( topLevelWidget );
0126         widget1->makeSizeFixed();
0127 
0128         MyWidgetItem* widgetItem = new MyWidgetItem( widget1 );
0129         gridLayout->addItem( widgetItem, 1, 1 );
0130         vLayout->addLayout( gridLayout );
0131 
0132         QRect geom( 100, 100, 800, 800 );
0133         vLayout->setGeometry( geom );
0134         qDebug() << "widget1: " << widget1->geometry();
0135         QVERIFY( widget1->width() > 0 );
0136 
0137         delete topLevelWidget;
0138     }
0139 };
0140 
0141 QTEST_MAIN(TestQLayout)
0142 
0143 #include "main.moc"