24 #include <QtGui/QAbstractScrollArea>
39 class KViewStateSaverPrivate
48 m_horizontalScrollBarValue(-1),
49 m_verticalScrollBarValue(-1)
57 QStringList getExpandedItems(
const QModelIndex &index)
const;
59 void listenToPendingChanges();
60 void processPendingChanges();
62 inline void restoreScrollBarState()
64 if ( m_horizontalScrollBarValue >= 0 && m_horizontalScrollBarValue <= m_scrollArea->horizontalScrollBar()->maximum() ) {
65 m_scrollArea->horizontalScrollBar()->setValue( m_horizontalScrollBarValue );
66 m_horizontalScrollBarValue = -1;
68 if ( m_verticalScrollBarValue >= 0 && m_verticalScrollBarValue <= m_scrollArea->verticalScrollBar()->maximum() ) {
69 m_scrollArea->verticalScrollBar()->setValue( m_verticalScrollBarValue );
70 m_verticalScrollBarValue = -1;
74 void restoreSelection();
75 void restoreCurrentItem();
76 void restoreExpanded();
78 inline bool hasPendingChanges()
const
80 return !m_pendingCurrent.isEmpty() || !m_pendingExpansions.isEmpty() || !m_pendingSelections.isEmpty();
85 if ( m_selectionModel && m_selectionModel->model() )
86 return m_selectionModel->model();
87 else if ( m_view && m_view->model() )
88 return m_view->model();
92 void rowsInserted(
const QModelIndex &,
int ,
int )
95 processPendingChanges();
97 if ( !hasPendingChanges() )
99 q->disconnect( getModel(), SIGNAL(rowsInserted(QModelIndex,
int,
int)),
100 q, SLOT(rowsInserted(QModelIndex,
int,
int)) );
105 QTreeView *m_treeView;
106 QAbstractItemView *m_view;
108 QAbstractScrollArea *m_scrollArea;
110 int m_horizontalScrollBarValue;
111 int m_verticalScrollBarValue;
112 QSet<QString> m_pendingSelections;
113 QSet<QString> m_pendingExpansions;
118 :
QObject(0), d_ptr( new KViewStateSaverPrivate(this) )
121 qRegisterMetaType<QModelIndex>(
"QModelIndex" );
132 d->m_scrollArea =
view;
134 d->m_selectionModel = view->selectionModel();
135 d->m_treeView = qobject_cast<QTreeView*>(
view);
137 d->m_selectionModel = 0;
152 return d->m_selectionModel;
161 void KViewStateSaverPrivate::listenToPendingChanges()
165 if ( hasPendingChanges() )
170 q->disconnect( model, SIGNAL(rowsInserted(QModelIndex,
int,
int)),
171 q, SLOT(rowsInserted(QModelIndex,
int,
int)) );
172 q->connect( model, SIGNAL(rowsInserted(QModelIndex,
int,
int)),
173 SLOT(rowsInserted(QModelIndex,
int,
int)) );
183 void KViewStateSaverPrivate::processPendingChanges()
187 q->restoreCurrentItem(m_pendingCurrent);
188 q->restoreSelection(m_pendingSelections.toList());
189 q->restoreExpanded(m_pendingExpansions.toList());
190 q->restoreScrollState(m_verticalScrollBarValue, m_horizontalScrollBarValue);
198 QTimer::singleShot(60000,
this, SLOT(deleteLater()));
207 d->processPendingChanges();
208 if (d->hasPendingChanges())
209 d->listenToPendingChanges();
212 QStringList KViewStateSaverPrivate::getExpandedItems(
const QModelIndex &index)
const
217 for (
int i = 0; i < m_treeView->model()->rowCount( index ); ++i ) {
218 const QModelIndex child = m_treeView->model()->index( i, 0, index );
221 if ( m_treeView->model()->hasChildren( child ) ) {
222 if ( m_treeView->isExpanded( child ) )
223 expansion << q->indexToConfigString( child );
224 expansion << getExpandedItems( child );
234 if ( d->m_selectionModel )
247 if ( d->m_scrollArea )
255 void KViewStateSaverPrivate::restoreCurrentItem()
259 QModelIndex currentIndex = q->indexFromConfigString(m_selectionModel->model(), m_pendingCurrent);
260 if ( currentIndex.isValid() )
263 m_treeView->setCurrentIndex(currentIndex);
265 m_selectionModel->setCurrentIndex(currentIndex, QItemSelectionModel::NoUpdate);
266 m_pendingCurrent.clear();
273 if (!d->m_selectionModel || !d->m_selectionModel->model())
276 if (indexString.isEmpty())
280 d->m_pendingCurrent = indexString;
281 d->restoreCurrentItem();
283 if (d->hasPendingChanges())
284 d->listenToPendingChanges();
287 void KViewStateSaverPrivate::restoreExpanded()
291 QSet<QString>::iterator it = m_pendingExpansions.begin();
292 for ( ; it != m_pendingExpansions.end(); )
294 QModelIndex idx = q->indexFromConfigString( m_treeView->model(), *it);
297 m_treeView->expand( idx );
298 it = m_pendingExpansions.erase( it );
308 if (!d->m_treeView || !d->m_treeView->model())
311 if (indexStrings.isEmpty())
314 d->m_pendingExpansions.unite(indexStrings.toSet());
315 d->restoreExpanded();
316 if (d->hasPendingChanges())
317 d->listenToPendingChanges();
324 if ( !d->m_scrollArea )
327 d->m_verticalScrollBarValue = verticalScoll;
328 d->m_horizontalScrollBarValue = horizontalScroll;
330 QTimer::singleShot( 0,
this, SLOT(restoreScrollBarState()) );
333 void KViewStateSaverPrivate::restoreSelection()
337 QSet<QString>::iterator it = m_pendingSelections.begin();
338 for ( ; it != m_pendingSelections.end(); )
340 QModelIndex idx = q->indexFromConfigString( m_selectionModel->model(), *it);
343 m_selectionModel->select( idx, QItemSelectionModel::Select );
344 it = m_pendingSelections.erase( it );
355 if (!d->m_selectionModel || !d->m_selectionModel->model())
358 if (indexStrings.isEmpty())
361 d->m_pendingSelections.unite(indexStrings.toSet());
362 d->restoreSelection();
363 if (d->hasPendingChanges())
364 d->listenToPendingChanges();
370 if (!d->m_selectionModel)
378 if (!d->m_treeView || !d->m_treeView->model())
381 return d->getExpandedItems(QModelIndex());
387 if (!d->m_selectionModel)
390 QModelIndexList selectedIndexes = d->m_selectionModel->selectedRows();
392 foreach (
const QModelIndex &index, selectedIndexes )
401 return qMakePair(d->m_scrollArea->verticalScrollBar()->value(), d->m_scrollArea->horizontalScrollBar()->value());
404 #include "kviewstatesaver.moc"