]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/QTocDialog.C
Two ways toc navigation:
[lyx.git] / src / frontends / qt4 / QTocDialog.C
1 /**
2  * \file QTocDialog.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author John Levon
7  * \author Abdelrazak Younes
8  *
9  * Full author contact details are available in file CREDITS.
10  */
11
12 #include <config.h>
13
14 #include "QTocDialog.h"
15 #include "QToc.h"
16 #include "Qt2BC.h"
17 #include "qt_helpers.h"
18 #include "controllers/ControlToc.h"
19
20 #include "debug.h"
21
22 #include <QTreeWidgetItem>
23 #include <QPushButton>
24 #include <QCloseEvent>
25 #include <QHeaderView>
26
27 #include <vector>
28 #include <string>
29 #include <stack>
30
31 using std::endl;
32 using std::pair;
33 using std::stack;
34 using std::vector;
35 using std::string;
36
37
38 namespace lyx {
39 namespace frontend {
40
41 QTocDialog::QTocDialog(Dialog & dialog, QToc * form)
42         : Dialog::View(dialog, "Toc"), form_(form), depth_(2)
43 {
44         setupUi(this);
45
46         update();
47
48         connect(tocTV->selectionModel(),
49                 SIGNAL(currentChanged(const QModelIndex &,
50                         const QModelIndex &)),
51                 this, SLOT(selectionChanged(const QModelIndex &,
52                         const QModelIndex &)));
53 }
54
55
56 QTocDialog::~QTocDialog()
57 {
58         accept();
59 }
60
61
62 void QTocDialog::selectionChanged(const QModelIndex & current,
63                                                                   const QModelIndex & previous)
64 {
65         lyxerr[Debug::GUI]
66                 << "selectionChanged index " << current.row() << ", " << current.column()
67                 << endl;
68
69         form_->goTo(current);
70 }
71
72
73 void QTocDialog::on_tocTV_clicked(const QModelIndex & index )
74 {
75         lyxerr[Debug::GUI]
76                 << "on_tocTV_clicked index " << index.row() << ", " << index.column()
77                 << endl;
78
79         form_->goTo(index);
80 }
81
82
83 void QTocDialog::on_closePB_clicked()
84 {
85         accept();
86 }
87
88
89 void QTocDialog::on_updatePB_clicked()
90 {
91         form_->update();
92         update();
93 }
94
95
96 void QTocDialog::on_depthSL_valueChanged(int depth)
97 {
98         if (depth == depth_)
99                 return;
100
101         depth_ = depth;
102
103 /*
104         while (
105         tocTv->setExpanded();
106                         if (iter->depth > depth_)
107                                 tocTV->collapseItem(topLevelItem);
108                         else if (iter->depth <= depth_)
109                                 tocTV->expandItem(topLevelItem);
110 */
111 }
112
113
114 void QTocDialog::on_typeCO_activated(int value)
115 {
116         form_->setTocModel(value);
117         enableButtons();
118 }
119
120
121 void QTocDialog::on_moveUpPB_clicked()
122 {
123         move(toc::UP);
124 }
125
126
127 void QTocDialog::on_moveDownPB_clicked()
128 {
129         move(toc::DOWN);
130 }
131
132
133 void QTocDialog::on_moveInPB_clicked()
134 {
135         move(toc::IN);
136 }
137
138
139 void QTocDialog::on_moveOutPB_clicked()
140 {
141         move(toc::OUT);
142 }
143
144
145 void QTocDialog::move(toc::OutlineOp const operation)
146 {
147         enableButtons(false);
148         QModelIndex index = tocTV->selectionModel()->selectedIndexes()[0];
149         form_->goTo(index);
150         form_->move(operation, index);
151         select(index);
152         enableButtons();
153 }
154
155 void QTocDialog::select(QModelIndex const & index)
156 {
157         tocTV->setModel(form_->tocModel());
158
159         if (!index.isValid()) {
160                 lyxerr[Debug::GUI]
161                         << "QTocDialog::select(): QModelIndex is invalid!" << endl;
162                 return;
163         }
164
165         tocTV->scrollTo(index);
166         tocTV->selectionModel()->select(index, QItemSelectionModel::Select);
167 }
168
169 void QTocDialog::enableButtons(bool enable)
170 {
171         updatePB->setEnabled(enable);
172
173         if (!form_->canOutline())
174                 enable = false;
175
176         moveUpPB->setEnabled(enable);
177         moveDownPB->setEnabled(enable);
178         moveInPB->setEnabled(enable);
179         moveOutPB->setEnabled(enable);
180 }
181
182
183 void QTocDialog::update()
184 {
185         typeCO->setModel(form_->typeModel());
186         tocTV->setModel(form_->tocModel());
187         tocTV->showColumn(0);
188         // hide the pointless QHeader for now
189         // in the future, new columns may appear 
190         // like labels, bookmarks, etc...
191         // tocTV->header()->hide();
192         tocTV->header()->setVisible(true);
193         enableButtons();
194
195         connect(tocTV->selectionModel(),
196                 SIGNAL(currentChanged(const QModelIndex &,
197                         const QModelIndex &)),
198                 this, SLOT(selectionChanged(const QModelIndex &,
199                         const QModelIndex &)));
200
201         select(form_->getCurrentIndex());
202
203         lyxerr[Debug::GUI]
204                 << "form_->tocModel()->rowCount " << form_->tocModel()->rowCount()
205                 << "\nform_->tocModel()->columnCount " << form_->tocModel()->columnCount()
206                 << endl;
207 //      setTitle(form_->guiname())
208 }
209
210
211 void QTocDialog::apply()
212 {
213         // Nothing to do here... for now.
214         // Ideas welcome... (Abdel, 17042006)
215 }
216
217
218 void QTocDialog::hide()
219 {
220         accept();
221 }
222
223
224 void QTocDialog::show()
225 {
226         form_->update();
227         update();
228         QDialog::show();
229 }
230
231
232 bool QTocDialog::isVisible() const
233 {
234         return QDialog::isVisible();
235 }
236
237
238 } // namespace frontend
239 } // namespace lyx