| 217 | } |
| 218 | |
| 219 | QModelIndex MultiLevelListViewPrivate::mapFromSource(QModelIndex index, int level) const |
| 220 | { |
| 221 | if (!index.isValid()) { |
| 222 | return index; |
| 223 | } |
| 224 | |
| 225 | Q_ASSERT(index.model() == model); |
| 226 | |
| 227 | auto* proxy = qobject_cast<QAbstractProxyModel*>(views.at(level)->model()); |
| 228 | Q_ASSERT(proxy); |
| 229 | |
| 230 | // find all proxies between the source and our view |
| 231 | QVector<QAbstractProxyModel*> proxies; |
| 232 | proxies << proxy; |
| 233 | while (true) { |
| 234 | auto* child = qobject_cast<QAbstractProxyModel*>(proxy->sourceModel()); |
| 235 | if (child) { |
| 236 | proxy = child; |
| 237 | proxies << proxy; |
| 238 | } else { |
| 239 | Q_ASSERT(proxy->sourceModel() == model); |
| 240 | break; |
| 241 | } |
| 242 | } |
| 243 | // iterate in reverse order to find the view's index |
| 244 | for (int i = proxies.size() - 1; i >= 0; --i) { |
| 245 | proxy = proxies.at(i); |
| 246 | index = proxy->mapFromSource(index); |
| 247 | Q_ASSERT(index.isValid()); |
| 248 | } |
| 249 | |
| 250 | return index; |
| 251 | } |
| 252 | |
| 253 | MultiLevelListView::MultiLevelListView(QWidget* parent, Qt::WindowFlags f) |
| 254 | : QWidget(parent, f) |