diff --git a/src/kpagedialog.cpp b/src/kpagedialog.cpp --- a/src/kpagedialog.cpp +++ b/src/kpagedialog.cpp @@ -82,6 +82,12 @@ void KPageDialog::setFaceType(FaceType faceType) { d_func()->mPageWidget->setFaceType(static_cast(faceType)); + + if (faceType == Tabbed) { + layout()->setContentsMargins(6, 6, 6, 6); + } else { + layout()->setContentsMargins(0, 0, 0, 0); + } } KPageWidgetItem *KPageDialog::addPage(QWidget *widget, const QString &name) diff --git a/src/kpagedialog_p.h b/src/kpagedialog_p.h --- a/src/kpagedialog_p.h +++ b/src/kpagedialog_p.h @@ -23,6 +23,7 @@ #include "kpagedialog.h" #include #include +#include class KPageDialogPrivate { @@ -50,6 +51,7 @@ QVBoxLayout *layout = new QVBoxLayout; q->setLayout(layout); + layout->setContentsMargins(0, 0, 0, 0); if (mPageWidget) { q->connect(mPageWidget, &KPageWidget::currentPageChanged, @@ -64,7 +66,11 @@ if (mButtonBox) { q->connect(mButtonBox, &QDialogButtonBox::accepted, q, &QDialog::accept); q->connect(mButtonBox, &QDialogButtonBox::rejected, q, &QDialog::reject); - layout->addWidget(mButtonBox); + if (mPageWidget) { + mPageWidget->setPageFooter(mButtonBox); + } else { + layout->addWidget(mButtonBox); + } } } }; diff --git a/src/kpageview.h b/src/kpageview.h --- a/src/kpageview.h +++ b/src/kpageview.h @@ -159,6 +159,31 @@ */ void setDefaultWidget(QWidget *widget); + /** + * Set a widget as the header for this Page view + * It will replace the standard page title + * @since 5.60 + */ + void setPageHeader(QWidget *header); + + /** + * Widget of the header for this page view + * @since 5.60 + */ + QWidget *pageHeader() const; + + /** + * Set a widget as the footer for this Page view + * @since 5.60 + */ + void setPageFooter(QWidget *footer); + + /** + * Widget of the footer for this page view + * @since 5.60 + */ + QWidget *pageFooter() const; + Q_SIGNALS: /** * This signal is emitted whenever the current page changes. diff --git a/src/kpageview.cpp b/src/kpageview.cpp --- a/src/kpageview.cpp +++ b/src/kpageview.cpp @@ -76,17 +76,36 @@ stack->setVisible(true); } - titleWidget->setVisible(q->showPageHeader()); + layout->removeWidget(titleWidget); + + if (pageHeader) { + layout->removeWidget(pageHeader); + pageHeader->setVisible(q->showPageHeader()); + titleWidget->setVisible(false); + + if (faceType == KPageView::Tabbed) { + layout->addWidget(pageHeader, 1, 1); + } else { + layout->addWidget(pageHeader, 1, 1, 1, 2); + } + } else { + titleWidget->setVisible(q->showPageHeader()); + if (faceType == KPageView::Tabbed) { + layout->addWidget(titleWidget, 1, 1); + } else { + layout->addWidget(titleWidget, 1, 1, 1, 2); + } + } Qt::Alignment alignment = q->viewPosition(); if (alignment & Qt::AlignTop) { layout->addWidget(view, 2, 1); } else if (alignment & Qt::AlignRight) { - layout->addWidget(view, 1, 2, 2, 1); + layout->addWidget(view, 1, 2, 4, 1); } else if (alignment & Qt::AlignBottom) { layout->addWidget(view, 4, 1); } else if (alignment & Qt::AlignLeft) { - layout->addWidget(view, 1, 0, 2, 1); + layout->addWidget(view, 1, 0, 4, 1); } } @@ -301,12 +320,13 @@ { Q_Q(KPageView); layout = new QGridLayout(q); + layout->setContentsMargins(0, 0, 0, 0); stack = new KPageStackedWidget(q); titleWidget = new KTitleWidget(q); QPixmap emptyPixmap(22, 22); emptyPixmap.fill(Qt::transparent); titleWidget->setPixmap(emptyPixmap); - layout->addWidget(titleWidget, 1, 1); + layout->addWidget(titleWidget, 1, 1, 1, 2); layout->addWidget(stack, 2, 1); defaultWidget = new QWidget(q); @@ -440,6 +460,60 @@ } } +void KPageView::setPageHeader(QWidget *header) +{ + Q_D(KPageView); + if (d->pageHeader == header) { + return; + } + + if (d->pageHeader) { + d->layout->removeWidget(d->pageHeader); + } + d->layout->removeWidget(d->titleWidget); + + d->pageHeader = header; + + // Give it a colSpan of 2 to add a margin to the right + if (d->pageHeader) { + d->layout->addWidget(d->pageHeader, 1, 1, 1, 2); + d->pageHeader->setVisible(showPageHeader()); + } else { + d->layout->addWidget(d->titleWidget, 1, 1, 1, 2); + d->titleWidget->setVisible(showPageHeader()); + } +} + +QWidget *KPageView::pageHeader() const +{ + Q_D(const KPageView); + return d->pageHeader; +} + +void KPageView::setPageFooter(QWidget *footer) +{ + Q_D(KPageView); + if (d->pageFooter == footer) { + return; + } + + if (d->pageFooter) { + d->layout->removeWidget(d->pageFooter); + } + + d->pageFooter = footer; + + if (footer) { + d->layout->addWidget(d->pageFooter, 3, 1); + } +} + +QWidget *KPageView::pageFooter() const +{ + Q_D(const KPageView); + return d->pageFooter; +} + QAbstractItemView *KPageView::createView() { Q_D(KPageView); @@ -480,7 +554,7 @@ if (faceType == Tabbed) { return false; } else { - return !d->titleWidget->text().isEmpty(); + return d->pageHeader || !d->titleWidget->text().isEmpty(); } } diff --git a/src/kpageview_p.h b/src/kpageview_p.h --- a/src/kpageview_p.h +++ b/src/kpageview_p.h @@ -32,6 +32,7 @@ #include #include #include +#include class KPageStackedWidget : public QStackedWidget { @@ -76,6 +77,9 @@ QAbstractItemView *view; + QPointer pageHeader; + QPointer pageFooter; + void updateTitleWidget(const QModelIndex &index); void updateSelection();