1 /* This file is part of the KDE project
2 Copyright (C) 2007, 2012 Dag Andersen <danders@get2net.dk>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public
6 License as published by the Free Software Foundation; either
7 version 2 of the License, or (at your option) any later version.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18 */
19
20
21 // clazy:excludeall=qstring-arg
22 #include "kptitemviewsettup.h"
23 #include "kptitemmodelbase.h"
24 #include "kptviewbase.h"
25 #include "kptdebug.h"
26
27 #include "KoPageLayoutWidget.h"
28
29 #include <QHeaderView>
30 #include <QPushButton>
31
32 namespace KPlato
33 {
34
Item(int column,const QString & text)35 ItemViewSettup::Item::Item(int column, const QString &text)
36 : QListWidgetItem(text),
37 m_column(column)
38 {
39 }
40
column() const41 int ItemViewSettup::Item::column() const
42 {
43 return m_column;
44 }
45
operator <(const QListWidgetItem & other) const46 bool ItemViewSettup::Item::operator<(const QListWidgetItem & other) const
47 {
48 return m_column < static_cast<const Item&>(other).column();
49 }
50
51 //--------------------------
ItemViewSettup(TreeViewBase * view,bool includeColumn0,QWidget * parent)52 ItemViewSettup::ItemViewSettup(TreeViewBase *view, bool includeColumn0, QWidget *parent)
53 : QWidget(parent),
54 m_view(view),
55 m_includeColumn0(includeColumn0)
56 {
57 setupUi(this);
58
59 stretchLastSection->setChecked(view->header()->stretchLastSection());
60
61 QAbstractItemModel *model = view->model();
62
63 QMap<int, Item*> map;
64 int c = includeColumn0 ? 0 : 1;
65 debugPlan<<includeColumn0<<c;
66 for (; c < model->columnCount(); ++c) {
67 Item *item = new Item(c, model->headerData(c, Qt::Horizontal).toString());
68 item->setToolTip(model->headerData(c, Qt::Horizontal, Qt::ToolTipRole).toString());
69 if (view->isColumnHidden(c)) {
70 selector->availableListWidget()->addItem(item);
71 } else {
72 map.insert(view->section(c), item);
73 }
74 }
75 foreach(Item *i, map) {
76 selector->selectedListWidget()->addItem(i);
77 }
78
79 connect(stretchLastSection, &QCheckBox::stateChanged, this, &ItemViewSettup::slotChanged);
80
81 connect(selector, &KActionSelector::added, this, &ItemViewSettup::slotChanged);
82 connect(selector, &KActionSelector::removed, this, &ItemViewSettup::slotChanged);
83 connect(selector, &KActionSelector::movedUp, this, &ItemViewSettup::slotChanged);
84 connect(selector, &KActionSelector::movedDown, this, &ItemViewSettup::slotChanged);
85
86 }
87
slotChanged()88 void ItemViewSettup::slotChanged()
89 {
90 emit enableButtonOk(true);
91 }
92
slotOk()93 void ItemViewSettup::slotOk()
94 {
95 debugPlan;
96 QListWidget *lst = selector->availableListWidget();
97 for (int r = 0; r < lst->count(); ++r) {
98 int c = static_cast<Item*>(lst->item(r))->column();
99 m_view->hideColumn(c);
100 }
101 lst = selector->selectedListWidget();
102 for (int r = 0; r < lst->count(); ++r) {
103 int c = static_cast<Item*>(lst->item(r))->column();
104 m_view->mapToSection(c, r);
105 m_view->showColumn(c);
106 }
107 m_view->setStretchLastSection(stretchLastSection->isChecked());
108 }
109
setDefault()110 void ItemViewSettup::setDefault()
111 {
112 debugPlan;
113 selector->availableListWidget()->clear();
114 selector->selectedListWidget()->clear();
115 QAbstractItemModel *model = m_view->model();
116 int c = m_includeColumn0 ? 0 : 1;
117 QList<int> def = m_view->defaultColumns();
118 for (; c < model->columnCount(); ++c) {
119 if (! def.contains(c)) {
120 Item *item = new Item(c, model->headerData(c, Qt::Horizontal).toString());
121 item->setToolTip(model->headerData(c, Qt::Horizontal, Qt::ToolTipRole).toString());
122 selector->availableListWidget()->addItem(item);
123 }
124 }
125 foreach (int i, def) {
126 Item *item = new Item(i, model->headerData(i, Qt::Horizontal).toString());
127 item->setToolTip(model->headerData(i, Qt::Horizontal, Qt::ToolTipRole).toString());
128 selector->selectedListWidget()->addItem(item);
129 }
130 }
131
132
133 //---------------------------
ItemViewSettupDialog(ViewBase * view,TreeViewBase * treeview,bool includeColumn0,QWidget * parent)134 ItemViewSettupDialog::ItemViewSettupDialog(ViewBase *view, TreeViewBase *treeview, bool includeColumn0, QWidget *parent)
135 : KPageDialog(parent),
136 m_view(view),
137 m_treeview(treeview),
138 m_pagelayout(0),
139 m_headerfooter(0)
140 {
141 setWindowTitle(i18n("View Settings"));
142 setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::RestoreDefaults);
143 button(QDialogButtonBox::Ok)->setDefault(true);
144
145 button(QDialogButtonBox::RestoreDefaults)->setEnabled(! treeview->defaultColumns().isEmpty());
146
147 m_panel = new ItemViewSettup(treeview, includeColumn0);
148 KPageWidgetItem *page = new KPageWidgetItem(m_panel, i18n("Tree View"));
149 page->setHeader(i18n("Tree View Column Configuration"));
150 addPage(page);
151 m_pageList.append(page);
152
153 connect(this, &QDialog::accepted, this, &ItemViewSettupDialog::slotOk);
154 connect(this, &QDialog::accepted, m_panel, &ItemViewSettup::slotOk);
155 connect(button(QDialogButtonBox::RestoreDefaults), &QAbstractButton::clicked, m_panel, &ItemViewSettup::setDefault);
156 }
157
slotOk()158 void ItemViewSettupDialog::slotOk()
159 {
160 debugPlan<<m_view<<m_pagelayout<<m_headerfooter;
161 if (! m_view) {
162 return;
163 }
164 if (m_pagelayout) {
165 m_view->setPageLayout(m_pagelayout->pageLayout());
166 }
167 if (m_headerfooter) {
168 m_view->setPrintingOptions(m_headerfooter->options());
169 }
170 }
171
insertWidget(int index,QWidget * widget,const QString & name,const QString & header)172 KPageWidgetItem *ItemViewSettupDialog::insertWidget(int index, QWidget *widget, const QString &name, const QString &header)
173 {
174 KPageWidgetItem *before = m_pageList.value(index);
175 KPageWidgetItem *page = new KPageWidgetItem(widget, name);
176 page->setHeader(header);
177 if (before) {
178 insertPage(before, page);
179 m_pageList.insert(index, page);
180 } else {
181 addPage(page);
182 m_pageList.append(page);
183 }
184 return page;
185 }
186
addPrintingOptions(bool setAsCurrent)187 void ItemViewSettupDialog::addPrintingOptions(bool setAsCurrent)
188 {
189 if (! m_view) {
190 return;
191 }
192 QTabWidget *tab = new QTabWidget();
193 QWidget *w = ViewBase::createPageLayoutWidget(m_view);
194 tab->addTab(w, w->windowTitle());
195 m_pagelayout = w->findChild<KoPageLayoutWidget*>();
196 Q_ASSERT(m_pagelayout);
197
198 m_headerfooter = ViewBase::createHeaderFooterWidget(m_view);
199 tab->addTab(m_headerfooter, m_headerfooter->windowTitle());
200
201 KPageWidgetItem *itm = insertWidget(-1, tab, i18n("Printing"), i18n("Printing Options"));
202 if (setAsCurrent) {
203 setCurrentPage(itm);
204 }
205 }
206
207 //-------------------------------
SplitItemViewSettupDialog(ViewBase * view,DoubleTreeViewBase * treeview,QWidget * parent)208 SplitItemViewSettupDialog::SplitItemViewSettupDialog(ViewBase *view, DoubleTreeViewBase *treeview, QWidget *parent)
209 : KPageDialog(parent),
210 m_view(view),
211 m_treeview(treeview),
212 m_pagelayout(0),
213 m_headerfooter(0)
214 {
215 setWindowTitle(i18n("View Settings"));
216 setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::RestoreDefaults);
217 button(QDialogButtonBox::Ok)->setDefault(true);
218
219 bool nodef = treeview->masterView()->defaultColumns().isEmpty() || treeview->slaveView()->defaultColumns().isEmpty();
220 button(QDialogButtonBox::Ok)->setEnabled(! nodef);
221
222 m_page1 = new ItemViewSettup(treeview->masterView(), true);
223 KPageWidgetItem *page = new KPageWidgetItem(m_page1, i18n("Main View"));
224 page->setHeader(i18n("Main View Column Configuration"));
225 addPage(page);
226 m_pageList.append(page);
227
228 m_page2 = new ItemViewSettup(treeview->slaveView(), true);
229 page = new KPageWidgetItem(m_page2, i18n("Auxiliary View"));
230 page->setHeader(i18n("Auxiliary View Column Configuration"));
231 addPage(page);
232 m_pageList.append(page);
233
234 //connect(m_page1, SIGNAL(enableButtonOk(bool)), this, SLOT(enableButtonOk(bool)));
235 //connect(m_page2, SIGNAL(enableButtonOk(bool)), this, SLOT(enableButtonOk(bool)));
236
237 connect(this, &QDialog::accepted, this, &SplitItemViewSettupDialog::slotOk);
238 connect(this, &QDialog::accepted, m_page1, &ItemViewSettup::slotOk);
239 connect(this, &QDialog::accepted, m_page2, &ItemViewSettup::slotOk);
240 connect(button(QDialogButtonBox::RestoreDefaults), &QAbstractButton::clicked, m_page1, &ItemViewSettup::setDefault);
241 connect(button(QDialogButtonBox::RestoreDefaults), &QAbstractButton::clicked, m_page2, &ItemViewSettup::setDefault);
242 }
243
slotOk()244 void SplitItemViewSettupDialog::slotOk()
245 {
246 debugPlan;
247 if (! m_view) {
248 return;
249 }
250 m_view->setPageLayout(m_pagelayout->pageLayout());
251 m_view->setPrintingOptions(m_headerfooter->options());
252 }
253
insertWidget(int index,QWidget * widget,const QString & name,const QString & header)254 KPageWidgetItem *SplitItemViewSettupDialog::insertWidget(int index, QWidget *widget, const QString &name, const QString &header)
255 {
256 KPageWidgetItem *before = m_pageList.value(index);
257 KPageWidgetItem *page = new KPageWidgetItem(widget, name);
258 page->setHeader(header);
259 if (before) {
260 insertPage(before, page);
261 m_pageList.insert(index, page);
262 } else {
263 addPage(page);
264 m_pageList.append(page);
265 }
266 return page;
267 }
268
addPrintingOptions(bool setAsCurrent)269 void SplitItemViewSettupDialog::addPrintingOptions(bool setAsCurrent)
270 {
271 if (! m_view) {
272 return;
273 }
274 QTabWidget *tab = new QTabWidget();
275 QWidget *w = ViewBase::createPageLayoutWidget(m_view);
276 tab->addTab(w, w->windowTitle());
277 m_pagelayout = w->findChild<KoPageLayoutWidget*>();
278 Q_ASSERT(m_pagelayout);
279 m_pagelayout->setPageLayout(m_view->pageLayout());
280
281 m_headerfooter = ViewBase::createHeaderFooterWidget(m_view);
282 tab->addTab(m_headerfooter, m_headerfooter->windowTitle());
283 m_headerfooter->setOptions(m_view->printingOptions());
284
285 KPageWidgetItem *itm = insertWidget(-1, tab, i18n("Printing"), i18n("Printing Options"));
286 if (setAsCurrent) {
287 setCurrentPage(itm);
288 }
289 }
290
291 } //namespace KPlato
292