1 /*
2     This file is part of the KDE Libraries
3     SPDX-FileCopyrightText: 2006 Tobias Koenig <tokoe@kde.org>
4 
5     SPDX-License-Identifier: LGPL-2.0-or-later
6 */
7 
8 #include "kpagewidget.h"
9 #include "kpagewidget_p.h"
10 
11 #include "kpagewidgetmodel.h"
12 
KPageWidgetPrivate(KPageWidget * qq)13 KPageWidgetPrivate::KPageWidgetPrivate(KPageWidget *qq)
14     : KPageViewPrivate(qq)
15 {
16 }
17 
slotCurrentPageChanged(const QModelIndex & current,const QModelIndex & before)18 void KPageWidgetPrivate::slotCurrentPageChanged(const QModelIndex &current, const QModelIndex &before)
19 {
20     KPageWidgetItem *currentItem = nullptr;
21     if (current.isValid()) {
22         currentItem = model()->item(current);
23     }
24 
25     KPageWidgetItem *beforeItem = nullptr;
26     if (before.isValid()) {
27         beforeItem = model()->item(before);
28     }
29 
30     Q_Q(KPageWidget);
31     Q_EMIT q->currentPageChanged(currentItem, beforeItem);
32 }
33 
KPageWidget(KPageWidgetPrivate & dd,QWidget * parent)34 KPageWidget::KPageWidget(KPageWidgetPrivate &dd, QWidget *parent)
35     : KPageView(dd, parent)
36 {
37     Q_D(KPageWidget);
38     connect(this, &KPageView::currentPageChanged, this, [d](const QModelIndex &current, const QModelIndex &before) {
39         d->slotCurrentPageChanged(current, before);
40     });
41 
42     if (!d->KPageViewPrivate::model) {
43         setModel(new KPageWidgetModel(this));
44     } else {
45         Q_ASSERT(qobject_cast<KPageWidgetModel *>(d->KPageViewPrivate::model));
46     }
47 
48     connect(d->model(), &KPageWidgetModel::toggled, this, &KPageWidget::pageToggled);
49 }
50 
KPageWidget(QWidget * parent)51 KPageWidget::KPageWidget(QWidget *parent)
52     : KPageWidget(*new KPageWidgetPrivate(this), parent)
53 {
54 }
55 
~KPageWidget()56 KPageWidget::~KPageWidget()
57 {
58 }
59 
addPage(QWidget * widget,const QString & name)60 KPageWidgetItem *KPageWidget::addPage(QWidget *widget, const QString &name)
61 {
62     Q_D(KPageWidget);
63 
64     return d->model()->addPage(widget, name);
65 }
66 
addPage(KPageWidgetItem * item)67 void KPageWidget::addPage(KPageWidgetItem *item)
68 {
69     Q_D(KPageWidget);
70 
71     d->model()->addPage(item);
72 }
73 
insertPage(KPageWidgetItem * before,QWidget * widget,const QString & name)74 KPageWidgetItem *KPageWidget::insertPage(KPageWidgetItem *before, QWidget *widget, const QString &name)
75 {
76     Q_D(KPageWidget);
77 
78     return d->model()->insertPage(before, widget, name);
79 }
80 
insertPage(KPageWidgetItem * before,KPageWidgetItem * item)81 void KPageWidget::insertPage(KPageWidgetItem *before, KPageWidgetItem *item)
82 {
83     Q_D(KPageWidget);
84 
85     d->model()->insertPage(before, item);
86 }
87 
addSubPage(KPageWidgetItem * parent,QWidget * widget,const QString & name)88 KPageWidgetItem *KPageWidget::addSubPage(KPageWidgetItem *parent, QWidget *widget, const QString &name)
89 {
90     Q_D(KPageWidget);
91 
92     return d->model()->addSubPage(parent, widget, name);
93 }
94 
addSubPage(KPageWidgetItem * parent,KPageWidgetItem * item)95 void KPageWidget::addSubPage(KPageWidgetItem *parent, KPageWidgetItem *item)
96 {
97     Q_D(KPageWidget);
98 
99     d->model()->addSubPage(parent, item);
100 }
101 
removePage(KPageWidgetItem * item)102 void KPageWidget::removePage(KPageWidgetItem *item)
103 {
104     Q_D(KPageWidget);
105 
106     Q_EMIT pageRemoved(item); // Q_EMIT signal before we remove it, because the item will be deleted in the model
107     d->model()->removePage(item);
108 }
109 
setCurrentPage(KPageWidgetItem * item)110 void KPageWidget::setCurrentPage(KPageWidgetItem *item)
111 {
112     Q_D(KPageWidget);
113 
114     const QModelIndex index = d->model()->index(item);
115     if (!index.isValid()) {
116         return;
117     }
118 
119     KPageView::setCurrentPage(index);
120 }
121 
currentPage() const122 KPageWidgetItem *KPageWidget::currentPage() const
123 {
124     Q_D(const KPageWidget);
125 
126     const QModelIndex index = KPageView::currentPage();
127 
128     if (!index.isValid()) {
129         return nullptr;
130     }
131 
132     return d->model()->item(index);
133 }
134 
135 #include "moc_kpagewidget.cpp"
136